From 2a7286efbb083370fecb32d042ed88b8662ef4e5 Mon Sep 17 00:00:00 2001 From: Takaranoao Date: Sat, 6 Apr 2024 21:03:45 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E4=BD=BF=E7=94=A8mixin=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E9=BC=A0=E6=A0=87=E6=8C=89=E9=94=AE=E7=9B=91=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/takaranoao/donothitme/DoNotHitMe.java | 47 +++++++++++++++++-- .../donothitme/mixin/MixinMinecraft.java | 44 +++++++++++++++++ .../resources/donothitme-common.mixins.json | 1 + 3 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 common/src/main/java/com/takaranoao/donothitme/mixin/MixinMinecraft.java diff --git a/common/src/main/java/com/takaranoao/donothitme/DoNotHitMe.java b/common/src/main/java/com/takaranoao/donothitme/DoNotHitMe.java index 38f6fa6..58d90f0 100644 --- a/common/src/main/java/com/takaranoao/donothitme/DoNotHitMe.java +++ b/common/src/main/java/com/takaranoao/donothitme/DoNotHitMe.java @@ -8,6 +8,7 @@ import dev.architectury.registry.client.keymappings.KeyMappingRegistry; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; @@ -15,7 +16,9 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class DoNotHitMe { public static final String MOD_ID = "donothitme"; @@ -41,12 +44,12 @@ private EventResult onPlayerAttackEntity(Player player, Level level, Entity enti if (!config.enable) { return EventResult.pass(); } - if(entity instanceof Player){ - if(config.no_pvp){ + if (entity instanceof Player) { + if (config.no_pvp) { return EventResult.interruptFalse(); } - }else if(entity instanceof LivingEntity){ - if(config.no_pve){ + } else if (entity instanceof LivingEntity) { + if (config.no_pve) { return EventResult.interruptFalse(); } } @@ -94,4 +97,40 @@ public void handleKeyPress(@NotNull DNHKeyType keyType) { } } } + + public boolean handleStartAttack(@NotNull LocalPlayer player, @Nullable HitResult hitResult) { + var config = configManager.getConfig(); + if (!config.enable || hitResult == null) { + return true; + } + if (hitResult.getType() == HitResult.Type.BLOCK || hitResult.getType() == HitResult.Type.MISS) { + return true; + } + if (config.keep_main_hand_waving) { + return true; + } + if (hitResult instanceof EntityHitResult) { + var entity = ((EntityHitResult) hitResult).getEntity(); + if (entity instanceof Player) { + return !config.no_pvp; + } else if (entity instanceof LivingEntity) { + return !config.no_pve; + } + } + return true; + } + + + public void handleAfterStartUseItem(@NotNull LocalPlayer player, @Nullable HitResult hitResult) { + var config = configManager.getConfig(); + if (!config.enable) { + return; + } + if (player.isHandsBusy()) { + return; + } + if (config.open_off_hand_waving) { + player.swing(InteractionHand.OFF_HAND); + } + } } diff --git a/common/src/main/java/com/takaranoao/donothitme/mixin/MixinMinecraft.java b/common/src/main/java/com/takaranoao/donothitme/mixin/MixinMinecraft.java new file mode 100644 index 0000000..13b3ebc --- /dev/null +++ b/common/src/main/java/com/takaranoao/donothitme/mixin/MixinMinecraft.java @@ -0,0 +1,44 @@ +package com.takaranoao.donothitme.mixin; + +import com.takaranoao.donothitme.DoNotHitMe; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.phys.HitResult; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(Minecraft.class) +@Environment(EnvType.CLIENT) +public class MixinMinecraft { + @Shadow + public HitResult hitResult; + @Nullable + @Shadow + public LocalPlayer player; + + @Inject(method = "startUseItem", at = @At("RETURN")) + private void startUseItem(CallbackInfo ci) { + var mod = DoNotHitMe.getInstance(); + if(mod == null || player == null){ + return; + } + mod.handleAfterStartUseItem(player, hitResult); + } + @Inject(method="startAttack", at=@At("HEAD")) + private void startAttack(CallbackInfoReturnable cir) { + var mod = DoNotHitMe.getInstance(); + if(mod == null || player == null){ + return; + } + if(! mod.handleStartAttack(player, hitResult)){ + cir.setReturnValue(false); + } + } +} diff --git a/common/src/main/resources/donothitme-common.mixins.json b/common/src/main/resources/donothitme-common.mixins.json index 3215ccc..d60f1cc 100644 --- a/common/src/main/resources/donothitme-common.mixins.json +++ b/common/src/main/resources/donothitme-common.mixins.json @@ -6,6 +6,7 @@ "mixins": [ ], "client": [ + "MixinMinecraft" ], "injectors": { "defaultRequire": 1