From c95163dd9a611b12b3eca3a24350921e8dbd29ea Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 15 Apr 2018 12:19:44 -0400 Subject: [PATCH] Add item container changed event --- .../java/net/runelite/api/ItemContainer.java | 4 +-- .../api/events/ItemContainerChanged.java | 34 +++++++++++++++++++ .../runelite/mixins/RSItemContainerMixin.java | 24 +++++++++++++ 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 runelite-api/src/main/java/net/runelite/api/events/ItemContainerChanged.java diff --git a/runelite-api/src/main/java/net/runelite/api/ItemContainer.java b/runelite-api/src/main/java/net/runelite/api/ItemContainer.java index 7b11726384..281553786f 100644 --- a/runelite-api/src/main/java/net/runelite/api/ItemContainer.java +++ b/runelite-api/src/main/java/net/runelite/api/ItemContainer.java @@ -24,11 +24,11 @@ */ package net.runelite.api; -public interface ItemContainer +public interface ItemContainer extends Node { /** * Get the items from the container - * @return + * @return items */ Item[] getItems(); } diff --git a/runelite-api/src/main/java/net/runelite/api/events/ItemContainerChanged.java b/runelite-api/src/main/java/net/runelite/api/events/ItemContainerChanged.java new file mode 100644 index 0000000000..8792c89b20 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/events/ItemContainerChanged.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.api.events; + +import lombok.Value; +import net.runelite.api.ItemContainer; + +@Value +public class ItemContainerChanged +{ + private final ItemContainer itemContainer; +} 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 21658aec88..2de915565b 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSItemContainerMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSItemContainerMixin.java @@ -25,9 +25,12 @@ package net.runelite.mixins; import net.runelite.api.Item; +import net.runelite.api.events.ItemContainerChanged; +import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Shadow; +import static net.runelite.client.callback.Hooks.deferredEventBus; import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSItem; import net.runelite.rs.api.RSItemContainer; @@ -38,6 +41,9 @@ public abstract class RSItemContainerMixin implements RSItemContainer @Shadow("clientInstance") private static RSClient client; + @Inject + private int rl$lastCycle; + @Inject @Override public Item[] getItems() @@ -57,4 +63,22 @@ public abstract class RSItemContainerMixin implements RSItemContainer return items; } + @FieldHook("stackSizes") + @Inject + public void stackSizesChanged(int idx) + { + int cycle = client.getGameCycle(); + if (rl$lastCycle == cycle) + { + // Limit item container updates to one per cycle + return; + } + + rl$lastCycle = cycle; + + ItemContainerChanged event = new ItemContainerChanged(); + event.setItemContainer(this); + deferredEventBus.post(event); + } + }