Merge pull request #1129 from runelite-extended/runelite-update

runeliteplus: Merge upstream
This commit is contained in:
Tyler Bochard
2019-07-25 16:43:07 -04:00
committed by GitHub
82 changed files with 1586 additions and 565 deletions
@@ -3673,7 +3673,7 @@
"descriptor" : "(ILdy;Ldy;I)V" "descriptor" : "(ILdy;Ldy;I)V"
} ] } ]
}, { }, {
"class" : "GroundItem", "class" : "TileItem",
"name" : "ck", "name" : "ck",
"super" : "ex", "super" : "ex",
"access" : 49, "access" : 49,
@@ -3992,7 +3992,7 @@
"descriptor" : "()V" "descriptor" : "()V"
} ] } ]
}, { }, {
"class" : "GroundItemPile", "class" : "TileItemPile",
"name" : "dr", "name" : "dr",
"super" : "java.lang.Object", "super" : "java.lang.Object",
"access" : 49, "access" : 49,
@@ -10949,7 +10949,7 @@
"descriptor" : "I", "descriptor" : "I",
"decoder" : 1192947815 "decoder" : 1192947815
}, { }, {
"field" : "groundItemPile", "field" : "tileItemPile",
"owner" : "dj", "owner" : "dj",
"name" : "x", "name" : "x",
"access" : 0, "access" : 0,
@@ -31,6 +31,7 @@ import java.util.EnumSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint; import net.runelite.api.coords.WorldPoint;
@@ -350,6 +351,7 @@ public interface Client extends GameShell
* @return the corresponding item composition * @return the corresponding item composition
* @see ItemID * @see ItemID
*/ */
@Nonnull
ItemDefinition getItemDefinition(int id); ItemDefinition getItemDefinition(int id);
/** /**
@@ -1725,4 +1727,9 @@ public interface Client extends GameShell
BigInteger getModulus(); BigInteger getModulus();
void setModulus(BigInteger modulus); void setModulus(BigInteger modulus);
/*
* Returns the max item index + 1 from cache
*/
int getItemCount();
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2016-2017, Adam <Adam@sigterm.info> * Copyright (c) 2019, Adam <Adam@sigterm.info>
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@@ -24,23 +24,11 @@
*/ */
package net.runelite.api; package net.runelite.api;
/** public interface Item
* Represents an item inside an {@link ItemContainer}.
*/
public interface Item extends Renderable
{ {
/** int id = -1;
* Gets the items ID. int quantity = -1;
*
* @return the ID of the item
* @see ItemID
*/
int getId();
/** int getId();
* Gets the items quantity.
*
* @return the items quantity
*/
int getQuantity(); int getQuantity();
} }
@@ -130,7 +130,7 @@ public interface Tile
* *
* @return the ground items * @return the ground items
*/ */
List<Item> getGroundItems(); List<TileItem> getGroundItems();
/** /**
* Return the tile under this one, if this tile is a bridge * Return the tile under this one, if this tile is a bridge
@@ -0,0 +1,46 @@
/*
* Copyright (c) 2016-2017, 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.api;
/**
* Represents an item inside an {@link ItemLayer}.
*/
public interface TileItem extends Renderable
{
/**
* Gets the items ID.
*
* @return the ID of the item
* @see ItemID
*/
int getId();
/**
* Gets the items quantity.
*
* @return the items quantity
*/
int getQuantity();
}
@@ -24,7 +24,8 @@
*/ */
package net.runelite.api.events; package net.runelite.api.events;
import net.runelite.api.Item; import lombok.Value;
import net.runelite.api.TileItem;
import net.runelite.api.Tile; import net.runelite.api.Tile;
import lombok.Value; import lombok.Value;
@@ -36,5 +37,5 @@ import lombok.Value;
public class ItemDespawned public class ItemDespawned
{ {
private final Tile tile; private final Tile tile;
private final Item item; private final TileItem item;
} }
@@ -24,7 +24,8 @@
*/ */
package net.runelite.api.events; package net.runelite.api.events;
import net.runelite.api.Item; import lombok.Value;
import net.runelite.api.TileItem;
import net.runelite.api.Tile; import net.runelite.api.Tile;
import lombok.Value; import lombok.Value;
@@ -34,7 +35,7 @@ import lombok.Value;
@Value @Value
public class ItemQuantityChanged public class ItemQuantityChanged
{ {
private final Item item; private final TileItem item;
private final Tile tile; private final Tile tile;
private final int oldQuantity; private final int oldQuantity;
private final int newQuantity; private final int newQuantity;
@@ -24,7 +24,8 @@
*/ */
package net.runelite.api.events; package net.runelite.api.events;
import net.runelite.api.Item; import lombok.Value;
import net.runelite.api.TileItem;
import net.runelite.api.Tile; import net.runelite.api.Tile;
import lombok.Value; import lombok.Value;
@@ -36,5 +37,5 @@ import lombok.Value;
public class ItemSpawned public class ItemSpawned
{ {
private final Tile tile; private final Tile tile;
private final Item item; private final TileItem item;
} }
@@ -43,6 +43,7 @@ import java.util.Map;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
@@ -410,6 +411,7 @@ public class ItemManager
* @param itemId item id * @param itemId item id
* @return item composition * @return item composition
*/ */
@Nonnull
public ItemDefinition getItemDefinition(int itemId) public ItemDefinition getItemDefinition(int itemId)
{ {
assert client.isClientThread() : "getItemDefinition must be called on client thread"; assert client.isClientThread() : "getItemDefinition must be called on client thread";
@@ -38,7 +38,7 @@ import javax.inject.Singleton;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.AnimationID; import net.runelite.api.AnimationID;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.Item; import net.runelite.api.TileItem;
import net.runelite.api.ItemID; import net.runelite.api.ItemID;
import net.runelite.api.NPC; import net.runelite.api.NPC;
import net.runelite.api.NpcID; import net.runelite.api.NpcID;
@@ -163,7 +163,7 @@ public class LootManager
private void onItemSpawned(ItemSpawned itemSpawned) private void onItemSpawned(ItemSpawned itemSpawned)
{ {
final Item item = itemSpawned.getItem(); final TileItem item = itemSpawned.getItem();
final Tile tile = itemSpawned.getTile(); final Tile tile = itemSpawned.getTile();
final LocalPoint location = tile.getLocalLocation(); final LocalPoint location = tile.getLocalLocation();
final int packed = location.getSceneX() << 8 | location.getSceneY(); final int packed = location.getSceneX() << 8 | location.getSceneY();
@@ -173,14 +173,14 @@ public class LootManager
private void onItemDespawned(ItemDespawned itemDespawned) private void onItemDespawned(ItemDespawned itemDespawned)
{ {
final Item item = itemDespawned.getItem(); final TileItem item = itemDespawned.getItem();
final LocalPoint location = itemDespawned.getTile().getLocalLocation(); final LocalPoint location = itemDespawned.getTile().getLocalLocation();
log.debug("Item despawn {} ({}) location {},{}", item.getId(), item.getQuantity(), location); log.debug("Item despawn {} ({}) location {},{}", item.getId(), item.getQuantity(), location);
} }
private void onItemQuantityChanged(ItemQuantityChanged itemQuantityChanged) private void onItemQuantityChanged(ItemQuantityChanged itemQuantityChanged)
{ {
final Item item = itemQuantityChanged.getItem(); final TileItem item = itemQuantityChanged.getItem();
final Tile tile = itemQuantityChanged.getTile(); final Tile tile = itemQuantityChanged.getTile();
final LocalPoint location = tile.getLocalLocation(); final LocalPoint location = tile.getLocalLocation();
final int packed = location.getSceneX() << 8 | location.getSceneY(); final int packed = location.getSceneX() << 8 | location.getSceneY();
@@ -0,0 +1,314 @@
/*
* Copyright (c) 2019, Ron Young <https://github.com/raiyni>
* 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.client.game.chatbox;
import com.google.common.primitives.Ints;
import com.google.inject.Inject;
import java.awt.event.KeyEvent;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.Consumer;
import javax.inject.Singleton;
import lombok.Getter;
import net.runelite.api.Client;
import net.runelite.api.ItemDefinition;
import net.runelite.api.widgets.ItemQuantityMode;
import net.runelite.api.widgets.JavaScriptCallback;
import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetPositionMode;
import net.runelite.api.widgets.WidgetSizeMode;
import net.runelite.api.widgets.WidgetTextAlignment;
import net.runelite.api.widgets.WidgetType;
import net.runelite.client.callback.ClientThread;
import net.runelite.client.game.ItemManager;
@Singleton
public class ChatboxItemSearch extends ChatboxTextInput
{
private static final int ICON_HEIGHT = 32;
private static final int ICON_WIDTH = 36;
private static final int PADDING = 6;
private static final int MAX_RESULTS = 24;
private static final int FONT_SIZE = 16;
private static final int HOVERED_OPACITY = 128;
private final ChatboxPanelManager chatboxPanelManager;
private final ItemManager itemManager;
private final Client client;
private Map<Integer, ItemDefinition> results = new LinkedHashMap<>();
private String tooltipText;
private int index = -1;
@Getter
private Consumer<Integer> onItemSelected;
@Inject
private ChatboxItemSearch(ChatboxPanelManager chatboxPanelManager, ClientThread clientThread,
ItemManager itemManager, Client client)
{
super(chatboxPanelManager, clientThread);
this.chatboxPanelManager = chatboxPanelManager;
this.itemManager = itemManager;
this.client = client;
lines(1);
prompt("Item Search");
onChanged(searchString ->
clientThread.invokeLater(() ->
{
filterResults();
update();
}));
}
@Override
protected void update()
{
Widget container = chatboxPanelManager.getContainerWidget();
container.deleteAllChildren();
Widget promptWidget = container.createChild(-1, WidgetType.TEXT);
promptWidget.setText(getPrompt());
promptWidget.setTextColor(0x800000);
promptWidget.setFontId(getFontID());
promptWidget.setOriginalX(0);
promptWidget.setOriginalY(5);
promptWidget.setXPositionMode(WidgetPositionMode.ABSOLUTE_CENTER);
promptWidget.setYPositionMode(WidgetPositionMode.ABSOLUTE_TOP);
promptWidget.setOriginalHeight(FONT_SIZE);
promptWidget.setXTextAlignment(WidgetTextAlignment.CENTER);
promptWidget.setYTextAlignment(WidgetTextAlignment.CENTER);
promptWidget.setWidthMode(WidgetSizeMode.MINUS);
promptWidget.revalidate();
buildEdit(0, 5 + FONT_SIZE, container.getWidth(), FONT_SIZE);
Widget separator = container.createChild(-1, WidgetType.LINE);
separator.setOriginalX(0);
separator.setOriginalY(8 + (FONT_SIZE * 2));
separator.setXPositionMode(WidgetPositionMode.ABSOLUTE_CENTER);
separator.setYPositionMode(WidgetPositionMode.ABSOLUTE_TOP);
separator.setOriginalHeight(0);
separator.setOriginalWidth(16);
separator.setWidthMode(WidgetSizeMode.MINUS);
separator.setTextColor(0x666666);
separator.revalidate();
int x = PADDING;
int y = PADDING * 3;
int idx = 0;
for (ItemDefinition itemDefinition : results.values())
{
Widget item = container.createChild(-1, WidgetType.GRAPHIC);
item.setXPositionMode(WidgetPositionMode.ABSOLUTE_LEFT);
item.setYPositionMode(WidgetPositionMode.ABSOLUTE_TOP);
item.setOriginalX(x);
item.setOriginalY(y + FONT_SIZE * 2);
item.setOriginalHeight(ICON_HEIGHT);
item.setOriginalWidth(ICON_WIDTH);
item.setName("<col=ff9040>" + itemDefinition.getName());
item.setItemId(itemDefinition.getId());
item.setItemQuantity(10000);
item.setItemQuantityMode(ItemQuantityMode.NEVER);
item.setBorderType(1);
item.setAction(0, tooltipText);
item.setHasListener(true);
if (index == idx)
{
item.setOpacity(HOVERED_OPACITY);
}
else
{
item.setOnMouseOverListener((JavaScriptCallback) ev -> item.setOpacity(HOVERED_OPACITY));
item.setOnMouseLeaveListener((JavaScriptCallback) ev -> item.setOpacity(0));
}
item.setOnOpListener((JavaScriptCallback) ev ->
{
if (onItemSelected != null)
{
onItemSelected.accept(itemDefinition.getId());
}
chatboxPanelManager.close();
});
x += ICON_WIDTH + PADDING;
if (x + ICON_WIDTH >= container.getWidth())
{
y += ICON_HEIGHT + PADDING;
x = PADDING;
}
item.revalidate();
++idx;
}
}
@Override
public void keyPressed(KeyEvent ev)
{
switch (ev.getKeyCode())
{
case KeyEvent.VK_ENTER:
ev.consume();
if (index > -1)
{
if (onItemSelected != null)
{
onItemSelected.accept(results.keySet().toArray(new Integer[results.size()])[index]);
}
chatboxPanelManager.close();
}
break;
case KeyEvent.VK_TAB:
case KeyEvent.VK_RIGHT:
ev.consume();
if (!results.isEmpty())
{
index++;
if (index >= results.size())
{
index = 0;
}
clientThread.invokeLater(this::update);
}
break;
case KeyEvent.VK_LEFT:
ev.consume();
if (!results.isEmpty())
{
index--;
if (index < 0)
{
index = results.size() - 1;
}
clientThread.invokeLater(this::update);
}
break;
case KeyEvent.VK_UP:
ev.consume();
if (results.size() >= (MAX_RESULTS / 2))
{
index -= MAX_RESULTS / 2;
if (index < 0)
{
if (results.size() == MAX_RESULTS)
{
index += results.size();
}
else
{
index += MAX_RESULTS;
}
index = Ints.constrainToRange(index, 0, results.size() - 1);
}
clientThread.invokeLater(this::update);
}
break;
case KeyEvent.VK_DOWN:
ev.consume();
if (results.size() >= (MAX_RESULTS / 2))
{
index += MAX_RESULTS / 2;
if (index >= MAX_RESULTS)
{
if (results.size() == MAX_RESULTS)
{
index -= results.size();
}
else
{
index -= MAX_RESULTS;
}
index = Ints.constrainToRange(index, 0, results.size() - 1);
}
clientThread.invokeLater(this::update);
}
break;
default:
super.keyPressed(ev);
}
}
@Override
protected void close()
{
// Clear search string when closed
value("");
results.clear();
index = -1;
super.close();
}
@Override
@Deprecated
public ChatboxTextInput onDone(Consumer<String> onDone)
{
throw new UnsupportedOperationException();
}
private void filterResults()
{
results.clear();
index = -1;
String search = getValue().toLowerCase();
if (search.isEmpty())
{
return;
}
for (int i = 0; i < client.getItemCount() && results.size() < MAX_RESULTS; i++)
{
ItemDefinition itemComposition = itemManager.getItemDefinition(itemManager.canonicalize(i));
String name = itemComposition.getName();
// The client assigns "null" to item names of items it doesn't know about
if (!name.equals("null") && name.toLowerCase().contains(search))
{
// This may already be in the map due to canonicalize mapping the item to something we've already seen
results.putIfAbsent(itemComposition.getId(), itemComposition);
}
}
}
public ChatboxItemSearch onItemSelected(Consumer<Integer> onItemSelected)
{
this.onItemSelected = onItemSelected;
return this;
}
public ChatboxItemSearch tooltipText(final String text)
{
tooltipText = text;
return this;
}
}
@@ -67,7 +67,7 @@ public class ChatboxTextInput extends ChatboxInput implements KeyListener, Mouse
private static final Pattern BREAK_MATCHER = Pattern.compile("[^a-zA-Z0-9']"); private static final Pattern BREAK_MATCHER = Pattern.compile("[^a-zA-Z0-9']");
private final ChatboxPanelManager chatboxPanelManager; private final ChatboxPanelManager chatboxPanelManager;
private final ClientThread clientThread; protected final ClientThread clientThread;
private static IntPredicate getDefaultCharValidator() private static IntPredicate getDefaultCharValidator()
{ {
@@ -37,7 +37,6 @@ import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.Item;
import net.runelite.api.ItemID; import net.runelite.api.ItemID;
import static net.runelite.api.ItemID.AGILITY_ARENA_TICKET; import static net.runelite.api.ItemID.AGILITY_ARENA_TICKET;
import net.runelite.api.MenuAction; import net.runelite.api.MenuAction;
@@ -46,6 +45,7 @@ import net.runelite.api.Player;
import net.runelite.api.Skill; import net.runelite.api.Skill;
import static net.runelite.api.Skill.AGILITY; import static net.runelite.api.Skill.AGILITY;
import net.runelite.api.Tile; import net.runelite.api.Tile;
import net.runelite.api.TileItem;
import net.runelite.api.TileObject; import net.runelite.api.TileObject;
import net.runelite.api.coords.WorldPoint; import net.runelite.api.coords.WorldPoint;
import net.runelite.api.events.BoostedLevelChanged; import net.runelite.api.events.BoostedLevelChanged;
@@ -321,7 +321,7 @@ public class AgilityPlugin extends Plugin
return; return;
} }
final Item item = itemSpawned.getItem(); final TileItem item = itemSpawned.getItem();
final Tile tile = itemSpawned.getTile(); final Tile tile = itemSpawned.getTile();
if (item.getId() == ItemID.MARK_OF_GRACE) if (item.getId() == ItemID.MARK_OF_GRACE)
@@ -85,7 +85,7 @@ public class BankSearch
// selecting/changing tab // selecting/changing tab
if (closeInput) if (closeInput)
{ {
client.runScript(ScriptID.RESET_CHATBOX_INPUT); client.runScript(ScriptID.RESET_CHATBOX_INPUT, 0, 0);
} }
client.setVar(VarClientInt.INPUT_TYPE, inputType.getType()); client.setVar(VarClientInt.INPUT_TYPE, inputType.getType());
@@ -78,6 +78,7 @@ import net.runelite.api.widgets.WidgetType;
import net.runelite.client.Notifier; import net.runelite.client.Notifier;
import net.runelite.client.callback.ClientThread; import net.runelite.client.callback.ClientThread;
import net.runelite.client.game.ItemManager; import net.runelite.client.game.ItemManager;
import net.runelite.client.game.chatbox.ChatboxItemSearch;
import net.runelite.client.game.chatbox.ChatboxPanelManager; import net.runelite.client.game.chatbox.ChatboxPanelManager;
import net.runelite.client.plugins.banktags.BankTagsConfig; import net.runelite.client.plugins.banktags.BankTagsConfig;
import net.runelite.client.plugins.banktags.BankTagsPlugin; import net.runelite.client.plugins.banktags.BankTagsPlugin;
@@ -113,6 +114,7 @@ public class TabInterface
private static final int SCROLL_TICK = 500; private static final int SCROLL_TICK = 500;
private static final int INCINERATOR_WIDTH = 48; private static final int INCINERATOR_WIDTH = 48;
private static final int INCINERATOR_HEIGHT = 39; private static final int INCINERATOR_HEIGHT = 39;
private static TagTab iconToSet;
private final Client client; private final Client client;
private final ClientThread clientThread; private final ClientThread clientThread;
@@ -126,10 +128,10 @@ public class TabInterface
private final Rectangle bounds = new Rectangle(); private final Rectangle bounds = new Rectangle();
private final Rectangle canvasBounds = new Rectangle(); private final Rectangle canvasBounds = new Rectangle();
private ChatboxItemSearch searchProvider;
private TagTab activeTab; private TagTab activeTab;
private int maxTabs; private int maxTabs;
private int currentTabIndex; private int currentTabIndex;
private TagTab iconToSet = null;
private Instant startScroll = Instant.now(); private Instant startScroll = Instant.now();
private String rememberedSearch; private String rememberedSearch;
private boolean waitSearchTick; private boolean waitSearchTick;
@@ -156,7 +158,8 @@ public class TabInterface
final ChatboxPanelManager chatboxPanelManager, final ChatboxPanelManager chatboxPanelManager,
final BankTagsConfig config, final BankTagsConfig config,
final Notifier notifier, final Notifier notifier,
final BankSearch bankSearch) final BankSearch bankSearch,
final ChatboxItemSearch searchProvider)
{ {
this.client = client; this.client = client;
this.clientThread = clientThread; this.clientThread = clientThread;
@@ -167,6 +170,7 @@ public class TabInterface
this.config = config; this.config = config;
this.notifier = notifier; this.notifier = notifier;
this.bankSearch = bankSearch; this.bankSearch = bankSearch;
this.searchProvider = searchProvider;
} }
public boolean isActive() public boolean isActive()
@@ -333,7 +337,7 @@ public class TabInterface
{ {
bankSearch.reset(true); bankSearch.reset(true);
clientThread.invokeLater(() -> client.runScript(ScriptID.RESET_CHATBOX_INPUT)); clientThread.invokeLater(() -> client.runScript(ScriptID.RESET_CHATBOX_INPUT, 0, 0));
} }
else else
{ {
@@ -343,7 +347,20 @@ public class TabInterface
client.playSoundEffect(SoundEffectID.UI_BOOP); client.playSoundEffect(SoundEffectID.UI_BOOP);
break; break;
case Tab.CHANGE_ICON: case Tab.CHANGE_ICON:
iconToSet = tabManager.find(Text.removeTags(event.getOpbase())); final String tag = Text.removeTags(event.getOpbase());
searchProvider
.tooltipText(CHANGE_ICON + " (" + tag + ")")
.onItemSelected((itemId) ->
{
TagTab iconToSet = tabManager.find(tag);
if (iconToSet != null)
{
iconToSet.setIconItemId(itemId);
iconToSet.getIcon().setItemId(itemId);
tabManager.setIcon(iconToSet.getTag(), itemId + "");
}
})
.build();
break; break;
case Tab.DELETE_TAB: case Tab.DELETE_TAB:
String target = Text.standardize(event.getOpbase()); String target = Text.standardize(event.getOpbase());
@@ -526,12 +543,6 @@ public class TabInterface
entries = createMenuEntry(event, REMOVE_TAG + " (" + activeTab.getTag() + ")", event.getTarget(), entries); entries = createMenuEntry(event, REMOVE_TAG + " (" + activeTab.getTag() + ")", event.getTarget(), entries);
client.setMenuEntries(entries); client.setMenuEntries(entries);
} }
else if (iconToSet != null && (entry.getOption().startsWith("Withdraw-") || entry.getOption().equals("Release")))
{
// TODO: Do not replace every withdraw option with change icon option
entry.setOption(CHANGE_ICON + " (" + iconToSet.getTag() + ")");
client.setMenuEntries(entries);
}
else if (event.getActionParam1() == WidgetInfo.BANK_DEPOSIT_INVENTORY.getId() else if (event.getActionParam1() == WidgetInfo.BANK_DEPOSIT_INVENTORY.getId()
&& event.getOption().equals("Deposit inventory")) && event.getOption().equals("Deposit inventory"))
{ {
@@ -27,12 +27,15 @@ package net.runelite.client.plugins.chatboxperformance;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.events.WidgetPositioned; import net.runelite.api.GameState;
import net.runelite.api.ScriptID;
import net.runelite.api.events.ScriptCallbackEvent;
import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetInfo;
import net.runelite.api.widgets.WidgetPositionMode; import net.runelite.api.widgets.WidgetPositionMode;
import net.runelite.api.widgets.WidgetSizeMode; import net.runelite.api.widgets.WidgetSizeMode;
import net.runelite.api.widgets.WidgetType; import net.runelite.api.widgets.WidgetType;
import net.runelite.client.callback.ClientThread;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBus;
import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
@@ -47,50 +50,39 @@ public class ChatboxPerformancePlugin extends Plugin
@Inject @Inject
private Client client; private Client client;
@Inject
private ClientThread clientThread;
@Inject @Inject
private EventBus eventBus; private EventBus eventBus;
@Override @Override
protected void startUp() throws Exception public void startUp()
{ {
eventBus.subscribe(WidgetPositioned.class, this, this::onWidgetPositioned); eventBus.subscribe(ScriptCallbackEvent.class, this, this::onScriptCallbackEvent);
if (client.getGameState() == GameState.LOGGED_IN)
{
clientThread.invokeLater(() -> client.runScript(ScriptID.RESET_CHATBOX_INPUT));
}
} }
@Override @Override
protected void shutDown() throws Exception public void shutDown()
{ {
if (client.getGameState() == GameState.LOGGED_IN)
{
clientThread.invokeLater(() -> client.runScript(ScriptID.RESET_CHATBOX_INPUT));
}
eventBus.unregister(this); eventBus.unregister(this);
} }
private void onWidgetPositioned(WidgetPositioned event) private void onScriptCallbackEvent(ScriptCallbackEvent ev)
{ {
if (!areWidgetsFixed()) if (!"chatboxBackgroundBuilt".equals(ev.getEventName()))
{ {
fixChatbox(); return;
}
} }
private boolean areWidgetsFixed()
{
Widget widget = client.getWidget(WidgetInfo.CHATBOX_TRANSPARENT_BACKGROUND);
if (widget == null)
{
return true;
}
Widget[] widgets = widget.getChildren();
if (widgets != null && widgets.length > 0)
{
Widget last = widgets[widgets.length - 1];
return last != null && last.getOpacity() < 254;
}
return false;
}
private void fixChatbox()
{
fixDarkBackground(); fixDarkBackground();
fixWhiteLines(true); fixWhiteLines(true);
fixWhiteLines(false); fixWhiteLines(false);
@@ -34,6 +34,6 @@ class JagexPrintableCharMatcher extends CharMatcher
// Characters which are printable // Characters which are printable
return (c >= 32 && c <= 126) return (c >= 32 && c <= 126)
|| c == 128 || c == 128
|| (c >= 161 && c <= 255); || (c >= 160 && c <= 255);
} }
} }
@@ -203,7 +203,7 @@ public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueSc
.leftColor(TITLED_CONTENT_COLOR) .leftColor(TITLED_CONTENT_COLOR)
.build()); .build());
panelComponent.getChildren().add(LineComponent.builder().left("Area:").build()); panelComponent.getChildren().add(LineComponent.builder().left("Location:").build());
panelComponent.getChildren().add(LineComponent.builder() panelComponent.getChildren().add(LineComponent.builder()
.left(getArea()) .left(getArea())
.leftColor(TITLED_CONTENT_COLOR) .leftColor(TITLED_CONTENT_COLOR)
@@ -85,7 +85,7 @@ public class CipherClue extends ClueScroll implements TextClueScroll, NpcClueScr
.leftColor(TITLED_CONTENT_COLOR) .leftColor(TITLED_CONTENT_COLOR)
.build()); .build());
panelComponent.getChildren().add(LineComponent.builder().left("Area:").build()); panelComponent.getChildren().add(LineComponent.builder().left("Location:").build());
panelComponent.getChildren().add(LineComponent.builder() panelComponent.getChildren().add(LineComponent.builder()
.left(getArea()) .left(getArea())
.leftColor(TITLED_CONTENT_COLOR) .leftColor(TITLED_CONTENT_COLOR)
@@ -160,7 +160,7 @@ public class HotColdClue extends ClueScroll implements LocationClueScroll, Locat
else else
{ {
panelComponent.getChildren().add(LineComponent.builder() panelComponent.getChildren().add(LineComponent.builder()
.left("Possible areas:") .left("Possible locations:")
.build()); .build());
final Map<HotColdArea, Integer> locationCounts = new EnumMap<>(HotColdArea.class); final Map<HotColdArea, Integer> locationCounts = new EnumMap<>(HotColdArea.class);
@@ -61,7 +61,7 @@ public class MusicClue extends ClueScroll implements NpcClueScroll
.leftColor(TITLED_CONTENT_COLOR) .leftColor(TITLED_CONTENT_COLOR)
.build()); .build());
panelComponent.getChildren().add(LineComponent.builder().left("Area:").build()); panelComponent.getChildren().add(LineComponent.builder().left("Location:").build());
panelComponent.getChildren().add(LineComponent.builder() panelComponent.getChildren().add(LineComponent.builder()
.left("Falador Park") .left("Falador Park")
.leftColor(TITLED_CONTENT_COLOR) .leftColor(TITLED_CONTENT_COLOR)
@@ -44,8 +44,8 @@ import net.runelite.api.DecorativeObject;
import net.runelite.api.DynamicObject; import net.runelite.api.DynamicObject;
import net.runelite.api.GameObject; import net.runelite.api.GameObject;
import net.runelite.api.GraphicsObject; import net.runelite.api.GraphicsObject;
import net.runelite.api.TileItem;
import net.runelite.api.GroundObject; import net.runelite.api.GroundObject;
import net.runelite.api.Item;
import net.runelite.api.ItemLayer; import net.runelite.api.ItemLayer;
import net.runelite.api.NPC; import net.runelite.api.NPC;
import net.runelite.api.NPCDefinition; import net.runelite.api.NPCDefinition;
@@ -285,9 +285,9 @@ class DevToolsOverlay extends Overlay
if (player.getLocalLocation().distanceTo(itemLayer.getLocalLocation()) <= MAX_DISTANCE) if (player.getLocalLocation().distanceTo(itemLayer.getLocalLocation()) <= MAX_DISTANCE)
{ {
Node current = itemLayer.getBottom(); Node current = itemLayer.getBottom();
while (current instanceof Item) while (current instanceof TileItem)
{ {
Item item = (Item) current; TileItem item = (TileItem) current;
OverlayUtil.renderTileOverlay(graphics, itemLayer, "ID: " + item.getId() + " Qty:" + item.getQuantity(), RED); OverlayUtil.renderTileOverlay(graphics, itemLayer, "ID: " + item.getId() + " Qty:" + item.getQuantity(), RED);
current = current.getNext(); current = current.getNext();
} }
@@ -57,6 +57,7 @@ import net.runelite.client.util.ImageUtil;
public class EmojiPlugin extends Plugin public class EmojiPlugin extends Plugin
{ {
private static final Pattern TAG_REGEXP = Pattern.compile("<[^>]*>"); private static final Pattern TAG_REGEXP = Pattern.compile("<[^>]*>");
private static final Pattern WHITESPACE_REGEXP = Pattern.compile("[\\s\\u00A0]");
@Inject @Inject
private Client client; private Client client;
@@ -182,9 +183,9 @@ public class EmojiPlugin extends Plugin
} }
@Nullable @Nullable
private String updateMessage(final String message) String updateMessage(final String message)
{ {
final String[] messageWords = message.split(" "); final String[] messageWords = WHITESPACE_REGEXP.split(message);
boolean editedMessage = false; boolean editedMessage = false;
for (int i = 0; i < messageWords.length; i++) for (int i = 0; i < messageWords.length; i++)
@@ -281,6 +281,7 @@ public interface GroundItemsConfig extends Config
{ {
return false; return false;
} }
@ConfigItem( @ConfigItem(
keyName = "itemHighlightMode", keyName = "itemHighlightMode",
name = "Item Highlight Mode", name = "Item Highlight Mode",
@@ -52,7 +52,6 @@ import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.GameState; import net.runelite.api.GameState;
import net.runelite.api.Item;
import net.runelite.api.ItemDefinition; import net.runelite.api.ItemDefinition;
import net.runelite.api.ItemID; import net.runelite.api.ItemID;
import net.runelite.api.ItemLayer; import net.runelite.api.ItemLayer;
@@ -62,16 +61,17 @@ import net.runelite.api.Node;
import net.runelite.api.Player; import net.runelite.api.Player;
import net.runelite.api.Scene; import net.runelite.api.Scene;
import net.runelite.api.Tile; import net.runelite.api.Tile;
import net.runelite.api.TileItem;
import net.runelite.api.coords.WorldPoint; import net.runelite.api.coords.WorldPoint;
import net.runelite.api.events.ClientTick; import net.runelite.api.events.ClientTick;
import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.ConfigChanged;
import net.runelite.api.events.FocusChanged; import net.runelite.api.events.FocusChanged;
import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameStateChanged;
import net.runelite.api.events.GameTick;
import net.runelite.api.events.ItemDespawned; import net.runelite.api.events.ItemDespawned;
import net.runelite.api.events.ItemQuantityChanged; import net.runelite.api.events.ItemQuantityChanged;
import net.runelite.api.events.ItemSpawned; import net.runelite.api.events.ItemSpawned;
import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.MenuEntryAdded;
import net.runelite.api.events.GameTick;
import net.runelite.client.Notifier; import net.runelite.client.Notifier;
import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ConfigManager;
import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.EventBus;
@@ -105,9 +105,10 @@ import net.runelite.client.util.Text;
@Singleton @Singleton
public class GroundItemsPlugin extends Plugin public class GroundItemsPlugin extends Plugin
{ {
@Getter(AccessLevel.PUBLIC)
public static final Map<GroundItem.GroundItemKey, GroundItem> collectedGroundItems = new LinkedHashMap<>();
// ItemID for coins // ItemID for coins
private static final int COINS = ItemID.COINS_995; private static final int COINS = ItemID.COINS_995;
// items stay on the ground for 30 mins in an instance // items stay on the ground for 30 mins in an instance
private static final int INSTANCE_DURATION_MILLIS = 45 * 60 * 1000; private static final int INSTANCE_DURATION_MILLIS = 45 * 60 * 1000;
private static final int INSTANCE_DURATION_TICKS = (int) floor(30 * 60 / 0.6); private static final int INSTANCE_DURATION_TICKS = (int) floor(30 * 60 / 0.6);
@@ -119,7 +120,6 @@ public class GroundItemsPlugin extends Plugin
private static final int DEATH_DURATION_TICKS = (int) floor(60 * 60 / 0.6); private static final int DEATH_DURATION_TICKS = (int) floor(60 * 60 / 0.6);
private static final int NORMAL_DURATION_MILLIS = 60 * 1000; private static final int NORMAL_DURATION_MILLIS = 60 * 1000;
private static final int NORMAL_DURATION_TICKS = (int) floor(60 / 0.6); private static final int NORMAL_DURATION_TICKS = (int) floor(60 / 0.6);
// Ground item menu options // Ground item menu options
private static final int FIRST_OPTION = MenuAction.GROUND_ITEM_FIRST_OPTION.getId(); private static final int FIRST_OPTION = MenuAction.GROUND_ITEM_FIRST_OPTION.getId();
private static final int SECOND_OPTION = MenuAction.GROUND_ITEM_SECOND_OPTION.getId(); private static final int SECOND_OPTION = MenuAction.GROUND_ITEM_SECOND_OPTION.getId();
@@ -129,65 +129,45 @@ public class GroundItemsPlugin extends Plugin
private static final int EXAMINE_ITEM = MenuAction.EXAMINE_ITEM_GROUND.getId(); private static final int EXAMINE_ITEM = MenuAction.EXAMINE_ITEM_GROUND.getId();
private static final int WALK = MenuAction.WALK.getId(); private static final int WALK = MenuAction.WALK.getId();
private static final int CAST_ON_ITEM = MenuAction.SPELL_CAST_ON_GROUND_ITEM.getId(); private static final int CAST_ON_ITEM = MenuAction.SPELL_CAST_ON_GROUND_ITEM.getId();
private static final String TELEGRAB_TEXT = ColorUtil.wrapWithColorTag("Telekinetic Grab", Color.GREEN) + ColorUtil.prependColorTag(" -> ", Color.WHITE); private static final String TELEGRAB_TEXT = ColorUtil.wrapWithColorTag("Telekinetic Grab", Color.GREEN) + ColorUtil.prependColorTag(" -> ", Color.WHITE);
private final Map<Integer, Color> priceChecks = new LinkedHashMap<>();
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@Setter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE)
private Map.Entry<Rectangle, GroundItem> textBoxBounds; private Map.Entry<Rectangle, GroundItem> textBoxBounds;
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@Setter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE)
private Map.Entry<Rectangle, GroundItem> hiddenBoxBounds; private Map.Entry<Rectangle, GroundItem> hiddenBoxBounds;
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@Setter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE)
private Map.Entry<Rectangle, GroundItem> highlightBoxBounds; private Map.Entry<Rectangle, GroundItem> highlightBoxBounds;
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@Setter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE)
private boolean hotKeyPressed; private boolean hotKeyPressed;
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@Setter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE)
private boolean hideAll; private boolean hideAll;
private List<String> hiddenItemList = new CopyOnWriteArrayList<>(); private List<String> hiddenItemList = new CopyOnWriteArrayList<>();
private List<String> highlightedItemsList = new CopyOnWriteArrayList<>(); private List<String> highlightedItemsList = new CopyOnWriteArrayList<>();
@Inject @Inject
private GroundItemInputListener inputListener; private GroundItemInputListener inputListener;
@Inject @Inject
private MouseManager mouseManager; private MouseManager mouseManager;
@Inject @Inject
private KeyManager keyManager; private KeyManager keyManager;
@Inject @Inject
private Client client; private Client client;
@Inject @Inject
private ItemManager itemManager; private ItemManager itemManager;
@Inject @Inject
private OverlayManager overlayManager; private OverlayManager overlayManager;
@Inject @Inject
private GroundItemsConfig config; private GroundItemsConfig config;
@Inject @Inject
private GroundItemsOverlay overlay; private GroundItemsOverlay overlay;
@Inject @Inject
private Notifier notifier; private Notifier notifier;
@Inject @Inject
private EventBus eventBus; private EventBus eventBus;
@Getter(AccessLevel.PUBLIC)
public static final Map<GroundItem.GroundItemKey, GroundItem> collectedGroundItems = new LinkedHashMap<>();
private final Map<Integer, Color> priceChecks = new LinkedHashMap<>();
private LoadingCache<String, Boolean> highlightedItems; private LoadingCache<String, Boolean> highlightedItems;
private LoadingCache<String, Boolean> hiddenItems; private LoadingCache<String, Boolean> hiddenItems;
@@ -323,7 +303,7 @@ public class GroundItemsPlugin extends Plugin
private void onItemSpawned(ItemSpawned itemSpawned) private void onItemSpawned(ItemSpawned itemSpawned)
{ {
Item item = itemSpawned.getItem(); TileItem item = itemSpawned.getItem();
Tile tile = itemSpawned.getTile(); Tile tile = itemSpawned.getTile();
GroundItem groundItem = buildGroundItem(tile, item); GroundItem groundItem = buildGroundItem(tile, item);
@@ -348,7 +328,7 @@ public class GroundItemsPlugin extends Plugin
private void onItemDespawned(ItemDespawned itemDespawned) private void onItemDespawned(ItemDespawned itemDespawned)
{ {
Item item = itemDespawned.getItem(); TileItem item = itemDespawned.getItem();
Tile tile = itemDespawned.getTile(); Tile tile = itemDespawned.getTile();
GroundItem.GroundItemKey groundItemKey = new GroundItem.GroundItemKey(item.getId(), tile.getWorldLocation()); GroundItem.GroundItemKey groundItemKey = new GroundItem.GroundItemKey(item.getId(), tile.getWorldLocation());
@@ -370,7 +350,7 @@ public class GroundItemsPlugin extends Plugin
private void onItemQuantityChanged(ItemQuantityChanged itemQuantityChanged) private void onItemQuantityChanged(ItemQuantityChanged itemQuantityChanged)
{ {
Item item = itemQuantityChanged.getItem(); TileItem item = itemQuantityChanged.getItem();
Tile tile = itemQuantityChanged.getTile(); Tile tile = itemQuantityChanged.getTile();
int oldQuantity = itemQuantityChanged.getOldQuantity(); int oldQuantity = itemQuantityChanged.getOldQuantity();
int newQuantity = itemQuantityChanged.getNewQuantity(); int newQuantity = itemQuantityChanged.getNewQuantity();
@@ -579,7 +559,7 @@ public class GroundItemsPlugin extends Plugin
} }
} }
private GroundItem buildGroundItem(final Tile tile, final Item item) private GroundItem buildGroundItem(final Tile tile, final TileItem item)
{ {
// Collect the data for the item // Collect the data for the item
final int itemId = item.getId(); final int itemId = item.getId();
@@ -711,9 +691,9 @@ public class GroundItemsPlugin extends Plugin
int quantity = 1; int quantity = 1;
Node current = itemLayer.getBottom(); Node current = itemLayer.getBottom();
while (current instanceof Item) while (current instanceof TileItem)
{ {
Item item = (Item) current; TileItem item = (TileItem) current;
if (item.getId() == itemId) if (item.getId() == itemId)
{ {
quantity = item.getQuantity(); quantity = item.getQuantity();
@@ -34,5 +34,5 @@ public enum PriceDisplayMode
HA, HA,
GE, GE,
BOTH, BOTH,
OFF; OFF
} }
@@ -34,5 +34,5 @@ public enum ValueCalculationMode
{ {
HA, // calc highlight by HA value HA, // calc highlight by HA value
GE, // calc by GE GE, // calc by GE
HIGHEST; HIGHEST
} }
@@ -323,14 +323,14 @@ public class GroundMarkerPlugin extends Plugin
lastIndex++; lastIndex++;
} }
client.setMenuEntries(menuEntries); client.setMenuEntries(menuEntries);
} }
} }
private void onMenuOptionClicked(MenuOptionClicked event) private void onMenuOptionClicked(MenuOptionClicked event)
{ {
if (event.getMenuAction().getId() != MenuAction.RUNELITE.getId() || (!event.getOption().contains(MARK) && !event.getOption().contains(UNMARK))) if (event.getMenuAction().getId() != MenuAction.RUNELITE.getId() ||
!(event.getOption().equals(MARK) || event.getOption().equals(UNMARK)))
{ {
return; return;
} }
@@ -53,14 +53,6 @@ enum HealthbarOverride implements SpriteOverride
FRONT_140PX(HEALTHBAR_DEFAULT_FRONT_140PX, "front_90px.png"), FRONT_140PX(HEALTHBAR_DEFAULT_FRONT_140PX, "front_90px.png"),
FRONT_160PX(HEALTHBAR_DEFAULT_FRONT_160PX, "front_90px.png"); FRONT_160PX(HEALTHBAR_DEFAULT_FRONT_160PX, "front_90px.png");
@Getter(AccessLevel.PUBLIC)
private final int spriteId;
private final String fileName;
@Getter(AccessLevel.PACKAGE)
private int padding = 1;
private static final Map<Integer, HealthbarOverride> MAP; private static final Map<Integer, HealthbarOverride> MAP;
static static
@@ -75,6 +67,12 @@ enum HealthbarOverride implements SpriteOverride
MAP = builder.build(); MAP = builder.build();
} }
@Getter(AccessLevel.PUBLIC)
private final int spriteId;
private final String fileName;
@Getter(AccessLevel.PACKAGE)
private int padding = 1;
static HealthbarOverride get(int spriteID) static HealthbarOverride get(int spriteID)
{ {
return MAP.get(spriteID); return MAP.get(spriteID);
@@ -34,8 +34,8 @@ import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.GameState; import net.runelite.api.GameState;
import net.runelite.api.HealthBar; import net.runelite.api.HealthBar;
import net.runelite.api.SpriteID;
import net.runelite.api.Sprite; import net.runelite.api.Sprite;
import net.runelite.api.SpriteID;
import net.runelite.api.events.BeforeMenuRender; import net.runelite.api.events.BeforeMenuRender;
import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.ConfigChanged;
import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameStateChanged;
@@ -291,6 +291,78 @@ public class AlchemyRoom extends MTARoom
&& player.getWorldLocation().getPlane() == 2; && player.getWorldLocation().getPlane() == 2;
} }
@Override
public void under(Graphics2D graphics)
{
if (!getConfig().alchemy() || best == null || !inside())
{
return;
}
boolean found = false;
for (Cupboard cupboard : cupboards)
{
if (cupboard == null)
{
continue;
}
GameObject object = cupboard.gameObject;
AlchemyItem alchemyItem = cupboard.alchemyItem;
if (alchemyItem == AlchemyItem.EMPTY)
{
continue;
}
if (alchemyItem.equals(best))
{
client.setHintArrow(object.getWorldLocation());
found = true;
}
BufferedImage image = itemManager.getImage(alchemyItem.getId());
Point canvasLoc = Perspective.getCanvasImageLocation(client, object.getLocalLocation(), image, IMAGE_Z_OFFSET);
if (canvasLoc != null)
{
graphics.drawImage(image, canvasLoc.getX(), canvasLoc.getY(), null);
}
}
if (!found && suggestion != null)
{
client.setHintArrow(suggestion.gameObject.getWorldLocation());
}
}
@Override
public void over(Graphics2D graphics)
{
if (!inside() || !config.alchemy() || best == null)
{
return;
}
Widget inventory = client.getWidget(WidgetInfo.INVENTORY);
if (inventory.isHidden())
{
return;
}
for (WidgetItem item : inventory.getWidgetItems())
{
if (item.getId() != best.getId())
{
continue;
}
drawItem(graphics, item);
}
}
private AlchemyItem getBest() private AlchemyItem getBest()
{ {
for (int i = 0; i < INFO_LENGTH; i++) for (int i = 0; i < INFO_LENGTH; i++)
@@ -357,53 +429,6 @@ public class AlchemyRoom extends MTARoom
} }
} }
@Override
public void under(Graphics2D graphics)
{
if (!getConfig().alchemy() || best == null || !inside())
{
return;
}
boolean found = false;
for (Cupboard cupboard : cupboards)
{
if (cupboard == null)
{
continue;
}
GameObject object = cupboard.gameObject;
AlchemyItem alchemyItem = cupboard.alchemyItem;
if (alchemyItem == AlchemyItem.EMPTY)
{
continue;
}
if (alchemyItem.equals(best))
{
client.setHintArrow(object.getWorldLocation());
found = true;
}
BufferedImage image = itemManager.getImage(alchemyItem.getId());
Point canvasLoc = Perspective.getCanvasImageLocation(client, object.getLocalLocation(), image, IMAGE_Z_OFFSET);
if (canvasLoc != null)
{
graphics.drawImage(image, canvasLoc.getX(), canvasLoc.getY(), null);
}
}
if (!found && suggestion != null)
{
client.setHintArrow(suggestion.gameObject.getWorldLocation());
}
}
private Cupboard getSuggestion() private Cupboard getSuggestion()
{ {
// check if a cupboard has the best item in it // check if a cupboard has the best item in it
@@ -443,32 +468,6 @@ public class AlchemyRoom extends MTARoom
return nearest; return nearest;
} }
@Override
public void over(Graphics2D graphics)
{
if (!inside() || !config.alchemy() || best == null)
{
return;
}
Widget inventory = client.getWidget(WidgetInfo.INVENTORY);
if (inventory.isHidden())
{
return;
}
for (WidgetItem item : inventory.getWidgetItems())
{
if (item.getId() != best.getId())
{
continue;
}
drawItem(graphics, item);
}
}
private void drawItem(Graphics2D graphics, WidgetItem item) private void drawItem(Graphics2D graphics, WidgetItem item)
{ {
Rectangle bounds = item.getCanvasBounds(); Rectangle bounds = item.getCanvasBounds();
@@ -30,10 +30,10 @@ import javax.inject.Inject;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.GameState; import net.runelite.api.GameState;
import net.runelite.api.Item;
import net.runelite.api.ItemID; import net.runelite.api.ItemID;
import net.runelite.api.Player; import net.runelite.api.Player;
import net.runelite.api.Tile; import net.runelite.api.Tile;
import net.runelite.api.TileItem;
import net.runelite.api.coords.WorldPoint; import net.runelite.api.coords.WorldPoint;
import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.ConfigChanged;
import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameStateChanged;
@@ -121,7 +121,7 @@ public class EnchantmentRoom extends MTARoom
private void onItemSpawned(ItemSpawned itemSpawned) private void onItemSpawned(ItemSpawned itemSpawned)
{ {
final Item item = itemSpawned.getItem(); final TileItem item = itemSpawned.getItem();
final Tile tile = itemSpawned.getTile(); final Tile tile = itemSpawned.getTile();
if (item.getId() == ItemID.DRAGONSTONE_6903) if (item.getId() == ItemID.DRAGONSTONE_6903)
@@ -134,7 +134,7 @@ public class EnchantmentRoom extends MTARoom
private void onItemDespawned(ItemDespawned itemDespawned) private void onItemDespawned(ItemDespawned itemDespawned)
{ {
final Item item = itemDespawned.getItem(); final TileItem item = itemDespawned.getItem();
final Tile tile = itemDespawned.getTile(); final Tile tile = itemDespawned.getTile();
if (item.getId() == ItemID.DRAGONSTONE_6903) if (item.getId() == ItemID.DRAGONSTONE_6903)
@@ -47,10 +47,8 @@ import net.runelite.client.ui.overlay.infobox.InfoBoxManager;
public class GraveyardRoom extends MTARoom public class GraveyardRoom extends MTARoom
{ {
private static final int MTA_GRAVEYARD_REGION = 13462;
static final int MIN_SCORE = 16; static final int MIN_SCORE = 16;
private static final int MTA_GRAVEYARD_REGION = 13462;
private final Client client; private final Client client;
private final MTAPlugin plugin; private final MTAPlugin plugin;
private final ItemManager itemManager; private final ItemManager itemManager;
@@ -93,6 +93,11 @@ public class TelekineticRoom extends MTARoom
addSubscriptions(); addSubscriptions();
} }
private static int manhattan(WorldPoint point1, WorldPoint point2)
{
return Math.abs(point1.getX() - point2.getX()) + Math.abs(point2.getY() - point1.getY());
}
private void addSubscriptions() private void addSubscriptions()
{ {
eventBus.subscribe(GameTick.class, this, this::onGameTick); eventBus.subscribe(GameTick.class, this, this::onGameTick);
@@ -285,11 +290,6 @@ public class TelekineticRoom extends MTARoom
return nearest(areaNext, nearestAfter); return nearest(areaNext, nearestAfter);
} }
private static int manhattan(WorldPoint point1, WorldPoint point2)
{
return Math.abs(point1.getX() - point2.getX()) + Math.abs(point2.getY() - point1.getY());
}
private WorldPoint nearest(WorldArea area, WorldPoint worldPoint) private WorldPoint nearest(WorldArea area, WorldPoint worldPoint)
{ {
int dist = Integer.MAX_VALUE; int dist = Integer.MAX_VALUE;
@@ -87,7 +87,7 @@ public class NpcIndicatorsPlugin extends Plugin
// Option added to NPC menu // Option added to NPC menu
private static final String TAG = "Tag"; private static final String TAG = "Tag";
private static final String UNTAG = "Untag"; private static final String UNTAG = "Un-tag";
private static final Set<MenuAction> NPC_MENU_ACTIONS = ImmutableSet.of(MenuAction.NPC_FIRST_OPTION, MenuAction.NPC_SECOND_OPTION, private static final Set<MenuAction> NPC_MENU_ACTIONS = ImmutableSet.of(MenuAction.NPC_FIRST_OPTION, MenuAction.NPC_SECOND_OPTION,
MenuAction.NPC_THIRD_OPTION, MenuAction.NPC_FOURTH_OPTION, MenuAction.NPC_FIFTH_OPTION); MenuAction.NPC_THIRD_OPTION, MenuAction.NPC_FOURTH_OPTION, MenuAction.NPC_FIFTH_OPTION);
@@ -316,7 +316,7 @@ public class NpcIndicatorsPlugin extends Plugin
// Add tag option // Add tag option
menuEntries = Arrays.copyOf(menuEntries, menuEntries.length + 1); menuEntries = Arrays.copyOf(menuEntries, menuEntries.length + 1);
final MenuEntry tagEntry = menuEntries[menuEntries.length - 1] = new MenuEntry(); final MenuEntry tagEntry = menuEntries[menuEntries.length - 1] = new MenuEntry();
tagEntry.setOption(npcTags.contains(event.getIdentifier()) ? UNTAG : TAG); tagEntry.setOption(highlightedNpcs.stream().anyMatch(npc -> npc.getIndex() == event.getIdentifier()) ? UNTAG : TAG);
tagEntry.setTarget(event.getTarget()); tagEntry.setTarget(event.getTarget());
tagEntry.setParam0(event.getActionParam0()); tagEntry.setParam0(event.getActionParam0());
tagEntry.setParam1(event.getActionParam1()); tagEntry.setParam1(event.getActionParam1());
@@ -328,9 +328,8 @@ public class NpcIndicatorsPlugin extends Plugin
private void onMenuOptionClicked(MenuOptionClicked click) private void onMenuOptionClicked(MenuOptionClicked click)
{ {
if (click.getMenuAction() != MenuAction.RUNELITE if (click.getMenuAction() != MenuAction.RUNELITE ||
|| (!click.getOption().equals(TAG) !(click.getOption().equals(TAG) || click.getOption().equals(UNTAG)))
&& !click.getOption().equals(UNTAG)))
{ {
return; return;
} }
@@ -247,47 +247,13 @@ public class ObjectIndicatorsPlugin extends Plugin implements KeyListener
return; return;
} }
final Tile tile = client.getScene().getTiles()[client.getPlane()][event.getActionParam0()][event.getActionParam1()];
MenuEntry[] menuEntries = client.getMenuEntries(); MenuEntry[] menuEntries = client.getMenuEntries();
menuEntries = Arrays.copyOf(menuEntries, menuEntries.length + 1); menuEntries = Arrays.copyOf(menuEntries, menuEntries.length + 1);
MenuEntry menuEntry = menuEntries[menuEntries.length - 1] = new MenuEntry(); MenuEntry menuEntry = menuEntries[menuEntries.length - 1] = new MenuEntry();
String option = MARK; menuEntry.setOption(objects.contains(findTileObject(tile, event.getIdentifier())) ? UNMARK : MARK);
Scene scene = client.getScene();
Tile[][][] tiles = scene.getTiles();
final int x = event.getActionParam0();
final int y = event.getActionParam1();
final int z = client.getPlane();
final Tile tile = tiles[z][x][y];
final TileObject object = findTileObject(tile, event.getIdentifier());
if (object != null)
{
final ObjectDefinition objectDefinition = client.getObjectDefinition(object.getId());
final String name = objectDefinition.getName();
if (!Strings.isNullOrEmpty(name))
{
final WorldPoint loc = WorldPoint.fromLocalInstance(client, tile.getLocalLocation());
final int regionId = loc.getRegionID();
final ObjectPoint point = new ObjectPoint(
name,
regionId,
loc.getX() & (REGION_SIZE - 1),
loc.getY() & (REGION_SIZE - 1),
client.getPlane());
final Set<ObjectPoint> objectPoints = points.get(regionId);
if (objectPoints != null && objectPoints.contains(point))
{
option = UNMARK;
}
}
}
menuEntry.setOption(option);
menuEntry.setTarget(event.getTarget()); menuEntry.setTarget(event.getTarget());
menuEntry.setParam0(event.getActionParam0()); menuEntry.setParam0(event.getActionParam0());
menuEntry.setParam1(event.getActionParam1()); menuEntry.setParam1(event.getActionParam1());
@@ -299,8 +265,7 @@ public class ObjectIndicatorsPlugin extends Plugin implements KeyListener
private void onMenuOptionClicked(MenuOptionClicked event) private void onMenuOptionClicked(MenuOptionClicked event)
{ {
if (event.getMenuAction() != MenuAction.RUNELITE if (event.getMenuAction() != MenuAction.RUNELITE
|| (!event.getOption().equals(MARK) || !(event.getOption().equals(MARK) || event.getOption().equals(UNMARK)))
&& !event.getOption().equals(UNMARK)))
{ {
return; return;
} }
@@ -67,7 +67,7 @@ public class ClientLoader
{ {
try try
{ {
URL localInjected = new File("./injected-client/target/injected-client-" + RuneLiteAPI.getVersion() + ".jar").toURI().toURL(); URL localInjected = new File("./injected-client/build/libs/injected-client-" + RuneLiteAPI.getVersion() + ".jar").toURI().toURL();
log.info("Using local injected-client"); log.info("Using local injected-client");
URLClassLoader classLoader = new URLClassLoader(new URL[]{localInjected}); URLClassLoader classLoader = new URLClassLoader(new URL[]{localInjected});
Class<?> clientClass = classLoader.loadClass("client"); Class<?> clientClass = classLoader.loadClass("client");
@@ -39,6 +39,7 @@ import java.util.Map;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.GameState; import net.runelite.api.GameState;
import net.runelite.api.MenuAction; import net.runelite.api.MenuAction;
@@ -61,6 +62,7 @@ import net.runelite.client.util.ColorUtil;
import net.runelite.client.util.MiscUtils; import net.runelite.client.util.MiscUtils;
@Singleton @Singleton
@Slf4j
public class OverlayRenderer extends MouseAdapter implements KeyListener public class OverlayRenderer extends MouseAdapter implements KeyListener
{ {
private static final int BORDER = 5; private static final int BORDER = 5;
@@ -496,8 +498,23 @@ public class OverlayRenderer extends MouseAdapter implements KeyListener
} }
subGraphics.translate(point.x, point.y); subGraphics.translate(point.x, point.y);
final Dimension dimension = MoreObjects.firstNonNull(overlay.render(subGraphics), new Dimension());
final Dimension overlayDimension;
try
{
overlayDimension = overlay.render(subGraphics);
}
catch (Exception ex)
{
log.warn("Error during overlay rendering", ex);
return;
}
finally
{
subGraphics.dispose(); subGraphics.dispose();
}
final Dimension dimension = MoreObjects.firstNonNull(overlayDimension, new Dimension());
overlay.setBounds(new Rectangle(point, dimension)); overlay.setBounds(new Rectangle(point, dimension));
} }
@@ -24,6 +24,7 @@
*/ */
package net.runelite.client.ui.overlay.components; package net.runelite.client.ui.overlay.components;
import com.google.common.annotations.VisibleForTesting;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.FontMetrics; import java.awt.FontMetrics;
@@ -96,6 +97,7 @@ public class TooltipComponent implements RenderableEntity
char[] chars = line.toCharArray(); char[] chars = line.toCharArray();
int begin = 0; int begin = 0;
boolean inTag = false;
for (int j = 0; j < chars.length; j++) for (int j = 0; j < chars.length; j++)
{ {
if (chars[j] == '<') if (chars[j] == '<')
@@ -110,8 +112,9 @@ public class TooltipComponent implements RenderableEntity
lineX += metrics.stringWidth(text); lineX += metrics.stringWidth(text);
begin = j; begin = j;
inTag = true;
} }
else if (chars[j] == '>') else if (chars[j] == '>' && inTag)
{ {
String subLine = line.substring(begin + 1, j); String subLine = line.substring(begin + 1, j);
@@ -148,6 +151,7 @@ public class TooltipComponent implements RenderableEntity
} }
begin = j + 1; begin = j + 1;
inTag = false;
} }
} }
@@ -162,12 +166,14 @@ public class TooltipComponent implements RenderableEntity
return new Dimension(tooltipWidth + OFFSET * 2, tooltipHeight + OFFSET * 2); return new Dimension(tooltipWidth + OFFSET * 2, tooltipHeight + OFFSET * 2);
} }
private static int calculateTextWidth(FontMetrics metrics, String line) @VisibleForTesting
static int calculateTextWidth(FontMetrics metrics, String line)
{ {
char[] chars = line.toCharArray(); char[] chars = line.toCharArray();
int textWidth = 0; int textWidth = 0;
int begin = 0; int begin = 0;
boolean inTag = false;
for (int j = 0; j < chars.length; j++) for (int j = 0; j < chars.length; j++)
{ {
if (chars[j] == '<') if (chars[j] == '<')
@@ -175,8 +181,9 @@ public class TooltipComponent implements RenderableEntity
textWidth += metrics.stringWidth(line.substring(begin, j)); textWidth += metrics.stringWidth(line.substring(begin, j));
begin = j; begin = j;
inTag = true;
} }
else if (chars[j] == '>') else if (chars[j] == '>' && inTag)
{ {
String subLine = line.substring(begin + 1, j); String subLine = line.substring(begin + 1, j);
@@ -190,6 +197,7 @@ public class TooltipComponent implements RenderableEntity
} }
begin = j + 1; begin = j + 1;
inTag = false;
} }
} }
@@ -66,6 +66,19 @@ public class TooltipOverlay extends Overlay
return null; return null;
} }
try
{
return renderTooltips(graphics, tooltips);
}
finally
{
// Tooltips must always be cleared each frame
tooltipManager.clear();
}
}
private Dimension renderTooltips(Graphics2D graphics, List<Tooltip> tooltips)
{
final Rectangle clientCanvasBounds = new Rectangle(client.getRealDimensions()); final Rectangle clientCanvasBounds = new Rectangle(client.getRealDimensions());
final net.runelite.api.Point mouseCanvasPosition = client.getMouseCanvasPosition(); final net.runelite.api.Point mouseCanvasPosition = client.getMouseCanvasPosition();
final Point mousePosition = new Point(mouseCanvasPosition.getX(), mouseCanvasPosition.getY() + OFFSET); final Point mousePosition = new Point(mouseCanvasPosition.getX(), mouseCanvasPosition.getY() + OFFSET);
@@ -113,7 +126,6 @@ public class TooltipOverlay extends Overlay
newBounds.width = Math.max(newBounds.width, dimension.width); newBounds.width = Math.max(newBounds.width, dimension.width);
} }
tooltipManager.clear();
return newBounds.getSize(); return newBounds.getSize();
} }
} }
@@ -33,8 +33,8 @@ import javax.inject.Singleton;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.Constants; import net.runelite.api.Constants;
import net.runelite.api.GameState; import net.runelite.api.GameState;
import net.runelite.api.TileItem;
import net.runelite.api.InventoryID; import net.runelite.api.InventoryID;
import net.runelite.api.Item;
import net.runelite.api.ItemContainer; import net.runelite.api.ItemContainer;
import net.runelite.api.NPC; import net.runelite.api.NPC;
import net.runelite.api.Node; import net.runelite.api.Node;
@@ -180,9 +180,9 @@ public class GameEventManager
{ {
Node current = itemLayer.getBottom(); Node current = itemLayer.getBottom();
while (current instanceof Item) while (current instanceof TileItem)
{ {
final Item item = (Item) current; final TileItem item = (TileItem) current;
current = current.getNext(); current = current.getNext();
@@ -52,6 +52,11 @@ import net.runelite.api.Sprite;
@Slf4j @Slf4j
public class ImageUtil public class ImageUtil
{ {
static
{
ImageIO.setUseCache(false);
}
/** /**
* Creates a {@link BufferedImage} from an {@link Image}. * Creates a {@link BufferedImage} from an {@link Image}.
* *
@@ -0,0 +1 @@
975C2E20F49CD83A72B6A7BA4CF34F9B476F26DCD2649B0CE79B3F93CBB892DD
@@ -0,0 +1,426 @@
.id 923
.int_stack_count 0
.string_stack_count 0
.int_var_count 5
.string_var_count 0
; callback "chatboxBackgroundBuilt"
; used by the ChatboxPerformancePlugin to know when it needs to rebuild.
; Unmark the plugin as hidden and toggle it. The chatbox should change opacity
; slightly
iconst 10616834
cc_deleteall
iconst 0
istore 0
get_varc_int 41
iconst 1337
if_icmpeq LABEL8
jump LABEL24
LABEL8:
invoke 922
iconst 1
if_icmpeq LABEL12
jump LABEL15
LABEL12:
iconst 1
istore 0
jump LABEL24
LABEL15:
getwindowmode
iconst 1
if_icmpeq LABEL19
jump LABEL24
LABEL19:
iconst 0
set_varc_int 41
iconst 0
iconst 0
invoke 183
LABEL24:
iload 0
iconst 10616869
if_sethide
get_varbit 6374
iconst 1
if_icmpeq LABEL31
jump LABEL48
LABEL31:
getwindowmode
iconst 1
if_icmpne LABEL35
jump LABEL48
LABEL35:
iconst 1
iconst 0
iconst 2
iconst 0
iconst 10616890
if_setposition
iconst -1
iconst 0
iconst 0
iconst 0
iconst 10617391
if_setposition
jump LABEL60
LABEL48:
iconst 0
iconst 0
iconst 0
iconst 0
iconst 10616890
if_setposition
iconst 0
iconst 0
iconst 2
iconst 0
iconst 10617391
if_setposition
LABEL60:
iconst 10616870
cc_deleteall
iconst 10616888
cc_deleteall
iconst 0
istore 1
clientclock
get_varc_int 223
if_icmplt LABEL70
jump LABEL82
LABEL70:
invoke 900
iconst 1129
if_icmpne LABEL74
jump LABEL82
LABEL74:
iconst 1
istore 1
iconst 2155
get_varc_int 223
sconst "i"
iconst 10616870
if_setontimer
jump LABEL86
LABEL82:
iconst -1
sconst ""
iconst 10616870
if_setontimer
LABEL86:
invoke 921
iconst 0
if_icmpeq LABEL90
jump LABEL156
LABEL90:
iconst 1
iconst 10616870
if_setnoclickthrough
iload 1
iconst 0
if_icmpeq LABEL97
jump LABEL135
LABEL97:
iconst 10616870
iconst 5
iconst 0
cc_create
iconst 0
iconst 0
iconst 1
iconst 1
cc_setsize
iconst 0
iconst 0
iconst 1
iconst 1
cc_setposition
iconst 1017
cc_setgraphic
iconst 0
cc_settiling
iconst 0
cc_settrans
iconst 10616888
iconst 3
iconst 0
cc_create
iconst 0
iconst 1
iconst 1
iconst 0
cc_setsize
iconst 0
iconst 15
iconst 1
iconst 2
cc_setposition
iconst 8418912
cc_setcolour
iconst 1
cc_setfill
LABEL135:
iconst 10617391
iconst 792
iconst 789
iconst 790
iconst 791
iconst 773
iconst 788
iconst 0
invoke 838
invoke 2373
iconst 1
if_icmpeq LABEL148
jump LABEL152
LABEL148:
iconst 255
iconst 10616835
if_settrans
jump LABEL155
LABEL152:
iconst 0
iconst 10616835
if_settrans
LABEL155:
return
LABEL156:
iconst 16384
iconst 25
div
istore 2
iconst 16384
istore 3
get_varbit 2570
iconst 1
if_icmpeq LABEL166
jump LABEL170
LABEL166:
iconst 1
iconst 10616870
if_setnoclickthrough
jump LABEL176
LABEL170:
iconst 0
iconst 10616870
if_setnoclickthrough
iconst 1
iconst 10616870
2006
LABEL176:
iconst 0
istore 4
iload 1
iconst 0
if_icmpeq LABEL182
jump LABEL332
LABEL182:
invoke 1972
iconst 0
if_icmpeq LABEL186
jump LABEL266
LABEL186:
iload 4
iconst 20
if_icmplt LABEL190
jump LABEL265
LABEL190:
iconst 10616870
iconst 3
iload 4
cc_create
iconst 0
iload 3
iconst 1
iconst 2
cc_setsize
iconst 0
iconst 0
iconst 1
iconst 2
cc_setposition
iconst 0
cc_setcolour
iconst 1
cc_setfill
iconst 254
cc_settrans
iconst 10616888
iconst 3
iload 4
iconst 2
multiply
cc_create
iconst 10616888
iconst 3
iload 4
iconst 2
multiply
iconst 1
add
cc_create 1
iload 3
iconst 1
iconst 2
iconst 0
cc_setsize
iload 3
iconst 1
iconst 2
iconst 0
cc_setsize 1
iconst 0
iconst 0
iconst 0
iconst 0
cc_setposition
iconst 0
iconst 15
iconst 0
iconst 2
cc_setposition 1
iconst 16777215
cc_setcolour
iconst 16777215
cc_setcolour 1
iconst 1
cc_setfill
iconst 1
cc_setfill 1
iconst 251
cc_settrans
iconst 250
cc_settrans 1
iload 4
iconst 1
add
iload 3
iload 2
sub
istore 3
istore 4
jump LABEL186
LABEL265:
sconst "chatboxBackgroundBuilt"
runelite_callback
jump LABEL332
LABEL266:
iconst 10616870
iconst 3
iload 4
cc_create
iconst 0
iload 3
iconst 1
iconst 2
cc_setsize
iconst 0
iconst 0
iconst 1
iconst 2
cc_setposition
iconst 0
cc_setcolour
iconst 1
cc_setfill
iconst 225
cc_settrans
iconst 10616888
iconst 3
iload 4
iconst 2
multiply
cc_create
iconst 10616888
iconst 3
iload 4
iconst 2
multiply
iconst 1
add
cc_create 1
iload 3
iconst 1
iconst 2
iconst 0
cc_setsize
iload 3
iconst 1
iconst 2
iconst 0
cc_setsize 1
iconst 0
iconst 0
iconst 0
iconst 0
cc_setposition
iconst 0
iconst 15
iconst 0
iconst 2
cc_setposition 1
iconst 16777215
cc_setcolour
iconst 16777215
cc_setcolour 1
iconst 1
cc_setfill
iconst 1
cc_setfill 1
iconst 200
cc_settrans
iconst 130
cc_settrans 1
LABEL332:
iconst 10617391
iconst 1190
iconst 1187
iconst 1188
iconst 1189
iconst 1185
iconst 1186
iconst 1
invoke 838
iload 0
iconst 1
if_icmpeq LABEL345
jump LABEL349
LABEL345:
iconst 255
iconst 10616835
if_settrans
jump LABEL380
LABEL349:
invoke 1972
iconst 0
if_icmpeq LABEL353
jump LABEL357
LABEL353:
iconst 155
iconst 10616835
if_settrans
jump LABEL380
LABEL357:
iconst 255
iconst 10616835
if_settrans
iconst 10616834
iconst 3
iconst 0
cc_create
iconst 0
iconst 0
iconst 1
iconst 1
cc_setsize
iconst 0
iconst 0
iconst 1
iconst 1
cc_setposition
iconst 0
cc_setcolour
iconst 1
cc_setfill
iconst 225
cc_settrans
LABEL380:
return
@@ -67,17 +67,9 @@ public class ContainerCalculationTest
@Test @Test
public void testCalculate() public void testCalculate()
{ {
Item coins = mock(Item.class); Item coins = new Item(ItemID.COINS_995, Integer.MAX_VALUE);
when(coins.getId())
.thenReturn(ItemID.COINS_995);
when(coins.getQuantity())
.thenReturn(Integer.MAX_VALUE);
Item whip = mock(Item.class); Item whip = new Item(ItemID.ABYSSAL_WHIP, 1_000_000_000);
when(whip.getId())
.thenReturn(ItemID.ABYSSAL_WHIP);
when(whip.getQuantity())
.thenReturn(1_000_000_000);
Item[] items = ImmutableList.of( Item[] items = ImmutableList.of(
coins, coins,
@@ -54,7 +54,6 @@ public class ChatFilterPluginTest
private ChatFilterConfig chatFilterConfig; private ChatFilterConfig chatFilterConfig;
@Mock @Mock
@Bind
private Player localPlayer; private Player localPlayer;
@Inject @Inject
@@ -121,6 +120,16 @@ public class ChatFilterPluginTest
assertNull(chatFilterPlugin.censorMessage("te\u008Cst")); assertNull(chatFilterPlugin.censorMessage("te\u008Cst"));
} }
@Test
public void testReplayedMessage()
{
when(chatFilterConfig.filterType()).thenReturn(ChatFilterType.REMOVE_MESSAGE);
when(chatFilterConfig.filteredWords()).thenReturn("hello osrs");
chatFilterPlugin.updateFilteredPatterns();
assertNull(chatFilterPlugin.censorMessage("hello\u00A0osrs"));
}
@Test @Test
public void testMessageFromFriendIsFiltered() public void testMessageFromFriendIsFiltered()
{ {
@@ -44,6 +44,8 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import org.mockito.runners.MockitoJUnitRunner; import org.mockito.runners.MockitoJUnitRunner;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
@RunWith(MockitoJUnitRunner.class) @RunWith(MockitoJUnitRunner.class)
public class EmojiPluginTest public class EmojiPluginTest
@@ -113,4 +115,17 @@ public class EmojiPluginTest
verify(messageNode).setRuneLiteFormatMessage("<img=10>"); verify(messageNode).setRuneLiteFormatMessage("<img=10>");
} }
@Test
public void testEmojiUpdateMessage()
{
String PARTY_POPPER = "<img=" + (-1 + Emoji.getEmoji("@@@").ordinal()) + '>';
String OPEN_MOUTH = "<img=" + (-1 + Emoji.getEmoji(":O").ordinal()) + '>';
assertNull(emojiPlugin.updateMessage("@@@@@"));
assertEquals(PARTY_POPPER, emojiPlugin.updateMessage("@@@"));
assertEquals(PARTY_POPPER + ' ' + PARTY_POPPER, emojiPlugin.updateMessage("@@@ @@@"));
assertEquals(PARTY_POPPER + ' ' + OPEN_MOUTH, emojiPlugin.updateMessage("@@@\u00A0:O"));
assertEquals(PARTY_POPPER + ' ' + OPEN_MOUTH + ' ' + PARTY_POPPER, emojiPlugin.updateMessage("@@@\u00A0:O @@@"));
assertEquals(PARTY_POPPER + " Hello World " + PARTY_POPPER, emojiPlugin.updateMessage("@@@\u00A0Hello World\u00A0@@@"));
}
} }
@@ -135,8 +135,7 @@ public class ItemChargePluginTest
when(client.getItemContainer(eq(InventoryID.EQUIPMENT))).thenReturn(equipmentItemContainer); when(client.getItemContainer(eq(InventoryID.EQUIPMENT))).thenReturn(equipmentItemContainer);
Item[] items = new Item[EquipmentInventorySlot.RING.getSlotIdx() + 1]; Item[] items = new Item[EquipmentInventorySlot.RING.getSlotIdx() + 1];
when(equipmentItemContainer.getItems()).thenReturn(items); when(equipmentItemContainer.getItems()).thenReturn(items);
Item ring = mock(Item.class); Item ring = new Item(ItemID.RING_OF_FORGING, 1);
when(ring.getId()).thenReturn(ItemID.RING_OF_FORGING);
items[EquipmentInventorySlot.RING.getSlotIdx()] = ring; items[EquipmentInventorySlot.RING.getSlotIdx()] = ring;
// Run message // Run message
chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "", USED_RING_OF_FORGING, "", 0); chatMessage = new ChatMessage(null, ChatMessageType.GAMEMESSAGE, "", USED_RING_OF_FORGING, "", 0);
@@ -100,18 +100,13 @@ public class ItemsKeptOnDeathPluginTest
when(itemManager.canonicalize(id)).thenReturn(id); when(itemManager.canonicalize(id)).thenReturn(id);
when(itemManager.getItemPrice(id, true)).thenReturn(price); when(itemManager.getItemPrice(id, true)).thenReturn(price);
return mockItem(id, qty); return item(id, qty);
} }
// Creates a mocked item // Creates a new item
private Item mockItem(final int id, final int qty) private static Item item(final int id, final int qty)
{ {
Item item = mock(Item.class); return new Item(id, qty);
when(item.getId()).thenReturn(id);
when(item.getQuantity()).thenReturn(qty);
return item;
} }
@Test @Test
@@ -126,12 +126,12 @@ public class MotherlodePluginTest
// Create before inventory // Create before inventory
ItemContainer inventory = mock(ItemContainer.class); ItemContainer inventory = mock(ItemContainer.class);
Item[] items = new Item[]{ Item[] items = new Item[]{
mockItem(ItemID.RUNITE_ORE, 1), item(ItemID.RUNITE_ORE, 1),
mockItem(ItemID.GOLDEN_NUGGET, 4), item(ItemID.GOLDEN_NUGGET, 4),
mockItem(ItemID.COAL, 1), item(ItemID.COAL, 1),
mockItem(ItemID.COAL, 1), item(ItemID.COAL, 1),
mockItem(ItemID.COAL, 1), item(ItemID.COAL, 1),
mockItem(ItemID.COAL, 1), item(ItemID.COAL, 1),
}; };
when(inventory.getItems()) when(inventory.getItems())
@@ -145,16 +145,16 @@ public class MotherlodePluginTest
inventory = mock(ItemContainer.class); inventory = mock(ItemContainer.class);
// +1 rune, +4 nugget, +2 coal, +1 addy // +1 rune, +4 nugget, +2 coal, +1 addy
items = new Item[]{ items = new Item[]{
mockItem(ItemID.RUNITE_ORE, 1), item(ItemID.RUNITE_ORE, 1),
mockItem(ItemID.RUNITE_ORE, 1), item(ItemID.RUNITE_ORE, 1),
mockItem(ItemID.GOLDEN_NUGGET, 8), item(ItemID.GOLDEN_NUGGET, 8),
mockItem(ItemID.COAL, 1), item(ItemID.COAL, 1),
mockItem(ItemID.COAL, 1), item(ItemID.COAL, 1),
mockItem(ItemID.COAL, 1), item(ItemID.COAL, 1),
mockItem(ItemID.COAL, 1), item(ItemID.COAL, 1),
mockItem(ItemID.COAL, 1), item(ItemID.COAL, 1),
mockItem(ItemID.COAL, 1), item(ItemID.COAL, 1),
mockItem(ItemID.ADAMANTITE_ORE, 1), item(ItemID.ADAMANTITE_ORE, 1),
}; };
when(inventory.getItems()) when(inventory.getItems())
@@ -171,11 +171,8 @@ public class MotherlodePluginTest
verifyNoMoreInteractions(motherlodeSession); verifyNoMoreInteractions(motherlodeSession);
} }
private static Item mockItem(int itemId, int quantity) private static Item item(int itemId, int quantity)
{ {
Item item = mock(Item.class); return new Item(itemId, quantity);
when(item.getId()).thenReturn(itemId);
when(item.getQuantity()).thenReturn(quantity);
return item;
} }
} }
@@ -0,0 +1,45 @@
/*
* Copyright (c) 2019, 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.client.ui.overlay.components;
import java.awt.FontMetrics;
import static net.runelite.client.ui.overlay.components.TooltipComponent.calculateTextWidth;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class TooltipComponentTest
{
@Test
public void testCalculateTextWidth()
{
FontMetrics fontMetics = mock(FontMetrics.class);
when(fontMetics.stringWidth(anyString())).thenAnswer((invocation) -> ((String) invocation.getArguments()[0]).length());
assertEquals(11, calculateTextWidth(fontMetics, "line1<col=ff0000>>line2"));
}
}
@@ -122,7 +122,7 @@ import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSEnumDefinition; import net.runelite.rs.api.RSEnumDefinition;
import net.runelite.rs.api.RSFriendSystem; import net.runelite.rs.api.RSFriendSystem;
import net.runelite.rs.api.RSFriendsList; import net.runelite.rs.api.RSFriendsList;
import net.runelite.rs.api.RSGroundItem; import net.runelite.rs.api.RSTileItem;
import net.runelite.rs.api.RSIgnoreList; import net.runelite.rs.api.RSIgnoreList;
import net.runelite.rs.api.RSIndexedSprite; import net.runelite.rs.api.RSIndexedSprite;
import net.runelite.rs.api.RSItemContainer; import net.runelite.rs.api.RSItemContainer;
@@ -180,7 +180,7 @@ public abstract class RSClientMixin implements RSClient
private static int oldMenuEntryCount; private static int oldMenuEntryCount;
@Inject @Inject
private static RSGroundItem lastItemDespawn; private static RSTileItem lastItemDespawn;
@Inject @Inject
private boolean gpu; private boolean gpu;
@@ -1489,14 +1489,14 @@ public abstract class RSClientMixin implements RSClient
@Inject @Inject
@Override @Override
public RSGroundItem getLastItemDespawn() public RSTileItem getLastItemDespawn()
{ {
return lastItemDespawn; return lastItemDespawn;
} }
@Inject @Inject
@Override @Override
public void setLastItemDespawn(RSGroundItem lastItemDespawn) public void setLastItemDespawn(RSTileItem lastItemDespawn)
{ {
RSClientMixin.lastItemDespawn = lastItemDespawn; RSClientMixin.lastItemDespawn = lastItemDespawn;
} }
@@ -33,7 +33,7 @@ import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Replace;
import net.runelite.api.mixins.Shadow; import net.runelite.api.mixins.Shadow;
import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSGroundItem; import net.runelite.rs.api.RSTileItem;
import net.runelite.rs.api.RSItemContainer; import net.runelite.rs.api.RSItemContainer;
@Mixin(RSItemContainer.class) @Mixin(RSItemContainer.class)
@@ -58,7 +58,7 @@ public abstract class RSItemContainerMixin implements RSItemContainer
for (int i = 0; i < itemIds.length; ++i) for (int i = 0; i < itemIds.length; ++i)
{ {
RSGroundItem item = client.createItem(); RSTileItem item = client.createItem();
item.setId(itemIds[i]); item.setId(itemIds[i]);
item.setQuantity(stackSizes[i]); item.setQuantity(stackSizes[i]);
items[i] = item; items[i] = item;
@@ -38,7 +38,7 @@ import net.runelite.api.mixins.Shadow;
import net.runelite.rs.api.RSBoundaryObject; import net.runelite.rs.api.RSBoundaryObject;
import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSFloorDecoration; import net.runelite.rs.api.RSFloorDecoration;
import net.runelite.rs.api.RSGroundItemPile; import net.runelite.rs.api.RSTileItemPile;
import net.runelite.rs.api.RSScene; import net.runelite.rs.api.RSScene;
import net.runelite.rs.api.RSTile; import net.runelite.rs.api.RSTile;
import net.runelite.rs.api.RSTileModel; import net.runelite.rs.api.RSTileModel;
@@ -418,7 +418,7 @@ public abstract class RSSceneMixin implements RSScene
Tile tile = getTiles()[plane][x][y]; Tile tile = getTiles()[plane][x][y];
if (tile != null) if (tile != null)
{ {
RSGroundItemPile itemLayer = (RSGroundItemPile) tile.getItemLayer(); RSTileItemPile itemLayer = (RSTileItemPile) tile.getItemLayer();
if (itemLayer != null) if (itemLayer != null)
{ {
itemLayer.setPlane(plane); itemLayer.setPlane(plane);
@@ -7,10 +7,10 @@ import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Shadow; import net.runelite.api.mixins.Shadow;
import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSGroundItem; import net.runelite.rs.api.RSTileItem;
@Mixin(RSGroundItem.class) @Mixin(RSTileItem.class)
public abstract class RSGroundItemMixin implements RSGroundItem public abstract class RSTileItemMixin implements RSTileItem
{ {
@Shadow("client") @Shadow("client")
private static RSClient client; private static RSClient client;
@@ -22,7 +22,7 @@ public abstract class RSGroundItemMixin implements RSGroundItem
private int rl$sceneY = -1; private int rl$sceneY = -1;
@Inject @Inject
RSGroundItemMixin() RSTileItemMixin()
{ {
} }
@@ -5,10 +5,10 @@ import net.runelite.api.Model;
import net.runelite.api.Renderable; import net.runelite.api.Renderable;
import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Mixin;
import net.runelite.rs.api.RSGroundItemPile; import net.runelite.rs.api.RSTileItemPile;
@Mixin(RSGroundItemPile.class) @Mixin(RSTileItemPile.class)
public abstract class RSGroundItemPileMixin implements RSGroundItemPile public abstract class RSTileItemPileMixin implements RSTileItemPile
{ {
@Inject @Inject
private int itemLayerPlane; private int itemLayerPlane;
@@ -24,16 +24,18 @@
*/ */
package net.runelite.mixins; package net.runelite.mixins;
import java.util.ArrayList;
import java.util.List;
import net.runelite.api.CollisionData; import net.runelite.api.CollisionData;
import net.runelite.api.CollisionDataFlag; import net.runelite.api.CollisionDataFlag;
import net.runelite.api.Constants; import net.runelite.api.Constants;
import net.runelite.api.DecorativeObject; import net.runelite.api.DecorativeObject;
import net.runelite.api.GroundObject; import net.runelite.api.GroundObject;
import net.runelite.api.Item;
import net.runelite.api.ItemLayer; import net.runelite.api.ItemLayer;
import net.runelite.api.Node; import net.runelite.api.Node;
import net.runelite.api.Point; import net.runelite.api.Point;
import net.runelite.api.Tile; import net.runelite.api.Tile;
import net.runelite.api.TileItem;
import net.runelite.api.WallObject; import net.runelite.api.WallObject;
import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint; import net.runelite.api.coords.WorldPoint;
@@ -51,8 +53,6 @@ import net.runelite.api.events.ItemSpawned;
import net.runelite.api.events.WallObjectChanged; import net.runelite.api.events.WallObjectChanged;
import net.runelite.api.events.WallObjectDespawned; import net.runelite.api.events.WallObjectDespawned;
import net.runelite.api.events.WallObjectSpawned; import net.runelite.api.events.WallObjectSpawned;
import java.util.ArrayList;
import java.util.List;
import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.FieldHook;
import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Mixin;
@@ -62,12 +62,12 @@ import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSEntity; import net.runelite.rs.api.RSEntity;
import net.runelite.rs.api.RSGameObject; import net.runelite.rs.api.RSGameObject;
import net.runelite.rs.api.RSGraphicsObject; import net.runelite.rs.api.RSGraphicsObject;
import net.runelite.rs.api.RSGroundItem; import net.runelite.rs.api.RSTileItemPile;
import net.runelite.rs.api.RSGroundItemPile;
import net.runelite.rs.api.RSNode; import net.runelite.rs.api.RSNode;
import net.runelite.rs.api.RSNodeDeque; import net.runelite.rs.api.RSNodeDeque;
import net.runelite.rs.api.RSProjectile; import net.runelite.rs.api.RSProjectile;
import net.runelite.rs.api.RSTile; import net.runelite.rs.api.RSTile;
import net.runelite.rs.api.RSTileItem;
import org.slf4j.Logger; import org.slf4j.Logger;
@Mixin(RSTile.class) @Mixin(RSTile.class)
@@ -115,6 +115,142 @@ public abstract class RSTileMixin implements RSTile
return LocalPoint.fromScene(getX(), getY()); return LocalPoint.fromScene(getX(), getY());
} }
@Inject
@Override
public boolean hasLineOfSightTo(Tile other)
{
// Thanks to Henke for this method :)
if (this.getPlane() != other.getPlane())
{
return false;
}
CollisionData[] collisionData = client.getCollisionMaps();
if (collisionData == null)
{
return false;
}
int z = this.getPlane();
int[][] collisionDataFlags = collisionData[z].getFlags();
Point p1 = this.getSceneLocation();
Point p2 = other.getSceneLocation();
if (p1.getX() == p2.getX() && p1.getY() == p2.getY())
{
return true;
}
int dx = p2.getX() - p1.getX();
int dy = p2.getY() - p1.getY();
int dxAbs = Math.abs(dx);
int dyAbs = Math.abs(dy);
int xFlags = CollisionDataFlag.BLOCK_LINE_OF_SIGHT_FULL;
int yFlags = CollisionDataFlag.BLOCK_LINE_OF_SIGHT_FULL;
if (dx < 0)
{
xFlags |= CollisionDataFlag.BLOCK_LINE_OF_SIGHT_EAST;
}
else
{
xFlags |= CollisionDataFlag.BLOCK_LINE_OF_SIGHT_WEST;
}
if (dy < 0)
{
yFlags |= CollisionDataFlag.BLOCK_LINE_OF_SIGHT_NORTH;
}
else
{
yFlags |= CollisionDataFlag.BLOCK_LINE_OF_SIGHT_SOUTH;
}
if (dxAbs > dyAbs)
{
int x = p1.getX();
int yBig = p1.getY() << 16; // The y position is represented as a bigger number to handle rounding
int slope = (dy << 16) / dxAbs;
yBig += 0x8000; // Add half of a tile
if (dy < 0)
{
yBig--; // For correct rounding
}
int direction = dx < 0 ? -1 : 1;
while (x != p2.getX())
{
x += direction;
int y = yBig >>> 16;
if ((collisionDataFlags[x][y] & xFlags) != 0)
{
// Collision while traveling on the x axis
return false;
}
yBig += slope;
int nextY = yBig >>> 16;
if (nextY != y && (collisionDataFlags[x][nextY] & yFlags) != 0)
{
// Collision while traveling on the y axis
return false;
}
}
}
else
{
int y = p1.getY();
int xBig = p1.getX() << 16; // The x position is represented as a bigger number to handle rounding
int slope = (dx << 16) / dyAbs;
xBig += 0x8000; // Add half of a tile
if (dx < 0)
{
xBig--; // For correct rounding
}
int direction = dy < 0 ? -1 : 1;
while (y != p2.getY())
{
y += direction;
int x = xBig >>> 16;
if ((collisionDataFlags[x][y] & yFlags) != 0)
{
// Collision while traveling on the y axis
return false;
}
xBig += slope;
int nextX = xBig >>> 16;
if (nextX != x && (collisionDataFlags[nextX][y] & xFlags) != 0)
{
// Collision while traveling on the x axis
return false;
}
}
}
// No collision
return true;
}
@Inject
@Override
public List<TileItem> getGroundItems()
{
ItemLayer layer = this.getItemLayer();
if (layer == null)
{
return null;
}
List<TileItem> result = new ArrayList<TileItem>();
Node node = layer.getBottom();
while (node instanceof TileItem)
{
result.add((TileItem) node);
node = node.getNext();
}
return result;
}
@FieldHook("boundaryObject") @FieldHook("boundaryObject")
@Inject @Inject
public void wallObjectChanged(int idx) public void wallObjectChanged(int idx)
@@ -318,7 +454,7 @@ public abstract class RSTileMixin implements RSTile
} }
} }
@FieldHook("groundItemPile") @FieldHook("tileItemPile")
@Inject @Inject
public void itemLayerChanged(int idx) public void itemLayerChanged(int idx)
{ {
@@ -338,7 +474,7 @@ public abstract class RSTileMixin implements RSTile
RSNode head = oldQueue.getHead(); RSNode head = oldQueue.getHead();
for (RSNode cur = head.getNext(); cur != head; cur = cur.getNext()) for (RSNode cur = head.getNext(); cur != head; cur = cur.getNext())
{ {
RSGroundItem item = (RSGroundItem) cur; RSTileItem item = (RSTileItem) cur;
ItemDespawned itemDespawned = new ItemDespawned(this, item); ItemDespawned itemDespawned = new ItemDespawned(this, item);
client.getCallbacks().post(ItemDespawned.class, itemDespawned); client.getCallbacks().post(ItemDespawned.class, itemDespawned);
} }
@@ -346,13 +482,13 @@ public abstract class RSTileMixin implements RSTile
lastGroundItems[z][x][y] = newQueue; lastGroundItems[z][x][y] = newQueue;
} }
RSGroundItem lastUnlink = client.getLastItemDespawn(); RSTileItem lastUnlink = client.getLastItemDespawn();
if (lastUnlink != null) if (lastUnlink != null)
{ {
client.setLastItemDespawn(null); client.setLastItemDespawn(null);
} }
RSGroundItemPile itemLayer = (RSGroundItemPile) getItemLayer(); RSTileItemPile itemLayer = (RSTileItemPile) getItemLayer();
if (itemLayer == null) if (itemLayer == null)
{ {
if (lastUnlink != null) if (lastUnlink != null)
@@ -382,7 +518,7 @@ public abstract class RSTileMixin implements RSTile
boolean forward = false; boolean forward = false;
if (head != previous) if (head != previous)
{ {
RSGroundItem prev = (RSGroundItem) previous; RSTileItem prev = (RSTileItem) previous;
if (x != prev.getX() || y != prev.getY()) if (x != prev.getX() || y != prev.getY())
{ {
current = prev; current = prev;
@@ -392,7 +528,7 @@ public abstract class RSTileMixin implements RSTile
RSNode next = head.getNext(); RSNode next = head.getNext();
if (current == null && head != next) if (current == null && head != next)
{ {
RSGroundItem n = (RSGroundItem) next; RSTileItem n = (RSTileItem) next;
if (x != n.getX() || y != n.getY()) if (x != n.getX() || y != n.getY())
{ {
current = n; current = n;
@@ -413,7 +549,7 @@ public abstract class RSTileMixin implements RSTile
do do
{ {
RSGroundItem item = (RSGroundItem) current; RSTileItem item = (RSTileItem) current;
item.setX(x); item.setX(x);
item.setY(y); item.setY(y);
@@ -424,142 +560,6 @@ public abstract class RSTileMixin implements RSTile
// Send spawn events for anything on this tile which is at the wrong location, which happens // Send spawn events for anything on this tile which is at the wrong location, which happens
// when the scene base changes // when the scene base changes
} while (current != head && (((RSGroundItem) current).getX() != x || ((RSGroundItem) current).getY() != y)); } while (current != head && (((RSTileItem) current).getX() != x || ((RSTileItem) current).getY() != y));
}
@Inject
@Override
public boolean hasLineOfSightTo(Tile other)
{
// Thanks to Henke for this method :)
if (this.getPlane() != other.getPlane())
{
return false;
}
CollisionData[] collisionData = client.getCollisionMaps();
if (collisionData == null)
{
return false;
}
int z = this.getPlane();
int[][] collisionDataFlags = collisionData[z].getFlags();
Point p1 = this.getSceneLocation();
Point p2 = other.getSceneLocation();
if (p1.getX() == p2.getX() && p1.getY() == p2.getY())
{
return true;
}
int dx = p2.getX() - p1.getX();
int dy = p2.getY() - p1.getY();
int dxAbs = Math.abs(dx);
int dyAbs = Math.abs(dy);
int xFlags = CollisionDataFlag.BLOCK_LINE_OF_SIGHT_FULL;
int yFlags = CollisionDataFlag.BLOCK_LINE_OF_SIGHT_FULL;
if (dx < 0)
{
xFlags |= CollisionDataFlag.BLOCK_LINE_OF_SIGHT_EAST;
}
else
{
xFlags |= CollisionDataFlag.BLOCK_LINE_OF_SIGHT_WEST;
}
if (dy < 0)
{
yFlags |= CollisionDataFlag.BLOCK_LINE_OF_SIGHT_NORTH;
}
else
{
yFlags |= CollisionDataFlag.BLOCK_LINE_OF_SIGHT_SOUTH;
}
if (dxAbs > dyAbs)
{
int x = p1.getX();
int yBig = p1.getY() << 16; // The y position is represented as a bigger number to handle rounding
int slope = (dy << 16) / dxAbs;
yBig += 0x8000; // Add half of a tile
if (dy < 0)
{
yBig--; // For correct rounding
}
int direction = dx < 0 ? -1 : 1;
while (x != p2.getX())
{
x += direction;
int y = yBig >>> 16;
if ((collisionDataFlags[x][y] & xFlags) != 0)
{
// Collision while traveling on the x axis
return false;
}
yBig += slope;
int nextY = yBig >>> 16;
if (nextY != y && (collisionDataFlags[x][nextY] & yFlags) != 0)
{
// Collision while traveling on the y axis
return false;
}
}
}
else
{
int y = p1.getY();
int xBig = p1.getX() << 16; // The x position is represented as a bigger number to handle rounding
int slope = (dx << 16) / dyAbs;
xBig += 0x8000; // Add half of a tile
if (dx < 0)
{
xBig--; // For correct rounding
}
int direction = dy < 0 ? -1 : 1;
while (y != p2.getY())
{
y += direction;
int x = xBig >>> 16;
if ((collisionDataFlags[x][y] & yFlags) != 0)
{
// Collision while traveling on the y axis
return false;
}
xBig += slope;
int nextX = xBig >>> 16;
if (nextX != x && (collisionDataFlags[nextX][y] & xFlags) != 0)
{
// Collision while traveling on the x axis
return false;
}
}
}
// No collision
return true;
}
@Inject
@Override
public List<Item> getGroundItems()
{
ItemLayer layer = this.getItemLayer();
if (layer == null)
{
return null;
}
List<Item> result = new ArrayList<Item>();
Node node = layer.getBottom();
while (node instanceof Item)
{
result.add((Item) node);
node = node.getNext();
}
return result;
} }
} }
@@ -15,14 +15,14 @@ import net.runelite.rs.api.RSBoundaryObject;
import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSClient;
import net.runelite.rs.api.RSFloorDecoration; import net.runelite.rs.api.RSFloorDecoration;
import net.runelite.rs.api.RSGameObject; import net.runelite.rs.api.RSGameObject;
import net.runelite.rs.api.RSGroundItemPile; import net.runelite.rs.api.RSTileItemPile;
import net.runelite.rs.api.RSWallDecoration; import net.runelite.rs.api.RSWallDecoration;
@Mixins({ @Mixins({
@Mixin(RSWallDecoration.class), @Mixin(RSWallDecoration.class),
@Mixin(RSGameObject.class), @Mixin(RSGameObject.class),
@Mixin(RSFloorDecoration.class), @Mixin(RSFloorDecoration.class),
@Mixin(RSGroundItemPile.class), @Mixin(RSTileItemPile.class),
@Mixin(RSBoundaryObject.class) @Mixin(RSBoundaryObject.class)
}) })
public abstract class RSTileObjectMixin implements TileObject public abstract class RSTileObjectMixin implements TileObject
@@ -609,7 +609,7 @@ public interface RSClient extends RSGameShell, Client
void setObjectDefinitionLowDetail(boolean lowDetail); void setObjectDefinitionLowDetail(boolean lowDetail);
@Construct @Construct
RSGroundItem createItem(); RSTileItem createItem();
@Import("Interpreter_intStackSize") @Import("Interpreter_intStackSize")
@Override @Override
@@ -833,9 +833,9 @@ public interface RSClient extends RSGameShell, Client
@Override @Override
int getOculusOrbFocalPointY(); int getOculusOrbFocalPointY();
RSGroundItem getLastItemDespawn(); RSTileItem getLastItemDespawn();
void setLastItemDespawn(RSGroundItem lastItemDespawn); void setLastItemDespawn(RSTileItem lastItemDespawn);
@Construct @Construct
RSWidget createWidget(); RSWidget createWidget();
@@ -16,7 +16,7 @@ public interface RSTile extends Tile
@Override @Override
GameObject[] getGameObjects(); GameObject[] getGameObjects();
@Import("groundItemPile") @Import("tileItemPile")
@Override @Override
ItemLayer getItemLayer(); ItemLayer getItemLayer();
@@ -1,10 +1,10 @@
package net.runelite.rs.api; package net.runelite.rs.api;
import net.runelite.api.Item; import net.runelite.api.Item;
import net.runelite.api.Tile; import net.runelite.api.Tile;
import net.runelite.api.TileItem;
import net.runelite.mapping.Import; import net.runelite.mapping.Import;
public interface RSGroundItem extends RSEntity, Item public interface RSTileItem extends RSEntity, TileItem, Item
{ {
@Import("id") @Import("id")
@Override @Override
@@ -3,7 +3,7 @@ package net.runelite.rs.api;
import net.runelite.api.ItemLayer; import net.runelite.api.ItemLayer;
import net.runelite.mapping.Import; import net.runelite.mapping.Import;
public interface RSGroundItemPile extends ItemLayer public interface RSTileItemPile extends ItemLayer
{ {
@Import("x") @Import("x")
int getX(); int getX();
@@ -255,9 +255,9 @@ public class BufferedSource implements Runnable {
GrandExchangeOfferWorldComparator.leftTitleSprite = BuddyRankComparator.convertJpgToSprite(var4); GrandExchangeOfferWorldComparator.leftTitleSprite = BuddyRankComparator.convertJpgToSprite(var4);
NPC.rightTitleSprite = GrandExchangeOfferWorldComparator.leftTitleSprite.mirrorHorizontally(); NPC.rightTitleSprite = GrandExchangeOfferWorldComparator.leftTitleSprite.mirrorHorizontally();
if ((Client.worldProperties & 536870912) != 0) { if ((Client.worldProperties & 536870912) != 0) {
GroundItem.logoSprite = class215.SpriteBuffer_getIndexedSpriteByName(var1, "logo_deadman_mode", ""); TileItem.logoSprite = class215.SpriteBuffer_getIndexedSpriteByName(var1, "logo_deadman_mode", "");
} else { } else {
GroundItem.logoSprite = class215.SpriteBuffer_getIndexedSpriteByName(var1, "logo", ""); TileItem.logoSprite = class215.SpriteBuffer_getIndexedSpriteByName(var1, "logo", "");
} }
Login.titleboxSprite = class215.SpriteBuffer_getIndexedSpriteByName(var1, "titlebox", ""); Login.titleboxSprite = class215.SpriteBuffer_getIndexedSpriteByName(var1, "titlebox", "");
@@ -315,7 +315,7 @@ public class BufferedSource implements Runnable {
ScriptEvent.loginBoxCenter = Login.loginBoxX + 180; ScriptEvent.loginBoxCenter = Login.loginBoxX + 180;
GrandExchangeOfferWorldComparator.leftTitleSprite.drawAt(Login.xPadding, 0); GrandExchangeOfferWorldComparator.leftTitleSprite.drawAt(Login.xPadding, 0);
NPC.rightTitleSprite.drawAt(Login.xPadding + 382, 0); NPC.rightTitleSprite.drawAt(Login.xPadding + 382, 0);
GroundItem.logoSprite.drawAt(Login.xPadding + 382 - GroundItem.logoSprite.subWidth / 2, 18); TileItem.logoSprite.drawAt(Login.xPadding + 382 - TileItem.logoSprite.subWidth / 2, 18);
} }
} }
} }
+1 -1
View File
@@ -3722,7 +3722,7 @@ public final class Client extends GameShell implements Usernamed {
if (ServerPacket.field2161 == var1.serverPacket) { if (ServerPacket.field2161 == var1.serverPacket) {
var16 = var3.method5532(); var16 = var3.method5532();
GroundItemPile.method2764(var16); TileItemPile.method2764(var16);
field888[++field671 - 1 & 31] = var16 & 32767; field888[++field671 - 1 & 31] = var16 & 32767;
var1.serverPacket = null; var1.serverPacket = null;
return true; return true;
@@ -266,7 +266,7 @@ public class ClientPreferences {
HealthBarUpdate.Interpreter_intStackSize -= 2; HealthBarUpdate.Interpreter_intStackSize -= 2;
var10 = Interpreter.Interpreter_intStack[HealthBarUpdate.Interpreter_intStackSize]; var10 = Interpreter.Interpreter_intStack[HealthBarUpdate.Interpreter_intStackSize];
var4 = Interpreter.Interpreter_intStack[HealthBarUpdate.Interpreter_intStackSize + 1]; var4 = Interpreter.Interpreter_intStack[HealthBarUpdate.Interpreter_intStackSize + 1];
Message var15 = GroundItem.method2049(var10, var4); Message var15 = TileItem.method2049(var10, var4);
if (var15 != null) { if (var15 != null) {
Interpreter.Interpreter_intStack[++HealthBarUpdate.Interpreter_intStackSize - 1] = var15.count; Interpreter.Interpreter_intStack[++HealthBarUpdate.Interpreter_intStackSize - 1] = var15.count;
Interpreter.Interpreter_intStack[++HealthBarUpdate.Interpreter_intStackSize - 1] = var15.cycle; Interpreter.Interpreter_intStack[++HealthBarUpdate.Interpreter_intStackSize - 1] = var15.cycle;
@@ -259,10 +259,10 @@ public class FloorOverlayDefinition extends DualNode {
int var4 = var0 & var2 - 1; int var4 = var0 & var2 - 1;
int var5 = var1 / var2; int var5 = var1 / var2;
int var6 = var1 & var2 - 1; int var6 = var1 & var2 - 1;
int var7 = GroundItemPile.method2765(var3, var5); int var7 = TileItemPile.method2765(var3, var5);
int var8 = GroundItemPile.method2765(var3 + 1, var5); int var8 = TileItemPile.method2765(var3 + 1, var5);
int var9 = GroundItemPile.method2765(var3, var5 + 1); int var9 = TileItemPile.method2765(var3, var5 + 1);
int var10 = GroundItemPile.method2765(var3 + 1, var5 + 1); int var10 = TileItemPile.method2765(var3 + 1, var5 + 1);
int var11 = class4.method49(var7, var8, var4, var2); int var11 = class4.method49(var7, var8, var4, var2);
int var12 = class4.method49(var9, var10, var4, var2); int var12 = class4.method49(var9, var10, var4, var2);
return class4.method49(var11, var12, var6, var2); return class4.method49(var11, var12, var6, var2);
+4 -4
View File
@@ -216,10 +216,10 @@ public class Frames extends DualNode {
ModelData0.field1871 = (var11 + var15) / 2; ModelData0.field1871 = (var11 + var15) / 2;
ViewportMouse.field1745 = (var12 + var14) / 2; ViewportMouse.field1745 = (var12 + var14) / 2;
ViewportMouse.field1746 = (var16 + var17) / 2; ViewportMouse.field1746 = (var16 + var17) / 2;
GroundItem.field1242 = (var15 - var11) / 2; TileItem.field1242 = (var15 - var11) / 2;
GrandExchangeEvent.field48 = (var14 - var12) / 2; GrandExchangeEvent.field48 = (var14 - var12) / 2;
Canvas.field422 = (var17 - var16) / 2; Canvas.field422 = (var17 - var16) / 2;
ScriptFrame.field527 = Math.abs(GroundItem.field1242); ScriptFrame.field527 = Math.abs(TileItem.field1242);
ViewportMouse.field1741 = Math.abs(GrandExchangeEvent.field48); ViewportMouse.field1741 = Math.abs(GrandExchangeEvent.field48);
MenuAction.field1160 = Math.abs(Canvas.field422); MenuAction.field1160 = Math.abs(Canvas.field422);
} }
@@ -245,9 +245,9 @@ public class Frames extends DualNode {
if (Math.abs(var13 * GrandExchangeEvent.field48 - var12 * Canvas.field422) > var17 * ViewportMouse.field1741 + var16 * MenuAction.field1160) { if (Math.abs(var13 * GrandExchangeEvent.field48 - var12 * Canvas.field422) > var17 * ViewportMouse.field1741 + var16 * MenuAction.field1160) {
return false; return false;
} }
if (Math.abs(var11 * Canvas.field422 - var13 * GroundItem.field1242) > var8 * MenuAction.field1160 + var17 * ScriptFrame.field527) { if (Math.abs(var11 * Canvas.field422 - var13 * TileItem.field1242) > var8 * MenuAction.field1160 + var17 * ScriptFrame.field527) {
return false; return false;
} }
return Math.abs(var12 * GroundItem.field1242 - var11 * GrandExchangeEvent.field48) <= var16 * ScriptFrame.field527 + var8 * ViewportMouse.field1741; return Math.abs(var12 * TileItem.field1242 - var11 * GrandExchangeEvent.field48) <= var16 * ScriptFrame.field527 + var8 * ViewportMouse.field1741;
} }
} }
@@ -142,10 +142,10 @@ final class GrandExchangeOfferWorldComparator implements Comparator {
scene.removeGroundItemPile(class42.plane, var0, var1); scene.removeGroundItemPile(class42.plane, var0, var1);
} else { } else {
long var3 = -99999999L; long var3 = -99999999L;
GroundItem var5 = null; TileItem var5 = null;
GroundItem var6; TileItem var6;
for (var6 = (GroundItem)var2.last(); var6 != null; var6 = (GroundItem)var2.previous()) { for (var6 = (TileItem)var2.last(); var6 != null; var6 = (TileItem)var2.previous()) {
ItemDefinition var7 = WorldMapArea.getItemDefinition(var6.id); ItemDefinition var7 = WorldMapArea.getItemDefinition(var6.id);
long var8 = (long)var7.price; long var8 = (long)var7.price;
if (var7.isStackable == 1) { if (var7.isStackable == 1) {
@@ -162,10 +162,10 @@ final class GrandExchangeOfferWorldComparator implements Comparator {
scene.removeGroundItemPile(class42.plane, var0, var1); scene.removeGroundItemPile(class42.plane, var0, var1);
} else { } else {
var2.addLast(var5); var2.addLast(var5);
GroundItem var12 = null; TileItem var12 = null;
GroundItem var11 = null; TileItem var11 = null;
for (var6 = (GroundItem)var2.last(); var6 != null; var6 = (GroundItem)var2.previous()) { for (var6 = (TileItem)var2.last(); var6 != null; var6 = (TileItem)var2.previous()) {
if (var5.id != var6.id) { if (var5.id != var6.id) {
if (var12 == null) { if (var12 == null) {
var12 = var6; var12 = var6;
+1 -1
View File
@@ -413,7 +413,7 @@ public class Messages {
var16 = Client.getWidgetChild(var1, var0); var16 = Client.getWidgetChild(var1, var0);
if (var16 != null) { if (var16 != null) {
WorldMapID.method542(); WorldMapID.method542();
GroundItem.method2053(var1, var0, HealthBar.method1957(class268.getWidgetClickMask(var16)), var16.itemId); TileItem.method2053(var1, var0, HealthBar.method1957(class268.getWidgetClickMask(var16)), var16.itemId);
Client.isItemSelected = 0; Client.isItemSelected = 0;
Client.selectedSpellActionName = FontName.method5318(var16); Client.selectedSpellActionName = FontName.method5318(var16);
if (Client.selectedSpellActionName == null) { if (Client.selectedSpellActionName == null) {
@@ -357,7 +357,7 @@ public class MusicPatch extends Node {
var32 = var41 * (var30 - var44) + (var30 - var44) / 2; var32 = var41 * (var30 - var44) + (var30 - var44) / 2;
for (var33 = var44; var33 < var30; ++var33) { for (var33 = var44; var33 < var30; ++var33) {
var34 = GroundItemPile.method2767(var32, var30 - var44); var34 = TileItemPile.method2767(var32, var30 - var44);
this.field2476[var33] = (byte)(var34 * this.field2476[var33] + 32 >> 6); this.field2476[var33] = (byte)(var34 * this.field2476[var33] + 32 >> 6);
var32 += var31 - var41; var32 += var31 - var41;
} }
@@ -405,7 +405,7 @@ public class MusicPatch extends Node {
var32 = var47 * (var30 - var44) + (var30 - var44) / 2; var32 = var47 * (var30 - var44) + (var30 - var44) / 2;
for (var33 = var44; var33 < var30; ++var33) { for (var33 = var44; var33 < var30; ++var33) {
var34 = GroundItemPile.method2767(var32, var30 - var44); var34 = TileItemPile.method2767(var32, var30 - var44);
int var35 = var34 + (this.field2477[var33] & 255); int var35 = var34 + (this.field2477[var33] & 255);
if (var35 < 0) { if (var35 < 0) {
var35 = 0; var35 = 0;
@@ -58,7 +58,7 @@ public abstract class RouteStrategy {
class197.FloorUnderlayDefinition_clearCached(); class197.FloorUnderlayDefinition_clearCached();
FloorUnderlayDefinition.FloorUnderlayDefinition_cached.clear(); FloorUnderlayDefinition.FloorUnderlayDefinition_cached.clear();
KitDefinition.KitDefinition_cached.clear(); KitDefinition.KitDefinition_cached.clear();
GroundItemPile.ObjectDefinition_clearCached(); TileItemPile.ObjectDefinition_clearCached();
AbstractWorldMapIcon.NpcDefinition_clearCached(); AbstractWorldMapIcon.NpcDefinition_clearCached();
ItemDefinition.ItemDefinition_cached.clear(); ItemDefinition.ItemDefinition_cached.clear();
ItemDefinition.ItemDefinition_cachedModels.clear(); ItemDefinition.ItemDefinition_cachedModels.clear();
+5 -5
View File
@@ -383,7 +383,7 @@ public class Scene {
) )
@Export("newGroundItemPile") @Export("newGroundItemPile")
public void newGroundItemPile(int var1, int var2, int var3, int var4, Entity var5, long var6, Entity var8, Entity var9) { public void newGroundItemPile(int var1, int var2, int var3, int var4, Entity var5, long var6, Entity var8, Entity var9) {
GroundItemPile var10 = new GroundItemPile(); TileItemPile var10 = new TileItemPile();
var10.first = var5; var10.first = var5;
var10.x = var2 * 128 + 64; var10.x = var2 * 128 + 64;
var10.y = var3 * 128 + 64; var10.y = var3 * 128 + 64;
@@ -410,7 +410,7 @@ public class Scene {
this.tiles[var1][var2][var3] = new Tile(var1, var2, var3); this.tiles[var1][var2][var3] = new Tile(var1, var2, var3);
} }
this.tiles[var1][var2][var3].groundItemPile = var10; this.tiles[var1][var2][var3].tileItemPile = var10;
} }
@ObfuscatedName("c") @ObfuscatedName("c")
@@ -713,7 +713,7 @@ public class Scene {
public void removeGroundItemPile(int var1, int var2, int var3) { public void removeGroundItemPile(int var1, int var2, int var3) {
Tile var4 = this.tiles[var1][var2][var3]; Tile var4 = this.tiles[var1][var2][var3];
if (var4 != null) { if (var4 != null) {
var4.groundItemPile = null; var4.tileItemPile = null;
} }
} }
@@ -1470,7 +1470,7 @@ public class Scene {
var22.entity.draw(0, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var22.x * 4096 - Scene_cameraX, var22.tileHeight - Scene_cameraY, var22.y * 4096 - Scene_cameraZ, var22.tag); var22.entity.draw(0, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var22.x * 4096 - Scene_cameraX, var22.tileHeight - Scene_cameraY, var22.y * 4096 - Scene_cameraZ, var22.tag);
} }
GroundItemPile var23 = var3.groundItemPile; TileItemPile var23 = var3.tileItemPile;
if (var23 != null && var23.height == 0) { if (var23 != null && var23.height == 0) {
if (var23.second != null) { if (var23.second != null) {
var23.second.draw(0, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var23.x * 4096 - Scene_cameraX, var23.tileHeight - Scene_cameraY, var23.y * 4096 - Scene_cameraZ, var23.tag); var23.second.draw(0, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var23.x * 4096 - Scene_cameraX, var23.tileHeight - Scene_cameraY, var23.y * 4096 - Scene_cameraZ, var23.tag);
@@ -1688,7 +1688,7 @@ public class Scene {
var3.drawSecondary = false; var3.drawSecondary = false;
--tileUpdateCount; --tileUpdateCount;
GroundItemPile var32 = var3.groundItemPile; TileItemPile var32 = var3.tileItemPile;
if (var32 != null && var32.height != 0) { if (var32 != null && var32.height != 0) {
if (var32.second != null) { if (var32.second != null) {
var32.second.draw(0, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var32.x * 4096 - Scene_cameraX, var32.tileHeight - Scene_cameraY - var32.height, var32.y * 4096 - Scene_cameraZ, var32.tag); var32.second.draw(0, Scene_cameraPitchSine, Scene_cameraPitchCosine, Scene_cameraYawSine, Scene_cameraYawCosine, var32.x * 4096 - Scene_cameraX, var32.tileHeight - Scene_cameraY - var32.height, var32.y * 4096 - Scene_cameraZ, var32.tag);
+2 -2
View File
@@ -71,8 +71,8 @@ public final class Tile extends Node {
@ObfuscatedSignature( @ObfuscatedSignature(
signature = "Ldc;" signature = "Ldc;"
) )
@Export("groundItemPile") @Export("tileItemPile")
GroundItemPile groundItemPile; TileItemPile tileItemPile;
@ObfuscatedName("m") @ObfuscatedName("m")
@ObfuscatedGetter( @ObfuscatedGetter(
intValue = 52989903 intValue = 52989903
@@ -0,0 +1,87 @@
import net.runelite.mapping.Export;
import net.runelite.mapping.Implements;
import net.runelite.mapping.ObfuscatedGetter;
import net.runelite.mapping.ObfuscatedName;
import net.runelite.mapping.ObfuscatedSignature;
@ObfuscatedName("ch")
@Implements("TileItem")
public final class TileItem extends Entity {
@ObfuscatedName("i")
@ObfuscatedGetter(
intValue = 1900937269
)
static int field1242;
@ObfuscatedName("c")
@ObfuscatedSignature(
signature = "Llx;"
)
@Export("logoSprite")
static IndexedSprite logoSprite;
@ObfuscatedName("q")
@ObfuscatedGetter(
intValue = 1946972179
)
@Export("id")
int id;
@ObfuscatedName("w")
@ObfuscatedGetter(
intValue = -1304382567
)
@Export("quantity")
int quantity;
TileItem() {
}
@ObfuscatedName("c")
@ObfuscatedSignature(
signature = "(I)Ldm;",
garbageValue = "759381421"
)
@Export("getModel")
protected final Model getModel() {
return WorldMapArea.getItemDefinition(this.id).getModel(this.quantity);
}
@ObfuscatedName("q")
@ObfuscatedSignature(
signature = "(Lhp;B)V",
garbageValue = "97"
)
public static void method2054(AbstractArchive var0) {
StructDefinition.StructDefinition_archive = var0;
}
@ObfuscatedName("p")
@ObfuscatedSignature(
signature = "(III)Lbj;",
garbageValue = "308740376"
)
static Message method2049(int var0, int var1) {
ChatChannel var2 = (ChatChannel)Messages.Messages_channels.get(var0);
return var2.getMessage(var1);
}
@ObfuscatedName("hs")
@ObfuscatedSignature(
signature = "(IIIII)V",
garbageValue = "96373324"
)
static void method2053(int var0, int var1, int var2, int var3) {
Widget var4 = Client.getWidgetChild(var0, var1);
if (var4 != null && var4.onTargetEnter != null) {
ScriptEvent var5 = new ScriptEvent();
var5.widget = var4;
var5.args = var4.onTargetEnter;
LoginPacket.runScriptEvent(var5);
}
Client.field812 = var3;
Client.isSpellSelected = true;
WorldMapEvent.field359 = var0;
Client.field848 = var1;
WorldMapCacheName.selectedSpellFlags = var2;
Strings.method4120(var4);
}
}
@@ -0,0 +1,109 @@
import net.runelite.mapping.Export;
import net.runelite.mapping.Implements;
import net.runelite.mapping.ObfuscatedGetter;
import net.runelite.mapping.ObfuscatedName;
import net.runelite.mapping.ObfuscatedSignature;
@ObfuscatedName("dc")
@Implements("TileItemPile")
public final class TileItemPile
{
@ObfuscatedName("q")
@ObfuscatedGetter(
intValue = -706647707
)
@Export("tileHeight")
int tileHeight;
@ObfuscatedName("w")
@ObfuscatedGetter(
intValue = -1749434399
)
@Export("x")
int x;
@ObfuscatedName("e")
@ObfuscatedGetter(
intValue = 1687183849
)
@Export("y")
int y;
@ObfuscatedName("p")
@ObfuscatedSignature(
signature = "Leo;"
)
@Export("first")
Entity first;
@ObfuscatedName("k")
@ObfuscatedSignature(
signature = "Leo;"
)
@Export("second")
Entity second;
@ObfuscatedName("l")
@ObfuscatedSignature(
signature = "Leo;"
)
@Export("third")
Entity third;
@ObfuscatedName("b")
@ObfuscatedGetter(
longValue = -6836359089398778317L
)
@Export("tag")
long tag;
@ObfuscatedName("i")
@ObfuscatedGetter(
intValue = -1167512637
)
@Export("height")
int height;
TileItemPile() {
}
@ObfuscatedName("k")
@ObfuscatedSignature(
signature = "(III)I",
garbageValue = "-989207473"
)
public static int method2767(int var0, int var1) {
int var2 = var0 >>> 31;
return (var0 + var2) / var1 - var2;
}
@ObfuscatedName("l")
@ObfuscatedSignature(
signature = "(IB)V",
garbageValue = "-23"
)
static void method2764(int var0) {
ItemContainer var1 = (ItemContainer)ItemContainer.itemContainers.get((long)var0);
if (var1 != null) {
var1.remove();
}
}
@ObfuscatedName("v")
@ObfuscatedSignature(
signature = "(III)I",
garbageValue = "1314012151"
)
static final int method2765(int var0, int var1) {
int var2 = MouseHandler.method1021(var0 - 1, var1 - 1) + MouseHandler.method1021(1 + var0, var1 - 1) + MouseHandler.method1021(var0 - 1, 1 + var1) + MouseHandler.method1021(1 + var0, 1 + var1);
int var3 = MouseHandler.method1021(var0 - 1, var1) + MouseHandler.method1021(var0 + 1, var1) + MouseHandler.method1021(var0, var1 - 1) + MouseHandler.method1021(var0, var1 + 1);
int var4 = MouseHandler.method1021(var0, var1);
return var2 / 16 + var3 / 8 + var4 / 4;
}
@ObfuscatedName("y")
@ObfuscatedSignature(
signature = "(B)V",
garbageValue = "76"
)
@Export("ObjectDefinition_clearCached")
public static void ObjectDefinition_clearCached() {
ObjectDefinition.ObjectDefinition_cached.clear();
ObjectDefinition.ObjectDefinition_cachedModelData.clear();
ObjectDefinition.ObjectDefinition_cachedEntities.clear();
ObjectDefinition.ObjectDefinition_cachedModels.clear();
}
}
+2 -2
View File
@@ -5,7 +5,7 @@ import net.runelite.mapping.ObfuscatedName;
import net.runelite.mapping.ObfuscatedSignature; import net.runelite.mapping.ObfuscatedSignature;
@ObfuscatedName("jr") @ObfuscatedName("jr")
@Implements("Timer") @Implements("Timer") //GroundItem
public class Timer { public class Timer {
@ObfuscatedName("q") @ObfuscatedName("q")
@ObfuscatedGetter( @ObfuscatedGetter(
@@ -427,7 +427,7 @@ public class Timer {
ObjectDefinition.ObjectDefinition_modelsArchive = var2; ObjectDefinition.ObjectDefinition_modelsArchive = var2;
ObjectDefinition.ObjectDefinition_isLowDetail = var34; ObjectDefinition.ObjectDefinition_isLowDetail = var34;
FaceNormal.setNpcDefinitionArchives(class215.archive2, NPCDefinition.archive7); FaceNormal.setNpcDefinitionArchives(class215.archive2, NPCDefinition.archive7);
GroundItem.method2054(class215.archive2); TileItem.method2054(class215.archive2);
Archive var27 = class215.archive2; Archive var27 = class215.archive2;
Archive var5 = NPCDefinition.archive7; Archive var5 = NPCDefinition.archive7;
boolean var6 = Client.isMembersWorld; boolean var6 = Client.isMembersWorld;
@@ -150,7 +150,7 @@ public class VarbitDefinition extends DualNode {
Login.worldSelectOpen = false; Login.worldSelectOpen = false;
GrandExchangeOfferWorldComparator.leftTitleSprite.drawAt(Login.xPadding, 0); GrandExchangeOfferWorldComparator.leftTitleSprite.drawAt(Login.xPadding, 0);
NPC.rightTitleSprite.drawAt(Login.xPadding + 382, 0); NPC.rightTitleSprite.drawAt(Login.xPadding + 382, 0);
GroundItem.logoSprite.drawAt(Login.xPadding + 382 - GroundItem.logoSprite.subWidth / 2, 18); TileItem.logoSprite.drawAt(Login.xPadding + 382 - TileItem.logoSprite.subWidth / 2, 18);
break; break;
} }
@@ -160,7 +160,7 @@ public class VarbitDefinition extends DualNode {
Login.worldSelectOpen = false; Login.worldSelectOpen = false;
GrandExchangeOfferWorldComparator.leftTitleSprite.drawAt(Login.xPadding, 0); GrandExchangeOfferWorldComparator.leftTitleSprite.drawAt(Login.xPadding, 0);
NPC.rightTitleSprite.drawAt(Login.xPadding + 382, 0); NPC.rightTitleSprite.drawAt(Login.xPadding + 382, 0);
GroundItem.logoSprite.drawAt(Login.xPadding + 382 - GroundItem.logoSprite.subWidth / 2, 18); TileItem.logoSprite.drawAt(Login.xPadding + 382 - TileItem.logoSprite.subWidth / 2, 18);
} else { } else {
if (Login.worldSelectPage > 0 && Login.worldSelectLeftSprite != null && MouseHandler.MouseHandler_lastPressedX >= 0 && MouseHandler.MouseHandler_lastPressedX <= Login.worldSelectLeftSprite.subWidth && MouseHandler.MouseHandler_lastPressedY >= ParamDefinition.canvasHeight / 2 - 50 && MouseHandler.MouseHandler_lastPressedY <= ParamDefinition.canvasHeight / 2 + 50) { if (Login.worldSelectPage > 0 && Login.worldSelectLeftSprite != null && MouseHandler.MouseHandler_lastPressedX >= 0 && MouseHandler.MouseHandler_lastPressedX <= Login.worldSelectLeftSprite.subWidth && MouseHandler.MouseHandler_lastPressedY >= ParamDefinition.canvasHeight / 2 - 50 && MouseHandler.MouseHandler_lastPressedY <= ParamDefinition.canvasHeight / 2 + 50) {
--Login.worldSelectPage; --Login.worldSelectPage;
@@ -177,7 +177,7 @@ public class VarbitDefinition extends DualNode {
Login.worldSelectOpen = false; Login.worldSelectOpen = false;
GrandExchangeOfferWorldComparator.leftTitleSprite.drawAt(Login.xPadding, 0); GrandExchangeOfferWorldComparator.leftTitleSprite.drawAt(Login.xPadding, 0);
NPC.rightTitleSprite.drawAt(Login.xPadding + 382, 0); NPC.rightTitleSprite.drawAt(Login.xPadding + 382, 0);
GroundItem.logoSprite.drawAt(Login.xPadding + 382 - GroundItem.logoSprite.subWidth / 2, 18); TileItem.logoSprite.drawAt(Login.xPadding + 382 - TileItem.logoSprite.subWidth / 2, 18);
break; break;
} }
+4 -4
View File
@@ -137,7 +137,7 @@ final class class1 implements class0 {
} }
} else { } else {
GroundItem var32; TileItem var32;
if (class185.field2321 == var0) { if (class185.field2321 == var0) {
var2 = var1.method5722(); var2 = var1.method5722();
var3 = (var2 >> 4 & 7) + DefaultsGroup.field3819; var3 = (var2 >> 4 & 7) + DefaultsGroup.field3819;
@@ -146,7 +146,7 @@ final class class1 implements class0 {
if (var3 >= 0 && var4 >= 0 && var3 < 104 && var4 < 104) { if (var3 >= 0 && var4 >= 0 && var3 < 104 && var4 < 104) {
NodeDeque var31 = Client.groundItems[class42.plane][var3][var4]; NodeDeque var31 = Client.groundItems[class42.plane][var3][var4];
if (var31 != null) { if (var31 != null) {
for (var32 = (GroundItem)var31.last(); var32 != null; var32 = (GroundItem)var31.previous()) { for (var32 = (TileItem)var31.last(); var32 != null; var32 = (TileItem)var31.previous()) {
if ((var5 & 32767) == var32.id) { if ((var5 & 32767) == var32.id) {
var32.remove(); var32.remove();
break; break;
@@ -204,7 +204,7 @@ final class class1 implements class0 {
if (var6 >= 0 && var7 >= 0 && var6 < 104 && var7 < 104) { if (var6 >= 0 && var7 >= 0 && var6 < 104 && var7 < 104) {
NodeDeque var42 = Client.groundItems[class42.plane][var6][var7]; NodeDeque var42 = Client.groundItems[class42.plane][var6][var7];
if (var42 != null) { if (var42 != null) {
for (GroundItem var34 = (GroundItem)var42.last(); var34 != null; var34 = (GroundItem)var42.previous()) { for (TileItem var34 = (TileItem)var42.last(); var34 != null; var34 = (TileItem)var42.previous()) {
if ((var2 & 32767) == var34.id && var4 == var34.quantity) { if ((var2 & 32767) == var34.id && var4 == var34.quantity) {
var34.quantity = var3; var34.quantity = var3;
break; break;
@@ -222,7 +222,7 @@ final class class1 implements class0 {
var5 = (var4 >> 4 & 7) + DefaultsGroup.field3819; var5 = (var4 >> 4 & 7) + DefaultsGroup.field3819;
var6 = (var4 & 7) + ChatChannel.field1306; var6 = (var4 & 7) + ChatChannel.field1306;
if (var5 >= 0 && var6 >= 0 && var5 < 104 && var6 < 104) { if (var5 >= 0 && var6 >= 0 && var5 < 104 && var6 < 104) {
var32 = new GroundItem(); var32 = new TileItem();
var32.id = var3; var32.id = var3;
var32.quantity = var2; var32.quantity = var2;
if (Client.groundItems[class42.plane][var5][var6] == null) { if (Client.groundItems[class42.plane][var5][var6] == null) {
+1 -1
View File
@@ -23,7 +23,7 @@ public class class189 {
} else { } else {
GrandExchangeOfferWorldComparator.leftTitleSprite.drawAt(Login.xPadding, 0); GrandExchangeOfferWorldComparator.leftTitleSprite.drawAt(Login.xPadding, 0);
NPC.rightTitleSprite.drawAt(Login.xPadding + 382, 0); NPC.rightTitleSprite.drawAt(Login.xPadding + 382, 0);
GroundItem.logoSprite.drawAt(Login.xPadding + 382 - GroundItem.logoSprite.subWidth / 2, 18); TileItem.logoSprite.drawAt(Login.xPadding + 382 - TileItem.logoSprite.subWidth / 2, 18);
int var4; int var4;
if (Client.gameState == 0 || Client.gameState == 5) { if (Client.gameState == 0 || Client.gameState == 5) {
byte var3 = 20; byte var3 = 20;
+1 -1
View File
@@ -253,7 +253,7 @@ final class class2 implements class0 {
Messages.method2163(var20 + 1, var9.id, var9.childIndex, var9.itemId, ""); Messages.method2163(var20 + 1, var9.id, var9.childIndex, var9.itemId, "");
} else if (var20 == 10) { } else if (var20 == 10) {
WorldMapID.method542(); WorldMapID.method542();
GroundItem.method2053(var9.id, var9.childIndex, HealthBar.method1957(class268.getWidgetClickMask(var9)), var9.itemId); TileItem.method2053(var9.id, var9.childIndex, HealthBar.method1957(class268.getWidgetClickMask(var9)), var9.itemId);
Client.selectedSpellActionName = FontName.method5318(var9); Client.selectedSpellActionName = FontName.method5318(var9);
if (Client.selectedSpellActionName == null) { if (Client.selectedSpellActionName == null) {
Client.selectedSpellActionName = "null"; Client.selectedSpellActionName = "null";
+1 -1
View File
@@ -340,7 +340,7 @@ public class class65 extends RouteStrategy {
if (var17 == 3) { if (var17 == 3) {
NodeDeque var33 = Client.groundItems[class42.plane][var15][var16]; NodeDeque var33 = Client.groundItems[class42.plane][var15][var16];
if (var33 != null) { if (var33 != null) {
for (GroundItem var37 = (GroundItem)var33.first(); var37 != null; var37 = (GroundItem)var33.next()) { for (TileItem var37 = (TileItem)var33.first(); var37 != null; var37 = (TileItem)var33.next()) {
ItemDefinition var35 = WorldMapArea.getItemDefinition(var37.id); ItemDefinition var35 = WorldMapArea.getItemDefinition(var37.id);
if (Client.isItemSelected == 1) { if (Client.isItemSelected == 1) {
class188.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + ClientPreferences.colorStartTag(16748608) + var35.name, 16, var37.id, var15, var16); class188.insertMenuItemNoShift("Use", Client.selectedItemName + " " + "->" + " " + ClientPreferences.colorStartTag(16748608) + var35.name, 16, var37.id, var15, var16);
+1 -1
View File
@@ -400,7 +400,7 @@ public class class96 {
Login.runesSprite = null; Login.runesSprite = null;
GrandExchangeOfferWorldComparator.leftTitleSprite = null; GrandExchangeOfferWorldComparator.leftTitleSprite = null;
NPC.rightTitleSprite = null; NPC.rightTitleSprite = null;
GroundItem.logoSprite = null; TileItem.logoSprite = null;
Login.title_muteSprite = null; Login.title_muteSprite = null;
Login.options_buttons_0Sprite = null; Login.options_buttons_0Sprite = null;
Decimator.options_buttons_2Sprite = null; Decimator.options_buttons_2Sprite = null;