Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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"),
Expand All @@ -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<Void> 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<Boolean> original) {
final boolean value = original.call(instance);
Expand Down Expand Up @@ -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));
}
}
}
Expand Down Expand Up @@ -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 {
Expand All @@ -256,15 +286,22 @@ 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)
Comment thread
Vahvl marked this conversation as resolved.
private void animatium$skipEquipAnimation(final ItemStack currentlyVisibleItem, final ItemStack expectedItem, final CallbackInfoReturnable<Boolean> cir) {
if (Animatium.isEnabled() && AnimatiumConfig.instance().items.equipAnimationVersion == EquipAnimationVersionSetting.DISABLED && this.minecraft.player != null) {
cir.setReturnValue(true);
}
}

// Fixes MC-262560
@ModifyArg(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Mth;clamp(FFF)F", ordinal = 2), index = 0)
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();

Expand Down Expand Up @@ -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();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
11 changes: 11 additions & 0 deletions src/main/resources/assets/animatium/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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.",

Expand All @@ -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",
Expand Down