clues: make item requirements work with the runepouch

This commit is contained in:
Hydrox6
2020-04-19 13:43:19 +01:00
committed by Jordan Atwood
parent e9a1326fd4
commit 32ff64b30c
2 changed files with 110 additions and 1 deletions

View File

@@ -64,6 +64,7 @@ import net.runelite.api.Scene;
import net.runelite.api.ScriptID;
import net.runelite.api.Tile;
import net.runelite.api.TileObject;
import net.runelite.api.Varbits;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.events.ChatMessage;
@@ -95,6 +96,7 @@ import net.runelite.client.eventbus.Subscribe;
import net.runelite.client.events.ConfigChanged;
import net.runelite.client.events.OverlayMenuClicked;
import net.runelite.client.game.ItemManager;
import net.runelite.client.game.RunepouchRune;
import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDependency;
import net.runelite.client.plugins.PluginDescriptor;
@@ -143,6 +145,12 @@ public class ClueScrollPlugin extends Plugin
private static final Color HIGHLIGHT_HOVER_BORDER_COLOR = HIGHLIGHT_BORDER_COLOR.darker();
private static final Color HIGHLIGHT_FILL_COLOR = new Color(0, 255, 0, 20);
private static final String CLUE_TAG_NAME = "clue";
private static final Varbits[] RUNEPOUCH_AMOUNT_VARBITS = {
Varbits.RUNE_POUCH_AMOUNT1, Varbits.RUNE_POUCH_AMOUNT2, Varbits.RUNE_POUCH_AMOUNT3
};
private static final Varbits[] RUNEPOUCH_RUNE_VARBITS = {
Varbits.RUNE_POUCH_RUNE1, Varbits.RUNE_POUCH_RUNE2, Varbits.RUNE_POUCH_RUNE3
};
@Getter
private ClueScroll clue;
@@ -361,7 +369,36 @@ public class ClueScrollPlugin extends Plugin
return;
}
inventoryItems = event.getItemContainer().getItems();
if (event.getItemContainer().contains(ItemID.RUNE_POUCH) || event.getItemContainer().contains(ItemID.RUNE_POUCH_L))
{
// Clone the array so changes aren't passed back to the event.
inventoryItems = event.getItemContainer().getItems().clone();
List<Item> runePouchContents = getRunepouchContents();
if (!runePouchContents.isEmpty())
{
for (int i = 0; i < inventoryItems.length; i++)
{
Item invItem = inventoryItems[i];
for (Item rune : runePouchContents)
{
if (invItem.getId() == rune.getId())
{
inventoryItems[i] = new Item(invItem.getId(), rune.getQuantity() + invItem.getQuantity());
runePouchContents.remove(rune);
break;
}
}
}
inventoryItems = ArrayUtils.addAll(inventoryItems, runePouchContents.toArray(new Item[0]));
}
}
else
{
inventoryItems = event.getItemContainer().getItems();
}
// Check if item was removed from inventory
if (clue != null && clueItemId != null)
@@ -393,6 +430,30 @@ public class ClueScrollPlugin extends Plugin
}
}
private List<Item> getRunepouchContents()
{
List<Item> items = new ArrayList<>();
for (int i = 0; i < RUNEPOUCH_AMOUNT_VARBITS.length; i++)
{
int amount = client.getVar(RUNEPOUCH_AMOUNT_VARBITS[i]);
if (amount <= 0)
{
continue;
}
int varbId = client.getVar(RUNEPOUCH_RUNE_VARBITS[i]);
RunepouchRune rune = RunepouchRune.getRune(varbId);
if (rune == null)
{
continue;
}
Item item = new Item(rune.getItemId(), amount);
items.add(item);
}
return items;
}
@Subscribe
public void onNpcSpawned(final NpcSpawned event)
{

View File

@@ -30,14 +30,22 @@ import com.google.inject.Inject;
import com.google.inject.name.Named;
import com.google.inject.testing.fieldbinder.Bind;
import com.google.inject.testing.fieldbinder.BoundFieldModule;
import java.util.Arrays;
import java.util.List;
import net.runelite.api.ChatMessageType;
import net.runelite.api.Client;
import net.runelite.api.InventoryID;
import net.runelite.api.Item;
import net.runelite.api.ItemContainer;
import net.runelite.api.ItemID;
import net.runelite.api.NPC;
import net.runelite.api.NullObjectID;
import net.runelite.api.Player;
import net.runelite.api.Varbits;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.events.ChatMessage;
import net.runelite.api.events.GameTick;
import net.runelite.api.events.ItemContainerChanged;
import net.runelite.api.events.MenuOptionClicked;
import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetInfo;
@@ -45,8 +53,11 @@ import net.runelite.client.game.ItemManager;
import net.runelite.client.plugins.banktags.TagManager;
import net.runelite.client.plugins.cluescrolls.clues.hotcold.HotColdLocation;
import net.runelite.client.ui.overlay.OverlayManager;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThat;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -183,4 +194,41 @@ public class ClueScrollPluginTest
plugin.onChatMessage(withdrawMessage);
assertNull(plugin.getActiveSTASHClue());
}
@Test
public void testThatRunepouchIsAddedToInventory()
{
ItemContainer container = mock(ItemContainer.class);
ItemContainerChanged event = new ItemContainerChanged(InventoryID.INVENTORY.getId(), container);
final Item[] inventory = {
new Item(ItemID.COINS_995, 100),
new Item(ItemID.MITHRIL_BAR, 1),
new Item(ItemID.MITHRIL_BAR, 1),
new Item(ItemID.MITHRIL_BAR, 1),
new Item(ItemID.SOUL_RUNE, 30),
new Item(ItemID.COSMIC_RUNE, 100),
new Item(ItemID.RUNE_POUCH, 1),
new Item(ItemID.SPADE, 1),
new Item(ItemID.CLUE_SCROLL_MASTER, 1)
};
when(container.getItems()).thenReturn(inventory);
when(container.contains(ItemID.RUNE_POUCH)).thenReturn(true);
when(client.getItemContainer(InventoryID.INVENTORY)).thenReturn(container);
when(client.getVar(Varbits.RUNE_POUCH_RUNE1)).thenReturn(9); // Cosmic Rune
when(client.getVar(Varbits.RUNE_POUCH_AMOUNT1)).thenReturn(20);
when(client.getVar(Varbits.RUNE_POUCH_RUNE3)).thenReturn(4); // Fire Rune
when(client.getVar(Varbits.RUNE_POUCH_AMOUNT3)).thenReturn(4000);
plugin.onItemContainerChanged(event);
assertFalse(Arrays.equals(inventory, plugin.getInventoryItems()));
List<Item> inventoryList = Arrays.asList(plugin.getInventoryItems());
assertThat(inventoryList, hasItem(new Item(ItemID.COSMIC_RUNE, 120)));
assertThat(inventoryList, hasItem(new Item(ItemID.FIRE_RUNE, 4000)));
}
}