|
13 | 13 | import net.minecraft.client.model.HeadedModel; |
14 | 14 | import net.minecraft.client.renderer.ItemInHandRenderer; |
15 | 15 | import net.minecraft.client.renderer.MultiBufferSource; |
| 16 | +//? if >1.21.8 |
| 17 | +import net.minecraft.client.renderer.SubmitNodeCollector; |
16 | 18 | import net.minecraft.client.renderer.entity.RenderLayerParent; |
17 | 19 | import net.minecraft.client.renderer.entity.layers.ItemInHandLayer; |
18 | 20 | import net.minecraft.client.renderer.entity.layers.PlayerItemInHandLayer; |
@@ -46,6 +48,14 @@ public abstract class PlayerHeldItemFeatureRendererMixin<T extends //? if =1.21. |
46 | 48 | //?} |
47 | 49 | , M extends EntityModel<T> & ArmedModel & HeadedModel> |
48 | 50 | extends ItemInHandLayer<T, M> { |
| 51 | + //? if >1.21.1 { |
| 52 | + @Unique |
| 53 | + private final ItemStackRenderState crossbow_scoping$crossbowRenderState = new ItemStackRenderState(); |
| 54 | + |
| 55 | + public PlayerHeldItemFeatureRendererMixin(RenderLayerParent<T, M> renderer) { |
| 56 | + super(renderer); |
| 57 | + } |
| 58 | + //?} |
49 | 59 |
|
50 | 60 | //? if <=1.21.1 { |
51 | 61 | /*public PlayerHeldItemFeatureRendererMixin(RenderLayerParent<T, M> context, ItemInHandRenderer heldItemRenderer) { |
@@ -95,15 +105,9 @@ private void fixCrossbowTransforms(LivingEntity entity, ItemStack stack, Humanoi |
95 | 105 | matrices.translate(0, -0.1, 1); |
96 | 106 | } |
97 | 107 | } |
98 | | - *///?} else { |
99 | | - @Unique |
100 | | - private final ItemStackRenderState crossbow_scoping$crossbowRenderState = new ItemStackRenderState(); |
| 108 | + *///?} else if =1.21.8 { |
101 | 109 |
|
102 | | - public PlayerHeldItemFeatureRendererMixin(RenderLayerParent<T, M> renderer) { |
103 | | - super(renderer); |
104 | | - } |
105 | | - |
106 | | - @WrapOperation(method = "renderArmWithItem(Lnet/minecraft/client/renderer/entity/state/PlayerRenderState;Lnet/minecraft/client/renderer/item/ItemStackRenderState;Lnet/minecraft/world/entity/HumanoidArm;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/layers/PlayerItemInHandLayer;renderItemHeldToEye(Lnet/minecraft/client/renderer/item/ItemStackRenderState;Lnet/minecraft/world/entity/HumanoidArm;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V")) |
| 110 | + /*@WrapOperation(method = "renderArmWithItem(Lnet/minecraft/client/renderer/entity/state/PlayerRenderState;Lnet/minecraft/client/renderer/item/ItemStackRenderState;Lnet/minecraft/world/entity/HumanoidArm;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/layers/PlayerItemInHandLayer;renderItemHeldToEye(Lnet/minecraft/client/renderer/item/ItemStackRenderState;Lnet/minecraft/world/entity/HumanoidArm;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V")) |
107 | 111 | private void changeTheRenderState(PlayerItemInHandLayer<T, M> instance, ItemStackRenderState itemStackRenderState, HumanoidArm arm, PoseStack poseStack, MultiBufferSource multiBufferSource, int i, Operation<Void> original, @Local(argsOnly = true) PlayerRenderState playerRenderState) { |
108 | 112 | ItemStack crossbow = itemStackRenderState.getDataOrDefault(ScopeRenderer.REVERSE_REFERENCE, ItemStack.EMPTY); |
109 | 113 |
|
@@ -136,12 +140,55 @@ private void fixCrossbowTransforms(ItemStackRenderState renderState, HumanoidArm |
136 | 140 | if (arm == HumanoidArm.LEFT) { |
137 | 141 | matrices.mulPose(Axis.YP.rotationDegrees(-90)); |
138 | 142 | } |
139 | | - //? if <=1.21.1 { |
140 | | - /*matrices.translate(0, -0.1, 1); |
141 | | - *///?} else { |
142 | 143 | matrices.translate(-0.1, 0.1, 0); |
143 | | - //?} |
144 | 144 | } |
145 | 145 | } |
| 146 | + *///?} else { |
| 147 | + @WrapOperation(method = "submitArmWithItem(Lnet/minecraft/client/renderer/entity/state/AvatarRenderState;Lnet/minecraft/client/renderer/item/ItemStackRenderState;Lnet/minecraft/world/entity/HumanoidArm;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/layers/PlayerItemInHandLayer;renderItemHeldToEye(Lnet/minecraft/client/renderer/entity/state/AvatarRenderState;Lnet/minecraft/world/entity/HumanoidArm;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;I)V")) |
| 148 | + private void changeTheRenderState(PlayerItemInHandLayer<T, M> instance, AvatarRenderState avatarRenderState, HumanoidArm arm, PoseStack poseStack, SubmitNodeCollector submitNodeCollector, int i, Operation<Void> original, @Local(argsOnly = true) ItemStackRenderState itemStackRenderState) { |
| 149 | + ItemStack crossbow = itemStackRenderState.getDataOrDefault(ScopeRenderer.REVERSE_REFERENCE, ItemStack.EMPTY); |
| 150 | + |
| 151 | + if (crossbow.isEmpty()) { |
| 152 | + this.crossbow_scoping$crossbowRenderState.clear(); |
| 153 | + } else { |
| 154 | + Minecraft client = Minecraft.getInstance(); |
| 155 | + |
| 156 | + client.getItemModelResolver().updateForTopItem( |
| 157 | + this.crossbow_scoping$crossbowRenderState, |
| 158 | + crossbow, |
| 159 | + arm == HumanoidArm.RIGHT ? ItemDisplayContext.THIRD_PERSON_RIGHT_HAND : ItemDisplayContext.THIRD_PERSON_LEFT_HAND, |
| 160 | + client.level, |
| 161 | + null, |
| 162 | + 0 |
| 163 | + ); |
| 164 | + |
| 165 | + avatarRenderState.setData(ScopeRenderer.CROSSBOW_TO_HEAD, this.crossbow_scoping$crossbowRenderState); |
| 166 | + } |
| 167 | + |
| 168 | + original.call(instance, avatarRenderState, arm, poseStack, submitNodeCollector, i); |
| 169 | + } |
| 170 | + |
| 171 | + @Inject(method = "renderItemHeldToEye", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(FFF)V", shift = At.Shift.AFTER)) |
| 172 | + private void fixCrossbowTransforms(AvatarRenderState renderState, HumanoidArm arm, PoseStack matrices, SubmitNodeCollector nodeCollector, int packedLight, CallbackInfo ci, @Share("scoping") LocalBooleanRef scoping) { |
| 173 | + boolean transformSpecial = renderState.getData(ScopeRenderer.CROSSBOW_TO_HEAD) == this.crossbow_scoping$crossbowRenderState; |
| 174 | + scoping.set(transformSpecial); |
| 175 | + if (transformSpecial) { |
| 176 | + // 1.6 / 0.9 = 1.7777... |
| 177 | + matrices.scale(1.778f, 1.778f, 1.778f); |
| 178 | + matrices.mulPose(Axis.YP.rotationDegrees(15)); |
| 179 | + if (arm == HumanoidArm.LEFT) { |
| 180 | + matrices.mulPose(Axis.YP.rotationDegrees(-90)); |
| 181 | + } |
| 182 | + matrices.translate(-0.1, -0.1, 0); |
| 183 | + } |
| 184 | + } |
| 185 | + |
| 186 | + @WrapOperation(method = "renderItemHeldToEye", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/item/ItemStackRenderState;submit(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;III)V")) |
| 187 | + private void useCrossbowRenderState(ItemStackRenderState instance, PoseStack matrices, SubmitNodeCollector renderQueue, int light, int overlay, int outlineColor, Operation<Void> original, @Share("scoping") LocalBooleanRef scoping) { |
| 188 | + if (scoping.get()) { |
| 189 | + instance = this.crossbow_scoping$crossbowRenderState; |
| 190 | + } |
| 191 | + original.call(instance, matrices, renderQueue, light, overlay, outlineColor); |
| 192 | + } |
146 | 193 | //?} |
147 | 194 | } |
0 commit comments