From bdc9008c1de06a6812dab8ad1b8a791fce2b4b3e Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 18 Jul 2018 12:59:47 -0400 Subject: [PATCH] Add item despawn events when ground items is nulled When you walk into view of a chunk, all tiles get cleared followed by item spawns --- .../java/net/runelite/mixins/RSTileMixin.java | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java index a9056cbf1e..5083ca32cd 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.List; import net.runelite.api.Actor; import net.runelite.api.CollisionDataFlag; +import net.runelite.api.Constants; import net.runelite.api.DecorativeObject; import net.runelite.api.GameObject; import net.runelite.api.GroundObject; @@ -76,6 +77,9 @@ public abstract class RSTileMixin implements RSTile @Inject private static GameObject lastGameObject; + @Inject + private static RSDeque[][][] lastGroundItems = new RSDeque[Constants.MAX_Z][Constants.SCENE_SIZE][Constants.SCENE_SIZE]; + @Inject private WallObject previousWallObject; @@ -275,6 +279,31 @@ public abstract class RSTileMixin implements RSTile @Inject public void itemLayerChanged(int idx) { + int x = getX(); + int y = getY(); + int z = client.getPlane(); + RSDeque[][][] groundItemDeque = client.getGroundItemDeque(); + + RSDeque oldQueue = lastGroundItems[z][x][y]; + RSDeque newQueue = groundItemDeque[z][x][y]; + + if (oldQueue != newQueue) + { + if (oldQueue != null) + { + // despawn everything in old .. + RSNode head = oldQueue.getHead(); + for (RSNode cur = head.getNext(); cur != head; cur = cur.getNext()) + { + RSItem item = (RSItem) cur; + client.getLogger().debug("Item despawn (chunk reset): {} ({})", item.getId(), item.getQuantity()); + ItemDespawned itemDespawned = new ItemDespawned(this, item); + client.getCallbacks().post(itemDespawned); + } + } + lastGroundItems[z][x][y] = newQueue; + } + RSItem lastUnlink = client.getLastItemDespawn(); if (lastUnlink != null) { @@ -293,12 +322,7 @@ public abstract class RSTileMixin implements RSTile return; } - int x = itemLayer.getX() / Perspective.LOCAL_TILE_SIZE; - int y = itemLayer.getY() / Perspective.LOCAL_TILE_SIZE; - int z = client.getPlane(); - - RSDeque[][][] groundItemDeque = client.getGroundItemDeque(); - RSDeque itemDeque = groundItemDeque[z][x][y]; + RSDeque itemDeque = newQueue; if (itemDeque == null) {