client: remove itemskeptondeath plugin
This is being superseded in the game update tomorrow - https://twitter.com/JagexAsh/status/1275786030038335488
This commit is contained in:
@@ -1,67 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2018, TheStonedTurtle <https://github.com/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<Integer, AlwaysLostItem> ID_MAP;
|
||||
|
||||
static
|
||||
{
|
||||
final ImmutableMap.Builder<Integer, AlwaysLostItem> 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);
|
||||
}
|
||||
}
|
||||
@@ -1,113 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2018, TheStonedTurtle <https://github.com/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<Integer, Integer> REPAIR_MAP;
|
||||
|
||||
static
|
||||
{
|
||||
final ImmutableMap.Builder<Integer, Integer> 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);
|
||||
}
|
||||
}
|
||||
@@ -1,107 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2019, TheStonedTurtle <https://github.com/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<Integer, DynamicPriceItem> DYNAMIC_ITEMS;
|
||||
|
||||
static
|
||||
{
|
||||
final ImmutableMap.Builder<Integer, DynamicPriceItem> 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);
|
||||
}
|
||||
}
|
||||
@@ -1,259 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2019, Adam <Adam@sigterm.info>
|
||||
* Copyright (c) 2019, TheStonedTurtle <https://github.com/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<Integer, FixedPriceItem> FIXED_ITEMS;
|
||||
|
||||
static
|
||||
{
|
||||
final ImmutableMap.Builder<Integer, FixedPriceItem> 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);
|
||||
}
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2019, TheStonedTurtle <https://github.com/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;
|
||||
}
|
||||
@@ -1,731 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2018, TheStonedTurtle <https://github.com/TheStonedTurtle>
|
||||
* Copyright (c) 2019, Adam <Adam@sigterm.info>
|
||||
* 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<ItemStack> keptItems;
|
||||
private final List<ItemStack> 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 = "<br>";
|
||||
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<WorldType> 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<Widget> keptItems = deathItems.getKeptItems().stream()
|
||||
.map(item -> createItemWidget(kept, item, true)).collect(Collectors.toList());
|
||||
final List<Widget> 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<Item> 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<ItemStack> keptItems = new ArrayList<>();
|
||||
final List<ItemStack> 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<Widget> 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 <col=FFFFFF>UIM<col=FF981F> which means <col=FFFFFF>0<col=FF981F> items are protected by default");
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append("<col=FFFFFF>3<col=FF981F> items protected by default");
|
||||
|
||||
if (isSkulled)
|
||||
{
|
||||
sb.append(LINE_BREAK)
|
||||
.append("<col=ff3333>PK skull<col=ff981f> -3");
|
||||
}
|
||||
|
||||
if (protectingItem)
|
||||
{
|
||||
sb.append(LINE_BREAK)
|
||||
.append("<col=ff3333>Protect Item prayer<col=ff981f> +1");
|
||||
}
|
||||
|
||||
sb.append(LINE_BREAK)
|
||||
.append(String.format("Actually protecting <col=FFFFFF>%s<col=FF981F> 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 <col=ffffff>white outline<col=ff981f> 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<Widget> keptItems, final List<Widget> 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("<col=ffcc33>Max items kept on death:<br><br><col=ffcc33>~ %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: <col=ff981f>%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;
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2019, TheStonedTurtle <https://github.com/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<Integer> 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);
|
||||
}
|
||||
}
|
||||
@@ -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<Integer> 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);
|
||||
}
|
||||
}
|
||||
@@ -1,163 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2018, TheStonedTurtle <https://github.com/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("<col=ff981f>" + 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);
|
||||
}
|
||||
}
|
||||
@@ -1,659 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2019, TheStonedTurtle <https://github.com/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<ItemStack> kept = deathItems.getKeptItems();
|
||||
final List<ItemStack> 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<ItemStack> 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<ItemStack> kept = deathItems.getKeptItems();
|
||||
final List<ItemStack> 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<ItemStack> 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<ItemStack> kept = deathItems.getKeptItems();
|
||||
final List<ItemStack> 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<ItemStack> 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<ItemStack> kept = deathItems.getKeptItems();
|
||||
final List<ItemStack> expectedKept = Collections.singletonList(
|
||||
new ItemStack(ItemID.CLUE_SCROLL_MASTER, 1)
|
||||
);
|
||||
assertEquals(expectedKept, kept);
|
||||
|
||||
final List<ItemStack> 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<ItemStack> kept = deathItems.getKeptItems();
|
||||
final List<ItemStack> 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<ItemStack> 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<ItemStack> kept = deathItems.getKeptItems();
|
||||
final List<ItemStack> 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<ItemStack> 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<ItemStack> kept = deathItems.getKeptItems();
|
||||
final List<ItemStack> 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<ItemStack> 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<ItemStack> kept = deathItems.getKeptItems();
|
||||
final List<ItemStack> 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<ItemStack> 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<ItemStack> kept = deathItems.getKeptItems();
|
||||
final List<ItemStack> 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<ItemStack> 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<ItemStack> kept = deathItems.getKeptItems();
|
||||
final List<ItemStack> 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<ItemStack> 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<ItemStack> 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<ItemStack> 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<ItemStack> 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<ItemStack> kept = deathItems.getKeptItems();
|
||||
assertTrue(kept.contains(new ItemStack(ItemID.AVERNIC_DEFENDER, 1)));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user