runelite-client: update bank calculation and barrows calculation to use item mapping

This commit is contained in:
Adam
2018-05-28 11:11:11 -04:00
parent 12ac1b2c6c
commit 5f4268211c
3 changed files with 72 additions and 43 deletions

View File

@@ -163,6 +163,25 @@ public class ItemManager
return null;
}
/**
* Look up an item's price from the price cache
*
* @param itemId
* @return
*/
public ItemPrice getCachedItemPrice(int itemId)
{
itemId = ItemMapping.mapFirst(itemId);
ItemPrice itemPrice = itemPriceCache.getIfPresent(itemId);
if (itemPrice != null && itemPrice != EMPTY && itemPrice != NONE)
{
return itemPrice;
}
return null;
}
/**
* Look up bulk item prices asynchronously
*

View File

@@ -33,11 +33,13 @@ import javax.inject.Inject;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.ItemComposition;
import net.runelite.api.ItemID;
import static net.runelite.api.ItemID.COINS_995;
import static net.runelite.api.ItemID.PLATINUM_TOKEN;
import net.runelite.api.queries.BankItemQuery;
import net.runelite.api.widgets.WidgetItem;
import net.runelite.client.game.ItemManager;
import net.runelite.client.game.ItemMapping;
import net.runelite.client.util.QueryRunner;
import net.runelite.http.api.item.ItemPrice;
@@ -87,40 +89,49 @@ class BankCalculation
gePrice = haPrice = 0;
finished = false;
List<ItemComposition> itemCompositions = new ArrayList<>();
Map<Integer, WidgetItem> itemMap = new HashMap<>();
List<Integer> itemIds = new ArrayList<>();
// Generate our lists (and do some quick price additions)
for (WidgetItem widgetItem : widgetItems)
{
if (widgetItem.getId() <= 0 || widgetItem.getQuantity() == 0)
int quantity = widgetItem.getQuantity();
if (widgetItem.getId() <= 0 || quantity == 0)
{
continue;
}
if (widgetItem.getId() == COINS_995)
{
gePrice += widgetItem.getQuantity();
haPrice += widgetItem.getQuantity();
gePrice += quantity;
haPrice += quantity;
continue;
}
if (widgetItem.getId() == PLATINUM_TOKEN)
{
gePrice += widgetItem.getQuantity() * 1000L;
haPrice += widgetItem.getQuantity() * 1000L;
gePrice += quantity * 1000L;
haPrice += quantity * 1000L;
continue;
}
final ItemComposition itemComposition = itemManager.getItemComposition(widgetItem.getId());
itemCompositions.add(itemComposition);
itemMap.put(widgetItem.getId(), widgetItem);
if (config.showGE())
{
itemIds.add(widgetItem.getId());
}
if (config.showHA())
{
int price = itemComposition.getPrice();
if (price > 0)
{
haPrice += (long) Math.round(price * HIGH_ALCHEMY_CONSTANT) *
(long) quantity;
}
}
}
// Now do the calculations
@@ -145,14 +156,31 @@ class BankCalculation
try
{
for (ItemPrice itemPrice : itemPrices)
for (WidgetItem widgetItem : widgetItems)
{
if (itemPrice.getItem() == null)
int itemId = widgetItem.getId();
int quantity = widgetItem.getQuantity();
if (itemId <= 0 || quantity == 0
|| itemId == ItemID.COINS_995 || itemId == ItemID.PLATINUM_TOKEN)
{
continue; // cached no price
continue;
}
gePrice += (long) itemPrice.getPrice() * (long) itemMap.get(itemPrice.getItem().getId()).getQuantity();
long price = 0;
for (int mappedItemId : ItemMapping.map(itemId))
{
ItemPrice cachedItemPrice = itemManager.getCachedItemPrice(mappedItemId);
if (cachedItemPrice == null)
{
// this happens to items which have no ge price
continue;
}
price += cachedItemPrice.getPrice();
}
gePrice += price * quantity;
}
}
catch (Exception ex2)
@@ -169,20 +197,6 @@ class BankCalculation
{
finished = true;
}
if (config.showHA())
{
for (ItemComposition itemComposition : itemCompositions)
{
int price = itemComposition.getPrice();
if (price > 0)
{
haPrice += (long) Math.round(price * HIGH_ALCHEMY_CONSTANT) *
(long) itemMap.get(itemComposition.getId()).getQuantity();
}
}
}
}
private boolean isBankDifferent(WidgetItem[] widgetItems)

View File

@@ -29,11 +29,10 @@ import com.google.common.eventbus.Subscribe;
import com.google.inject.Provides;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import javax.inject.Inject;
import lombok.AccessLevel;
import lombok.Getter;
@@ -207,23 +206,19 @@ public class BarrowsPlugin extends Plugin
if (event.getGroupId() == WidgetID.BARROWS_REWARD_GROUP_ID && config.showChestValue())
{
ItemContainer barrowsRewardContainer = client.getItemContainer(InventoryID.BARROWS_REWARD);
Map<Integer, Integer> itemMap = new HashMap<>();
Item[] items = barrowsRewardContainer.getItems();
chestPrice = 0;
for (Item item : barrowsRewardContainer.getItems())
for (Item item : items)
{
if (item.getId() != -1)
if (item.getId() == COINS_995)
{
if (item.getId() == COINS_995)
{
chestPrice += item.getQuantity();
continue;
}
itemMap.put(item.getId(), item.getQuantity());
chestPrice += item.getQuantity();
}
}
CompletableFuture<ItemPrice[]> future = itemManager.getItemPriceBatch(itemMap.keySet());
CompletableFuture<ItemPrice[]> future = itemManager.getItemPriceBatch(
Arrays.stream(items).map(Item::getId).collect(Collectors.toList()));
future.whenComplete((ItemPrice[] itemPrices, Throwable ex) ->
{
if (ex != null)
@@ -242,14 +237,15 @@ public class BarrowsPlugin extends Plugin
try
{
for (ItemPrice itemPrice : itemPrices)
for (Item item : items)
{
if (itemPrice.getItem() == null)
ItemPrice cachedItemPrice = itemManager.getCachedItemPrice(item.getId());
if (cachedItemPrice == null)
{
continue; // cached no price
continue;
}
long itemStack = (long) itemPrice.getPrice() * (long) itemMap.get(itemPrice.getItem().getId());
long itemStack = (long) cachedItemPrice.getPrice() * (long) item.getQuantity();
chestPrice += itemStack;
}