diff --git a/runelite-client/pmd-ruleset.xml b/runelite-client/pmd-ruleset.xml index 3cdece031e..ebab6e2dcf 100644 --- a/runelite-client/pmd-ruleset.xml +++ b/runelite-client/pmd-ruleset.xml @@ -67,7 +67,12 @@ - + + + + + diff --git a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java index e7af66d994..2b4f9ec7f1 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java @@ -28,6 +28,7 @@ import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableMap; +import com.google.inject.Inject; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.IOException; @@ -41,7 +42,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import javax.inject.Inject; +import javax.inject.Named; import javax.inject.Singleton; import lombok.Value; import lombok.extern.slf4j.Slf4j; @@ -84,6 +85,14 @@ public class ItemManager private final ItemClient itemClient; private final RuneLiteConfig runeLiteConfig; + @Inject(optional = true) + @Named("activePriceThreshold") + private double activePriceThreshold = 5; + + @Inject(optional = true) + @Named("lowPriceThreshold") + private int lowPriceThreshold = 1000; + private Map itemPrices = Collections.emptyMap(); private Map itemStats = Collections.emptyMap(); private final LoadingCache itemImages; @@ -288,7 +297,7 @@ public class ItemManager if (ip != null) { - price = useWikiPrice && ip.getWikiPrice() > 0 ? ip.getWikiPrice() : ip.getPrice(); + price = useWikiPrice ? getWikiPrice(ip) : ip.getPrice(); } } else @@ -302,6 +311,27 @@ public class ItemManager return price; } + /** + * Get the wiki price for an item, with checks to try and avoid excessive price manipulation + * @param itemPrice + * @return + */ + public int getWikiPrice(ItemPrice itemPrice) + { + final int wikiPrice = itemPrice.getWikiPrice(); + final int jagPrice = itemPrice.getPrice(); + if (wikiPrice <= 0) + { + return jagPrice; + } + if (wikiPrice <= lowPriceThreshold) + { + return wikiPrice; + } + int d = jagPrice - (int) (jagPrice * activePriceThreshold); + return wikiPrice >= jagPrice - d && wikiPrice <= jagPrice + d ? wikiPrice : jagPrice; + } + /** * Look up an item's stats * @param itemId item id diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java index 84b87bcb88..3d86d52ad9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chatcommands/ChatCommandsPlugin.java @@ -1287,7 +1287,7 @@ public class ChatCommandsPlugin extends Plugin ItemPrice item = retrieveFromList(results, search); int itemId = item.getId(); - int itemPrice = runeLiteConfig.useWikiItemPrices() && item.getWikiPrice() > 0 ? item.getWikiPrice() : item.getPrice(); + int itemPrice = runeLiteConfig.useWikiItemPrices() ? itemManager.getWikiPrice(item) : item.getPrice(); final ChatMessageBuilder builder = new ChatMessageBuilder() .append(ChatColorType.NORMAL) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java index ae22917b37..9cbfaf667b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeSearchPanel.java @@ -215,7 +215,7 @@ class GrandExchangeSearchPanel extends JPanel ItemComposition itemComp = itemManager.getItemComposition(itemId); ItemStats itemStats = itemManager.getItemStats(itemId, false); - int itemPrice = useActivelyTradedPrice && item.getWikiPrice() > 0 ? item.getWikiPrice() : item.getPrice(); + int itemPrice = useActivelyTradedPrice ? itemManager.getWikiPrice(item) : item.getPrice(); int itemLimit = itemStats != null ? itemStats.getGeLimit() : 0; final int haPrice = itemComp.getHaPrice(); AsyncBufferedImage itemImage = itemManager.getImage(itemId);