From f1c37e87ff9389e4f64c747a498273eacb150524 Mon Sep 17 00:00:00 2001 From: Wanja <105125277+Manchick0@users.noreply.github.com> Date: Thu, 27 Feb 2025 21:46:20 +0100 Subject: Add "Swing On Abilities" (#1127) * Add "Swing On Abilities" Introduced a simple configuration option to enable hand-swing animations for items with right-click abilities. * Use Mixin Refactored the swing animation logic into a mixin. * Update swing on ability injection point --------- Co-authored-by: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com> --- .../config/categories/UIAndVisualsCategory.java | 8 ++++++ .../config/configs/UIAndVisualsConfig.java | 4 +++ .../ClientPlayerInteractionManagerMixin.java | 32 ++++++++++++++++++++++ .../hysky/skyblocker/skyblock/SwingAnimation.java | 20 ++++++++++++++ 4 files changed, 64 insertions(+) create mode 100644 src/main/java/de/hysky/skyblocker/mixins/ClientPlayerInteractionManagerMixin.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/SwingAnimation.java (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java index 61540171..118d84e2 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java @@ -35,6 +35,14 @@ public class UIAndVisualsCategory { .name(Text.translatable("skyblocker.config.uiAndVisuals")) //Ungrouped Options + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.uiAndVisuals.swingOnAbilities")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.uiAndVisuals.swingOnAbilities.@Tooltip"))) + .binding(defaults.uiAndVisuals.swingOnAbilities, + () -> config.uiAndVisuals.swingOnAbilities, + newValue -> config.uiAndVisuals.swingOnAbilities = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) .option(Option.createBuilder() .name(Text.translatable("skyblocker.config.uiAndVisuals.nightVisionStrength")) .description(OptionDescription.of(Text.translatable("skyblocker.config.uiAndVisuals.nightVisionStrength.@Tooltip"))) diff --git a/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java index ffe0dcce..980a219a 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java @@ -13,6 +13,10 @@ import java.util.ArrayList; import java.util.List; public class UIAndVisualsConfig { + + @SerialEntry + public boolean swingOnAbilities = false; + @SerialEntry public int nightVisionStrength = 100; diff --git a/src/main/java/de/hysky/skyblocker/mixins/ClientPlayerInteractionManagerMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayerInteractionManagerMixin.java new file mode 100644 index 00000000..b913c620 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayerInteractionManagerMixin.java @@ -0,0 +1,32 @@ +package de.hysky.skyblocker.mixins; + +import com.llamalad7.mixinextras.sugar.Local; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.SwingAnimation; +import net.minecraft.client.network.ClientPlayerInteractionManager; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.network.packet.Packet; +import net.minecraft.util.Hand; +import org.apache.commons.lang3.mutable.MutableObject; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Slice; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(ClientPlayerInteractionManager.class) +public class ClientPlayerInteractionManagerMixin { + // Inject so that we only swing when the result is not success because vanilla handles swing on success. + @Inject(method = "method_41929", + slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;use(Lnet/minecraft/world/World;Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/util/Hand;)Lnet/minecraft/util/ActionResult;")), + at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/entity/player/PlayerEntity;getStackInHand(Lnet/minecraft/util/Hand;)Lnet/minecraft/item/ItemStack;") + ) + public void swingOnAbility(Hand hand, PlayerEntity playerEntity, MutableObject mutableObject, + int sequence, CallbackInfoReturnable> cir, @Local(ordinal = 0) ItemStack itemStack) { + if (SkyblockerConfigManager.get().uiAndVisuals.swingOnAbilities + && SwingAnimation.hasAbility(itemStack)) { + playerEntity.swingHand(hand); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/SwingAnimation.java b/src/main/java/de/hysky/skyblocker/skyblock/SwingAnimation.java new file mode 100644 index 00000000..3d71400b --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/SwingAnimation.java @@ -0,0 +1,20 @@ +package de.hysky.skyblocker.skyblock; + +import de.hysky.skyblocker.utils.ItemUtils; +import net.minecraft.item.ItemStack; + +import java.util.regex.Pattern; + +public class SwingAnimation { + private static final Pattern ABILITY = Pattern.compile("^ability:\\s.*?\\s+right\\sclick$"); + + public static boolean hasAbility(ItemStack stack) { + if (stack.isEmpty()) return false; + var lore = ItemUtils.getLore(stack); + for (var line : lore) { + if (ABILITY.matcher(line.getString().trim().toLowerCase()).matches()) + return true; + } + return false; + } +} -- cgit