api: add method to remove MessageNodes

Co-authored-by: trimbe <benno.tremback@gmail.com>
This commit is contained in:
Adam
2019-03-02 18:58:40 -05:00
parent c44d8a96b7
commit 24003c69a7
4 changed files with 86 additions and 0 deletions

View File

@@ -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);
}

View File

@@ -0,0 +1,72 @@
/*
* Copyright (c) 2018, trimbe <github.com/trimbe>
* Copyright (c) 2018, Adam <Adam@sigterm.info>
* 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();
}
}

View File

@@ -24,6 +24,10 @@
*/
package net.runelite.rs.api;
import net.runelite.mapping.Import;
public interface RSCacheableNode extends RSNode
{
@Import("unlinkDual")
void unlinkDual();
}

View File

@@ -39,4 +39,7 @@ public interface RSChatLineBuffer extends ChatLineBuffer
@Import("length")
@Override
int getLength();
@Import("length")
void setLength(int length);
}