/* OrpheusMS: MapleStory Private Server based on OdinMS Copyright (C) 2012 Aaron Weiss <aaron@deviant-core.net> Patrick Huy <patrick.huy@frz.cc> Matthias Butz <matze@odinms.de> Jan Christian Meyer <vimes@odinms.de> This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package tools; import java.util.List; import java.util.ArrayList; import java.util.Map; import java.util.HashMap; import java.io.FileOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.rmi.NotBoundException; import javax.management.InstanceAlreadyExistsException; import javax.management.MBeanRegistrationException; import javax.management.MalformedObjectNameException; import javax.management.NotCompliantMBeanException; import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; import server.ItemNameEntry; import server.MobInfo; import server.MobInfoEntry; /* * Originally created by Bassoe <3 * Modified by LightPepsi <3 * getAllItems() function, credits to Snow * */ public class MonsterDropCreator { private static final int COMMON_ETC_RATE = 600000; // 60% Rate private static final int SUPER_BOSS_ITEM_RATE = 300000; // 30% Rate private static final int POTION_RATE = 20000; private static final int ARROWS_RATE = 25000; private static int lastmonstercardid = 2388070; private static boolean addFlagData = false; // There isn't any flag on my // source .. so. protected static String monsterQueryData = "drop_data"; // Modify this to // suite your source protected static List<ItemNameEntry> itemNameCache = new ArrayList<ItemNameEntry>(); protected static List<MobInfoEntry> mobCache = new ArrayList<MobInfoEntry>(); protected static Map<Integer, Boolean> bossCache = new HashMap<Integer, Boolean>(); public static void main(String args[]) throws FileNotFoundException, IOException, NotBoundException, InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException, MalformedObjectNameException { MapleData data = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/String.wz")).getData("MonsterBook.img"); System.out.println("Warning : Use this only at your own risk!"); System.out.println("Press any key to continue..."); System.console().readLine(); System.out.println("As you wish.\n\n\n\n"); long currtime = System.currentTimeMillis(); addFlagData = Boolean.parseBoolean(args[0]); System.out.println("Loading : Item name string."); getAllItems(); System.out.println("Loading : Mob data."); getAllMobs(); boolean first; StringBuilder sb = new StringBuilder(); FileOutputStream out = new FileOutputStream("mobDrop.sql", true); // Things not in MonsterBook.img for (Map.Entry<Integer, List<Integer>> e : getDropsNotInMonsterBook().entrySet()) { first = true; sb.append("INSERT INTO ").append(monsterQueryData).append(" VALUES "); List<Integer> dropList = (List<Integer>) e.getValue(); for (Integer monsterdrop : dropList) { final int itemid = monsterdrop; final int monsterId = (Integer) e.getKey(); int rate = getChance(itemid, monsterId, bossCache.containsKey(monsterId)); if (rate <= 100000) { switch (monsterId) { case 9400121: // Anego rate *= 5; break; case 9400112: case 9400113: case 9400300: rate *= 10; break; } } for (int i = 0; i < multipleDropsIncrement(itemid, monsterId); i++) { if (first) { sb.append("(DEFAULT, "); first = false; } else { sb.append(", (DEFAULT, "); } sb.append(monsterId).append(", "); if (addFlagData) { sb.append("'', "); // Flags } sb.append(itemid).append(", "); sb.append("1, 1,"); // Item min and max sb.append("0, "); // Quest final int num = IncrementRate(itemid, i); sb.append(num == -1 ? rate : num); sb.append(")"); first = false; } sb.append("\n"); sb.append("-- Name : "); retriveNLogItemName(sb, itemid); sb.append("\n"); } sb.append(";"); // Fix for mass executing SQL query sb.append("\n"); out.write(sb.toString().getBytes()); sb.delete(0, 2147483647); // ;P wild guess LOL } // MonsterBook System.out.println("Loading : Drops from String.wz/MonsterBook.img."); for (MapleData dataz : data.getChildren()) { int monsterId = Integer.parseInt(dataz.getName()); int idtoLog = monsterId; first = true; if (monsterId == 9400408) { // Fix for kaede castle, toad boss idtoLog = 9400409; } // Fix for Monster without any reward causing SQL error if (dataz.getChildByPath("reward").getChildren().size() > 0) { sb.append("INSERT INTO ").append(monsterQueryData).append(" VALUES "); for (MapleData drop : dataz.getChildByPath("reward")) { int itemid = MapleDataTool.getInt(drop); int rate = getChance(itemid, idtoLog, bossCache.containsKey(idtoLog)); for (MobInfoEntry mobEntry : mobCache) { if (mobEntry.id == monsterId) { // Is boss or not. if (mobEntry.info.boss > 0) { if (rate <= 100000) { if (mobEntry.info.rareItemDropLevel == 2) { rate *= 10; } else if (mobEntry.info.rareItemDropLevel == 3) { switch (monsterId) { case 8810018: // HT rate *= 48; case 8800002: // Zakum rate *= 45; break; default: rate *= 30; break; } } else { switch (monsterId) { case 9400265: // Vergamot case 9400270: // Dunas case 9400273: // Nibergen case 9400294: // Dunas2 rate *= 24; break; case 9420522: // Krexel rate *= 29; break; case 9400409: // Emperor rate *= 35; break; case 9400287: // Imperial guard rate *= 60; break; default: rate *= 10; break; } } } } break; } } for (int i = 0; i < multipleDropsIncrement(itemid, idtoLog); i++) { if (first) { sb.append("(DEFAULT, "); first = false; } else { sb.append(", (DEFAULT, "); } sb.append(idtoLog).append(", "); if (addFlagData) { sb.append("'', "); // Flags } sb.append(itemid).append(", "); sb.append("1, 1,"); // Item min and max sb.append("0, "); // Quest final int num = IncrementRate(itemid, i); sb.append(num == -1 ? rate : num); sb.append(")"); first = false; } sb.append("\n"); sb.append("-- Name : "); retriveNLogItemName(sb, itemid); sb.append("\n"); } sb.append(";"); // Fix for mass executing SQL query } sb.append("\n"); out.write(sb.toString().getBytes()); sb.delete(0, 2147483647); // ;P wild guess LOL } System.out.println("Loading : MonsterBook drops."); StringBuilder SQL = new StringBuilder(); StringBuilder bookName = new StringBuilder(); for (ItemNameEntry entry : itemNameCache) { if (entry.itemId >= 2380000 && entry.itemId <= lastmonstercardid) { bookName.append(entry.name); if (bookName.toString().contains(" Card")) { // Get rid of the " Card" string bookName.delete(bookName.length() - 5, bookName.length()); } for (MobInfoEntry mobEntry : mobCache) { if (mobEntry.info.name.equalsIgnoreCase(bookName.toString())) { int rate = 1000; if (mobEntry.info.boss > 0) { rate *= 25; } SQL.append("INSERT INTO ").append(monsterQueryData).append(" VALUES "); SQL.append("(DEFAULT, "); SQL.append(mobEntry.id).append(", "); // Dropperid if (addFlagData) { sb.append("'', "); // Flags } SQL.append(entry.itemId).append(", "); // Itemid SQL.append("1, 1,"); // Item min and max SQL.append("0, "); // Quest SQL.append(rate); SQL.append(");\n"); SQL.append("-- Name : ").append(entry.name).append("\n"); break; } } bookName.delete(0, 2147483647); // ;P wild guess LOL } } System.out.println("Loading : Monster Card Data."); SQL.append("\n"); int i = 1; int lastmonsterbookid = 0; for (ItemNameEntry entry : itemNameCache) { if (entry.itemId >= 2380000 && entry.itemId <= lastmonstercardid) { bookName.append(entry.name); if (bookName.toString().contains(" Card")) { // Get rid of the " Card" string bookName.delete(bookName.length() - 5, bookName.length()); } if (entry.itemId == lastmonsterbookid) continue; // Fix for multiple monster shet for (MobInfoEntry mobEntry : mobCache) { if (mobEntry.info.name.equalsIgnoreCase(bookName.toString())) { SQL.append("INSERT INTO ").append("monstercarddata").append(" VALUES ("); SQL.append(i).append(", "); SQL.append(entry.itemId); SQL.append(", "); SQL.append(mobEntry.id).append(");\n"); lastmonsterbookid = entry.itemId; i++; break; } } bookName.delete(0, 2147483647); // ;P wild guess LOL } } out.write(SQL.toString().getBytes()); out.close(); long time = System.currentTimeMillis() - currtime; time /= 1000; System.out.println("Time taken : " + time); } private static void retriveNLogItemName(final StringBuilder sb, final int id) { for (ItemNameEntry entry : itemNameCache) { if (entry.itemId == id) { sb.append(entry.name); return; } } sb.append("MISSING STRING, ID : "); sb.append(id); } private static int IncrementRate(int itemid, int times) { if (times == 0) { if (itemid == 1002357 || itemid == 1002926 || itemid == 1002927) { // Zakum // Helmet, // Targa, // Scar return 999999; } else if (itemid == 1122000) { // HT necklace return 999999; } else if (itemid == 1002972) { // Auf Haven return 999999; } } else if (times == 1) { if (itemid == 1002357 || itemid == 1002926 || itemid == 1002927) { // Zakum // Helmet, // Targa, // Scar return 999999; } else if (itemid == 1122000) { // HT necklace return 999999; } else if (itemid == 1002972) { // Auf Haven return SUPER_BOSS_ITEM_RATE; } } else if (times == 2) { if (itemid == 1002357 || itemid == 1002926 || itemid == 1002927) { // Zakum // Helmet, // Targa, // Scar return SUPER_BOSS_ITEM_RATE; } else if (itemid == 1122000) { // HT necklace return SUPER_BOSS_ITEM_RATE; } } else if (times == 3) { if (itemid == 1002357 || itemid == 1002926 || itemid == 1002927) { // Zakum // Helmet, // Targa, // Scar return SUPER_BOSS_ITEM_RATE; } } else if (times == 4) { if (itemid == 1002357 || itemid == 1002926 || itemid == 1002927) { // Zakum // Helmet, // Targa, // Scar return SUPER_BOSS_ITEM_RATE; } } return -1; } private static int multipleDropsIncrement(int itemid, int mobid) { switch (itemid) { case 1002926: // Targa hat [Malaysia boss] // case 1002906: // Scarlion hat [Malaysia boss] case 1002927: // Scarlion boss hat [Malaysia boss] // case 1002905: // Targa hat [Malaysia boss] case 1002357: // Zakum helmet case 1002390: // Zakum helmet 2 case 1002430: // Zakum helmet 3 return 5; case 1122000: // HT Necklace: return 4; case 4021010: // Time rock return 7; case 1002972: // Auf Haven Circlet return 2; case 4000172: // Three-Tailed Foxtail if (mobid == 7220001) { return 8; } return 1; case 4000000: // Blue snail shell case 4000016: // Red Snail Shell case 4000019: // Snail Shell case 4000003: // Tree Branch case 4000005: // Leaf case 4000018: // Firewood case 4000195: // Seedling case 4000043: // Lorang's claw case 4000044: // Clang's Claw case 4000284: // Yellow belt case 4000285: // Red Belt case 4000021: // Leather case 4000283: // Bear's foot case 4000073: // Soild horn case 4000074: // Lucida tail case 4000298: // Old paper case 4000289: // Cat doll case 4000166: // Shrimp Meat case 4000167: // Hard Needle case 4000364: // Cable Bundle case 4000365: // Socket case 4000356: // Flask case 4000329: // Catus Stem case 4000331: // Catus Flower case 4000330: // Catus Thorn case 4000268: // Wyvren Wing case 4000269: // Wyvern Gill case 4000270: // Wyvern Toenail case 4000117: // Spacefood case 4000118: // Small Spaceship case 4000119: // Recieving app case 4000113: // Clock Spring case 4000114: // Table Clock case 4000115: // Cog case 4000029: // Lupin's banana case 4000031: // Cursed Doll case 4000026: // Lupin's Doll case 4000032: // Ligator Skin case 4000033: // Croco Skin // Master Monster if (mobid == 2220000 || mobid == 3220000 || mobid == 3220001 || mobid == 4220000 || mobid == 5220000 || mobid == 5220002 || mobid == 5220003 || mobid == 6220000 || mobid == 4000119 || mobid == 7220000 || mobid == 7220002 || mobid == 8220000 || mobid == 8220002 || mobid == 8220003) { return 3; } return 1; } return 1; } // 100000 = 10% // 10000 = 1% // 1000 = 0.1% // 100 = 0.01% // 10 = 0.001% // 1 = 0.0001% private static int getChance(int id, int mobid, boolean boss) { switch (id / 10000) { case 100: // Hat switch (id) { case 1002926: // Targa hat [Malaysia boss] case 1002906: // Scarlion hat [Malaysia boss] case 1002927: // Scarlion boss hat [Malaysia boss] case 1002905: // Targa hat [Malaysia boss] case 1002357: // Zakum helmet case 1002390: // Zakum helmet 2 case 1002430: // Zakum helmet 3 case 1002972: // Auf haven return SUPER_BOSS_ITEM_RATE; } return 1500; case 103: // Earring switch (id) { case 1032062: // Element Pierce - Neo Tokyo return 100; // 7 Slots earring with +2 to // str/dex/int/luk/ma } return 1000; case 105: // Overall case 109: // Shield switch (id) { case 1092049: // Dragon Khanjar return 100; } return 700; case 104: // Topwear case 106: // Pants case 107: // Shoes switch (id) { case 1072369: // Squachy shoe [King slime, Kerning PQ] return 300000; // 30% } return 800; case 108: // Gloves case 110: // Cape return 1000; case 112: // Pendant switch (id) { case 1122000: // HT Necklace return SUPER_BOSS_ITEM_RATE; case 1122011: // Timeless pendant lvl 30 case 1122012: // Timeless pendant lvl 140 return 800000; // 80% } case 130: // 1 Handed sword case 131: // 1 Handed Axe case 132: // 1 Handed BW case 137: // Wand switch (id) { case 1372049: // Zakum Tree Branch return 999999; } return 700; case 138: // Staff case 140: // 1 Handed sword and 2 Handed sword case 141: // 2 Handed axe case 142: // 2 Handed BW case 144: // Pole arm return 700; case 133: // Dangger case 143: // Spear case 145: // Bow case 146: // Crossbow case 147: // Claw case 148: // Knuckle case 149: // Gun return 500; case 204: // Scrolls switch (id) { case 2049000: // Chaos scroll return 150; } return 300; case 205: // All cure potion, Antidote, eyedrop return 50000; // 5% case 206: // Arrows return 30000; case 228: // Skillbook return 30000; case 229: // Mastery book switch (id) { case 2290096: // Maple Hero 20 return 800000; // 80% rate for HT case 2290125: // Maple Hero 30 return 100000; } return 500; case 233: // Bullets and capsules switch (id) { case 2330007: // Armor-Piercing bullet return 50; } return 500; case 400: switch (id) { case 4000021: // Leather return 50000; case 4001094: // Nine spirit egg return 999999; case 4001000: // Awren's glass shoe return 5000; case 4000157: // Seal meat return 100000; // 10% case 4001024: // Rubian [Guild PQ] case 4001023: // Key of dimension [Ludi PQ] return 999999; // 100% case 4000245: // Dragon Scale case 4000244: // Dragon Spirit return 2000; case 4001005: // Ancient scroll return 5000; case 4001006: // Flaming feather return 10000; // 1% case 4000017: // Pig's head case 4000082: // Gold smelly tooth =.=" return 40000; // 4% case 4000446: // Smiling cone hat case 4000451: // Expressionless cone hat case 4000456: // Sad cone hat return 10000; // 1% case 4000459: // Black armour piece return 20000; // 2% case 4000030: // Dragon Skin return 60000; // 6% case 4000339: // High-Tier Ninja Giant Star return 70000; // 7% case 4007000: // Magic Powder (Brown) case 4007001: // Magic Powder (White) case 4007002: // Magic Powder (Blue) case 4007003: // Magic Powder (Green) case 4007004: // Magic Powder (Yellow) case 4007005: // Magic Powder (Purple) case 4007006: // Magic Powder (Red) case 4007007: // Magic Powder (Black) return 50000; // 5% } switch (id / 1000) { case 4000: // ETC case 4001: // Story book, manon cry, orbis rock, eraser, // certificate return COMMON_ETC_RATE; case 4003: // Screw, Processed wood, Piece of Ice, Fairy // Wing, Stiff Feather, Soft Feather return 200000; case 4004: // Crystal Ore case 4006: // Magic rock, summoning rock return 10000; case 4005: // Crystal, refined return 1000; } case 401: // mineral Ore and refined case 402: // Jewel ore and refined switch (id) { case 4020009: // Piece of time return 5000; // 0.5% case 4021010: // Time rock return SUPER_BOSS_ITEM_RATE; } return 9000; case 403: // Lip lock key, cracked dimension, omok, monster card switch (id) { case 4032024: // Jumper Cable [Wolf Spider] return 50000; // 5% case 4032181: // Silver Coin - Neo Tokyo return boss ? 999999 : 300000; // 30% case 4032025: // T-1 Socket Adapter [Wolf Spider] case 4032156: // Overload Lens - Neo Tokyo case 4032155: // Afterroad Caterpillar - Neo Tokyo case 4032161: // Eruwater Lazer gun - Neo Tokyo case 4032163: // Maverick booster - Neo Tokyo case 4032159: // Protoroad Spoiler - Neo Tokyo return COMMON_ETC_RATE; case 4032166: // Nano Plant(Y) case 4032167: // Nano Plant(Sigma) case 4032168: // Nano Plant(Omega) return 10000; // 3% case 4032158: // Twisted Radar - Neo Tokyo case 4032151: // Operation unit - Neo Tokyo case 4032180: // Eruwater Transmitter - Neo Tokyo case 4032164: // Portalble lazer Guidance - Neo Tokyo return 2000; // 0.1% case 4032152: // Macro Molecule Autualater - Neo Tokyo case 4032153: // Conductive Polymer Gain - Neo Tokyo case 4032154: // Calculating Domino - Neo Tokyo return 4000; } return 300; case 413: // Production stimulator return 6000; // 0.6% case 416: // attendance book, pet guide, production manual return 6000; // 0.6% } switch (id / 1000000) { case 1: // Equipmenet, for others that's not stated. return 999999; case 2: switch (id) { case 2000004: // Elixir case 2000005: return boss ? 999999 : POTION_RATE; // 5% case 2000006: // Power Elixir // Gallopera has a higher rate x_X return boss ? 999999 : mobid == 9420540 ? 50000 : POTION_RATE; // 3% case 2022345: // Power up Drink - Neo Tokyo return boss ? 999999 : 3000; // 0.3% case 2012002: // Sap of Ancient Tree return 6000; case 2020013: case 2020015: return boss ? 999999 : POTION_RATE; case 2060000: case 2061000: case 2060001: case 2061001: return ARROWS_RATE; case 2070000: // Subi Throwing-Stars case 2070001: // Wolbi Throwing-Stars case 2070002: // Mokbi Throwing-Stars case 2070003: // Kumbi Throwing-Stars case 2070004: // Tobi Throwing-Stars case 2070008: // Snowball case 2070009: // Wooden Top case 2070010: // Icicle return 500; case 2070005: // Steely Throwing-Knives" return 400; case 2070006: // Ilbi Throwing-Stars case 2070007: // Hwabi Throwing-Stars return 200; // case 2070011: // Maple Throwing star case 2070012: // Paper Fighter Plane case 2070013: // Orange return 1500; case 2070019: // Magic throwing star - Neo Tokyo return 100; case 2210006: // Rainbow colored shell return 999999; default: // Mana Elixir Pill, unagi.. etc return POTION_RATE; } case 3: switch (id) { case 3010007: case 3010008: return 500; } return 2000; } System.out.println("Unhandled item chance, ID : " + id); return 999999; } private static Map<Integer, List<Integer>> getDropsNotInMonsterBook() { Map<Integer, List<Integer>> drops = new HashMap<Integer, List<Integer>>(); List<Integer> IndiviualMonsterDrop = new ArrayList<Integer>(); // Bodyguard A IndiviualMonsterDrop.add(4000139); // Bodyguard A's Tie Pin IndiviualMonsterDrop.add(2002011); // Pain Reliever IndiviualMonsterDrop.add(2002011); // Pain Reliever IndiviualMonsterDrop.add(2002011); // Pain Reliever IndiviualMonsterDrop.add(2000004); // Elixir IndiviualMonsterDrop.add(2000004); // Elixir drops.put(9400112, IndiviualMonsterDrop); IndiviualMonsterDrop = new ArrayList<Integer>(); // Bodyguard B IndiviualMonsterDrop.add(4000140); // Bodyguard B's Bullet Shell IndiviualMonsterDrop.add(2022027); // Yakisoba (x2) IndiviualMonsterDrop.add(2022027); // Yakisoba (x2) IndiviualMonsterDrop.add(2000004); // Elixir IndiviualMonsterDrop.add(2000004); // Elixir IndiviualMonsterDrop.add(2002008); // Sniper Pill IndiviualMonsterDrop.add(2002008); // Sniper Pill drops.put(9400113, IndiviualMonsterDrop); IndiviualMonsterDrop = new ArrayList<Integer>(); // The boss IndiviualMonsterDrop.add(4000141); // Big Boss's flashlight IndiviualMonsterDrop.add(2000004); // Elixir IndiviualMonsterDrop.add(2040813); // Cursed Scroll for Gloves for HP // 30% IndiviualMonsterDrop.add(2041030); // Cursed Scroll for Cape for HP 70% IndiviualMonsterDrop.add(2041040); // Cursed Scroll for Cape for LUK 70% IndiviualMonsterDrop.add(1072238); // Violet Snowshoes IndiviualMonsterDrop.add(1032026); // Gold Emerald Earrings IndiviualMonsterDrop.add(1372011); // Zhu-Ge-Liang Wand drops.put(9400300, IndiviualMonsterDrop); IndiviualMonsterDrop = new ArrayList<Integer>(); // Dreamy ghost, himes IndiviualMonsterDrop.add(4000225); // Kimono Piece IndiviualMonsterDrop.add(2000006); // Mana Elixir IndiviualMonsterDrop.add(2000004); // Elixir IndiviualMonsterDrop.add(2070013); // Orange IndiviualMonsterDrop.add(2002005); // Sniper Potion IndiviualMonsterDrop.add(2022018); // Kinoko Ramen (Roasted Pork) IndiviualMonsterDrop.add(2040306); // Cursed Scroll for Earring for DEX // 70% IndiviualMonsterDrop.add(2043704); // Cursed Scroll for Wand for Magic // Att 70% IndiviualMonsterDrop.add(2044605); // Cursed Scroll for Crossbow for ATT // 30% IndiviualMonsterDrop.add(2041034); // Cursed Scroll for Cape for STR 70% IndiviualMonsterDrop.add(1032019); // Crystal Flower Earrings IndiviualMonsterDrop.add(1102013); // White Justice Cape IndiviualMonsterDrop.add(1322026); // Colorful Tube IndiviualMonsterDrop.add(1092015); // Steel Ancient Shield IndiviualMonsterDrop.add(1382016); // Pyogo Mushroom IndiviualMonsterDrop.add(1002276); // Red Falcon IndiviualMonsterDrop.add(1002403); // Blue Arlic Helmet IndiviualMonsterDrop.add(1472027); // Green Scarab drops.put(9400013, IndiviualMonsterDrop); IndiviualMonsterDrop = new ArrayList<Integer>(); // Zakum IndiviualMonsterDrop.add(1372049); // Zakum Tree Branch drops.put(8800002, IndiviualMonsterDrop); IndiviualMonsterDrop = new ArrayList<Integer>(); // Horntail IndiviualMonsterDrop.add(4001094); // Nine Spirit Egg IndiviualMonsterDrop.add(2290125); // Maple Warrior 30 drops.put(8810018, IndiviualMonsterDrop); IndiviualMonsterDrop = new ArrayList<Integer>(); // Lady Boss IndiviualMonsterDrop.add(4000138); // Lady Boss Comb IndiviualMonsterDrop.add(4010006); // Gold Ore IndiviualMonsterDrop.add(2000006); // Mana Elixir IndiviualMonsterDrop.add(2000011); // Mana Elixir Pill IndiviualMonsterDrop.add(2020016); // Cheesecake IndiviualMonsterDrop.add(2022024); // Takoyaki (Octopus Ball) IndiviualMonsterDrop.add(2022026); // Yakisoba IndiviualMonsterDrop.add(2043705); // Cursed Scroll for Wand for Magic // Att 30% IndiviualMonsterDrop.add(2040716); // Cursed Scroll for Shoes for Speed // 30% IndiviualMonsterDrop.add(2040908); // Cursed Scroll for Shield for HP // 70% IndiviualMonsterDrop.add(2040510); // Cursed Scroll for Overall Armor // for DEF 70% IndiviualMonsterDrop.add(1072239); // Yellow Snowshoes IndiviualMonsterDrop.add(1422013); // Leomite IndiviualMonsterDrop.add(1402016); // Devil's Sunrise IndiviualMonsterDrop.add(1442020); // Hellslayer IndiviualMonsterDrop.add(1432011); // Fairfrozen IndiviualMonsterDrop.add(1332022); // Angelic Betrayal IndiviualMonsterDrop.add(1312015); // Bipennis IndiviualMonsterDrop.add(1382010); // Dark Ritual IndiviualMonsterDrop.add(1372009); // Magicodar IndiviualMonsterDrop.add(1082085); // Red Willow IndiviualMonsterDrop.add(1332022); // Angelic Betrayal IndiviualMonsterDrop.add(1472033); // Casters drops.put(9400121, IndiviualMonsterDrop); IndiviualMonsterDrop = new ArrayList<Integer>(); // Wolf Spider IndiviualMonsterDrop.add(4032024); // Jumper Cable IndiviualMonsterDrop.add(4032025); // T-1 Socket Adapter IndiviualMonsterDrop.add(4020006); // Topaz Ore IndiviualMonsterDrop.add(4020008); // Black Crystal Ore IndiviualMonsterDrop.add(4010001); // Steel Ore IndiviualMonsterDrop.add(4004001); // Wisdom Crystal Ore IndiviualMonsterDrop.add(2070006); // Ilbi Throwing Star IndiviualMonsterDrop.add(2044404); // Cursed Scroll for Pole Arm for ATT // 70% IndiviualMonsterDrop.add(2044702); // Scroll for Claw for ATT 10% IndiviualMonsterDrop.add(2044305); // Cursed Scroll for Spear for ATT // 30^ IndiviualMonsterDrop.add(1102029); // White Seraph Cape IndiviualMonsterDrop.add(1032023); // Strawberry Earrings IndiviualMonsterDrop.add(1402004); // Blue Screamer IndiviualMonsterDrop.add(1072210); // Red Rivers Boots IndiviualMonsterDrop.add(1040104); // Orihalcon Platine IndiviualMonsterDrop.add(1060092); // Orihalcon Platine Pants IndiviualMonsterDrop.add(1082129); // Purple Imperial IndiviualMonsterDrop.add(1442008); // The Gold Dragon IndiviualMonsterDrop.add(1072178); // Purple Enigma Shoes IndiviualMonsterDrop.add(1050092); // Green Oriental Fury Coat IndiviualMonsterDrop.add(1002271); // Green Galaxy IndiviualMonsterDrop.add(1051053); // Red Requierre IndiviualMonsterDrop.add(1382008); // Kage IndiviualMonsterDrop.add(1002275); // Blue Falcon IndiviualMonsterDrop.add(1051082); // Red Anes IndiviualMonsterDrop.add(1050064); // Dark Linnex IndiviualMonsterDrop.add(1472028); // Blue Scarab IndiviualMonsterDrop.add(1072193); // Brown Osfa Boots IndiviualMonsterDrop.add(1072172); // Green Pirate Boots IndiviualMonsterDrop.add(1002285); // Blood Nightfox drops.put(9400545, IndiviualMonsterDrop); IndiviualMonsterDrop = new ArrayList<Integer>(); return drops; } private static void getAllItems() { MapleDataProvider data = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/String.wz")); List<ItemNameEntry> itemNames = new ArrayList<ItemNameEntry>(); MapleData itemsData; itemsData = data.getData("Cash.img"); for (MapleData itemFolder : itemsData.getChildren()) { int itemId = Integer.parseInt(itemFolder.getName()); String itemName = MapleDataTool.getString("name", itemFolder, "NO-NAME"); itemNames.add(new ItemNameEntry(itemId, itemName)); } itemsData = data.getData("Consume.img"); for (MapleData itemFolder : itemsData.getChildren()) { int itemId = Integer.parseInt(itemFolder.getName()); String itemName = MapleDataTool.getString("name", itemFolder, "NO-NAME"); itemNames.add(new ItemNameEntry(itemId, itemName)); } itemsData = data.getData("Eqp.img").getChildByPath("Eqp"); for (MapleData eqpType : itemsData.getChildren()) { for (MapleData itemFolder : eqpType.getChildren()) { int itemId = Integer.parseInt(itemFolder.getName()); String itemName = MapleDataTool.getString("name", itemFolder, "NO-NAME"); itemNames.add(new ItemNameEntry(itemId, itemName)); } } itemsData = data.getData("Etc.img").getChildByPath("Etc"); for (MapleData itemFolder : itemsData.getChildren()) { int itemId = Integer.parseInt(itemFolder.getName()); String itemName = MapleDataTool.getString("name", itemFolder, "NO-NAME"); itemNames.add(new ItemNameEntry(itemId, itemName)); } itemsData = data.getData("Ins.img"); for (MapleData itemFolder : itemsData.getChildren()) { int itemId = Integer.parseInt(itemFolder.getName()); String itemName = MapleDataTool.getString("name", itemFolder, "NO-NAME"); itemNames.add(new ItemNameEntry(itemId, itemName)); } itemsData = data.getData("Pet.img"); for (MapleData itemFolder : itemsData.getChildren()) { int itemId = Integer.parseInt(itemFolder.getName()); String itemName = MapleDataTool.getString("name", itemFolder, "NO-NAME"); itemNames.add(new ItemNameEntry(itemId, itemName)); } itemNameCache.addAll(itemNames); } public static void getAllMobs() { List<MobInfoEntry> entries = new ArrayList<MobInfoEntry>(); MapleDataProvider data = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/String.wz")); MapleDataProvider mobData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Mob.wz")); MapleData mob = data.getData("Mob.img"); int id; MapleData monsterData; // Get the list of mobs from String.wz for (MapleData itemFolder : mob.getChildren()) { id = Integer.parseInt(itemFolder.getName()); try { monsterData = mobData.getData(StringUtil.getLeftPaddedStr(Integer.toString(id) + ".img", '0', 11)); final int boss = id == 8810018 ? 1 : MapleDataTool.getIntConvert("boss", monsterData.getChildByPath("info"), 0); if (boss > 0) { bossCache.put(id, true); } // fix for HT final int rareItemDropLevel = MapleDataTool.getIntConvert("rareItemDropLevel", monsterData.getChildByPath("info"), 0); final String name = MapleDataTool.getString("name", itemFolder, "NO-NAME"); MobInfo mobInfo = new MobInfo(boss, rareItemDropLevel, name); entries.add(new MobInfoEntry(id, mobInfo)); } catch (Exception fe) { } } mobCache.addAll(entries); } }