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 0f68e2b9..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 @@ -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; public boolean legacySwingAnimation = false; // Item Modifications public float itemScaleX = 1.0F; @@ -80,6 +81,10 @@ 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; + public boolean applyCustomizationToBlockItems = true; // Server Features (Singleplayer Only) public boolean miss_penalty = false; public boolean left_click_item_usage = false; @@ -143,16 +148,20 @@ public static ConfigCategory create(final ExtrasConfigCategory defaults, final E .booleanEntry("alwaysUsageSwing") .booleanEntry("fakeMissPenaltySwing") .booleanEntry("disableSwingTranslate") + .booleanEntry("disableSwingPivot") .booleanEntry("legacySwingAnimation"); 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") + .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 665373ad..77edeb84 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; @@ -55,6 +56,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; @@ -92,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"), @@ -114,6 +119,18 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { } } + @WrapMethod(method = "applyItemArmAttackTransform") + 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 * 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 * -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")) private boolean animatium$fixDoubleBlockingVisual$itemUsageVisualInGUI(final AbstractClientPlayer instance, final Operation original) { final boolean value = original.call(instance); @@ -199,19 +216,32 @@ 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 * 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); // 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.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) { - poseStack.translate(extras.itemOffsetX * 0.05F, extras.itemOffsetY * 0.05F, extras.itemOffsetZ * 0.05F); + if (isNotBlock3d || AnimatiumConfig.instance().extras.applyCustomizationToBlockItems) { + if (AnimatiumConfig.instance().items.fishingRodVersion == FishingRodVersionSetting.V1_7 && ItemUtilKt.isFishingRodItem(itemStack)) { + 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 * 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)); + poseStack.mulPose(Axis.YP.rotationDegrees(direction * extras.itemRotationY)); + poseStack.mulPose(Axis.ZP.rotationDegrees(direction * extras.itemRotationZ)); } } } @@ -246,7 +276,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.useStackForRendering() && !original.isEmpty()) { // Use our copied stack field for hand animations return this.animatium$mainHandItem; } else { @@ -256,7 +286,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.useStackForRendering()) && original; + } + + @Inject(method = "shouldInstantlyReplaceVisibleItem", at = @At("HEAD"), cancellable = true) + 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); + } } // Fixes MC-262560 @@ -264,7 +301,7 @@ public abstract class MixinItemInHandRenderer_FirstPersonItemPositions { private float animatium$handleEquipLogic(final float original, @Local(name = "attackAnim") float attackAnim) { 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 scale = (float) Math.pow(attackAnim, 3); final ItemStack stackCopy = player.getInventory().getSelectedItem().copy(); @@ -293,7 +330,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..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 @@ -25,8 +25,15 @@ package org.visuals.legacy.animatium.util.enums +import org.visuals.legacy.animatium.config.AnimatiumConfig + enum class EquipAnimationVersionSetting { V1_7, V1_8, - VANILLA + VANILLA, + DISABLED; + + fun useStackForRendering(): Boolean { + return !(this == VANILLA || this == DISABLED) + } } \ No newline at end of file diff --git a/src/main/resources/assets/animatium/lang/en_us.json b/src/main/resources/assets/animatium/lang/en_us.json index bc253877..e317e928 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.fakeMissPenaltySwing.description": "In vanilla Minecraft, if the player has missed their hit, there will be a 10 ms delay on top of the attack cooldown before they can swing again. Enable this feature to play a fake swing animation during that 10 ms delay to match <=1.7.x.", "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.legacySwingAnimation": "Legacy Swing", "animatium.legacySwingAnimation.description": "Removes the 1.9+ cooldown animation when swinging your item, making it look like <=1.8.", @@ -368,6 +371,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.applyToBlockItems.description": "", "animatium.category.extras.group.server_features": "Server Features (Singleplayer Only)", "animatium.miss_penalty": "miss_penalty",