Merge pull request #9427 from TheStonedTurtle/death-never-ends
Items Kept on Death - Fix breakable death prices
This commit is contained in:
@@ -24,7 +24,8 @@
|
|||||||
*/
|
*/
|
||||||
package net.runelite.client.plugins.itemskeptondeath;
|
package net.runelite.client.plugins.itemskeptondeath;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import net.runelite.api.ItemID;
|
import net.runelite.api.ItemID;
|
||||||
|
|
||||||
@@ -37,75 +38,76 @@ import net.runelite.api.ItemID;
|
|||||||
enum BrokenOnDeathItem
|
enum BrokenOnDeathItem
|
||||||
{
|
{
|
||||||
// Capes
|
// Capes
|
||||||
FIRE_CAPE(ItemID.FIRE_CAPE),
|
FIRE_CAPE(ItemID.FIRE_CAPE, 50000),
|
||||||
FIRE_MAX_CAPE(ItemID.FIRE_MAX_CAPE),
|
FIRE_MAX_CAPE(ItemID.FIRE_MAX_CAPE, 50000),
|
||||||
INFERNAL_CAPE(ItemID.INFERNAL_CAPE),
|
INFERNAL_CAPE(ItemID.INFERNAL_CAPE, 50000),
|
||||||
INFERNAL_MAX_CAPE(ItemID.INFERNAL_MAX_CAPE),
|
INFERNAL_MAX_CAPE(ItemID.INFERNAL_MAX_CAPE, 50000),
|
||||||
AVAS_ASSEMBLER(ItemID.AVAS_ASSEMBLER),
|
AVAS_ASSEMBLER(ItemID.AVAS_ASSEMBLER, 75000),
|
||||||
ASSEMBLER_MAX_CAPE(ItemID.ASSEMBLER_MAX_CAPE),
|
ASSEMBLER_MAX_CAPE(ItemID.ASSEMBLER_MAX_CAPE, 75000),
|
||||||
|
|
||||||
// Defenders
|
// Defenders
|
||||||
BRONZE_DEFENDER(ItemID.BRONZE_DEFENDER),
|
BRONZE_DEFENDER(ItemID.BRONZE_DEFENDER, 1000),
|
||||||
IRON_DEFENDER(ItemID.IRON_DEFENDER),
|
IRON_DEFENDER(ItemID.IRON_DEFENDER, 2000),
|
||||||
STEEL_DEFENDER(ItemID.STEEL_DEFENDER),
|
STEEL_DEFENDER(ItemID.STEEL_DEFENDER, 2500),
|
||||||
BLACK_DEFENDER(ItemID.BLACK_DEFENDER),
|
BLACK_DEFENDER(ItemID.BLACK_DEFENDER, 5000),
|
||||||
MITHRIL_DEFENDER(ItemID.MITHRIL_DEFENDER),
|
MITHRIL_DEFENDER(ItemID.MITHRIL_DEFENDER, 15000),
|
||||||
ADAMANT_DEFENDER(ItemID.ADAMANT_DEFENDER),
|
ADAMANT_DEFENDER(ItemID.ADAMANT_DEFENDER, 25000),
|
||||||
RUNE_DEFENDER(ItemID.RUNE_DEFENDER),
|
RUNE_DEFENDER(ItemID.RUNE_DEFENDER, 35000),
|
||||||
DRAGON_DEFENDER(ItemID.DRAGON_DEFENDER),
|
DRAGON_DEFENDER(ItemID.DRAGON_DEFENDER, 40000),
|
||||||
AVERNIC_DEFENDER(ItemID.AVERNIC_DEFENDER),
|
AVERNIC_DEFENDER(ItemID.AVERNIC_DEFENDER, 1000000),
|
||||||
|
|
||||||
// Void
|
// Void
|
||||||
VOID_MAGE_HELM(ItemID.VOID_MAGE_HELM),
|
VOID_MAGE_HELM(ItemID.VOID_MAGE_HELM, 40000),
|
||||||
VOID_RANGER_HELM(ItemID.VOID_RANGER_HELM),
|
VOID_RANGER_HELM(ItemID.VOID_RANGER_HELM, 40000),
|
||||||
VOID_MELEE_HELM(ItemID.VOID_MELEE_HELM),
|
VOID_MELEE_HELM(ItemID.VOID_MELEE_HELM, 40000),
|
||||||
VOID_KNIGHT_TOP(ItemID.VOID_KNIGHT_TOP),
|
VOID_KNIGHT_TOP(ItemID.VOID_KNIGHT_TOP, 45000),
|
||||||
VOID_KNIGHT_ROBE(ItemID.VOID_KNIGHT_ROBE),
|
VOID_KNIGHT_ROBE(ItemID.VOID_KNIGHT_ROBE, 45000),
|
||||||
VOID_KNIGHT_GLOVES(ItemID.VOID_KNIGHT_GLOVES),
|
VOID_KNIGHT_GLOVES(ItemID.VOID_KNIGHT_GLOVES, 30000),
|
||||||
VOID_KNIGHT_MACE(ItemID.VOID_KNIGHT_MACE),
|
ELITE_VOID_TOP(ItemID.ELITE_VOID_TOP, 50000),
|
||||||
ELITE_VOID_TOP(ItemID.ELITE_VOID_TOP),
|
ELITE_VOID_ROBE(ItemID.ELITE_VOID_ROBE, 50000),
|
||||||
ELITE_VOID_ROBE(ItemID.ELITE_VOID_ROBE),
|
|
||||||
|
|
||||||
// Barb Assault
|
// Barb Assault
|
||||||
FIGHTER_HAT(ItemID.FIGHTER_HAT),
|
FIGHTER_HAT(ItemID.FIGHTER_HAT, 45000),
|
||||||
RANGER_HAT(ItemID.RANGER_HAT),
|
RANGER_HAT(ItemID.RANGER_HAT, 45000),
|
||||||
HEALER_HAT(ItemID.HEALER_HAT),
|
HEALER_HAT(ItemID.HEALER_HAT, 45000),
|
||||||
FIGHTER_TORSO(ItemID.FIGHTER_TORSO),
|
FIGHTER_TORSO(ItemID.FIGHTER_TORSO, 50000),
|
||||||
PENANCE_SKIRT(ItemID.PENANCE_SKIRT),
|
PENANCE_SKIRT(ItemID.PENANCE_SKIRT, 20000),
|
||||||
|
|
||||||
// Castle Wars
|
// Castle Wars
|
||||||
SARADOMIN_HALO(ItemID.SARADOMIN_HALO),
|
SARADOMIN_HALO(ItemID.SARADOMIN_HALO, 25000),
|
||||||
ZAMORAK_HALO(ItemID.ZAMORAK_HALO),
|
ZAMORAK_HALO(ItemID.ZAMORAK_HALO, 25000),
|
||||||
GUTHIX_HALO(ItemID.GUTHIX_HALO),
|
GUTHIX_HALO(ItemID.GUTHIX_HALO, 25000),
|
||||||
DECORATIVE_MAGIC_HAT(ItemID.DECORATIVE_ARMOUR_11898),
|
DECORATIVE_MAGIC_HAT(ItemID.DECORATIVE_ARMOUR_11898, 5000),
|
||||||
DECORATIVE_MAGIC_ROBE_TOP(ItemID.DECORATIVE_ARMOUR_11896),
|
DECORATIVE_MAGIC_ROBE_TOP(ItemID.DECORATIVE_ARMOUR_11896, 5000),
|
||||||
DECORATIVE_MAGIC_ROBE_LEGS(ItemID.DECORATIVE_ARMOUR_11897),
|
DECORATIVE_MAGIC_ROBE_LEGS(ItemID.DECORATIVE_ARMOUR_11897, 5000),
|
||||||
DECORATIVE_RANGE_TOP(ItemID.DECORATIVE_ARMOUR_11899),
|
DECORATIVE_RANGE_TOP(ItemID.DECORATIVE_ARMOUR_11899, 5000),
|
||||||
DECORATIVE_RANGE_BOTTOM(ItemID.DECORATIVE_ARMOUR_11900),
|
DECORATIVE_RANGE_BOTTOM(ItemID.DECORATIVE_ARMOUR_11900, 5000),
|
||||||
DECORATIVE_RANGE_QUIVER(ItemID.DECORATIVE_ARMOUR_11901),
|
DECORATIVE_RANGE_QUIVER(ItemID.DECORATIVE_ARMOUR_11901, 5000),
|
||||||
GOLD_DECORATIVE_HELM(ItemID.DECORATIVE_HELM_4511),
|
GOLD_DECORATIVE_HELM(ItemID.DECORATIVE_HELM_4511, 5000),
|
||||||
GOLD_DECORATIVE_BODY(ItemID.DECORATIVE_ARMOUR_4509),
|
GOLD_DECORATIVE_BODY(ItemID.DECORATIVE_ARMOUR_4509, 5000),
|
||||||
GOLD_DECORATIVE_LEGS(ItemID.DECORATIVE_ARMOUR_4510),
|
GOLD_DECORATIVE_LEGS(ItemID.DECORATIVE_ARMOUR_4510, 5000),
|
||||||
GOLD_DECORATIVE_SKIRT(ItemID.DECORATIVE_ARMOUR_11895),
|
GOLD_DECORATIVE_SKIRT(ItemID.DECORATIVE_ARMOUR_11895, 5000),
|
||||||
GOLD_DECORATIVE_SHIELD(ItemID.DECORATIVE_SHIELD_4512),
|
GOLD_DECORATIVE_SHIELD(ItemID.DECORATIVE_SHIELD_4512, 5000),
|
||||||
GOLD_DECORATIVE_SWORD(ItemID.DECORATIVE_SWORD_4508);
|
GOLD_DECORATIVE_SWORD(ItemID.DECORATIVE_SWORD_4508, 5000);
|
||||||
|
|
||||||
private final int itemID;
|
private final int itemID;
|
||||||
|
private final int repairPrice;
|
||||||
|
|
||||||
private static final ImmutableSet<Integer> ID_SET;
|
private static final ImmutableMap<Integer, Integer> REPAIR_MAP;
|
||||||
|
|
||||||
static
|
static
|
||||||
{
|
{
|
||||||
final ImmutableSet.Builder<Integer> set = new ImmutableSet.Builder<>();
|
final ImmutableMap.Builder<Integer, Integer> map = new ImmutableMap.Builder<>();
|
||||||
for (final BrokenOnDeathItem p : values())
|
for (final BrokenOnDeathItem p : values())
|
||||||
{
|
{
|
||||||
set.add(p.itemID);
|
map.put(p.itemID, p.repairPrice);
|
||||||
}
|
}
|
||||||
ID_SET = set.build();
|
REPAIR_MAP = map.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean isBrokenOnDeath(final int itemID)
|
@Nullable
|
||||||
|
static Integer getRepairPrice(int itemId)
|
||||||
{
|
{
|
||||||
return ID_SET.contains(itemID);
|
return REPAIR_MAP.get(itemId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -338,7 +338,7 @@ public class ItemsKeptOnDeathPlugin extends Plugin
|
|||||||
if (!Pets.isPet(id)
|
if (!Pets.isPet(id)
|
||||||
&& !LostIfNotProtected.isLostIfNotProtected(id)
|
&& !LostIfNotProtected.isLostIfNotProtected(id)
|
||||||
&& !isTradeable(itemManager.getItemComposition(id)) && wildyLevel <= DEEP_WILDY
|
&& !isTradeable(itemManager.getItemComposition(id)) && wildyLevel <= DEEP_WILDY
|
||||||
&& (wildyLevel <= 0 || BrokenOnDeathItem.isBrokenOnDeath(i.getId())))
|
&& (wildyLevel <= 0 || BrokenOnDeathItem.getRepairPrice(i.getId()) != null))
|
||||||
{
|
{
|
||||||
keptItems.add(new ItemStack(id, qty));
|
keptItems.add(new ItemStack(id, qty));
|
||||||
}
|
}
|
||||||
@@ -442,19 +442,29 @@ public class ItemsKeptOnDeathPlugin extends Plugin
|
|||||||
// Grab base item price
|
// Grab base item price
|
||||||
exchangePrice = itemManager.getItemPrice(fixedPrice.getBaseId(), true);
|
exchangePrice = itemManager.getItemPrice(fixedPrice.getBaseId(), true);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
// Jagex uses the repair price when determining which items are kept on death.
|
||||||
|
final Integer repairPrice = BrokenOnDeathItem.getRepairPrice(canonicalizedItemId);
|
||||||
|
if (repairPrice != null)
|
||||||
{
|
{
|
||||||
// Account for items whose death value comes from their tradeable variant (barrows) or components (ornate kits)
|
exchangePrice = repairPrice;
|
||||||
for (final int mappedID : ItemMapping.map(canonicalizedItemId))
|
|
||||||
{
|
|
||||||
exchangePrice += itemManager.getItemPrice(mappedID, true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (exchangePrice == 0)
|
if (exchangePrice == 0)
|
||||||
{
|
{
|
||||||
final ItemComposition c1 = itemManager.getItemComposition(canonicalizedItemId);
|
// Account for items whose death value comes from their tradeable variant (barrows) or components (ornate kits)
|
||||||
exchangePrice = c1.getPrice();
|
// 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
|
// Apply fixed price offset
|
||||||
|
|||||||
@@ -608,4 +608,24 @@ public class ItemsKeptOnDeathPluginTest
|
|||||||
final List<ItemStack> kept = deathItems.getKeptItems();
|
final List<ItemStack> kept = deathItems.getKeptItems();
|
||||||
assertTrue(kept.contains(new ItemStack(ItemID.SHADOW_SWORD, 1)));
|
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)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user