diff --git a/runelite-mixins/src/main/java/net/runelite/api/mixins/FieldHook.java b/runelite-mixins/src/main/java/net/runelite/api/mixins/FieldHook.java index af4a814895..84a0db08f0 100644 --- a/runelite-mixins/src/main/java/net/runelite/api/mixins/FieldHook.java +++ b/runelite-mixins/src/main/java/net/runelite/api/mixins/FieldHook.java @@ -36,4 +36,6 @@ import java.lang.annotation.Target; public @interface FieldHook { String value(); + + boolean before() default false; } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java index 4ca13aad7f..f19c0399fa 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -71,7 +71,6 @@ import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GrandExchangeOfferChanged; import net.runelite.api.events.MapRegionChanged; import net.runelite.api.events.MenuEntryAdded; -import net.runelite.api.events.NpcDespawned; import net.runelite.api.events.NpcSpawned; import net.runelite.api.events.PlayerDespawned; import net.runelite.api.events.PlayerMenuOptionsChanged; @@ -127,9 +126,6 @@ public abstract class RSClientMixin implements RSClient @Inject private static RSPlayer[] oldPlayers = new RSPlayer[2048]; - @Inject - private static RSNPC[] oldNpcs = new RSNPC[32768]; - @Inject private static int itemPressedDurationBuffer; @@ -805,17 +801,7 @@ public abstract class RSClientMixin implements RSClient if (npc != null) { npc.setIndex(idx); - } - RSNPC oldNpc = oldNpcs[idx]; - oldNpcs[idx] = npc; - - if (oldNpc != null) - { - eventBus.post(new NpcDespawned(oldNpc)); - } - if (npc != null) - { deferredEventBus.post(new NpcSpawned(npc)); } } 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 da6eeecef2..4503dcb816 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSNPCMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSNPCMixin.java @@ -24,11 +24,14 @@ */ package net.runelite.mixins; +import net.runelite.api.events.NpcDespawned; import net.runelite.api.mixins.Copy; +import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Shadow; +import static net.runelite.client.callback.Hooks.eventBus; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSModel; import net.runelite.rs.api.RSNPC; @@ -93,6 +96,16 @@ public abstract class RSNPCMixin implements RSNPC npcIndex = id; } + @FieldHook(value = "composition", before = true) + @Inject + public void onCompositionChanged(RSNPCComposition composition) + { + if (composition == null) + { + eventBus.post(new NpcDespawned(this)); + } + } + @Copy("getModel") public abstract RSModel rs$getModel();