From f871a5d4739d652412fae0774e3f9957ff14c6f0 Mon Sep 17 00:00:00 2001 From: gnembon Date: Tue, 14 Jul 2020 23:36:11 -0300 Subject: [PATCH] move damage events before damage effects are applied --- .../DamageTracker_scarpetEventMixin.java | 37 --------------- .../LivingEntity_scarpetEventsMixin.java | 25 ++++++++++ .../PlayerEntity_scarpetEventsMixin.java | 46 +++++++++++++++++++ src/main/resources/carpet.mixins.json | 2 +- 4 files changed, 72 insertions(+), 38 deletions(-) delete mode 100644 src/main/java/carpet/mixins/DamageTracker_scarpetEventMixin.java create mode 100644 src/main/java/carpet/mixins/PlayerEntity_scarpetEventsMixin.java diff --git a/src/main/java/carpet/mixins/DamageTracker_scarpetEventMixin.java b/src/main/java/carpet/mixins/DamageTracker_scarpetEventMixin.java deleted file mode 100644 index 049a80c5..00000000 --- a/src/main/java/carpet/mixins/DamageTracker_scarpetEventMixin.java +++ /dev/null @@ -1,37 +0,0 @@ -package carpet.mixins; - -import carpet.fakes.EntityInterface; -import carpet.script.EntityEventsGroup; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.damage.DamageSource; -import net.minecraft.entity.damage.DamageTracker; -import net.minecraft.server.network.ServerPlayerEntity; -import org.spongepowered.asm.mixin.Final; -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 static carpet.script.CarpetEventServer.Event.PLAYER_DEALS_DAMAGE; -import static carpet.script.CarpetEventServer.Event.PLAYER_TAKES_DAMAGE; - -@Mixin(DamageTracker.class) -public abstract class DamageTracker_scarpetEventMixin -{ - @Shadow @Final private LivingEntity entity; - - @Inject(method = "onDamage", at = @At("HEAD")) - private void onDamageTaken(DamageSource damageSource_1, float float_1, float float_2, CallbackInfo ci) - { - ((EntityInterface)entity).getEventContainer().onEvent(EntityEventsGroup.EntityEventType.ON_DAMAGE, float_2, damageSource_1); - if (entity instanceof ServerPlayerEntity && PLAYER_TAKES_DAMAGE.isNeeded()) - { - PLAYER_TAKES_DAMAGE.onDamage(entity, float_2, damageSource_1); - } - if (damageSource_1.getAttacker() instanceof ServerPlayerEntity && PLAYER_DEALS_DAMAGE.isNeeded()) - { - PLAYER_DEALS_DAMAGE.onDamage(entity, float_2, damageSource_1); - } - } -} diff --git a/src/main/java/carpet/mixins/LivingEntity_scarpetEventsMixin.java b/src/main/java/carpet/mixins/LivingEntity_scarpetEventsMixin.java index 347beb75..c8e55f26 100644 --- a/src/main/java/carpet/mixins/LivingEntity_scarpetEventsMixin.java +++ b/src/main/java/carpet/mixins/LivingEntity_scarpetEventsMixin.java @@ -1,5 +1,6 @@ package carpet.mixins; +import carpet.CarpetSettings; import carpet.fakes.EntityInterface; import carpet.fakes.LivingEntityInterface; import carpet.script.EntityEventsGroup; @@ -7,12 +8,17 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.damage.DamageSource; +import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.world.World; 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.LocalCapture; + +import static carpet.script.CarpetEventServer.Event.PLAYER_DEALS_DAMAGE; +import static carpet.script.CarpetEventServer.Event.PLAYER_TAKES_DAMAGE; @Mixin(LivingEntity.class) public abstract class LivingEntity_scarpetEventsMixin extends Entity implements LivingEntityInterface @@ -33,6 +39,25 @@ public abstract class LivingEntity_scarpetEventsMixin extends Entity implements ((EntityInterface)this).getEventContainer().onEvent(EntityEventsGroup.EntityEventType.ON_DEATH, damageSource_1.name); } + @Inject(method = "applyDamage", locals = LocalCapture.CAPTURE_FAILHARD, at = @At( + value = "INVOKE", + target = "Lnet/minecraft/entity/LivingEntity;getHealth()F", + shift = At.Shift.BEFORE + )) + private void entityTakingDamage(DamageSource source, float amount, CallbackInfo ci) + { + ((EntityInterface)this).getEventContainer().onEvent(EntityEventsGroup.EntityEventType.ON_DAMAGE, amount, source); + // this is not applicable since its not a playr for sure + //if (entity instanceof ServerPlayerEntity && PLAYER_TAKES_DAMAGE.isNeeded()) + //{ + // PLAYER_TAKES_DAMAGE.onDamage(entity, float_2, damageSource_1); + //} + if (source.getAttacker() instanceof ServerPlayerEntity && PLAYER_DEALS_DAMAGE.isNeeded()) + { + PLAYER_DEALS_DAMAGE.onDamage(this, amount, source); + } + } + @Override public void doJumpCM() { diff --git a/src/main/java/carpet/mixins/PlayerEntity_scarpetEventsMixin.java b/src/main/java/carpet/mixins/PlayerEntity_scarpetEventsMixin.java new file mode 100644 index 00000000..10ed7c2d --- /dev/null +++ b/src/main/java/carpet/mixins/PlayerEntity_scarpetEventsMixin.java @@ -0,0 +1,46 @@ +package carpet.mixins; + +import carpet.CarpetSettings; +import carpet.fakes.EntityInterface; +import carpet.script.EntityEventsGroup; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.world.World; +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.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import static carpet.script.CarpetEventServer.Event.PLAYER_DEALS_DAMAGE; +import static carpet.script.CarpetEventServer.Event.PLAYER_TAKES_DAMAGE; + +@Mixin(PlayerEntity.class) +public abstract class PlayerEntity_scarpetEventsMixin extends LivingEntity +{ + protected PlayerEntity_scarpetEventsMixin(EntityType type, World world) + { + super(type, world); + } + + @Inject(method = "applyDamage", locals = LocalCapture.CAPTURE_FAILHARD, at = @At( + value = "INVOKE", + target = "Lnet/minecraft/entity/player/PlayerEntity;addExhaustion(F)V" + )) + private void playerTakingDamage(DamageSource source, float amount, CallbackInfo ci) + { + // version of LivingEntity_scarpetEventsMixin::entityTakingDamage + ((EntityInterface)this).getEventContainer().onEvent(EntityEventsGroup.EntityEventType.ON_DAMAGE, amount, source); + if (PLAYER_TAKES_DAMAGE.isNeeded()) + { + PLAYER_TAKES_DAMAGE.onDamage(this, amount, source); + } + if (source.getAttacker() instanceof ServerPlayerEntity && PLAYER_DEALS_DAMAGE.isNeeded()) + { + PLAYER_DEALS_DAMAGE.onDamage(this, amount, source); + } + } +} diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index 1c967f48..ad687806 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -157,7 +157,7 @@ "ArmorStandEntity_scarpetMarkerMixin", "Entity_scarpetEventsMixin", "LivingEntity_scarpetEventsMixin", - "DamageTracker_scarpetEventMixin", + "PlayerEntity_scarpetEventsMixin", "ServerPlayerEntity_scarpetEventMixin", "FallingBlockEntity_scarpetEventsMixin", "BlockItem_scarpetEventMixin",