From 484d664a3cb7b7e52246f6b7b25d3e93e2c21cb8 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 13 May 2018 15:45:16 -0400 Subject: [PATCH 1/2] injector: support field hooks prior to field being changed --- .../src/main/java/net/runelite/api/mixins/FieldHook.java | 2 ++ 1 file changed, 2 insertions(+) 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; } From e915070b4b3e5365dd052479bfc67a35937c32e0 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 13 May 2018 15:45:39 -0400 Subject: [PATCH 2/2] runelite-mixins: fire npc despawn event before composition is nulled --- .../java/net/runelite/mixins/RSClientMixin.java | 14 -------------- .../main/java/net/runelite/mixins/RSNPCMixin.java | 13 +++++++++++++ 2 files changed, 13 insertions(+), 14 deletions(-) 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 9ab7a5ebb4..9cd4f3968a 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; @@ -126,9 +125,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; @@ -807,17 +803,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();