aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorWanja <105125277+Manchick0@users.noreply.github.com>2025-02-27 21:46:20 +0100
committerGitHub <noreply@github.com>2025-02-28 04:46:20 +0800
commitf1c37e87ff9389e4f64c747a498273eacb150524 (patch)
treec6d3be4a5ca60b08a79e86604aee849d69befa8e /src/main/java
parentbc33f40cb3989d6ac1a1d81d9f4cf0b89e831071 (diff)
downloadSkyblocker-f1c37e87ff9389e4f64c747a498273eacb150524.tar.gz
Skyblocker-f1c37e87ff9389e4f64c747a498273eacb150524.tar.bz2
Skyblocker-f1c37e87ff9389e4f64c747a498273eacb150524.zip
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>
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java8
-rw-r--r--src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/mixins/ClientPlayerInteractionManagerMixin.java32
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/SwingAnimation.java20
4 files changed, 64 insertions, 0 deletions
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.<Boolean>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.<Integer>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<Packet<?>> 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;
+ }
+}