From b989a89889d2e1021c6473162e3ff66bf94f8ce8 Mon Sep 17 00:00:00 2001 From: Vidal Date: Fri, 13 Mar 2026 20:48:25 -0300 Subject: [PATCH] AbilityDefend event --- src/api | 2 +- .../data/ability/type/AbilityDefend.java | 10 ++++- src/main/java/noppes/npcs/EventHooks.java | 5 +++ .../noppes/npcs/constants/EnumScriptType.java | 1 + .../controllers/ScriptHookController.java | 3 ++ .../npcs/scripted/event/AbilityEvent.java | 40 +++++++++++++++++++ 6 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/api b/src/api index f91e17ab3..e7f363727 160000 --- a/src/api +++ b/src/api @@ -1 +1 @@ -Subproject commit f91e17ab3ef4bf168836f8619c60cf6806f6ab84 +Subproject commit e7f363727e8fea0823d3377fec757dcbd1a467d8 diff --git a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityDefend.java b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityDefend.java index ac51ca92f..376c4ad4c 100644 --- a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityDefend.java +++ b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityDefend.java @@ -10,9 +10,11 @@ import kamkeel.npcs.controllers.data.telegraph.TelegraphType; import net.minecraft.entity.EntityLivingBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.DamageSource; +import noppes.npcs.EventHooks; import noppes.npcs.api.ability.type.IAbilityDefend; import noppes.npcs.client.gui.builder.FieldDef; import noppes.npcs.controllers.data.Animation; +import noppes.npcs.scripted.event.AbilityEvent; import java.util.List; @@ -147,8 +149,14 @@ public abstract class AbilityDefend extends Ability implements IAbilityDefend { } } + //inject defend event + AbilityEvent.DefendEvent event = new AbilityEvent.DefendEvent(caster, this, attacker, lastAttacker, amount); + if (EventHooks.onAbilityDefend(this, event)) { + return event.getDamage(); + } + // Always calculate the correct reduction for the caller's damage amount - return performDefend(attacker, amount); + return performDefend(attacker, event.getDamage()); } /** diff --git a/src/main/java/noppes/npcs/EventHooks.java b/src/main/java/noppes/npcs/EventHooks.java index e07facff0..3507a3c04 100644 --- a/src/main/java/noppes/npcs/EventHooks.java +++ b/src/main/java/noppes/npcs/EventHooks.java @@ -975,6 +975,11 @@ public class EventHooks { return postAbilityEvent(ability, event); } + public static boolean onAbilityDefend(Ability ability, AbilityEvent.DefendEvent event) { + if (ability == null || event == null) return false; + return postAbilityEvent(ability, event); + } + public static boolean onAbilityToggle(Ability ability, EntityLivingBase entity, int oldState, int newState) { if (ability == null || entity == null) return false; return postAbilityEvent(ability, new AbilityEvent.ToggleEvent(entity, ability, oldState, newState)); diff --git a/src/main/java/noppes/npcs/constants/EnumScriptType.java b/src/main/java/noppes/npcs/constants/EnumScriptType.java index f6d05d65b..0de53db10 100644 --- a/src/main/java/noppes/npcs/constants/EnumScriptType.java +++ b/src/main/java/noppes/npcs/constants/EnumScriptType.java @@ -125,6 +125,7 @@ public enum EnumScriptType { ABILITY_INTERRUPT("abilityInterrupt"), ABILITY_COMPLETE("abilityComplete"), ABILITY_HIT("abilityHit"), + ABILITY_DEFEND("abilityDefend"), ABILITY_TICK("abilityTick"), ABILITY_TOGGLE("abilityToggle"), ABILITY_TOGGLE_TICK("abilityToggleTick"), diff --git a/src/main/java/noppes/npcs/controllers/ScriptHookController.java b/src/main/java/noppes/npcs/controllers/ScriptHookController.java index 5547fb203..332d2f1e9 100644 --- a/src/main/java/noppes/npcs/controllers/ScriptHookController.java +++ b/src/main/java/noppes/npcs/controllers/ScriptHookController.java @@ -124,6 +124,7 @@ public class ScriptHookController implements IScriptHookHandler { hook(NPC, ABILITY_START, IAbilityEvent.StartEvent.class); hook(NPC, ABILITY_EXECUTE, IAbilityEvent.ExecuteEvent.class); hook(NPC, ABILITY_HIT, IAbilityEvent.HitEvent.class); + hook(NPC, ABILITY_DEFEND, IAbilityEvent.DefendEvent.class); hook(NPC, ABILITY_TICK, IAbilityEvent.TickEvent.class); hook(NPC, ABILITY_INTERRUPT, IAbilityEvent.InterruptEvent.class); hook(NPC, ABILITY_COMPLETE, IAbilityEvent.CompleteEvent.class); @@ -259,6 +260,7 @@ public class ScriptHookController implements IScriptHookHandler { hook(PLAYER, ABILITY_START, IAbilityEvent.StartEvent.class); hook(PLAYER, ABILITY_EXECUTE, IAbilityEvent.ExecuteEvent.class); hook(PLAYER, ABILITY_HIT, IAbilityEvent.HitEvent.class); + hook(PLAYER, ABILITY_DEFEND, IAbilityEvent.DefendEvent.class); hook(PLAYER, ABILITY_TICK, IAbilityEvent.TickEvent.class); hook(PLAYER, ABILITY_INTERRUPT, IAbilityEvent.InterruptEvent.class); hook(PLAYER, ABILITY_COMPLETE, IAbilityEvent.CompleteEvent.class); @@ -357,6 +359,7 @@ public class ScriptHookController implements IScriptHookHandler { hook(ABILITY, ABILITY_START, IAbilityEvent.StartEvent.class); hook(ABILITY, ABILITY_EXECUTE, IAbilityEvent.ExecuteEvent.class); hook(ABILITY, ABILITY_HIT, IAbilityEvent.HitEvent.class); + hook(ABILITY, ABILITY_DEFEND, IAbilityEvent.DefendEvent.class); hook(ABILITY, ABILITY_TICK, IAbilityEvent.TickEvent.class); hook(ABILITY, ABILITY_INTERRUPT, IAbilityEvent.InterruptEvent.class); hook(ABILITY, ABILITY_COMPLETE, IAbilityEvent.CompleteEvent.class); diff --git a/src/main/java/noppes/npcs/scripted/event/AbilityEvent.java b/src/main/java/noppes/npcs/scripted/event/AbilityEvent.java index a5d5c5bf4..f71cb8b2a 100644 --- a/src/main/java/noppes/npcs/scripted/event/AbilityEvent.java +++ b/src/main/java/noppes/npcs/scripted/event/AbilityEvent.java @@ -214,6 +214,46 @@ public class AbilityEvent extends CustomNPCsEvent implements IAbilityEvent { } } + @Cancelable + public static class DefendEvent extends AbilityEvent implements IAbilityEvent.DefendEvent { + private final IEntityLivingBase attacker; + private final IEntityLivingBase lastAttacker; + private float damage; + + public DefendEvent(EntityLivingBase entity, Ability ability, EntityLivingBase attacker, + EntityLivingBase lastAttacker, float damage) { + super(entity, ability, null); + this.attacker = attacker != null ? (IEntityLivingBase) NpcAPI.Instance().getIEntity(attacker) : null; + this.lastAttacker = lastAttacker != null ? (IEntityLivingBase) NpcAPI.Instance().getIEntity(lastAttacker) : null; + this.damage = damage; + } + + @Override + public IEntityLivingBase getAttacker() { + return attacker; + } + + @Override + public IEntityLivingBase getLastAttacker() { + return lastAttacker; + } + + @Override + public float getDamage() { + return damage; + } + + @Override + public void setDamage(float damage) { + this.damage = damage; + } + + @Override + public String getHookName() { + return EnumScriptType.ABILITY_DEFEND.function; + } + } + @Cancelable public static class ToggleEvent extends AbilityEvent implements IAbilityEvent.ToggleEvent { private final int oldState;