Merge pull request #4639 from Abextm/item-prices

runelite-client: Always use the mapped price for items
This commit is contained in:
Tomas Slusny
2018-08-06 22:57:04 +02:00
committed by GitHub
9 changed files with 42 additions and 76 deletions

View File

@@ -27,12 +27,13 @@ package net.runelite.client.game;
import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader; import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache; import com.google.common.cache.LoadingCache;
import com.google.common.collect.ImmutableMap;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import java.awt.Color; import java.awt.Color;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.IOException; import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap; import java.util.Collections;
import java.util.concurrent.ConcurrentMap; 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;
@@ -44,6 +45,7 @@ import net.runelite.api.Client;
import static net.runelite.api.Constants.CLIENT_DEFAULT_ZOOM; import static net.runelite.api.Constants.CLIENT_DEFAULT_ZOOM;
import net.runelite.api.GameState; import net.runelite.api.GameState;
import net.runelite.api.ItemComposition; import net.runelite.api.ItemComposition;
import net.runelite.api.ItemID;
import net.runelite.api.SpritePixels; import net.runelite.api.SpritePixels;
import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameStateChanged;
import net.runelite.client.callback.ClientThread; import net.runelite.client.callback.ClientThread;
@@ -77,7 +79,7 @@ public class ItemManager
private final ItemClient itemClient = new ItemClient(); private final ItemClient itemClient = new ItemClient();
private final LoadingCache<String, SearchResult> itemSearches; private final LoadingCache<String, SearchResult> itemSearches;
private final ConcurrentMap<Integer, ItemPrice> itemPrices = new ConcurrentHashMap<>(); private Map<Integer, ItemPrice> itemPrices = Collections.emptyMap();
private final LoadingCache<ImageKey, AsyncBufferedImage> itemImages; private final LoadingCache<ImageKey, AsyncBufferedImage> itemImages;
private final LoadingCache<Integer, ItemComposition> itemCompositions; private final LoadingCache<Integer, ItemComposition> itemCompositions;
private final LoadingCache<OutlineKey, BufferedImage> itemOutlines; private final LoadingCache<OutlineKey, BufferedImage> itemOutlines;
@@ -147,11 +149,12 @@ public class ItemManager
ItemPrice[] prices = itemClient.getPrices(); ItemPrice[] prices = itemClient.getPrices();
if (prices != null) if (prices != null)
{ {
itemPrices.clear(); ImmutableMap.Builder<Integer, ItemPrice> map = ImmutableMap.builderWithExpectedSize(prices.length);
for (ItemPrice price : prices) for (ItemPrice price : prices)
{ {
itemPrices.put(price.getItem().getId(), price); map.put(price.getItem().getId(), price);
} }
itemPrices = map.build();
} }
log.debug("Loaded {} prices", itemPrices.size()); log.debug("Loaded {} prices", itemPrices.size());
@@ -174,13 +177,31 @@ public class ItemManager
/** /**
* Look up an item's price * Look up an item's price
* *
* @param itemId item id * @param itemID item id
* @return item price * @return item price
*/ */
public ItemPrice getItemPrice(int itemId) public int getItemPrice(int itemID)
{ {
itemId = ItemMapping.mapFirst(itemId); if (itemID == ItemID.COINS_995)
return itemPrices.get(itemId); {
return 1;
}
if (itemID == ItemID.PLATINUM_TOKEN)
{
return 1000;
}
int price = 0;
for (int mappedID : ItemMapping.map(itemID))
{
ItemPrice ip = itemPrices.get(mappedID);
if (ip != null)
{
price += ip.getPrice();
}
}
return price;
} }
/** /**

View File

@@ -38,9 +38,7 @@ import static net.runelite.api.ItemID.PLATINUM_TOKEN;
import net.runelite.api.queries.BankItemQuery; import net.runelite.api.queries.BankItemQuery;
import net.runelite.api.widgets.WidgetItem; import net.runelite.api.widgets.WidgetItem;
import net.runelite.client.game.ItemManager; import net.runelite.client.game.ItemManager;
import net.runelite.client.game.ItemMapping;
import net.runelite.client.util.QueryRunner; import net.runelite.client.util.QueryRunner;
import net.runelite.http.api.item.ItemPrice;
@Slf4j @Slf4j
class BankCalculation class BankCalculation
@@ -143,20 +141,7 @@ class BankCalculation
continue; continue;
} }
long price = 0; gePrice += (long) itemManager.getItemPrice(itemId) * quantity;
for (int mappedItemId : ItemMapping.map(itemId))
{
ItemPrice cachedItemPrice = itemManager.getItemPrice(mappedItemId);
if (cachedItemPrice == null)
{
// this happens to items which have no ge price
continue;
}
price += cachedItemPrice.getPrice();
}
gePrice += price * quantity;
} }
} }
} }

View File

@@ -62,7 +62,6 @@ import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.OverlayManager;
import net.runelite.client.util.StackFormatter; import net.runelite.client.util.StackFormatter;
import net.runelite.http.api.item.ItemPrice;
@PluginDescriptor( @PluginDescriptor(
name = "Barrows Brothers", name = "Barrows Brothers",
@@ -222,13 +221,7 @@ public class BarrowsPlugin extends Plugin
for (Item item : items) for (Item item : items)
{ {
ItemPrice cachedItemPrice = itemManager.getItemPrice(item.getId()); long itemStack = (long) itemManager.getItemPrice(item.getId()) * (long) item.getQuantity();
if (cachedItemPrice == null)
{
continue;
}
long itemStack = (long) cachedItemPrice.getPrice() * (long) item.getQuantity();
chestPrice += itemStack; chestPrice += itemStack;
} }

View File

@@ -70,7 +70,6 @@ import net.runelite.http.api.hiscore.HiscoreSkill;
import net.runelite.http.api.hiscore.SingleHiscoreSkillResult; import net.runelite.http.api.hiscore.SingleHiscoreSkillResult;
import net.runelite.http.api.hiscore.Skill; import net.runelite.http.api.hiscore.Skill;
import net.runelite.http.api.item.Item; import net.runelite.http.api.item.Item;
import net.runelite.http.api.item.ItemPrice;
import net.runelite.http.api.item.SearchResult; import net.runelite.http.api.item.SearchResult;
import net.runelite.http.api.kc.KillCountClient; import net.runelite.http.api.kc.KillCountClient;
@@ -480,7 +479,7 @@ public class ChatCommandsPlugin extends Plugin implements ChatboxInputListener
} }
int itemId = item.getId(); int itemId = item.getId();
ItemPrice itemPrice = itemManager.getItemPrice(itemId); int itemPrice = itemManager.getItemPrice(itemId);
final ChatMessageBuilder builder = new ChatMessageBuilder() final ChatMessageBuilder builder = new ChatMessageBuilder()
.append(ChatColorType.NORMAL) .append(ChatColorType.NORMAL)
@@ -490,7 +489,7 @@ public class ChatCommandsPlugin extends Plugin implements ChatboxInputListener
.append(ChatColorType.NORMAL) .append(ChatColorType.NORMAL)
.append(": GE average ") .append(": GE average ")
.append(ChatColorType.HIGHLIGHT) .append(ChatColorType.HIGHLIGHT)
.append(StackFormatter.formatNumber(itemPrice.getPrice())); .append(StackFormatter.formatNumber(itemPrice));
ItemComposition itemComposition = itemManager.getItemComposition(itemId); ItemComposition itemComposition = itemManager.getItemComposition(itemId);
if (itemComposition != null) if (itemComposition != null)

View File

@@ -53,7 +53,6 @@ import net.runelite.client.plugins.Plugin;
import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.plugins.PluginDescriptor;
import net.runelite.client.util.StackFormatter; import net.runelite.client.util.StackFormatter;
import net.runelite.http.api.examine.ExamineClient; import net.runelite.http.api.examine.ExamineClient;
import net.runelite.http.api.item.ItemPrice;
/** /**
* Submits exammine info to the api * Submits exammine info to the api
@@ -272,14 +271,9 @@ public class ExaminePlugin extends Plugin
final boolean note = itemComposition.getNote() != -1; final boolean note = itemComposition.getNote() != -1;
final int id = note ? itemComposition.getLinkedNoteId() : itemComposition.getId(); final int id = note ? itemComposition.getLinkedNoteId() : itemComposition.getId();
ItemPrice itemPrice = itemManager.getItemPrice(id);
if (itemPrice == null)
{
return;
}
int itemCompositionPrice = itemComposition.getPrice(); int itemCompositionPrice = itemComposition.getPrice();
final int gePrice = itemPrice == null ? 0 : itemPrice.getPrice(); final int gePrice = itemManager.getItemPrice(id);
final int alchPrice = itemCompositionPrice <= 0 ? 0 : Math.round(itemCompositionPrice * HIGH_ALCHEMY_CONSTANT); final int alchPrice = itemCompositionPrice <= 0 ? 0 : Math.round(itemCompositionPrice * HIGH_ALCHEMY_CONSTANT);
if (gePrice > 0 || alchPrice > 0) if (gePrice > 0 || alchPrice > 0)

View File

@@ -50,7 +50,6 @@ import net.runelite.client.ui.components.PluginErrorPanel;
import net.runelite.client.util.ImageUtil; import net.runelite.client.util.ImageUtil;
import net.runelite.client.util.RunnableExceptionLogger; import net.runelite.client.util.RunnableExceptionLogger;
import net.runelite.http.api.item.Item; import net.runelite.http.api.item.Item;
import net.runelite.http.api.item.ItemPrice;
import net.runelite.http.api.item.SearchResult; import net.runelite.http.api.item.SearchResult;
/** /**
@@ -222,10 +221,10 @@ class GrandExchangeSearchPanel extends JPanel
continue; continue;
} }
ItemPrice itemPrice = itemManager.getItemPrice(itemId); int itemPrice = itemManager.getItemPrice(itemId);
AsyncBufferedImage itemImage = itemManager.getImage(itemId); AsyncBufferedImage itemImage = itemManager.getImage(itemId);
itemsList.add(new GrandExchangeItems(itemImage, item.getName(), itemId, itemPrice != null ? itemPrice.getPrice() : 0, itemComp.getPrice() * 0.6)); itemsList.add(new GrandExchangeItems(itemImage, item.getName(), itemId, itemPrice, itemComp.getPrice() * 0.6));
// If using hotkey to lookup item, stop after finding match. // If using hotkey to lookup item, stop after finding match.
if (exactMatch && item.getName().equalsIgnoreCase(lookup)) if (exactMatch && item.getName().equalsIgnoreCase(lookup))

View File

@@ -76,7 +76,6 @@ import static net.runelite.client.plugins.grounditems.config.MenuHighlightMode.N
import static net.runelite.client.plugins.grounditems.config.MenuHighlightMode.OPTION; import static net.runelite.client.plugins.grounditems.config.MenuHighlightMode.OPTION;
import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.OverlayManager;
import net.runelite.client.util.ColorUtil; import net.runelite.client.util.ColorUtil;
import net.runelite.http.api.item.ItemPrice;
@PluginDescriptor( @PluginDescriptor(
name = "Ground Items", name = "Ground Items",
@@ -277,11 +276,7 @@ public class GroundItemsPlugin extends Plugin
} }
else else
{ {
final ItemPrice itemPrice = itemManager.getItemPrice(realItemId); groundItem.setGePrice(itemManager.getItemPrice(realItemId));
if (itemPrice != null)
{
groundItem.setGePrice(itemPrice.getPrice());
}
} }
return groundItem; return groundItem;
@@ -369,8 +364,8 @@ public class GroundItemsPlugin extends Plugin
final ItemComposition itemComposition = itemManager.getItemComposition(itemId); final ItemComposition itemComposition = itemManager.getItemComposition(itemId);
final int realItemId = itemComposition.getNote() != -1 ? itemComposition.getLinkedNoteId() : itemComposition.getId(); final int realItemId = itemComposition.getNote() != -1 ? itemComposition.getLinkedNoteId() : itemComposition.getId();
final ItemPrice itemPrice = itemManager.getItemPrice(realItemId); final int itemPrice = itemManager.getItemPrice(realItemId);
final int price = itemPrice == null ? itemComposition.getPrice() : itemPrice.getPrice(); final int price = itemPrice <= 0 ? itemComposition.getPrice() : itemPrice;
final int haPrice = Math.round(itemComposition.getPrice() * HIGH_ALCHEMY_CONSTANT) * quantity; final int haPrice = Math.round(itemComposition.getPrice() * HIGH_ALCHEMY_CONSTANT) * quantity;
final int gePrice = quantity * price; final int gePrice = quantity * price;
final Color hidden = getHidden(itemComposition.getName(), gePrice, haPrice, itemComposition.isTradeable()); final Color hidden = getHidden(itemComposition.getName(), gePrice, haPrice, itemComposition.isTradeable());

View File

@@ -45,7 +45,6 @@ import net.runelite.client.ui.overlay.tooltip.Tooltip;
import net.runelite.client.ui.overlay.tooltip.TooltipManager; import net.runelite.client.ui.overlay.tooltip.TooltipManager;
import net.runelite.client.util.ColorUtil; import net.runelite.client.util.ColorUtil;
import net.runelite.client.util.StackFormatter; import net.runelite.client.util.StackFormatter;
import net.runelite.http.api.item.ItemPrice;
class ItemPricesOverlay extends Overlay class ItemPricesOverlay extends Overlay
{ {
@@ -200,11 +199,7 @@ class ItemPricesOverlay extends Overlay
if (config.showGEPrice()) if (config.showGEPrice())
{ {
final ItemPrice price = itemManager.getItemPrice(id); gePrice = itemManager.getItemPrice(id);
if (price != null)
{
gePrice = price.getPrice();
}
} }
if (config.showHAValue()) if (config.showHAValue())
{ {

View File

@@ -42,7 +42,6 @@ import net.runelite.api.Client;
import net.runelite.api.InventoryID; import net.runelite.api.InventoryID;
import net.runelite.api.ItemComposition; import net.runelite.api.ItemComposition;
import net.runelite.api.ItemContainer; import net.runelite.api.ItemContainer;
import net.runelite.api.ItemID;
import net.runelite.api.NPC; import net.runelite.api.NPC;
import net.runelite.api.Player; import net.runelite.api.Player;
import net.runelite.api.SpriteID; import net.runelite.api.SpriteID;
@@ -60,7 +59,6 @@ import net.runelite.client.ui.ClientToolbar;
import net.runelite.client.ui.NavigationButton; import net.runelite.client.ui.NavigationButton;
import net.runelite.client.util.ImageUtil; import net.runelite.client.util.ImageUtil;
import net.runelite.client.util.Text; import net.runelite.client.util.Text;
import net.runelite.http.api.item.ItemPrice;
@PluginDescriptor( @PluginDescriptor(
name = "Loot Tracker", name = "Loot Tracker",
@@ -253,20 +251,7 @@ public class LootTrackerPlugin extends Plugin
{ {
final ItemComposition itemComposition = itemManager.getItemComposition(itemStack.getId()); final ItemComposition itemComposition = itemManager.getItemComposition(itemStack.getId());
final int realItemId = itemComposition.getNote() != -1 ? itemComposition.getLinkedNoteId() : itemStack.getId(); final int realItemId = itemComposition.getNote() != -1 ? itemComposition.getLinkedNoteId() : itemStack.getId();
final ItemPrice itemPrice = itemManager.getItemPrice(realItemId); final long price = (long)itemManager.getItemPrice(realItemId) * (long)itemStack.getQuantity();
final long price;
if (itemPrice != null)
{
price = (long) itemPrice.getPrice() * itemStack.getQuantity();
}
else if (realItemId == ItemID.COINS_995)
{
price = itemStack.getQuantity();
}
else
{
price = 0;
}
return new LootTrackerItemEntry( return new LootTrackerItemEntry(
itemStack.getId(), itemStack.getId(),