Skip to content
This repository was archived by the owner on May 20, 2025. It is now read-only.
Draft
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
16cf3e1
drop 1.21.1, begin implementing render state data abstractions
celestialfault May 13, 2025
b39f702
more stonecutter statements
celestialfault May 13, 2025
d19542c
make this actually function
celestialfault May 13, 2025
c4ad643
fix 1.21.5 build
celestialfault May 13, 2025
3eb7161
make it hashable
celestialfault May 13, 2025
ee5590e
actually fix 1.21.5 this time
celestialfault May 13, 2025
0997bf5
make overlay use this
celestialfault May 13, 2025
f87a613
rename
celestialfault May 13, 2025
669c2f9
move this up out of its own package
celestialfault May 13, 2025
cee13b1
use render state for bobber timer
celestialfault May 14, 2025
c0ae7d1
add a bunch of docs
celestialfault May 14, 2025
e7b5203
support modifying nearly every entity's nametag visibility
celestialfault May 14, 2025
be3e964
rename these
celestialfault May 14, 2025
ac473e4
fix build yet again
celestialfault May 14, 2025
ac3d30d
xmap
celestialfault May 14, 2025
43ca798
Merge remote-tracking branch 'upstream/main' into refactor/render-sta…
celestialfault May 14, 2025
054ec2d
some assorted changes
celestialfault May 14, 2025
8f01515
cache skyblock item data on the itemstack
celestialfault May 14, 2025
8bfc0a5
clean up copy item
celestialfault May 14, 2025
b5b0470
copy these todos from the hide armor pr
celestialfault May 15, 2025
ae9ef01
back to json this goes
celestialfault May 17, 2025
d2734b7
Merge branch 'main' into refactor/render-state-data
celestialfault May 18, 2025
84c6388
add annotation
celestialfault May 18, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ stonecutter {
centralScript = "build.gradle.kts"

shared {
versions("1.21", "1.21.3", "1.21.4", "1.21.5")
versions("1.21.3", "1.21.4", "1.21.5")
vcsVersion = "1.21.4"
}
create(rootProject)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
import net.minecraft.entity.Entity;
import org.jetbrains.annotations.Nullable;

//? if >=1.21.2 {
public interface EntityStateCaptureDuck {
public interface EntityRenderStateDuck {
@Nullable Entity nobaaddons$getEntity();
void nobaaddons$setEntity(@Nullable Entity entity);
}
//?}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

//? if >=1.21.2 {
@Mixin(DrawContext.class)
public interface DrawContextAccessor {
@Accessor VertexConsumerProvider.Immediate getVertexConsumers();
}
//?}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package me.nobaboy.nobaaddons.mixins.duckimpl;

//? if >=1.21.2 {
import me.nobaboy.nobaaddons.ducks.EntityStateCaptureDuck;
import me.nobaboy.nobaaddons.ducks.EntityRenderStateDuck;
import net.minecraft.client.render.entity.state.EntityRenderState;
import net.minecraft.entity.Entity;
import org.jetbrains.annotations.Nullable;
Expand All @@ -10,7 +9,7 @@

@SuppressWarnings("unused")
@Mixin(EntityRenderState.class)
abstract class EntityStateCaptureDuckImpl implements EntityStateCaptureDuck {
abstract class EntityRenderStateDuckImpl implements EntityRenderStateDuck {
private @Unique @Nullable Entity nobaaddons$entity;

@Override
Expand All @@ -23,4 +22,3 @@ abstract class EntityStateCaptureDuckImpl implements EntityStateCaptureDuck {
nobaaddons$entity = entity;
}
}
//?}
Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,14 @@
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

//? if >=1.21.2 {
// For whatever reason, the MC Dev plugin complains about this, but only on 1.21.2+.
// This is despite the fact that this is, in fact, a valid injector.
@SuppressWarnings("InvalidInjectorMethodSignature")
//?}
@Mixin(EntityRenderDispatcher.class)
abstract class EntityEventsMixin_EntityRenderDispatcher {
@Inject(
//? if >=1.21.5 {
/*method = "render(Lnet/minecraft/client/render/entity/state/EntityRenderState;DDDLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/EntityRenderer;)V",
*///?} else if >=1.21.2 {
*///?} else {
method = "render(Lnet/minecraft/entity/Entity;DDDFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/EntityRenderer;)V",
//?} else {
/*method = "render",
*///?}
//?}
at = @At("HEAD"),
cancellable = true
)
Expand All @@ -42,17 +35,12 @@ abstract class EntityEventsMixin_EntityRenderDispatcher {
Entity entity,
//?}
double x, double y, double z,
//? if <1.21.2 {
/*float yaw,
*///?}
//? if <1.21.5 {
float tickDelta,
//?}
MatrixStack matrices,VertexConsumerProvider vertexConsumers,
int light,
//? if >=1.21.2 {
EntityRenderer<?, ?> renderer,
//?}
CallbackInfo ci
) {
//? if >=1.21.5 {
Expand All @@ -64,11 +52,9 @@ abstract class EntityEventsMixin_EntityRenderDispatcher {
@Inject(
//? if >=1.21.5 {
/*method = "render(Lnet/minecraft/client/render/entity/state/EntityRenderState;DDDLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/EntityRenderer;)V",
*///?} else if >=1.21.2 {
*///?} else {
method = "render(Lnet/minecraft/entity/Entity;DDDFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/EntityRenderer;)V",
//?} else {
/*method = "render",
*///?}
//?}
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/util/math/MatrixStack;push()V"
Expand All @@ -82,17 +68,12 @@ abstract class EntityEventsMixin_EntityRenderDispatcher {
Entity entity,
//?}
double x, double y, double z,
//? if <1.21.2 {
/*float yaw,
*///?}
//? if <1.21.5 {
float tickDelta,
//?}
MatrixStack matrices,VertexConsumerProvider vertexConsumers,
int light,
//? if >=1.21.2 {
EntityRenderer<?, ?> renderer,
//?}
CallbackInfo ci
) {
//? if >=1.21.5 {
Expand All @@ -105,11 +86,9 @@ abstract class EntityEventsMixin_EntityRenderDispatcher {
@Inject(
//? if >=1.21.5 {
/*method = "render(Lnet/minecraft/client/render/entity/state/EntityRenderState;DDDLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/EntityRenderer;)V",
*///?} else if >=1.21.2 {
*///?} else {
method = "render(Lnet/minecraft/entity/Entity;DDDFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/EntityRenderer;)V",
//?} else {
/*method = "render",
*///?}
//?}
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/client/util/math/MatrixStack;pop()V"
Expand All @@ -123,17 +102,12 @@ abstract class EntityEventsMixin_EntityRenderDispatcher {
Entity entity,
//?}
double x, double y, double z,
//? if <1.21.2 {
/*float yaw,
*///?}
//? if <1.21.5 {
float tickDelta,
//?}
MatrixStack matrices,VertexConsumerProvider vertexConsumers,
int light,
//? if >=1.21.2 {
EntityRenderer<?, ?> renderer,
//?}
CallbackInfo ci
) {
//? if >=1.21.5 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,7 @@
@Mixin(ArmorStandEntityRenderer.class)
abstract class NametagRenderEventsMixin_ArmorStandEntityRenderer {
@ModifyReturnValue(
//? if >=1.21.2 {
method = "hasLabel(Lnet/minecraft/entity/decoration/ArmorStandEntity;D)Z",
//?} else {
/*method = "hasLabel(Lnet/minecraft/entity/decoration/ArmorStandEntity;)Z",
*///?}
at = @At("RETURN")
)
public boolean nobaaddons$modifyNametagVisibility(boolean original, @Local(argsOnly = true) ArmorStandEntity entity) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package me.nobaboy.nobaaddons.mixins.events;

//? if >=1.21.2 {
import me.nobaboy.nobaaddons.ducks.EntityStateCaptureDuck;
import me.nobaboy.nobaaddons.ducks.EntityRenderStateDuck;
import net.minecraft.client.render.entity.state.EntityRenderState;
//?}

import com.llamalad7.mixinextras.injector.ModifyReturnValue;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
Expand All @@ -23,16 +20,11 @@
abstract class NametagRenderEventsMixin_EntityRenderer {
@Shadow
protected abstract void renderLabelIfPresent(
//? if >=1.21.2 {
EntityRenderState state,
//?} else {
/*Entity entity,
*///?}
Text text,
MatrixStack matrices,
VertexConsumerProvider vertexConsumers,
int light
/*? if <1.21.2 {*//*, float tickDelta*//*?}*/
);

@ModifyReturnValue(method = "hasLabel", at = @At("RETURN"))
Expand All @@ -42,46 +34,28 @@ protected abstract void renderLabelIfPresent(
return event.getShouldRender();
}

//? if >=1.21.2 {
// For whatever reason, the MC Dev plugin complains about this, but only on 1.21.2+.
// This is despite the fact that this is, in fact, a valid injector.
@SuppressWarnings("InvalidInjectorMethodSignature")
//?}
@WrapOperation(
method = "render",
at = @At(
value = "INVOKE",
//? if >=1.21.2 {
target = "Lnet/minecraft/client/render/entity/EntityRenderer;renderLabelIfPresent(Lnet/minecraft/client/render/entity/state/EntityRenderState;Lnet/minecraft/text/Text;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V"
//?} else {
/*target = "Lnet/minecraft/client/render/entity/EntityRenderer;renderLabelIfPresent(Lnet/minecraft/entity/Entity;Lnet/minecraft/text/Text;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IF)V"
*///?}
)
)
public void nobaaddons$nametagRender(
//? if >=1.21.2 {
EntityRenderer<?, ?> instance,
EntityRenderState state,
//?} else {
/*EntityRenderer<?> instance,
Entity entity,
*///?}
Text text,
MatrixStack matrices,
VertexConsumerProvider vertexConsumers,
int light,
//? if <1.21.2 {
/*float tickDelta,
*///?}
Operation<Void> original
) {
//? if >=1.21.2 {
Entity entity = ((EntityStateCaptureDuck) state).nobaaddons$getEntity();
// TODO remove this entity capture logic
Entity entity = ((EntityRenderStateDuck) state).nobaaddons$getEntity();
if(entity == null) {
original.call(instance, state, text, matrices, vertexConsumers, light);
return;
}
//?}

var event = new EntityNametagRenderEvents.Nametag(entity);
EntityNametagRenderEvents.EVENT.dispatch(event);
Expand All @@ -90,28 +64,13 @@ protected abstract void renderLabelIfPresent(
var ntext = event.getTags().get(i);
// TODO this causes the scoreboard objective in the below name slot to render multiple times on players;
// we don't presently use this on players however, so this isn't an issue I'm too worried about right now.
renderLabelIfPresent(
/*? if >=1.21.2 {*/state/*?} else {*//*entity*//*?}*/,
ntext,
matrices,
vertexConsumers,
light
/*? if <1.21.2 {*//*, tickDelta*//*?}*/
);
renderLabelIfPresent(state, ntext, matrices, vertexConsumers, light);
if(i < event.getTags().size() - 1 || event.getRenderEntityName()) {
matrices.translate(0f, 9f * 1.15f * 0.025f, 0f);
}
}
if(event.getRenderEntityName()) {
original.call(
instance,
/*? if >=1.21.2 {*/state/*?} else {*//*entity*//*?}*/,
text == null ? entity.getDisplayName() : text,
matrices,
vertexConsumers,
light
/*? if <1.21.2 {*//*, tickDelta*//*?}*/
);
original.call(instance, state, text == null ? entity.getDisplayName() : text, matrices, vertexConsumers, light);
}
matrices.pop();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,7 @@ protected ScreenRenderEventsMixin_HandledScreen(Text title) {
method = "drawSlot",
at = @At(
value = "INVOKE",
//? if >=1.21.2 {
target = "Lnet/minecraft/client/gui/DrawContext;drawStackOverlay(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V"
//?} else {
/*target = "Lnet/minecraft/client/gui/DrawContext;drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;IILjava/lang/String;)V"
*///?}
)
)
public void nobaaddons$onDrawSlot(DrawContext context, Slot slot, CallbackInfo ci) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,7 @@ abstract class ScreenRenderEventsMixin_InGameHud {
method = "renderHotbarItem",
at = @At(
value = "INVOKE",
//? if >=1.21.2 {
target = "Lnet/minecraft/client/gui/DrawContext;drawStackOverlay(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;II)V"
//?} else {
/*target = "Lnet/minecraft/client/gui/DrawContext;drawItemInSlot(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/item/ItemStack;II)V"
*///?}
)
)
public void nobaaddons$onRenderHotbarItem(DrawContext context, int x, int y, RenderTickCounter tickCounter, PlayerEntity player, ItemStack itemStack, int seed, CallbackInfo ci) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,7 @@ abstract class SoundEventsMixin {
var key = sound.getKeyOrValue();
var id = key.left()
.map(RegistryKey::getValue)
.orElseGet(() -> key.right()
//? if >=1.21.2 {
.map(SoundEvent::id)
//?} else {
/*.map(SoundEvent::getId)
*///?}
.orElseThrow());
.orElseGet(() -> key.right().map(SoundEvent::id).orElseThrow());

var location = new NobaVec(x, y, z);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package me.nobaboy.nobaaddons.mixins.render;

//? if >=1.21.2 {
import me.nobaboy.nobaaddons.ducks.EntityStateCaptureDuck;
import me.nobaboy.nobaaddons.ducks.EntityRenderStateDuck;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.entity.state.EntityRenderState;
import net.minecraft.entity.Entity;
Expand All @@ -14,8 +13,7 @@
abstract class EntityRendererMixin {
@Inject(method = "updateRenderState", at = @At("TAIL"))
public void nobaaddons$captureEntity(Entity entity, EntityRenderState state, float tickDelta, CallbackInfo ci) {
var duck = (EntityStateCaptureDuck) state;
var duck = (EntityRenderStateDuck) state;
duck.nobaaddons$setEntity(entity);
}
}
//?}
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package me.nobaboy.nobaaddons.mixins.render;

//? if <1.21.2 {
/*import org.spongepowered.asm.mixin.injection.Slice;
*///?}

import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
import me.nobaboy.nobaaddons.api.skyblock.SkyBlockAPI;
import me.nobaboy.nobaaddons.config.NobaConfig;
Expand All @@ -19,19 +15,8 @@

@Mixin(InGameHud.class)
abstract class InGameHudMixin {
//? if >=1.21.2 {
@WrapWithCondition(method = "renderAirBubbles", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawGuiTexture(Ljava/util/function/Function;Lnet/minecraft/util/Identifier;IIII)V"))
public boolean nobaaddons$hideAirBubbles(DrawContext instance, Function<Identifier, RenderLayer> renderLayers, Identifier sprite, int x, int y, int width, int height) {
//?} else {
/*@WrapWithCondition(
method = "renderStatusBars",
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawGuiTexture(Lnet/minecraft/util/Identifier;IIII)V"),
slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;isSubmergedIn(Lnet/minecraft/registry/tag/TagKey;)Z")),
require = 2,
allow = 2
)
public boolean nobaaddons$hideAirBubbles(DrawContext instance, Identifier texture, int x, int y, int width, int height) {
*///?}
if(SkyBlockAPI.inSkyBlock()) {
return !NobaConfig.INSTANCE.getUiAndVisuals().getRenderingTweaks().getHideAirBubbles();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package me.nobaboy.nobaaddons.mixins.render;

//? if <1.21.2 {
/*import net.minecraft.item.ArmorItem;
*///?}

//? if <1.21.5 {
import org.spongepowered.asm.mixin.injection.Slice;
//?} else {
Expand All @@ -30,7 +26,7 @@ abstract class ItemStackMixin {
@ModifyReturnValue(method = "hasGlint", at = @At("RETURN"))
public boolean nobaaddons$modifyGlint(boolean original) {
var item = (ItemStack) (Object) this;
boolean isArmor = /*? if >=1.21.2 {*/item.get(DataComponentTypes.EQUIPPABLE) != null/*?} else {*//*item.getItem() instanceof ArmorItem*//*?}*/;
boolean isArmor = item.get(DataComponentTypes.EQUIPPABLE) != null;
if(!isArmor) return original;

return ItemUtils.shouldArmorHaveEnchantGlint(item, original);
Expand Down
Loading
Loading