diff --git a/runelite-api/src/main/java/net/runelite/api/ChatLineBuffer.java b/runelite-api/src/main/java/net/runelite/api/ChatLineBuffer.java index 22a15743f3..a1f8a7e056 100644 --- a/runelite-api/src/main/java/net/runelite/api/ChatLineBuffer.java +++ b/runelite-api/src/main/java/net/runelite/api/ChatLineBuffer.java @@ -44,4 +44,11 @@ public interface ChatLineBuffer * @return the length */ int getLength(); + + /** + * Removes a message node + * + * @param node the {@link MessageNode} to remove + */ + void removeMessageNode(MessageNode node); } \ No newline at end of file diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSChatLineBufferMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSChatLineBufferMixin.java new file mode 100644 index 0000000000..6b720a26f8 --- /dev/null +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSChatLineBufferMixin.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2018, trimbe + * 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.mixins; + +import net.runelite.api.MessageNode; +import net.runelite.api.mixins.Inject; +import net.runelite.api.mixins.Mixin; +import net.runelite.rs.api.RSCacheableNode; +import net.runelite.rs.api.RSChatLineBuffer; + +@Mixin(RSChatLineBuffer.class) +public abstract class RSChatLineBufferMixin implements RSChatLineBuffer +{ + @Inject + @Override + public void removeMessageNode(MessageNode node) + { + MessageNode[] lines = getLines(); + final int length = getLength(); + int found = -1; + + // Find the index of the node + for (int idx = 0; idx < length; idx++) + { + if (lines[idx] == node) + { + found = idx; + break; + } + } + + if (found == -1) + { + return; + } + + // Shift down all other messages + for (int i = found; i < length - 1; i++) + { + lines[i] = lines[i + 1]; + } + lines[length - 1] = null; + setLength(length - 1); + + RSCacheableNode rsCacheableNode = (RSCacheableNode) node; + rsCacheableNode.unlink(); + rsCacheableNode.unlinkDual(); + } +} diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSCacheableNode.java b/runescape-api/src/main/java/net/runelite/rs/api/RSCacheableNode.java index f443f11425..44d7b876cc 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSCacheableNode.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSCacheableNode.java @@ -24,6 +24,10 @@ */ package net.runelite.rs.api; +import net.runelite.mapping.Import; + public interface RSCacheableNode extends RSNode { + @Import("unlinkDual") + void unlinkDual(); } diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSChatLineBuffer.java b/runescape-api/src/main/java/net/runelite/rs/api/RSChatLineBuffer.java index fa2a798cdd..9aa9b35c3b 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSChatLineBuffer.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSChatLineBuffer.java @@ -39,4 +39,7 @@ public interface RSChatLineBuffer extends ChatLineBuffer @Import("length") @Override int getLength(); + + @Import("length") + void setLength(int length); } \ No newline at end of file