From f48b8f589210629c0f7d2bdd7425c67f050f3172 Mon Sep 17 00:00:00 2001 From: Light_Quanta Date: Wed, 14 May 2025 20:06:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=BC=BABEAST=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/mixin/BeastEntityKiller.java | 12 +++++ .../atsuishio/superbwarfare/item/Beast.java | 4 +- .../superbwarfare/mixins/BeastMixin.java | 46 +++++++++++++++++++ src/main/resources/mixins.superbwarfare.json | 1 + 4 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/atsuishio/superbwarfare/entity/mixin/BeastEntityKiller.java create mode 100644 src/main/java/com/atsuishio/superbwarfare/mixins/BeastMixin.java diff --git a/src/main/java/com/atsuishio/superbwarfare/entity/mixin/BeastEntityKiller.java b/src/main/java/com/atsuishio/superbwarfare/entity/mixin/BeastEntityKiller.java new file mode 100644 index 000000000..338e1398d --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/entity/mixin/BeastEntityKiller.java @@ -0,0 +1,12 @@ +package com.atsuishio.superbwarfare.entity.mixin; + +import net.minecraft.world.entity.LivingEntity; + +public interface BeastEntityKiller { + + static BeastEntityKiller getInstance(LivingEntity entity) { + return (BeastEntityKiller) entity; + } + + void sbw$kill(); +} diff --git a/src/main/java/com/atsuishio/superbwarfare/item/Beast.java b/src/main/java/com/atsuishio/superbwarfare/item/Beast.java index f752618a3..fc0367b08 100644 --- a/src/main/java/com/atsuishio/superbwarfare/item/Beast.java +++ b/src/main/java/com/atsuishio/superbwarfare/item/Beast.java @@ -3,6 +3,7 @@ package com.atsuishio.superbwarfare.item; import com.atsuishio.superbwarfare.config.server.MiscConfig; import com.atsuishio.superbwarfare.entity.DPSGeneratorEntity; import com.atsuishio.superbwarfare.entity.TargetEntity; +import com.atsuishio.superbwarfare.entity.mixin.BeastEntityKiller; import com.atsuishio.superbwarfare.init.ModDamageTypes; import com.atsuishio.superbwarfare.init.ModEnumExtensions; import com.atsuishio.superbwarfare.init.ModSounds; @@ -99,6 +100,7 @@ public class Beast extends SwordItem { ); } else { if (target instanceof LivingEntity living) { + BeastEntityKiller.getInstance(living).sbw$kill(); living.setHealth(0); } target.level().broadcastEntityEvent(target, (byte) 60); @@ -129,7 +131,7 @@ public class Beast extends SwordItem { @Override @ParametersAreNonnullByDefault public boolean onEntitySwing(ItemStack stack, LivingEntity entity, InteractionHand hand) { - var target = TraceTool.findMeleeEntity(entity, 50); + var target = TraceTool.findMeleeEntity(entity, 51.4); if (target != null) { beastKill(entity, target); } diff --git a/src/main/java/com/atsuishio/superbwarfare/mixins/BeastMixin.java b/src/main/java/com/atsuishio/superbwarfare/mixins/BeastMixin.java new file mode 100644 index 000000000..f1cc4d471 --- /dev/null +++ b/src/main/java/com/atsuishio/superbwarfare/mixins/BeastMixin.java @@ -0,0 +1,46 @@ +package com.atsuishio.superbwarfare.mixins; + +import com.atsuishio.superbwarfare.entity.mixin.BeastEntityKiller; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +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(LivingEntity.class) +public abstract class BeastMixin implements BeastEntityKiller { + + @Unique + public boolean sbw$beastKilled = false; + + @Override + public void sbw$kill() { + this.sbw$beastKilled = true; + } + + @Inject(method = "isDeadOrDying", at = @At("HEAD"), cancellable = true, order = Integer.MAX_VALUE) + public void isDeadOrDying(CallbackInfoReturnable cir) { + if (this.sbw$beastKilled) { + cir.cancel(); + cir.setReturnValue(true); + } + } + + @Inject(method = "getHealth", at = @At("HEAD"), cancellable = true, order = Integer.MAX_VALUE) + public void getHealth(CallbackInfoReturnable cir) { + if (this.sbw$beastKilled) { + cir.cancel(); + cir.setReturnValue(0f); + } + } + + @Inject(method = "remove", at = @At("RETURN"), order = Integer.MAX_VALUE) + public void onRemove(Entity.RemovalReason reason, CallbackInfo ci) { + if (this.sbw$beastKilled) { + ((LivingEntity) (Object) this).setRemoved(reason); + } + } +} diff --git a/src/main/resources/mixins.superbwarfare.json b/src/main/resources/mixins.superbwarfare.json index bd711627d..5ca591322 100644 --- a/src/main/resources/mixins.superbwarfare.json +++ b/src/main/resources/mixins.superbwarfare.json @@ -4,6 +4,7 @@ "compatibilityLevel": "JAVA_21", "refmap": "mixins.superbwarfare.refmap.json", "mixins": [ + "BeastMixin", "ClientboundSetPassengersPacketMixin", "EntityMixin", "FishingHookMixin",