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);