|
|
|
|
@@ -28,9 +28,14 @@ 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.gson.Gson;
|
|
|
|
|
import com.google.gson.reflect.TypeToken;
|
|
|
|
|
import java.awt.Color;
|
|
|
|
|
import java.awt.image.BufferedImage;
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.io.InputStream;
|
|
|
|
|
import java.io.InputStreamReader;
|
|
|
|
|
import java.lang.reflect.Type;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Collections;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
@@ -50,116 +55,7 @@ import static net.runelite.api.Constants.HIGH_ALCHEMY_MULTIPLIER;
|
|
|
|
|
import net.runelite.api.GameState;
|
|
|
|
|
import net.runelite.api.ItemDefinition;
|
|
|
|
|
import net.runelite.api.ItemID;
|
|
|
|
|
import static net.runelite.api.ItemID.AGILITY_CAPE;
|
|
|
|
|
import static net.runelite.api.ItemID.AGILITY_CAPET;
|
|
|
|
|
import static net.runelite.api.ItemID.AGILITY_CAPET_13341;
|
|
|
|
|
import static net.runelite.api.ItemID.AGILITY_CAPE_13340;
|
|
|
|
|
import static net.runelite.api.ItemID.BOOTS_OF_LIGHTNESS;
|
|
|
|
|
import static net.runelite.api.ItemID.BOOTS_OF_LIGHTNESS_89;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_BOOTS;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_BOOTS_11861;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13589;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13590;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13601;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13602;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13613;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13614;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13625;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13626;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13637;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13638;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13677;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_BOOTS_13678;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_BOOTS_21076;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_BOOTS_21078;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_CAPE;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_CAPE_11853;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_CAPE_13581;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_CAPE_13582;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_CAPE_13593;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_CAPE_13594;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_CAPE_13605;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_CAPE_13606;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_CAPE_13617;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_CAPE_13618;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_CAPE_13629;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_CAPE_13630;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_CAPE_13669;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_CAPE_13670;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_CAPE_21064;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_CAPE_21066;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_GLOVES;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_GLOVES_11859;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13587;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13588;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13599;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13600;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13611;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13612;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13623;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13624;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13635;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13636;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13675;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_GLOVES_13676;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_GLOVES_21073;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_GLOVES_21075;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_HOOD;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_HOOD_11851;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_HOOD_13579;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_HOOD_13580;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_HOOD_13591;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_HOOD_13592;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_HOOD_13603;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_HOOD_13604;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_HOOD_13615;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_HOOD_13616;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_HOOD_13627;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_HOOD_13628;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_HOOD_13667;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_HOOD_13668;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_HOOD_21061;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_HOOD_21063;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_LEGS;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_LEGS_11857;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_LEGS_13585;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_LEGS_13586;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_LEGS_13597;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_LEGS_13598;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_LEGS_13609;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_LEGS_13610;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_LEGS_13621;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_LEGS_13622;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_LEGS_13633;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_LEGS_13634;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_LEGS_13673;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_LEGS_13674;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_LEGS_21070;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_LEGS_21072;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_TOP;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_TOP_11855;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_TOP_13583;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_TOP_13584;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_TOP_13595;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_TOP_13596;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_TOP_13607;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_TOP_13608;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_TOP_13619;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_TOP_13620;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_TOP_13631;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_TOP_13632;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_TOP_13671;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_TOP_13672;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_TOP_21067;
|
|
|
|
|
import static net.runelite.api.ItemID.GRACEFUL_TOP_21069;
|
|
|
|
|
import static net.runelite.api.ItemID.MAX_CAPE;
|
|
|
|
|
import static net.runelite.api.ItemID.MAX_CAPE_13342;
|
|
|
|
|
import static net.runelite.api.ItemID.PENANCE_GLOVES;
|
|
|
|
|
import static net.runelite.api.ItemID.PENANCE_GLOVES_10554;
|
|
|
|
|
import static net.runelite.api.ItemID.SPOTTED_CAPE;
|
|
|
|
|
import static net.runelite.api.ItemID.SPOTTED_CAPE_10073;
|
|
|
|
|
import static net.runelite.api.ItemID.SPOTTIER_CAPE;
|
|
|
|
|
import static net.runelite.api.ItemID.SPOTTIER_CAPE_10074;
|
|
|
|
|
import static net.runelite.api.ItemID.*;
|
|
|
|
|
import net.runelite.api.Sprite;
|
|
|
|
|
import net.runelite.api.events.GameStateChanged;
|
|
|
|
|
import net.runelite.api.events.PostItemDefinition;
|
|
|
|
|
@@ -174,33 +70,6 @@ import org.jetbrains.annotations.NotNull;
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class ItemManager
|
|
|
|
|
{
|
|
|
|
|
@Value
|
|
|
|
|
private static class ImageKey
|
|
|
|
|
{
|
|
|
|
|
private final int itemId;
|
|
|
|
|
private final int itemQuantity;
|
|
|
|
|
private final boolean stackable;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Value
|
|
|
|
|
private static class OutlineKey
|
|
|
|
|
{
|
|
|
|
|
private final int itemId;
|
|
|
|
|
private final int itemQuantity;
|
|
|
|
|
private final Color outlineColor;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private final Client client;
|
|
|
|
|
private final ScheduledExecutorService scheduledExecutorService;
|
|
|
|
|
private final ClientThread clientThread;
|
|
|
|
|
|
|
|
|
|
private final ItemClient itemClient = new ItemClient();
|
|
|
|
|
private Map<Integer, ItemPrice> itemPrices = Collections.emptyMap();
|
|
|
|
|
private Map<Integer, ItemStats> itemStats = Collections.emptyMap();
|
|
|
|
|
private final LoadingCache<ImageKey, AsyncBufferedImage> itemImages;
|
|
|
|
|
private final LoadingCache<Integer, ItemDefinition> itemDefinitions;
|
|
|
|
|
private final LoadingCache<OutlineKey, BufferedImage> itemOutlines;
|
|
|
|
|
|
|
|
|
|
// Worn items with weight reducing property have a different worn and inventory ItemID
|
|
|
|
|
private static final ImmutableMap<Integer, Integer> WORN_ITEMS = ImmutableMap.<Integer, Integer>builder().
|
|
|
|
|
put(BOOTS_OF_LIGHTNESS_89, BOOTS_OF_LIGHTNESS).
|
|
|
|
|
@@ -263,7 +132,16 @@ public class ItemManager
|
|
|
|
|
put(AGILITY_CAPET_13341, AGILITY_CAPET).
|
|
|
|
|
put(AGILITY_CAPE_13340, AGILITY_CAPE).
|
|
|
|
|
build();
|
|
|
|
|
|
|
|
|
|
private final Client client;
|
|
|
|
|
private final ScheduledExecutorService scheduledExecutorService;
|
|
|
|
|
private final ClientThread clientThread;
|
|
|
|
|
private final ItemClient itemClient = new ItemClient();
|
|
|
|
|
private final ImmutableMap<Integer, ItemStats> itemStatMap;
|
|
|
|
|
private final LoadingCache<ImageKey, AsyncBufferedImage> itemImages;
|
|
|
|
|
private final LoadingCache<Integer, ItemDefinition> itemDefinitions;
|
|
|
|
|
private final LoadingCache<OutlineKey, BufferedImage> itemOutlines;
|
|
|
|
|
private Map<Integer, ItemPrice> itemPrices = Collections.emptyMap();
|
|
|
|
|
private Map<Integer, ItemStats> itemStats = Collections.emptyMap();
|
|
|
|
|
@Inject
|
|
|
|
|
public ItemManager(
|
|
|
|
|
Client client,
|
|
|
|
|
@@ -315,6 +193,15 @@ public class ItemManager
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
final Gson gson = new Gson();
|
|
|
|
|
|
|
|
|
|
final Type typeToken = new TypeToken<Map<Integer, ItemStats>>()
|
|
|
|
|
{
|
|
|
|
|
}.getType();
|
|
|
|
|
|
|
|
|
|
final InputStream statsFile = getClass().getResourceAsStream("/item_stats.json");
|
|
|
|
|
final Map<Integer, ItemStats> stats = gson.fromJson(new InputStreamReader(statsFile), typeToken);
|
|
|
|
|
itemStatMap = ImmutableMap.copyOf(stats);
|
|
|
|
|
|
|
|
|
|
eventbus.subscribe(GameStateChanged.class, this, this::onGameStateChanged);
|
|
|
|
|
eventbus.subscribe(PostItemDefinition.class, this, this::onPostItemDefinition);
|
|
|
|
|
@@ -398,7 +285,7 @@ public class ItemManager
|
|
|
|
|
/**
|
|
|
|
|
* Look up an item's price
|
|
|
|
|
*
|
|
|
|
|
* @param itemID item id
|
|
|
|
|
* @param itemID item id
|
|
|
|
|
* @param ignoreUntradeableMap should the price returned ignore the {@link UntradeableItemMapping}
|
|
|
|
|
* @return item price
|
|
|
|
|
*/
|
|
|
|
|
@@ -479,7 +366,7 @@ public class ItemManager
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return itemStats.get(canonicalize(itemId));
|
|
|
|
|
return itemStatMap.get(canonicalize(itemId));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -635,4 +522,20 @@ public class ItemManager
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Value
|
|
|
|
|
private static class ImageKey
|
|
|
|
|
{
|
|
|
|
|
private final int itemId;
|
|
|
|
|
private final int itemQuantity;
|
|
|
|
|
private final boolean stackable;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Value
|
|
|
|
|
private static class OutlineKey
|
|
|
|
|
{
|
|
|
|
|
private final int itemId;
|
|
|
|
|
private final int itemQuantity;
|
|
|
|
|
private final Color outlineColor;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|