diff --git a/runelite-api/src/main/java/net/runelite/api/InventoryID.java b/runelite-api/src/main/java/net/runelite/api/InventoryID.java index df3f995df9..ec170bbc2e 100644 --- a/runelite-api/src/main/java/net/runelite/api/InventoryID.java +++ b/runelite-api/src/main/java/net/runelite/api/InventoryID.java @@ -82,4 +82,16 @@ public enum InventoryID { return id; } + + public static InventoryID getValue(int value) + { + for (InventoryID e: InventoryID.values()) + { + if (e.id == value) + { + return e; + } + } + return null; + } } \ No newline at end of file diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSItemContainerMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSItemContainerMixin.java index f3505f1b80..25ddd7e681 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSItemContainerMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSItemContainerMixin.java @@ -24,11 +24,13 @@ */ package net.runelite.mixins; +import net.runelite.api.InventoryID; import net.runelite.api.Item; import net.runelite.api.events.ItemContainerChanged; -import net.runelite.api.mixins.FieldHook; +import net.runelite.api.mixins.Copy; 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 net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSGroundItem; @@ -41,7 +43,7 @@ public abstract class RSItemContainerMixin implements RSItemContainer private static RSClient client; @Inject - private int rl$lastCycle; + static private int rl$lastCycle; @Inject @Override @@ -62,21 +64,27 @@ public abstract class RSItemContainerMixin implements RSItemContainer return items; } - @FieldHook("quantities") - @Inject - public void stackSizesChanged(int containerID) + @Copy("itemContainerSetItem") + static void rs$itemContainerSetItem(int itemContainerId, int index, int itemId, int itemQuantity) { + + } + + @Replace("itemContainerSetItem") + static void rl$itemContainerSetItem(int itemContainerId, int index, int itemId, int itemQuantity) + { + rs$itemContainerSetItem(itemContainerId, index, itemId, itemQuantity); + int cycle = client.getGameCycle(); if (rl$lastCycle == cycle) { // Limit item container updates to one per cycle + // No need to repeatedly update. The game just needs to know that containers changed once per cycle return; } rl$lastCycle = cycle; - - ItemContainerChanged event = new ItemContainerChanged(containerID, this); + ItemContainerChanged event = new ItemContainerChanged(itemContainerId, client.getItemContainer(InventoryID.getValue(itemContainerId))); client.getCallbacks().postDeferred(event); } - }