diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/AlwaysLostItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/AlwaysLostItem.java deleted file mode 100644 index 140b524cfe..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/AlwaysLostItem.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2018, TheStonedTurtle - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.itemskeptondeath; - -import com.google.common.collect.ImmutableMap; -import lombok.AllArgsConstructor; -import lombok.Getter; -import net.runelite.api.ItemID; - -/** - * Certain Items receive a white outline by Jagex as they are always lost on death. This is sometimes incorrectly - * added to Items by Jagex as the item is actually kept in non-pvp areas of the game, such as the Rune Pouch. - * - * The white outline will be added to these items when they are lost on death. - */ -@AllArgsConstructor -@Getter -enum AlwaysLostItem -{ - RUNE_POUCH(ItemID.RUNE_POUCH, true), - LOOTING_BAG(ItemID.LOOTING_BAG, false), - CLUE_BOX(ItemID.CLUE_BOX, false), - BRACELET_OF_ETHEREUM(ItemID.BRACELET_OF_ETHEREUM, false), - BRACELET_OF_ETHEREUM_UNCHARGED(ItemID.BRACELET_OF_ETHEREUM_UNCHARGED, false); - - private final int itemID; - private final boolean keptOutsideOfWilderness; - - private static final ImmutableMap ID_MAP; - - static - { - final ImmutableMap.Builder map = ImmutableMap.builder(); - for (final AlwaysLostItem p : values()) - { - map.put(p.itemID, p); - } - ID_MAP = map.build(); - } - - static AlwaysLostItem getByItemID(final int itemID) - { - return ID_MAP.get(itemID); - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/BrokenOnDeathItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/BrokenOnDeathItem.java deleted file mode 100644 index 8512a05541..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/BrokenOnDeathItem.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2018, TheStonedTurtle - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.itemskeptondeath; - -import com.google.common.collect.ImmutableMap; -import javax.annotation.Nullable; -import lombok.AllArgsConstructor; -import net.runelite.api.ItemID; - -/** - * Some non tradeable items are kept on death inside low level wilderness (1-20) but are turned into a broken variant. - * - * The non-broken variant will be shown inside the interface. - */ -@AllArgsConstructor -enum BrokenOnDeathItem -{ - // Capes - FIRE_CAPE(ItemID.FIRE_CAPE, 50000), - FIRE_MAX_CAPE(ItemID.FIRE_MAX_CAPE, 50000), - INFERNAL_CAPE(ItemID.INFERNAL_CAPE, 50000), - INFERNAL_MAX_CAPE(ItemID.INFERNAL_MAX_CAPE, 50000), - AVAS_ASSEMBLER(ItemID.AVAS_ASSEMBLER, 75000), - ASSEMBLER_MAX_CAPE(ItemID.ASSEMBLER_MAX_CAPE, 75000), - - // Defenders - BRONZE_DEFENDER(ItemID.BRONZE_DEFENDER, 1000), - IRON_DEFENDER(ItemID.IRON_DEFENDER, 2000), - STEEL_DEFENDER(ItemID.STEEL_DEFENDER, 2500), - BLACK_DEFENDER(ItemID.BLACK_DEFENDER, 5000), - MITHRIL_DEFENDER(ItemID.MITHRIL_DEFENDER, 15000), - ADAMANT_DEFENDER(ItemID.ADAMANT_DEFENDER, 25000), - RUNE_DEFENDER(ItemID.RUNE_DEFENDER, 35000), - DRAGON_DEFENDER(ItemID.DRAGON_DEFENDER, 40000), - AVERNIC_DEFENDER(ItemID.AVERNIC_DEFENDER, 1000000), - - // Void - VOID_MAGE_HELM(ItemID.VOID_MAGE_HELM, 40000), - VOID_RANGER_HELM(ItemID.VOID_RANGER_HELM, 40000), - VOID_MELEE_HELM(ItemID.VOID_MELEE_HELM, 40000), - VOID_KNIGHT_TOP(ItemID.VOID_KNIGHT_TOP, 45000), - VOID_KNIGHT_ROBE(ItemID.VOID_KNIGHT_ROBE, 45000), - VOID_KNIGHT_GLOVES(ItemID.VOID_KNIGHT_GLOVES, 30000), - ELITE_VOID_TOP(ItemID.ELITE_VOID_TOP, 50000), - ELITE_VOID_ROBE(ItemID.ELITE_VOID_ROBE, 50000), - - // Barb Assault - FIGHTER_HAT(ItemID.FIGHTER_HAT, 45000), - RANGER_HAT(ItemID.RANGER_HAT, 45000), - HEALER_HAT(ItemID.HEALER_HAT, 45000), - FIGHTER_TORSO(ItemID.FIGHTER_TORSO, 50000), - PENANCE_SKIRT(ItemID.PENANCE_SKIRT, 20000), - - // Castle Wars - SARADOMIN_HALO(ItemID.SARADOMIN_HALO, 25000), - ZAMORAK_HALO(ItemID.ZAMORAK_HALO, 25000), - GUTHIX_HALO(ItemID.GUTHIX_HALO, 25000), - DECORATIVE_MAGIC_HAT(ItemID.DECORATIVE_ARMOUR_11898, 5000), - DECORATIVE_MAGIC_ROBE_TOP(ItemID.DECORATIVE_ARMOUR_11896, 5000), - DECORATIVE_MAGIC_ROBE_LEGS(ItemID.DECORATIVE_ARMOUR_11897, 5000), - DECORATIVE_RANGE_TOP(ItemID.DECORATIVE_ARMOUR_11899, 5000), - DECORATIVE_RANGE_BOTTOM(ItemID.DECORATIVE_ARMOUR_11900, 5000), - DECORATIVE_RANGE_QUIVER(ItemID.DECORATIVE_ARMOUR_11901, 5000), - GOLD_DECORATIVE_HELM(ItemID.DECORATIVE_HELM_4511, 5000), - GOLD_DECORATIVE_BODY(ItemID.DECORATIVE_ARMOUR_4509, 5000), - GOLD_DECORATIVE_LEGS(ItemID.DECORATIVE_ARMOUR_4510, 5000), - GOLD_DECORATIVE_SKIRT(ItemID.DECORATIVE_ARMOUR_11895, 5000), - GOLD_DECORATIVE_SHIELD(ItemID.DECORATIVE_SHIELD_4512, 5000), - GOLD_DECORATIVE_SWORD(ItemID.DECORATIVE_SWORD_4508, 5000); - - private final int itemID; - private final int repairPrice; - - private static final ImmutableMap REPAIR_MAP; - - static - { - final ImmutableMap.Builder map = new ImmutableMap.Builder<>(); - for (final BrokenOnDeathItem p : values()) - { - map.put(p.itemID, p.repairPrice); - } - REPAIR_MAP = map.build(); - } - - @Nullable - static Integer getRepairPrice(int itemId) - { - return REPAIR_MAP.get(itemId); - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/DynamicPriceItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/DynamicPriceItem.java deleted file mode 100644 index 4726555485..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/DynamicPriceItem.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (c) 2019, TheStonedTurtle - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.itemskeptondeath; - -import com.google.common.collect.ImmutableMap; -import java.util.Map; -import javax.annotation.Nullable; -import lombok.AllArgsConstructor; -import lombok.Getter; -import net.runelite.api.ItemID; - -/** - * Degradable/Non-rechargeable Jewelry death prices are usually determined by the amount of charges the item has left. - * The price of each charge is based on the GE price of the fully charged item divided by the maximum item charges - * Charge price = GE Price / Max Charges - * Death Price = Charge price * Current Charges - */ -@AllArgsConstructor -@Getter -enum DynamicPriceItem -{ - GAMES_NECKLACE1(ItemID.GAMES_NECKLACE1, 1, 8, ItemID.GAMES_NECKLACE8), - GAMES_NECKLACE2(ItemID.GAMES_NECKLACE2, 2, 8, ItemID.GAMES_NECKLACE8), - GAMES_NECKLACE3(ItemID.GAMES_NECKLACE3, 3, 8, ItemID.GAMES_NECKLACE8), - GAMES_NECKLACE4(ItemID.GAMES_NECKLACE4, 4, 8, ItemID.GAMES_NECKLACE8), - GAMES_NECKLACE5(ItemID.GAMES_NECKLACE5, 5, 8, ItemID.GAMES_NECKLACE8), - GAMES_NECKLACE6(ItemID.GAMES_NECKLACE6, 6, 8, ItemID.GAMES_NECKLACE8), - GAMES_NECKLACE7(ItemID.GAMES_NECKLACE7, 7, 8, ItemID.GAMES_NECKLACE8), - - RING_OF_DUELING1(ItemID.RING_OF_DUELING1, 1, 8, ItemID.RING_OF_DUELING8), - RING_OF_DUELING2(ItemID.RING_OF_DUELING2, 2, 8, ItemID.RING_OF_DUELING8), - RING_OF_DUELING3(ItemID.RING_OF_DUELING3, 3, 8, ItemID.RING_OF_DUELING8), - RING_OF_DUELING4(ItemID.RING_OF_DUELING4, 4, 8, ItemID.RING_OF_DUELING8), - RING_OF_DUELING5(ItemID.RING_OF_DUELING5, 5, 8, ItemID.RING_OF_DUELING8), - RING_OF_DUELING6(ItemID.RING_OF_DUELING6, 6, 8, ItemID.RING_OF_DUELING8), - RING_OF_DUELING7(ItemID.RING_OF_DUELING7, 7, 8, ItemID.RING_OF_DUELING8), - - RING_OF_RETURNING1(ItemID.RING_OF_RETURNING1, 1, 5, ItemID.RING_OF_RETURNING5), - RING_OF_RETURNING2(ItemID.RING_OF_RETURNING2, 2, 5, ItemID.RING_OF_RETURNING5), - RING_OF_RETURNING3(ItemID.RING_OF_RETURNING3, 3, 5, ItemID.RING_OF_RETURNING5), - RING_OF_RETURNING4(ItemID.RING_OF_RETURNING4, 4, 5, ItemID.RING_OF_RETURNING5), - - NECKLACE_OF_PASSAGE1(ItemID.NECKLACE_OF_PASSAGE1, 1, 5, ItemID.NECKLACE_OF_PASSAGE5), - NECKLACE_OF_PASSAGE2(ItemID.NECKLACE_OF_PASSAGE2, 2, 5, ItemID.NECKLACE_OF_PASSAGE5), - NECKLACE_OF_PASSAGE3(ItemID.NECKLACE_OF_PASSAGE3, 3, 5, ItemID.NECKLACE_OF_PASSAGE5), - NECKLACE_OF_PASSAGE4(ItemID.NECKLACE_OF_PASSAGE4, 4, 5, ItemID.NECKLACE_OF_PASSAGE5), - - BURNING_AMULET1(ItemID.BURNING_AMULET1, 1, 5, ItemID.BURNING_AMULET5), - BURNING_AMULET2(ItemID.BURNING_AMULET2, 2, 5, ItemID.BURNING_AMULET5), - BURNING_AMULET3(ItemID.BURNING_AMULET3, 3, 5, ItemID.BURNING_AMULET5), - BURNING_AMULET4(ItemID.BURNING_AMULET4, 4, 5, ItemID.BURNING_AMULET5); - - private final int itemId; - private final int currentCharges; - private final int maxCharges; - private final int chargedId; - - private static final Map DYNAMIC_ITEMS; - - static - { - final ImmutableMap.Builder map = ImmutableMap.builder(); - for (final DynamicPriceItem p : values()) - { - map.put(p.itemId, p); - } - DYNAMIC_ITEMS = map.build(); - } - - /** - * Calculates the price off the partially charged jewelry based on the base items price - * @param basePrice price of the base item, usually the trade-able variant - * @return death price of the current DynamicPriceItem - */ - int calculateDeathPrice(final int basePrice) - { - return (basePrice / maxCharges) * currentCharges; - } - - @Nullable - static DynamicPriceItem find(int itemId) - { - return DYNAMIC_ITEMS.get(itemId); - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/FixedPriceItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/FixedPriceItem.java deleted file mode 100644 index 04d731bb3d..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/FixedPriceItem.java +++ /dev/null @@ -1,259 +0,0 @@ -/* - * Copyright (c) 2019, Adam - * Copyright (c) 2019, TheStonedTurtle - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.itemskeptondeath; - -import com.google.common.collect.ImmutableMap; -import java.util.Map; -import javax.annotation.Nullable; -import lombok.Getter; -import net.runelite.api.ItemID; - -/** - * Some items have a fixed price that is added to its default value when calculating death prices. - * These are typically imbued items, such as Berserker ring (i), to help it protect over the non-imbued variants. - */ -@Getter -enum FixedPriceItem -{ - IMBUED_BLACK_MASK_I(ItemID.BLACK_MASK_I, 5000), - IMBUED_BLACK_MASK_1_I(ItemID.BLACK_MASK_1_I, 5000), - IMBUED_BLACK_MASK_2_I(ItemID.BLACK_MASK_2_I, 5000), - IMBUED_BLACK_MASK_3_I(ItemID.BLACK_MASK_3_I, 5000), - IMBUED_BLACK_MASK_4_I(ItemID.BLACK_MASK_4_I, 5000), - IMBUED_BLACK_MASK_5_I(ItemID.BLACK_MASK_5_I, 5000), - IMBUED_BLACK_MASK_6_I(ItemID.BLACK_MASK_6_I, 5000), - IMBUED_BLACK_MASK_7_I(ItemID.BLACK_MASK_7_I, 5000), - IMBUED_BLACK_MASK_8_I(ItemID.BLACK_MASK_8_I, 5000), - IMBUED_BLACK_MASK_9_I(ItemID.BLACK_MASK_9_I, 5000), - IMBUED_BLACK_MASK_10_I(ItemID.BLACK_MASK_10_I, 5000), - - IMBUED_SLAYER_HELMET_I(ItemID.SLAYER_HELMET_I, 1000), - IMBUED_BLACK_SLAYER_HELMET_I(ItemID.BLACK_SLAYER_HELMET_I, 1000), - IMBUED_PURPLE_SLAYER_HELMET_I(ItemID.PURPLE_SLAYER_HELMET_I, 1000), - IMBUED_RED_SLAYER_HELMET_I(ItemID.RED_SLAYER_HELMET_I, 1000), - IMBUED_GREEN_SLAYER_HELMET_I(ItemID.GREEN_SLAYER_HELMET_I, 1000), - IMBUED_TURQUOISE_SLAYER_HELMET_I(ItemID.TURQUOISE_SLAYER_HELMET_I, 1000), - IMBUED_HYDRA_SLAYER_HELMET_I(ItemID.HYDRA_SLAYER_HELMET_I, 1000), - - IMBUED_ARCHERS_RING_I(ItemID.ARCHERS_RING_I, 2000), - IMBUED_BERSERKER_RING_I(ItemID.BERSERKER_RING_I, 2000), - IMBUED_SEERS_RING_I(ItemID.SEERS_RING_I, 2000), - - IMBUED_RING_OF_THE_GODS_I(ItemID.RING_OF_THE_GODS_I, 2000), - IMBUED_TREASONOUS_RING_I(ItemID.TREASONOUS_RING_I, 2000), - IMBUED_TYRANNICAL_RING_I(ItemID.TYRANNICAL_RING_I, 2000), - - GRACEFUL_HOOD(ItemID.GRACEFUL_HOOD, 1965), - GRACEFUL_CAPE(ItemID.GRACEFUL_CAPE, 2460), - GRACEFUL_TOP(ItemID.GRACEFUL_TOP, 2345), - GRACEFUL_LEGS(ItemID.GRACEFUL_LEGS, 2290), - GRACEFUL_GLOVES(ItemID.GRACEFUL_GLOVES, 1970), - GRACEFUL_BOOTS(ItemID.GRACEFUL_BOOTS, 2060), - - ANGLER_HAT(ItemID.ANGLER_HAT, 2600), - ANGLER_TOP(ItemID.ANGLER_TOP, 3550), - ANGLER_WADERS(ItemID.ANGLER_WADERS, 4400), - ANGLER_BOOTS(ItemID.ANGLER_BOOTS, 5300), - - PROSPECTOR_HELMET(ItemID.PROSPECTOR_HELMET, 2640), - PROSPECTOR_JACKET(ItemID.PROSPECTOR_JACKET, 3550), - PROSPECTOR_LEGS(ItemID.PROSPECTOR_LEGS, 4460), - PROSPECTOR_BOOTS(ItemID.PROSPECTOR_BOOTS, 5370), - - LUMBERJACK_HAT(ItemID.LUMBERJACK_HAT, 19950), - LUMBERJACK_TOP(ItemID.LUMBERJACK_TOP, 19950), - LUMBERJACK_LEGS(ItemID.LUMBERJACK_LEGS, 19950), - LUMBERJACK_BOOTS(ItemID.LUMBERJACK_BOOTS, 19950), - - ROGUE_MASK(ItemID.ROGUE_MASK, 725), - ROGUE_TOP(ItemID.ROGUE_TOP, 575), - ROGUE_TROUSERS(ItemID.ROGUE_TROUSERS, 500), - ROGUE_GLOVES(ItemID.ROGUE_GLOVES, 650), - ROGUE_BOOTS(ItemID.ROGUE_BOOTS, 650), - - SALVE_AMULET_EI(ItemID.SALVE_AMULETEI, 209900), - - RING_OF_WEALTH_1(ItemID.RING_OF_WEALTH_1, 500, ItemID.RING_OF_WEALTH), - RING_OF_WEALTH_2(ItemID.RING_OF_WEALTH_2, 1000, ItemID.RING_OF_WEALTH), - RING_OF_WEALTH_3(ItemID.RING_OF_WEALTH_3, 1500, ItemID.RING_OF_WEALTH), - RING_OF_WEALTH_4(ItemID.RING_OF_WEALTH_4, 2000, ItemID.RING_OF_WEALTH), - - AMULET_OF_GLORY1(ItemID.AMULET_OF_GLORY1, 500, ItemID.AMULET_OF_GLORY), - AMULET_OF_GLORY2(ItemID.AMULET_OF_GLORY2, 1000, ItemID.AMULET_OF_GLORY), - AMULET_OF_GLORY3(ItemID.AMULET_OF_GLORY3, 1500, ItemID.AMULET_OF_GLORY), - AMULET_OF_GLORY5(ItemID.AMULET_OF_GLORY5, 2500, ItemID.AMULET_OF_GLORY), - - COMBAT_BRACELET1(ItemID.COMBAT_BRACELET1, 500, ItemID.COMBAT_BRACELET), - COMBAT_BRACELET2(ItemID.COMBAT_BRACELET2, 1000, ItemID.COMBAT_BRACELET), - COMBAT_BRACELET3(ItemID.COMBAT_BRACELET3, 1500, ItemID.COMBAT_BRACELET), - COMBAT_BRACELET5(ItemID.COMBAT_BRACELET5, 2500, ItemID.COMBAT_BRACELET), - - SKILLS_NECKLACE1(ItemID.SKILLS_NECKLACE1, 500, ItemID.SKILLS_NECKLACE), - SKILLS_NECKLACE2(ItemID.SKILLS_NECKLACE2, 1000, ItemID.SKILLS_NECKLACE), - SKILLS_NECKLACE3(ItemID.SKILLS_NECKLACE3, 1500, ItemID.SKILLS_NECKLACE), - SKILLS_NECKLACE4(ItemID.SKILLS_NECKLACE5, 2500, ItemID.SKILLS_NECKLACE), - - AHRIMS_HOOD_25(ItemID.AHRIMS_HOOD_25, 2500, ItemID.AHRIMS_HOOD_0), - AHRIMS_HOOD_50(ItemID.AHRIMS_HOOD_50, 5000, ItemID.AHRIMS_HOOD_0), - AHRIMS_HOOD_75(ItemID.AHRIMS_HOOD_75, 7500, ItemID.AHRIMS_HOOD_0), - AHRIMS_HOOD_100(ItemID.AHRIMS_HOOD_100, 10000, ItemID.AHRIMS_HOOD_0), - AHRIMS_ROBETOP_25(ItemID.AHRIMS_ROBETOP_25, 2500, ItemID.AHRIMS_ROBETOP_0), - AHRIMS_ROBETOP_50(ItemID.AHRIMS_ROBETOP_50, 5000, ItemID.AHRIMS_ROBETOP_0), - AHRIMS_ROBETOP_75(ItemID.AHRIMS_ROBETOP_75, 7500, ItemID.AHRIMS_ROBETOP_0), - AHRIMS_ROBETOP_100(ItemID.AHRIMS_ROBETOP_100, 10000, ItemID.AHRIMS_ROBETOP_0), - AHRIMS_ROBESKIRT_25(ItemID.AHRIMS_ROBESKIRT_25, 2500, ItemID.AHRIMS_ROBESKIRT_0), - AHRIMS_ROBESKIRT_50(ItemID.AHRIMS_ROBESKIRT_50, 5000, ItemID.AHRIMS_ROBESKIRT_0), - AHRIMS_ROBESKIRT_75(ItemID.AHRIMS_ROBESKIRT_75, 7500, ItemID.AHRIMS_ROBESKIRT_0), - AHRIMS_ROBESKIRT_100(ItemID.AHRIMS_ROBESKIRT_100, 10000, ItemID.AHRIMS_ROBESKIRT_0), - AHRIMS_STAFF_25(ItemID.AHRIMS_STAFF_25, 2500, ItemID.AHRIMS_STAFF_0), - AHRIMS_STAFF_50(ItemID.AHRIMS_STAFF_50, 5000, ItemID.AHRIMS_STAFF_0), - AHRIMS_STAFF_75(ItemID.AHRIMS_STAFF_75, 7500, ItemID.AHRIMS_STAFF_0), - AHRIMS_STAFF_100(ItemID.AHRIMS_STAFF_100, 10000, ItemID.AHRIMS_STAFF_0), - - KARILS_COIF_25(ItemID.KARILS_COIF_25, 2500, ItemID.KARILS_COIF_0), - KARILS_COIF_50(ItemID.KARILS_COIF_50, 5000, ItemID.KARILS_COIF_0), - KARILS_COIF_75(ItemID.KARILS_COIF_75, 7500, ItemID.KARILS_COIF_0), - KARILS_COIF_100(ItemID.KARILS_COIF_100, 10000, ItemID.KARILS_COIF_0), - KARILS_LEATHERTOP_25(ItemID.KARILS_LEATHERTOP_25, 2500, ItemID.KARILS_LEATHERTOP_0), - KARILS_LEATHERTOP_50(ItemID.KARILS_LEATHERTOP_50, 5000, ItemID.KARILS_LEATHERTOP_0), - KARILS_LEATHERTOP_75(ItemID.KARILS_LEATHERTOP_75, 7500, ItemID.KARILS_LEATHERTOP_0), - KARILS_LEATHERTOP_100(ItemID.KARILS_LEATHERTOP_100, 10000, ItemID.KARILS_LEATHERTOP_0), - KARILS_LEATHERSKIRT_25(ItemID.KARILS_LEATHERSKIRT_25, 2500, ItemID.KARILS_LEATHERSKIRT_0), - KARILS_LEATHERSKIRT_50(ItemID.KARILS_LEATHERSKIRT_50, 5000, ItemID.KARILS_LEATHERSKIRT_0), - KARILS_LEATHERSKIRT_75(ItemID.KARILS_LEATHERSKIRT_75, 7500, ItemID.KARILS_LEATHERSKIRT_0), - KARILS_LEATHERSKIRT_100(ItemID.KARILS_LEATHERSKIRT_100, 10000, ItemID.KARILS_LEATHERSKIRT_0), - KARILS_CROSSBOW_25(ItemID.KARILS_CROSSBOW_25, 2500, ItemID.KARILS_CROSSBOW_0), - KARILS_CROSSBOW_50(ItemID.KARILS_CROSSBOW_50, 5000, ItemID.KARILS_CROSSBOW_0), - KARILS_CROSSBOW_75(ItemID.KARILS_CROSSBOW_75, 7500, ItemID.KARILS_CROSSBOW_0), - KARILS_CROSSBOW_100(ItemID.KARILS_CROSSBOW_100, 10000, ItemID.KARILS_CROSSBOW_0), - - DHAROKS_HELM_25(ItemID.DHAROKS_HELM_25, 2500, ItemID.DHAROKS_HELM_0), - DHAROKS_HELM_50(ItemID.DHAROKS_HELM_50, 5000, ItemID.DHAROKS_HELM_0), - DHAROKS_HELM_75(ItemID.DHAROKS_HELM_75, 7500, ItemID.DHAROKS_HELM_0), - DHAROKS_HELM_100(ItemID.DHAROKS_HELM_100, 10000, ItemID.DHAROKS_HELM_0), - DHAROKS_PLATEBODY_25(ItemID.DHAROKS_PLATEBODY_25, 2500, ItemID.DHAROKS_PLATEBODY_0), - DHAROKS_PLATEBODY_50(ItemID.DHAROKS_PLATEBODY_50, 5000, ItemID.DHAROKS_PLATEBODY_0), - DHAROKS_PLATEBODY_75(ItemID.DHAROKS_PLATEBODY_75, 7500, ItemID.DHAROKS_PLATEBODY_0), - DHAROKS_PLATEBODY_100(ItemID.DHAROKS_PLATEBODY_100, 10000, ItemID.DHAROKS_PLATEBODY_0), - DHAROKS_PLATELEGS_25(ItemID.DHAROKS_PLATELEGS_25, 2500, ItemID.DHAROKS_PLATELEGS_0), - DHAROKS_PLATELEGS_50(ItemID.DHAROKS_PLATELEGS_50, 5000, ItemID.DHAROKS_PLATELEGS_0), - DHAROKS_PLATELEGS_75(ItemID.DHAROKS_PLATELEGS_75, 7500, ItemID.DHAROKS_PLATELEGS_0), - DHAROKS_PLATELEGS_100(ItemID.DHAROKS_PLATELEGS_100, 10000, ItemID.DHAROKS_PLATELEGS_0), - DHAROKS_GREATAXE_25(ItemID.DHAROKS_GREATAXE_25, 2500, ItemID.DHAROKS_GREATAXE_0), - DHAROKS_GREATAXE_50(ItemID.DHAROKS_GREATAXE_50, 5000, ItemID.DHAROKS_GREATAXE_0), - DHAROKS_GREATAXE_75(ItemID.DHAROKS_GREATAXE_75, 7500, ItemID.DHAROKS_GREATAXE_0), - DHAROKS_GREATAXE_100(ItemID.DHAROKS_GREATAXE_100, 10000, ItemID.DHAROKS_GREATAXE_0), - - GUTHANS_HELM_25(ItemID.GUTHANS_HELM_25, 2500, ItemID.GUTHANS_HELM_0), - GUTHANS_HELM_50(ItemID.GUTHANS_HELM_50, 5000, ItemID.GUTHANS_HELM_0), - GUTHANS_HELM_75(ItemID.GUTHANS_HELM_75, 7500, ItemID.GUTHANS_HELM_0), - GUTHANS_HELM_100(ItemID.GUTHANS_HELM_100, 10000, ItemID.GUTHANS_HELM_0), - GUTHANS_PLATEBODY_25(ItemID.GUTHANS_PLATEBODY_25, 2500, ItemID.GUTHANS_PLATEBODY_0), - GUTHANS_PLATEBODY_50(ItemID.GUTHANS_PLATEBODY_50, 5000, ItemID.GUTHANS_PLATEBODY_0), - GUTHANS_PLATEBODY_75(ItemID.GUTHANS_PLATEBODY_75, 7500, ItemID.GUTHANS_PLATEBODY_0), - GUTHANS_PLATEBODY_100(ItemID.GUTHANS_PLATEBODY_100, 10000, ItemID.GUTHANS_PLATEBODY_0), - GUTHANS_CHAINSKIRT_25(ItemID.GUTHANS_CHAINSKIRT_25, 2500, ItemID.GUTHANS_CHAINSKIRT_0), - GUTHANS_CHAINSKIRT_50(ItemID.GUTHANS_CHAINSKIRT_50, 5000, ItemID.GUTHANS_CHAINSKIRT_0), - GUTHANS_CHAINSKIRT_75(ItemID.GUTHANS_CHAINSKIRT_75, 7500, ItemID.GUTHANS_CHAINSKIRT_0), - GUTHANS_CHAINSKIRT_100(ItemID.GUTHANS_CHAINSKIRT_100, 10000, ItemID.GUTHANS_CHAINSKIRT_0), - GUTHANS_WARSPEAR_25(ItemID.GUTHANS_WARSPEAR_25, 2500, ItemID.GUTHANS_WARSPEAR_0), - GUTHANS_WARSPEAR_50(ItemID.GUTHANS_WARSPEAR_50, 5000, ItemID.GUTHANS_WARSPEAR_0), - GUTHANS_WARSPEAR_75(ItemID.GUTHANS_WARSPEAR_75, 7500, ItemID.GUTHANS_WARSPEAR_0), - GUTHANS_WARSPEAR_100(ItemID.GUTHANS_WARSPEAR_100, 10000, ItemID.GUTHANS_WARSPEAR_0), - - TORAGS_HELM_25(ItemID.TORAGS_HELM_25, 2500, ItemID.TORAGS_HELM_0), - TORAGS_HELM_50(ItemID.TORAGS_HELM_50, 5000, ItemID.TORAGS_HELM_0), - TORAGS_HELM_75(ItemID.TORAGS_HELM_75, 7500, ItemID.TORAGS_HELM_0), - TORAGS_HELM_100(ItemID.TORAGS_HELM_100, 10000, ItemID.TORAGS_HELM_0), - TORAGS_PLATEBODY_25(ItemID.TORAGS_PLATEBODY_25, 2500, ItemID.TORAGS_PLATEBODY_0), - TORAGS_PLATEBODY_50(ItemID.TORAGS_PLATEBODY_50, 5000, ItemID.TORAGS_PLATEBODY_0), - TORAGS_PLATEBODY_75(ItemID.TORAGS_PLATEBODY_75, 7500, ItemID.TORAGS_PLATEBODY_0), - TORAGS_PLATEBODY_100(ItemID.TORAGS_PLATEBODY_100, 10000, ItemID.TORAGS_PLATEBODY_0), - TORAGS_PLATELEGS_25(ItemID.TORAGS_PLATELEGS_25, 2500, ItemID.TORAGS_PLATELEGS_0), - TORAGS_PLATELEGS_50(ItemID.TORAGS_PLATELEGS_50, 5000, ItemID.TORAGS_PLATELEGS_0), - TORAGS_PLATELEGS_75(ItemID.TORAGS_PLATELEGS_75, 7500, ItemID.TORAGS_PLATELEGS_0), - TORAGS_PLATELEGS_100(ItemID.TORAGS_PLATELEGS_100, 10000, ItemID.TORAGS_PLATELEGS_0), - TORAGS_HAMMERS_25(ItemID.TORAGS_HAMMERS_25, 2500, ItemID.TORAGS_HAMMERS_0), - TORAGS_HAMMERS_50(ItemID.TORAGS_HAMMERS_50, 5000, ItemID.TORAGS_HAMMERS_0), - TORAGS_HAMMERS_75(ItemID.TORAGS_HAMMERS_75, 7500, ItemID.TORAGS_HAMMERS_0), - TORAGS_HAMMERS_100(ItemID.TORAGS_HAMMERS_100, 10000, ItemID.TORAGS_HAMMERS_0), - - VERACS_HELM_25(ItemID.VERACS_HELM_25, 2500, ItemID.VERACS_HELM_0), - VERACS_HELM_50(ItemID.VERACS_HELM_50, 5000, ItemID.VERACS_HELM_0), - VERACS_HELM_75(ItemID.VERACS_HELM_75, 7500, ItemID.VERACS_HELM_0), - VERACS_HELM_100(ItemID.VERACS_HELM_100, 10000, ItemID.VERACS_HELM_0), - VERACS_BRASSARD_25(ItemID.VERACS_BRASSARD_25, 2500, ItemID.VERACS_BRASSARD_0), - VERACS_BRASSARD_50(ItemID.VERACS_BRASSARD_50, 5000, ItemID.VERACS_BRASSARD_0), - VERACS_BRASSARD_75(ItemID.VERACS_BRASSARD_75, 7500, ItemID.VERACS_BRASSARD_0), - VERACS_BRASSARD_100(ItemID.VERACS_BRASSARD_100, 10000, ItemID.VERACS_BRASSARD_0), - VERACS_PLATESKIRT_25(ItemID.VERACS_PLATESKIRT_25, 2500, ItemID.VERACS_PLATESKIRT_0), - VERACS_PLATESKIRT_50(ItemID.VERACS_PLATESKIRT_50, 5000, ItemID.VERACS_PLATESKIRT_0), - VERACS_PLATESKIRT_75(ItemID.VERACS_PLATESKIRT_75, 7500, ItemID.VERACS_PLATESKIRT_0), - VERACS_PLATESKIRT_100(ItemID.VERACS_PLATESKIRT_100, 10000, ItemID.VERACS_PLATESKIRT_0), - VERACS_FLAIL_25(ItemID.VERACS_FLAIL_25, 2500, ItemID.VERACS_FLAIL_0), - VERACS_FLAIL_50(ItemID.VERACS_FLAIL_50, 5000, ItemID.VERACS_FLAIL_0), - VERACS_FLAIL_75(ItemID.VERACS_FLAIL_75, 7500, ItemID.VERACS_FLAIL_0), - VERACS_FLAIL_100(ItemID.VERACS_FLAIL_100, 10000, ItemID.VERACS_FLAIL_0), - - AVERNIC_DEFENDER(ItemID.AVERNIC_DEFENDER, 4040000), - - ETERNAL_TELEPORT_CRYSTAL(ItemID.ETERNAL_TELEPORT_CRYSTAL, 78500), - ; - - private final int itemId; - private final int offset; - private final int baseId; - - private static final Map FIXED_ITEMS; - - static - { - final ImmutableMap.Builder map = ImmutableMap.builder(); - for (final FixedPriceItem p : values()) - { - map.put(p.itemId, p); - } - FIXED_ITEMS = map.build(); - } - - FixedPriceItem(final int itemId, final int offset, final int baseId) - { - this.itemId = itemId; - this.offset = offset; - this.baseId = baseId; - } - - FixedPriceItem(final int itemId, final int offset) - { - this(itemId, offset, -1); - } - - @Nullable - static FixedPriceItem find(int itemId) - { - return FIXED_ITEMS.get(itemId); - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/ItemStack.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/ItemStack.java deleted file mode 100644 index d2f09dd856..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/ItemStack.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2019, TheStonedTurtle - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.itemskeptondeath; - -import lombok.AllArgsConstructor; -import lombok.Data; - -@Data -@AllArgsConstructor -class ItemStack -{ - private int id; - private int qty; -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPlugin.java deleted file mode 100644 index afd0fe6602..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPlugin.java +++ /dev/null @@ -1,731 +0,0 @@ -/* - * Copyright (c) 2018, TheStonedTurtle - * Copyright (c) 2019, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.itemskeptondeath; - -import com.google.common.annotations.VisibleForTesting; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.EnumSet; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; -import javax.inject.Inject; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import net.runelite.api.Client; -import net.runelite.api.Constants; -import net.runelite.api.FontID; -import net.runelite.api.InventoryID; -import net.runelite.api.Item; -import net.runelite.api.ItemComposition; -import net.runelite.api.ItemContainer; -import net.runelite.api.ItemID; -import net.runelite.api.ScriptID; -import net.runelite.api.SkullIcon; -import net.runelite.api.SpriteID; -import net.runelite.api.Varbits; -import net.runelite.api.WorldType; -import net.runelite.api.events.ScriptPostFired; -import net.runelite.api.vars.AccountType; -import net.runelite.api.widgets.Widget; -import net.runelite.api.widgets.WidgetInfo; -import net.runelite.api.widgets.WidgetType; -import net.runelite.client.eventbus.Subscribe; -import net.runelite.client.game.ItemManager; -import net.runelite.client.game.ItemMapping; -import net.runelite.client.plugins.Plugin; -import net.runelite.client.plugins.PluginDescriptor; -import net.runelite.client.util.QuantityFormatter; - -@PluginDescriptor( - name = "Items Kept on Death", - description = "Updates the Items Kept on Death interface to be more accurate", - enabledByDefault = false -) -@Slf4j -public class ItemsKeptOnDeathPlugin extends Plugin -{ - private static final int DEEP_WILDY = 20; - - private static final Pattern WILDERNESS_LEVEL_PATTERN = Pattern.compile("^Level: (\\d+).*"); - - @AllArgsConstructor - @Getter - @VisibleForTesting - static class DeathItems - { - private final List keptItems; - private final List lostItems; - private final boolean hasAlwaysLost; - } - - // Item Container helpers - private static final int MAX_ROW_ITEMS = 8; - private static final int ITEM_X_OFFSET = 5; - private static final int ITEM_Y_OFFSET = 25; - private static final int ITEM_X_STRIDE = 38; - private static final int ITEM_Y_STRIDE = 38; - private static final int ORIGINAL_LOST_HEIGHT = 209; - private static final int ORIGINAL_LOST_Y = 107; - - // Information panel text helpers - private static final String LINE_BREAK = "
"; - private static final int INFORMATION_CONTAINER_HEIGHT = 183; - private static final int FONT_COLOR = 0xFF981F; - - // Button Images - private static final int PROTECT_ITEM_SPRITE_ID = SpriteID.PRAYER_PROTECT_ITEM; - private static final int SKULL_SPRITE_ID = SpriteID.PLAYER_KILLER_SKULL_523; - private static final int SWORD_SPRITE_ID = SpriteID.MULTI_COMBAT_ZONE_CROSSED_SWORDS; - private static final int SKULL_2_SPRITE_ID = SpriteID.FIGHT_PITS_WINNER_SKULL_RED; - - @Inject - private Client client; - - @Inject - private ItemManager itemManager; - - private WidgetButton deepWildyButton; - private WidgetButton lowWildyButton; - - @VisibleForTesting - boolean isSkulled; - @VisibleForTesting - boolean protectingItem; - @VisibleForTesting - int wildyLevel; - - @Subscribe - public void onScriptPostFired(ScriptPostFired event) - { - if (event.getScriptId() == ScriptID.DEATH_KEEP_BUILD) - { - // The script in charge of building the Items Kept on Death interface has finished running. - // Make all necessary changes now. - - // Players inside Safe Areas (POH/Clan Wars) or playing DMM see the default interface - if (isInSafeArea() || client.getWorldType().contains(WorldType.DEADMAN)) - { - return; - } - - syncSettings(); - createWidgetButtons(); - rebuildItemsKeptOnDeathInterface(); - - final Widget keptText = client.getWidget(WidgetInfo.ITEMS_KEPT_ON_DEATH_TEXT); - keptText.setText("Items you will keep on death:"); - - final Widget lostText = client.getWidget(WidgetInfo.ITEMS_LOST_ON_DEATH_TEXT); - lostText.setText("Items you will lose on death:"); - } - } - - // Sync user settings - private void syncSettings() - { - final SkullIcon s = client.getLocalPlayer().getSkullIcon(); - // Ultimate iron men deaths are treated like they are always skulled - isSkulled = s == SkullIcon.SKULL || isUltimateIronman(); - protectingItem = client.getVar(Varbits.PRAYER_PROTECT_ITEM) == 1; - syncWildernessLevel(); - } - - private void syncWildernessLevel() - { - if (client.getVar(Varbits.IN_WILDERNESS) != 1) - { - // if they are in a PvP world and not in a safe zone act like in lvl 1 wildy - if (isInPvpWorld() && !isInPvPSafeZone()) - { - wildyLevel = 1; - return; - } - wildyLevel = -1; - return; - } - - final Widget wildernessLevelWidget = client.getWidget(WidgetInfo.PVP_WILDERNESS_LEVEL); - if (wildernessLevelWidget == null) - { - wildyLevel = -1; - return; - } - - final String wildernessLevelText = wildernessLevelWidget.getText(); - final Matcher m = WILDERNESS_LEVEL_PATTERN.matcher(wildernessLevelText); - if (!m.matches()) - { - wildyLevel = -1; - return; - } - - wildyLevel = Integer.parseInt(m.group(1)); - } - - private boolean isInPvpWorld() - { - final EnumSet world = client.getWorldType(); - return world.contains(WorldType.PVP); - } - - private boolean isProtectItemAllowed() - { - return !client.getWorldType().contains(WorldType.HIGH_RISK) - && !isUltimateIronman(); - } - - private boolean isInPvPSafeZone() - { - final Widget w = client.getWidget(WidgetInfo.PVP_WORLD_SAFE_ZONE); - return w != null && !w.isHidden(); - } - - private boolean isInSafeArea() - { - final Widget w = client.getWidget(WidgetInfo.ITEMS_KEPT_SAFE_ZONE_CONTAINER); - return w != null && !w.isHidden(); - } - - private boolean isUltimateIronman() - { - return client.getAccountType() == AccountType.ULTIMATE_IRONMAN; - } - - private int getDefaultItemsKept() - { - final int count = isSkulled ? 0 : 3; - return count + (protectingItem ? 1 : 0); - } - - private void rebuildItemsKeptOnDeathInterface() - { - final Widget lost = client.getWidget(WidgetInfo.ITEMS_LOST_ON_DEATH_CONTAINER); - final Widget kept = client.getWidget(WidgetInfo.ITEMS_KEPT_ON_DEATH_CONTAINER); - if (lost == null || kept == null) - { - return; - } - - lost.deleteAllChildren(); - kept.deleteAllChildren(); - - // Grab all items on player - final ItemContainer inventory = client.getItemContainer(InventoryID.INVENTORY); - final Item[] inv = inventory == null ? new Item[0] : inventory.getItems(); - final ItemContainer equipment = client.getItemContainer(InventoryID.EQUIPMENT); - final Item[] equip = equipment == null ? new Item[0] : equipment.getItems(); - - final DeathItems deathItems = calculateKeptLostItems(inv, equip); - - final List keptItems = deathItems.getKeptItems().stream() - .map(item -> createItemWidget(kept, item, true)).collect(Collectors.toList()); - final List lostItems = deathItems.getLostItems().stream() - .map(item -> createItemWidget(lost, item, false)).collect(Collectors.toList()); - - int rows = (keptItems.size() + MAX_ROW_ITEMS - 1) / MAX_ROW_ITEMS; - // Show an empty row if there isn't anything - if (rows > 0) - { - // ORIGINAL_LOST_Y/HEIGHT includes a row already - rows--; - } - // Adjust items lost container position if new rows were added to kept items container - lost.setOriginalY(ORIGINAL_LOST_Y + (rows * ITEM_Y_STRIDE)); - lost.setOriginalHeight(ORIGINAL_LOST_HEIGHT - (rows * ITEM_Y_STRIDE)); - positionWidgetItems(kept, keptItems); - positionWidgetItems(lost, lostItems); - - updateKeptWidgetInfoText(deathItems.isHasAlwaysLost(), keptItems, lostItems); - } - - /** - * Calculates which items will be kept/lost. first list is kept items, second is lost. - * - * @param inv players inventory - * @param equip players equipement - * @return list of items kept followed by a list of items lost - */ - @VisibleForTesting - DeathItems calculateKeptLostItems(final Item[] inv, final Item[] equip) - { - final List items = new ArrayList<>(); - Collections.addAll(items, inv); - Collections.addAll(items, equip); - - // Sort by item price - items.sort(Comparator.comparing(this::getDeathPrice).reversed()); - - boolean hasClueBox = false; - boolean hasAlwaysLost = false; - int keepCount = getDefaultItemsKept(); - - final List keptItems = new ArrayList<>(); - final List lostItems = new ArrayList<>(); - - for (final Item i : items) - { - final int id = i.getId(); - int qty = i.getQuantity(); - if (id == -1) - { - continue; - } - - // Bonds are always kept and do not count towards the limit. - if (id == ItemID.OLD_SCHOOL_BOND || id == ItemID.OLD_SCHOOL_BOND_UNTRADEABLE) - { - keptItems.add(new ItemStack(id, qty)); - continue; - } - - final AlwaysLostItem alwaysLostItem = AlwaysLostItem.getByItemID(id); - if (alwaysLostItem != null && (!alwaysLostItem.isKeptOutsideOfWilderness() || wildyLevel > 0)) - { - hasAlwaysLost = true; - hasClueBox = hasClueBox || id == ItemID.CLUE_BOX; - lostItems.add(new ItemStack(id, qty)); - continue; - } - - if (keepCount > 0) - { - // Keep most valuable items regardless of trade-ability. - if (i.getQuantity() > keepCount) - { - keptItems.add(new ItemStack(id, keepCount)); - qty -= keepCount; - keepCount = 0; - // Fall through to determine if the rest of the stack should drop - } - else - { - keptItems.add(new ItemStack(id, qty)); - keepCount -= qty; - continue; - } - } - - // Items are kept if: - // 1) is not tradeable - // 2) is under the deep wilderness line - // 3) is outside of the wilderness, or item has a broken form - if (!Pets.isPet(id) - && !LostIfNotProtected.isLostIfNotProtected(id) - && !isTradeable(itemManager.getItemComposition(id)) && wildyLevel <= DEEP_WILDY - && (wildyLevel <= 0 || BrokenOnDeathItem.getRepairPrice(i.getId()) != null)) - { - keptItems.add(new ItemStack(id, qty)); - } - else - { - // Otherwise, the item is lost - lostItems.add(new ItemStack(id, qty)); - } - } - - if (hasClueBox) - { - boolean alreadyProtectingClue = false; - for (final ItemStack item : keptItems) - { - if (isClueBoxable(item.getId())) - { - alreadyProtectingClue = true; - break; - } - } - - if (!alreadyProtectingClue) - { - int clueId = -1; - // Clue box protects the last clue in your inventory so loop over the players inv - for (final Item i : inv) - { - final int id = i.getId(); - if (id != -1 && isClueBoxable(id)) - { - clueId = id; - } - } - - if (clueId != -1) - { - // Move the boxed item to the kept items container and remove it from the lost items container - for (final ItemStack boxableItem : lostItems) - { - if (boxableItem.getId() == clueId) - { - if (boxableItem.getQty() > 1) - { - boxableItem.setQty(boxableItem.getQty() - 1); - keptItems.add(new ItemStack(clueId, 1)); - } - else - { - lostItems.remove(boxableItem); - keptItems.add(boxableItem); - } - break; - } - } - } - } - } - - return new DeathItems(keptItems, lostItems, hasAlwaysLost); - } - - @VisibleForTesting - boolean isClueBoxable(final int itemID) - { - final String name = itemManager.getItemComposition(itemID).getName(); - return name.contains("Clue scroll (") || name.contains("Reward casket ("); - } - - /** - * Get the price of an item - * - * @param item - * @return - */ - @VisibleForTesting - int getDeathPrice(Item item) - { - // 1) Check if the death price is dynamically calculated, if so return that value - // 2) If death price is based off another item default to that price, otherwise apply normal ItemMapping GE price - // 3) If still no price, default to store price - // 4) Apply fixed price offset if applicable - - int itemId = item.getId(); - // Unnote/unplaceholder item - int canonicalizedItemId = itemManager.canonicalize(itemId); - int exchangePrice = 0; - - final DynamicPriceItem dynamicPrice = DynamicPriceItem.find(canonicalizedItemId); - if (dynamicPrice != null) - { - final int basePrice = itemManager.getItemPrice(dynamicPrice.getChargedId(), true); - return dynamicPrice.calculateDeathPrice(basePrice); - } - - // Some items have artificially offset death prices - such as ring imbues - // which are +2k over the non imbues. Check if the item has a fixed price offset - final FixedPriceItem fixedPrice = FixedPriceItem.find(canonicalizedItemId); - if (fixedPrice != null && fixedPrice.getBaseId() != -1) - { - // Grab base item price - exchangePrice = itemManager.getItemPrice(fixedPrice.getBaseId(), true); - } - - // Jagex uses the repair price when determining which items are kept on death. - final Integer repairPrice = BrokenOnDeathItem.getRepairPrice(canonicalizedItemId); - if (repairPrice != null) - { - exchangePrice = repairPrice; - } - - if (exchangePrice == 0) - { - // Account for items whose death value comes from their tradeable variant (barrows) or components (ornate kits) - // ItemMapping.map will always return a collection with at least the passed ID - for (final int mappedID : ItemMapping.map(canonicalizedItemId)) - { - exchangePrice += itemManager.getItemPrice(mappedID, true); - } - - // If for some reason it still has no price default to the items store price - if (exchangePrice == 0) - { - final ItemComposition c1 = itemManager.getItemComposition(canonicalizedItemId); - exchangePrice = c1.getPrice(); - } - } - - // Apply fixed price offset - exchangePrice += fixedPrice == null ? 0 : fixedPrice.getOffset(); - - return exchangePrice; - } - - /** - * Position a list of widget items in the parent container - */ - private static void positionWidgetItems(final Widget parent, final List widgets) - { - int startingIndex = 0; - for (final Widget w : widgets) - { - final int originalX = ITEM_X_OFFSET + ((startingIndex % MAX_ROW_ITEMS) * ITEM_X_STRIDE); - final int originalY = ITEM_Y_OFFSET + ((startingIndex / MAX_ROW_ITEMS) * ITEM_Y_STRIDE); - - w.setOriginalX(originalX); - w.setOriginalY(originalY); - w.revalidate(); - - ++startingIndex; - } - - parent.revalidate(); - } - - /** - * Creates the text to be displayed in the right side of the interface based on current selections - */ - private String getInfoText(final boolean hasAlwaysLost) - { - final StringBuilder sb = new StringBuilder(); - if (isUltimateIronman()) - { - sb.append("You are an UIM which means 0 items are protected by default"); - } - else - { - sb.append("3 items protected by default"); - - if (isSkulled) - { - sb.append(LINE_BREAK) - .append("PK skull -3"); - } - - if (protectingItem) - { - sb.append(LINE_BREAK) - .append("Protect Item prayer +1"); - } - - sb.append(LINE_BREAK) - .append(String.format("Actually protecting %s items", getDefaultItemsKept())); - } - - - if (wildyLevel < 1) - { - sb.append(LINE_BREAK) - .append(LINE_BREAK) - .append("You will have 1 hour to retrieve your lost items."); - } - - if (hasAlwaysLost) - { - sb.append(LINE_BREAK) - .append(LINE_BREAK) - .append("Items with a white outline will always be lost."); - } - - sb.append(LINE_BREAK) - .append(LINE_BREAK) - .append("Untradeable items are kept on death in non-pvp scenarios."); - - return sb.toString(); - } - - /** - * Updates the information panel based on the item containers - */ - private void updateKeptWidgetInfoText(final boolean hasAlwaysLost, final List keptItems, final List lostItems) - { - // Add Information text widget - final Widget textWidget = findOrCreateInfoText(); - textWidget.setText(getInfoText(hasAlwaysLost)); - textWidget.revalidate(); - - // Update Items lost total value - long total = 0; - for (final Widget w : lostItems) - { - int cid = itemManager.canonicalize(w.getItemId()); - int price = itemManager.getItemPrice(cid); - if (price == 0) - { - // Default to alch price - price = (int) (itemManager.getItemComposition(cid).getPrice() * Constants.HIGH_ALCHEMY_MULTIPLIER); - } - total += (long) price * w.getItemQuantity(); - } - final Widget lostValue = client.getWidget(WidgetInfo.ITEMS_LOST_VALUE); - lostValue.setText(QuantityFormatter.quantityToStackSize(total) + " gp"); - - // Update Max items kept - final Widget max = client.getWidget(WidgetInfo.ITEMS_KEPT_MAX); - final int keptQty = keptItems.stream().mapToInt(Widget::getItemQuantity).sum(); - max.setText(String.format("Max items kept on death:

~ %d ~", keptQty)); - } - - /** - * Check if an item is tradeable to another player - * - * @param c The item - * @return - */ - private static boolean isTradeable(final ItemComposition c) - { - // ItemComposition:: isTradeable checks if they are traded on the grand exchange, some items are trade-able but not via GE - if (c.getNote() != -1 - || c.getLinkedNoteId() != -1 - || c.isTradeable()) - { - return true; - } - - final int id = c.getId(); - switch (id) - { - case ItemID.COINS_995: - case ItemID.PLATINUM_TOKEN: - return true; - default: - return false; - } - } - - private Widget findOrCreateInfoText() - { - // The text was on the ITEMS_KEPT_INFORMATION_CONTAINER widget - but now that it is a layer, - // we need to create a child widget to hold the text - final Widget parent = client.getWidget(WidgetInfo.ITEMS_KEPT_INFORMATION_CONTAINER); - - // Use the text TEXT widget if it already exists. It should be the last child of the parent - final Widget[] children = parent.getChildren(); - if (children != null && children.length > 0) - { - final Widget w = parent.getChild(children.length - 1); - if (w != null && w.getType() == WidgetType.TEXT) - { - log.debug("Reusing old text widget"); - return w; - } - } - - log.debug("Creating new text widget"); - - final Widget w = parent.createChild(-1, WidgetType.TEXT); - // Position under buttons taking remaining space - w.setOriginalWidth(parent.getOriginalWidth()); - w.setOriginalHeight(INFORMATION_CONTAINER_HEIGHT - parent.getOriginalHeight()); - w.setOriginalY(parent.getOriginalHeight()); - - w.setFontId(FontID.PLAIN_11); - w.setTextShadowed(true); - w.setTextColor(FONT_COLOR); - - // Need to adjust parent height so text is visible - parent.setOriginalHeight(INFORMATION_CONTAINER_HEIGHT); - parent.revalidate(); - - return w; - } - - private void createWidgetButtons() - { - final Widget parent = client.getWidget(WidgetInfo.ITEMS_KEPT_INFORMATION_CONTAINER); - // Change the information container from a text widget to a layer - parent.setType(WidgetType.LAYER); - parent.deleteAllChildren(); - - // Ultimate Iron men are always skulled and can't use the protect item prayer - WidgetButton protectItemButton = isProtectItemAllowed() - ? new WidgetButton(parent, "Protect Item Prayer", PROTECT_ITEM_SPRITE_ID, protectingItem, selected -> - { - protectingItem = selected; - rebuildItemsKeptOnDeathInterface(); - }) : null; - - WidgetButton skulledButton = !isUltimateIronman() - ? new WidgetButton(parent, "Skulled", SKULL_SPRITE_ID, isSkulled, selected -> - { - isSkulled = selected; - rebuildItemsKeptOnDeathInterface(); - }) : null; - - lowWildyButton = new WidgetButton(parent, "Low Wildy (1-20)", SWORD_SPRITE_ID, wildyLevel > 0 && wildyLevel <= DEEP_WILDY, selected -> - { - if (!selected) - { - syncWildernessLevel(); - } - else - { - wildyLevel = 1; - deepWildyButton.setSelected(false); - } - - rebuildItemsKeptOnDeathInterface(); - }); - - deepWildyButton = new WidgetButton(parent, "Deep Wildy (21+)", SKULL_2_SPRITE_ID, wildyLevel > DEEP_WILDY, selected -> - { - if (!selected) - { - syncWildernessLevel(); - } - else - { - wildyLevel = DEEP_WILDY + 1; - lowWildyButton.setSelected(false); - } - - rebuildItemsKeptOnDeathInterface(); - }); - - parent.revalidate(); - WidgetButton.layoutButtonsToContainer(parent, protectItemButton, skulledButton, lowWildyButton, deepWildyButton); - } - - /** - * Creates an Item Widget for use inside the Kept on Death Interface - * - * @param parent Widget to add element too as a child - * @param item the TempItem representing the item - * @param kept is the item being shown in the kept items container - * @return the Widget that was added to the `parent` - */ - private Widget createItemWidget(final Widget parent, final ItemStack item, boolean kept) - { - final int id = item.getId(); - final int qty = item.getQty(); - final ItemComposition c = itemManager.getItemComposition(id); - - final Widget itemWidget = parent.createChild(-1, WidgetType.GRAPHIC); - itemWidget.setOriginalWidth(Constants.ITEM_SPRITE_WIDTH); - itemWidget.setOriginalHeight(Constants.ITEM_SPRITE_HEIGHT); - itemWidget.setItemId(id); - itemWidget.setItemQuantity(qty); - itemWidget.setAction(1, String.format("Item: %s", c.getName())); - itemWidget.setOnOpListener(ScriptID.DEATH_KEEP_ITEM_EXAMINE, kept ? 1 : 0, qty, c.getName()); - itemWidget.setHasListener(true); - - final AlwaysLostItem alwaysLostItem = AlwaysLostItem.getByItemID(id); - final boolean whiteBorder = alwaysLostItem != null && (!alwaysLostItem.isKeptOutsideOfWilderness() || wildyLevel > 0); - itemWidget.setBorderType(whiteBorder ? 2 : 1); - - return itemWidget; - } -} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/LostIfNotProtected.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/LostIfNotProtected.java deleted file mode 100644 index 56a12c4b79..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/LostIfNotProtected.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2019, TheStonedTurtle - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.itemskeptondeath; - -import com.google.common.collect.ImmutableSet; -import java.util.Set; -import net.runelite.api.ItemID; - -final class LostIfNotProtected -{ - private static final Set ITEMS = ImmutableSet.of( - ItemID.AMULET_OF_THE_DAMNED, - ItemID.RING_OF_CHAROS, ItemID.RING_OF_CHAROSA, - ItemID.LUNAR_STAFF, - ItemID.SHADOW_SWORD, - ItemID.KERIS, ItemID.KERISP, ItemID.KERISP_10583, ItemID.KERISP_10584 - ); - - public static boolean isLostIfNotProtected(int id) - { - return ITEMS.contains(id); - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/Pets.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/Pets.java deleted file mode 100644 index 6a4592e6be..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/Pets.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2018 Abex - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.itemskeptondeath; - -import com.google.common.collect.ImmutableSet; -import java.util.Set; -import static net.runelite.api.ItemID.*; - -final class Pets -{ - private Pets() - { - } - - private static final Set PETS = ImmutableSet.of( - BABY_MOLE, - PRINCE_BLACK_DRAGON, - PET_CORPOREAL_CRITTER, PET_DARK_CORE, - JALNIBREK, TZREKZUK, - KALPHITE_PRINCESS, KALPHITE_PRINCESS_12654, - LIL_ZIK, - SKOTOS, - PET_SNAKELING, PET_SNAKELING_12939, PET_SNAKELING_12940, - TZREKJAD, - VORKI, - - OLMLET, PUPPADILE, TEKTINY, VANGUARD, VASA_MINIRIO, VESPINA, - - PET_DAGANNOTH_PRIME, PET_DAGANNOTH_REX, PET_DAGANNOTH_SUPREME, - - PET_GENERAL_GRAARDOR, PET_KRIL_TSUTSAROTH, PET_KREEARRA, PET_ZILYANA, - - ABYSSAL_ORPHAN, - HELLPUPPY, - PET_KRAKEN, - MIDNIGHT, NOON, - PET_SMOKE_DEVIL, PET_SMOKE_DEVIL_22663, - IKKLE_HYDRA, IKKLE_HYDRA_22748, IKKLE_HYDRA_22750, IKKLE_HYDRA_22752, - - CALLISTO_CUB, - PET_CHAOS_ELEMENTAL, - SCORPIAS_OFFSPRING, - VENENATIS_SPIDERLING, - VETION_JR, VETION_JR_13180, - - BABY_CHINCHOMPA, BABY_CHINCHOMPA_13324, BABY_CHINCHOMPA_13325, BABY_CHINCHOMPA_13326, - BEAVER, - GIANT_SQUIRREL, DARK_SQUIRREL, - HERON, - RIFT_GUARDIAN, RIFT_GUARDIAN_20667, RIFT_GUARDIAN_20669, RIFT_GUARDIAN_20671, RIFT_GUARDIAN_20673, RIFT_GUARDIAN_20675, - RIFT_GUARDIAN_20677, RIFT_GUARDIAN_20679, RIFT_GUARDIAN_20681, RIFT_GUARDIAN_20683, RIFT_GUARDIAN_20685, RIFT_GUARDIAN_20687, - RIFT_GUARDIAN_20689, RIFT_GUARDIAN_20691, RIFT_GUARDIAN_21990, - ROCK_GOLEM, ROCK_GOLEM_21187, ROCK_GOLEM_21188, ROCK_GOLEM_21189, ROCK_GOLEM_21190, ROCK_GOLEM_21191, ROCK_GOLEM_21192, - ROCK_GOLEM_21193, ROCK_GOLEM_21194, ROCK_GOLEM_21195, ROCK_GOLEM_21196, ROCK_GOLEM_21197, ROCK_GOLEM_21340, ROCK_GOLEM_21358, - ROCK_GOLEM_21359, ROCK_GOLEM_21360, - ROCKY, - TANGLEROOT, - - PET_KITTEN, PET_KITTEN_1556, PET_KITTEN_1557, PET_KITTEN_1558, PET_KITTEN_1559, PET_KITTEN_1560, - PET_CAT, PET_CAT_1562, PET_CAT_1563, PET_CAT_1564, PET_CAT_1565, PET_CAT_1566, PET_CAT_1567, PET_CAT_1568, PET_CAT_1569, - PET_CAT_1570, PET_CAT_1571, PET_CAT_1572, - LAZY_CAT, LAZY_CAT_6550, LAZY_CAT_6551, LAZY_CAT_6552, LAZY_CAT_6553, LAZY_CAT_6554, - WILY_CAT, WILY_CAT_6556, WILY_CAT_6557, WILY_CAT_6558, WILY_CAT_6559, WILY_CAT_6560, - OVERGROWN_HELLCAT, HELL_CAT, HELLKITTEN, LAZY_HELL_CAT, WILY_HELLCAT, - - BLOODHOUND, - CHOMPY_CHICK, - HERBI, - PET_PENANCE_QUEEN, - PHOENIX - ); - - public static boolean isPet(int id) - { - return PETS.contains(id); - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/WidgetButton.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/WidgetButton.java deleted file mode 100644 index 93cb27e41c..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemskeptondeath/WidgetButton.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (c) 2018, TheStonedTurtle - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.itemskeptondeath; - -import net.runelite.api.ScriptEvent; -import net.runelite.api.SpriteID; -import net.runelite.api.widgets.JavaScriptCallback; -import net.runelite.api.widgets.Widget; -import net.runelite.api.widgets.WidgetType; - -class WidgetButton -{ - private static final int ICON_HEIGHT = 26; - private static final int ICON_WIDTH = 26; - private static final int BACKGROUND_HEIGHT = 32; - private static final int BACKGROUND_WIDTH = 32; - private static final int PADDING = 5; - private static final int ICON_PADDING = (BACKGROUND_HEIGHT - ICON_HEIGHT) / 2; - - private static final int BACKGROUND_SPRITE_ID = SpriteID.EQUIPMENT_SLOT_TILE; - private static final int SELECTED_BACKGROUND_SPRITE_ID = SpriteID.EQUIPMENT_SLOT_SELECTED; - - @FunctionalInterface - public interface WidgetButtonCallback - { - void run(boolean newState); - } - - private final Widget parent; - private final String name; - private final int spriteID; - private boolean selected; - private final WidgetButtonCallback callback; - - private Widget icon; - private Widget background; - - WidgetButton( - final Widget parent, - final String name, - final int spriteID, - final boolean selectedStartState, - final WidgetButtonCallback callback) - { - this.parent = parent; - this.name = name; - this.spriteID = spriteID; - this.selected = selectedStartState; - this.callback = callback; - createBackgroundWidget(); - createIconWidget(); - } - - private void createBackgroundWidget() - { - background = createWidget(); - background.setOriginalWidth(BACKGROUND_WIDTH); - background.setOriginalHeight(BACKGROUND_HEIGHT); - syncBackgroundSprite(); - } - - private void createIconWidget() - { - icon = createWidget(); - icon.setAction(1, "Toggle:"); - icon.setOnOpListener((JavaScriptCallback) this::onButtonClicked); - icon.setOnMouseRepeatListener((JavaScriptCallback) e -> e.getSource().setOpacity(120)); - icon.setOnMouseLeaveListener((JavaScriptCallback) e -> e.getSource().setOpacity(0)); - icon.setHasListener(true); - icon.setSpriteId(spriteID); - } - - private Widget createWidget() - { - final Widget w = parent.createChild(-1, WidgetType.GRAPHIC); - w.setOriginalWidth(ICON_WIDTH); - w.setOriginalHeight(ICON_HEIGHT); - w.setName("" + this.name); - return w; - } - - public void setSelected(boolean selected) - { - this.selected = selected; - syncBackgroundSprite(); - } - - private void syncBackgroundSprite() - { - background.setSpriteId(selected ? SELECTED_BACKGROUND_SPRITE_ID : BACKGROUND_SPRITE_ID); - } - - /** - * Adds the collection of WidgetButtons to the container overriding any existing children. - * - * @param container Widget to add buttons too - * @param buttons buttons to add - */ - static void layoutButtonsToContainer(final Widget container, final WidgetButton... buttons) - { - // Each button has two widgets, Icon and Background - final int xIncrement = BACKGROUND_WIDTH + PADDING; - final int yIncrement = BACKGROUND_HEIGHT + PADDING; - int maxRowItems = container.getWidth() / xIncrement; - // Ensure at least 1 button per row - maxRowItems = maxRowItems < 1 ? 1 : maxRowItems; - - int index = 0; - for (final WidgetButton w : buttons) - { - if (w == null) - { - continue; - } - - final int originalX = ((index % maxRowItems) * xIncrement); - final int originalY = ((index / maxRowItems) * yIncrement); - w.background.setOriginalX(originalX); - w.background.setOriginalY(originalY); - w.background.revalidate(); - - // Icon must be padded to center inside image - w.icon.setOriginalX(originalX + ICON_PADDING); - w.icon.setOriginalY(originalY + ICON_PADDING); - w.icon.revalidate(); - - index++; - } - - final int numButtons = index; - final int rows = 1 + (numButtons > maxRowItems ? numButtons / maxRowItems : 0); - container.setOriginalHeight(yIncrement * rows); - container.revalidate(); - } - - private void onButtonClicked(ScriptEvent scriptEvent) - { - setSelected(!selected); - callback.run(selected); - } -} diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPluginTest.java deleted file mode 100644 index d9e15ae9a7..0000000000 --- a/runelite-client/src/test/java/net/runelite/client/plugins/itemskeptondeath/ItemsKeptOnDeathPluginTest.java +++ /dev/null @@ -1,659 +0,0 @@ -/* - * Copyright (c) 2019, TheStonedTurtle - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -package net.runelite.client.plugins.itemskeptondeath; - -import com.google.inject.Guice; -import com.google.inject.Inject; -import com.google.inject.testing.fieldbinder.Bind; -import com.google.inject.testing.fieldbinder.BoundFieldModule; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import net.runelite.api.Client; -import net.runelite.api.Item; -import net.runelite.api.ItemComposition; -import net.runelite.api.ItemID; -import net.runelite.client.game.ItemManager; -import static net.runelite.client.plugins.itemskeptondeath.ItemsKeptOnDeathPlugin.DeathItems; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; -import org.mockito.junit.MockitoJUnitRunner; - -@RunWith(MockitoJUnitRunner.class) -public class ItemsKeptOnDeathPluginTest -{ - @Mock - @Bind - private Client client; - - @Mock - @Bind - private ItemManager itemManager; - - @Inject - private ItemsKeptOnDeathPlugin plugin; - - @Before - public void before() - { - Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); - resetBuffs(); - } - - private void resetBuffs() - { - plugin.isSkulled = false; - plugin.protectingItem = false; - plugin.wildyLevel = -1; - } - - // Mocks an item and the necessary itemManager functions for it - private Item mItem(final int id, final int qty, final String name, final boolean tradeable, final int price) - { - // Mock Item Composition and necessary ItemManager methods for this item - ItemComposition c = mock(ItemComposition.class); - when(c.getId()) - .thenReturn(id); - when(c.getName()) - .thenReturn(name); - when(c.isTradeable()) - .thenReturn(tradeable); - when(c.getPrice()) - .thenReturn(price); - - if (!tradeable) - { - when(c.getNote()).thenReturn(-1); - when(c.getLinkedNoteId()).thenReturn(-1); - } - - when(itemManager.getItemComposition(id)).thenReturn(c); - when(itemManager.canonicalize(id)).thenReturn(id); - when(itemManager.getItemPrice(id, true)).thenReturn(price); - - return item(id, qty); - } - - // Creates a new item - private static Item item(final int id, final int qty) - { - return new Item(id, qty); - } - - @Test - public void deathPriceTestRegularItems() - { - final Item acs = mItem(ItemID.ARMADYL_CHAINSKIRT, 1, "Armadyl chainskirt", true, 27837495); - assertEquals(27837495, plugin.getDeathPrice(acs)); - - final Item karambwan = mItem(ItemID.COOKED_KARAMBWAN, 1, "Cooked karambwan", true, 608); - assertEquals(608, plugin.getDeathPrice(karambwan)); - - final Item defender = mItem(ItemID.RUNE_DEFENDER, 1, "Rune defender", false, 35000); - assertEquals(35000, plugin.getDeathPrice(defender)); - } - - @Test - public void deathPriceTestItemMapping() - { - mItem(ItemID.OCCULT_NECKLACE, 1, "Occult necklace", true, 1000000); - mItem(ItemID.OCCULT_ORNAMENT_KIT, 1, "Occult ornament kit", true, 3000000); - final Item occult = mItem(ItemID.OCCULT_NECKLACE_OR, 1, "Occult necklace (or)", false, 0); - assertEquals(4000000, plugin.getDeathPrice(occult)); - - mItem(ItemID.BLACK_MASK, 1, "Black mask", true, 1000000); - final Item blackMask8 = mItem(ItemID.BLACK_MASK_8, 1, "Black mask (8)", false, 0); - assertEquals(1000000, plugin.getDeathPrice(blackMask8)); - final Item slayerHelm = mItem(ItemID.SLAYER_HELMET, 1, "Slayer helmet", false, 0); - assertEquals(1000000, plugin.getDeathPrice(slayerHelm)); - } - - @Test - public void deathPriceTestFixedPriceItems() - { - mItem(ItemID.KARILS_COIF_0, 1, "Karil's coif 0", true, 35000); - final Item coif = mItem(ItemID.KARILS_COIF_100, 1, "Karil's coif 100", false, 0); - final int coifOffset = FixedPriceItem.KARILS_COIF_100.getOffset(); - assertEquals(35000 + coifOffset, plugin.getDeathPrice(coif)); - - mItem(ItemID.AHRIMS_ROBETOP_0, 1, "Ahrim's robetop 0", true, 2500000); - final Item robetop = mItem(ItemID.AHRIMS_ROBETOP_25, 1, "Ahrim's robetop 100", false, 0); - final int robetopOffset = FixedPriceItem.AHRIMS_ROBETOP_25.getOffset(); - assertEquals(2500000 + robetopOffset, plugin.getDeathPrice(robetop)); - - mItem(ItemID.AMULET_OF_GLORY, 1, "Amulet of glory", true, 13000); - final Item glory = mItem(ItemID.AMULET_OF_GLORY3, 1, "Amulet of glory(3)", true, 0); - final int gloryOffset = FixedPriceItem.AMULET_OF_GLORY3.getOffset(); - assertEquals(13000 + gloryOffset, plugin.getDeathPrice(glory)); - - mItem(ItemID.COMBAT_BRACELET, 1, "Combat bracelet", true, 13500); - final Item brace = mItem(ItemID.COMBAT_BRACELET1, 1, "Combat bracelet(1)", true, 0); - final int braceletOffset = FixedPriceItem.COMBAT_BRACELET1.getOffset(); - assertEquals(13500 + braceletOffset, plugin.getDeathPrice(brace)); - - final Item amulet = mItem(ItemID.SALVE_AMULETEI, 1, "Salve Amulet(ei)", false, 300); - assertEquals(210200, plugin.getDeathPrice(amulet)); - } - - @Test - public void deathPriceTestDynamicPriceItems() - { - final Item rod8 = mItem(ItemID.RING_OF_DUELING8, 1, "Ring of dueling(8)", true, 725); - final Item rod3 = mItem(ItemID.RING_OF_DUELING3, 1, "Ring of dueling(3)", true, 0); - final Item rod1 = mItem(ItemID.RING_OF_DUELING1, 1, "Ring of dueling(1)", true, 0); - // Dynamic price items - final int rodPrice = 725 / 8; - assertEquals(rodPrice, plugin.getDeathPrice(rod1)); - assertEquals(725, plugin.getDeathPrice(rod8)); - assertEquals(rodPrice * 3, plugin.getDeathPrice(rod3)); - - final Item nop5 = mItem(ItemID.NECKLACE_OF_PASSAGE5, 1, "Necklace of passage(5)", true, 1250); - final Item nop4 = mItem(ItemID.NECKLACE_OF_PASSAGE4, 1, "Necklace of passage(4)", true, 0); - final Item nop2 = mItem(ItemID.NECKLACE_OF_PASSAGE2, 1, "Necklace of passage(2)", true, 0); - - final int nopPrice = 1250 / 5; - assertEquals(nopPrice * 2, plugin.getDeathPrice(nop2)); - assertEquals(nopPrice * 4, plugin.getDeathPrice(nop4)); - assertEquals(1250, plugin.getDeathPrice(nop5)); - } - - private Item[] getFourExpensiveItems() - { - return new Item[] - { - mItem(ItemID.TWISTED_BOW, 1, "Twister bow", true, Integer.MAX_VALUE), - mItem(ItemID.SCYTHE_OF_VITUR, 1, "Scythe of vitur", true, Integer.MAX_VALUE), - mItem(ItemID.ELYSIAN_SPIRIT_SHIELD, 1, "Elysian spirit shield", true, 800000000), - mItem(ItemID.ARCANE_SPIRIT_SHIELD, 1, "Arcane spirit shield", true, 250000000) - }; - } - - @Test - public void alwaysLostTestRunePouch() - { - final Item[] inv = getFourExpensiveItems(); - final Item[] equip = new Item[] - { - mItem(ItemID.RUNE_POUCH, 1, "Rune pouch", false, 1) - }; - - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, equip); - assertFalse(deathItems.isHasAlwaysLost()); - } - - @Test - public void alwaysLostTestRunePouchWildy() - { - final Item[] inv = getFourExpensiveItems(); - final Item[] equip = new Item[] - { - mItem(ItemID.RUNE_POUCH, 1, "Rune pouch", false, 1) - }; - - plugin.wildyLevel = 1; - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, equip); - assertTrue(deathItems.isHasAlwaysLost()); - } - - @Test - public void alwaysLostTestLootBag() - { - final Item[] inv = getFourExpensiveItems(); - final Item[] equip = new Item[] - { - mItem(ItemID.LOOTING_BAG, 1, "Looting bag", false, 1) - }; - - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, equip); - assertTrue(deathItems.isHasAlwaysLost()); - - } - - @Test - public void alwaysLostTestLootBagWildy() - { - final Item[] inv = getFourExpensiveItems(); - final Item[] equip = new Item[] - { - mItem(ItemID.LOOTING_BAG, 1, "Looting bag", false, 1) - }; - - plugin.wildyLevel = 1; - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, equip); - assertTrue(deathItems.isHasAlwaysLost()); - } - - private Item[] getClueBoxTestInventory() - { - return new Item[] - { - mItem(ItemID.BLACK_DHIDE_BODY, 1, "Black d'hide body", true, 7552), - mItem(ItemID.ARMADYL_CHAINSKIRT, 1, "Armadyl chainskirt", true, 27837495), - mItem(ItemID.PEGASIAN_BOOTS, 1, "Pegasian boots", true, 30542187), - mItem(ItemID.DRAGON_SCIMITAR, 1, "Dragon scimitar", true, 63123), - - mItem(ItemID.HELM_OF_NEITIZNOT, 1, "Helm of neitiznot", true, 45519), - mItem(ItemID.RUNE_DEFENDER, 1, "Rune defender", false, 35000), - mItem(ItemID.SPADE, 1, "Spade", true, 104), - mItem(ItemID.CLUE_SCROLL_EASY, 1, "Clue scroll (easy)", false, 50), - - mItem(ItemID.CLUE_BOX, 1, "Clue box", false, 50), - mItem(ItemID.COOKED_KARAMBWAN, 1, "Cooked karambwan", true, 608), - mItem(ItemID.COOKED_KARAMBWAN, 1, "Cooked karambwan", true, 608), - mItem(ItemID.COOKED_KARAMBWAN, 1, "Cooked karambwan", true, 608), - - mItem(ItemID.COOKED_KARAMBWAN, 1, "Cooked karambwan", true, 608), - mItem(ItemID.COOKED_KARAMBWAN, 1, "Cooked karambwan", true, 608), - mItem(ItemID.LAW_RUNE, 200, "Law rune", true, 212), - mItem(ItemID.DUST_RUNE, 200, "Dust rune", true, 3), - - mItem(ItemID.CLUE_SCROLL_MASTER, 1, "Clue scroll (master)", false, 50), - mItem(ItemID.CLUELESS_SCROLL, 1, "Clueless scroll", false, 50), - }; - } - - @Test - public void isClueBoxableTest() - { - getClueBoxTestInventory(); - mItem(ItemID.REWARD_CASKET_EASY, 1, "Reward casket (easy)", false, 50); - - assertTrue(plugin.isClueBoxable(ItemID.CLUE_SCROLL_EASY)); - assertTrue(plugin.isClueBoxable(ItemID.CLUE_SCROLL_MASTER)); - assertTrue(plugin.isClueBoxable(ItemID.REWARD_CASKET_EASY)); - - assertFalse(plugin.isClueBoxable(ItemID.CLUELESS_SCROLL)); - assertFalse(plugin.isClueBoxable(ItemID.LAW_RUNE)); - assertFalse(plugin.isClueBoxable(ItemID.SPADE)); - } - - @Test - public void clueBoxTestDefault() - { - final Item[] inv = getClueBoxTestInventory(); - final Item[] equip = new Item[0]; - - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, equip); - - final List kept = deathItems.getKeptItems(); - final List expectedKept = Arrays.asList( - new ItemStack(ItemID.PEGASIAN_BOOTS, 1), - new ItemStack(ItemID.ARMADYL_CHAINSKIRT, 1), - new ItemStack(ItemID.DRAGON_SCIMITAR, 1), - new ItemStack(ItemID.RUNE_DEFENDER, 1), - new ItemStack(ItemID.CLUE_SCROLL_EASY, 1), - new ItemStack(ItemID.CLUE_SCROLL_MASTER, 1), - new ItemStack(ItemID.CLUELESS_SCROLL, 1) - ); - assertEquals(expectedKept, kept); - - final List lost = deathItems.getLostItems(); - assertEquals((inv.length + equip.length) - expectedKept.size(), lost.size()); - } - - @Test - public void clueBoxTestDeepWildy() - { - final Item[] inv = getClueBoxTestInventory(); - final Item[] equip = new Item[0]; - - plugin.wildyLevel = 21; - - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, equip); - - final List kept = deathItems.getKeptItems(); - final List expectedKept = Arrays.asList( - new ItemStack(ItemID.PEGASIAN_BOOTS, 1), - new ItemStack(ItemID.ARMADYL_CHAINSKIRT, 1), - new ItemStack(ItemID.DRAGON_SCIMITAR, 1), - new ItemStack(ItemID.CLUE_SCROLL_MASTER, 1) - ); - assertEquals(expectedKept, kept); - - final List lost = deathItems.getLostItems(); - final int keptOffset = expectedKept.size(); - assertEquals((inv.length + equip.length) - keptOffset, lost.size()); - } - - @Test - public void clueBoxTestDeepWildyProtectItem() - { - final Item[] inv = getClueBoxTestInventory(); - final Item[] equip = new Item[0]; - - plugin.wildyLevel = 21; - plugin.protectingItem = true; - - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, equip); - - final List kept = deathItems.getKeptItems(); - final List expectedKept = Arrays.asList( - new ItemStack(ItemID.PEGASIAN_BOOTS, 1), - new ItemStack(ItemID.ARMADYL_CHAINSKIRT, 1), - new ItemStack(ItemID.DRAGON_SCIMITAR, 1), - new ItemStack(ItemID.HELM_OF_NEITIZNOT, 1), - new ItemStack(ItemID.CLUE_SCROLL_MASTER, 1) // Clue box - ); - assertEquals(expectedKept, kept); - - final List lost = deathItems.getLostItems(); - final int keptOffset = expectedKept.size(); - assertEquals((inv.length + equip.length) - keptOffset, lost.size()); - } - - @Test - public void clueBoxTestDeepWildySkulled() - { - final Item[] inv = getClueBoxTestInventory(); - final Item[] equip = new Item[0]; - - plugin.wildyLevel = 21; - plugin.isSkulled = true; - - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, equip); - - final List kept = deathItems.getKeptItems(); - final List expectedKept = Collections.singletonList( - new ItemStack(ItemID.CLUE_SCROLL_MASTER, 1) - ); - assertEquals(expectedKept, kept); - - final List lost = deathItems.getLostItems(); - final int keptOffset = expectedKept.size(); - assertEquals(lost.size(), (inv.length + equip.length) - keptOffset); - } - - @Test - public void clueBoxTestLowWildy() - { - final Item[] inv = getClueBoxTestInventory(); - final Item[] equip = new Item[0]; - - plugin.wildyLevel = 1; - - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, equip); - - final List kept = deathItems.getKeptItems(); - final List expectedKept = Arrays.asList( - new ItemStack(ItemID.PEGASIAN_BOOTS, 1), - new ItemStack(ItemID.ARMADYL_CHAINSKIRT, 1), - new ItemStack(ItemID.DRAGON_SCIMITAR, 1), - new ItemStack(ItemID.RUNE_DEFENDER, 1), // Rune defender protected because of broken variant - new ItemStack(ItemID.CLUE_SCROLL_MASTER, 1) - ); - assertEquals(expectedKept, kept); - - final List lost = deathItems.getLostItems(); - final int keptOffset = expectedKept.size(); - assertEquals(lost.size(), (inv.length + equip.length) - keptOffset); - } - - @Test - public void clueBoxTestLowWildyProtectItem() - { - final Item[] inv = getClueBoxTestInventory(); - final Item[] equip = new Item[0]; - - plugin.wildyLevel = 1; - plugin.protectingItem = true; - - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, equip); - - final List kept = deathItems.getKeptItems(); - final List expectedKept = Arrays.asList( - new ItemStack(ItemID.PEGASIAN_BOOTS, 1), - new ItemStack(ItemID.ARMADYL_CHAINSKIRT, 1), - new ItemStack(ItemID.DRAGON_SCIMITAR, 1), - new ItemStack(ItemID.HELM_OF_NEITIZNOT, 1), - new ItemStack(ItemID.RUNE_DEFENDER, 1), // Rune defender protected because of broken variant - new ItemStack(ItemID.CLUE_SCROLL_MASTER, 1) - ); - assertEquals(expectedKept, kept); - - final List lost = deathItems.getLostItems(); - final int keptOffset = expectedKept.size(); - assertEquals((inv.length + equip.length) - keptOffset, lost.size()); - } - - @Test - public void clueBoxTestLowWildySkulled() - { - final Item[] inv = getClueBoxTestInventory(); - final Item[] equip = new Item[0]; - - plugin.wildyLevel = 1; - plugin.isSkulled = true; - - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, equip); - - final List kept = deathItems.getKeptItems(); - final List expectedKept = Arrays.asList( - new ItemStack(ItemID.RUNE_DEFENDER, 1), // Rune defender protected because of broken variant - new ItemStack(ItemID.CLUE_SCROLL_MASTER, 1) - ); - assertEquals(expectedKept, kept); - - final List lost = deathItems.getLostItems(); - final int keptOffset = expectedKept.size(); - assertEquals((inv.length + equip.length) - keptOffset, lost.size()); - } - - private Item[] getClueBoxCasketTestInventory() - { - // Reward caskets can stack but the clue box should only protect one - return new Item[] - { - mItem(ItemID.BLACK_DHIDE_BODY, 1, "Black d'hide body", true, 7552), - mItem(ItemID.ARMADYL_CHAINSKIRT, 1, "Armadyl chainskirt", true, 27837495), - mItem(ItemID.PEGASIAN_BOOTS, 1, "Pegasian boots", true, 30542187), - mItem(ItemID.DRAGON_SCIMITAR, 1, "Dragon scimitar", true, 63123), - - mItem(ItemID.SPADE, 1, "Spade", true, 104), - mItem(ItemID.CLUE_SCROLL_EASY, 1, "Clue scroll (easy)", false, 50), - mItem(ItemID.REWARD_CASKET_EASY, 20, "Reward casket (easy)", false, 50), - mItem(ItemID.CLUE_BOX, 1, "Clue box", false, 50), - - mItem(ItemID.COOKED_KARAMBWAN, 1, "Cooked karambwan", true, 608), - mItem(ItemID.COOKED_KARAMBWAN, 1, "Cooked karambwan", true, 608), - mItem(ItemID.COOKED_KARAMBWAN, 1, "Cooked karambwan", true, 608), - mItem(ItemID.COOKED_KARAMBWAN, 1, "Cooked karambwan", true, 608), - - mItem(ItemID.LAW_RUNE, 200, "Law rune", true, 212), - mItem(ItemID.DUST_RUNE, 200, "Dust rune", true, 3), - }; - } - - @Test - public void clueBoxTestCasketProtect() - { - final Item[] inv = getClueBoxCasketTestInventory(); - final Item[] equip = new Item[0]; - - plugin.wildyLevel = 1; - - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, equip); - - final List kept = deathItems.getKeptItems(); - final List expectedKept = Arrays.asList( - new ItemStack(ItemID.PEGASIAN_BOOTS, 1), - new ItemStack(ItemID.ARMADYL_CHAINSKIRT, 1), - new ItemStack(ItemID.DRAGON_SCIMITAR, 1), - new ItemStack(ItemID.REWARD_CASKET_EASY, 1) // Clue box - ); - assertEquals(expectedKept, kept); - - final List lost = deathItems.getLostItems(); - final int keptOffset = expectedKept.size() - 1; // We are still losing some reward caskets. - assertEquals((inv.length + equip.length) - keptOffset, lost.size()); - } - - private Item[] getFullGracefulItems() - { - return new Item[] - { - mItem(ItemID.GRACEFUL_HOOD, 1, "Graceful hood", false, 35), - mItem(ItemID.GRACEFUL_CAPE, 1, "Graceful cape", false, 40), - mItem(ItemID.GRACEFUL_TOP, 1, "Graceful top", false, 55), - mItem(ItemID.GRACEFUL_LEGS, 1, "Graceful legs", false, 60), - mItem(ItemID.GRACEFUL_BOOTS, 1, "Graceful boots", false, 40), - mItem(ItemID.GRACEFUL_GLOVES, 1, "Graceful gloves", false, 30), - }; - } - - @Test - public void gracefulValueTest() - { - final Item[] inv = getFullGracefulItems(); - final Item[] equip = new Item[] - { - mItem(ItemID.AMULET_OF_GLORY6, 1, "Amulet of glory (6)", true, 20000) - }; - - - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, equip); - - final List kept = deathItems.getKeptItems(); - final List expectedKept = Arrays.asList( - new ItemStack(ItemID.AMULET_OF_GLORY6, 1), - new ItemStack(ItemID.GRACEFUL_CAPE, 1), - new ItemStack(ItemID.GRACEFUL_TOP, 1), - new ItemStack(ItemID.GRACEFUL_LEGS, 1), - new ItemStack(ItemID.GRACEFUL_BOOTS, 1), - new ItemStack(ItemID.GRACEFUL_HOOD, 1), - new ItemStack(ItemID.GRACEFUL_GLOVES, 1) - ); - assertEquals(expectedKept, kept); - - final List lost = deathItems.getLostItems(); - assertEquals((inv.length + equip.length) - expectedKept.size(), lost.size()); - } - - @Test - public void gracefulValueTestWildy() - { - final Item[] inv = getFullGracefulItems(); - final Item[] equip = new Item[] - { - mItem(ItemID.AMULET_OF_GLORY6, 1, "Amulet of glory (6)", true, 20000) - }; - - plugin.wildyLevel = 1; - - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, equip); - - final List kept = deathItems.getKeptItems(); - final List expectedKept = Arrays.asList( - new ItemStack(ItemID.AMULET_OF_GLORY6, 1), - new ItemStack(ItemID.GRACEFUL_CAPE, 1), - new ItemStack(ItemID.GRACEFUL_TOP, 1) - ); - assertEquals(expectedKept, kept); - - final List lost = deathItems.getLostItems(); - assertEquals((inv.length + equip.length) - expectedKept.size(), lost.size()); - } - - @Test - public void lostIfNotProtectedTestLost() - { - final Item[] inv = getFourExpensiveItems(); - final Item[] equip = new Item[] - { - mItem(ItemID.SHADOW_SWORD, 1, "Shadow sword", false, 1) - }; - - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, equip); - - final List lost = deathItems.getLostItems(); - assertTrue(lost.contains(new ItemStack(ItemID.SHADOW_SWORD, 1))); - } - - @Test - public void lostIfNotProtectedTestKept() - { - final Item[] inv = new Item[] - { - mItem(ItemID.SHADOW_SWORD, 1, "Shadow sword", false, 1) - }; - final Item[] equip = new Item[0]; - - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, equip); - - final List kept = deathItems.getKeptItems(); - assertTrue(kept.contains(new ItemStack(ItemID.SHADOW_SWORD, 1))); - } - - @Test - public void brokenOnDeathTestRepairPrice() - { - // Dragon defender price should actually be pulled from BrokenOnDeathItem, and be lost on death - final Item[] inv = new Item[] - { - mItem(ItemID.BARROWS_GLOVES, 1, "Barrows gloves", false, 130000), - mItem(ItemID.DRAGON_DEFENDER, 1, "Dragon defender", false, 68007), - mItem(ItemID.DRAGON_SCIMITAR, 1, "Dragon scimitar", true, 63123), - mItem(ItemID.HELM_OF_NEITIZNOT, 1, "Helm of neitiznot", true, 45519), - }; - - plugin.wildyLevel = 21; - - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, new Item[0]); - - final List lost = deathItems.getLostItems(); - assertTrue(lost.contains(new ItemStack(ItemID.DRAGON_DEFENDER, 1))); - } - - @Test - public void avernicDefenderPriceTest() - { - final Item defender = mItem(ItemID.AVERNIC_DEFENDER, 1, "Avernic defender", false, 0); - final int defenderOffset = FixedPriceItem.AVERNIC_DEFENDER.getOffset(); - final Integer defenderBrokenPrice = BrokenOnDeathItem.getRepairPrice(ItemID.AVERNIC_DEFENDER); - final int defenderExpectedPrice = (defenderBrokenPrice == null ? 0 : defenderBrokenPrice) + defenderOffset; - assertEquals(defenderExpectedPrice, plugin.getDeathPrice(defender)); - - final Item[] inv = new Item[] - { - defender, - mItem(ItemID.BERSERKER_RING_I, 1, "Berserker Ring (i)", false, 3042579) - }; - - plugin.isSkulled = true; - plugin.protectingItem = true; - plugin.wildyLevel = 21; - - final DeathItems deathItems = plugin.calculateKeptLostItems(inv, new Item[0]); - - final List kept = deathItems.getKeptItems(); - assertTrue(kept.contains(new ItemStack(ItemID.AVERNIC_DEFENDER, 1))); - } -}