|
3 | 3 | import autumnvn.autumn.AutumnClient; |
4 | 4 | import autumnvn.autumn.Utils; |
5 | 5 | import autumnvn.autumn.interfaces.IEntityRenderState; |
6 | | -import net.minecraft.client.font.TextRenderer; |
7 | | -import net.minecraft.client.render.VertexConsumerProvider; |
| 6 | +import net.minecraft.client.render.command.OrderedRenderCommandQueue; |
8 | 7 | import net.minecraft.client.render.entity.EntityRenderer; |
9 | 8 | import net.minecraft.client.render.entity.state.EntityRenderState; |
| 9 | +import net.minecraft.client.render.state.CameraRenderState; |
10 | 10 | import net.minecraft.client.util.math.MatrixStack; |
11 | 11 | import net.minecraft.entity.Entity; |
12 | 12 | import net.minecraft.entity.EntityAttachmentType; |
13 | 13 | import net.minecraft.entity.LivingEntity; |
14 | 14 | import net.minecraft.entity.player.PlayerEntity; |
15 | 15 | import net.minecraft.text.Text; |
16 | | -import net.minecraft.util.math.Vec3d; |
17 | 16 | import org.spongepowered.asm.mixin.Mixin; |
18 | 17 | import org.spongepowered.asm.mixin.Shadow; |
19 | 18 | import org.spongepowered.asm.mixin.injection.At; |
20 | 19 | import org.spongepowered.asm.mixin.injection.Inject; |
21 | | -import org.spongepowered.asm.mixin.injection.ModifyArgs; |
22 | | -import org.spongepowered.asm.mixin.injection.ModifyVariable; |
23 | 20 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; |
24 | | -import org.spongepowered.asm.mixin.injection.invoke.arg.Args; |
25 | 21 |
|
26 | 22 | import java.util.Objects; |
27 | 23 |
|
28 | 24 | @Mixin(EntityRenderer.class) |
29 | | -public class EntityRendererMixin<T extends Entity, S extends EntityRenderState> { |
| 25 | +public abstract class EntityRendererMixin<T extends Entity, S extends EntityRenderState> { |
30 | 26 |
|
31 | 27 | @Shadow |
32 | | - private static void renderLeash(MatrixStack matrices, VertexConsumerProvider vertexConsumers, EntityRenderState.LeashData leashData) { |
33 | | - } |
34 | | - |
35 | | - @Shadow |
36 | | - protected void renderLabelIfPresent(S state, Text text, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light) { |
37 | | - } |
| 28 | + protected abstract void renderLabelIfPresent(S state, MatrixStack matrices, OrderedRenderCommandQueue queue, CameraRenderState cameraRenderState); |
38 | 29 |
|
39 | 30 | // BetterNametag |
40 | 31 | @Inject(method = "render", at = @At("HEAD"), cancellable = true) |
41 | | - private void render(S state, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci) { |
42 | | - Entity entity = ((IEntityRenderState) state).autumn$getEntity(); |
| 32 | + private void render(S renderState, MatrixStack matrices, OrderedRenderCommandQueue queue, CameraRenderState cameraState, CallbackInfo ci) { |
| 33 | + Entity entity = ((IEntityRenderState) renderState).autumn$getEntity(); |
43 | 34 | if (AutumnClient.options.betterNametag.getValue() && entity instanceof LivingEntity livingEntity && (livingEntity instanceof PlayerEntity || livingEntity == Utils.getTargetedEntity())) { |
44 | | - if (state.leashDatas != null) { |
45 | | - for (EntityRenderState.LeashData leashData : state.leashDatas) { |
46 | | - renderLeash(matrices, vertexConsumers, leashData); |
| 35 | + if (renderState.leashDatas != null) { |
| 36 | + for (EntityRenderState.LeashData leashData : renderState.leashDatas) { |
| 37 | + queue.submitLeash(matrices, leashData); |
47 | 38 | } |
48 | 39 | } |
49 | 40 |
|
50 | 41 | float health = livingEntity.getHealth() + livingEntity.getAbsorptionAmount(); |
51 | 42 | String ownerName = Utils.getOwnerName(livingEntity); |
52 | | - renderLabelIfPresent(state, |
53 | | - Text.of( |
54 | | - String.format("%s%s %s%.0f§c❤%s", |
55 | | - ownerName != null ? ownerName + (ownerName.endsWith("s") ? "' " : "'s ") : "", |
56 | | - Objects.requireNonNull(livingEntity.getDisplayName()).getString(), |
57 | | - Utils.color(health, 0, livingEntity.getMaxHealth()), |
58 | | - health, |
59 | | - livingEntity instanceof PlayerEntity playerEntity ? (playerEntity.isCreative() ? " §r[C]" : playerEntity.isSpectator() ? " §r[S]" : "") : "" |
60 | | - ) |
61 | | - ), matrices, vertexConsumers, light); |
| 43 | + renderState.nameLabelPos = entity.getAttachments().getPointNullable(EntityAttachmentType.NAME_TAG, 0, entity.getLerpedYaw(AutumnClient.client.getRenderTickCounter().getTickProgress(true))); |
| 44 | + renderState.displayName = Text.of( |
| 45 | + String.format("%s%s %s%.0f§c❤%s", |
| 46 | + ownerName != null ? ownerName + (ownerName.endsWith("s") ? "' " : "'s ") : "", |
| 47 | + Objects.requireNonNull(livingEntity.getDisplayName()).getString(), |
| 48 | + Utils.color(health, 0, livingEntity.getMaxHealth()), |
| 49 | + health, |
| 50 | + livingEntity instanceof PlayerEntity playerEntity ? (playerEntity.isCreative() ? " §r[C]" : playerEntity.isSpectator() ? " §r[S]" : "") : "" |
| 51 | + ) |
| 52 | + ); |
| 53 | + renderLabelIfPresent(renderState, matrices, queue, cameraState); |
62 | 54 | ci.cancel(); |
63 | 55 | } |
64 | 56 | } |
65 | 57 |
|
66 | | - @ModifyVariable(method = "renderLabelIfPresent", at = @At("STORE")) |
67 | | - private Vec3d labelNamePos(Vec3d original, S state) { |
68 | | - if (AutumnClient.options.betterNametag.getValue() && original == null) { |
69 | | - Entity entity = ((IEntityRenderState) state).autumn$getEntity(); |
70 | | - if (entity instanceof LivingEntity livingEntity && (livingEntity instanceof PlayerEntity || livingEntity == Utils.getTargetedEntity())) { |
71 | | - return entity.getAttachments().getPointNullable(EntityAttachmentType.NAME_TAG, 0, entity.getLerpedYaw(AutumnClient.client.getRenderTickCounter().getTickProgress(true))); |
72 | | - } |
73 | | - } |
74 | | - |
75 | | - return original; |
76 | | - } |
77 | | - |
78 | | - @ModifyArgs(method = "renderLabelIfPresent", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/font/TextRenderer;draw(Lnet/minecraft/text/Text;FFIZLorg/joml/Matrix4f;Lnet/minecraft/client/render/VertexConsumerProvider;Lnet/minecraft/client/font/TextRenderer$TextLayerType;II)V", ordinal = 0)) |
79 | | - private void draw(Args args) { |
80 | | - if (AutumnClient.options.betterNametag.getValue()) { |
81 | | - args.set(3, 0xaaffffff); |
82 | | - args.set(7, TextRenderer.TextLayerType.SEE_THROUGH); |
83 | | - } |
84 | | - } |
85 | | - |
86 | 58 | @Inject(method = "updateRenderState", at = @At("HEAD")) |
87 | 59 | private void updateRenderState(T entity, S state, float tickDelta, CallbackInfo ci) { |
88 | 60 | if (AutumnClient.options.betterNametag.getValue()) { |
|
0 commit comments