1+ package com .lambda .mixin .render ;
2+
3+ import com .google .common .base .MoreObjects ;
4+ import com .lambda .Lambda ;
5+ import com .lambda .module .modules .render .ViewModel ;
6+ import net .minecraft .client .MinecraftClient ;
7+ import net .minecraft .client .network .AbstractClientPlayerEntity ;
8+ import net .minecraft .client .render .VertexConsumerProvider ;
9+ import net .minecraft .client .render .item .HeldItemRenderer ;
10+ import net .minecraft .client .util .math .MatrixStack ;
11+ import net .minecraft .item .ItemStack ;
12+ import net .minecraft .util .Hand ;
13+ import org .spongepowered .asm .mixin .Final ;
14+ import org .spongepowered .asm .mixin .Mixin ;
15+ import org .spongepowered .asm .mixin .Shadow ;
16+ import org .spongepowered .asm .mixin .injection .At ;
17+ import org .spongepowered .asm .mixin .injection .Inject ;
18+ import org .spongepowered .asm .mixin .injection .ModifyArg ;
19+ import org .spongepowered .asm .mixin .injection .ModifyVariable ;
20+ import org .spongepowered .asm .mixin .injection .callback .CallbackInfo ;
21+
22+ @ Mixin (HeldItemRenderer .class )
23+ public class HeldItemRendererMixin {
24+ @ Final @ Shadow private MinecraftClient client ;
25+ @ Shadow private ItemStack mainHand ;
26+ @ Shadow private ItemStack offHand ;
27+ @ Shadow private float equipProgressMainHand ;
28+ @ Shadow private float equipProgressOffHand ;
29+
30+ @ Inject (method = "renderFirstPersonItem" , at = @ At (value = "INVOKE" , target = "Lnet/minecraft/client/render/item/HeldItemRenderer;renderArmHoldingItem(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IFFLnet/minecraft/util/Arm;)V" ))
31+ private void onRenderArmHoldingItem (AbstractClientPlayerEntity player , float tickDelta , float pitch , Hand hand , float swingProgress , ItemStack itemStack , float equipProgress , MatrixStack matrices , VertexConsumerProvider vertexConsumers , int light , CallbackInfo ci ) {
32+ if (!ViewModel .INSTANCE .isEnabled ()) return ;
33+
34+ ViewModel .INSTANCE .transform (itemStack , hand , matrices );
35+ }
36+
37+ @ Inject (method = "renderFirstPersonItem" , at = @ At (value = "INVOKE" , target = "Lnet/minecraft/client/render/item/HeldItemRenderer;renderItem(Lnet/minecraft/entity/LivingEntity;Lnet/minecraft/item/ItemStack;Lnet/minecraft/client/render/model/json/ModelTransformationMode;ZLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V" ))
38+ private void onRenderFirstPersonItem (AbstractClientPlayerEntity player , float tickDelta , float pitch , Hand hand , float swingProgress , ItemStack itemStack , float equipProgress , MatrixStack matrices , VertexConsumerProvider vertexConsumers , int light , CallbackInfo ci ) {
39+ if (!ViewModel .INSTANCE .isEnabled ()) return ;
40+
41+ ViewModel .INSTANCE .transform (itemStack , hand , matrices );
42+ }
43+
44+ @ ModifyArg (method = "updateHeldItems" , at = @ At (value = "INVOKE" , target = "Lnet/minecraft/util/math/MathHelper;clamp(FFF)F" , ordinal = 2 ), index = 0 )
45+ private float modifyEquipProgressMainHand (float value ) {
46+ if (client .player == null || ViewModel .INSTANCE .isDisabled ()) return value ;
47+
48+ ViewModel config = ViewModel .INSTANCE ;
49+ ItemStack currentStack = client .player .getMainHandStack ();
50+ if (config .getOldAnimations () && !config .getSwapAnimation ()) {
51+ mainHand = currentStack ;
52+ }
53+
54+ float progress = config .getOldAnimations () ? 1 : (float ) Math .pow (client .player .getAttackCooldownProgress (1 ), 3 );
55+
56+ return (ItemStack .areEqual (mainHand , currentStack ) ? progress : 0 ) - equipProgressMainHand ;
57+ }
58+
59+ @ ModifyArg (method = "updateHeldItems" , at = @ At (value = "INVOKE" , target = "Lnet/minecraft/util/math/MathHelper;clamp(FFF)F" , ordinal = 3 ), index = 0 )
60+ private float modifyEquipProgressOffHand (float value ) {
61+ if (client .player == null || ViewModel .INSTANCE .isDisabled ()) return value ;
62+
63+ ViewModel config = ViewModel .INSTANCE ;
64+
65+ ItemStack currentStack = client .player .getOffHandStack ();
66+ if (config .getOldAnimations () && !config .getSwapAnimation ()) {
67+ offHand = currentStack ;
68+ }
69+
70+ return (ItemStack .areEqual (offHand , currentStack ) ? 1 : 0 ) - equipProgressOffHand ;
71+ }
72+
73+ @ ModifyVariable (method = "renderItem(FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider$Immediate;Lnet/minecraft/client/network/ClientPlayerEntity;I)V" , at = @ At (value = "STORE" , ordinal = 0 ), index = 6 )
74+ private float modifySwing (float swingProgress ) {
75+ ViewModel config = ViewModel .INSTANCE ;
76+ MinecraftClient mc = Lambda .getMc ();
77+ if (config .isDisabled () || mc .player == null ) return swingProgress ;
78+ Hand hand = MoreObjects .firstNonNull (mc .player .preferredHand , Hand .MAIN_HAND );
79+
80+ if (hand == Hand .MAIN_HAND ) {
81+ return swingProgress + config .getMainSwingProgress ();
82+ } else if (hand == Hand .OFF_HAND ) {
83+ return swingProgress + config .getOffhandSwingProgress ();
84+ }
85+
86+ return swingProgress ;
87+ }
88+ }
0 commit comments