From 8a6fc94239f6aa819ac78a4c1ad9eda22b855554 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 31 May 2018 18:18:29 -0400 Subject: [PATCH] Flag npc as dead when their health ratio hits 0 Sometimes npcs despawn without their HP var visible after death --- .../src/main/java/net/runelite/api/NPC.java | 7 +++++++ .../java/net/runelite/mixins/RSActorMixin.java | 16 ++++++++++++---- .../java/net/runelite/mixins/RSNPCMixin.java | 17 +++++++++++++++++ .../main/java/net/runelite/rs/api/RSNPC.java | 2 ++ 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/NPC.java b/runelite-api/src/main/java/net/runelite/api/NPC.java index 35f722ef5c..19f3cb9881 100644 --- a/runelite-api/src/main/java/net/runelite/api/NPC.java +++ b/runelite-api/src/main/java/net/runelite/api/NPC.java @@ -65,4 +65,11 @@ public interface NPC extends Actor * @return the transformed NPC */ NPCComposition getTransformedComposition(); + + /** + * Returns true if this NPC has died + * + * @return + */ + boolean isDead(); } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java index e39330a40f..8686392541 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSActorMixin.java @@ -54,6 +54,7 @@ import net.runelite.rs.api.RSCombatInfo2; import net.runelite.rs.api.RSCombatInfoList; import net.runelite.rs.api.RSCombatInfoListHolder; import net.runelite.rs.api.RSModel; +import net.runelite.rs.api.RSNPC; import net.runelite.rs.api.RSNode; @Mixin(RSActor.class) @@ -235,12 +236,19 @@ public abstract class RSActorMixin implements RSActor @MethodHook("setCombatInfo") public void setCombatInfo(int combatInfoId, int gameCycle, int var3, int var4, int healthRatio, int health) { - if (healthRatio == 0 && this == client.getLocalPlayer()) + if (healthRatio == 0) { - log.debug("You died!"); + if (this == client.getLocalPlayer()) + { + log.debug("You died!"); - LocalPlayerDeath event = new LocalPlayerDeath(); - eventBus.post(event); + LocalPlayerDeath event = new LocalPlayerDeath(); + eventBus.post(event); + } + else if (this instanceof RSNPC) + { + ((RSNPC) this).setDead(true); + } } } } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSNPCMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSNPCMixin.java index 79334a5288..42e934a25e 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSNPCMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSNPCMixin.java @@ -47,6 +47,9 @@ public abstract class RSNPCMixin implements RSNPC @Inject private int npcIndex; + @Inject + private boolean dead; + @Inject @Override public int getId() @@ -149,4 +152,18 @@ public abstract class RSNPCMixin implements RSNPC } return composition; } + + @Inject + @Override + public boolean isDead() + { + return dead; + } + + @Inject + @Override + public void setDead(boolean dead) + { + this.dead = dead; + } } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSNPC.java b/runescape-api/src/main/java/net/runelite/rs/api/RSNPC.java index 6eb0661753..fc4bfcc714 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSNPC.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSNPC.java @@ -37,4 +37,6 @@ public interface RSNPC extends RSActor, NPC int getIndex(); void setIndex(int id); + + void setDead(boolean dead); }