From 48bd81ee445ef4a598c9b758bbac94c86dd28f96 Mon Sep 17 00:00:00 2001 From: mia Date: Mon, 31 Aug 2026 23:42:32 +0300 Subject: [PATCH 1/9] wider ranges for item scale, item rotation option, no equip animation option, needs translations --- .../config/category/ExtrasConfigCategory.java | 14 ++++++++++---- ...HandRenderer_FirstPersonItemPositions.java | 19 +++++++++++++++---- .../enums/EquipAnimationVersionSetting.kt | 3 ++- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java b/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java index f3a05a59..3d7dd5e7 100644 --- a/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java +++ b/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java @@ -79,6 +79,9 @@ public final class ExtrasConfigCategory extends Category { public float itemOffsetX = 0.0F; public float itemOffsetY = 0.0F; public float itemOffsetZ = 0.0F; + public float itemRotationX = 0.0F; + public float itemRotationY = 0.0F; + public float itemRotationZ = 0.0F; // Server Features (Singleplayer Only) public boolean miss_penalty = false; public boolean left_click_item_usage = false; @@ -144,12 +147,15 @@ public static ConfigCategory create(final ExtrasConfigCategory defaults, final E .booleanEntry("disableSwingTranslate"); bundle.group("item_modifications") - .floatRange("itemScaleX", 0.5F, 2.0F, 0.1F) - .floatRange("itemScaleY", 0.5F, 2.0F, 0.1F) - .floatRange("itemScaleZ", 0.5F, 2.0F, 0.1F) + .floatRange("itemScaleX", 0.2F, 2.0F, 0.1F) + .floatRange("itemScaleY", 0.2F, 2.0F, 0.1F) + .floatRange("itemScaleZ", 0.2F, 2.0F, 0.1F) .floatEntry("itemOffsetX") .floatEntry("itemOffsetY") - .floatEntry("itemOffsetZ"); + .floatEntry("itemOffsetZ") + .floatEntry("itemRotationX") + .floatEntry("itemRotationY") + .floatEntry("itemRotationZ"); { final GroupBundle serverFeatureGroup = bundle.group("server_features"); diff --git a/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java b/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java index 98c65b77..a7f16fb5 100644 --- a/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java +++ b/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java @@ -55,6 +55,7 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.Slice; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.visuals.legacy.animatium.Animatium; import org.visuals.legacy.animatium.config.AnimatiumConfig; import org.visuals.legacy.animatium.config.category.ExtrasConfigCategory; @@ -212,6 +213,9 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { if (isNotBlock3d) { poseStack.translate(extras.itemOffsetX * 0.05F, extras.itemOffsetY * 0.05F, extras.itemOffsetZ * 0.05F); poseStack.scale(extras.itemScaleX, extras.itemScaleY, extras.itemScaleZ); + poseStack.mulPose(Axis.XP.rotationDegrees(direction * extras.itemRotationX)); + poseStack.mulPose(Axis.YP.rotationDegrees(direction * extras.itemRotationY)); + poseStack.mulPose(Axis.ZP.rotationDegrees(direction * extras.itemRotationZ)); } } } @@ -237,7 +241,7 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { @ModifyArg(method = "submitHandsWithItems", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ItemInHandRenderer;submitArmWithItem(Lnet/minecraft/client/player/AbstractClientPlayer;FFLnet/minecraft/world/InteractionHand;FLnet/minecraft/world/item/ItemStack;FLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;I)V", ordinal = 0), index = 5) private ItemStack animatium$useCopyStackFieldForRender(final ItemStack original) { // TODO/NOTE: 26.2 makes the item persist in hand even when empty (temp check added) - if (Animatium.isEnabled() && AnimatiumConfig.instance().items.equipAnimationVersion != EquipAnimationVersionSetting.VANILLA && !original.isEmpty()) { + if (Animatium.isEnabled() && AnimatiumConfig.instance().items.equipAnimationVersion != EquipAnimationVersionSetting.VANILLA && AnimatiumConfig.instance().items.equipAnimationVersion != EquipAnimationVersionSetting.DISABLED && !original.isEmpty()) { // Use our copied stack field for hand animations return this.animatium$mainHandItem; } else { @@ -247,7 +251,14 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { @ModifyExpressionValue(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ItemInHandRenderer;shouldInstantlyReplaceVisibleItem(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/ItemStack;)Z", ordinal = 0)) private boolean animatium$disableEquipConstraint(final boolean original) { - return (!Animatium.isEnabled() || AnimatiumConfig.instance().items.equipAnimationVersion == EquipAnimationVersionSetting.VANILLA) && original; + return (!Animatium.isEnabled() || AnimatiumConfig.instance().items.equipAnimationVersion == EquipAnimationVersionSetting.VANILLA || AnimatiumConfig.instance().items.equipAnimationVersion == EquipAnimationVersionSetting.DISABLED) && original; + } + + @Inject(method = "shouldInstantlyReplaceVisibleItem", at = @At("HEAD"), cancellable = true) + private void animatium$skipEquipAnimation(ItemStack currentlyVisibleItem, ItemStack expectedItem, CallbackInfoReturnable cir) { + if (Animatium.isEnabled() && AnimatiumConfig.instance().items.equipAnimationVersion == EquipAnimationVersionSetting.DISABLED && this.minecraft.player != null) { + cir.setReturnValue(true); + } } // Fixes MC-262560 @@ -255,7 +266,7 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { private float animatium$handleEquipLogic(final float original) { final LocalPlayer player = this.minecraft.player; final EquipAnimationVersionSetting setting = AnimatiumConfig.instance().items.equipAnimationVersion; - if (Animatium.isEnabled() && setting != EquipAnimationVersionSetting.VANILLA && player != null) { + if (Animatium.isEnabled() && setting != EquipAnimationVersionSetting.VANILLA && setting != EquipAnimationVersionSetting.DISABLED && player != null) { final float attackAnim = player.getItemSwapScale(1.0F); final float scale = (float) Math.pow(attackAnim, 3); final ItemStack stackCopy = player.getInventory().getSelectedItem().copy(); @@ -285,7 +296,7 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { @Inject(method = "tick", at = @At("TAIL")) private void animatium$updateFakeItem(final CallbackInfo ci) { final LocalPlayer player = this.minecraft.player; - if (Animatium.isEnabled() && AnimatiumConfig.instance().items.equipAnimationVersion != EquipAnimationVersionSetting.VANILLA && player != null && this.mainHandHeight < 0.1F) { + if (Animatium.isEnabled() && AnimatiumConfig.instance().items.equipAnimationVersion != EquipAnimationVersionSetting.VANILLA && AnimatiumConfig.instance().items.equipAnimationVersion != EquipAnimationVersionSetting.DISABLED && player != null && this.mainHandHeight < 0.1F ) { this.animatium$mainHandItem = this.mainHandItem.copy(); this.animatium$currentSlot = this.minecraft.player.getInventory().getSelectedSlot(); } diff --git a/src/main/kotlin/org/visuals/legacy/animatium/util/enums/EquipAnimationVersionSetting.kt b/src/main/kotlin/org/visuals/legacy/animatium/util/enums/EquipAnimationVersionSetting.kt index b5919dc0..8f87f0f5 100644 --- a/src/main/kotlin/org/visuals/legacy/animatium/util/enums/EquipAnimationVersionSetting.kt +++ b/src/main/kotlin/org/visuals/legacy/animatium/util/enums/EquipAnimationVersionSetting.kt @@ -28,5 +28,6 @@ package org.visuals.legacy.animatium.util.enums enum class EquipAnimationVersionSetting { V1_7, V1_8, - VANILLA + VANILLA, + DISABLED } \ No newline at end of file From 72bb8bc98c3d6bcfcddf69c50d70134092d73304 Mon Sep 17 00:00:00 2001 From: mia Date: Tue, 1 Sep 2026 23:23:27 +0300 Subject: [PATCH 2/9] NO SWING PIVOT IS REAL --- .../config/category/ExtrasConfigCategory.java | 5 ++++- ...HandRenderer_FirstPersonItemPositions.java | 20 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java b/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java index 3d7dd5e7..cf02f484 100644 --- a/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java +++ b/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java @@ -72,6 +72,7 @@ public final class ExtrasConfigCategory extends Category { public boolean alwaysUsageSwing = false; public boolean fakeMissPenaltySwing = false; public boolean disableSwingTranslate = false; + public boolean disableSwingPivot = false; // Item Modifications public float itemScaleX = 1.0F; public float itemScaleY = 1.0F; @@ -144,7 +145,9 @@ public static ConfigCategory create(final ExtrasConfigCategory defaults, final E .booleanEntry("offhandUsageSwinging") .booleanEntry("alwaysUsageSwing") .booleanEntry("fakeMissPenaltySwing") - .booleanEntry("disableSwingTranslate"); + .booleanEntry("disableSwingTranslate") + .booleanEntry("disableSwingPivot"); + bundle.group("item_modifications") .floatRange("itemScaleX", 0.2F, 2.0F, 0.1F) diff --git a/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java b/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java index a7f16fb5..64a47eae 100644 --- a/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java +++ b/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java @@ -41,11 +41,13 @@ import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.item.ItemModelResolver; import net.minecraft.client.renderer.item.ItemStackRenderState; +import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ShieldItem; +import org.joml.Quaternionf; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -115,6 +117,24 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { } } + @Inject(method = "swingArm", at = @At("HEAD"), cancellable = true) + private void animatium$disableSwingPivot(float attack, PoseStack poseStack, int invert, HumanoidArm arm, CallbackInfo ci) { + if (!Animatium.isEnabled() || !AnimatiumConfig.instance().extras.disableSwingPivot) return; + ci.cancel(); + final ExtrasConfigCategory extras = AnimatiumConfig.instance().extras; + float ySwingRotation = Mth.sin(attack * attack * (float) Math.PI); + float xzSwingRotation = Mth.sin(Mth.sqrt(attack) * (float) Math.PI); + + Quaternionf rotation = new Quaternionf(); + + rotation.mul(Axis.YP.rotationDegrees(invert * (45.0F + ySwingRotation * -20.0F))); + rotation.mul(Axis.ZP.rotationDegrees(invert * xzSwingRotation * -20.0F)); + rotation.mul(Axis.XP.rotationDegrees(xzSwingRotation * -80.0F)); + rotation.mul(Axis.YP.rotationDegrees(invert * -45.0F)); + + poseStack.rotateAround(rotation,extras.itemOffsetX * 0.05F,extras.itemOffsetY * 0.05F,extras.itemOffsetZ * 0.05F); + } + @WrapOperation(method = "submitArmWithItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/AbstractClientPlayer;isUsingItem()Z")) private boolean animatium$fixDoubleBlockingVisual$itemUsageVisualInGUI(final AbstractClientPlayer instance, final Operation original) { final boolean value = original.call(instance); From fa1915a5f76e0013b5c1ec51a63592ebe0911380 Mon Sep 17 00:00:00 2001 From: mia Date: Sat, 5 Sep 2026 21:05:23 +0300 Subject: [PATCH 3/9] have item customisations apply to blocks n skulls as well --- .../config/category/ExtrasConfigCategory.java | 5 +++-- ...mInHandRenderer_FirstPersonItemPositions.java | 16 +++++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java b/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java index cf02f484..801050a9 100644 --- a/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java +++ b/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java @@ -83,6 +83,7 @@ public final class ExtrasConfigCategory extends Category { public float itemRotationX = 0.0F; public float itemRotationY = 0.0F; public float itemRotationZ = 0.0F; + public boolean applyToBlockItems = true; // Server Features (Singleplayer Only) public boolean miss_penalty = false; public boolean left_click_item_usage = false; @@ -158,8 +159,8 @@ public static ConfigCategory create(final ExtrasConfigCategory defaults, final E .floatEntry("itemOffsetZ") .floatEntry("itemRotationX") .floatEntry("itemRotationY") - .floatEntry("itemRotationZ"); - + .floatEntry("itemRotationZ") + .booleanEntry("applyToBlockItems"); { final GroupBundle serverFeatureGroup = bundle.group("server_features"); for (final ServerFeature feature : ServerFeatures.allFeatures()) { diff --git a/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java b/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java index 64a47eae..4a883ab5 100644 --- a/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java +++ b/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java @@ -220,18 +220,28 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { } if (AnimatiumConfig.instance().items.skullPosition && ItemUtilKt.isSkullBlock(itemStack) && !AnimatiumConfig.instance().items.mobHeadIcons) { + if (AnimatiumConfig.instance().extras.applyToBlockItems) { + final ExtrasConfigCategory extras = AnimatiumConfig.instance().extras; + poseStack.translate(extras.itemOffsetX * 0.05F, extras.itemOffsetY * 0.05F, extras.itemOffsetZ * 0.05F); + } poseStack.mulPose(Axis.YP.rotationDegrees(45.0F)); poseStack.scale(0.4F, 0.4F, 0.4F); // TODO: This is not quite right... (@Mixces) poseStack.mulPose(Axis.YP.rotationDegrees(-180.0F)); - poseStack.translate(0.0F, 0.25F, 0.0F); + if (!AnimatiumConfig.instance().extras.applyToBlockItems) { + poseStack.translate(0.0F, 0.25F, 0.0F); + } poseStack.scale(1.125F, 1.125F, 1.125F); } final ExtrasConfigCategory extras = AnimatiumConfig.instance().extras; - if (isNotBlock3d) { - poseStack.translate(extras.itemOffsetX * 0.05F, extras.itemOffsetY * 0.05F, extras.itemOffsetZ * 0.05F); + if (isNotBlock3d || AnimatiumConfig.instance().extras.applyToBlockItems) { + if (AnimatiumConfig.instance().items.fishingRodVersion == FishingRodVersionSetting.V1_7 && ItemUtilKt.isFishingRodItem(itemStack)) { + poseStack.translate(extras.itemOffsetX * -0.05F, extras.itemOffsetY * 0.05F, extras.itemOffsetZ * 0.05F); + } else if (!(AnimatiumConfig.instance().items.skullPosition && ItemUtilKt.isSkullBlock(itemStack) && !AnimatiumConfig.instance().items.mobHeadIcons)) { + poseStack.translate(extras.itemOffsetX * 0.05F, extras.itemOffsetY * 0.05F, extras.itemOffsetZ * 0.05F); + } poseStack.scale(extras.itemScaleX, extras.itemScaleY, extras.itemScaleZ); poseStack.mulPose(Axis.XP.rotationDegrees(direction * extras.itemRotationX)); poseStack.mulPose(Axis.YP.rotationDegrees(direction * extras.itemRotationY)); From f6d107c3cf523fd271e2883c55e135ca171c3fb0 Mon Sep 17 00:00:00 2001 From: mia Date: Sat, 5 Sep 2026 21:13:33 +0300 Subject: [PATCH 4/9] translations --- src/main/resources/assets/animatium/lang/en_us.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/resources/assets/animatium/lang/en_us.json b/src/main/resources/assets/animatium/lang/en_us.json index f9d9e5fa..70e3fd3f 100644 --- a/src/main/resources/assets/animatium/lang/en_us.json +++ b/src/main/resources/assets/animatium/lang/en_us.json @@ -152,6 +152,7 @@ "animatium.enum.EquipAnimationVersionSetting.VANILLA": "Vanilla", "animatium.enum.EquipAnimationVersionSetting.V1_8": "1.8", "animatium.enum.EquipAnimationVersionSetting.V1_7": "1.7 and below", + "animatium.enum.EquipAnimationVersionSetting.DISABLED": "Disabled", "animatium.durabilityBarColors": "[1.10] Legacy Durability Bar Color", "animatium.durabilityBarColors.description": "Restores the old durability damage colors from <=1.10.x.", "animatium.legacyItemRarities": "[1.21.1] Item Rarities", @@ -352,6 +353,8 @@ "animatium.ignoreMiningFatigueSpeed.description": "Ignore the mining fatigue speed modifier during item/hand swing.", "animatium.disableSwingTranslate": "Disable Swing Translate", "animatium.disableSwingTranslate.description": "Removes the translation/offset when swinging your item.", + "animatium.disableSwingPivot": "Disable Swing Pivot", + "animatium.disableSwingPivot.description": "Removes the pivot when swinging your item.", "animatium.category.extras.group.item_modifications": "Item Modifications", "animatium.itemScaleX": "Item Scale X", @@ -366,6 +369,14 @@ "animatium.itemOffsetY.description": "", "animatium.itemOffsetZ": "Item Offset Z", "animatium.itemOffsetZ.description": "", + "animatium.itemRotationX": "Item Rotation X", + "animatium.itemRotationX.description": "", + "animatium.itemRotationY": "Item Rotation Y", + "animatium.itemRotationY.description": "", + "animatium.itemRotationZ": "Item Rotation Z", + "animatium.itemRotationZ.description": "", + "animatium.applyToBlockItems": "Apply to block items and skulls", + "animatium.itemRotationZ.description": "", "animatium.category.extras.group.server_features": "Server Features (Singleplayer Only)", "animatium.miss_penalty": "miss_penalty", From 44d38c2e7aa84739130309fe0969b6afc3461afe Mon Sep 17 00:00:00 2001 From: mia Date: Sat, 5 Sep 2026 21:14:05 +0300 Subject: [PATCH 5/9] fix translation mistake --- src/main/resources/assets/animatium/lang/en_us.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/animatium/lang/en_us.json b/src/main/resources/assets/animatium/lang/en_us.json index 70e3fd3f..f1487f32 100644 --- a/src/main/resources/assets/animatium/lang/en_us.json +++ b/src/main/resources/assets/animatium/lang/en_us.json @@ -376,7 +376,7 @@ "animatium.itemRotationZ": "Item Rotation Z", "animatium.itemRotationZ.description": "", "animatium.applyToBlockItems": "Apply to block items and skulls", - "animatium.itemRotationZ.description": "", + "animatium.applyToBlockItems.description": "", "animatium.category.extras.group.server_features": "Server Features (Singleplayer Only)", "animatium.miss_penalty": "miss_penalty", From bfaf4f35b6c870b89df82088589e65638ca40b69 Mon Sep 17 00:00:00 2001 From: mia Date: Sat, 12 Sep 2026 13:42:19 +0300 Subject: [PATCH 6/9] rename applyToBlockItems -> applyCustomizationToBlockItems General boolean method check inside equipAnimationVersionSetting for if itemstack should be used for rendering Fixed some arguments not being final when they should --- .../config/category/ExtrasConfigCategory.java | 4 ++-- ...temInHandRenderer_FirstPersonItemPositions.java | 14 +++++++------- .../util/enums/EquipAnimationVersionSetting.kt | 8 +++++++- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java b/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java index 801050a9..1331eb5d 100644 --- a/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java +++ b/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java @@ -83,7 +83,7 @@ public final class ExtrasConfigCategory extends Category { public float itemRotationX = 0.0F; public float itemRotationY = 0.0F; public float itemRotationZ = 0.0F; - public boolean applyToBlockItems = true; + public boolean applyCustomizationToBlockItems = true; // Server Features (Singleplayer Only) public boolean miss_penalty = false; public boolean left_click_item_usage = false; @@ -160,7 +160,7 @@ public static ConfigCategory create(final ExtrasConfigCategory defaults, final E .floatEntry("itemRotationX") .floatEntry("itemRotationY") .floatEntry("itemRotationZ") - .booleanEntry("applyToBlockItems"); + .booleanEntry("applyCustomizationToBlockItems"); { final GroupBundle serverFeatureGroup = bundle.group("server_features"); for (final ServerFeature feature : ServerFeatures.allFeatures()) { diff --git a/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java b/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java index 4a883ab5..5227fc1a 100644 --- a/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java +++ b/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java @@ -220,8 +220,8 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { } if (AnimatiumConfig.instance().items.skullPosition && ItemUtilKt.isSkullBlock(itemStack) && !AnimatiumConfig.instance().items.mobHeadIcons) { - if (AnimatiumConfig.instance().extras.applyToBlockItems) { - final ExtrasConfigCategory extras = AnimatiumConfig.instance().extras; + final ExtrasConfigCategory extras = AnimatiumConfig.instance().extras; + if (extras.applyCustomizationToBlockItems) { poseStack.translate(extras.itemOffsetX * 0.05F, extras.itemOffsetY * 0.05F, extras.itemOffsetZ * 0.05F); } poseStack.mulPose(Axis.YP.rotationDegrees(45.0F)); @@ -229,14 +229,14 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { // TODO: This is not quite right... (@Mixces) poseStack.mulPose(Axis.YP.rotationDegrees(-180.0F)); - if (!AnimatiumConfig.instance().extras.applyToBlockItems) { + if (!AnimatiumConfig.instance().extras.applyCustomizationToBlockItems) { poseStack.translate(0.0F, 0.25F, 0.0F); } poseStack.scale(1.125F, 1.125F, 1.125F); } final ExtrasConfigCategory extras = AnimatiumConfig.instance().extras; - if (isNotBlock3d || AnimatiumConfig.instance().extras.applyToBlockItems) { + if (isNotBlock3d || AnimatiumConfig.instance().extras.applyCustomizationToBlockItems) { if (AnimatiumConfig.instance().items.fishingRodVersion == FishingRodVersionSetting.V1_7 && ItemUtilKt.isFishingRodItem(itemStack)) { poseStack.translate(extras.itemOffsetX * -0.05F, extras.itemOffsetY * 0.05F, extras.itemOffsetZ * 0.05F); } else if (!(AnimatiumConfig.instance().items.skullPosition && ItemUtilKt.isSkullBlock(itemStack) && !AnimatiumConfig.instance().items.mobHeadIcons)) { @@ -271,7 +271,7 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { @ModifyArg(method = "submitHandsWithItems", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ItemInHandRenderer;submitArmWithItem(Lnet/minecraft/client/player/AbstractClientPlayer;FFLnet/minecraft/world/InteractionHand;FLnet/minecraft/world/item/ItemStack;FLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;I)V", ordinal = 0), index = 5) private ItemStack animatium$useCopyStackFieldForRender(final ItemStack original) { // TODO/NOTE: 26.2 makes the item persist in hand even when empty (temp check added) - if (Animatium.isEnabled() && AnimatiumConfig.instance().items.equipAnimationVersion != EquipAnimationVersionSetting.VANILLA && AnimatiumConfig.instance().items.equipAnimationVersion != EquipAnimationVersionSetting.DISABLED && !original.isEmpty()) { + if (!Animatium.isEnabled() || AnimatiumConfig.instance().items.equipAnimationVersion.useStackForRendering() && !original.isEmpty()) { // Use our copied stack field for hand animations return this.animatium$mainHandItem; } else { @@ -281,11 +281,11 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { @ModifyExpressionValue(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/ItemInHandRenderer;shouldInstantlyReplaceVisibleItem(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/item/ItemStack;)Z", ordinal = 0)) private boolean animatium$disableEquipConstraint(final boolean original) { - return (!Animatium.isEnabled() || AnimatiumConfig.instance().items.equipAnimationVersion == EquipAnimationVersionSetting.VANILLA || AnimatiumConfig.instance().items.equipAnimationVersion == EquipAnimationVersionSetting.DISABLED) && original; + return (!Animatium.isEnabled() || !AnimatiumConfig.instance().items.equipAnimationVersion.useStackForRendering()) && original; } @Inject(method = "shouldInstantlyReplaceVisibleItem", at = @At("HEAD"), cancellable = true) - private void animatium$skipEquipAnimation(ItemStack currentlyVisibleItem, ItemStack expectedItem, CallbackInfoReturnable cir) { + private void animatium$skipEquipAnimation(final ItemStack currentlyVisibleItem, final ItemStack expectedItem, CallbackInfoReturnable cir) { if (Animatium.isEnabled() && AnimatiumConfig.instance().items.equipAnimationVersion == EquipAnimationVersionSetting.DISABLED && this.minecraft.player != null) { cir.setReturnValue(true); } diff --git a/src/main/kotlin/org/visuals/legacy/animatium/util/enums/EquipAnimationVersionSetting.kt b/src/main/kotlin/org/visuals/legacy/animatium/util/enums/EquipAnimationVersionSetting.kt index 8f87f0f5..d8c090c5 100644 --- a/src/main/kotlin/org/visuals/legacy/animatium/util/enums/EquipAnimationVersionSetting.kt +++ b/src/main/kotlin/org/visuals/legacy/animatium/util/enums/EquipAnimationVersionSetting.kt @@ -25,9 +25,15 @@ package org.visuals.legacy.animatium.util.enums +import org.visuals.legacy.animatium.config.AnimatiumConfig + enum class EquipAnimationVersionSetting { V1_7, V1_8, VANILLA, - DISABLED + DISABLED; + + fun useStackForRendering(): Boolean { + return !(AnimatiumConfig.instance().items.equipAnimationVersion == VANILLA || AnimatiumConfig.instance().items.equipAnimationVersion == DISABLED) + } } \ No newline at end of file From a3c19f3c5221439970e3feeff30f7fa3e11844c4 Mon Sep 17 00:00:00 2001 From: mia Date: Sat, 12 Sep 2026 18:13:23 +0300 Subject: [PATCH 7/9] Way simpler and less intrusive way of disabling swing pivot --- ...HandRenderer_FirstPersonItemPositions.java | 25 ++++++++----------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java b/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java index 5227fc1a..0c97d02f 100644 --- a/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java +++ b/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java @@ -29,6 +29,7 @@ import com.llamalad7.mixinextras.expression.Expression; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; @@ -117,22 +118,16 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { } } - @Inject(method = "swingArm", at = @At("HEAD"), cancellable = true) - private void animatium$disableSwingPivot(float attack, PoseStack poseStack, int invert, HumanoidArm arm, CallbackInfo ci) { - if (!Animatium.isEnabled() || !AnimatiumConfig.instance().extras.disableSwingPivot) return; - ci.cancel(); + @WrapMethod(method = "applyItemArmAttackTransform") + private void animatium$disableSwingPivot(PoseStack poseStack, HumanoidArm arm, float attackValue, Operation original) { + if (!Animatium.isEnabled() || !AnimatiumConfig.instance().extras.disableSwingPivot) { + original.call(poseStack, arm, attackValue); + return; + } final ExtrasConfigCategory extras = AnimatiumConfig.instance().extras; - float ySwingRotation = Mth.sin(attack * attack * (float) Math.PI); - float xzSwingRotation = Mth.sin(Mth.sqrt(attack) * (float) Math.PI); - - Quaternionf rotation = new Quaternionf(); - - rotation.mul(Axis.YP.rotationDegrees(invert * (45.0F + ySwingRotation * -20.0F))); - rotation.mul(Axis.ZP.rotationDegrees(invert * xzSwingRotation * -20.0F)); - rotation.mul(Axis.XP.rotationDegrees(xzSwingRotation * -80.0F)); - rotation.mul(Axis.YP.rotationDegrees(invert * -45.0F)); - - poseStack.rotateAround(rotation,extras.itemOffsetX * 0.05F,extras.itemOffsetY * 0.05F,extras.itemOffsetZ * 0.05F); + poseStack.translate(extras.itemOffsetX * 0.05F,extras.itemOffsetY * 0.05F,extras.itemOffsetZ * 0.05F); + original.call(poseStack, arm, attackValue); + poseStack.translate(extras.itemOffsetX * -0.05F,extras.itemOffsetY * -0.05F,extras.itemOffsetZ * -0.05F); } @WrapOperation(method = "submitArmWithItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/AbstractClientPlayer;isUsingItem()Z")) From 72fe114e55a3c4fdd8fa254847790e5d78d45de8 Mon Sep 17 00:00:00 2001 From: mia Date: Sat, 12 Sep 2026 21:49:56 +0300 Subject: [PATCH 8/9] Use 'this' instead in EquipAnimationVersionSetting, fix missing 'final' arguments, missing spaces between some of the arguments, animatium$TRANSLATE_OFFSET_MULTIPLIER instead of magic number --- ...HandRenderer_FirstPersonItemPositions.java | 19 ++++++++++--------- .../enums/EquipAnimationVersionSetting.kt | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java b/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java index 0c97d02f..aca5c928 100644 --- a/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java +++ b/src/main/java/org/visuals/legacy/animatium/mixins/v1/rendering/items/MixinItemInHandRenderer_FirstPersonItemPositions.java @@ -42,13 +42,11 @@ import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.item.ItemModelResolver; import net.minecraft.client.renderer.item.ItemStackRenderState; -import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.HumanoidArm; import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ShieldItem; -import org.joml.Quaternionf; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -96,6 +94,9 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { @Unique private ItemStack animatium$mainHandItem = ItemStack.EMPTY; + @Unique + private static final float animatium$TRANSLATE_OFFSET_MULTIPLIER = 0.05F; + @SuppressWarnings({"MixinAnnotationTarget"}) @ModifyExpressionValue(method = {"renderOneHandedMap", "renderTwoHandedMap", "submitArmWithItem"}, at = { @At(value = "INVOKE", target = "Lnet/minecraft/client/player/AbstractClientPlayer;isInvisible()Z"), @@ -119,15 +120,15 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { } @WrapMethod(method = "applyItemArmAttackTransform") - private void animatium$disableSwingPivot(PoseStack poseStack, HumanoidArm arm, float attackValue, Operation original) { + private void animatium$disableSwingPivot(final PoseStack poseStack, final HumanoidArm arm, final float attackValue, final Operation original) { if (!Animatium.isEnabled() || !AnimatiumConfig.instance().extras.disableSwingPivot) { original.call(poseStack, arm, attackValue); return; } final ExtrasConfigCategory extras = AnimatiumConfig.instance().extras; - poseStack.translate(extras.itemOffsetX * 0.05F,extras.itemOffsetY * 0.05F,extras.itemOffsetZ * 0.05F); + poseStack.translate(extras.itemOffsetX * animatium$TRANSLATE_OFFSET_MULTIPLIER, extras.itemOffsetY * animatium$TRANSLATE_OFFSET_MULTIPLIER, extras.itemOffsetZ * animatium$TRANSLATE_OFFSET_MULTIPLIER); original.call(poseStack, arm, attackValue); - poseStack.translate(extras.itemOffsetX * -0.05F,extras.itemOffsetY * -0.05F,extras.itemOffsetZ * -0.05F); + poseStack.translate(extras.itemOffsetX * -animatium$TRANSLATE_OFFSET_MULTIPLIER, extras.itemOffsetY * -animatium$TRANSLATE_OFFSET_MULTIPLIER, extras.itemOffsetZ * -animatium$TRANSLATE_OFFSET_MULTIPLIER); } @WrapOperation(method = "submitArmWithItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/AbstractClientPlayer;isUsingItem()Z")) @@ -217,7 +218,7 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { if (AnimatiumConfig.instance().items.skullPosition && ItemUtilKt.isSkullBlock(itemStack) && !AnimatiumConfig.instance().items.mobHeadIcons) { final ExtrasConfigCategory extras = AnimatiumConfig.instance().extras; if (extras.applyCustomizationToBlockItems) { - poseStack.translate(extras.itemOffsetX * 0.05F, extras.itemOffsetY * 0.05F, extras.itemOffsetZ * 0.05F); + poseStack.translate(extras.itemOffsetX * animatium$TRANSLATE_OFFSET_MULTIPLIER, extras.itemOffsetY * animatium$TRANSLATE_OFFSET_MULTIPLIER, extras.itemOffsetZ * animatium$TRANSLATE_OFFSET_MULTIPLIER); } poseStack.mulPose(Axis.YP.rotationDegrees(45.0F)); poseStack.scale(0.4F, 0.4F, 0.4F); @@ -233,9 +234,9 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { final ExtrasConfigCategory extras = AnimatiumConfig.instance().extras; if (isNotBlock3d || AnimatiumConfig.instance().extras.applyCustomizationToBlockItems) { if (AnimatiumConfig.instance().items.fishingRodVersion == FishingRodVersionSetting.V1_7 && ItemUtilKt.isFishingRodItem(itemStack)) { - poseStack.translate(extras.itemOffsetX * -0.05F, extras.itemOffsetY * 0.05F, extras.itemOffsetZ * 0.05F); + poseStack.translate(extras.itemOffsetX * -animatium$TRANSLATE_OFFSET_MULTIPLIER, extras.itemOffsetY * animatium$TRANSLATE_OFFSET_MULTIPLIER, extras.itemOffsetZ * animatium$TRANSLATE_OFFSET_MULTIPLIER); } else if (!(AnimatiumConfig.instance().items.skullPosition && ItemUtilKt.isSkullBlock(itemStack) && !AnimatiumConfig.instance().items.mobHeadIcons)) { - poseStack.translate(extras.itemOffsetX * 0.05F, extras.itemOffsetY * 0.05F, extras.itemOffsetZ * 0.05F); + poseStack.translate(extras.itemOffsetX * animatium$TRANSLATE_OFFSET_MULTIPLIER, extras.itemOffsetY * animatium$TRANSLATE_OFFSET_MULTIPLIER, extras.itemOffsetZ * animatium$TRANSLATE_OFFSET_MULTIPLIER); } poseStack.scale(extras.itemScaleX, extras.itemScaleY, extras.itemScaleZ); poseStack.mulPose(Axis.XP.rotationDegrees(direction * extras.itemRotationX)); @@ -280,7 +281,7 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { } @Inject(method = "shouldInstantlyReplaceVisibleItem", at = @At("HEAD"), cancellable = true) - private void animatium$skipEquipAnimation(final ItemStack currentlyVisibleItem, final ItemStack expectedItem, CallbackInfoReturnable cir) { + private void animatium$skipEquipAnimation(final ItemStack currentlyVisibleItem, final ItemStack expectedItem, final CallbackInfoReturnable cir) { if (Animatium.isEnabled() && AnimatiumConfig.instance().items.equipAnimationVersion == EquipAnimationVersionSetting.DISABLED && this.minecraft.player != null) { cir.setReturnValue(true); } diff --git a/src/main/kotlin/org/visuals/legacy/animatium/util/enums/EquipAnimationVersionSetting.kt b/src/main/kotlin/org/visuals/legacy/animatium/util/enums/EquipAnimationVersionSetting.kt index d8c090c5..6f2f08f3 100644 --- a/src/main/kotlin/org/visuals/legacy/animatium/util/enums/EquipAnimationVersionSetting.kt +++ b/src/main/kotlin/org/visuals/legacy/animatium/util/enums/EquipAnimationVersionSetting.kt @@ -34,6 +34,6 @@ enum class EquipAnimationVersionSetting { DISABLED; fun useStackForRendering(): Boolean { - return !(AnimatiumConfig.instance().items.equipAnimationVersion == VANILLA || AnimatiumConfig.instance().items.equipAnimationVersion == DISABLED) + return !(this == VANILLA || this == DISABLED) } } \ No newline at end of file From 61569c080e96bffb4d336b273218d552dabaf08d Mon Sep 17 00:00:00 2001 From: mia Date: Sun, 13 Sep 2026 12:15:53 +0300 Subject: [PATCH 9/9] extra semicolon causing build to fail --- .../legacy/animatium/config/category/ExtrasConfigCategory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java b/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java index 315b9077..dffcecfb 100644 --- a/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java +++ b/src/main/java/org/visuals/legacy/animatium/config/category/ExtrasConfigCategory.java @@ -148,7 +148,7 @@ public static ConfigCategory create(final ExtrasConfigCategory defaults, final E .booleanEntry("alwaysUsageSwing") .booleanEntry("fakeMissPenaltySwing") .booleanEntry("disableSwingTranslate") - .booleanEntry("disableSwingPivot"); + .booleanEntry("disableSwingPivot") .booleanEntry("legacySwingAnimation"); bundle.group("item_modifications")