package net.scapeemulator.game.tools; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import net.scapeemulator.cache.Cache; import net.scapeemulator.cache.FileStore; import net.scapeemulator.cache.def.ItemDefinition; import net.scapeemulator.game.model.definition.ItemDefinitions; import net.scapeemulator.game.model.player.Equipment; import net.scapeemulator.game.model.player.EquipmentDefinition; import net.scapeemulator.game.model.player.EquipmentDefinition.WeaponClass; import net.scapeemulator.game.model.player.skills.Skill; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public final class EquipmentDumper { private static final Logger logger = LoggerFactory.getLogger(EquipmentDumper.class); private static final String[] TWO_HANDED_WEAPONS = { "giant's hand", "longbow", "scythe", "shortbow", "2h", "saradomin sword", "godsword", "claws", "guthan", "verac", "karil", "dharok", "halberd", "maul", "seercul", "crystal bow", "dark bow", "tzhaar-ket-om", "lizard", "salamander" }; public static void main(String[] args) throws IOException { Cache cache = new Cache(FileStore.open("data/game/cache")); ItemDefinitions.init(cache); int[] equipIds = new int[ItemDefinitions.count()]; int[][] equipmentBonuses = new int[ItemDefinitions.count()][12]; logger.info("Loading equip ids..."); try (BufferedReader reader = new BufferedReader(new FileReader("data/game/dumps/equipids"))) { String line; while ((line = reader.readLine()) != null) { try { String[] data = line.split("\t"); int id = Integer.parseInt(data[0]); int eqId = Integer.parseInt(data[1]); if (eqId >= 0) equipIds[id] = eqId; } catch (Exception e) { } } } logger.info("Loading bonuses..."); try (BufferedReader reader = new BufferedReader(new FileReader("data/game/dumps/bonuses"))) { String line; while ((line = reader.readLine()) != null) { try { String[] data = line.split("\t"); int id = Integer.parseInt(data[0]); for (int i = 0; i < 12; i++) { equipmentBonuses[id][i] = Integer.parseInt(data[i + 6]); } } catch (Exception e) { e.printStackTrace(); } } } logger.info("Dumping equipment data..."); try (DataOutputStream output = new DataOutputStream(new FileOutputStream("data/game/equipment.dat"))) { for (int id = 0; id < ItemDefinitions.count(); id++) { ItemDefinition def = ItemDefinitions.forId(id); if (def != null) { if (isEquipment(id, def)) { output.writeShort(id); int flags = 0; int slot = getSlot(id, def); if (isTwoHanded(def)) flags |= EquipmentDefinition.FLAG_TWO_HANDED; if (isFullHelm(id, def)) flags |= EquipmentDefinition.FLAG_FULL_HELM; if (isFullMask(id, def)) flags |= EquipmentDefinition.FLAG_FULL_MASK; if (isFullBody(id, def)) flags |= EquipmentDefinition.FLAG_FULL_BODY; output.writeByte(flags); output.writeByte(slot); output.writeShort(equipIds[id]); for (int i = 0; i < 12; i++) { output.writeShort(equipmentBonuses[id][i]); } output.writeShort(getRangeStrengthBonus(id)); if (slot == Equipment.WEAPON) { output.writeShort(getStance(id, def)); output.writeByte(getWeaponClass(def).ordinal()); output.writeByte(getSpeed(id, def)); output.writeByte(getRange(id, def)); for (int i = 0; i < 4; i++) { output.writeShort(getAttackAnimation(id, def, i)); } output.writeShort(getDefendAnimation(id, def)); } for (int i = 0; i < Skill.SKILL_NAMES.length; i++) { int req = getEquipRequirement(i, id, def, slot); if (req > 1) { output.writeByte(i); output.writeByte(req); } } output.writeByte(-1); } } } output.writeShort(-1); } logger.info("Successfully dumped equipment data."); } private static boolean isEquipment(int id, ItemDefinition definition) { int slot = getSlot(id, definition); // If the slot is not a ring or ammo, make sure it has a model. return definition.getMaleWearModel1() >= 0 || slot == Equipment.AMMO || slot == Equipment.RING; } private static int getSlot(int id, ItemDefinition definition) { switch (id) { case 426: // Priest gown top case 546: // Shade robe top case 7390: // Wizard robe (g) top case 10822: // Yak body return Equipment.BODY; case 428: // Priest gown bottom case 548: // Shade robe bottom case 7398: // Enchanted bottom case 10340: // 3rd age robe bottom case 10824: // Yak legs return Equipment.LEGS; case 5533: // "Body" tiara return Equipment.HEAD; } if (definition.getName() == null) return Equipment.WEAPON; String name = definition.getName().toLowerCase(); if (name.contains("claws")) return Equipment.WEAPON; if (name.contains("sword")) return Equipment.WEAPON; if (name.contains("dagger")) return Equipment.WEAPON; if (name.contains("mace")) return Equipment.WEAPON; if (name.contains("whip")) return Equipment.WEAPON; if (name.contains("bow")) return Equipment.WEAPON; if (name.contains("staff")) return Equipment.WEAPON; if (name.contains("dart")) return Equipment.WEAPON; if (name.contains("glove")) return Equipment.HANDS; if (name.contains("vamb")) return Equipment.HANDS; if (name.contains("gaunt")) return Equipment.HANDS; if (name.contains("bracelet")) return Equipment.HANDS; if (name.contains("crab claw")) return Equipment.HANDS; if (name.contains("hook")) return Equipment.HANDS; if (name.contains(" ring")) return Equipment.RING; if (name.contains("ring ")) return Equipment.RING; if (name.contains("amulet")) return Equipment.NECK; if (name.contains("necklace")) return Equipment.NECK; if (name.contains("scarf")) return Equipment.NECK; if (name.contains("stole")) return Equipment.NECK; if (name.contains("pendant")) return Equipment.NECK; if (name.contains("symbol")) return Equipment.NECK; if (name.contains("void seal")) return Equipment.NECK; if (name.contains("logo")) return Equipment.NECK; if (name.contains("leg")) return Equipment.LEGS; if (name.contains("bottom")) return Equipment.LEGS; if (name.contains("skirt")) return Equipment.LEGS; if (name.contains("chaps")) return Equipment.LEGS; if (name.contains("tassets")) return Equipment.LEGS; if (name.contains("trousers")) return Equipment.LEGS; if (name.contains("cuisse")) return Equipment.LEGS; if (name.contains("body")) return Equipment.BODY; if (name.contains("top")) return Equipment.BODY; if (name.contains("chest")) return Equipment.BODY; if (name.contains("apron")) return Equipment.BODY; if (name.contains("blouse")) return Equipment.BODY; if (name.contains("brassard")) return Equipment.BODY; if (name.contains("hauberk")) return Equipment.BODY; if (name.contains("torso")) return Equipment.BODY; if (name.contains("shirt")) return Equipment.BODY; if (name.contains("tunic")) return Equipment.BODY; if (name.contains("arrow")) return Equipment.AMMO; if (name.contains("bolt")) return Equipment.AMMO; if (name.contains("shield")) return Equipment.SHIELD; if (name.contains("defender")) return Equipment.SHIELD; if (name.contains("book")) return Equipment.SHIELD; if (name.contains("toktz-ket")) return Equipment.SHIELD; if (name.contains("ring")) return Equipment.RING; if (name.contains("cape")) return Equipment.CAPE; if (name.contains("cloak")) return Equipment.CAPE; if (name.contains("ava's")) return Equipment.CAPE; if (name.contains("bonesack")) return Equipment.CAPE; if (name.contains("diving apparatus")) return Equipment.CAPE; if (name.contains("boot")) return Equipment.FEET; if (name.contains("sandal")) return Equipment.FEET; if (name.contains("shoe")) return Equipment.FEET; if (name.contains("flipper")) return Equipment.FEET; if (name.contains("hat")) return Equipment.HEAD; if (name.contains("helm")) return Equipment.HEAD; if (name.contains("mask")) return Equipment.HEAD; if (name.contains("hood")) return Equipment.HEAD; if (name.contains("coif")) return Equipment.HEAD; if (name.contains(" wig")) return Equipment.HEAD; if (name.contains("tiara")) return Equipment.HEAD; if (name.contains("mitre")) return Equipment.HEAD; if (name.contains("head")) return Equipment.HEAD; if (name.contains("eyepatch")) return Equipment.HEAD; if (name.contains("beret")) return Equipment.HEAD; if (name.contains("ears")) return Equipment.HEAD; if (name.contains("cavalier")) return Equipment.HEAD; if (name.contains("boater")) return Equipment.HEAD; if (name.contains("sallet")) return Equipment.HEAD; if (name.contains("sleeping cap")) return Equipment.HEAD; return Equipment.WEAPON; } private static boolean isTwoHanded(ItemDefinition def) { if (def.getName() == null) return false; String name = def.getName().toLowerCase(); for (String s : TWO_HANDED_WEAPONS) { if (name.contains(s)) { return true; } } return false; } private static boolean isFullBody(int id, ItemDefinition def) { if (def.getName() == null) return false; if (getSlot(id, def) != Equipment.BODY) return false; String name = def.getName().toLowerCase(); if (name.contains("platebody")) return true; if (name.contains("robe")) return true; if (name.contains("chestplate")) return true; if (name.contains("clown shirt")) return true; if (id == 10824) return true; return false; } private static boolean isFullHelm(int id, ItemDefinition def) { if (def.getName() == null) return false; if (getSlot(id, def) != Equipment.HEAD) return false; String name = def.getName().toLowerCase(); if (name.contains("full")) return true; if (name.contains("clown hat")) return true; if (name.contains("coif")) return true; return false; } private static boolean isFullMask(int id, ItemDefinition def) { if (def.getName() == null) return false; if (getSlot(id, def) != Equipment.HEAD) return false; String name = def.getName().toLowerCase(); if (name.contains("full")) return true; return false; } private static WeaponClass getWeaponClass(ItemDefinition def) { if (def.getName() == null) return WeaponClass.SWORD; String name = def.getName().toLowerCase(); if (name.contains("scythe")) return WeaponClass.SCYTHE; if (name.contains("pickaxe")) return WeaponClass.PICKAXE; if (name.contains("axe")) return WeaponClass.AXE; if (name.contains("godsword")) return WeaponClass.TWO_H_SWORD; if (name.contains("2h")) return WeaponClass.TWO_H_SWORD; if (name.contains("claws")) return WeaponClass.CLAWS; if (name.contains("longsword")) return WeaponClass.SWORD; if (name.contains("scimitar")) return WeaponClass.SWORD; if (name.contains("sword")) return WeaponClass.SWORD; if (name.contains("dagger")) return WeaponClass.DAGGER; if (name.contains("mace")) return WeaponClass.MACE; if (name.contains("maul")) return WeaponClass.HAMMER; if (name.contains("hammer")) return WeaponClass.HAMMER; if (name.contains("whip")) return WeaponClass.WHIP; if (name.contains("longbow")) return WeaponClass.LONGBOW; if (name.contains("crossbow")) return WeaponClass.LONGBOW; if (name.contains("bow")) return WeaponClass.BOW; if (name.contains("staff")) return WeaponClass.MAGIC_STAFF; if (name.contains("spear")) return WeaponClass.SPEAR; if (name.contains("dart")) return WeaponClass.THROWN; if (name.contains("salamander") || name.contains("lizard")) { // return WeaponClass. } return WeaponClass.SWORD; } private static int getStance(int id, ItemDefinition def) { if (def.getName() == null) return 1426; String name = def.getName().toLowerCase(); if (name.contains("lizard") || name.contains("salamander")) return 5246; if (name.contains("scimitar") || name.contains("longsword") || name.contains(" sword")) return 1381; if (name.contains("whip")) return 620; if (name.contains("2h") || name.contains("godsword")) return 7047; if (name.contains("maul")) return 27; return 1426; } private static int getSpeed(int id, ItemDefinition def) { switch (id) { case 11235: // Dark bow return 8; case 2883: // Normal ogre bow case 4153: // Granite maul case 4718: // Dharoks greataxe case 6528: // Tzhaar-ket-om return 7; // also need two-h swords, halberds case 10887: // Barrelchest anchor return 6; case 2415: // Saradomin staff case 2416: // Guthix staff case 2417: // Zamorak staff case 4170: // Slayer's staff case 4675: // Ancient staff case 6523: // Toktz-xil-ak case 6525: // Toktz-xil-ek case 6526: // Toktz-mej-tal case 11716: // Zamorakian spear return 5; case 4151: // Abyssal whip case 4734: // Karils crossbow (full, others are x-bow) case 6522: // Toktz-xil-ul case 11730: // Saradomin sword return 4; } String name = def.getName(); if (name == null) { return 5; } name = name.toLowerCase(); if (name.contains("halberd") || name.contains("2h")) { return 7; } if (name.contains("battleaxe") || name.contains("warhammer") || name.contains("godsword") || name.contains("javelin") || name.contains("ahrims") || name.contains("longbow") || (name.contains("crossbow") && !name.contains("karils"))) { return 6; } if (name.contains("dagger") || name.contains(" axe") || name.contains("scimitar") || name.contains("claw") || name.contains("shortbow") || name.contains(" sword") || name.contains("karils x-xbow")) { return 4; } // GOOD if (name.contains("dart") || name.contains("knife")) { return 3; } return 5; } private static int getRange(int id, ItemDefinition def) { String name = def.getName(); if (name == null) { return 1; } name = name.toLowerCase(); if (name.contains("halberd")) { return 2; } if (name.contains("dart") || name.contains("throw")) { return 4; } if (name.contains("javelin") || name.contains("knife")) { return 5; } if (name.contains("crossbow") || name.contains("shortbow") || name.contains("x-bow") || name.contains("seercull") || name.contains("crystal bow")) { return 7; } if (name.contains("longbow")) { return 8; } if (name.contains("comp")) { return 8; } return 1; } private static int getAttackAnimation(int id, ItemDefinition def, int index) { String name = def.getName(); if (name == null) { return -1; } switch (id) { case 4151: return 1658; } name = name.toLowerCase(); if (name.contains("karil")) { return 2075; } if (name.contains("crossbow")) { return 4230; } if (name.contains("bow")) { return 426; } if (name.contains("dagger")) { switch (index) { case 0: case 3: return 412; case 1: return 376; case 2: return 377; } } if (name.contains("2h") || name.contains("godsword")) { switch (index) { case 0: case 1: return 7041; case 2: return 7048; case 3: return 7049; } } if(name.contains("mace")) { switch(index) { case 0: case 1: case 3: return 401; case 2: return 400; } } if (name.contains("axe")) { switch (index) { case 0: case 1: case 3: return 395; case 2: return 401; } } if (name.contains("sword") || name.contains("scimitar")) { switch (index) { case 0: case 1: case 3: return 451; case 2: return 433; } } if (name.contains("staff")) { return 419; } return -1; } private static int getDefendAnimation(int id, ItemDefinition def) { String name = def.getName(); if (name == null) { return 378; } name = name.toLowerCase(); if (name.contains("2h") || name.contains("godsword")) { return 7050; } if (name.contains("sword") || name.contains("scimitar")) { return 434; } if (name.contains("dagger")) { return 378; } if (name.contains("staff")) { return 420; } // 425? return 404; } private static int getEquipRequirement(int skill, int id, ItemDefinition def, int slot) { String name = def.getName(); if (name == null) { return 99; } name = name.toLowerCase(); switch (skill) { case Skill.ATTACK: if (slot != Equipment.WEAPON) { return 1; } if (name.contains("dart") || name.contains("throw") || name.contains("knife") || name.contains("javelin")) { return 1; } if (name.contains("steel")) return 5; if (name.contains("black") || name.contains("white")) return 10; if (name.contains("mith")) return 20; if (name.contains("adam")) return 30; if (name.contains("rune")) return 40; if (name.contains("dragon")) return 60; if (name.contains("ahrim") || name.contains("verac") || name.contains("karil") || name.contains("torag") || name.contains("dharok") || name.contains("guthan")) return 70; if (name.contains("battlestaff")) { return 30; } if (name.contains("mystic")) { return 40; } if (name.contains("godsword")) { return 75; } switch (id) { case 12570: // Ogre club return 5; case 11061: // Ancient mace return 15; case 35: // Excalibur return 20; case 3757: // Fremennik blade case 10149: // Swamp lizard return 30; case 11037: // Brine sabre return 40; case 1409: // Iban's staff case 4153: // Granite maul case 4158: // Leaf bladed spear case 4675: // Ancient staff case 10146: // Orange salamander case 13290: // Leaf bladed sword return 50; case 6523: // Toktz-xil-ak case 6526: // Toktz-mej-tal case 6527: // Tzhaar-ket-em case 10147: // Red salamander case 10887: // Barrelchest anchor return 60; case 4151: // Abyssal whip case 10148: // Black salamander case 11716: // Zamorakian spear case 11730: // Saradomin sword return 70; } case Skill.STRENGTH: if (name.contains("granite")) { return 50; } if (slot == Equipment.WEAPON && (name.contains("dharok") || name.contains("torag"))) { return 70; } if (name.contains("halberd")) { if (name.contains("black") || name.contains("white")) return 5; if (name.contains("mith")) return 10; if (name.contains("adam")) return 15; if (name.contains("rune")) return 20; if (name.contains("drag")) return 30; } switch (id) { case 10887: // Barrelchest anchor return 40; case 6528: // Tzhaar-ket-om return 60; } break; case Skill.DEFENCE: if (name.contains("dagon") || name.contains("initiate") || (name.contains("mystic") && slot != Equipment.WEAPON) || (name.contains("studded") && slot == Equipment.BODY)) { return 20; } if (name.contains("infinity") || name.contains("frog-leather")) { return 25; } if (id >= 10338 && id <= 10344) { // 3rd age magic return 30; } if (name.contains("snakeskin") || name.contains("proselyte")) { return 30; } if (name.contains("lunar") || name.contains("skeletal") || name.contains("splitbark") || name.contains("spined") || (name.contains("d'hide") && slot == Equipment.BODY) || name.contains("rock-shell")) { return 40; } if (id >= 10330 && id <= 10336) { // 3rd age range return 45; } if (name.contains("granite") && slot != Equipment.WEAPON) { return 50; } if (name.contains("neitiznot")) { return 55; } if (id >= 10346 && id <= 10352 || (name.contains("bandos") && slot != Equipment.WEAPON)) { // 3rd // age // melee return 65; } if (name.contains("crystal shield") || name.contains("ahrim") || name.contains("verac") || name.contains("karil") || name.contains("torag") || name.contains("dharok") || name.contains("guthan")) { return 70; } if (name.contains("plate") || name.contains("defender") || name.contains("chain") || name.contains("helm") || name.contains("shield") || name.contains("gauntlet") || name.contains("boots")) { if (name.contains("steel")) return 5; if (name.contains("black") || name.contains("white")) return 10; if (name.contains("mith")) return 20; if (name.contains("adam")) return 30; if (name.contains("rune") || name.contains("gilded") || name.contains("guthix") || name.contains("zamorak") || name.contains("saradomin")) return 40; if (name.contains("drag")) return 60; } switch (id) { case 4551: // Spiny helmet return 5; case 1131: // Hardleather body return 10; case 4156: // Mirror shield case 7398: case 7399: case 7400: // Enchanted armor case 10824: // Yak legs case 10822: // Yak body return 20; case 10826: // Fremennik round shield return 25; case 3748: // Fremennik helm case 3758: // Fremennik shield case 4567: // Gold helmet case 7917: // Ram skull helm return 30; case 10551: // Fighter torso case 10552: // Runner boots case 10553: // Penance gloves case 10555: // Penance skirt case 13734: // Spirit shield return 40; case 3749: // Archer helm case 3751: // Berserker helm case 3753: // Warrior helm case 10547: // Healer hat case 10548: // Fighter hat case 10549: // Runner hat case 10550: // Ranger hat return 45; case 11200: // Dwarven helmet return 50; case 6524: return 60; case 11718: // Arma helmet case 12670: // Arma helmet (e) case 12671: // Arma helmet (charged) case 11720: // Arma chest case 11722: // Arma skirt case 13736: // Blessed spirit shield return 70; case 11283: // Dragonfire shield case 13738: case 13740: case 13742: case 13744: // Sigiled spirit shields return 75; } break; case Skill.MAGIC: if (name.contains("battlestaff")) { return 30; } if (name.contains("mitre") || name.contains("mystic") || name.contains("skeletal") || name.contains("splitbark") || name.contains("dagon")) { return 40; } if (name.contains("infinity")) { return 50; } if (id >= 2412 && id <= 2417) { // God capes/staves return 60; } if (id >= 10338 && id <= 10344) { // 3rd age magic return 65; } if (name.contains("lunar")) { return 65; } if (name.contains("ahrim")) { return 70; } switch (id) { case 2579: // Wizard boots return 20; case 10149: // Swamp lizard return 30; case 7398: case 7399: case 7400: // Enchanted armor return 40; case 6908: // Beginner wand return 45; case 1409: // Iban's staff case 4170: // Slayer's staff case 4675: // Ancient staff case 6910: // Apprentice wand case 10146: // Orange salamander return 50; case 6912: // Teacher wand return 55; case 6526: // Toktz-mej-tal case 6889: // Mage's book case 6914: // Master wand case 10147: // Red salamander return 60; case 13738: // Arcane case 13744: // Spectral return 65; case 10148: // Black salamander return 70; } break; case Skill.RANGED: // TODO dhide if (name.contains("dart") || name.contains("throw") || name.contains("knife") || name.contains("javelin")) { if (name.contains("steel")) return 5; if (name.contains("black")) return 10; if (name.contains("mith")) return 20; if (name.contains("adam")) return 30; if (name.contains("rune")) return 40; if (name.contains("drag")) return 60; } if (name.contains("bow")) { if (name.contains("oak")) return 5; if (name.contains("willow")) return 20; if (name.contains("maple")) return 30; if (name.contains("ogre")) return 30; if (name.contains("yew")) return 40; if (name.contains("magic")) return 60; if (name.contains("crystal")) return 70; } if (name.contains("hide") || name.contains("chaps") || name.contains("vamb") || name.contains("coif")) { if (name.contains("green")) return 40; if (name.contains("blue")) return 50; if (name.contains("red")) return 60; if (name.contains("black") || name.contains("saradomin") || name.contains("zamorak") || name.contains("guthix")) return 70; } if (name.contains("studded")) { return 20; } if (name.contains("frog-leather")) { return 25; } if (name.contains("snakeskin")) { return 30; } if (name.contains("spined")) { return 40; } if (id >= 10330 && id <= 10336) { // 3rd age range return 65; } if (name.contains("karil")) { return 70; } switch (id) { case 9176: // Blurite crossbow return 16; case 1169: // Coif return 20; case 9177: // Iron crossbow return 26; case 8880: // Dorgeshuun crossbow return 28; case 10149: // Swamp lizard case 10498: // Ava's attractor return 30; case 9179: // Steel crossbow return 31; case 13081: return 33; case 9181: // Mith crossbow return 36; case 7370: // Green body (g) case 7372: // Green body (t) case 7378: // Green chaps (g) case 7380: // Green chaps (t) return 40; case 2577: // Ranger boots case 2581: // Robin hoot hat case 9976: // Chinchompa return 45; case 9183: // Adamant crossbow return 46; case 6724: // Seercull case 7374: // Blue body(g) case 7376: // Blue body(t) case 7382: // Blue chaps(g) case 7384: // Blue chaps(t) case 10146: // Orange salamander case 10156: // Hunters crossbow case 10499: // Ava's accumulator return 50; case 9977: // Red chinchompa return 55; case 6522: // Toktz-xil-ul case 10147: // Red salamander case 10555: // Penance skirt case 11234: // Dark bow return 60; case 9185: // Rune crossbow return 61; case 10148: // Black salamander case 11718: // Arma helmet case 12670: // Arma helmet (e) case 12671: // Arma helmet (charged) case 11720: // Arma chest case 11722: // Arma skirt return 70; } break; case Skill.PRAYER: if (name.contains("initiate")) { return 10; } if (name.contains("proselyte")) { return 20; } if (id >= 10458 && id <= 10468) { // God robe tops/legs return 20; } if (name.contains("mitre")) { return 40; } if (name.contains("stole") || name.contains("crozier")) { return 60; } switch (id) { case 11061: // Ancient mace return 25; case 10446: case 10448: case 10450: // God cloaks return 40; case 13734: // Spirit shield return 55; case 13736: // Blessed spirit shield return 60; case 13738: // Arcane case 13744: // Spectral return 70; case 13740: // Divine case 13742: // Elysian return 75; } break; case Skill.RUNECRAFTING: switch (id) { case 12863: // Air runecrafting gloves return 10; case 12864: // Water runecrafting gloves return 20; case 12865: // Earth runecrafting gloves return 30; } break; case Skill.HUNTER: break; case Skill.SUMMONING: switch (id) { case 12680: case 12681: return 45; case 12670: // Arma helmet (e) case 12671: // Arma helmet (charged) return 60; } break; case Skill.SLAYER: switch (id) { case 4158: // Leaf bladed spear case 4170: // Slayer staff case 13290: // Leaf bladed sword return 55; } break; case Skill.AGILITY: if (name.contains("crystal bow") || name.contains("crystal shield")) { return 50; } break; case Skill.FIREMAKING: switch (id) { case 13661: // Inferno adze return 92; } break; } return 1; } // Credits to Xenorune private static final int[][] RANGE_STRENGTH_BONUS = { { 890, // addy arrow 9143, // addy bolt 810, // addy dart 829, // addy jav 867, // addy knife 804, // addy thrownaxe 881, // barbed bolts 13803, // black bolts 3093, // black dart 869, // black knife 9139, // blurite bolt 4740, // bolt rack 8882, // bone bolts 13280, // broad tipped bolts 882, // bronze arrow 877, // bronze bolts 806, // bronze dart 825, // bronze jav 864, // bronze knife 800, // bronze thrownaxe 4214, // full crystal bow 13953, // corrupt morr jav 13957, // corrupt morr thrownaxe 9340, // diamond bolt 11212, // dragon arrow 9341, // dragon bolts 11230, // dragon dart 9338, // emerald bolts 10142, // guam tar 10145, // harralander tar 78, // ice arrows 884, // iron arrows 9140, // iron bolts 807, // iron dart 826, // iron javelin 863, // iron knife 801, // iron thrownaxe 10158, // kebbit bolts 10159, // long kebbit bolts 888, // mith arrow 9142, // mith bolts 809, // mithril dart 828, // mithril javelin 866, // mith knife 803, // mith thrownaxe 13879, // morrigans javelin 13883, // morrigans thrownaxe 2866, // ogre arrow 9342, // onyx bolts 880, // pearl bolts 10034, // red chinchompa 9339, // ruby bolts 892, // rune arrow 893, // rune arrow (p) 811, // rune dart 830, // rune javelin 868, // rune knife 805, // rune thrownaxe 9144, // rune bolts 9337, // sapphire bolts 9145, // silver bolts 886, // steel arrow 9141, // steel bolts 808, // steel dart 827, // steel javelin 865, // steel knife 802, // steel thrownaxe 10144, // tarromin tar 6522, // obsidian ring 9336, // topaz bolts 9706, // training arrows 879, // opal bolts 9236, // opal bolts (e) 9335, // jade bolts 9237, // jade bolts (e) 9238, // pearl bolts(e) 9239, // topaz bolts (e) 9241, // emerald bolts (e) 9240, // sapphire bolts (e) 9242, // ruby bolts (e) 9243, // diamond bolts (e) 9244, // dragon bolts (e) 9245, // onyx bolts (e) }, { 31, // addy arrow 100, // addy bolt 10, // addy dart 28, // addy jav 14, // addy knife 23, // addy thrownaxe 12, // barbed bolts 75, // black bolts 6, // black dart 8, // black knife 28, // blurite bolt 55, // bolt rack 49, // bone bolts 100, // broad tipped bolts 7, // bronze arrow 10, // bronze bolts 1, // bronze dart 6, // bronze jav 3, // bronze knife 5, // bronze thrownaxe 70, // full crystal bow 145, // corrupt morr jav 117, // corrupt morr thrownaxe 105, // diamond bolt 60, // dragon arrow 117, // dragon bolts 20, // dragon dart 85, // emerald bolts 16, // guam tar 49, // harralander tar 16, // ice arrows 10, // iron arrows 46, // iron bolts 3, // iron dart 10, // iron javelin 4, // iron knife 7, // iron thrownaxe 28, // kebbit bolts 38, // long kebbit bolts 22, // mith arrow 82, // mith bolts 7, // mithril dart 18, // mithril javelin 10, // mith knife 16, // mith thrownaxe 145, // morrigans javelin 117, // morrigans thrownaxe 22, // ogre arrow 120, // onyx bolts 48, // pearl bolts 15, // red chinchompa 103, // ruby bolts 49, // rune arrow 49, // rune arrow (p) 14, // rune dart 42, // rune javelin 24, // rune knife 36, // rune thrownaxe 115, // rune bolts 83, // sapphire bolts 36, // silver bolts 16, // steel arrow 64, // steel bolts 4, // steel dart 12, // steel javelin 7, // steel knife 11, // steel thrownaxe 31, // tarromin tar 49, // obsidian ring 66, // topaz bolts 7, // training arrows 10, // opal bolts 10, // opal bolts (e) 28, // jade bolts 28, // jade bolts (e) 46, // pearl bolts(e) 64, // topaz bolts (e) 82, // emerald bolts (e) 82, // sapphire bolts (e) 100, // ruby bolts (e) 100, // diamond bolts (e) 117, // dragon bolts (e) 115, // onyx bolts (e) } }; private static int getRangeStrengthBonus(int id) { for (int i = 0; i < RANGE_STRENGTH_BONUS[0].length; i++) { if (RANGE_STRENGTH_BONUS[0][i] == id) { return RANGE_STRENGTH_BONUS[1][i]; } } return 0; } }