diff --git a/src/main/java/noppes/npcs/EventHooks.java b/src/main/java/noppes/npcs/EventHooks.java index a563ac5fc..6d415abdd 100644 --- a/src/main/java/noppes/npcs/EventHooks.java +++ b/src/main/java/noppes/npcs/EventHooks.java @@ -204,6 +204,16 @@ public class EventHooks { return NpcAPI.EVENT_BUS.post(event); } + public static boolean onNPCTargetLost(EntityNPCInterface npc, EntityLivingBase prevtarget, EntityLivingBase newTarget) { + if(npc.script.isClient()) + return false; + NpcEvent.TargetLostEvent event = new NpcEvent.TargetLostEvent(npc.wrappedNPC, prevtarget, newTarget); + + ScriptController.Instance.globalNpcScripts.callScript(EnumScriptType.TARGET_LOST, event); + npc.script.callScript(EnumScriptType.TARGET_LOST, event); + return NpcAPI.EVENT_BUS.post(event); + } + public static void onNPCCollide(EntityNPCInterface npc, Entity entity){ if(npc == null || npc.wrappedNPC == null) return; diff --git a/src/main/java/noppes/npcs/client/gui/GuiScript.java b/src/main/java/noppes/npcs/client/gui/GuiScript.java index 03ad2744c..a5f6b786d 100644 --- a/src/main/java/noppes/npcs/client/gui/GuiScript.java +++ b/src/main/java/noppes/npcs/client/gui/GuiScript.java @@ -63,6 +63,9 @@ public class GuiScript extends GuiNPCInterface implements IGuiData, GuiYesNoCall list.add("script.kills"); list.add("script.dialog_closed"); list.add("script.timer"); + list.add("script.targetLost"); + list.add("script.projectileTick"); + list.add("script.projectileImpact"); if(showScript){ addLabel(new GuiNpcLabel(0, "script.hooks", guiLeft + 4, guiTop + 5)); diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiNPCEventScripts.java b/src/main/java/noppes/npcs/client/gui/script/GuiNPCEventScripts.java index 899c987fa..10945bdd6 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiNPCEventScripts.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiNPCEventScripts.java @@ -29,6 +29,9 @@ public class GuiNPCEventScripts extends GuiScriptInterface { hookList.add("kills"); hookList.add("dialogClose"); hookList.add("timer"); + hookList.add("targetLost"); + hookList.add("projectileTick"); + hookList.add("projectileImpact"); this.script = new DataScript(npc); this.handler = this.script; diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptAllNPCs.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptAllNPCs.java index 8b52a993e..8bb387593 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptAllNPCs.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptAllNPCs.java @@ -26,6 +26,9 @@ public class GuiScriptAllNPCs extends GuiScriptInterface { hookList.add("kills"); hookList.add("dialogClose"); hookList.add("timer"); + hookList.add("targetLost"); + hookList.add("projectileTick"); + hookList.add("projectileImpact"); this.handler = this.script; Client.sendData(EnumPacketServer.ScriptGlobalNPCGet); diff --git a/src/main/java/noppes/npcs/constants/EnumScriptType.java b/src/main/java/noppes/npcs/constants/EnumScriptType.java index a6f3aa704..58e1bb0bd 100644 --- a/src/main/java/noppes/npcs/constants/EnumScriptType.java +++ b/src/main/java/noppes/npcs/constants/EnumScriptType.java @@ -13,10 +13,12 @@ public enum EnumScriptType { KILLS("kills"), DIALOG_CLOSE("dialogClose"), TIMER("timer"), + TARGET_LOST("targetLost"), + PROJECTILE_TICK("projectileTick"), + PROJECTILE_IMPACT("projectileImpact"), ATTACKED("attacked"), ATTACK_MELEE("meleeAttack"), - TARGET_LOST("targetLost"), ROLE("role"), RANGED_CHARGE("rangedCharge"), RANGED_LAUNCHED("rangedLaunched"), @@ -41,8 +43,6 @@ public enum EnumScriptType { TOSSED("tossed"), PICKEDUP("pickedUp"), PICKUP("pickUp"), - PROJECTILE_TICK("projectileTick"), - PROJECTILE_IMPACT("projectileImpact"), LEVEL_UP("levelUp"), KEY_PRESSED("keyPressed"), QUEST_EVENT("questEvent"), diff --git a/src/main/java/noppes/npcs/controllers/data/DataScript.java b/src/main/java/noppes/npcs/controllers/data/DataScript.java index a49529c91..9fe3351e0 100644 --- a/src/main/java/noppes/npcs/controllers/data/DataScript.java +++ b/src/main/java/noppes/npcs/controllers/data/DataScript.java @@ -48,7 +48,7 @@ public class DataScript implements IScriptHandler { public boolean hasInited = false; public DataScript(EntityNPCInterface npc) { - for (int i = 0; i < 12; i++) { + for (int i = 0; i < 15; i++) { scripts.add(new ScriptContainer(this)); } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index 063fdc543..ce7a2f603 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -551,6 +551,9 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti entity = null; else entity = event.getTarget().getMCEntity(); + } else { + if(EventHooks.onNPCTargetLost(this, getAttackTarget(), entity)) + return; } if (entity != null && entity != this && ai.onAttack != 3 && !isAttacking()) { Line line = advanced.getAttackLine(); diff --git a/src/main/java/noppes/npcs/scripted/event/NpcEvent.java b/src/main/java/noppes/npcs/scripted/event/NpcEvent.java index 7035ce145..fe9ee47c7 100644 --- a/src/main/java/noppes/npcs/scripted/event/NpcEvent.java +++ b/src/main/java/noppes/npcs/scripted/event/NpcEvent.java @@ -420,11 +420,13 @@ public class NpcEvent extends CustomNPCsEvent implements INpcEvent { @Cancelable public static class TargetLostEvent extends NpcEvent implements INpcEvent.TargetLostEvent { - public final IEntityLivingBase entity; + public final IEntityLivingBase oldTarget; + public final IEntityLivingBase newTarget; - public TargetLostEvent(ICustomNpc npc, EntityLivingBase entity) { + public TargetLostEvent(ICustomNpc npc, EntityLivingBase oldTarget, EntityLivingBase newTarget) { super(npc); - this.entity = (IEntityLivingBase) NpcAPI.Instance().getIEntity(entity); + this.oldTarget = (IEntityLivingBase) NpcAPI.Instance().getIEntity(oldTarget); + this.newTarget = (IEntityLivingBase) NpcAPI.Instance().getIEntity(newTarget); } public String getHookName() { @@ -432,7 +434,11 @@ public class NpcEvent extends CustomNPCsEvent implements INpcEvent { } public IEntityLivingBase getTarget() { - return entity; + return oldTarget; + } + + public IEntityLivingBase getNewTarget() { + return newTarget; } } diff --git a/src/main/resources/assets/customnpcs/lang/en_US.lang b/src/main/resources/assets/customnpcs/lang/en_US.lang index 5f4eb0b92..63a920406 100644 --- a/src/main/resources/assets/customnpcs/lang/en_US.lang +++ b/src/main/resources/assets/customnpcs/lang/en_US.lang @@ -518,6 +518,9 @@ script.killed=Killed script.attack=Attack script.target=Target script.timer=Timer +script.targetLost=Target Lost +script.projectileTick=Proj. Tick +script.projectileImpact=Proj. Impact script.availableScripts=Available Scripts script.loadedScripts=Loaded Scripts script.collide=Collide