From 14a405adb2c1cbec8f0035edc85a1d84d4adeb80 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 17:37:24 +0200 Subject: [PATCH 01/36] Consistent handling of wz files and their paths --- src/main/java/client/SkillFactory.java | 6 ++-- .../command/commands/gm2/MaxSkillCommand.java | 5 ++- .../commands/gm2/ResetSkillCommand.java | 5 ++- .../command/commands/gm2/SearchCommand.java | 5 ++- .../java/client/inventory/PetDataFactory.java | 4 +-- .../processor/action/SpawnPetProcessor.java | 11 +++--- .../java/constants/game/GameConstants.java | 4 +-- src/main/java/net/server/Server.java | 1 - .../MaplePartySearchCoordinator.java | 4 +-- .../provider/MapleDataProviderFactory.java | 24 +++++-------- src/main/java/provider/wz/ListWZFile.java | 3 +- src/main/java/provider/wz/WZFiles.java | 35 +++++++++++++++++++ .../scripting/npc/NPCConversationManager.java | 4 +-- src/main/java/server/CashShop.java | 4 +-- .../server/MapleItemInformationProvider.java | 10 +++--- .../MapleSkillbookInformationProvider.java | 3 +- src/main/java/server/MapleStorage.java | 6 ++-- .../java/server/events/gm/MapleOxQuiz.java | 4 +-- .../java/server/life/MapleLifeFactory.java | 8 ++--- .../life/MapleMonsterInformationProvider.java | 6 ++-- .../server/life/MaplePlayerNPCFactory.java | 10 +++--- .../server/life/MobAttackInfoFactory.java | 4 +-- .../java/server/life/MobSkillFactory.java | 4 +-- .../java/server/maps/MapleMapFactory.java | 6 ++-- .../java/server/maps/MapleReactorFactory.java | 4 +-- .../partyquest/MapleCarnivalFactory.java | 4 +-- src/main/java/server/quest/MapleQuest.java | 4 +-- 27 files changed, 106 insertions(+), 82 deletions(-) create mode 100644 src/main/java/provider/wz/WZFiles.java diff --git a/src/main/java/client/SkillFactory.java b/src/main/java/client/SkillFactory.java index b41f8f5657..4100e1552a 100644 --- a/src/main/java/client/SkillFactory.java +++ b/src/main/java/client/SkillFactory.java @@ -23,16 +23,16 @@ package client; import constants.skills.*; import provider.*; +import provider.wz.WZFiles; import server.MapleStatEffect; import server.life.Element; -import java.io.File; import java.util.HashMap; import java.util.Map; public class SkillFactory { private static volatile Map skills = new HashMap<>(); - private static final MapleDataProvider datasource = MapleDataProviderFactory.getDataProvider(MapleDataProviderFactory.fileInWZPath("Skill.wz")); + private static final MapleDataProvider datasource = MapleDataProviderFactory.getDataProvider(WZFiles.SKILL); public static Skill getSkill(int id) { return skills.get(id); @@ -330,7 +330,7 @@ public class SkillFactory { } public static String getSkillName(int skillid) { - MapleData data = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/" + "String.wz")).getData("Skill.img"); + MapleData data = MapleDataProviderFactory.getDataProvider(WZFiles.STRING).getData("Skill.img"); StringBuilder skill = new StringBuilder(); skill.append(skillid); if (skill.length() == 4) { diff --git a/src/main/java/client/command/commands/gm2/MaxSkillCommand.java b/src/main/java/client/command/commands/gm2/MaxSkillCommand.java index 1599f689ab..e78b96c482 100644 --- a/src/main/java/client/command/commands/gm2/MaxSkillCommand.java +++ b/src/main/java/client/command/commands/gm2/MaxSkillCommand.java @@ -27,8 +27,7 @@ import client.*; import client.command.Command; import provider.MapleData; import provider.MapleDataProviderFactory; - -import java.io.File; +import provider.wz.WZFiles; public class MaxSkillCommand extends Command { { @@ -38,7 +37,7 @@ public class MaxSkillCommand extends Command { @Override public void execute(MapleClient c, String[] params) { MapleCharacter player = c.getPlayer(); - for (MapleData skill_ : MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/" + "String.wz")).getData("Skill.img").getChildren()) { + for (MapleData skill_ : MapleDataProviderFactory.getDataProvider(WZFiles.STRING).getData("Skill.img").getChildren()) { try { Skill skill = SkillFactory.getSkill(Integer.parseInt(skill_.getName())); player.changeSkillLevel(skill, (byte) skill.getMaxLevel(), skill.getMaxLevel(), -1); diff --git a/src/main/java/client/command/commands/gm2/ResetSkillCommand.java b/src/main/java/client/command/commands/gm2/ResetSkillCommand.java index 6a6e196854..2c194c0ad6 100644 --- a/src/main/java/client/command/commands/gm2/ResetSkillCommand.java +++ b/src/main/java/client/command/commands/gm2/ResetSkillCommand.java @@ -27,8 +27,7 @@ import client.*; import client.command.Command; import provider.MapleData; import provider.MapleDataProviderFactory; - -import java.io.File; +import provider.wz.WZFiles; public class ResetSkillCommand extends Command { { @@ -38,7 +37,7 @@ public class ResetSkillCommand extends Command { @Override public void execute(MapleClient c, String[] params) { MapleCharacter player = c.getPlayer(); - for (MapleData skill_ : MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/" + "String.wz")).getData("Skill.img").getChildren()) { + for (MapleData skill_ : MapleDataProviderFactory.getDataProvider(WZFiles.STRING).getData("Skill.img").getChildren()) { try { Skill skill = SkillFactory.getSkill(Integer.parseInt(skill_.getName())); player.changeSkillLevel(skill, (byte) 0, skill.getMaxLevel(), -1); diff --git a/src/main/java/client/command/commands/gm2/SearchCommand.java b/src/main/java/client/command/commands/gm2/SearchCommand.java index 4d70281aab..e37eb609c0 100644 --- a/src/main/java/client/command/commands/gm2/SearchCommand.java +++ b/src/main/java/client/command/commands/gm2/SearchCommand.java @@ -30,12 +30,11 @@ import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; +import provider.wz.WZFiles; import server.MapleItemInformationProvider; import server.quest.MapleQuest; import tools.Pair; -import java.io.File; - public class SearchCommand extends Command { private static MapleData npcStringData; private static MapleData mobStringData; @@ -45,7 +44,7 @@ public class SearchCommand extends Command { { setDescription("Search String.wz."); - MapleDataProvider dataProvider = MapleDataProviderFactory.getDataProvider(new File("wz/String.wz")); + MapleDataProvider dataProvider = MapleDataProviderFactory.getDataProvider(WZFiles.STRING); npcStringData = dataProvider.getData("Npc.img"); mobStringData = dataProvider.getData("Mob.img"); skillStringData = dataProvider.getData("Skill.img"); diff --git a/src/main/java/client/inventory/PetDataFactory.java b/src/main/java/client/inventory/PetDataFactory.java index 2f737d9c85..82409133f3 100644 --- a/src/main/java/client/inventory/PetDataFactory.java +++ b/src/main/java/client/inventory/PetDataFactory.java @@ -25,8 +25,8 @@ import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; +import provider.wz.WZFiles; -import java.io.File; import java.util.HashMap; import java.util.Map; @@ -35,7 +35,7 @@ import java.util.Map; * @author Danny (Leifde) */ public class PetDataFactory { - private static MapleDataProvider dataRoot = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Item.wz")); + private static MapleDataProvider dataRoot = MapleDataProviderFactory.getDataProvider(WZFiles.ITEM); private static Map petCommands = new HashMap<>(); private static Map petHunger = new HashMap<>(); diff --git a/src/main/java/client/processor/action/SpawnPetProcessor.java b/src/main/java/client/processor/action/SpawnPetProcessor.java index c8c74dcf86..9929e24224 100644 --- a/src/main/java/client/processor/action/SpawnPetProcessor.java +++ b/src/main/java/client/processor/action/SpawnPetProcessor.java @@ -20,24 +20,25 @@ package client.processor.action; import client.MapleCharacter; -import java.awt.Point; import client.MapleClient; +import client.SkillFactory; import client.inventory.MapleInventoryType; import client.inventory.MaplePet; -import client.SkillFactory; -import provider.MapleDataTool; import client.inventory.manipulator.MapleInventoryManipulator; -import java.io.File; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; +import provider.MapleDataTool; +import provider.wz.WZFiles; import tools.MaplePacketCreator; +import java.awt.*; + /** * * @author RonanLana - just added locking on OdinMS' SpawnPetHandler method body */ public class SpawnPetProcessor { - private static MapleDataProvider dataRoot = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Item.wz")); + private static final MapleDataProvider dataRoot = MapleDataProviderFactory.getDataProvider(WZFiles.ITEM); public static void processSpawnPet(MapleClient c, byte slot, boolean lead) { if (c.tryacquireClient()) { diff --git a/src/main/java/constants/game/GameConstants.java b/src/main/java/constants/game/GameConstants.java index 92e2a3d44b..d24c2a8db4 100644 --- a/src/main/java/constants/game/GameConstants.java +++ b/src/main/java/constants/game/GameConstants.java @@ -5,11 +5,11 @@ import client.MapleJob; import config.YamlConfig; import constants.skills.Aran; import provider.*; +import provider.wz.WZFiles; import server.maps.FieldLimit; import server.maps.MapleMap; import server.quest.MapleQuest; -import java.io.File; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.*; @@ -676,7 +676,7 @@ public class GameConstants { } private static int getMaxObstacleMobDamageFromWz() { - MapleDataProvider mapSource = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Map.wz")); + MapleDataProvider mapSource = MapleDataProviderFactory.getDataProvider(WZFiles.MAP); int maxMobDmg = 0; MapleDataDirectoryEntry root = mapSource.getRoot(); diff --git a/src/main/java/net/server/Server.java b/src/main/java/net/server/Server.java index c053bbb369..40cd18c488 100644 --- a/src/main/java/net/server/Server.java +++ b/src/main/java/net/server/Server.java @@ -969,7 +969,6 @@ public class Server { } public static void main(String[] args) { - System.setProperty("wzpath", "wz"); Security.setProperty("crypto.policy", "unlimited"); AutoJCE.removeCryptographyRestrictions(); Server.getInstance().init(); diff --git a/src/main/java/net/server/coordinator/partysearch/MaplePartySearchCoordinator.java b/src/main/java/net/server/coordinator/partysearch/MaplePartySearchCoordinator.java index 2d3720c712..4dcbb2f54a 100644 --- a/src/main/java/net/server/coordinator/partysearch/MaplePartySearchCoordinator.java +++ b/src/main/java/net/server/coordinator/partysearch/MaplePartySearchCoordinator.java @@ -34,10 +34,10 @@ import net.server.world.MapleParty; import provider.MapleData; import provider.MapleDataProviderFactory; import provider.MapleDataTool; +import provider.wz.WZFiles; import tools.MaplePacketCreator; import tools.Pair; -import java.io.File; import java.util.*; import java.util.Map.Entry; @@ -68,7 +68,7 @@ public class MaplePartySearchCoordinator { private static Map> fetchNeighbouringMaps() { Map> mapLinks = new HashMap<>(); - MapleData data = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/" + "Etc.wz")).getData("MapNeighbors.img"); + MapleData data = MapleDataProviderFactory.getDataProvider(WZFiles.ETC).getData("MapNeighbors.img"); if (data != null) { for (MapleData mapdata : data.getChildren()) { int mapid = Integer.parseInt(mapdata.getName()); diff --git a/src/main/java/provider/MapleDataProviderFactory.java b/src/main/java/provider/MapleDataProviderFactory.java index 14753d4406..96ba1e6b9c 100644 --- a/src/main/java/provider/MapleDataProviderFactory.java +++ b/src/main/java/provider/MapleDataProviderFactory.java @@ -21,18 +21,18 @@ */ package provider; -import java.io.File; -import java.io.IOException; import provider.wz.WZFile; +import provider.wz.WZFiles; import provider.wz.XMLWZFile; -public class MapleDataProviderFactory { - private final static String wzPath = System.getProperty("wzpath"); +import java.io.File; +import java.io.IOException; - private static MapleDataProvider getWZ(File in, boolean provideImages) { +public class MapleDataProviderFactory { + private static MapleDataProvider getWZ(File in) { if (in.getName().toLowerCase().endsWith("wz") && !in.isDirectory()) { try { - return new WZFile(in, provideImages); + return new WZFile(in, false); } catch (IOException e) { throw new RuntimeException("Loading WZ File failed", e); } @@ -41,15 +41,7 @@ public class MapleDataProviderFactory { } } - public static MapleDataProvider getDataProvider(File in) { - return getWZ(in, false); - } - - public static MapleDataProvider getImageProvidingDataProvider(File in) { - return getWZ(in, true); - } - - public static File fileInWZPath(String filename) { - return new File(wzPath, filename); + public static MapleDataProvider getDataProvider(WZFiles in) { + return getWZ(in.getFile()); } } \ No newline at end of file diff --git a/src/main/java/provider/wz/ListWZFile.java b/src/main/java/provider/wz/ListWZFile.java index 1053b74252..17a37bd02d 100644 --- a/src/main/java/provider/wz/ListWZFile.java +++ b/src/main/java/provider/wz/ListWZFile.java @@ -21,7 +21,6 @@ */ package provider.wz; -import provider.MapleDataProviderFactory; import tools.data.input.GenericLittleEndianAccessor; import tools.data.input.InputStreamByteStream; import tools.data.input.LittleEndianAccessor; @@ -69,7 +68,7 @@ public class ListWZFile { if (listWz != null) { ListWZFile listwz; try { - listwz = new ListWZFile(MapleDataProviderFactory.fileInWZPath("List.wz")); + listwz = new ListWZFile(WZFiles.LIST.getFile()); modernImgs = new HashSet<>(listwz.getEntries()); } catch (FileNotFoundException e) { e.printStackTrace(); diff --git a/src/main/java/provider/wz/WZFiles.java b/src/main/java/provider/wz/WZFiles.java new file mode 100644 index 0000000000..94b07e668c --- /dev/null +++ b/src/main/java/provider/wz/WZFiles.java @@ -0,0 +1,35 @@ +package provider.wz; + +import java.io.File; + +public enum WZFiles { + QUEST("Quest"), + ETC("Etc"), + ITEM("Item"), + CHARACTER("Character"), + STRING("String"), + LIST("List"), + MOB("Mob"), + MAP("Map"), + NPC("Npc"), + REACTOR("Reactor"), + SKILL("Skill"), + SOUND("Sound"), + UI("UI"); + + public static final String DIRECTORY = "wz"; + + private final String fileName; + + WZFiles(String fileName) { + this.fileName = fileName; + } + + public File getFile() { + return new File(getFilePath()); + } + + public String getFilePath() { + return String.format("%s/%s.wz", DIRECTORY, fileName); + } +} diff --git a/src/main/java/scripting/npc/NPCConversationManager.java b/src/main/java/scripting/npc/NPCConversationManager.java index 3788e5a2b7..c634ca6c3a 100644 --- a/src/main/java/scripting/npc/NPCConversationManager.java +++ b/src/main/java/scripting/npc/NPCConversationManager.java @@ -38,6 +38,7 @@ import net.server.world.MapleParty; import net.server.world.MaplePartyCharacter; import provider.MapleData; import provider.MapleDataProviderFactory; +import provider.wz.WZFiles; import scripting.AbstractPlayerInteraction; import server.*; import server.MapleSkillbookInformationProvider.SkillBookEntry; @@ -62,7 +63,6 @@ import tools.MaplePacketCreator; import tools.packets.Wedding; import java.awt.*; -import java.io.File; import java.sql.SQLException; import java.util.List; import java.util.*; @@ -382,7 +382,7 @@ public class NPCConversationManager extends AbstractPlayerInteraction { } public void maxMastery() { - for (MapleData skill_ : MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/" + "String.wz")).getData("Skill.img").getChildren()) { + for (MapleData skill_ : MapleDataProviderFactory.getDataProvider(WZFiles.STRING).getData("Skill.img").getChildren()) { try { Skill skill = SkillFactory.getSkill(Integer.parseInt(skill_.getName())); getPlayer().changeSkillLevel(skill, (byte) 0, skill.getMaxLevel(), -1); diff --git a/src/main/java/server/CashShop.java b/src/main/java/server/CashShop.java index a05942aa55..07362d3b22 100644 --- a/src/main/java/server/CashShop.java +++ b/src/main/java/server/CashShop.java @@ -31,10 +31,10 @@ import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; +import provider.wz.WZFiles; import tools.DatabaseConnection; import tools.Pair; -import java.io.File; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -149,7 +149,7 @@ public class CashShop { private static volatile List specialcashitems = new ArrayList<>(); public static void loadAllCashItems() { - MapleDataProvider etc = MapleDataProviderFactory.getDataProvider(new File("wz/Etc.wz")); + MapleDataProvider etc = MapleDataProviderFactory.getDataProvider(WZFiles.ETC); Map loadedItems = new HashMap<>(); List onSaleItems = new ArrayList<>(); diff --git a/src/main/java/server/MapleItemInformationProvider.java b/src/main/java/server/MapleItemInformationProvider.java index 5078655ab0..64b3253fed 100644 --- a/src/main/java/server/MapleItemInformationProvider.java +++ b/src/main/java/server/MapleItemInformationProvider.java @@ -32,12 +32,12 @@ import constants.skills.Gunslinger; import constants.skills.NightWalker; import net.server.Server; import provider.*; +import provider.wz.WZFiles; import server.MakerItemFactory.MakerItemCreateEntry; import server.life.MapleLifeFactory; import server.life.MapleMonsterInformationProvider; import tools.*; -import java.io.File; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -116,10 +116,10 @@ public class MapleItemInformationProvider { private MapleItemInformationProvider() { loadCardIdData(); - itemData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Item.wz")); - equipData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Character.wz")); - stringData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/String.wz")); - etcData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Etc.wz")); + itemData = MapleDataProviderFactory.getDataProvider(WZFiles.ITEM); + equipData = MapleDataProviderFactory.getDataProvider(WZFiles.CHARACTER); + stringData = MapleDataProviderFactory.getDataProvider(WZFiles.STRING); + etcData = MapleDataProviderFactory.getDataProvider(WZFiles.ETC); cashStringData = stringData.getData("Cash.img"); consumeStringData = stringData.getData("Consume.img"); eqpStringData = stringData.getData("Eqp.img"); diff --git a/src/main/java/server/MapleSkillbookInformationProvider.java b/src/main/java/server/MapleSkillbookInformationProvider.java index e7909d7d1b..508734f9e9 100644 --- a/src/main/java/server/MapleSkillbookInformationProvider.java +++ b/src/main/java/server/MapleSkillbookInformationProvider.java @@ -24,6 +24,7 @@ import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; +import provider.wz.WZFiles; import tools.DatabaseConnection; import java.io.File; @@ -115,7 +116,7 @@ public class MapleSkillbookInformationProvider { } private static Map fetchSkillbooksFromQuests() { - MapleDataProvider questDataProvider = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/" + "Quest.wz")); + MapleDataProvider questDataProvider = MapleDataProviderFactory.getDataProvider(WZFiles.QUEST); MapleData actData = questDataProvider.getData("Act.img"); MapleData checkData = questDataProvider.getData("Check.img"); diff --git a/src/main/java/server/MapleStorage.java b/src/main/java/server/MapleStorage.java index 676adaeaca..ffb5aca046 100644 --- a/src/main/java/server/MapleStorage.java +++ b/src/main/java/server/MapleStorage.java @@ -29,12 +29,12 @@ import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; +import provider.wz.WZFiles; import tools.DatabaseConnection; import tools.FilePrinter; import tools.MaplePacketCreator; import tools.Pair; -import java.io.File; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -310,7 +310,7 @@ public class MapleStorage { if(fee == null) { fee = 100; - MapleDataProvider npc = MapleDataProviderFactory.getDataProvider(new File("wz/Npc.wz")); + MapleDataProvider npc = MapleDataProviderFactory.getDataProvider(WZFiles.NPC); MapleData npcData = npc.getData(npcId + ".img"); if(npcData != null) { fee = MapleDataTool.getIntConvert("info/trunkPut", npcData, 100); @@ -328,7 +328,7 @@ public class MapleStorage { if(fee == null) { fee = 0; - MapleDataProvider npc = MapleDataProviderFactory.getDataProvider(new File("wz/Npc.wz")); + MapleDataProvider npc = MapleDataProviderFactory.getDataProvider(WZFiles.NPC); MapleData npcData = npc.getData(npcId + ".img"); if(npcData != null) { fee = MapleDataTool.getIntConvert("info/trunkGet", npcData, 0); diff --git a/src/main/java/server/events/gm/MapleOxQuiz.java b/src/main/java/server/events/gm/MapleOxQuiz.java index 08b515571e..4849d01eff 100644 --- a/src/main/java/server/events/gm/MapleOxQuiz.java +++ b/src/main/java/server/events/gm/MapleOxQuiz.java @@ -25,12 +25,12 @@ import client.MapleCharacter; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; +import provider.wz.WZFiles; import server.TimerManager; import server.maps.MapleMap; import tools.MaplePacketCreator; import tools.Randomizer; -import java.io.File; import java.util.ArrayList; import java.util.List; @@ -43,7 +43,7 @@ public final class MapleOxQuiz { private int question = 1; private MapleMap map = null; private int expGain = 200; - private static MapleDataProvider stringData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Etc.wz")); + private static MapleDataProvider stringData = MapleDataProviderFactory.getDataProvider(WZFiles.ETC); public MapleOxQuiz(MapleMap map) { this.map = map; diff --git a/src/main/java/server/life/MapleLifeFactory.java b/src/main/java/server/life/MapleLifeFactory.java index 45bc6184ac..d8a8914341 100644 --- a/src/main/java/server/life/MapleLifeFactory.java +++ b/src/main/java/server/life/MapleLifeFactory.java @@ -26,18 +26,18 @@ import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; import provider.wz.MapleDataType; +import provider.wz.WZFiles; import tools.Pair; import tools.StringUtil; import java.awt.*; -import java.io.File; import java.util.List; import java.util.*; public class MapleLifeFactory { - private static MapleDataProvider data = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Mob.wz")); - private final static MapleDataProvider stringDataWZ = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/String.wz")); + private static MapleDataProvider data = MapleDataProviderFactory.getDataProvider(WZFiles.MOB); + private final static MapleDataProvider stringDataWZ = MapleDataProviderFactory.getDataProvider(WZFiles.STRING); private static MapleData mobStringData = stringDataWZ.getData("Mob.img"); private static MapleData npcStringData = stringDataWZ.getData("Npc.img"); private static Map monsterStats = new HashMap<>(); @@ -46,7 +46,7 @@ public class MapleLifeFactory { private static Set getHpBarBosses() { Set ret = new HashSet<>(); - MapleDataProvider uiDataWZ = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/UI.wz")); + MapleDataProvider uiDataWZ = MapleDataProviderFactory.getDataProvider(WZFiles.UI); for (MapleData bossData : uiDataWZ.getData("UIWindow.img").getChildByPath("MobGage/Mob").getChildren()) { ret.add(Integer.valueOf(bossData.getName())); } diff --git a/src/main/java/server/life/MapleMonsterInformationProvider.java b/src/main/java/server/life/MapleMonsterInformationProvider.java index e84d46d90b..5d2c379faf 100644 --- a/src/main/java/server/life/MapleMonsterInformationProvider.java +++ b/src/main/java/server/life/MapleMonsterInformationProvider.java @@ -26,12 +26,12 @@ import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; +import provider.wz.WZFiles; import server.MapleItemInformationProvider; import tools.DatabaseConnection; import tools.Pair; import tools.Randomizer; -import java.io.File; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -227,7 +227,7 @@ public class MapleMonsterInformationProvider { } public static ArrayList> getMobsIDsFromName(String search) { - MapleDataProvider dataProvider = MapleDataProviderFactory.getDataProvider(new File("wz/String.wz")); + MapleDataProvider dataProvider = MapleDataProviderFactory.getDataProvider(WZFiles.STRING); ArrayList> retMobs = new ArrayList<>(); MapleData data = dataProvider.getData("Mob.img"); List> mobPairList = new LinkedList<>(); @@ -267,7 +267,7 @@ public class MapleMonsterInformationProvider { public String getMobNameFromId(int id) { String mobName = mobNameCache.get(id); if (mobName == null) { - MapleDataProvider dataProvider = MapleDataProviderFactory.getDataProvider(new File("wz/String.wz")); + MapleDataProvider dataProvider = MapleDataProviderFactory.getDataProvider(WZFiles.STRING); MapleData mobData = dataProvider.getData("Mob.img"); mobName = MapleDataTool.getString(mobData.getChildByPath(id + "/name"), ""); diff --git a/src/main/java/server/life/MaplePlayerNPCFactory.java b/src/main/java/server/life/MaplePlayerNPCFactory.java index e769f52b8a..685baa7d11 100644 --- a/src/main/java/server/life/MaplePlayerNPCFactory.java +++ b/src/main/java/server/life/MaplePlayerNPCFactory.java @@ -24,8 +24,8 @@ import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; +import provider.wz.WZFiles; -import java.io.File; import java.util.HashMap; import java.util.LinkedList; import java.util.List; @@ -37,7 +37,7 @@ import java.util.Map; */ public class MaplePlayerNPCFactory { - private static MapleDataProvider npcData = MapleDataProviderFactory.getDataProvider(new File("wz/Npc.wz")); + private static MapleDataProvider npcData = MapleDataProviderFactory.getDataProvider(WZFiles.NPC); private static final Map> dnpcMaps = new HashMap<>(); private static Integer runningDeveloperOid = 2147483000; // 647 slots, long enough @@ -49,11 +49,11 @@ public class MaplePlayerNPCFactory { private static void loadDeveloperRoomMetadata(MapleDataProvider npc) { MapleData thisData = npc.getData("9977777.img"); if(thisData != null) { - MapleDataProvider map = MapleDataProviderFactory.getDataProvider(new File("wz/Map.wz")); + MapleDataProvider map = MapleDataProviderFactory.getDataProvider(WZFiles.MAP); thisData = map.getData("Map/Map7/777777777.img"); if(thisData != null) { - MapleDataProvider sound = MapleDataProviderFactory.getDataProvider(new File("wz/Sound.wz")); + MapleDataProvider sound = MapleDataProviderFactory.getDataProvider(WZFiles.SOUND); thisData = sound.getData("Field.img"); if(thisData != null) { @@ -70,7 +70,7 @@ public class MaplePlayerNPCFactory { MapleDataProvider npc = npcData; loadDeveloperRoomMetadata(npc); - MapleDataProvider etc = MapleDataProviderFactory.getDataProvider(new File("wz/Etc.wz")); + MapleDataProvider etc = MapleDataProviderFactory.getDataProvider(WZFiles.ETC); MapleData dnpcData = etc.getData("DeveloperNpc.img"); if(dnpcData != null) { for (MapleData data : dnpcData.getChildren()) { diff --git a/src/main/java/server/life/MobAttackInfoFactory.java b/src/main/java/server/life/MobAttackInfoFactory.java index b20c17a58d..78d661b04f 100644 --- a/src/main/java/server/life/MobAttackInfoFactory.java +++ b/src/main/java/server/life/MobAttackInfoFactory.java @@ -25,9 +25,9 @@ import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; +import provider.wz.WZFiles; import tools.StringUtil; -import java.io.File; import java.util.HashMap; import java.util.Map; @@ -37,7 +37,7 @@ import java.util.Map; */ public class MobAttackInfoFactory { private static Map mobAttacks = new HashMap<>(); - private static MapleDataProvider dataSource = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Mob.wz")); + private static MapleDataProvider dataSource = MapleDataProviderFactory.getDataProvider(WZFiles.MOB); public static MobAttackInfo getMobAttackInfo(MapleMonster mob, int attack) { MobAttackInfo ret = mobAttacks.get(mob.getId() + "" + attack); diff --git a/src/main/java/server/life/MobSkillFactory.java b/src/main/java/server/life/MobSkillFactory.java index 39b74f71c1..bb6a991352 100644 --- a/src/main/java/server/life/MobSkillFactory.java +++ b/src/main/java/server/life/MobSkillFactory.java @@ -31,9 +31,9 @@ import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; +import provider.wz.WZFiles; import java.awt.*; -import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -46,7 +46,7 @@ import java.util.Map; public class MobSkillFactory { private static Map mobSkills = new HashMap<>(); - private final static MapleDataProvider dataSource = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Skill.wz")); + private final static MapleDataProvider dataSource = MapleDataProviderFactory.getDataProvider(WZFiles.SKILL); private static MapleData skillRoot = dataSource.getData("MobSkill.img"); private final static MonitoredReentrantReadWriteLock dataLock = new MonitoredReentrantReadWriteLock(MonitoredLockType.MOBSKILL_FACTORY); private final static MonitoredReadLock rL = MonitoredReadLockFactory.createLock(dataLock); diff --git a/src/main/java/server/maps/MapleMapFactory.java b/src/main/java/server/maps/MapleMapFactory.java index eb059597d1..88b1efeac4 100644 --- a/src/main/java/server/maps/MapleMapFactory.java +++ b/src/main/java/server/maps/MapleMapFactory.java @@ -25,6 +25,7 @@ import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; +import provider.wz.WZFiles; import scripting.event.EventInstanceManager; import server.life.*; import server.partyquest.GuardianSpawnPoint; @@ -32,7 +33,6 @@ import tools.DatabaseConnection; import tools.StringUtil; import java.awt.*; -import java.io.File; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -47,8 +47,8 @@ public class MapleMapFactory { private static MapleDataProvider mapSource; static { - nameData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/String.wz")).getData("Map.img"); - mapSource = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Map.wz")); + nameData = MapleDataProviderFactory.getDataProvider(WZFiles.STRING).getData("Map.img"); + mapSource = MapleDataProviderFactory.getDataProvider(WZFiles.MAP); } private static void loadLifeFromWz(MapleMap map, MapleData mapData) { diff --git a/src/main/java/server/maps/MapleReactorFactory.java b/src/main/java/server/maps/MapleReactorFactory.java index 68ac4703c4..a4a3502892 100644 --- a/src/main/java/server/maps/MapleReactorFactory.java +++ b/src/main/java/server/maps/MapleReactorFactory.java @@ -25,18 +25,18 @@ import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; +import provider.wz.WZFiles; import server.maps.MapleReactorStats.StateData; import tools.Pair; import tools.StringUtil; -import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MapleReactorFactory { - private static MapleDataProvider data = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Reactor.wz")); + private static MapleDataProvider data = MapleDataProviderFactory.getDataProvider(WZFiles.REACTOR); private static Map reactorStats = new HashMap<>(); diff --git a/src/main/java/server/partyquest/MapleCarnivalFactory.java b/src/main/java/server/partyquest/MapleCarnivalFactory.java index d6e4954bee..d5556dd0b7 100644 --- a/src/main/java/server/partyquest/MapleCarnivalFactory.java +++ b/src/main/java/server/partyquest/MapleCarnivalFactory.java @@ -5,10 +5,10 @@ import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; +import provider.wz.WZFiles; import server.life.MobSkill; import server.life.MobSkillFactory; -import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -22,7 +22,7 @@ public class MapleCarnivalFactory { private final static MapleCarnivalFactory instance = new MapleCarnivalFactory(); private final Map skills = new HashMap<>(); private final Map guardians = new HashMap<>(); - private final MapleDataProvider dataRoot = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Skill.wz")); + private final MapleDataProvider dataRoot = MapleDataProviderFactory.getDataProvider(WZFiles.SKILL); private final List singleTargetedSkills = new ArrayList<>(); private final List multiTargetedSkills = new ArrayList<>(); diff --git a/src/main/java/server/quest/MapleQuest.java b/src/main/java/server/quest/MapleQuest.java index bff4ba65a2..5495a51726 100644 --- a/src/main/java/server/quest/MapleQuest.java +++ b/src/main/java/server/quest/MapleQuest.java @@ -29,12 +29,12 @@ import provider.MapleData; import provider.MapleDataProvider; import provider.MapleDataProviderFactory; import provider.MapleDataTool; +import provider.wz.WZFiles; import server.quest.actions.*; import server.quest.requirements.*; import tools.MaplePacketCreator; import tools.StringUtil; -import java.io.File; import java.util.*; import java.util.Map.Entry; @@ -68,7 +68,7 @@ public class MapleQuest { private boolean autoPreComplete, autoComplete; private boolean repeatable = false; private String name = "", parent = ""; - private final static MapleDataProvider questData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Quest.wz")); + private final static MapleDataProvider questData = MapleDataProviderFactory.getDataProvider(WZFiles.QUEST); private final static MapleData questInfo = questData.getData("QuestInfo.img"); private final static MapleData questAct = questData.getData("Act.img"); private final static MapleData questReq = questData.getData("Check.img"); From bc6593fd8105c633112d087f068294cb73a90f20 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 18:07:46 +0200 Subject: [PATCH 02/36] Move MapleArrowFetcher to the main module --- .../java/server/life/MapleLifeFactory.java | 4 +- src/main/java/tools/DatabaseConnection.java | 4 + .../java/tools/mapletools/ArrowFetcher.java | 220 ++++++++++++++++++ .../tools/mapletools/MonsterStatFetcher.java | 143 ++++++++++++ .../mapletools/SimpleDatabaseConnection.java | 30 +++ .../java/tools/mapletools/ToolConstants.java | 12 + tools/input/.gitignore | 2 + tools/output/.gitignore | 2 + 8 files changed, 415 insertions(+), 2 deletions(-) create mode 100644 src/main/java/tools/mapletools/ArrowFetcher.java create mode 100644 src/main/java/tools/mapletools/MonsterStatFetcher.java create mode 100644 src/main/java/tools/mapletools/SimpleDatabaseConnection.java create mode 100644 src/main/java/tools/mapletools/ToolConstants.java create mode 100644 tools/input/.gitignore create mode 100644 tools/output/.gitignore diff --git a/src/main/java/server/life/MapleLifeFactory.java b/src/main/java/server/life/MapleLifeFactory.java index d8a8914341..556a8953c9 100644 --- a/src/main/java/server/life/MapleLifeFactory.java +++ b/src/main/java/server/life/MapleLifeFactory.java @@ -322,7 +322,7 @@ public class MapleLifeFactory { private int id; private byte chance, x; - private loseItem(int id, byte chance, byte x) { + public loseItem(int id, byte chance, byte x) { this.id = id; this.chance = chance; this.x = x; @@ -347,7 +347,7 @@ public class MapleLifeFactory { private int removeAfter; private int hp; - private selfDestruction(byte action, int removeAfter, int hp) { + public selfDestruction(byte action, int removeAfter, int hp) { this.action = action; this.removeAfter = removeAfter; this.hp = hp; diff --git a/src/main/java/tools/DatabaseConnection.java b/src/main/java/tools/DatabaseConnection.java index ba74ee0f18..0246152ea3 100644 --- a/src/main/java/tools/DatabaseConnection.java +++ b/src/main/java/tools/DatabaseConnection.java @@ -63,6 +63,10 @@ public class DatabaseConnection { * @return true if connection to the database initiated successfully, false if not successful */ public static boolean initializeConnectionPool() { + if (dataSource != null) { + return true; + } + log.info("Initializing connection pool..."); final HikariConfig config = getConfig(); Instant initStart = Instant.now(); diff --git a/src/main/java/tools/mapletools/ArrowFetcher.java b/src/main/java/tools/mapletools/ArrowFetcher.java new file mode 100644 index 0000000000..d492414a1a --- /dev/null +++ b/src/main/java/tools/mapletools/ArrowFetcher.java @@ -0,0 +1,220 @@ +/* + This file is part of the HeavenMS MapleStory Server + Copyleft (L) 2016 - 2019 RonanLana + + 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 version 3 as published by + the Free Software Foundation. You may not use, modify or distribute + this program under any other version of the GNU Affero General Public + License. + + 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 . +*/ +package tools.mapletools; + +import server.life.MapleMonsterStats; +import tools.Pair; + +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +/** + * @author RonanLana + *

+ * This application traces arrow drop data on the underlying DB (that must be + * defined on the DatabaseConnection file of this project) and generates a SQL file + * that proposes updated arrow quantitty on drop entries for the drop_data table. + *

+ * The arrow quantity range is calculated accordingly with the target mob stats, such + * as level and if it's a boss or not. + */ + +public class ArrowFetcher { + private static final String OUTPUT_FILE_NAME = "arrow_drop_data.sql"; + private static final int MIN_ARROW_ID = 2060000; + private static final int MAX_ARROW_ID = 2061004; + private static final float CORRECTION_FACTOR = 2.2f; + + private static final Map> mobRange = new HashMap<>(); + private static PrintWriter printWriter; + private static Map mobStats; + + private static Pair calcArrowRange(int level, boolean boss) { + int minRange, maxRange; + + // MIN range + minRange = (int) Math.ceil(((2.870503597 * level) - 1.870503597) * (boss ? 1.4 : 1.0) / CORRECTION_FACTOR); + + // MAX range + maxRange = (int) Math.ceil(1.25 * minRange); + + return new Pair<>(minRange, maxRange); + } + + private static void calcAllMobsArrowRange() { + System.out.print("Calculating range... "); + + for (Entry mobStat : mobStats.entrySet()) { + MapleMonsterStats mms = mobStat.getValue(); + Pair arrowRange; + + arrowRange = calcArrowRange(mms.getLevel(), mms.isBoss()); + mobRange.put(mobStat.getKey(), arrowRange); + } + + System.out.println("done!"); + } + + private static void printSqlHeader() { + printWriter.println(" # SQL File autogenerated from the MapleArrowFetcher feature by Ronan Lana."); + printWriter.println(" # Generated data takes into account mob stats such as level and boss for the raw arrow ranges."); + printWriter.println(" # Only current arrows entries on the DB it was compiled are being updated here."); + printWriter.println(); + + printWriter.println("UPDATE drop_data"); + printWriter.println("SET minimum_quantity = CASE"); + } + + private static void printSqlMiddle() { + printWriter.println(" ELSE minimum_quantity END,"); + printWriter.println(" maximum_quantity = CASE"); + } + + private static void printSqlFooter() { + printWriter.println(" ELSE maximum_quantity END"); + printWriter.println(";"); + } + + private static void updateSqlMobArrowMinEntry(int[] entry) { + printWriter.println(" WHEN dropperid = " + entry[0] + " AND itemid = " + entry[1] + " THEN " + entry[2]); + } + + private static void updateSqlMobArrowMaxEntry(int[] entry) { + printWriter.println(" WHEN dropperid = " + entry[0] + " AND itemid = " + entry[1] + " THEN " + entry[3]); + } + + private static List getArrowEntryValues(Map> existingEntries) { + List entryValues = new ArrayList<>(200); + + List>> listEntries = new ArrayList<>(existingEntries.entrySet()); + + listEntries.sort((o1, o2) -> { + int val1 = o1.getKey(); + int val2 = o2.getKey(); + return Integer.compare(val1, val2); + }); + + for (Entry> ee : listEntries) { + int mobid = ee.getKey(); + Pair mr = mobRange.get(mobid); + + for (Integer itemid : ee.getValue()) { + int itemWeight = (itemid % 10) + 1; + + int[] values = new int[4]; + values[0] = mobid; + values[1] = itemid; + + values[2] = (int) Math.ceil(mr.getLeft() / itemWeight); // weighted min quantity + values[3] = (int) Math.ceil(mr.getRight() / itemWeight); // weighted max quantity + + entryValues.add(values); + } + } + + return entryValues; + } + + private static void updateMobsArrowRange() { + System.out.print("Generating updated ranges... "); + final Connection con = SimpleDatabaseConnection.getConnection(); + + Map> existingEntries = new HashMap<>(200); + + try { + // select all arrow drop entries on the DB, to update their values + PreparedStatement ps = con.prepareStatement("SELECT dropperid, itemid FROM drop_data WHERE itemid >= " + MIN_ARROW_ID + " AND itemid <= " + MAX_ARROW_ID + " ORDER BY itemid;"); + ResultSet rs = ps.executeQuery(); + + if (rs.isBeforeFirst()) { + while (rs.next()) { + int mobid = rs.getInt(1); + int itemid = rs.getInt(2); + + if (mobRange.containsKey(mobid)) { + List em = existingEntries.get(mobid); + + if (em == null) { + em = new ArrayList<>(2); + existingEntries.put(mobid, em); + } + + em.add(itemid); + } + } + + if (!existingEntries.isEmpty()) { + List entryValues = getArrowEntryValues(existingEntries); + + printWriter = new PrintWriter(ToolConstants.getOutputFile(OUTPUT_FILE_NAME), StandardCharsets.UTF_8); + printSqlHeader(); + + for (int[] arrowEntry : entryValues) { + updateSqlMobArrowMinEntry(arrowEntry); + } + + printSqlMiddle(); + + for (int[] arrowEntry : entryValues) { + updateSqlMobArrowMaxEntry(arrowEntry); + } + + printSqlFooter(); + + printWriter.close(); + } else { + throw new Exception("NO DATA"); + } + + } else { + throw new Exception("NO DATA"); + } + + rs.close(); + ps.close(); + con.close(); + + System.out.println("done!"); + + } catch (Exception e) { + if (e.getMessage() != null && e.getMessage().equals("NO DATA")) { + System.out.println("failed! The DB has no arrow entry to be updated."); + } else { + e.printStackTrace(); + } + } + } + + public static void main(String[] args) { + // load mob stats from WZ + mobStats = MonsterStatFetcher.getAllMonsterStats(); + + calcAllMobsArrowRange(); + updateMobsArrowRange(); + } +} diff --git a/src/main/java/tools/mapletools/MonsterStatFetcher.java b/src/main/java/tools/mapletools/MonsterStatFetcher.java new file mode 100644 index 0000000000..61cbe5a2cc --- /dev/null +++ b/src/main/java/tools/mapletools/MonsterStatFetcher.java @@ -0,0 +1,143 @@ +package tools.mapletools; + +import provider.*; +import provider.wz.MapleDataType; +import provider.wz.WZFiles; +import server.life.Element; +import server.life.ElementalEffectiveness; +import server.life.MapleLifeFactory.BanishInfo; +import server.life.MapleLifeFactory.loseItem; +import server.life.MapleLifeFactory.selfDestruction; +import server.life.MapleMonsterStats; +import tools.Pair; + +import java.util.*; + +public class MonsterStatFetcher { + private static final MapleDataProvider data = MapleDataProviderFactory.getDataProvider(WZFiles.MOB); + private static final MapleDataProvider stringDataWZ = MapleDataProviderFactory.getDataProvider(WZFiles.STRING); + private static final MapleData mobStringData = stringDataWZ.getData("Mob.img"); + private static final Map monsterStats = new HashMap<>(); + + static Map getAllMonsterStats() { + MapleDataDirectoryEntry root = data.getRoot(); + + System.out.print("Parsing mob stats... "); + for (MapleDataFileEntry mFile : root.getFiles()) { + try { + String fileName = mFile.getName(); + + //System.out.println("Parsing '" + fileName + "'"); + MapleData monsterData = data.getData(fileName); + if (monsterData == null) { + continue; + } + + Integer mid = getMonsterId(fileName); + + MapleData monsterInfoData = monsterData.getChildByPath("info"); + MapleMonsterStats stats = new MapleMonsterStats(); + stats.setHp(MapleDataTool.getIntConvert("maxHP", monsterInfoData)); + stats.setFriendly(MapleDataTool.getIntConvert("damagedByMob", monsterInfoData, 0) == 1); + stats.setPADamage(MapleDataTool.getIntConvert("PADamage", monsterInfoData)); + stats.setPDDamage(MapleDataTool.getIntConvert("PDDamage", monsterInfoData)); + stats.setMADamage(MapleDataTool.getIntConvert("MADamage", monsterInfoData)); + stats.setMDDamage(MapleDataTool.getIntConvert("MDDamage", monsterInfoData)); + stats.setMp(MapleDataTool.getIntConvert("maxMP", monsterInfoData, 0)); + stats.setExp(MapleDataTool.getIntConvert("exp", monsterInfoData, 0)); + stats.setLevel(MapleDataTool.getIntConvert("level", monsterInfoData)); + stats.setRemoveAfter(MapleDataTool.getIntConvert("removeAfter", monsterInfoData, 0)); + stats.setBoss(MapleDataTool.getIntConvert("boss", monsterInfoData, 0) > 0); + stats.setExplosiveReward(MapleDataTool.getIntConvert("explosiveReward", monsterInfoData, 0) > 0); + stats.setFfaLoot(MapleDataTool.getIntConvert("publicReward", monsterInfoData, 0) > 0); + stats.setUndead(MapleDataTool.getIntConvert("undead", monsterInfoData, 0) > 0); + stats.setName(MapleDataTool.getString(mid + "/name", mobStringData, "MISSINGNO")); + stats.setBuffToGive(MapleDataTool.getIntConvert("buff", monsterInfoData, -1)); + stats.setCP(MapleDataTool.getIntConvert("getCP", monsterInfoData, 0)); + stats.setRemoveOnMiss(MapleDataTool.getIntConvert("removeOnMiss", monsterInfoData, 0) > 0); + + MapleData special = monsterInfoData.getChildByPath("coolDamage"); + if (special != null) { + int coolDmg = MapleDataTool.getIntConvert("coolDamage", monsterInfoData); + int coolProb = MapleDataTool.getIntConvert("coolDamageProb", monsterInfoData, 0); + stats.setCool(new Pair<>(coolDmg, coolProb)); + } + special = monsterInfoData.getChildByPath("loseItem"); + if (special != null) { + for (MapleData liData : special.getChildren()) { + stats.addLoseItem(new loseItem(MapleDataTool.getInt(liData.getChildByPath("id")), (byte) MapleDataTool.getInt(liData.getChildByPath("prop")), (byte) MapleDataTool.getInt(liData.getChildByPath("x")))); + } + } + special = monsterInfoData.getChildByPath("selfDestruction"); + if (special != null) { + stats.setSelfDestruction(new selfDestruction((byte) MapleDataTool.getInt(special.getChildByPath("action")), MapleDataTool.getIntConvert("removeAfter", special, -1), MapleDataTool.getIntConvert("hp", special, -1))); + } + MapleData firstAttackData = monsterInfoData.getChildByPath("firstAttack"); + int firstAttack = 0; + if (firstAttackData != null) { + if (firstAttackData.getType() == MapleDataType.FLOAT) { + firstAttack = Math.round(MapleDataTool.getFloat(firstAttackData)); + } else { + firstAttack = MapleDataTool.getInt(firstAttackData); + } + } + stats.setFirstAttack(firstAttack > 0); + stats.setDropPeriod(MapleDataTool.getIntConvert("dropItemPeriod", monsterInfoData, 0) * 10000); + + stats.setTagColor(MapleDataTool.getIntConvert("hpTagColor", monsterInfoData, 0)); + stats.setTagBgColor(MapleDataTool.getIntConvert("hpTagBgcolor", monsterInfoData, 0)); + + for (MapleData idata : monsterData) { + if (!idata.getName().equals("info")) { + int delay = 0; + for (MapleData pic : idata.getChildren()) { + delay += MapleDataTool.getIntConvert("delay", pic, 0); + } + stats.setAnimationTime(idata.getName(), delay); + } + } + MapleData reviveInfo = monsterInfoData.getChildByPath("revive"); + if (reviveInfo != null) { + List revives = new LinkedList<>(); + for (MapleData data_ : reviveInfo) { + revives.add(MapleDataTool.getInt(data_)); + } + stats.setRevives(revives); + } + decodeElementalString(stats, MapleDataTool.getString("elemAttr", monsterInfoData, "")); + MapleData monsterSkillData = monsterInfoData.getChildByPath("skill"); + if (monsterSkillData != null) { + int i = 0; + List> skills = new ArrayList<>(); + while (monsterSkillData.getChildByPath(Integer.toString(i)) != null) { + skills.add(new Pair<>(MapleDataTool.getInt(i + "/skill", monsterSkillData, 0), MapleDataTool.getInt(i + "/level", monsterSkillData, 0))); + i++; + } + stats.setSkills(skills); + } + MapleData banishData = monsterInfoData.getChildByPath("ban"); + if (banishData != null) { + stats.setBanishInfo(new BanishInfo(MapleDataTool.getString("banMsg", banishData), MapleDataTool.getInt("banMap/0/field", banishData, -1), MapleDataTool.getString("banMap/0/portal", banishData, "sp"))); + } + + monsterStats.put(mid, stats); + } catch(NullPointerException npe) { + //System.out.println("[SEVERE] " + mFile.getName() + " failed to load. Issue: " + npe.getMessage() + "\n\n"); + } + } + + System.out.println("Done parsing mob stats!"); + return monsterStats; + } + + private static int getMonsterId(String fileName) { + return Integer.parseInt(fileName.substring(0, 7)); + } + + private static void decodeElementalString(MapleMonsterStats stats, String elemAttr) { + for (int i = 0; i < elemAttr.length(); i += 2) { + stats.setEffectiveness(Element.getFromChar(elemAttr.charAt(i)), ElementalEffectiveness.getByNumber(Integer.valueOf(String.valueOf(elemAttr.charAt(i + 1))))); + } + } + +} diff --git a/src/main/java/tools/mapletools/SimpleDatabaseConnection.java b/src/main/java/tools/mapletools/SimpleDatabaseConnection.java new file mode 100644 index 0000000000..80f5f1bf88 --- /dev/null +++ b/src/main/java/tools/mapletools/SimpleDatabaseConnection.java @@ -0,0 +1,30 @@ +package tools.mapletools; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.config.Configurator; +import tools.DatabaseConnection; + +import java.sql.Connection; +import java.sql.SQLException; + +final class SimpleDatabaseConnection { + private SimpleDatabaseConnection() {} + + static Connection getConnection() { + muffleLogging(); + DatabaseConnection.initializeConnectionPool(); + + try { + return DatabaseConnection.getConnection(); + } catch (SQLException e) { + throw new IllegalStateException("Failed to get database connection", e); + } + } + + private static void muffleLogging() { + final Level minimumVisibleLevel = Level.WARN; + Configurator.setLevel(LogManager.getLogger(com.zaxxer.hikari.HikariDataSource.class).getName(), minimumVisibleLevel); + Configurator.setRootLevel(minimumVisibleLevel); + } +} diff --git a/src/main/java/tools/mapletools/ToolConstants.java b/src/main/java/tools/mapletools/ToolConstants.java new file mode 100644 index 0000000000..aa097172cf --- /dev/null +++ b/src/main/java/tools/mapletools/ToolConstants.java @@ -0,0 +1,12 @@ +package tools.mapletools; + +import java.io.File; + +public class ToolConstants { + public static final File INPUT_DIRECTORY = new File("tools/input"); + public static final File OUTPUT_DIRECTORY = new File("tools/output"); + + public static File getOutputFile(String fileName) { + return new File(OUTPUT_DIRECTORY, fileName); + } +} diff --git a/tools/input/.gitignore b/tools/input/.gitignore new file mode 100644 index 0000000000..c96a04f008 --- /dev/null +++ b/tools/input/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/tools/output/.gitignore b/tools/output/.gitignore new file mode 100644 index 0000000000..c96a04f008 --- /dev/null +++ b/tools/output/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file From a7cf7b90ce582879a81859f7652dcc96cb8fe7be Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 18:12:53 +0200 Subject: [PATCH 03/36] Clean up the old MapleArrowFetcher --- .gitignore | 4 - .../MapleArrowFetcher/lib/arrow_drop_data.sql | 766 ------------------ tools/MapleArrowFetcher/src/life/Element.java | 46 -- .../src/life/ElementalEffectiveness.java | 41 - .../src/life/MapleLifeFactory.java | 240 ------ .../src/life/MapleMonsterStats.java | 330 -------- .../maplearrowfetcher/MapleArrowFetcher.java | 222 ----- .../src/provider/MapleCanvas.java | 30 - .../src/provider/MapleData.java | 34 - .../src/provider/MapleDataDirectoryEntry.java | 34 - .../src/provider/MapleDataEntity.java | 31 - .../src/provider/MapleDataEntry.java | 33 - .../src/provider/MapleDataFileEntry.java | 30 - .../src/provider/MapleDataProvider.java | 27 - .../provider/MapleDataProviderFactory.java | 55 -- .../src/provider/MapleDataTool.java | 145 ---- .../provider/wz/FileStoredPngMapleCanvas.java | 70 -- .../src/provider/wz/ImgMapleSound.java | 39 - .../src/provider/wz/ListWZFile.java | 86 -- .../src/provider/wz/MapleDataType.java | 26 - .../src/provider/wz/PNGMapleCanvas.java | 151 ---- .../src/provider/wz/WZDirectoryEntry.java | 68 -- .../src/provider/wz/WZEntry.java | 61 -- .../src/provider/wz/WZFile.java | 154 ---- .../src/provider/wz/WZFileEntry.java | 42 - .../src/provider/wz/WZIMGEntry.java | 118 --- .../src/provider/wz/WZIMGFile.java | 227 ------ .../src/provider/wz/WZTool.java | 188 ----- .../src/provider/wz/XMLDomMapleData.java | 219 ----- .../src/provider/wz/XMLWZFile.java | 85 -- .../src/tools/DatabaseConnection.java | 51 -- .../MapleArrowFetcher/src/tools/HexTool.java | 79 -- tools/MapleArrowFetcher/src/tools/Pair.java | 121 --- .../tools/data/input/ByteArrayByteStream.java | 72 -- .../src/tools/data/input/ByteInputStream.java | 35 - .../input/GenericLittleEndianAccessor.java | 239 ------ .../GenericSeekableLittleEndianAccessor.java | 91 --- .../data/input/InputStreamByteStream.java | 93 --- .../data/input/LittleEndianAccessor.java | 45 - .../data/input/RandomAccessByteStream.java | 84 -- .../input/SeekableInputStreamBytestream.java | 51 -- .../input/SeekableLittleEndianAccessor.java | 27 - .../data/output/BAOSByteOutputStream.java | 56 -- .../tools/data/output/ByteOutputStream.java | 38 - .../output/GenericLittleEndianWriter.java | 183 ----- .../tools/data/output/LittleEndianWriter.java | 114 --- .../output/MaplePacketLittleEndianWriter.java | 73 -- 47 files changed, 5054 deletions(-) delete mode 100644 tools/MapleArrowFetcher/lib/arrow_drop_data.sql delete mode 100644 tools/MapleArrowFetcher/src/life/Element.java delete mode 100644 tools/MapleArrowFetcher/src/life/ElementalEffectiveness.java delete mode 100644 tools/MapleArrowFetcher/src/life/MapleLifeFactory.java delete mode 100644 tools/MapleArrowFetcher/src/life/MapleMonsterStats.java delete mode 100644 tools/MapleArrowFetcher/src/maplearrowfetcher/MapleArrowFetcher.java delete mode 100644 tools/MapleArrowFetcher/src/provider/MapleCanvas.java delete mode 100644 tools/MapleArrowFetcher/src/provider/MapleData.java delete mode 100644 tools/MapleArrowFetcher/src/provider/MapleDataDirectoryEntry.java delete mode 100644 tools/MapleArrowFetcher/src/provider/MapleDataEntity.java delete mode 100644 tools/MapleArrowFetcher/src/provider/MapleDataEntry.java delete mode 100644 tools/MapleArrowFetcher/src/provider/MapleDataFileEntry.java delete mode 100644 tools/MapleArrowFetcher/src/provider/MapleDataProvider.java delete mode 100644 tools/MapleArrowFetcher/src/provider/MapleDataProviderFactory.java delete mode 100644 tools/MapleArrowFetcher/src/provider/MapleDataTool.java delete mode 100644 tools/MapleArrowFetcher/src/provider/wz/FileStoredPngMapleCanvas.java delete mode 100644 tools/MapleArrowFetcher/src/provider/wz/ImgMapleSound.java delete mode 100644 tools/MapleArrowFetcher/src/provider/wz/ListWZFile.java delete mode 100644 tools/MapleArrowFetcher/src/provider/wz/MapleDataType.java delete mode 100644 tools/MapleArrowFetcher/src/provider/wz/PNGMapleCanvas.java delete mode 100644 tools/MapleArrowFetcher/src/provider/wz/WZDirectoryEntry.java delete mode 100644 tools/MapleArrowFetcher/src/provider/wz/WZEntry.java delete mode 100644 tools/MapleArrowFetcher/src/provider/wz/WZFile.java delete mode 100644 tools/MapleArrowFetcher/src/provider/wz/WZFileEntry.java delete mode 100644 tools/MapleArrowFetcher/src/provider/wz/WZIMGEntry.java delete mode 100644 tools/MapleArrowFetcher/src/provider/wz/WZIMGFile.java delete mode 100644 tools/MapleArrowFetcher/src/provider/wz/WZTool.java delete mode 100644 tools/MapleArrowFetcher/src/provider/wz/XMLDomMapleData.java delete mode 100644 tools/MapleArrowFetcher/src/provider/wz/XMLWZFile.java delete mode 100644 tools/MapleArrowFetcher/src/tools/DatabaseConnection.java delete mode 100644 tools/MapleArrowFetcher/src/tools/HexTool.java delete mode 100644 tools/MapleArrowFetcher/src/tools/Pair.java delete mode 100644 tools/MapleArrowFetcher/src/tools/data/input/ByteArrayByteStream.java delete mode 100644 tools/MapleArrowFetcher/src/tools/data/input/ByteInputStream.java delete mode 100644 tools/MapleArrowFetcher/src/tools/data/input/GenericLittleEndianAccessor.java delete mode 100644 tools/MapleArrowFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java delete mode 100644 tools/MapleArrowFetcher/src/tools/data/input/InputStreamByteStream.java delete mode 100644 tools/MapleArrowFetcher/src/tools/data/input/LittleEndianAccessor.java delete mode 100644 tools/MapleArrowFetcher/src/tools/data/input/RandomAccessByteStream.java delete mode 100644 tools/MapleArrowFetcher/src/tools/data/input/SeekableInputStreamBytestream.java delete mode 100644 tools/MapleArrowFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java delete mode 100644 tools/MapleArrowFetcher/src/tools/data/output/BAOSByteOutputStream.java delete mode 100644 tools/MapleArrowFetcher/src/tools/data/output/ByteOutputStream.java delete mode 100644 tools/MapleArrowFetcher/src/tools/data/output/GenericLittleEndianWriter.java delete mode 100644 tools/MapleArrowFetcher/src/tools/data/output/LittleEndianWriter.java delete mode 100644 tools/MapleArrowFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java diff --git a/.gitignore b/.gitignore index 99c411b1fa..937743c99f 100644 --- a/.gitignore +++ b/.gitignore @@ -9,10 +9,6 @@ /dist/ /nbproject/ -/tools/MapleArrowFetcher/build/ -/tools/MapleArrowFetcher/dist/ -/tools/MapleArrowFetcher/nbproject/ - /tools/MapleBossHpBarFetcher/build/ /tools/MapleBossHpBarFetcher/dist/ /tools/MapleBossHpBarFetcher/nbproject/ diff --git a/tools/MapleArrowFetcher/lib/arrow_drop_data.sql b/tools/MapleArrowFetcher/lib/arrow_drop_data.sql deleted file mode 100644 index 55f00340ee..0000000000 --- a/tools/MapleArrowFetcher/lib/arrow_drop_data.sql +++ /dev/null @@ -1,766 +0,0 @@ - # SQL File autogenerated from the MapleArrowFetcher feature by Ronan Lana. - # Generated data takes into account mob stats such as level and boss for the raw arrow ranges. - # Only current arrows entries on the DB it was compiled are being updated here. - -UPDATE drop_data -SET minimum_quantity = CASE - WHEN dropperid = 100100 AND itemid = 2060000 THEN 1 - WHEN dropperid = 100100 AND itemid = 2061000 THEN 1 - WHEN dropperid = 100101 AND itemid = 2060000 THEN 2 - WHEN dropperid = 100101 AND itemid = 2061000 THEN 2 - WHEN dropperid = 100120 AND itemid = 2060000 THEN 1 - WHEN dropperid = 100120 AND itemid = 2061000 THEN 1 - WHEN dropperid = 100121 AND itemid = 2060000 THEN 4 - WHEN dropperid = 100123 AND itemid = 2061000 THEN 9 - WHEN dropperid = 100124 AND itemid = 2060000 THEN 11 - WHEN dropperid = 100124 AND itemid = 2061000 THEN 11 - WHEN dropperid = 120100 AND itemid = 2060000 THEN 2 - WHEN dropperid = 120100 AND itemid = 2061000 THEN 2 - WHEN dropperid = 130100 AND itemid = 2060000 THEN 5 - WHEN dropperid = 130100 AND itemid = 2061000 THEN 5 - WHEN dropperid = 130101 AND itemid = 2060000 THEN 5 - WHEN dropperid = 130101 AND itemid = 2061000 THEN 5 - WHEN dropperid = 210100 AND itemid = 2060000 THEN 7 - WHEN dropperid = 210100 AND itemid = 2061000 THEN 7 - WHEN dropperid = 1110100 AND itemid = 2060000 THEN 19 - WHEN dropperid = 1110100 AND itemid = 2061000 THEN 19 - WHEN dropperid = 1110101 AND itemid = 2060000 THEN 13 - WHEN dropperid = 1110101 AND itemid = 2061000 THEN 13 - WHEN dropperid = 1110130 AND itemid = 2060000 THEN 19 - WHEN dropperid = 1110130 AND itemid = 2061000 THEN 19 - WHEN dropperid = 1120100 AND itemid = 2060000 THEN 15 - WHEN dropperid = 1120100 AND itemid = 2061000 THEN 15 - WHEN dropperid = 1130100 AND itemid = 2060000 THEN 22 - WHEN dropperid = 1130100 AND itemid = 2061000 THEN 22 - WHEN dropperid = 1140100 AND itemid = 2060000 THEN 24 - WHEN dropperid = 1140100 AND itemid = 2061000 THEN 24 - WHEN dropperid = 1140130 AND itemid = 2060000 THEN 24 - WHEN dropperid = 1140130 AND itemid = 2061000 THEN 24 - WHEN dropperid = 1210100 AND itemid = 2060000 THEN 9 - WHEN dropperid = 1210100 AND itemid = 2061000 THEN 9 - WHEN dropperid = 1210101 AND itemid = 2060000 THEN 13 - WHEN dropperid = 1210101 AND itemid = 2061000 THEN 13 - WHEN dropperid = 1210102 AND itemid = 2060000 THEN 10 - WHEN dropperid = 1210102 AND itemid = 2061000 THEN 10 - WHEN dropperid = 1210103 AND itemid = 2060000 THEN 19 - WHEN dropperid = 1210103 AND itemid = 2061000 THEN 19 - WHEN dropperid = 2100100 AND itemid = 2060000 THEN 26 - WHEN dropperid = 2100100 AND itemid = 2061000 THEN 26 - WHEN dropperid = 2100101 AND itemid = 2060000 THEN 27 - WHEN dropperid = 2100101 AND itemid = 2061000 THEN 27 - WHEN dropperid = 2100102 AND itemid = 2060000 THEN 28 - WHEN dropperid = 2100102 AND itemid = 2061000 THEN 28 - WHEN dropperid = 2100103 AND itemid = 2060000 THEN 32 - WHEN dropperid = 2100103 AND itemid = 2061000 THEN 32 - WHEN dropperid = 2100104 AND itemid = 2060000 THEN 36 - WHEN dropperid = 2100104 AND itemid = 2061000 THEN 36 - WHEN dropperid = 2100105 AND itemid = 2060000 THEN 30 - WHEN dropperid = 2100105 AND itemid = 2061000 THEN 30 - WHEN dropperid = 2100106 AND itemid = 2060000 THEN 31 - WHEN dropperid = 2100106 AND itemid = 2061000 THEN 31 - WHEN dropperid = 2100107 AND itemid = 2060000 THEN 35 - WHEN dropperid = 2100107 AND itemid = 2061000 THEN 35 - WHEN dropperid = 2100108 AND itemid = 2060000 THEN 37 - WHEN dropperid = 2100108 AND itemid = 2061000 THEN 37 - WHEN dropperid = 2110200 AND itemid = 2060000 THEN 28 - WHEN dropperid = 2110200 AND itemid = 2061000 THEN 28 - WHEN dropperid = 2110300 AND itemid = 2060000 THEN 31 - WHEN dropperid = 2110300 AND itemid = 2061000 THEN 31 - WHEN dropperid = 2110301 AND itemid = 2060000 THEN 37 - WHEN dropperid = 2110301 AND itemid = 2061000 THEN 37 - WHEN dropperid = 2130100 AND itemid = 2060000 THEN 28 - WHEN dropperid = 2130100 AND itemid = 2061000 THEN 28 - WHEN dropperid = 2220000 AND itemid = 2060000 THEN 36 - WHEN dropperid = 2220000 AND itemid = 2061000 THEN 36 - WHEN dropperid = 2220100 AND itemid = 2060000 THEN 26 - WHEN dropperid = 2220100 AND itemid = 2061000 THEN 26 - WHEN dropperid = 2230100 AND itemid = 2060000 THEN 35 - WHEN dropperid = 2230100 AND itemid = 2061000 THEN 35 - WHEN dropperid = 2230101 AND itemid = 2060000 THEN 31 - WHEN dropperid = 2230101 AND itemid = 2061000 THEN 31 - WHEN dropperid = 2230102 AND itemid = 2060000 THEN 32 - WHEN dropperid = 2230102 AND itemid = 2061000 THEN 32 - WHEN dropperid = 2230103 AND itemid = 2060000 THEN 30 - WHEN dropperid = 2230103 AND itemid = 2061000 THEN 30 - WHEN dropperid = 2230104 AND itemid = 2060000 THEN 36 - WHEN dropperid = 2230104 AND itemid = 2061000 THEN 36 - WHEN dropperid = 2230105 AND itemid = 2060000 THEN 30 - WHEN dropperid = 2230105 AND itemid = 2061000 THEN 30 - WHEN dropperid = 2230106 AND itemid = 2060000 THEN 32 - WHEN dropperid = 2230106 AND itemid = 2061000 THEN 32 - WHEN dropperid = 2230107 AND itemid = 2060000 THEN 31 - WHEN dropperid = 2230107 AND itemid = 2061000 THEN 31 - WHEN dropperid = 2230108 AND itemid = 2060000 THEN 28 - WHEN dropperid = 2230108 AND itemid = 2061000 THEN 28 - WHEN dropperid = 2230109 AND itemid = 2060000 THEN 36 - WHEN dropperid = 2230109 AND itemid = 2061000 THEN 36 - WHEN dropperid = 2230110 AND itemid = 2060000 THEN 30 - WHEN dropperid = 2230110 AND itemid = 2061000 THEN 30 - WHEN dropperid = 2230111 AND itemid = 2060000 THEN 31 - WHEN dropperid = 2230111 AND itemid = 2061000 THEN 31 - WHEN dropperid = 2230131 AND itemid = 2060000 THEN 31 - WHEN dropperid = 2230131 AND itemid = 2061000 THEN 31 - WHEN dropperid = 2230200 AND itemid = 2060000 THEN 37 - WHEN dropperid = 2230200 AND itemid = 2061000 THEN 37 - WHEN dropperid = 2300100 AND itemid = 2060000 THEN 26 - WHEN dropperid = 2300100 AND itemid = 2061000 THEN 26 - WHEN dropperid = 3000000 AND itemid = 2060000 THEN 39 - WHEN dropperid = 3000000 AND itemid = 2061000 THEN 39 - WHEN dropperid = 3000005 AND itemid = 2060000 THEN 39 - WHEN dropperid = 3000005 AND itemid = 2061000 THEN 39 - WHEN dropperid = 3000006 AND itemid = 2060000 THEN 39 - WHEN dropperid = 3000006 AND itemid = 2061000 THEN 39 - WHEN dropperid = 3100101 AND itemid = 2060000 THEN 41 - WHEN dropperid = 3100101 AND itemid = 2061000 THEN 41 - WHEN dropperid = 3100102 AND itemid = 2060000 THEN 39 - WHEN dropperid = 3100102 AND itemid = 2061000 THEN 39 - WHEN dropperid = 3110101 AND itemid = 2060000 THEN 41 - WHEN dropperid = 3110101 AND itemid = 2061000 THEN 41 - WHEN dropperid = 3110102 AND itemid = 2060000 THEN 41 - WHEN dropperid = 3110102 AND itemid = 2061000 THEN 41 - WHEN dropperid = 3110300 AND itemid = 2060000 THEN 41 - WHEN dropperid = 3110300 AND itemid = 2061000 THEN 41 - WHEN dropperid = 3110301 AND itemid = 2060000 THEN 41 - WHEN dropperid = 3110301 AND itemid = 2061000 THEN 41 - WHEN dropperid = 3110302 AND itemid = 2060000 THEN 45 - WHEN dropperid = 3110302 AND itemid = 2061000 THEN 45 - WHEN dropperid = 3110303 AND itemid = 2060000 THEN 49 - WHEN dropperid = 3110303 AND itemid = 2061000 THEN 49 - WHEN dropperid = 3210100 AND itemid = 2060005 THEN 6 - WHEN dropperid = 3210203 AND itemid = 2060000 THEN 47 - WHEN dropperid = 3210203 AND itemid = 2061000 THEN 47 - WHEN dropperid = 3210204 AND itemid = 2060000 THEN 44 - WHEN dropperid = 3210204 AND itemid = 2061000 THEN 44 - WHEN dropperid = 3210205 AND itemid = 2060000 THEN 44 - WHEN dropperid = 3210205 AND itemid = 2061000 THEN 44 - WHEN dropperid = 3210206 AND itemid = 2060000 THEN 47 - WHEN dropperid = 3210206 AND itemid = 2061000 THEN 47 - WHEN dropperid = 3210207 AND itemid = 2060000 THEN 44 - WHEN dropperid = 3210207 AND itemid = 2060005 THEN 7 - WHEN dropperid = 3210207 AND itemid = 2061000 THEN 44 - WHEN dropperid = 3210208 AND itemid = 2060000 THEN 47 - WHEN dropperid = 3210208 AND itemid = 2061000 THEN 47 - WHEN dropperid = 3210450 AND itemid = 2060000 THEN 47 - WHEN dropperid = 3210450 AND itemid = 2061000 THEN 47 - WHEN dropperid = 3210800 AND itemid = 2060005 THEN 8 - WHEN dropperid = 3220000 AND itemid = 2060000 THEN 63 - WHEN dropperid = 3220000 AND itemid = 2061000 THEN 63 - WHEN dropperid = 3230100 AND itemid = 2060000 THEN 45 - WHEN dropperid = 3230100 AND itemid = 2061000 THEN 45 - WHEN dropperid = 3230103 AND itemid = 2060000 THEN 49 - WHEN dropperid = 3230103 AND itemid = 2061000 THEN 49 - WHEN dropperid = 3230200 AND itemid = 2060000 THEN 45 - WHEN dropperid = 3230200 AND itemid = 2061000 THEN 45 - WHEN dropperid = 3230302 AND itemid = 2060000 THEN 45 - WHEN dropperid = 3230302 AND itemid = 2061000 THEN 45 - WHEN dropperid = 3230303 AND itemid = 2060000 THEN 48 - WHEN dropperid = 3230303 AND itemid = 2061000 THEN 48 - WHEN dropperid = 3230304 AND itemid = 2060000 THEN 49 - WHEN dropperid = 3230304 AND itemid = 2061000 THEN 49 - WHEN dropperid = 3230305 AND itemid = 2060000 THEN 51 - WHEN dropperid = 3230305 AND itemid = 2061000 THEN 51 - WHEN dropperid = 3230306 AND itemid = 2060000 THEN 48 - WHEN dropperid = 3230306 AND itemid = 2061000 THEN 48 - WHEN dropperid = 3230307 AND itemid = 2060000 THEN 40 - WHEN dropperid = 3230307 AND itemid = 2061000 THEN 40 - WHEN dropperid = 3230308 AND itemid = 2060000 THEN 51 - WHEN dropperid = 3230308 AND itemid = 2061000 THEN 51 - WHEN dropperid = 3230400 AND itemid = 2060000 THEN 39 - WHEN dropperid = 3230400 AND itemid = 2061000 THEN 39 - WHEN dropperid = 3230405 AND itemid = 2060000 THEN 49 - WHEN dropperid = 3230405 AND itemid = 2061000 THEN 49 - WHEN dropperid = 3300000 AND itemid = 2060000 THEN 39 - WHEN dropperid = 3300000 AND itemid = 2061000 THEN 39 - WHEN dropperid = 3300001 AND itemid = 2060000 THEN 39 - WHEN dropperid = 3300001 AND itemid = 2061000 THEN 39 - WHEN dropperid = 3300002 AND itemid = 2060000 THEN 40 - WHEN dropperid = 3300002 AND itemid = 2061000 THEN 40 - WHEN dropperid = 3300003 AND itemid = 2060000 THEN 41 - WHEN dropperid = 3300003 AND itemid = 2061000 THEN 41 - WHEN dropperid = 3300004 AND itemid = 2060000 THEN 43 - WHEN dropperid = 3300004 AND itemid = 2061000 THEN 43 - WHEN dropperid = 3300006 AND itemid = 2060000 THEN 45 - WHEN dropperid = 3300006 AND itemid = 2061000 THEN 45 - WHEN dropperid = 3300007 AND itemid = 2060000 THEN 45 - WHEN dropperid = 3300007 AND itemid = 2061000 THEN 45 - WHEN dropperid = 3300008 AND itemid = 2060000 THEN 69 - WHEN dropperid = 3300008 AND itemid = 2061000 THEN 69 - WHEN dropperid = 4110300 AND itemid = 2060000 THEN 54 - WHEN dropperid = 4110300 AND itemid = 2061000 THEN 54 - WHEN dropperid = 4110301 AND itemid = 2060000 THEN 58 - WHEN dropperid = 4110301 AND itemid = 2061000 THEN 58 - WHEN dropperid = 4130103 AND itemid = 2060000 THEN 85 - WHEN dropperid = 4130103 AND itemid = 2061000 THEN 85 - WHEN dropperid = 4230103 AND itemid = 2060000 THEN 54 - WHEN dropperid = 4230103 AND itemid = 2061000 THEN 54 - WHEN dropperid = 4230106 AND itemid = 2060000 THEN 58 - WHEN dropperid = 4230106 AND itemid = 2061000 THEN 58 - WHEN dropperid = 4230108 AND itemid = 2060000 THEN 56 - WHEN dropperid = 4230108 AND itemid = 2061000 THEN 56 - WHEN dropperid = 4230109 AND itemid = 2060000 THEN 54 - WHEN dropperid = 4230109 AND itemid = 2061000 THEN 54 - WHEN dropperid = 4230110 AND itemid = 2060000 THEN 58 - WHEN dropperid = 4230110 AND itemid = 2061000 THEN 58 - WHEN dropperid = 4230111 AND itemid = 2060000 THEN 53 - WHEN dropperid = 4230111 AND itemid = 2061000 THEN 53 - WHEN dropperid = 4230112 AND itemid = 2060000 THEN 57 - WHEN dropperid = 4230112 AND itemid = 2061000 THEN 57 - WHEN dropperid = 4230113 AND itemid = 2060000 THEN 52 - WHEN dropperid = 4230113 AND itemid = 2061000 THEN 52 - WHEN dropperid = 4230114 AND itemid = 2060000 THEN 53 - WHEN dropperid = 4230114 AND itemid = 2061000 THEN 53 - WHEN dropperid = 4230115 AND itemid = 2060000 THEN 60 - WHEN dropperid = 4230115 AND itemid = 2061000 THEN 60 - WHEN dropperid = 4230116 AND itemid = 2060000 THEN 52 - WHEN dropperid = 4230116 AND itemid = 2061000 THEN 52 - WHEN dropperid = 4230117 AND itemid = 2060000 THEN 54 - WHEN dropperid = 4230117 AND itemid = 2061000 THEN 54 - WHEN dropperid = 4230118 AND itemid = 2060000 THEN 58 - WHEN dropperid = 4230118 AND itemid = 2061000 THEN 58 - WHEN dropperid = 4230119 AND itemid = 2060000 THEN 53 - WHEN dropperid = 4230119 AND itemid = 2061000 THEN 53 - WHEN dropperid = 4230120 AND itemid = 2060000 THEN 57 - WHEN dropperid = 4230120 AND itemid = 2061000 THEN 57 - WHEN dropperid = 4230121 AND itemid = 2060000 THEN 60 - WHEN dropperid = 4230121 AND itemid = 2061000 THEN 60 - WHEN dropperid = 4230123 AND itemid = 2060000 THEN 56 - WHEN dropperid = 4230123 AND itemid = 2061000 THEN 56 - WHEN dropperid = 4230124 AND itemid = 2060000 THEN 54 - WHEN dropperid = 4230124 AND itemid = 2061000 THEN 54 - WHEN dropperid = 4230125 AND itemid = 2060000 THEN 57 - WHEN dropperid = 4230125 AND itemid = 2061000 THEN 57 - WHEN dropperid = 4230126 AND itemid = 2060000 THEN 61 - WHEN dropperid = 4230126 AND itemid = 2061000 THEN 61 - WHEN dropperid = 4230201 AND itemid = 2060000 THEN 52 - WHEN dropperid = 4230201 AND itemid = 2061000 THEN 52 - WHEN dropperid = 4230300 AND itemid = 2060000 THEN 58 - WHEN dropperid = 4230300 AND itemid = 2061000 THEN 58 - WHEN dropperid = 4230400 AND itemid = 2060000 THEN 58 - WHEN dropperid = 4230400 AND itemid = 2061000 THEN 58 - WHEN dropperid = 4230500 AND itemid = 2060000 THEN 52 - WHEN dropperid = 4230500 AND itemid = 2061000 THEN 52 - WHEN dropperid = 4230501 AND itemid = 2060000 THEN 53 - WHEN dropperid = 4230501 AND itemid = 2061000 THEN 53 - WHEN dropperid = 4230502 AND itemid = 2060000 THEN 56 - WHEN dropperid = 4230502 AND itemid = 2061000 THEN 56 - WHEN dropperid = 4230503 AND itemid = 2060000 THEN 58 - WHEN dropperid = 4230503 AND itemid = 2061000 THEN 58 - WHEN dropperid = 4230504 AND itemid = 2060000 THEN 58 - WHEN dropperid = 4230504 AND itemid = 2061000 THEN 58 - WHEN dropperid = 4230600 AND itemid = 2060000 THEN 52 - WHEN dropperid = 4230600 AND itemid = 2061000 THEN 52 - WHEN dropperid = 4240000 AND itemid = 2060000 THEN 64 - WHEN dropperid = 4240000 AND itemid = 2061000 THEN 64 - WHEN dropperid = 5120100 AND itemid = 2060000 THEN 98 - WHEN dropperid = 5120100 AND itemid = 2061000 THEN 98 - WHEN dropperid = 5130104 AND itemid = 2060000 THEN 71 - WHEN dropperid = 5130104 AND itemid = 2061000 THEN 71 - WHEN dropperid = 5140000 AND itemid = 2060000 THEN 75 - WHEN dropperid = 5140000 AND itemid = 2061000 THEN 75 - WHEN dropperid = 5150000 AND itemid = 2060000 THEN 77 - WHEN dropperid = 5150000 AND itemid = 2061000 THEN 77 - WHEN dropperid = 5200000 AND itemid = 2060001 THEN 15 - WHEN dropperid = 5200000 AND itemid = 2061001 THEN 15 - WHEN dropperid = 5200001 AND itemid = 2060001 THEN 19 - WHEN dropperid = 5200001 AND itemid = 2061001 THEN 19 - WHEN dropperid = 5200002 AND itemid = 2060001 THEN 19 - WHEN dropperid = 5200002 AND itemid = 2061001 THEN 19 - WHEN dropperid = 5220000 AND itemid = 2060000 THEN 100 - WHEN dropperid = 5220000 AND itemid = 2061000 THEN 100 - WHEN dropperid = 5220002 AND itemid = 2060000 THEN 91 - WHEN dropperid = 5220002 AND itemid = 2061000 THEN 91 - WHEN dropperid = 5220003 AND itemid = 2060000 THEN 107 - WHEN dropperid = 5220003 AND itemid = 2061000 THEN 107 - WHEN dropperid = 5400000 AND itemid = 2060001 THEN 22 - WHEN dropperid = 5400000 AND itemid = 2061001 THEN 22 - WHEN dropperid = 6220000 AND itemid = 2060000 THEN 118 - WHEN dropperid = 6220000 AND itemid = 2061000 THEN 118 - WHEN dropperid = 7120103 AND itemid = 2060003 THEN 22 - WHEN dropperid = 7220000 AND itemid = 2060001 THEN 64 - WHEN dropperid = 7220000 AND itemid = 2061001 THEN 64 - WHEN dropperid = 7220001 AND itemid = 2060001 THEN 63 - WHEN dropperid = 7220001 AND itemid = 2061001 THEN 63 - WHEN dropperid = 7220002 AND itemid = 2060001 THEN 70 - WHEN dropperid = 7220002 AND itemid = 2061001 THEN 70 - WHEN dropperid = 8220000 AND itemid = 2060001 THEN 75 - WHEN dropperid = 8220000 AND itemid = 2061001 THEN 75 - WHEN dropperid = 8220001 AND itemid = 2060001 THEN 82 - WHEN dropperid = 8220001 AND itemid = 2061001 THEN 82 - WHEN dropperid = 9300011 AND itemid = 2060000 THEN 51 - WHEN dropperid = 9300011 AND itemid = 2061000 THEN 51 - WHEN dropperid = 9300060 AND itemid = 2060000 THEN 54 - WHEN dropperid = 9300060 AND itemid = 2061000 THEN 54 - WHEN dropperid = 9300131 AND itemid = 2060000 THEN 51 - WHEN dropperid = 9300131 AND itemid = 2061000 THEN 51 - WHEN dropperid = 9300132 AND itemid = 2060000 THEN 39 - WHEN dropperid = 9300132 AND itemid = 2061000 THEN 39 - WHEN dropperid = 9300133 AND itemid = 2061000 THEN 39 - WHEN dropperid = 9300160 AND itemid = 2060000 THEN 82 - WHEN dropperid = 9300160 AND itemid = 2061000 THEN 82 - WHEN dropperid = 9300161 AND itemid = 2060000 THEN 82 - WHEN dropperid = 9300161 AND itemid = 2061000 THEN 82 - WHEN dropperid = 9300274 AND itemid = 2060000 THEN 10 - WHEN dropperid = 9300274 AND itemid = 2061000 THEN 10 - WHEN dropperid = 9300332 AND itemid = 2060000 THEN 52 - WHEN dropperid = 9300334 AND itemid = 2060000 THEN 64 - WHEN dropperid = 9300341 AND itemid = 2060000 THEN 7 - WHEN dropperid = 9300341 AND itemid = 2061000 THEN 7 - WHEN dropperid = 9300342 AND itemid = 2060000 THEN 10 - WHEN dropperid = 9300342 AND itemid = 2061000 THEN 10 - WHEN dropperid = 9300343 AND itemid = 2060000 THEN 9 - WHEN dropperid = 9300343 AND itemid = 2061000 THEN 9 - WHEN dropperid = 9303005 AND itemid = 2060001 THEN 17 - WHEN dropperid = 9303005 AND itemid = 2061001 THEN 17 - WHEN dropperid = 9303008 AND itemid = 2060001 THEN 17 - WHEN dropperid = 9303008 AND itemid = 2061001 THEN 17 - WHEN dropperid = 9303009 AND itemid = 2060001 THEN 33 - WHEN dropperid = 9303009 AND itemid = 2061001 THEN 33 - WHEN dropperid = 9400000 AND itemid = 2060001 THEN 16 - WHEN dropperid = 9400009 AND itemid = 2060001 THEN 130 - WHEN dropperid = 9400011 AND itemid = 2060002 THEN 17 - WHEN dropperid = 9400100 AND itemid = 2060003 THEN 14 - WHEN dropperid = 9400101 AND itemid = 2061003 THEN 15 - WHEN dropperid = 9400204 AND itemid = 2060003 THEN 17 - WHEN dropperid = 9400239 AND itemid = 2060000 THEN 31 - WHEN dropperid = 9400239 AND itemid = 2061000 THEN 31 - WHEN dropperid = 9400244 AND itemid = 2060000 THEN 77 - WHEN dropperid = 9400244 AND itemid = 2061000 THEN 77 - WHEN dropperid = 9400248 AND itemid = 2060000 THEN 31 - WHEN dropperid = 9400248 AND itemid = 2061000 THEN 31 - WHEN dropperid = 9400540 AND itemid = 2060004 THEN 6 - WHEN dropperid = 9400540 AND itemid = 2061004 THEN 6 - WHEN dropperid = 9400541 AND itemid = 2060004 THEN 6 - WHEN dropperid = 9400541 AND itemid = 2061004 THEN 6 - WHEN dropperid = 9400542 AND itemid = 2060004 THEN 9 - WHEN dropperid = 9400542 AND itemid = 2061004 THEN 9 - WHEN dropperid = 9400543 AND itemid = 2060004 THEN 10 - WHEN dropperid = 9400543 AND itemid = 2061004 THEN 10 - WHEN dropperid = 9400547 AND itemid = 2060000 THEN 35 - WHEN dropperid = 9400547 AND itemid = 2061000 THEN 35 - WHEN dropperid = 9400548 AND itemid = 2060000 THEN 39 - WHEN dropperid = 9400548 AND itemid = 2061000 THEN 39 - WHEN dropperid = 9400550 AND itemid = 2060000 THEN 35 - WHEN dropperid = 9400550 AND itemid = 2061000 THEN 35 - WHEN dropperid = 9400558 AND itemid = 2060000 THEN 39 - WHEN dropperid = 9400558 AND itemid = 2061000 THEN 39 - WHEN dropperid = 9400563 AND itemid = 2060000 THEN 52 - WHEN dropperid = 9400563 AND itemid = 2061000 THEN 52 - WHEN dropperid = 9400638 AND itemid = 2060000 THEN 26 - WHEN dropperid = 9400638 AND itemid = 2061000 THEN 26 - WHEN dropperid = 9420500 AND itemid = 2060000 THEN 36 - WHEN dropperid = 9420500 AND itemid = 2061000 THEN 36 - WHEN dropperid = 9420502 AND itemid = 2060000 THEN 23 - WHEN dropperid = 9420502 AND itemid = 2061000 THEN 23 - WHEN dropperid = 9420506 AND itemid = 2060000 THEN 30 - WHEN dropperid = 9420506 AND itemid = 2061000 THEN 30 - WHEN dropperid = 9420508 AND itemid = 2060000 THEN 56 - WHEN dropperid = 9420508 AND itemid = 2061000 THEN 56 - WHEN dropperid = 9420527 AND itemid = 2060001 THEN 29 - WHEN dropperid = 9420527 AND itemid = 2061001 THEN 29 - WHEN dropperid = 9420531 AND itemid = 2060001 THEN 38 - WHEN dropperid = 9420531 AND itemid = 2061001 THEN 38 - WHEN dropperid = 9500112 AND itemid = 2060001 THEN 22 - WHEN dropperid = 9500112 AND itemid = 2061001 THEN 22 - WHEN dropperid = 9500119 AND itemid = 2060000 THEN 51 - WHEN dropperid = 9500119 AND itemid = 2061000 THEN 51 - WHEN dropperid = 9500120 AND itemid = 2060000 THEN 58 - WHEN dropperid = 9500120 AND itemid = 2061000 THEN 58 - WHEN dropperid = 9500122 AND itemid = 2060000 THEN 64 - WHEN dropperid = 9500123 AND itemid = 2060000 THEN 77 - WHEN dropperid = 9500123 AND itemid = 2061000 THEN 77 - WHEN dropperid = 9500308 AND itemid = 2060000 THEN 91 - WHEN dropperid = 9500308 AND itemid = 2061000 THEN 91 - WHEN dropperid = 9500310 AND itemid = 2060000 THEN 107 - WHEN dropperid = 9500310 AND itemid = 2061000 THEN 107 - WHEN dropperid = 9500312 AND itemid = 2060001 THEN 63 - WHEN dropperid = 9500312 AND itemid = 2061001 THEN 63 - WHEN dropperid = 9500313 AND itemid = 2060001 THEN 64 - WHEN dropperid = 9500313 AND itemid = 2061001 THEN 64 - WHEN dropperid = 9500314 AND itemid = 2060001 THEN 70 - WHEN dropperid = 9500314 AND itemid = 2061001 THEN 70 - WHEN dropperid = 9500321 AND itemid = 2060001 THEN 6 - WHEN dropperid = 9500321 AND itemid = 2061001 THEN 6 - WHEN dropperid = 9500366 AND itemid = 2060000 THEN 19 - WHEN dropperid = 9500369 AND itemid = 2060000 THEN 19 - ELSE minimum_quantity END, - maximum_quantity = CASE - WHEN dropperid = 100100 AND itemid = 2060000 THEN 2 - WHEN dropperid = 100100 AND itemid = 2061000 THEN 2 - WHEN dropperid = 100101 AND itemid = 2060000 THEN 3 - WHEN dropperid = 100101 AND itemid = 2061000 THEN 3 - WHEN dropperid = 100120 AND itemid = 2060000 THEN 2 - WHEN dropperid = 100120 AND itemid = 2061000 THEN 2 - WHEN dropperid = 100121 AND itemid = 2060000 THEN 5 - WHEN dropperid = 100123 AND itemid = 2061000 THEN 12 - WHEN dropperid = 100124 AND itemid = 2060000 THEN 14 - WHEN dropperid = 100124 AND itemid = 2061000 THEN 14 - WHEN dropperid = 120100 AND itemid = 2060000 THEN 3 - WHEN dropperid = 120100 AND itemid = 2061000 THEN 3 - WHEN dropperid = 130100 AND itemid = 2060000 THEN 7 - WHEN dropperid = 130100 AND itemid = 2061000 THEN 7 - WHEN dropperid = 130101 AND itemid = 2060000 THEN 7 - WHEN dropperid = 130101 AND itemid = 2061000 THEN 7 - WHEN dropperid = 210100 AND itemid = 2060000 THEN 9 - WHEN dropperid = 210100 AND itemid = 2061000 THEN 9 - WHEN dropperid = 1110100 AND itemid = 2060000 THEN 24 - WHEN dropperid = 1110100 AND itemid = 2061000 THEN 24 - WHEN dropperid = 1110101 AND itemid = 2060000 THEN 17 - WHEN dropperid = 1110101 AND itemid = 2061000 THEN 17 - WHEN dropperid = 1110130 AND itemid = 2060000 THEN 24 - WHEN dropperid = 1110130 AND itemid = 2061000 THEN 24 - WHEN dropperid = 1120100 AND itemid = 2060000 THEN 19 - WHEN dropperid = 1120100 AND itemid = 2061000 THEN 19 - WHEN dropperid = 1130100 AND itemid = 2060000 THEN 28 - WHEN dropperid = 1130100 AND itemid = 2061000 THEN 28 - WHEN dropperid = 1140100 AND itemid = 2060000 THEN 30 - WHEN dropperid = 1140100 AND itemid = 2061000 THEN 30 - WHEN dropperid = 1140130 AND itemid = 2060000 THEN 30 - WHEN dropperid = 1140130 AND itemid = 2061000 THEN 30 - WHEN dropperid = 1210100 AND itemid = 2060000 THEN 12 - WHEN dropperid = 1210100 AND itemid = 2061000 THEN 12 - WHEN dropperid = 1210101 AND itemid = 2060000 THEN 17 - WHEN dropperid = 1210101 AND itemid = 2061000 THEN 17 - WHEN dropperid = 1210102 AND itemid = 2060000 THEN 13 - WHEN dropperid = 1210102 AND itemid = 2061000 THEN 13 - WHEN dropperid = 1210103 AND itemid = 2060000 THEN 24 - WHEN dropperid = 1210103 AND itemid = 2061000 THEN 24 - WHEN dropperid = 2100100 AND itemid = 2060000 THEN 33 - WHEN dropperid = 2100100 AND itemid = 2061000 THEN 33 - WHEN dropperid = 2100101 AND itemid = 2060000 THEN 34 - WHEN dropperid = 2100101 AND itemid = 2061000 THEN 34 - WHEN dropperid = 2100102 AND itemid = 2060000 THEN 35 - WHEN dropperid = 2100102 AND itemid = 2061000 THEN 35 - WHEN dropperid = 2100103 AND itemid = 2060000 THEN 40 - WHEN dropperid = 2100103 AND itemid = 2061000 THEN 40 - WHEN dropperid = 2100104 AND itemid = 2060000 THEN 45 - WHEN dropperid = 2100104 AND itemid = 2061000 THEN 45 - WHEN dropperid = 2100105 AND itemid = 2060000 THEN 38 - WHEN dropperid = 2100105 AND itemid = 2061000 THEN 38 - WHEN dropperid = 2100106 AND itemid = 2060000 THEN 39 - WHEN dropperid = 2100106 AND itemid = 2061000 THEN 39 - WHEN dropperid = 2100107 AND itemid = 2060000 THEN 44 - WHEN dropperid = 2100107 AND itemid = 2061000 THEN 44 - WHEN dropperid = 2100108 AND itemid = 2060000 THEN 47 - WHEN dropperid = 2100108 AND itemid = 2061000 THEN 47 - WHEN dropperid = 2110200 AND itemid = 2060000 THEN 35 - WHEN dropperid = 2110200 AND itemid = 2061000 THEN 35 - WHEN dropperid = 2110300 AND itemid = 2060000 THEN 39 - WHEN dropperid = 2110300 AND itemid = 2061000 THEN 39 - WHEN dropperid = 2110301 AND itemid = 2060000 THEN 47 - WHEN dropperid = 2110301 AND itemid = 2061000 THEN 47 - WHEN dropperid = 2130100 AND itemid = 2060000 THEN 35 - WHEN dropperid = 2130100 AND itemid = 2061000 THEN 35 - WHEN dropperid = 2220000 AND itemid = 2060000 THEN 45 - WHEN dropperid = 2220000 AND itemid = 2061000 THEN 45 - WHEN dropperid = 2220100 AND itemid = 2060000 THEN 33 - WHEN dropperid = 2220100 AND itemid = 2061000 THEN 33 - WHEN dropperid = 2230100 AND itemid = 2060000 THEN 44 - WHEN dropperid = 2230100 AND itemid = 2061000 THEN 44 - WHEN dropperid = 2230101 AND itemid = 2060000 THEN 39 - WHEN dropperid = 2230101 AND itemid = 2061000 THEN 39 - WHEN dropperid = 2230102 AND itemid = 2060000 THEN 40 - WHEN dropperid = 2230102 AND itemid = 2061000 THEN 40 - WHEN dropperid = 2230103 AND itemid = 2060000 THEN 38 - WHEN dropperid = 2230103 AND itemid = 2061000 THEN 38 - WHEN dropperid = 2230104 AND itemid = 2060000 THEN 45 - WHEN dropperid = 2230104 AND itemid = 2061000 THEN 45 - WHEN dropperid = 2230105 AND itemid = 2060000 THEN 38 - WHEN dropperid = 2230105 AND itemid = 2061000 THEN 38 - WHEN dropperid = 2230106 AND itemid = 2060000 THEN 40 - WHEN dropperid = 2230106 AND itemid = 2061000 THEN 40 - WHEN dropperid = 2230107 AND itemid = 2060000 THEN 39 - WHEN dropperid = 2230107 AND itemid = 2061000 THEN 39 - WHEN dropperid = 2230108 AND itemid = 2060000 THEN 35 - WHEN dropperid = 2230108 AND itemid = 2061000 THEN 35 - WHEN dropperid = 2230109 AND itemid = 2060000 THEN 45 - WHEN dropperid = 2230109 AND itemid = 2061000 THEN 45 - WHEN dropperid = 2230110 AND itemid = 2060000 THEN 38 - WHEN dropperid = 2230110 AND itemid = 2061000 THEN 38 - WHEN dropperid = 2230111 AND itemid = 2060000 THEN 39 - WHEN dropperid = 2230111 AND itemid = 2061000 THEN 39 - WHEN dropperid = 2230131 AND itemid = 2060000 THEN 39 - WHEN dropperid = 2230131 AND itemid = 2061000 THEN 39 - WHEN dropperid = 2230200 AND itemid = 2060000 THEN 47 - WHEN dropperid = 2230200 AND itemid = 2061000 THEN 47 - WHEN dropperid = 2300100 AND itemid = 2060000 THEN 33 - WHEN dropperid = 2300100 AND itemid = 2061000 THEN 33 - WHEN dropperid = 3000000 AND itemid = 2060000 THEN 49 - WHEN dropperid = 3000000 AND itemid = 2061000 THEN 49 - WHEN dropperid = 3000005 AND itemid = 2060000 THEN 49 - WHEN dropperid = 3000005 AND itemid = 2061000 THEN 49 - WHEN dropperid = 3000006 AND itemid = 2060000 THEN 49 - WHEN dropperid = 3000006 AND itemid = 2061000 THEN 49 - WHEN dropperid = 3100101 AND itemid = 2060000 THEN 52 - WHEN dropperid = 3100101 AND itemid = 2061000 THEN 52 - WHEN dropperid = 3100102 AND itemid = 2060000 THEN 49 - WHEN dropperid = 3100102 AND itemid = 2061000 THEN 49 - WHEN dropperid = 3110101 AND itemid = 2060000 THEN 52 - WHEN dropperid = 3110101 AND itemid = 2061000 THEN 52 - WHEN dropperid = 3110102 AND itemid = 2060000 THEN 52 - WHEN dropperid = 3110102 AND itemid = 2061000 THEN 52 - WHEN dropperid = 3110300 AND itemid = 2060000 THEN 52 - WHEN dropperid = 3110300 AND itemid = 2061000 THEN 52 - WHEN dropperid = 3110301 AND itemid = 2060000 THEN 52 - WHEN dropperid = 3110301 AND itemid = 2061000 THEN 52 - WHEN dropperid = 3110302 AND itemid = 2060000 THEN 57 - WHEN dropperid = 3110302 AND itemid = 2061000 THEN 57 - WHEN dropperid = 3110303 AND itemid = 2060000 THEN 62 - WHEN dropperid = 3110303 AND itemid = 2061000 THEN 62 - WHEN dropperid = 3210100 AND itemid = 2060005 THEN 8 - WHEN dropperid = 3210203 AND itemid = 2060000 THEN 59 - WHEN dropperid = 3210203 AND itemid = 2061000 THEN 59 - WHEN dropperid = 3210204 AND itemid = 2060000 THEN 55 - WHEN dropperid = 3210204 AND itemid = 2061000 THEN 55 - WHEN dropperid = 3210205 AND itemid = 2060000 THEN 55 - WHEN dropperid = 3210205 AND itemid = 2061000 THEN 55 - WHEN dropperid = 3210206 AND itemid = 2060000 THEN 59 - WHEN dropperid = 3210206 AND itemid = 2061000 THEN 59 - WHEN dropperid = 3210207 AND itemid = 2060000 THEN 55 - WHEN dropperid = 3210207 AND itemid = 2060005 THEN 9 - WHEN dropperid = 3210207 AND itemid = 2061000 THEN 55 - WHEN dropperid = 3210208 AND itemid = 2060000 THEN 59 - WHEN dropperid = 3210208 AND itemid = 2061000 THEN 59 - WHEN dropperid = 3210450 AND itemid = 2060000 THEN 59 - WHEN dropperid = 3210450 AND itemid = 2061000 THEN 59 - WHEN dropperid = 3210800 AND itemid = 2060005 THEN 10 - WHEN dropperid = 3220000 AND itemid = 2060000 THEN 79 - WHEN dropperid = 3220000 AND itemid = 2061000 THEN 79 - WHEN dropperid = 3230100 AND itemid = 2060000 THEN 57 - WHEN dropperid = 3230100 AND itemid = 2061000 THEN 57 - WHEN dropperid = 3230103 AND itemid = 2060000 THEN 62 - WHEN dropperid = 3230103 AND itemid = 2061000 THEN 62 - WHEN dropperid = 3230200 AND itemid = 2060000 THEN 57 - WHEN dropperid = 3230200 AND itemid = 2061000 THEN 57 - WHEN dropperid = 3230302 AND itemid = 2060000 THEN 57 - WHEN dropperid = 3230302 AND itemid = 2061000 THEN 57 - WHEN dropperid = 3230303 AND itemid = 2060000 THEN 60 - WHEN dropperid = 3230303 AND itemid = 2061000 THEN 60 - WHEN dropperid = 3230304 AND itemid = 2060000 THEN 62 - WHEN dropperid = 3230304 AND itemid = 2061000 THEN 62 - WHEN dropperid = 3230305 AND itemid = 2060000 THEN 64 - WHEN dropperid = 3230305 AND itemid = 2061000 THEN 64 - WHEN dropperid = 3230306 AND itemid = 2060000 THEN 60 - WHEN dropperid = 3230306 AND itemid = 2061000 THEN 60 - WHEN dropperid = 3230307 AND itemid = 2060000 THEN 50 - WHEN dropperid = 3230307 AND itemid = 2061000 THEN 50 - WHEN dropperid = 3230308 AND itemid = 2060000 THEN 64 - WHEN dropperid = 3230308 AND itemid = 2061000 THEN 64 - WHEN dropperid = 3230400 AND itemid = 2060000 THEN 49 - WHEN dropperid = 3230400 AND itemid = 2061000 THEN 49 - WHEN dropperid = 3230405 AND itemid = 2060000 THEN 62 - WHEN dropperid = 3230405 AND itemid = 2061000 THEN 62 - WHEN dropperid = 3300000 AND itemid = 2060000 THEN 49 - WHEN dropperid = 3300000 AND itemid = 2061000 THEN 49 - WHEN dropperid = 3300001 AND itemid = 2060000 THEN 49 - WHEN dropperid = 3300001 AND itemid = 2061000 THEN 49 - WHEN dropperid = 3300002 AND itemid = 2060000 THEN 50 - WHEN dropperid = 3300002 AND itemid = 2061000 THEN 50 - WHEN dropperid = 3300003 AND itemid = 2060000 THEN 52 - WHEN dropperid = 3300003 AND itemid = 2061000 THEN 52 - WHEN dropperid = 3300004 AND itemid = 2060000 THEN 54 - WHEN dropperid = 3300004 AND itemid = 2061000 THEN 54 - WHEN dropperid = 3300006 AND itemid = 2060000 THEN 57 - WHEN dropperid = 3300006 AND itemid = 2061000 THEN 57 - WHEN dropperid = 3300007 AND itemid = 2060000 THEN 57 - WHEN dropperid = 3300007 AND itemid = 2061000 THEN 57 - WHEN dropperid = 3300008 AND itemid = 2060000 THEN 87 - WHEN dropperid = 3300008 AND itemid = 2061000 THEN 87 - WHEN dropperid = 4110300 AND itemid = 2060000 THEN 68 - WHEN dropperid = 4110300 AND itemid = 2061000 THEN 68 - WHEN dropperid = 4110301 AND itemid = 2060000 THEN 73 - WHEN dropperid = 4110301 AND itemid = 2061000 THEN 73 - WHEN dropperid = 4130103 AND itemid = 2060000 THEN 107 - WHEN dropperid = 4130103 AND itemid = 2061000 THEN 107 - WHEN dropperid = 4230103 AND itemid = 2060000 THEN 68 - WHEN dropperid = 4230103 AND itemid = 2061000 THEN 68 - WHEN dropperid = 4230106 AND itemid = 2060000 THEN 73 - WHEN dropperid = 4230106 AND itemid = 2061000 THEN 73 - WHEN dropperid = 4230108 AND itemid = 2060000 THEN 70 - WHEN dropperid = 4230108 AND itemid = 2061000 THEN 70 - WHEN dropperid = 4230109 AND itemid = 2060000 THEN 68 - WHEN dropperid = 4230109 AND itemid = 2061000 THEN 68 - WHEN dropperid = 4230110 AND itemid = 2060000 THEN 73 - WHEN dropperid = 4230110 AND itemid = 2061000 THEN 73 - WHEN dropperid = 4230111 AND itemid = 2060000 THEN 67 - WHEN dropperid = 4230111 AND itemid = 2061000 THEN 67 - WHEN dropperid = 4230112 AND itemid = 2060000 THEN 72 - WHEN dropperid = 4230112 AND itemid = 2061000 THEN 72 - WHEN dropperid = 4230113 AND itemid = 2060000 THEN 65 - WHEN dropperid = 4230113 AND itemid = 2061000 THEN 65 - WHEN dropperid = 4230114 AND itemid = 2060000 THEN 67 - WHEN dropperid = 4230114 AND itemid = 2061000 THEN 67 - WHEN dropperid = 4230115 AND itemid = 2060000 THEN 75 - WHEN dropperid = 4230115 AND itemid = 2061000 THEN 75 - WHEN dropperid = 4230116 AND itemid = 2060000 THEN 65 - WHEN dropperid = 4230116 AND itemid = 2061000 THEN 65 - WHEN dropperid = 4230117 AND itemid = 2060000 THEN 68 - WHEN dropperid = 4230117 AND itemid = 2061000 THEN 68 - WHEN dropperid = 4230118 AND itemid = 2060000 THEN 73 - WHEN dropperid = 4230118 AND itemid = 2061000 THEN 73 - WHEN dropperid = 4230119 AND itemid = 2060000 THEN 67 - WHEN dropperid = 4230119 AND itemid = 2061000 THEN 67 - WHEN dropperid = 4230120 AND itemid = 2060000 THEN 72 - WHEN dropperid = 4230120 AND itemid = 2061000 THEN 72 - WHEN dropperid = 4230121 AND itemid = 2060000 THEN 75 - WHEN dropperid = 4230121 AND itemid = 2061000 THEN 75 - WHEN dropperid = 4230123 AND itemid = 2060000 THEN 70 - WHEN dropperid = 4230123 AND itemid = 2061000 THEN 70 - WHEN dropperid = 4230124 AND itemid = 2060000 THEN 68 - WHEN dropperid = 4230124 AND itemid = 2061000 THEN 68 - WHEN dropperid = 4230125 AND itemid = 2060000 THEN 72 - WHEN dropperid = 4230125 AND itemid = 2061000 THEN 72 - WHEN dropperid = 4230126 AND itemid = 2060000 THEN 77 - WHEN dropperid = 4230126 AND itemid = 2061000 THEN 77 - WHEN dropperid = 4230201 AND itemid = 2060000 THEN 65 - WHEN dropperid = 4230201 AND itemid = 2061000 THEN 65 - WHEN dropperid = 4230300 AND itemid = 2060000 THEN 73 - WHEN dropperid = 4230300 AND itemid = 2061000 THEN 73 - WHEN dropperid = 4230400 AND itemid = 2060000 THEN 73 - WHEN dropperid = 4230400 AND itemid = 2061000 THEN 73 - WHEN dropperid = 4230500 AND itemid = 2060000 THEN 65 - WHEN dropperid = 4230500 AND itemid = 2061000 THEN 65 - WHEN dropperid = 4230501 AND itemid = 2060000 THEN 67 - WHEN dropperid = 4230501 AND itemid = 2061000 THEN 67 - WHEN dropperid = 4230502 AND itemid = 2060000 THEN 70 - WHEN dropperid = 4230502 AND itemid = 2061000 THEN 70 - WHEN dropperid = 4230503 AND itemid = 2060000 THEN 73 - WHEN dropperid = 4230503 AND itemid = 2061000 THEN 73 - WHEN dropperid = 4230504 AND itemid = 2060000 THEN 73 - WHEN dropperid = 4230504 AND itemid = 2061000 THEN 73 - WHEN dropperid = 4230600 AND itemid = 2060000 THEN 65 - WHEN dropperid = 4230600 AND itemid = 2061000 THEN 65 - WHEN dropperid = 4240000 AND itemid = 2060000 THEN 80 - WHEN dropperid = 4240000 AND itemid = 2061000 THEN 80 - WHEN dropperid = 5120100 AND itemid = 2060000 THEN 123 - WHEN dropperid = 5120100 AND itemid = 2061000 THEN 123 - WHEN dropperid = 5130104 AND itemid = 2060000 THEN 89 - WHEN dropperid = 5130104 AND itemid = 2061000 THEN 89 - WHEN dropperid = 5140000 AND itemid = 2060000 THEN 94 - WHEN dropperid = 5140000 AND itemid = 2061000 THEN 94 - WHEN dropperid = 5150000 AND itemid = 2060000 THEN 97 - WHEN dropperid = 5150000 AND itemid = 2061000 THEN 97 - WHEN dropperid = 5200000 AND itemid = 2060001 THEN 19 - WHEN dropperid = 5200000 AND itemid = 2061001 THEN 19 - WHEN dropperid = 5200001 AND itemid = 2060001 THEN 24 - WHEN dropperid = 5200001 AND itemid = 2061001 THEN 24 - WHEN dropperid = 5200002 AND itemid = 2060001 THEN 24 - WHEN dropperid = 5200002 AND itemid = 2061001 THEN 24 - WHEN dropperid = 5220000 AND itemid = 2060000 THEN 125 - WHEN dropperid = 5220000 AND itemid = 2061000 THEN 125 - WHEN dropperid = 5220002 AND itemid = 2060000 THEN 114 - WHEN dropperid = 5220002 AND itemid = 2061000 THEN 114 - WHEN dropperid = 5220003 AND itemid = 2060000 THEN 134 - WHEN dropperid = 5220003 AND itemid = 2061000 THEN 134 - WHEN dropperid = 5400000 AND itemid = 2060001 THEN 28 - WHEN dropperid = 5400000 AND itemid = 2061001 THEN 28 - WHEN dropperid = 6220000 AND itemid = 2060000 THEN 148 - WHEN dropperid = 6220000 AND itemid = 2061000 THEN 148 - WHEN dropperid = 7120103 AND itemid = 2060003 THEN 28 - WHEN dropperid = 7220000 AND itemid = 2060001 THEN 81 - WHEN dropperid = 7220000 AND itemid = 2061001 THEN 81 - WHEN dropperid = 7220001 AND itemid = 2060001 THEN 79 - WHEN dropperid = 7220001 AND itemid = 2061001 THEN 79 - WHEN dropperid = 7220002 AND itemid = 2060001 THEN 87 - WHEN dropperid = 7220002 AND itemid = 2061001 THEN 87 - WHEN dropperid = 8220000 AND itemid = 2060001 THEN 94 - WHEN dropperid = 8220000 AND itemid = 2061001 THEN 94 - WHEN dropperid = 8220001 AND itemid = 2060001 THEN 102 - WHEN dropperid = 8220001 AND itemid = 2061001 THEN 102 - WHEN dropperid = 9300011 AND itemid = 2060000 THEN 64 - WHEN dropperid = 9300011 AND itemid = 2061000 THEN 64 - WHEN dropperid = 9300060 AND itemid = 2060000 THEN 68 - WHEN dropperid = 9300060 AND itemid = 2061000 THEN 68 - WHEN dropperid = 9300131 AND itemid = 2060000 THEN 64 - WHEN dropperid = 9300131 AND itemid = 2061000 THEN 64 - WHEN dropperid = 9300132 AND itemid = 2060000 THEN 49 - WHEN dropperid = 9300132 AND itemid = 2061000 THEN 49 - WHEN dropperid = 9300133 AND itemid = 2061000 THEN 49 - WHEN dropperid = 9300160 AND itemid = 2060000 THEN 103 - WHEN dropperid = 9300160 AND itemid = 2061000 THEN 103 - WHEN dropperid = 9300161 AND itemid = 2060000 THEN 103 - WHEN dropperid = 9300161 AND itemid = 2061000 THEN 103 - WHEN dropperid = 9300274 AND itemid = 2060000 THEN 13 - WHEN dropperid = 9300274 AND itemid = 2061000 THEN 13 - WHEN dropperid = 9300332 AND itemid = 2060000 THEN 65 - WHEN dropperid = 9300334 AND itemid = 2060000 THEN 80 - WHEN dropperid = 9300341 AND itemid = 2060000 THEN 9 - WHEN dropperid = 9300341 AND itemid = 2061000 THEN 9 - WHEN dropperid = 9300342 AND itemid = 2060000 THEN 13 - WHEN dropperid = 9300342 AND itemid = 2061000 THEN 13 - WHEN dropperid = 9300343 AND itemid = 2060000 THEN 12 - WHEN dropperid = 9300343 AND itemid = 2061000 THEN 12 - WHEN dropperid = 9303005 AND itemid = 2060001 THEN 21 - WHEN dropperid = 9303005 AND itemid = 2061001 THEN 21 - WHEN dropperid = 9303008 AND itemid = 2060001 THEN 21 - WHEN dropperid = 9303008 AND itemid = 2061001 THEN 21 - WHEN dropperid = 9303009 AND itemid = 2060001 THEN 41 - WHEN dropperid = 9303009 AND itemid = 2061001 THEN 41 - WHEN dropperid = 9400000 AND itemid = 2060001 THEN 20 - WHEN dropperid = 9400009 AND itemid = 2060001 THEN 163 - WHEN dropperid = 9400011 AND itemid = 2060002 THEN 21 - WHEN dropperid = 9400100 AND itemid = 2060003 THEN 18 - WHEN dropperid = 9400101 AND itemid = 2061003 THEN 19 - WHEN dropperid = 9400204 AND itemid = 2060003 THEN 22 - WHEN dropperid = 9400239 AND itemid = 2060000 THEN 39 - WHEN dropperid = 9400239 AND itemid = 2061000 THEN 39 - WHEN dropperid = 9400244 AND itemid = 2060000 THEN 97 - WHEN dropperid = 9400244 AND itemid = 2061000 THEN 97 - WHEN dropperid = 9400248 AND itemid = 2060000 THEN 39 - WHEN dropperid = 9400248 AND itemid = 2061000 THEN 39 - WHEN dropperid = 9400540 AND itemid = 2060004 THEN 8 - WHEN dropperid = 9400540 AND itemid = 2061004 THEN 8 - WHEN dropperid = 9400541 AND itemid = 2060004 THEN 8 - WHEN dropperid = 9400541 AND itemid = 2061004 THEN 8 - WHEN dropperid = 9400542 AND itemid = 2060004 THEN 11 - WHEN dropperid = 9400542 AND itemid = 2061004 THEN 11 - WHEN dropperid = 9400543 AND itemid = 2060004 THEN 13 - WHEN dropperid = 9400543 AND itemid = 2061004 THEN 13 - WHEN dropperid = 9400547 AND itemid = 2060000 THEN 44 - WHEN dropperid = 9400547 AND itemid = 2061000 THEN 44 - WHEN dropperid = 9400548 AND itemid = 2060000 THEN 49 - WHEN dropperid = 9400548 AND itemid = 2061000 THEN 49 - WHEN dropperid = 9400550 AND itemid = 2060000 THEN 44 - WHEN dropperid = 9400550 AND itemid = 2061000 THEN 44 - WHEN dropperid = 9400558 AND itemid = 2060000 THEN 49 - WHEN dropperid = 9400558 AND itemid = 2061000 THEN 49 - WHEN dropperid = 9400563 AND itemid = 2060000 THEN 65 - WHEN dropperid = 9400563 AND itemid = 2061000 THEN 65 - WHEN dropperid = 9400638 AND itemid = 2060000 THEN 33 - WHEN dropperid = 9400638 AND itemid = 2061000 THEN 33 - WHEN dropperid = 9420500 AND itemid = 2060000 THEN 45 - WHEN dropperid = 9420500 AND itemid = 2061000 THEN 45 - WHEN dropperid = 9420502 AND itemid = 2060000 THEN 29 - WHEN dropperid = 9420502 AND itemid = 2061000 THEN 29 - WHEN dropperid = 9420506 AND itemid = 2060000 THEN 38 - WHEN dropperid = 9420506 AND itemid = 2061000 THEN 38 - WHEN dropperid = 9420508 AND itemid = 2060000 THEN 70 - WHEN dropperid = 9420508 AND itemid = 2061000 THEN 70 - WHEN dropperid = 9420527 AND itemid = 2060001 THEN 36 - WHEN dropperid = 9420527 AND itemid = 2061001 THEN 36 - WHEN dropperid = 9420531 AND itemid = 2060001 THEN 48 - WHEN dropperid = 9420531 AND itemid = 2061001 THEN 48 - WHEN dropperid = 9500112 AND itemid = 2060001 THEN 28 - WHEN dropperid = 9500112 AND itemid = 2061001 THEN 28 - WHEN dropperid = 9500119 AND itemid = 2060000 THEN 64 - WHEN dropperid = 9500119 AND itemid = 2061000 THEN 64 - WHEN dropperid = 9500120 AND itemid = 2060000 THEN 73 - WHEN dropperid = 9500120 AND itemid = 2061000 THEN 73 - WHEN dropperid = 9500122 AND itemid = 2060000 THEN 80 - WHEN dropperid = 9500123 AND itemid = 2060000 THEN 97 - WHEN dropperid = 9500123 AND itemid = 2061000 THEN 97 - WHEN dropperid = 9500308 AND itemid = 2060000 THEN 114 - WHEN dropperid = 9500308 AND itemid = 2061000 THEN 114 - WHEN dropperid = 9500310 AND itemid = 2060000 THEN 134 - WHEN dropperid = 9500310 AND itemid = 2061000 THEN 134 - WHEN dropperid = 9500312 AND itemid = 2060001 THEN 79 - WHEN dropperid = 9500312 AND itemid = 2061001 THEN 79 - WHEN dropperid = 9500313 AND itemid = 2060001 THEN 81 - WHEN dropperid = 9500313 AND itemid = 2061001 THEN 81 - WHEN dropperid = 9500314 AND itemid = 2060001 THEN 87 - WHEN dropperid = 9500314 AND itemid = 2061001 THEN 87 - WHEN dropperid = 9500321 AND itemid = 2060001 THEN 8 - WHEN dropperid = 9500321 AND itemid = 2061001 THEN 8 - WHEN dropperid = 9500366 AND itemid = 2060000 THEN 24 - WHEN dropperid = 9500369 AND itemid = 2060000 THEN 24 - ELSE maximum_quantity END -; diff --git a/tools/MapleArrowFetcher/src/life/Element.java b/tools/MapleArrowFetcher/src/life/Element.java deleted file mode 100644 index 5520ba3501..0000000000 --- a/tools/MapleArrowFetcher/src/life/Element.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package life; - -public enum Element { - NEUTRAL, FIRE, ICE, LIGHTING, POISON, HOLY, DARK; - - public static Element getFromChar(char c) { - switch (Character.toUpperCase(c)) { - case 'F': - return FIRE; - case 'I': - return ICE; - case 'L': - return LIGHTING; - case 'S': - return POISON; - case 'H': - return HOLY; - case 'D': - return DARK; - case 'P': - return NEUTRAL; - } - throw new IllegalArgumentException("unknown elemnt char " + c); - } -} diff --git a/tools/MapleArrowFetcher/src/life/ElementalEffectiveness.java b/tools/MapleArrowFetcher/src/life/ElementalEffectiveness.java deleted file mode 100644 index f8d23ef5c7..0000000000 --- a/tools/MapleArrowFetcher/src/life/ElementalEffectiveness.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package life; - -public enum ElementalEffectiveness { - NORMAL, IMMUNE, STRONG, WEAK, NEUTRAL; - - public static ElementalEffectiveness getByNumber(int num) { - switch (num) { - case 1: - return IMMUNE; - case 2: - return STRONG; - case 3: - return WEAK; - case 4: - return NEUTRAL; - default: - throw new IllegalArgumentException("Unkown effectiveness: " + num); - } - } -} diff --git a/tools/MapleArrowFetcher/src/life/MapleLifeFactory.java b/tools/MapleArrowFetcher/src/life/MapleLifeFactory.java deleted file mode 100644 index 23ccd67e43..0000000000 --- a/tools/MapleArrowFetcher/src/life/MapleLifeFactory.java +++ /dev/null @@ -1,240 +0,0 @@ -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 Patrick Huy -Matthias Butz -Jan Christian Meyer - -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 version 3 as published by -the Free Software Foundation. You may not use, modify or distribute -this program under any other version of the GNU Affero General Public -License. - -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 . - */ -package life; - -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataFileEntry; -import provider.MapleDataProvider; -import provider.MapleDataProviderFactory; -import provider.MapleDataTool; -import provider.wz.MapleDataType; -import tools.Pair; - -public class MapleLifeFactory { - private static String wzPath = "../../wz"; - private static MapleDataProvider data = MapleDataProviderFactory.getDataProvider(new File(wzPath + "/Mob.wz")); - private final static MapleDataProvider stringDataWZ = MapleDataProviderFactory.getDataProvider(new File(wzPath + "/String.wz")); - private static MapleData mobStringData = stringDataWZ.getData("Mob.img"); - private static MapleData npcStringData = stringDataWZ.getData("Npc.img"); - private static Map monsterStats = new HashMap<>(); - - private static int getMonsterId(String fileName) { - return Integer.parseInt(fileName.substring(0, 7)); - } - - public static Map getAllMonsterStats() { - MapleDataDirectoryEntry root = data.getRoot(); - - System.out.print("Parsing mob stats... "); - for (MapleDataFileEntry mFile : root.getFiles()) { - try { - String fileName = mFile.getName(); - - //System.out.println("Parsing '" + fileName + "'"); - MapleData monsterData = data.getData(fileName); - if (monsterData == null) { - continue; - } - - Integer mid = getMonsterId(fileName); - - MapleData monsterInfoData = monsterData.getChildByPath("info"); - MapleMonsterStats stats = new MapleMonsterStats(); - stats.setHp(MapleDataTool.getIntConvert("maxHP", monsterInfoData)); - stats.setFriendly(MapleDataTool.getIntConvert("damagedByMob", monsterInfoData, 0) == 1); - stats.setPADamage(MapleDataTool.getIntConvert("PADamage", monsterInfoData)); - stats.setPDDamage(MapleDataTool.getIntConvert("PDDamage", monsterInfoData)); - stats.setMADamage(MapleDataTool.getIntConvert("MADamage", monsterInfoData)); - stats.setMDDamage(MapleDataTool.getIntConvert("MDDamage", monsterInfoData)); - stats.setMp(MapleDataTool.getIntConvert("maxMP", monsterInfoData, 0)); - stats.setExp(MapleDataTool.getIntConvert("exp", monsterInfoData, 0)); - stats.setLevel(MapleDataTool.getIntConvert("level", monsterInfoData)); - stats.setRemoveAfter(MapleDataTool.getIntConvert("removeAfter", monsterInfoData, 0)); - stats.setBoss(MapleDataTool.getIntConvert("boss", monsterInfoData, 0) > 0); - stats.setExplosiveReward(MapleDataTool.getIntConvert("explosiveReward", monsterInfoData, 0) > 0); - stats.setFfaLoot(MapleDataTool.getIntConvert("publicReward", monsterInfoData, 0) > 0); - stats.setUndead(MapleDataTool.getIntConvert("undead", monsterInfoData, 0) > 0); - stats.setName(MapleDataTool.getString(mid + "/name", mobStringData, "MISSINGNO")); - stats.setBuffToGive(MapleDataTool.getIntConvert("buff", monsterInfoData, -1)); - stats.setCP(MapleDataTool.getIntConvert("getCP", monsterInfoData, 0)); - stats.setRemoveOnMiss(MapleDataTool.getIntConvert("removeOnMiss", monsterInfoData, 0) > 0); - - MapleData special = monsterInfoData.getChildByPath("coolDamage"); - if (special != null) { - int coolDmg = MapleDataTool.getIntConvert("coolDamage", monsterInfoData); - int coolProb = MapleDataTool.getIntConvert("coolDamageProb", monsterInfoData, 0); - stats.setCool(new Pair<>(coolDmg, coolProb)); - } - special = monsterInfoData.getChildByPath("loseItem"); - if (special != null) { - for (MapleData liData : special.getChildren()) { - stats.addLoseItem(new loseItem(MapleDataTool.getInt(liData.getChildByPath("id")), (byte) MapleDataTool.getInt(liData.getChildByPath("prop")), (byte) MapleDataTool.getInt(liData.getChildByPath("x")))); - } - } - special = monsterInfoData.getChildByPath("selfDestruction"); - if (special != null) { - stats.setSelfDestruction(new selfDestruction((byte) MapleDataTool.getInt(special.getChildByPath("action")), MapleDataTool.getIntConvert("removeAfter", special, -1), MapleDataTool.getIntConvert("hp", special, -1))); - } - MapleData firstAttackData = monsterInfoData.getChildByPath("firstAttack"); - int firstAttack = 0; - if (firstAttackData != null) { - if (firstAttackData.getType() == MapleDataType.FLOAT) { - firstAttack = Math.round(MapleDataTool.getFloat(firstAttackData)); - } else { - firstAttack = MapleDataTool.getInt(firstAttackData); - } - } - stats.setFirstAttack(firstAttack > 0); - stats.setDropPeriod(MapleDataTool.getIntConvert("dropItemPeriod", monsterInfoData, 0) * 10000); - - stats.setTagColor(MapleDataTool.getIntConvert("hpTagColor", monsterInfoData, 0)); - stats.setTagBgColor(MapleDataTool.getIntConvert("hpTagBgcolor", monsterInfoData, 0)); - - for (MapleData idata : monsterData) { - if (!idata.getName().equals("info")) { - int delay = 0; - for (MapleData pic : idata.getChildren()) { - delay += MapleDataTool.getIntConvert("delay", pic, 0); - } - stats.setAnimationTime(idata.getName(), delay); - } - } - MapleData reviveInfo = monsterInfoData.getChildByPath("revive"); - if (reviveInfo != null) { - List revives = new LinkedList<>(); - for (MapleData data_ : reviveInfo) { - revives.add(MapleDataTool.getInt(data_)); - } - stats.setRevives(revives); - } - decodeElementalString(stats, MapleDataTool.getString("elemAttr", monsterInfoData, "")); - MapleData monsterSkillData = monsterInfoData.getChildByPath("skill"); - if (monsterSkillData != null) { - int i = 0; - List> skills = new ArrayList<>(); - while (monsterSkillData.getChildByPath(Integer.toString(i)) != null) { - skills.add(new Pair<>(Integer.valueOf(MapleDataTool.getInt(i + "/skill", monsterSkillData, 0)), Integer.valueOf(MapleDataTool.getInt(i + "/level", monsterSkillData, 0)))); - i++; - } - stats.setSkills(skills); - } - MapleData banishData = monsterInfoData.getChildByPath("ban"); - if (banishData != null) { - stats.setBanishInfo(new BanishInfo(MapleDataTool.getString("banMsg", banishData), MapleDataTool.getInt("banMap/0/field", banishData, -1), MapleDataTool.getString("banMap/0/portal", banishData, "sp"))); - } - - monsterStats.put(mid, stats); - } catch(NullPointerException npe) { - //System.out.println("[SEVERE] " + mFile.getName() + " failed to load. Issue: " + npe.getMessage() + "\n\n"); - } - } - - System.out.println("done!"); - return monsterStats; - } - - private static void decodeElementalString(MapleMonsterStats stats, String elemAttr) { - for (int i = 0; i < elemAttr.length(); i += 2) { - stats.setEffectiveness(Element.getFromChar(elemAttr.charAt(i)), ElementalEffectiveness.getByNumber(Integer.valueOf(String.valueOf(elemAttr.charAt(i + 1))))); - } - } - - public static class BanishInfo { - - private int map; - private String portal, msg; - - public BanishInfo(String msg, int map, String portal) { - this.msg = msg; - this.map = map; - this.portal = portal; - } - - public int getMap() { - return map; - } - - public String getPortal() { - return portal; - } - - public String getMsg() { - return msg; - } - } - - public static class loseItem { - - private int id; - private byte chance, x; - - private loseItem(int id, byte chance, byte x) { - this.id = id; - this.chance = chance; - this.x = x; - } - - public int getId() { - return id; - } - - public byte getChance() { - return chance; - } - - public byte getX() { - return x; - } - } - - public static class selfDestruction { - - private byte action; - private int removeAfter; - private int hp; - - private selfDestruction(byte action, int removeAfter, int hp) { - this.action = action; - this.removeAfter = removeAfter; - this.hp = hp; - } - - public int getHp() { - return hp; - } - - public byte getAction() { - return action; - } - - public int removeAfter() { - return removeAfter; - } - } -} diff --git a/tools/MapleArrowFetcher/src/life/MapleMonsterStats.java b/tools/MapleArrowFetcher/src/life/MapleMonsterStats.java deleted file mode 100644 index ce2cacf6b3..0000000000 --- a/tools/MapleArrowFetcher/src/life/MapleMonsterStats.java +++ /dev/null @@ -1,330 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package life; - -import life.MapleLifeFactory.BanishInfo; -import life.MapleLifeFactory.loseItem; -import life.MapleLifeFactory.selfDestruction; -import tools.Pair; - -import java.util.*; - -/** - * @author Frz - */ -public class MapleMonsterStats { - private boolean changeable; - private int exp, hp, mp, level, PADamage, PDDamage, MADamage, MDDamage, dropPeriod, cp, buffToGive, removeAfter; - private boolean boss, undead, ffaLoot, isExplosiveReward, firstAttack, removeOnMiss; - private String name; - private Map animationTimes = new HashMap(); - private Map resistance = new HashMap(); - private List revives = Collections.emptyList(); - private byte tagColor, tagBgColor; - private List> skills = new ArrayList>(); - private Pair cool = null; - private BanishInfo banish = null; - private List loseItem = null; - private selfDestruction selfDestruction = null; - private boolean friendly; - - public void setChange(boolean change) { - this.changeable = change; - } - - public boolean isChangeable() { - return changeable; - } - - public int getExp() { - return exp; - } - - public void setExp(int exp) { - this.exp = exp; - } - - public int getHp() { - return hp; - } - - public void setHp(int hp) { - this.hp = hp; - } - - public int getMp() { - return mp; - } - - public void setMp(int mp) { - this.mp = mp; - } - - public int getLevel() { - return level; - } - - public void setLevel(int level) { - this.level = level; - } - - public int removeAfter() { - return removeAfter; - } - - public void setRemoveAfter(int removeAfter) { - this.removeAfter = removeAfter; - } - - public int getDropPeriod() { - return dropPeriod; - } - - public void setDropPeriod(int dropPeriod) { - this.dropPeriod = dropPeriod; - } - - public void setBoss(boolean boss) { - this.boss = boss; - } - - public boolean isBoss() { - return boss; - } - - public void setFfaLoot(boolean ffaLoot) { - this.ffaLoot = ffaLoot; - } - - public boolean isFfaLoot() { - return ffaLoot; - } - - public void setAnimationTime(String name, int delay) { - animationTimes.put(name, delay); - } - - public int getAnimationTime(String name) { - Integer ret = animationTimes.get(name); - if (ret == null) { - return 500; - } - return ret.intValue(); - } - - public boolean isMobile() { - return animationTimes.containsKey("move") || animationTimes.containsKey("fly"); - } - - public List getRevives() { - return revives; - } - - public void setRevives(List revives) { - this.revives = revives; - } - - public void setUndead(boolean undead) { - this.undead = undead; - } - - public boolean getUndead() { - return undead; - } - - public void setEffectiveness(Element e, ElementalEffectiveness ee) { - resistance.put(e, ee); - } - - public ElementalEffectiveness getEffectiveness(Element e) { - ElementalEffectiveness elementalEffectiveness = resistance.get(e); - if (elementalEffectiveness == null) { - return ElementalEffectiveness.NORMAL; - } else { - return elementalEffectiveness; - } - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public byte getTagColor() { - return tagColor; - } - - public void setTagColor(int tagColor) { - this.tagColor = (byte) tagColor; - } - - public byte getTagBgColor() { - return tagBgColor; - } - - public void setTagBgColor(int tagBgColor) { - this.tagBgColor = (byte) tagBgColor; - } - - public void setSkills(List> skills) { - this.skills.addAll(skills); - } - - public List> getSkills() { - return Collections.unmodifiableList(this.skills); - } - - public int getNoSkills() { - return this.skills.size(); - } - - public boolean hasSkill(int skillId, int level) { - for (Pair skill : skills) { - if (skill.getLeft() == skillId && skill.getRight() == level) { - return true; - } - } - return false; - } - - public void setFirstAttack(boolean firstAttack) { - this.firstAttack = firstAttack; - } - - public boolean isFirstAttack() { - return firstAttack; - } - - public void setBuffToGive(int buff) { - this.buffToGive = buff; - } - - public int getBuffToGive() { - return buffToGive; - } - - void removeEffectiveness(Element e) { - resistance.remove(e); - } - - public BanishInfo getBanishInfo() { - return banish; - } - - public void setBanishInfo(BanishInfo banish) { - this.banish = banish; - } - - public int getPADamage() { - return PADamage; - } - - public void setPADamage(int PADamage) { - this.PADamage = PADamage; - } - - public int getCP() { - return cp; - } - - public void setCP(int cp) { - this.cp = cp; - } - - public List loseItem() { - return loseItem; - } - - public void addLoseItem(loseItem li) { - if (loseItem == null) { - loseItem = new LinkedList(); - } - loseItem.add(li); - } - - public selfDestruction selfDestruction() { - return selfDestruction; - } - - public void setSelfDestruction(selfDestruction sd) { - this.selfDestruction = sd; - } - - public void setExplosiveReward(boolean isExplosiveReward) { - this.isExplosiveReward = isExplosiveReward; - } - - public boolean isExplosiveReward() { - return isExplosiveReward; - } - - public void setRemoveOnMiss(boolean removeOnMiss) { - this.removeOnMiss = removeOnMiss; - } - - public boolean removeOnMiss() { - return removeOnMiss; - } - - public void setCool(Pair cool) { - this.cool = cool; - } - - public Pair getCool() { - return cool; - } - - public int getPDDamage() { - return PDDamage; - } - - public int getMADamage() { - return MADamage; - } - - public int getMDDamage() { - return MDDamage; - } - - public boolean isFriendly() { - return friendly; - } - - public void setFriendly(boolean value) { - this.friendly = value; - } - - public void setPDDamage(int PDDamage) { - this.PDDamage = PDDamage; - } - - public void setMADamage(int MADamage) { - this.MADamage = MADamage; - } - - public void setMDDamage(int MDDamage) { - this.MDDamage = MDDamage; - } -} diff --git a/tools/MapleArrowFetcher/src/maplearrowfetcher/MapleArrowFetcher.java b/tools/MapleArrowFetcher/src/maplearrowfetcher/MapleArrowFetcher.java deleted file mode 100644 index 308edb09b2..0000000000 --- a/tools/MapleArrowFetcher/src/maplearrowfetcher/MapleArrowFetcher.java +++ /dev/null @@ -1,222 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package maplearrowfetcher; - -import life.MapleLifeFactory; -import life.MapleMonsterStats; -import tools.DatabaseConnection; -import tools.Pair; - -import java.io.PrintWriter; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.util.*; -import java.util.Map.Entry; - -/** - * - * @author RonanLana - * - * This application traces arrow drop data on the underlying DB (that must be - * defined on the DatabaseConnection file of this project) and generates a SQL file - * that proposes updated arrow quantitty on drop entries for the drop_data table. - * - * The arrow quantity range is calculated accordingly with the target mob stats, such - * as level and if it's a boss or not. - * - */ - -public class MapleArrowFetcher { - - private static PrintWriter printWriter; - private static String newFile = "lib/arrow_drop_data.sql"; - - private static int minArrowId = 2060000; - private static int maxArrowId = 2061004; - - private static float correctionFactor = 2.2f; - - private static Map mobStats; - private static Map> mobRange = new HashMap<>(); - - private static Pair calcArrowRange(int level, boolean boss) { - int minRange, maxRange; - - // MIN range - minRange = (int)Math.ceil(((2.870503597 * level) - 1.870503597) * (boss ? 1.4 : 1.0) / correctionFactor); - - // MAX range - maxRange = (int)Math.ceil(1.25 * minRange); - - return new Pair<>(minRange, maxRange); - } - - private static void calcAllMobsArrowRange() { - System.out.print("Calculating range... "); - - for(Entry mobStat : mobStats.entrySet()) { - MapleMonsterStats mms = mobStat.getValue(); - Pair arrowRange; - - arrowRange = calcArrowRange(mms.getLevel(), mms.isBoss()); - mobRange.put(mobStat.getKey(), arrowRange); - } - - System.out.println("done!"); - } - - private static void printSqlHeader() { - printWriter.println(" # SQL File autogenerated from the MapleArrowFetcher feature by Ronan Lana."); - printWriter.println(" # Generated data takes into account mob stats such as level and boss for the raw arrow ranges."); - printWriter.println(" # Only current arrows entries on the DB it was compiled are being updated here."); - printWriter.println(); - - printWriter.println("UPDATE drop_data"); - printWriter.println("SET minimum_quantity = CASE"); - } - - private static void printSqlMiddle() { - printWriter.println(" ELSE minimum_quantity END,"); - printWriter.println(" maximum_quantity = CASE"); - } - - private static void printSqlFooter() { - printWriter.println(" ELSE maximum_quantity END"); - printWriter.println(";"); - } - - private static void updateSqlMobArrowMinEntry(int[] entry) { - printWriter.println(" WHEN dropperid = " + entry[0] + " AND itemid = " + entry[1] + " THEN " + entry[2]); - } - - private static void updateSqlMobArrowMaxEntry(int[] entry) { - printWriter.println(" WHEN dropperid = " + entry[0] + " AND itemid = " + entry[1] + " THEN " + entry[3]); - } - - private static List getArrowEntryValues(Map> existingEntries) { - List entryValues = new ArrayList<>(200); - - List>> listEntries = new ArrayList<>(existingEntries.entrySet()); - - Collections.sort(listEntries, (o1, o2) -> { - int val1 = o1.getKey(); - int val2 = o2.getKey(); - return (val1 < val2 ? -1 : (val1 == val2 ? 0 : 1)); - }); - - for(Entry> ee : listEntries) { - int mobid = ee.getKey(); - Pair mr = mobRange.get(mobid); - - for(Integer itemid : ee.getValue()) { - int itemWeight = (itemid % 10) + 1; - - int[] values = new int[4]; - values[0] = mobid; - values[1] = itemid; - - values[2] = (int) Math.ceil(mr.getLeft() / itemWeight); // weighted min quantity - values[3] = (int) Math.ceil(mr.getRight() / itemWeight); // weighted max quantity - - entryValues.add(values); - } - } - - return entryValues; - } - - private static void updateMobsArrowRange() { - System.out.print("Generating updated ranges... "); - Connection con = DatabaseConnection.getConnection(); - Map> existingEntries = new HashMap<>(200); - - try { - // select all arrow drop entries on the DB, to update their values - PreparedStatement ps = con.prepareStatement("SELECT dropperid, itemid FROM drop_data WHERE itemid >= " + minArrowId + " AND itemid <= " + maxArrowId + " ORDER BY itemid;"); - ResultSet rs = ps.executeQuery(); - - if (rs.isBeforeFirst()) { - while(rs.next()) { - int mobid = rs.getInt(1); - int itemid = rs.getInt(2); - - if(mobRange.containsKey(mobid)) { - List em = existingEntries.get(mobid); - - if(em == null) { - em = new ArrayList<>(2); - existingEntries.put(mobid, em); - } - - em.add(itemid); - } - } - - if(!existingEntries.isEmpty()) { - List entryValues = getArrowEntryValues(existingEntries); - - printWriter = new PrintWriter(newFile, "UTF-8"); - printSqlHeader(); - - for(int[] arrowEntry : entryValues) { - updateSqlMobArrowMinEntry(arrowEntry); - } - - printSqlMiddle(); - - for(int[] arrowEntry : entryValues) { - updateSqlMobArrowMaxEntry(arrowEntry); - } - - printSqlFooter(); - - printWriter.close(); - } else { - throw new Exception("NO DATA"); - } - - } else { - throw new Exception("NO DATA"); - } - - rs.close(); - ps.close(); - con.close(); - - System.out.println("done!"); - - } catch(Exception e) { - if(e.getMessage() != null && e.getMessage().equals("NO DATA")) { - System.out.println("failed! The DB has no arrow entry to be updated."); - } else { - e.printStackTrace(); - } - } - } - - public static void main(String[] args) { - // load mob stats from WZ - mobStats = MapleLifeFactory.getAllMonsterStats(); - - calcAllMobsArrowRange(); - updateMobsArrowRange(); - } -} diff --git a/tools/MapleArrowFetcher/src/provider/MapleCanvas.java b/tools/MapleArrowFetcher/src/provider/MapleCanvas.java deleted file mode 100644 index 10ab682196..0000000000 --- a/tools/MapleArrowFetcher/src/provider/MapleCanvas.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.awt.image.BufferedImage; - -public interface MapleCanvas { - int getHeight(); - int getWidth(); - BufferedImage getImage(); -} diff --git a/tools/MapleArrowFetcher/src/provider/MapleData.java b/tools/MapleArrowFetcher/src/provider/MapleData.java deleted file mode 100644 index 4d90a93804..0000000000 --- a/tools/MapleArrowFetcher/src/provider/MapleData.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.util.List; -import provider.wz.MapleDataType; - -public interface MapleData extends MapleDataEntity, Iterable { - @Override - public String getName(); - public MapleDataType getType(); - public List getChildren(); - public MapleData getChildByPath(String path); - public Object getData(); -} diff --git a/tools/MapleArrowFetcher/src/provider/MapleDataDirectoryEntry.java b/tools/MapleArrowFetcher/src/provider/MapleDataDirectoryEntry.java deleted file mode 100644 index cb043e0c94..0000000000 --- a/tools/MapleArrowFetcher/src/provider/MapleDataDirectoryEntry.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.util.List; - -/** - * - * @author Matze - */ -public interface MapleDataDirectoryEntry extends MapleDataEntry { - public List getSubdirectories(); - public List getFiles(); - public MapleDataEntry getEntry(String name); -} diff --git a/tools/MapleArrowFetcher/src/provider/MapleDataEntity.java b/tools/MapleArrowFetcher/src/provider/MapleDataEntity.java deleted file mode 100644 index 03ff77649c..0000000000 --- a/tools/MapleArrowFetcher/src/provider/MapleDataEntity.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataEntity { - public String getName(); - public MapleDataEntity getParent(); -} diff --git a/tools/MapleArrowFetcher/src/provider/MapleDataEntry.java b/tools/MapleArrowFetcher/src/provider/MapleDataEntry.java deleted file mode 100644 index 62db6d0abe..0000000000 --- a/tools/MapleArrowFetcher/src/provider/MapleDataEntry.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataEntry extends MapleDataEntity { - public String getName(); - public int getSize(); - public int getChecksum(); - public int getOffset(); -} diff --git a/tools/MapleArrowFetcher/src/provider/MapleDataFileEntry.java b/tools/MapleArrowFetcher/src/provider/MapleDataFileEntry.java deleted file mode 100644 index 902130a612..0000000000 --- a/tools/MapleArrowFetcher/src/provider/MapleDataFileEntry.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataFileEntry extends MapleDataEntry { - public void setOffset(int offset); -} diff --git a/tools/MapleArrowFetcher/src/provider/MapleDataProvider.java b/tools/MapleArrowFetcher/src/provider/MapleDataProvider.java deleted file mode 100644 index 5237b7ac37..0000000000 --- a/tools/MapleArrowFetcher/src/provider/MapleDataProvider.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -public interface MapleDataProvider { - MapleData getData(String path); - MapleDataDirectoryEntry getRoot(); -} diff --git a/tools/MapleArrowFetcher/src/provider/MapleDataProviderFactory.java b/tools/MapleArrowFetcher/src/provider/MapleDataProviderFactory.java deleted file mode 100644 index 14753d4406..0000000000 --- a/tools/MapleArrowFetcher/src/provider/MapleDataProviderFactory.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.io.File; -import java.io.IOException; -import provider.wz.WZFile; -import provider.wz.XMLWZFile; - -public class MapleDataProviderFactory { - private final static String wzPath = System.getProperty("wzpath"); - - private static MapleDataProvider getWZ(File in, boolean provideImages) { - if (in.getName().toLowerCase().endsWith("wz") && !in.isDirectory()) { - try { - return new WZFile(in, provideImages); - } catch (IOException e) { - throw new RuntimeException("Loading WZ File failed", e); - } - } else { - return new XMLWZFile(in); - } - } - - public static MapleDataProvider getDataProvider(File in) { - return getWZ(in, false); - } - - public static MapleDataProvider getImageProvidingDataProvider(File in) { - return getWZ(in, true); - } - - public static File fileInWZPath(String filename) { - return new File(wzPath, filename); - } -} \ No newline at end of file diff --git a/tools/MapleArrowFetcher/src/provider/MapleDataTool.java b/tools/MapleArrowFetcher/src/provider/MapleDataTool.java deleted file mode 100644 index 25f4c7f817..0000000000 --- a/tools/MapleArrowFetcher/src/provider/MapleDataTool.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.awt.Point; -import java.awt.image.BufferedImage; -import provider.wz.MapleDataType; - -public class MapleDataTool { - public static String getString(MapleData data) { - return ((String) data.getData()); - } - - public static String getString(MapleData data, String def) { - if (data == null || data.getData() == null) { - return def; - } else { - return ((String) data.getData()); - } - } - - public static String getString(String path, MapleData data) { - return getString(data.getChildByPath(path)); - } - - public static String getString(String path, MapleData data, String def) { - return getString(data.getChildByPath(path), def); - } - - public static double getDouble(MapleData data) { - return ((Double) data.getData()).doubleValue(); - } - - public static float getFloat(MapleData data) { - return ((Float) data.getData()).floatValue(); - } - - public static int getInt(MapleData data) { - if (data == null || data.getData() == null) { - return 0;// DEF? - } - return ((Integer) data.getData()).intValue(); - } - - public static int getInt(String path, MapleData data) { - return getInt(data.getChildByPath(path)); - } - - public static int getIntConvert(MapleData data) { - if (data.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(data)); - } else { - return getInt(data); - } - } - - public static int getIntConvert(String path, MapleData data) { - MapleData d = data.getChildByPath(path); - if (d.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(d)); - } else { - return getInt(d); - } - } - - public static int getInt(MapleData data, int def) { - if (data == null || data.getData() == null) { - return def; - } else if (data.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(data)); - } else { - return ((Integer) data.getData()).intValue(); - } - } - - public static int getInt(String path, MapleData data, int def) { - return getInt(data.getChildByPath(path), def); - } - - public static int getIntConvert(String path, MapleData data, int def) { - MapleData d = data.getChildByPath(path); - if (d == null) { - return def; - } - if (d.getType() == MapleDataType.STRING) { - try { - return Integer.parseInt(getString(d)); - } catch (NumberFormatException nfe) { - nfe.printStackTrace(); - return def; - } - } else { - return getInt(d, def); - } - } - - public static BufferedImage getImage(MapleData data) { - return ((MapleCanvas) data.getData()).getImage(); - } - - public static Point getPoint(MapleData data) { - return ((Point) data.getData()); - } - - public static Point getPoint(String path, MapleData data) { - return getPoint(data.getChildByPath(path)); - } - - public static Point getPoint(String path, MapleData data, Point def) { - final MapleData pointData = data.getChildByPath(path); - if (pointData == null) { - return def; - } - return getPoint(pointData); - } - - public static String getFullDataPath(MapleData data) { - String path = ""; - MapleDataEntity myData = data; - while (myData != null) { - path = myData.getName() + "/" + path; - myData = myData.getParent(); - } - return path.substring(0, path.length() - 1); - } -} diff --git a/tools/MapleArrowFetcher/src/provider/wz/FileStoredPngMapleCanvas.java b/tools/MapleArrowFetcher/src/provider/wz/FileStoredPngMapleCanvas.java deleted file mode 100644 index 21736c2c16..0000000000 --- a/tools/MapleArrowFetcher/src/provider/wz/FileStoredPngMapleCanvas.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import javax.imageio.ImageIO; -import provider.MapleCanvas; - -public class FileStoredPngMapleCanvas implements MapleCanvas { - private File file; - private int width; - private int height; - private BufferedImage image; - - public FileStoredPngMapleCanvas(int width, int height, File fileIn) { - this.width = width; - this.height = height; - this.file = fileIn; - } - - @Override - public int getHeight() { - return height; - } - - @Override - public int getWidth() { - return width; - } - - @Override - public BufferedImage getImage() { - loadImageIfNecessary(); - return image; - } - - private void loadImageIfNecessary() { - if (image == null) { - try { - image = ImageIO.read(file); - // replace the dimensions loaded from the wz by the REAL dimensions from the image - should be equal tho - width = image.getWidth(); - height = image.getHeight(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } -} diff --git a/tools/MapleArrowFetcher/src/provider/wz/ImgMapleSound.java b/tools/MapleArrowFetcher/src/provider/wz/ImgMapleSound.java deleted file mode 100644 index 8add2ccb36..0000000000 --- a/tools/MapleArrowFetcher/src/provider/wz/ImgMapleSound.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -public class ImgMapleSound { - private int dataLength, offset; - - public ImgMapleSound(int dataLength, int offset) { - this.dataLength = dataLength; - this.offset = offset; - } - - public int getDataLength() { - return dataLength; - } - - public int getOffset() { - return offset; - } -} diff --git a/tools/MapleArrowFetcher/src/provider/wz/ListWZFile.java b/tools/MapleArrowFetcher/src/provider/wz/ListWZFile.java deleted file mode 100644 index 1672a08c59..0000000000 --- a/tools/MapleArrowFetcher/src/provider/wz/ListWZFile.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import provider.MapleDataProviderFactory; -import tools.data.input.GenericLittleEndianAccessor; -import tools.data.input.InputStreamByteStream; -import tools.data.input.LittleEndianAccessor; - -public class ListWZFile { - private LittleEndianAccessor lea; - private List entries = new ArrayList(); - private static Collection modernImgs = new HashSet(); - - public static byte[] xorBytes(byte[] a, byte[] b) { - byte[] wusched = new byte[a.length]; - for (int i = 0; i < a.length; i++) { - wusched[i] = (byte) (a[i] ^ b[i]); - } - return wusched; - } - - public ListWZFile(File listwz) throws FileNotFoundException { - lea = new GenericLittleEndianAccessor(new InputStreamByteStream(new BufferedInputStream(new FileInputStream(listwz)))); - while (lea.available() > 0) { - int l = lea.readInt() * 2; - byte[] chunk = new byte[l]; - for (int i = 0; i < chunk.length; i++) { - chunk[i] = lea.readByte(); - } - lea.readChar(); - final String value = String.valueOf(WZTool.readListString(chunk)); - entries.add(value); - } - entries = Collections.unmodifiableList(entries); - } - - public List getEntries() { - return entries; - } - - public static void init() { - final String listWz = System.getProperty("listwz"); - if (listWz != null) { - ListWZFile listwz; - try { - listwz = new ListWZFile(MapleDataProviderFactory.fileInWZPath("List.wz")); - modernImgs = new HashSet(listwz.getEntries()); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - } - - public static boolean isModernImgFile(String path) { - return modernImgs.contains(path); - } -} diff --git a/tools/MapleArrowFetcher/src/provider/wz/MapleDataType.java b/tools/MapleArrowFetcher/src/provider/wz/MapleDataType.java deleted file mode 100644 index e074d57d14..0000000000 --- a/tools/MapleArrowFetcher/src/provider/wz/MapleDataType.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -public enum MapleDataType { - NONE, IMG_0x00, SHORT, INT, FLOAT, DOUBLE, STRING, EXTENDED, PROPERTY, CANVAS, VECTOR, CONVEX, SOUND, UOL, UNKNOWN_TYPE, UNKNOWN_EXTENDED_TYPE; -} \ No newline at end of file diff --git a/tools/MapleArrowFetcher/src/provider/wz/PNGMapleCanvas.java b/tools/MapleArrowFetcher/src/provider/wz/PNGMapleCanvas.java deleted file mode 100644 index 97c2303804..0000000000 --- a/tools/MapleArrowFetcher/src/provider/wz/PNGMapleCanvas.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.Point; -import java.awt.image.BufferedImage; -import java.awt.image.DataBuffer; -import java.awt.image.DataBufferByte; -import java.awt.image.PixelInterleavedSampleModel; -import java.awt.image.Raster; -import java.awt.image.SampleModel; -import java.awt.image.WritableRaster; -import java.util.zip.DataFormatException; -import java.util.zip.Inflater; -import provider.MapleCanvas; - -public class PNGMapleCanvas implements MapleCanvas { - private static final int[] ZAHLEN = new int[]{2, 1, 0, 3}; - private int height; - private int width; - private int dataLength; - private int format; - private byte[] data; - - public PNGMapleCanvas(int width, int height, int dataLength, int format, byte[] data) { - super(); - this.height = height; - this.width = width; - this.dataLength = dataLength; - this.format = format; - this.data = data; - } - - public int getHeight() { - return height; - } - - public int getWidth() { - return width; - } - - public int getFormat() { - return format; - } - - private byte[] getData() { - return data; - } - - @Override - public BufferedImage getImage() { - int sizeUncompressed = 0; - int size8888 = 0; - int maxWriteBuf = 2; - int maxHeight = 3; - byte[] writeBuf = new byte[maxWriteBuf]; - @SuppressWarnings ("unused") - byte[] rowPointers = new byte[maxHeight]; - switch (getFormat()) { - case 1: - case 513: - sizeUncompressed = getHeight() * getWidth() * 4; - break; - case 2: - sizeUncompressed = getHeight() * getWidth() * 8; - break; - case 517: - sizeUncompressed = getHeight() * getWidth() / 128; - break; - } - size8888 = getHeight() * getWidth() * 8; - if (size8888 > maxWriteBuf) { - maxWriteBuf = size8888; - writeBuf = new byte[maxWriteBuf]; - } - if (getHeight() > maxHeight) { - maxHeight = getHeight(); - rowPointers = new byte[maxHeight]; - } - Inflater dec = new Inflater(); - dec.setInput(getData(), 0, dataLength); - int declen = 0; - byte[] uc = new byte[sizeUncompressed]; - try { - declen = dec.inflate(uc); - } catch (DataFormatException ex) { - throw new RuntimeException("zlib fucks", ex); - } - dec.end(); - if (getFormat() == 1) { - for (int i = 0; i < sizeUncompressed; i++) { - byte low = (byte) (uc[i] & 0x0F); - byte high = (byte) (uc[i] & 0xF0); - writeBuf[(i << 1)] = (byte) (((low << 4) | low) & 0xFF); - writeBuf[(i << 1) + 1] = (byte) (high | ((high >>> 4) & 0xF)); - } - } else if (getFormat() == 2) { - writeBuf = uc; - } else if (getFormat() == 513) { - for (int i = 0; i < declen; i += 2) { - byte bBits = (byte) ((uc[i] & 0x1F) << 3); - byte gBits = (byte) (((uc[i + 1] & 0x07) << 5) | ((uc[i] & 0xE0) >> 3)); - byte rBits = (byte) (uc[i + 1] & 0xF8); - writeBuf[(i << 1)] = (byte) (bBits | (bBits >> 5)); - writeBuf[(i << 1) + 1] = (byte) (gBits | (gBits >> 6)); - writeBuf[(i << 1) + 2] = (byte) (rBits | (rBits >> 5)); - writeBuf[(i << 1) + 3] = (byte) 0xFF; - } - } else if (getFormat() == 517) { - byte b = 0x00; - int pixelIndex = 0; - for (int i = 0; i < declen; i++) { - for (int j = 0; j < 8; j++) { - b = (byte) (((uc[i] & (0x01 << (7 - j))) >> (7 - j)) * 255); - for (int k = 0; k < 16; k++) { - pixelIndex = (i << 9) + (j << 6) + k * 2; - writeBuf[pixelIndex] = b; - writeBuf[pixelIndex + 1] = b; - writeBuf[pixelIndex + 2] = b; - writeBuf[pixelIndex + 3] = (byte) 0xFF; - } - } - } - } - DataBufferByte imgData = new DataBufferByte(writeBuf, sizeUncompressed); - SampleModel sm = new PixelInterleavedSampleModel(DataBuffer.TYPE_BYTE, getWidth(), getHeight(), 4, getWidth() * 4, ZAHLEN); - WritableRaster imgRaster = Raster.createWritableRaster(sm, imgData, new Point(0, 0)); - BufferedImage aa = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); - aa.setData(imgRaster); - return aa; - } -} diff --git a/tools/MapleArrowFetcher/src/provider/wz/WZDirectoryEntry.java b/tools/MapleArrowFetcher/src/provider/wz/WZDirectoryEntry.java deleted file mode 100644 index d24b8cb2b9..0000000000 --- a/tools/MapleArrowFetcher/src/provider/wz/WZDirectoryEntry.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataEntity; -import provider.MapleDataEntry; -import provider.MapleDataFileEntry; - -public class WZDirectoryEntry extends WZEntry implements MapleDataDirectoryEntry { - private List subdirs = new ArrayList(); - private List files = new ArrayList(); - private Map entries = new HashMap(); - - public WZDirectoryEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(name, size, checksum, parent); - } - - public WZDirectoryEntry() { - super(null, 0, 0, null); - } - - public void addDirectory(MapleDataDirectoryEntry dir) { - subdirs.add(dir); - entries.put(dir.getName(), dir); - } - - public void addFile(MapleDataFileEntry fileEntry) { - files.add(fileEntry); - entries.put(fileEntry.getName(), fileEntry); - } - - public List getSubdirectories() { - return Collections.unmodifiableList(subdirs); - } - - public List getFiles() { - return Collections.unmodifiableList(files); - } - - public MapleDataEntry getEntry(String name) { - return entries.get(name); - } -} diff --git a/tools/MapleArrowFetcher/src/provider/wz/WZEntry.java b/tools/MapleArrowFetcher/src/provider/wz/WZEntry.java deleted file mode 100644 index 1e921b2082..0000000000 --- a/tools/MapleArrowFetcher/src/provider/wz/WZEntry.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import provider.MapleDataEntity; -import provider.MapleDataEntry; - -public class WZEntry implements MapleDataEntry { - private String name; - private int size; - private int checksum; - private int offset; - private MapleDataEntity parent; - - public WZEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(); - this.name = name; - this.size = size; - this.checksum = checksum; - this.parent = parent; - } - - public String getName() { - return name; - } - - public int getSize() { - return size; - } - - public int getChecksum() { - return checksum; - } - - public int getOffset() { - return offset; - } - - public MapleDataEntity getParent() { - return parent; - } -} diff --git a/tools/MapleArrowFetcher/src/provider/wz/WZFile.java b/tools/MapleArrowFetcher/src/provider/wz/WZFile.java deleted file mode 100644 index c6c0abf537..0000000000 --- a/tools/MapleArrowFetcher/src/provider/wz/WZFile.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.RandomAccessFile; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataFileEntry; -import provider.MapleDataProvider; -import tools.data.input.GenericLittleEndianAccessor; -import tools.data.input.GenericSeekableLittleEndianAccessor; -import tools.data.input.InputStreamByteStream; -import tools.data.input.LittleEndianAccessor; -import tools.data.input.RandomAccessByteStream; -import tools.data.input.SeekableLittleEndianAccessor; - -public class WZFile implements MapleDataProvider { - static { - ListWZFile.init(); - } - private File wzfile; - private LittleEndianAccessor lea; - private SeekableLittleEndianAccessor slea; - private int headerSize; - private WZDirectoryEntry root; - private boolean provideImages; - private int cOffset; - - public WZFile(File wzfile, boolean provideImages) throws IOException { - this.wzfile = wzfile; - lea = new GenericLittleEndianAccessor(new InputStreamByteStream(new BufferedInputStream(new FileInputStream(wzfile)))); - RandomAccessFile raf = new RandomAccessFile(wzfile, "r"); - slea = new GenericSeekableLittleEndianAccessor(new RandomAccessByteStream(raf)); - root = new WZDirectoryEntry(wzfile.getName(), 0, 0, null); - this.provideImages = provideImages; - load(); - } - - private void load() throws IOException { - lea.readAsciiString(4); - lea.readInt(); - lea.readInt(); - headerSize = lea.readInt(); - lea.readNullTerminatedAsciiString(); - lea.readShort(); - parseDirectory(root); - cOffset = (int) lea.getBytesRead(); - getOffsets(root); - } - - private void getOffsets(MapleDataDirectoryEntry dir) { - for (MapleDataFileEntry file : dir.getFiles()) { - file.setOffset(cOffset); - cOffset += file.getSize(); - } - for (MapleDataDirectoryEntry sdir : dir.getSubdirectories()) { - getOffsets(sdir); - } - } - - private void parseDirectory(WZDirectoryEntry dir) { - int entries = WZTool.readValue(lea); - for (int i = 0; i < entries; i++) { - byte marker = lea.readByte(); - String name = null; - int size, checksum; - switch (marker) { - case 0x02: - name = WZTool.readDecodedStringAtOffsetAndReset(slea, lea.readInt() + this.headerSize + 1); - size = WZTool.readValue(lea); - checksum = WZTool.readValue(lea); - lea.readInt(); //dummy int - dir.addFile(new WZFileEntry(name, size, checksum, dir)); - break; - case 0x03: - case 0x04: - name = WZTool.readDecodedString(lea); - size = WZTool.readValue(lea); - checksum = WZTool.readValue(lea); - lea.readInt(); //dummy int - if (marker == 3) { - dir.addDirectory(new WZDirectoryEntry(name, size, checksum, dir)); - } else { - dir.addFile(new WZFileEntry(name, size, checksum, dir)); - } - break; - default: - } - } - for (MapleDataDirectoryEntry idir : dir.getSubdirectories()) { - parseDirectory((WZDirectoryEntry) idir); - } - } - - public WZIMGFile getImgFile(String path) throws IOException { - String segments[] = path.split("/"); - WZDirectoryEntry dir = root; - for (int x = 0; x < segments.length - 1; x++) { - dir = (WZDirectoryEntry) dir.getEntry(segments[x]); - if (dir == null) { - return null; - } - } - WZFileEntry entry = (WZFileEntry) dir.getEntry(segments[segments.length - 1]); - if (entry == null) { - return null; - } - String fullPath = wzfile.getName().substring(0, wzfile.getName().length() - 3).toLowerCase() + "/" + path; - return new WZIMGFile(this.wzfile, entry, provideImages, ListWZFile.isModernImgFile(fullPath)); - } - - @Override - public synchronized MapleData getData(String path) { - try { - WZIMGFile imgFile = getImgFile(path); - if (imgFile == null) { - return null; - } - MapleData ret = imgFile.getRoot(); - return ret; - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - @Override - public MapleDataDirectoryEntry getRoot() { - return root; - } -} diff --git a/tools/MapleArrowFetcher/src/provider/wz/WZFileEntry.java b/tools/MapleArrowFetcher/src/provider/wz/WZFileEntry.java deleted file mode 100644 index 792371d9cf..0000000000 --- a/tools/MapleArrowFetcher/src/provider/wz/WZFileEntry.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import provider.MapleDataEntity; -import provider.MapleDataFileEntry; - -public class WZFileEntry extends WZEntry implements MapleDataFileEntry { - private int offset; - - public WZFileEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(name, size, checksum, parent); - } - - @Override - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } -} diff --git a/tools/MapleArrowFetcher/src/provider/wz/WZIMGEntry.java b/tools/MapleArrowFetcher/src/provider/wz/WZIMGEntry.java deleted file mode 100644 index 385d785183..0000000000 --- a/tools/MapleArrowFetcher/src/provider/wz/WZIMGEntry.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import provider.MapleData; -import provider.MapleDataEntity; - -public class WZIMGEntry implements MapleData { - private String name; - private MapleDataType type; - private List children = new ArrayList(10); - private Object data; - private MapleDataEntity parent; - - public WZIMGEntry(MapleDataEntity parent) { - this.parent = parent; - } - - @Override - public String getName() { - return name; - } - - @Override - public MapleDataType getType() { - return type; - } - - @Override - public List getChildren() { - return Collections.unmodifiableList(children); - } - - @Override - public MapleData getChildByPath(String path) { - String segments[] = path.split("/"); - if (segments[0].equals("..")) { - return ((MapleData) getParent()).getChildByPath(path.substring(path.indexOf("/") + 1)); - } - MapleData ret = this; - for (int x = 0; x < segments.length; x++) { - boolean foundChild = false; - for (MapleData child : ret.getChildren()) { - if (child.getName().equals(segments[x])) { - ret = child; - foundChild = true; - break; - } - } - if (!foundChild) { - return null; - } - } - return ret; - } - - @Override - public Object getData() { - return data; - } - - public void setName(String name) { - this.name = name; - } - - public void setType(MapleDataType type) { - this.type = type; - } - - public void setData(Object data) { - this.data = data; - } - - public void addChild(WZIMGEntry entry) { - children.add(entry); - } - - @Override - public Iterator iterator() { - return getChildren().iterator(); - } - - @Override - public String toString() { - return getName() + ":" + getData(); - } - - public MapleDataEntity getParent() { - return parent; - } - - public void finish() { - ((ArrayList) children).trimToSize(); - } -} diff --git a/tools/MapleArrowFetcher/src/provider/wz/WZIMGFile.java b/tools/MapleArrowFetcher/src/provider/wz/WZIMGFile.java deleted file mode 100644 index bec06c78bd..0000000000 --- a/tools/MapleArrowFetcher/src/provider/wz/WZIMGFile.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.Point; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.io.RandomAccessFile; -import tools.data.input.GenericSeekableLittleEndianAccessor; -import tools.data.input.RandomAccessByteStream; -import tools.data.input.SeekableLittleEndianAccessor; - -public class WZIMGFile { - private WZFileEntry file; - private WZIMGEntry root; - private boolean provideImages; - @SuppressWarnings ("unused") - private boolean modernImg; - - public WZIMGFile(File wzfile, WZFileEntry file, boolean provideImages, boolean modernImg) throws IOException { - RandomAccessFile raf = new RandomAccessFile(wzfile, "r"); - SeekableLittleEndianAccessor slea = new GenericSeekableLittleEndianAccessor(new RandomAccessByteStream(raf)); - slea.seek(file.getOffset()); - this.file = file; - this.provideImages = provideImages; - root = new WZIMGEntry(file.getParent()); - root.setName(file.getName()); - root.setType(MapleDataType.EXTENDED); - this.modernImg = modernImg; - parseExtended(root, slea, 0); - root.finish(); - raf.close(); - } - - protected void dumpImg(OutputStream out, SeekableLittleEndianAccessor slea) throws IOException { - DataOutputStream os = new DataOutputStream(out); - long oldPos = slea.getPosition(); - slea.seek(file.getOffset()); - for (int x = 0; x < file.getSize(); x++) { - os.write(slea.readByte()); - } - slea.seek(oldPos); - } - - public WZIMGEntry getRoot() { - return root; - } - - private void parse(WZIMGEntry entry, SeekableLittleEndianAccessor slea) { - byte marker = slea.readByte(); - switch (marker) { - case 0: { - String name = WZTool.readDecodedString(slea); - entry.setName(name); - break; - } - case 1: { - String name = WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt()); - entry.setName(name); - break; - } - default: - System.out.println("Unknown Image identifier: " + marker + " at offset " + (slea.getPosition() - file.getOffset())); - } - marker = slea.readByte(); - switch (marker) { - case 0: - entry.setType(MapleDataType.IMG_0x00); - break; - case 2: - case 11: //??? no idea, since 0.49 - entry.setType(MapleDataType.SHORT); - entry.setData(Short.valueOf(slea.readShort())); - break; - case 3: - entry.setType(MapleDataType.INT); - entry.setData(Integer.valueOf(WZTool.readValue(slea))); - break; - case 4: - entry.setType(MapleDataType.FLOAT); - entry.setData(Float.valueOf(WZTool.readFloatValue(slea))); - break; - case 5: - entry.setType(MapleDataType.DOUBLE); - entry.setData(Double.valueOf(slea.readDouble())); - break; - case 8: - entry.setType(MapleDataType.STRING); - byte iMarker = slea.readByte(); - if (iMarker == 0) { - entry.setData(WZTool.readDecodedString(slea)); - } else if (iMarker == 1) { - entry.setData(WZTool.readDecodedStringAtOffsetAndReset(slea, slea.readInt() + file.getOffset())); - } else { - System.out.println("Unknown String type " + iMarker); - } - break; - case 9: - entry.setType(MapleDataType.EXTENDED); - long endOfExtendedBlock = slea.readInt(); - endOfExtendedBlock += slea.getPosition(); - parseExtended(entry, slea, endOfExtendedBlock); - break; - default: - System.out.println("Unknown Image type " + marker); - } - } - - private void parseExtended(WZIMGEntry entry, SeekableLittleEndianAccessor slea, long endOfExtendedBlock) { - byte marker = slea.readByte(); - String type; - switch (marker) { - case 0x73: - type = WZTool.readDecodedString(slea); - break; - case 0x1B: - type = WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt()); - break; - default: - throw new RuntimeException("Unknown extended image identifier: " + marker + " at offset " + - (slea.getPosition() - file.getOffset())); - } - if (type.equals("Property")) { - entry.setType(MapleDataType.PROPERTY); - slea.readByte(); - slea.readByte(); - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry cEntry = new WZIMGEntry(entry); - parse(cEntry, slea); - cEntry.finish(); - entry.addChild(cEntry); - } - } else if (type.equals("Canvas")) { - entry.setType(MapleDataType.CANVAS); - slea.readByte(); - marker = slea.readByte(); - if (marker == 0) { - // do nothing - } else if (marker == 1) { - slea.readByte(); - slea.readByte(); - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry child = new WZIMGEntry(entry); - parse(child, slea); - child.finish(); - entry.addChild(child); - } - } else { - System.out.println("Canvas marker != 1 (" + marker + ")"); - } - int width = WZTool.readValue(slea); - int height = WZTool.readValue(slea); - int format = WZTool.readValue(slea); - int format2 = slea.readByte(); - slea.readInt(); - int dataLength = slea.readInt() - 1; - slea.readByte(); - if (provideImages) { - byte[] pngdata = slea.read(dataLength); - entry.setData(new PNGMapleCanvas(width, height, dataLength, format + format2, pngdata)); - } else { - entry.setData(new PNGMapleCanvas(width, height, dataLength, format + format2, null)); - slea.skip(dataLength); - } - } else if (type.equals("Shape2D#Vector2D")) { - entry.setType(MapleDataType.VECTOR); - int x = WZTool.readValue(slea); - int y = WZTool.readValue(slea); - entry.setData(new Point(x, y)); - } else if (type.equals("Shape2D#Convex2D")) { - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry cEntry = new WZIMGEntry(entry); - parseExtended(cEntry, slea, 0); - cEntry.finish(); - entry.addChild(cEntry); - } - } else if (type.equals("Sound_DX8")) { - entry.setType(MapleDataType.SOUND); - slea.readByte(); - int dataLength = WZTool.readValue(slea); - WZTool.readValue(slea); // no clue what this is - int offset = (int) slea.getPosition(); - entry.setData(new ImgMapleSound(dataLength, offset - file.getOffset())); - slea.seek(endOfExtendedBlock); - } else if (type.equals("UOL")) { - entry.setType(MapleDataType.UOL); - slea.readByte(); - byte uolmarker = slea.readByte(); - switch (uolmarker) { - case 0: - entry.setData(WZTool.readDecodedString(slea)); - break; - case 1: - entry.setData(WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt())); - break; - default: - System.out.println("Unknown UOL marker: " + uolmarker + " " + entry.getName()); - } - } else { - throw new RuntimeException("Unhandled extended type: " + type); - } - } -} diff --git a/tools/MapleArrowFetcher/src/provider/wz/WZTool.java b/tools/MapleArrowFetcher/src/provider/wz/WZTool.java deleted file mode 100644 index 7f5452cd03..0000000000 --- a/tools/MapleArrowFetcher/src/provider/wz/WZTool.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import tools.data.input.LittleEndianAccessor; -import tools.data.input.SeekableLittleEndianAccessor; - -import javax.crypto.BadPaddingException; -import javax.crypto.Cipher; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.NoSuchPaddingException; -import javax.crypto.spec.SecretKeySpec; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; - -/* - * Ported Code, see WZFile.java for more info - */ -public class WZTool { - private static byte[] encKey; - - static { - byte[] iv = new byte[]{(byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b,}; - byte[] key = new byte[]{(byte) 0x13, 0x00, 0x00, 0x00, - (byte) 0x08, 0x00, 0x00, 0x00, - (byte) 0x06, 0x00, 0x00, 0x00, - (byte) 0xB4, 0x00, 0x00, 0x00, - (byte) 0x1B, 0x00, 0x00, 0x00, - (byte) 0x0F, 0x00, 0x00, 0x00, - (byte) 0x33, 0x00, 0x00, 0x00, - (byte) 0x52, 0x00, 0x00, 0x00 - }; - Cipher cipher = null; - SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); - try { - cipher = Cipher.getInstance("AES"); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (NoSuchPaddingException e) { - e.printStackTrace(); - } - try { - cipher.init(Cipher.ENCRYPT_MODE, skeySpec); - } catch (InvalidKeyException e) { - e.printStackTrace(); - } - encKey = new byte[0xFFFF]; - for (int i = 0; i < (0xFFFF / 16); i++) { - try { - iv = cipher.doFinal(iv); - } catch (IllegalBlockSizeException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } - System.arraycopy(iv, 0, encKey, (i * 16), 16); - } - try { - iv = cipher.doFinal(iv); - } catch (IllegalBlockSizeException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } - System.arraycopy(iv, 0, encKey, 65520, 15); - } - - public static byte[] readListString(byte[] str) { - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ encKey[i]); - } - return str; - } - - public static String readDecodedString(LittleEndianAccessor llea) { - int strLength; - byte b = llea.readByte(); - if (b == 0x00) { - return ""; - } - if (b >= 0) { - if (b == 0x7F) { - strLength = llea.readInt(); - } else { - strLength = b; - } - if (strLength < 0) { - return ""; - } - byte str[] = new byte[strLength * 2]; - for (int i = 0; i < strLength * 2; i++) { - str[i] = llea.readByte(); - } - return DecryptUnicodeStr(str); - } else { - if (b == -128) { - strLength = llea.readInt(); - } else { - strLength = -b; - } - if (strLength < 0) { - return ""; - } - byte str[] = new byte[strLength]; - for (int i = 0; i < strLength; i++) { - str[i] = llea.readByte(); - } - return DecryptAsciiStr(str); - } - } - - public static String DecryptAsciiStr(byte[] str) { - byte xorByte = (byte) 0xAA; - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ xorByte ^ encKey[i]); - xorByte++; - } - return new String(str); - } - - public static String DecryptUnicodeStr(byte[] str) { - int xorByte = 0xAAAA; - char[] charRet = new char[str.length / 2]; - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ encKey[i]); - } - for (int i = 0; i < (str.length / 2); i++) { - char toXor = (char) ((str[i] << 8) | str[i + 1]); - charRet[i] = (char) (toXor ^ xorByte); - xorByte++; - } - return String.valueOf(charRet); - } - - public static String readDecodedStringAtOffset(SeekableLittleEndianAccessor slea, int offset) { - slea.seek(offset); - return readDecodedString(slea); - } - - public static String readDecodedStringAtOffsetAndReset(SeekableLittleEndianAccessor slea, int offset) { - long pos = 0; - pos = slea.getPosition(); - slea.seek(offset); - String ret = readDecodedString(slea); - slea.seek(pos); - return ret; - } - - public static int readValue(LittleEndianAccessor lea) { - byte b = lea.readByte(); - if (b == -128) { - return lea.readInt(); - } else { - return b; - } - } - - public static float readFloatValue(LittleEndianAccessor lea) { - byte b = lea.readByte(); - if (b == -128) { - return lea.readFloat(); - } else { - return 0; - } - } -} \ No newline at end of file diff --git a/tools/MapleArrowFetcher/src/provider/wz/XMLDomMapleData.java b/tools/MapleArrowFetcher/src/provider/wz/XMLDomMapleData.java deleted file mode 100644 index 151a04c2fd..0000000000 --- a/tools/MapleArrowFetcher/src/provider/wz/XMLDomMapleData.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package provider.wz; - -import java.awt.Point; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.text.NumberFormat; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import provider.MapleData; -import provider.MapleDataEntity; -import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -public class XMLDomMapleData implements MapleData { - private Node node; - private File imageDataDir; - private NumberFormat nf; - - public XMLDomMapleData(FileInputStream fis, File imageDataDir) { - try { - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - Document document = documentBuilder.parse(fis); - this.node = document.getFirstChild(); - } catch (ParserConfigurationException e) { - throw new RuntimeException(e); - } catch (SAXException e) { - throw new RuntimeException(e); - } catch (IOException e) { - throw new RuntimeException(e); - } - this.imageDataDir = imageDataDir; - this.nf = NumberFormat.getInstance(Locale.FRANCE); - } - - private XMLDomMapleData(Node node) { - this.node = node; - this.nf = NumberFormat.getInstance(Locale.FRANCE); - } - - @Override - public MapleData getChildByPath(String path) { - String segments[] = path.split("/"); - if (segments[0].equals("..")) { - return ((MapleData) getParent()).getChildByPath(path.substring(path.indexOf("/") + 1)); - } - - Node myNode = node; - for (int x = 0; x < segments.length; x++) { - NodeList childNodes = myNode.getChildNodes(); - boolean foundChild = false; - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if (childNode.getNodeType() == Node.ELEMENT_NODE && childNode.getAttributes().getNamedItem("name").getNodeValue().equals(segments[x])) { - myNode = childNode; - foundChild = true; - break; - } - } - if (!foundChild) { - return null; - } - } - XMLDomMapleData ret = new XMLDomMapleData(myNode); - ret.imageDataDir = new File(imageDataDir, getName() + "/" + path).getParentFile(); - return ret; - } - - @Override - public List getChildren() { - List ret = new ArrayList(); - NodeList childNodes = node.getChildNodes(); - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if (childNode.getNodeType() == Node.ELEMENT_NODE) { - XMLDomMapleData child = new XMLDomMapleData(childNode); - child.imageDataDir = new File(imageDataDir, getName()); - ret.add(child); - } - } - return ret; - } - - @Override - public Object getData() { - NamedNodeMap attributes = node.getAttributes(); - MapleDataType type = getType(); - switch (type) { - case DOUBLE: - case FLOAT: - case INT: - case SHORT: { - String value = attributes.getNamedItem("value").getNodeValue(); - Number nval; - - try { - nval = nf.parse(value); - } - catch(java.text.ParseException pe) { - pe.printStackTrace(); - nval = 0.0f; - } - - switch (type) { - case DOUBLE: - return nval.doubleValue(); - case FLOAT: - return nval.floatValue(); - case INT: - return nval.intValue(); - case SHORT: - return nval.shortValue(); - default: - return null; - } - } - case STRING: - case UOL: { - String value = attributes.getNamedItem("value").getNodeValue(); - return value; - } - case VECTOR: { - String x = attributes.getNamedItem("x").getNodeValue(); - String y = attributes.getNamedItem("y").getNodeValue(); - return new Point(Integer.parseInt(x), Integer.parseInt(y)); - } - case CANVAS: { - String width = attributes.getNamedItem("width").getNodeValue(); - String height = attributes.getNamedItem("height").getNodeValue(); - return new FileStoredPngMapleCanvas(Integer.parseInt(width), Integer.parseInt(height), new File( - imageDataDir, getName() + ".png")); - } - default: - return null; - } - } - - @Override - public MapleDataType getType() { - String nodeName = node.getNodeName(); - if (nodeName.equals("imgdir")) { - return MapleDataType.PROPERTY; - } else if (nodeName.equals("canvas")) { - return MapleDataType.CANVAS; - } else if (nodeName.equals("convex")) { - return MapleDataType.CONVEX; - } else if (nodeName.equals("sound")) { - return MapleDataType.SOUND; - } else if (nodeName.equals("uol")) { - return MapleDataType.UOL; - } else if (nodeName.equals("double")) { - return MapleDataType.DOUBLE; - } else if (nodeName.equals("float")) { - return MapleDataType.FLOAT; - } else if (nodeName.equals("int")) { - return MapleDataType.INT; - } else if (nodeName.equals("short")) { - return MapleDataType.SHORT; - } else if (nodeName.equals("string")) { - return MapleDataType.STRING; - } else if (nodeName.equals("vector")) { - return MapleDataType.VECTOR; - } else if (nodeName.equals("null")) { - return MapleDataType.IMG_0x00; - } - return null; - } - - @Override - public MapleDataEntity getParent() { - Node parentNode = node.getParentNode(); - if (parentNode.getNodeType() == Node.DOCUMENT_NODE) { - return null; - } - XMLDomMapleData parentData = new XMLDomMapleData(parentNode); - parentData.imageDataDir = imageDataDir.getParentFile(); - return parentData; - } - - @Override - public String getName() { - return node.getAttributes().getNamedItem("name").getNodeValue(); - } - - @Override - public Iterator iterator() { - return getChildren().iterator(); - } -} diff --git a/tools/MapleArrowFetcher/src/provider/wz/XMLWZFile.java b/tools/MapleArrowFetcher/src/provider/wz/XMLWZFile.java deleted file mode 100644 index 2a7694fdc9..0000000000 --- a/tools/MapleArrowFetcher/src/provider/wz/XMLWZFile.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataProvider; - -public class XMLWZFile implements MapleDataProvider { - private File root; - private WZDirectoryEntry rootForNavigation; - - public XMLWZFile(File fileIn) { - root = fileIn; - rootForNavigation = new WZDirectoryEntry(fileIn.getName(), 0, 0, null); - fillMapleDataEntitys(root, rootForNavigation); - } - - private void fillMapleDataEntitys(File lroot, WZDirectoryEntry wzdir) { - for (File file : lroot.listFiles()) { - String fileName = file.getName(); - if (file.isDirectory() && !fileName.endsWith(".img")) { - WZDirectoryEntry newDir = new WZDirectoryEntry(fileName, 0, 0, wzdir); - wzdir.addDirectory(newDir); - fillMapleDataEntitys(file, newDir); - } else if (fileName.endsWith(".xml")) { - wzdir.addFile(new WZFileEntry(fileName.substring(0, fileName.length() - 4), 0, 0, wzdir)); - } - } - } - - @Override - public MapleData getData(String path) { - File dataFile = new File(root, path + ".xml"); - File imageDataDir = new File(root, path); - if (!dataFile.exists()) { - return null;//bitches - } - FileInputStream fis; - try { - fis = new FileInputStream(dataFile); - } catch (FileNotFoundException e) { - throw new RuntimeException("Datafile " + path + " does not exist in " + root.getAbsolutePath()); - } - final XMLDomMapleData domMapleData; - try { - domMapleData = new XMLDomMapleData(fis, imageDataDir.getParentFile()); - } finally { - try { - fis.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - return domMapleData; - } - - @Override - public MapleDataDirectoryEntry getRoot() { - return rootForNavigation; - } -} diff --git a/tools/MapleArrowFetcher/src/tools/DatabaseConnection.java b/tools/MapleArrowFetcher/src/tools/DatabaseConnection.java deleted file mode 100644 index b887280343..0000000000 --- a/tools/MapleArrowFetcher/src/tools/DatabaseConnection.java +++ /dev/null @@ -1,51 +0,0 @@ -package tools; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; - -/** - * @author Frz (Big Daddy) - * @author The Real Spookster - some modifications to this beautiful code - */ -public class DatabaseConnection { - private static String DB_URL = "jdbc:mysql://localhost:3306/cosmic"; - private static String DB_USER = "cosmic_server"; - private static String DB_PASS = "snailshell"; - - public static final int RETURN_GENERATED_KEYS = 1; - - private static ThreadLocal con = new ThreadLocalConnection(); - - public static Connection getConnection() { - Connection c = con.get(); - try { - c.getMetaData(); - } catch (SQLException e) { // connection is dead, therefore discard old object 5ever - con.remove(); - c = con.get(); - } - return c; - } - - private static class ThreadLocalConnection extends ThreadLocal { - - @Override - protected Connection initialValue() { - try { - Class.forName("com.mysql.jdbc.Driver"); // touch the mysql driver - } catch (ClassNotFoundException e) { - System.out.println("[SEVERE] SQL Driver Not Found. Consider death by clams."); - e.printStackTrace(); - return null; - } - try { - return DriverManager.getConnection(DB_URL, DB_USER, DB_PASS); - } catch (SQLException e) { - System.out.println("[SEVERE] Unable to make database connection."); - e.printStackTrace(); - return null; - } - } - } -} \ No newline at end of file diff --git a/tools/MapleArrowFetcher/src/tools/HexTool.java b/tools/MapleArrowFetcher/src/tools/HexTool.java deleted file mode 100644 index 8cc0c8aa84..0000000000 --- a/tools/MapleArrowFetcher/src/tools/HexTool.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools; - -import java.io.ByteArrayOutputStream; - -public class HexTool { - private static final char[] HEX = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; - - private static String toString(byte byteValue) { - int tmp = byteValue << 8; - char[] retstr = new char[]{HEX[(tmp >> 12) & 0x0F], HEX[(tmp >> 8) & 0x0F]}; - return String.valueOf(retstr); - } - - public static String toString(byte[] bytes) { - StringBuilder hexed = new StringBuilder(); - for (int i = 0; i < bytes.length; i++) { - hexed.append(toString(bytes[i])); - hexed.append(' '); - } - return hexed.substring(0, hexed.length() - 1); - } - - public static byte[] getByteArrayFromHexString(String hex) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - int nexti = 0; - int nextb = 0; - boolean highoc = true; - outer: - for (;;) { - int number = -1; - while (number == -1) { - if (nexti == hex.length()) { - break outer; - } - char chr = hex.charAt(nexti); - if (chr >= '0' && chr <= '9') { - number = chr - '0'; - } else if (chr >= 'a' && chr <= 'f') { - number = chr - 'a' + 10; - } else if (chr >= 'A' && chr <= 'F') { - number = chr - 'A' + 10; - } else { - number = -1; - } - nexti++; - } - if (highoc) { - nextb = number << 4; - highoc = false; - } else { - nextb |= number; - highoc = true; - baos.write(nextb); - } - } - return baos.toByteArray(); - } -} diff --git a/tools/MapleArrowFetcher/src/tools/Pair.java b/tools/MapleArrowFetcher/src/tools/Pair.java deleted file mode 100644 index b127e71110..0000000000 --- a/tools/MapleArrowFetcher/src/tools/Pair.java +++ /dev/null @@ -1,121 +0,0 @@ -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 ~ 2010 Patrick Huy -Matthias Butz -Jan Christian Meyer - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License version 3 -as published by the Free Software Foundation. You may not use, modify -or distribute this program under any other version of the -GNU Affero General Public License. - -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 . - */ -package tools; - -/** - * Represents a pair of values. - * - * @author Frz - * @since Revision 333 - * @version 1.0 - * - * @param The type of the left value. - * @param The type of the right value. - */ -public class Pair { - - public E left; - public F right; - - /** - * Class constructor - pairs two objects together. - * - * @param left The left object. - * @param right The right object. - */ - public Pair(E left, F right) { - this.left = left; - this.right = right; - } - - /** - * Gets the left value. - * - * @return The left value. - */ - public E getLeft() { - return left; - } - - /** - * Gets the right value. - * - * @return The right value. - */ - public F getRight() { - return right; - } - - /** - * Turns the pair into a string. - * - * @return Each value of the pair as a string joined with a colon. - */ - @Override - public String toString() { - return left.toString() + ":" + right.toString(); - } - - /** - * Gets the hash code of this pair. - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((left == null) ? 0 : left.hashCode()); - result = prime * result + ((right == null) ? 0 : right.hashCode()); - return result; - } - - /** - * Checks to see if two pairs are equal. - */ - @SuppressWarnings("unchecked") - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Pair other = (Pair) obj; - if (left == null) { - if (other.left != null) { - return false; - } - } else if (!left.equals(other.left)) { - return false; - } - if (right == null) { - if (other.right != null) { - return false; - } - } else if (!right.equals(other.right)) { - return false; - } - return true; - } -} \ No newline at end of file diff --git a/tools/MapleArrowFetcher/src/tools/data/input/ByteArrayByteStream.java b/tools/MapleArrowFetcher/src/tools/data/input/ByteArrayByteStream.java deleted file mode 100644 index eac7de21ea..0000000000 --- a/tools/MapleArrowFetcher/src/tools/data/input/ByteArrayByteStream.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import tools.HexTool; - -public class ByteArrayByteStream implements SeekableInputStreamBytestream { - private int pos = 0; - private long bytesRead = 0; - private byte[] arr; - - public ByteArrayByteStream(byte[] arr) { - this.arr = arr; - } - - @Override - public long getPosition() { - return pos; - } - - @Override - public void seek(long offset) throws IOException { - pos = (int) offset; - } - - @Override - public long getBytesRead() { - return bytesRead; - } - - @Override - public int readByte() { - bytesRead++; - return ((int) arr[pos++]) & 0xFF; - } - - @Override - public String toString() { - String nows = "kevintjuh93 pwns";//I lol'd - if (arr.length - pos > 0) { - byte[] now = new byte[arr.length - pos]; - System.arraycopy(arr, pos, now, 0, arr.length - pos); - nows = HexTool.toString(now); - } - return "All: " + HexTool.toString(arr) + "\nNow: " + nows; - } - - @Override - public long available() { - return arr.length - pos; - } -} diff --git a/tools/MapleArrowFetcher/src/tools/data/input/ByteInputStream.java b/tools/MapleArrowFetcher/src/tools/data/input/ByteInputStream.java deleted file mode 100644 index 107f71843e..0000000000 --- a/tools/MapleArrowFetcher/src/tools/data/input/ByteInputStream.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -/** - * Represents an abstract stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public interface ByteInputStream { - int readByte(); - long getBytesRead(); - long available(); -} diff --git a/tools/MapleArrowFetcher/src/tools/data/input/GenericLittleEndianAccessor.java b/tools/MapleArrowFetcher/src/tools/data/input/GenericLittleEndianAccessor.java deleted file mode 100644 index d08a9b8374..0000000000 --- a/tools/MapleArrowFetcher/src/tools/data/input/GenericLittleEndianAccessor.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.awt.Point; -import java.io.ByteArrayOutputStream; - -/** - * Provides a generic interface to a Little Endian stream of bytes. - * - * @version 1.0 - * @author Frz - * @since Revision 323 - */ -public class GenericLittleEndianAccessor implements LittleEndianAccessor { - private ByteInputStream bs; - - /** - * Class constructor - Wraps the accessor around a stream of bytes. - * - * @param bs The byte stream to wrap the accessor around. - */ - public GenericLittleEndianAccessor(ByteInputStream bs) { - this.bs = bs; - } - - /** - * Read a single byte from the stream. - * - * @return The byte read. - * @see tools.data.input.ByteInputStream#readByte - */ - @Override - public byte readByte() { - return (byte) bs.readByte(); - } - - /** - * Reads an integer from the stream. - * - * @return The integer read. - */ - @Override - public int readInt() { - return bs.readByte() + (bs.readByte() << 8) + (bs.readByte() << 16) + (bs.readByte() << 24); - } - - /** - * Reads a short integer from the stream. - * - * @return The short read. - */ - @Override - public short readShort() { - return (short) (bs.readByte() + (bs.readByte() << 8)); - } - - /** - * Reads a single character from the stream. - * - * @return The character read. - */ - @Override - public char readChar() { - return (char) readShort(); - } - - /** - * Reads a long integer from the stream. - * - * @return The long integer read. - */ - @Override - public long readLong() { - long byte1 = bs.readByte(); - long byte2 = bs.readByte(); - long byte3 = bs.readByte(); - long byte4 = bs.readByte(); - long byte5 = bs.readByte(); - long byte6 = bs.readByte(); - long byte7 = bs.readByte(); - long byte8 = bs.readByte(); - return (byte8 << 56) + (byte7 << 48) + (byte6 << 40) + (byte5 << 32) + (byte4 << 24) + (byte3 << 16) + (byte2 << 8) + byte1; - } - - /** - * Reads a floating point integer from the stream. - * - * @return The float-type integer read. - */ - @Override - public float readFloat() { - return Float.intBitsToFloat(readInt()); - } - - /** - * Reads a double-precision integer from the stream. - * - * @return The double-type integer read. - */ - @Override - public double readDouble() { - return Double.longBitsToDouble(readLong()); - } - - /** - * Reads an ASCII string from the stream with length n. - * - * @param n Number of characters to read. - * @return The string read. - */ - public final String readAsciiString(int n) { - char ret[] = new char[n]; - for (int x = 0; x < n; x++) { - ret[x] = (char) readByte(); - } - return String.valueOf(ret); - } - - /** - * Reads a null-terminated string from the stream. - * - * @return The string read. - */ - public final String readNullTerminatedAsciiString() { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte b; - while (true) { - b = readByte(); - if (b == 0) { - break; - } - baos.write(b); - } - byte[] buf = baos.toByteArray(); - char[] chrBuf = new char[buf.length]; - for (int x = 0; x < buf.length; x++) { - chrBuf[x] = (char) buf[x]; - } - return String.valueOf(chrBuf); - } - - /** - * Gets the number of bytes read from the stream so far. - * - * @return A long integer representing the number of bytes read. - * @see tools.data.input.ByteInputStream#getBytesRead() - */ - public long getBytesRead() { - return bs.getBytesRead(); - } - - /** - * Reads a MapleStory convention lengthed ASCII string. - * This consists of a short integer telling the length of the string, - * then the string itself. - * - * @return The string read. - */ - @Override - public String readMapleAsciiString() { - return readAsciiString(readShort()); - } - - /** - * Reads num bytes off the stream. - * - * @param num The number of bytes to read. - * @return An array of bytes with the length of num - */ - @Override - public byte[] read(int num) { - byte[] ret = new byte[num]; - for (int x = 0; x < num; x++) { - ret[x] = readByte(); - } - return ret; - } - - /** - * Reads a MapleStory Position information. - * This consists of 2 short integer. - * - * @return The Position read. - */ - @Override - public final Point readPos() { - final int x = readShort(); - final int y = readShort(); - return new Point(x, y); - } - - /** - * Skips the current position of the stream num bytes ahead. - * - * @param num Number of bytes to skip. - */ - @Override - public void skip(int num) { - for (int x = 0; x < num; x++) { - readByte(); - } - } - - /** - * @see tools.data.input.ByteInputStream#available - */ - @Override - public long available() { - return bs.available(); - } - - /** - * @see java.lang.Object#toString - */ - @Override - public String toString() { - return bs.toString(); - } -} \ No newline at end of file diff --git a/tools/MapleArrowFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java b/tools/MapleArrowFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java deleted file mode 100644 index fdd147d796..0000000000 --- a/tools/MapleArrowFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; - -/** - * Provides an abstract accessor to a generic Little Endian byte stream. This - * accessor is seekable. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - * @see tools.data.input.GenericLittleEndianAccessor - */ -public class GenericSeekableLittleEndianAccessor extends GenericLittleEndianAccessor implements SeekableLittleEndianAccessor { - private SeekableInputStreamBytestream bs; - - /** - * Class constructor - * Provide a seekable input stream to wrap this object around. - * - * @param bs The byte stream to wrap this around. - */ - public GenericSeekableLittleEndianAccessor(SeekableInputStreamBytestream bs) { - super(bs); - this.bs = bs; - } - - /** - * Seek the pointer to offset - * - * @param offset The offset to seek to. - * @see tools.data.input.SeekableInputStreamBytestream#seek - */ - @Override - public void seek(long offset) { - try { - bs.seek(offset); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("Seek failed " + e); - } - } - - /** - * Get the current position of the pointer. - * - * @return The current position of the pointer as a long integer. - * @see tools.data.input.SeekableInputStreamBytestream#getPosition - */ - @Override - public long getPosition() { - try { - return bs.getPosition(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("getPosition failed" + e); - return -1; - } - } - - /** - * Skip num number of bytes in the stream. - * - * @param num The number of bytes to skip. - */ - @Override - public void skip(int num) { - seek(getPosition() + num); - } -} diff --git a/tools/MapleArrowFetcher/src/tools/data/input/InputStreamByteStream.java b/tools/MapleArrowFetcher/src/tools/data/input/InputStreamByteStream.java deleted file mode 100644 index 70aef3489f..0000000000 --- a/tools/MapleArrowFetcher/src/tools/data/input/InputStreamByteStream.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Provides an abstract wrapper to a stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class InputStreamByteStream implements ByteInputStream { - private InputStream is; - private long read = 0; - - /** - * Class constructor. - * Provide an input stream to wrap this around. - * - * @param is The input stream to wrap this object around. - */ - public InputStreamByteStream(InputStream is) { - this.is = is; - } - - /** - * Reads the next byte from the stream. - * - * @return Then next byte in the stream. - */ - @Override - public int readByte() { - int temp; - try { - temp = is.read(); - if (temp == -1) { - throw new RuntimeException("EOF"); - } - read++; - return temp; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - /** - * Gets the number of bytes read from the stream. - * - * @return The number of bytes read as a long integer. - */ - @Override - public long getBytesRead() { - return read; - } - - /** - * Returns the number of bytes left in the stream. - * - * @return The number of bytes available for reading as a long integer. - */ - @Override - public long available() { - try { - return is.available(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("ERROR" + e); - return 0; - } - } -} diff --git a/tools/MapleArrowFetcher/src/tools/data/input/LittleEndianAccessor.java b/tools/MapleArrowFetcher/src/tools/data/input/LittleEndianAccessor.java deleted file mode 100644 index f991dbf537..0000000000 --- a/tools/MapleArrowFetcher/src/tools/data/input/LittleEndianAccessor.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.awt.Point; - -/** - * @author Frz - */ -public interface LittleEndianAccessor { - byte readByte(); - char readChar(); - short readShort(); - int readInt(); - Point readPos(); - long readLong(); - void skip(int num); - byte[] read(int num); - float readFloat(); - double readDouble(); - String readAsciiString(int n); - String readNullTerminatedAsciiString(); - String readMapleAsciiString(); - long getBytesRead(); - long available(); -} diff --git a/tools/MapleArrowFetcher/src/tools/data/input/RandomAccessByteStream.java b/tools/MapleArrowFetcher/src/tools/data/input/RandomAccessByteStream.java deleted file mode 100644 index c0004be17f..0000000000 --- a/tools/MapleArrowFetcher/src/tools/data/input/RandomAccessByteStream.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import java.io.RandomAccessFile; - -/** - * Provides an abstract layer to a byte stream. This layer can be accessed - * randomly. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class RandomAccessByteStream implements SeekableInputStreamBytestream { - private RandomAccessFile raf; - private long read = 0; - - public RandomAccessByteStream(RandomAccessFile raf) { - super(); - this.raf = raf; - } - - @Override - public int readByte() { - int temp; - try { - temp = raf.read(); - if (temp == -1) { - throw new RuntimeException("EOF"); - } - read++; - return temp; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public void seek(long offset) throws IOException { - raf.seek(offset); - } - - @Override - public long getPosition() throws IOException { - return raf.getFilePointer(); - } - - @Override - public long getBytesRead() { - return read; - } - - @Override - public long available() { - try { - return raf.length() - raf.getFilePointer(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("ERROR " + e); - return 0; - } - } -} diff --git a/tools/MapleArrowFetcher/src/tools/data/input/SeekableInputStreamBytestream.java b/tools/MapleArrowFetcher/src/tools/data/input/SeekableInputStreamBytestream.java deleted file mode 100644 index f4922dc876..0000000000 --- a/tools/MapleArrowFetcher/src/tools/data/input/SeekableInputStreamBytestream.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; - -/** - * Provides an abstract interface to a stream of bytes. This stream can be - * seeked. - * - * @author Frz - * @version 1.0 - * @since 299 - */ -public interface SeekableInputStreamBytestream extends ByteInputStream { - /** - * Seeks the stream by the specified offset. - * - * @param offset - * Number of bytes to seek. - * @throws IOException - */ - void seek(long offset) throws IOException; - - /** - * Gets the current position of the stream. - * - * @return The stream position as a long integer. - * @throws IOException - */ - long getPosition() throws IOException; -} diff --git a/tools/MapleArrowFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java b/tools/MapleArrowFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java deleted file mode 100644 index 16b2317f7a..0000000000 --- a/tools/MapleArrowFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -public interface SeekableLittleEndianAccessor extends LittleEndianAccessor { - void seek(long offset); - long getPosition(); -} diff --git a/tools/MapleArrowFetcher/src/tools/data/output/BAOSByteOutputStream.java b/tools/MapleArrowFetcher/src/tools/data/output/BAOSByteOutputStream.java deleted file mode 100644 index 80cbc9301e..0000000000 --- a/tools/MapleArrowFetcher/src/tools/data/output/BAOSByteOutputStream.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.io.ByteArrayOutputStream; - -/** - * Uses a byte array to output a stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 352 - */ -class BAOSByteOutputStream implements ByteOutputStream { - private ByteArrayOutputStream baos; - - /** - * Class constructor - Wraps the stream around a Java BAOS. - * - * @param baos The ByteArrayOutputStream to wrap this around. - */ - BAOSByteOutputStream(ByteArrayOutputStream baos) { - super(); - this.baos = baos; - } - - /** - * Writes a byte to the stream. - * - * @param b The byte to write to the stream. - * @see tools.data.output.ByteOutputStream#writeByte(byte) - */ - @Override - public void writeByte(byte b) { - baos.write(b); - } -} diff --git a/tools/MapleArrowFetcher/src/tools/data/output/ByteOutputStream.java b/tools/MapleArrowFetcher/src/tools/data/output/ByteOutputStream.java deleted file mode 100644 index 0df7ca7753..0000000000 --- a/tools/MapleArrowFetcher/src/tools/data/output/ByteOutputStream.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -/** - * Provides an interface to an output stream of bytes. - * - * @author Frz - * @since Revision 323 - * @version 1.0 - */ -interface ByteOutputStream { - /** - * Writes a byte to the stream. - * - * @param b The byte to write. - */ - void writeByte(byte b); -} diff --git a/tools/MapleArrowFetcher/src/tools/data/output/GenericLittleEndianWriter.java b/tools/MapleArrowFetcher/src/tools/data/output/GenericLittleEndianWriter.java deleted file mode 100644 index e804fd8000..0000000000 --- a/tools/MapleArrowFetcher/src/tools/data/output/GenericLittleEndianWriter.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.awt.Point; -import java.nio.charset.Charset; - -/** - * Provides a generic writer of a little-endian sequence of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class GenericLittleEndianWriter implements LittleEndianWriter { - private static Charset ASCII = Charset.forName("US-ASCII"); - private ByteOutputStream bos; - - /** - * Class constructor - Protected to prevent instantiation with no arguments. - */ - protected GenericLittleEndianWriter() { - // Blah! - } - - /** - * Sets the byte-output stream for this instance of the object. - * - * @param bos The new output stream to set. - */ - void setByteOutputStream(ByteOutputStream bos) { - this.bos = bos; - } - - /** - * Write an array of bytes to the stream. - * - * @param b The bytes to write. - */ - @Override - public void write(byte[] b) { - for (int x = 0; x < b.length; x++) { - bos.writeByte(b[x]); - } - } - - /** - * Write a byte to the stream. - * - * @param b The byte to write. - */ - @Override - public void write(byte b) { - bos.writeByte(b); - } - - /** - * Write a byte in integer form to the stream. - * - * @param b The byte as an Integer to write. - */ - @Override - public void write(int b) { - bos.writeByte((byte) b); - } - - @Override - public void skip(int b) { - write(new byte[b]); - } - - /** - * Write a short integer to the stream. - * - * @param i The short integer to write. - */ - @Override - public void writeShort(int i) { - bos.writeByte((byte) (i & 0xFF)); - bos.writeByte((byte) ((i >>> 8) & 0xFF)); - } - - /** - * Writes an integer to the stream. - * - * @param i The integer to write. - */ - @Override - public void writeInt(int i) { - bos.writeByte((byte) (i & 0xFF)); - bos.writeByte((byte) ((i >>> 8) & 0xFF)); - bos.writeByte((byte) ((i >>> 16) & 0xFF)); - bos.writeByte((byte) ((i >>> 24) & 0xFF)); - } - - /** - * Writes an ASCII string the the stream. - * - * @param s The ASCII string to write. - */ - @Override - public void writeAsciiString(String s) { - write(s.getBytes(ASCII)); - } - - /** - * Writes a maple-convention ASCII string to the stream. - * - * @param s The ASCII string to use maple-convention to write. - */ - @Override - public void writeMapleAsciiString(String s) { - writeShort((short) s.length()); - writeAsciiString(s); - } - - /** - * Writes a null-terminated ASCII string to the stream. - * - * @param s The ASCII string to write. - */ - @Override - public void writeNullTerminatedAsciiString(String s) { - writeAsciiString(s); - write(0); - } - - /** - * Write a long integer to the stream. - * @param l The long integer to write. - */ - @Override - public void writeLong(long l) { - bos.writeByte((byte) (l & 0xFF)); - bos.writeByte((byte) ((l >>> 8) & 0xFF)); - bos.writeByte((byte) ((l >>> 16) & 0xFF)); - bos.writeByte((byte) ((l >>> 24) & 0xFF)); - bos.writeByte((byte) ((l >>> 32) & 0xFF)); - bos.writeByte((byte) ((l >>> 40) & 0xFF)); - bos.writeByte((byte) ((l >>> 48) & 0xFF)); - bos.writeByte((byte) ((l >>> 56) & 0xFF)); - } - - /** - * Writes a 2D 4 byte position information - * - * @param s The Point position to write. - */ - @Override - public void writePos(Point s) { - writeShort(s.x); - writeShort(s.y); - } - - /** - * Writes a boolean true ? 1 : 0 - * - * @param b The boolean to write. - */ - @Override - public void writeBool(final boolean b) { - write(b ? 1 : 0); - } -} diff --git a/tools/MapleArrowFetcher/src/tools/data/output/LittleEndianWriter.java b/tools/MapleArrowFetcher/src/tools/data/output/LittleEndianWriter.java deleted file mode 100644 index f17bd7c72e..0000000000 --- a/tools/MapleArrowFetcher/src/tools/data/output/LittleEndianWriter.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package tools.data.output; - -import java.awt.Point; - -/** - * Provides an interface to a writer class that writes a little-endian sequence - * of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public interface LittleEndianWriter { - - /** - * Write an array of bytes to the sequence. - * - * @param b The bytes to write. - */ - public void write(byte b[]); - - /** - * Write a byte to the sequence. - * - * @param b The byte to write. - */ - public void write(byte b); - - /** - * Write a byte in integer form to the sequence. - * - * @param b The byte as an Integer to write. - */ - public void write(int b); - - public void skip(int b); - - /** - * Writes an integer to the sequence. - * - * @param i The integer to write. - */ - public void writeInt(int i); - - /** - * Write a short integer to the sequence. - * - * @param s The short integer to write. - */ - public void writeShort(int s); - - /** - * Write a long integer to the sequence. - * - * @param l The long integer to write. - */ - public void writeLong(long l); - - /** - * Writes an ASCII string the the sequence. - * - * @param s The ASCII string to write. - */ - void writeAsciiString(String s); - - /** - * Writes a null-terminated ASCII string to the sequence. - * - * @param s The ASCII string to write. - */ - void writeNullTerminatedAsciiString(String s); - - /** - * Writes a maple-convention ASCII string to the sequence. - * - * @param s The ASCII string to use maple-convention to write. - */ - void writeMapleAsciiString(String s); - - /** - * Writes a 2D 4 byte position information - * - * @param s The Point position to write. - */ - void writePos(Point s); - - /** - * Writes a boolean true ? 1 : 0 - * - * @param b The boolean to write. - */ - void writeBool(final boolean b); -} diff --git a/tools/MapleArrowFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java b/tools/MapleArrowFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java deleted file mode 100644 index b02365ec62..0000000000 --- a/tools/MapleArrowFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.io.ByteArrayOutputStream; -import tools.HexTool; - -/** - * Writes a maplestory-packet little-endian stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 352 - */ -public class MaplePacketLittleEndianWriter extends GenericLittleEndianWriter { - private ByteArrayOutputStream baos; - - /** - * Constructor - initializes this stream with a default size. - */ - public MaplePacketLittleEndianWriter() { - this(32); - } - - /** - * Constructor - initializes this stream with size size. - * - * @param size The size of the underlying stream. - */ - public MaplePacketLittleEndianWriter(int size) { - this.baos = new ByteArrayOutputStream(size); - setByteOutputStream(new BAOSByteOutputStream(baos)); - } - - /** - * Gets a MaplePacket instance representing this - * sequence of bytes. - * - * @return A MaplePacket with the bytes in this stream. - */ - public byte[] getPacket() { - return baos.toByteArray(); - } - - /** - * Changes this packet into a human-readable hexadecimal stream of bytes. - * - * @return This packet as hex digits. - */ - @Override - public String toString() { - return HexTool.toString(baos.toByteArray()); - } -} From fdd2ef7b3a8d36425d982f4d9f2c768519fc7413 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 18:28:09 +0200 Subject: [PATCH 04/36] Move MapleBossHpBarFetcher to main module --- .../tools/mapletools/BossHpBarFetcher.java | 190 ++++++++++++++ tools/MapleBossHpBarFetcher/lib/Report.txt | 14 - .../MapleBossHpBarFetcher.java | 240 ------------------ 3 files changed, 190 insertions(+), 254 deletions(-) create mode 100644 src/main/java/tools/mapletools/BossHpBarFetcher.java delete mode 100644 tools/MapleBossHpBarFetcher/lib/Report.txt delete mode 100644 tools/MapleBossHpBarFetcher/src/maplebosshpbarfetcher/MapleBossHpBarFetcher.java diff --git a/src/main/java/tools/mapletools/BossHpBarFetcher.java b/src/main/java/tools/mapletools/BossHpBarFetcher.java new file mode 100644 index 0000000000..a08d0cfdcb --- /dev/null +++ b/src/main/java/tools/mapletools/BossHpBarFetcher.java @@ -0,0 +1,190 @@ +package tools.mapletools; + +import provider.wz.WZFiles; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +/** + * @author RonanLana + *

+ * This application parses the Mob.wz file inputted and generates a report showing + * all cases where a mob has a boss HP bar and doesn't have a "boss" label. + *

+ * Running it should generate a report file under "lib" folder with the search results. + */ +public class BossHpBarFetcher { + private static final String OUTPUT_FILE_NAME = "boss_hp_bar_report.txt"; + private static final int INITIAL_STRING_LENGTH = 50; + private static final List missingBosses = new ArrayList<>(); + + private static BufferedReader bufferedReader = null; + private static byte status = 0; + private static int curBoss; + private static int curHpTag; + private static int curMobId; + + private static String getName(String token) { + int i, j; + char[] dest; + String d; + + i = token.lastIndexOf("name"); + i = token.indexOf("\"", i) + 1; //lower bound of the string + j = token.indexOf("\"", i); //upper bound + + dest = new char[INITIAL_STRING_LENGTH]; + token.getChars(i, j, dest, 0); + + d = new String(dest); + return (d.trim()); + } + + private static String getValue(String token) { + int i, j; + char[] dest; + String d; + + i = token.lastIndexOf("value"); + i = token.indexOf("\"", i) + 1; //lower bound of the string + j = token.indexOf("\"", i); //upper bound + + dest = new char[INITIAL_STRING_LENGTH]; + token.getChars(i, j, dest, 0); + + d = new String(dest); + return (d.trim()); + } + + private static void forwardCursor(int st) { + String line = null; + + try { + while (status >= st && (line = bufferedReader.readLine()) != null) { + simpleToken(line); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void simpleToken(String token) { + if (token.contains("/imgdir")) { + status -= 1; + } else if (token.contains("imgdir")) { + status += 1; + } + } + + private static void readMobLabel(String token) { + String name = getName(token); + String value = getValue(token); + + switch (name) { + case "boss" -> curBoss = Integer.parseInt(value); + case "hpTagColor" -> curHpTag = Integer.parseInt(value); + } + } + + private static void processMobData() { + if (curHpTag != Integer.MAX_VALUE && curBoss == Integer.MAX_VALUE) { + missingBosses.add(curMobId); + } + } + + private static void translateToken(String token) { + String d; + + if (token.contains("/imgdir")) { + status -= 1; + + if (status == 1) { + processMobData(); + } + } else if (token.contains("imgdir")) { + if (status == 0) { + String mobText = getName(token); + curMobId = Integer.parseInt(mobText.substring(0, mobText.lastIndexOf('.'))); + } else if (status == 1) { //getting info + d = getName(token); + + if (!d.contentEquals("info")) { + forwardCursor(status); + } else { + curBoss = Integer.MAX_VALUE; + curHpTag = Integer.MAX_VALUE; + } + } else if (status == 2) { + forwardCursor(status); + } + + status += 1; + } else { + if (status == 2) { //info tags + readMobLabel(token); + } + } + } + + private static void readBossHpBarData() throws IOException { + String line; + + final File mobDirectory = WZFiles.MOB.getFile(); + for (File file : mobDirectory.listFiles()) { + if (file.isFile()) { + InputStreamReader fileReader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8); + bufferedReader = new BufferedReader(fileReader); + + while ((line = bufferedReader.readLine()) != null) { + translateToken(line); + } + + bufferedReader.close(); + fileReader.close(); + } + } + } + + private static void printReportFileHeader(PrintWriter writer) { + writer.println(" # Report File autogenerated from the MapleBossHpBarFetcher feature by Ronan Lana."); + writer.println(" # Generated data takes into account several data info from the server-side WZ.xmls."); + writer.println(); + } + + private static void printReportFileResults(PrintWriter writer) { + for (int mobId : missingBosses) { + writer.println("Missing 'isBoss' on id: " + mobId); + } + } + + private static void reportBossHpBarData() { + // This will reference one line at a time + + try { + System.out.println("Reading WZs..."); + readBossHpBarData(); + + System.out.println("Reporting results..."); + final PrintWriter printWriter = new PrintWriter(ToolConstants.getOutputFile(OUTPUT_FILE_NAME), StandardCharsets.UTF_8); + + printReportFileHeader(printWriter); + printReportFileResults(printWriter); + + printWriter.close(); + System.out.println("Done!"); + } catch (FileNotFoundException ex) { + System.out.println("Unable to open mob file."); + } catch (IOException ex) { + System.out.println("Error reading mob file."); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + reportBossHpBarData(); + } + +} diff --git a/tools/MapleBossHpBarFetcher/lib/Report.txt b/tools/MapleBossHpBarFetcher/lib/Report.txt deleted file mode 100644 index b2f432b4c2..0000000000 --- a/tools/MapleBossHpBarFetcher/lib/Report.txt +++ /dev/null @@ -1,14 +0,0 @@ - # Report File autogenerated from the MapleBossHpBarFetcher feature by Ronan Lana. - # Generated data takes into account several data info from the server-side WZ.xmls. - -Missing 'isBoss' on id: 3300005 -Missing 'isBoss' on id: 3300006 -Missing 'isBoss' on id: 3300007 -Missing 'isBoss' on id: 8820010 -Missing 'isBoss' on id: 8820011 -Missing 'isBoss' on id: 8820012 -Missing 'isBoss' on id: 8820013 -Missing 'isBoss' on id: 8820014 -Missing 'isBoss' on id: 8830003 -Missing 'isBoss' on id: 8830010 -Missing 'isBoss' on id: 9001008 diff --git a/tools/MapleBossHpBarFetcher/src/maplebosshpbarfetcher/MapleBossHpBarFetcher.java b/tools/MapleBossHpBarFetcher/src/maplebosshpbarfetcher/MapleBossHpBarFetcher.java deleted file mode 100644 index 1763af8286..0000000000 --- a/tools/MapleBossHpBarFetcher/src/maplebosshpbarfetcher/MapleBossHpBarFetcher.java +++ /dev/null @@ -1,240 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package maplebosshpbarfetcher; - -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.sql.Connection; -import java.util.LinkedList; -import java.util.List; -import java.io.File; - -/** - * - * @author RonanLana - - This application parses the Mob.wz file inputted and generates a report showing - all cases where a mob has a boss HP bar and doesn't have a "boss" label. - - Running it should generate a report file under "lib" folder with the search results. - - */ -public class MapleBossHpBarFetcher { - static String mobDirectory = "../../wz/Mob.wz/"; - static String newFile = "lib/Report.txt"; - - static Connection con = null; - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static int initialLength = 200; - static int initialStringLength = 50; - - static byte status = 0; - - static int curBoss; - static int curHpTag; - static int curMobId; - - static List missingBosses = new LinkedList<>(); - - private static String getName(String token) { - int i, j; - char[] dest; - String d; - - i = token.lastIndexOf("name"); - i = token.indexOf("\"", i) + 1; //lower bound of the string - j = token.indexOf("\"", i); //upper bound - - dest = new char[initialStringLength]; - token.getChars(i, j, dest, 0); - - d = new String(dest); - return(d.trim()); - } - - private static String getValue(String token) { - int i, j; - char[] dest; - String d; - - i = token.lastIndexOf("value"); - i = token.indexOf("\"", i) + 1; //lower bound of the string - j = token.indexOf("\"", i); //upper bound - - dest = new char[initialStringLength]; - token.getChars(i, j, dest, 0); - - d = new String(dest); - return(d.trim()); - } - - private static void forwardCursor(int st) { - String line = null; - - try { - while(status >= st && (line = bufferedReader.readLine()) != null) { - simpleToken(line); - } - } - catch(Exception e) { - e.printStackTrace(); - } - } - - private static void simpleToken(String token) { - if(token.contains("/imgdir")) { - status -= 1; - } - else if(token.contains("imgdir")) { - status += 1; - } - } - - private static void readMobLabel(String token) { - String name = getName(token); - String value = getValue(token); - - switch(name) { - case "boss": - curBoss = Integer.parseInt(value); - break; - - case "hpTagColor": - curHpTag = Integer.parseInt(value); - break; - } - } - - private static void processMobData() { - if(curHpTag != Integer.MAX_VALUE && curBoss == Integer.MAX_VALUE) { - missingBosses.add(curMobId); - } - } - - private static void translateToken(String token) { - String d; - - if(token.contains("/imgdir")) { - status -= 1; - - if(status == 1) { - processMobData(); - } - } - else if(token.contains("imgdir")) { - if(status == 0) { - String mobText = getName(token); - curMobId = Integer.valueOf(mobText.substring(0, mobText.lastIndexOf('.'))); - } - else if(status == 1) { //getting info - d = getName(token); - - if(!d.contentEquals("info")) { - forwardCursor(status); - } else { - curBoss = Integer.MAX_VALUE; - curHpTag = Integer.MAX_VALUE; - } - } - else if(status == 2) { - forwardCursor(status); - } - - status += 1; - } - else { - if(status == 2) { //info tags - readMobLabel(token); - } - } - } - - private static void readBossHpBarData() throws IOException { - String line; - - File folder = new File(mobDirectory); - for(File file : folder.listFiles()) { - if (file.isFile()) { - fileReader = new InputStreamReader(new FileInputStream(file), "UTF-8"); - bufferedReader = new BufferedReader(fileReader); - - while((line = bufferedReader.readLine()) != null) { - translateToken(line); - } - - bufferedReader.close(); - fileReader.close(); - } - } - } - - private static void printReportFileHeader() { - printWriter.println(" # Report File autogenerated from the MapleBossHpBarFetcher feature by Ronan Lana."); - printWriter.println(" # Generated data takes into account several data info from the server-side WZ.xmls."); - printWriter.println(); - } - - private static void printReportFileResults() { - for(Integer mid : missingBosses) { - printWriter.println("Missing 'isBoss' on id: " + mid); - } - } - - private static void ReportBossHpBarData() { - // This will reference one line at a time - - try { - System.out.println("Reading WZs..."); - readBossHpBarData(); - - System.out.println("Reporting results..."); - printWriter = new PrintWriter(newFile, "UTF-8"); - - printReportFileHeader(); - printReportFileResults(); - - printWriter.close(); - System.out.println("Done!"); - } - - catch(FileNotFoundException ex) { - System.out.println("Unable to open mob file."); - } - catch(IOException ex) { - System.out.println("Error reading mob file."); - } - - catch(Exception e) { - e.printStackTrace(); - } - } - - public static void main(String[] args) { - ReportBossHpBarData(); - } - -} From da66e7614d9e0bb383f1bdde0d6b2e01ba29c839 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 19:20:25 +0200 Subject: [PATCH 05/36] Move MapleCashCosmeticsChecker to main module --- src/main/java/provider/wz/WZFiles.java | 8 +- .../mapletools/CashCosmeticsChecker.java | 437 +++++++++--------- .../java/tools/mapletools/ToolConstants.java | 4 + .../MapleCashCosmeticsChecker/lib/result.txt | 213 --------- .../src/maplecashcosmeticschecker/Pair.java | 121 ----- tools/input/.gitignore | 2 + .../care => input/cosmetics}/amoria/face.txt | 0 .../care => input/cosmetics}/amoria/hair.txt | 0 .../care => input/cosmetics}/ariant/face.txt | 0 .../care => input/cosmetics}/ariant/hair.txt | 0 .../lib/care => input/cosmetics}/cbd/face.txt | 0 .../lib/care => input/cosmetics}/cbd/hair.txt | 0 .../lib => input/cosmetics}/colors.txt | 0 .../care => input/cosmetics}/henesys/face.txt | 0 .../care => input/cosmetics}/henesys/hair.txt | 0 .../cosmetics}/kerning_city/face.txt | 0 .../cosmetics}/kerning_city/hair.txt | 0 .../cosmetics}/ludibrium/face.txt | 0 .../cosmetics}/ludibrium/hair.txt | 0 .../care => input/cosmetics}/mu_lung/face.txt | 0 .../care => input/cosmetics}/mu_lung/hair.txt | 0 .../lib/care => input/cosmetics}/nlc/face.txt | 0 .../lib/care => input/cosmetics}/nlc/hair.txt | 0 .../care => input/cosmetics}/orbis/face.txt | 0 .../care => input/cosmetics}/orbis/hair.txt | 0 .../care => input/cosmetics}/showa/face.txt | 0 .../care => input/cosmetics}/showa/hair.txt | 0 27 files changed, 220 insertions(+), 565 deletions(-) rename tools/MapleCashCosmeticsChecker/src/maplecashcosmeticschecker/MapleCashCosmeticsChecker.java => src/main/java/tools/mapletools/CashCosmeticsChecker.java (74%) delete mode 100644 tools/MapleCashCosmeticsChecker/lib/result.txt delete mode 100644 tools/MapleCashCosmeticsChecker/src/maplecashcosmeticschecker/Pair.java rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/amoria/face.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/amoria/hair.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/ariant/face.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/ariant/hair.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/cbd/face.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/cbd/hair.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib => input/cosmetics}/colors.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/henesys/face.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/henesys/hair.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/kerning_city/face.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/kerning_city/hair.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/ludibrium/face.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/ludibrium/hair.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/mu_lung/face.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/mu_lung/hair.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/nlc/face.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/nlc/hair.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/orbis/face.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/orbis/hair.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/showa/face.txt (100%) rename tools/{MapleCashCosmeticsChecker/lib/care => input/cosmetics}/showa/hair.txt (100%) diff --git a/src/main/java/provider/wz/WZFiles.java b/src/main/java/provider/wz/WZFiles.java index 94b07e668c..e5073d0058 100644 --- a/src/main/java/provider/wz/WZFiles.java +++ b/src/main/java/provider/wz/WZFiles.java @@ -21,15 +21,15 @@ public enum WZFiles { private final String fileName; - WZFiles(String fileName) { - this.fileName = fileName; + WZFiles(String name) { + this.fileName = name + ".wz"; } public File getFile() { - return new File(getFilePath()); + return new File(DIRECTORY, fileName); } public String getFilePath() { - return String.format("%s/%s.wz", DIRECTORY, fileName); + return getFile().getPath(); } } diff --git a/tools/MapleCashCosmeticsChecker/src/maplecashcosmeticschecker/MapleCashCosmeticsChecker.java b/src/main/java/tools/mapletools/CashCosmeticsChecker.java similarity index 74% rename from tools/MapleCashCosmeticsChecker/src/maplecashcosmeticschecker/MapleCashCosmeticsChecker.java rename to src/main/java/tools/mapletools/CashCosmeticsChecker.java index bec5033721..8a19bc919d 100644 --- a/tools/MapleCashCosmeticsChecker/src/maplecashcosmeticschecker/MapleCashCosmeticsChecker.java +++ b/src/main/java/tools/mapletools/CashCosmeticsChecker.java @@ -1,77 +1,51 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package maplecashcosmeticschecker; +import provider.wz.WZFiles; +import tools.Pair; import java.io.*; +import java.nio.charset.StandardCharsets; import java.util.*; -import java.util.Map.Entry; /** - * * @author RonanLana - - This application parses the cosmetic recipes defined within "lib/care" folder, loads - every present cosmetic itemid from the XML data, then checks the scripts for missed - cosmetics within the stylist/surgeon. Results from the search are reported in a report - file. - - Note: to best make use of this feature, set ignoreCurrentScriptCosmetics = true. This - way, every available cosmetic present on the recipes will be listed on the report. - - Estimated parse time: 1 minute - + *

+ * This application parses the cosmetic recipes defined within "lib/care" folder, loads + * every present cosmetic itemid from the XML data, then checks the scripts for missed + * cosmetics within the stylist/surgeon. Results from the search are reported in a report + * file. + *

+ * Note: to best make use of this feature, set IGNORE_CURRENT_SCRIPT_COSMETICS = true. This + * way, every available cosmetic present on the recipes will be listed on the report. + *

+ * Estimated parse time: 1 minute */ -public class MapleCashCosmeticsChecker { - static String libPath = "lib"; - static String handbookPath = "../../handbook"; - static String wzPath = "../../wz"; - static String scriptPath = "../../scripts"; - - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static boolean ignoreCurrentScriptCosmetics = false; - - static int initialStringLength = 50; - - static byte status = 0; - - static Map> scriptCosmetics = new HashMap<>(); - static Map scriptEntries = new HashMap<>(500); - - static Set allCosmetics = new HashSet<>(); - - static Set unusedCosmetics = new HashSet<>(); - static Map> usedCosmetics = new HashMap<>(); - - static Map couponNames = new HashMap<>(); - static Map cosmeticNpcs = new HashMap<>(); // expected only 1 NPC per cosmetic coupon (town care/salon) - static Map, Integer> cosmeticNpcids = new HashMap<>(); - - static Set missingCosmeticNames = new HashSet<>(); - static Map cosmeticNameIds = new HashMap<>(); - static Map cosmeticIdNames = new HashMap<>(); - - static Map, Set> missingCosmeticsNpcTypes = new HashMap<>(); - +public class CashCosmeticsChecker { + private static final String HANDBOOK_PATH = "handbook"; + private static final String SCRIPTS_PATH = "scripts"; + private static final String INPUT_DIRECTORY_PATH = ToolConstants.getInputFile("care").getPath(); + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("cash_cosmetics_result.txt"); + private static final boolean IGNORE_CURRENT_SCRIPT_COSMETICS = false; // Toggle to preference + private static final int INITIAL_STRING_LENGTH = 50; + + private static final Map> scriptCosmetics = new HashMap<>(); + private static final Map scriptEntries = new HashMap<>(500); + private static final Set allCosmetics = new HashSet<>(); + private static final Set unusedCosmetics = new HashSet<>(); + private static final Map> usedCosmetics = new HashMap<>(); + private static final Map couponNames = new HashMap<>(); + private static final Map cosmeticNpcs = new HashMap<>(); // expected only 1 NPC per cosmetic coupon (town care/salon) + private static final Map, Integer> cosmeticNpcids = new HashMap<>(); + private static final Set missingCosmeticNames = new HashSet<>(); + private static final Map cosmeticNameIds = new HashMap<>(); + private static final Map cosmeticIdNames = new HashMap<>(); + private static final Map, Set> missingCosmeticsNpcTypes = new HashMap<>(); + + private static PrintWriter printWriter = null; + private static InputStreamReader fileReader = null; + private static BufferedReader bufferedReader = null; + private static byte status = 0; + private static String getName(String token) { int i, j; char[] dest; @@ -81,13 +55,13 @@ public class MapleCashCosmeticsChecker { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static String getValue(String token) { int i, j; char[] dest; @@ -97,84 +71,81 @@ public class MapleCashCosmeticsChecker { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static void forwardCursor(int st) { String line = null; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { simpleToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } private static void simpleToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; } } - + private static void translateToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; - + if (status == 3) { String d = getName(token); - + if (!(d.contentEquals("Face") || d.contentEquals("Hair"))) { forwardCursor(status); } } else if (status == 4) { String d = getName(token); - int itemid = Integer.valueOf(d); - + int itemid = Integer.parseInt(d); + int cosmeticid; if (itemid >= 30000) { cosmeticid = (itemid / 10) * 10; } else { cosmeticid = itemid - ((itemid / 100) % 10) * 100; } - + allCosmetics.add(cosmeticid); forwardCursor(status); } } } - + private static void readEqpStringData(String eqpStringDirectory) throws IOException { String line; - - fileReader = new InputStreamReader(new FileInputStream(eqpStringDirectory), "UTF-8"); + + fileReader = new InputStreamReader(new FileInputStream(eqpStringDirectory), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { translateToken(line); } bufferedReader.close(); fileReader.close(); } - + private static void loadCosmeticWzData() throws IOException { System.out.println("Reading String.wz ..."); - readEqpStringData(wzPath + "/String.wz/Eqp.img.xml"); + readEqpStringData(WZFiles.STRING.getFilePath() + "/Eqp.img.xml"); } - + private static void setCosmeticUsage(List usedByNpcids, int cosmeticid) { if (!usedByNpcids.isEmpty()) { usedCosmetics.put(cosmeticid, usedByNpcids); @@ -182,7 +153,7 @@ public class MapleCashCosmeticsChecker { unusedCosmetics.add(cosmeticid); } } - + private static void listFiles(String directoryName, ArrayList files) { File directory = new File(directoryName); @@ -196,60 +167,60 @@ public class MapleCashCosmeticsChecker { } } } - + private static int getNpcIdFromFilename(String name) { try { - return Integer.valueOf(name.substring(0, name.indexOf('.'))); - } catch(Exception e) { + return Integer.parseInt(name.substring(0, name.indexOf('.'))); + } catch (Exception e) { return -1; } } - + private static List findCosmeticDataNpcids(int itemid) { List npcids = new LinkedList<>(); - for (Entry> sc : scriptCosmetics.entrySet()) { + for (Map.Entry> sc : scriptCosmetics.entrySet()) { if (sc.getValue().contains(itemid)) { npcids.add(itemid); } } - + return npcids; } - + private static void loadScripts() throws IOException { ArrayList files = new ArrayList<>(); - listFiles(scriptPath + "/npc", files); + listFiles(SCRIPTS_PATH + "/npc", files); - for(File f : files) { + for (File f : files) { Integer npcid = getNpcIdFromFilename(f.getName()); - + //System.out.println("Parsing " + f.getAbsolutePath()); - fileReader = new InputStreamReader(new FileInputStream(f), "UTF-8"); + fileReader = new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); String line; StringBuilder stringBuffer = new StringBuilder(); - + boolean cosmeticNpc = false; Set cosmeticids = new HashSet<>(); - while((line = bufferedReader.readLine())!=null){ + while ((line = bufferedReader.readLine()) != null) { String[] s = line.split("hair_. = Array\\(", 2); - + if (s.length > 1) { cosmeticNpc = true; s = s[1].split("\\)", 2); s = s[0].split(", "); - + for (String st : s) { if (!st.isEmpty()) { - int itemid = Integer.valueOf(st); + int itemid = Integer.parseInt(st); cosmeticids.add(itemid); } } } else { s = line.split("face_. = Array\\(", 2); - + if (s.length > 1) { cosmeticNpc = true; s = s[1].split("\\)", 2); @@ -257,18 +228,18 @@ public class MapleCashCosmeticsChecker { for (String st : s) { if (!st.isEmpty()) { - int itemid = Integer.valueOf(st); + int itemid = Integer.parseInt(st); cosmeticids.add(itemid); } } } } - + stringBuffer.append(line).append("\n"); } - + scriptEntries.put(npcid, stringBuffer.toString()); - + if (cosmeticNpc) { scriptCosmetics.put(npcid, cosmeticids); } @@ -277,72 +248,74 @@ public class MapleCashCosmeticsChecker { fileReader.close(); } } - + private static void processCosmeticScriptData() throws IOException { System.out.println("Reading script files ..."); loadScripts(); - - if (ignoreCurrentScriptCosmetics) { + + if (IGNORE_CURRENT_SCRIPT_COSMETICS) { for (Set npcCosmetics : scriptCosmetics.values()) { npcCosmetics.clear(); } } - + for (Integer itemid : allCosmetics) { List npcids = findCosmeticDataNpcids(itemid); setCosmeticUsage(npcids, itemid); } } - + private static List loadCosmeticCouponids() throws IOException { List couponItemids = new LinkedList<>(); - - fileReader = new InputStreamReader(new FileInputStream(handbookPath + "/Cash.txt"), "UTF-8"); + + fileReader = new InputStreamReader(new FileInputStream(getHandbookFileName("/Cash.txt")), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); String line; - while((line = bufferedReader.readLine())!=null){ - if (line.isEmpty()) continue; + while ((line = bufferedReader.readLine()) != null) { + if (line.isEmpty()) { + continue; + } String[] s = line.split(" - ", 3); - - int itemid = Integer.valueOf(s[0]); + + int itemid = Integer.parseInt(s[0]); if (itemid >= 5150000 && itemid < 5160000) { couponItemids.add(itemid); couponNames.put(itemid, s[1]); } } - + bufferedReader.close(); fileReader.close(); - + return couponItemids; } - + private static List findItemidOnScript(int itemid) { List files = new LinkedList<>(); String t = String.valueOf(itemid); - - for (Entry text : scriptEntries.entrySet()) { + + for (Map.Entry text : scriptEntries.entrySet()) { if (text.getValue().contains(t)) { files.add(text.getKey()); } } - + return files; } - + private static void loadCosmeticCouponNpcs() throws IOException { System.out.println("Locating cosmetic NPCs ..."); - + for (Integer itemid : loadCosmeticCouponids()) { List npcids = findItemidOnScript(itemid); - + if (!npcids.isEmpty()) { cosmeticNpcs.put(itemid, npcids.get(0)); } } } - + private enum CosmeticType { HAIRSTYLE, HAIRCOLOR, @@ -351,11 +324,11 @@ public class MapleCashCosmeticsChecker { EYE_COLOR, SKIN_CARE } - + private static Pair parseCosmeticCoupon(String[] tokens) { for (int i = 0; i < tokens.length; i++) { String s = tokens[i]; - + if (s.startsWith("Hair")) { if (s.contentEquals("Hairstyle")) { return new Pair<>(i, CosmeticType.HAIRSTYLE); @@ -378,10 +351,10 @@ public class MapleCashCosmeticsChecker { return new Pair<>(i, CosmeticType.SKIN_CARE); } } - + return null; } - + private static List getCosmeticCouponData(String town, String type, String subtype) { List ret = new ArrayList<>(3); ret.add(town); @@ -389,77 +362,83 @@ public class MapleCashCosmeticsChecker { ret.add(subtype); return ret; } - + private static List parseCosmeticCoupon(String couponName) { String town, type, subtype = "EXP"; - + String[] s = couponName.split(" Coupon ", 2); - + if (s.length > 1) { subtype = s[1].substring(1, s[1].length() - 1); } - + String[] tokens = s[0].split(" "); Pair cosmeticData = parseCosmeticCoupon(tokens); - if (cosmeticData == null) return null; - + if (cosmeticData == null) { + return null; + } + town = ""; for (int i = 0; i < cosmeticData.left; i++) { town += (tokens[i] + "_"); } town = town.substring(0, town.length() - 1).toLowerCase(); - + switch (cosmeticData.right) { case HAIRSTYLE: type = "hair"; break; - + case FACE_SURGERY: type = "face"; break; - + default: return null; } - + return getCosmeticCouponData(town, type, subtype); } - + private static void generateCosmeticPlaceNpcs() { - for (Entry e : couponNames.entrySet()) { + for (Map.Entry e : couponNames.entrySet()) { Integer npcid = cosmeticNpcs.get(e.getKey()); - if (npcid == null) continue; - + if (npcid == null) { + continue; + } + String couponName = e.getValue(); List couponData = parseCosmeticCoupon(couponName); - - if (couponData == null) continue; + + if (couponData == null) { + continue; + } cosmeticNpcids.put(couponData, npcid); } } - + private static Integer getCosmeticNpcid(String townName, String typeCosmetic, String typeCoupon) { return cosmeticNpcids.get(getCosmeticCouponData(townName, typeCosmetic, typeCoupon)); } - + private static String getCosmeticName(String name, boolean gender) { - String ret = name + " (" + (gender ? "F" : "M") + ")"; - return ret; + final String genderString = gender ? "F" : "M"; + return String.format("%s (%s)", name, genderString); } - + private static void loadCosmeticNames(String cosmeticPath) throws IOException { - fileReader = new InputStreamReader(new FileInputStream(cosmeticPath), "UTF-8"); + fileReader = new InputStreamReader(new FileInputStream(cosmeticPath), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); String line; - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { String[] s = line.split(" - ", 3); - int itemid = Integer.valueOf(s[0]); - + int itemid = Integer.parseInt(s[0]); + String name; if (itemid < 30000) { itemid = itemid - ((itemid / 100) % 10) * 100; - + int idx = s[1].lastIndexOf(" "); if (idx > -1) { name = s[1].substring(0, idx); @@ -468,7 +447,7 @@ public class MapleCashCosmeticsChecker { } } else { itemid = (Integer.valueOf(s[0]) / 10) * 10; - + int idx = s[1].indexOf(" "); if (idx > -1) { name = s[1].substring(idx + 1); @@ -476,17 +455,17 @@ public class MapleCashCosmeticsChecker { name = s[1]; } } - + name = name.trim(); - + String cname = getCosmeticName(name, (((itemid / 1000) % 10) % 3) != 0); - + /* if (cosmeticNameIds.containsKey(cname) && Math.abs(cosmeticNameIds.get(cname) - itemid) > 50) { System.out.println("Clashing '" + name + "' " + itemid + "/" + cosmeticNameIds.get(cname)); } */ - + cosmeticNameIds.put(cname, itemid); cosmeticIdNames.put(itemid, name); } @@ -494,17 +473,21 @@ public class MapleCashCosmeticsChecker { bufferedReader.close(); fileReader.close(); } - + private static void loadCosmeticNames() throws IOException { System.out.println("Reading cosmetics from handbook ..."); - - loadCosmeticNames(handbookPath + "/Equip/Face.txt"); - loadCosmeticNames(handbookPath + "/Equip/Hair.txt"); + + loadCosmeticNames(getHandbookFileName("/Equip/Face.txt")); + loadCosmeticNames(getHandbookFileName("/Equip/Hair.txt")); } - + + private static String getHandbookFileName(String fileName) { + return HANDBOOK_PATH + fileName; + } + private static List fetchExpectedCosmetics(String[] cosmeticList, boolean gender) { List list = new LinkedList<>(); - + for (String cosmetic : cosmeticList) { String cname = getCosmeticName(cosmetic, gender); Integer itemid = cosmeticNameIds.get(cname); @@ -514,30 +497,30 @@ public class MapleCashCosmeticsChecker { missingCosmeticNames.add(cosmetic); } } - + return list; } - + private static void verifyCosmeticExpectedFile(File f) throws IOException { String townName = f.getParent().substring(f.getParent().lastIndexOf("\\") + 1); String typeCosmetic = f.getName().substring(0, f.getName().indexOf(".")); - - fileReader = new InputStreamReader(new FileInputStream(f), "UTF-8"); + + fileReader = new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); String line; - while((line = bufferedReader.readLine())!=null){ + while ((line = bufferedReader.readLine()) != null) { String[] s = line.split(": ", 2); String[] t = s[0].split("ale "); - + String typeCoupon = t[1]; boolean gender = !t[0].contentEquals("M"); - + Integer npcid = getCosmeticNpcid(townName, typeCosmetic, typeCoupon); if (npcid != null) { String[] cosmetics = s[1].split(", "); List cosmeticItemids = fetchExpectedCosmetics(cosmetics, gender); - + Set npcCosmetics = scriptCosmetics.get(npcid); Set missingCosmetics = new HashSet<>(); for (Integer itemid : cosmeticItemids) { @@ -545,10 +528,10 @@ public class MapleCashCosmeticsChecker { missingCosmetics.add(itemid); } } - + if (!missingCosmetics.isEmpty()) { Pair key = new Pair<>(npcid, typeCoupon); - + Set list = missingCosmeticsNpcTypes.get(key); if (list == null) { missingCosmeticsNpcTypes.put(key, missingCosmetics); @@ -558,34 +541,34 @@ public class MapleCashCosmeticsChecker { } } } - + bufferedReader.close(); fileReader.close(); } - + private static void verifyCosmeticExpectedData() throws IOException { System.out.println("Analyzing cosmetic NPC scripts ..."); - + ArrayList cosmeticRecipes = new ArrayList<>(); - listFiles(libPath + "/care", cosmeticRecipes); - + listFiles(INPUT_DIRECTORY_PATH, cosmeticRecipes); + for (File f : cosmeticRecipes) { verifyCosmeticExpectedFile(f); } } - + private static List, List>> getSortedMapEntries(Map, Set> map) { List, List>> list = new ArrayList<>(map.size()); - for(Entry, Set> e : map.entrySet()) { + for (Map.Entry, Set> e : map.entrySet()) { List il = new ArrayList<>(2); il.addAll(e.getValue()); - - Collections.sort(il, (o1, o2) -> o1 - o2); - + + il.sort((o1, o2) -> o1 - o2); + list.add(new Pair<>(e.getKey(), il)); } - - Collections.sort(list, (o1, o2) -> { + + list.sort((o1, o2) -> { int cmp = o1.getLeft().getLeft() - o2.getLeft().getLeft(); if (cmp == 0) { return o1.getLeft().getRight().compareTo(o2.getLeft().getRight()); @@ -593,20 +576,20 @@ public class MapleCashCosmeticsChecker { return cmp; } }); - + return list; } - + private static void printReportFileHeader() { printWriter.println(" # Report File autogenerated from the MapleCashCosmeticsChecker feature by Ronan Lana."); printWriter.println(" # Generated data takes into account several data info from the server source files and the server-side WZ.xmls."); printWriter.println(); } - + private static Pair, List> getCosmeticReport(List itemids) { List maleItemids = new LinkedList<>(); List femaleItemids = new LinkedList<>(); - + for (Integer i : itemids) { if ((((i / 1000) % 10) % 3) == 0) { maleItemids.add(i); @@ -614,10 +597,10 @@ public class MapleCashCosmeticsChecker { femaleItemids.add(i); } } - + return new Pair<>(maleItemids, femaleItemids); } - + private static void reportNpcCosmetics(List itemids) { if (!itemids.isEmpty()) { String res = " "; @@ -625,75 +608,75 @@ public class MapleCashCosmeticsChecker { res += (i + ", "); unusedCosmetics.remove(i); } - + printWriter.println(res.substring(0, res.length() - 2)); } } - + private static void reportCosmeticResults() throws IOException { System.out.println("Reporting results ..."); - - printWriter = new PrintWriter("lib/result.txt", "UTF-8"); - + + printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); + printReportFileHeader(); - + if (!missingCosmeticsNpcTypes.isEmpty()) { printWriter.println("Found " + missingCosmeticsNpcTypes.size() + " entries with missing cosmetic entries."); - + for (Pair, List> mcn : getSortedMapEntries(missingCosmeticsNpcTypes)) { printWriter.println(" NPC " + mcn.getLeft()); - + Pair, List> genderItemids = getCosmeticReport(mcn.getRight()); reportNpcCosmetics(genderItemids.getLeft()); reportNpcCosmetics(genderItemids.getRight()); printWriter.println(); } } - + if (!unusedCosmetics.isEmpty()) { printWriter.println("Unused cosmetics: " + unusedCosmetics.size()); - + List list = new ArrayList<>(unusedCosmetics); Collections.sort(list); - + for (Integer i : list) { printWriter.println(i + " " + cosmeticIdNames.get(i)); } - + printWriter.println(); } - + if (!missingCosmeticNames.isEmpty()) { printWriter.println("Missing cosmetic itemids: " + missingCosmeticNames.size()); - + List listString = new ArrayList<>(missingCosmeticNames); Collections.sort(listString); - + for (String c : listString) { printWriter.println(c); } - + printWriter.println(); } printWriter.close(); } - + public static void main(String[] args) { try { loadCosmeticWzData(); processCosmeticScriptData(); - + loadCosmeticCouponNpcs(); generateCosmeticPlaceNpcs(); - + loadCosmeticNames(); verifyCosmeticExpectedData(); - + reportCosmeticResults(); System.out.println("Done!"); } catch (IOException ioe) { ioe.printStackTrace(); } } -} \ No newline at end of file +} diff --git a/src/main/java/tools/mapletools/ToolConstants.java b/src/main/java/tools/mapletools/ToolConstants.java index aa097172cf..f5f4fb9b34 100644 --- a/src/main/java/tools/mapletools/ToolConstants.java +++ b/src/main/java/tools/mapletools/ToolConstants.java @@ -6,6 +6,10 @@ public class ToolConstants { public static final File INPUT_DIRECTORY = new File("tools/input"); public static final File OUTPUT_DIRECTORY = new File("tools/output"); + public static File getInputFile(String fileName) { + return new File(INPUT_DIRECTORY, fileName); + } + public static File getOutputFile(String fileName) { return new File(OUTPUT_DIRECTORY, fileName); } diff --git a/tools/MapleCashCosmeticsChecker/lib/result.txt b/tools/MapleCashCosmeticsChecker/lib/result.txt deleted file mode 100644 index 60ce233efb..0000000000 --- a/tools/MapleCashCosmeticsChecker/lib/result.txt +++ /dev/null @@ -1,213 +0,0 @@ - # Report File autogenerated from the MapleCashCosmeticsChecker feature by Ronan Lana. - # Generated data takes into account several data info from the server source files and the server-side WZ.xmls. - -Found 42 entries with missing cosmetic entries. - NPC 1012103:VIP - 30060, 30140, 30200, 30210, 30310, 33040, 33100 - 31150, 31300, 31350, 31700, 31740, 34050, 34110 - - NPC 1012104:EXP - 30030, 30140, 30200, 30210, 30310, 30610, 33040, 33100 - 31070, 31150, 31300, 31350, 31430, 31700, 34050, 34110 - - NPC 1012104:REG - 30060, 30140, 30200, 30210, 30310, 30610, 33040, 33100 - 31070, 31080, 31150, 31300, 31350, 31700, 34050, 34110 - - NPC 1052004:VIP - 20000, 20001, 20003, 20004, 20005, 20006, 20007, 20008, 20012, 20014, 20015, 20022, 20028, 20031 - 21000, 21001, 21002, 21003, 21004, 21005, 21006, 21007, 21008, 21012, 21013, 21014, 21023, 21026 - - NPC 1052005:REG - 20000, 20005, 20008, 20012, 20016, 20022, 20032 - 21000, 21002, 21008, 21014, 21020, 21024, 21029 - - NPC 1052100:VIP - 30040, 30130, 30780, 30850, 30860, 30920, 33040 - 31090, 31140, 31330, 31440, 31760, 31880, 34050 - - NPC 1052101:EXP - 30130, 30430, 30520, 30770, 30780, 30850, 30920, 33040 - 31060, 31140, 31330, 31520, 31760, 31880, 34010, 34050 - - NPC 1052101:REG - 30040, 30130, 30520, 30770, 30780, 30850, 30920, 33040 - 31060, 31140, 31330, 31440, 31520, 31750, 31760, 31880, 34050 - - NPC 2010001:VIP - 30230, 30260, 30280, 30340, 30490 - 31110, 31220, 31230, 31630, 31790 - - NPC 2010002:VIP - 20000, 20001, 20003, 20004, 20005, 20006, 20007, 20008, 20012, 20014, 20022, 20028, 20031 - 21000, 21001, 21002, 21003, 21004, 21005, 21006, 21007, 21008, 21012, 21014, 21023, 21026 - - NPC 2012007:EXP - 30230, 30280, 30340, 30490, 30530, 30740 - 31110, 31220, 31230, 31710, 31790, 31890, 31930 - - NPC 2012007:REG - 30230, 30260, 30280, 30340, 30490, 30530, 30630, 30740 - 31110, 31220, 31230, 31630, 31650, 31710, 31790, 31890, 31930 - - NPC 2012009:REG - 20003, 20011, 20021, 20022, 20023, 20027, 20031 - 21004, 21007, 21010, 21012, 21020, 21021, 21030 - - NPC 2040019:REG - 20001, 20003, 20007, 20013, 20021, 20023, 20025 - 21002, 21004, 21006, 21008, 21022, 21027, 21029 - - NPC 2041007:VIP - 30160, 30190, 30250, 30640, 30660, 30840, 30870, 30990 - 31270, 31290, 31550, 31680, 31810, 31830, 31840, 31870 - - NPC 2041009:EXP - 30030, 30190, 30220, 30250, 30540, 30610, 30620, 30640, 30650, 30660, 30840, 30990 - 31170, 31270, 31430, 31510, 31540, 31550, 31600, 31680, 31810, 31830, 31840, 31870 - - NPC 2041009:REG - 30190, 30220, 30250, 30540, 30610, 30620, 30640, 30650, 30660, 30840, 30870, 30940, 30990 - 31170, 31270, 31290, 31510, 31540, 31550, 31600, 31640, 31680, 31810, 31830, 31840, 31870 - - NPC 2041010:VIP - 20000, 20001, 20003, 20004, 20005, 20006, 20007, 20008, 20011, 20012, 20014, 20031 - 21000, 21001, 21002, 21003, 21004, 21005, 21006, 21007, 21008, 21010, 21012, 21014 - - NPC 2090100:VIP - 30150, 30240, 30370, 30420, 30640, 30710, 30750, 30810 - 31140, 31160, 31180, 31300, 31460, 31470, 31660, 31910 - - NPC 2090101:EXP - 30030, 30150, 30240, 30370, 30420, 30550, 30600, 30640, 30700, 30710, 30720, 30750, 30810, 30830 - 31140, 31160, 31180, 31210, 31300, 31430, 31460, 31470, 31660, 31690, 31800, 31890, 31910, 31940 - - NPC 2090104:REG - 20002, 20005, 20007, 20011, 20014, 20017, 20029 - 21001, 21010, 21013, 21018, 21020, 21021, 21030 - - NPC 2090104:VIP - 20000, 20001, 20004, 20005, 20006, 20007, 20009, 20012, 20022, 20028, 20031 - 21000, 21003, 21005, 21006, 21008, 21009, 21011, 21012, 21023, 21024, 21026 - - NPC 2100005:REG - 30150, 30170, 30180, 30320, 30330, 30410, 30460, 30680, 30800, 30820, 30900 - 31090, 31190, 31330, 31340, 31400, 31420, 31520, 31620, 31650, 31660, 34000 - - NPC 2100006:VIP - 30150, 30170, 30180, 30320, 30330, 30410, 30460, 30820, 30900 - 31040, 31090, 31190, 31330, 31340, 31400, 31420, 31620, 31660 - - NPC 2100008:VIP - 20000, 20004, 20005, 20012, 20013, 20031 - 21000, 21003, 21006, 21009, 21012, 21024 - - NPC 2100009:REG - 20001, 20003, 20009, 20010, 20025, 20031 - 21002, 21009, 21011, 21013, 21016, 21029, 21030 - - NPC 9120100:VIP - 30260, 30280, 30340, 30710, 30780, 30800, 30810, 30820, 30920 - 31000, 31030, 31100, 31350, 31460, 31550, 31770, 31790, 31850 - - NPC 9120101:REG - 30260, 30280, 30340, 30360, 30710, 30780, 30790, 30800, 30810, 30820, 30920 - 31350, 31410, 31460, 31540, 31550, 31710, 31720, 31770, 31790, 31800, 31850, 34000 - - NPC 9120102:VIP - 20000, 20004, 20005, 20012, 20020, 20031 - 21000, 21003, 21006, 21012, 21021, 21024 - - NPC 9120103:REG - 20000, 20016, 20019, 20020, 20021, 20024, 20026 - 21000, 21002, 21009, 21016, 21022, 21025, 21027 - - NPC 9201015:VIP - 30050, 30300, 30410, 30450, 30510, 30570, 30580, 30590, 30660, 30910 - 31150, 31220, 31260, 31310, 31420, 31480, 31490, 31580, 31590, 31610, 31630 - - NPC 9201016:EXP - 30000, 30020, 30110, 30130, 30160, 30190, 30240, 30270, 30430 - 31000, 31030, 31050, 31070, 31090, 31150, 31310, 31910, 34010 - - NPC 9201018:VIP - 20000, 20001, 20003, 20004, 20005, 20006, 20007, 20008, 20018, 20019 - 21001, 21002, 21003, 21004, 21005, 21006, 21007, 21012, 21018, 21019 - - NPC 9201019:REG - 20002, 20005, 20007, 20011, 20014, 20027, 20029 - 21001, 21005, 21007, 21017, 21018, 21020, 21022 - - NPC 9201063:EXP - 30250, 30400, 30430, 30440, 30490, 30730, 30830, 30870, 30880, 33100 - 31320, 31450, 31560, 31570, 31690, 31720, 31730, 31830, 34010 - - NPC 9201064:VIP - 30250, 30490, 30730, 30870, 30880, 33100 - 31320, 31450, 31560, 31730, 31830 - - NPC 9201069:VIP - 20000, 20001, 20003, 20004, 20005, 20006, 20008, 20012, 20031 - 21001, 21002, 21003, 21004, 21005, 21006, 21008, 21012, 21016 - - NPC 9201070:REG - 20001, 20008, 20011, 20013, 20024, 20029, 20032 - 21000, 21007, 21011, 21012, 21017, 21020, 21022 - - NPC 9270023:REG - 20002, 20005, 20006, 20013, 20017, 20021, 20024 - 21002, 21003, 21014, 21016, 21017, 21021, 21027 - - NPC 9270024:VIP - 20005, 20012, 20013, 20020, 20021, 20026 - 21006, 21009, 21011, 21012, 21021, 21025 - - NPC 9270036:VIP - 30000, 30020, 30110, 30120, 30270, 30290, 30310, 30670, 30840 - 31010, 31050, 31110, 31120, 31240, 31250, 31280, 31670, 31810 - - NPC 9270037:REG - 30110, 30180, 30260, 30290, 30300, 30350, 30470, 30720, 30840 - 31110, 31200, 31250, 31280, 31600, 31640, 31670, 31810, 34020 - -Unused cosmetics: 22 -30010 Zeta -30070 Back -30080 Buzzcut -30090 Mohawk -30100 Fantasy -30480 Babby Cut -30560 Grand Lionman -30690 Metro Man -30760 Bowling Ball -30890 Eastern Mystery -30930 Boy Band Cut -30950 Volume Cut -31020 Francesca -31130 Jolie -31530 Zessica -31780 ???? ?? -31820 Grace -31860 Laguna Beach -31920 CL Hair -31950 Vintage Flip -33000 Prince Cut -34030 Designer Hair - -Missing cosmetic itemids: 15 -Bohemian Hair -Bow Hair -Clean-Cut Short Hair -Dual Blade Hair -Evan Hair (F) -Evan Hair (M) -Explosion -Lilin Hair -Low Cut Bob -Messy Pigtails -Oh So Windy -Spiky Shag -Top Tied Hair -Updo -Windy Hair - diff --git a/tools/MapleCashCosmeticsChecker/src/maplecashcosmeticschecker/Pair.java b/tools/MapleCashCosmeticsChecker/src/maplecashcosmeticschecker/Pair.java deleted file mode 100644 index 3e2f924b51..0000000000 --- a/tools/MapleCashCosmeticsChecker/src/maplecashcosmeticschecker/Pair.java +++ /dev/null @@ -1,121 +0,0 @@ -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 ~ 2010 Patrick Huy -Matthias Butz -Jan Christian Meyer - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License version 3 -as published by the Free Software Foundation. You may not use, modify -or distribute this program under any other version of the -GNU Affero General Public License. - -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 . - */ -package maplecashcosmeticschecker; - -/** - * Represents a pair of values. - * - * @author Frz - * @since Revision 333 - * @version 1.0 - * - * @param The type of the left value. - * @param The type of the right value. - */ -public class Pair { - - public E left; - public F right; - - /** - * Class constructor - pairs two objects together. - * - * @param left The left object. - * @param right The right object. - */ - public Pair(E left, F right) { - this.left = left; - this.right = right; - } - - /** - * Gets the left value. - * - * @return The left value. - */ - public E getLeft() { - return left; - } - - /** - * Gets the right value. - * - * @return The right value. - */ - public F getRight() { - return right; - } - - /** - * Turns the pair into a string. - * - * @return Each value of the pair as a string joined with a colon. - */ - @Override - public String toString() { - return left.toString() + ":" + right.toString(); - } - - /** - * Gets the hash code of this pair. - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((left == null) ? 0 : left.hashCode()); - result = prime * result + ((right == null) ? 0 : right.hashCode()); - return result; - } - - /** - * Checks to see if two pairs are equal. - */ - @SuppressWarnings("unchecked") - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Pair other = (Pair) obj; - if (left == null) { - if (other.left != null) { - return false; - } - } else if (!left.equals(other.left)) { - return false; - } - if (right == null) { - if (other.right != null) { - return false; - } - } else if (!right.equals(other.right)) { - return false; - } - return true; - } -} \ No newline at end of file diff --git a/tools/input/.gitignore b/tools/input/.gitignore index c96a04f008..9e88c6e0f0 100644 --- a/tools/input/.gitignore +++ b/tools/input/.gitignore @@ -1,2 +1,4 @@ * +!*/ +!/cosmetics/** !.gitignore \ No newline at end of file diff --git a/tools/MapleCashCosmeticsChecker/lib/care/amoria/face.txt b/tools/input/cosmetics/amoria/face.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/amoria/face.txt rename to tools/input/cosmetics/amoria/face.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/amoria/hair.txt b/tools/input/cosmetics/amoria/hair.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/amoria/hair.txt rename to tools/input/cosmetics/amoria/hair.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/ariant/face.txt b/tools/input/cosmetics/ariant/face.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/ariant/face.txt rename to tools/input/cosmetics/ariant/face.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/ariant/hair.txt b/tools/input/cosmetics/ariant/hair.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/ariant/hair.txt rename to tools/input/cosmetics/ariant/hair.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/cbd/face.txt b/tools/input/cosmetics/cbd/face.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/cbd/face.txt rename to tools/input/cosmetics/cbd/face.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/cbd/hair.txt b/tools/input/cosmetics/cbd/hair.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/cbd/hair.txt rename to tools/input/cosmetics/cbd/hair.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/colors.txt b/tools/input/cosmetics/colors.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/colors.txt rename to tools/input/cosmetics/colors.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/henesys/face.txt b/tools/input/cosmetics/henesys/face.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/henesys/face.txt rename to tools/input/cosmetics/henesys/face.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/henesys/hair.txt b/tools/input/cosmetics/henesys/hair.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/henesys/hair.txt rename to tools/input/cosmetics/henesys/hair.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/kerning_city/face.txt b/tools/input/cosmetics/kerning_city/face.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/kerning_city/face.txt rename to tools/input/cosmetics/kerning_city/face.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/kerning_city/hair.txt b/tools/input/cosmetics/kerning_city/hair.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/kerning_city/hair.txt rename to tools/input/cosmetics/kerning_city/hair.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/ludibrium/face.txt b/tools/input/cosmetics/ludibrium/face.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/ludibrium/face.txt rename to tools/input/cosmetics/ludibrium/face.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/ludibrium/hair.txt b/tools/input/cosmetics/ludibrium/hair.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/ludibrium/hair.txt rename to tools/input/cosmetics/ludibrium/hair.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/mu_lung/face.txt b/tools/input/cosmetics/mu_lung/face.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/mu_lung/face.txt rename to tools/input/cosmetics/mu_lung/face.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/mu_lung/hair.txt b/tools/input/cosmetics/mu_lung/hair.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/mu_lung/hair.txt rename to tools/input/cosmetics/mu_lung/hair.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/nlc/face.txt b/tools/input/cosmetics/nlc/face.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/nlc/face.txt rename to tools/input/cosmetics/nlc/face.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/nlc/hair.txt b/tools/input/cosmetics/nlc/hair.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/nlc/hair.txt rename to tools/input/cosmetics/nlc/hair.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/orbis/face.txt b/tools/input/cosmetics/orbis/face.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/orbis/face.txt rename to tools/input/cosmetics/orbis/face.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/orbis/hair.txt b/tools/input/cosmetics/orbis/hair.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/orbis/hair.txt rename to tools/input/cosmetics/orbis/hair.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/showa/face.txt b/tools/input/cosmetics/showa/face.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/showa/face.txt rename to tools/input/cosmetics/showa/face.txt diff --git a/tools/MapleCashCosmeticsChecker/lib/care/showa/hair.txt b/tools/input/cosmetics/showa/hair.txt similarity index 100% rename from tools/MapleCashCosmeticsChecker/lib/care/showa/hair.txt rename to tools/input/cosmetics/showa/hair.txt From 0af167d174fa07d2303da446f7518546d5842e6c Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 19:38:00 +0200 Subject: [PATCH 06/36] Move MapleCashCosmeticsFetcher to main module --- .../mapletools/CashCosmeticsChecker.java | 3 +- .../mapletools/CashCosmeticsFetcher.java | 92 +-- .../java/tools/mapletools/ToolConstants.java | 1 + .../src/provider/MapleCanvas.java | 30 - .../src/provider/MapleData.java | 34 - .../src/provider/MapleDataDirectoryEntry.java | 34 - .../src/provider/MapleDataEntity.java | 31 - .../src/provider/MapleDataEntry.java | 33 - .../src/provider/MapleDataFileEntry.java | 30 - .../src/provider/MapleDataProvider.java | 27 - .../provider/MapleDataProviderFactory.java | 55 -- .../src/provider/MapleDataTool.java | 145 ---- .../provider/wz/FileStoredPngMapleCanvas.java | 70 -- .../src/provider/wz/ImgMapleSound.java | 39 -- .../src/provider/wz/ListWZFile.java | 86 --- .../src/provider/wz/MapleDataType.java | 26 - .../src/provider/wz/PNGMapleCanvas.java | 151 ----- .../src/provider/wz/WZDirectoryEntry.java | 68 -- .../src/provider/wz/WZEntry.java | 61 -- .../src/provider/wz/WZFile.java | 154 ----- .../src/provider/wz/WZFileEntry.java | 42 -- .../src/provider/wz/WZIMGEntry.java | 118 ---- .../src/provider/wz/WZIMGFile.java | 227 ------- .../src/provider/wz/WZTool.java | 188 ------ .../src/provider/wz/XMLDomMapleData.java | 219 ------ .../src/provider/wz/XMLWZFile.java | 85 --- .../src/tools/ArrayMap.java | 149 ----- .../src/tools/DatabaseConnection.java | 51 -- .../src/tools/FilePrinter.java | 188 ------ .../src/tools/HexTool.java | 79 --- .../tools/MapleItemInformationProvider.java | 629 ------------------ .../src/tools/Pair.java | 121 ---- .../src/tools/StringUtil.java | 128 ---- .../tools/data/input/ByteArrayByteStream.java | 72 -- .../src/tools/data/input/ByteInputStream.java | 35 - .../input/GenericLittleEndianAccessor.java | 239 ------- .../GenericSeekableLittleEndianAccessor.java | 91 --- .../data/input/InputStreamByteStream.java | 93 --- .../data/input/LittleEndianAccessor.java | 45 -- .../data/input/RandomAccessByteStream.java | 84 --- .../input/SeekableInputStreamBytestream.java | 51 -- .../input/SeekableLittleEndianAccessor.java | 27 - .../data/output/BAOSByteOutputStream.java | 56 -- .../tools/data/output/ByteOutputStream.java | 38 -- .../output/GenericLittleEndianWriter.java | 183 ----- .../tools/data/output/LittleEndianWriter.java | 114 ---- .../output/MaplePacketLittleEndianWriter.java | 73 -- 47 files changed, 33 insertions(+), 4562 deletions(-) rename tools/MapleCashCosmeticsFetcher/src/maplecashcosmeticsfetcher/MapleCashCosmeticsFetcher.java => src/main/java/tools/mapletools/CashCosmeticsFetcher.java (52%) delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/MapleCanvas.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/MapleData.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/MapleDataDirectoryEntry.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/MapleDataEntity.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/MapleDataEntry.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/MapleDataFileEntry.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/MapleDataProvider.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/MapleDataProviderFactory.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/MapleDataTool.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/wz/FileStoredPngMapleCanvas.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/wz/ImgMapleSound.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/wz/ListWZFile.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/wz/MapleDataType.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/wz/PNGMapleCanvas.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/wz/WZDirectoryEntry.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/wz/WZEntry.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/wz/WZFile.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/wz/WZFileEntry.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/wz/WZIMGEntry.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/wz/WZIMGFile.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/wz/WZTool.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/wz/XMLDomMapleData.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/provider/wz/XMLWZFile.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/ArrayMap.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/DatabaseConnection.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/FilePrinter.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/HexTool.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/MapleItemInformationProvider.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/Pair.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/StringUtil.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/data/input/ByteArrayByteStream.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/data/input/ByteInputStream.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/data/input/GenericLittleEndianAccessor.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/data/input/InputStreamByteStream.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/data/input/LittleEndianAccessor.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/data/input/RandomAccessByteStream.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/data/input/SeekableInputStreamBytestream.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/data/output/BAOSByteOutputStream.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/data/output/ByteOutputStream.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/data/output/GenericLittleEndianWriter.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/data/output/LittleEndianWriter.java delete mode 100644 tools/MapleCashCosmeticsFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java diff --git a/src/main/java/tools/mapletools/CashCosmeticsChecker.java b/src/main/java/tools/mapletools/CashCosmeticsChecker.java index 8a19bc919d..37641bf0e2 100644 --- a/src/main/java/tools/mapletools/CashCosmeticsChecker.java +++ b/src/main/java/tools/mapletools/CashCosmeticsChecker.java @@ -22,7 +22,6 @@ import java.util.*; */ public class CashCosmeticsChecker { private static final String HANDBOOK_PATH = "handbook"; - private static final String SCRIPTS_PATH = "scripts"; private static final String INPUT_DIRECTORY_PATH = ToolConstants.getInputFile("care").getPath(); private static final File OUTPUT_FILE = ToolConstants.getOutputFile("cash_cosmetics_result.txt"); private static final boolean IGNORE_CURRENT_SCRIPT_COSMETICS = false; // Toggle to preference @@ -189,7 +188,7 @@ public class CashCosmeticsChecker { private static void loadScripts() throws IOException { ArrayList files = new ArrayList<>(); - listFiles(SCRIPTS_PATH + "/npc", files); + listFiles(ToolConstants.SCRIPTS_PATH + "/npc", files); for (File f : files) { Integer npcid = getNpcIdFromFilename(f.getName()); diff --git a/tools/MapleCashCosmeticsFetcher/src/maplecashcosmeticsfetcher/MapleCashCosmeticsFetcher.java b/src/main/java/tools/mapletools/CashCosmeticsFetcher.java similarity index 52% rename from tools/MapleCashCosmeticsFetcher/src/maplecashcosmeticsfetcher/MapleCashCosmeticsFetcher.java rename to src/main/java/tools/mapletools/CashCosmeticsFetcher.java index 797be5090b..2c775f7362 100644 --- a/tools/MapleCashCosmeticsFetcher/src/maplecashcosmeticsfetcher/MapleCashCosmeticsFetcher.java +++ b/src/main/java/tools/mapletools/CashCosmeticsFetcher.java @@ -1,57 +1,28 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package maplecashcosmeticsfetcher; +import server.MapleItemInformationProvider; +import tools.DatabaseConnection; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.ArrayList; - -import tools.MapleItemInformationProvider; +import java.nio.charset.StandardCharsets; +import java.util.*; /** * * @author RonanLana - - This application gathers info from the WZ.XML files, fetching all cosmetic coupons and tickets from there, and then - searches the NPC script files, identifying the stylish NPCs that supposedly uses them. It will reports all NPCs that - uses up a card, as well as report those currently unused. - - Estimated parse time: 10 seconds + +This application gathers info from the WZ.XML files, fetching all cosmetic coupons and tickets from there, and then +searches the NPC script files, identifying the stylish NPCs that supposedly uses them. It will reports all NPCs that +uses up a card, as well as report those currently unused. + +Estimated parse time: 10 seconds */ -public class MapleCashCosmeticsFetcher { - static MapleItemInformationProvider ii; - - static String wzPath = "../../wz"; - static String scriptPath = "../../scripts"; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static Map scriptEntries = new HashMap<>(500); +public class CashCosmeticsFetcher { + private static final Map scriptEntries = new HashMap<>(500); private static void listFiles(String directoryName, ArrayList files) { File directory = new File(directoryName); @@ -66,25 +37,25 @@ public class MapleCashCosmeticsFetcher { } } } - + private static int getNpcIdFromFilename(String name) { try { - return Integer.valueOf(name.substring(0, name.indexOf('.'))); + return Integer.parseInt(name.substring(0, name.indexOf('.'))); } catch(Exception e) { return -1; } } - + private static void loadScripts() throws Exception { ArrayList files = new ArrayList<>(); - listFiles(scriptPath + "/npc", files); + listFiles(ToolConstants.SCRIPTS_PATH + "/npc", files); for(File f : files) { Integer npcid = getNpcIdFromFilename(f.getName()); - + //System.out.println("Parsing " + f.getAbsolutePath()); - fileReader = new InputStreamReader(new FileInputStream(f), "UTF-8"); - bufferedReader = new BufferedReader(fileReader); + InputStreamReader fileReader = new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8); + BufferedReader bufferedReader = new BufferedReader(fileReader); StringBuilder stringBuffer = new StringBuilder(); String line; @@ -92,28 +63,29 @@ public class MapleCashCosmeticsFetcher { while((line = bufferedReader.readLine())!=null){ stringBuffer.append(line).append("\n"); } - + scriptEntries.put(npcid, stringBuffer.toString()); bufferedReader.close(); fileReader.close(); } } - + private static List findItemidOnScript(int itemid) { List files = new LinkedList<>(); String t = String.valueOf(itemid); - - for (Entry text : scriptEntries.entrySet()) { + + for (Map.Entry text : scriptEntries.entrySet()) { if (text.getValue().contains(t)) { files.add(text.getKey()); } } - + return files; } - + private static void reportCosmeticCouponResults() { + final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); for (int itemid = 5150000; itemid <= 5154000; itemid++) { String itemName = ii.getName(itemid); @@ -128,18 +100,16 @@ public class MapleCashCosmeticsFetcher { } } } - + public static void main(String[] args) { - System.setProperty("wzpath", wzPath); - ii = MapleItemInformationProvider.getInstance(); - + DatabaseConnection.initializeConnectionPool(); // MapleItemInformationProvider loads unrelated stuff from the db try { loadScripts(); System.out.println("Loaded scripts"); - + reportCosmeticCouponResults(); } catch(Exception e) { e.printStackTrace(); } } -} \ No newline at end of file +} diff --git a/src/main/java/tools/mapletools/ToolConstants.java b/src/main/java/tools/mapletools/ToolConstants.java index f5f4fb9b34..0b9015e28f 100644 --- a/src/main/java/tools/mapletools/ToolConstants.java +++ b/src/main/java/tools/mapletools/ToolConstants.java @@ -5,6 +5,7 @@ import java.io.File; public class ToolConstants { public static final File INPUT_DIRECTORY = new File("tools/input"); public static final File OUTPUT_DIRECTORY = new File("tools/output"); + public static final String SCRIPTS_PATH = "scripts"; public static File getInputFile(String fileName) { return new File(INPUT_DIRECTORY, fileName); diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/MapleCanvas.java b/tools/MapleCashCosmeticsFetcher/src/provider/MapleCanvas.java deleted file mode 100644 index 10ab682196..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/MapleCanvas.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.awt.image.BufferedImage; - -public interface MapleCanvas { - int getHeight(); - int getWidth(); - BufferedImage getImage(); -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/MapleData.java b/tools/MapleCashCosmeticsFetcher/src/provider/MapleData.java deleted file mode 100644 index 4d90a93804..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/MapleData.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.util.List; -import provider.wz.MapleDataType; - -public interface MapleData extends MapleDataEntity, Iterable { - @Override - public String getName(); - public MapleDataType getType(); - public List getChildren(); - public MapleData getChildByPath(String path); - public Object getData(); -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataDirectoryEntry.java b/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataDirectoryEntry.java deleted file mode 100644 index cb043e0c94..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataDirectoryEntry.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.util.List; - -/** - * - * @author Matze - */ -public interface MapleDataDirectoryEntry extends MapleDataEntry { - public List getSubdirectories(); - public List getFiles(); - public MapleDataEntry getEntry(String name); -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataEntity.java b/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataEntity.java deleted file mode 100644 index 03ff77649c..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataEntity.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataEntity { - public String getName(); - public MapleDataEntity getParent(); -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataEntry.java b/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataEntry.java deleted file mode 100644 index 62db6d0abe..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataEntry.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataEntry extends MapleDataEntity { - public String getName(); - public int getSize(); - public int getChecksum(); - public int getOffset(); -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataFileEntry.java b/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataFileEntry.java deleted file mode 100644 index 902130a612..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataFileEntry.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataFileEntry extends MapleDataEntry { - public void setOffset(int offset); -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataProvider.java b/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataProvider.java deleted file mode 100644 index 5237b7ac37..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataProvider.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -public interface MapleDataProvider { - MapleData getData(String path); - MapleDataDirectoryEntry getRoot(); -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataProviderFactory.java b/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataProviderFactory.java deleted file mode 100644 index 14753d4406..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataProviderFactory.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.io.File; -import java.io.IOException; -import provider.wz.WZFile; -import provider.wz.XMLWZFile; - -public class MapleDataProviderFactory { - private final static String wzPath = System.getProperty("wzpath"); - - private static MapleDataProvider getWZ(File in, boolean provideImages) { - if (in.getName().toLowerCase().endsWith("wz") && !in.isDirectory()) { - try { - return new WZFile(in, provideImages); - } catch (IOException e) { - throw new RuntimeException("Loading WZ File failed", e); - } - } else { - return new XMLWZFile(in); - } - } - - public static MapleDataProvider getDataProvider(File in) { - return getWZ(in, false); - } - - public static MapleDataProvider getImageProvidingDataProvider(File in) { - return getWZ(in, true); - } - - public static File fileInWZPath(String filename) { - return new File(wzPath, filename); - } -} \ No newline at end of file diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataTool.java b/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataTool.java deleted file mode 100644 index 25f4c7f817..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/MapleDataTool.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.awt.Point; -import java.awt.image.BufferedImage; -import provider.wz.MapleDataType; - -public class MapleDataTool { - public static String getString(MapleData data) { - return ((String) data.getData()); - } - - public static String getString(MapleData data, String def) { - if (data == null || data.getData() == null) { - return def; - } else { - return ((String) data.getData()); - } - } - - public static String getString(String path, MapleData data) { - return getString(data.getChildByPath(path)); - } - - public static String getString(String path, MapleData data, String def) { - return getString(data.getChildByPath(path), def); - } - - public static double getDouble(MapleData data) { - return ((Double) data.getData()).doubleValue(); - } - - public static float getFloat(MapleData data) { - return ((Float) data.getData()).floatValue(); - } - - public static int getInt(MapleData data) { - if (data == null || data.getData() == null) { - return 0;// DEF? - } - return ((Integer) data.getData()).intValue(); - } - - public static int getInt(String path, MapleData data) { - return getInt(data.getChildByPath(path)); - } - - public static int getIntConvert(MapleData data) { - if (data.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(data)); - } else { - return getInt(data); - } - } - - public static int getIntConvert(String path, MapleData data) { - MapleData d = data.getChildByPath(path); - if (d.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(d)); - } else { - return getInt(d); - } - } - - public static int getInt(MapleData data, int def) { - if (data == null || data.getData() == null) { - return def; - } else if (data.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(data)); - } else { - return ((Integer) data.getData()).intValue(); - } - } - - public static int getInt(String path, MapleData data, int def) { - return getInt(data.getChildByPath(path), def); - } - - public static int getIntConvert(String path, MapleData data, int def) { - MapleData d = data.getChildByPath(path); - if (d == null) { - return def; - } - if (d.getType() == MapleDataType.STRING) { - try { - return Integer.parseInt(getString(d)); - } catch (NumberFormatException nfe) { - nfe.printStackTrace(); - return def; - } - } else { - return getInt(d, def); - } - } - - public static BufferedImage getImage(MapleData data) { - return ((MapleCanvas) data.getData()).getImage(); - } - - public static Point getPoint(MapleData data) { - return ((Point) data.getData()); - } - - public static Point getPoint(String path, MapleData data) { - return getPoint(data.getChildByPath(path)); - } - - public static Point getPoint(String path, MapleData data, Point def) { - final MapleData pointData = data.getChildByPath(path); - if (pointData == null) { - return def; - } - return getPoint(pointData); - } - - public static String getFullDataPath(MapleData data) { - String path = ""; - MapleDataEntity myData = data; - while (myData != null) { - path = myData.getName() + "/" + path; - myData = myData.getParent(); - } - return path.substring(0, path.length() - 1); - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/wz/FileStoredPngMapleCanvas.java b/tools/MapleCashCosmeticsFetcher/src/provider/wz/FileStoredPngMapleCanvas.java deleted file mode 100644 index 21736c2c16..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/wz/FileStoredPngMapleCanvas.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import javax.imageio.ImageIO; -import provider.MapleCanvas; - -public class FileStoredPngMapleCanvas implements MapleCanvas { - private File file; - private int width; - private int height; - private BufferedImage image; - - public FileStoredPngMapleCanvas(int width, int height, File fileIn) { - this.width = width; - this.height = height; - this.file = fileIn; - } - - @Override - public int getHeight() { - return height; - } - - @Override - public int getWidth() { - return width; - } - - @Override - public BufferedImage getImage() { - loadImageIfNecessary(); - return image; - } - - private void loadImageIfNecessary() { - if (image == null) { - try { - image = ImageIO.read(file); - // replace the dimensions loaded from the wz by the REAL dimensions from the image - should be equal tho - width = image.getWidth(); - height = image.getHeight(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/wz/ImgMapleSound.java b/tools/MapleCashCosmeticsFetcher/src/provider/wz/ImgMapleSound.java deleted file mode 100644 index 8add2ccb36..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/wz/ImgMapleSound.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -public class ImgMapleSound { - private int dataLength, offset; - - public ImgMapleSound(int dataLength, int offset) { - this.dataLength = dataLength; - this.offset = offset; - } - - public int getDataLength() { - return dataLength; - } - - public int getOffset() { - return offset; - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/wz/ListWZFile.java b/tools/MapleCashCosmeticsFetcher/src/provider/wz/ListWZFile.java deleted file mode 100644 index 1672a08c59..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/wz/ListWZFile.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import provider.MapleDataProviderFactory; -import tools.data.input.GenericLittleEndianAccessor; -import tools.data.input.InputStreamByteStream; -import tools.data.input.LittleEndianAccessor; - -public class ListWZFile { - private LittleEndianAccessor lea; - private List entries = new ArrayList(); - private static Collection modernImgs = new HashSet(); - - public static byte[] xorBytes(byte[] a, byte[] b) { - byte[] wusched = new byte[a.length]; - for (int i = 0; i < a.length; i++) { - wusched[i] = (byte) (a[i] ^ b[i]); - } - return wusched; - } - - public ListWZFile(File listwz) throws FileNotFoundException { - lea = new GenericLittleEndianAccessor(new InputStreamByteStream(new BufferedInputStream(new FileInputStream(listwz)))); - while (lea.available() > 0) { - int l = lea.readInt() * 2; - byte[] chunk = new byte[l]; - for (int i = 0; i < chunk.length; i++) { - chunk[i] = lea.readByte(); - } - lea.readChar(); - final String value = String.valueOf(WZTool.readListString(chunk)); - entries.add(value); - } - entries = Collections.unmodifiableList(entries); - } - - public List getEntries() { - return entries; - } - - public static void init() { - final String listWz = System.getProperty("listwz"); - if (listWz != null) { - ListWZFile listwz; - try { - listwz = new ListWZFile(MapleDataProviderFactory.fileInWZPath("List.wz")); - modernImgs = new HashSet(listwz.getEntries()); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - } - - public static boolean isModernImgFile(String path) { - return modernImgs.contains(path); - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/wz/MapleDataType.java b/tools/MapleCashCosmeticsFetcher/src/provider/wz/MapleDataType.java deleted file mode 100644 index e074d57d14..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/wz/MapleDataType.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -public enum MapleDataType { - NONE, IMG_0x00, SHORT, INT, FLOAT, DOUBLE, STRING, EXTENDED, PROPERTY, CANVAS, VECTOR, CONVEX, SOUND, UOL, UNKNOWN_TYPE, UNKNOWN_EXTENDED_TYPE; -} \ No newline at end of file diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/wz/PNGMapleCanvas.java b/tools/MapleCashCosmeticsFetcher/src/provider/wz/PNGMapleCanvas.java deleted file mode 100644 index 97c2303804..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/wz/PNGMapleCanvas.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.Point; -import java.awt.image.BufferedImage; -import java.awt.image.DataBuffer; -import java.awt.image.DataBufferByte; -import java.awt.image.PixelInterleavedSampleModel; -import java.awt.image.Raster; -import java.awt.image.SampleModel; -import java.awt.image.WritableRaster; -import java.util.zip.DataFormatException; -import java.util.zip.Inflater; -import provider.MapleCanvas; - -public class PNGMapleCanvas implements MapleCanvas { - private static final int[] ZAHLEN = new int[]{2, 1, 0, 3}; - private int height; - private int width; - private int dataLength; - private int format; - private byte[] data; - - public PNGMapleCanvas(int width, int height, int dataLength, int format, byte[] data) { - super(); - this.height = height; - this.width = width; - this.dataLength = dataLength; - this.format = format; - this.data = data; - } - - public int getHeight() { - return height; - } - - public int getWidth() { - return width; - } - - public int getFormat() { - return format; - } - - private byte[] getData() { - return data; - } - - @Override - public BufferedImage getImage() { - int sizeUncompressed = 0; - int size8888 = 0; - int maxWriteBuf = 2; - int maxHeight = 3; - byte[] writeBuf = new byte[maxWriteBuf]; - @SuppressWarnings ("unused") - byte[] rowPointers = new byte[maxHeight]; - switch (getFormat()) { - case 1: - case 513: - sizeUncompressed = getHeight() * getWidth() * 4; - break; - case 2: - sizeUncompressed = getHeight() * getWidth() * 8; - break; - case 517: - sizeUncompressed = getHeight() * getWidth() / 128; - break; - } - size8888 = getHeight() * getWidth() * 8; - if (size8888 > maxWriteBuf) { - maxWriteBuf = size8888; - writeBuf = new byte[maxWriteBuf]; - } - if (getHeight() > maxHeight) { - maxHeight = getHeight(); - rowPointers = new byte[maxHeight]; - } - Inflater dec = new Inflater(); - dec.setInput(getData(), 0, dataLength); - int declen = 0; - byte[] uc = new byte[sizeUncompressed]; - try { - declen = dec.inflate(uc); - } catch (DataFormatException ex) { - throw new RuntimeException("zlib fucks", ex); - } - dec.end(); - if (getFormat() == 1) { - for (int i = 0; i < sizeUncompressed; i++) { - byte low = (byte) (uc[i] & 0x0F); - byte high = (byte) (uc[i] & 0xF0); - writeBuf[(i << 1)] = (byte) (((low << 4) | low) & 0xFF); - writeBuf[(i << 1) + 1] = (byte) (high | ((high >>> 4) & 0xF)); - } - } else if (getFormat() == 2) { - writeBuf = uc; - } else if (getFormat() == 513) { - for (int i = 0; i < declen; i += 2) { - byte bBits = (byte) ((uc[i] & 0x1F) << 3); - byte gBits = (byte) (((uc[i + 1] & 0x07) << 5) | ((uc[i] & 0xE0) >> 3)); - byte rBits = (byte) (uc[i + 1] & 0xF8); - writeBuf[(i << 1)] = (byte) (bBits | (bBits >> 5)); - writeBuf[(i << 1) + 1] = (byte) (gBits | (gBits >> 6)); - writeBuf[(i << 1) + 2] = (byte) (rBits | (rBits >> 5)); - writeBuf[(i << 1) + 3] = (byte) 0xFF; - } - } else if (getFormat() == 517) { - byte b = 0x00; - int pixelIndex = 0; - for (int i = 0; i < declen; i++) { - for (int j = 0; j < 8; j++) { - b = (byte) (((uc[i] & (0x01 << (7 - j))) >> (7 - j)) * 255); - for (int k = 0; k < 16; k++) { - pixelIndex = (i << 9) + (j << 6) + k * 2; - writeBuf[pixelIndex] = b; - writeBuf[pixelIndex + 1] = b; - writeBuf[pixelIndex + 2] = b; - writeBuf[pixelIndex + 3] = (byte) 0xFF; - } - } - } - } - DataBufferByte imgData = new DataBufferByte(writeBuf, sizeUncompressed); - SampleModel sm = new PixelInterleavedSampleModel(DataBuffer.TYPE_BYTE, getWidth(), getHeight(), 4, getWidth() * 4, ZAHLEN); - WritableRaster imgRaster = Raster.createWritableRaster(sm, imgData, new Point(0, 0)); - BufferedImage aa = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); - aa.setData(imgRaster); - return aa; - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZDirectoryEntry.java b/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZDirectoryEntry.java deleted file mode 100644 index d24b8cb2b9..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZDirectoryEntry.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataEntity; -import provider.MapleDataEntry; -import provider.MapleDataFileEntry; - -public class WZDirectoryEntry extends WZEntry implements MapleDataDirectoryEntry { - private List subdirs = new ArrayList(); - private List files = new ArrayList(); - private Map entries = new HashMap(); - - public WZDirectoryEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(name, size, checksum, parent); - } - - public WZDirectoryEntry() { - super(null, 0, 0, null); - } - - public void addDirectory(MapleDataDirectoryEntry dir) { - subdirs.add(dir); - entries.put(dir.getName(), dir); - } - - public void addFile(MapleDataFileEntry fileEntry) { - files.add(fileEntry); - entries.put(fileEntry.getName(), fileEntry); - } - - public List getSubdirectories() { - return Collections.unmodifiableList(subdirs); - } - - public List getFiles() { - return Collections.unmodifiableList(files); - } - - public MapleDataEntry getEntry(String name) { - return entries.get(name); - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZEntry.java b/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZEntry.java deleted file mode 100644 index 1e921b2082..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZEntry.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import provider.MapleDataEntity; -import provider.MapleDataEntry; - -public class WZEntry implements MapleDataEntry { - private String name; - private int size; - private int checksum; - private int offset; - private MapleDataEntity parent; - - public WZEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(); - this.name = name; - this.size = size; - this.checksum = checksum; - this.parent = parent; - } - - public String getName() { - return name; - } - - public int getSize() { - return size; - } - - public int getChecksum() { - return checksum; - } - - public int getOffset() { - return offset; - } - - public MapleDataEntity getParent() { - return parent; - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZFile.java b/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZFile.java deleted file mode 100644 index c6c0abf537..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZFile.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.RandomAccessFile; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataFileEntry; -import provider.MapleDataProvider; -import tools.data.input.GenericLittleEndianAccessor; -import tools.data.input.GenericSeekableLittleEndianAccessor; -import tools.data.input.InputStreamByteStream; -import tools.data.input.LittleEndianAccessor; -import tools.data.input.RandomAccessByteStream; -import tools.data.input.SeekableLittleEndianAccessor; - -public class WZFile implements MapleDataProvider { - static { - ListWZFile.init(); - } - private File wzfile; - private LittleEndianAccessor lea; - private SeekableLittleEndianAccessor slea; - private int headerSize; - private WZDirectoryEntry root; - private boolean provideImages; - private int cOffset; - - public WZFile(File wzfile, boolean provideImages) throws IOException { - this.wzfile = wzfile; - lea = new GenericLittleEndianAccessor(new InputStreamByteStream(new BufferedInputStream(new FileInputStream(wzfile)))); - RandomAccessFile raf = new RandomAccessFile(wzfile, "r"); - slea = new GenericSeekableLittleEndianAccessor(new RandomAccessByteStream(raf)); - root = new WZDirectoryEntry(wzfile.getName(), 0, 0, null); - this.provideImages = provideImages; - load(); - } - - private void load() throws IOException { - lea.readAsciiString(4); - lea.readInt(); - lea.readInt(); - headerSize = lea.readInt(); - lea.readNullTerminatedAsciiString(); - lea.readShort(); - parseDirectory(root); - cOffset = (int) lea.getBytesRead(); - getOffsets(root); - } - - private void getOffsets(MapleDataDirectoryEntry dir) { - for (MapleDataFileEntry file : dir.getFiles()) { - file.setOffset(cOffset); - cOffset += file.getSize(); - } - for (MapleDataDirectoryEntry sdir : dir.getSubdirectories()) { - getOffsets(sdir); - } - } - - private void parseDirectory(WZDirectoryEntry dir) { - int entries = WZTool.readValue(lea); - for (int i = 0; i < entries; i++) { - byte marker = lea.readByte(); - String name = null; - int size, checksum; - switch (marker) { - case 0x02: - name = WZTool.readDecodedStringAtOffsetAndReset(slea, lea.readInt() + this.headerSize + 1); - size = WZTool.readValue(lea); - checksum = WZTool.readValue(lea); - lea.readInt(); //dummy int - dir.addFile(new WZFileEntry(name, size, checksum, dir)); - break; - case 0x03: - case 0x04: - name = WZTool.readDecodedString(lea); - size = WZTool.readValue(lea); - checksum = WZTool.readValue(lea); - lea.readInt(); //dummy int - if (marker == 3) { - dir.addDirectory(new WZDirectoryEntry(name, size, checksum, dir)); - } else { - dir.addFile(new WZFileEntry(name, size, checksum, dir)); - } - break; - default: - } - } - for (MapleDataDirectoryEntry idir : dir.getSubdirectories()) { - parseDirectory((WZDirectoryEntry) idir); - } - } - - public WZIMGFile getImgFile(String path) throws IOException { - String segments[] = path.split("/"); - WZDirectoryEntry dir = root; - for (int x = 0; x < segments.length - 1; x++) { - dir = (WZDirectoryEntry) dir.getEntry(segments[x]); - if (dir == null) { - return null; - } - } - WZFileEntry entry = (WZFileEntry) dir.getEntry(segments[segments.length - 1]); - if (entry == null) { - return null; - } - String fullPath = wzfile.getName().substring(0, wzfile.getName().length() - 3).toLowerCase() + "/" + path; - return new WZIMGFile(this.wzfile, entry, provideImages, ListWZFile.isModernImgFile(fullPath)); - } - - @Override - public synchronized MapleData getData(String path) { - try { - WZIMGFile imgFile = getImgFile(path); - if (imgFile == null) { - return null; - } - MapleData ret = imgFile.getRoot(); - return ret; - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - @Override - public MapleDataDirectoryEntry getRoot() { - return root; - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZFileEntry.java b/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZFileEntry.java deleted file mode 100644 index 792371d9cf..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZFileEntry.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import provider.MapleDataEntity; -import provider.MapleDataFileEntry; - -public class WZFileEntry extends WZEntry implements MapleDataFileEntry { - private int offset; - - public WZFileEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(name, size, checksum, parent); - } - - @Override - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZIMGEntry.java b/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZIMGEntry.java deleted file mode 100644 index 385d785183..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZIMGEntry.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import provider.MapleData; -import provider.MapleDataEntity; - -public class WZIMGEntry implements MapleData { - private String name; - private MapleDataType type; - private List children = new ArrayList(10); - private Object data; - private MapleDataEntity parent; - - public WZIMGEntry(MapleDataEntity parent) { - this.parent = parent; - } - - @Override - public String getName() { - return name; - } - - @Override - public MapleDataType getType() { - return type; - } - - @Override - public List getChildren() { - return Collections.unmodifiableList(children); - } - - @Override - public MapleData getChildByPath(String path) { - String segments[] = path.split("/"); - if (segments[0].equals("..")) { - return ((MapleData) getParent()).getChildByPath(path.substring(path.indexOf("/") + 1)); - } - MapleData ret = this; - for (int x = 0; x < segments.length; x++) { - boolean foundChild = false; - for (MapleData child : ret.getChildren()) { - if (child.getName().equals(segments[x])) { - ret = child; - foundChild = true; - break; - } - } - if (!foundChild) { - return null; - } - } - return ret; - } - - @Override - public Object getData() { - return data; - } - - public void setName(String name) { - this.name = name; - } - - public void setType(MapleDataType type) { - this.type = type; - } - - public void setData(Object data) { - this.data = data; - } - - public void addChild(WZIMGEntry entry) { - children.add(entry); - } - - @Override - public Iterator iterator() { - return getChildren().iterator(); - } - - @Override - public String toString() { - return getName() + ":" + getData(); - } - - public MapleDataEntity getParent() { - return parent; - } - - public void finish() { - ((ArrayList) children).trimToSize(); - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZIMGFile.java b/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZIMGFile.java deleted file mode 100644 index bec06c78bd..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZIMGFile.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.Point; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.io.RandomAccessFile; -import tools.data.input.GenericSeekableLittleEndianAccessor; -import tools.data.input.RandomAccessByteStream; -import tools.data.input.SeekableLittleEndianAccessor; - -public class WZIMGFile { - private WZFileEntry file; - private WZIMGEntry root; - private boolean provideImages; - @SuppressWarnings ("unused") - private boolean modernImg; - - public WZIMGFile(File wzfile, WZFileEntry file, boolean provideImages, boolean modernImg) throws IOException { - RandomAccessFile raf = new RandomAccessFile(wzfile, "r"); - SeekableLittleEndianAccessor slea = new GenericSeekableLittleEndianAccessor(new RandomAccessByteStream(raf)); - slea.seek(file.getOffset()); - this.file = file; - this.provideImages = provideImages; - root = new WZIMGEntry(file.getParent()); - root.setName(file.getName()); - root.setType(MapleDataType.EXTENDED); - this.modernImg = modernImg; - parseExtended(root, slea, 0); - root.finish(); - raf.close(); - } - - protected void dumpImg(OutputStream out, SeekableLittleEndianAccessor slea) throws IOException { - DataOutputStream os = new DataOutputStream(out); - long oldPos = slea.getPosition(); - slea.seek(file.getOffset()); - for (int x = 0; x < file.getSize(); x++) { - os.write(slea.readByte()); - } - slea.seek(oldPos); - } - - public WZIMGEntry getRoot() { - return root; - } - - private void parse(WZIMGEntry entry, SeekableLittleEndianAccessor slea) { - byte marker = slea.readByte(); - switch (marker) { - case 0: { - String name = WZTool.readDecodedString(slea); - entry.setName(name); - break; - } - case 1: { - String name = WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt()); - entry.setName(name); - break; - } - default: - System.out.println("Unknown Image identifier: " + marker + " at offset " + (slea.getPosition() - file.getOffset())); - } - marker = slea.readByte(); - switch (marker) { - case 0: - entry.setType(MapleDataType.IMG_0x00); - break; - case 2: - case 11: //??? no idea, since 0.49 - entry.setType(MapleDataType.SHORT); - entry.setData(Short.valueOf(slea.readShort())); - break; - case 3: - entry.setType(MapleDataType.INT); - entry.setData(Integer.valueOf(WZTool.readValue(slea))); - break; - case 4: - entry.setType(MapleDataType.FLOAT); - entry.setData(Float.valueOf(WZTool.readFloatValue(slea))); - break; - case 5: - entry.setType(MapleDataType.DOUBLE); - entry.setData(Double.valueOf(slea.readDouble())); - break; - case 8: - entry.setType(MapleDataType.STRING); - byte iMarker = slea.readByte(); - if (iMarker == 0) { - entry.setData(WZTool.readDecodedString(slea)); - } else if (iMarker == 1) { - entry.setData(WZTool.readDecodedStringAtOffsetAndReset(slea, slea.readInt() + file.getOffset())); - } else { - System.out.println("Unknown String type " + iMarker); - } - break; - case 9: - entry.setType(MapleDataType.EXTENDED); - long endOfExtendedBlock = slea.readInt(); - endOfExtendedBlock += slea.getPosition(); - parseExtended(entry, slea, endOfExtendedBlock); - break; - default: - System.out.println("Unknown Image type " + marker); - } - } - - private void parseExtended(WZIMGEntry entry, SeekableLittleEndianAccessor slea, long endOfExtendedBlock) { - byte marker = slea.readByte(); - String type; - switch (marker) { - case 0x73: - type = WZTool.readDecodedString(slea); - break; - case 0x1B: - type = WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt()); - break; - default: - throw new RuntimeException("Unknown extended image identifier: " + marker + " at offset " + - (slea.getPosition() - file.getOffset())); - } - if (type.equals("Property")) { - entry.setType(MapleDataType.PROPERTY); - slea.readByte(); - slea.readByte(); - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry cEntry = new WZIMGEntry(entry); - parse(cEntry, slea); - cEntry.finish(); - entry.addChild(cEntry); - } - } else if (type.equals("Canvas")) { - entry.setType(MapleDataType.CANVAS); - slea.readByte(); - marker = slea.readByte(); - if (marker == 0) { - // do nothing - } else if (marker == 1) { - slea.readByte(); - slea.readByte(); - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry child = new WZIMGEntry(entry); - parse(child, slea); - child.finish(); - entry.addChild(child); - } - } else { - System.out.println("Canvas marker != 1 (" + marker + ")"); - } - int width = WZTool.readValue(slea); - int height = WZTool.readValue(slea); - int format = WZTool.readValue(slea); - int format2 = slea.readByte(); - slea.readInt(); - int dataLength = slea.readInt() - 1; - slea.readByte(); - if (provideImages) { - byte[] pngdata = slea.read(dataLength); - entry.setData(new PNGMapleCanvas(width, height, dataLength, format + format2, pngdata)); - } else { - entry.setData(new PNGMapleCanvas(width, height, dataLength, format + format2, null)); - slea.skip(dataLength); - } - } else if (type.equals("Shape2D#Vector2D")) { - entry.setType(MapleDataType.VECTOR); - int x = WZTool.readValue(slea); - int y = WZTool.readValue(slea); - entry.setData(new Point(x, y)); - } else if (type.equals("Shape2D#Convex2D")) { - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry cEntry = new WZIMGEntry(entry); - parseExtended(cEntry, slea, 0); - cEntry.finish(); - entry.addChild(cEntry); - } - } else if (type.equals("Sound_DX8")) { - entry.setType(MapleDataType.SOUND); - slea.readByte(); - int dataLength = WZTool.readValue(slea); - WZTool.readValue(slea); // no clue what this is - int offset = (int) slea.getPosition(); - entry.setData(new ImgMapleSound(dataLength, offset - file.getOffset())); - slea.seek(endOfExtendedBlock); - } else if (type.equals("UOL")) { - entry.setType(MapleDataType.UOL); - slea.readByte(); - byte uolmarker = slea.readByte(); - switch (uolmarker) { - case 0: - entry.setData(WZTool.readDecodedString(slea)); - break; - case 1: - entry.setData(WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt())); - break; - default: - System.out.println("Unknown UOL marker: " + uolmarker + " " + entry.getName()); - } - } else { - throw new RuntimeException("Unhandled extended type: " + type); - } - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZTool.java b/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZTool.java deleted file mode 100644 index 7f5452cd03..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/wz/WZTool.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import tools.data.input.LittleEndianAccessor; -import tools.data.input.SeekableLittleEndianAccessor; - -import javax.crypto.BadPaddingException; -import javax.crypto.Cipher; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.NoSuchPaddingException; -import javax.crypto.spec.SecretKeySpec; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; - -/* - * Ported Code, see WZFile.java for more info - */ -public class WZTool { - private static byte[] encKey; - - static { - byte[] iv = new byte[]{(byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b,}; - byte[] key = new byte[]{(byte) 0x13, 0x00, 0x00, 0x00, - (byte) 0x08, 0x00, 0x00, 0x00, - (byte) 0x06, 0x00, 0x00, 0x00, - (byte) 0xB4, 0x00, 0x00, 0x00, - (byte) 0x1B, 0x00, 0x00, 0x00, - (byte) 0x0F, 0x00, 0x00, 0x00, - (byte) 0x33, 0x00, 0x00, 0x00, - (byte) 0x52, 0x00, 0x00, 0x00 - }; - Cipher cipher = null; - SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); - try { - cipher = Cipher.getInstance("AES"); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (NoSuchPaddingException e) { - e.printStackTrace(); - } - try { - cipher.init(Cipher.ENCRYPT_MODE, skeySpec); - } catch (InvalidKeyException e) { - e.printStackTrace(); - } - encKey = new byte[0xFFFF]; - for (int i = 0; i < (0xFFFF / 16); i++) { - try { - iv = cipher.doFinal(iv); - } catch (IllegalBlockSizeException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } - System.arraycopy(iv, 0, encKey, (i * 16), 16); - } - try { - iv = cipher.doFinal(iv); - } catch (IllegalBlockSizeException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } - System.arraycopy(iv, 0, encKey, 65520, 15); - } - - public static byte[] readListString(byte[] str) { - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ encKey[i]); - } - return str; - } - - public static String readDecodedString(LittleEndianAccessor llea) { - int strLength; - byte b = llea.readByte(); - if (b == 0x00) { - return ""; - } - if (b >= 0) { - if (b == 0x7F) { - strLength = llea.readInt(); - } else { - strLength = b; - } - if (strLength < 0) { - return ""; - } - byte str[] = new byte[strLength * 2]; - for (int i = 0; i < strLength * 2; i++) { - str[i] = llea.readByte(); - } - return DecryptUnicodeStr(str); - } else { - if (b == -128) { - strLength = llea.readInt(); - } else { - strLength = -b; - } - if (strLength < 0) { - return ""; - } - byte str[] = new byte[strLength]; - for (int i = 0; i < strLength; i++) { - str[i] = llea.readByte(); - } - return DecryptAsciiStr(str); - } - } - - public static String DecryptAsciiStr(byte[] str) { - byte xorByte = (byte) 0xAA; - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ xorByte ^ encKey[i]); - xorByte++; - } - return new String(str); - } - - public static String DecryptUnicodeStr(byte[] str) { - int xorByte = 0xAAAA; - char[] charRet = new char[str.length / 2]; - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ encKey[i]); - } - for (int i = 0; i < (str.length / 2); i++) { - char toXor = (char) ((str[i] << 8) | str[i + 1]); - charRet[i] = (char) (toXor ^ xorByte); - xorByte++; - } - return String.valueOf(charRet); - } - - public static String readDecodedStringAtOffset(SeekableLittleEndianAccessor slea, int offset) { - slea.seek(offset); - return readDecodedString(slea); - } - - public static String readDecodedStringAtOffsetAndReset(SeekableLittleEndianAccessor slea, int offset) { - long pos = 0; - pos = slea.getPosition(); - slea.seek(offset); - String ret = readDecodedString(slea); - slea.seek(pos); - return ret; - } - - public static int readValue(LittleEndianAccessor lea) { - byte b = lea.readByte(); - if (b == -128) { - return lea.readInt(); - } else { - return b; - } - } - - public static float readFloatValue(LittleEndianAccessor lea) { - byte b = lea.readByte(); - if (b == -128) { - return lea.readFloat(); - } else { - return 0; - } - } -} \ No newline at end of file diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/wz/XMLDomMapleData.java b/tools/MapleCashCosmeticsFetcher/src/provider/wz/XMLDomMapleData.java deleted file mode 100644 index 151a04c2fd..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/wz/XMLDomMapleData.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package provider.wz; - -import java.awt.Point; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.text.NumberFormat; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import provider.MapleData; -import provider.MapleDataEntity; -import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -public class XMLDomMapleData implements MapleData { - private Node node; - private File imageDataDir; - private NumberFormat nf; - - public XMLDomMapleData(FileInputStream fis, File imageDataDir) { - try { - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - Document document = documentBuilder.parse(fis); - this.node = document.getFirstChild(); - } catch (ParserConfigurationException e) { - throw new RuntimeException(e); - } catch (SAXException e) { - throw new RuntimeException(e); - } catch (IOException e) { - throw new RuntimeException(e); - } - this.imageDataDir = imageDataDir; - this.nf = NumberFormat.getInstance(Locale.FRANCE); - } - - private XMLDomMapleData(Node node) { - this.node = node; - this.nf = NumberFormat.getInstance(Locale.FRANCE); - } - - @Override - public MapleData getChildByPath(String path) { - String segments[] = path.split("/"); - if (segments[0].equals("..")) { - return ((MapleData) getParent()).getChildByPath(path.substring(path.indexOf("/") + 1)); - } - - Node myNode = node; - for (int x = 0; x < segments.length; x++) { - NodeList childNodes = myNode.getChildNodes(); - boolean foundChild = false; - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if (childNode.getNodeType() == Node.ELEMENT_NODE && childNode.getAttributes().getNamedItem("name").getNodeValue().equals(segments[x])) { - myNode = childNode; - foundChild = true; - break; - } - } - if (!foundChild) { - return null; - } - } - XMLDomMapleData ret = new XMLDomMapleData(myNode); - ret.imageDataDir = new File(imageDataDir, getName() + "/" + path).getParentFile(); - return ret; - } - - @Override - public List getChildren() { - List ret = new ArrayList(); - NodeList childNodes = node.getChildNodes(); - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if (childNode.getNodeType() == Node.ELEMENT_NODE) { - XMLDomMapleData child = new XMLDomMapleData(childNode); - child.imageDataDir = new File(imageDataDir, getName()); - ret.add(child); - } - } - return ret; - } - - @Override - public Object getData() { - NamedNodeMap attributes = node.getAttributes(); - MapleDataType type = getType(); - switch (type) { - case DOUBLE: - case FLOAT: - case INT: - case SHORT: { - String value = attributes.getNamedItem("value").getNodeValue(); - Number nval; - - try { - nval = nf.parse(value); - } - catch(java.text.ParseException pe) { - pe.printStackTrace(); - nval = 0.0f; - } - - switch (type) { - case DOUBLE: - return nval.doubleValue(); - case FLOAT: - return nval.floatValue(); - case INT: - return nval.intValue(); - case SHORT: - return nval.shortValue(); - default: - return null; - } - } - case STRING: - case UOL: { - String value = attributes.getNamedItem("value").getNodeValue(); - return value; - } - case VECTOR: { - String x = attributes.getNamedItem("x").getNodeValue(); - String y = attributes.getNamedItem("y").getNodeValue(); - return new Point(Integer.parseInt(x), Integer.parseInt(y)); - } - case CANVAS: { - String width = attributes.getNamedItem("width").getNodeValue(); - String height = attributes.getNamedItem("height").getNodeValue(); - return new FileStoredPngMapleCanvas(Integer.parseInt(width), Integer.parseInt(height), new File( - imageDataDir, getName() + ".png")); - } - default: - return null; - } - } - - @Override - public MapleDataType getType() { - String nodeName = node.getNodeName(); - if (nodeName.equals("imgdir")) { - return MapleDataType.PROPERTY; - } else if (nodeName.equals("canvas")) { - return MapleDataType.CANVAS; - } else if (nodeName.equals("convex")) { - return MapleDataType.CONVEX; - } else if (nodeName.equals("sound")) { - return MapleDataType.SOUND; - } else if (nodeName.equals("uol")) { - return MapleDataType.UOL; - } else if (nodeName.equals("double")) { - return MapleDataType.DOUBLE; - } else if (nodeName.equals("float")) { - return MapleDataType.FLOAT; - } else if (nodeName.equals("int")) { - return MapleDataType.INT; - } else if (nodeName.equals("short")) { - return MapleDataType.SHORT; - } else if (nodeName.equals("string")) { - return MapleDataType.STRING; - } else if (nodeName.equals("vector")) { - return MapleDataType.VECTOR; - } else if (nodeName.equals("null")) { - return MapleDataType.IMG_0x00; - } - return null; - } - - @Override - public MapleDataEntity getParent() { - Node parentNode = node.getParentNode(); - if (parentNode.getNodeType() == Node.DOCUMENT_NODE) { - return null; - } - XMLDomMapleData parentData = new XMLDomMapleData(parentNode); - parentData.imageDataDir = imageDataDir.getParentFile(); - return parentData; - } - - @Override - public String getName() { - return node.getAttributes().getNamedItem("name").getNodeValue(); - } - - @Override - public Iterator iterator() { - return getChildren().iterator(); - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/provider/wz/XMLWZFile.java b/tools/MapleCashCosmeticsFetcher/src/provider/wz/XMLWZFile.java deleted file mode 100644 index 2a7694fdc9..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/provider/wz/XMLWZFile.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataProvider; - -public class XMLWZFile implements MapleDataProvider { - private File root; - private WZDirectoryEntry rootForNavigation; - - public XMLWZFile(File fileIn) { - root = fileIn; - rootForNavigation = new WZDirectoryEntry(fileIn.getName(), 0, 0, null); - fillMapleDataEntitys(root, rootForNavigation); - } - - private void fillMapleDataEntitys(File lroot, WZDirectoryEntry wzdir) { - for (File file : lroot.listFiles()) { - String fileName = file.getName(); - if (file.isDirectory() && !fileName.endsWith(".img")) { - WZDirectoryEntry newDir = new WZDirectoryEntry(fileName, 0, 0, wzdir); - wzdir.addDirectory(newDir); - fillMapleDataEntitys(file, newDir); - } else if (fileName.endsWith(".xml")) { - wzdir.addFile(new WZFileEntry(fileName.substring(0, fileName.length() - 4), 0, 0, wzdir)); - } - } - } - - @Override - public MapleData getData(String path) { - File dataFile = new File(root, path + ".xml"); - File imageDataDir = new File(root, path); - if (!dataFile.exists()) { - return null;//bitches - } - FileInputStream fis; - try { - fis = new FileInputStream(dataFile); - } catch (FileNotFoundException e) { - throw new RuntimeException("Datafile " + path + " does not exist in " + root.getAbsolutePath()); - } - final XMLDomMapleData domMapleData; - try { - domMapleData = new XMLDomMapleData(fis, imageDataDir.getParentFile()); - } finally { - try { - fis.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - return domMapleData; - } - - @Override - public MapleDataDirectoryEntry getRoot() { - return rootForNavigation; - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/ArrayMap.java b/tools/MapleCashCosmeticsFetcher/src/tools/ArrayMap.java deleted file mode 100644 index c08508f7e3..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/ArrayMap.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools; - -import java.util.AbstractMap; -import java.util.AbstractSet; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -public class ArrayMap extends AbstractMap { - - static class Entry implements Map.Entry { - protected K key; - protected V value; - - public Entry(K key, V value) { - this.key = key; - this.value = value; - } - - @Override - public K getKey() { - return key; - } - - @Override - public V getValue() { - return value; - } - - @Override - public V setValue(V newValue) { - V oldValue = value; - value = newValue; - return oldValue; - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof Map.Entry)) { - return false; - } - Map.Entry e = (Map.Entry) o; - return (key == null ? e.getKey() == null : key.equals(e.getKey())) && (value == null ? e.getValue() == null : value.equals(e.getValue())); - } - - @Override - public int hashCode() { - int keyHash = (key == null ? 0 : key.hashCode()); - int valueHash = (value == null ? 0 : value.hashCode()); - return keyHash ^ valueHash; - } - - @Override - public String toString() { - return key + "=" + value; - } - } - private Set> entries = null; - private ArrayList> list; - - public ArrayMap() { - list = new ArrayList<>(); - } - - public ArrayMap(Map map) { - list = new ArrayList<>(); - putAll(map); - } - - public ArrayMap(int initialCapacity) { - list = new ArrayList<>(initialCapacity); - } - - @Override - @SuppressWarnings ("unchecked") - public Set> entrySet() { - if (entries == null) { - entries = new AbstractSet>() { - @Override - public void clear() { - throw new UnsupportedOperationException(); - } - - @Override - public Iterator> iterator() { - return list.iterator(); - } - - @Override - public int size() { - return list.size(); - } - }; - } - return (Set>) entries; - } - - @Override - public V put(K key, V value) { - int size = list.size(); - Entry entry = null; - int i; - if (key == null) { - for (i = 0; i < size; i++) { - entry = (list.get(i)); - if (entry.getKey() == null) { - break; - } - } - } else { - for (i = 0; i < size; i++) { - entry = (list.get(i)); - if (key.equals(entry.getKey())) { - break; - } - } - } - V oldValue = null; - if (i < size) { - oldValue = entry.getValue(); - entry.setValue(value); - } else { - list.add(new Entry<>(key, value)); - } - return oldValue; - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/DatabaseConnection.java b/tools/MapleCashCosmeticsFetcher/src/tools/DatabaseConnection.java deleted file mode 100644 index b887280343..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/DatabaseConnection.java +++ /dev/null @@ -1,51 +0,0 @@ -package tools; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; - -/** - * @author Frz (Big Daddy) - * @author The Real Spookster - some modifications to this beautiful code - */ -public class DatabaseConnection { - private static String DB_URL = "jdbc:mysql://localhost:3306/cosmic"; - private static String DB_USER = "cosmic_server"; - private static String DB_PASS = "snailshell"; - - public static final int RETURN_GENERATED_KEYS = 1; - - private static ThreadLocal con = new ThreadLocalConnection(); - - public static Connection getConnection() { - Connection c = con.get(); - try { - c.getMetaData(); - } catch (SQLException e) { // connection is dead, therefore discard old object 5ever - con.remove(); - c = con.get(); - } - return c; - } - - private static class ThreadLocalConnection extends ThreadLocal { - - @Override - protected Connection initialValue() { - try { - Class.forName("com.mysql.jdbc.Driver"); // touch the mysql driver - } catch (ClassNotFoundException e) { - System.out.println("[SEVERE] SQL Driver Not Found. Consider death by clams."); - e.printStackTrace(); - return null; - } - try { - return DriverManager.getConnection(DB_URL, DB_USER, DB_PASS); - } catch (SQLException e) { - System.out.println("[SEVERE] Unable to make database connection."); - e.printStackTrace(); - return null; - } - } - } -} \ No newline at end of file diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/FilePrinter.java b/tools/MapleCashCosmeticsFetcher/src/tools/FilePrinter.java deleted file mode 100644 index 340129765c..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/FilePrinter.java +++ /dev/null @@ -1,188 +0,0 @@ -package tools; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.text.SimpleDateFormat; -import java.util.Calendar; - -public class FilePrinter { - - public static final String - ACCOUNT_STUCK = "accountStuck.txt", - EXCEPTION_CAUGHT = "exceptionCaught.txt", - CLIENT_START = "clientStartError.txt", - ADD_PLAYER = "addPlayer.txt", - MAPLE_MAP = "mapleMap.txt", - ERROR38 = "error38.txt", - PACKET_LOG = "log.txt", - EXCEPTION = "exceptions.txt", - SQL_EXCEPTION = "sqlexceptions.txt", - PACKET_HANDLER = "PacketHandler/", - PORTAL = "portals/", - NPC = "npcs/", - INVOCABLE = "invocable/", - REACTOR = "reactors/", - QUEST = "quests/", - ITEM = "items/", - MOB_MOVEMENT = "mobmovement.txt", - MAP_SCRIPT = "mapscript/", - DIRECTION = "directions/", - SAVE_CHAR = "saveToDB.txt", - INSERT_CHAR = "insertCharacter.txt", - LOAD_CHAR = "loadCharFromDB.txt", - UNHANDLED_EVENT = "doesNotExist.txt", - SESSION = "sessions.txt", - EXPLOITS = "exploits/", - STORAGE = "storage/", - PACKET_LOGS = "packetlogs/", - DELETED_CHARACTERS = "deletedchars/", - FREDRICK = "fredrick/", - NPC_UNCODED = "uncodedNPCs.txt", - QUEST_UNCODED = "uncodedQuests.txt", - AUTOSAVING_CHARACTER = "saveCharAuto.txt", - SAVING_CHARACTER = "saveChar.txt", - USED_COMMANDS = "usedCommands.txt";//more to come (maps) - - private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //for file system purposes, it's nice to use yyyy-MM-dd - private static final String FILE_PATH = "logs/" + sdf.format(Calendar.getInstance().getTime()) + "/"; // + sdf.format(Calendar.getInstance().getTime()) + "/" - private static final String ERROR = "error/"; - - public static void printError(final String name, final Throwable t) { - System.out.println("Error thrown: " + name); - System.out.println(getString(t)); - FileOutputStream out = null; - final String file = FILE_PATH + ERROR + name; - try { - File outputFile = new File(file); - if (outputFile.getParentFile() != null) { - outputFile.getParentFile().mkdirs(); - } - out = new FileOutputStream(file, true); - out.write(getString(t).getBytes()); - out.write("\n---------------------------------\r\n".getBytes()); - } catch (IOException ess) { - ess.printStackTrace(); - } finally { - try { - if (out != null) { - out.close(); - } - } catch (IOException ignore) { - ignore.printStackTrace(); - } - } - } - - public static void printError(final String name, final Throwable t, final String info) { - System.out.println("Error thrown: " + name); - System.out.println(getString(t)); - FileOutputStream out = null; - final String file = FILE_PATH + ERROR + name; - try { - File outputFile = new File(file); - if (outputFile.getParentFile() != null) { - outputFile.getParentFile().mkdirs(); - } - out = new FileOutputStream(file, true); - out.write((info + "\r\n").getBytes()); - out.write(getString(t).getBytes()); - out.write("\n---------------------------------\r\n".getBytes()); - } catch (IOException ess) { - ess.printStackTrace(); - } finally { - try { - if (out != null) { - out.close(); - } - } catch (IOException ignore) { - ignore.printStackTrace(); - } - } - } - - public static void printError(final String name, final String s) { - System.out.println("Error thrown: " + name); - System.out.println(s); - FileOutputStream out = null; - final String file = FILE_PATH + ERROR + name; - try { - File outputFile = new File(file); - if (outputFile.getParentFile() != null) { - outputFile.getParentFile().mkdirs(); - } - out = new FileOutputStream(file, true); - out.write(s.getBytes()); - //out.write("\n---------------------------------\n".getBytes()); - } catch (IOException ess) { - ess.printStackTrace(); - } finally { - try { - if (out != null) { - out.close(); - } - } catch (IOException ignore) { - ignore.printStackTrace(); - } - } - } - - public static void print(final String name, final String s) { - print(name, s, true); - } - - public static void print(final String name, final String s, boolean line) { - System.out.println("Log: " + name); - System.out.println(s); - FileOutputStream out = null; - String file = FILE_PATH + name; - try { - File outputFile = new File(file); - if (outputFile.getParentFile() != null) { - outputFile.getParentFile().mkdirs(); - } - out = new FileOutputStream(file, true); - out.write(s.getBytes()); - out.write("\r\n".getBytes()); - if (line) { - out.write("---------------------------------\r\n".getBytes()); - } - } catch (IOException ess) { - ess.printStackTrace(); - } finally { - try { - if (out != null) { - out.close(); - } - } catch (IOException ignore) { - ignore.printStackTrace(); - } - } - } - - private static String getString(final Throwable e) { - String retValue = null; - StringWriter sw = null; - PrintWriter pw = null; - try { - sw = new StringWriter(); - pw = new PrintWriter(sw); - e.printStackTrace(pw); - retValue = sw.toString(); - } finally { - try { - if (pw != null) { - pw.close(); - } - if (sw != null) { - sw.close(); - } - } catch (IOException ignore) { - ignore.printStackTrace(); - } - } - return retValue; - } -} \ No newline at end of file diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/HexTool.java b/tools/MapleCashCosmeticsFetcher/src/tools/HexTool.java deleted file mode 100644 index 8cc0c8aa84..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/HexTool.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools; - -import java.io.ByteArrayOutputStream; - -public class HexTool { - private static final char[] HEX = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; - - private static String toString(byte byteValue) { - int tmp = byteValue << 8; - char[] retstr = new char[]{HEX[(tmp >> 12) & 0x0F], HEX[(tmp >> 8) & 0x0F]}; - return String.valueOf(retstr); - } - - public static String toString(byte[] bytes) { - StringBuilder hexed = new StringBuilder(); - for (int i = 0; i < bytes.length; i++) { - hexed.append(toString(bytes[i])); - hexed.append(' '); - } - return hexed.substring(0, hexed.length() - 1); - } - - public static byte[] getByteArrayFromHexString(String hex) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - int nexti = 0; - int nextb = 0; - boolean highoc = true; - outer: - for (;;) { - int number = -1; - while (number == -1) { - if (nexti == hex.length()) { - break outer; - } - char chr = hex.charAt(nexti); - if (chr >= '0' && chr <= '9') { - number = chr - '0'; - } else if (chr >= 'a' && chr <= 'f') { - number = chr - 'a' + 10; - } else if (chr >= 'A' && chr <= 'F') { - number = chr - 'A' + 10; - } else { - number = -1; - } - nexti++; - } - if (highoc) { - nextb = number << 4; - highoc = false; - } else { - nextb |= number; - highoc = true; - baos.write(nextb); - } - } - return baos.toByteArray(); - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/MapleItemInformationProvider.java b/tools/MapleCashCosmeticsFetcher/src/tools/MapleItemInformationProvider.java deleted file mode 100644 index 905459fd8f..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/MapleItemInformationProvider.java +++ /dev/null @@ -1,629 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package tools; - -import provider.*; - -import java.io.File; -import java.util.*; -//import server.life.MapleMonsterInformationProvider; - -/** - * - * @author Matze - * - */ -public class MapleItemInformationProvider { - - private static MapleItemInformationProvider instance = null; - protected MapleDataProvider itemData; - protected MapleDataProvider equipData; - protected MapleDataProvider stringData; - protected MapleData cashStringData; - protected MapleData consumeStringData; - protected MapleData eqpStringData; - protected MapleData etcStringData; - protected MapleData insStringData; - protected MapleData petStringData; - protected Map slotMaxCache = new HashMap<>(); - protected Map itemEffects = new HashMap<>(); - protected Map> equipStatsCache = new HashMap<>(); - protected Map equipCache = new HashMap<>(); - protected Map priceCache = new HashMap<>(); - protected Map wholePriceCache = new HashMap<>(); - protected Map projectileWatkCache = new HashMap<>(); - protected Map nameCache = new HashMap<>(); - protected Map descCache = new HashMap<>(); - protected Map msgCache = new HashMap<>(); - protected Map dropRestrictionCache = new HashMap<>(); - protected Map pickupRestrictionCache = new HashMap<>(); - protected Map getMesoCache = new HashMap<>(); - protected Map onEquipUntradableCache = new HashMap<>(); - protected Map karmaCache = new HashMap<>(); - protected Map triggerItemCache = new HashMap<>(); - protected Map expCache = new HashMap<>(); - protected Map levelCache = new HashMap<>(); - protected List> itemNameCache = new ArrayList<>(); - protected Map consumeOnPickupCache = new HashMap<>(); - protected Map isQuestItemCache = new HashMap<>(); - protected Map equipmentSlotCache = new HashMap<>(); - protected Map noCancelMouseCache = new HashMap<>(); - - private MapleItemInformationProvider() { - itemData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Item.wz")); - equipData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Character.wz")); - stringData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/String.wz")); - cashStringData = stringData.getData("Cash.img"); - consumeStringData = stringData.getData("Consume.img"); - eqpStringData = stringData.getData("Eqp.img"); - etcStringData = stringData.getData("Etc.img"); - insStringData = stringData.getData("Ins.img"); - petStringData = stringData.getData("Pet.img"); - } - - public static MapleItemInformationProvider getInstance() { - if (instance == null) { - instance = new MapleItemInformationProvider(); - } - return instance; - } - - public List> getAllItems() { - if (!itemNameCache.isEmpty()) { - return itemNameCache; - } - List> itemPairs = new ArrayList<>(); - MapleData itemsData; - itemsData = stringData.getData("Cash.img"); - for (MapleData itemFolder : itemsData.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - itemsData = stringData.getData("Consume.img"); - for (MapleData itemFolder : itemsData.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - itemsData = stringData.getData("Eqp.img").getChildByPath("Eqp"); - for (MapleData eqpType : itemsData.getChildren()) { - for (MapleData itemFolder : eqpType.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - } - itemsData = stringData.getData("Etc.img").getChildByPath("Etc"); - for (MapleData itemFolder : itemsData.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - itemsData = stringData.getData("Ins.img"); - for (MapleData itemFolder : itemsData.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - itemsData = stringData.getData("Pet.img"); - for (MapleData itemFolder : itemsData.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - return itemPairs; - } - - public List> getAllEtcItems() { - if (!itemNameCache.isEmpty()) { - return itemNameCache; - } - - List> itemPairs = new ArrayList<>(); - MapleData itemsData; - - itemsData = stringData.getData("Etc.img").getChildByPath("Etc"); - for (MapleData itemFolder : itemsData.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - return itemPairs; - } - - private MapleData getStringData(int itemId) { - String cat = "null"; - MapleData theData; - if (itemId >= 5010000) { - theData = cashStringData; - } else if (itemId >= 2000000 && itemId < 3000000) { - theData = consumeStringData; - } else if ((itemId >= 1010000 && itemId < 1040000) || (itemId >= 1122000 && itemId < 1123000) || (itemId >= 1132000 && itemId < 1133000) || (itemId >= 1142000 && itemId < 1143000)) { - theData = eqpStringData; - cat = "Eqp/Accessory"; - } else if (itemId >= 1000000 && itemId < 1010000) { - theData = eqpStringData; - cat = "Eqp/Cap"; - } else if (itemId >= 1102000 && itemId < 1103000) { - theData = eqpStringData; - cat = "Eqp/Cape"; - } else if (itemId >= 1040000 && itemId < 1050000) { - theData = eqpStringData; - cat = "Eqp/Coat"; - } else if (itemId >= 20000 && itemId < 22000) { - theData = eqpStringData; - cat = "Eqp/Face"; - } else if (itemId >= 1080000 && itemId < 1090000) { - theData = eqpStringData; - cat = "Eqp/Glove"; - } else if (itemId >= 30000 && itemId < 35000) { - theData = eqpStringData; - cat = "Eqp/Hair"; - } else if (itemId >= 1050000 && itemId < 1060000) { - theData = eqpStringData; - cat = "Eqp/Longcoat"; - } else if (itemId >= 1060000 && itemId < 1070000) { - theData = eqpStringData; - cat = "Eqp/Pants"; - } else if (itemId >= 1802000 && itemId < 1842000) { - theData = eqpStringData; - cat = "Eqp/PetEquip"; - } else if (itemId >= 1112000 && itemId < 1120000) { - theData = eqpStringData; - cat = "Eqp/Ring"; - } else if (itemId >= 1092000 && itemId < 1100000) { - theData = eqpStringData; - cat = "Eqp/Shield"; - } else if (itemId >= 1070000 && itemId < 1080000) { - theData = eqpStringData; - cat = "Eqp/Shoes"; - } else if (itemId >= 1900000 && itemId < 2000000) { - theData = eqpStringData; - cat = "Eqp/Taming"; - } else if (itemId >= 1300000 && itemId < 1800000) { - theData = eqpStringData; - cat = "Eqp/Weapon"; - } else if (itemId >= 4000000 && itemId < 5000000) { - theData = etcStringData; - cat = "Etc"; - } else if (itemId >= 3000000 && itemId < 4000000) { - theData = insStringData; - } else if (itemId / 1000 == 5000) { - theData = petStringData; - } else { - return null; - } - if (cat.equalsIgnoreCase("null")) { - return theData.getChildByPath(String.valueOf(itemId)); - } else { - return theData.getChildByPath(cat + "/" + itemId); - } - } - - public boolean noCancelMouse(int itemId) { - if (noCancelMouseCache.containsKey(itemId)) { - return noCancelMouseCache.get(itemId); - } - - MapleData item = getItemData(itemId); - if (item == null) { - noCancelMouseCache.put(itemId, false); - return false; - } - - boolean blockMouse = MapleDataTool.getIntConvert("info/noCancelMouse", item, 0) == 1; - noCancelMouseCache.put(itemId, blockMouse); - return blockMouse; - } - - private MapleData getItemData(int itemId) { - MapleData ret = null; - String idStr = "0" + String.valueOf(itemId); - MapleDataDirectoryEntry root = itemData.getRoot(); - for (MapleDataDirectoryEntry topDir : root.getSubdirectories()) { - for (MapleDataFileEntry iFile : topDir.getFiles()) { - if (iFile.getName().equals(idStr.substring(0, 4) + ".img")) { - ret = itemData.getData(topDir.getName() + "/" + iFile.getName()); - if (ret == null) { - return null; - } - ret = ret.getChildByPath(idStr); - return ret; - } else if (iFile.getName().equals(idStr.substring(1) + ".img")) { - return itemData.getData(topDir.getName() + "/" + iFile.getName()); - } - } - } - root = equipData.getRoot(); - for (MapleDataDirectoryEntry topDir : root.getSubdirectories()) { - for (MapleDataFileEntry iFile : topDir.getFiles()) { - if (iFile.getName().equals(idStr + ".img")) { - return equipData.getData(topDir.getName() + "/" + iFile.getName()); - } - } - } - return ret; - } - - public List getItemIdsInRange(int minId, int maxId, boolean ignoreCashItem) { - List list = new ArrayList<>(); - - if(ignoreCashItem) { - for(int i = minId; i <= maxId; i++) { - if(getItemData(i) != null && !isCash(i)) { - list.add(i); - } - } - } - else { - for(int i = minId; i <= maxId; i++) { - if(getItemData(i) != null) { - list.add(i); - } - } - } - - - return list; - } - - public short getSlotMax(int itemId) { - Short slotMax = slotMaxCache.get(itemId); - if (slotMax != null) { - return slotMax; - } - short ret = 0; - MapleData item = getItemData(itemId); - if (item != null) { - MapleData smEntry = item.getChildByPath("info/slotMax"); - if (smEntry == null) { - ret = 100; - } else { - ret = (short) MapleDataTool.getInt(smEntry); - } - } - - slotMaxCache.put(itemId, ret); - return ret; - } - - public int getMeso(int itemId) { - if (getMesoCache.containsKey(itemId)) { - return getMesoCache.get(itemId); - } - MapleData item = getItemData(itemId); - if (item == null) { - return -1; - } - int pEntry; - MapleData pData = item.getChildByPath("info/meso"); - if (pData == null) { - return -1; - } - pEntry = MapleDataTool.getInt(pData); - getMesoCache.put(itemId, pEntry); - return pEntry; - } - - public int getWholePrice(int itemId) { - if (wholePriceCache.containsKey(itemId)) { - return wholePriceCache.get(itemId); - } - MapleData item = getItemData(itemId); - if (item == null) { - return -1; - } - int pEntry; - MapleData pData = item.getChildByPath("info/price"); - if (pData == null) { - return -1; - } - pEntry = MapleDataTool.getInt(pData); - wholePriceCache.put(itemId, pEntry); - return pEntry; - } - - public double getPrice(int itemId) { - if (priceCache.containsKey(itemId)) { - return priceCache.get(itemId); - } - MapleData item = getItemData(itemId); - if (item == null) { - return -1; - } - double pEntry; - MapleData pData = item.getChildByPath("info/unitPrice"); - if (pData != null) { - try { - pEntry = MapleDataTool.getDouble(pData); - } catch (Exception e) { - pEntry = MapleDataTool.getInt(pData); - } - } else { - pData = item.getChildByPath("info/price"); - if (pData == null) { - return -1; - } - try { - pEntry = MapleDataTool.getInt(pData); - } catch(Exception e) { - priceCache.put(itemId, 0.0); - return 0; - } - } - priceCache.put(itemId, pEntry); - return pEntry; - } - - protected String getEquipmentSlot(int itemId) { - if (equipmentSlotCache.containsKey(itemId)) { - return equipmentSlotCache.get(itemId); - } - - String ret = ""; - - MapleData item = getItemData(itemId); - - if (item == null) { - return null; - } - - MapleData info = item.getChildByPath("info"); - - if (info == null) { - return null; - } - - ret = MapleDataTool.getString("islot", info, ""); - - equipmentSlotCache.put(itemId, ret); - - return ret; - } - - public Map getEquipStats(int itemId) { - if (equipStatsCache.containsKey(itemId)) { - return equipStatsCache.get(itemId); - } - Map ret = new LinkedHashMap<>(); - MapleData item = getItemData(itemId); - if (item == null) { - return null; - } - MapleData info = item.getChildByPath("info"); - if (info == null) { - return null; - } - for (MapleData data : info.getChildren()) { - if (data.getName().startsWith("inc")) { - ret.put(data.getName().substring(3), MapleDataTool.getIntConvert(data)); - } - /*else if (data.getName().startsWith("req")) - ret.put(data.getName(), MapleDataTool.getInt(data.getName(), info, 0));*/ - } - ret.put("reqJob", MapleDataTool.getInt("reqJob", info, 0)); - ret.put("reqLevel", MapleDataTool.getInt("reqLevel", info, 0)); - ret.put("reqDEX", MapleDataTool.getInt("reqDEX", info, 0)); - ret.put("reqSTR", MapleDataTool.getInt("reqSTR", info, 0)); - ret.put("reqINT", MapleDataTool.getInt("reqINT", info, 0)); - ret.put("reqLUK", MapleDataTool.getInt("reqLUK", info, 0)); - ret.put("reqPOP", MapleDataTool.getInt("reqPOP", info, 0)); - ret.put("cash", MapleDataTool.getInt("cash", info, 0)); - ret.put("tuc", MapleDataTool.getInt("tuc", info, 0)); - ret.put("cursed", MapleDataTool.getInt("cursed", info, 0)); - ret.put("success", MapleDataTool.getInt("success", info, 0)); - ret.put("fs", MapleDataTool.getInt("fs", info, 0)); - equipStatsCache.put(itemId, ret); - return ret; - } - - public List getScrollReqs(int itemId) { - List ret = new ArrayList<>(); - MapleData data = getItemData(itemId); - data = data.getChildByPath("req"); - if (data == null) { - return ret; - } - for (MapleData req : data.getChildren()) { - ret.add(MapleDataTool.getInt(req)); - } - return ret; - } - - public String getName(int itemId) { - if (nameCache.containsKey(itemId)) { - return nameCache.get(itemId); - } - MapleData strings = getStringData(itemId); - if (strings == null) { - return null; - } - String ret = MapleDataTool.getString("name", strings, null); - nameCache.put(itemId, ret); - return ret; - } - - public String getMsg(int itemId) { - if (msgCache.containsKey(itemId)) { - return msgCache.get(itemId); - } - MapleData strings = getStringData(itemId); - if (strings == null) { - return null; - } - String ret = MapleDataTool.getString("msg", strings, null); - msgCache.put(itemId, ret); - return ret; - } - - public boolean isDropRestricted(int itemId) { - if (dropRestrictionCache.containsKey(itemId)) { - return dropRestrictionCache.get(itemId); - } - MapleData data = getItemData(itemId); - boolean bRestricted = MapleDataTool.getIntConvert("info/tradeBlock", data, 0) == 1; - if (!bRestricted) { - bRestricted = MapleDataTool.getIntConvert("info/accountSharable", data, 0) == 1; - } - if (!bRestricted) { - bRestricted = MapleDataTool.getIntConvert("info/quest", data, 0) == 1; - } - dropRestrictionCache.put(itemId, bRestricted); - return bRestricted; - } - - public boolean isPickupRestricted(int itemId) { - if (pickupRestrictionCache.containsKey(itemId)) { - return pickupRestrictionCache.get(itemId); - } - MapleData data = getItemData(itemId); - boolean bRestricted = MapleDataTool.getIntConvert("info/only", data, 0) == 1; - pickupRestrictionCache.put(itemId, bRestricted); - return bRestricted; - } - - public Map getSkillStats(int itemId, double playerJob) { - Map ret = new LinkedHashMap<>(); - MapleData item = getItemData(itemId); - if (item == null) { - return null; - } - MapleData info = item.getChildByPath("info"); - if (info == null) { - return null; - } - for (MapleData data : info.getChildren()) { - if (data.getName().startsWith("inc")) { - ret.put(data.getName().substring(3), MapleDataTool.getIntConvert(data)); - } - } - ret.put("masterLevel", MapleDataTool.getInt("masterLevel", info, 0)); - ret.put("reqSkillLevel", MapleDataTool.getInt("reqSkillLevel", info, 0)); - ret.put("success", MapleDataTool.getInt("success", info, 0)); - MapleData skill = info.getChildByPath("skill"); - int curskill; - for (int i = 0; i < skill.getChildren().size(); i++) { - curskill = MapleDataTool.getInt(Integer.toString(i), skill, 0); - if (curskill == 0) { - break; - } - if (curskill / 10000 == playerJob) { - ret.put("skillid", curskill); - break; - } - } - if (ret.get("skillid") == null) { - ret.put("skillid", 0); - } - return ret; - } - - public List petsCanConsume(int itemId) { - List ret = new ArrayList<>(); - MapleData data = getItemData(itemId); - int curPetId; - for (int i = 0; i < data.getChildren().size(); i++) { - curPetId = MapleDataTool.getInt("spec/" + Integer.toString(i), data, 0); - if (curPetId == 0) { - break; - } - ret.add(Integer.valueOf(curPetId)); - } - return ret; - } - - public boolean isQuestItem(int itemId) { - if (isQuestItemCache.containsKey(itemId)) { - return isQuestItemCache.get(itemId); - } - MapleData data = getItemData(itemId); - boolean questItem = MapleDataTool.getIntConvert("info/quest", data, 0) == 1; - isQuestItemCache.put(itemId, questItem); - return questItem; - } - - public int getQuestIdFromItem(int itemId) { - MapleData data = getItemData(itemId); - int questItem = MapleDataTool.getIntConvert("info/quest", data, 0); - return questItem; - } - - public boolean isUntradeableOnEquip(int itemId) { - if (onEquipUntradableCache.containsKey(itemId)) { - return onEquipUntradableCache.get(itemId); - } - boolean untradableOnEquip = MapleDataTool.getIntConvert("info/equipTradeBlock", getItemData(itemId), 0) > 0; - onEquipUntradableCache.put(itemId, untradableOnEquip); - return untradableOnEquip; - } - - public boolean isKarmaAble(int itemId) { - if (karmaCache.containsKey(itemId)) { - return karmaCache.get(itemId); - } - boolean bRestricted = MapleDataTool.getIntConvert("info/tradeAvailable", getItemData(itemId), 0) > 0; - karmaCache.put(itemId, bRestricted); - return bRestricted; - } - - public int getStateChangeItem(int itemId) { - if (triggerItemCache.containsKey(itemId)) { - return triggerItemCache.get(itemId); - } else { - int triggerItem = MapleDataTool.getIntConvert("info/stateChangeItem", getItemData(itemId), 0); - triggerItemCache.put(itemId, triggerItem); - return triggerItem; - } - } - - public int getExpById(int itemId) { - if (expCache.containsKey(itemId)) { - return expCache.get(itemId); - } else { - int exp = MapleDataTool.getIntConvert("spec/exp", getItemData(itemId), 0); - expCache.put(itemId, exp); - return exp; - } - } - - public int getMaxLevelById(int itemId) { - if (levelCache.containsKey(itemId)) { - return levelCache.get(itemId); - } else { - int level = MapleDataTool.getIntConvert("info/maxLevel", getItemData(itemId), 256); - levelCache.put(itemId, level); - return level; - } - } - - public boolean isConsumeOnPickup(int itemId) { - if (consumeOnPickupCache.containsKey(itemId)) { - return consumeOnPickupCache.get(itemId); - } - MapleData data = getItemData(itemId); - boolean consume = MapleDataTool.getIntConvert("spec/consumeOnPickup", data, 0) == 1 || MapleDataTool.getIntConvert("specEx/consumeOnPickup", data, 0) == 1; - consumeOnPickupCache.put(itemId, consume); - return consume; - } - - public boolean isCash(int itemId) { - return itemId / 1000000 == 5 || getEquipStats(itemId).get("cash") == 1; - } - - public ArrayList> getItemDataByName(String name) - { - ArrayList> ret = new ArrayList<>(); - for (Pair itemPair : MapleItemInformationProvider.getInstance().getAllItems()) { - if (itemPair.getRight().toLowerCase().contains(name.toLowerCase())) { - ret.add(itemPair); - } - } - return ret; - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/Pair.java b/tools/MapleCashCosmeticsFetcher/src/tools/Pair.java deleted file mode 100644 index b127e71110..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/Pair.java +++ /dev/null @@ -1,121 +0,0 @@ -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 ~ 2010 Patrick Huy -Matthias Butz -Jan Christian Meyer - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License version 3 -as published by the Free Software Foundation. You may not use, modify -or distribute this program under any other version of the -GNU Affero General Public License. - -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 . - */ -package tools; - -/** - * Represents a pair of values. - * - * @author Frz - * @since Revision 333 - * @version 1.0 - * - * @param The type of the left value. - * @param The type of the right value. - */ -public class Pair { - - public E left; - public F right; - - /** - * Class constructor - pairs two objects together. - * - * @param left The left object. - * @param right The right object. - */ - public Pair(E left, F right) { - this.left = left; - this.right = right; - } - - /** - * Gets the left value. - * - * @return The left value. - */ - public E getLeft() { - return left; - } - - /** - * Gets the right value. - * - * @return The right value. - */ - public F getRight() { - return right; - } - - /** - * Turns the pair into a string. - * - * @return Each value of the pair as a string joined with a colon. - */ - @Override - public String toString() { - return left.toString() + ":" + right.toString(); - } - - /** - * Gets the hash code of this pair. - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((left == null) ? 0 : left.hashCode()); - result = prime * result + ((right == null) ? 0 : right.hashCode()); - return result; - } - - /** - * Checks to see if two pairs are equal. - */ - @SuppressWarnings("unchecked") - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Pair other = (Pair) obj; - if (left == null) { - if (other.left != null) { - return false; - } - } else if (!left.equals(other.left)) { - return false; - } - if (right == null) { - if (other.right != null) { - return false; - } - } else if (!right.equals(other.right)) { - return false; - } - return true; - } -} \ No newline at end of file diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/StringUtil.java b/tools/MapleCashCosmeticsFetcher/src/tools/StringUtil.java deleted file mode 100644 index b471e4aef2..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/StringUtil.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools; - -public class StringUtil { - /** - * Gets a string padded from the left to length by - * padchar. - * - * @param in The input string to be padded. - * @param padchar The character to pad with. - * @param length The length to pad to. - * @return The padded string. - */ - public static String getLeftPaddedStr(String in, char padchar, int length) { - StringBuilder builder = new StringBuilder(length); - for (int x = in.length(); x < length; x++) { - builder.append(padchar); - } - builder.append(in); - return builder.toString(); - } - - /** - * Gets a string padded from the right to length by - * padchar. - * - * @param in The input string to be padded. - * @param padchar The character to pad with. - * @param length The length to pad to. - * @return The padded string. - */ - public static String getRightPaddedStr(String in, char padchar, int length) { - StringBuilder builder = new StringBuilder(in); - for (int x = in.length(); x < length; x++) { - builder.append(padchar); - } - return builder.toString(); - } - - /** - * Joins an array of strings starting from string start with - * a space. - * - * @param arr The array of strings to join. - * @param start Starting from which string. - * @return The joined strings. - */ - public static String joinStringFrom(String arr[], int start) { - return joinStringFrom(arr, start, " "); - } - - /** - * Joins an array of strings starting from string start with - * sep as a seperator. - * - * @param arr The array of strings to join. - * @param start Starting from which string. - * @return The joined strings. - */ - public static String joinStringFrom(String arr[], int start, String sep) { - StringBuilder builder = new StringBuilder(); - for (int i = start; i < arr.length; i++) { - builder.append(arr[i]); - if (i != arr.length - 1) { - builder.append(sep); - } - } - return builder.toString(); - } - - /** - * Makes an enum name human readable (fixes spaces, capitalization, etc) - * - * @param enumName The name of the enum to neaten up. - * @return The human-readable enum name. - */ - public static String makeEnumHumanReadable(String enumName) { - StringBuilder builder = new StringBuilder(enumName.length() + 1); - String[] words = enumName.split("_"); - for (String word : words) { - if (word.length() <= 2) { - builder.append(word); // assume that it's an abbrevation - } else { - builder.append(word.charAt(0)); - builder.append(word.substring(1).toLowerCase()); - } - builder.append(' '); - } - return builder.substring(0, enumName.length()); - } - - /** - * Counts the number of chr's in str. - * - * @param str The string to check for instances of chr. - * @param chr The character to check for. - * @return The number of times chr occurs in str. - */ - public static int countCharacters(String str, char chr) { - int ret = 0; - for (int i = 0; i < str.length(); i++) { - if (str.charAt(i) == chr) { - ret++; - } - } - return ret; - } -} \ No newline at end of file diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/ByteArrayByteStream.java b/tools/MapleCashCosmeticsFetcher/src/tools/data/input/ByteArrayByteStream.java deleted file mode 100644 index eac7de21ea..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/ByteArrayByteStream.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import tools.HexTool; - -public class ByteArrayByteStream implements SeekableInputStreamBytestream { - private int pos = 0; - private long bytesRead = 0; - private byte[] arr; - - public ByteArrayByteStream(byte[] arr) { - this.arr = arr; - } - - @Override - public long getPosition() { - return pos; - } - - @Override - public void seek(long offset) throws IOException { - pos = (int) offset; - } - - @Override - public long getBytesRead() { - return bytesRead; - } - - @Override - public int readByte() { - bytesRead++; - return ((int) arr[pos++]) & 0xFF; - } - - @Override - public String toString() { - String nows = "kevintjuh93 pwns";//I lol'd - if (arr.length - pos > 0) { - byte[] now = new byte[arr.length - pos]; - System.arraycopy(arr, pos, now, 0, arr.length - pos); - nows = HexTool.toString(now); - } - return "All: " + HexTool.toString(arr) + "\nNow: " + nows; - } - - @Override - public long available() { - return arr.length - pos; - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/ByteInputStream.java b/tools/MapleCashCosmeticsFetcher/src/tools/data/input/ByteInputStream.java deleted file mode 100644 index 107f71843e..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/ByteInputStream.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -/** - * Represents an abstract stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public interface ByteInputStream { - int readByte(); - long getBytesRead(); - long available(); -} diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/GenericLittleEndianAccessor.java b/tools/MapleCashCosmeticsFetcher/src/tools/data/input/GenericLittleEndianAccessor.java deleted file mode 100644 index d08a9b8374..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/GenericLittleEndianAccessor.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.awt.Point; -import java.io.ByteArrayOutputStream; - -/** - * Provides a generic interface to a Little Endian stream of bytes. - * - * @version 1.0 - * @author Frz - * @since Revision 323 - */ -public class GenericLittleEndianAccessor implements LittleEndianAccessor { - private ByteInputStream bs; - - /** - * Class constructor - Wraps the accessor around a stream of bytes. - * - * @param bs The byte stream to wrap the accessor around. - */ - public GenericLittleEndianAccessor(ByteInputStream bs) { - this.bs = bs; - } - - /** - * Read a single byte from the stream. - * - * @return The byte read. - * @see tools.data.input.ByteInputStream#readByte - */ - @Override - public byte readByte() { - return (byte) bs.readByte(); - } - - /** - * Reads an integer from the stream. - * - * @return The integer read. - */ - @Override - public int readInt() { - return bs.readByte() + (bs.readByte() << 8) + (bs.readByte() << 16) + (bs.readByte() << 24); - } - - /** - * Reads a short integer from the stream. - * - * @return The short read. - */ - @Override - public short readShort() { - return (short) (bs.readByte() + (bs.readByte() << 8)); - } - - /** - * Reads a single character from the stream. - * - * @return The character read. - */ - @Override - public char readChar() { - return (char) readShort(); - } - - /** - * Reads a long integer from the stream. - * - * @return The long integer read. - */ - @Override - public long readLong() { - long byte1 = bs.readByte(); - long byte2 = bs.readByte(); - long byte3 = bs.readByte(); - long byte4 = bs.readByte(); - long byte5 = bs.readByte(); - long byte6 = bs.readByte(); - long byte7 = bs.readByte(); - long byte8 = bs.readByte(); - return (byte8 << 56) + (byte7 << 48) + (byte6 << 40) + (byte5 << 32) + (byte4 << 24) + (byte3 << 16) + (byte2 << 8) + byte1; - } - - /** - * Reads a floating point integer from the stream. - * - * @return The float-type integer read. - */ - @Override - public float readFloat() { - return Float.intBitsToFloat(readInt()); - } - - /** - * Reads a double-precision integer from the stream. - * - * @return The double-type integer read. - */ - @Override - public double readDouble() { - return Double.longBitsToDouble(readLong()); - } - - /** - * Reads an ASCII string from the stream with length n. - * - * @param n Number of characters to read. - * @return The string read. - */ - public final String readAsciiString(int n) { - char ret[] = new char[n]; - for (int x = 0; x < n; x++) { - ret[x] = (char) readByte(); - } - return String.valueOf(ret); - } - - /** - * Reads a null-terminated string from the stream. - * - * @return The string read. - */ - public final String readNullTerminatedAsciiString() { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte b; - while (true) { - b = readByte(); - if (b == 0) { - break; - } - baos.write(b); - } - byte[] buf = baos.toByteArray(); - char[] chrBuf = new char[buf.length]; - for (int x = 0; x < buf.length; x++) { - chrBuf[x] = (char) buf[x]; - } - return String.valueOf(chrBuf); - } - - /** - * Gets the number of bytes read from the stream so far. - * - * @return A long integer representing the number of bytes read. - * @see tools.data.input.ByteInputStream#getBytesRead() - */ - public long getBytesRead() { - return bs.getBytesRead(); - } - - /** - * Reads a MapleStory convention lengthed ASCII string. - * This consists of a short integer telling the length of the string, - * then the string itself. - * - * @return The string read. - */ - @Override - public String readMapleAsciiString() { - return readAsciiString(readShort()); - } - - /** - * Reads num bytes off the stream. - * - * @param num The number of bytes to read. - * @return An array of bytes with the length of num - */ - @Override - public byte[] read(int num) { - byte[] ret = new byte[num]; - for (int x = 0; x < num; x++) { - ret[x] = readByte(); - } - return ret; - } - - /** - * Reads a MapleStory Position information. - * This consists of 2 short integer. - * - * @return The Position read. - */ - @Override - public final Point readPos() { - final int x = readShort(); - final int y = readShort(); - return new Point(x, y); - } - - /** - * Skips the current position of the stream num bytes ahead. - * - * @param num Number of bytes to skip. - */ - @Override - public void skip(int num) { - for (int x = 0; x < num; x++) { - readByte(); - } - } - - /** - * @see tools.data.input.ByteInputStream#available - */ - @Override - public long available() { - return bs.available(); - } - - /** - * @see java.lang.Object#toString - */ - @Override - public String toString() { - return bs.toString(); - } -} \ No newline at end of file diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java b/tools/MapleCashCosmeticsFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java deleted file mode 100644 index fdd147d796..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; - -/** - * Provides an abstract accessor to a generic Little Endian byte stream. This - * accessor is seekable. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - * @see tools.data.input.GenericLittleEndianAccessor - */ -public class GenericSeekableLittleEndianAccessor extends GenericLittleEndianAccessor implements SeekableLittleEndianAccessor { - private SeekableInputStreamBytestream bs; - - /** - * Class constructor - * Provide a seekable input stream to wrap this object around. - * - * @param bs The byte stream to wrap this around. - */ - public GenericSeekableLittleEndianAccessor(SeekableInputStreamBytestream bs) { - super(bs); - this.bs = bs; - } - - /** - * Seek the pointer to offset - * - * @param offset The offset to seek to. - * @see tools.data.input.SeekableInputStreamBytestream#seek - */ - @Override - public void seek(long offset) { - try { - bs.seek(offset); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("Seek failed " + e); - } - } - - /** - * Get the current position of the pointer. - * - * @return The current position of the pointer as a long integer. - * @see tools.data.input.SeekableInputStreamBytestream#getPosition - */ - @Override - public long getPosition() { - try { - return bs.getPosition(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("getPosition failed" + e); - return -1; - } - } - - /** - * Skip num number of bytes in the stream. - * - * @param num The number of bytes to skip. - */ - @Override - public void skip(int num) { - seek(getPosition() + num); - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/InputStreamByteStream.java b/tools/MapleCashCosmeticsFetcher/src/tools/data/input/InputStreamByteStream.java deleted file mode 100644 index 70aef3489f..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/InputStreamByteStream.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Provides an abstract wrapper to a stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class InputStreamByteStream implements ByteInputStream { - private InputStream is; - private long read = 0; - - /** - * Class constructor. - * Provide an input stream to wrap this around. - * - * @param is The input stream to wrap this object around. - */ - public InputStreamByteStream(InputStream is) { - this.is = is; - } - - /** - * Reads the next byte from the stream. - * - * @return Then next byte in the stream. - */ - @Override - public int readByte() { - int temp; - try { - temp = is.read(); - if (temp == -1) { - throw new RuntimeException("EOF"); - } - read++; - return temp; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - /** - * Gets the number of bytes read from the stream. - * - * @return The number of bytes read as a long integer. - */ - @Override - public long getBytesRead() { - return read; - } - - /** - * Returns the number of bytes left in the stream. - * - * @return The number of bytes available for reading as a long integer. - */ - @Override - public long available() { - try { - return is.available(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("ERROR" + e); - return 0; - } - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/LittleEndianAccessor.java b/tools/MapleCashCosmeticsFetcher/src/tools/data/input/LittleEndianAccessor.java deleted file mode 100644 index f991dbf537..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/LittleEndianAccessor.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.awt.Point; - -/** - * @author Frz - */ -public interface LittleEndianAccessor { - byte readByte(); - char readChar(); - short readShort(); - int readInt(); - Point readPos(); - long readLong(); - void skip(int num); - byte[] read(int num); - float readFloat(); - double readDouble(); - String readAsciiString(int n); - String readNullTerminatedAsciiString(); - String readMapleAsciiString(); - long getBytesRead(); - long available(); -} diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/RandomAccessByteStream.java b/tools/MapleCashCosmeticsFetcher/src/tools/data/input/RandomAccessByteStream.java deleted file mode 100644 index c0004be17f..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/RandomAccessByteStream.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import java.io.RandomAccessFile; - -/** - * Provides an abstract layer to a byte stream. This layer can be accessed - * randomly. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class RandomAccessByteStream implements SeekableInputStreamBytestream { - private RandomAccessFile raf; - private long read = 0; - - public RandomAccessByteStream(RandomAccessFile raf) { - super(); - this.raf = raf; - } - - @Override - public int readByte() { - int temp; - try { - temp = raf.read(); - if (temp == -1) { - throw new RuntimeException("EOF"); - } - read++; - return temp; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public void seek(long offset) throws IOException { - raf.seek(offset); - } - - @Override - public long getPosition() throws IOException { - return raf.getFilePointer(); - } - - @Override - public long getBytesRead() { - return read; - } - - @Override - public long available() { - try { - return raf.length() - raf.getFilePointer(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("ERROR " + e); - return 0; - } - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/SeekableInputStreamBytestream.java b/tools/MapleCashCosmeticsFetcher/src/tools/data/input/SeekableInputStreamBytestream.java deleted file mode 100644 index f4922dc876..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/SeekableInputStreamBytestream.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; - -/** - * Provides an abstract interface to a stream of bytes. This stream can be - * seeked. - * - * @author Frz - * @version 1.0 - * @since 299 - */ -public interface SeekableInputStreamBytestream extends ByteInputStream { - /** - * Seeks the stream by the specified offset. - * - * @param offset - * Number of bytes to seek. - * @throws IOException - */ - void seek(long offset) throws IOException; - - /** - * Gets the current position of the stream. - * - * @return The stream position as a long integer. - * @throws IOException - */ - long getPosition() throws IOException; -} diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java b/tools/MapleCashCosmeticsFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java deleted file mode 100644 index 16b2317f7a..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -public interface SeekableLittleEndianAccessor extends LittleEndianAccessor { - void seek(long offset); - long getPosition(); -} diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/data/output/BAOSByteOutputStream.java b/tools/MapleCashCosmeticsFetcher/src/tools/data/output/BAOSByteOutputStream.java deleted file mode 100644 index 80cbc9301e..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/data/output/BAOSByteOutputStream.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.io.ByteArrayOutputStream; - -/** - * Uses a byte array to output a stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 352 - */ -class BAOSByteOutputStream implements ByteOutputStream { - private ByteArrayOutputStream baos; - - /** - * Class constructor - Wraps the stream around a Java BAOS. - * - * @param baos The ByteArrayOutputStream to wrap this around. - */ - BAOSByteOutputStream(ByteArrayOutputStream baos) { - super(); - this.baos = baos; - } - - /** - * Writes a byte to the stream. - * - * @param b The byte to write to the stream. - * @see tools.data.output.ByteOutputStream#writeByte(byte) - */ - @Override - public void writeByte(byte b) { - baos.write(b); - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/data/output/ByteOutputStream.java b/tools/MapleCashCosmeticsFetcher/src/tools/data/output/ByteOutputStream.java deleted file mode 100644 index 0df7ca7753..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/data/output/ByteOutputStream.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -/** - * Provides an interface to an output stream of bytes. - * - * @author Frz - * @since Revision 323 - * @version 1.0 - */ -interface ByteOutputStream { - /** - * Writes a byte to the stream. - * - * @param b The byte to write. - */ - void writeByte(byte b); -} diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/data/output/GenericLittleEndianWriter.java b/tools/MapleCashCosmeticsFetcher/src/tools/data/output/GenericLittleEndianWriter.java deleted file mode 100644 index e804fd8000..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/data/output/GenericLittleEndianWriter.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.awt.Point; -import java.nio.charset.Charset; - -/** - * Provides a generic writer of a little-endian sequence of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class GenericLittleEndianWriter implements LittleEndianWriter { - private static Charset ASCII = Charset.forName("US-ASCII"); - private ByteOutputStream bos; - - /** - * Class constructor - Protected to prevent instantiation with no arguments. - */ - protected GenericLittleEndianWriter() { - // Blah! - } - - /** - * Sets the byte-output stream for this instance of the object. - * - * @param bos The new output stream to set. - */ - void setByteOutputStream(ByteOutputStream bos) { - this.bos = bos; - } - - /** - * Write an array of bytes to the stream. - * - * @param b The bytes to write. - */ - @Override - public void write(byte[] b) { - for (int x = 0; x < b.length; x++) { - bos.writeByte(b[x]); - } - } - - /** - * Write a byte to the stream. - * - * @param b The byte to write. - */ - @Override - public void write(byte b) { - bos.writeByte(b); - } - - /** - * Write a byte in integer form to the stream. - * - * @param b The byte as an Integer to write. - */ - @Override - public void write(int b) { - bos.writeByte((byte) b); - } - - @Override - public void skip(int b) { - write(new byte[b]); - } - - /** - * Write a short integer to the stream. - * - * @param i The short integer to write. - */ - @Override - public void writeShort(int i) { - bos.writeByte((byte) (i & 0xFF)); - bos.writeByte((byte) ((i >>> 8) & 0xFF)); - } - - /** - * Writes an integer to the stream. - * - * @param i The integer to write. - */ - @Override - public void writeInt(int i) { - bos.writeByte((byte) (i & 0xFF)); - bos.writeByte((byte) ((i >>> 8) & 0xFF)); - bos.writeByte((byte) ((i >>> 16) & 0xFF)); - bos.writeByte((byte) ((i >>> 24) & 0xFF)); - } - - /** - * Writes an ASCII string the the stream. - * - * @param s The ASCII string to write. - */ - @Override - public void writeAsciiString(String s) { - write(s.getBytes(ASCII)); - } - - /** - * Writes a maple-convention ASCII string to the stream. - * - * @param s The ASCII string to use maple-convention to write. - */ - @Override - public void writeMapleAsciiString(String s) { - writeShort((short) s.length()); - writeAsciiString(s); - } - - /** - * Writes a null-terminated ASCII string to the stream. - * - * @param s The ASCII string to write. - */ - @Override - public void writeNullTerminatedAsciiString(String s) { - writeAsciiString(s); - write(0); - } - - /** - * Write a long integer to the stream. - * @param l The long integer to write. - */ - @Override - public void writeLong(long l) { - bos.writeByte((byte) (l & 0xFF)); - bos.writeByte((byte) ((l >>> 8) & 0xFF)); - bos.writeByte((byte) ((l >>> 16) & 0xFF)); - bos.writeByte((byte) ((l >>> 24) & 0xFF)); - bos.writeByte((byte) ((l >>> 32) & 0xFF)); - bos.writeByte((byte) ((l >>> 40) & 0xFF)); - bos.writeByte((byte) ((l >>> 48) & 0xFF)); - bos.writeByte((byte) ((l >>> 56) & 0xFF)); - } - - /** - * Writes a 2D 4 byte position information - * - * @param s The Point position to write. - */ - @Override - public void writePos(Point s) { - writeShort(s.x); - writeShort(s.y); - } - - /** - * Writes a boolean true ? 1 : 0 - * - * @param b The boolean to write. - */ - @Override - public void writeBool(final boolean b) { - write(b ? 1 : 0); - } -} diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/data/output/LittleEndianWriter.java b/tools/MapleCashCosmeticsFetcher/src/tools/data/output/LittleEndianWriter.java deleted file mode 100644 index f17bd7c72e..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/data/output/LittleEndianWriter.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package tools.data.output; - -import java.awt.Point; - -/** - * Provides an interface to a writer class that writes a little-endian sequence - * of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public interface LittleEndianWriter { - - /** - * Write an array of bytes to the sequence. - * - * @param b The bytes to write. - */ - public void write(byte b[]); - - /** - * Write a byte to the sequence. - * - * @param b The byte to write. - */ - public void write(byte b); - - /** - * Write a byte in integer form to the sequence. - * - * @param b The byte as an Integer to write. - */ - public void write(int b); - - public void skip(int b); - - /** - * Writes an integer to the sequence. - * - * @param i The integer to write. - */ - public void writeInt(int i); - - /** - * Write a short integer to the sequence. - * - * @param s The short integer to write. - */ - public void writeShort(int s); - - /** - * Write a long integer to the sequence. - * - * @param l The long integer to write. - */ - public void writeLong(long l); - - /** - * Writes an ASCII string the the sequence. - * - * @param s The ASCII string to write. - */ - void writeAsciiString(String s); - - /** - * Writes a null-terminated ASCII string to the sequence. - * - * @param s The ASCII string to write. - */ - void writeNullTerminatedAsciiString(String s); - - /** - * Writes a maple-convention ASCII string to the sequence. - * - * @param s The ASCII string to use maple-convention to write. - */ - void writeMapleAsciiString(String s); - - /** - * Writes a 2D 4 byte position information - * - * @param s The Point position to write. - */ - void writePos(Point s); - - /** - * Writes a boolean true ? 1 : 0 - * - * @param b The boolean to write. - */ - void writeBool(final boolean b); -} diff --git a/tools/MapleCashCosmeticsFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java b/tools/MapleCashCosmeticsFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java deleted file mode 100644 index b02365ec62..0000000000 --- a/tools/MapleCashCosmeticsFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.io.ByteArrayOutputStream; -import tools.HexTool; - -/** - * Writes a maplestory-packet little-endian stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 352 - */ -public class MaplePacketLittleEndianWriter extends GenericLittleEndianWriter { - private ByteArrayOutputStream baos; - - /** - * Constructor - initializes this stream with a default size. - */ - public MaplePacketLittleEndianWriter() { - this(32); - } - - /** - * Constructor - initializes this stream with size size. - * - * @param size The size of the underlying stream. - */ - public MaplePacketLittleEndianWriter(int size) { - this.baos = new ByteArrayOutputStream(size); - setByteOutputStream(new BAOSByteOutputStream(baos)); - } - - /** - * Gets a MaplePacket instance representing this - * sequence of bytes. - * - * @return A MaplePacket with the bytes in this stream. - */ - public byte[] getPacket() { - return baos.toByteArray(); - } - - /** - * Changes this packet into a human-readable hexadecimal stream of bytes. - * - * @return This packet as hex digits. - */ - @Override - public String toString() { - return HexTool.toString(baos.toByteArray()); - } -} From 5b4815f17365ef4747da1b117307e28979217f9f Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 19:56:17 +0200 Subject: [PATCH 07/36] Move MapleCashDropFetcher to main module --- .../tools/mapletools/CashDropFetcher.java | 313 +++++++----------- .../lib/CashDropReport.txt | 11 - .../src/tools/DatabaseConnection.java | 51 --- .../MapleCashDropFetcher/src/tools/Pair.java | 121 ------- 4 files changed, 124 insertions(+), 372 deletions(-) rename tools/MapleCashDropFetcher/src/maplecashdropfetcher/MapleCashDropFetcher.java => src/main/java/tools/mapletools/CashDropFetcher.java (56%) delete mode 100644 tools/MapleCashDropFetcher/lib/CashDropReport.txt delete mode 100644 tools/MapleCashDropFetcher/src/tools/DatabaseConnection.java delete mode 100644 tools/MapleCashDropFetcher/src/tools/Pair.java diff --git a/tools/MapleCashDropFetcher/src/maplecashdropfetcher/MapleCashDropFetcher.java b/src/main/java/tools/mapletools/CashDropFetcher.java similarity index 56% rename from tools/MapleCashDropFetcher/src/maplecashdropfetcher/MapleCashDropFetcher.java rename to src/main/java/tools/mapletools/CashDropFetcher.java index cc610c9fcd..75176c4a81 100644 --- a/tools/MapleCashDropFetcher/src/maplecashdropfetcher/MapleCashDropFetcher.java +++ b/src/main/java/tools/mapletools/CashDropFetcher.java @@ -1,96 +1,59 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. +import provider.wz.WZFiles; +import tools.Pair; - 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 . -*/ -package maplecashdropfetcher; - -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.InputStreamReader; -import java.io.PrintWriter; +import java.io.*; +import java.nio.charset.StandardCharsets; import java.sql.Connection; -import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.HashSet; -import java.util.Set; - -import java.io.File; - -import tools.Pair; +import java.util.*; /** - * * @author RonanLana - - This application gets info from the WZ.XML files regarding cash itemids then searches the drop data on the DB - after any NX (cash item) drops and reports them. - - Estimated parse time: 2 minutes + *

+ * This application gets info from the WZ.XML files regarding cash itemids then searches the drop data on the DB + * after any NX (cash item) drops and reports them. + *

+ * Estimated parse time: 2 minutes */ -public class MapleCashDropFetcher { - static String host = "jdbc:mysql://localhost:3306/cosmic"; - static String driver = "com.mysql.jdbc.Driver"; - static String username = "cosmic_server"; - static String password = "snailshell"; +public class CashDropFetcher { + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("cash_drop_report.txt"); + private static final Connection con = SimpleDatabaseConnection.getConnection(); + private static final int INITIAL_STRING_LENGTH = 50; + private static final int ITEM_FILE_NAME_SIZE = 13; - static String wzPath = "../../wz"; - - static String directoryName = "../.."; - static String newFile = "lib/CashDropReport.txt"; + private static final Set nxItems = new HashSet<>(); + private static final Set nxDrops = new HashSet<>(); - static Connection con = null; - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static int initialLength = 200; - static int initialStringLength = 50; - static int itemFileNameSize = 13; - - static Set nxItems = new HashSet<>(); - static Set nxDrops = new HashSet<>(); - - static byte status = 0; - static int currentItemid = 0; + private static PrintWriter printWriter = null; + private static BufferedReader bufferedReader = null; + + private static byte status = 0; + private static int currentItemid = 0; private static String getName(String token) { int i, j; char[] dest; String d; - + i = token.lastIndexOf("name"); i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - if(j < i) return "0"; //node value containing 'name' in it's scope, cheap fix since we don't deal with strings anyway - - dest = new char[initialStringLength]; + if (j < i) { + return "0"; //node value containing 'name' in it's scope, cheap fix since we don't deal with strings anyway + } + + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static String getValue(String token) { int i, j; char[] dest; @@ -100,115 +63,106 @@ public class MapleCashDropFetcher { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static void forwardCursor(int st) { String line = null; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { simpleToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static void simpleToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; } } - - + + private static void inspectEquipWzEntry() { String line = null; try { - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { translateEquipToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static void translateEquipToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { - if(status == 1) { - if(!getName(token).equals("info")) { + } else if (token.contains("imgdir")) { + if (status == 1) { + if (!getName(token).equals("info")) { forwardCursor(status); } } - + status += 1; - } - else { - if(status == 2) { + } else { + if (status == 2) { String d = getName(token); - - if(d.equals("cash")) { - if(!getValue(token).equals("0")) { + + if (d.equals("cash")) { + if (!getValue(token).equals("0")) { nxItems.add(currentItemid); } - + forwardCursor(status); } } } } - + private static void inspectItemWzEntry() { String line = null; try { - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { translateItemToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static void translateItemToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { - if(status == 1) { - currentItemid = Integer.valueOf(getName(token)); - } - else if(status == 2) { - if(!getName(token).equals("info")) { + } else if (token.contains("imgdir")) { + if (status == 1) { + currentItemid = Integer.parseInt(getName(token)); + } else if (status == 2) { + if (!getName(token).equals("info")) { forwardCursor(status); } } - + status += 1; - } - else { - if(status == 3) { + } else { + if (status == 3) { String d = getName(token); - - if(d.equals("cash")) { - if(!getValue(token).equals("0")) { + + if (d.equals("cash")) { + if (!getValue(token).equals("0")) { nxItems.add(currentItemid); } - + forwardCursor(status); } } @@ -220,7 +174,7 @@ public class MapleCashDropFetcher { printWriter.println(" # Generated data takes into account several data info from the underlying DB and the server-side WZ.xmls."); printWriter.println(); } - + private static void listFiles(String directoryName, ArrayList files) { File directory = new File(directoryName); @@ -234,93 +188,92 @@ public class MapleCashDropFetcher { } } } - + private static int getItemIdFromFilename(String name) { try { - return Integer.valueOf(name.substring(0, name.indexOf('.'))); - } catch(Exception e) { + return Integer.parseInt(name.substring(0, name.indexOf('.'))); + } catch (Exception e) { return -1; } } - + private static String getDropTableName(boolean dropdata) { return (dropdata ? "drop_data" : "reactordrops"); } - + private static String getDropElementName(boolean dropdata) { return (dropdata ? "dropperid" : "reactorid"); } - + private static void filterNxDropsOnDB(boolean dropdata) throws SQLException { nxDrops.clear(); - + PreparedStatement ps = con.prepareStatement("SELECT DISTINCT itemid FROM " + getDropTableName(dropdata)); ResultSet rs = ps.executeQuery(); - - while(rs.next()) { + + while (rs.next()) { int itemid = rs.getInt("itemid"); - - if(nxItems.contains(itemid)) { + + if (nxItems.contains(itemid)) { nxDrops.add(itemid); } } - + rs.close(); ps.close(); } - + private static List> getNxDropsEntries(boolean dropdata) throws SQLException { List> entries = new ArrayList<>(); - + List sortedNxDrops = new ArrayList<>(nxDrops); Collections.sort(sortedNxDrops); - - for(Integer nx : sortedNxDrops) { + + for (Integer nx : sortedNxDrops) { PreparedStatement ps = con.prepareStatement("SELECT " + getDropElementName(dropdata) + " FROM " + getDropTableName(dropdata) + " WHERE itemid = ?"); ps.setInt(1, nx); - + ResultSet rs = ps.executeQuery(); - while(rs.next()) { + while (rs.next()) { entries.add(new Pair<>(nx, rs.getInt(getDropElementName(dropdata)))); } - + rs.close(); ps.close(); } - + return entries; } - + private static void reportNxDropResults(boolean dropdata) throws SQLException { filterNxDropsOnDB(dropdata); - - if(!nxDrops.isEmpty()) { + + if (!nxDrops.isEmpty()) { List> nxEntries = getNxDropsEntries(dropdata); printWriter.println("NX DROPS ON " + getDropTableName(dropdata)); - for(Pair nx : nxEntries) { + for (Pair nx : nxEntries) { printWriter.println(nx.left + " : " + nx.right); } printWriter.println("\n\n\n"); } } - - private static void ReportNxDropData() { + + private static void reportNxDropData() { try { - Class.forName(driver).newInstance(); - System.out.println("Reading Character.wz ..."); ArrayList files = new ArrayList<>(); - listFiles(wzPath + "/Character.wz", files); - - for(File f : files) { + listFiles(WZFiles.CHARACTER.getFilePath(), files); + + InputStreamReader fileReader = null; + for (File f : files) { //System.out.println("Parsing " + f.getAbsolutePath()); int itemid = getItemIdFromFilename(f.getName()); - if(itemid < 0) { + if (itemid < 0) { continue; } - - fileReader = new InputStreamReader(new FileInputStream(f), "UTF-8"); + + fileReader = new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); currentItemid = itemid; @@ -329,24 +282,24 @@ public class MapleCashDropFetcher { bufferedReader.close(); fileReader.close(); } - + System.out.println("Reading Item.wz ..."); files = new ArrayList<>(); - listFiles(wzPath + "/Item.wz", files); - - for(File f : files) { + listFiles(WZFiles.ITEM.getFilePath(), files); + + for (File f : files) { //System.out.println("Parsing " + f.getAbsolutePath()); - fileReader = new InputStreamReader(new FileInputStream(f), "UTF-8"); + fileReader = new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - if(f.getName().length() <= itemFileNameSize) { + if (f.getName().length() <= ITEM_FILE_NAME_SIZE) { inspectItemWzEntry(); } else { // pet file structure is similar to equips, maybe there are other item-types following this behaviour? int itemid = getItemIdFromFilename(f.getName()); - if(itemid < 0) { + if (itemid < 0) { continue; } - + currentItemid = itemid; inspectEquipWzEntry(); } @@ -354,53 +307,35 @@ public class MapleCashDropFetcher { bufferedReader.close(); fileReader.close(); } - + System.out.println("Reporting results..."); - - // filter drop data on DB - con = DriverManager.getConnection(host, username, password); - + // report suspects of missing quest drop data, as well as those drop data that may have incorrect questids. - printWriter = new PrintWriter(newFile, "UTF-8"); + printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); printReportFileHeader(); - + reportNxDropResults(true); reportNxDropResults(false); - + /* printWriter.println("NX LIST"); // list of all cash items found for(Integer nx : nxItems) { printWriter.println(nx); } */ - + con.close(); printWriter.close(); System.out.println("Done!"); - } - - catch(SQLException e) { + } catch (SQLException e) { System.out.println("Warning: Could not establish connection to database to report quest data."); System.out.println(e.getMessage()); - } - - catch(ClassNotFoundException e) { - System.out.println("Error: could not find class"); - System.out.println(e.getMessage()); - } - - catch(InstantiationException e) { - System.out.println("Error: instantiation failure"); - System.out.println(e.getMessage()); - } - - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + public static void main(String[] args) { - ReportNxDropData(); + reportNxDropData(); } - } diff --git a/tools/MapleCashDropFetcher/lib/CashDropReport.txt b/tools/MapleCashDropFetcher/lib/CashDropReport.txt deleted file mode 100644 index b60c817722..0000000000 --- a/tools/MapleCashDropFetcher/lib/CashDropReport.txt +++ /dev/null @@ -1,11 +0,0 @@ - # Report File autogenerated from the MapleCashDropFetcher feature by Ronan Lana. - # Generated data takes into account several data info from the underlying DB and the server-side WZ.xmls. - -NX DROPS ON drop_data -5240005 : 2100100 -5490000 : 9410066 -5490001 : 9410066 - - - - diff --git a/tools/MapleCashDropFetcher/src/tools/DatabaseConnection.java b/tools/MapleCashDropFetcher/src/tools/DatabaseConnection.java deleted file mode 100644 index b887280343..0000000000 --- a/tools/MapleCashDropFetcher/src/tools/DatabaseConnection.java +++ /dev/null @@ -1,51 +0,0 @@ -package tools; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; - -/** - * @author Frz (Big Daddy) - * @author The Real Spookster - some modifications to this beautiful code - */ -public class DatabaseConnection { - private static String DB_URL = "jdbc:mysql://localhost:3306/cosmic"; - private static String DB_USER = "cosmic_server"; - private static String DB_PASS = "snailshell"; - - public static final int RETURN_GENERATED_KEYS = 1; - - private static ThreadLocal con = new ThreadLocalConnection(); - - public static Connection getConnection() { - Connection c = con.get(); - try { - c.getMetaData(); - } catch (SQLException e) { // connection is dead, therefore discard old object 5ever - con.remove(); - c = con.get(); - } - return c; - } - - private static class ThreadLocalConnection extends ThreadLocal { - - @Override - protected Connection initialValue() { - try { - Class.forName("com.mysql.jdbc.Driver"); // touch the mysql driver - } catch (ClassNotFoundException e) { - System.out.println("[SEVERE] SQL Driver Not Found. Consider death by clams."); - e.printStackTrace(); - return null; - } - try { - return DriverManager.getConnection(DB_URL, DB_USER, DB_PASS); - } catch (SQLException e) { - System.out.println("[SEVERE] Unable to make database connection."); - e.printStackTrace(); - return null; - } - } - } -} \ No newline at end of file diff --git a/tools/MapleCashDropFetcher/src/tools/Pair.java b/tools/MapleCashDropFetcher/src/tools/Pair.java deleted file mode 100644 index b127e71110..0000000000 --- a/tools/MapleCashDropFetcher/src/tools/Pair.java +++ /dev/null @@ -1,121 +0,0 @@ -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 ~ 2010 Patrick Huy -Matthias Butz -Jan Christian Meyer - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License version 3 -as published by the Free Software Foundation. You may not use, modify -or distribute this program under any other version of the -GNU Affero General Public License. - -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 . - */ -package tools; - -/** - * Represents a pair of values. - * - * @author Frz - * @since Revision 333 - * @version 1.0 - * - * @param The type of the left value. - * @param The type of the right value. - */ -public class Pair { - - public E left; - public F right; - - /** - * Class constructor - pairs two objects together. - * - * @param left The left object. - * @param right The right object. - */ - public Pair(E left, F right) { - this.left = left; - this.right = right; - } - - /** - * Gets the left value. - * - * @return The left value. - */ - public E getLeft() { - return left; - } - - /** - * Gets the right value. - * - * @return The right value. - */ - public F getRight() { - return right; - } - - /** - * Turns the pair into a string. - * - * @return Each value of the pair as a string joined with a colon. - */ - @Override - public String toString() { - return left.toString() + ":" + right.toString(); - } - - /** - * Gets the hash code of this pair. - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((left == null) ? 0 : left.hashCode()); - result = prime * result + ((right == null) ? 0 : right.hashCode()); - return result; - } - - /** - * Checks to see if two pairs are equal. - */ - @SuppressWarnings("unchecked") - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Pair other = (Pair) obj; - if (left == null) { - if (other.left != null) { - return false; - } - } else if (!left.equals(other.left)) { - return false; - } - if (right == null) { - if (other.right != null) { - return false; - } - } else if (!right.equals(other.right)) { - return false; - } - return true; - } -} \ No newline at end of file From e93db8b48f4b29e73a97f825505007625ce8bb1b Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 20:02:26 +0200 Subject: [PATCH 08/36] Move MapleCashVegaChecker to main module --- .../tools/mapletools/CashVegaChecker.java | 117 +++++++----------- tools/MapleCashVegaChecker/lib/result.txt | 5 - 2 files changed, 46 insertions(+), 76 deletions(-) rename tools/MapleCashVegaChecker/src/maplecashvegachecker/MapleCashVegaChecker.java => src/main/java/tools/mapletools/CashVegaChecker.java (65%) delete mode 100644 tools/MapleCashVegaChecker/lib/result.txt diff --git a/tools/MapleCashVegaChecker/src/maplecashvegachecker/MapleCashVegaChecker.java b/src/main/java/tools/mapletools/CashVegaChecker.java similarity index 65% rename from tools/MapleCashVegaChecker/src/maplecashvegachecker/MapleCashVegaChecker.java rename to src/main/java/tools/mapletools/CashVegaChecker.java index 220a1fdd24..ffdebc41d6 100644 --- a/tools/MapleCashVegaChecker/src/maplecashvegachecker/MapleCashVegaChecker.java +++ b/src/main/java/tools/mapletools/CashVegaChecker.java @@ -1,57 +1,32 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. +import provider.wz.WZFiles; - 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 . -*/ -package maplecashvegachecker; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PrintWriter; +import java.io.*; +import java.nio.charset.StandardCharsets; import java.util.HashSet; import java.util.Set; /** * * @author RonanLana - * - This application main objective is to read Vega-related information from - the item's description report back missing nodes for these items. - - Estimated parse time: 10 seconds + * +This application main objective is to read Vega-related information from +the item's description report back missing nodes for these items. + +Estimated parse time: 10 seconds */ -public class MapleCashVegaChecker { - - private static String wzPath = "../../wz"; - - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static int initialStringLength = 1000; - static int currentItem; - - static byte status = 0; - - static Set vegaItems = new HashSet<>(); - +public class CashVegaChecker { + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("vega_checker_report.txt"); + private static final int INITIAL_STRING_LENGTH = 1000; + private static final Set vegaItems = new HashSet<>(); + + private static PrintWriter printWriter = null; + private static InputStreamReader fileReader = null; + private static BufferedReader bufferedReader = null; + private static int currentItem; + private static byte status = 0; + private static String getName(String token) { int i, j; char[] dest; @@ -61,13 +36,13 @@ public class MapleCashVegaChecker { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); return(d.trim()); } - + private static String getValue(String token) { int i, j; char[] dest; @@ -77,13 +52,13 @@ public class MapleCashVegaChecker { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); - + d = new String(dest); return(d.trim()); } - + private static void forwardCursor(int st) { String line = null; @@ -105,16 +80,16 @@ public class MapleCashVegaChecker { status += 1; } } - + private static void translateItemToken(String token) { if(token.contains("/imgdir")) { status -= 1; } else if(token.contains("imgdir")) { status += 1; - + if (status == 2) { - currentItem = Integer.valueOf(getName(token)); + currentItem = Integer.parseInt(getName(token)); } } else { if (status == 2) { @@ -124,7 +99,7 @@ public class MapleCashVegaChecker { } } } - + private static void translateVegaToken(String token) { if(token.contains("/imgdir")) { status -= 1; @@ -139,11 +114,11 @@ public class MapleCashVegaChecker { } } } - + private static void readItemDescriptionFile(File f) { System.out.print("Reading String.wz... "); try { - fileReader = new InputStreamReader(new FileInputStream(f), "UTF-8"); + fileReader = new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); String line; @@ -158,11 +133,11 @@ public class MapleCashVegaChecker { } System.out.println(vegaItems.size() + " Vega Scroll items found"); } - + private static void readVegaDescriptionFile(File f) { System.out.println("Reading Etc.wz..."); try { - fileReader = new InputStreamReader(new FileInputStream(f), "UTF-8"); + fileReader = new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); String line; @@ -176,38 +151,38 @@ public class MapleCashVegaChecker { ioe.printStackTrace(); } } - + private static void printReportFileHeader() { printWriter.println(" # Report File autogenerated from the MapleCashVegaChecker feature by Ronan Lana."); printWriter.println(" # Generated data takes into account several data info from the server-side WZ.xmls."); printWriter.println(); } - + private static void reportMissingVegaItems() { System.out.println("Reporting results ..."); - + try { - printWriter = new PrintWriter("lib/result.txt", "UTF-8"); - + printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); + printReportFileHeader(); for (Integer itemid : vegaItems) { printWriter.println(" " + itemid); } - + printWriter.close(); } catch (IOException ioe) { ioe.printStackTrace(); } - + } - + public static void main(String[] args) { - - readItemDescriptionFile(new File(wzPath + "/String.wz/Consume.img.xml")); - readVegaDescriptionFile(new File(wzPath + "/Etc.wz/VegaSpell.img.xml")); - + + readItemDescriptionFile(new File(WZFiles.STRING.getFilePath() + "/Consume.img.xml")); + readVegaDescriptionFile(new File(WZFiles.ETC.getFilePath() + "/VegaSpell.img.xml")); + reportMissingVegaItems(); } - + } diff --git a/tools/MapleCashVegaChecker/lib/result.txt b/tools/MapleCashVegaChecker/lib/result.txt deleted file mode 100644 index a1e80b03cf..0000000000 --- a/tools/MapleCashVegaChecker/lib/result.txt +++ /dev/null @@ -1,5 +0,0 @@ - # Report File autogenerated from the MapleCashVegaChecker feature by Ronan Lana. - # Generated data takes into account several data info from the server-side WZ.xmls. - - 2040759 - 2040760 From 45f3cfdfa6a823f97f20e4b90a4e7fd04cb36e06 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 20:17:47 +0200 Subject: [PATCH 09/36] Move MapleCodeCouponGenerator to main module --- .../tools/mapletools/CodeCouponGenerator.java | 255 ++++++++---------- .../src/maplecodecoupongenerator/Pair.java | 121 --------- tools/input/.gitignore | 3 +- .../lib => input}/CouponCodes.img.xml | 28 +- 4 files changed, 124 insertions(+), 283 deletions(-) rename tools/MapleCodeCouponGenerator/src/maplecodecoupongenerator/MapleCodeCouponGenerator.java => src/main/java/tools/mapletools/CodeCouponGenerator.java (64%) delete mode 100644 tools/MapleCodeCouponGenerator/src/maplecodecoupongenerator/Pair.java rename tools/{MapleCodeCouponGenerator/lib => input}/CouponCodes.img.xml (53%) diff --git a/tools/MapleCodeCouponGenerator/src/maplecodecoupongenerator/MapleCodeCouponGenerator.java b/src/main/java/tools/mapletools/CodeCouponGenerator.java similarity index 64% rename from tools/MapleCodeCouponGenerator/src/maplecodecoupongenerator/MapleCodeCouponGenerator.java rename to src/main/java/tools/mapletools/CodeCouponGenerator.java index 45e2abab35..0539cf4d17 100644 --- a/tools/MapleCodeCouponGenerator/src/maplecodecoupongenerator/MapleCodeCouponGenerator.java +++ b/src/main/java/tools/mapletools/CodeCouponGenerator.java @@ -1,79 +1,46 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. +import tools.Pair; - 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 . -*/ -package maplecodecoupongenerator; - -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.sql.*; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; /** - * * @author RonanLana - - This application parses the coupon descriptor XML file and automatically generates - code entries on the DB reflecting the descriptions found. Parse time relies on the - sum of coupon codes created and amount of current codes on DB. - - Estimated parse time: 2 minutes (for 100 code entries) + *

+ * This application parses the coupon descriptor XML file and automatically generates + * code entries on the DB reflecting the descriptions found. Parse time relies on the + * sum of coupon codes created and amount of current codes on DB. + *

+ * Estimated parse time: 2 minutes (for 100 code entries) */ -public class MapleCodeCouponGenerator { - static String host = "jdbc:mysql://localhost:3306/cosmic"; - static String driver = "com.mysql.jdbc.Driver"; - static String username = "cosmic_server"; - static String password = "snailshell"; - - static Connection con = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static String fileName = "lib/CouponCodes.img.xml"; - static long currentTime; - - static int initialStringLength = 250; - - static String name; - static boolean active; - static int quantity, duration; - static int maplePoint, nxCredit, nxPrepaid; - - static List> itemList = new ArrayList<>(); - static Pair item; - - - static List activeCoupons = new ArrayList<>(); - static List generatedKeys; - static Set usedCodes = new HashSet<>(); - - static byte status; - +public class CodeCouponGenerator { + private static final File INPUT_FILE = ToolConstants.getInputFile("CouponCodes.img.xml"); + private static final int INITIAL_STRING_LENGTH = 250; + private static final Connection con = SimpleDatabaseConnection.getConnection(); + + private static final List activeCoupons = new ArrayList<>(); + private static final Set usedCodes = new HashSet<>(); + private static final List> itemList = new ArrayList<>(); + + private static BufferedReader bufferedReader = null; + private static long currentTime; + private static String name; + private static boolean active; + private static int quantity; + private static int duration; + private static int maplePoint; + private static int nxCredit; + private static int nxPrepaid; + private static Pair item; + private static List generatedKeys; + private static byte status; + private static void resetCouponPackage() { name = null; active = false; @@ -84,17 +51,17 @@ public class MapleCodeCouponGenerator { nxPrepaid = 0; itemList.clear(); } - + private static String getName(String token) { int i, j; char[] dest; String d; - + i = token.lastIndexOf("name"); i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; try { token.getChars(i, j, dest, 0); } catch (StringIndexOutOfBoundsException e) { @@ -105,14 +72,13 @@ public class MapleCodeCouponGenerator { e.printStackTrace(); try { Thread.sleep(100000000); - } catch (Exception ex) {} + } catch (Exception ex) { + } } - - d = new String(dest); - return(d.trim()); + return new String(dest).trim(); } - + private static String getValue(String token) { int i, j; char[] dest; @@ -122,68 +88,64 @@ public class MapleCodeCouponGenerator { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static void forwardCursor(int st) { String line = null; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { simpleToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static void simpleToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; } } - + private static void translateToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - + if (status == 1) { if (active) { activeCoupons.add(new CodeCouponDescriptor(name, quantity, duration, maplePoint, nxCredit, nxPrepaid, itemList)); } - + resetCouponPackage(); } else if (status == 3) { itemList.add(item); } - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; - + if (status == 4) { item = new Pair<>(-1, -1); } else if (status == 2) { String d = getName(token); - + System.out.println(" Reading coupon '" + d + "'"); name = d; } - } - else { + } else { String d = getName(token); - + if (status == 2) { switch (d) { case "active": - if (Integer.valueOf(getValue(token)) == 0) { + if (Integer.parseInt(getValue(token)) == 0) { forwardCursor(status); resetCouponPackage(); } else { @@ -192,19 +154,19 @@ public class MapleCodeCouponGenerator { break; case "quantity": - quantity = Integer.valueOf(getValue(token)); + quantity = Integer.parseInt(getValue(token)); break; case "duration": - duration = Integer.valueOf(getValue(token)); + duration = Integer.parseInt(getValue(token)); break; case "maplePoint": - maplePoint = Integer.valueOf(getValue(token)); + maplePoint = Integer.parseInt(getValue(token)); break; case "nxCredit": - nxCredit = Integer.valueOf(getValue(token)); + nxCredit = Integer.parseInt(getValue(token)); break; case "nxPrepaid": - nxPrepaid = Integer.valueOf(getValue(token)); + nxPrepaid = Integer.parseInt(getValue(token)); break; } } else if (status == 4) { @@ -219,13 +181,13 @@ public class MapleCodeCouponGenerator { } } } - + private static class CodeCouponDescriptor { protected String name; protected int quantity, duration; protected int nxCredit, maplePoint, nxPrepaid; protected List> itemList; - + protected CodeCouponDescriptor(String name, int quantity, int duration, int maplePoint, int nxCredit, int nxPrepaid, List> itemList) { this.name = name; this.quantity = quantity; @@ -233,109 +195,111 @@ public class MapleCodeCouponGenerator { this.maplePoint = maplePoint; this.nxCredit = nxCredit; this.nxPrepaid = nxPrepaid; - + this.itemList = new ArrayList<>(itemList); } } - + private static String randomizeCouponCode() { return Long.toHexString(Double.doubleToLongBits(Math.random())).substring(0, 15); } - + private static String generateCouponCode() { String newCode; do { newCode = randomizeCouponCode(); } while (usedCodes.contains(newCode)); - + usedCodes.add(newCode); return newCode; } - + private static List getGeneratedKeys(PreparedStatement ps) throws SQLException { if (generatedKeys == null) { generatedKeys = new ArrayList<>(); - + ResultSet rs = ps.getGeneratedKeys(); while (rs.next()) { generatedKeys.add(rs.getInt(1)); } rs.close(); } - + return generatedKeys; } - + private static void commitCodeCouponDescription(CodeCouponDescriptor recipe) throws SQLException { - if (recipe.quantity < 1) return; - + if (recipe.quantity < 1) { + return; + } + System.out.println(" Generating coupon '" + recipe.name + "'"); generatedKeys = null; - + PreparedStatement ps = con.prepareStatement("INSERT IGNORE INTO `nxcode` (`code`, `expiration`) VALUES (?, ?)", Statement.RETURN_GENERATED_KEYS); ps.setLong(2, currentTime + ((long) recipe.duration * 60 * 60 * 1000)); - - for(int i = 0; i < recipe.quantity; i++) { + + for (int i = 0; i < recipe.quantity; i++) { ps.setString(1, generateCouponCode()); ps.addBatch(); } ps.executeBatch(); - + PreparedStatement ps2 = con.prepareStatement("INSERT IGNORE INTO `nxcode_items` (`codeid`, `type`, `item`, `quantity`) VALUES (?, ?, ?, ?)"); if (!recipe.itemList.isEmpty()) { ps2.setInt(2, 5); List keys = getGeneratedKeys(ps); - + for (Pair p : recipe.itemList) { ps2.setInt(3, p.getLeft()); ps2.setInt(4, p.getRight()); - + for (Integer codeid : keys) { ps2.setInt(1, codeid); ps2.addBatch(); } } } - + ps2.setInt(3, 0); if (recipe.nxCredit > 0) { ps2.setInt(2, 0); ps2.setInt(4, recipe.nxCredit); List keys = getGeneratedKeys(ps); - - for(Integer codeid : keys) { + + for (Integer codeid : keys) { ps2.setInt(1, codeid); ps2.addBatch(); } } - + if (recipe.maplePoint > 0) { ps2.setInt(2, 1); ps2.setInt(4, recipe.maplePoint); List keys = getGeneratedKeys(ps); - - for(Integer codeid : keys) { + + for (Integer codeid : keys) { ps2.setInt(1, codeid); ps2.addBatch(); } } - + if (recipe.nxPrepaid > 0) { ps2.setInt(2, 2); ps2.setInt(4, recipe.nxPrepaid); List keys = getGeneratedKeys(ps); - - for(Integer codeid : keys) { + + for (Integer codeid : keys) { ps2.setInt(1, codeid); ps2.addBatch(); } } - + ps2.executeBatch(); ps2.close(); ps.close(); } - + private static void loadUsedCouponCodes() throws SQLException { PreparedStatement ps = con.prepareStatement("SELECT code FROM nxcode", Statement.RETURN_GENERATED_KEYS); ResultSet rs = ps.executeQuery(); @@ -345,51 +309,48 @@ public class MapleCodeCouponGenerator { rs.close(); ps.close(); } - - private static void generateCodeCoupons(String fileName) throws IOException { - fileReader = new InputStreamReader(new FileInputStream(fileName), "UTF-8"); + + private static void generateCodeCoupons(File file) throws IOException { + InputStreamReader fileReader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - + resetCouponPackage(); status = 0; - + System.out.println("Reading XML coupon information..."); String line; - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { translateToken(line); } bufferedReader.close(); fileReader.close(); System.out.println(); - + try { - Class.forName(driver).newInstance(); - con = DriverManager.getConnection(host, username, password); - System.out.println("Loading DB coupon codes..."); loadUsedCouponCodes(); System.out.println(); - + System.out.println("Saving generated coupons..."); currentTime = System.currentTimeMillis(); for (CodeCouponDescriptor ccd : activeCoupons) { commitCodeCouponDescription(ccd); } System.out.println(); - + con.close(); System.out.println("Done."); - } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | SQLException e) { + } catch (SQLException e) { e.printStackTrace(); } } - + public static void main(String[] args) { try { - generateCodeCoupons(fileName); - } catch(IOException ex) { - System.out.println("Error reading file '" + fileName + "'"); + generateCodeCoupons(INPUT_FILE); + } catch (IOException ex) { + System.out.println("Error reading file '" + INPUT_FILE.getAbsolutePath() + "'"); } } } diff --git a/tools/MapleCodeCouponGenerator/src/maplecodecoupongenerator/Pair.java b/tools/MapleCodeCouponGenerator/src/maplecodecoupongenerator/Pair.java deleted file mode 100644 index b0bcdf2411..0000000000 --- a/tools/MapleCodeCouponGenerator/src/maplecodecoupongenerator/Pair.java +++ /dev/null @@ -1,121 +0,0 @@ -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 ~ 2010 Patrick Huy -Matthias Butz -Jan Christian Meyer - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License version 3 -as published by the Free Software Foundation. You may not use, modify -or distribute this program under any other version of the -GNU Affero General Public License. - -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 . - */ -package maplecodecoupongenerator; - -/** - * Represents a pair of values. - * - * @author Frz - * @since Revision 333 - * @version 1.0 - * - * @param The type of the left value. - * @param The type of the right value. - */ -public class Pair { - - public E left; - public F right; - - /** - * Class constructor - pairs two objects together. - * - * @param left The left object. - * @param right The right object. - */ - public Pair(E left, F right) { - this.left = left; - this.right = right; - } - - /** - * Gets the left value. - * - * @return The left value. - */ - public E getLeft() { - return left; - } - - /** - * Gets the right value. - * - * @return The right value. - */ - public F getRight() { - return right; - } - - /** - * Turns the pair into a string. - * - * @return Each value of the pair as a string joined with a colon. - */ - @Override - public String toString() { - return left.toString() + ":" + right.toString(); - } - - /** - * Gets the hash code of this pair. - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((left == null) ? 0 : left.hashCode()); - result = prime * result + ((right == null) ? 0 : right.hashCode()); - return result; - } - - /** - * Checks to see if two pairs are equal. - */ - @SuppressWarnings("unchecked") - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Pair other = (Pair) obj; - if (left == null) { - if (other.left != null) { - return false; - } - } else if (!left.equals(other.left)) { - return false; - } - if (right == null) { - if (other.right != null) { - return false; - } - } else if (!right.equals(other.right)) { - return false; - } - return true; - } -} \ No newline at end of file diff --git a/tools/input/.gitignore b/tools/input/.gitignore index 9e88c6e0f0..ff456c3654 100644 --- a/tools/input/.gitignore +++ b/tools/input/.gitignore @@ -1,4 +1,5 @@ * !*/ !/cosmetics/** -!.gitignore \ No newline at end of file +!.gitignore +!CouponCodes.img.xml \ No newline at end of file diff --git a/tools/MapleCodeCouponGenerator/lib/CouponCodes.img.xml b/tools/input/CouponCodes.img.xml similarity index 53% rename from tools/MapleCodeCouponGenerator/lib/CouponCodes.img.xml rename to tools/input/CouponCodes.img.xml index 9fccae135f..8ce30f6212 100644 --- a/tools/MapleCodeCouponGenerator/lib/CouponCodes.img.xml +++ b/tools/input/CouponCodes.img.xml @@ -4,17 +4,17 @@ - - - + + + - - + + - - + + @@ -22,17 +22,17 @@ - - - + + + - - + + - - + + From 08d2b40cc4400f433afb4e3810391fb7b648452d Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 20:34:00 +0200 Subject: [PATCH 10/36] Move MapleCouponInstaller to main module, use wz files directly --- .../tools/mapletools/CouponInstaller.java | 255 ++++++++ tools/MapleCouponInstaller/0521.img.xml | 609 ------------------ tools/MapleCouponInstaller/0536.img.xml | 223 ------- tools/MapleCouponInstaller/lib/0521.img.xml | 609 ------------------ tools/MapleCouponInstaller/lib/0536.img.xml | 223 ------- .../MapleCouponInstaller.java | 311 --------- 6 files changed, 255 insertions(+), 1975 deletions(-) create mode 100644 src/main/java/tools/mapletools/CouponInstaller.java delete mode 100644 tools/MapleCouponInstaller/0521.img.xml delete mode 100644 tools/MapleCouponInstaller/0536.img.xml delete mode 100644 tools/MapleCouponInstaller/lib/0521.img.xml delete mode 100644 tools/MapleCouponInstaller/lib/0536.img.xml delete mode 100644 tools/MapleCouponInstaller/src/maplecouponinstaller/MapleCouponInstaller.java diff --git a/src/main/java/tools/mapletools/CouponInstaller.java b/src/main/java/tools/mapletools/CouponInstaller.java new file mode 100644 index 0000000000..aba16b58dd --- /dev/null +++ b/src/main/java/tools/mapletools/CouponInstaller.java @@ -0,0 +1,255 @@ +package tools.mapletools; + +import provider.wz.WZFiles; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +/** + * @author RonanLana + *

+ * This application gathers information about the Cash Shop's EXP & DROP coupons, + * such as applied rates, active times of day and days of week and dumps them in + * a SQL table that the server will make use. + */ +public class CouponInstaller { + private static final File COUPON_INPUT_FILE_1 = new File(WZFiles.ITEM.getFilePath(), "/Cash/0521.img.xml"); + private static final File COUPON_INPUT_FILE_2 = new File(WZFiles.ITEM.getFilePath(), "/Cash/0536.img.xml"); + private static final Connection con = SimpleDatabaseConnection.getConnection(); + private static BufferedReader bufferedReader = null; + private static byte status = 0; + private static int itemId = -1; + private static int itemMultiplier = 1; + private static int startHour = -1; + private static int endHour = -1; + private static int activeDay = 0; + + private static String getName(String token) { + int i, j; + char[] dest; + String d; + + i = token.lastIndexOf("name"); + if (i < 0) { + return ""; + } + + i = token.indexOf("\"", i) + 1; //lower bound of the string + j = token.indexOf("\"", i); //upper bound + + dest = new char[8]; + token.getChars(i, j, dest, 0); + + d = new String(dest); + return (d); + } + + private static String getNodeValue(String token) { + int i, j; + char[] dest; + String d; + + i = token.lastIndexOf("value="); + i = token.indexOf("\"", i) + 1; //lower bound of the string + j = token.indexOf("\"", i); //upper bound + + if (j - i < 1) { + return ""; + } + + dest = new char[j - i]; + token.getChars(i, j, dest, 0); + + d = new String(dest); + return (d); + } + + private static void forwardCursor(int st) { + String line = null; + + try { + while (status >= st && (line = bufferedReader.readLine()) != null) { + simpleToken(line); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void simpleToken(String token) { + if (token.contains("/imgdir")) { + status -= 1; + } else if (token.contains("imgdir")) { + status += 1; + } + } + + private static int getDayOfWeek(String day) { + return switch (day) { + case "SUN" -> 1; + case "MON" -> 2; + case "TUE" -> 3; + case "WED" -> 4; + case "THU" -> 5; + case "FRI" -> 6; + case "SAT" -> 7; + default -> 0; + }; + } + + private static void processHourTimeString(String time) { + startHour = Integer.parseInt(time.substring(4, 6)); + endHour = Integer.parseInt(time.substring(7, 9)); + } + + private static void processDayTimeString(String time) { + String day = time.substring(0, 3); + int d = getDayOfWeek(day); + + activeDay |= (1 << d); + } + + private static void loadTimeFromCoupon(int st) { + System.out.println("Loading coupon id " + itemId + ". Rate: " + itemMultiplier + "x."); + + String line = null; + try { + startHour = -1; + endHour = -1; + activeDay = 0; + + String time = null; + while ((line = bufferedReader.readLine()) != null) { + simpleToken(line); + if (status < st) { + break; + } + + time = getNodeValue(line); + processDayTimeString(time); + + simpleToken(line); + } + + if (time != null) { + processHourTimeString(time); + + PreparedStatement ps = con.prepareStatement("INSERT INTO nxcoupons (couponid, rate, activeday, starthour, endhour) VALUES (?, ?, ?, ?, ?)"); + ps.setInt(1, itemId); + ps.setInt(2, itemMultiplier); + ps.setInt(3, activeDay); + ps.setInt(4, startHour); + ps.setInt(5, endHour); + ps.execute(); + + ps.close(); + } + } catch (SQLException | IOException e) { + e.printStackTrace(); + } + } + + private static void translateToken(String token) { + String d; + + if (token.contains("/imgdir")) { + status -= 1; + } else if (token.contains("imgdir")) { + if (status == 1) { //getting ItemId + d = getName(token); + itemId = Integer.parseInt(d); + } else if (status == 2) { + d = getName(token); + + if (!d.contains("info")) { + forwardCursor(status); + } + } else if (status == 3) { + d = getName(token); + + if (!d.contains("time")) { + forwardCursor(status); + } else { + loadTimeFromCoupon(status); + } + } + + status += 1; + } else { + if (status == 3) { + d = getName(token); + + if (d.contains("rate")) { + String r = getNodeValue(token); + + double db = Double.parseDouble(r); + itemMultiplier = (int) db; + } + } + } + } + + private static void installRateCoupons(File file) { + // This will reference one line at a time + String line = null; + + try { + InputStreamReader fileReader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8); + bufferedReader = new BufferedReader(fileReader); + + while ((line = bufferedReader.readLine()) != null) { + translateToken(line); + } + + bufferedReader.close(); + fileReader.close(); + } catch (FileNotFoundException ex) { + System.out.println("Unable to open file '" + file + "'"); + } catch (IOException ex) { + System.out.println("Error reading file '" + file + "'"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void installCouponsTable() { + try { + PreparedStatement ps = con.prepareStatement("DROP TABLE IF EXISTS `nxcoupons`;"); + ps.execute(); + ps.close(); + + ps = con.prepareStatement( + """ + CREATE TABLE IF NOT EXISTS `nxcoupons` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `couponid` int(11) NOT NULL DEFAULT '0', + `rate` int(11) NOT NULL DEFAULT '0', + `activeday` int(11) NOT NULL DEFAULT '0', + `starthour` int(11) NOT NULL DEFAULT '0', + `endhour` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) + ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;""" + ); + + ps.execute(); + ps.close(); + + installRateCoupons(COUPON_INPUT_FILE_1); + installRateCoupons(COUPON_INPUT_FILE_2); + + con.close(); + } catch (SQLException e) { + System.out.println("Warning: Could not establish connection to database to change card chance rate."); + System.out.println(e.getMessage()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + installCouponsTable(); + } +} diff --git a/tools/MapleCouponInstaller/0521.img.xml b/tools/MapleCouponInstaller/0521.img.xml deleted file mode 100644 index 099f15ff14..0000000000 --- a/tools/MapleCouponInstaller/0521.img.xml +++ /dev/null @@ -1,609 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleCouponInstaller/0536.img.xml b/tools/MapleCouponInstaller/0536.img.xml deleted file mode 100644 index de8fc45878..0000000000 --- a/tools/MapleCouponInstaller/0536.img.xml +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleCouponInstaller/lib/0521.img.xml b/tools/MapleCouponInstaller/lib/0521.img.xml deleted file mode 100644 index 099f15ff14..0000000000 --- a/tools/MapleCouponInstaller/lib/0521.img.xml +++ /dev/null @@ -1,609 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleCouponInstaller/lib/0536.img.xml b/tools/MapleCouponInstaller/lib/0536.img.xml deleted file mode 100644 index de8fc45878..0000000000 --- a/tools/MapleCouponInstaller/lib/0536.img.xml +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleCouponInstaller/src/maplecouponinstaller/MapleCouponInstaller.java b/tools/MapleCouponInstaller/src/maplecouponinstaller/MapleCouponInstaller.java deleted file mode 100644 index c646398bb1..0000000000 --- a/tools/MapleCouponInstaller/src/maplecouponinstaller/MapleCouponInstaller.java +++ /dev/null @@ -1,311 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package maplecouponinstaller; - -import java.io.*; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.SQLException; - -/** - * - * @author RonanLana - * - * This application gathers information about the Cash Shop's EXP & DROP coupons, - * such as applied rates, active times of day and days of week and dumps them in - * a SQL table that the server will make use. - * - */ -public class MapleCouponInstaller { - static String host = "jdbc:mysql://localhost:3306/cosmic"; - static String driver = "com.mysql.jdbc.Driver"; - static String username = "cosmic_server"; - static String password = "snailshell"; - - static Connection con = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - static byte status = 0; - static int itemId = -1, itemMultiplier = 1, startHour = -1, endHour = -1, activeDay = 0; - - private static String getName(String token) { - int i, j; - char[] dest; - String d; - - i = token.lastIndexOf("name"); - if(i < 0) return ""; - - i = token.indexOf("\"", i) + 1; //lower bound of the string - j = token.indexOf("\"", i); //upper bound - - dest = new char[8]; - token.getChars(i, j, dest, 0); - - d = new String(dest); - return(d); - } - - private static String getNodeValue(String token) { - int i, j; - char[] dest; - String d; - - i = token.lastIndexOf("value="); - i = token.indexOf("\"", i) + 1; //lower bound of the string - j = token.indexOf("\"", i); //upper bound - - if(j - i < 1) return ""; - - dest = new char[j - i]; - token.getChars(i, j, dest, 0); - - d = new String(dest); - return(d); - } - - private static void forwardCursor(int st) { - String line = null; - - try { - while(status >= st && (line = bufferedReader.readLine()) != null) { - simpleToken(line); - } - } - catch(Exception e) { - e.printStackTrace(); - } - } - - private static void simpleToken(String token) { - if(token.contains("/imgdir")) { - status -= 1; - } - else if(token.contains("imgdir")) { - status += 1; - } - } - - private static int getDayOfWeek(String day) { - switch(day) { - case "SUN": - return 1; - - case "MON": - return 2; - - case "TUE": - return 3; - - case "WED": - return 4; - - case "THU": - return 5; - - case "FRI": - return 6; - - case "SAT": - return 7; - - default: - return 0; - } - } - - private static void processHourTimeString(String time) { - startHour = Integer.parseInt(time.substring(4, 6)); - endHour = Integer.parseInt(time.substring(7, 9)); - } - - private static void processDayTimeString(String time) { - String day = time.substring(0, 3); - int d = getDayOfWeek(day); - - activeDay |= (1 << d); - } - - private static void loadTimeFromCoupon(int st) { - System.out.println("Loading coupon id " + itemId + ". Rate: " + itemMultiplier + "x."); - - String line = null; - try { - startHour = -1; - endHour = -1; - activeDay = 0; - - String time = null; - while((line = bufferedReader.readLine()) != null) { - simpleToken(line); - if(status < st) break; - - time = getNodeValue(line); - processDayTimeString(time); - - simpleToken(line); - } - - if(time != null) { - processHourTimeString(time); - - PreparedStatement ps = con.prepareStatement("INSERT INTO nxcoupons (couponid, rate, activeday, starthour, endhour) VALUES (?, ?, ?, ?, ?)"); - ps.setInt(1, itemId); - ps.setInt(2, itemMultiplier); - ps.setInt(3, activeDay); - ps.setInt(4, startHour); - ps.setInt(5, endHour); - ps.execute(); - - ps.close(); - } - } - catch(SQLException | IOException e) { - e.printStackTrace(); - } - } - - private static void translateToken(String token) { - String d; - - if(token.contains("/imgdir")) { - status -= 1; - } - else if(token.contains("imgdir")) { - if(status == 1) { //getting ItemId - d = getName(token); - itemId = Integer.parseInt(d); - } - else if(status == 2) { - d = getName(token); - - if(!d.contains("info")) { - forwardCursor(status); - } - } - else if(status == 3) { - d = getName(token); - - if(!d.contains("time")) { - forwardCursor(status); - } - else { - loadTimeFromCoupon(status); - } - } - - status += 1; - } - else { - if(status == 3) { - d = getName(token); - - if(d.contains("rate")) { - String r = getNodeValue(token); - - double db = Double.parseDouble(r); - itemMultiplier = (int) db; - } - } - } - } - - private static void installRateCoupons(String fileName) { - // This will reference one line at a time - String line = null; - - try { - fileReader = new InputStreamReader(new FileInputStream(fileName), "UTF-8"); - bufferedReader = new BufferedReader(fileReader); - - while((line = bufferedReader.readLine()) != null) { - translateToken(line); - } - - bufferedReader.close(); - fileReader.close(); - } - - catch(FileNotFoundException ex) { - System.out.println("Unable to open file '" + fileName + "'"); - } - catch(IOException ex) { - System.out.println("Error reading file '" + fileName + "'"); - } - - catch(Exception e) { - e.printStackTrace(); - } - } - - private static void installCouponsTable() { - try { - Class.forName(driver).newInstance(); - con = DriverManager.getConnection(host, username, password); - - PreparedStatement ps = con.prepareStatement("DROP TABLE IF EXISTS `nxcoupons`;"); - ps.execute(); - ps.close(); - - ps = con.prepareStatement( - "CREATE TABLE IF NOT EXISTS `nxcoupons` (\n" + - " `id` int(11) NOT NULL AUTO_INCREMENT,\n" + - " `couponid` int(11) NOT NULL DEFAULT '0',\n" + - " `rate` int(11) NOT NULL DEFAULT '0',\n" + - " `activeday` int(11) NOT NULL DEFAULT '0',\n" + - " `starthour` int(11) NOT NULL DEFAULT '0',\n" + - " `endhour` int(11) NOT NULL DEFAULT '0',\n" + - " PRIMARY KEY (`id`)\n" + - ") ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;"); - - ps.execute(); - ps.close(); - - installRateCoupons("lib/0521.img.xml"); - installRateCoupons("lib/0536.img.xml"); - - con.close(); - } - - catch(SQLException e) { - System.out.println("Warning: Could not establish connection to database to change card chance rate."); - System.out.println(e.getMessage()); - } - - catch(ClassNotFoundException e) { - System.out.println("Error: could not find class"); - System.out.println(e.getMessage()); - } - - catch(InstantiationException e) { - System.out.println("Error: instantiation failure"); - System.out.println(e.getMessage()); - } - - catch(Exception e) { - e.printStackTrace(); - } - } - - public static void main(String[] args) { - installCouponsTable(); - } -} From e6fef246cbfe611760a03f39f0ee6af202cb8dfe Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 22:10:21 +0200 Subject: [PATCH 11/36] Move MapleEmptyItemWzChecker to main module --- .../mapletools/CashCosmeticsChecker.java | 3 +- .../tools/mapletools/EmptyItemWzChecker.java | 329 ++++++++---------- .../java/tools/mapletools/ToolConstants.java | 1 + tools/MapleEmptyItemWzChecker/lib/Report.txt | 149 -------- 4 files changed, 147 insertions(+), 335 deletions(-) rename tools/MapleEmptyItemWzChecker/src/mapleemptyitemwzchecker/MapleEmptyItemWzChecker.java => src/main/java/tools/mapletools/EmptyItemWzChecker.java (65%) delete mode 100644 tools/MapleEmptyItemWzChecker/lib/Report.txt diff --git a/src/main/java/tools/mapletools/CashCosmeticsChecker.java b/src/main/java/tools/mapletools/CashCosmeticsChecker.java index 37641bf0e2..696f3218b1 100644 --- a/src/main/java/tools/mapletools/CashCosmeticsChecker.java +++ b/src/main/java/tools/mapletools/CashCosmeticsChecker.java @@ -21,7 +21,6 @@ import java.util.*; * Estimated parse time: 1 minute */ public class CashCosmeticsChecker { - private static final String HANDBOOK_PATH = "handbook"; private static final String INPUT_DIRECTORY_PATH = ToolConstants.getInputFile("care").getPath(); private static final File OUTPUT_FILE = ToolConstants.getOutputFile("cash_cosmetics_result.txt"); private static final boolean IGNORE_CURRENT_SCRIPT_COSMETICS = false; // Toggle to preference @@ -481,7 +480,7 @@ public class CashCosmeticsChecker { } private static String getHandbookFileName(String fileName) { - return HANDBOOK_PATH + fileName; + return ToolConstants.HANDBOOK_PATH + fileName; } private static List fetchExpectedCosmetics(String[] cosmeticList, boolean gender) { diff --git a/tools/MapleEmptyItemWzChecker/src/mapleemptyitemwzchecker/MapleEmptyItemWzChecker.java b/src/main/java/tools/mapletools/EmptyItemWzChecker.java similarity index 65% rename from tools/MapleEmptyItemWzChecker/src/mapleemptyitemwzchecker/MapleEmptyItemWzChecker.java rename to src/main/java/tools/mapletools/EmptyItemWzChecker.java index 6636bbcf50..f696d319a1 100644 --- a/tools/MapleEmptyItemWzChecker/src/mapleemptyitemwzchecker/MapleEmptyItemWzChecker.java +++ b/src/main/java/tools/mapletools/EmptyItemWzChecker.java @@ -1,72 +1,38 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. +import provider.wz.WZFiles; - 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 . -*/ -package mapleemptyitemwzchecker; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStreamReader; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.Stack; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.*; /** - * * @author RonanLana - * - This application has two objectives: it reports in a detailed file all itemids which is - currently missing either a name entry in the String.wz or an item entry in the Item.wz; - And it removes from the String.wz XMLs all entries which misses properties on Item.wz. + *

+ * This application has two objectives: it reports in a detailed file all itemids which is + * currently missing either a name entry in the String.wz or an item entry in the Item.wz; + * And it removes from the String.wz XMLs all entries which misses properties on Item.wz. */ -public class MapleEmptyItemWzChecker { - - static String newFile = "lib/Report.txt"; - static String outputWzPath = "lib"; - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static String wzPath = "../../wz"; - static String handbookPath = "../../handbook"; - static int initialStringLength = 50; - static int itemFileNameSize = 13; - - static byte status = 0; - static int currentItemid = 0; - static int currentDepth = 0; - static Stack currentPath = new Stack<>(); - static String currentFile; - - static Map stringWzItems = new HashMap<>(); - static Map contentWzItems = new HashMap<>(); - - static Set handbookItems = new HashSet<>(); - static Set nonPropItems; - +public class EmptyItemWzChecker { + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("empty_item_wz_report.txt"); + private static final String OUTPUT_PATH = ToolConstants.OUTPUT_DIRECTORY.getPath(); + private static final int INITIAL_STRING_LENGTH = 50; + private static final int ITEM_FILE_NAME_SIZE = 13; + + private static final Stack currentPath = new Stack<>(); + private static final Map stringWzItems = new HashMap<>(); + private static final Map contentWzItems = new HashMap<>(); + private static final Set handbookItems = new HashSet<>(); + + private static PrintWriter printWriter = null; + private static InputStreamReader fileReader = null; + private static BufferedReader bufferedReader = null; + private static byte status = 0; + private static int currentItemid = 0; + private static int currentDepth = 0; + private static String currentFile; + private static Set nonPropItems; + private static String getName(String token) { int i, j; char[] dest; @@ -76,35 +42,33 @@ public class MapleEmptyItemWzChecker { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static void forwardCursor(int st) { String line = null; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { simpleToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } private static void simpleToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; } } - + private static void listFiles(String directoryName, ArrayList files) { File directory = new File(directoryName); @@ -118,137 +82,135 @@ public class MapleEmptyItemWzChecker { } } } - + private static int getItemIdFromFilename(String name) { try { - return Integer.valueOf(name.substring(0, name.indexOf('.'))); - } catch(Exception e) { + return Integer.parseInt(name.substring(0, name.indexOf('.'))); + } catch (Exception e) { return -1; } } - + private static void inspectItemWzEntry() { String line = null; try { - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { translateItemToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static String currentItemPath() { String s = currentFile + " -> "; - + for (String p : currentPath) { s += (p + "\\"); } - + return s; } - + private static void translateItemToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - + currentPath.pop(); - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; String d = getName(token); - - if(status == 2) { - currentItemid = Integer.valueOf(d); + + if (status == 2) { + currentItemid = Integer.parseInt(d); contentWzItems.put(currentItemid, currentItemPath()); - + forwardCursor(status); } else { currentPath.push(d); } } } - + private static void inspectStringWzEntry() { String line = null; - + try { - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { translateStringToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static void translateStringToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; currentPath.pop(); - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; String d = getName(token); - - if(status == currentDepth) { - currentItemid = Integer.valueOf(d); + + if (status == currentDepth) { + currentItemid = Integer.parseInt(d); stringWzItems.put(currentItemid, currentItemPath()); //if (currentItemid >= 4000000) System.out.println(" " + currentItemid); - + forwardCursor(status); } else { currentPath.push(d); } } } - + private static void loadStringWzFile(String filePath, int depth) throws IOException { - fileReader = new InputStreamReader(new FileInputStream(filePath), "UTF-8"); + fileReader = new InputStreamReader(new FileInputStream(filePath), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); currentFile = filePath; currentDepth = 2 + depth; //System.out.println(filePath + " depth " + depth); inspectStringWzEntry(); - + bufferedReader.close(); fileReader.close(); } - + private static void loadStringWz() throws IOException { System.out.println("Reading String.wz ..."); - String stringWzFiles[][] = {{"Cash", "Consume", "Ins", "Pet"}, {"Etc"}, {"Eqp"}}; - String stringWzPath = wzPath + "/String.wz/"; - + String[][] stringWzFiles = {{"Cash", "Consume", "Ins", "Pet"}, {"Etc"}, {"Eqp"}}; + for (int i = 0; i < stringWzFiles.length; i++) { for (String dirFile : stringWzFiles[i]) { - loadStringWzFile(stringWzPath + dirFile + ".img.xml", i); + final String fileName = "/" + dirFile + ".img.xml"; + loadStringWzFile(WZFiles.STRING.getFilePath() + fileName, i); } } } - + private static void loadItemWz() throws IOException { System.out.println("Reading Item.wz ..."); ArrayList files = new ArrayList<>(); - listFiles(wzPath + "/Item.wz", files); + listFiles(WZFiles.ITEM.getFilePath(), files); + + for (File f : files) { + if (f.getParentFile().getName().contentEquals("Special")) { + continue; + } - for(File f : files) { - if (f.getParentFile().getName().contentEquals("Special")) continue; - //System.out.println("Parsing " + f.getAbsolutePath()); - fileReader = new InputStreamReader(new FileInputStream(f), "UTF-8"); + fileReader = new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - + currentFile = f.getCanonicalPath(); - if(f.getName().length() <= itemFileNameSize) { + if (f.getName().length() <= ITEM_FILE_NAME_SIZE) { inspectItemWzEntry(); } else { // pet file structure is similar to equips, maybe there are other item-types following this behaviour? int itemid = getItemIdFromFilename(f.getName()); - if(itemid < 0) { + if (itemid < 0) { continue; } @@ -260,17 +222,19 @@ public class MapleEmptyItemWzChecker { fileReader.close(); } } - + private static void loadCharacterWz() throws IOException { System.out.println("Reading Character.wz ..."); ArrayList files = new ArrayList<>(); - listFiles(wzPath + "/Character.wz", files); + listFiles(WZFiles.CHARACTER.getFilePath(), files); + + for (File f : files) { + if (f.getParentFile().getName().contentEquals("Character.wz")) { + continue; + } - for(File f : files) { - if (f.getParentFile().getName().contentEquals("Character.wz")) continue; - int itemid = getItemIdFromFilename(f.getName()); - if(itemid < 0) { + if (itemid < 0) { continue; } @@ -279,57 +243,56 @@ public class MapleEmptyItemWzChecker { contentWzItems.put(currentItemid, currentItemPath()); } } - + private static void calculateItemNameDiff(Set emptyItemNames, Set emptyNameItems) { for (Integer i : contentWzItems.keySet()) { if (!stringWzItems.containsKey(i)) { emptyNameItems.add(i); } } - + for (Integer i : stringWzItems.keySet()) { if (!contentWzItems.containsKey(i)) { emptyItemNames.add(i); } } } - + private static void readHandbookItems() throws IOException { System.out.println("Reading handbook ..."); String[] handbookPaths = {"Equip", "Cash.txt", "Etc.txt", "Pet.txt", "Setup.txt", "Use.txt"}; - + for (String path : handbookPaths) { - readHandbookPath(handbookPath + "/" + path); + readHandbookPath(ToolConstants.HANDBOOK_PATH + "/" + path); } } - + private static void readHandbookPath(String filePath) throws IOException { ArrayList files = new ArrayList<>(); - + File testFile = new File(filePath); if (testFile.isDirectory()) { listFiles(filePath, files); } else { files.add(testFile); } - + for (File f : files) { - fileReader = new InputStreamReader(new FileInputStream(f), "UTF-8"); + fileReader = new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); String line = null; try { - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { String[] tokens = line.split(" - "); if (tokens[0].length() > 0) { - int itemid = Integer.valueOf(tokens[0]); + int itemid = Integer.parseInt(tokens[0]); handbookItems.add(itemid); } } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } @@ -337,60 +300,60 @@ public class MapleEmptyItemWzChecker { fileReader.close(); } } - + private static void printReportFileHeader() { printWriter.println(" # Report File autogenerated from the MapleEmptyItemWzChecker feature by Ronan Lana."); printWriter.println(" # Generated data takes into account several data info from the server-side WZ.xmls."); printWriter.println(); } - + private static List getSortedItems(Set items) { List sortedItems = new ArrayList<>(items); Collections.sort(sortedItems); - + return sortedItems; } - + private static void printReportFileResults(Set emptyItemNames, Set emptyNameItems) { if (!emptyItemNames.isEmpty()) { printWriter.println("String.wz NAMES with no Item.wz node, " + emptyItemNames.size() + " entries:"); - - for(Integer itemid : getSortedItems(emptyItemNames)) { + + for (Integer itemid : getSortedItems(emptyItemNames)) { printWriter.println(" " + itemid + " " + stringWzItems.get(itemid) + (handbookItems.contains(itemid) ? "" : " NOT FOUND")); } - + printWriter.println(); } - + if (!emptyNameItems.isEmpty()) { printWriter.println("Item.wz ITEMS with no String.wz node, " + emptyNameItems.size() + " entries:"); - - for(Integer itemid : getSortedItems(emptyNameItems)) { + + for (Integer itemid : getSortedItems(emptyNameItems)) { printWriter.println(" " + itemid + " " + contentWzItems.get(itemid) + (handbookItems.contains(itemid) ? "" : " NOT FOUND")); } - + printWriter.println(); } } - + private static void reportItemNameDiff(Set emptyItemNames, Set emptyNameItems) throws IOException { System.out.println("Reporting results..."); - printWriter = new PrintWriter(newFile, "UTF-8"); - + printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); + printReportFileHeader(); printReportFileResults(emptyItemNames, emptyNameItems); - + printWriter.close(); } - + private static void locateItemStringWzDiff() throws IOException { Set emptyItemNames = new HashSet<>(), emptyNameItems = new HashSet<>(); calculateItemNameDiff(emptyItemNames, emptyNameItems); - + reportItemNameDiff(emptyItemNames, emptyNameItems); nonPropItems = emptyItemNames; } - + private static void runEmptyItemWzChecker() throws IOException { readHandbookItems(); @@ -400,77 +363,75 @@ public class MapleEmptyItemWzChecker { locateItemStringWzDiff(); } - + private static void generateStringWzEntry() { String line = null; - + try { - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { updateStringToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static void updateStringToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - - } - else if(token.contains("imgdir")) { + + } else if (token.contains("imgdir")) { status += 1; - + if (status == currentDepth && nonPropItems.contains(Integer.valueOf(getName(token)))) { forwardCursor(status); return; } } - + printWriter.println(token); } - + private static void generateStringWzFile(String filePath, int depth) throws IOException { - fileReader = new InputStreamReader(new FileInputStream(wzPath + filePath), "UTF-8"); + fileReader = new InputStreamReader(new FileInputStream(WZFiles.DIRECTORY + filePath), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - printWriter = new PrintWriter(outputWzPath + filePath, "UTF-8"); + printWriter = new PrintWriter(OUTPUT_PATH + filePath, StandardCharsets.UTF_8); currentDepth = 2 + depth; - + //System.out.println(filePath + " depth " + depth); generateStringWzEntry(); - + printWriter.close(); bufferedReader.close(); fileReader.close(); } - + private static void generateStringWz() throws IOException { System.out.println("Generating clean String.wz ..."); - String stringWzFiles[][] = {{"Cash", "Consume", "Ins", "Pet"}, {"Etc"}, {"Eqp"}}; + String[][] stringWzFiles = {{"Cash", "Consume", "Ins", "Pet"}, {"Etc"}, {"Eqp"}}; String stringWzPath = "/String.wz/"; - - File folder = new File(outputWzPath + "/String.wz/"); + + File folder = new File(OUTPUT_PATH + "/String.wz/"); if (!folder.exists()) { folder.mkdirs(); } - + for (int i = 0; i < stringWzFiles.length; i++) { for (String dirFile : stringWzFiles[i]) { generateStringWzFile(stringWzPath + dirFile + ".img.xml", i); } } } - + public static void main(String[] args) { try { runEmptyItemWzChecker(); generateStringWz(); - + System.out.println("Done!"); } catch (IOException ioe) { ioe.printStackTrace(); } } - + } diff --git a/src/main/java/tools/mapletools/ToolConstants.java b/src/main/java/tools/mapletools/ToolConstants.java index 0b9015e28f..33cc681300 100644 --- a/src/main/java/tools/mapletools/ToolConstants.java +++ b/src/main/java/tools/mapletools/ToolConstants.java @@ -6,6 +6,7 @@ public class ToolConstants { public static final File INPUT_DIRECTORY = new File("tools/input"); public static final File OUTPUT_DIRECTORY = new File("tools/output"); public static final String SCRIPTS_PATH = "scripts"; + public static final String HANDBOOK_PATH = "handbook"; public static File getInputFile(String fileName) { return new File(INPUT_DIRECTORY, fileName); diff --git a/tools/MapleEmptyItemWzChecker/lib/Report.txt b/tools/MapleEmptyItemWzChecker/lib/Report.txt deleted file mode 100644 index 2d4b275314..0000000000 --- a/tools/MapleEmptyItemWzChecker/lib/Report.txt +++ /dev/null @@ -1,149 +0,0 @@ - # Report File autogenerated from the MapleEmptyItemWzChecker feature by Ronan Lana. - # Generated data takes into account several data info from the server-side WZ.xmls. - -String.wz NAMES with no Item.wz node, 130 entries: - 20816 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Face\ - 20817 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Face\ - 21817 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Face\ - 21820 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Face\ - 1002655 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1002657 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1002658 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1003028 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1003029 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1003030 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1003043 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1022096 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Accessory\ - 1042180 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Coat\ - 1052226 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Longcoat\ - 1060115 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1060138 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1061125 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1061160 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1062036 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1062037 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1072248 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Shoes\ - 1072249 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Shoes\ - 1072418 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Shoes\ - 1072425 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Shoes\ - 1080002 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Glove\ - 1082217 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Glove\ - 1082221 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Glove\ - 1082261 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Glove\ - 1142152 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Accessory\ - 1142155 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Accessory\ - 1302032 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1302069 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1322030 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1322034 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1332058 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1382013 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1452047 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1462020 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1462042 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1472057 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1702113 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 2002012 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2002013 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2002014 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2012004 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2022034 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2022036 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2022046 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2022114 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2070014 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2083000 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2084000 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101016 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101017 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101018 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101019 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101022 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101058 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2210023 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2210024 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240004 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240005 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240006 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240007 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240008 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240009 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240010 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240011 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240012 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240013 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240014 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240015 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2290109 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2390000 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 3010044 ../../wz/String.wz/Ins.img.xml -> Ins.img\ - 3994016 ../../wz/String.wz/Ins.img.xml -> Ins.img\ - 4000275 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4001150 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031294 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031627 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031628 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031629 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031630 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031631 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031632 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031633 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031634 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031635 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031636 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031637 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031638 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031639 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031640 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031641 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031642 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031643 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031644 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031645 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031646 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031647 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031648 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031795 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031867 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4032526 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 5000040 ../../wz/String.wz/Pet.img.xml -> Pet.img\ - 5000043 ../../wz/String.wz/Pet.img.xml -> Pet.img\ - 5000046 ../../wz/String.wz/Pet.img.xml -> Pet.img\ - 5201000 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5201001 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210000 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210001 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210002 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210003 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210004 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210005 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5211001 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5211002 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5211003 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5211047 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5240016 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5240019 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5251004 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5251005 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5251006 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360009 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360010 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360011 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360012 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360013 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360014 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - -Item.wz ITEMS with no String.wz node, 12 entries: - 1942000 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01942000.img.xml -> NOT FOUND - 1942001 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01942001.img.xml -> NOT FOUND - 1942002 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01942002.img.xml -> NOT FOUND - 1952000 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01952000.img.xml -> NOT FOUND - 1952001 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01952001.img.xml -> NOT FOUND - 1952002 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01952002.img.xml -> NOT FOUND - 1962000 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01962000.img.xml -> NOT FOUND - 1962001 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01962001.img.xml -> NOT FOUND - 1962002 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01962002.img.xml -> NOT FOUND - 1972000 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01972000.img.xml -> NOT FOUND - 1972001 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01972001.img.xml -> NOT FOUND - 1972002 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01972002.img.xml -> NOT FOUND - From 7af3d6924e2fc824d3c3a62cfeb7ff7dc07aee15 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 22:43:05 +0200 Subject: [PATCH 12/36] Move MapleReactorDropFetcher to main module --- .../tools/mapletools/ReactorDropFetcher.java | 112 ++++++++++++ .../lib/ReactorDropReport.txt | 20 --- .../MapleReactorDropFetcher.java | 170 ------------------ 3 files changed, 112 insertions(+), 190 deletions(-) create mode 100644 src/main/java/tools/mapletools/ReactorDropFetcher.java delete mode 100644 tools/MapleReactorDropFetcher/lib/ReactorDropReport.txt delete mode 100644 tools/MapleReactorDropFetcher/src/maplereactordropfetcher/MapleReactorDropFetcher.java diff --git a/src/main/java/tools/mapletools/ReactorDropFetcher.java b/src/main/java/tools/mapletools/ReactorDropFetcher.java new file mode 100644 index 0000000000..c8c5497c5f --- /dev/null +++ b/src/main/java/tools/mapletools/ReactorDropFetcher.java @@ -0,0 +1,112 @@ +package tools.mapletools; + +import java.io.File; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; + +/** + * @author RonanLana + *

+ * This application reports in reactor ids that have drops on the SQL table but are + * not yet coded. + */ +public class ReactorDropFetcher { + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("reactor_drop_report.txt"); + private static final String REACTOR_SCRIPT_PATH = ToolConstants.SCRIPTS_PATH + "/reactor"; + private static final Connection con = SimpleDatabaseConnection.getConnection(); + + private static PrintWriter printWriter = null; + private static final Set reactors = new HashSet<>(); + + private static void printReportFileHeader() { + printWriter.println(" # Report File autogenerated from the MapleReactorDropFetcher feature by Ronan Lana."); + printWriter.println(" # Generated data takes into account several data info from the underlying DB and the server-side files."); + printWriter.println(); + } + + private static int getReactorIdFromFilename(String name) { + try { + return Integer.parseInt(name.substring(0, name.indexOf('.'))); + } catch (Exception e) { + return -1; + } + } + + private static void removeScriptedReactorids(String directoryName) { + File directory = new File(directoryName); + + // get all the files from a directory + File[] fList = directory.listFiles(); + for (File file : fList) { + if (file.isFile()) { + reactors.remove(getReactorIdFromFilename(file.getName())); + } + } + } + + private static void loadReactoridsOnDB() throws SQLException { + PreparedStatement ps = con.prepareStatement("SELECT DISTINCT reactorid FROM reactordrops;"); + ResultSet rs = ps.executeQuery(); + + while (rs.next()) { + reactors.add(rs.getInt("reactorid")); + } + + rs.close(); + ps.close(); + } + + private static List getSortedReactorids() { + List sortedReactors = new ArrayList<>(reactors); + Collections.sort(sortedReactors); + + return sortedReactors; + } + + private static void fetchMissingReactorDrops() throws SQLException { + loadReactoridsOnDB(); + removeScriptedReactorids(REACTOR_SCRIPT_PATH); + } + + private static void reportMissingReactorDrops() throws SQLException { + if (!reactors.isEmpty()) { + printWriter.println("MISSING REACTOR DROP SCRIPTS"); + for (Integer reactorid : getSortedReactorids()) { + printWriter.println(" " + reactorid); + } + printWriter.println("\n"); + } + } + + private static void reportMissingReactors() { + try { + System.out.println("Fetching reactors from DB..."); + fetchMissingReactorDrops(); + + con.close(); + printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); + + // report suspects of missing quest drop data, as well as those drop data that may have incorrect questids. + System.out.println("Reporting results..."); + printReportFileHeader(); + reportMissingReactorDrops(); + + printWriter.close(); + System.out.println("Done!"); + } catch (SQLException e) { + System.out.println("Warning: Could not establish connection to database to report quest data."); + System.out.println(e.getMessage()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + reportMissingReactors(); + } +} \ No newline at end of file diff --git a/tools/MapleReactorDropFetcher/lib/ReactorDropReport.txt b/tools/MapleReactorDropFetcher/lib/ReactorDropReport.txt deleted file mode 100644 index b011a3466e..0000000000 --- a/tools/MapleReactorDropFetcher/lib/ReactorDropReport.txt +++ /dev/null @@ -1,20 +0,0 @@ - # Report File autogenerated from the MapleReactorDropFetcher feature by Ronan Lana. - # Generated data takes into account several data info from the underlying DB and the server-side files. - -MISSING REACTOR DROP SCRIPTS - 200000 - 200001 - 200002 - 200003 - 200004 - 200005 - 200006 - 200007 - 200008 - 200009 - 1022001 - 1032000 - 2052001 - 2112015 - - diff --git a/tools/MapleReactorDropFetcher/src/maplereactordropfetcher/MapleReactorDropFetcher.java b/tools/MapleReactorDropFetcher/src/maplereactordropfetcher/MapleReactorDropFetcher.java deleted file mode 100644 index c0ab9703f4..0000000000 --- a/tools/MapleReactorDropFetcher/src/maplereactordropfetcher/MapleReactorDropFetcher.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package maplereactordropfetcher; - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.HashSet; -import java.util.Set; - -import java.io.File; - -/** - * - * @author RonanLana - - This application reports in reactor ids that have drops on the SQL table but are - not yet coded. - - */ -public class MapleReactorDropFetcher { - static String host = "jdbc:mysql://localhost:3306/cosmic"; - static String driver = "com.mysql.jdbc.Driver"; - static String username = "cosmic_server"; - static String password = "snailshell"; - - static String reactorScriptPath = "../../scripts/reactor"; - - static String directoryName = "../.."; - static String newFile = "lib/ReactorDropReport.txt"; - - static Connection con = null; - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static Set reactors = new HashSet<>(); - - private static void printReportFileHeader() { - printWriter.println(" # Report File autogenerated from the MapleReactorDropFetcher feature by Ronan Lana."); - printWriter.println(" # Generated data takes into account several data info from the underlying DB and the server-side files."); - printWriter.println(); - } - - private static int getReactorIdFromFilename(String name) { - try { - return Integer.valueOf(name.substring(0, name.indexOf('.'))); - } catch(Exception e) { - return -1; - } - } - - private static void removeScriptedReactorids(String directoryName) { - File directory = new File(directoryName); - - // get all the files from a directory - File[] fList = directory.listFiles(); - for (File file : fList) { - if (file.isFile()) { - reactors.remove(getReactorIdFromFilename(file.getName())); - } - } - } - - private static void loadReactoridsOnDB() throws SQLException { - PreparedStatement ps = con.prepareStatement("SELECT DISTINCT reactorid FROM reactordrops;"); - ResultSet rs = ps.executeQuery(); - - while(rs.next()) { - reactors.add(rs.getInt("reactorid")); - } - - rs.close(); - ps.close(); - } - - private static List getSortedReactorids() { - List sortedReactors = new ArrayList<>(reactors); - Collections.sort(sortedReactors); - - return sortedReactors; - } - - private static void fetchMissingReactorDrops() throws SQLException { - loadReactoridsOnDB(); - removeScriptedReactorids(reactorScriptPath); - } - - private static void reportMissingReactorDrops() throws SQLException { - if(!reactors.isEmpty()) { - printWriter.println("MISSING REACTOR DROP SCRIPTS"); - for(Integer reactorid : getSortedReactorids()) { - printWriter.println(" " + reactorid); - } - printWriter.println("\n"); - } - } - - private static void ReportMissingReactors() { - try { - Class.forName(driver).newInstance(); - - // filter reactorids on DB - con = DriverManager.getConnection(host, username, password); - - System.out.println("Fetching reactors from DB..."); - fetchMissingReactorDrops(); - - con.close(); - printWriter = new PrintWriter(newFile, "UTF-8"); - - // report suspects of missing quest drop data, as well as those drop data that may have incorrect questids. - System.out.println("Reporting results..."); - printReportFileHeader(); - reportMissingReactorDrops(); - - printWriter.close(); - System.out.println("Done!"); - } - - catch(SQLException e) { - System.out.println("Warning: Could not establish connection to database to report quest data."); - System.out.println(e.getMessage()); - } - - catch(ClassNotFoundException e) { - System.out.println("Error: could not find class"); - System.out.println(e.getMessage()); - } - - catch(InstantiationException e) { - System.out.println("Error: instantiation failure"); - System.out.println(e.getMessage()); - } - - catch(Exception e) { - e.printStackTrace(); - } - } - - public static void main(String[] args) { - ReportMissingReactors(); - } - -} From b5ff5f19fc3e2269b6f37071d7bd775dd0066560 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 22:51:57 +0200 Subject: [PATCH 13/36] Move MapleMesoFetcher to main module --- .../java/tools/mapletools/MesoFetcher.java | 180 +++---- tools/MapleMesoFetcher/lib/meso_drop_data.sql | 447 ------------------ tools/MapleMesoFetcher/src/life/Element.java | 46 -- .../src/life/ElementalEffectiveness.java | 41 -- .../src/life/MapleLifeFactory.java | 240 ---------- .../src/life/MapleMonsterStats.java | 330 ------------- .../src/provider/MapleCanvas.java | 30 -- .../src/provider/MapleData.java | 34 -- .../src/provider/MapleDataDirectoryEntry.java | 34 -- .../src/provider/MapleDataEntity.java | 31 -- .../src/provider/MapleDataEntry.java | 33 -- .../src/provider/MapleDataFileEntry.java | 30 -- .../src/provider/MapleDataProvider.java | 27 -- .../provider/MapleDataProviderFactory.java | 55 --- .../src/provider/MapleDataTool.java | 145 ------ .../provider/wz/FileStoredPngMapleCanvas.java | 70 --- .../src/provider/wz/ImgMapleSound.java | 39 -- .../src/provider/wz/ListWZFile.java | 86 ---- .../src/provider/wz/MapleDataType.java | 26 - .../src/provider/wz/PNGMapleCanvas.java | 151 ------ .../src/provider/wz/WZDirectoryEntry.java | 68 --- .../src/provider/wz/WZEntry.java | 61 --- .../src/provider/wz/WZFile.java | 154 ------ .../src/provider/wz/WZFileEntry.java | 42 -- .../src/provider/wz/WZIMGEntry.java | 118 ----- .../src/provider/wz/WZIMGFile.java | 227 --------- .../src/provider/wz/WZTool.java | 188 -------- .../src/provider/wz/XMLDomMapleData.java | 219 --------- .../src/provider/wz/XMLWZFile.java | 85 ---- .../src/tools/DatabaseConnection.java | 51 -- tools/MapleMesoFetcher/src/tools/HexTool.java | 79 ---- tools/MapleMesoFetcher/src/tools/Pair.java | 121 ----- .../tools/data/input/ByteArrayByteStream.java | 72 --- .../src/tools/data/input/ByteInputStream.java | 35 -- .../input/GenericLittleEndianAccessor.java | 239 ---------- .../GenericSeekableLittleEndianAccessor.java | 91 ---- .../data/input/InputStreamByteStream.java | 93 ---- .../data/input/LittleEndianAccessor.java | 45 -- .../data/input/RandomAccessByteStream.java | 84 ---- .../input/SeekableInputStreamBytestream.java | 51 -- .../input/SeekableLittleEndianAccessor.java | 27 -- .../data/output/BAOSByteOutputStream.java | 56 --- .../tools/data/output/ByteOutputStream.java | 38 -- .../output/GenericLittleEndianWriter.java | 183 ------- .../tools/data/output/LittleEndianWriter.java | 114 ----- .../output/MaplePacketLittleEndianWriter.java | 73 --- 46 files changed, 77 insertions(+), 4612 deletions(-) rename tools/MapleMesoFetcher/src/maplemesofetcher/MapleMesoFetcher.java => src/main/java/tools/mapletools/MesoFetcher.java (57%) delete mode 100644 tools/MapleMesoFetcher/lib/meso_drop_data.sql delete mode 100644 tools/MapleMesoFetcher/src/life/Element.java delete mode 100644 tools/MapleMesoFetcher/src/life/ElementalEffectiveness.java delete mode 100644 tools/MapleMesoFetcher/src/life/MapleLifeFactory.java delete mode 100644 tools/MapleMesoFetcher/src/life/MapleMonsterStats.java delete mode 100644 tools/MapleMesoFetcher/src/provider/MapleCanvas.java delete mode 100644 tools/MapleMesoFetcher/src/provider/MapleData.java delete mode 100644 tools/MapleMesoFetcher/src/provider/MapleDataDirectoryEntry.java delete mode 100644 tools/MapleMesoFetcher/src/provider/MapleDataEntity.java delete mode 100644 tools/MapleMesoFetcher/src/provider/MapleDataEntry.java delete mode 100644 tools/MapleMesoFetcher/src/provider/MapleDataFileEntry.java delete mode 100644 tools/MapleMesoFetcher/src/provider/MapleDataProvider.java delete mode 100644 tools/MapleMesoFetcher/src/provider/MapleDataProviderFactory.java delete mode 100644 tools/MapleMesoFetcher/src/provider/MapleDataTool.java delete mode 100644 tools/MapleMesoFetcher/src/provider/wz/FileStoredPngMapleCanvas.java delete mode 100644 tools/MapleMesoFetcher/src/provider/wz/ImgMapleSound.java delete mode 100644 tools/MapleMesoFetcher/src/provider/wz/ListWZFile.java delete mode 100644 tools/MapleMesoFetcher/src/provider/wz/MapleDataType.java delete mode 100644 tools/MapleMesoFetcher/src/provider/wz/PNGMapleCanvas.java delete mode 100644 tools/MapleMesoFetcher/src/provider/wz/WZDirectoryEntry.java delete mode 100644 tools/MapleMesoFetcher/src/provider/wz/WZEntry.java delete mode 100644 tools/MapleMesoFetcher/src/provider/wz/WZFile.java delete mode 100644 tools/MapleMesoFetcher/src/provider/wz/WZFileEntry.java delete mode 100644 tools/MapleMesoFetcher/src/provider/wz/WZIMGEntry.java delete mode 100644 tools/MapleMesoFetcher/src/provider/wz/WZIMGFile.java delete mode 100644 tools/MapleMesoFetcher/src/provider/wz/WZTool.java delete mode 100644 tools/MapleMesoFetcher/src/provider/wz/XMLDomMapleData.java delete mode 100644 tools/MapleMesoFetcher/src/provider/wz/XMLWZFile.java delete mode 100644 tools/MapleMesoFetcher/src/tools/DatabaseConnection.java delete mode 100644 tools/MapleMesoFetcher/src/tools/HexTool.java delete mode 100644 tools/MapleMesoFetcher/src/tools/Pair.java delete mode 100644 tools/MapleMesoFetcher/src/tools/data/input/ByteArrayByteStream.java delete mode 100644 tools/MapleMesoFetcher/src/tools/data/input/ByteInputStream.java delete mode 100644 tools/MapleMesoFetcher/src/tools/data/input/GenericLittleEndianAccessor.java delete mode 100644 tools/MapleMesoFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java delete mode 100644 tools/MapleMesoFetcher/src/tools/data/input/InputStreamByteStream.java delete mode 100644 tools/MapleMesoFetcher/src/tools/data/input/LittleEndianAccessor.java delete mode 100644 tools/MapleMesoFetcher/src/tools/data/input/RandomAccessByteStream.java delete mode 100644 tools/MapleMesoFetcher/src/tools/data/input/SeekableInputStreamBytestream.java delete mode 100644 tools/MapleMesoFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java delete mode 100644 tools/MapleMesoFetcher/src/tools/data/output/BAOSByteOutputStream.java delete mode 100644 tools/MapleMesoFetcher/src/tools/data/output/ByteOutputStream.java delete mode 100644 tools/MapleMesoFetcher/src/tools/data/output/GenericLittleEndianWriter.java delete mode 100644 tools/MapleMesoFetcher/src/tools/data/output/LittleEndianWriter.java delete mode 100644 tools/MapleMesoFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java diff --git a/tools/MapleMesoFetcher/src/maplemesofetcher/MapleMesoFetcher.java b/src/main/java/tools/mapletools/MesoFetcher.java similarity index 57% rename from tools/MapleMesoFetcher/src/maplemesofetcher/MapleMesoFetcher.java rename to src/main/java/tools/mapletools/MesoFetcher.java index 38fd2210d7..e6a98dba38 100644 --- a/tools/MapleMesoFetcher/src/maplemesofetcher/MapleMesoFetcher.java +++ b/src/main/java/tools/mapletools/MesoFetcher.java @@ -1,210 +1,184 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package maplemesofetcher; - -import life.MapleLifeFactory; -import life.MapleMonsterStats; +import server.life.MapleMonsterStats; +import tools.Pair; +import java.io.File; +import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; - -import java.io.*; - import java.util.ArrayList; -import java.util.List; import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.Map.Entry; -import tools.DatabaseConnection; -import tools.Pair; /** - * * @author RonanLana - * + *

* This application traces missing meso drop data on the underlying DB (that must be * defined on the DatabaseConnection file of this project) and generates a * SQL file that proposes missing drop entries for the drop_data table. - * + *

* The meso range is calculated accordingly with the target mob stats, such as level * and if it's a boss or not, similarly as how it has been done for the actual meso * drops. - * */ -public class MapleMesoFetcher { +public class MesoFetcher { + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("meso_drop_data.sql"); + private static final boolean PERMIT_MESOS_ON_DOJO_BOSSES = false; + private static final int MESO_ID = 0; + private static final int MIN_ITEMS = 4; + private static final int CHANCE = 400000; + private static final Map> mobRange = new HashMap<>(); private static PrintWriter printWriter; - private static String newFile = "lib/meso_drop_data.sql"; - - private static boolean permitMesosOnDojoBosses = false; - - private static int minItems = 4; - - private static int mesoid = 0; - private static int chance = 400000; - private static Map mobStats; - private static Map> mobRange = new HashMap<>(); - + private static Pair calcMesoRange90(int level, boolean boss) { int minRange, maxRange; - + // MIN range - minRange = (int)(72.70814714 * Math.exp(0.02284640619 * level)); - + minRange = (int) (72.70814714 * Math.exp(0.02284640619 * level)); + // MAX range - maxRange = (int)(133.8194881 * Math.exp(0.02059225059 * level)); - + maxRange = (int) (133.8194881 * Math.exp(0.02059225059 * level)); + // boss perks - if(boss) { + if (boss) { minRange *= 3; maxRange *= 10; } - + return new Pair<>(minRange, maxRange); } - + private static Pair calcMesoRange(int level, boolean boss) { int minRange, maxRange; - + // MIN range - minRange = (int)(30.32032228 * Math.exp(0.03281144930 * level)); - + minRange = (int) (30.32032228 * Math.exp(0.03281144930 * level)); + // MAX range - maxRange = (int)(44.45878459 * Math.exp(0.03289611686 * level)); - + maxRange = (int) (44.45878459 * Math.exp(0.03289611686 * level)); + // boss perks - if(boss) { + if (boss) { minRange *= 3; maxRange *= 10; } - + return new Pair<>(minRange, maxRange); } - + private static void calcAllMobsMesoRange() { System.out.print("Calculating range... "); - - for(Entry mobStat : mobStats.entrySet()) { + + for (Map.Entry mobStat : mobStats.entrySet()) { MapleMonsterStats mms = mobStat.getValue(); Pair mesoRange; - - if(mms.getLevel() < 90) { + + if (mms.getLevel() < 90) { mesoRange = calcMesoRange(mms.getLevel(), mms.isBoss()); } else { mesoRange = calcMesoRange90(mms.getLevel(), mms.isBoss()); } - + mobRange.put(mobStat.getKey(), mesoRange); } - + System.out.println("done!"); } - + private static void printSqlHeader() { printWriter.println(" # SQL File autogenerated from the MapleMesoFetcher feature by Ronan Lana."); printWriter.println(" # Generated data takes into account mob stats such as level and boss for the meso ranges."); - printWriter.println(" # Only mobs with " + minItems + " or more items with no meso entry on the DB it was compiled are presented here."); + printWriter.println(" # Only mobs with " + MIN_ITEMS + " or more items with no meso entry on the DB it was compiled are presented here."); printWriter.println(); - + printWriter.println(" INSERT IGNORE INTO drop_data (`dropperid`, `itemid`, `minimum_quantity`, `maximum_quantity`, `questid`, `chance`) VALUES"); } - + private static void printSqlExceptions() { - if(!permitMesosOnDojoBosses) { - printWriter.println("\r\n DELETE FROM drop_data WHERE dropperid >= 9300184 AND dropperid <= 9300215 AND itemid = " + mesoid + ";"); + if (!PERMIT_MESOS_ON_DOJO_BOSSES) { + printWriter.println("\r\n DELETE FROM drop_data WHERE dropperid >= 9300184 AND dropperid <= 9300215 AND itemid = " + MESO_ID + ";"); } } - + private static void printSqlMobMesoRange(int mobid) { Pair mobmeso = mobRange.get(mobid); - printWriter.println("(" + mobid + ", " + mesoid + ", " + mobmeso.left + ", " + mobmeso.right + ", 0, " + chance + "),"); + printWriter.println("(" + mobid + ", " + MESO_ID + ", " + mobmeso.left + ", " + mobmeso.right + ", 0, " + CHANCE + "),"); } - + private static void printSqlMobMesoRangeFinal(int mobid) { Pair mobmeso = mobRange.get(mobid); - printWriter.println("(" + mobid + ", " + mesoid + ", " + mobmeso.left + ", " + mobmeso.right + ", 0, " + chance + ");"); + printWriter.println("(" + mobid + ", " + MESO_ID + ", " + mobmeso.left + ", " + mobmeso.right + ", 0, " + CHANCE + ");"); } - + private static void generateMissingMobsMesoRange() { System.out.print("Generating missing ranges... "); - Connection con = DatabaseConnection.getConnection(); + Connection con = SimpleDatabaseConnection.getConnection(); List existingMobs = new ArrayList<>(200); - + try { // select all mobs which doesn't drop mesos and have a fair amount of items dropping (meaning they are not an event mob) - PreparedStatement ps = con.prepareStatement("SELECT dropperid FROM drop_data WHERE dropperid NOT IN (SELECT DISTINCT dropperid FROM drop_data WHERE itemid = 0) GROUP BY dropperid HAVING count(*) >= " + minItems + ";"); + PreparedStatement ps = con.prepareStatement("SELECT dropperid FROM drop_data WHERE dropperid NOT IN (SELECT DISTINCT dropperid FROM drop_data WHERE itemid = 0) GROUP BY dropperid HAVING count(*) >= " + MIN_ITEMS + ";"); ResultSet rs = ps.executeQuery(); - + if (rs.isBeforeFirst()) { - while(rs.next()) { + while (rs.next()) { int mobid = rs.getInt(1); - - if(mobRange.containsKey(mobid)) { + + if (mobRange.containsKey(mobid)) { existingMobs.add(mobid); } } - - if(!existingMobs.isEmpty()) { - printWriter = new PrintWriter(newFile, "UTF-8"); + + if (!existingMobs.isEmpty()) { + printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); printSqlHeader(); - - for(int i = 0; i < existingMobs.size() - 1; i++) + + for (int i = 0; i < existingMobs.size() - 1; i++) { printSqlMobMesoRange(existingMobs.get(i)); - + } + printSqlMobMesoRangeFinal(existingMobs.get(existingMobs.size() - 1)); - + printSqlExceptions(); - + printWriter.close(); } else { throw new Exception("ALREADY UPDATED"); } - + } else { throw new Exception("ALREADY UPDATED"); } - + rs.close(); ps.close(); con.close(); - + System.out.println("done!"); - - } catch(Exception e) { - if(e.getMessage() != null && e.getMessage().equals("ALREADY UPDATED")) { + + } catch (Exception e) { + if (e.getMessage() != null && e.getMessage().equals("ALREADY UPDATED")) { System.out.println("done! The DB is already up-to-date, no file generated."); } else { e.printStackTrace(); } } } - + public static void main(String[] args) { // load mob stats from WZ - mobStats = MapleLifeFactory.getAllMonsterStats(); - + mobStats = MonsterStatFetcher.getAllMonsterStats(); + calcAllMobsMesoRange(); generateMissingMobsMesoRange(); } - + } + diff --git a/tools/MapleMesoFetcher/lib/meso_drop_data.sql b/tools/MapleMesoFetcher/lib/meso_drop_data.sql deleted file mode 100644 index 41b45f9522..0000000000 --- a/tools/MapleMesoFetcher/lib/meso_drop_data.sql +++ /dev/null @@ -1,447 +0,0 @@ - # SQL File autogenerated from the MapleMesoFetcher feature by Ronan Lana. - # Generated data takes into account mob stats such as level and boss for the meso ranges. - # Only mobs with 4 or more items with no meso entry on the DB it was compiled are presented here. - - INSERT IGNORE INTO drop_data (`dropperid`, `itemid`, `minimum_quantity`, `maximum_quantity`, `questid`, `chance`) VALUES -(100122, 0, 35, 52, 0, 400000), -(100123, 0, 38, 55, 0, 400000), -(100124, 0, 40, 59, 0, 400000), -(100130, 0, 31, 45, 0, 400000), -(100131, 0, 33, 49, 0, 400000), -(100132, 0, 35, 52, 0, 400000), -(100133, 0, 38, 55, 0, 400000), -(100134, 0, 40, 59, 0, 400000), -(1110130, 0, 49, 72, 0, 400000), -(1140130, 0, 56, 83, 0, 400000), -(2100100, 0, 58, 85, 0, 400000), -(2100101, 0, 60, 88, 0, 400000), -(2100106, 0, 66, 97, 0, 400000), -(2100107, 0, 73, 108, 0, 400000), -(2100108, 0, 78, 115, 0, 400000), -(2110300, 0, 66, 97, 0, 400000), -(2110301, 0, 78, 115, 0, 400000), -(2230105, 0, 64, 94, 0, 400000), -(2230107, 0, 66, 97, 0, 400000), -(2230110, 0, 64, 94, 0, 400000), -(2230111, 0, 66, 97, 0, 400000), -(2230131, 0, 66, 97, 0, 400000), -(3000005, 0, 81, 119, 0, 400000), -(3100101, 0, 86, 127, 0, 400000), -(3100102, 0, 81, 119, 0, 400000), -(3110301, 0, 86, 127, 0, 400000), -(3110302, 0, 95, 140, 0, 400000), -(3110303, 0, 105, 155, 0, 400000), -(3220000, 0, 285, 1400, 0, 400000), -(3220001, 0, 315, 1550, 0, 400000), -(3300000, 0, 81, 119, 0, 400000), -(3300001, 0, 81, 119, 0, 400000), -(3300002, 0, 83, 123, 0, 400000), -(3300003, 0, 86, 127, 0, 400000), -(3300004, 0, 89, 131, 0, 400000), -(3300005, 0, 95, 140, 0, 400000), -(3300006, 0, 95, 140, 0, 400000), -(3300007, 0, 95, 140, 0, 400000), -(3300008, 0, 315, 1550, 0, 400000), -(4110300, 0, 120, 177, 0, 400000), -(4110301, 0, 132, 195, 0, 400000), -(4130103, 0, 423, 2080, 0, 400000), -(4220000, 0, 396, 1950, 0, 400000), -(4230122, 0, 120, 177, 0, 400000), -(4230125, 0, 128, 189, 0, 400000), -(4230400, 0, 132, 195, 0, 400000), -(4230502, 0, 124, 182, 0, 400000), -(4230503, 0, 132, 195, 0, 400000), -(4230504, 0, 132, 195, 0, 400000), -(4230600, 0, 112, 165, 0, 400000), -(4240000, 0, 151, 222, 0, 400000), -(4250000, 0, 120, 177, 0, 400000), -(4250001, 0, 137, 201, 0, 400000), -(5110300, 0, 156, 230, 0, 400000), -(5120500, 0, 190, 280, 0, 400000), -(5120501, 0, 172, 254, 0, 400000), -(5120502, 0, 178, 262, 0, 400000), -(5120505, 0, 203, 299, 0, 400000), -(5120506, 0, 184, 271, 0, 400000), -(5130105, 0, 190, 280, 0, 400000), -(5130108, 0, 196, 289, 0, 400000), -(5220000, 0, 552, 2710, 0, 400000), -(5220002, 0, 468, 2300, 0, 400000), -(5220003, 0, 630, 3090, 0, 400000), -(5220004, 0, 468, 2300, 0, 400000), -(5250000, 0, 184, 271, 0, 400000), -(5250001, 0, 161, 237, 0, 400000), -(5250002, 0, 196, 289, 0, 400000), -(6110300, 0, 255, 377, 0, 400000), -(6130102, 0, 217, 320, 0, 400000), -(6130103, 0, 217, 320, 0, 400000), -(6130203, 0, 217, 320, 0, 400000), -(6130207, 0, 231, 341, 0, 400000), -(6130209, 0, 264, 389, 0, 400000), -(6220000, 0, 765, 3770, 0, 400000), -(6220001, 0, 765, 3770, 0, 400000), -(6230100, 0, 231, 341, 0, 400000), -(6230401, 0, 239, 353, 0, 400000), -(6300005, 0, 765, 3770, 0, 400000), -(6400006, 0, 384, 1890, 0, 400000), -(6400008, 0, 552, 2710, 0, 400000), -(6400009, 0, 552, 2710, 0, 400000), -(7110300, 0, 355, 524, 0, 400000), -(7110301, 0, 332, 490, 0, 400000), -(7120103, 0, 301, 444, 0, 400000), -(7120104, 0, 311, 459, 0, 400000), -(7120106, 0, 355, 524, 0, 400000), -(7120107, 0, 355, 524, 0, 400000), -(7120108, 0, 379, 559, 0, 400000), -(7120109, 0, 405, 597, 0, 400000), -(7130000, 0, 332, 490, 0, 400000), -(7130002, 0, 321, 474, 0, 400000), -(7130003, 0, 367, 541, 0, 400000), -(7130004, 0, 391, 578, 0, 400000), -(7130102, 0, 391, 578, 0, 400000), -(7130103, 0, 332, 490, 0, 400000), -(7130400, 0, 903, 4440, 0, 400000), -(7130401, 0, 903, 4440, 0, 400000), -(7130402, 0, 903, 4440, 0, 400000), -(7130601, 0, 367, 541, 0, 400000), -(7220000, 0, 933, 4590, 0, 400000), -(7220001, 0, 903, 4440, 0, 400000), -(7220002, 0, 1137, 5590, 0, 400000), -(8110300, 0, 418, 617, 0, 400000), -(8120102, 0, 446, 659, 0, 400000), -(8120103, 0, 477, 704, 0, 400000), -(8120104, 0, 509, 752, 0, 400000), -(8120105, 0, 544, 803, 0, 400000), -(8120106, 0, 562, 830, 0, 400000), -(8120107, 0, 562, 830, 0, 400000), -(8140000, 0, 418, 617, 0, 400000), -(8140100, 0, 446, 659, 0, 400000), -(8140511, 0, 581, 871, 0, 400000), -(8140512, 0, 608, 908, 0, 400000), -(8140600, 0, 594, 889, 0, 400000), -(8140702, 0, 637, 946, 0, 400000), -(8140703, 0, 666, 986, 0, 400000), -(8141300, 0, 622, 927, 0, 400000), -(8150000, 0, 2142, 10490, 0, 400000), -(8150100, 0, 714, 1049, 0, 400000), -(8150101, 0, 747, 1093, 0, 400000), -(8150200, 0, 714, 1049, 0, 400000), -(8150201, 0, 800, 1162, 0, 400000), -(8150300, 0, 666, 986, 0, 400000), -(8150301, 0, 730, 1070, 0, 400000), -(8150302, 0, 764, 1115, 0, 400000), -(8190001, 0, 800, 1162, 0, 400000), -(8220003, 0, 3381, 15830, 0, 400000), -(8220005, 0, 4350, 19860, 0, 400000), -(8220006, 0, 5466, 24400, 0, 400000), -(8220007, 0, 1704, 8530, 0, 400000), -(8220009, 0, 1479, 7280, 0, 400000), -(8830000, 0, 2400, 11620, 0, 400000), -(9001009, 0, 1254, 6170, 0, 400000), -(9001011, 0, 95, 140, 0, 400000), -(9200016, 0, 81, 119, 0, 400000), -(9200019, 0, 203, 299, 0, 400000), -(9300011, 0, 109, 160, 0, 400000), -(9300058, 0, 38, 55, 0, 400000), -(9300059, 0, 42, 61, 0, 400000), -(9300060, 0, 120, 177, 0, 400000), -(9300078, 0, 800, 1162, 0, 400000), -(9300080, 0, 282, 416, 0, 400000), -(9300096, 0, 544, 803, 0, 400000), -(9300105, 0, 717, 3530, 0, 400000), -(9300106, 0, 846, 4160, 0, 400000), -(9300127, 0, 81, 119, 0, 400000), -(9300129, 0, 81, 119, 0, 400000), -(9300131, 0, 109, 160, 0, 400000), -(9300132, 0, 81, 119, 0, 400000), -(9300133, 0, 81, 119, 0, 400000), -(9300134, 0, 81, 119, 0, 400000), -(9300136, 0, 243, 1190, 0, 400000), -(9300139, 0, 1296, 6380, 0, 400000), -(9300155, 0, 38, 55, 0, 400000), -(9300160, 0, 396, 1950, 0, 400000), -(9300161, 0, 396, 1950, 0, 400000), -(9300163, 0, 1127, 1583, 0, 400000), -(9300164, 0, 1127, 1583, 0, 400000), -(9300165, 0, 1127, 1583, 0, 400000), -(9300182, 0, 1479, 7280, 0, 400000), -(9300184, 0, 174, 850, 0, 400000), -(9300185, 0, 285, 1400, 0, 400000), -(9300186, 0, 315, 1550, 0, 400000), -(9300187, 0, 336, 1650, 0, 400000), -(9300188, 0, 468, 2300, 0, 400000), -(9300189, 0, 468, 2300, 0, 400000), -(9300190, 0, 552, 2710, 0, 400000), -(9300191, 0, 651, 3200, 0, 400000), -(9300192, 0, 570, 2800, 0, 400000), -(9300193, 0, 630, 3090, 0, 400000), -(9300194, 0, 765, 3770, 0, 400000), -(9300195, 0, 765, 3770, 0, 400000), -(9300196, 0, 765, 3770, 0, 400000), -(9300197, 0, 765, 3770, 0, 400000), -(9300198, 0, 651, 3200, 0, 400000), -(9300199, 0, 903, 4440, 0, 400000), -(9300200, 0, 933, 4590, 0, 400000), -(9300201, 0, 1479, 7280, 0, 400000), -(9300202, 0, 1137, 5590, 0, 400000), -(9300203, 0, 1254, 6170, 0, 400000), -(9300204, 0, 1383, 6810, 0, 400000), -(9300205, 0, 1296, 6380, 0, 400000), -(9300206, 0, 1479, 7280, 0, 400000), -(9300207, 0, 1479, 7280, 0, 400000), -(9300208, 0, 1704, 8530, 0, 400000), -(9300209, 0, 1704, 8530, 0, 400000), -(9300210, 0, 2142, 10490, 0, 400000), -(9300211, 0, 2400, 11620, 0, 400000), -(9300212, 0, 2400, 11620, 0, 400000), -(9300213, 0, 3381, 15830, 0, 400000), -(9300214, 0, 3792, 17550, 0, 400000), -(9300215, 0, 6714, 29370, 0, 400000), -(9300217, 0, 32, 47, 0, 400000), -(9300218, 0, 34, 50, 0, 400000), -(9300219, 0, 34, 50, 0, 400000), -(9300220, 0, 52, 77, 0, 400000), -(9300221, 0, 68, 101, 0, 400000), -(9300222, 0, 75, 111, 0, 400000), -(9300223, 0, 36, 54, 0, 400000), -(9300224, 0, 102, 150, 0, 400000), -(9300225, 0, 102, 150, 0, 400000), -(9300226, 0, 112, 165, 0, 400000), -(9300227, 0, 102, 150, 0, 400000), -(9300228, 0, 146, 215, 0, 400000), -(9300229, 0, 39, 57, 0, 400000), -(9300230, 0, 116, 171, 0, 400000), -(9300231, 0, 137, 201, 0, 400000), -(9300232, 0, 92, 136, 0, 400000), -(9300233, 0, 112, 165, 0, 400000), -(9300234, 0, 86, 127, 0, 400000), -(9300235, 0, 167, 245, 0, 400000), -(9300236, 0, 190, 280, 0, 400000), -(9300237, 0, 210, 309, 0, 400000), -(9300238, 0, 66, 97, 0, 400000), -(9300239, 0, 120, 177, 0, 400000), -(9300240, 0, 132, 195, 0, 400000), -(9300241, 0, 282, 416, 0, 400000), -(9300242, 0, 301, 444, 0, 400000), -(9300243, 0, 190, 280, 0, 400000), -(9300244, 0, 190, 280, 0, 400000), -(9300245, 0, 217, 320, 0, 400000), -(9300246, 0, 231, 341, 0, 400000), -(9300247, 0, 255, 377, 0, 400000), -(9300248, 0, 264, 389, 0, 400000), -(9300249, 0, 301, 444, 0, 400000), -(9300250, 0, 355, 524, 0, 400000), -(9300251, 0, 332, 490, 0, 400000), -(9300252, 0, 132, 195, 0, 400000), -(9300253, 0, 156, 230, 0, 400000), -(9300254, 0, 332, 490, 0, 400000), -(9300255, 0, 141, 208, 0, 400000), -(9300256, 0, 217, 320, 0, 400000), -(9300257, 0, 217, 320, 0, 400000), -(9300258, 0, 255, 377, 0, 400000), -(9300259, 0, 58, 85, 0, 400000), -(9300260, 0, 418, 617, 0, 400000), -(9300261, 0, 544, 803, 0, 400000), -(9300262, 0, 544, 803, 0, 400000), -(9300263, 0, 544, 803, 0, 400000), -(9300264, 0, 764, 1115, 0, 400000), -(9300265, 0, 730, 1070, 0, 400000), -(9300266, 0, 933, 4590, 0, 400000), -(9300267, 0, 1254, 6170, 0, 400000), -(9300268, 0, 933, 4590, 0, 400000), -(9300269, 0, 174, 850, 0, 400000), -(9300270, 0, 418, 617, 0, 400000), -(9300274, 0, 39, 57, 0, 400000), -(9300289, 0, 1704, 8530, 0, 400000), -(9300294, 0, 2142, 10490, 0, 400000), -(9300315, 0, 483, 2370, 0, 400000), -(9300316, 0, 516, 2540, 0, 400000), -(9300317, 0, 552, 2710, 0, 400000), -(9300318, 0, 588, 2890, 0, 400000), -(9300319, 0, 630, 3090, 0, 400000), -(9300320, 0, 672, 3300, 0, 400000), -(9300321, 0, 717, 3530, 0, 400000), -(9300322, 0, 765, 3770, 0, 400000), -(9300332, 0, 112, 165, 0, 400000), -(9300334, 0, 151, 222, 0, 400000), -(9300335, 0, 116, 171, 0, 400000), -(9300336, 0, 137, 201, 0, 400000), -(9300337, 0, 137, 201, 0, 400000), -(9300367, 0, 126, 610, 0, 400000), -(9300368, 0, 174, 850, 0, 400000), -(9300369, 0, 243, 1190, 0, 400000), -(9300370, 0, 336, 1650, 0, 400000), -(9300371, 0, 468, 2300, 0, 400000), -(9300372, 0, 651, 3200, 0, 400000), -(9300373, 0, 903, 4440, 0, 400000), -(9300374, 0, 1254, 6170, 0, 400000), -(9300375, 0, 1704, 8530, 0, 400000), -(9300376, 0, 1704, 8530, 0, 400000), -(9300377, 0, 2691, 12890, 0, 400000), -(9303000, 0, 42, 61, 0, 400000), -(9303001, 0, 42, 61, 0, 400000), -(9303003, 0, 42, 61, 0, 400000), -(9303004, 0, 42, 61, 0, 400000), -(9303005, 0, 71, 104, 0, 400000), -(9303006, 0, 71, 104, 0, 400000), -(9303007, 0, 71, 104, 0, 400000), -(9303008, 0, 71, 104, 0, 400000), -(9303009, 0, 161, 237, 0, 400000), -(9303010, 0, 161, 237, 0, 400000), -(9303011, 0, 161, 237, 0, 400000), -(9303013, 0, 432, 638, 0, 400000), -(9303014, 0, 432, 638, 0, 400000), -(9303016, 0, 432, 638, 0, 400000), -(9400009, 0, 7014, 8225, 0, 400000), -(9400012, 0, 217, 320, 0, 400000), -(9400120, 0, 1911, 9460, 0, 400000), -(9400122, 0, 1911, 9460, 0, 400000), -(9400200, 0, 184, 271, 0, 400000), -(9400203, 0, 112, 165, 0, 400000), -(9400205, 0, 1704, 8530, 0, 400000), -(9400238, 0, 81, 119, 0, 400000), -(9400239, 0, 66, 97, 0, 400000), -(9400241, 0, 38, 55, 0, 400000), -(9400242, 0, 42, 61, 0, 400000), -(9400243, 0, 184, 271, 0, 400000), -(9400244, 0, 210, 309, 0, 400000), -(9400245, 0, 66, 97, 0, 400000), -(9400246, 0, 62, 91, 0, 400000), -(9400247, 0, 81, 119, 0, 400000), -(9400248, 0, 66, 97, 0, 400000), -(9400500, 0, 93, 450, 0, 400000), -(9400501, 0, 35, 52, 0, 400000), -(9400502, 0, 105, 520, 0, 400000), -(9400503, 0, 105, 520, 0, 400000), -(9400504, 0, 31, 45, 0, 400000), -(9400538, 0, 56, 83, 0, 400000), -(9400539, 0, 60, 88, 0, 400000), -(9400540, 0, 68, 101, 0, 400000), -(9400541, 0, 68, 101, 0, 400000), -(9400542, 0, 98, 145, 0, 400000), -(9400543, 0, 116, 171, 0, 400000), -(9400544, 0, 156, 230, 0, 400000), -(9400546, 0, 128, 189, 0, 400000), -(9400547, 0, 73, 108, 0, 400000), -(9400548, 0, 81, 119, 0, 400000), -(9400550, 0, 73, 108, 0, 400000), -(9400556, 0, 60, 88, 0, 400000), -(9400558, 0, 81, 119, 0, 400000), -(9400560, 0, 156, 230, 0, 400000), -(9400561, 0, 217, 320, 0, 400000), -(9400562, 0, 217, 320, 0, 400000), -(9400563, 0, 112, 165, 0, 400000), -(9400565, 0, 60, 88, 0, 400000), -(9400570, 0, 49, 72, 0, 400000), -(9400571, 0, 468, 2300, 0, 400000), -(9400573, 0, 112, 165, 0, 400000), -(9400574, 0, 714, 1049, 0, 400000), -(9400576, 0, 301, 444, 0, 400000), -(9400578, 0, 568, 853, 0, 400000), -(9400579, 0, 714, 1049, 0, 400000), -(9400580, 0, 637, 946, 0, 400000), -(9400581, 0, 418, 617, 0, 400000), -(9400582, 0, 1127, 1583, 0, 400000), -(9400609, 0, 204, 1010, 0, 400000), -(9400612, 0, 204, 1010, 0, 400000), -(9400633, 0, 258, 1270, 0, 400000), -(9400644, 0, 42, 61, 0, 400000), -(9410014, 0, 493, 728, 0, 400000), -(9410015, 0, 1479, 7280, 0, 400000), -(9420507, 0, 146, 215, 0, 400000), -(9420527, 0, 132, 195, 0, 400000), -(9420528, 0, 141, 208, 0, 400000), -(9420529, 0, 167, 245, 0, 400000), -(9420530, 0, 190, 280, 0, 400000), -(9420531, 0, 210, 309, 0, 400000), -(9420532, 0, 210, 309, 0, 400000), -(9420533, 0, 224, 330, 0, 400000), -(9420534, 0, 255, 377, 0, 400000), -(9420535, 0, 282, 416, 0, 400000), -(9420536, 0, 321, 474, 0, 400000), -(9420537, 0, 355, 524, 0, 400000), -(9420538, 0, 446, 659, 0, 400000), -(9420539, 0, 526, 777, 0, 400000), -(9420545, 0, 210, 309, 0, 400000), -(9420550, 0, 210, 309, 0, 400000), -(9500101, 0, 38, 55, 0, 400000), -(9500102, 0, 39, 57, 0, 400000), -(9500103, 0, 49, 72, 0, 400000), -(9500104, 0, 44, 65, 0, 400000), -(9500105, 0, 49, 72, 0, 400000), -(9500106, 0, 62, 91, 0, 400000), -(9500107, 0, 81, 119, 0, 400000), -(9500108, 0, 86, 127, 0, 400000), -(9500109, 0, 86, 127, 0, 400000), -(9500110, 0, 95, 140, 0, 400000), -(9500111, 0, 95, 140, 0, 400000), -(9500112, 0, 95, 140, 0, 400000), -(9500113, 0, 98, 145, 0, 400000), -(9500115, 0, 102, 150, 0, 400000), -(9500116, 0, 112, 165, 0, 400000), -(9500117, 0, 98, 145, 0, 400000), -(9500118, 0, 109, 160, 0, 400000), -(9500119, 0, 109, 160, 0, 400000), -(9500120, 0, 132, 195, 0, 400000), -(9500121, 0, 146, 215, 0, 400000), -(9500122, 0, 151, 222, 0, 400000), -(9500123, 0, 210, 309, 0, 400000), -(9500124, 0, 651, 3200, 0, 400000), -(9500125, 0, 217, 320, 0, 400000), -(9500126, 0, 247, 365, 0, 400000), -(9500127, 0, 273, 402, 0, 400000), -(9500128, 0, 282, 416, 0, 400000), -(9500129, 0, 301, 444, 0, 400000), -(9500130, 0, 903, 4440, 0, 400000), -(9500131, 0, 332, 490, 0, 400000), -(9500132, 0, 355, 524, 0, 400000), -(9500134, 0, 418, 617, 0, 400000), -(9500135, 0, 493, 728, 0, 400000), -(9500136, 0, 682, 1006, 0, 400000), -(9500137, 0, 637, 946, 0, 400000), -(9500138, 0, 568, 853, 0, 400000), -(9500139, 0, 1254, 6170, 0, 400000), -(9500140, 0, 2142, 10490, 0, 400000), -(9500156, 0, 146, 215, 0, 400000), -(9500157, 0, 95, 140, 0, 400000), -(9500158, 0, 903, 4440, 0, 400000), -(9500159, 0, 903, 4440, 0, 400000), -(9500160, 0, 903, 4440, 0, 400000), -(9500161, 0, 418, 617, 0, 400000), -(9500162, 0, 418, 617, 0, 400000), -(9500163, 0, 461, 681, 0, 400000), -(9500164, 0, 544, 803, 0, 400000), -(9500165, 0, 544, 803, 0, 400000), -(9500166, 0, 544, 803, 0, 400000), -(9500178, 0, 112, 165, 0, 400000), -(9500180, 0, 1704, 8530, 0, 400000), -(9500181, 0, 1704, 8530, 0, 400000), -(9500306, 0, 174, 850, 0, 400000), -(9500307, 0, 285, 1400, 0, 400000), -(9500308, 0, 468, 2300, 0, 400000), -(9500309, 0, 552, 2710, 0, 400000), -(9500310, 0, 630, 3090, 0, 400000), -(9500311, 0, 765, 3770, 0, 400000), -(9500312, 0, 903, 4440, 0, 400000), -(9500313, 0, 933, 4590, 0, 400000), -(9500314, 0, 1137, 5590, 0, 400000), -(9500317, 0, 126, 610, 0, 400000), -(9500318, 0, 336, 1650, 0, 400000), -(9500319, 0, 903, 4440, 0, 400000), -(9500321, 0, 42, 61, 0, 400000), -(9500326, 0, 396, 1950, 0, 400000), -(9500327, 0, 243, 1190, 0, 400000), -(9500328, 0, 285, 1400, 0, 400000), -(9500331, 0, 552, 2710, 0, 400000), -(9500332, 0, 396, 1950, 0, 400000), -(9500333, 0, 468, 2300, 0, 400000), -(9500334, 0, 552, 2710, 0, 400000), -(9500335, 0, 468, 2300, 0, 400000), -(9500366, 0, 49, 72, 0, 400000), -(9500367, 0, 49, 72, 0, 400000), -(9500368, 0, 49, 72, 0, 400000), -(9500369, 0, 49, 72, 0, 400000), -(9500370, 0, 49, 72, 0, 400000), -(9500371, 0, 49, 72, 0, 400000), -(9500372, 0, 49, 72, 0, 400000); - - DELETE FROM drop_data WHERE dropperid >= 9300184 AND dropperid <= 9300215 AND itemid = 0; diff --git a/tools/MapleMesoFetcher/src/life/Element.java b/tools/MapleMesoFetcher/src/life/Element.java deleted file mode 100644 index 5520ba3501..0000000000 --- a/tools/MapleMesoFetcher/src/life/Element.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package life; - -public enum Element { - NEUTRAL, FIRE, ICE, LIGHTING, POISON, HOLY, DARK; - - public static Element getFromChar(char c) { - switch (Character.toUpperCase(c)) { - case 'F': - return FIRE; - case 'I': - return ICE; - case 'L': - return LIGHTING; - case 'S': - return POISON; - case 'H': - return HOLY; - case 'D': - return DARK; - case 'P': - return NEUTRAL; - } - throw new IllegalArgumentException("unknown elemnt char " + c); - } -} diff --git a/tools/MapleMesoFetcher/src/life/ElementalEffectiveness.java b/tools/MapleMesoFetcher/src/life/ElementalEffectiveness.java deleted file mode 100644 index f8d23ef5c7..0000000000 --- a/tools/MapleMesoFetcher/src/life/ElementalEffectiveness.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package life; - -public enum ElementalEffectiveness { - NORMAL, IMMUNE, STRONG, WEAK, NEUTRAL; - - public static ElementalEffectiveness getByNumber(int num) { - switch (num) { - case 1: - return IMMUNE; - case 2: - return STRONG; - case 3: - return WEAK; - case 4: - return NEUTRAL; - default: - throw new IllegalArgumentException("Unkown effectiveness: " + num); - } - } -} diff --git a/tools/MapleMesoFetcher/src/life/MapleLifeFactory.java b/tools/MapleMesoFetcher/src/life/MapleLifeFactory.java deleted file mode 100644 index 23ccd67e43..0000000000 --- a/tools/MapleMesoFetcher/src/life/MapleLifeFactory.java +++ /dev/null @@ -1,240 +0,0 @@ -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 Patrick Huy -Matthias Butz -Jan Christian Meyer - -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 version 3 as published by -the Free Software Foundation. You may not use, modify or distribute -this program under any other version of the GNU Affero General Public -License. - -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 . - */ -package life; - -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataFileEntry; -import provider.MapleDataProvider; -import provider.MapleDataProviderFactory; -import provider.MapleDataTool; -import provider.wz.MapleDataType; -import tools.Pair; - -public class MapleLifeFactory { - private static String wzPath = "../../wz"; - private static MapleDataProvider data = MapleDataProviderFactory.getDataProvider(new File(wzPath + "/Mob.wz")); - private final static MapleDataProvider stringDataWZ = MapleDataProviderFactory.getDataProvider(new File(wzPath + "/String.wz")); - private static MapleData mobStringData = stringDataWZ.getData("Mob.img"); - private static MapleData npcStringData = stringDataWZ.getData("Npc.img"); - private static Map monsterStats = new HashMap<>(); - - private static int getMonsterId(String fileName) { - return Integer.parseInt(fileName.substring(0, 7)); - } - - public static Map getAllMonsterStats() { - MapleDataDirectoryEntry root = data.getRoot(); - - System.out.print("Parsing mob stats... "); - for (MapleDataFileEntry mFile : root.getFiles()) { - try { - String fileName = mFile.getName(); - - //System.out.println("Parsing '" + fileName + "'"); - MapleData monsterData = data.getData(fileName); - if (monsterData == null) { - continue; - } - - Integer mid = getMonsterId(fileName); - - MapleData monsterInfoData = monsterData.getChildByPath("info"); - MapleMonsterStats stats = new MapleMonsterStats(); - stats.setHp(MapleDataTool.getIntConvert("maxHP", monsterInfoData)); - stats.setFriendly(MapleDataTool.getIntConvert("damagedByMob", monsterInfoData, 0) == 1); - stats.setPADamage(MapleDataTool.getIntConvert("PADamage", monsterInfoData)); - stats.setPDDamage(MapleDataTool.getIntConvert("PDDamage", monsterInfoData)); - stats.setMADamage(MapleDataTool.getIntConvert("MADamage", monsterInfoData)); - stats.setMDDamage(MapleDataTool.getIntConvert("MDDamage", monsterInfoData)); - stats.setMp(MapleDataTool.getIntConvert("maxMP", monsterInfoData, 0)); - stats.setExp(MapleDataTool.getIntConvert("exp", monsterInfoData, 0)); - stats.setLevel(MapleDataTool.getIntConvert("level", monsterInfoData)); - stats.setRemoveAfter(MapleDataTool.getIntConvert("removeAfter", monsterInfoData, 0)); - stats.setBoss(MapleDataTool.getIntConvert("boss", monsterInfoData, 0) > 0); - stats.setExplosiveReward(MapleDataTool.getIntConvert("explosiveReward", monsterInfoData, 0) > 0); - stats.setFfaLoot(MapleDataTool.getIntConvert("publicReward", monsterInfoData, 0) > 0); - stats.setUndead(MapleDataTool.getIntConvert("undead", monsterInfoData, 0) > 0); - stats.setName(MapleDataTool.getString(mid + "/name", mobStringData, "MISSINGNO")); - stats.setBuffToGive(MapleDataTool.getIntConvert("buff", monsterInfoData, -1)); - stats.setCP(MapleDataTool.getIntConvert("getCP", monsterInfoData, 0)); - stats.setRemoveOnMiss(MapleDataTool.getIntConvert("removeOnMiss", monsterInfoData, 0) > 0); - - MapleData special = monsterInfoData.getChildByPath("coolDamage"); - if (special != null) { - int coolDmg = MapleDataTool.getIntConvert("coolDamage", monsterInfoData); - int coolProb = MapleDataTool.getIntConvert("coolDamageProb", monsterInfoData, 0); - stats.setCool(new Pair<>(coolDmg, coolProb)); - } - special = monsterInfoData.getChildByPath("loseItem"); - if (special != null) { - for (MapleData liData : special.getChildren()) { - stats.addLoseItem(new loseItem(MapleDataTool.getInt(liData.getChildByPath("id")), (byte) MapleDataTool.getInt(liData.getChildByPath("prop")), (byte) MapleDataTool.getInt(liData.getChildByPath("x")))); - } - } - special = monsterInfoData.getChildByPath("selfDestruction"); - if (special != null) { - stats.setSelfDestruction(new selfDestruction((byte) MapleDataTool.getInt(special.getChildByPath("action")), MapleDataTool.getIntConvert("removeAfter", special, -1), MapleDataTool.getIntConvert("hp", special, -1))); - } - MapleData firstAttackData = monsterInfoData.getChildByPath("firstAttack"); - int firstAttack = 0; - if (firstAttackData != null) { - if (firstAttackData.getType() == MapleDataType.FLOAT) { - firstAttack = Math.round(MapleDataTool.getFloat(firstAttackData)); - } else { - firstAttack = MapleDataTool.getInt(firstAttackData); - } - } - stats.setFirstAttack(firstAttack > 0); - stats.setDropPeriod(MapleDataTool.getIntConvert("dropItemPeriod", monsterInfoData, 0) * 10000); - - stats.setTagColor(MapleDataTool.getIntConvert("hpTagColor", monsterInfoData, 0)); - stats.setTagBgColor(MapleDataTool.getIntConvert("hpTagBgcolor", monsterInfoData, 0)); - - for (MapleData idata : monsterData) { - if (!idata.getName().equals("info")) { - int delay = 0; - for (MapleData pic : idata.getChildren()) { - delay += MapleDataTool.getIntConvert("delay", pic, 0); - } - stats.setAnimationTime(idata.getName(), delay); - } - } - MapleData reviveInfo = monsterInfoData.getChildByPath("revive"); - if (reviveInfo != null) { - List revives = new LinkedList<>(); - for (MapleData data_ : reviveInfo) { - revives.add(MapleDataTool.getInt(data_)); - } - stats.setRevives(revives); - } - decodeElementalString(stats, MapleDataTool.getString("elemAttr", monsterInfoData, "")); - MapleData monsterSkillData = monsterInfoData.getChildByPath("skill"); - if (monsterSkillData != null) { - int i = 0; - List> skills = new ArrayList<>(); - while (monsterSkillData.getChildByPath(Integer.toString(i)) != null) { - skills.add(new Pair<>(Integer.valueOf(MapleDataTool.getInt(i + "/skill", monsterSkillData, 0)), Integer.valueOf(MapleDataTool.getInt(i + "/level", monsterSkillData, 0)))); - i++; - } - stats.setSkills(skills); - } - MapleData banishData = monsterInfoData.getChildByPath("ban"); - if (banishData != null) { - stats.setBanishInfo(new BanishInfo(MapleDataTool.getString("banMsg", banishData), MapleDataTool.getInt("banMap/0/field", banishData, -1), MapleDataTool.getString("banMap/0/portal", banishData, "sp"))); - } - - monsterStats.put(mid, stats); - } catch(NullPointerException npe) { - //System.out.println("[SEVERE] " + mFile.getName() + " failed to load. Issue: " + npe.getMessage() + "\n\n"); - } - } - - System.out.println("done!"); - return monsterStats; - } - - private static void decodeElementalString(MapleMonsterStats stats, String elemAttr) { - for (int i = 0; i < elemAttr.length(); i += 2) { - stats.setEffectiveness(Element.getFromChar(elemAttr.charAt(i)), ElementalEffectiveness.getByNumber(Integer.valueOf(String.valueOf(elemAttr.charAt(i + 1))))); - } - } - - public static class BanishInfo { - - private int map; - private String portal, msg; - - public BanishInfo(String msg, int map, String portal) { - this.msg = msg; - this.map = map; - this.portal = portal; - } - - public int getMap() { - return map; - } - - public String getPortal() { - return portal; - } - - public String getMsg() { - return msg; - } - } - - public static class loseItem { - - private int id; - private byte chance, x; - - private loseItem(int id, byte chance, byte x) { - this.id = id; - this.chance = chance; - this.x = x; - } - - public int getId() { - return id; - } - - public byte getChance() { - return chance; - } - - public byte getX() { - return x; - } - } - - public static class selfDestruction { - - private byte action; - private int removeAfter; - private int hp; - - private selfDestruction(byte action, int removeAfter, int hp) { - this.action = action; - this.removeAfter = removeAfter; - this.hp = hp; - } - - public int getHp() { - return hp; - } - - public byte getAction() { - return action; - } - - public int removeAfter() { - return removeAfter; - } - } -} diff --git a/tools/MapleMesoFetcher/src/life/MapleMonsterStats.java b/tools/MapleMesoFetcher/src/life/MapleMonsterStats.java deleted file mode 100644 index ce2cacf6b3..0000000000 --- a/tools/MapleMesoFetcher/src/life/MapleMonsterStats.java +++ /dev/null @@ -1,330 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package life; - -import life.MapleLifeFactory.BanishInfo; -import life.MapleLifeFactory.loseItem; -import life.MapleLifeFactory.selfDestruction; -import tools.Pair; - -import java.util.*; - -/** - * @author Frz - */ -public class MapleMonsterStats { - private boolean changeable; - private int exp, hp, mp, level, PADamage, PDDamage, MADamage, MDDamage, dropPeriod, cp, buffToGive, removeAfter; - private boolean boss, undead, ffaLoot, isExplosiveReward, firstAttack, removeOnMiss; - private String name; - private Map animationTimes = new HashMap(); - private Map resistance = new HashMap(); - private List revives = Collections.emptyList(); - private byte tagColor, tagBgColor; - private List> skills = new ArrayList>(); - private Pair cool = null; - private BanishInfo banish = null; - private List loseItem = null; - private selfDestruction selfDestruction = null; - private boolean friendly; - - public void setChange(boolean change) { - this.changeable = change; - } - - public boolean isChangeable() { - return changeable; - } - - public int getExp() { - return exp; - } - - public void setExp(int exp) { - this.exp = exp; - } - - public int getHp() { - return hp; - } - - public void setHp(int hp) { - this.hp = hp; - } - - public int getMp() { - return mp; - } - - public void setMp(int mp) { - this.mp = mp; - } - - public int getLevel() { - return level; - } - - public void setLevel(int level) { - this.level = level; - } - - public int removeAfter() { - return removeAfter; - } - - public void setRemoveAfter(int removeAfter) { - this.removeAfter = removeAfter; - } - - public int getDropPeriod() { - return dropPeriod; - } - - public void setDropPeriod(int dropPeriod) { - this.dropPeriod = dropPeriod; - } - - public void setBoss(boolean boss) { - this.boss = boss; - } - - public boolean isBoss() { - return boss; - } - - public void setFfaLoot(boolean ffaLoot) { - this.ffaLoot = ffaLoot; - } - - public boolean isFfaLoot() { - return ffaLoot; - } - - public void setAnimationTime(String name, int delay) { - animationTimes.put(name, delay); - } - - public int getAnimationTime(String name) { - Integer ret = animationTimes.get(name); - if (ret == null) { - return 500; - } - return ret.intValue(); - } - - public boolean isMobile() { - return animationTimes.containsKey("move") || animationTimes.containsKey("fly"); - } - - public List getRevives() { - return revives; - } - - public void setRevives(List revives) { - this.revives = revives; - } - - public void setUndead(boolean undead) { - this.undead = undead; - } - - public boolean getUndead() { - return undead; - } - - public void setEffectiveness(Element e, ElementalEffectiveness ee) { - resistance.put(e, ee); - } - - public ElementalEffectiveness getEffectiveness(Element e) { - ElementalEffectiveness elementalEffectiveness = resistance.get(e); - if (elementalEffectiveness == null) { - return ElementalEffectiveness.NORMAL; - } else { - return elementalEffectiveness; - } - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public byte getTagColor() { - return tagColor; - } - - public void setTagColor(int tagColor) { - this.tagColor = (byte) tagColor; - } - - public byte getTagBgColor() { - return tagBgColor; - } - - public void setTagBgColor(int tagBgColor) { - this.tagBgColor = (byte) tagBgColor; - } - - public void setSkills(List> skills) { - this.skills.addAll(skills); - } - - public List> getSkills() { - return Collections.unmodifiableList(this.skills); - } - - public int getNoSkills() { - return this.skills.size(); - } - - public boolean hasSkill(int skillId, int level) { - for (Pair skill : skills) { - if (skill.getLeft() == skillId && skill.getRight() == level) { - return true; - } - } - return false; - } - - public void setFirstAttack(boolean firstAttack) { - this.firstAttack = firstAttack; - } - - public boolean isFirstAttack() { - return firstAttack; - } - - public void setBuffToGive(int buff) { - this.buffToGive = buff; - } - - public int getBuffToGive() { - return buffToGive; - } - - void removeEffectiveness(Element e) { - resistance.remove(e); - } - - public BanishInfo getBanishInfo() { - return banish; - } - - public void setBanishInfo(BanishInfo banish) { - this.banish = banish; - } - - public int getPADamage() { - return PADamage; - } - - public void setPADamage(int PADamage) { - this.PADamage = PADamage; - } - - public int getCP() { - return cp; - } - - public void setCP(int cp) { - this.cp = cp; - } - - public List loseItem() { - return loseItem; - } - - public void addLoseItem(loseItem li) { - if (loseItem == null) { - loseItem = new LinkedList(); - } - loseItem.add(li); - } - - public selfDestruction selfDestruction() { - return selfDestruction; - } - - public void setSelfDestruction(selfDestruction sd) { - this.selfDestruction = sd; - } - - public void setExplosiveReward(boolean isExplosiveReward) { - this.isExplosiveReward = isExplosiveReward; - } - - public boolean isExplosiveReward() { - return isExplosiveReward; - } - - public void setRemoveOnMiss(boolean removeOnMiss) { - this.removeOnMiss = removeOnMiss; - } - - public boolean removeOnMiss() { - return removeOnMiss; - } - - public void setCool(Pair cool) { - this.cool = cool; - } - - public Pair getCool() { - return cool; - } - - public int getPDDamage() { - return PDDamage; - } - - public int getMADamage() { - return MADamage; - } - - public int getMDDamage() { - return MDDamage; - } - - public boolean isFriendly() { - return friendly; - } - - public void setFriendly(boolean value) { - this.friendly = value; - } - - public void setPDDamage(int PDDamage) { - this.PDDamage = PDDamage; - } - - public void setMADamage(int MADamage) { - this.MADamage = MADamage; - } - - public void setMDDamage(int MDDamage) { - this.MDDamage = MDDamage; - } -} diff --git a/tools/MapleMesoFetcher/src/provider/MapleCanvas.java b/tools/MapleMesoFetcher/src/provider/MapleCanvas.java deleted file mode 100644 index 10ab682196..0000000000 --- a/tools/MapleMesoFetcher/src/provider/MapleCanvas.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.awt.image.BufferedImage; - -public interface MapleCanvas { - int getHeight(); - int getWidth(); - BufferedImage getImage(); -} diff --git a/tools/MapleMesoFetcher/src/provider/MapleData.java b/tools/MapleMesoFetcher/src/provider/MapleData.java deleted file mode 100644 index 4d90a93804..0000000000 --- a/tools/MapleMesoFetcher/src/provider/MapleData.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.util.List; -import provider.wz.MapleDataType; - -public interface MapleData extends MapleDataEntity, Iterable { - @Override - public String getName(); - public MapleDataType getType(); - public List getChildren(); - public MapleData getChildByPath(String path); - public Object getData(); -} diff --git a/tools/MapleMesoFetcher/src/provider/MapleDataDirectoryEntry.java b/tools/MapleMesoFetcher/src/provider/MapleDataDirectoryEntry.java deleted file mode 100644 index cb043e0c94..0000000000 --- a/tools/MapleMesoFetcher/src/provider/MapleDataDirectoryEntry.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.util.List; - -/** - * - * @author Matze - */ -public interface MapleDataDirectoryEntry extends MapleDataEntry { - public List getSubdirectories(); - public List getFiles(); - public MapleDataEntry getEntry(String name); -} diff --git a/tools/MapleMesoFetcher/src/provider/MapleDataEntity.java b/tools/MapleMesoFetcher/src/provider/MapleDataEntity.java deleted file mode 100644 index 03ff77649c..0000000000 --- a/tools/MapleMesoFetcher/src/provider/MapleDataEntity.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataEntity { - public String getName(); - public MapleDataEntity getParent(); -} diff --git a/tools/MapleMesoFetcher/src/provider/MapleDataEntry.java b/tools/MapleMesoFetcher/src/provider/MapleDataEntry.java deleted file mode 100644 index 62db6d0abe..0000000000 --- a/tools/MapleMesoFetcher/src/provider/MapleDataEntry.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataEntry extends MapleDataEntity { - public String getName(); - public int getSize(); - public int getChecksum(); - public int getOffset(); -} diff --git a/tools/MapleMesoFetcher/src/provider/MapleDataFileEntry.java b/tools/MapleMesoFetcher/src/provider/MapleDataFileEntry.java deleted file mode 100644 index 902130a612..0000000000 --- a/tools/MapleMesoFetcher/src/provider/MapleDataFileEntry.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataFileEntry extends MapleDataEntry { - public void setOffset(int offset); -} diff --git a/tools/MapleMesoFetcher/src/provider/MapleDataProvider.java b/tools/MapleMesoFetcher/src/provider/MapleDataProvider.java deleted file mode 100644 index 5237b7ac37..0000000000 --- a/tools/MapleMesoFetcher/src/provider/MapleDataProvider.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -public interface MapleDataProvider { - MapleData getData(String path); - MapleDataDirectoryEntry getRoot(); -} diff --git a/tools/MapleMesoFetcher/src/provider/MapleDataProviderFactory.java b/tools/MapleMesoFetcher/src/provider/MapleDataProviderFactory.java deleted file mode 100644 index 14753d4406..0000000000 --- a/tools/MapleMesoFetcher/src/provider/MapleDataProviderFactory.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.io.File; -import java.io.IOException; -import provider.wz.WZFile; -import provider.wz.XMLWZFile; - -public class MapleDataProviderFactory { - private final static String wzPath = System.getProperty("wzpath"); - - private static MapleDataProvider getWZ(File in, boolean provideImages) { - if (in.getName().toLowerCase().endsWith("wz") && !in.isDirectory()) { - try { - return new WZFile(in, provideImages); - } catch (IOException e) { - throw new RuntimeException("Loading WZ File failed", e); - } - } else { - return new XMLWZFile(in); - } - } - - public static MapleDataProvider getDataProvider(File in) { - return getWZ(in, false); - } - - public static MapleDataProvider getImageProvidingDataProvider(File in) { - return getWZ(in, true); - } - - public static File fileInWZPath(String filename) { - return new File(wzPath, filename); - } -} \ No newline at end of file diff --git a/tools/MapleMesoFetcher/src/provider/MapleDataTool.java b/tools/MapleMesoFetcher/src/provider/MapleDataTool.java deleted file mode 100644 index 25f4c7f817..0000000000 --- a/tools/MapleMesoFetcher/src/provider/MapleDataTool.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.awt.Point; -import java.awt.image.BufferedImage; -import provider.wz.MapleDataType; - -public class MapleDataTool { - public static String getString(MapleData data) { - return ((String) data.getData()); - } - - public static String getString(MapleData data, String def) { - if (data == null || data.getData() == null) { - return def; - } else { - return ((String) data.getData()); - } - } - - public static String getString(String path, MapleData data) { - return getString(data.getChildByPath(path)); - } - - public static String getString(String path, MapleData data, String def) { - return getString(data.getChildByPath(path), def); - } - - public static double getDouble(MapleData data) { - return ((Double) data.getData()).doubleValue(); - } - - public static float getFloat(MapleData data) { - return ((Float) data.getData()).floatValue(); - } - - public static int getInt(MapleData data) { - if (data == null || data.getData() == null) { - return 0;// DEF? - } - return ((Integer) data.getData()).intValue(); - } - - public static int getInt(String path, MapleData data) { - return getInt(data.getChildByPath(path)); - } - - public static int getIntConvert(MapleData data) { - if (data.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(data)); - } else { - return getInt(data); - } - } - - public static int getIntConvert(String path, MapleData data) { - MapleData d = data.getChildByPath(path); - if (d.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(d)); - } else { - return getInt(d); - } - } - - public static int getInt(MapleData data, int def) { - if (data == null || data.getData() == null) { - return def; - } else if (data.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(data)); - } else { - return ((Integer) data.getData()).intValue(); - } - } - - public static int getInt(String path, MapleData data, int def) { - return getInt(data.getChildByPath(path), def); - } - - public static int getIntConvert(String path, MapleData data, int def) { - MapleData d = data.getChildByPath(path); - if (d == null) { - return def; - } - if (d.getType() == MapleDataType.STRING) { - try { - return Integer.parseInt(getString(d)); - } catch (NumberFormatException nfe) { - nfe.printStackTrace(); - return def; - } - } else { - return getInt(d, def); - } - } - - public static BufferedImage getImage(MapleData data) { - return ((MapleCanvas) data.getData()).getImage(); - } - - public static Point getPoint(MapleData data) { - return ((Point) data.getData()); - } - - public static Point getPoint(String path, MapleData data) { - return getPoint(data.getChildByPath(path)); - } - - public static Point getPoint(String path, MapleData data, Point def) { - final MapleData pointData = data.getChildByPath(path); - if (pointData == null) { - return def; - } - return getPoint(pointData); - } - - public static String getFullDataPath(MapleData data) { - String path = ""; - MapleDataEntity myData = data; - while (myData != null) { - path = myData.getName() + "/" + path; - myData = myData.getParent(); - } - return path.substring(0, path.length() - 1); - } -} diff --git a/tools/MapleMesoFetcher/src/provider/wz/FileStoredPngMapleCanvas.java b/tools/MapleMesoFetcher/src/provider/wz/FileStoredPngMapleCanvas.java deleted file mode 100644 index 21736c2c16..0000000000 --- a/tools/MapleMesoFetcher/src/provider/wz/FileStoredPngMapleCanvas.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import javax.imageio.ImageIO; -import provider.MapleCanvas; - -public class FileStoredPngMapleCanvas implements MapleCanvas { - private File file; - private int width; - private int height; - private BufferedImage image; - - public FileStoredPngMapleCanvas(int width, int height, File fileIn) { - this.width = width; - this.height = height; - this.file = fileIn; - } - - @Override - public int getHeight() { - return height; - } - - @Override - public int getWidth() { - return width; - } - - @Override - public BufferedImage getImage() { - loadImageIfNecessary(); - return image; - } - - private void loadImageIfNecessary() { - if (image == null) { - try { - image = ImageIO.read(file); - // replace the dimensions loaded from the wz by the REAL dimensions from the image - should be equal tho - width = image.getWidth(); - height = image.getHeight(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } -} diff --git a/tools/MapleMesoFetcher/src/provider/wz/ImgMapleSound.java b/tools/MapleMesoFetcher/src/provider/wz/ImgMapleSound.java deleted file mode 100644 index 8add2ccb36..0000000000 --- a/tools/MapleMesoFetcher/src/provider/wz/ImgMapleSound.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -public class ImgMapleSound { - private int dataLength, offset; - - public ImgMapleSound(int dataLength, int offset) { - this.dataLength = dataLength; - this.offset = offset; - } - - public int getDataLength() { - return dataLength; - } - - public int getOffset() { - return offset; - } -} diff --git a/tools/MapleMesoFetcher/src/provider/wz/ListWZFile.java b/tools/MapleMesoFetcher/src/provider/wz/ListWZFile.java deleted file mode 100644 index 1672a08c59..0000000000 --- a/tools/MapleMesoFetcher/src/provider/wz/ListWZFile.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import provider.MapleDataProviderFactory; -import tools.data.input.GenericLittleEndianAccessor; -import tools.data.input.InputStreamByteStream; -import tools.data.input.LittleEndianAccessor; - -public class ListWZFile { - private LittleEndianAccessor lea; - private List entries = new ArrayList(); - private static Collection modernImgs = new HashSet(); - - public static byte[] xorBytes(byte[] a, byte[] b) { - byte[] wusched = new byte[a.length]; - for (int i = 0; i < a.length; i++) { - wusched[i] = (byte) (a[i] ^ b[i]); - } - return wusched; - } - - public ListWZFile(File listwz) throws FileNotFoundException { - lea = new GenericLittleEndianAccessor(new InputStreamByteStream(new BufferedInputStream(new FileInputStream(listwz)))); - while (lea.available() > 0) { - int l = lea.readInt() * 2; - byte[] chunk = new byte[l]; - for (int i = 0; i < chunk.length; i++) { - chunk[i] = lea.readByte(); - } - lea.readChar(); - final String value = String.valueOf(WZTool.readListString(chunk)); - entries.add(value); - } - entries = Collections.unmodifiableList(entries); - } - - public List getEntries() { - return entries; - } - - public static void init() { - final String listWz = System.getProperty("listwz"); - if (listWz != null) { - ListWZFile listwz; - try { - listwz = new ListWZFile(MapleDataProviderFactory.fileInWZPath("List.wz")); - modernImgs = new HashSet(listwz.getEntries()); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - } - - public static boolean isModernImgFile(String path) { - return modernImgs.contains(path); - } -} diff --git a/tools/MapleMesoFetcher/src/provider/wz/MapleDataType.java b/tools/MapleMesoFetcher/src/provider/wz/MapleDataType.java deleted file mode 100644 index e074d57d14..0000000000 --- a/tools/MapleMesoFetcher/src/provider/wz/MapleDataType.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -public enum MapleDataType { - NONE, IMG_0x00, SHORT, INT, FLOAT, DOUBLE, STRING, EXTENDED, PROPERTY, CANVAS, VECTOR, CONVEX, SOUND, UOL, UNKNOWN_TYPE, UNKNOWN_EXTENDED_TYPE; -} \ No newline at end of file diff --git a/tools/MapleMesoFetcher/src/provider/wz/PNGMapleCanvas.java b/tools/MapleMesoFetcher/src/provider/wz/PNGMapleCanvas.java deleted file mode 100644 index 97c2303804..0000000000 --- a/tools/MapleMesoFetcher/src/provider/wz/PNGMapleCanvas.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.Point; -import java.awt.image.BufferedImage; -import java.awt.image.DataBuffer; -import java.awt.image.DataBufferByte; -import java.awt.image.PixelInterleavedSampleModel; -import java.awt.image.Raster; -import java.awt.image.SampleModel; -import java.awt.image.WritableRaster; -import java.util.zip.DataFormatException; -import java.util.zip.Inflater; -import provider.MapleCanvas; - -public class PNGMapleCanvas implements MapleCanvas { - private static final int[] ZAHLEN = new int[]{2, 1, 0, 3}; - private int height; - private int width; - private int dataLength; - private int format; - private byte[] data; - - public PNGMapleCanvas(int width, int height, int dataLength, int format, byte[] data) { - super(); - this.height = height; - this.width = width; - this.dataLength = dataLength; - this.format = format; - this.data = data; - } - - public int getHeight() { - return height; - } - - public int getWidth() { - return width; - } - - public int getFormat() { - return format; - } - - private byte[] getData() { - return data; - } - - @Override - public BufferedImage getImage() { - int sizeUncompressed = 0; - int size8888 = 0; - int maxWriteBuf = 2; - int maxHeight = 3; - byte[] writeBuf = new byte[maxWriteBuf]; - @SuppressWarnings ("unused") - byte[] rowPointers = new byte[maxHeight]; - switch (getFormat()) { - case 1: - case 513: - sizeUncompressed = getHeight() * getWidth() * 4; - break; - case 2: - sizeUncompressed = getHeight() * getWidth() * 8; - break; - case 517: - sizeUncompressed = getHeight() * getWidth() / 128; - break; - } - size8888 = getHeight() * getWidth() * 8; - if (size8888 > maxWriteBuf) { - maxWriteBuf = size8888; - writeBuf = new byte[maxWriteBuf]; - } - if (getHeight() > maxHeight) { - maxHeight = getHeight(); - rowPointers = new byte[maxHeight]; - } - Inflater dec = new Inflater(); - dec.setInput(getData(), 0, dataLength); - int declen = 0; - byte[] uc = new byte[sizeUncompressed]; - try { - declen = dec.inflate(uc); - } catch (DataFormatException ex) { - throw new RuntimeException("zlib fucks", ex); - } - dec.end(); - if (getFormat() == 1) { - for (int i = 0; i < sizeUncompressed; i++) { - byte low = (byte) (uc[i] & 0x0F); - byte high = (byte) (uc[i] & 0xF0); - writeBuf[(i << 1)] = (byte) (((low << 4) | low) & 0xFF); - writeBuf[(i << 1) + 1] = (byte) (high | ((high >>> 4) & 0xF)); - } - } else if (getFormat() == 2) { - writeBuf = uc; - } else if (getFormat() == 513) { - for (int i = 0; i < declen; i += 2) { - byte bBits = (byte) ((uc[i] & 0x1F) << 3); - byte gBits = (byte) (((uc[i + 1] & 0x07) << 5) | ((uc[i] & 0xE0) >> 3)); - byte rBits = (byte) (uc[i + 1] & 0xF8); - writeBuf[(i << 1)] = (byte) (bBits | (bBits >> 5)); - writeBuf[(i << 1) + 1] = (byte) (gBits | (gBits >> 6)); - writeBuf[(i << 1) + 2] = (byte) (rBits | (rBits >> 5)); - writeBuf[(i << 1) + 3] = (byte) 0xFF; - } - } else if (getFormat() == 517) { - byte b = 0x00; - int pixelIndex = 0; - for (int i = 0; i < declen; i++) { - for (int j = 0; j < 8; j++) { - b = (byte) (((uc[i] & (0x01 << (7 - j))) >> (7 - j)) * 255); - for (int k = 0; k < 16; k++) { - pixelIndex = (i << 9) + (j << 6) + k * 2; - writeBuf[pixelIndex] = b; - writeBuf[pixelIndex + 1] = b; - writeBuf[pixelIndex + 2] = b; - writeBuf[pixelIndex + 3] = (byte) 0xFF; - } - } - } - } - DataBufferByte imgData = new DataBufferByte(writeBuf, sizeUncompressed); - SampleModel sm = new PixelInterleavedSampleModel(DataBuffer.TYPE_BYTE, getWidth(), getHeight(), 4, getWidth() * 4, ZAHLEN); - WritableRaster imgRaster = Raster.createWritableRaster(sm, imgData, new Point(0, 0)); - BufferedImage aa = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); - aa.setData(imgRaster); - return aa; - } -} diff --git a/tools/MapleMesoFetcher/src/provider/wz/WZDirectoryEntry.java b/tools/MapleMesoFetcher/src/provider/wz/WZDirectoryEntry.java deleted file mode 100644 index d24b8cb2b9..0000000000 --- a/tools/MapleMesoFetcher/src/provider/wz/WZDirectoryEntry.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataEntity; -import provider.MapleDataEntry; -import provider.MapleDataFileEntry; - -public class WZDirectoryEntry extends WZEntry implements MapleDataDirectoryEntry { - private List subdirs = new ArrayList(); - private List files = new ArrayList(); - private Map entries = new HashMap(); - - public WZDirectoryEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(name, size, checksum, parent); - } - - public WZDirectoryEntry() { - super(null, 0, 0, null); - } - - public void addDirectory(MapleDataDirectoryEntry dir) { - subdirs.add(dir); - entries.put(dir.getName(), dir); - } - - public void addFile(MapleDataFileEntry fileEntry) { - files.add(fileEntry); - entries.put(fileEntry.getName(), fileEntry); - } - - public List getSubdirectories() { - return Collections.unmodifiableList(subdirs); - } - - public List getFiles() { - return Collections.unmodifiableList(files); - } - - public MapleDataEntry getEntry(String name) { - return entries.get(name); - } -} diff --git a/tools/MapleMesoFetcher/src/provider/wz/WZEntry.java b/tools/MapleMesoFetcher/src/provider/wz/WZEntry.java deleted file mode 100644 index 1e921b2082..0000000000 --- a/tools/MapleMesoFetcher/src/provider/wz/WZEntry.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import provider.MapleDataEntity; -import provider.MapleDataEntry; - -public class WZEntry implements MapleDataEntry { - private String name; - private int size; - private int checksum; - private int offset; - private MapleDataEntity parent; - - public WZEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(); - this.name = name; - this.size = size; - this.checksum = checksum; - this.parent = parent; - } - - public String getName() { - return name; - } - - public int getSize() { - return size; - } - - public int getChecksum() { - return checksum; - } - - public int getOffset() { - return offset; - } - - public MapleDataEntity getParent() { - return parent; - } -} diff --git a/tools/MapleMesoFetcher/src/provider/wz/WZFile.java b/tools/MapleMesoFetcher/src/provider/wz/WZFile.java deleted file mode 100644 index c6c0abf537..0000000000 --- a/tools/MapleMesoFetcher/src/provider/wz/WZFile.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.RandomAccessFile; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataFileEntry; -import provider.MapleDataProvider; -import tools.data.input.GenericLittleEndianAccessor; -import tools.data.input.GenericSeekableLittleEndianAccessor; -import tools.data.input.InputStreamByteStream; -import tools.data.input.LittleEndianAccessor; -import tools.data.input.RandomAccessByteStream; -import tools.data.input.SeekableLittleEndianAccessor; - -public class WZFile implements MapleDataProvider { - static { - ListWZFile.init(); - } - private File wzfile; - private LittleEndianAccessor lea; - private SeekableLittleEndianAccessor slea; - private int headerSize; - private WZDirectoryEntry root; - private boolean provideImages; - private int cOffset; - - public WZFile(File wzfile, boolean provideImages) throws IOException { - this.wzfile = wzfile; - lea = new GenericLittleEndianAccessor(new InputStreamByteStream(new BufferedInputStream(new FileInputStream(wzfile)))); - RandomAccessFile raf = new RandomAccessFile(wzfile, "r"); - slea = new GenericSeekableLittleEndianAccessor(new RandomAccessByteStream(raf)); - root = new WZDirectoryEntry(wzfile.getName(), 0, 0, null); - this.provideImages = provideImages; - load(); - } - - private void load() throws IOException { - lea.readAsciiString(4); - lea.readInt(); - lea.readInt(); - headerSize = lea.readInt(); - lea.readNullTerminatedAsciiString(); - lea.readShort(); - parseDirectory(root); - cOffset = (int) lea.getBytesRead(); - getOffsets(root); - } - - private void getOffsets(MapleDataDirectoryEntry dir) { - for (MapleDataFileEntry file : dir.getFiles()) { - file.setOffset(cOffset); - cOffset += file.getSize(); - } - for (MapleDataDirectoryEntry sdir : dir.getSubdirectories()) { - getOffsets(sdir); - } - } - - private void parseDirectory(WZDirectoryEntry dir) { - int entries = WZTool.readValue(lea); - for (int i = 0; i < entries; i++) { - byte marker = lea.readByte(); - String name = null; - int size, checksum; - switch (marker) { - case 0x02: - name = WZTool.readDecodedStringAtOffsetAndReset(slea, lea.readInt() + this.headerSize + 1); - size = WZTool.readValue(lea); - checksum = WZTool.readValue(lea); - lea.readInt(); //dummy int - dir.addFile(new WZFileEntry(name, size, checksum, dir)); - break; - case 0x03: - case 0x04: - name = WZTool.readDecodedString(lea); - size = WZTool.readValue(lea); - checksum = WZTool.readValue(lea); - lea.readInt(); //dummy int - if (marker == 3) { - dir.addDirectory(new WZDirectoryEntry(name, size, checksum, dir)); - } else { - dir.addFile(new WZFileEntry(name, size, checksum, dir)); - } - break; - default: - } - } - for (MapleDataDirectoryEntry idir : dir.getSubdirectories()) { - parseDirectory((WZDirectoryEntry) idir); - } - } - - public WZIMGFile getImgFile(String path) throws IOException { - String segments[] = path.split("/"); - WZDirectoryEntry dir = root; - for (int x = 0; x < segments.length - 1; x++) { - dir = (WZDirectoryEntry) dir.getEntry(segments[x]); - if (dir == null) { - return null; - } - } - WZFileEntry entry = (WZFileEntry) dir.getEntry(segments[segments.length - 1]); - if (entry == null) { - return null; - } - String fullPath = wzfile.getName().substring(0, wzfile.getName().length() - 3).toLowerCase() + "/" + path; - return new WZIMGFile(this.wzfile, entry, provideImages, ListWZFile.isModernImgFile(fullPath)); - } - - @Override - public synchronized MapleData getData(String path) { - try { - WZIMGFile imgFile = getImgFile(path); - if (imgFile == null) { - return null; - } - MapleData ret = imgFile.getRoot(); - return ret; - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - @Override - public MapleDataDirectoryEntry getRoot() { - return root; - } -} diff --git a/tools/MapleMesoFetcher/src/provider/wz/WZFileEntry.java b/tools/MapleMesoFetcher/src/provider/wz/WZFileEntry.java deleted file mode 100644 index 792371d9cf..0000000000 --- a/tools/MapleMesoFetcher/src/provider/wz/WZFileEntry.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import provider.MapleDataEntity; -import provider.MapleDataFileEntry; - -public class WZFileEntry extends WZEntry implements MapleDataFileEntry { - private int offset; - - public WZFileEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(name, size, checksum, parent); - } - - @Override - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } -} diff --git a/tools/MapleMesoFetcher/src/provider/wz/WZIMGEntry.java b/tools/MapleMesoFetcher/src/provider/wz/WZIMGEntry.java deleted file mode 100644 index 385d785183..0000000000 --- a/tools/MapleMesoFetcher/src/provider/wz/WZIMGEntry.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import provider.MapleData; -import provider.MapleDataEntity; - -public class WZIMGEntry implements MapleData { - private String name; - private MapleDataType type; - private List children = new ArrayList(10); - private Object data; - private MapleDataEntity parent; - - public WZIMGEntry(MapleDataEntity parent) { - this.parent = parent; - } - - @Override - public String getName() { - return name; - } - - @Override - public MapleDataType getType() { - return type; - } - - @Override - public List getChildren() { - return Collections.unmodifiableList(children); - } - - @Override - public MapleData getChildByPath(String path) { - String segments[] = path.split("/"); - if (segments[0].equals("..")) { - return ((MapleData) getParent()).getChildByPath(path.substring(path.indexOf("/") + 1)); - } - MapleData ret = this; - for (int x = 0; x < segments.length; x++) { - boolean foundChild = false; - for (MapleData child : ret.getChildren()) { - if (child.getName().equals(segments[x])) { - ret = child; - foundChild = true; - break; - } - } - if (!foundChild) { - return null; - } - } - return ret; - } - - @Override - public Object getData() { - return data; - } - - public void setName(String name) { - this.name = name; - } - - public void setType(MapleDataType type) { - this.type = type; - } - - public void setData(Object data) { - this.data = data; - } - - public void addChild(WZIMGEntry entry) { - children.add(entry); - } - - @Override - public Iterator iterator() { - return getChildren().iterator(); - } - - @Override - public String toString() { - return getName() + ":" + getData(); - } - - public MapleDataEntity getParent() { - return parent; - } - - public void finish() { - ((ArrayList) children).trimToSize(); - } -} diff --git a/tools/MapleMesoFetcher/src/provider/wz/WZIMGFile.java b/tools/MapleMesoFetcher/src/provider/wz/WZIMGFile.java deleted file mode 100644 index bec06c78bd..0000000000 --- a/tools/MapleMesoFetcher/src/provider/wz/WZIMGFile.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.Point; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.io.RandomAccessFile; -import tools.data.input.GenericSeekableLittleEndianAccessor; -import tools.data.input.RandomAccessByteStream; -import tools.data.input.SeekableLittleEndianAccessor; - -public class WZIMGFile { - private WZFileEntry file; - private WZIMGEntry root; - private boolean provideImages; - @SuppressWarnings ("unused") - private boolean modernImg; - - public WZIMGFile(File wzfile, WZFileEntry file, boolean provideImages, boolean modernImg) throws IOException { - RandomAccessFile raf = new RandomAccessFile(wzfile, "r"); - SeekableLittleEndianAccessor slea = new GenericSeekableLittleEndianAccessor(new RandomAccessByteStream(raf)); - slea.seek(file.getOffset()); - this.file = file; - this.provideImages = provideImages; - root = new WZIMGEntry(file.getParent()); - root.setName(file.getName()); - root.setType(MapleDataType.EXTENDED); - this.modernImg = modernImg; - parseExtended(root, slea, 0); - root.finish(); - raf.close(); - } - - protected void dumpImg(OutputStream out, SeekableLittleEndianAccessor slea) throws IOException { - DataOutputStream os = new DataOutputStream(out); - long oldPos = slea.getPosition(); - slea.seek(file.getOffset()); - for (int x = 0; x < file.getSize(); x++) { - os.write(slea.readByte()); - } - slea.seek(oldPos); - } - - public WZIMGEntry getRoot() { - return root; - } - - private void parse(WZIMGEntry entry, SeekableLittleEndianAccessor slea) { - byte marker = slea.readByte(); - switch (marker) { - case 0: { - String name = WZTool.readDecodedString(slea); - entry.setName(name); - break; - } - case 1: { - String name = WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt()); - entry.setName(name); - break; - } - default: - System.out.println("Unknown Image identifier: " + marker + " at offset " + (slea.getPosition() - file.getOffset())); - } - marker = slea.readByte(); - switch (marker) { - case 0: - entry.setType(MapleDataType.IMG_0x00); - break; - case 2: - case 11: //??? no idea, since 0.49 - entry.setType(MapleDataType.SHORT); - entry.setData(Short.valueOf(slea.readShort())); - break; - case 3: - entry.setType(MapleDataType.INT); - entry.setData(Integer.valueOf(WZTool.readValue(slea))); - break; - case 4: - entry.setType(MapleDataType.FLOAT); - entry.setData(Float.valueOf(WZTool.readFloatValue(slea))); - break; - case 5: - entry.setType(MapleDataType.DOUBLE); - entry.setData(Double.valueOf(slea.readDouble())); - break; - case 8: - entry.setType(MapleDataType.STRING); - byte iMarker = slea.readByte(); - if (iMarker == 0) { - entry.setData(WZTool.readDecodedString(slea)); - } else if (iMarker == 1) { - entry.setData(WZTool.readDecodedStringAtOffsetAndReset(slea, slea.readInt() + file.getOffset())); - } else { - System.out.println("Unknown String type " + iMarker); - } - break; - case 9: - entry.setType(MapleDataType.EXTENDED); - long endOfExtendedBlock = slea.readInt(); - endOfExtendedBlock += slea.getPosition(); - parseExtended(entry, slea, endOfExtendedBlock); - break; - default: - System.out.println("Unknown Image type " + marker); - } - } - - private void parseExtended(WZIMGEntry entry, SeekableLittleEndianAccessor slea, long endOfExtendedBlock) { - byte marker = slea.readByte(); - String type; - switch (marker) { - case 0x73: - type = WZTool.readDecodedString(slea); - break; - case 0x1B: - type = WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt()); - break; - default: - throw new RuntimeException("Unknown extended image identifier: " + marker + " at offset " + - (slea.getPosition() - file.getOffset())); - } - if (type.equals("Property")) { - entry.setType(MapleDataType.PROPERTY); - slea.readByte(); - slea.readByte(); - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry cEntry = new WZIMGEntry(entry); - parse(cEntry, slea); - cEntry.finish(); - entry.addChild(cEntry); - } - } else if (type.equals("Canvas")) { - entry.setType(MapleDataType.CANVAS); - slea.readByte(); - marker = slea.readByte(); - if (marker == 0) { - // do nothing - } else if (marker == 1) { - slea.readByte(); - slea.readByte(); - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry child = new WZIMGEntry(entry); - parse(child, slea); - child.finish(); - entry.addChild(child); - } - } else { - System.out.println("Canvas marker != 1 (" + marker + ")"); - } - int width = WZTool.readValue(slea); - int height = WZTool.readValue(slea); - int format = WZTool.readValue(slea); - int format2 = slea.readByte(); - slea.readInt(); - int dataLength = slea.readInt() - 1; - slea.readByte(); - if (provideImages) { - byte[] pngdata = slea.read(dataLength); - entry.setData(new PNGMapleCanvas(width, height, dataLength, format + format2, pngdata)); - } else { - entry.setData(new PNGMapleCanvas(width, height, dataLength, format + format2, null)); - slea.skip(dataLength); - } - } else if (type.equals("Shape2D#Vector2D")) { - entry.setType(MapleDataType.VECTOR); - int x = WZTool.readValue(slea); - int y = WZTool.readValue(slea); - entry.setData(new Point(x, y)); - } else if (type.equals("Shape2D#Convex2D")) { - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry cEntry = new WZIMGEntry(entry); - parseExtended(cEntry, slea, 0); - cEntry.finish(); - entry.addChild(cEntry); - } - } else if (type.equals("Sound_DX8")) { - entry.setType(MapleDataType.SOUND); - slea.readByte(); - int dataLength = WZTool.readValue(slea); - WZTool.readValue(slea); // no clue what this is - int offset = (int) slea.getPosition(); - entry.setData(new ImgMapleSound(dataLength, offset - file.getOffset())); - slea.seek(endOfExtendedBlock); - } else if (type.equals("UOL")) { - entry.setType(MapleDataType.UOL); - slea.readByte(); - byte uolmarker = slea.readByte(); - switch (uolmarker) { - case 0: - entry.setData(WZTool.readDecodedString(slea)); - break; - case 1: - entry.setData(WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt())); - break; - default: - System.out.println("Unknown UOL marker: " + uolmarker + " " + entry.getName()); - } - } else { - throw new RuntimeException("Unhandled extended type: " + type); - } - } -} diff --git a/tools/MapleMesoFetcher/src/provider/wz/WZTool.java b/tools/MapleMesoFetcher/src/provider/wz/WZTool.java deleted file mode 100644 index 7f5452cd03..0000000000 --- a/tools/MapleMesoFetcher/src/provider/wz/WZTool.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import tools.data.input.LittleEndianAccessor; -import tools.data.input.SeekableLittleEndianAccessor; - -import javax.crypto.BadPaddingException; -import javax.crypto.Cipher; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.NoSuchPaddingException; -import javax.crypto.spec.SecretKeySpec; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; - -/* - * Ported Code, see WZFile.java for more info - */ -public class WZTool { - private static byte[] encKey; - - static { - byte[] iv = new byte[]{(byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b,}; - byte[] key = new byte[]{(byte) 0x13, 0x00, 0x00, 0x00, - (byte) 0x08, 0x00, 0x00, 0x00, - (byte) 0x06, 0x00, 0x00, 0x00, - (byte) 0xB4, 0x00, 0x00, 0x00, - (byte) 0x1B, 0x00, 0x00, 0x00, - (byte) 0x0F, 0x00, 0x00, 0x00, - (byte) 0x33, 0x00, 0x00, 0x00, - (byte) 0x52, 0x00, 0x00, 0x00 - }; - Cipher cipher = null; - SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); - try { - cipher = Cipher.getInstance("AES"); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (NoSuchPaddingException e) { - e.printStackTrace(); - } - try { - cipher.init(Cipher.ENCRYPT_MODE, skeySpec); - } catch (InvalidKeyException e) { - e.printStackTrace(); - } - encKey = new byte[0xFFFF]; - for (int i = 0; i < (0xFFFF / 16); i++) { - try { - iv = cipher.doFinal(iv); - } catch (IllegalBlockSizeException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } - System.arraycopy(iv, 0, encKey, (i * 16), 16); - } - try { - iv = cipher.doFinal(iv); - } catch (IllegalBlockSizeException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } - System.arraycopy(iv, 0, encKey, 65520, 15); - } - - public static byte[] readListString(byte[] str) { - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ encKey[i]); - } - return str; - } - - public static String readDecodedString(LittleEndianAccessor llea) { - int strLength; - byte b = llea.readByte(); - if (b == 0x00) { - return ""; - } - if (b >= 0) { - if (b == 0x7F) { - strLength = llea.readInt(); - } else { - strLength = b; - } - if (strLength < 0) { - return ""; - } - byte str[] = new byte[strLength * 2]; - for (int i = 0; i < strLength * 2; i++) { - str[i] = llea.readByte(); - } - return DecryptUnicodeStr(str); - } else { - if (b == -128) { - strLength = llea.readInt(); - } else { - strLength = -b; - } - if (strLength < 0) { - return ""; - } - byte str[] = new byte[strLength]; - for (int i = 0; i < strLength; i++) { - str[i] = llea.readByte(); - } - return DecryptAsciiStr(str); - } - } - - public static String DecryptAsciiStr(byte[] str) { - byte xorByte = (byte) 0xAA; - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ xorByte ^ encKey[i]); - xorByte++; - } - return new String(str); - } - - public static String DecryptUnicodeStr(byte[] str) { - int xorByte = 0xAAAA; - char[] charRet = new char[str.length / 2]; - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ encKey[i]); - } - for (int i = 0; i < (str.length / 2); i++) { - char toXor = (char) ((str[i] << 8) | str[i + 1]); - charRet[i] = (char) (toXor ^ xorByte); - xorByte++; - } - return String.valueOf(charRet); - } - - public static String readDecodedStringAtOffset(SeekableLittleEndianAccessor slea, int offset) { - slea.seek(offset); - return readDecodedString(slea); - } - - public static String readDecodedStringAtOffsetAndReset(SeekableLittleEndianAccessor slea, int offset) { - long pos = 0; - pos = slea.getPosition(); - slea.seek(offset); - String ret = readDecodedString(slea); - slea.seek(pos); - return ret; - } - - public static int readValue(LittleEndianAccessor lea) { - byte b = lea.readByte(); - if (b == -128) { - return lea.readInt(); - } else { - return b; - } - } - - public static float readFloatValue(LittleEndianAccessor lea) { - byte b = lea.readByte(); - if (b == -128) { - return lea.readFloat(); - } else { - return 0; - } - } -} \ No newline at end of file diff --git a/tools/MapleMesoFetcher/src/provider/wz/XMLDomMapleData.java b/tools/MapleMesoFetcher/src/provider/wz/XMLDomMapleData.java deleted file mode 100644 index 151a04c2fd..0000000000 --- a/tools/MapleMesoFetcher/src/provider/wz/XMLDomMapleData.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package provider.wz; - -import java.awt.Point; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.text.NumberFormat; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import provider.MapleData; -import provider.MapleDataEntity; -import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -public class XMLDomMapleData implements MapleData { - private Node node; - private File imageDataDir; - private NumberFormat nf; - - public XMLDomMapleData(FileInputStream fis, File imageDataDir) { - try { - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - Document document = documentBuilder.parse(fis); - this.node = document.getFirstChild(); - } catch (ParserConfigurationException e) { - throw new RuntimeException(e); - } catch (SAXException e) { - throw new RuntimeException(e); - } catch (IOException e) { - throw new RuntimeException(e); - } - this.imageDataDir = imageDataDir; - this.nf = NumberFormat.getInstance(Locale.FRANCE); - } - - private XMLDomMapleData(Node node) { - this.node = node; - this.nf = NumberFormat.getInstance(Locale.FRANCE); - } - - @Override - public MapleData getChildByPath(String path) { - String segments[] = path.split("/"); - if (segments[0].equals("..")) { - return ((MapleData) getParent()).getChildByPath(path.substring(path.indexOf("/") + 1)); - } - - Node myNode = node; - for (int x = 0; x < segments.length; x++) { - NodeList childNodes = myNode.getChildNodes(); - boolean foundChild = false; - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if (childNode.getNodeType() == Node.ELEMENT_NODE && childNode.getAttributes().getNamedItem("name").getNodeValue().equals(segments[x])) { - myNode = childNode; - foundChild = true; - break; - } - } - if (!foundChild) { - return null; - } - } - XMLDomMapleData ret = new XMLDomMapleData(myNode); - ret.imageDataDir = new File(imageDataDir, getName() + "/" + path).getParentFile(); - return ret; - } - - @Override - public List getChildren() { - List ret = new ArrayList(); - NodeList childNodes = node.getChildNodes(); - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if (childNode.getNodeType() == Node.ELEMENT_NODE) { - XMLDomMapleData child = new XMLDomMapleData(childNode); - child.imageDataDir = new File(imageDataDir, getName()); - ret.add(child); - } - } - return ret; - } - - @Override - public Object getData() { - NamedNodeMap attributes = node.getAttributes(); - MapleDataType type = getType(); - switch (type) { - case DOUBLE: - case FLOAT: - case INT: - case SHORT: { - String value = attributes.getNamedItem("value").getNodeValue(); - Number nval; - - try { - nval = nf.parse(value); - } - catch(java.text.ParseException pe) { - pe.printStackTrace(); - nval = 0.0f; - } - - switch (type) { - case DOUBLE: - return nval.doubleValue(); - case FLOAT: - return nval.floatValue(); - case INT: - return nval.intValue(); - case SHORT: - return nval.shortValue(); - default: - return null; - } - } - case STRING: - case UOL: { - String value = attributes.getNamedItem("value").getNodeValue(); - return value; - } - case VECTOR: { - String x = attributes.getNamedItem("x").getNodeValue(); - String y = attributes.getNamedItem("y").getNodeValue(); - return new Point(Integer.parseInt(x), Integer.parseInt(y)); - } - case CANVAS: { - String width = attributes.getNamedItem("width").getNodeValue(); - String height = attributes.getNamedItem("height").getNodeValue(); - return new FileStoredPngMapleCanvas(Integer.parseInt(width), Integer.parseInt(height), new File( - imageDataDir, getName() + ".png")); - } - default: - return null; - } - } - - @Override - public MapleDataType getType() { - String nodeName = node.getNodeName(); - if (nodeName.equals("imgdir")) { - return MapleDataType.PROPERTY; - } else if (nodeName.equals("canvas")) { - return MapleDataType.CANVAS; - } else if (nodeName.equals("convex")) { - return MapleDataType.CONVEX; - } else if (nodeName.equals("sound")) { - return MapleDataType.SOUND; - } else if (nodeName.equals("uol")) { - return MapleDataType.UOL; - } else if (nodeName.equals("double")) { - return MapleDataType.DOUBLE; - } else if (nodeName.equals("float")) { - return MapleDataType.FLOAT; - } else if (nodeName.equals("int")) { - return MapleDataType.INT; - } else if (nodeName.equals("short")) { - return MapleDataType.SHORT; - } else if (nodeName.equals("string")) { - return MapleDataType.STRING; - } else if (nodeName.equals("vector")) { - return MapleDataType.VECTOR; - } else if (nodeName.equals("null")) { - return MapleDataType.IMG_0x00; - } - return null; - } - - @Override - public MapleDataEntity getParent() { - Node parentNode = node.getParentNode(); - if (parentNode.getNodeType() == Node.DOCUMENT_NODE) { - return null; - } - XMLDomMapleData parentData = new XMLDomMapleData(parentNode); - parentData.imageDataDir = imageDataDir.getParentFile(); - return parentData; - } - - @Override - public String getName() { - return node.getAttributes().getNamedItem("name").getNodeValue(); - } - - @Override - public Iterator iterator() { - return getChildren().iterator(); - } -} diff --git a/tools/MapleMesoFetcher/src/provider/wz/XMLWZFile.java b/tools/MapleMesoFetcher/src/provider/wz/XMLWZFile.java deleted file mode 100644 index 2a7694fdc9..0000000000 --- a/tools/MapleMesoFetcher/src/provider/wz/XMLWZFile.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataProvider; - -public class XMLWZFile implements MapleDataProvider { - private File root; - private WZDirectoryEntry rootForNavigation; - - public XMLWZFile(File fileIn) { - root = fileIn; - rootForNavigation = new WZDirectoryEntry(fileIn.getName(), 0, 0, null); - fillMapleDataEntitys(root, rootForNavigation); - } - - private void fillMapleDataEntitys(File lroot, WZDirectoryEntry wzdir) { - for (File file : lroot.listFiles()) { - String fileName = file.getName(); - if (file.isDirectory() && !fileName.endsWith(".img")) { - WZDirectoryEntry newDir = new WZDirectoryEntry(fileName, 0, 0, wzdir); - wzdir.addDirectory(newDir); - fillMapleDataEntitys(file, newDir); - } else if (fileName.endsWith(".xml")) { - wzdir.addFile(new WZFileEntry(fileName.substring(0, fileName.length() - 4), 0, 0, wzdir)); - } - } - } - - @Override - public MapleData getData(String path) { - File dataFile = new File(root, path + ".xml"); - File imageDataDir = new File(root, path); - if (!dataFile.exists()) { - return null;//bitches - } - FileInputStream fis; - try { - fis = new FileInputStream(dataFile); - } catch (FileNotFoundException e) { - throw new RuntimeException("Datafile " + path + " does not exist in " + root.getAbsolutePath()); - } - final XMLDomMapleData domMapleData; - try { - domMapleData = new XMLDomMapleData(fis, imageDataDir.getParentFile()); - } finally { - try { - fis.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - return domMapleData; - } - - @Override - public MapleDataDirectoryEntry getRoot() { - return rootForNavigation; - } -} diff --git a/tools/MapleMesoFetcher/src/tools/DatabaseConnection.java b/tools/MapleMesoFetcher/src/tools/DatabaseConnection.java deleted file mode 100644 index b887280343..0000000000 --- a/tools/MapleMesoFetcher/src/tools/DatabaseConnection.java +++ /dev/null @@ -1,51 +0,0 @@ -package tools; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; - -/** - * @author Frz (Big Daddy) - * @author The Real Spookster - some modifications to this beautiful code - */ -public class DatabaseConnection { - private static String DB_URL = "jdbc:mysql://localhost:3306/cosmic"; - private static String DB_USER = "cosmic_server"; - private static String DB_PASS = "snailshell"; - - public static final int RETURN_GENERATED_KEYS = 1; - - private static ThreadLocal con = new ThreadLocalConnection(); - - public static Connection getConnection() { - Connection c = con.get(); - try { - c.getMetaData(); - } catch (SQLException e) { // connection is dead, therefore discard old object 5ever - con.remove(); - c = con.get(); - } - return c; - } - - private static class ThreadLocalConnection extends ThreadLocal { - - @Override - protected Connection initialValue() { - try { - Class.forName("com.mysql.jdbc.Driver"); // touch the mysql driver - } catch (ClassNotFoundException e) { - System.out.println("[SEVERE] SQL Driver Not Found. Consider death by clams."); - e.printStackTrace(); - return null; - } - try { - return DriverManager.getConnection(DB_URL, DB_USER, DB_PASS); - } catch (SQLException e) { - System.out.println("[SEVERE] Unable to make database connection."); - e.printStackTrace(); - return null; - } - } - } -} \ No newline at end of file diff --git a/tools/MapleMesoFetcher/src/tools/HexTool.java b/tools/MapleMesoFetcher/src/tools/HexTool.java deleted file mode 100644 index 8cc0c8aa84..0000000000 --- a/tools/MapleMesoFetcher/src/tools/HexTool.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools; - -import java.io.ByteArrayOutputStream; - -public class HexTool { - private static final char[] HEX = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; - - private static String toString(byte byteValue) { - int tmp = byteValue << 8; - char[] retstr = new char[]{HEX[(tmp >> 12) & 0x0F], HEX[(tmp >> 8) & 0x0F]}; - return String.valueOf(retstr); - } - - public static String toString(byte[] bytes) { - StringBuilder hexed = new StringBuilder(); - for (int i = 0; i < bytes.length; i++) { - hexed.append(toString(bytes[i])); - hexed.append(' '); - } - return hexed.substring(0, hexed.length() - 1); - } - - public static byte[] getByteArrayFromHexString(String hex) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - int nexti = 0; - int nextb = 0; - boolean highoc = true; - outer: - for (;;) { - int number = -1; - while (number == -1) { - if (nexti == hex.length()) { - break outer; - } - char chr = hex.charAt(nexti); - if (chr >= '0' && chr <= '9') { - number = chr - '0'; - } else if (chr >= 'a' && chr <= 'f') { - number = chr - 'a' + 10; - } else if (chr >= 'A' && chr <= 'F') { - number = chr - 'A' + 10; - } else { - number = -1; - } - nexti++; - } - if (highoc) { - nextb = number << 4; - highoc = false; - } else { - nextb |= number; - highoc = true; - baos.write(nextb); - } - } - return baos.toByteArray(); - } -} diff --git a/tools/MapleMesoFetcher/src/tools/Pair.java b/tools/MapleMesoFetcher/src/tools/Pair.java deleted file mode 100644 index b127e71110..0000000000 --- a/tools/MapleMesoFetcher/src/tools/Pair.java +++ /dev/null @@ -1,121 +0,0 @@ -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 ~ 2010 Patrick Huy -Matthias Butz -Jan Christian Meyer - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License version 3 -as published by the Free Software Foundation. You may not use, modify -or distribute this program under any other version of the -GNU Affero General Public License. - -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 . - */ -package tools; - -/** - * Represents a pair of values. - * - * @author Frz - * @since Revision 333 - * @version 1.0 - * - * @param The type of the left value. - * @param The type of the right value. - */ -public class Pair { - - public E left; - public F right; - - /** - * Class constructor - pairs two objects together. - * - * @param left The left object. - * @param right The right object. - */ - public Pair(E left, F right) { - this.left = left; - this.right = right; - } - - /** - * Gets the left value. - * - * @return The left value. - */ - public E getLeft() { - return left; - } - - /** - * Gets the right value. - * - * @return The right value. - */ - public F getRight() { - return right; - } - - /** - * Turns the pair into a string. - * - * @return Each value of the pair as a string joined with a colon. - */ - @Override - public String toString() { - return left.toString() + ":" + right.toString(); - } - - /** - * Gets the hash code of this pair. - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((left == null) ? 0 : left.hashCode()); - result = prime * result + ((right == null) ? 0 : right.hashCode()); - return result; - } - - /** - * Checks to see if two pairs are equal. - */ - @SuppressWarnings("unchecked") - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Pair other = (Pair) obj; - if (left == null) { - if (other.left != null) { - return false; - } - } else if (!left.equals(other.left)) { - return false; - } - if (right == null) { - if (other.right != null) { - return false; - } - } else if (!right.equals(other.right)) { - return false; - } - return true; - } -} \ No newline at end of file diff --git a/tools/MapleMesoFetcher/src/tools/data/input/ByteArrayByteStream.java b/tools/MapleMesoFetcher/src/tools/data/input/ByteArrayByteStream.java deleted file mode 100644 index eac7de21ea..0000000000 --- a/tools/MapleMesoFetcher/src/tools/data/input/ByteArrayByteStream.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import tools.HexTool; - -public class ByteArrayByteStream implements SeekableInputStreamBytestream { - private int pos = 0; - private long bytesRead = 0; - private byte[] arr; - - public ByteArrayByteStream(byte[] arr) { - this.arr = arr; - } - - @Override - public long getPosition() { - return pos; - } - - @Override - public void seek(long offset) throws IOException { - pos = (int) offset; - } - - @Override - public long getBytesRead() { - return bytesRead; - } - - @Override - public int readByte() { - bytesRead++; - return ((int) arr[pos++]) & 0xFF; - } - - @Override - public String toString() { - String nows = "kevintjuh93 pwns";//I lol'd - if (arr.length - pos > 0) { - byte[] now = new byte[arr.length - pos]; - System.arraycopy(arr, pos, now, 0, arr.length - pos); - nows = HexTool.toString(now); - } - return "All: " + HexTool.toString(arr) + "\nNow: " + nows; - } - - @Override - public long available() { - return arr.length - pos; - } -} diff --git a/tools/MapleMesoFetcher/src/tools/data/input/ByteInputStream.java b/tools/MapleMesoFetcher/src/tools/data/input/ByteInputStream.java deleted file mode 100644 index 107f71843e..0000000000 --- a/tools/MapleMesoFetcher/src/tools/data/input/ByteInputStream.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -/** - * Represents an abstract stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public interface ByteInputStream { - int readByte(); - long getBytesRead(); - long available(); -} diff --git a/tools/MapleMesoFetcher/src/tools/data/input/GenericLittleEndianAccessor.java b/tools/MapleMesoFetcher/src/tools/data/input/GenericLittleEndianAccessor.java deleted file mode 100644 index d08a9b8374..0000000000 --- a/tools/MapleMesoFetcher/src/tools/data/input/GenericLittleEndianAccessor.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.awt.Point; -import java.io.ByteArrayOutputStream; - -/** - * Provides a generic interface to a Little Endian stream of bytes. - * - * @version 1.0 - * @author Frz - * @since Revision 323 - */ -public class GenericLittleEndianAccessor implements LittleEndianAccessor { - private ByteInputStream bs; - - /** - * Class constructor - Wraps the accessor around a stream of bytes. - * - * @param bs The byte stream to wrap the accessor around. - */ - public GenericLittleEndianAccessor(ByteInputStream bs) { - this.bs = bs; - } - - /** - * Read a single byte from the stream. - * - * @return The byte read. - * @see tools.data.input.ByteInputStream#readByte - */ - @Override - public byte readByte() { - return (byte) bs.readByte(); - } - - /** - * Reads an integer from the stream. - * - * @return The integer read. - */ - @Override - public int readInt() { - return bs.readByte() + (bs.readByte() << 8) + (bs.readByte() << 16) + (bs.readByte() << 24); - } - - /** - * Reads a short integer from the stream. - * - * @return The short read. - */ - @Override - public short readShort() { - return (short) (bs.readByte() + (bs.readByte() << 8)); - } - - /** - * Reads a single character from the stream. - * - * @return The character read. - */ - @Override - public char readChar() { - return (char) readShort(); - } - - /** - * Reads a long integer from the stream. - * - * @return The long integer read. - */ - @Override - public long readLong() { - long byte1 = bs.readByte(); - long byte2 = bs.readByte(); - long byte3 = bs.readByte(); - long byte4 = bs.readByte(); - long byte5 = bs.readByte(); - long byte6 = bs.readByte(); - long byte7 = bs.readByte(); - long byte8 = bs.readByte(); - return (byte8 << 56) + (byte7 << 48) + (byte6 << 40) + (byte5 << 32) + (byte4 << 24) + (byte3 << 16) + (byte2 << 8) + byte1; - } - - /** - * Reads a floating point integer from the stream. - * - * @return The float-type integer read. - */ - @Override - public float readFloat() { - return Float.intBitsToFloat(readInt()); - } - - /** - * Reads a double-precision integer from the stream. - * - * @return The double-type integer read. - */ - @Override - public double readDouble() { - return Double.longBitsToDouble(readLong()); - } - - /** - * Reads an ASCII string from the stream with length n. - * - * @param n Number of characters to read. - * @return The string read. - */ - public final String readAsciiString(int n) { - char ret[] = new char[n]; - for (int x = 0; x < n; x++) { - ret[x] = (char) readByte(); - } - return String.valueOf(ret); - } - - /** - * Reads a null-terminated string from the stream. - * - * @return The string read. - */ - public final String readNullTerminatedAsciiString() { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte b; - while (true) { - b = readByte(); - if (b == 0) { - break; - } - baos.write(b); - } - byte[] buf = baos.toByteArray(); - char[] chrBuf = new char[buf.length]; - for (int x = 0; x < buf.length; x++) { - chrBuf[x] = (char) buf[x]; - } - return String.valueOf(chrBuf); - } - - /** - * Gets the number of bytes read from the stream so far. - * - * @return A long integer representing the number of bytes read. - * @see tools.data.input.ByteInputStream#getBytesRead() - */ - public long getBytesRead() { - return bs.getBytesRead(); - } - - /** - * Reads a MapleStory convention lengthed ASCII string. - * This consists of a short integer telling the length of the string, - * then the string itself. - * - * @return The string read. - */ - @Override - public String readMapleAsciiString() { - return readAsciiString(readShort()); - } - - /** - * Reads num bytes off the stream. - * - * @param num The number of bytes to read. - * @return An array of bytes with the length of num - */ - @Override - public byte[] read(int num) { - byte[] ret = new byte[num]; - for (int x = 0; x < num; x++) { - ret[x] = readByte(); - } - return ret; - } - - /** - * Reads a MapleStory Position information. - * This consists of 2 short integer. - * - * @return The Position read. - */ - @Override - public final Point readPos() { - final int x = readShort(); - final int y = readShort(); - return new Point(x, y); - } - - /** - * Skips the current position of the stream num bytes ahead. - * - * @param num Number of bytes to skip. - */ - @Override - public void skip(int num) { - for (int x = 0; x < num; x++) { - readByte(); - } - } - - /** - * @see tools.data.input.ByteInputStream#available - */ - @Override - public long available() { - return bs.available(); - } - - /** - * @see java.lang.Object#toString - */ - @Override - public String toString() { - return bs.toString(); - } -} \ No newline at end of file diff --git a/tools/MapleMesoFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java b/tools/MapleMesoFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java deleted file mode 100644 index fdd147d796..0000000000 --- a/tools/MapleMesoFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; - -/** - * Provides an abstract accessor to a generic Little Endian byte stream. This - * accessor is seekable. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - * @see tools.data.input.GenericLittleEndianAccessor - */ -public class GenericSeekableLittleEndianAccessor extends GenericLittleEndianAccessor implements SeekableLittleEndianAccessor { - private SeekableInputStreamBytestream bs; - - /** - * Class constructor - * Provide a seekable input stream to wrap this object around. - * - * @param bs The byte stream to wrap this around. - */ - public GenericSeekableLittleEndianAccessor(SeekableInputStreamBytestream bs) { - super(bs); - this.bs = bs; - } - - /** - * Seek the pointer to offset - * - * @param offset The offset to seek to. - * @see tools.data.input.SeekableInputStreamBytestream#seek - */ - @Override - public void seek(long offset) { - try { - bs.seek(offset); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("Seek failed " + e); - } - } - - /** - * Get the current position of the pointer. - * - * @return The current position of the pointer as a long integer. - * @see tools.data.input.SeekableInputStreamBytestream#getPosition - */ - @Override - public long getPosition() { - try { - return bs.getPosition(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("getPosition failed" + e); - return -1; - } - } - - /** - * Skip num number of bytes in the stream. - * - * @param num The number of bytes to skip. - */ - @Override - public void skip(int num) { - seek(getPosition() + num); - } -} diff --git a/tools/MapleMesoFetcher/src/tools/data/input/InputStreamByteStream.java b/tools/MapleMesoFetcher/src/tools/data/input/InputStreamByteStream.java deleted file mode 100644 index 70aef3489f..0000000000 --- a/tools/MapleMesoFetcher/src/tools/data/input/InputStreamByteStream.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Provides an abstract wrapper to a stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class InputStreamByteStream implements ByteInputStream { - private InputStream is; - private long read = 0; - - /** - * Class constructor. - * Provide an input stream to wrap this around. - * - * @param is The input stream to wrap this object around. - */ - public InputStreamByteStream(InputStream is) { - this.is = is; - } - - /** - * Reads the next byte from the stream. - * - * @return Then next byte in the stream. - */ - @Override - public int readByte() { - int temp; - try { - temp = is.read(); - if (temp == -1) { - throw new RuntimeException("EOF"); - } - read++; - return temp; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - /** - * Gets the number of bytes read from the stream. - * - * @return The number of bytes read as a long integer. - */ - @Override - public long getBytesRead() { - return read; - } - - /** - * Returns the number of bytes left in the stream. - * - * @return The number of bytes available for reading as a long integer. - */ - @Override - public long available() { - try { - return is.available(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("ERROR" + e); - return 0; - } - } -} diff --git a/tools/MapleMesoFetcher/src/tools/data/input/LittleEndianAccessor.java b/tools/MapleMesoFetcher/src/tools/data/input/LittleEndianAccessor.java deleted file mode 100644 index f991dbf537..0000000000 --- a/tools/MapleMesoFetcher/src/tools/data/input/LittleEndianAccessor.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.awt.Point; - -/** - * @author Frz - */ -public interface LittleEndianAccessor { - byte readByte(); - char readChar(); - short readShort(); - int readInt(); - Point readPos(); - long readLong(); - void skip(int num); - byte[] read(int num); - float readFloat(); - double readDouble(); - String readAsciiString(int n); - String readNullTerminatedAsciiString(); - String readMapleAsciiString(); - long getBytesRead(); - long available(); -} diff --git a/tools/MapleMesoFetcher/src/tools/data/input/RandomAccessByteStream.java b/tools/MapleMesoFetcher/src/tools/data/input/RandomAccessByteStream.java deleted file mode 100644 index c0004be17f..0000000000 --- a/tools/MapleMesoFetcher/src/tools/data/input/RandomAccessByteStream.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import java.io.RandomAccessFile; - -/** - * Provides an abstract layer to a byte stream. This layer can be accessed - * randomly. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class RandomAccessByteStream implements SeekableInputStreamBytestream { - private RandomAccessFile raf; - private long read = 0; - - public RandomAccessByteStream(RandomAccessFile raf) { - super(); - this.raf = raf; - } - - @Override - public int readByte() { - int temp; - try { - temp = raf.read(); - if (temp == -1) { - throw new RuntimeException("EOF"); - } - read++; - return temp; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public void seek(long offset) throws IOException { - raf.seek(offset); - } - - @Override - public long getPosition() throws IOException { - return raf.getFilePointer(); - } - - @Override - public long getBytesRead() { - return read; - } - - @Override - public long available() { - try { - return raf.length() - raf.getFilePointer(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("ERROR " + e); - return 0; - } - } -} diff --git a/tools/MapleMesoFetcher/src/tools/data/input/SeekableInputStreamBytestream.java b/tools/MapleMesoFetcher/src/tools/data/input/SeekableInputStreamBytestream.java deleted file mode 100644 index f4922dc876..0000000000 --- a/tools/MapleMesoFetcher/src/tools/data/input/SeekableInputStreamBytestream.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; - -/** - * Provides an abstract interface to a stream of bytes. This stream can be - * seeked. - * - * @author Frz - * @version 1.0 - * @since 299 - */ -public interface SeekableInputStreamBytestream extends ByteInputStream { - /** - * Seeks the stream by the specified offset. - * - * @param offset - * Number of bytes to seek. - * @throws IOException - */ - void seek(long offset) throws IOException; - - /** - * Gets the current position of the stream. - * - * @return The stream position as a long integer. - * @throws IOException - */ - long getPosition() throws IOException; -} diff --git a/tools/MapleMesoFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java b/tools/MapleMesoFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java deleted file mode 100644 index 16b2317f7a..0000000000 --- a/tools/MapleMesoFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -public interface SeekableLittleEndianAccessor extends LittleEndianAccessor { - void seek(long offset); - long getPosition(); -} diff --git a/tools/MapleMesoFetcher/src/tools/data/output/BAOSByteOutputStream.java b/tools/MapleMesoFetcher/src/tools/data/output/BAOSByteOutputStream.java deleted file mode 100644 index 80cbc9301e..0000000000 --- a/tools/MapleMesoFetcher/src/tools/data/output/BAOSByteOutputStream.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.io.ByteArrayOutputStream; - -/** - * Uses a byte array to output a stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 352 - */ -class BAOSByteOutputStream implements ByteOutputStream { - private ByteArrayOutputStream baos; - - /** - * Class constructor - Wraps the stream around a Java BAOS. - * - * @param baos The ByteArrayOutputStream to wrap this around. - */ - BAOSByteOutputStream(ByteArrayOutputStream baos) { - super(); - this.baos = baos; - } - - /** - * Writes a byte to the stream. - * - * @param b The byte to write to the stream. - * @see tools.data.output.ByteOutputStream#writeByte(byte) - */ - @Override - public void writeByte(byte b) { - baos.write(b); - } -} diff --git a/tools/MapleMesoFetcher/src/tools/data/output/ByteOutputStream.java b/tools/MapleMesoFetcher/src/tools/data/output/ByteOutputStream.java deleted file mode 100644 index 0df7ca7753..0000000000 --- a/tools/MapleMesoFetcher/src/tools/data/output/ByteOutputStream.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -/** - * Provides an interface to an output stream of bytes. - * - * @author Frz - * @since Revision 323 - * @version 1.0 - */ -interface ByteOutputStream { - /** - * Writes a byte to the stream. - * - * @param b The byte to write. - */ - void writeByte(byte b); -} diff --git a/tools/MapleMesoFetcher/src/tools/data/output/GenericLittleEndianWriter.java b/tools/MapleMesoFetcher/src/tools/data/output/GenericLittleEndianWriter.java deleted file mode 100644 index e804fd8000..0000000000 --- a/tools/MapleMesoFetcher/src/tools/data/output/GenericLittleEndianWriter.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.awt.Point; -import java.nio.charset.Charset; - -/** - * Provides a generic writer of a little-endian sequence of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class GenericLittleEndianWriter implements LittleEndianWriter { - private static Charset ASCII = Charset.forName("US-ASCII"); - private ByteOutputStream bos; - - /** - * Class constructor - Protected to prevent instantiation with no arguments. - */ - protected GenericLittleEndianWriter() { - // Blah! - } - - /** - * Sets the byte-output stream for this instance of the object. - * - * @param bos The new output stream to set. - */ - void setByteOutputStream(ByteOutputStream bos) { - this.bos = bos; - } - - /** - * Write an array of bytes to the stream. - * - * @param b The bytes to write. - */ - @Override - public void write(byte[] b) { - for (int x = 0; x < b.length; x++) { - bos.writeByte(b[x]); - } - } - - /** - * Write a byte to the stream. - * - * @param b The byte to write. - */ - @Override - public void write(byte b) { - bos.writeByte(b); - } - - /** - * Write a byte in integer form to the stream. - * - * @param b The byte as an Integer to write. - */ - @Override - public void write(int b) { - bos.writeByte((byte) b); - } - - @Override - public void skip(int b) { - write(new byte[b]); - } - - /** - * Write a short integer to the stream. - * - * @param i The short integer to write. - */ - @Override - public void writeShort(int i) { - bos.writeByte((byte) (i & 0xFF)); - bos.writeByte((byte) ((i >>> 8) & 0xFF)); - } - - /** - * Writes an integer to the stream. - * - * @param i The integer to write. - */ - @Override - public void writeInt(int i) { - bos.writeByte((byte) (i & 0xFF)); - bos.writeByte((byte) ((i >>> 8) & 0xFF)); - bos.writeByte((byte) ((i >>> 16) & 0xFF)); - bos.writeByte((byte) ((i >>> 24) & 0xFF)); - } - - /** - * Writes an ASCII string the the stream. - * - * @param s The ASCII string to write. - */ - @Override - public void writeAsciiString(String s) { - write(s.getBytes(ASCII)); - } - - /** - * Writes a maple-convention ASCII string to the stream. - * - * @param s The ASCII string to use maple-convention to write. - */ - @Override - public void writeMapleAsciiString(String s) { - writeShort((short) s.length()); - writeAsciiString(s); - } - - /** - * Writes a null-terminated ASCII string to the stream. - * - * @param s The ASCII string to write. - */ - @Override - public void writeNullTerminatedAsciiString(String s) { - writeAsciiString(s); - write(0); - } - - /** - * Write a long integer to the stream. - * @param l The long integer to write. - */ - @Override - public void writeLong(long l) { - bos.writeByte((byte) (l & 0xFF)); - bos.writeByte((byte) ((l >>> 8) & 0xFF)); - bos.writeByte((byte) ((l >>> 16) & 0xFF)); - bos.writeByte((byte) ((l >>> 24) & 0xFF)); - bos.writeByte((byte) ((l >>> 32) & 0xFF)); - bos.writeByte((byte) ((l >>> 40) & 0xFF)); - bos.writeByte((byte) ((l >>> 48) & 0xFF)); - bos.writeByte((byte) ((l >>> 56) & 0xFF)); - } - - /** - * Writes a 2D 4 byte position information - * - * @param s The Point position to write. - */ - @Override - public void writePos(Point s) { - writeShort(s.x); - writeShort(s.y); - } - - /** - * Writes a boolean true ? 1 : 0 - * - * @param b The boolean to write. - */ - @Override - public void writeBool(final boolean b) { - write(b ? 1 : 0); - } -} diff --git a/tools/MapleMesoFetcher/src/tools/data/output/LittleEndianWriter.java b/tools/MapleMesoFetcher/src/tools/data/output/LittleEndianWriter.java deleted file mode 100644 index f17bd7c72e..0000000000 --- a/tools/MapleMesoFetcher/src/tools/data/output/LittleEndianWriter.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package tools.data.output; - -import java.awt.Point; - -/** - * Provides an interface to a writer class that writes a little-endian sequence - * of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public interface LittleEndianWriter { - - /** - * Write an array of bytes to the sequence. - * - * @param b The bytes to write. - */ - public void write(byte b[]); - - /** - * Write a byte to the sequence. - * - * @param b The byte to write. - */ - public void write(byte b); - - /** - * Write a byte in integer form to the sequence. - * - * @param b The byte as an Integer to write. - */ - public void write(int b); - - public void skip(int b); - - /** - * Writes an integer to the sequence. - * - * @param i The integer to write. - */ - public void writeInt(int i); - - /** - * Write a short integer to the sequence. - * - * @param s The short integer to write. - */ - public void writeShort(int s); - - /** - * Write a long integer to the sequence. - * - * @param l The long integer to write. - */ - public void writeLong(long l); - - /** - * Writes an ASCII string the the sequence. - * - * @param s The ASCII string to write. - */ - void writeAsciiString(String s); - - /** - * Writes a null-terminated ASCII string to the sequence. - * - * @param s The ASCII string to write. - */ - void writeNullTerminatedAsciiString(String s); - - /** - * Writes a maple-convention ASCII string to the sequence. - * - * @param s The ASCII string to use maple-convention to write. - */ - void writeMapleAsciiString(String s); - - /** - * Writes a 2D 4 byte position information - * - * @param s The Point position to write. - */ - void writePos(Point s); - - /** - * Writes a boolean true ? 1 : 0 - * - * @param b The boolean to write. - */ - void writeBool(final boolean b); -} diff --git a/tools/MapleMesoFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java b/tools/MapleMesoFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java deleted file mode 100644 index b02365ec62..0000000000 --- a/tools/MapleMesoFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.io.ByteArrayOutputStream; -import tools.HexTool; - -/** - * Writes a maplestory-packet little-endian stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 352 - */ -public class MaplePacketLittleEndianWriter extends GenericLittleEndianWriter { - private ByteArrayOutputStream baos; - - /** - * Constructor - initializes this stream with a default size. - */ - public MaplePacketLittleEndianWriter() { - this(32); - } - - /** - * Constructor - initializes this stream with size size. - * - * @param size The size of the underlying stream. - */ - public MaplePacketLittleEndianWriter(int size) { - this.baos = new ByteArrayOutputStream(size); - setByteOutputStream(new BAOSByteOutputStream(baos)); - } - - /** - * Gets a MaplePacket instance representing this - * sequence of bytes. - * - * @return A MaplePacket with the bytes in this stream. - */ - public byte[] getPacket() { - return baos.toByteArray(); - } - - /** - * Changes this packet into a human-readable hexadecimal stream of bytes. - * - * @return This packet as hex digits. - */ - @Override - public String toString() { - return HexTool.toString(baos.toByteArray()); - } -} From a088fd29b70915d5ec5fcb11c7050a69c1d2ae4d Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 22:57:38 +0200 Subject: [PATCH 14/36] Move MapleNoItemIdFetcher to main module --- .../tools/mapletools/NoItemIdFetcher.java | 186 ++++++------------ .../MapleInvalidItemIdFetcher/lib/result.txt | 0 2 files changed, 64 insertions(+), 122 deletions(-) rename tools/MapleInvalidItemIdFetcher/src/maplenoitemidfetcher/MapleNoItemIdFetcher.java => src/main/java/tools/mapletools/NoItemIdFetcher.java (55%) delete mode 100644 tools/MapleInvalidItemIdFetcher/lib/result.txt diff --git a/tools/MapleInvalidItemIdFetcher/src/maplenoitemidfetcher/MapleNoItemIdFetcher.java b/src/main/java/tools/mapletools/NoItemIdFetcher.java similarity index 55% rename from tools/MapleInvalidItemIdFetcher/src/maplenoitemidfetcher/MapleNoItemIdFetcher.java rename to src/main/java/tools/mapletools/NoItemIdFetcher.java index 1647758035..602d5420c2 100644 --- a/tools/MapleInvalidItemIdFetcher/src/maplenoitemidfetcher/MapleNoItemIdFetcher.java +++ b/src/main/java/tools/mapletools/NoItemIdFetcher.java @@ -1,70 +1,35 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. +import provider.wz.WZFiles; - 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 . -*/ -package maplenoitemidfetcher; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PrintWriter; +import java.io.*; +import java.nio.charset.StandardCharsets; import java.sql.Connection; -import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; /** - * * @author RonanLana - * + *

* This application finds inexistent itemids within the drop data from * the Maplestory database specified in the URL below. This program * assumes all itemids uses 7 digits. - * + *

* A file is generated listing all the inexistent ids. */ -public class MapleNoItemIdFetcher { - static String host = "jdbc:mysql://localhost:3306/cosmic"; - static String driver = "com.mysql.jdbc.Driver"; - static String username = "cosmic_server"; - static String password = "snailshell"; +public class NoItemIdFetcher { + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("no_item_id_report.txt"); + private static final Connection con = SimpleDatabaseConnection.getConnection(); - static String wzPath = "../../wz"; - static String newFile = "lib/result.txt"; + private static final Set existingIds = new HashSet<>(); + private static final Set nonExistingIds = new HashSet<>(); - static Connection con = null; - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - static byte status = 0; - static int itemId = -1; - - static Set existingIds = new HashSet<>(); - static Set nonExistingIds = new HashSet<>(); + private static PrintWriter printWriter = null; + private static BufferedReader bufferedReader = null; + private static byte status = 0; + private static int itemId = -1; private static String getName(String token) { int i, j; @@ -79,42 +44,39 @@ public class MapleNoItemIdFetcher { token.getChars(i, j, dest, 0); d = new String(dest); - return(d); + return (d); } private static void forwardCursor(int st) { String line = null; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { simpleToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } private static void simpleToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; } } private static void translateToken(String token) { String d; - - if(token.contains("/imgdir")) { + + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { - if(status == 1) { //getting ItemId + } else if (token.contains("imgdir")) { + if (status == 1) { //getting ItemId d = getName(token); itemId = Integer.parseInt(d.substring(1, 8)); - + existingIds.add(itemId); forwardCursor(status); } @@ -127,36 +89,34 @@ public class MapleNoItemIdFetcher { // This will reference one line at a time String line = null; - try { - fileReader = new InputStreamReader(new FileInputStream(file), "UTF-8"); + try { + InputStreamReader fileReader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - + status = 0; try { - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { translateToken(line); } - } catch(NumberFormatException npe) { + } catch (NumberFormatException npe) { // second criteria, itemid is on the name of the file - + try { itemId = Integer.parseInt(file.getName().substring(0, 7)); existingIds.add(itemId); - } catch(NumberFormatException npe2) {} + } catch (NumberFormatException npe2) { + } } bufferedReader.close(); fileReader.close(); - } - - catch(FileNotFoundException ex) { + } catch (FileNotFoundException ex) { System.out.println("Unable to open file '" + file.getName() + "'"); - } - catch(IOException ex) { + } catch (IOException ex) { System.out.println("Error reading file '" + file.getName() + "'"); } } - + private static void readEquipDataDirectory(String dirPath) { File[] folders = new File(dirPath).listFiles(); //If this pathname does not denote a directory, then listFiles() returns null. @@ -164,21 +124,22 @@ public class MapleNoItemIdFetcher { for (File folder : folders) { // enter all subfolders if (folder.isDirectory()) { System.out.println("Reading '" + dirPath + "/" + folder.getName() + "'..."); - + try { File[] files = folder.listFiles(); - + for (File file : files) { // enter all XML files under subfolders if (file.isFile()) { itemId = Integer.parseInt(file.getName().substring(0, 8)); existingIds.add(itemId); } } - } catch (NumberFormatException nfe) {} + } catch (NumberFormatException nfe) { + } } } } - + private static void readItemDataDirectory(String dirPath) { File[] folders = new File(dirPath).listFiles(); //If this pathname does not denote a directory, then listFiles() returns null. @@ -186,9 +147,9 @@ public class MapleNoItemIdFetcher { for (File folder : folders) { // enter all subfolders if (folder.isDirectory()) { System.out.println("Reading '" + dirPath + "/" + folder.getName() + "'..."); - + File[] files = folder.listFiles(); - + for (File file : files) { // enter all XML files under subfolders if (file.isFile()) { readItemDataFile(file); @@ -197,13 +158,13 @@ public class MapleNoItemIdFetcher { } } } - + private static void evaluateDropsFromTable(String table) throws SQLException { PreparedStatement ps = con.prepareStatement("SELECT DISTINCT itemid FROM " + table + ";"); ResultSet rs = ps.executeQuery(); - while(rs.next()) { - if(!existingIds.contains(rs.getInt(1))) { + while (rs.next()) { + if (!existingIds.contains(rs.getInt(1))) { nonExistingIds.add(rs.getInt(1)); } } @@ -211,64 +172,45 @@ public class MapleNoItemIdFetcher { rs.close(); ps.close(); } - + private static void evaluateDropsFromDb() { try { System.out.println("Evaluating item data on DB..."); - - Class.forName(driver).newInstance(); - con = DriverManager.getConnection(host, username, password); - + evaluateDropsFromTable("drop_data"); evaluateDropsFromTable("reactordrops"); - - if(!nonExistingIds.isEmpty()) { + + if (!nonExistingIds.isEmpty()) { List list = new ArrayList<>(nonExistingIds); Collections.sort(list); - - for(Integer i : list) { + + for (Integer i : list) { printWriter.println(i); } } - + System.out.println("Inexistent itemid count: " + nonExistingIds.size()); System.out.println("Total itemid count: " + existingIds.size()); - - con.close(); - } - - catch(ClassNotFoundException e) { - System.out.println("Error: could not find class"); - System.out.println(e.getMessage()); - } - catch(InstantiationException e) { - System.out.println("Error: instantiation failure"); - System.out.println(e.getMessage()); - } - - catch(SQLException e) { - e.printStackTrace(); - } - - catch(Exception e) { + con.close(); + } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { try { - printWriter = new PrintWriter(newFile, "UTF-8"); - + printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); + existingIds.add(0); // meso itemid - readEquipDataDirectory(wzPath + "/Character.wz"); - readItemDataDirectory(wzPath + "/Item.wz"); - + readEquipDataDirectory(WZFiles.CHARACTER.getFilePath()); + readItemDataDirectory(WZFiles.ITEM.getFilePath()); + evaluateDropsFromDb(); - + printWriter.close(); - } catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } -} +} \ No newline at end of file diff --git a/tools/MapleInvalidItemIdFetcher/lib/result.txt b/tools/MapleInvalidItemIdFetcher/lib/result.txt deleted file mode 100644 index e69de29bb2..0000000000 From fdef9e37bb1841bba674293d75a3f3c21e286e6e Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 23:10:22 +0200 Subject: [PATCH 15/36] Move MapleNoItemNameFetcher to main module --- .../tools/mapletools/NoItemNameFetcher.java | 487 ++++------- .../lib/output.txt | 803 ------------------ .../lib/result.txt | 446 ---------- .../src/maplenoitemnamefetcher/Pair.java | 121 --- .../src/provider/MapleCanvas.java | 30 - .../src/provider/MapleData.java | 34 - .../src/provider/MapleDataDirectoryEntry.java | 34 - .../src/provider/MapleDataEntity.java | 31 - .../src/provider/MapleDataEntry.java | 33 - .../src/provider/MapleDataFileEntry.java | 30 - .../src/provider/MapleDataProvider.java | 27 - .../provider/MapleDataProviderFactory.java | 55 -- .../src/provider/MapleDataTool.java | 145 ---- .../provider/wz/FileStoredPngMapleCanvas.java | 70 -- .../src/provider/wz/ImgMapleSound.java | 39 - .../src/provider/wz/ListWZFile.java | 86 -- .../src/provider/wz/MapleDataType.java | 26 - .../src/provider/wz/PNGMapleCanvas.java | 151 ---- .../src/provider/wz/WZDirectoryEntry.java | 68 -- .../src/provider/wz/WZEntry.java | 61 -- .../src/provider/wz/WZFile.java | 154 ---- .../src/provider/wz/WZFileEntry.java | 42 - .../src/provider/wz/WZIMGEntry.java | 118 --- .../src/provider/wz/WZIMGFile.java | 227 ----- .../src/provider/wz/WZTool.java | 188 ---- .../src/provider/wz/XMLDomMapleData.java | 219 ----- .../src/provider/wz/XMLWZFile.java | 85 -- .../src/tools/DatabaseConnection.java | 51 -- .../src/tools/HexTool.java | 79 -- .../src/tools/Pair.java | 121 --- .../tools/data/input/ByteArrayByteStream.java | 72 -- .../src/tools/data/input/ByteInputStream.java | 35 - .../input/GenericLittleEndianAccessor.java | 239 ------ .../GenericSeekableLittleEndianAccessor.java | 91 -- .../data/input/InputStreamByteStream.java | 93 -- .../data/input/LittleEndianAccessor.java | 45 - .../data/input/RandomAccessByteStream.java | 84 -- .../input/SeekableInputStreamBytestream.java | 51 -- .../input/SeekableLittleEndianAccessor.java | 27 - .../data/output/BAOSByteOutputStream.java | 56 -- .../tools/data/output/ByteOutputStream.java | 38 - .../output/GenericLittleEndianWriter.java | 183 ---- .../tools/data/output/LittleEndianWriter.java | 114 --- .../output/MaplePacketLittleEndianWriter.java | 73 -- 44 files changed, 181 insertions(+), 5081 deletions(-) rename tools/MapleInvalidItemWithNoNameFetcher/src/maplenoitemnamefetcher/MapleNoItemNameFetcher.java => src/main/java/tools/mapletools/NoItemNameFetcher.java (59%) delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/lib/output.txt delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/lib/result.txt delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/maplenoitemnamefetcher/Pair.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleCanvas.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleData.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataDirectoryEntry.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataEntity.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataEntry.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataFileEntry.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataProvider.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataProviderFactory.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataTool.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/FileStoredPngMapleCanvas.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/ImgMapleSound.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/ListWZFile.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/MapleDataType.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/PNGMapleCanvas.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZDirectoryEntry.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZEntry.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZFile.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZFileEntry.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZIMGEntry.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZIMGFile.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZTool.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/XMLDomMapleData.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/XMLWZFile.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/tools/DatabaseConnection.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/tools/HexTool.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/tools/Pair.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/ByteArrayByteStream.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/ByteInputStream.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/GenericLittleEndianAccessor.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/InputStreamByteStream.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/LittleEndianAccessor.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/RandomAccessByteStream.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/SeekableInputStreamBytestream.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/BAOSByteOutputStream.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/ByteOutputStream.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/GenericLittleEndianWriter.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/LittleEndianWriter.java delete mode 100644 tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/maplenoitemnamefetcher/MapleNoItemNameFetcher.java b/src/main/java/tools/mapletools/NoItemNameFetcher.java similarity index 59% rename from tools/MapleInvalidItemWithNoNameFetcher/src/maplenoitemnamefetcher/MapleNoItemNameFetcher.java rename to src/main/java/tools/mapletools/NoItemNameFetcher.java index b47047b256..d1f44bb939 100644 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/maplenoitemnamefetcher/MapleNoItemNameFetcher.java +++ b/src/main/java/tools/mapletools/NoItemNameFetcher.java @@ -1,89 +1,51 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. +import provider.*; +import provider.wz.WZFiles; - 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 . -*/ -package maplenoitemnamefetcher; - -import java.io.BufferedReader; import java.io.File; -import java.io.InputStreamReader; import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataFileEntry; -import provider.MapleDataProvider; -import provider.MapleDataProviderFactory; -import provider.MapleDataTool; +import java.nio.charset.StandardCharsets; +import java.util.*; /** - * * @author RonanLana - * + *

* This application finds itemids with inexistent name and description from * within the server-side XMLs, then identify them on a report file along * with a XML excerpt to be appended on the String.wz xml nodes. This program * assumes all equipids are depicted using 8 digits and item using 7 digits. - * + *

* Estimated parse time: 2 minutes */ -public class MapleNoItemNameFetcher { - static String wzPath = "../../wz"; - static String newFile = "lib/result.txt"; - static String xmlFile = "lib/output.txt"; +public class NoItemNameFetcher { + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("no_item_name_result.txt"); + private static final File OUTPUT_XML_FILE = ToolConstants.getOutputFile("no_item_name_xml.txt"); - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static Map itemsWzPath = new HashMap<>(); - static Map itemTypes = new HashMap<>(); - static Map equipTypes = new HashMap<>(); - - static Map itemsWithNoNameProperty = new HashMap<>(); - static Set equipsWithNoCashProperty = new HashSet<>(); + private static final Map itemsWzPath = new HashMap<>(); + private static final Map equipTypes = new HashMap<>(); + private static final Map itemsWithNoNameProperty = new HashMap<>(); + private static final Set equipsWithNoCashProperty = new HashSet<>(); + private static final Map nameContentCache = new HashMap<>(); + private static final Map descContentCache = new HashMap<>(); + + private static PrintWriter printWriter = null; + private static ItemType curType = ItemType.UNDEF; - static Map nameContentCache = new HashMap<>(); - static Map descContentCache = new HashMap<>(); - - static ItemType curType = ItemType.UNDEF; - private enum ItemType { UNDEF, CASH, CONSUME, EQP, ETC, INS, PET } - + private enum EquipType { UNDEF, ACCESSORY, CAP, CAPE, COAT, FACE, GLOVE, HAIR, LONGCOAT, PANTS, PETEQUIP, RING, SHIELD, SHOES, TAMING, WEAPON } - + private static void processStringSubdirectoryData(MapleData subdirData, String subdirPath) { - for(MapleData md : subdirData.getChildren()) { + for (MapleData md : subdirData.getChildren()) { try { MapleData nameData = md.getChildByPath("name"); MapleData descData = md.getChildByPath("desc"); - + int itemId = Integer.parseInt(md.getName()); if (nameData != null && descData != null) { itemsWithNoNameProperty.remove(itemId); @@ -93,7 +55,7 @@ public class MapleNoItemNameFetcher { } else if (descData != null) { descContentCache.put(itemId, MapleDataTool.getString("desc", md)); } - + System.out.println("Found itemid on String.wz with no full property: " + subdirPath + subdirData.getName() + "/" + md.getName()); } } catch (NumberFormatException nfe) { @@ -101,9 +63,9 @@ public class MapleNoItemNameFetcher { } } } - + private static void readStringSubdirectoryData(MapleData subdirData, int depth, String subdirPath) { - if(depth > 0) { + if (depth > 0) { for (MapleData mDir : subdirData.getChildren()) { readStringSubdirectoryData(mDir, depth - 1, subdirPath + mDir.getName() + "/"); } @@ -111,230 +73,162 @@ public class MapleNoItemNameFetcher { processStringSubdirectoryData(subdirData, subdirPath); } } - + private static void readStringSubdirectoryData(MapleData subdirData, int depth) { readStringSubdirectoryData(subdirData, depth, ""); } - + private static void readStringWZData() { System.out.println("Parsing String.wz..."); - MapleDataProvider stringData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/String.wz")); - + MapleDataProvider stringData = MapleDataProviderFactory.getDataProvider(WZFiles.STRING); + MapleData cashStringData = stringData.getData("Cash.img"); readStringSubdirectoryData(cashStringData, 0); - + MapleData consumeStringData = stringData.getData("Consume.img"); readStringSubdirectoryData(consumeStringData, 0); - + MapleData eqpStringData = stringData.getData("Eqp.img"); readStringSubdirectoryData(eqpStringData, 2); - + MapleData etcStringData = stringData.getData("Etc.img"); readStringSubdirectoryData(etcStringData, 1); - + MapleData insStringData = stringData.getData("Ins.img"); readStringSubdirectoryData(insStringData, 0); - + MapleData petStringData = stringData.getData("Pet.img"); readStringSubdirectoryData(petStringData, 0); } - + private static boolean isTamingMob(int itemId) { int itemType = itemId / 1000; return itemType == 1902 || itemType == 1912; } - + private static boolean isAccessory(int itemId) { return itemId >= 1110000 && itemId < 1140000; } - + private static ItemType getItemTypeFromDirectoryName(String dirName) { - switch(dirName) { - case "Cash": - return ItemType.CASH; - - case "Consume": - return ItemType.CONSUME; - - case "Etc": - return ItemType.ETC; - - case "Install": - return ItemType.INS; - - case "Pet": - return ItemType.PET; - - default: - return ItemType.UNDEF; - } + return switch (dirName) { + case "Cash" -> ItemType.CASH; + case "Consume" -> ItemType.CONSUME; + case "Etc" -> ItemType.ETC; + case "Install" -> ItemType.INS; + case "Pet" -> ItemType.PET; + default -> ItemType.UNDEF; + }; } - + private static EquipType getEquipTypeFromDirectoryName(String dirName) { - switch(dirName) { - case "Accessory": - return EquipType.ACCESSORY; - - case "Cap": - return EquipType.CAP; - - case "Cape": - return EquipType.CAPE; - - case "Coat": - return EquipType.COAT; - - case "Face": - return EquipType.FACE; - - case "Glove": - return EquipType.GLOVE; - - case "Hair": - return EquipType.HAIR; - - case "Longcoat": - return EquipType.LONGCOAT; - - case "Pants": - return EquipType.PANTS; - - case "PetEquip": - return EquipType.PETEQUIP; - - case "Ring": - return EquipType.RING; - - case "Shield": - return EquipType.SHIELD; - - case "Shoes": - return EquipType.SHOES; - - case "TamingMob": - return EquipType.TAMING; - - case "Weapon": - return EquipType.WEAPON; - - default: - return EquipType.UNDEF; - } + return switch (dirName) { + case "Accessory" -> EquipType.ACCESSORY; + case "Cap" -> EquipType.CAP; + case "Cape" -> EquipType.CAPE; + case "Coat" -> EquipType.COAT; + case "Face" -> EquipType.FACE; + case "Glove" -> EquipType.GLOVE; + case "Hair" -> EquipType.HAIR; + case "Longcoat" -> EquipType.LONGCOAT; + case "Pants" -> EquipType.PANTS; + case "PetEquip" -> EquipType.PETEQUIP; + case "Ring" -> EquipType.RING; + case "Shield" -> EquipType.SHIELD; + case "Shoes" -> EquipType.SHOES; + case "TamingMob" -> EquipType.TAMING; + case "Weapon" -> EquipType.WEAPON; + default -> EquipType.UNDEF; + }; } - + private static String getStringDirectoryNameFromEquipType(EquipType eType) { - switch(eType) { - case ACCESSORY: - return "Accessory"; - - case CAP: - return "Cap"; - - case CAPE: - return "Cape"; - - case COAT: - return "Coat"; - - case FACE: - return "Face"; - - case GLOVE: - return "Glove"; - - case HAIR: - return "Hair"; - - case LONGCOAT: - return "Longcoat"; - - case PANTS: - return "Pants"; - - case PETEQUIP: - return "PetEquip"; - - case RING: - return "Ring"; - - case SHIELD: - return "Shield"; - - case SHOES: - return "Shoes"; - - case TAMING: - return "Taming"; - - case WEAPON: - return "Weapon"; - - default: - return "Undefined"; - } + return switch (eType) { + case ACCESSORY -> "Accessory"; + case CAP -> "Cap"; + case CAPE -> "Cape"; + case COAT -> "Coat"; + case FACE -> "Face"; + case GLOVE -> "Glove"; + case HAIR -> "Hair"; + case LONGCOAT -> "Longcoat"; + case PANTS -> "Pants"; + case PETEQUIP -> "PetEquip"; + case RING -> "Ring"; + case SHIELD -> "Shield"; + case SHOES -> "Shoes"; + case TAMING -> "Taming"; + case WEAPON -> "Weapon"; + default -> "Undefined"; + }; } - + private static void readEquipNodeData(MapleDataProvider data, MapleDataDirectoryEntry mDir, String wzFileName, String dirName) { EquipType eqType = getEquipTypeFromDirectoryName(dirName); - - for(MapleDataFileEntry mFile : mDir.getFiles()) { + + for (MapleDataFileEntry mFile : mDir.getFiles()) { String fileName = mFile.getName(); try { - int itemId = Integer.parseInt(fileName.substring(0, 8)); + int itemId = Integer.parseInt(fileName.substring(0, 8)); itemsWithNoNameProperty.put(itemId, curType); equipTypes.put(itemId, eqType); - + itemsWzPath.put(itemId, wzFileName + "/" + dirName + "/" + fileName); - if(!isAccessory(itemId) && !isTamingMob(itemId)) { + if (!isAccessory(itemId) && !isTamingMob(itemId)) { try { MapleData fileData = data.getData(dirName + "/" + fileName); MapleData mdinfo = fileData.getChildByPath("info"); - if( mdinfo.getChildByPath("cash") == null) { + if (mdinfo.getChildByPath("cash") == null) { equipsWithNoCashProperty.add(itemId); } - } catch(NullPointerException npe) { + } catch (NullPointerException npe) { System.out.println("[SEVERE] " + mFile.getName() + " failed to load. Issue: " + npe.getMessage() + "\n\n"); } } - } catch (Exception e) {} + } catch (Exception e) { + } } } - + private static void readEquipWZData() { String wzFileName = "Character.wz"; - - MapleDataProvider data = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Character.wz")); + + MapleDataProvider data = MapleDataProviderFactory.getDataProvider(WZFiles.CHARACTER); MapleDataDirectoryEntry root = data.getRoot(); - + System.out.println("Parsing " + wzFileName + "..."); for (MapleDataDirectoryEntry mDir : root.getSubdirectories()) { String dirName = mDir.getName(); - if(dirName.contentEquals("Dragon")) continue; - + if (dirName.contentEquals("Dragon")) { + continue; + } + readEquipNodeData(data, mDir, wzFileName, dirName); } } - + private static void readItemWZData() { String wzFileName = "Item.wz"; - - MapleDataProvider data = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Item.wz")); + + MapleDataProvider data = MapleDataProviderFactory.getDataProvider(WZFiles.ITEM); MapleDataDirectoryEntry root = data.getRoot(); - + System.out.println("Parsing " + wzFileName + "..."); for (MapleDataDirectoryEntry mDir : root.getSubdirectories()) { String dirName = mDir.getName(); - if(dirName.contentEquals("Special")) continue; - + if (dirName.contentEquals("Special")) { + continue; + } + curType = getItemTypeFromDirectoryName(dirName); - if(!dirName.contentEquals("Pet")) { - for(MapleDataFileEntry mFile : mDir.getFiles()) { + if (!dirName.contentEquals("Pet")) { + for (MapleDataFileEntry mFile : mDir.getFiles()) { String fileName = mFile.getName(); MapleData fileData = data.getData(dirName + "/" + fileName); - for(MapleData mData : fileData.getChildren()) { + for (MapleData mData : fileData.getChildren()) { try { int itemId = Integer.parseInt(mData.getName()); itemsWithNoNameProperty.put(itemId, curType); @@ -349,38 +243,38 @@ public class MapleNoItemNameFetcher { } } } - + private static void printReportFileHeader() { printWriter.println(" # Report File autogenerated from the MapleInvalidItemWithNoNameFetcher feature by Ronan Lana."); printWriter.println(" # Generated data takes into account several data info from the server-side WZ.xmls."); printWriter.println(); } - + private static void printReportFileResults() { - if(!itemsWithNoNameProperty.isEmpty()) { + if (!itemsWithNoNameProperty.isEmpty()) { printWriter.println("Itemids with missing 'name' property: "); - + List itemids = new ArrayList<>(itemsWithNoNameProperty.keySet()); Collections.sort(itemids); - - for(Integer itemid : itemids) { + + for (Integer itemid : itemids) { printWriter.println(" " + itemid + " " + itemsWzPath.get(itemid)); } printWriter.println(); } - - if(!equipsWithNoCashProperty.isEmpty()) { + + if (!equipsWithNoCashProperty.isEmpty()) { printWriter.println("Equipids with missing 'cash' property: "); - + List itemids = new ArrayList<>(equipsWithNoCashProperty); Collections.sort(itemids); - - for(Integer itemid : itemids) { + + for (Integer itemid : itemids) { printWriter.println(" " + itemid + " " + itemsWzPath.get(itemid)); } } } - + private static Map> filterMissingItemNames() { List cashList = new ArrayList<>(20); List consList = new ArrayList<>(20); @@ -388,35 +282,18 @@ public class MapleNoItemNameFetcher { List etcList = new ArrayList<>(20); List insList = new ArrayList<>(20); List petList = new ArrayList<>(20); - - for(Entry ids : itemsWithNoNameProperty.entrySet()) { - switch(ids.getValue()) { - case CASH: - cashList.add(ids.getKey()); - break; - - case CONSUME: - consList.add(ids.getKey()); - break; - - case EQP: - eqpList.add(ids.getKey()); - break; - - case ETC: - etcList.add(ids.getKey()); - break; - - case INS: - insList.add(ids.getKey()); - break; - - case PET: - petList.add(ids.getKey()); - break; + + for (Map.Entry ids : itemsWithNoNameProperty.entrySet()) { + switch (ids.getValue()) { + case CASH -> cashList.add(ids.getKey()); + case CONSUME -> consList.add(ids.getKey()); + case EQP -> eqpList.add(ids.getKey()); + case ETC -> etcList.add(ids.getKey()); + case INS -> insList.add(ids.getKey()); + case PET -> petList.add(ids.getKey()); } } - + Map> nameTags = new HashMap<>(); nameTags.put("Cash.img", cashList); nameTags.put("Consume.img", consList); @@ -424,94 +301,94 @@ public class MapleNoItemNameFetcher { nameTags.put("Etc.img", etcList); nameTags.put("Ins.img", insList); nameTags.put("Pet.img", petList); - + return nameTags; } - + private static void printOutputFileHeader() { printWriter.println(" # XML File autogenerated from the MapleInvalidItemWithNoNameFetcher feature by Ronan Lana."); printWriter.println(" # Generated data takes into account several data info from the server-side WZ.xmls."); printWriter.println(); } - + private static String getMissingEquipName(int itemid) { String s = nameContentCache.get(itemid); if (s == null) { s = "MISSING NAME " + itemid; } - + return s; } - + private static String getMissingEquipDesc(int itemid) { String s = descContentCache.get(itemid); if (s == null && itemid >= 2000000) { // thanks Halcyon for noticing "missing info" on equips s = "MISSING INFO " + itemid; } - + return s; } - + private static void writeMissingEquipInfo(Integer itemid) { printWriter.println(" "); - + String s; s = getMissingEquipName(itemid); printWriter.println(" "); - + s = getMissingEquipDesc(itemid); printWriter.println(" "); printWriter.println(" "); } - + private static void writeEquipSubdirectoryHeader(EquipType eType) { printWriter.println(" "); } - + private static void writeEquipSubdirectoryFooter() { printWriter.println(" "); } - + private static void writeEquipXMLHeader() { printWriter.println(" "); } - + private static void writeEquipXMLFooter() { printWriter.println(" "); } - + private static void writeMissingItemInfo(Integer itemid) { printWriter.println(" "); printWriter.println(" "); printWriter.println(" "); printWriter.println(" "); } - + private static void writeXMLHeader(String fileName) { printWriter.println(""); printWriter.println(""); } - + private static void writeXMLFooter() { printWriter.println(""); } - + private static void writeMissingEquipWZNode(EquipType eType, List missingNames) { - if(!missingNames.isEmpty()) { + if (!missingNames.isEmpty()) { Collections.sort(missingNames); writeEquipSubdirectoryHeader(eType); - - for(Integer equipid : missingNames) { + + for (Integer equipid : missingNames) { writeMissingEquipInfo(equipid); } - + writeEquipSubdirectoryFooter(); } } - + private static void writeMissingStringWZNode(String nodePath, List missingNames, boolean isEquip) { - if(!missingNames.isEmpty()) { - if(!isEquip) { + if (!missingNames.isEmpty()) { + if (!isEquip) { Collections.sort(missingNames); printWriter.println(nodePath + ":"); @@ -519,7 +396,7 @@ public class MapleNoItemNameFetcher { writeXMLHeader(nodePath); - for(Integer i : missingNames) { + for (Integer i : missingNames) { writeMissingItemInfo(i); } @@ -528,23 +405,23 @@ public class MapleNoItemNameFetcher { printWriter.println(); } else { int arraySize = EquipType.values().length; - - List equips[] = new List[arraySize]; - for(int i = 0; i < arraySize; i++) { + + List[] equips = new List[arraySize]; + for (int i = 0; i < arraySize; i++) { equips[i] = new ArrayList<>(42); } - - for(Integer itemid : missingNames) { + + for (Integer itemid : missingNames) { equips[equipTypes.get(itemid).ordinal()].add(itemid); } - + printWriter.println(nodePath + ":"); printWriter.println(); writeXMLHeader(nodePath); writeEquipXMLHeader(); - for(EquipType eType : EquipType.values()) { + for (EquipType eType : EquipType.values()) { writeMissingEquipWZNode(eType, equips[eType.ordinal()]); } @@ -555,43 +432,41 @@ public class MapleNoItemNameFetcher { } } } - + private static void writeMissingStringWZNames(Map> missingNames) throws Exception { System.out.println("Writing remaining 'String.wz' names..."); - - printWriter = new PrintWriter(xmlFile, "UTF-8"); + + printWriter = new PrintWriter(OUTPUT_XML_FILE, StandardCharsets.UTF_8); printOutputFileHeader(); - - String nodePaths[] = {"Cash.img", "Consume.img", "Eqp.img", "Etc.img", "Ins.img", "Pet.img"}; - for(int i = 0; i < nodePaths.length; i++) { + + String[] nodePaths = {"Cash.img", "Consume.img", "Eqp.img", "Etc.img", "Ins.img", "Pet.img"}; + for (int i = 0; i < nodePaths.length; i++) { writeMissingStringWZNode(nodePaths[i], missingNames.get(nodePaths[i]), i == 2); } - + printWriter.close(); } - + public static void main(String[] args) { try { - System.setProperty("wzpath", wzPath); - curType = ItemType.EQP; readEquipWZData(); - + curType = ItemType.UNDEF; readItemWZData(); readStringWZData(); // calculates the diff and effectively holds all items with no name property on the WZ - + System.out.println("Reporting results..."); - printWriter = new PrintWriter(newFile, "UTF-8"); + printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); printReportFileHeader(); printReportFileResults(); printWriter.close(); - + Map> missingNames = filterMissingItemNames(); writeMissingStringWZNames(missingNames); - + System.out.println("Done!"); - } catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } diff --git a/tools/MapleInvalidItemWithNoNameFetcher/lib/output.txt b/tools/MapleInvalidItemWithNoNameFetcher/lib/output.txt deleted file mode 100644 index 23b6bf8860..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/lib/output.txt +++ /dev/null @@ -1,803 +0,0 @@ - # XML File autogenerated from the MapleInvalidItemWithNoNameFetcher feature by Ronan Lana. - # Generated data takes into account several data info from the server-side WZ.xmls. - -Cash.img: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Consume.img: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Eqp.img: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Etc.img: - - - - - - - - - - - - - - - - - - - - - -Ins.img: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleInvalidItemWithNoNameFetcher/lib/result.txt b/tools/MapleInvalidItemWithNoNameFetcher/lib/result.txt deleted file mode 100644 index 31340bff2e..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/lib/result.txt +++ /dev/null @@ -1,446 +0,0 @@ - # Report File autogenerated from the MapleInvalidItemWithNoNameFetcher feature by Ronan Lana. - # Generated data takes into account several data info from the server-side WZ.xmls. - -Itemids with missing 'name' property: - 30105 Character.wz/Hair/00030105.img - 30106 Character.wz/Hair/00030106.img - 30107 Character.wz/Hair/00030107.img - 30928 Character.wz/Hair/00030928.img - 30929 Character.wz/Hair/00030929.img - 31660 Character.wz/Hair/00031660.img - 31661 Character.wz/Hair/00031661.img - 31662 Character.wz/Hair/00031662.img - 31663 Character.wz/Hair/00031663.img - 31664 Character.wz/Hair/00031664.img - 31665 Character.wz/Hair/00031665.img - 31666 Character.wz/Hair/00031666.img - 31667 Character.wz/Hair/00031667.img - 33101 Character.wz/Hair/00033101.img - 1012133 Character.wz/Accessory/01012133.img - 1050148 Character.wz/Longcoat/01050148.img - 1051130 Character.wz/Longcoat/01051130.img - 1051176 Character.wz/Longcoat/01051176.img - 1052186 Character.wz/Longcoat/01052186.img - 1052217 Character.wz/Longcoat/01052217.img - 1052224 Character.wz/Longcoat/01052224.img - 1052228 Character.wz/Longcoat/01052228.img - 1082262 Character.wz/Glove/01082262.img - 1092067 Character.wz/Shield/01092067.img - 1142143 Character.wz/Accessory/01142143.img - 1142144 Character.wz/Accessory/01142144.img - 1142145 Character.wz/Accessory/01142145.img - 1142149 Character.wz/Accessory/01142149.img - 1142150 Character.wz/Accessory/01142150.img - 1142151 Character.wz/Accessory/01142151.img - 1142165 Character.wz/Accessory/01142165.img - 1302048 Character.wz/Weapon/01302048.img - 1302124 Character.wz/Weapon/01302124.img - 1302125 Character.wz/Weapon/01302125.img - 1302126 Character.wz/Weapon/01302126.img - 1312035 Character.wz/Weapon/01312035.img - 1312046 Character.wz/Weapon/01312046.img - 1322074 Character.wz/Weapon/01322074.img - 1332093 Character.wz/Weapon/01332093.img - 1332094 Character.wz/Weapon/01332094.img - 1332095 Character.wz/Weapon/01332095.img - 1372026 Character.wz/Weapon/01372026.img - 1372056 Character.wz/Weapon/01372056.img - 1382074 Character.wz/Weapon/01382074.img - 1382075 Character.wz/Weapon/01382075.img - 1382076 Character.wz/Weapon/01382076.img - 1392000 Character.wz/Weapon/01392000.img - 1402043 Character.wz/Weapon/01402043.img - 1402068 Character.wz/Weapon/01402068.img - 1412043 Character.wz/Weapon/01412043.img - 1412044 Character.wz/Weapon/01412044.img - 1422035 Character.wz/Weapon/01422035.img - 1422046 Character.wz/Weapon/01422046.img - 1422047 Character.wz/Weapon/01422047.img - 1432029 Character.wz/Weapon/01432029.img - 1432058 Character.wz/Weapon/01432058.img - 1432059 Character.wz/Weapon/01432059.img - 1442059 Character.wz/Weapon/01442059.img - 1442083 Character.wz/Weapon/01442083.img - 1442084 Character.wz/Weapon/01442084.img - 1452037 Character.wz/Weapon/01452037.img - 1452058 Character.wz/Weapon/01452058.img - 1452077 Character.wz/Weapon/01452077.img - 1452078 Character.wz/Weapon/01452078.img - 1452079 Character.wz/Weapon/01452079.img - 1462069 Character.wz/Weapon/01462069.img - 1462070 Character.wz/Weapon/01462070.img - 1462071 Character.wz/Weapon/01462071.img - 1472044 Character.wz/Weapon/01472044.img - 1472093 Character.wz/Weapon/01472093.img - 1472094 Character.wz/Weapon/01472094.img - 1472095 Character.wz/Weapon/01472095.img - 1482041 Character.wz/Weapon/01482041.img - 1482042 Character.wz/Weapon/01482042.img - 1482043 Character.wz/Weapon/01482043.img - 1492042 Character.wz/Weapon/01492042.img - 1492043 Character.wz/Weapon/01492043.img - 1492044 Character.wz/Weapon/01492044.img - 1802039 Character.wz/PetEquip/01802039.img - 1802056 Character.wz/PetEquip/01802056.img - 1902040 Character.wz/TamingMob/01902040.img - 1902041 Character.wz/TamingMob/01902041.img - 1902042 Character.wz/TamingMob/01902042.img - 1912033 Character.wz/TamingMob/01912033.img - 1912034 Character.wz/TamingMob/01912034.img - 1912035 Character.wz/TamingMob/01912035.img - 1932000 Character.wz/TamingMob/01932000.img - 1932001 Character.wz/TamingMob/01932001.img - 1932002 Character.wz/TamingMob/01932002.img - 1932003 Character.wz/TamingMob/01932003.img - 1932004 Character.wz/TamingMob/01932004.img - 1932005 Character.wz/TamingMob/01932005.img - 1932010 Character.wz/TamingMob/01932010.img - 1932012 Character.wz/TamingMob/01932012.img - 2022303 Item.wz/Consume/0202.img - 2100141 Item.wz/Consume/0210.img - 2100142 Item.wz/Consume/0210.img - 2100143 Item.wz/Consume/0210.img - 2100144 Item.wz/Consume/0210.img - 2100145 Item.wz/Consume/0210.img - 2100146 Item.wz/Consume/0210.img - 2100147 Item.wz/Consume/0210.img - 2100148 Item.wz/Consume/0210.img - 2100149 Item.wz/Consume/0210.img - 2100150 Item.wz/Consume/0210.img - 2100151 Item.wz/Consume/0210.img - 2100166 Item.wz/Consume/0210.img - 2100901 Item.wz/Consume/0210.img - 2100902 Item.wz/Consume/0210.img - 2100903 Item.wz/Consume/0210.img - 2100904 Item.wz/Consume/0210.img - 2101149 Item.wz/Consume/0210.img - 2101150 Item.wz/Consume/0210.img - 2280020 Item.wz/Consume/0228.img - 2280021 Item.wz/Consume/0228.img - 2280022 Item.wz/Consume/0228.img - 2280023 Item.wz/Consume/0228.img - 2280024 Item.wz/Consume/0228.img - 2280025 Item.wz/Consume/0228.img - 3010022 Item.wz/Install/0301.img - 3010023 Item.wz/Install/0301.img - 3010024 Item.wz/Install/0301.img - 3010026 Item.wz/Install/0301.img - 3010028 Item.wz/Install/0301.img - 3994119 Item.wz/Install/0399.img - 3994142 Item.wz/Install/0399.img - 3994143 Item.wz/Install/0399.img - 3994144 Item.wz/Install/0399.img - 3994145 Item.wz/Install/0399.img - 3994146 Item.wz/Install/0399.img - 3994147 Item.wz/Install/0399.img - 3994148 Item.wz/Install/0399.img - 3994149 Item.wz/Install/0399.img - 3994150 Item.wz/Install/0399.img - 3994151 Item.wz/Install/0399.img - 3994152 Item.wz/Install/0399.img - 3994153 Item.wz/Install/0399.img - 3994154 Item.wz/Install/0399.img - 3994155 Item.wz/Install/0399.img - 3994156 Item.wz/Install/0399.img - 3994157 Item.wz/Install/0399.img - 3994158 Item.wz/Install/0399.img - 3994159 Item.wz/Install/0399.img - 3994160 Item.wz/Install/0399.img - 3994161 Item.wz/Install/0399.img - 3994162 Item.wz/Install/0399.img - 3994163 Item.wz/Install/0399.img - 3994164 Item.wz/Install/0399.img - 3994165 Item.wz/Install/0399.img - 3994166 Item.wz/Install/0399.img - 3994167 Item.wz/Install/0399.img - 3994168 Item.wz/Install/0399.img - 3994169 Item.wz/Install/0399.img - 3994170 Item.wz/Install/0399.img - 3994171 Item.wz/Install/0399.img - 3994172 Item.wz/Install/0399.img - 3994173 Item.wz/Install/0399.img - 3994174 Item.wz/Install/0399.img - 3994175 Item.wz/Install/0399.img - 3994176 Item.wz/Install/0399.img - 3994177 Item.wz/Install/0399.img - 3994178 Item.wz/Install/0399.img - 3994179 Item.wz/Install/0399.img - 3994180 Item.wz/Install/0399.img - 4161049 Item.wz/Etc/0416.img - 4161050 Item.wz/Etc/0416.img - 4161051 Item.wz/Etc/0416.img - 4161999 Item.wz/Etc/0416.img - 5120033 Item.wz/Cash/0512.img - 5121011 Item.wz/Cash/0512.img - 5121012 Item.wz/Cash/0512.img - 5121013 Item.wz/Cash/0512.img - 5121022 Item.wz/Cash/0512.img - 5152049 Item.wz/Cash/0515.img - 5152050 Item.wz/Cash/0515.img - 5190007 Item.wz/Cash/0519.img - 5190008 Item.wz/Cash/0519.img - 5280000 Item.wz/Cash/0528.img - 5500005 Item.wz/Cash/0550.img - 5500006 Item.wz/Cash/0550.img - 5530001 Item.wz/Cash/0553.img - 5530002 Item.wz/Cash/0553.img - 5530003 Item.wz/Cash/0553.img - 5530004 Item.wz/Cash/0553.img - 5530005 Item.wz/Cash/0553.img - 5530006 Item.wz/Cash/0553.img - 5530007 Item.wz/Cash/0553.img - 5530008 Item.wz/Cash/0553.img - -Equipids with missing 'cash' property: - 30010 Character.wz/Hair/00030010.img - 30020 Character.wz/Hair/00030020.img - 30021 Character.wz/Hair/00030021.img - 30022 Character.wz/Hair/00030022.img - 30023 Character.wz/Hair/00030023.img - 30024 Character.wz/Hair/00030024.img - 30025 Character.wz/Hair/00030025.img - 30026 Character.wz/Hair/00030026.img - 30027 Character.wz/Hair/00030027.img - 30030 Character.wz/Hair/00030030.img - 30031 Character.wz/Hair/00030031.img - 30032 Character.wz/Hair/00030032.img - 30100 Character.wz/Hair/00030100.img - 30101 Character.wz/Hair/00030101.img - 30102 Character.wz/Hair/00030102.img - 30103 Character.wz/Hair/00030103.img - 30104 Character.wz/Hair/00030104.img - 30105 Character.wz/Hair/00030105.img - 30106 Character.wz/Hair/00030106.img - 30107 Character.wz/Hair/00030107.img - 30150 Character.wz/Hair/00030150.img - 30151 Character.wz/Hair/00030151.img - 30152 Character.wz/Hair/00030152.img - 30153 Character.wz/Hair/00030153.img - 30154 Character.wz/Hair/00030154.img - 30155 Character.wz/Hair/00030155.img - 30156 Character.wz/Hair/00030156.img - 30157 Character.wz/Hair/00030157.img - 30160 Character.wz/Hair/00030160.img - 30161 Character.wz/Hair/00030161.img - 30162 Character.wz/Hair/00030162.img - 30163 Character.wz/Hair/00030163.img - 30164 Character.wz/Hair/00030164.img - 30165 Character.wz/Hair/00030165.img - 30166 Character.wz/Hair/00030166.img - 30167 Character.wz/Hair/00030167.img - 30170 Character.wz/Hair/00030170.img - 30171 Character.wz/Hair/00030171.img - 30172 Character.wz/Hair/00030172.img - 30173 Character.wz/Hair/00030173.img - 30174 Character.wz/Hair/00030174.img - 30175 Character.wz/Hair/00030175.img - 30176 Character.wz/Hair/00030176.img - 30177 Character.wz/Hair/00030177.img - 30440 Character.wz/Hair/00030440.img - 30441 Character.wz/Hair/00030441.img - 30442 Character.wz/Hair/00030442.img - 30443 Character.wz/Hair/00030443.img - 30444 Character.wz/Hair/00030444.img - 30445 Character.wz/Hair/00030445.img - 30446 Character.wz/Hair/00030446.img - 30447 Character.wz/Hair/00030447.img - 30610 Character.wz/Hair/00030610.img - 30611 Character.wz/Hair/00030611.img - 30612 Character.wz/Hair/00030612.img - 30613 Character.wz/Hair/00030613.img - 30614 Character.wz/Hair/00030614.img - 30615 Character.wz/Hair/00030615.img - 30616 Character.wz/Hair/00030616.img - 30617 Character.wz/Hair/00030617.img - 30740 Character.wz/Hair/00030740.img - 30741 Character.wz/Hair/00030741.img - 30742 Character.wz/Hair/00030742.img - 30743 Character.wz/Hair/00030743.img - 30744 Character.wz/Hair/00030744.img - 30745 Character.wz/Hair/00030745.img - 30746 Character.wz/Hair/00030746.img - 30747 Character.wz/Hair/00030747.img - 30750 Character.wz/Hair/00030750.img - 30751 Character.wz/Hair/00030751.img - 30752 Character.wz/Hair/00030752.img - 30753 Character.wz/Hair/00030753.img - 30754 Character.wz/Hair/00030754.img - 30755 Character.wz/Hair/00030755.img - 30756 Character.wz/Hair/00030756.img - 30757 Character.wz/Hair/00030757.img - 30920 Character.wz/Hair/00030920.img - 30921 Character.wz/Hair/00030921.img - 30922 Character.wz/Hair/00030922.img - 30923 Character.wz/Hair/00030923.img - 30924 Character.wz/Hair/00030924.img - 30925 Character.wz/Hair/00030925.img - 30926 Character.wz/Hair/00030926.img - 30927 Character.wz/Hair/00030927.img - 31020 Character.wz/Hair/00031020.img - 31021 Character.wz/Hair/00031021.img - 31022 Character.wz/Hair/00031022.img - 31023 Character.wz/Hair/00031023.img - 31024 Character.wz/Hair/00031024.img - 31025 Character.wz/Hair/00031025.img - 31026 Character.wz/Hair/00031026.img - 31027 Character.wz/Hair/00031027.img - 31030 Character.wz/Hair/00031030.img - 31031 Character.wz/Hair/00031031.img - 31032 Character.wz/Hair/00031032.img - 31033 Character.wz/Hair/00031033.img - 31034 Character.wz/Hair/00031034.img - 31035 Character.wz/Hair/00031035.img - 31036 Character.wz/Hair/00031036.img - 31037 Character.wz/Hair/00031037.img - 31040 Character.wz/Hair/00031040.img - 31041 Character.wz/Hair/00031041.img - 31042 Character.wz/Hair/00031042.img - 31043 Character.wz/Hair/00031043.img - 31044 Character.wz/Hair/00031044.img - 31045 Character.wz/Hair/00031045.img - 31046 Character.wz/Hair/00031046.img - 31047 Character.wz/Hair/00031047.img - 31050 Character.wz/Hair/00031050.img - 31051 Character.wz/Hair/00031051.img - 31052 Character.wz/Hair/00031052.img - 31053 Character.wz/Hair/00031053.img - 31054 Character.wz/Hair/00031054.img - 31055 Character.wz/Hair/00031055.img - 31056 Character.wz/Hair/00031056.img - 31057 Character.wz/Hair/00031057.img - 31060 Character.wz/Hair/00031060.img - 31061 Character.wz/Hair/00031061.img - 31062 Character.wz/Hair/00031062.img - 31063 Character.wz/Hair/00031063.img - 31064 Character.wz/Hair/00031064.img - 31065 Character.wz/Hair/00031065.img - 31066 Character.wz/Hair/00031066.img - 31067 Character.wz/Hair/00031067.img - 31070 Character.wz/Hair/00031070.img - 31071 Character.wz/Hair/00031071.img - 31072 Character.wz/Hair/00031072.img - 31073 Character.wz/Hair/00031073.img - 31074 Character.wz/Hair/00031074.img - 31075 Character.wz/Hair/00031075.img - 31076 Character.wz/Hair/00031076.img - 31077 Character.wz/Hair/00031077.img - 31080 Character.wz/Hair/00031080.img - 31081 Character.wz/Hair/00031081.img - 31082 Character.wz/Hair/00031082.img - 31083 Character.wz/Hair/00031083.img - 31084 Character.wz/Hair/00031084.img - 31085 Character.wz/Hair/00031085.img - 31086 Character.wz/Hair/00031086.img - 31087 Character.wz/Hair/00031087.img - 31100 Character.wz/Hair/00031100.img - 31101 Character.wz/Hair/00031101.img - 31102 Character.wz/Hair/00031102.img - 31103 Character.wz/Hair/00031103.img - 31104 Character.wz/Hair/00031104.img - 31105 Character.wz/Hair/00031105.img - 31106 Character.wz/Hair/00031106.img - 31107 Character.wz/Hair/00031107.img - 31130 Character.wz/Hair/00031130.img - 31131 Character.wz/Hair/00031131.img - 31132 Character.wz/Hair/00031132.img - 31133 Character.wz/Hair/00031133.img - 31134 Character.wz/Hair/00031134.img - 31135 Character.wz/Hair/00031135.img - 31136 Character.wz/Hair/00031136.img - 31137 Character.wz/Hair/00031137.img - 31140 Character.wz/Hair/00031140.img - 31141 Character.wz/Hair/00031141.img - 31142 Character.wz/Hair/00031142.img - 31143 Character.wz/Hair/00031143.img - 31144 Character.wz/Hair/00031144.img - 31145 Character.wz/Hair/00031145.img - 31146 Character.wz/Hair/00031146.img - 31147 Character.wz/Hair/00031147.img - 31230 Character.wz/Hair/00031230.img - 31231 Character.wz/Hair/00031231.img - 31232 Character.wz/Hair/00031232.img - 31233 Character.wz/Hair/00031233.img - 31234 Character.wz/Hair/00031234.img - 31235 Character.wz/Hair/00031235.img - 31236 Character.wz/Hair/00031236.img - 31237 Character.wz/Hair/00031237.img - 31240 Character.wz/Hair/00031240.img - 31241 Character.wz/Hair/00031241.img - 31242 Character.wz/Hair/00031242.img - 31243 Character.wz/Hair/00031243.img - 31244 Character.wz/Hair/00031244.img - 31245 Character.wz/Hair/00031245.img - 31246 Character.wz/Hair/00031246.img - 31247 Character.wz/Hair/00031247.img - 31260 Character.wz/Hair/00031260.img - 31261 Character.wz/Hair/00031261.img - 31262 Character.wz/Hair/00031262.img - 31263 Character.wz/Hair/00031263.img - 31264 Character.wz/Hair/00031264.img - 31265 Character.wz/Hair/00031265.img - 31266 Character.wz/Hair/00031266.img - 31267 Character.wz/Hair/00031267.img - 31310 Character.wz/Hair/00031310.img - 31311 Character.wz/Hair/00031311.img - 31312 Character.wz/Hair/00031312.img - 31313 Character.wz/Hair/00031313.img - 31314 Character.wz/Hair/00031314.img - 31315 Character.wz/Hair/00031315.img - 31316 Character.wz/Hair/00031316.img - 31317 Character.wz/Hair/00031317.img - 31350 Character.wz/Hair/00031350.img - 31351 Character.wz/Hair/00031351.img - 31352 Character.wz/Hair/00031352.img - 31353 Character.wz/Hair/00031353.img - 31354 Character.wz/Hair/00031354.img - 31355 Character.wz/Hair/00031355.img - 31356 Character.wz/Hair/00031356.img - 31357 Character.wz/Hair/00031357.img - 31400 Character.wz/Hair/00031400.img - 31401 Character.wz/Hair/00031401.img - 31402 Character.wz/Hair/00031402.img - 31403 Character.wz/Hair/00031403.img - 31404 Character.wz/Hair/00031404.img - 31405 Character.wz/Hair/00031405.img - 31406 Character.wz/Hair/00031406.img - 31407 Character.wz/Hair/00031407.img - 31440 Character.wz/Hair/00031440.img - 31441 Character.wz/Hair/00031441.img - 31442 Character.wz/Hair/00031442.img - 31443 Character.wz/Hair/00031443.img - 31444 Character.wz/Hair/00031444.img - 31445 Character.wz/Hair/00031445.img - 31446 Character.wz/Hair/00031446.img - 31447 Character.wz/Hair/00031447.img - 31450 Character.wz/Hair/00031450.img - 31451 Character.wz/Hair/00031451.img - 31452 Character.wz/Hair/00031452.img - 31453 Character.wz/Hair/00031453.img - 31454 Character.wz/Hair/00031454.img - 31455 Character.wz/Hair/00031455.img - 31456 Character.wz/Hair/00031456.img - 31457 Character.wz/Hair/00031457.img - 31490 Character.wz/Hair/00031490.img - 31491 Character.wz/Hair/00031491.img - 31492 Character.wz/Hair/00031492.img - 31493 Character.wz/Hair/00031493.img - 31494 Character.wz/Hair/00031494.img - 31495 Character.wz/Hair/00031495.img - 31496 Character.wz/Hair/00031496.img - 31497 Character.wz/Hair/00031497.img - 31660 Character.wz/Hair/00031660.img - 31661 Character.wz/Hair/00031661.img - 31662 Character.wz/Hair/00031662.img - 31663 Character.wz/Hair/00031663.img - 31664 Character.wz/Hair/00031664.img - 31665 Character.wz/Hair/00031665.img - 31666 Character.wz/Hair/00031666.img - 31667 Character.wz/Hair/00031667.img - 1932000 Character.wz/TamingMob/01932000.img - 1932001 Character.wz/TamingMob/01932001.img - 1932002 Character.wz/TamingMob/01932002.img - 1932003 Character.wz/TamingMob/01932003.img - 1932004 Character.wz/TamingMob/01932004.img - 1932005 Character.wz/TamingMob/01932005.img - 1932010 Character.wz/TamingMob/01932010.img - 1932012 Character.wz/TamingMob/01932012.img diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/maplenoitemnamefetcher/Pair.java b/tools/MapleInvalidItemWithNoNameFetcher/src/maplenoitemnamefetcher/Pair.java deleted file mode 100644 index edf3425f22..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/maplenoitemnamefetcher/Pair.java +++ /dev/null @@ -1,121 +0,0 @@ -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 ~ 2010 Patrick Huy -Matthias Butz -Jan Christian Meyer - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License version 3 -as published by the Free Software Foundation. You may not use, modify -or distribute this program under any other version of the -GNU Affero General Public License. - -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 . - */ -package maplenoitemnamefetcher; - -/** - * Represents a pair of values. - * - * @author Frz - * @since Revision 333 - * @version 1.0 - * - * @param The type of the left value. - * @param The type of the right value. - */ -public class Pair { - - public E left; - public F right; - - /** - * Class constructor - pairs two objects together. - * - * @param left The left object. - * @param right The right object. - */ - public Pair(E left, F right) { - this.left = left; - this.right = right; - } - - /** - * Gets the left value. - * - * @return The left value. - */ - public E getLeft() { - return left; - } - - /** - * Gets the right value. - * - * @return The right value. - */ - public F getRight() { - return right; - } - - /** - * Turns the pair into a string. - * - * @return Each value of the pair as a string joined with a colon. - */ - @Override - public String toString() { - return left.toString() + ":" + right.toString(); - } - - /** - * Gets the hash code of this pair. - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((left == null) ? 0 : left.hashCode()); - result = prime * result + ((right == null) ? 0 : right.hashCode()); - return result; - } - - /** - * Checks to see if two pairs are equal. - */ - @SuppressWarnings("unchecked") - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Pair other = (Pair) obj; - if (left == null) { - if (other.left != null) { - return false; - } - } else if (!left.equals(other.left)) { - return false; - } - if (right == null) { - if (other.right != null) { - return false; - } - } else if (!right.equals(other.right)) { - return false; - } - return true; - } -} \ No newline at end of file diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleCanvas.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleCanvas.java deleted file mode 100644 index 10ab682196..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleCanvas.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.awt.image.BufferedImage; - -public interface MapleCanvas { - int getHeight(); - int getWidth(); - BufferedImage getImage(); -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleData.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleData.java deleted file mode 100644 index 4d90a93804..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleData.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.util.List; -import provider.wz.MapleDataType; - -public interface MapleData extends MapleDataEntity, Iterable { - @Override - public String getName(); - public MapleDataType getType(); - public List getChildren(); - public MapleData getChildByPath(String path); - public Object getData(); -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataDirectoryEntry.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataDirectoryEntry.java deleted file mode 100644 index cb043e0c94..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataDirectoryEntry.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.util.List; - -/** - * - * @author Matze - */ -public interface MapleDataDirectoryEntry extends MapleDataEntry { - public List getSubdirectories(); - public List getFiles(); - public MapleDataEntry getEntry(String name); -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataEntity.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataEntity.java deleted file mode 100644 index 03ff77649c..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataEntity.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataEntity { - public String getName(); - public MapleDataEntity getParent(); -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataEntry.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataEntry.java deleted file mode 100644 index 62db6d0abe..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataEntry.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataEntry extends MapleDataEntity { - public String getName(); - public int getSize(); - public int getChecksum(); - public int getOffset(); -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataFileEntry.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataFileEntry.java deleted file mode 100644 index 902130a612..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataFileEntry.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataFileEntry extends MapleDataEntry { - public void setOffset(int offset); -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataProvider.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataProvider.java deleted file mode 100644 index 5237b7ac37..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataProvider.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -public interface MapleDataProvider { - MapleData getData(String path); - MapleDataDirectoryEntry getRoot(); -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataProviderFactory.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataProviderFactory.java deleted file mode 100644 index 14753d4406..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataProviderFactory.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.io.File; -import java.io.IOException; -import provider.wz.WZFile; -import provider.wz.XMLWZFile; - -public class MapleDataProviderFactory { - private final static String wzPath = System.getProperty("wzpath"); - - private static MapleDataProvider getWZ(File in, boolean provideImages) { - if (in.getName().toLowerCase().endsWith("wz") && !in.isDirectory()) { - try { - return new WZFile(in, provideImages); - } catch (IOException e) { - throw new RuntimeException("Loading WZ File failed", e); - } - } else { - return new XMLWZFile(in); - } - } - - public static MapleDataProvider getDataProvider(File in) { - return getWZ(in, false); - } - - public static MapleDataProvider getImageProvidingDataProvider(File in) { - return getWZ(in, true); - } - - public static File fileInWZPath(String filename) { - return new File(wzPath, filename); - } -} \ No newline at end of file diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataTool.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataTool.java deleted file mode 100644 index 25f4c7f817..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/MapleDataTool.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.awt.Point; -import java.awt.image.BufferedImage; -import provider.wz.MapleDataType; - -public class MapleDataTool { - public static String getString(MapleData data) { - return ((String) data.getData()); - } - - public static String getString(MapleData data, String def) { - if (data == null || data.getData() == null) { - return def; - } else { - return ((String) data.getData()); - } - } - - public static String getString(String path, MapleData data) { - return getString(data.getChildByPath(path)); - } - - public static String getString(String path, MapleData data, String def) { - return getString(data.getChildByPath(path), def); - } - - public static double getDouble(MapleData data) { - return ((Double) data.getData()).doubleValue(); - } - - public static float getFloat(MapleData data) { - return ((Float) data.getData()).floatValue(); - } - - public static int getInt(MapleData data) { - if (data == null || data.getData() == null) { - return 0;// DEF? - } - return ((Integer) data.getData()).intValue(); - } - - public static int getInt(String path, MapleData data) { - return getInt(data.getChildByPath(path)); - } - - public static int getIntConvert(MapleData data) { - if (data.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(data)); - } else { - return getInt(data); - } - } - - public static int getIntConvert(String path, MapleData data) { - MapleData d = data.getChildByPath(path); - if (d.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(d)); - } else { - return getInt(d); - } - } - - public static int getInt(MapleData data, int def) { - if (data == null || data.getData() == null) { - return def; - } else if (data.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(data)); - } else { - return ((Integer) data.getData()).intValue(); - } - } - - public static int getInt(String path, MapleData data, int def) { - return getInt(data.getChildByPath(path), def); - } - - public static int getIntConvert(String path, MapleData data, int def) { - MapleData d = data.getChildByPath(path); - if (d == null) { - return def; - } - if (d.getType() == MapleDataType.STRING) { - try { - return Integer.parseInt(getString(d)); - } catch (NumberFormatException nfe) { - nfe.printStackTrace(); - return def; - } - } else { - return getInt(d, def); - } - } - - public static BufferedImage getImage(MapleData data) { - return ((MapleCanvas) data.getData()).getImage(); - } - - public static Point getPoint(MapleData data) { - return ((Point) data.getData()); - } - - public static Point getPoint(String path, MapleData data) { - return getPoint(data.getChildByPath(path)); - } - - public static Point getPoint(String path, MapleData data, Point def) { - final MapleData pointData = data.getChildByPath(path); - if (pointData == null) { - return def; - } - return getPoint(pointData); - } - - public static String getFullDataPath(MapleData data) { - String path = ""; - MapleDataEntity myData = data; - while (myData != null) { - path = myData.getName() + "/" + path; - myData = myData.getParent(); - } - return path.substring(0, path.length() - 1); - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/FileStoredPngMapleCanvas.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/FileStoredPngMapleCanvas.java deleted file mode 100644 index 21736c2c16..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/FileStoredPngMapleCanvas.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import javax.imageio.ImageIO; -import provider.MapleCanvas; - -public class FileStoredPngMapleCanvas implements MapleCanvas { - private File file; - private int width; - private int height; - private BufferedImage image; - - public FileStoredPngMapleCanvas(int width, int height, File fileIn) { - this.width = width; - this.height = height; - this.file = fileIn; - } - - @Override - public int getHeight() { - return height; - } - - @Override - public int getWidth() { - return width; - } - - @Override - public BufferedImage getImage() { - loadImageIfNecessary(); - return image; - } - - private void loadImageIfNecessary() { - if (image == null) { - try { - image = ImageIO.read(file); - // replace the dimensions loaded from the wz by the REAL dimensions from the image - should be equal tho - width = image.getWidth(); - height = image.getHeight(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/ImgMapleSound.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/ImgMapleSound.java deleted file mode 100644 index 8add2ccb36..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/ImgMapleSound.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -public class ImgMapleSound { - private int dataLength, offset; - - public ImgMapleSound(int dataLength, int offset) { - this.dataLength = dataLength; - this.offset = offset; - } - - public int getDataLength() { - return dataLength; - } - - public int getOffset() { - return offset; - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/ListWZFile.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/ListWZFile.java deleted file mode 100644 index 1672a08c59..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/ListWZFile.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import provider.MapleDataProviderFactory; -import tools.data.input.GenericLittleEndianAccessor; -import tools.data.input.InputStreamByteStream; -import tools.data.input.LittleEndianAccessor; - -public class ListWZFile { - private LittleEndianAccessor lea; - private List entries = new ArrayList(); - private static Collection modernImgs = new HashSet(); - - public static byte[] xorBytes(byte[] a, byte[] b) { - byte[] wusched = new byte[a.length]; - for (int i = 0; i < a.length; i++) { - wusched[i] = (byte) (a[i] ^ b[i]); - } - return wusched; - } - - public ListWZFile(File listwz) throws FileNotFoundException { - lea = new GenericLittleEndianAccessor(new InputStreamByteStream(new BufferedInputStream(new FileInputStream(listwz)))); - while (lea.available() > 0) { - int l = lea.readInt() * 2; - byte[] chunk = new byte[l]; - for (int i = 0; i < chunk.length; i++) { - chunk[i] = lea.readByte(); - } - lea.readChar(); - final String value = String.valueOf(WZTool.readListString(chunk)); - entries.add(value); - } - entries = Collections.unmodifiableList(entries); - } - - public List getEntries() { - return entries; - } - - public static void init() { - final String listWz = System.getProperty("listwz"); - if (listWz != null) { - ListWZFile listwz; - try { - listwz = new ListWZFile(MapleDataProviderFactory.fileInWZPath("List.wz")); - modernImgs = new HashSet(listwz.getEntries()); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - } - - public static boolean isModernImgFile(String path) { - return modernImgs.contains(path); - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/MapleDataType.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/MapleDataType.java deleted file mode 100644 index e074d57d14..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/MapleDataType.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -public enum MapleDataType { - NONE, IMG_0x00, SHORT, INT, FLOAT, DOUBLE, STRING, EXTENDED, PROPERTY, CANVAS, VECTOR, CONVEX, SOUND, UOL, UNKNOWN_TYPE, UNKNOWN_EXTENDED_TYPE; -} \ No newline at end of file diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/PNGMapleCanvas.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/PNGMapleCanvas.java deleted file mode 100644 index 97c2303804..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/PNGMapleCanvas.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.Point; -import java.awt.image.BufferedImage; -import java.awt.image.DataBuffer; -import java.awt.image.DataBufferByte; -import java.awt.image.PixelInterleavedSampleModel; -import java.awt.image.Raster; -import java.awt.image.SampleModel; -import java.awt.image.WritableRaster; -import java.util.zip.DataFormatException; -import java.util.zip.Inflater; -import provider.MapleCanvas; - -public class PNGMapleCanvas implements MapleCanvas { - private static final int[] ZAHLEN = new int[]{2, 1, 0, 3}; - private int height; - private int width; - private int dataLength; - private int format; - private byte[] data; - - public PNGMapleCanvas(int width, int height, int dataLength, int format, byte[] data) { - super(); - this.height = height; - this.width = width; - this.dataLength = dataLength; - this.format = format; - this.data = data; - } - - public int getHeight() { - return height; - } - - public int getWidth() { - return width; - } - - public int getFormat() { - return format; - } - - private byte[] getData() { - return data; - } - - @Override - public BufferedImage getImage() { - int sizeUncompressed = 0; - int size8888 = 0; - int maxWriteBuf = 2; - int maxHeight = 3; - byte[] writeBuf = new byte[maxWriteBuf]; - @SuppressWarnings ("unused") - byte[] rowPointers = new byte[maxHeight]; - switch (getFormat()) { - case 1: - case 513: - sizeUncompressed = getHeight() * getWidth() * 4; - break; - case 2: - sizeUncompressed = getHeight() * getWidth() * 8; - break; - case 517: - sizeUncompressed = getHeight() * getWidth() / 128; - break; - } - size8888 = getHeight() * getWidth() * 8; - if (size8888 > maxWriteBuf) { - maxWriteBuf = size8888; - writeBuf = new byte[maxWriteBuf]; - } - if (getHeight() > maxHeight) { - maxHeight = getHeight(); - rowPointers = new byte[maxHeight]; - } - Inflater dec = new Inflater(); - dec.setInput(getData(), 0, dataLength); - int declen = 0; - byte[] uc = new byte[sizeUncompressed]; - try { - declen = dec.inflate(uc); - } catch (DataFormatException ex) { - throw new RuntimeException("zlib fucks", ex); - } - dec.end(); - if (getFormat() == 1) { - for (int i = 0; i < sizeUncompressed; i++) { - byte low = (byte) (uc[i] & 0x0F); - byte high = (byte) (uc[i] & 0xF0); - writeBuf[(i << 1)] = (byte) (((low << 4) | low) & 0xFF); - writeBuf[(i << 1) + 1] = (byte) (high | ((high >>> 4) & 0xF)); - } - } else if (getFormat() == 2) { - writeBuf = uc; - } else if (getFormat() == 513) { - for (int i = 0; i < declen; i += 2) { - byte bBits = (byte) ((uc[i] & 0x1F) << 3); - byte gBits = (byte) (((uc[i + 1] & 0x07) << 5) | ((uc[i] & 0xE0) >> 3)); - byte rBits = (byte) (uc[i + 1] & 0xF8); - writeBuf[(i << 1)] = (byte) (bBits | (bBits >> 5)); - writeBuf[(i << 1) + 1] = (byte) (gBits | (gBits >> 6)); - writeBuf[(i << 1) + 2] = (byte) (rBits | (rBits >> 5)); - writeBuf[(i << 1) + 3] = (byte) 0xFF; - } - } else if (getFormat() == 517) { - byte b = 0x00; - int pixelIndex = 0; - for (int i = 0; i < declen; i++) { - for (int j = 0; j < 8; j++) { - b = (byte) (((uc[i] & (0x01 << (7 - j))) >> (7 - j)) * 255); - for (int k = 0; k < 16; k++) { - pixelIndex = (i << 9) + (j << 6) + k * 2; - writeBuf[pixelIndex] = b; - writeBuf[pixelIndex + 1] = b; - writeBuf[pixelIndex + 2] = b; - writeBuf[pixelIndex + 3] = (byte) 0xFF; - } - } - } - } - DataBufferByte imgData = new DataBufferByte(writeBuf, sizeUncompressed); - SampleModel sm = new PixelInterleavedSampleModel(DataBuffer.TYPE_BYTE, getWidth(), getHeight(), 4, getWidth() * 4, ZAHLEN); - WritableRaster imgRaster = Raster.createWritableRaster(sm, imgData, new Point(0, 0)); - BufferedImage aa = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); - aa.setData(imgRaster); - return aa; - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZDirectoryEntry.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZDirectoryEntry.java deleted file mode 100644 index d24b8cb2b9..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZDirectoryEntry.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataEntity; -import provider.MapleDataEntry; -import provider.MapleDataFileEntry; - -public class WZDirectoryEntry extends WZEntry implements MapleDataDirectoryEntry { - private List subdirs = new ArrayList(); - private List files = new ArrayList(); - private Map entries = new HashMap(); - - public WZDirectoryEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(name, size, checksum, parent); - } - - public WZDirectoryEntry() { - super(null, 0, 0, null); - } - - public void addDirectory(MapleDataDirectoryEntry dir) { - subdirs.add(dir); - entries.put(dir.getName(), dir); - } - - public void addFile(MapleDataFileEntry fileEntry) { - files.add(fileEntry); - entries.put(fileEntry.getName(), fileEntry); - } - - public List getSubdirectories() { - return Collections.unmodifiableList(subdirs); - } - - public List getFiles() { - return Collections.unmodifiableList(files); - } - - public MapleDataEntry getEntry(String name) { - return entries.get(name); - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZEntry.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZEntry.java deleted file mode 100644 index 1e921b2082..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZEntry.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import provider.MapleDataEntity; -import provider.MapleDataEntry; - -public class WZEntry implements MapleDataEntry { - private String name; - private int size; - private int checksum; - private int offset; - private MapleDataEntity parent; - - public WZEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(); - this.name = name; - this.size = size; - this.checksum = checksum; - this.parent = parent; - } - - public String getName() { - return name; - } - - public int getSize() { - return size; - } - - public int getChecksum() { - return checksum; - } - - public int getOffset() { - return offset; - } - - public MapleDataEntity getParent() { - return parent; - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZFile.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZFile.java deleted file mode 100644 index c6c0abf537..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZFile.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.RandomAccessFile; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataFileEntry; -import provider.MapleDataProvider; -import tools.data.input.GenericLittleEndianAccessor; -import tools.data.input.GenericSeekableLittleEndianAccessor; -import tools.data.input.InputStreamByteStream; -import tools.data.input.LittleEndianAccessor; -import tools.data.input.RandomAccessByteStream; -import tools.data.input.SeekableLittleEndianAccessor; - -public class WZFile implements MapleDataProvider { - static { - ListWZFile.init(); - } - private File wzfile; - private LittleEndianAccessor lea; - private SeekableLittleEndianAccessor slea; - private int headerSize; - private WZDirectoryEntry root; - private boolean provideImages; - private int cOffset; - - public WZFile(File wzfile, boolean provideImages) throws IOException { - this.wzfile = wzfile; - lea = new GenericLittleEndianAccessor(new InputStreamByteStream(new BufferedInputStream(new FileInputStream(wzfile)))); - RandomAccessFile raf = new RandomAccessFile(wzfile, "r"); - slea = new GenericSeekableLittleEndianAccessor(new RandomAccessByteStream(raf)); - root = new WZDirectoryEntry(wzfile.getName(), 0, 0, null); - this.provideImages = provideImages; - load(); - } - - private void load() throws IOException { - lea.readAsciiString(4); - lea.readInt(); - lea.readInt(); - headerSize = lea.readInt(); - lea.readNullTerminatedAsciiString(); - lea.readShort(); - parseDirectory(root); - cOffset = (int) lea.getBytesRead(); - getOffsets(root); - } - - private void getOffsets(MapleDataDirectoryEntry dir) { - for (MapleDataFileEntry file : dir.getFiles()) { - file.setOffset(cOffset); - cOffset += file.getSize(); - } - for (MapleDataDirectoryEntry sdir : dir.getSubdirectories()) { - getOffsets(sdir); - } - } - - private void parseDirectory(WZDirectoryEntry dir) { - int entries = WZTool.readValue(lea); - for (int i = 0; i < entries; i++) { - byte marker = lea.readByte(); - String name = null; - int size, checksum; - switch (marker) { - case 0x02: - name = WZTool.readDecodedStringAtOffsetAndReset(slea, lea.readInt() + this.headerSize + 1); - size = WZTool.readValue(lea); - checksum = WZTool.readValue(lea); - lea.readInt(); //dummy int - dir.addFile(new WZFileEntry(name, size, checksum, dir)); - break; - case 0x03: - case 0x04: - name = WZTool.readDecodedString(lea); - size = WZTool.readValue(lea); - checksum = WZTool.readValue(lea); - lea.readInt(); //dummy int - if (marker == 3) { - dir.addDirectory(new WZDirectoryEntry(name, size, checksum, dir)); - } else { - dir.addFile(new WZFileEntry(name, size, checksum, dir)); - } - break; - default: - } - } - for (MapleDataDirectoryEntry idir : dir.getSubdirectories()) { - parseDirectory((WZDirectoryEntry) idir); - } - } - - public WZIMGFile getImgFile(String path) throws IOException { - String segments[] = path.split("/"); - WZDirectoryEntry dir = root; - for (int x = 0; x < segments.length - 1; x++) { - dir = (WZDirectoryEntry) dir.getEntry(segments[x]); - if (dir == null) { - return null; - } - } - WZFileEntry entry = (WZFileEntry) dir.getEntry(segments[segments.length - 1]); - if (entry == null) { - return null; - } - String fullPath = wzfile.getName().substring(0, wzfile.getName().length() - 3).toLowerCase() + "/" + path; - return new WZIMGFile(this.wzfile, entry, provideImages, ListWZFile.isModernImgFile(fullPath)); - } - - @Override - public synchronized MapleData getData(String path) { - try { - WZIMGFile imgFile = getImgFile(path); - if (imgFile == null) { - return null; - } - MapleData ret = imgFile.getRoot(); - return ret; - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - @Override - public MapleDataDirectoryEntry getRoot() { - return root; - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZFileEntry.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZFileEntry.java deleted file mode 100644 index 792371d9cf..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZFileEntry.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import provider.MapleDataEntity; -import provider.MapleDataFileEntry; - -public class WZFileEntry extends WZEntry implements MapleDataFileEntry { - private int offset; - - public WZFileEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(name, size, checksum, parent); - } - - @Override - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZIMGEntry.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZIMGEntry.java deleted file mode 100644 index 385d785183..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZIMGEntry.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import provider.MapleData; -import provider.MapleDataEntity; - -public class WZIMGEntry implements MapleData { - private String name; - private MapleDataType type; - private List children = new ArrayList(10); - private Object data; - private MapleDataEntity parent; - - public WZIMGEntry(MapleDataEntity parent) { - this.parent = parent; - } - - @Override - public String getName() { - return name; - } - - @Override - public MapleDataType getType() { - return type; - } - - @Override - public List getChildren() { - return Collections.unmodifiableList(children); - } - - @Override - public MapleData getChildByPath(String path) { - String segments[] = path.split("/"); - if (segments[0].equals("..")) { - return ((MapleData) getParent()).getChildByPath(path.substring(path.indexOf("/") + 1)); - } - MapleData ret = this; - for (int x = 0; x < segments.length; x++) { - boolean foundChild = false; - for (MapleData child : ret.getChildren()) { - if (child.getName().equals(segments[x])) { - ret = child; - foundChild = true; - break; - } - } - if (!foundChild) { - return null; - } - } - return ret; - } - - @Override - public Object getData() { - return data; - } - - public void setName(String name) { - this.name = name; - } - - public void setType(MapleDataType type) { - this.type = type; - } - - public void setData(Object data) { - this.data = data; - } - - public void addChild(WZIMGEntry entry) { - children.add(entry); - } - - @Override - public Iterator iterator() { - return getChildren().iterator(); - } - - @Override - public String toString() { - return getName() + ":" + getData(); - } - - public MapleDataEntity getParent() { - return parent; - } - - public void finish() { - ((ArrayList) children).trimToSize(); - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZIMGFile.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZIMGFile.java deleted file mode 100644 index bec06c78bd..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZIMGFile.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.Point; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.io.RandomAccessFile; -import tools.data.input.GenericSeekableLittleEndianAccessor; -import tools.data.input.RandomAccessByteStream; -import tools.data.input.SeekableLittleEndianAccessor; - -public class WZIMGFile { - private WZFileEntry file; - private WZIMGEntry root; - private boolean provideImages; - @SuppressWarnings ("unused") - private boolean modernImg; - - public WZIMGFile(File wzfile, WZFileEntry file, boolean provideImages, boolean modernImg) throws IOException { - RandomAccessFile raf = new RandomAccessFile(wzfile, "r"); - SeekableLittleEndianAccessor slea = new GenericSeekableLittleEndianAccessor(new RandomAccessByteStream(raf)); - slea.seek(file.getOffset()); - this.file = file; - this.provideImages = provideImages; - root = new WZIMGEntry(file.getParent()); - root.setName(file.getName()); - root.setType(MapleDataType.EXTENDED); - this.modernImg = modernImg; - parseExtended(root, slea, 0); - root.finish(); - raf.close(); - } - - protected void dumpImg(OutputStream out, SeekableLittleEndianAccessor slea) throws IOException { - DataOutputStream os = new DataOutputStream(out); - long oldPos = slea.getPosition(); - slea.seek(file.getOffset()); - for (int x = 0; x < file.getSize(); x++) { - os.write(slea.readByte()); - } - slea.seek(oldPos); - } - - public WZIMGEntry getRoot() { - return root; - } - - private void parse(WZIMGEntry entry, SeekableLittleEndianAccessor slea) { - byte marker = slea.readByte(); - switch (marker) { - case 0: { - String name = WZTool.readDecodedString(slea); - entry.setName(name); - break; - } - case 1: { - String name = WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt()); - entry.setName(name); - break; - } - default: - System.out.println("Unknown Image identifier: " + marker + " at offset " + (slea.getPosition() - file.getOffset())); - } - marker = slea.readByte(); - switch (marker) { - case 0: - entry.setType(MapleDataType.IMG_0x00); - break; - case 2: - case 11: //??? no idea, since 0.49 - entry.setType(MapleDataType.SHORT); - entry.setData(Short.valueOf(slea.readShort())); - break; - case 3: - entry.setType(MapleDataType.INT); - entry.setData(Integer.valueOf(WZTool.readValue(slea))); - break; - case 4: - entry.setType(MapleDataType.FLOAT); - entry.setData(Float.valueOf(WZTool.readFloatValue(slea))); - break; - case 5: - entry.setType(MapleDataType.DOUBLE); - entry.setData(Double.valueOf(slea.readDouble())); - break; - case 8: - entry.setType(MapleDataType.STRING); - byte iMarker = slea.readByte(); - if (iMarker == 0) { - entry.setData(WZTool.readDecodedString(slea)); - } else if (iMarker == 1) { - entry.setData(WZTool.readDecodedStringAtOffsetAndReset(slea, slea.readInt() + file.getOffset())); - } else { - System.out.println("Unknown String type " + iMarker); - } - break; - case 9: - entry.setType(MapleDataType.EXTENDED); - long endOfExtendedBlock = slea.readInt(); - endOfExtendedBlock += slea.getPosition(); - parseExtended(entry, slea, endOfExtendedBlock); - break; - default: - System.out.println("Unknown Image type " + marker); - } - } - - private void parseExtended(WZIMGEntry entry, SeekableLittleEndianAccessor slea, long endOfExtendedBlock) { - byte marker = slea.readByte(); - String type; - switch (marker) { - case 0x73: - type = WZTool.readDecodedString(slea); - break; - case 0x1B: - type = WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt()); - break; - default: - throw new RuntimeException("Unknown extended image identifier: " + marker + " at offset " + - (slea.getPosition() - file.getOffset())); - } - if (type.equals("Property")) { - entry.setType(MapleDataType.PROPERTY); - slea.readByte(); - slea.readByte(); - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry cEntry = new WZIMGEntry(entry); - parse(cEntry, slea); - cEntry.finish(); - entry.addChild(cEntry); - } - } else if (type.equals("Canvas")) { - entry.setType(MapleDataType.CANVAS); - slea.readByte(); - marker = slea.readByte(); - if (marker == 0) { - // do nothing - } else if (marker == 1) { - slea.readByte(); - slea.readByte(); - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry child = new WZIMGEntry(entry); - parse(child, slea); - child.finish(); - entry.addChild(child); - } - } else { - System.out.println("Canvas marker != 1 (" + marker + ")"); - } - int width = WZTool.readValue(slea); - int height = WZTool.readValue(slea); - int format = WZTool.readValue(slea); - int format2 = slea.readByte(); - slea.readInt(); - int dataLength = slea.readInt() - 1; - slea.readByte(); - if (provideImages) { - byte[] pngdata = slea.read(dataLength); - entry.setData(new PNGMapleCanvas(width, height, dataLength, format + format2, pngdata)); - } else { - entry.setData(new PNGMapleCanvas(width, height, dataLength, format + format2, null)); - slea.skip(dataLength); - } - } else if (type.equals("Shape2D#Vector2D")) { - entry.setType(MapleDataType.VECTOR); - int x = WZTool.readValue(slea); - int y = WZTool.readValue(slea); - entry.setData(new Point(x, y)); - } else if (type.equals("Shape2D#Convex2D")) { - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry cEntry = new WZIMGEntry(entry); - parseExtended(cEntry, slea, 0); - cEntry.finish(); - entry.addChild(cEntry); - } - } else if (type.equals("Sound_DX8")) { - entry.setType(MapleDataType.SOUND); - slea.readByte(); - int dataLength = WZTool.readValue(slea); - WZTool.readValue(slea); // no clue what this is - int offset = (int) slea.getPosition(); - entry.setData(new ImgMapleSound(dataLength, offset - file.getOffset())); - slea.seek(endOfExtendedBlock); - } else if (type.equals("UOL")) { - entry.setType(MapleDataType.UOL); - slea.readByte(); - byte uolmarker = slea.readByte(); - switch (uolmarker) { - case 0: - entry.setData(WZTool.readDecodedString(slea)); - break; - case 1: - entry.setData(WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt())); - break; - default: - System.out.println("Unknown UOL marker: " + uolmarker + " " + entry.getName()); - } - } else { - throw new RuntimeException("Unhandled extended type: " + type); - } - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZTool.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZTool.java deleted file mode 100644 index 7f5452cd03..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/WZTool.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import tools.data.input.LittleEndianAccessor; -import tools.data.input.SeekableLittleEndianAccessor; - -import javax.crypto.BadPaddingException; -import javax.crypto.Cipher; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.NoSuchPaddingException; -import javax.crypto.spec.SecretKeySpec; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; - -/* - * Ported Code, see WZFile.java for more info - */ -public class WZTool { - private static byte[] encKey; - - static { - byte[] iv = new byte[]{(byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b,}; - byte[] key = new byte[]{(byte) 0x13, 0x00, 0x00, 0x00, - (byte) 0x08, 0x00, 0x00, 0x00, - (byte) 0x06, 0x00, 0x00, 0x00, - (byte) 0xB4, 0x00, 0x00, 0x00, - (byte) 0x1B, 0x00, 0x00, 0x00, - (byte) 0x0F, 0x00, 0x00, 0x00, - (byte) 0x33, 0x00, 0x00, 0x00, - (byte) 0x52, 0x00, 0x00, 0x00 - }; - Cipher cipher = null; - SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); - try { - cipher = Cipher.getInstance("AES"); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (NoSuchPaddingException e) { - e.printStackTrace(); - } - try { - cipher.init(Cipher.ENCRYPT_MODE, skeySpec); - } catch (InvalidKeyException e) { - e.printStackTrace(); - } - encKey = new byte[0xFFFF]; - for (int i = 0; i < (0xFFFF / 16); i++) { - try { - iv = cipher.doFinal(iv); - } catch (IllegalBlockSizeException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } - System.arraycopy(iv, 0, encKey, (i * 16), 16); - } - try { - iv = cipher.doFinal(iv); - } catch (IllegalBlockSizeException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } - System.arraycopy(iv, 0, encKey, 65520, 15); - } - - public static byte[] readListString(byte[] str) { - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ encKey[i]); - } - return str; - } - - public static String readDecodedString(LittleEndianAccessor llea) { - int strLength; - byte b = llea.readByte(); - if (b == 0x00) { - return ""; - } - if (b >= 0) { - if (b == 0x7F) { - strLength = llea.readInt(); - } else { - strLength = b; - } - if (strLength < 0) { - return ""; - } - byte str[] = new byte[strLength * 2]; - for (int i = 0; i < strLength * 2; i++) { - str[i] = llea.readByte(); - } - return DecryptUnicodeStr(str); - } else { - if (b == -128) { - strLength = llea.readInt(); - } else { - strLength = -b; - } - if (strLength < 0) { - return ""; - } - byte str[] = new byte[strLength]; - for (int i = 0; i < strLength; i++) { - str[i] = llea.readByte(); - } - return DecryptAsciiStr(str); - } - } - - public static String DecryptAsciiStr(byte[] str) { - byte xorByte = (byte) 0xAA; - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ xorByte ^ encKey[i]); - xorByte++; - } - return new String(str); - } - - public static String DecryptUnicodeStr(byte[] str) { - int xorByte = 0xAAAA; - char[] charRet = new char[str.length / 2]; - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ encKey[i]); - } - for (int i = 0; i < (str.length / 2); i++) { - char toXor = (char) ((str[i] << 8) | str[i + 1]); - charRet[i] = (char) (toXor ^ xorByte); - xorByte++; - } - return String.valueOf(charRet); - } - - public static String readDecodedStringAtOffset(SeekableLittleEndianAccessor slea, int offset) { - slea.seek(offset); - return readDecodedString(slea); - } - - public static String readDecodedStringAtOffsetAndReset(SeekableLittleEndianAccessor slea, int offset) { - long pos = 0; - pos = slea.getPosition(); - slea.seek(offset); - String ret = readDecodedString(slea); - slea.seek(pos); - return ret; - } - - public static int readValue(LittleEndianAccessor lea) { - byte b = lea.readByte(); - if (b == -128) { - return lea.readInt(); - } else { - return b; - } - } - - public static float readFloatValue(LittleEndianAccessor lea) { - byte b = lea.readByte(); - if (b == -128) { - return lea.readFloat(); - } else { - return 0; - } - } -} \ No newline at end of file diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/XMLDomMapleData.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/XMLDomMapleData.java deleted file mode 100644 index 151a04c2fd..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/XMLDomMapleData.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package provider.wz; - -import java.awt.Point; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.text.NumberFormat; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import provider.MapleData; -import provider.MapleDataEntity; -import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -public class XMLDomMapleData implements MapleData { - private Node node; - private File imageDataDir; - private NumberFormat nf; - - public XMLDomMapleData(FileInputStream fis, File imageDataDir) { - try { - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - Document document = documentBuilder.parse(fis); - this.node = document.getFirstChild(); - } catch (ParserConfigurationException e) { - throw new RuntimeException(e); - } catch (SAXException e) { - throw new RuntimeException(e); - } catch (IOException e) { - throw new RuntimeException(e); - } - this.imageDataDir = imageDataDir; - this.nf = NumberFormat.getInstance(Locale.FRANCE); - } - - private XMLDomMapleData(Node node) { - this.node = node; - this.nf = NumberFormat.getInstance(Locale.FRANCE); - } - - @Override - public MapleData getChildByPath(String path) { - String segments[] = path.split("/"); - if (segments[0].equals("..")) { - return ((MapleData) getParent()).getChildByPath(path.substring(path.indexOf("/") + 1)); - } - - Node myNode = node; - for (int x = 0; x < segments.length; x++) { - NodeList childNodes = myNode.getChildNodes(); - boolean foundChild = false; - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if (childNode.getNodeType() == Node.ELEMENT_NODE && childNode.getAttributes().getNamedItem("name").getNodeValue().equals(segments[x])) { - myNode = childNode; - foundChild = true; - break; - } - } - if (!foundChild) { - return null; - } - } - XMLDomMapleData ret = new XMLDomMapleData(myNode); - ret.imageDataDir = new File(imageDataDir, getName() + "/" + path).getParentFile(); - return ret; - } - - @Override - public List getChildren() { - List ret = new ArrayList(); - NodeList childNodes = node.getChildNodes(); - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if (childNode.getNodeType() == Node.ELEMENT_NODE) { - XMLDomMapleData child = new XMLDomMapleData(childNode); - child.imageDataDir = new File(imageDataDir, getName()); - ret.add(child); - } - } - return ret; - } - - @Override - public Object getData() { - NamedNodeMap attributes = node.getAttributes(); - MapleDataType type = getType(); - switch (type) { - case DOUBLE: - case FLOAT: - case INT: - case SHORT: { - String value = attributes.getNamedItem("value").getNodeValue(); - Number nval; - - try { - nval = nf.parse(value); - } - catch(java.text.ParseException pe) { - pe.printStackTrace(); - nval = 0.0f; - } - - switch (type) { - case DOUBLE: - return nval.doubleValue(); - case FLOAT: - return nval.floatValue(); - case INT: - return nval.intValue(); - case SHORT: - return nval.shortValue(); - default: - return null; - } - } - case STRING: - case UOL: { - String value = attributes.getNamedItem("value").getNodeValue(); - return value; - } - case VECTOR: { - String x = attributes.getNamedItem("x").getNodeValue(); - String y = attributes.getNamedItem("y").getNodeValue(); - return new Point(Integer.parseInt(x), Integer.parseInt(y)); - } - case CANVAS: { - String width = attributes.getNamedItem("width").getNodeValue(); - String height = attributes.getNamedItem("height").getNodeValue(); - return new FileStoredPngMapleCanvas(Integer.parseInt(width), Integer.parseInt(height), new File( - imageDataDir, getName() + ".png")); - } - default: - return null; - } - } - - @Override - public MapleDataType getType() { - String nodeName = node.getNodeName(); - if (nodeName.equals("imgdir")) { - return MapleDataType.PROPERTY; - } else if (nodeName.equals("canvas")) { - return MapleDataType.CANVAS; - } else if (nodeName.equals("convex")) { - return MapleDataType.CONVEX; - } else if (nodeName.equals("sound")) { - return MapleDataType.SOUND; - } else if (nodeName.equals("uol")) { - return MapleDataType.UOL; - } else if (nodeName.equals("double")) { - return MapleDataType.DOUBLE; - } else if (nodeName.equals("float")) { - return MapleDataType.FLOAT; - } else if (nodeName.equals("int")) { - return MapleDataType.INT; - } else if (nodeName.equals("short")) { - return MapleDataType.SHORT; - } else if (nodeName.equals("string")) { - return MapleDataType.STRING; - } else if (nodeName.equals("vector")) { - return MapleDataType.VECTOR; - } else if (nodeName.equals("null")) { - return MapleDataType.IMG_0x00; - } - return null; - } - - @Override - public MapleDataEntity getParent() { - Node parentNode = node.getParentNode(); - if (parentNode.getNodeType() == Node.DOCUMENT_NODE) { - return null; - } - XMLDomMapleData parentData = new XMLDomMapleData(parentNode); - parentData.imageDataDir = imageDataDir.getParentFile(); - return parentData; - } - - @Override - public String getName() { - return node.getAttributes().getNamedItem("name").getNodeValue(); - } - - @Override - public Iterator iterator() { - return getChildren().iterator(); - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/XMLWZFile.java b/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/XMLWZFile.java deleted file mode 100644 index 2a7694fdc9..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/provider/wz/XMLWZFile.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataProvider; - -public class XMLWZFile implements MapleDataProvider { - private File root; - private WZDirectoryEntry rootForNavigation; - - public XMLWZFile(File fileIn) { - root = fileIn; - rootForNavigation = new WZDirectoryEntry(fileIn.getName(), 0, 0, null); - fillMapleDataEntitys(root, rootForNavigation); - } - - private void fillMapleDataEntitys(File lroot, WZDirectoryEntry wzdir) { - for (File file : lroot.listFiles()) { - String fileName = file.getName(); - if (file.isDirectory() && !fileName.endsWith(".img")) { - WZDirectoryEntry newDir = new WZDirectoryEntry(fileName, 0, 0, wzdir); - wzdir.addDirectory(newDir); - fillMapleDataEntitys(file, newDir); - } else if (fileName.endsWith(".xml")) { - wzdir.addFile(new WZFileEntry(fileName.substring(0, fileName.length() - 4), 0, 0, wzdir)); - } - } - } - - @Override - public MapleData getData(String path) { - File dataFile = new File(root, path + ".xml"); - File imageDataDir = new File(root, path); - if (!dataFile.exists()) { - return null;//bitches - } - FileInputStream fis; - try { - fis = new FileInputStream(dataFile); - } catch (FileNotFoundException e) { - throw new RuntimeException("Datafile " + path + " does not exist in " + root.getAbsolutePath()); - } - final XMLDomMapleData domMapleData; - try { - domMapleData = new XMLDomMapleData(fis, imageDataDir.getParentFile()); - } finally { - try { - fis.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - return domMapleData; - } - - @Override - public MapleDataDirectoryEntry getRoot() { - return rootForNavigation; - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/DatabaseConnection.java b/tools/MapleInvalidItemWithNoNameFetcher/src/tools/DatabaseConnection.java deleted file mode 100644 index b887280343..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/DatabaseConnection.java +++ /dev/null @@ -1,51 +0,0 @@ -package tools; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; - -/** - * @author Frz (Big Daddy) - * @author The Real Spookster - some modifications to this beautiful code - */ -public class DatabaseConnection { - private static String DB_URL = "jdbc:mysql://localhost:3306/cosmic"; - private static String DB_USER = "cosmic_server"; - private static String DB_PASS = "snailshell"; - - public static final int RETURN_GENERATED_KEYS = 1; - - private static ThreadLocal con = new ThreadLocalConnection(); - - public static Connection getConnection() { - Connection c = con.get(); - try { - c.getMetaData(); - } catch (SQLException e) { // connection is dead, therefore discard old object 5ever - con.remove(); - c = con.get(); - } - return c; - } - - private static class ThreadLocalConnection extends ThreadLocal { - - @Override - protected Connection initialValue() { - try { - Class.forName("com.mysql.jdbc.Driver"); // touch the mysql driver - } catch (ClassNotFoundException e) { - System.out.println("[SEVERE] SQL Driver Not Found. Consider death by clams."); - e.printStackTrace(); - return null; - } - try { - return DriverManager.getConnection(DB_URL, DB_USER, DB_PASS); - } catch (SQLException e) { - System.out.println("[SEVERE] Unable to make database connection."); - e.printStackTrace(); - return null; - } - } - } -} \ No newline at end of file diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/HexTool.java b/tools/MapleInvalidItemWithNoNameFetcher/src/tools/HexTool.java deleted file mode 100644 index 8cc0c8aa84..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/HexTool.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools; - -import java.io.ByteArrayOutputStream; - -public class HexTool { - private static final char[] HEX = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; - - private static String toString(byte byteValue) { - int tmp = byteValue << 8; - char[] retstr = new char[]{HEX[(tmp >> 12) & 0x0F], HEX[(tmp >> 8) & 0x0F]}; - return String.valueOf(retstr); - } - - public static String toString(byte[] bytes) { - StringBuilder hexed = new StringBuilder(); - for (int i = 0; i < bytes.length; i++) { - hexed.append(toString(bytes[i])); - hexed.append(' '); - } - return hexed.substring(0, hexed.length() - 1); - } - - public static byte[] getByteArrayFromHexString(String hex) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - int nexti = 0; - int nextb = 0; - boolean highoc = true; - outer: - for (;;) { - int number = -1; - while (number == -1) { - if (nexti == hex.length()) { - break outer; - } - char chr = hex.charAt(nexti); - if (chr >= '0' && chr <= '9') { - number = chr - '0'; - } else if (chr >= 'a' && chr <= 'f') { - number = chr - 'a' + 10; - } else if (chr >= 'A' && chr <= 'F') { - number = chr - 'A' + 10; - } else { - number = -1; - } - nexti++; - } - if (highoc) { - nextb = number << 4; - highoc = false; - } else { - nextb |= number; - highoc = true; - baos.write(nextb); - } - } - return baos.toByteArray(); - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/Pair.java b/tools/MapleInvalidItemWithNoNameFetcher/src/tools/Pair.java deleted file mode 100644 index b127e71110..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/Pair.java +++ /dev/null @@ -1,121 +0,0 @@ -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 ~ 2010 Patrick Huy -Matthias Butz -Jan Christian Meyer - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License version 3 -as published by the Free Software Foundation. You may not use, modify -or distribute this program under any other version of the -GNU Affero General Public License. - -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 . - */ -package tools; - -/** - * Represents a pair of values. - * - * @author Frz - * @since Revision 333 - * @version 1.0 - * - * @param The type of the left value. - * @param The type of the right value. - */ -public class Pair { - - public E left; - public F right; - - /** - * Class constructor - pairs two objects together. - * - * @param left The left object. - * @param right The right object. - */ - public Pair(E left, F right) { - this.left = left; - this.right = right; - } - - /** - * Gets the left value. - * - * @return The left value. - */ - public E getLeft() { - return left; - } - - /** - * Gets the right value. - * - * @return The right value. - */ - public F getRight() { - return right; - } - - /** - * Turns the pair into a string. - * - * @return Each value of the pair as a string joined with a colon. - */ - @Override - public String toString() { - return left.toString() + ":" + right.toString(); - } - - /** - * Gets the hash code of this pair. - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((left == null) ? 0 : left.hashCode()); - result = prime * result + ((right == null) ? 0 : right.hashCode()); - return result; - } - - /** - * Checks to see if two pairs are equal. - */ - @SuppressWarnings("unchecked") - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Pair other = (Pair) obj; - if (left == null) { - if (other.left != null) { - return false; - } - } else if (!left.equals(other.left)) { - return false; - } - if (right == null) { - if (other.right != null) { - return false; - } - } else if (!right.equals(other.right)) { - return false; - } - return true; - } -} \ No newline at end of file diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/ByteArrayByteStream.java b/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/ByteArrayByteStream.java deleted file mode 100644 index eac7de21ea..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/ByteArrayByteStream.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import tools.HexTool; - -public class ByteArrayByteStream implements SeekableInputStreamBytestream { - private int pos = 0; - private long bytesRead = 0; - private byte[] arr; - - public ByteArrayByteStream(byte[] arr) { - this.arr = arr; - } - - @Override - public long getPosition() { - return pos; - } - - @Override - public void seek(long offset) throws IOException { - pos = (int) offset; - } - - @Override - public long getBytesRead() { - return bytesRead; - } - - @Override - public int readByte() { - bytesRead++; - return ((int) arr[pos++]) & 0xFF; - } - - @Override - public String toString() { - String nows = "kevintjuh93 pwns";//I lol'd - if (arr.length - pos > 0) { - byte[] now = new byte[arr.length - pos]; - System.arraycopy(arr, pos, now, 0, arr.length - pos); - nows = HexTool.toString(now); - } - return "All: " + HexTool.toString(arr) + "\nNow: " + nows; - } - - @Override - public long available() { - return arr.length - pos; - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/ByteInputStream.java b/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/ByteInputStream.java deleted file mode 100644 index 107f71843e..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/ByteInputStream.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -/** - * Represents an abstract stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public interface ByteInputStream { - int readByte(); - long getBytesRead(); - long available(); -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/GenericLittleEndianAccessor.java b/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/GenericLittleEndianAccessor.java deleted file mode 100644 index d08a9b8374..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/GenericLittleEndianAccessor.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.awt.Point; -import java.io.ByteArrayOutputStream; - -/** - * Provides a generic interface to a Little Endian stream of bytes. - * - * @version 1.0 - * @author Frz - * @since Revision 323 - */ -public class GenericLittleEndianAccessor implements LittleEndianAccessor { - private ByteInputStream bs; - - /** - * Class constructor - Wraps the accessor around a stream of bytes. - * - * @param bs The byte stream to wrap the accessor around. - */ - public GenericLittleEndianAccessor(ByteInputStream bs) { - this.bs = bs; - } - - /** - * Read a single byte from the stream. - * - * @return The byte read. - * @see tools.data.input.ByteInputStream#readByte - */ - @Override - public byte readByte() { - return (byte) bs.readByte(); - } - - /** - * Reads an integer from the stream. - * - * @return The integer read. - */ - @Override - public int readInt() { - return bs.readByte() + (bs.readByte() << 8) + (bs.readByte() << 16) + (bs.readByte() << 24); - } - - /** - * Reads a short integer from the stream. - * - * @return The short read. - */ - @Override - public short readShort() { - return (short) (bs.readByte() + (bs.readByte() << 8)); - } - - /** - * Reads a single character from the stream. - * - * @return The character read. - */ - @Override - public char readChar() { - return (char) readShort(); - } - - /** - * Reads a long integer from the stream. - * - * @return The long integer read. - */ - @Override - public long readLong() { - long byte1 = bs.readByte(); - long byte2 = bs.readByte(); - long byte3 = bs.readByte(); - long byte4 = bs.readByte(); - long byte5 = bs.readByte(); - long byte6 = bs.readByte(); - long byte7 = bs.readByte(); - long byte8 = bs.readByte(); - return (byte8 << 56) + (byte7 << 48) + (byte6 << 40) + (byte5 << 32) + (byte4 << 24) + (byte3 << 16) + (byte2 << 8) + byte1; - } - - /** - * Reads a floating point integer from the stream. - * - * @return The float-type integer read. - */ - @Override - public float readFloat() { - return Float.intBitsToFloat(readInt()); - } - - /** - * Reads a double-precision integer from the stream. - * - * @return The double-type integer read. - */ - @Override - public double readDouble() { - return Double.longBitsToDouble(readLong()); - } - - /** - * Reads an ASCII string from the stream with length n. - * - * @param n Number of characters to read. - * @return The string read. - */ - public final String readAsciiString(int n) { - char ret[] = new char[n]; - for (int x = 0; x < n; x++) { - ret[x] = (char) readByte(); - } - return String.valueOf(ret); - } - - /** - * Reads a null-terminated string from the stream. - * - * @return The string read. - */ - public final String readNullTerminatedAsciiString() { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte b; - while (true) { - b = readByte(); - if (b == 0) { - break; - } - baos.write(b); - } - byte[] buf = baos.toByteArray(); - char[] chrBuf = new char[buf.length]; - for (int x = 0; x < buf.length; x++) { - chrBuf[x] = (char) buf[x]; - } - return String.valueOf(chrBuf); - } - - /** - * Gets the number of bytes read from the stream so far. - * - * @return A long integer representing the number of bytes read. - * @see tools.data.input.ByteInputStream#getBytesRead() - */ - public long getBytesRead() { - return bs.getBytesRead(); - } - - /** - * Reads a MapleStory convention lengthed ASCII string. - * This consists of a short integer telling the length of the string, - * then the string itself. - * - * @return The string read. - */ - @Override - public String readMapleAsciiString() { - return readAsciiString(readShort()); - } - - /** - * Reads num bytes off the stream. - * - * @param num The number of bytes to read. - * @return An array of bytes with the length of num - */ - @Override - public byte[] read(int num) { - byte[] ret = new byte[num]; - for (int x = 0; x < num; x++) { - ret[x] = readByte(); - } - return ret; - } - - /** - * Reads a MapleStory Position information. - * This consists of 2 short integer. - * - * @return The Position read. - */ - @Override - public final Point readPos() { - final int x = readShort(); - final int y = readShort(); - return new Point(x, y); - } - - /** - * Skips the current position of the stream num bytes ahead. - * - * @param num Number of bytes to skip. - */ - @Override - public void skip(int num) { - for (int x = 0; x < num; x++) { - readByte(); - } - } - - /** - * @see tools.data.input.ByteInputStream#available - */ - @Override - public long available() { - return bs.available(); - } - - /** - * @see java.lang.Object#toString - */ - @Override - public String toString() { - return bs.toString(); - } -} \ No newline at end of file diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java b/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java deleted file mode 100644 index fdd147d796..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; - -/** - * Provides an abstract accessor to a generic Little Endian byte stream. This - * accessor is seekable. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - * @see tools.data.input.GenericLittleEndianAccessor - */ -public class GenericSeekableLittleEndianAccessor extends GenericLittleEndianAccessor implements SeekableLittleEndianAccessor { - private SeekableInputStreamBytestream bs; - - /** - * Class constructor - * Provide a seekable input stream to wrap this object around. - * - * @param bs The byte stream to wrap this around. - */ - public GenericSeekableLittleEndianAccessor(SeekableInputStreamBytestream bs) { - super(bs); - this.bs = bs; - } - - /** - * Seek the pointer to offset - * - * @param offset The offset to seek to. - * @see tools.data.input.SeekableInputStreamBytestream#seek - */ - @Override - public void seek(long offset) { - try { - bs.seek(offset); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("Seek failed " + e); - } - } - - /** - * Get the current position of the pointer. - * - * @return The current position of the pointer as a long integer. - * @see tools.data.input.SeekableInputStreamBytestream#getPosition - */ - @Override - public long getPosition() { - try { - return bs.getPosition(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("getPosition failed" + e); - return -1; - } - } - - /** - * Skip num number of bytes in the stream. - * - * @param num The number of bytes to skip. - */ - @Override - public void skip(int num) { - seek(getPosition() + num); - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/InputStreamByteStream.java b/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/InputStreamByteStream.java deleted file mode 100644 index 70aef3489f..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/InputStreamByteStream.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Provides an abstract wrapper to a stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class InputStreamByteStream implements ByteInputStream { - private InputStream is; - private long read = 0; - - /** - * Class constructor. - * Provide an input stream to wrap this around. - * - * @param is The input stream to wrap this object around. - */ - public InputStreamByteStream(InputStream is) { - this.is = is; - } - - /** - * Reads the next byte from the stream. - * - * @return Then next byte in the stream. - */ - @Override - public int readByte() { - int temp; - try { - temp = is.read(); - if (temp == -1) { - throw new RuntimeException("EOF"); - } - read++; - return temp; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - /** - * Gets the number of bytes read from the stream. - * - * @return The number of bytes read as a long integer. - */ - @Override - public long getBytesRead() { - return read; - } - - /** - * Returns the number of bytes left in the stream. - * - * @return The number of bytes available for reading as a long integer. - */ - @Override - public long available() { - try { - return is.available(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("ERROR" + e); - return 0; - } - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/LittleEndianAccessor.java b/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/LittleEndianAccessor.java deleted file mode 100644 index f991dbf537..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/LittleEndianAccessor.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.awt.Point; - -/** - * @author Frz - */ -public interface LittleEndianAccessor { - byte readByte(); - char readChar(); - short readShort(); - int readInt(); - Point readPos(); - long readLong(); - void skip(int num); - byte[] read(int num); - float readFloat(); - double readDouble(); - String readAsciiString(int n); - String readNullTerminatedAsciiString(); - String readMapleAsciiString(); - long getBytesRead(); - long available(); -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/RandomAccessByteStream.java b/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/RandomAccessByteStream.java deleted file mode 100644 index c0004be17f..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/RandomAccessByteStream.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import java.io.RandomAccessFile; - -/** - * Provides an abstract layer to a byte stream. This layer can be accessed - * randomly. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class RandomAccessByteStream implements SeekableInputStreamBytestream { - private RandomAccessFile raf; - private long read = 0; - - public RandomAccessByteStream(RandomAccessFile raf) { - super(); - this.raf = raf; - } - - @Override - public int readByte() { - int temp; - try { - temp = raf.read(); - if (temp == -1) { - throw new RuntimeException("EOF"); - } - read++; - return temp; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public void seek(long offset) throws IOException { - raf.seek(offset); - } - - @Override - public long getPosition() throws IOException { - return raf.getFilePointer(); - } - - @Override - public long getBytesRead() { - return read; - } - - @Override - public long available() { - try { - return raf.length() - raf.getFilePointer(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("ERROR " + e); - return 0; - } - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/SeekableInputStreamBytestream.java b/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/SeekableInputStreamBytestream.java deleted file mode 100644 index f4922dc876..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/SeekableInputStreamBytestream.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; - -/** - * Provides an abstract interface to a stream of bytes. This stream can be - * seeked. - * - * @author Frz - * @version 1.0 - * @since 299 - */ -public interface SeekableInputStreamBytestream extends ByteInputStream { - /** - * Seeks the stream by the specified offset. - * - * @param offset - * Number of bytes to seek. - * @throws IOException - */ - void seek(long offset) throws IOException; - - /** - * Gets the current position of the stream. - * - * @return The stream position as a long integer. - * @throws IOException - */ - long getPosition() throws IOException; -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java b/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java deleted file mode 100644 index 16b2317f7a..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -public interface SeekableLittleEndianAccessor extends LittleEndianAccessor { - void seek(long offset); - long getPosition(); -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/BAOSByteOutputStream.java b/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/BAOSByteOutputStream.java deleted file mode 100644 index 80cbc9301e..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/BAOSByteOutputStream.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.io.ByteArrayOutputStream; - -/** - * Uses a byte array to output a stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 352 - */ -class BAOSByteOutputStream implements ByteOutputStream { - private ByteArrayOutputStream baos; - - /** - * Class constructor - Wraps the stream around a Java BAOS. - * - * @param baos The ByteArrayOutputStream to wrap this around. - */ - BAOSByteOutputStream(ByteArrayOutputStream baos) { - super(); - this.baos = baos; - } - - /** - * Writes a byte to the stream. - * - * @param b The byte to write to the stream. - * @see tools.data.output.ByteOutputStream#writeByte(byte) - */ - @Override - public void writeByte(byte b) { - baos.write(b); - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/ByteOutputStream.java b/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/ByteOutputStream.java deleted file mode 100644 index 0df7ca7753..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/ByteOutputStream.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -/** - * Provides an interface to an output stream of bytes. - * - * @author Frz - * @since Revision 323 - * @version 1.0 - */ -interface ByteOutputStream { - /** - * Writes a byte to the stream. - * - * @param b The byte to write. - */ - void writeByte(byte b); -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/GenericLittleEndianWriter.java b/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/GenericLittleEndianWriter.java deleted file mode 100644 index e804fd8000..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/GenericLittleEndianWriter.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.awt.Point; -import java.nio.charset.Charset; - -/** - * Provides a generic writer of a little-endian sequence of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class GenericLittleEndianWriter implements LittleEndianWriter { - private static Charset ASCII = Charset.forName("US-ASCII"); - private ByteOutputStream bos; - - /** - * Class constructor - Protected to prevent instantiation with no arguments. - */ - protected GenericLittleEndianWriter() { - // Blah! - } - - /** - * Sets the byte-output stream for this instance of the object. - * - * @param bos The new output stream to set. - */ - void setByteOutputStream(ByteOutputStream bos) { - this.bos = bos; - } - - /** - * Write an array of bytes to the stream. - * - * @param b The bytes to write. - */ - @Override - public void write(byte[] b) { - for (int x = 0; x < b.length; x++) { - bos.writeByte(b[x]); - } - } - - /** - * Write a byte to the stream. - * - * @param b The byte to write. - */ - @Override - public void write(byte b) { - bos.writeByte(b); - } - - /** - * Write a byte in integer form to the stream. - * - * @param b The byte as an Integer to write. - */ - @Override - public void write(int b) { - bos.writeByte((byte) b); - } - - @Override - public void skip(int b) { - write(new byte[b]); - } - - /** - * Write a short integer to the stream. - * - * @param i The short integer to write. - */ - @Override - public void writeShort(int i) { - bos.writeByte((byte) (i & 0xFF)); - bos.writeByte((byte) ((i >>> 8) & 0xFF)); - } - - /** - * Writes an integer to the stream. - * - * @param i The integer to write. - */ - @Override - public void writeInt(int i) { - bos.writeByte((byte) (i & 0xFF)); - bos.writeByte((byte) ((i >>> 8) & 0xFF)); - bos.writeByte((byte) ((i >>> 16) & 0xFF)); - bos.writeByte((byte) ((i >>> 24) & 0xFF)); - } - - /** - * Writes an ASCII string the the stream. - * - * @param s The ASCII string to write. - */ - @Override - public void writeAsciiString(String s) { - write(s.getBytes(ASCII)); - } - - /** - * Writes a maple-convention ASCII string to the stream. - * - * @param s The ASCII string to use maple-convention to write. - */ - @Override - public void writeMapleAsciiString(String s) { - writeShort((short) s.length()); - writeAsciiString(s); - } - - /** - * Writes a null-terminated ASCII string to the stream. - * - * @param s The ASCII string to write. - */ - @Override - public void writeNullTerminatedAsciiString(String s) { - writeAsciiString(s); - write(0); - } - - /** - * Write a long integer to the stream. - * @param l The long integer to write. - */ - @Override - public void writeLong(long l) { - bos.writeByte((byte) (l & 0xFF)); - bos.writeByte((byte) ((l >>> 8) & 0xFF)); - bos.writeByte((byte) ((l >>> 16) & 0xFF)); - bos.writeByte((byte) ((l >>> 24) & 0xFF)); - bos.writeByte((byte) ((l >>> 32) & 0xFF)); - bos.writeByte((byte) ((l >>> 40) & 0xFF)); - bos.writeByte((byte) ((l >>> 48) & 0xFF)); - bos.writeByte((byte) ((l >>> 56) & 0xFF)); - } - - /** - * Writes a 2D 4 byte position information - * - * @param s The Point position to write. - */ - @Override - public void writePos(Point s) { - writeShort(s.x); - writeShort(s.y); - } - - /** - * Writes a boolean true ? 1 : 0 - * - * @param b The boolean to write. - */ - @Override - public void writeBool(final boolean b) { - write(b ? 1 : 0); - } -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/LittleEndianWriter.java b/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/LittleEndianWriter.java deleted file mode 100644 index f17bd7c72e..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/LittleEndianWriter.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package tools.data.output; - -import java.awt.Point; - -/** - * Provides an interface to a writer class that writes a little-endian sequence - * of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public interface LittleEndianWriter { - - /** - * Write an array of bytes to the sequence. - * - * @param b The bytes to write. - */ - public void write(byte b[]); - - /** - * Write a byte to the sequence. - * - * @param b The byte to write. - */ - public void write(byte b); - - /** - * Write a byte in integer form to the sequence. - * - * @param b The byte as an Integer to write. - */ - public void write(int b); - - public void skip(int b); - - /** - * Writes an integer to the sequence. - * - * @param i The integer to write. - */ - public void writeInt(int i); - - /** - * Write a short integer to the sequence. - * - * @param s The short integer to write. - */ - public void writeShort(int s); - - /** - * Write a long integer to the sequence. - * - * @param l The long integer to write. - */ - public void writeLong(long l); - - /** - * Writes an ASCII string the the sequence. - * - * @param s The ASCII string to write. - */ - void writeAsciiString(String s); - - /** - * Writes a null-terminated ASCII string to the sequence. - * - * @param s The ASCII string to write. - */ - void writeNullTerminatedAsciiString(String s); - - /** - * Writes a maple-convention ASCII string to the sequence. - * - * @param s The ASCII string to use maple-convention to write. - */ - void writeMapleAsciiString(String s); - - /** - * Writes a 2D 4 byte position information - * - * @param s The Point position to write. - */ - void writePos(Point s); - - /** - * Writes a boolean true ? 1 : 0 - * - * @param b The boolean to write. - */ - void writeBool(final boolean b); -} diff --git a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java b/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java deleted file mode 100644 index b02365ec62..0000000000 --- a/tools/MapleInvalidItemWithNoNameFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.io.ByteArrayOutputStream; -import tools.HexTool; - -/** - * Writes a maplestory-packet little-endian stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 352 - */ -public class MaplePacketLittleEndianWriter extends GenericLittleEndianWriter { - private ByteArrayOutputStream baos; - - /** - * Constructor - initializes this stream with a default size. - */ - public MaplePacketLittleEndianWriter() { - this(32); - } - - /** - * Constructor - initializes this stream with size size. - * - * @param size The size of the underlying stream. - */ - public MaplePacketLittleEndianWriter(int size) { - this.baos = new ByteArrayOutputStream(size); - setByteOutputStream(new BAOSByteOutputStream(baos)); - } - - /** - * Gets a MaplePacket instance representing this - * sequence of bytes. - * - * @return A MaplePacket with the bytes in this stream. - */ - public byte[] getPacket() { - return baos.toByteArray(); - } - - /** - * Changes this packet into a human-readable hexadecimal stream of bytes. - * - * @return This packet as hex digits. - */ - @Override - public String toString() { - return HexTool.toString(baos.toByteArray()); - } -} From fc7e97a355a6145347676f8777dfb262ef39cec4 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 23:18:20 +0200 Subject: [PATCH 16/36] Move MapleQuestItemCountFetcher to main module --- .../mapletools/QuestItemCountFetcher.java | 268 +++++++++++++++ .../lib/QuestReport.txt | 22 -- .../MapleQuestItemCountFetcher.java | 323 ------------------ .../src/maplequestitemcountfetcher/Pair.java | 121 ------- 4 files changed, 268 insertions(+), 466 deletions(-) create mode 100644 src/main/java/tools/mapletools/QuestItemCountFetcher.java delete mode 100644 tools/MapleQuestItemCountFetcher/lib/QuestReport.txt delete mode 100644 tools/MapleQuestItemCountFetcher/src/maplequestitemcountfetcher/MapleQuestItemCountFetcher.java delete mode 100644 tools/MapleQuestItemCountFetcher/src/maplequestitemcountfetcher/Pair.java diff --git a/src/main/java/tools/mapletools/QuestItemCountFetcher.java b/src/main/java/tools/mapletools/QuestItemCountFetcher.java new file mode 100644 index 0000000000..fb0a453a92 --- /dev/null +++ b/src/main/java/tools/mapletools/QuestItemCountFetcher.java @@ -0,0 +1,268 @@ +package tools.mapletools; + +import provider.wz.WZFiles; +import tools.Pair; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.*; + +/** + * @author RonanLana + *

+ * This application parses the Quest.wz file inputted and generates a report showing + * all cases where a quest requires an item, but doesn't take them, which may happen + * because the node representing the item doesn't have a "count" clause. + *

+ * Running it should generate a report file under "output" folder with the search results. + */ +public class QuestItemCountFetcher { + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("quest_item_count_report.txt"); + private static final String ACT_NAME = WZFiles.QUEST.getFilePath() + "/Act.img.xml"; + private static final String CHECK_NAME = WZFiles.QUEST.getFilePath() + "/Check.img.xml"; + private static final int INITIAL_STRING_LENGTH = 50; + + private static final Map> checkItems = new HashMap<>(); + private static final Map> actItems = new HashMap<>(); + + private static PrintWriter printWriter = null; + private static BufferedReader bufferedReader = null; + private static byte status = 0; + private static int questId = -1; + private static int isCompleteState = 0; + private static int curItemId; + private static int curItemCount; + + private static String getName(String token) { + int i, j; + char[] dest; + String d; + + i = token.lastIndexOf("name"); + i = token.indexOf("\"", i) + 1; //lower bound of the string + j = token.indexOf("\"", i); //upper bound + + dest = new char[INITIAL_STRING_LENGTH]; + token.getChars(i, j, dest, 0); + + d = new String(dest); + return (d.trim()); + } + + private static String getValue(String token) { + int i, j; + char[] dest; + String d; + + i = token.lastIndexOf("value"); + i = token.indexOf("\"", i) + 1; //lower bound of the string + j = token.indexOf("\"", i); //upper bound + + dest = new char[INITIAL_STRING_LENGTH]; + token.getChars(i, j, dest, 0); + + d = new String(dest); + return (d.trim()); + } + + private static void forwardCursor(int st) { + String line = null; + + try { + while (status >= st && (line = bufferedReader.readLine()) != null) { + simpleToken(line); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void simpleToken(String token) { + if (token.contains("/imgdir")) { + status -= 1; + } else if (token.contains("imgdir")) { + status += 1; + } + } + + private static void readItemLabel(String token) { + String name = getName(token); + String value = getValue(token); + + switch (name) { + case "id" -> curItemId = Integer.parseInt(value); + case "count" -> curItemCount = Integer.parseInt(value); + } + } + + private static void commitQuestItemPair(Map> map) { + Map list = map.get(questId); + if (list == null) { + list = new LinkedHashMap<>(); + map.put(questId, list); + } + + list.put(curItemId, curItemCount); + } + + private static void translateTokenAct(String token) { + String d; + + if (token.contains("/imgdir")) { + status -= 1; + + if (status == 4) { + if (curItemCount == Integer.MAX_VALUE && isCompleteState == 1) { + commitQuestItemPair(actItems); + } + } + } else if (token.contains("imgdir")) { + if (status == 1) { //getting QuestId + d = getName(token); + questId = Integer.parseInt(d); + } else if (status == 2) { //start/complete + d = getName(token); + isCompleteState = Integer.parseInt(d); + } else if (status == 3) { + if (!token.contains("item")) { + forwardCursor(status); + } + } else if (status == 4) { + curItemId = Integer.MAX_VALUE; + curItemCount = Integer.MAX_VALUE; + } + + status += 1; + } else { + if (status == 5) { + readItemLabel(token); + } + } + } + + private static void translateTokenCheck(String token) { + String d; + + if (token.contains("/imgdir")) { + status -= 1; + + if (status == 4) { + Map missedItems = actItems.get(questId); + + if (missedItems != null && missedItems.containsKey(curItemId) && isCompleteState == 1) { + commitQuestItemPair(checkItems); + } + } + } else if (token.contains("imgdir")) { + if (status == 1) { //getting QuestId + d = getName(token); + questId = Integer.parseInt(d); + } else if (status == 2) { //start/complete + d = getName(token); + isCompleteState = Integer.parseInt(d); + } else if (status == 3) { + if (!token.contains("item")) { + forwardCursor(status); + } + } else if (status == 4) { + curItemId = Integer.MAX_VALUE; + curItemCount = Integer.MAX_VALUE; + } + + status += 1; + } else { + if (status == 5) { + readItemLabel(token); + } + } + } + + private static void readQuestItemCountData() throws IOException { + String line; + + InputStreamReader fileReader = new InputStreamReader(new FileInputStream(ACT_NAME), StandardCharsets.UTF_8); + bufferedReader = new BufferedReader(fileReader); + + while ((line = bufferedReader.readLine()) != null) { + translateTokenAct(line); + } + + bufferedReader.close(); + fileReader.close(); + + fileReader = new InputStreamReader(new FileInputStream(CHECK_NAME), StandardCharsets.UTF_8); + bufferedReader = new BufferedReader(fileReader); + + while ((line = bufferedReader.readLine()) != null) { + translateTokenCheck(line); + } + + bufferedReader.close(); + fileReader.close(); + } + + private static void printReportFileHeader() { + printWriter.println(" # Report File autogenerated from the MapleQuestItemCountFetcher feature by Ronan Lana."); + printWriter.println(" # Generated data takes into account several data info from the server-side WZ.xmls."); + printWriter.println(); + } + + private static void printReportFileResults() { + List>> reports = new ArrayList<>(); + List> notChecked = new ArrayList<>(); + + for (Map.Entry> actItem : actItems.entrySet()) { + int questid = actItem.getKey(); + + for (Map.Entry actData : actItem.getValue().entrySet()) { + int itemid = actData.getKey(); + + Map checkData = checkItems.get(questid); + if (checkData != null) { + Integer count = checkData.get(itemid); + if (count != null) { + reports.add(new Pair<>(questid, new Pair<>(itemid, -count))); + } + } else { + notChecked.add(new Pair<>(questid, itemid)); + } + } + } + + for (Pair> r : reports) { + printWriter.println("Questid " + r.left + " : Itemid " + r.right.left + " should have qty " + r.right.right); + } + + for (Pair r : notChecked) { + printWriter.println("Questid " + r.left + " : Itemid " + r.right + " is unchecked"); + } + } + + private static void reportQuestItemCountData() { + // This will reference one line at a time + + try { + System.out.println("Reading WZs..."); + readQuestItemCountData(); + + System.out.println("Reporting results..."); + printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); + + printReportFileHeader(); + printReportFileResults(); + + printWriter.close(); + System.out.println("Done!"); + } catch (FileNotFoundException ex) { + System.out.println("Unable to open quest file."); + } catch (IOException ex) { + System.out.println("Error reading quest file."); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + reportQuestItemCountData(); + } +} diff --git a/tools/MapleQuestItemCountFetcher/lib/QuestReport.txt b/tools/MapleQuestItemCountFetcher/lib/QuestReport.txt deleted file mode 100644 index 2ac6bb6388..0000000000 --- a/tools/MapleQuestItemCountFetcher/lib/QuestReport.txt +++ /dev/null @@ -1,22 +0,0 @@ - # Report File autogenerated from the MapleQuestItemCountFetcher feature by Ronan Lana. - # Generated data takes into account several data info from the server-side WZ.xmls. - -Questid 2167 : Itemid 4031841 should have qty -1 -Questid 1018 : Itemid 4000142 should have qty -1 -Questid 6361 : Itemid 4031870 should have qty -1 -Questid 6360 : Itemid 4031869 should have qty -1 -Questid 10430 : Itemid 4220152 should have qty -1 -Questid 6390 : Itemid 4031874 should have qty -50 -Questid 2173 : Itemid 4031846 should have qty -1 -Questid 2169 : Itemid 4031843 should have qty -1 -Questid 2168 : Itemid 4031842 should have qty -1 -Questid 2185 : Itemid 4031852 should have qty -1 -Questid 6380 : Itemid 4031873 should have qty -50 -Questid 6350 : Itemid 4031871 should have qty -50 -Questid 2052 : Itemid 4031025 should have qty -10 -Questid 2053 : Itemid 4031026 should have qty -20 -Questid 2054 : Itemid 4031028 should have qty -30 -Questid 6340 : Itemid 4031872 should have qty -50 -Questid 28120 : Itemid 4032306 should have qty -4 -Questid 2180 : Itemid 4031850 should have qty -1 -Questid 2183 : Itemid 4031851 should have qty -1 diff --git a/tools/MapleQuestItemCountFetcher/src/maplequestitemcountfetcher/MapleQuestItemCountFetcher.java b/tools/MapleQuestItemCountFetcher/src/maplequestitemcountfetcher/MapleQuestItemCountFetcher.java deleted file mode 100644 index f06cd1f2f3..0000000000 --- a/tools/MapleQuestItemCountFetcher/src/maplequestitemcountfetcher/MapleQuestItemCountFetcher.java +++ /dev/null @@ -1,323 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package maplequestitemcountfetcher; - -import java.io.BufferedReader; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.List; -import java.util.LinkedHashMap; -import java.util.HashMap; -import java.util.Map; -import java.util.Map.Entry; - -/** - * - * @author RonanLana - - This application parses the Quest.wz file inputted and generates a report showing - all cases where a quest requires an item, but doesn't take them, which may happen - because the node representing the item doesn't have a "count" clause. - - Running it should generate a report file under "lib" folder with the search results. - - */ -public class MapleQuestItemCountFetcher { - static String actName = "../../wz/Quest.wz/Act.img.xml"; - static String checkName = "../../wz/Quest.wz/Check.img.xml"; - static String newFile = "lib/QuestReport.txt"; - - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static int initialLength = 200; - static int initialStringLength = 50; - - static byte status = 0; - static int questId = -1; - static int isCompleteState = 0; - - static int curItemId; - static int curItemCount; - - static Map> checkItems = new HashMap<>(); - static Map> actItems = new HashMap<>(); - - private static String getName(String token) { - int i, j; - char[] dest; - String d; - - i = token.lastIndexOf("name"); - i = token.indexOf("\"", i) + 1; //lower bound of the string - j = token.indexOf("\"", i); //upper bound - - dest = new char[initialStringLength]; - token.getChars(i, j, dest, 0); - - d = new String(dest); - return(d.trim()); - } - - private static String getValue(String token) { - int i, j; - char[] dest; - String d; - - i = token.lastIndexOf("value"); - i = token.indexOf("\"", i) + 1; //lower bound of the string - j = token.indexOf("\"", i); //upper bound - - dest = new char[initialStringLength]; - token.getChars(i, j, dest, 0); - - d = new String(dest); - return(d.trim()); - } - - private static void forwardCursor(int st) { - String line = null; - - try { - while(status >= st && (line = bufferedReader.readLine()) != null) { - simpleToken(line); - } - } - catch(Exception e) { - e.printStackTrace(); - } - } - - private static void simpleToken(String token) { - if(token.contains("/imgdir")) { - status -= 1; - } - else if(token.contains("imgdir")) { - status += 1; - } - } - - private static void readItemLabel(String token) { - String name = getName(token); - String value = getValue(token); - - switch(name) { - case "id": - curItemId = Integer.parseInt(value); - break; - - case "count": - curItemCount = Integer.parseInt(value); - break; - } - } - - private static void commitQuestItemPair(Map> map) { - Map list = map.get(questId); - if(list == null) { - list = new LinkedHashMap<>(); - map.put(questId, list); - } - - list.put(curItemId, curItemCount); - } - - private static void translateTokenAct(String token) { - String d; - - if(token.contains("/imgdir")) { - status -= 1; - - if(status == 4) { - if(curItemCount == Integer.MAX_VALUE && isCompleteState == 1) { - commitQuestItemPair(actItems); - } - } - } - else if(token.contains("imgdir")) { - if(status == 1) { //getting QuestId - d = getName(token); - questId = Integer.parseInt(d); - } - else if(status == 2) { //start/complete - d = getName(token); - isCompleteState = Integer.parseInt(d); - } - else if(status == 3) { - if(!token.contains("item")) { - forwardCursor(status); - } - } - else if(status == 4) { - curItemId = Integer.MAX_VALUE; - curItemCount = Integer.MAX_VALUE; - } - - status += 1; - } - else { - if(status == 5) { - readItemLabel(token); - } - } - } - - private static void translateTokenCheck(String token) { - String d; - - if(token.contains("/imgdir")) { - status -= 1; - - if(status == 4) { - Map missedItems = actItems.get(questId); - - if(missedItems != null && missedItems.containsKey(curItemId) && isCompleteState == 1) { - commitQuestItemPair(checkItems); - } - } - } - else if(token.contains("imgdir")) { - if(status == 1) { //getting QuestId - d = getName(token); - questId = Integer.parseInt(d); - } - else if(status == 2) { //start/complete - d = getName(token); - isCompleteState = Integer.parseInt(d); - } - else if(status == 3) { - if(!token.contains("item")) { - forwardCursor(status); - } - } - else if(status == 4) { - curItemId = Integer.MAX_VALUE; - curItemCount = Integer.MAX_VALUE; - } - - status += 1; - } - else { - if(status == 5) { - readItemLabel(token); - } - } - } - - private static void readQuestItemCountData() throws IOException { - String line; - - fileReader = new InputStreamReader(new FileInputStream(actName), "UTF-8"); - bufferedReader = new BufferedReader(fileReader); - - while((line = bufferedReader.readLine()) != null) { - translateTokenAct(line); - } - - bufferedReader.close(); - fileReader.close(); - - fileReader = new InputStreamReader(new FileInputStream(checkName), "UTF-8"); - bufferedReader = new BufferedReader(fileReader); - - while((line = bufferedReader.readLine()) != null) { - translateTokenCheck(line); - } - - bufferedReader.close(); - fileReader.close(); - } - - private static void printReportFileHeader() { - printWriter.println(" # Report File autogenerated from the MapleQuestItemCountFetcher feature by Ronan Lana."); - printWriter.println(" # Generated data takes into account several data info from the server-side WZ.xmls."); - printWriter.println(); - } - - private static void printReportFileResults() { - List>> reports = new ArrayList<>(); - List> notChecked = new ArrayList<>(); - - for(Entry> actItem : actItems.entrySet()) { - int questid = actItem.getKey(); - - for(Entry actData : actItem.getValue().entrySet()) { - int itemid = actData.getKey(); - - Map checkData = checkItems.get(questid); - if(checkData != null) { - Integer count = checkData.get(itemid); - if(count != null) { - reports.add(new Pair<>(questid, new Pair<>(itemid, -count))); - } - } else { - notChecked.add(new Pair<>(questid, itemid)); - } - } - } - - for(Pair> r : reports) { - printWriter.println("Questid " + r.left + " : Itemid " + r.right.left + " should have qty " + r.right.right); - } - - for(Pair r : notChecked) { - printWriter.println("Questid " + r.left + " : Itemid " + r.right + " is unchecked"); - } - } - - private static void ReportQuestItemCountData() { - // This will reference one line at a time - - try { - System.out.println("Reading WZs..."); - readQuestItemCountData(); - - System.out.println("Reporting results..."); - printWriter = new PrintWriter(newFile, "UTF-8"); - - printReportFileHeader(); - printReportFileResults(); - - printWriter.close(); - System.out.println("Done!"); - } - - catch(FileNotFoundException ex) { - System.out.println("Unable to open quest file."); - } - catch(IOException ex) { - System.out.println("Error reading quest file."); - } - - catch(Exception e) { - e.printStackTrace(); - } - } - - public static void main(String[] args) { - ReportQuestItemCountData(); - } - -} diff --git a/tools/MapleQuestItemCountFetcher/src/maplequestitemcountfetcher/Pair.java b/tools/MapleQuestItemCountFetcher/src/maplequestitemcountfetcher/Pair.java deleted file mode 100644 index 97ce258574..0000000000 --- a/tools/MapleQuestItemCountFetcher/src/maplequestitemcountfetcher/Pair.java +++ /dev/null @@ -1,121 +0,0 @@ -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 ~ 2010 Patrick Huy -Matthias Butz -Jan Christian Meyer - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License version 3 -as published by the Free Software Foundation. You may not use, modify -or distribute this program under any other version of the -GNU Affero General Public License. - -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 . - */ -package maplequestitemcountfetcher; - -/** - * Represents a pair of values. - * - * @author Frz - * @since Revision 333 - * @version 1.0 - * - * @param The type of the left value. - * @param The type of the right value. - */ -public class Pair { - - public E left; - public F right; - - /** - * Class constructor - pairs two objects together. - * - * @param left The left object. - * @param right The right object. - */ - public Pair(E left, F right) { - this.left = left; - this.right = right; - } - - /** - * Gets the left value. - * - * @return The left value. - */ - public E getLeft() { - return left; - } - - /** - * Gets the right value. - * - * @return The right value. - */ - public F getRight() { - return right; - } - - /** - * Turns the pair into a string. - * - * @return Each value of the pair as a string joined with a colon. - */ - @Override - public String toString() { - return left.toString() + ":" + right.toString(); - } - - /** - * Gets the hash code of this pair. - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((left == null) ? 0 : left.hashCode()); - result = prime * result + ((right == null) ? 0 : right.hashCode()); - return result; - } - - /** - * Checks to see if two pairs are equal. - */ - @SuppressWarnings("unchecked") - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Pair other = (Pair) obj; - if (left == null) { - if (other.left != null) { - return false; - } - } else if (!left.equals(other.left)) { - return false; - } - if (right == null) { - if (other.right != null) { - return false; - } - } else if (!right.equals(other.right)) { - return false; - } - return true; - } -} \ No newline at end of file From 1f94a3b545a08313153e1048f6f7ac3eba063995 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 23:26:05 +0200 Subject: [PATCH 17/36] Move MapleQuestlineFetcher to main module --- .../tools/mapletools/QuestlineFetcher.java | 334 +++++++--------- .../MapleQuestlineFetcher/lib/QuestReport.txt | 373 ------------------ .../src/maplequestlinefetcher/Pair.java | 121 ------ 3 files changed, 136 insertions(+), 692 deletions(-) rename tools/MapleQuestlineFetcher/src/maplequestlinefetcher/MapleQuestlineFetcher.java => src/main/java/tools/mapletools/QuestlineFetcher.java (54%) delete mode 100644 tools/MapleQuestlineFetcher/lib/QuestReport.txt delete mode 100644 tools/MapleQuestlineFetcher/src/maplequestlinefetcher/Pair.java diff --git a/tools/MapleQuestlineFetcher/src/maplequestlinefetcher/MapleQuestlineFetcher.java b/src/main/java/tools/mapletools/QuestlineFetcher.java similarity index 54% rename from tools/MapleQuestlineFetcher/src/maplequestlinefetcher/MapleQuestlineFetcher.java rename to src/main/java/tools/mapletools/QuestlineFetcher.java index 7e360efc0a..cd40f6c83b 100644 --- a/tools/MapleQuestlineFetcher/src/maplequestlinefetcher/MapleQuestlineFetcher.java +++ b/src/main/java/tools/mapletools/QuestlineFetcher.java @@ -1,89 +1,47 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. +import provider.wz.WZFiles; - 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 . -*/ -package maplequestlinefetcher; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.sql.Connection; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.LinkedList; -import java.util.List; -import java.util.HashMap; -import java.util.Map; -import java.util.HashSet; -import java.util.Set; -import java.util.Stack; +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.*; /** - * * @author RonanLana - - This application parses the Quest.wz file inputted and generates a report showing - all cases where quest script files have not been found for quests that requires a - script file. - As an extension, it highlights missing script files for questlines that hand over - skills as rewards. - - Running it should generate a report file under "lib" folder with the search results. - + *

+ * This application parses the Quest.wz file inputted and generates a report showing + * all cases where quest script files have not been found for quests that requires a + * script file. + * As an extension, it highlights missing script files for questlines that hand over + * skills as rewards. + *

+ * Running it should generate a report file under "output" folder with the search results. */ -public class MapleQuestlineFetcher { - static String actName = "../../wz/Quest.wz/Act.img.xml"; - static String checkName = "../../wz/Quest.wz/Check.img.xml"; - static String directoryName = "../.."; - static String newFile = "lib/QuestReport.txt"; +public class QuestlineFetcher { + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("questline_report.txt"); + private static final String ACT_NAME = WZFiles.QUEST.getFilePath() + "/Act.img.xml"; + private static final String CHECK_NAME = WZFiles.QUEST.getFilePath() + "/Check.img.xml"; + private static final int INITIAL_STRING_LENGTH = 50; + + private static final Stack skillObtainableQuests = new Stack<>(); + private static final Set scriptedQuestFiles = new HashSet<>(); + private static final Set expiredQuests = new HashSet<>(); + private static final Map> questDependencies = new HashMap<>(); + private static final Set nonScriptedQuests = new HashSet<>(); + private static final Set skillObtainableNonScriptedQuests = new HashSet<>(); + + private static PrintWriter printWriter = null; + private static InputStreamReader fileReader = null; + private static BufferedReader bufferedReader = null; + private static byte status = 0; + private static int questId = -1; + private static int isCompleteState = 0; + private static boolean isScriptedQuest; + private static boolean isExpiredQuest; + private static List questDependencyList; + private static int curQuestId; + private static int curQuestState; - static Connection con = null; - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static int initialLength = 200; - static int initialStringLength = 50; - - static byte status = 0; - static int questId = -1; - static int isCompleteState = 0; - static boolean isScriptedQuest; - static boolean isExpiredQuest; - static List questDependencyList; - - static int curQuestId; - static int curQuestState; - - static Stack skillObtainableQuests = new Stack<>(); - static Set scriptedQuestFiles = new HashSet<>(); - static Set expiredQuests = new HashSet<>(); - - static Map> questDependencies = new HashMap<>(); - - static Set nonScriptedQuests = new HashSet<>(); - static Set skillObtainableNonScriptedQuests = new HashSet<>(); - private static String getName(String token) { int i, j; char[] dest; @@ -93,13 +51,13 @@ public class MapleQuestlineFetcher { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static String getValue(String token) { int i, j; char[] dest; @@ -109,108 +67,97 @@ public class MapleQuestlineFetcher { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static void forwardCursor(int st) { String line = null; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { simpleToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } private static void simpleToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; } } - + private static void translateTokenCheck(String token) { String d; - - if(token.contains("/imgdir")) { + + if (token.contains("/imgdir")) { status -= 1; - - if(status == 1) { + + if (status == 1) { evaluateCurrentQuest(); - } - else if(status == 4) { + } else if (status == 4) { evaluateCurrentQuestDependency(); } - } - else if(token.contains("imgdir")) { - if(status == 1) { //getting QuestId + } else if (token.contains("imgdir")) { + if (status == 1) { //getting QuestId d = getName(token); questId = Integer.parseInt(d); - + isScriptedQuest = false; isExpiredQuest = false; questDependencyList = new LinkedList<>(); - } - else if(status == 2) { //start/complete + } else if (status == 2) { //start/complete d = getName(token); isCompleteState = Integer.parseInt(d); - } - else if(status == 3) { - if(isCompleteState == 1 || !token.contains("quest")) { + } else if (status == 3) { + if (isCompleteState == 1 || !token.contains("quest")) { forwardCursor(status); } } - + status += 1; - } - else { - if(status == 3) { + } else { + if (status == 3) { d = getName(token); - - if(d.contains("script")) { + + if (d.contains("script")) { isScriptedQuest = true; - } else if(d.contains("end")) { + } else if (d.contains("end")) { isExpiredQuest = true; } - } - else if(status == 5) { + } else if (status == 5) { readQuestLabel(token); } } } - + private static void translateTokenAct(String token) { String d; - - if(token.contains("/imgdir")) { + + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { - if(status == 1) { //getting QuestId + } else if (token.contains("imgdir")) { + if (status == 1) { //getting QuestId d = getName(token); questId = Integer.parseInt(d); - } - else if(status == 2) { //start/complete + } else if (status == 2) { //start/complete d = getName(token); isCompleteState = Integer.parseInt(d); - } - else if(status == 3) { - if(isCompleteState == 1 && token.contains("skill")) { + } else if (status == 3) { + if (isCompleteState == 1 && token.contains("skill")) { skillObtainableQuests.add(questId); } - + forwardCursor(status); } - + status += 1; } } @@ -219,34 +166,29 @@ public class MapleQuestlineFetcher { String name = getName(token); String value = getValue(token); - switch(name) { - case "id": - curQuestId = Integer.parseInt(value); - break; - - case "state": - curQuestState = Integer.parseInt(value); - break; + switch (name) { + case "id" -> curQuestId = Integer.parseInt(value); + case "state" -> curQuestState = Integer.parseInt(value); } } - + private static void evaluateCurrentQuestDependency() { - if(curQuestState == 2) { + if (curQuestState == 2) { questDependencyList.add(curQuestId); } } - + private static void evaluateCurrentQuest() { - if(isScriptedQuest && !scriptedQuestFiles.contains(questId)) { + if (isScriptedQuest && !scriptedQuestFiles.contains(questId)) { nonScriptedQuests.add(questId); } - if(isExpiredQuest) { + if (isExpiredQuest) { expiredQuests.add(questId); } - + questDependencies.put(questId, questDependencyList); } - + private static void instantiateQuestScriptFiles(String directoryName) { File directory = new File(directoryName); @@ -255,130 +197,126 @@ public class MapleQuestlineFetcher { for (File file : fList) { if (file.isFile()) { String fname = file.getName(); - + try { Integer questid = Integer.parseInt(fname.substring(0, fname.indexOf('.'))); scriptedQuestFiles.add(questid); - } catch(NumberFormatException nfe) {} + } catch (NumberFormatException nfe) { + } } } } - + private static void readQuestsWithMissingScripts() throws IOException { String line; - - fileReader = new InputStreamReader(new FileInputStream(checkName), "UTF-8"); + + fileReader = new InputStreamReader(new FileInputStream(CHECK_NAME), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { translateTokenCheck(line); } bufferedReader.close(); fileReader.close(); } - + private static void readQuestsWithSkillReward() throws IOException { String line; - - fileReader = new InputStreamReader(new FileInputStream(actName), "UTF-8"); + + fileReader = new InputStreamReader(new FileInputStream(ACT_NAME), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { translateTokenAct(line); } bufferedReader.close(); fileReader.close(); } - + private static void calculateSkillRelatedMissingQuestScripts() { Stack frontierQuests = skillObtainableQuests; Set solvedQuests = new HashSet<>(); - - while(!frontierQuests.isEmpty()) { + + while (!frontierQuests.isEmpty()) { Integer questid = frontierQuests.pop(); solvedQuests.add(questid); - - if(nonScriptedQuests.contains(questid)) { + + if (nonScriptedQuests.contains(questid)) { skillObtainableNonScriptedQuests.add(questid); nonScriptedQuests.remove(questid); } - + List questDependency = questDependencies.get(questid); - for(Integer i : questDependency) { - if(!solvedQuests.contains(i)) { + for (Integer i : questDependency) { + if (!solvedQuests.contains(i)) { frontierQuests.add(i); } } } } - + private static void printReportFileHeader() { printWriter.println(" # Report File autogenerated from the MapleQuestlineFetcher feature by Ronan Lana."); printWriter.println(" # Generated data takes into account several data info from the server-side WZ.xmls."); printWriter.println(); } - + private static List getSortedListEntries(Set set) { List list = new ArrayList<>(set); Collections.sort(list); - + return list; } - + private static void printReportFileResults() { - if(!skillObtainableNonScriptedQuests.isEmpty()) { + if (!skillObtainableNonScriptedQuests.isEmpty()) { printWriter.println("SKILL-RELATED NON-SCRIPTED QUESTS"); - for(Integer nsq : getSortedListEntries(skillObtainableNonScriptedQuests)) { + for (Integer nsq : getSortedListEntries(skillObtainableNonScriptedQuests)) { printWriter.println(" " + nsq + (expiredQuests.contains(nsq) ? " EXPIRED" : "")); } - + printWriter.println(); } - + printWriter.println("\nCOMMON NON-SCRIPTED QUESTS"); - for(Integer nsq : getSortedListEntries(nonScriptedQuests)) { + for (Integer nsq : getSortedListEntries(nonScriptedQuests)) { printWriter.println(" " + nsq + (expiredQuests.contains(nsq) ? " EXPIRED" : "")); } } - - private static void ReportQuestlineData() { + + private static void reportQuestlineData() { // This will reference one line at a time - + try { System.out.println("Reading quest scripts..."); - instantiateQuestScriptFiles(directoryName + "/scripts/quest"); - + instantiateQuestScriptFiles(ToolConstants.SCRIPTS_PATH + "/quest"); + System.out.println("Reading WZs..."); readQuestsWithSkillReward(); readQuestsWithMissingScripts(); - + System.out.println("Calculating skill related quests..."); calculateSkillRelatedMissingQuestScripts(); - + System.out.println("Reporting results..."); - printWriter = new PrintWriter(newFile, "UTF-8"); - + printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); + printReportFileHeader(); printReportFileResults(); - + printWriter.close(); System.out.println("Done!"); - } - - catch(FileNotFoundException ex) { + } catch (FileNotFoundException ex) { System.out.println("Unable to open quest file."); - } - catch(IOException ex) { + } catch (IOException ex) { System.out.println("Error reading quest file."); - } - - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + /* private static List>> getSortedMapEntries(Map> map) { List>> list = new ArrayList<>(map.size()); @@ -387,27 +325,27 @@ public class MapleQuestlineFetcher { for(Integer i : e.getValue()) { il.add(i); } - + Collections.sort(il, new Comparator() { @Override public int compare(Integer o1, Integer o2) { return o1 - o2; } }); - + list.add(new Pair<>(e.getKey(), il)); } - + Collections.sort(list, new Comparator>>() { @Override public int compare(Pair> o1, Pair> o2) { return o1.getLeft() - o2.getLeft(); } }); - + return list; } - + private static void DumpQuestlineData() { for(Pair> questDependency : getSortedMapEntries(questDependencies)) { if(!questDependency.right.isEmpty()) { @@ -416,9 +354,9 @@ public class MapleQuestlineFetcher { } } */ - + public static void main(String[] args) { - ReportQuestlineData(); + reportQuestlineData(); } - } + diff --git a/tools/MapleQuestlineFetcher/lib/QuestReport.txt b/tools/MapleQuestlineFetcher/lib/QuestReport.txt deleted file mode 100644 index c4ef7db9fb..0000000000 --- a/tools/MapleQuestlineFetcher/lib/QuestReport.txt +++ /dev/null @@ -1,373 +0,0 @@ - # Report File autogenerated from the MapleQuestlineFetcher feature by Ronan Lana. - # Generated data takes into account several data info from the server-side WZ.xmls. - -SKILL-RELATED NON-SCRIPTED QUESTS - 20500 EXPIRED - 20502 EXPIRED - - -COMMON NON-SCRIPTED QUESTS - 1028 - 1048 EXPIRED - 1049 EXPIRED - 1050 EXPIRED - 1051 EXPIRED - 1052 EXPIRED - 1053 EXPIRED - 1054 EXPIRED - 2147 EXPIRED - 2228 - 2232 - 2233 - 2234 - 2238 - 2245 - 2257 - 2258 - 2259 - 2260 - 2291 - 2338 - 3305 EXPIRED - 3306 EXPIRED - 3529 - 3714 - 4482 EXPIRED - 4483 EXPIRED - 4490 EXPIRED - 4676 EXPIRED - 6700 EXPIRED - 8247 EXPIRED - 9432 EXPIRED - 9633 EXPIRED - 9680 EXPIRED - 9682 EXPIRED - 9683 EXPIRED - 9684 EXPIRED - 9685 EXPIRED - 9690 EXPIRED - 9691 EXPIRED - 9692 EXPIRED - 9693 EXPIRED - 9694 EXPIRED - 9695 EXPIRED - 9696 EXPIRED - 9697 EXPIRED - 9698 EXPIRED - 9699 EXPIRED - 9700 EXPIRED - 9701 EXPIRED - 9702 EXPIRED - 9703 EXPIRED - 9730 EXPIRED - 9731 EXPIRED - 9732 EXPIRED - 9733 EXPIRED - 9734 EXPIRED - 9735 EXPIRED - 9745 EXPIRED - 9746 EXPIRED - 9747 EXPIRED - 9840 EXPIRED - 9841 EXPIRED - 9842 EXPIRED - 9844 EXPIRED - 9845 EXPIRED - 9846 EXPIRED - 9847 EXPIRED - 9849 EXPIRED - 9850 EXPIRED - 9851 EXPIRED - 9860 EXPIRED - 9875 EXPIRED - 9878 EXPIRED - 9880 EXPIRED - 9881 EXPIRED - 9882 EXPIRED - 9883 EXPIRED - 9884 EXPIRED - 9885 EXPIRED - 9887 EXPIRED - 9890 EXPIRED - 9891 EXPIRED - 9892 EXPIRED - 9893 EXPIRED - 9900 EXPIRED - 9901 EXPIRED - 9902 EXPIRED - 9903 EXPIRED - 9904 EXPIRED - 9905 EXPIRED - 9906 EXPIRED - 9907 EXPIRED - 9908 EXPIRED - 9909 EXPIRED - 9920 EXPIRED - 9922 EXPIRED - 9924 EXPIRED - 9925 EXPIRED - 9926 EXPIRED - 9927 EXPIRED - 9928 EXPIRED - 9929 EXPIRED - 9930 EXPIRED - 9931 EXPIRED - 9932 EXPIRED - 9933 EXPIRED - 9934 EXPIRED - 9935 EXPIRED - 9936 EXPIRED - 9937 EXPIRED - 9938 EXPIRED - 9939 EXPIRED - 9943 EXPIRED - 9947 EXPIRED - 9950 EXPIRED - 9951 EXPIRED - 9961 EXPIRED - 9965 EXPIRED - 9970 EXPIRED - 9980 EXPIRED - 9981 EXPIRED - 9982 EXPIRED - 9983 EXPIRED - 9984 EXPIRED - 9985 EXPIRED - 9990 EXPIRED - 9991 EXPIRED - 9997 EXPIRED - 10002 EXPIRED - 10008 EXPIRED - 10010 EXPIRED - 10011 EXPIRED - 10012 EXPIRED - 10014 EXPIRED - 10034 EXPIRED - 10036 EXPIRED - 10037 EXPIRED - 10039 EXPIRED - 10043 EXPIRED - 10046 EXPIRED - 10050 EXPIRED - 10052 EXPIRED - 10059 EXPIRED - 10066 EXPIRED - 10069 EXPIRED - 10074 EXPIRED - 10075 EXPIRED - 10076 EXPIRED - 10077 EXPIRED - 10078 EXPIRED - 10079 EXPIRED - 10082 EXPIRED - 10083 EXPIRED - 10084 EXPIRED - 10085 EXPIRED - 10086 EXPIRED - 10087 EXPIRED - 10088 EXPIRED - 10089 EXPIRED - 10090 EXPIRED - 10091 EXPIRED - 10092 EXPIRED - 10093 EXPIRED - 10094 EXPIRED - 10095 EXPIRED - 10096 EXPIRED - 10097 EXPIRED - 10098 EXPIRED - 10099 EXPIRED - 10100 EXPIRED - 10101 EXPIRED - 10102 EXPIRED - 10103 EXPIRED - 10104 EXPIRED - 10105 EXPIRED - 10106 EXPIRED - 10108 EXPIRED - 10110 EXPIRED - 10206 EXPIRED - 10207 EXPIRED - 10208 EXPIRED - 10209 EXPIRED - 10210 EXPIRED - 10211 EXPIRED - 10212 EXPIRED - 10213 EXPIRED - 10214 EXPIRED - 10215 EXPIRED - 10216 EXPIRED - 10217 EXPIRED - 10218 EXPIRED - 10219 EXPIRED - 10220 EXPIRED - 10222 EXPIRED - 10224 EXPIRED - 10231 EXPIRED - 10240 EXPIRED - 10241 EXPIRED - 10242 EXPIRED - 10243 EXPIRED - 10244 EXPIRED - 10245 EXPIRED - 10246 EXPIRED - 10247 EXPIRED - 10248 EXPIRED - 10249 EXPIRED - 10250 EXPIRED - 10251 EXPIRED - 10252 EXPIRED - 10253 EXPIRED - 10254 EXPIRED - 10255 EXPIRED - 10256 EXPIRED - 10260 EXPIRED - 10261 EXPIRED - 10262 EXPIRED - 10263 EXPIRED - 10264 EXPIRED - 10265 EXPIRED - 10266 EXPIRED - 10267 EXPIRED - 10268 EXPIRED - 10270 EXPIRED - 10271 EXPIRED - 10272 EXPIRED - 10274 EXPIRED - 10275 EXPIRED - 10276 EXPIRED - 10277 EXPIRED - 10278 EXPIRED - 10279 EXPIRED - 10280 EXPIRED - 10281 EXPIRED - 10282 EXPIRED - 10283 EXPIRED - 10284 EXPIRED - 10287 EXPIRED - 10300 EXPIRED - 10301 EXPIRED - 10302 EXPIRED - 10311 EXPIRED - 10312 EXPIRED - 10313 EXPIRED - 10314 EXPIRED - 10315 EXPIRED - 10316 EXPIRED - 10317 EXPIRED - 10318 EXPIRED - 10319 EXPIRED - 10320 EXPIRED - 10321 EXPIRED - 10324 EXPIRED - 10325 EXPIRED - 10326 EXPIRED - 10327 EXPIRED - 10329 EXPIRED - 10330 EXPIRED - 10331 EXPIRED - 10332 EXPIRED - 10333 EXPIRED - 10340 EXPIRED - 10341 EXPIRED - 10342 EXPIRED - 10344 EXPIRED - 10345 EXPIRED - 10346 EXPIRED - 10347 EXPIRED - 10348 EXPIRED - 10349 EXPIRED - 10350 EXPIRED - 10351 EXPIRED - 10352 EXPIRED - 10353 EXPIRED - 10354 EXPIRED - 10355 EXPIRED - 10356 EXPIRED - 10360 EXPIRED - 10370 EXPIRED - 10380 EXPIRED - 10394 EXPIRED - 10395 EXPIRED - 10396 EXPIRED - 10397 EXPIRED - 10398 EXPIRED - 10400 EXPIRED - 10401 EXPIRED - 10415 EXPIRED - 10417 EXPIRED - 10418 EXPIRED - 10419 EXPIRED - 10420 EXPIRED - 10450 EXPIRED - 10451 EXPIRED - 10452 EXPIRED - 10453 EXPIRED - 10454 EXPIRED - 10455 EXPIRED - 10456 EXPIRED - 10457 EXPIRED - 10470 EXPIRED - 19000 - 19001 - 19002 - 19005 EXPIRED - 19006 EXPIRED - 20015 - 20020 - 20400 - 20401 - 20405 - 20406 - 20408 - 20506 EXPIRED - 20507 EXPIRED - 20509 EXPIRED - 21303 - 28004 EXPIRED - 28117 EXPIRED - 28118 EXPIRED - 28131 EXPIRED - 28137 EXPIRED - 28138 EXPIRED - 28139 EXPIRED - 28140 EXPIRED - 28141 EXPIRED - 28142 EXPIRED - 28143 EXPIRED - 28144 EXPIRED - 28145 EXPIRED - 28146 EXPIRED - 28147 EXPIRED - 28148 EXPIRED - 28149 EXPIRED - 28150 EXPIRED - 28151 EXPIRED - 28152 EXPIRED - 28153 EXPIRED - 28154 EXPIRED - 28155 EXPIRED - 28156 EXPIRED - 28157 EXPIRED - 28158 EXPIRED - 28159 EXPIRED - 28160 EXPIRED - 28161 EXPIRED - 28284 EXPIRED - 28285 EXPIRED - 28286 EXPIRED - 28304 EXPIRED - 28311 EXPIRED - 28318 EXPIRED - 28326 EXPIRED - 28327 EXPIRED - 28328 EXPIRED - 28333 EXPIRED - 28337 EXPIRED - 29500 - 29501 - 29502 - 29503 - 29505 - 29506 - 29508 diff --git a/tools/MapleQuestlineFetcher/src/maplequestlinefetcher/Pair.java b/tools/MapleQuestlineFetcher/src/maplequestlinefetcher/Pair.java deleted file mode 100644 index ae652848a9..0000000000 --- a/tools/MapleQuestlineFetcher/src/maplequestlinefetcher/Pair.java +++ /dev/null @@ -1,121 +0,0 @@ -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 ~ 2010 Patrick Huy -Matthias Butz -Jan Christian Meyer - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License version 3 -as published by the Free Software Foundation. You may not use, modify -or distribute this program under any other version of the -GNU Affero General Public License. - -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 . - */ -package maplequestlinefetcher; - -/** - * Represents a pair of values. - * - * @author Frz - * @since Revision 333 - * @version 1.0 - * - * @param The type of the left value. - * @param The type of the right value. - */ -public class Pair { - - public E left; - public F right; - - /** - * Class constructor - pairs two objects together. - * - * @param left The left object. - * @param right The right object. - */ - public Pair(E left, F right) { - this.left = left; - this.right = right; - } - - /** - * Gets the left value. - * - * @return The left value. - */ - public E getLeft() { - return left; - } - - /** - * Gets the right value. - * - * @return The right value. - */ - public F getRight() { - return right; - } - - /** - * Turns the pair into a string. - * - * @return Each value of the pair as a string joined with a colon. - */ - @Override - public String toString() { - return left.toString() + ":" + right.toString(); - } - - /** - * Gets the hash code of this pair. - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((left == null) ? 0 : left.hashCode()); - result = prime * result + ((right == null) ? 0 : right.hashCode()); - return result; - } - - /** - * Checks to see if two pairs are equal. - */ - @SuppressWarnings("unchecked") - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Pair other = (Pair) obj; - if (left == null) { - if (other.left != null) { - return false; - } - } else if (!left.equals(other.left)) { - return false; - } - if (right == null) { - if (other.right != null) { - return false; - } - } else if (!right.equals(other.right)) { - return false; - } - return true; - } -} \ No newline at end of file From 26e98d012fcaa877440ca133093998072b6b73a1 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 23:35:43 +0200 Subject: [PATCH 18/36] Move MapleEventMethodFiller to main module --- pom.xml | 5 + .../tools/mapletools/EventMethodFiller.java | 102 ++++++++++++++ .../MapleEventMethodFiller.java | 126 ------------------ 3 files changed, 107 insertions(+), 126 deletions(-) create mode 100644 src/main/java/tools/mapletools/EventMethodFiller.java delete mode 100644 tools/MapleEventMethodFiller/src/mapleeventmethodfiller/MapleEventMethodFiller.java diff --git a/pom.xml b/pom.xml index 7df287a87f..cb56cd7ae4 100644 --- a/pom.xml +++ b/pom.xml @@ -47,6 +47,11 @@ jcip-annotations 1.0 + + commons-io + commons-io + 2.10.0 + diff --git a/src/main/java/tools/mapletools/EventMethodFiller.java b/src/main/java/tools/mapletools/EventMethodFiller.java new file mode 100644 index 0000000000..473fbbde75 --- /dev/null +++ b/src/main/java/tools/mapletools/EventMethodFiller.java @@ -0,0 +1,102 @@ +package tools.mapletools; + +import org.apache.commons.io.FileUtils; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @author RonanLana + *

+ * This application objective is to read all scripts from the event folder + * and fill empty functions for every function name not yet present in the + * script. + *

+ * Estimated parse time: 10 seconds + */ +public class EventMethodFiller { + private static boolean foundMatchingDataOnFile(String fileContent, Pattern pattern) { + Matcher matcher = pattern.matcher(fileContent); + return matcher.find(); + } + + private static void fileSearchMatchingData(File file, Map functions) { + try { + String fileContent = FileUtils.readFileToString(file, "UTF-8"); + List fillFunctions = new LinkedList<>(); + + for (Map.Entry f : functions.entrySet()) { + if (!foundMatchingDataOnFile(fileContent, f.getKey())) { + fillFunctions.add(f.getValue()); + } + } + + if (!fillFunctions.isEmpty()) { + System.out.println("Filling out " + file.getName() + "..."); + + FileWriter fileWriter = new FileWriter(file, true); + PrintWriter printWriter = new PrintWriter(fileWriter); + + printWriter.println(); + printWriter.println(); + printWriter.println("// ---------- FILLER FUNCTIONS ----------"); + printWriter.println(); + + for (String s : fillFunctions) { + printWriter.println(s); + printWriter.println(); + } + + printWriter.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static void filterDirectorySearchMatchingData(String directoryPath, Map functions) { + Iterator iter = FileUtils.iterateFiles(new File(directoryPath), new String[]{"sql", "js", "txt", "java"}, true); + + while (iter.hasNext()) { + File file = (File) iter.next(); + fileSearchMatchingData(file, functions); + } + } + + private static Pattern compileJsFunctionPattern(String function) { + String jsFunction = "function(\\s)+"; + return Pattern.compile(jsFunction + function); + } + + private static Map getFunctions() { + Map functions = new HashMap<>(); + functions.put(compileJsFunctionPattern("playerEntry"), "function playerEntry(eim, player) {}"); + functions.put(compileJsFunctionPattern("playerExit"), "function playerExit(eim, player) {}"); + functions.put(compileJsFunctionPattern("scheduledTimeout"), "function scheduledTimeout(eim) {}"); + functions.put(compileJsFunctionPattern("playerUnregistered"), "function playerUnregistered(eim, player) {}"); + functions.put(compileJsFunctionPattern("changedLeader"), "function changedLeader(eim, leader) {}"); + functions.put(compileJsFunctionPattern("monsterKilled"), "function monsterKilled(mob, eim) {}"); + functions.put(compileJsFunctionPattern("allMonstersDead"), "function allMonstersDead(eim) {}"); + functions.put(compileJsFunctionPattern("playerDisconnected"), "function playerDisconnected(eim, player) {}"); + functions.put(compileJsFunctionPattern("monsterValue"), "function monsterValue(eim, mobid) {return 0;}"); + functions.put(compileJsFunctionPattern("dispose"), "function dispose() {}"); + functions.put(compileJsFunctionPattern("leftParty"), "function leftParty(eim, player) {}"); + functions.put(compileJsFunctionPattern("disbandParty"), "function disbandParty(eim, player) {}"); + functions.put(compileJsFunctionPattern("clearPQ"), "function clearPQ(eim) {}"); + functions.put(compileJsFunctionPattern("afterSetup"), "function afterSetup(eim) {}"); + functions.put(compileJsFunctionPattern("cancelSchedule"), "function cancelSchedule() {}"); + functions.put(compileJsFunctionPattern("setup"), "function setup(eim, leaderid) {}"); + //put(compileJsFunctionPattern("getEligibleParty"), "function getEligibleParty(party) {}"); not really needed + return functions; + } + + public static void main(String[] args) { + filterDirectorySearchMatchingData(ToolConstants.SCRIPTS_PATH + "/event", getFunctions()); + } + +} diff --git a/tools/MapleEventMethodFiller/src/mapleeventmethodfiller/MapleEventMethodFiller.java b/tools/MapleEventMethodFiller/src/mapleeventmethodfiller/MapleEventMethodFiller.java deleted file mode 100644 index d051511efc..0000000000 --- a/tools/MapleEventMethodFiller/src/mapleeventmethodfiller/MapleEventMethodFiller.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package mapleeventmethodfiller; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.apache.commons.io.FileUtils; - -/** - * - * @author RonanLana - * - This application objective is to read all scripts from the event folder - and fill empty functions for every function name not yet present in the - script. - - Estimated parse time: 10 seconds - */ -public class MapleEventMethodFiller { - - private static boolean foundMatchingDataOnFile(String fileContent, Pattern pattern) { - Matcher matcher = pattern.matcher(fileContent); - return matcher.find(); - } - - private static void fileSearchMatchingData(File file, Map functions) { - try { - String fileContent = FileUtils.readFileToString(file, "UTF-8"); - List fillFunctions = new LinkedList<>(); - - for(Entry f : functions.entrySet()) { - if(!foundMatchingDataOnFile(fileContent, f.getKey())) { - fillFunctions.add(f.getValue()); - } - } - - if (!fillFunctions.isEmpty()) { - System.out.println("Filling out " + file.getName() + "..."); - - FileWriter fileWriter = new FileWriter(file, true); - PrintWriter printWriter = new PrintWriter(fileWriter); - - printWriter.println(); - printWriter.println(); - printWriter.println("// ---------- FILLER FUNCTIONS ----------"); - printWriter.println(); - - for (String s : fillFunctions) { - printWriter.println(s); - printWriter.println(); - } - - printWriter.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - private static void filterDirectorySearchMatchingData(String directoryPath, Map functions) { - Iterator iter = FileUtils.iterateFiles(new File(directoryPath), new String[]{"sql", "js", "txt","java"}, true); - - while(iter.hasNext()) { - File file = (File) iter.next(); - fileSearchMatchingData(file, functions); - } - } - - private static String jsFunction = "function(\\s)+"; - - private static Pattern compileJsFunctionPattern(String function) { - return Pattern.compile(jsFunction + function); - } - - public static final Map functions = new HashMap(17) {{ - put(compileJsFunctionPattern("playerEntry"), "function playerEntry(eim, player) {}"); - put(compileJsFunctionPattern("playerExit"), "function playerExit(eim, player) {}"); - put(compileJsFunctionPattern("scheduledTimeout"), "function scheduledTimeout(eim) {}"); - put(compileJsFunctionPattern("playerUnregistered"), "function playerUnregistered(eim, player) {}"); - put(compileJsFunctionPattern("changedLeader"), "function changedLeader(eim, leader) {}"); - put(compileJsFunctionPattern("monsterKilled"), "function monsterKilled(mob, eim) {}"); - put(compileJsFunctionPattern("allMonstersDead"), "function allMonstersDead(eim) {}"); - put(compileJsFunctionPattern("playerDisconnected"), "function playerDisconnected(eim, player) {}"); - put(compileJsFunctionPattern("monsterValue"), "function monsterValue(eim, mobid) {return 0;}"); - put(compileJsFunctionPattern("dispose"), "function dispose() {}"); - put(compileJsFunctionPattern("leftParty"), "function leftParty(eim, player) {}"); - put(compileJsFunctionPattern("disbandParty"), "function disbandParty(eim, player) {}"); - put(compileJsFunctionPattern("clearPQ"), "function clearPQ(eim) {}"); - put(compileJsFunctionPattern("afterSetup"), "function afterSetup(eim) {}"); - put(compileJsFunctionPattern("cancelSchedule"), "function cancelSchedule() {}"); - put(compileJsFunctionPattern("setup"), "function setup(eim, leaderid) {}"); - //put(compileJsFunctionPattern("getEligibleParty"), "function getEligibleParty(party) {}"); not really needed - }}; - - public static void main(String[] args) { - filterDirectorySearchMatchingData("../../scripts/event", functions); - } - -} From a0215cd3f44d2a9e93e648cd7fd2e786147b32a2 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sat, 10 Jul 2021 23:42:25 +0200 Subject: [PATCH 19/36] Move MapleMapFieldLimitChecker to main module --- .../mapletools/MapFieldLimitChecker.java | 129 ++++++--------- .../MapleMapFieldLimitChecker/lib/Report.txt | 149 ------------------ 2 files changed, 46 insertions(+), 232 deletions(-) rename tools/MapleMapFieldLimitChecker/src/maplemapfieldlimitchecker/MapleMapFieldLimitChecker.java => src/main/java/tools/mapletools/MapFieldLimitChecker.java (52%) delete mode 100644 tools/MapleMapFieldLimitChecker/lib/Report.txt diff --git a/tools/MapleMapFieldLimitChecker/src/maplemapfieldlimitchecker/MapleMapFieldLimitChecker.java b/src/main/java/tools/mapletools/MapFieldLimitChecker.java similarity index 52% rename from tools/MapleMapFieldLimitChecker/src/maplemapfieldlimitchecker/MapleMapFieldLimitChecker.java rename to src/main/java/tools/mapletools/MapFieldLimitChecker.java index 657ca2ebc4..da54249d97 100644 --- a/tools/MapleMapFieldLimitChecker/src/maplemapfieldlimitchecker/MapleMapFieldLimitChecker.java +++ b/src/main/java/tools/mapletools/MapFieldLimitChecker.java @@ -1,56 +1,25 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2018 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. +import provider.wz.WZFiles; - 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 . -*/ -package maplemapfieldlimitchecker; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStreamReader; -import java.io.IOException; -import java.io.PrintWriter; +import java.io.*; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; /** - * * @author RonanLana - * - This application seeks from the XMLs all mapid entries that holds the specified - fieldLimit. + *

+ * This application seeks from the XMLs all mapid entries that holds the specified + * fieldLimit. */ -public class MapleMapFieldLimitChecker { - - static String newFile = "lib/Report.txt"; - static String outputWzPath = "lib"; - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static String wzPath = "../../wz"; - static int initialStringLength = 50; - static int itemFileNameSize = 13; - - static int fieldLimit = 0x400000; - - static byte status = 0; - static int mapid = 0; - +public class MapFieldLimitChecker { + private static final int INITIAL_STRING_LENGTH = 50; + private static final int FIELD_LIMIT = 0x400000; + + private static BufferedReader bufferedReader = null; + private static byte status = 0; + private static int mapid = 0; + private static String getName(String token) { int i, j; char[] dest; @@ -60,13 +29,13 @@ public class MapleMapFieldLimitChecker { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static String getValue(String token) { int i, j; char[] dest; @@ -76,35 +45,33 @@ public class MapleMapFieldLimitChecker { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static void forwardCursor(int st) { String line = null; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { simpleToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } private static void simpleToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; } } - + private static void listFiles(String directoryName, ArrayList files) { File directory = new File(directoryName); @@ -118,65 +85,62 @@ public class MapleMapFieldLimitChecker { } } } - + private static int getMapIdFromFilename(String name) { try { - return Integer.valueOf(name.substring(0, name.indexOf('.'))); - } catch(Exception e) { + return Integer.parseInt(name.substring(0, name.indexOf('.'))); + } catch (Exception e) { return -1; } } - + private static void translateToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; - + if (status == 2) { String d = getName(token); if (!d.contentEquals("info")) { forwardCursor(status); } } - } - else { + } else { if (status == 2) { String d = getName(token); - + if (d.contentEquals("fieldLimit")) { - int value = Integer.valueOf(getValue(token)); - if ((value & fieldLimit) == fieldLimit) { + int value = Integer.parseInt(getValue(token)); + if ((value & FIELD_LIMIT) == FIELD_LIMIT) { System.out.println(mapid + " " + value); } } } } } - + private static void inspectMapEntry() { String line = null; try { - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { translateToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static void loadMapWz() throws IOException { System.out.println("Reading Map.wz ..."); ArrayList files = new ArrayList<>(); - listFiles(wzPath + "/Map.wz/Map", files); + listFiles(WZFiles.MAP.getFilePath() + "/Map", files); - for(File f : files) { - fileReader = new InputStreamReader(new FileInputStream(f), "UTF-8"); + for (File f : files) { + InputStreamReader fileReader = new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - + mapid = getMapIdFromFilename(f.getName()); inspectMapEntry(); @@ -184,7 +148,7 @@ public class MapleMapFieldLimitChecker { fileReader.close(); } } - + public static void main(String[] args) { try { loadMapWz(); @@ -193,5 +157,4 @@ public class MapleMapFieldLimitChecker { ioe.printStackTrace(); } } - } diff --git a/tools/MapleMapFieldLimitChecker/lib/Report.txt b/tools/MapleMapFieldLimitChecker/lib/Report.txt deleted file mode 100644 index 2d4b275314..0000000000 --- a/tools/MapleMapFieldLimitChecker/lib/Report.txt +++ /dev/null @@ -1,149 +0,0 @@ - # Report File autogenerated from the MapleEmptyItemWzChecker feature by Ronan Lana. - # Generated data takes into account several data info from the server-side WZ.xmls. - -String.wz NAMES with no Item.wz node, 130 entries: - 20816 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Face\ - 20817 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Face\ - 21817 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Face\ - 21820 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Face\ - 1002655 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1002657 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1002658 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1003028 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1003029 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1003030 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1003043 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Cap\ - 1022096 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Accessory\ - 1042180 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Coat\ - 1052226 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Longcoat\ - 1060115 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1060138 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1061125 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1061160 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1062036 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1062037 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Pants\ - 1072248 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Shoes\ - 1072249 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Shoes\ - 1072418 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Shoes\ - 1072425 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Shoes\ - 1080002 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Glove\ - 1082217 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Glove\ - 1082221 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Glove\ - 1082261 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Glove\ - 1142152 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Accessory\ - 1142155 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Accessory\ - 1302032 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1302069 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1322030 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1322034 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1332058 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1382013 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1452047 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1462020 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1462042 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1472057 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 1702113 ../../wz/String.wz/Eqp.img.xml -> Eqp.img\Eqp\Weapon\ - 2002012 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2002013 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2002014 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2012004 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2022034 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2022036 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2022046 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2022114 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2070014 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2083000 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2084000 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101016 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101017 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101018 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101019 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101022 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2101058 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2210023 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2210024 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240004 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240005 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240006 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240007 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240008 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240009 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240010 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240011 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240012 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240013 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240014 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2240015 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2290109 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 2390000 ../../wz/String.wz/Consume.img.xml -> Consume.img\ - 3010044 ../../wz/String.wz/Ins.img.xml -> Ins.img\ - 3994016 ../../wz/String.wz/Ins.img.xml -> Ins.img\ - 4000275 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4001150 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031294 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031627 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031628 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031629 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031630 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031631 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031632 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031633 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031634 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031635 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031636 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031637 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031638 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031639 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031640 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031641 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031642 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031643 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031644 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031645 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031646 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031647 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031648 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031795 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4031867 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 4032526 ../../wz/String.wz/Etc.img.xml -> Etc.img\Etc\ - 5000040 ../../wz/String.wz/Pet.img.xml -> Pet.img\ - 5000043 ../../wz/String.wz/Pet.img.xml -> Pet.img\ - 5000046 ../../wz/String.wz/Pet.img.xml -> Pet.img\ - 5201000 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5201001 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210000 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210001 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210002 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210003 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210004 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5210005 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5211001 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5211002 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5211003 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5211047 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5240016 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5240019 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5251004 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5251005 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5251006 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360009 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360010 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360011 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360012 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360013 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - 5360014 ../../wz/String.wz/Cash.img.xml -> Cash.img\ - -Item.wz ITEMS with no String.wz node, 12 entries: - 1942000 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01942000.img.xml -> NOT FOUND - 1942001 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01942001.img.xml -> NOT FOUND - 1942002 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01942002.img.xml -> NOT FOUND - 1952000 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01952000.img.xml -> NOT FOUND - 1952001 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01952001.img.xml -> NOT FOUND - 1952002 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01952002.img.xml -> NOT FOUND - 1962000 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01962000.img.xml -> NOT FOUND - 1962001 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01962001.img.xml -> NOT FOUND - 1962002 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01962002.img.xml -> NOT FOUND - 1972000 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01972000.img.xml -> NOT FOUND - 1972001 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01972001.img.xml -> NOT FOUND - 1972002 C:\Nexon\HeavenMS\wz\Character.wz\Dragon\01972002.img.xml -> NOT FOUND - From e2f1981dc4eb047db824a3c38334a5caffa6ca1a Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 10:54:29 +0200 Subject: [PATCH 20/36] Move MapleIdRetriever to main module --- .../java/tools/mapletools/IdRetriever.java | 217 +- .../java/tools/mapletools/ToolConstants.java | 14 +- tools/MapleIdRetriever/handbook/Cash.txt | 489 -- .../handbook/Equip/Accessory.txt | 497 -- tools/MapleIdRetriever/handbook/Equip/Cap.txt | 915 ---- .../MapleIdRetriever/handbook/Equip/Cape.txt | 178 - .../MapleIdRetriever/handbook/Equip/Coat.txt | 463 -- .../MapleIdRetriever/handbook/Equip/Face.txt | 540 -- .../MapleIdRetriever/handbook/Equip/Glove.txt | 239 - .../MapleIdRetriever/handbook/Equip/Hair.txt | 1504 ------ .../handbook/Equip/Longcoat.txt | 485 -- .../MapleIdRetriever/handbook/Equip/Pants.txt | 410 -- .../handbook/Equip/PetEquip.txt | 67 - .../MapleIdRetriever/handbook/Equip/Ring.txt | 112 - .../handbook/Equip/Shield.txt | 57 - .../MapleIdRetriever/handbook/Equip/Shoes.txt | 421 -- .../handbook/Equip/Taming.txt | 33 - .../handbook/Equip/Weapon.txt | 1184 ----- tools/MapleIdRetriever/handbook/Etc.txt | 2385 --------- tools/MapleIdRetriever/handbook/Map.txt | 4447 ----------------- tools/MapleIdRetriever/handbook/Mob.txt | 1597 ------ tools/MapleIdRetriever/handbook/NPC.txt | 1733 ------- tools/MapleIdRetriever/handbook/Pet.txt | 57 - tools/MapleIdRetriever/handbook/Setup.txt | 251 - tools/MapleIdRetriever/handbook/Skill.txt | 541 -- tools/MapleIdRetriever/handbook/Use.txt | 2295 --------- tools/MapleIdRetriever/lib/fetch.txt | 25 - tools/MapleIdRetriever/lib/result.txt | 26 - 28 files changed, 99 insertions(+), 21083 deletions(-) rename tools/MapleIdRetriever/src/mapleidretriever/MapleIdRetriever.java => src/main/java/tools/mapletools/IdRetriever.java (50%) delete mode 100644 tools/MapleIdRetriever/handbook/Cash.txt delete mode 100644 tools/MapleIdRetriever/handbook/Equip/Accessory.txt delete mode 100644 tools/MapleIdRetriever/handbook/Equip/Cap.txt delete mode 100644 tools/MapleIdRetriever/handbook/Equip/Cape.txt delete mode 100644 tools/MapleIdRetriever/handbook/Equip/Coat.txt delete mode 100644 tools/MapleIdRetriever/handbook/Equip/Face.txt delete mode 100644 tools/MapleIdRetriever/handbook/Equip/Glove.txt delete mode 100644 tools/MapleIdRetriever/handbook/Equip/Hair.txt delete mode 100644 tools/MapleIdRetriever/handbook/Equip/Longcoat.txt delete mode 100644 tools/MapleIdRetriever/handbook/Equip/Pants.txt delete mode 100644 tools/MapleIdRetriever/handbook/Equip/PetEquip.txt delete mode 100644 tools/MapleIdRetriever/handbook/Equip/Ring.txt delete mode 100644 tools/MapleIdRetriever/handbook/Equip/Shield.txt delete mode 100644 tools/MapleIdRetriever/handbook/Equip/Shoes.txt delete mode 100644 tools/MapleIdRetriever/handbook/Equip/Taming.txt delete mode 100644 tools/MapleIdRetriever/handbook/Equip/Weapon.txt delete mode 100644 tools/MapleIdRetriever/handbook/Etc.txt delete mode 100644 tools/MapleIdRetriever/handbook/Map.txt delete mode 100644 tools/MapleIdRetriever/handbook/Mob.txt delete mode 100644 tools/MapleIdRetriever/handbook/NPC.txt delete mode 100644 tools/MapleIdRetriever/handbook/Pet.txt delete mode 100644 tools/MapleIdRetriever/handbook/Setup.txt delete mode 100644 tools/MapleIdRetriever/handbook/Skill.txt delete mode 100644 tools/MapleIdRetriever/handbook/Use.txt delete mode 100644 tools/MapleIdRetriever/lib/fetch.txt delete mode 100644 tools/MapleIdRetriever/lib/result.txt diff --git a/tools/MapleIdRetriever/src/mapleidretriever/MapleIdRetriever.java b/src/main/java/tools/mapletools/IdRetriever.java similarity index 50% rename from tools/MapleIdRetriever/src/mapleidretriever/MapleIdRetriever.java rename to src/main/java/tools/mapletools/IdRetriever.java index e723de2ac0..58039bc0dc 100644 --- a/tools/MapleIdRetriever/src/mapleidretriever/MapleIdRetriever.java +++ b/src/main/java/tools/mapletools/IdRetriever.java @@ -1,86 +1,56 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package mapleidretriever; +package tools.mapletools; import java.io.*; -import java.sql.*; +import java.nio.charset.StandardCharsets; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.ArrayList; /** - * * @author RonanLana - * + *

* This application acts two-way: first section sets up a table on the SQL Server with all the names used within MapleStory, * and the second queries all the names placed inside "fetch.txt", returning in the same line order the ids of the elements. * In case of multiple entries with the same name, multiple ids will be returned in the same line split by a simple space * in ascending order. An empty line means that no entry with the given name in a line has been found. - * + *

* IMPORTANT: this will fail for fetching MAP ID (you shouldn't be using this program for these, just checking them up in the * handbook is enough anyway). - * - * Set whether you are first installing the handbook on the SQL Server (TRUE) or just fetching whatever is on your "fetch.txt" + *

+ * Set whether you are first installing the handbook on the SQL Server (TRUE) or just fetching whatever is on your "fetch_ids.txt" * file (FALSE) on the INSTALL_SQLTABLE property and build the project. With all done, run the Java executable. - * + *

* Expected installing time: 30 minutes - * */ -public class MapleIdRetriever { - private final static boolean INSTALL_SQLTABLE = true; - - static String host = "jdbc:mysql://localhost:3306/cosmic"; - static String driver = "com.mysql.jdbc.Driver"; - static String username = "cosmic_server"; - static String password = "snailshell"; - - static Connection con = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - static PrintWriter printWriter = null; - - // ------- SET-UP section arguments -------- - - static String directoryName = "./handbook/"; - - // ------- SEARCH section arguments -------- - - static String inputName = "lib/fetch.txt"; - static String outputName = "lib/result.txt"; - - private static void listFiles(String directoryName, ArrayList files) { - File directory = new File(directoryName); +public class IdRetriever { + private static final boolean INSTALL_SQLTABLE = true; + private static final File INPUT_FILE = ToolConstants.getInputFile("fetch_ids.txt"); + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("fetched_ids.txt"); + private static final Connection con = SimpleDatabaseConnection.getConnection(); - // get all the files from a directory - File[] fList = directory.listFiles(); - for (File file : fList) { - if (file.isFile()) { - files.add(file); - } else if (file.isDirectory()) { - listFiles(file.getAbsolutePath(), files); - } + private static InputStreamReader fileReader = null; + private static BufferedReader bufferedReader = null; + + private static void listFiles(String directoryName, ArrayList files) { + File directory = new File(directoryName); + + // get all the files from a directory + File[] fList = directory.listFiles(); + for (File file : fList) { + if (file.isFile()) { + files.add(file); + } else if (file.isDirectory()) { + listFiles(file.getAbsolutePath(), files); } + } } - + private static void parseMapleHandbookLine(String line) throws SQLException { String[] tokens = line.split(" - ", 3); - - if(tokens.length > 1) { + + if (tokens.length > 1) { PreparedStatement ps = con.prepareStatement("INSERT INTO `handbook` (`id`, `name`, `description`) VALUES (?, ?, ?)"); try { ps.setInt(1, Integer.parseInt(tokens[0])); @@ -91,135 +61,132 @@ public class MapleIdRetriever { ps.setString(2, tokens[1]); ps.setString(3, tokens.length > 2 ? tokens[2] : ""); ps.execute(); - + ps.close(); } } - + private static void parseMapleHandbookFile(File fileObj) throws SQLException { + if (shouldSkipParsingFile(fileObj.getName())) { + return; + } + String line; - + try { - fileReader = new InputStreamReader(new FileInputStream(fileObj), "UTF-8"); + fileReader = new InputStreamReader(new FileInputStream(fileObj), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - + System.out.println("Parsing file '" + fileObj.getCanonicalPath() + "'."); - while((line = bufferedReader.readLine()) != null) { - parseMapleHandbookLine(line); + while ((line = bufferedReader.readLine()) != null) { + try { + parseMapleHandbookLine(line); + } catch (SQLException e) { + System.err.println("Failed to parse line: " + line); + throw e; + } } bufferedReader.close(); fileReader.close(); - } - catch(FileNotFoundException ex) { - System.out.println(ex.getMessage()); - } - catch(IOException ex) { + } catch (IOException ex) { System.out.println(ex.getMessage()); } } - + + // Quest.txt has different formatting: id is last token on the line, instead of the first + private static boolean shouldSkipParsingFile(String fileName) { + return "Quest.txt".equals(fileName); + } + private static void setupSqlTable() throws SQLException { PreparedStatement ps = con.prepareStatement("DROP TABLE IF EXISTS `handbook`;"); ps.execute(); ps.close(); - + ps = con.prepareStatement("CREATE TABLE `handbook` (" + "`key` int(10) unsigned NOT NULL AUTO_INCREMENT," + "`id` int(10) DEFAULT NULL," + "`name` varchar(200) DEFAULT NULL," + "`description` varchar(1000) DEFAULT ''," + "PRIMARY KEY (`key`)" - + ") ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;"); + + ");"); ps.execute(); ps.close(); } - + private static void parseMapleHandbook() throws SQLException { ArrayList files = new ArrayList<>(); - listFiles(directoryName, files); - if(files.isEmpty()) return; + listFiles(ToolConstants.HANDBOOK_PATH, files); + if (files.isEmpty()) { + return; + } setupSqlTable(); - for(File f: files) { + for (File f : files) { parseMapleHandbookFile(f); } } - + private static void fetchDataOnMapleHandbook() throws SQLException { String line; - + try { - fileReader = new InputStreamReader(new FileInputStream(inputName), "UTF-8"); + fileReader = new InputStreamReader(new FileInputStream(INPUT_FILE), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - - printWriter = new PrintWriter(outputName, "UTF-8"); - - while((line = bufferedReader.readLine()) != null) { - if(line.isEmpty()) { + + PrintWriter printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); + + while ((line = bufferedReader.readLine()) != null) { + if (line.isEmpty()) { printWriter.println(""); continue; } - - PreparedStatement ps = con.prepareStatement("SELECT `id` FROM `handbook` WHERE `name` LIKE ? COLLATE latin1_general_ci ORDER BY `id` ASC;"); + + PreparedStatement ps = con.prepareStatement("SELECT `id` FROM `handbook` WHERE `name` LIKE ? ORDER BY `id` ASC;"); ps.setString(1, line); - + ResultSet rs = ps.executeQuery(); - + String str = ""; - while(rs.next()) { + while (rs.next()) { int id = rs.getInt("id"); - + str += Integer.toString(id); str += " "; } - + rs.close(); ps.close(); - + printWriter.println(str); } printWriter.close(); bufferedReader.close(); fileReader.close(); - } - catch(FileNotFoundException ex) { - System.out.println(ex.getMessage()); - } - catch(IOException ex) { + } catch (IOException ex) { System.out.println(ex.getMessage()); } } - - public static void main(String[] args) { - - try { - Class.forName(driver).newInstance(); - con = DriverManager.getConnection(host, username, password); - if(INSTALL_SQLTABLE) parseMapleHandbook(); - else fetchDataOnMapleHandbook(); + public static void main(String[] args) { + + try { + if (INSTALL_SQLTABLE) { + parseMapleHandbook(); + } else { + fetchDataOnMapleHandbook(); + } con.close(); - } - - catch(SQLException e) { + } catch (SQLException e) { System.out.println("Error: invalid SQL syntax"); - System.out.println(e.getMessage()); - } - - catch(ClassNotFoundException e) { - System.out.println("Error: could not find class"); - System.out.println(e.getMessage()); - } - - catch(InstantiationException | IllegalAccessException e) { - System.out.println("Error: instantiation failure"); - System.out.println(e.getMessage()); + e.printStackTrace(); } } } + diff --git a/src/main/java/tools/mapletools/ToolConstants.java b/src/main/java/tools/mapletools/ToolConstants.java index 33cc681300..641d8a7d69 100644 --- a/src/main/java/tools/mapletools/ToolConstants.java +++ b/src/main/java/tools/mapletools/ToolConstants.java @@ -2,17 +2,17 @@ package tools.mapletools; import java.io.File; -public class ToolConstants { - public static final File INPUT_DIRECTORY = new File("tools/input"); - public static final File OUTPUT_DIRECTORY = new File("tools/output"); - public static final String SCRIPTS_PATH = "scripts"; - public static final String HANDBOOK_PATH = "handbook"; +class ToolConstants { + static final File INPUT_DIRECTORY = new File("tools/input"); + static final File OUTPUT_DIRECTORY = new File("tools/output"); + static final String SCRIPTS_PATH = "scripts"; + static final String HANDBOOK_PATH = "handbook"; - public static File getInputFile(String fileName) { + static File getInputFile(String fileName) { return new File(INPUT_DIRECTORY, fileName); } - public static File getOutputFile(String fileName) { + static File getOutputFile(String fileName) { return new File(OUTPUT_DIRECTORY, fileName); } } diff --git a/tools/MapleIdRetriever/handbook/Cash.txt b/tools/MapleIdRetriever/handbook/Cash.txt deleted file mode 100644 index 841958639e..0000000000 --- a/tools/MapleIdRetriever/handbook/Cash.txt +++ /dev/null @@ -1,489 +0,0 @@ -5010000 - Sunny Day - A special effect in which you'll see a brightly smiling sun floating over you. On the KeyConfig, configure this on a button of your choice to turn the effect on/off. -5010001 - Moon & the Stars - A special effect in which you'll see a brightly smiling moon floating around in a sea of stars over you. On the KeyConfig, configure this on a button of your choice to turn the effect on/off. -5010002 - Colorful Rainbow - A special effect in which you'll see a rainbow in its full 7 colors floating next to you. Designate a HotKey to turn the effect on/off. -5010003 - Little Devil - A special effect in which you'll see Lilly the cute little devil floating around next to you. Designate a HotKey to turn the effect on/off. -5010004 - Underwater - A special effect that shows a submarine under the water. Designate a HotKey to turn the effect on/off. -5010005 - Looking for Love - A special effect that displays the longing to be with someone special. Designate a HotKey to turn the effect on/off. -5010006 - Baby Angel - A lovely effect that shows a baby angel floating around as your protector. Designate a HotKey to turn the effect on/off. -5010007 - Fugitive - A special effect that puts a poster in front of your face as if you're being wanted around the world. Designate a HotKey to turn the effect on/off. -5010008 - Mr. Jackpot - A special effect used to increase the chance of winning with Slot Machine by 2x. Designate a HotKey to turn the effect on/off. -5010009 - Martial Effect - A special effect that appears Chinese Falg. Designate a HotKey to turn the effect on/off. -5010010 - Play with Me - A special effect in which you'll see two babies floating on the cloud as a sign of friendship. Designate a HotKey to turn the effect on/off. -5010011 - Loner - A special effect that displays that the owner would like to be left alone. Designate a HotKey to turn the effect on/off. -5010012 - Equalizer - A special equalizer effect that is given as a prize at the Maple Member Shop. Designate a HotKey to turn the effect on/off. -5010013 - Fireworks - A special effect of the fireworks that is given as a prize at the Maple Member Shop. Designate a HotKey to turn the effect on/off. -5010014 - Stormy Cloud - A special effect that displays the stormy cloud with rain and lightning hovering around the owner's head. Designate a HotKey to turn the effect on/off. -5010015 - 777 Effect - A special effect used to increase the number of balls obtained from winning with Slot Machine by 2x. Designate a HotKey to turn the effect on/off. -5010016 - Siren - A siren effect that can be used under emergencies. Designate a HotKey to turn the effect ON/OFF. -5010017 - Twinkling Star - A special star effect for a special day. Designate a HotKey to turn the effect ON/OFF. -5010018 - Smile - A smile effect best used when you're in a great mood! Designate a a HotKey to turn the effect ON/OFF. -5010019 - Heart - A heart effect you can use to show your love to the others. Designate a HotKey to turn the effect ON/OFF. -5010020 - Go! Korea! - A special effect that follows your character for the supporting of Korea's victory. Designate a HotKey to turn the effect ON/OFF. -5010021 - Skeleton of Horror - This skull was found somewhere around the remains, and it'll be with you until you wish for otherwise. Double-click on the item or on the Key Config, configure this on a button of your choice to turn the effect on/off. -5010022 - Twinkling Star - A number of twinkling stars surrounds the character in this special effect. -5010023 - Pumping Heart - A special effect that captures the feeling of wanting to express the feeling of love to someone special. Double-click on the item or on the Key Config, configure this on a button of your choice to turn the effect on/off. -5010024 - The Flocking Ducks - A family of toy ducks follow around the character. Double-click on the item or on the Key Config, configure this on a button of your choice to turn the effect on/off. -5010025 - Silent Spectre - A special effect in which you'll see a spooky ghost appirate behind you and scare the daylights out of everyone nearby! On the Key Config, configure this on a button of your choice to turn the effect on/off. -5010026 - Indigo Dracula - A special effect in which you'll see a horde of Dracula's finest bats appear and surround your character with alluring nocturne ambience. On the Key Config, configure this on a button of your choice to turn the effect on/off. -5010027 - Hot Head - A special effect that perfectly represents the feeling of anger. On the Key Config, configure this on a button of your choice to turn the effect on/off. -5010028 - Indigo Flames - This is an effect item that exudes an aura around the character. On the Key Config, configure this on a button of your choice to turn the effect on/off. -5010029 - Demonfyre - This is an effect item that exudes an aura around the character. On the Key Config, configure this on a button of your choice to turn the effect on/off. -5010030 - Nuclear Fire - This is an effect item that exudes an aura around the character. On the Key Config, configure this on a button of your choice to turn the effect on/off. -5010031 - My Boyfriend - Show the world how much you adore your boyfriend with this attractive marker! On the Key Config, configure this on a button of your choice to turn the effect on/off. -5010032 - My Girlfriend - Show the world how much you adore your girlfriend with this attractive marker! On the Key Config, configure this on a button of your choice to turn the effect on/off. -5010033 - Sheer Fear - A special effect perfect for instances where you were caught off-guard. On the Key Config, configure this on a button of your choice to turn the effect on/off. -5010034 - Christmas Tree - If you ever felt like becoming a Christmas Tree, here's your chance! On the Key Config, configure this on a button of your choice to turn the effect on/off. -5010035 - Snowman - On a cold, snowy day, this effect will enable you to become a snowman. On the Key Config, configure this on a button of your choice to turn the effect on/off. -5010038 - Shower Power - A special effect that pours massive amount of water on top of the head. Double-click on the icon or designate a HotKey to turn the effect on/off. -5010039 - Spotlight - A special effect that features a spotlight above the head of the character. Double-click on the icon or designate a HotKey to turn the effect on/off. -5010041 - Super Symphony - A special effect that follows the character around which can be used to express the feeling of happiness and joy. Double-click on the icon or designate a HotKey to turn the effect on/off. -5010042 - Busy Bee - A very busy bee that's never distracted from following you. Keeps one focused on the task at hand. -5010043 - Eyelighter - A special effect that features a blinding glow on the character's eyes. Double-click on the icon or designate a HotKey to turn the effect on/off. -5010044 - Shadow Style - Traces of the character remains while the character moves, creating multiple images of the character in the process. Double-click on the icon, or designate a HotKey to turn the effect on/off. -5010045 - Struck by Lightning - A special effect that displays the lightning striking on the character's head. Double-click on the icon or designate a HotKey to turn the effect on/off. -5010046 - Maple Champion - A special effect that puts a poster in front of your face as if you're being Maple Champion around the world. Designate a HotKey to turn the effect on/off. -5010048 - Maple Champion - A special effect that puts a poster in front of your face as if you're being Maple Champion around the world. Designate a HotKey to turn the effect on/off. -5010049 - Maple Champion - A special effect that puts a poster in front of your face as if you're being Maple Champion around the world. Designate a HotKey to turn the effect on/off. -5010051 - O Maplemas Tree - Celebrate your holiday cheer with this effect! Designate a HotKey to turn the effect ON/OFF. -5010052 - Santa Sled - Give Santa a lift with this hilarious effect! Designate a HotKey to turn the effect ON/OFF. -5010053 - Mistletoe - Create the perfect excuse for a holiday kiss! Designate a HotKey to turn the effect ON/OFF. -5010054 - Jingling Santa - A special effect that displays Santa and his two trusty reindeers breaking down to the beat, hovering around the owner's head. Designate a HotKey to turn the effect on/off. -5010055 - UFO - A special effect that features a UFO and a number of colorful aliens accompanying the owner of the item. Designate a HotKey to turn the effect on/off. -5010056 - Garden Trail - A special effect that features a trail of flowers and grass left behind by the owner of the item. Designate a HotKey to turn the effect on/off. -5010057 - Flower Fairy - A special effect that shows a cute fairy sprinkling flowers. On the Key Config, configure this on a button of your choice to turn the effect on/off. -5010999 - Changing to a Monster - Not sold in Cash Shop. An effect shown while changing into a monster. -5021000 - Water Balloon - A cool blue water balloon. Thrown with a #cthrowing star# to have the water balloon effect. Item cannot be removed. -5021001 - Paper Plane - A nicely-folded paper plane. Thrown with a #cthrowing star# to have the paper plane effect. Item cannot be removed. -5021002 - Energy Ball - A ball of concentrated energy. Thrown with a #cthrowing star# to have the energy effect. Item cannot be removed. -5021003 - Super Star - A red starfish that can be seen at the beach. Can be equipped with a #cthrowing star# to have the starfish effect.\n\nThis item cannot be removed. -5021004 - Winged Baseball - A baseball with small wings attached to it. Can be equipped with a #cthrowing star# to have the winged baseball effect.\n\nThis item cannot be destroyed. -5021005 - Football - The official football of the MapleBowl. When held in your inventory, #cthrowing stars# will appear as a thrown football. -5021006 - Chalkboard Eraser - A chalkboard eraser commonly found in classrooms. Thrown with a #cthrowing star# to have the eraser effect. Item cannot be removed. -5021007 - Shooting Hearts - A small pink heart of love that explodes on contact. Thrown with a #cthrowing star# to have the heart effect. \n\nItem cannot be removed. -5021008 - Throwing Teddy - An adorable brown teddy bear that explodes on contact. Thrown with a #cthrowing star# to have the teddy bear effect. \n\nItem cannot be removed. -5021009 - Throwing Pepe - Never in Pepe's wildest dreams did it think it'd be chucked down the field in place of the throwing star. Thrown with a throwing star to have the Pepe effect. Item cannot be removed. -5021010 - Mr. Puff Throwing Star - A throwing star make to look like Mr. Puff, with its huffy puffy cheeks resembling that of a tasty-looking steamed bun. Thrown with a #cthrowing star# to have the Mr. Puff effect.\n\nItem cannot be removed. -5021011 - Skull Striker - An enchanted skull straight from the Headless Horseman. Thrown with a throwing star to have the skull striker effect. Item cannot be removed. -5021012 - Pumpkin Bomb - Harmless pie? Think again. Thrown with a throwing star to have the pumpkin bomb effect. -5021013 - Pirate Bomb - An explosive bomb used by the legendary pirates. Thrown with a #cthrowing star# to have the explosive bomb effect.\n\nItem cannot be removed. -5021014 - Poo Stars - That nasty poop can be detected from afar. Thrown with a #cthrowing star# to have the nasty poop effect.\n\nItem cannot be removed. -5021015 - Egg Throwing Star - A white egg thrown in place of the throwing star, and that explodes on contact. Thrown with a #cthrowing star# to have the Chick effect. \n\nItem cannot be removed. -5021016 - Devilball - A mischievous ball that has gained sentience, and now lives to be thrown for massive damage. Tremendous striking power! Equips over #cThrowing Stars#! -5021025 - Charm of the Undead - Equips over #cThrowing Stars#! -5021017 - Dragon Disc - An explosive throwing star used by the Dragon. Thrown with a #cthrowing star# to have the explosive bomb effect.\n\nItem cannot be removed. -5021019 - Shooting Star Medal - Beautiful shooting star. Mask over #cThrowing Star#.\n\nItem cannot be removed. -5021020 - Throwing Boomers - Explosive throwing stars from New Leaf City. They're the Bomb! This item equips over #cThrowing Stars#! -5021021 - Exploding Sheep - A cute and cuddly sheep. Don't let it fool you--it's lethal. This item equips over #cThrowing Stars#! -5030000 - Mushroom House Elf - Set up this special store on the Free Market, and this Elf, working as the Hired Merchant, will sell the items for the owner, even if the owner does not log on to the game. -5030001 - Mushroom House Elf - Set up this special store on the Free Market, and this Elf, working as the Hired Merchant, will sell the items for the owner, even if the owner does not log on to the game. -5030002 - Cashier: Teddy Bear Clerk - Set up this special store on the Free Market, and this Teddy Bear, working as the Hired Merchant, will sell the items for the owner, even if the owner does not log on to the game. -5030003 - Cashier: Teddy Bear Clerk - Set up this special store on the Free Market, and this Teddy Bear, working as the Hired Merchant, will sell the items for the owner, even if the owner does not log on to the game. -5030004 - The Robot Stand - Set up this special store on the Free Market, and this Robot, working as the Hired Merchant, will sell the items for the owner, even if the owner does not log on to the game. -5030005 - The Robot Stand - Set up this special store on the Free Market, and this Robot, working as the Hired Merchant, will sell the items for the owner, even if the owner does not log on to the game. -5030006 - Mushroom House Elf - Set up this special store on the Free Market, and this Elf, working as the Hired Merchant, will sell the items for the owner, even if the owner does not log on to the game. -5030008 - Homely Coffeehouse - Set up this special store on the Free Market, and this Coffeehouse, doubling as the Hired Merchant, will be a place that sells the items for the owner, even if the owner does not log on to the game. #cIf an item is sold, the owner will be notified through the chat window.# -5030009 - Homely Coffeehouse - Set up this special store on the Free Market, and this Coffeehouse, doubling as the Hired Merchant, will be a place that sells the items for the owner, even if the owner does not log on to the game. #cIf an item is sold, the owner will be notified through the chat window.# -5030010 - Granny's Food Stand - Set up this special store on the Free Market, and this Granny, working as the Hired Merchant, will sell the items for the owner, even if the owner does not log on to the game. -5030011 - Granny's Food Stand - Set up this special store on the Free Market, and this Granny, working as the Hired Merchant, will sell the items for the owner, even if the owner does not log on to the game. -5030012 - Tiki Torch Store - Set up this special store on the Free Market, and this Granny, working as the Hired Merchant, will sell the items for the owner, even if the owner does not log on to the game. -5040000 - The Teleport Rock - Remembers 5 maps of your choice. This rock will enable you to #cteleport to the map you remembered#. It can even allow you to #cmove to the map where a certain character is#, provided that the person is in the same channel at the same world. This item cannot be used to teleport in between continents. -5040001 - Teleport Coke - By drinking sweet refreshing #cCoca-Cola#, it ables you to #cteleport to one of the remembered maps#. You can also #cteleport to the map where specific character is located# in the same channel. Unable the teleport to the maps where teleport is limited. -5041000 - VIP Teleport Rock - This Teleport Rock enables one to #cteleport between continents#. It also enables the user to teleport to a specific character from the same channel. Up to #c10# maps, excluding the maps that cannot be reached through teleport, can be registered for this. -5050000 - AP Reset - This is the #cscroll that allows you to reset 1 AP from the ability stat#. Choose one AP from HP, MP, STR, DEX, INT, or LUK , and allocate it to the desired category. The lowest an AP level can reach on any category is 4. -5050001 - SP Reset (1st job) - This scroll allows you to #creset 1 SP from a 1st-job skill#. The SP that's been reset may NOT be applied to 2nd or 3rd job skills. -5050002 - SP Reset (2nd job) - This scroll allows you to #creset 1 SP from a 2nd-level skill#. The 1st job SP raised AFTER the 2nd job adv. can also be reset and applied to a 2nd job skill. The SP that's been reset may NOT be applied to 1st or 3rd job skills. -5050003 - SP Reset (3rd job) - This scroll allows you to #creset 1 SP from a 3rd-level skill#. The 1st & 2nd job SP raised AFTER the 3rd job adv. can also be reset and applied to a 3rd job skill. The SP that's been reset may NOT be applied to 1st or 2nd job skills. -5050004 - SP Reset (4th job) - This scroll allows you to #creset 1 SP from a 4th-level skill#. The 1st, 2nd, and 3rd job SP raised AFTER the 4th job adv. can also be reset and applied to a 3rd job skill. The SP that's been reset may NOT be applied to 1st, 2nd or 3rd job skills. -5060000 - Item Tag - This will enable the owner of the weapon to engrave his/her name on an equipment item once. Click on the item, and drag the item #con top of the equipment of choice# to engrave your character name on it. -5060001 - Item Guard - A lock that seals away any equipment items and throwing stars, excluding the quest items. By sealing the item away, the item will be #cdisabled from selling, trading, or throwing away#. Double-click on the lock to seal an item. -5060002 - Incubator - An equipment needed to open the #ceggs from pigme#. Pigme eggs canve incubated by double clicking the incubator. -5061000 - Item Guard : 7 Days - A guard for sealing an equip item and/or throwing star to prevent #cselling, trading or dropping# of the item. Double-click on the guard, then seal the item into the window that appears. #cThis Item Guard is active for 7 days, after which the item will be automatically released from the seal.# -5061001 - Item Guard : 30 Days - A guard for sealing an equip item and/or throwing star to prevent #cselling, trading or dropping# of the item. Double-click on the guard, then seal the item into the window that appears. #cThis Item Guard is active for 30 days, after which the item will be automatically released from the seal.# -5061002 - Item Guard : 90 days - A guard for sealing an equip item and/or throwing star to prevent #cselling, trading or dropping# of the item. Double-click on the guard, then seal the item into the window that appears. #cThis Item Guard is active for 90 days, after which the item will be automatically released from the seal.# -5070000 - Cheap Megaphone - Shout to everyone in the map your character is on with this megaphone. -5071000 - Megaphone - Shout to everyone in the map your character is on with this megaphone. Only available for characters that are over Level 10. -5072000 - Super Megaphone - Shout to everyone in the world your character is on with this megaphone. Only available for characters that are over Level 10. -5073000 - Heart Megaphone - Shout to everyone in the world your character is on with this megaphone. (Heart accents) -5074000 - Skull Megaphone - Shout to everyone in the world your character is on with this megaphone. (Skull accents) -5075000 - MapleTV Messenger - Show your avatar on Maple TV with messages.\nIn case of dedication messages, character you have designated will also appear on the screen throughout the entire world. The message will last appx. 15 seconds. -5075001 - MapleTV Star Messenger - Beautifully designed TV with star effects. \nThis allows you to type in longer messages with longer period of time, 30 seconds. Only announcement type of message is available with this item. The message will last for 30 seconds. -5075002 - MapleTV Heart Messenger - Beautifully designed TV with Heart effect.\nPropose in style on the TV. This item only allows dedication type of message where designated user also appears on the TV. The message will last for 1 minute. -5075003 - Megassenger - Show your message on the chatting window as well as Maple TV at the same time. -5075004 - Star Megassenger - Show your message on the chatting window as well as Maple TV at the same time. This comes with star effect on the Maple TV. -5075005 - Heart Megassenger - Show your message on the chatting window as well as Maple TV at the same time. This comes with heart effect on the Maple TV. -5076000 - Item Megaphone - Use this megaphone to broadcast to everyone your World about an item that may be for sale. -5080000 - Korean Kite - A kite that you can float around the skies at will. Enter your own message. -5080001 - Heart Balloon - A balloon full of love you can float around. Enter your own message. -5080002 - Graduation Banner - A graduation banner you can float around. Enter your own message. -5080003 - Admission Banner - A banner celebrating the admission to a school. Enter your own message. -5090000 - Note - Double-click to send a note to an offline character. The receiver will be able to see the note at the next login. -5100000 - Congratulatory Song - Play a congratulatory song on the map you're in. -5110000 - Heart-Shaped Chocolate - A sweet chocolate in a heart-shaped box. When in possession, a heart will appear above the head of the person that gave the present. -5120000 - Snowy Snow - Sprinkles snow on the map where your character is for 30 seconds. Enter a message of your choice. -5120001 - Sprinkled Flowers - Sprinkles flower on the map where your character is for 30 seconds. Enter a message of your choice. -5120002 - Soap Bubbles - Sprinkles bubbles on the map where your character is for 30 seconds. Enter a message of your choice. -5120003 - Snowflakes - Sprinkles icy snow on the map where your character is for 30 seconds. Enter a message of your choice. -5120004 - Sprinkled Presents - Sprinkles presents on the map where your character is for 30 seconds. Enter a message of your choice. -5120005 - Sprinkled Chocolate - Sprinkles chocolate on the map where your character is for 30 seconds. Enter a message of your choice. -5120006 - Sprinkled Flower Petals - Sprinkle flower petals on the map where your character is for 30 seconds. Enter a message of your choice. -5120007 - Sprinkled Candy - Sprinkles candies on the map where your character is for 30 seconds. Enter a message of your choice. -5120008 - Sprinkled Maple Leaves - Sprinkles maple leaves on the map where your character is for 30 sec. Enter a message of your choice. -5120009 - Fireworks - Ignites fireworks on the map where your character is for 30 sec. Enter a message of your choice. -5120010 - Sprinkled Coke - Sprinkles #cCoca-Cola# on the map where your character is for 30 seconds. Enter a message of your choice. -5120011 - Spirit Haunt - Ghosts on the map where your character is for 30 sec. Enter a message of your choice. -5120012 - Holiday Sock - Sprinkles holiday socks on the map where your character is for 30 seconds. Enter a message of your choice. -5120014 - Christmas Socks - Sprinkles Christmas Socks on the map where your character is for 30 seconds. Enter a message of your choice. -5120015 - Chinese Lantern Firecrackers - Greet the Lunar New Year with the fireworks that fills up the screen. -5121000 - Fighting Spirit - You can enter the message of your choice. -5121001 - Korean Soccer Chant - You can enter the message of your choice. -5121002 - Soccer Fever - Increases Speed +20, Jump +10 for 10 minutes to everyone in the map. Enter a message of your choice. -5121003 - Chicken Soup - You can enter the message of your choice. -5121004 - Song Pyun - You can enter the message of your choice. -5121005 - Han Gwa - You can enter the message of your choice. -5121006 - Flock of Witches - A special effect that displays a flock of witches flying around the area in their spanking-new flying brooms. -5121007 - Tree Decor - Buffs everyone in the map for 15 minutes with weapon attack +20 and magic attack +30. Enter a message of your choice. -5121008 - Happy Birthday - You can enter the message of your choice. -5121009 - Petite Rose - Increases Weapon Attack +20, Magic Attack +30 for 15 minutes to everyone in the map. Enter a message of your choice. -5121010 - Floral Fest - Increases Weapon Attack +20, Magic Attack +30 for 15 minutes to everyone in the map. Enter a message of your choice. -5121014 - Snowing Fishbread - You can enter the message of your choice. -5121015 - Snowy Snowman - When this weather effect is on, everyone in the map is buffed with weapon attack +20 and magic attack +30 for 15 minutes. Enter a message of your choice before spreading this holiday joy to everyone. -5121016 - Heart-shaped Chocolate Box - You can enter the message of your choice. -5121017 - Water Splash - You can enter the message of your choice. -5122000 - Hearty Party Bear - You can enter the message of your choice. -5130000 - Safety Charm - It does not let the user lose EXP points after death, as long as it's in possession. 30% of your HP and MP will be recovered when you are revived. -5140000 - Regular Store Permit - Open a regular store. Can open anywhere of choice in the free market. Can sell up to 16 items at once. -5140001 - Summer Store Permit(SE) - A special-edition coupon that opens a sky blue tree store. Can open anywhere of choice in the free market and sell up to 24 items at once. Available for a limited time only. -5140002 - Pink VIP Store Permit - Open a pink tree store. Can open anywhere of choice in the free market. Can sell up to 24 items at once. -5140003 - Fall Store Permit(SE) - A special-edition coupon that opens a orange tree store. Can open anywhere of choice in the free market and sell up to 24 items at once. Available for a limited time only. -5140004 - Spring Store Permit (SE) - A special-edition coupon that opens a green tree store. Can open anywhere of choice in the free market and sell up to 24 items at once. Available for a limited time only. -5140006 - Holiday Store Permit - A special-edition permit that opens Christmas store. Can open anywhere of choice in the free market and sell up to 24 items at once. Available for a limited time only -5150000 - Henesys Hair Style Coupon (REG) - Use it at #cHenesys Hair Salon# to change your hair style #crandomly#. (one-time use) -5150001 - Henesys Hair Style Coupon (VIP) - Use it at #cHenesys Hair Salon# to change your hair to a style of #cyour choice#. (one-time use) -5150002 - Kerning City Hair Style Coupon (REG) - Use it at #cKerning City Hair Salon# to change your hair style #crandomly#. (one-time use) -5150003 - Kerning City Hair Style Coupon (VIP) - Use it at #cKerning City Hair Salon# to change your hair to a style of #cyour choice#. (one-time use) -5150004 - Orbis Hair Style Coupon (REG) - Use it at #cOrbis Hair Salon# to change your hair style #crandomly#. (one-time use) -5150005 - Orbis Hair Style Coupon (VIP) - Use it at #cOrbis Hair Salon# to change your hair to a style of #cyour choice#. (one-time use) -5150006 - Ludibrium Hair Style Coupon (REG) - Use it at #cLudibrium Hair Salon# to change your hair style #crandomly#. (one-time use) -5150007 - Ludibrium Hair Style Coupon (VIP) - Use it at #cLudibrium Hair Salon# to change your hair to a style of #cyour choice#. (one-time use) -5150008 - Showa Hair Style Coupon (REG) - Use it at #cShowa Hair Salon# to change your hair style #crandomly#. (one-time use) -5150009 - Showa Hair Style Coupon (VIP) - Use it at #cShowa Hair Salon# to change your hair to a style of #cyour choice#. (one-time use) -5150010 - Henesys Hair Style Coupon (EXP) - Use it at #cHenesys Hair Salon# to #crandomly# change your hair style with a chance to obtain a new experimental style. (one-time use) -5150011 - Kerning City Hair Style Coupon (EXP) - Use it at #cKerning City Hair Salon# to #crandomly# change your hair style with a chance to obtain a new experimental style. (one-time use) -5150012 - Ludibrium Hair Style Coupon (EXP) - Use it at #cLudibrium Hair Salon# to #crandomly# change your hair style, with a chance to obtain a new experimental style. (one-time use) -5150013 - Orbis Hair Style Coupon (EXP) - Use it at #cOrbis Hair Salon# to #crandomly# change your hair style, with a chance to obtain a new experimental style. (one-time use) -5150019 - Amoria Hairstyle Coupon (EXP) - Use it at #cAmoria Hair Salon# to #crandomly# change your hair style with a chance to obtain a new experimental style. (one-time use) -5150020 - Amoria Hairstyle Coupon (VIP) - Use it at #cAmoria Hair Salon# to change your hair to a style of #cyour choice#. (one-time use) -5150021 - Night Market Hair Style Coupon (EXP) - Use it at #cNight Market Hair Salon# to #crandomly# change your hair style with a chance to obtain a new experimental style. (one-time use) -5150022 - Night Market Hair Style Coupon (VIP) - Use it at #cNight Market Hair Salon# to change your hair to a style of #cyour choice#. (one-time use) -5150024 - Mu Lung Hair Style Coupon (EXP) - Use it at #cMu Lung Hair Salon# to #crandomly# change your hair style with a chance to obtain a new experimental style. (one-time use) -5150025 - Mu Lung Hair Style Coupon (VIP) - Use it at #cMu Lung Hair Salon# to change your hair to a style of #cyour choice#. (one-time use) -5150026 - Ariant Hair Style Coupon (REG) - Use it on #cAriant Hair Salon# to change your hair style #crandomly#. (one-time use) -5150027 - Ariant Hair Style Coupon (VIP) - Use it on #cAriant Hair Salon# to change your hair style of #cyour choice#. (one-time use) -5150030 - NLC Hairstyle Coupon (EXP) - Use it at #cNLC Hair Salon# to #crandomly# change your hair style with a chance to obtain a new experimental style. (one-time use) -5150031 - NLC Hairstyle Coupon (VIP) - Use it at #cNLC Hair Salon# to change your hair to a style of #cyour choice#. (one-time use) -5150038 - Matinee Idol Hair Coupon - Use this coupon to change the hairstyle to a #cMatinee Idol# hairstyle. (one-time use) -5150040 - Royal Hair Coupon - If you take this to #cBig Headward of Henesys Hair Shop#, your hair style will change to #cone of several Royal options.# -5151000 - Henesys Hair Color Coupon (REG) - Use it at #cHenesys Hair Salon# to change your hair color #crandomly#. (one-time use) -5151001 - Henesys Hair Color Coupon (VIP) - Use it on #cHenesys Hair Salon# to change your hair to a color of #cyour choice#. (one-time use) -5151002 - Kerning City Hair Color Coupon (REG) - Use it at #cKerning City Hair Salon# to change your hair color #crandomly#. (one-time use) -5151003 - Kerning City Hair Color Coupon (VIP) - Use it at #cKerning City Hair Salon# to change your hair color of #cyour choice#. (one-time use) -5151004 - Orbis Hair Color Coupon (REG) - Use it at #cOrbis Hair Salon# to change your hair color #crandomly#. (one-time use) -5151005 - Orbis Hair Color Coupon (VIP) - Use it on #cOrbis Hair Salon# to change your hair to a color of #cyour choice#. (one-time use) -5151006 - Ludibrium Hair Color Coupon (REG) - Use it at #cLudbrium Hair Salon# to change your hair color #crandomly#. (one-time use) -5151007 - Ludibrium Hair Color Coupon (VIP) - Use it on #cLudibrium Hair Salon# to change your hair to a color of #cyour choice#. (one-time use) -5151008 - Showa Hair Color Coupon (REG) - Use it at #cShowa Hair Salon# to change your hair color #crandomly#. (one-time use) -5151009 - Showa Hair Color Coupon (VIP) - Use it at #cShowa Hair Salon# to change your hair to a color of #cyour choice#. (one-time use) -5151014 - Night Market Hair Color Coupon (REG) - Use it at #cNight Market Hair Salon# to change your hair color #crandomly#. (one-time use) -5151015 - Night Market Hair Color Coupon (VIP) - Use it on #cNight Market Hair Salon# to change your hair to a color of #cyour choice#. (one-time use) -5151016 - Amoria Hair Color Coupon (REG) - Use it at #cAmoria Hair Salon# to change your hair color #crandomly#. (one-time use) -5151017 - Amoria Hair Color Coupon (VIP) - Use it on #cAmoria Hair Salon# to change your hair to a color of #cyour choice#. (one-time use) -5151019 - Mu Lung Hair Color Coupon (REG) - Use it at #cMu Lung Hair Salon# to change your hair color #crandomly#. (one-time use) -5151020 - Mu Lung Hair Color Coupon (VIP) - Use it at #cMu Lung Hair Salon# to change your hair to a color of #cyour choice#. (one-time use) -5151021 - Ariant Hair Color Coupon (REG) - Use it on #cAriant Hair Salon# to change your hair color #crandomly# (one-time use) -5151022 - Ariant Hair Color Coupon (VIP) - Use it on #cAriant Hair Salon# to change your hair to a a color of #cyour choice# (one-time use) -5151025 - NLC Hair Color Coupon (REG) - Use it at #cNLC Hair Salon# to change your hair color #crandomly#. (one-time use) -5151026 - NLC Hair Color Coupon (VIP) - Use it at #cNLC Hair Salon# to change your hair to a color of #cyour choice#. (one-time use) -5152000 - Henesys Face Coupon (REG) - Use it at #cHenesys Plastic Surgery# to change your face #crandomly#. (one-time use) -5152001 - Henesys Face Coupon (VIP) - Use it at #cHenesys Plastic Surgery# to change your face to a style of #cyour choice#. (one-time use) -5152002 - Kerning City Face Coupon (REG) - Use it at #cKerning City Plastic Surgery# to change your face #crandomly#. (one-time use) -5152003 - Kerning City Face Coupon (VIP) - Use it at #cKerning City Plastic Surgery# to change your face to a style of your #cchoice#. (one-time use) -5152004 - Orbis Face Coupon (REG) - Use it at #cOrbis Plastic Surgery# to change your face #crandomly#. (one-time use) -5152005 - Orbis Face Coupon (VIP) - Use it at #cOrbis Plastic Surgery# to change your face to a style of #cyour choice#. (one-time use) -5152006 - Ludibrium Face Coupon (REG) - Use it at #cLudibrium Plastic Surgery# to change your face #crandomly#. (one-time use) -5152007 - Ludibrium Face Coupon (VIP) - Use it at #cLudibrium Plastic Surgery# to change your face to a style of #cyour choice#. (one-time use) -5152008 - Showa Face Coupon (REG) - Use it at #cShowa Plastic Surgery# to change your face #crandomly#. (one-time use) -5152009 - Showa Face Coupon (VIP) - Use it at #cShowa Plastic Surgery# to change your face to a style of #cyour choice#. (one-time use) -5152010 - Henesys Cosmetic Lens Coupon (REG) - Use it at #cHenesys Plastic Surgery# to change your eye color #crandomly#. (one-time use) -5152011 - Orbis Cosmetic Lens Coupon (REG) - Use it at #cOrbis Plastic Surgery# to change your eye color #crandomly#. (one-time use) -5152012 - Ludibrium Cosmetic Lens Coupon (REG) - Use it at #cLudibrium Plastic Surgery# to change your eye color #crandomly#. (one-time use) -5152013 - Henesys Cosmetic Lens Coupon (VIP) - Use it at #cHenesys Plastic Surgery# to change your eye to a color of #cyour choice#. (one-time use) -5152014 - Orbis Cosmetic Lens Coupon (VIP) - Use it at #cOrbis Plastic Surgery# to change your eye to a color of #cyour choice#. (one-time use) -5152015 - Ludibrium Cosmetic Lens Coupon (VIP) - Use it at #cLudibrium Plastic Surgery# to change your eye to a color of #cyour choice#. (one-time use) -5152021 - Amoria Face Coupon (REG) - Use it at #cAmoria Plastic Surgery# to change your face #crandomly#. (one-time use) -5152022 - Amoria Face Coupon (VIP) - Use it at #cAmoria Plastic Surgery# to change your face to a style of #cyour choice#. (one-time use) -5152023 - Night Market Face Coupon (REG) - Use it at #cNight Market Plastic Surgery# to change your face #crandomly#. (one-time use) -5152024 - Night Market Face Coupon (VIP) - Use it at #cNight Market Plastic Surgery# to change your face to a style of #cyour choice#. (one-time use) -5152025 - Amoria Cosmetic Lens Coupon (REG) - Use it at #cAmoria Plastic Surgery# to change your eye color #crandomly#. (one-time use) -5152026 - Amoria Cosmetic Lens Coupon (VIP) - Use it at #cAmoria Plastic Surgery# to change your eye to a color of #cyour choice#. (one-time use) -5152027 - Mu Lung Plastic Surgery Coupon (REG) - Use it at #cMu Lung Plastic Surgery# to change your face #crandomly#. (one-time use) -5152028 - Mu Lung Plastic Surgery Coupon (VIP) - Use it at #cMu Lung Plastic Surgery# to change your face to a style of #cyour choice#. (one-time use) -5152029 - Ariant Face Coupon (REG) - Use it at #cAriant Plastic Surgery# to change your face #crandomly# (one-time use) -5152030 - Ariant Face Coupon (VIP) - Use it at #cAriant Plastic Surgery# to change your face to a style of #cyour choice# (one-time use) -5152033 - NLC Face Coupon (REG) - Use it at #cNLC Plastic Surgery# to change your face #crandomly#. (one-time use) -5152034 - NLC Face Coupon (VIP) - Use it at #cNLC Plastic Surgery# to change your face to a style of #cyour choice#. (one-time use) -5152035 - NLC Cosmetic Lens Coupon (REG) - Use it at #cNLC Plastic Surgery# to change your eye color #crandomly#. (one-time use) -5152036 - NLC Cosmetic Lens Coupon (VIP) - Use it at #cNLC Plastic Surgery# to change your eye to a color of #cyour choice#. (one-time use) -5152041 - Mu Lung Cosmetic Lens Coupon (VIP) - Use it at #cMu Lung Plastic Surgery# to change your eye to a color of #cyour choice#. (one-time use) -5152042 - Mu Lung Cosmetic Lens Coupon (REG) - Use it at #cMu Lung Plastic Surgery# to change your eye color #crandomly#. (one-time use) -5152045 - Showa Cosmetic Lens Coupon (VIP) - Use it at #cShowa Plastic Surgery# to change your eye to a color of #cyour choice#. (one-time use) -5152046 - Showa Cosmetic Lens Coupon (REG) - Use it at #cShowa Plastic Surgery# to change your eye color #crandomly#. (one-time use) -5152047 - Ariant Cosmetic Lens Coupon (VIP) - Use it at #cAriant Plastic Surgery# to change your eye to a color of #cyour choice#. (one-time use) -5152048 - Ariant Cosmetic Lens Coupon (REG) - Use it at #cAriant Plastic Surgery# to change your eye color #crandomly#. (one-time use) -5152100 - One-Time Cosmetic Lens (Black) - Use it once to change the color of your eyes to #cBlack#. (one-time use) -5152101 - One-Time Cosmetic Lens (Blue) - Use it once to change the color of your eyes to #cBlue#. (one-time use) -5152102 - One-Time Cosmetic Lens (Red) - Use it once to change the color of your eyes to #cRed#. (one-time use) -5152103 - One-Time Cosmetic Lens (Green) - Use it once to change the color of your eyes to #cGreen#. (one-time use) -5152104 - One-Time Cosmetic Lens (Brown) - Use it once to change the color of your eyes to #cBrown#. (one-time use) -5152105 - One-Time Cosmetic Lens (Emerald) - Use it once to change the color of your eyes to #cEmerald#. (one-time use) -5152106 - One-Time Cosmetic Lens (Purple) - Use it once to change the color of your eyes to #cPurple#. (one-time use) -5152107 - One-Time Cosmetic Lens (Amethyst) - Use it once to change the color of your eyes to #cAmethyst#. (one-time use) -5153000 - Henesys Skin Coupon - Use it at #cHenesys Skin-Care# to change your skin to a color of #cyour choice#. (one-time use) -5153001 - Orbis Skin Coupon - Use it at #cOrbis Skin-Care# to change your skin to a color of #cyour choice#. (one-time use) -5153002 - Ludibrium Skin Coupon - Use it at #cLudibrium Skin-Care# to change your skin to a color of #cyour choice#. (one-time use) -5153005 - Night Market Skin Coupon - Use it at #cNight Market Skin-Care# to change your skin to a color of #cyour choice#. (one-time use) -5153006 - Mu Lung Skin Care Coupon - Use it at #cMu Lung Skin-Care# to change your skin to a color of #cyour choice#. (one-time use) -5153007 - Ariant Skin Care Coupon - Use it at #cAriant Skin Care Shop# to change your skin to a color of #cyour choice# (one-time use) -5153009 - NLC Skin Coupon - Use it at #cNLC Skin-Care# to change your skin to a color of #cyour choice#. (one-time use) -5154000 - Orbis Dirty Hair Coupon - Use it at the #cOrbis Hair Salon# once for the disheveled look. -5160000 - Queasy - On the KeyConfig, configure this expression on a button of your choice. Press the button and watch your character display the throwing up motion. -5160001 - Panicky - On the KeyConfig, configure this expression on a button of your choice. Press the button and watch your character display panicking face. -5160002 - Sweetness - On the KeyConfig, configure this expression on a button of your choice. Press the button and watch your character display the happy face. -5160003 - Smoochies - On the KeyConfig, configure this expression on a button of your choice. Press the button and watch your character display kissing face. -5160004 - Wink - On the KeyConfig, configure this expression on a button of your choice. Press the button and watch your character display lovely wink. -5160005 - Ouch - On the KeyConfig, configure it on a button of your choice, and the character will make the face of pain and sorrow. -5160006 - Sparkling Eyes - On the KeyConfig, configure this expression on a button of your choice. Press the button and watch your character display sparkling eyes. -5160007 - Flaming - On the KeyConfig, configure this expression on a button of your choice. Press the button and watch your character display the look of rage. -5160008 - Ray - On the KeyConfig, configure this expression on a button of your choice. Press the button and watch your character display beaming eyes. -5160009 - Goo Goo - On the KeyConfig, configure this expression on a button of your choice. Press the button and watch your character display the look of “awesome!!!” -5160010 - Whoa Whoa - On the KeyConfig, configure this expression on a button of your choice. Press the button and watch your character display the look of being flustered. -5160011 - Constant Sigh - On the KeyConfig, configure this expression on a button of your choice. Press the button and watch your character display the thinking look. -5160012 - Drool - On the KeyConfig, configure this expression on a button of your choice. Press the button and watch your character act like falling asleep. -5160013 - Dragon Breath - On the KeyConfig, configure this expression on a button of your choice. Press the button and watch your character act very surprised. -5160014 - Bleh - On the KeyConfig, configure this expression on a button of your choice. Press the button and watch your character act very surprised. -5170000 - Pet Name Tag - Use this item to name your pet. Call its name before making an order, and the pet responds much better to your command. \n ex) Lucky, sit! -5180000 - Water of Life - A mysterious water gathered from the deepest valleys of Ellinia. Double click the Water of Life to reawaken your pet, which has turned into a doll. -5190000 - Item Pick-up Skill - Adds the item pick-up skill to a pet. \n#cAvailable to pets that can only pick up Mesos.# -5190001 - HP Charge Skill - Adds to automatic potion-feeding skill to the pet. \n#cAvailable to all pets that do not have this option.# -5190002 - Expand Range Skill - Use this scroll to expand the pet's moving range by 3 times. \n#cOnly available to pets that have automatic pick-up skills, cannot be used on top of each other.# -5190003 - Automatic Pick-Up Skill - A skill that enables pets to pick up items and mesos within the area without the character having to move. \n#cAvailable to pets with Mesos pick-up, item pick-up skills.# -5190004 - (+) Pick up Leftover Item & Meso Skills - Adds the skill that enables pets to pick up mesos and items that have been dropped for more than 30 seconds, thus rendering it as leftovers.\n#cAvailable to pets that have Meso pick-up skills as well as item pick-up skills.# -5190005 - Unpickable item skill - The skill that makes pet not picking up any selected item. \n#s only pet mounted meso or item collecting function can use the skill.# -5190006 - MP potion recharge skill - The skill that automatically recharges one's MP provided you have set the option up in the system option. \n#c The skill applies to all pet that does not have the skillt#. -5191000 - (-) Delete Item Pick-Up - Use this scroll to disable the pet from picking up items. -5191001 - (-) Delete HP Charge - Use this scroll to disable the pet from automatically feeding the character when the HP reaches critical stage. -5191002 - (-)Delete Expand Range - Use this scroll to return the range of pet's movement back to normal. -5191003 - (-) Delete Automatic Pick-Up - Use this scroll to disable the pet from picking up items and mesos. -5191004 - (-) Delete Pick up Leftover Item & Meso - Use this scroll to disable pets from picking up leftover items and mesos, the ones that have been dropped for more than 30 seconds. -5200000 - Bronze Sack of Mesos - Contains quite a bit of mesos. User must be above level 15 to purchase sacks. -5200001 - Silver Sack of Mesos - Contains a lot of mesos. User must be above level 15 to purchase sacks. -5200002 - Gold Sack of Mesos - Contains lots and lots of mesos. User must be above level 15 to purchase sacks. -5201000 - Box of Metal Balls - 200 balls in the box. -5201001 - Box of Metal Balls - 500 balls in the box. -5210000 - Pro-Adult Ticket - When in possession, temporarily doubles the EXP gained. -5210001 - Pro-Adult Ticket - When in possession during a specific time period, all EXP gained will be double. -5210002 - Pro-Adult Ticket - When in possession during a specific time period, all EXP gained will be double. -5210003 - Pro-Adult Ticket - When in possession during a specific time period, all EXP gained will be double. -5210004 - Pro-Adult Ticket - When in possession during a specific time period, all EXP gained will be double. -5210005 - Pro-Adult Ticket - When in possession during a specific time period, all EXP gained will be double. -5211000 - 2x EXP Card - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 6pm ~ 8pm (Pacific time) for #c7 days#. -5211001 - From NEXON - Please refrain from breaking Maplestory client apart. -5211002 - Special Coupon - 5 days - Hold on to this coupon to #cearn 2x EXP from all monsters#. This coupon is valid for 5 days after the initial possession, and please be aware that if the character has multiple coupons of the same kind, they will all kick in at once. -5211003 - one-time 2x EXP coupon - This coupon allows users to earn #c2x Exp (double experience)# for xx minutes after the purchaser activate the coupon. -5211004 - 2x EXP Card Type 1 - Weekdays - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 07 am to 11 am (Pacific time) #cweekdays#. -5211005 - 2x EXP Card Type 2 - Weekdays - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 10 am to 02 pm (Pacific time) #cweekdays#. -5211006 - 2x EXP Card Type 3 - Weekdays - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 01 pm to 05 pm (Pacific time) #cweekdays#. -5211007 - 2x EXP Card Type 4 - Weekdays - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 04 pm to 08 pm (Pacific time) #cweekdays#. -5211008 - 2x EXP Card Type 5 - Weekdays - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 07 pm to 11 pm (Pacific time) #cweekdays#. -5211009 - 2x EXP Card Type 1 - Weekends - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 07 am to 11 am (Pacific time) #cweekends#. -5211010 - 2x EXP Card Type 2 - Weekends - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 10 am to 02 pm (Pacific time) #cweekends#. -5211011 - 2x EXP Card Type 3 - Weekends - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 01 pm to 05 pm (Pacific time) #cweekends#. -5211012 - 2x EXP Card Type 4 - Weekends - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 04 pm to 08 pm (Pacific time) #cweekends#. -5211013 - 2x EXP Card Type 5 - Weekends - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 07 pm to 11 pm (Pacific time) #cweekends#. -5211014 - 2x EXP Card Type 1 - Everyday - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 07 am to 11 am (Pacific time) #ceveryday#. -5211015 - 2x EXP Card Type 2 - Everyday - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 10 am to 02 pm (Pacific time) #ceveryday#. -5211016 - 2x EXP Card Type 3 - Everyday - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 01 pm to 05 pm (Pacific time) #ceveryday#. -5211017 - 2x EXP Card Type 4 - Everyday - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 04 pm to 08 pm (Pacific time) #ceveryday#. -5211018 - 2x EXP Card Type 5 - Everyday - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 07 pm to 11 pm (Pacific time) #ceveryday#. -5211037 - 2x EXP Card Type 6 - Weekdays - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 12 am to 04 am (Pacific time) #cweekdays#. -5211038 - 2x EXP Card Type 6 - Weekends - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 12 am to 04 am (Pacific time) #cweekends#. -5211039 - 2x EXP Card Type 6 - Everyday - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 12 am to 04 am (Pacific time) #ceveryday#. -5211040 - 2x EXP Card Type 7 - Weekdays - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 03 am to 07 am (Pacific time) #cweekdays#. -5211041 - 2x EXP Card Type 7 - Weekends - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 03 am to 07 am (Pacific time) #cweekends#. -5211042 - 2x EXP Card Type 7 - Everyday - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 03 am to 07 am (Pacific time) #ceveryday#. -5211043 - 2x EXP Card Type 8 - Weekdays - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 06 am to 10 am (Pacific time) #cweekdays#. -5211044 - 2x EXP Card Type 8 - Weekends - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 06 am to 10 am (Pacific time) #cweekends#. -5211045 - 2x EXP Card Type 8 - Everyday - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available from 06 am to 10 am (Pacific time) #ceveryday#. -5211046 - 1day 2x EXP Special Coupon - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available for 24 hours upon purchase. -5211047 - 2x EXP 3 Hours Special Coupon - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available for 3 hours upon purchase. -5211048 - 4 hour 2 x EXP special coupon - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available for 4 hour upon purchase. -5220000 - Gachapon Ticket - This ticket will enable you to use Gachapon and obtain various items. -5220001 - Event Ticket - A ticket needed to enter the event map. -5220010 - Gachapon for slot machines - (no description) -5220020 - Gachapon for Net Cafe - (no description) -5221000 - Free Ticket - This ticket allows you to shop certain items in the cash shop regardless of price. -5230000 - The Owl of Minerva - #cThe Owl of Minerva#, which represents wisdom, can be used to search for items sold at the Free Market. #cDisappears right after showing the results of the item search#. -5240000 - Monkey Banana - Tasty-looking monkey banana. Only edible for the pet Monkey. \nRecovers entire Fullness. \nIncrease 100 Closeness. -5240001 - Micro-Chips - A fresh set of batteries. Only usable with the pet Robot.\nRecovers entire Fullness. \nIncrease 100 Closeness. -5240002 - Dog Bone - A neatly-packaged dog bone. Only edible for the pet Puppy and Husky.\nRecovers entire Fullness. \nIncrease 100 Closeness. -5240003 - Bamboo - Bamboo harvested from Ellinia forests. Only edible for the pet Panda.\nRecovers entire Fullness. \nIncrease 100 Closeness. -5240004 - Porgy - Just caught at Lith Harbor. Only edible for the pet Kitty, Black Pig and Penguin.\nRecovers entire Fullness. \nIncrease 100 Closeness. -5240005 - Clover - A freshly-plucked clover. Only edible for the pet Bunny, Black Pig, and Rudolph.\nRecovers entire Fullness. \nIncrease 100 Closeness. -5240006 - Red Meat - Fresh red meat bought from the market. Only edible for the pet Dino, Mini Kargo, Black Pig, Orange Tiger and White Tiger.\nRecovers entire Fullness. \nIncrease 100 Closeness. -5240007 - Frozen Fruits - A frozen fruit that can only be eaten by #cMini Yeti and Black Pig#. Restores fullness and #cincreases closeness by 100#. -5240008 - Turkey Feed - Nicely packed Turkey Feed. Only eligible for the pet Turkey. -5240009 - Purple Heart Pudding - A large piece of Purple Heart Meat Pudding that can only be eaten by #cJr. Balrog#. Recovers "fullness" completely and #cincreases closeness by 100#. -5240010 - Golden Coin Chocolate - Delicious chocolate covered with Golden cover. Only edible for the pet Golden Pig.\nRecovers entire Fullness. \nIncrease 100 Closeness. -5240011 - Cotton Candy - A pet food designated for Pet Sun Wu Kong. Fullness 100% & Closeness +100 -5240012 - Dragon Marble Candy - A pet food designated for Dragons. Fullness 100% & Closeness +100 -5240013 - Caramel Beetle - A large piece of Caramel Beetle that can only be eaten by #cJr. Reaper#. Recovers "fullness" completely and #cincreases closeness by 100#. -5240015 - Garlic Salt Chips - Crispy-Salty looking bag of Chips. Only edible for the pet Porcupine. \nRecovers entire Fullness. \nIncrease 100 Closeness. -5240016 - Caramel Beetle - A caramel beetle plucked right from a myserious tree. Only the #cJr. Reaper# appreciates such delicacy. Restores Fullness and #cincreases 100 Closeness#. -5240017 - Snowflake - A tasty icicle that can only be consumed by #cSnowman and Crystal Rudolph#. Recovers entire Fullness and #cincreases 100 Closeness#. -5240018 - Sprout - A nutritious food only available for #cKino#. Restores Fullness and #cincreases 100 Closeness#.. -5240019 - Hedgehog Food Is this supposed to be for the Porcupine? - A nutritious blend of formulas only for #cHedgehogs#. Restores Fullness and #cincreases 100 Closeness#.. -5240020 - Caviar - Only eligible for the pet Skunk. \nIncrease 100 Closeness. -5251000 - Wedding Ticket (Cathedral) - Ticket to have a wedding at the Cathedral w/ invitations -5251001 - Wedding Ticket (Chapel) - Ticket to have a wedding at the Vegas Chapel w/ invitations -5251002 - Premium Wedding Ticket (Chapel) - Chapel wedding ticket that includes invitations and a special wedding event. -5251003 - Premium Wedding Ticket (Cathedral) - Cathedral wedding ticket that includes invitations and a special wedding event. -5251004 - Simple Wedding Ticket - A ticket that allows for a simple wedding. #cThe bride and groom may each invite 5 well-wishers and receive a 1 Carat Wedding Ring.# -5251005 - Sweet Wedding Ticket - A ticket that allows for a sweet wedding. #cThe bride and groom may each invite 15 well-wishers, take a Wedding Photo, and receive a 2 Carat Wedding Ring.# -5251006 - Premium Wedding Ticket - A ticket that allows for a lavish, premier wedding. #cThe bride and groom may each invite 30 well-wishers, take a Wedding Photo, and receive a 3 Carat Wedding Ring.# -5251100 - Wedding Invitation Ticket - Ticket that lets you make additional invitation cards.(one-time use) -5281000 - Passed Gas - A special effect that shows Passed Gas. Double-click to use this effect one time only! -5281001 - Floral Scent - A special effect that shows Floral Scent. -5290000 - Guild Forum Emoticon - Angry - An emoticon that can be entered in Guild Forum. -5290001 - Guild Forum Emoticon - Smile - An emoticon that can be entered in Guild Forum. -5290002 - Guild Forum Emoticon - Silent - An emoticon that can be entered in Guild Forum. -5290003 - Guild Forum Emoticon - LOL - An emoticon that can be entered in Guild Forum. -5290004 - Guild Forum Emoticon - Surprise - An emoticon that can be entered in Guild Forum. -5290005 - Guild Forum Emoticon - Cry - An emoticon that can be entered in Guild Forum. -5290006 - Guild Forum Emoticon - Furious - An emoticon that can be entered in Guild Forum. -5290007 - Guild Forum Emoticon - 0_0 - An emoticon that can be entered in Guild Forum. -5300000 - Fungus Scroll - At last, your desire to transform into a mushroom can be fulfilled. Disguise yourself for 10 minutes and surpirse your friends! -5300001 - Oinker Delight - Endulge yourself with this phat pig costume. 10 minutes of gluttony has never been so fun! -5300002 - Zeta Nightmare - Become a terifying Space Monster with this costume. Scare your friends out of this world for 10 minutes! -5330000 - Quick Delivery Ticket - This ticket enables one to send a package, along with an entered message, #cRIGHT THEN AND THERE#. #cDouble-click# it or visit the #cPackage NPC# to use this. -5360000 - 1day 2x Drop Special Coupon - This coupon #cdoubles the amount of mesos and doubles the rate of items# dropped from monsters. The Double Drop card is immediately activated upon purchase and the double drop effect will be available for 24 hours upon purchase. -5360001 - 2x Drop Card Type 1 - Everyday - This coupon #cdoubles the amount of mesos and doubles the rate of items# dropped from monsters. The Double Drop card is immediately activated upon purchase and the double drop effect will be available from 07 am to 11 am (Pacific time) #ceveryday#. -5360002 - 2x Drop Card Type 2 - Everyday - This coupon #cdoubles the amount of mesos and doubles the rate of items# dropped from monsters. The Double Drop card is immediately activated upon purchase and the double drop effect will be available from 10 am to 02 pm (Pacific time) #ceveryday#. -5360003 - 2x Drop Card Type 3 - Everyday - This coupon #cdoubles the amount of mesos and doubles the rate of items# dropped from monsters. The Double Drop card is immediately activated upon purchase and the double drop effect will be available from 01 pm to 05 pm (Pacific time) #ceveryday#. -5360004 - 2x Drop Card Type 4 - Everyday - This coupon #cdoubles the amount of mesos and doubles the rate of items# dropped from monsters. The Double Drop card is immediately activated upon purchase and the double drop effect will be available from 04 pm to 08 pm (Pacific time) #ceveryday#. -5360005 - 2x Drop Card Type 5 - Everyday - This coupon #cdoubles the amount of mesos and doubles the rate of items# dropped from monsters. The Double Drop card is immediately activated upon purchase and the double drop effect will be available from 07 pm to 11 pm (Pacific time) #ceveryday#. -5360006 - 2x Drop Card Type 6 - Everyday - This coupon #cdoubles the amount of mesos and doubles the rate of items# dropped from monsters. The Double Drop card is immediately activated upon purchase and the double drop effect will be available from 12 am to 04 am (Pacific time) #ceveryday#. -5360007 - 2x Drop Card Type 7 - Everyday - This coupon #cdoubles the amount of mesos and doubles the rate of items# dropped from monsters. The Double Drop card is immediately activated upon purchase and the double drop effect will be available from 03 am to 07 am (Pacific time) #ceveryday#. -5360008 - 2x Drop Card Type 8 - Everyday - This coupon #cdoubles the amount of mesos and doubles the rate of items# dropped from monsters. The Double Drop card is immediately activated upon purchase and the double drop effect will be available from 06 am to 10 am (Pacific time) #ceveryday#. -5360009 - 2X Drop Card - Type 1 - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available for 24 hours upon purchase. -5360010 - 2X Drop Card - Type 1 - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available for 24 hours upon purchase. -5360011 - 2X Drop Card - Type 1 - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after purchase, and the double experience effect will be available for 24 hours upon purchase. -5360012 - 2X Drop Card - Type 1 - This coupon allows users to earn #c2x Drop (double drop rate)# from monsters. The coupon will be activated immediately after purchase, and the double experience effect will be available for 24 hours upon purchase. -5360013 - 2X Drop Card - Type 1 - This coupon allows users to earn #c2x Drop (double drop rate)# from monsters. The coupon will be activated immediately after purchase, and the double experience effect will be available for 24 hours upon purchase. -5360014 - 2x Drop 3 Hours Special Card - This coupon allows users to earn #c2x Drop (double drop)#. The coupon will be activated immediately after purchase, and the double drop effect will be available for 3 hours upon purchase. -5360042 - 4 hour 2 x Drop special coupon - This coupon #cdoubles the amount of mesos and doubles the rate of items# dropped from monsters. The coupon will be immediately activated after purchase and the double drop effect will be available for 4 hour upon purchase. -5370000 - Chalkboard - Any information entered will be featured on the chalkboard. The item can be used anywhere including #cFree Market Entrance# except for #cFree Market#. -5370001 - Chalkboard - Any information entered will be featured on the chalkboard. The item can be used anywhere including #cFree Market Entrance# except for #cFree Market#. -5380000 - The Rock of Evolution - A mysterious rock that enables baby Evolving Pets to grow into full-fledged adult Evolving Pets. -5390000 - Diablo Messenger - Shout to everyone in the world your character is on with this megaphone. Now available with your avatar on the top of everyone's screen! Comes with a burning background for your avatar. -5390001 - Cloud 9 Messenger - Shout to everyone in the world your character is on with this megaphone. Now available with your avatar on the top of everyone's screen! Comes with a bright background for your avatar. -5390002 - Loveholic Messenger - Shout to everyone in the world your character is on with this megaphone. Now available with your avatar on the top of everyone's screen! Comes with a heart background for your avatar. -5400000 - Character Name Change - This scroll will enable you to change your character name to something totally new! Please be aware that the character must be at level 10 or higher to be eligible for the name change and the new name should be an acceptable new name that has passed the name check. The name-change will occur during the following server check, and you will then be restricted from changing names for one month. -5401000 - Character Transfer - This item is used to transfer your character from one game world server to another. Your character must be at least Level 20, and only up to 1,000,000 mesos will be transferred with the character. -5420000 - Amoria Hair Membership Coupon - Use it at #cAmoria Hair Salon# to change your hair to a style of #cyour choice#. -5420001 - NLC Hair Membership Coupon - Use it at #cNLC Hair Salon# to change your hair to a style of #cyour choice#. -5420002 - Henesys Hair Membership Coupon - Use it at #cHenesys Hair Salon# to change your hair to a style of #cyour choice#. -5420003 - Kerning City Hair Membership Coupon - Use it at #cKerning City Hair Salon# to change your hair to a style of #cyour choice#. -5420004 - Orbis Hair Membership Coupon - Use it at #cOrbis Hair Salon# to change your hair to a style of #cyour choice#. -5420005 - Ludibrium Hair Membership Coupon - Use it at #cLudibrium Hair Salon# to change your hair to a style of #cyour choice#. -5420006 - Mu Lung Hair Membership Coupon - Use it at #cMu Lung Hair Salon# to change your hair to a style of #cyour choice#. -5430000 - Extra Character Slot Coupon - Increases the character creation slot by 1. Each account may hold a maximum of 6 character slots per server world. -5431000 - Maple Life (A-Type) - #c*Warning: If you do not have an empty Character slot, it cannot be used.#\r\n\r\nIf you are over #cLevel 30#, a new Level 30 character can be created in your world.You can choose one of the following classes #c(Warrior, Magician, Thief, Bowman and Pirate)# at #c1st Job status#.\r\n\r\nOnly the amount of AP needed for each respective 1st jobs have been allocated and the rest of AP and SP can be distributed to your liking.#cBasic equips and items# needed for travel are also provided. -5432000 - Maple Life (B-Type) - #c*Warning : If all 12 character slots are full, it cannot be used.#\r\n\r\nThis package has the #cMaple Life item plus an Extra Character Slot coupon.#Using this item will automiatically create a new slot.\r\n\r\nIf you are over #cLevel 30#, a new Level 30 character can be created in your world. You can choose one of the following classes #c(Warrior, Magician, Thief, Bowman and Pirate)# at #c1st Job status.#\r\n\r\nOnly the amount of AP needed for each respective 1st jobs have been allocated and the rest of AP and SP can be distributed to your liking.#cBasic equips and items# needed for travel are also provided. -5450000 - Miu Miu the Traveling Merchant - Use this to experience the same effect as entering a general store. Can purchase potions to recover HP & MP, throwing stars, and recharge bullets. Some maps restrict the use of this item, though. -5460000 - Pet Snack - A Pet Snack is secret method of handling multiple pets at once. -5470000 - Store Remote Controller - Can control the Hired Merchant anywhere, as long as the merchant is on the same channel. -5990000 - MTS sale - (no description) -5240021 - Robo Oil - Greasy oil for the Robo -5150032 - CBD Hair Style Coupon (REG) - Use it at #cCBD Hair Salon# to change your hair style #crandomly#. (one-time use) -5150033 - CBD Hair Style Coupon (VIP) - Use it at #cCBD Hair Salon# to change your hair style to a style of #cyour choice#. (one-time use) -5152037 - CBD Face Coupon (REG) - Use it at #cCBD Plastic Surgery# to change your face #crandomly#. (one-time use) -5152038 - CBD Face Coupon (VIP) - Use it at #cCBD Plastic Surgery# to change your face to a style of #cyour choice#. (one-time use) -5152039 - CBD Cosmetic Lens Coupon (REG) - Use it at #cCBD Plastic Surgery# to change your eye color #crandomly#. (one-time use) -5152040 - CBD Cosmetic Lens Coupon (VIP) - Use it at #cCBD Plastic Surgery# to change your eye to a color of #cyour choice#. (one-time use) -5153010 - CBD Skin Coupon - Use it at #cCBD Skin-Care# to change your skin to a color of #cyour choice#. (one-time use) -5151027 - CBD Hair Color Coupon (REG) - Use it at #cCBD Hair Salon# to change your hair color #crandomly#. (one-time use) -5151028 - CBD Hair Color Coupon (VIP) - Use it on #cCBD Hair Salon# to change your hair to a color of #cyour choice#. (one-time use) -5021023 - Stirge Throwing Star - Stirgeman's favorite throwing star! Guaranteed to get you out of a tight spot! -5010059 - Trail of Darkness Effect - Blaze a trail of dark energy--no one can escape your wrath with this effect! -5252000 - Event Ticket (NX) - A ticket that's required to enter the Mini Dungeon during the event period. Without this, you won't be able to fully participate in the event. -5490000 - Gold Master Key - Take this Master Key to open the Gold Gachapon Box and earn a rare item! -5211049 - 7-Eleven 2x EXP Card - 90 Minutes - This coupon allows users to earn #c2x Exp (double experience)#. The coupon will be activated immediately after receiving it, and the double experience effect will be available for 90 minutes. -5010060 - Caroler Effect - Tis' the season to be jolly fa la la la la la la la! Sing to everyone in Maple with the carolers! -5240023 - Bread - A slice of freshly baked bread that can only be eaten by #cWhite Duck#. Recovers "fullness" completely and #cincreases closeness by 100#. -5121019 - Winter Knit Fest - Enter a message of your choice. -5010061 - Ace of Hearts - Show your Valentine's Day spirit with the Ace of Hearts! -5252001 - Ticket to Treasure Dungeon - This ticket allows you to enter the Treasure Dungeon. -5077000 - Triple Megaphone - This allows three lines of text to be heard throughout the world your character is currently in. -5120016 - ???? ???? - ??? -5120017 - ????? ???? - ???? -5120018 - ????? ???? - ??? -5120019 - ???? ???? - ?? -5120020 - ????? ???? - ?? -5120021 - ??? ???? - ??? -5120022 - ??? ???? - ??? -5120023 - ??? ???? - ?? -5120024 - ???? ???? - ?? -5120025 - ???? - ??? ????. -5120026 - ??????? - ???? -5121020 - ?? ? ?? - ?? ?? ???? ????? +20, ????? +30 ? 15?? ??????. ??? ???? ??? ? ??. -5500000 - ??? ???? - ?? ?? ????? ?? ??? ????? ???? ???? ????, ????? #c1?# ???? ??. #c??????? ??? ? ???. ???? 30? ????? ?? ? ??# -5510000 - Wheel of Destiny - This item revives characters in the same map where they have died. However, it cannot be used in some PQs, Event Maps, and Transportation (i.e. ship). -5520000 - Scissors of Karma - This cuts the ties that bind an item to its master, allowing you to trade once. Applicable to only certain items. -5451000 - Remote Gachapon Ticket - This ticket will enable you to use the Gachapon of any town without having to travel to the actual location. -5490001 - Silver Master Key - Take this Master Key to open the Silver Gachapon Box and earn a rare item! -5010064 - Rock Band Effect - (no description) -5010065 - Scoreboard Effect - (no description) -5010066 - Disco Effect - (no description) -5120028 - Raining Cats & Dogs - It's raining cats and dogs!!! Enter a message of your choice. -5021024 - Throwing Eggs Weapon - Can be equipped with a #cthrowing star#. -5570000 - Vicious' Hammer - Temper the equipped item with Vicious' Hammer to increase available upgrade by 1. It can be used maximum 2 times per item. Warning: You cannot use it on the Horntail Necklace. -5010068 - Return of Angel Wing - Who knows? Perhaps you'll flutter away with these wings on your back! -5221001 - Enchanted Scroll - A scroll that has the magic power to release the seal on the Miwok Artifact. The scroll is written in ancient tribal language, so you need NPC Toh Reliseeker's help if you wish to use it. -5010069 - Seraphim's Dark Wings - Who knows? Perhaps you'll flutter away with these wings on your back! -5550000 - Increasing the Pendant Slots:30 Days - This item allows characters to equip 1 more Pendant than is normally allowed for 30 days. #cHowever, characters will not be able to equip more than 1 Special Equipment Item# -5061003 - Item Guard : 365 Days - A guard for sealing an equip item and/or throwing star to prevent #cselling, trading or dropping# of the item. Double-click on the guard, then seal the item into the window that appears. #cThis Item Guard is active for 365 days, after which the item will be automatically released from the seal.# -5222000 - Cash Shop Surprise - Get a random Cash Shop item when you open this box. Test your luck! After purchasing this item, open the box by double-clicking it in the Cash Inventory. Please keep in mind that you'll only be able to open the box in the Cash Inventory. -5240024 - Pinky DrumStick - Pink Bean's favorite Drumstick. Only available for Pink Bean. -5021022 - Plate Throwing Star - Thrown with a #cthrowing star#.Item cannot be removed. -5120027 - Spaceship - Spaceship that is used when rescuing Gaga. -5120030 - Witch Tower - The Witch Tower hints of danger. -5500001 - [7days]Magical Sandglass - Drag and drop this onto a piece of equipment that has a time limit to extend the time limit by #c7days#. #This cannot be used on cash items, and the time limit cannot be extended past 30 days, starting from today.# -5500002 - [20days]Magical Sandglass - Drag and drop this onto a piece of equipment that has a time limit to extend the time limit by #c20days#. #This cannot be used on cash items, and the time limit cannot be extended past 30 days, starting from today.# -5530000 - DS Egg Basket - Double-click on it to exchange it with DS Eggs. -5490002 - Premium Gold Master Key - Take this Premium Master Key to open the Premium Gold Box and earn a rare item! -5490003 - Premium Silver Master Key - Take this Premium Master Key to open the Premium Silver Box and earn a rare item! -5150044 - Special Royal Hair Coupon - Take this coupon to the #cBig Headward of Henesys Hair Salon#, and you'll be able to #ctemporarily#k change your hair. -5010070 - Sprite Wings - A pair of wings that resembles the wings of a forest fairy. -5211052 - 3xExp - Fot Test -5211060 - 2 hour 3 x EXP special coupon - This coupon allows users to earn #c3x Exp (triple experience)#. The coupon will be activated immediately after purchase, and the triple experience effect will be available for 2 hour upon purchase. -5610000 - Vega's Spell(10%) - This winning spell from Vega enables a 30% success rate on a 10% scroll. Please check the scroll description to confirm that Vega's Spell is available for the scroll you choose. -5610001 - Vega's Spell(60%) - This winning spell from Vega enables a 90% success rate on a 60% scroll. Please check the scroll description to confirm that Vega's Spell is available for the scroll you choose. -5590000 - High-Five Stamp - Can equip items that are 5 levels above your current level. -5021026 - Gift Box Throwing Stars - A gift box that can be freely thrown around. Using the #cThrowing Star# will create an orbital effect.\n\nThis item cannot be deleted. -5010073 - Miss Popular - Well, lookie here. Someone’s certainly become popular with the guys. Turn this effect on and off by assigning it to a shortcut key from the keyboard settings menu. - -5010074 - Mr. Popular - Well, lookie here. Someone’s certainly become popular with the girls. Turn this effect on and off by assigning it to a shortcut key from the keyboard settings menu. - -5240027 - Golden Drumstick - A drumstick that can be consumed only by #cBaby Tiger#. It recovers hunger and #cincreases Closeness by 100.# -5390005 - Cute Tiger Messenger - Shout to everyone in the world your character is on with this megaphone. Now available with your avatar on the top of everyone's screen! Comes with a tiger background for your avatar. -5390006 - Roaring Tiger Messenger - Shout to everyone in the world your character is on with this megaphone. Now available with your avatar on the top of everyone's screen! Comes with a screen shaked. -5120034 - Cloudy Meatballs - Meatballs will drop from the sky in the map your character is in for 30 seconds. diff --git a/tools/MapleIdRetriever/handbook/Equip/Accessory.txt b/tools/MapleIdRetriever/handbook/Equip/Accessory.txt deleted file mode 100644 index f8ec0478f1..0000000000 --- a/tools/MapleIdRetriever/handbook/Equip/Accessory.txt +++ /dev/null @@ -1,497 +0,0 @@ -1122040 - Sealed Mind of Maple Necklace - A Mind of Maple Necklace that has been sealed up. One more gem, and its mystical powers will begin to be restored. -1122041 - Sealed Mind of Maple Necklace - A Mind of Maple Necklace that has been sealed up. One more gem, and its mystical powers will begin to be restored. -1122042 - Sealed Mind of Maple Necklace - A Mind of Maple Necklace that has been sealed up. One more gem, and its mystical powers will begin to be restored. -1122043 - Sealed Mind of Maple Necklace - A Mind of Maple Necklace that has been sealed up. One more gem, and its mystical powers will begin to be restored. -1122044 - Sealed Mind of Maple Necklace - A Mind of Maple Necklace that has been sealed up. One more gem, and its mystical powers will begin to be restored. -1122045 - Sealed Mind of Maple Necklace - A Mind of Maple Necklace that has been sealed up. One more gem, and its mystical powers will begin to be restored. -1122046 - Restoring Mind of Maple Necklace - A Mind of Maple Necklace that is beginning to be restored. One more gem, and its mystical powers will be amplified and awakened into a power on another level. -1122047 - Restoring Mind of Maple Necklace - A Mind of Maple Necklace that is beginning to be restored. One more gem, and its mystical powers will be amplified and awakened into a power on another level. -1122048 - Restoring Mind of Maple Necklace - A Mind of Maple Necklace that is beginning to be restored. One more gem, and its mystical powers will be amplified and awakened into a power on another level. -1122049 - Restoring Mind of Maple Necklace - A Mind of Maple Necklace that is beginning to be restored. One more gem, and its mystical powers will be amplified and awakened into a power on another level. -1122050 - Restoring Mind of Maple Necklace - A Mind of Maple Necklace that is beginning to be restored. One more gem, and its mystical powers will be amplified and awakened into a power on another level. -1122051 - Restoring Mind of Maple Necklace - A Mind of Maple Necklace that is beginning to be restored. One more gem, and its mystical powers will be amplified and awakened into a power on another level. -1122052 - Awakening Mind of Maple Necklace - A Mind of Maple Necklace that is beginning to be restored. One more gem, and its mystical powers will be amplified and awakened into a power on another level. -1122053 - Awakening Mind of Maple Necklace - A Mind of Maple Necklace that is beginning to be restored. One more gem, and its mystical powers will be amplified and awakened into a power on another level. -1122054 - Awakening Mind of Maple Necklace - A Mind of Maple Necklace that is beginning to be restored. One more gem, and its mystical powers will be amplified and awakened into a power on another level. -1122055 - Awakening Mind of Maple Necklace - A Mind of Maple Necklace that is beginning to be restored. One more gem, and its mystical powers will be amplified and awakened into a power on another level. -1122056 - Awakening Mind of Maple Necklace - A Mind of Maple Necklace that is beginning to be restored. One more gem, and its mystical powers will be amplified and awakened into a power on another level. -1122057 - Awakening Mind of Maple Necklace - A Mind of Maple Necklace that is beginning to be restored. One more gem, and its mystical powers will be amplified and awakened into a power on another level. -1010000 - Long Brown Beard - (no description) -1010001 - Goatee - (no description) -1010002 - Ninja Mask for Men - (no description) -1010003 - 5 O'Clock Shadow - (no description) -1010004 - General's Mustache (1) - (no description) -1010005 - General's Mustache (2) - (no description) -1010006 - Yakuza Scar - (no description) -1011000 - Ninja Mask for Women - (no description) -1011001 - SF Ninja Mask - (no description) -1011002 - Heart - (no description) -1011003 - Freckles - (no description) -1012000 - Battle Scar - (no description) -1012001 - Bindi - (no description) -1012002 - Leather Mask - (no description) -1012003 - Blush - (no description) -1012004 - Disguise - (no description) -1012005 - Bruise - (no description) -1012006 - Rose - (no description) -1012007 - Santa Beard - (no description) -1012008 - Censor - (no description) -1012009 - Kiss Mark - (no description) -1012010 - Hinomaru - (no description) -1012011 - Rudolph's Red Nose - (no description) -1012012 - Rudolph's Red Nose - (no description) -1012013 - Rudolph's Red Nose - (no description) -1012014 - Rudolph's Red Nose - (no description) -1012015 - Rudolph's Red Nose - (no description) -1012016 - Rudolph's Red Nose - (no description) -1012017 - Rudolph's Red Nose - (no description) -1012018 - Rudolph's Red Nose - (no description) -1012019 - Rudolph's Red Nose - (no description) -1012020 - Rudolph's Red Nose - (no description) -1012021 - White Kabuki Mask - (no description) -1012022 - Red Kabuki Mask - (no description) -1012023 - Yellow Kabuki Mask - (no description) -1012024 - Gentleman's Mustache - (no description) -1012025 - War Paint - (no description) -1012026 - Guan Yu Beard - (no description) -1012027 - Bandage Strip - (no description) -1012028 - Blush - (no description) -1012029 - Jester Mask - (no description) -1012030 - Eye Scar - (no description) -1012031 - Leaf - (no description) -1012032 - White Bread - (no description) -1012033 - England Face Painting - (no description) -1012034 - Tri-color Paint (France) - (no description) -1012035 - Brazillian Paint (Brazil) - (no description) -1012036 - Bundes Paint (Germany) - (no description) -1012037 - Armillary Shield Paint (Portugal) - (no description) -1012038 - Rising Sun Paint (Japan) - (no description) -1012039 - Taegeuk Paint (Korea) - (no description) -1012040 - Heart Face Painting - (no description) -1012041 - Star Spangled Paint (USA) - (no description) -1012042 - Aztec Paint (Mexico) - (no description) -1012043 - Australia Face Painting - (no description) -1012044 - Mummy Mask - (no description) -1012047 - Fu Manchu - (no description) -1012048 - Blackjack Scar - (no description) -1012049 - Ogre Mask - (no description) -1012050 - Maple-Stein - (no description) -1012051 - Dark Jester - (no description) -1012052 - Tongue Twister Scroll - (no description) -1012053 - Unmanaged Anger - (no description) -1012054 - Purple Rage - (no description) -1012055 - Allergic Reaction - (no description) -1012056 - Doggy Mouth - (no description) -1012058 - Tree Branch Nose - (no description) -1012059 - Tree Branch Nose - (no description) -1012060 - Tree Branch Nose - (no description) -1012061 - Tree Branch Nose - (no description) -1012062 - Mild Pink Lipstick - (no description) -1012063 - Kitty Paint - (no description) -1012070 - Strawberry Icecream Bar - (no description) -1012071 - Chocolate Icecream Bar - (no description) -1012072 - Melon Icecream Bar - (no description) -1012073 - Watermelon Icecream Bar - (no description) -1012074 - Neh neh neh boo boo - (no description) -1012075 - Cold Sweat - (no description) -1012076 - Smiling Mask - (no description) -1012077 - Crying Mask - (no description) -1012078 - Angry Mask - (no description) -1012079 - Sad Mask - (no description) -1012080 - Fat Lips - (no description) -1012082 - Ice Cold Red - (no description) -1012083 - Dollish Pink - (no description) -1012084 - White Mouse Kit - (no description) -1012085 - Cherry Bubblegum - (no description) -1012086 - White Mouse Kit - (no description) -1012087 - White Mouse Kit - (no description) -1012088 - White Mouse Kit - (no description) -1012090 - Facial Powder - (no description) -1012096 - Apple Bubble Gum - (no description) -1012097 - Purple Noisemaker - (no description) -1012098 - Maple Leaf - (no description) -1012099 - Facial Powder(blue) - (no description) -1012100 - Facial Powder(red) - (no description) -1012101 - Maple Leaf - (no description) -1012102 - Maple Leaf - (no description) -1012103 - Maple Leaf - (no description) -1012104 - Transparent Face Accessory - (no description) -1012105 - Super Sucker - (no description) -1012106 - Rat Mouth - (no description) -1012107 - Branch Nose - (no description) -1012108 - Smiling Mask - (no description) -1012109 - Crying Mask - (no description) -1012110 - Angry Mask - (no description) -1012111 - Sad Mask - (no description) -1012112 - Bauhinia Paint (Hong Kong) - (no description) -1012113 - ROC Paint (Taiwan) - (no description) -1012114 - 5-Starred Red Paint (China) - (no description) -1012121 - Coat of Arms Paint (Spain) - (no description) -1012122 - Gold Nordic Paint (Sweden) - (no description) -1012123 - Holland Paint (Netherlands) - (no description) -1012124 - Union Paint (UK) - (no description) -1012125 - Chakra Paint (Thailand) - (no description) -1012126 - Yellow Star Paint (Vietnam) - (no description) -1012127 - Crescent Paint (Singapore) - (no description) -1012128 - Jalur Gemilang Paint (Malaysia) - (no description) -1012129 - Maple Leaf Paint (Canada) - (no description) -1020000 - Aqua Toy Shades - (no description) -1021000 - Pink Toy Shades - (no description) -1022000 - Orange Shades - (no description) -1022001 - Blue Shades - (no description) -1022002 - Yellow Shades - (no description) -1022003 - Green Shades - (no description) -1022004 - Black Sunglasses - (no description) -1022005 - Red Hard-Rimmed Glasses - (no description) -1022006 - Blue Hard-Rimmed Glasses - (no description) -1022007 - Green Hard-Rimmed Glasses - (no description) -1022008 - Orange Hard-Rimmed Glasses - (no description) -1022009 - Dark Shades - (no description) -1022010 - Blue & Red Eye Guard - (no description) -1022011 - Red Eye Guard - (no description) -1022012 - Blue Eye Guard - (no description) -1022013 - Black Eye Guard - (no description) -1022014 - Brown Aviator Shades - (no description) -1022015 - Black Aviator Shades - (no description) -1022016 - Blue Aviator Shades - (no description) -1022017 - Purple Aviator Shades - (no description) -1022018 - Classic Masquerade Mask - (no description) -1022019 - Old-School Glasses - (no description) -1022020 - Metal Shades - (no description) -1022021 - Red Head-Spinning Glasses - (no description) -1022022 - Blue Head-Spinning Glasses - (no description) -1022023 - Crested Eye Patch - (no description) -1022024 - Skull Patch - (no description) -1022025 - Red Hearted Eye Patch - (no description) -1022026 - Purple Starred Eye Patch - (no description) -1022027 - Medical Eye Patch - (no description) -1022028 - Spinning Groucho - (no description) -1022029 - Spinning Piglet - (no description) -1022030 - Hot Teacher Glasses - (no description) -1022031 - White Toy Shades - (no description) -1022032 - Yellow Toy Shades - (no description) -1022033 - Politician Glasses - (no description) -1022034 - Bizarre Monocle - (no description) -1022035 - Orange Sports Goggle - (no description) -1022036 - Green Sports Goggle - (no description) -1022037 - Frameless Glasses - (no description) -1022038 - Purple Round Shades - (no description) -1022039 - Orange Round Shades - (no description) -1022040 - Lead Monocle - (no description) -1022041 - Cyclist Shades - (no description) -1022042 - Scouter - (no description) -1022043 - Head Bandage - (no description) -1022044 - Nerdy Glasses - (no description) -1022045 - Red Bushido Bandana - (no description) -1022046 - Butterfly Ball Mask - (no description) -1022047 - Owl Ball Mask - (no description) -1022049 - Green Hard-rimmed Glasses - (no description) -1022050 - Vintage Glasses - (no description) -1022051 - Red Half-Rimless Glasses - (no description) -1022052 - Future Vision Shades - (no description) -1022053 - Futuristic Shades - (no description) -1022054 - Round Shield Shades - (no description) -1022055 - Pink Sunglasses - (no description) -1022056 - Pink Aviator Sunglasses - (no description) -1022057 - Pop-Eye - (no description) -1022058 - Raccoon Mask - (no description) -1022059 - Black Shades - (no description) -1022060 - White Raccoon Mask - (no description) -1022061 - Redbeard's Pirate Eye Patch - (no description) -1022062 - Black Skull Eye Patch - (no description) -1022063 - Flat Mini Glasses - (no description) -1022064 - Big Red Glasses - (no description) -1022066 - Star Spectacles - (no description) -1032000 - Weighted Earrings - (no description) -1032001 - Single Earring - (no description) -1032002 - Sapphire Earrings - (no description) -1032003 - Amethyst Earrings - (no description) -1032004 - Gold Earrings - (no description) -1032005 - Red Cross Earrings - (no description) -1032006 - Lightning Earrings - (no description) -1032007 - Emerald Earrings - (no description) -1032008 - Cat's Eye - (no description) -1032009 - Yellow Square - (no description) -1032010 - Star Earrings - (no description) -1032011 - Blue Moon - (no description) -1032012 - Skull Earrings - (no description) -1032013 - Red-Hearted Earrings - (no description) -1032014 - Pink-Flowered Earrings - (no description) -1032015 - Metal Silver Earrings - (no description) -1032016 - Metal Heart Earrings - (no description) -1032017 - Rose Earrings - (no description) -1032018 - Pansy Earrings - (no description) -1032019 - Crystal Flower Earrings - (no description) -1032020 - Gold Drop Earrings - (no description) -1032021 - Holy Cross Earrings - (no description) -1032022 - Half Earrings - (no description) -1032023 - Strawberry Earrings - (no description) -1032024 - Transparent Earrings - Use these Earrings if you want to make your Earrings transparent while still using all of the stats your Earrings possess. -1032025 - Leaf Earrings - (no description) -1032026 - Gold Emerald Earrings - (no description) -1032027 - Black Emerald Earrings - (no description) -1032028 - Red Emerald Earrings - (no description) -1032029 - Silver Earrings - (no description) -1032030 - Sword Earrings - (no description) -1032031 - Timeless Earrings - (no description) -1032032 - Fallen Leaf Earrings - (no description) -1032033 - Protector Rock - (no description) -1032034 - Coke Earring - (no description) -1032036 - Beaded Cross Earring - (no description) -1032038 - Snow Earring - (no description) -1032039 - Eclipse Earrings - (no description) -1032040 - Maple Earring - (no description) -1032041 - Maple Earring - (no description) -1032042 - Maple Earring - (no description) -1032043 - Cecelia's Earrings - (no description) -1032044 - Moonstar Earrings - (no description) -1032045 - Celestial Earrings - (no description) -1032046 - Spider Venom Earrings - (no description) -1032047 - Coke Earring - (no description) -1032048 - Crystal Leaf Earrings - Once worn proudly by Masterian magicians, these shining earrings are infused with magical qualities. -1032049 - Dark Shards - This unique item combines Power Crystal and Black Crystals for increased resistance to physical and magical forces. -1032050 - Snail's Eye - (no description) -1032051 - Diamond Earrings - (no description) -1032052 - Slime Earrings - (no description) -1032053 - Clover Earrings - (no description) -1032054 - Rainbow Earrings - (no description) -1122000 - Horntail Necklace - (no description) -1122001 - Bow-tie(Green) - (no description) -1022071 - Red Shutter Shades - (no description) -1122002 - Bow-tie (Red) - (no description) -1122003 - Bow-tie (Yellow) - (no description) -1122004 - Bow-tie (Pink) - (no description) -1122005 - Bow-tie (Black) - (no description) -1122006 - Bow-tie (Blue) - (no description) -1122007 - Spiegelmann's Necklace - (no description) -1122010 - Horus' Eye - (no description) -1122014 - Silver Deputy Star - A badge of honor given by Lita Lawless for vanquishing monsters in defense of NLC. You're part of the law now! -1022069 - Orange Shutter Shades - (no description) -1012134 - Tear Drop Face Tattoo - Express your soft side with this teary-eyed Tattoo! -1032060 - Altair Earrings - (no description) -1022073 - Broken Glasses - (no description) -1032061 - Glittering Altaire Earrings - (no description) -1012057 - Transparent Face Accessory - (no description) -1122018 - Warm Muffler - (no description) -1022074 - Gaga Glasses - (no description) -1122039 - Mind of Maple Necklace - A Mind of Maple Necklace that brings luck and hope to anyone who wears it. -1022072 - Yellow Shutter Shades - (no description) -1022070 - Green Shutter Shades - (no description) -1012081 - MV Mask - (no description) -1012137 - Star Face Painting - (no description) -1122059 - Mark of Naricain - A token given to those who have found favor with the demon Naricain. It may be wise to hold onto this... -1142000 - Diligent Explorer Medal - (no description) -1142001 - PQ Mania Medal - (no description) -1142002 - Quest Specialist Medal - (no description) -1142003 - Celebrity Medal - (no description) -1142004 - Veteran Hunter Medal - (no description) -1142005 - Legendary Hunter Medal - (no description) -1142006 - Maple Idol Medal - (no description) -1142007 - Horned Tail Slayer Medal - (no description) -1142008 - Pink Bean Slayer Medal - (no description) -1142009 - Gallant Warrior Medal - (no description) -1142010 - Wiseman Medal - (no description) -1142011 - Lord Sniper Medal - (no description) -1142012 - Legendary Thief Medal - (no description) -1142013 - King Pirate Medal - (no description) -1142014 - Henesys Donor Medal - (no description) -1142015 - Ellinia Donor Medal - (no description) -1142016 - Perion Donor Medal - (no description) -1142017 - Kerning City Donor Medal - (no description) -1142018 - Sleepywood Donor Medal - (no description) -1142019 - The Nautilus Donor Medal - (no description) -1142020 - El Nath Donor Medal - (no description) -1142021 - Aquarium Donor Medal - (no description) -1142022 - Ludibrium Donor Medal - (no description) -1142023 - Omega Sector Donor Medal - (no description) -1142024 - Korean Folk Town Donor Medal - (no description) -1142025 - Leafre Donor Medal - (no description) -1142026 - Mu Lung Donor Medal - (no description) -1142027 - Herb Town Donor Medal - (no description) -1142028 - Ariant Donor Medal - (no description) -1142029 - Magatia Donor Medal - (no description) -1142030 - Lith Harbor Donor Medal - (no description) -1142031 - Orbis Donor Medal - (no description) -1142032 - The Curse Breaker Medal - (no description) -1142033 - Mano Vanquisher Medal - (no description) -1142034 - Stumpy Vanquisher Medal - (no description) -1142035 - Deo Vanquisher Medal - (no description) -1142036 - King Slime Vanquisher Medal - (no description) -1142037 - Giant Centipede Vanquisher Medal - (no description) -1142038 - Faust Vanquisher Medal - (no description) -1142039 - King Clang Vanquisher Medal - (no description) -1142040 - Mushmom Vanquisher Medal - (no description) -1142041 - Alishar Vanquisher Medal - (no description) -1142042 - Timer Vanquisher Medal - (no description) -1142043 - Dyle Vanquisher Medal - (no description) -1142044 - Papa Pixie Vanquisher Medal - (no description) -1142045 - Zombie Mushmom Vanquisher Medal - (no description) -1142046 - Zeno Vanquisher Medal - (no description) -1142047 - Lord Pirate Vanquisher Medal - (no description) -1142048 - Nine-Tailed Fox Vanquisher Medal - (no description) -1142049 - Tae Roon Vanquisher Medal - (no description) -1142050 - Poison Golem Vanquisher Medal - (no description) -1142051 - King Sage Cat Vanquisher Medal - (no description) -1142052 - Jr. Balrog Vanquisher Medal - (no description) -1142053 - Eliza Vanquisher Medal - (no description) -1142054 - Frankenroid Vanquisher Medal - (no description) -1142055 - Chimera Vanquisher Medal - (no description) -1142056 - Snack Bar Vanquisher Medal - (no description) -1142057 - Snowman Vanquisher Medal - (no description) -1142058 - Blue Mushmom Vanquisher Medal - (no description) -1142059 - Crimson Balrog Vanquisher Medal - (no description) -1142060 - Manon Vanquisher Medal - (no description) -1142061 - Griffey Vanquisher Medal - (no description) -1142062 - Leviathan Vanquisher Medal - (no description) -1142063 - Papulatus Vanquisher Medal - (no description) -1142064 - Mu Lung Dojo Vanquisher Medal - (no description) -1142065 - Noblesse Medal - (no description) -1142066 - Training Knight Medal - (no description) -1142067 - Official Knight Medal - (no description) -1142068 - Advanced Knight Medal - (no description) -1142069 - Captain Knight Medal - (no description) -1142070 - Lie Detector Medal - (no description) -1142071 - Use Clean Language Medal - (no description) -1142072 - Ask Me Anything Medal - (no description) -1142073 - Be My Friend Medal - (no description) -1142074 - Leader of a Big Family Medal - (no description) -1142075 - Patriot Medal - (no description) -1142076 - Honorary Meso Ranger - (no description) -1032055 - Agent C's Old Receiver - (no description) -1032056 - Agent C's Old Receiver - (no description) -1032057 - Agent C's Old Receiver - (no description) -1032058 - Agent C's Titanium Receiver - (no description) -1122011 - Locked Timeless Pendant - (no description) -1122012 - Timeless Pendant - (no description) -1022081 - Cracked Glasses - (no description) -1032070 - Shield Earrings - (no description) -1032071 - Altair Earrings - (no description) -1032072 - Shiny Altair Earrings - (no description) -1022079 - Clear Glasses - (no description) -1022075 - Twinkling Eyes - (no description) -1022082 - Spectrum Goggles - Strange eyewear that allows vision in multiple dimensions. A short inscription states: "Who says the goggles do nothing?" -1012147 - Immortal Mask - (no description) -1012132 - Chicky Face Decoration - (no description) -1022068 - White Shade - (no description) -1032059 - Coca-Cola Zero Earrings - (no description) -1122013 - Gordon's Magic Iron - (no description) -1122015 - Maple Scarf - (no description) -1122017 - Pendant of the Spirit - EXP will increase as soon as this item is equipped, and the effects will only get stronger with time.\n #c1hr: 10% extra EXP \n 2hr: 20% extra EXP \n More than 2 hr: 30% extra EXP# -1132000 - White Belt - (no description) -1132001 - Yellow Belt - (no description) -1132002 - Blue Belt - (no description) -1132003 - Red Belt - (no description) -1132004 - Black Belt - (no description) -1022083 - Hitman Sunglasses - (no description) -1022084 - Eye Mask (Red) - (no description) -1022087 - Eye Mask (Green) - (no description) -1142077 - Absolute Victory Carnivalian Medal - (no description) -1142078 - Gifted Carnivalian Medal - (no description) -1122058 - Spiegelmann's Necklace of Chaos - (no description) -1022085 - Eye Mask (Pink) - (no description) -1022086 - Eye Mask (Blue) - (no description) -1142080 - Fervent Carnivalian Medal - (no description) -1032073 - Wind Bell Earrings - (no description) -1022088 - Archeologist Glasses - A pair of Archeologist Glasses received for participating in the Artifact Hunt. -1022089 - Archeologist Glasses - A pair of Archeologist Glasses received for finishing Top 10 in the Artifact Hunt. -1132005 - White Cookie Belt - (no description) -1132006 - Yellow Cookie Belt - (no description) -1132007 - Blue Cookie Belt - (no description) -1132008 - Red Cookie Belt - (no description) -1132009 - Violet Cookie Belt - (no description) -1132010 - Golden Pig Belt - (no description) -1132011 - Lupin Pig Belt - (no description) -1140000 - 2010 Winter King Medal - (no description) -1141000 - 2010 Winter Queen Medal - (no description) -1142079 - Tristan's Successor Medal - (no description) -1142081 - Outstanding Citizen Medal - (no description) -1142082 - Lovely Pet Owner Medal - (no description) -1142083 - Monster Expert Medal - (no description) -1142084 - Persevering Challenger Medal - (no description) -1142085 - 1-Day Dreamer Medal - (no description) -1142086 - 2-Day Dreamer Medal - (no description) -1142087 - 3-Day Dreamer Medal - (no description) -1142088 - 4-Day Dreamer Medal - (no description) -1142089 - 5-Day Dreamer Medal - (no description) -1142090 - 6-Day Dreamer Medal - (no description) -1142091 - 7-Day Dreamer Medal - (no description) -1142092 - 8-Day Dreamer Medal - (no description) -1142093 - 9-Day Dreamer Medal - (no description) -1142094 - 10-Day Dreamer Medal - (no description) -1142095 - 11-Day Dreamer Medal - (no description) -1142096 - 12-Day Dreamer Medal - (no description) -1142097 - 13-Day Dreamer Medal - (no description) -1142098 - 14-Day Dreamer Medal - (no description) -1142099 - 15-Day Dreamer Medal - (no description) -1142100 - Maple Lover Medal - (no description) -1142101 - Maple Lover Medal - (no description) -1142107 - Beginner Adventurer Medal - (no description) -1142108 - Junior Adventurer Medal - (no description) -1142109 - Veteran Adventurer Medal - (no description) -1142110 - Master Adventurer Medal - (no description) -1142111 - The One Who's Touched the Sky Medal - (no description) -1142112 - Victoria Explorer Medal - (no description) -1142113 - El Nath Explorer Medal - (no description) -1142114 - Ludus Lake Explorer Medal - (no description) -1142115 - Undersea Explorer Medal - (no description) -1142116 - Mu Lung Explorer Medal - (no description) -1142117 - Nihal Desert Explorer Medal - (no description) -1142118 - Minar Forest Explorer Medal - (no description) -1142119 - Ossyria Explorer Medal - (no description) -1142120 - Maple Explorer Medal - (no description) -1142123 - The 2nd Honorable Mesoranger Medal - (no description) -1142124 - Artifact Hunt Top 10 Medal - (no description) -1142125 - Mystical Artifact Discoverer Medal - (no description) -1142127 - Beginner Explorer - (no description) -1142128 - Sleepywood Explorer - (no description) -1142129 - Awakened Aran - (no description) -1142130 - Aran in Memory - (no description) -1142131 - Aran in Misery - (no description) -1142132 - Aran in Hope - (no description) -1142133 - Aran the Hero - (no description) -1012139 - ?? ??? - (no description) -1012140 - ?? ??? - (no description) -1012141 - ??? ??? - (no description) -1012146 - ??? ? - (no description) -1132014 - Witch's Crimson Belt - (no description) -1132015 - Witch's Ocean Blue Belt - (no description) -1132016 - Witch's Deep Purple Belt - (no description) -1012166 - Villian Mask - (no description) -1022095 - I Like Money - (no description) -1132012 - Pharaoh Belt - (no description) -1132013 - The Immortal Pharaoh Belt - (no description) -1140001 - 2010 Winter Adventurer Medal - (no description) -1140002 - 2010 Winter Adventurer Medal - (no description) -1141001 - 2010 Winter Adventurer Medal - (no description) -1141002 - 2010 Winter Adventurer Medal - (no description) -1142122 - Dynamic Hair Medal - (no description) -1142126 - Maple School Medal - (no description) -1142134 - Combo Maniac Medal - (no description) -1142135 - Combo Master Medal - (no description) -1142136 - Combo King Medal - (no description) -1142137 - Spirit Diviner Medal - (no description) -1142138 - Soul Conjurer Medal - (no description) -1142139 - Soul Guardian Medal - (no description) -1142140 - Saint Exorcist Medal - (no description) -1142141 - Honorary Employee Medal - (no description) -1142142 - Protector of Pharaoh Medal - (no description) -1032074 - Heart Rainbow Earrings - (no description) -1022096 - Fashionista Sunglasses - (no description) -1012165 - Clown Nose - (no description) -1012181 - Green Mardi Gras Mask - (no description) -1012182 - Purple Mardi Gras Mask - (no description) -1012183 - Red Mardi Gras Mask - (no description) -1012184 - Royal Green Mardi Gras Mask - (no description) -1012185 - Royal Purple Mardi Gras Mask - (no description) -1012186 - Royal Red Mardi Gras Mask - (no description) -1032063 - Bluetooth Headset - (no description) -1032075 - Free Spirit Piercing - (no description) -1142152 - Well-Behaved Child - (no description) -1142153 - Perion Guard - (no description) -1142154 - Kerning City Honorary Citizen - (no description) -1142155 - Secret Organization Temporary Member - (no description) -1012180 - Chocolate Heart - (no description) -1022102 - LED Sunglasses - (no description) -1022065 - Alphabet Glasses - (no description) -1022103 - Archeologist Glasses - A pair of Archeologist Glasses received for participating in the Artifact Hunt. -1022104 - 3D Glasses - (no description) diff --git a/tools/MapleIdRetriever/handbook/Equip/Cap.txt b/tools/MapleIdRetriever/handbook/Equip/Cap.txt deleted file mode 100644 index fe0beb727d..0000000000 --- a/tools/MapleIdRetriever/handbook/Equip/Cap.txt +++ /dev/null @@ -1,915 +0,0 @@ -1002859 - MV's Hat (DEX) - (no description) -1002860 - MV's Hat (INT) - (no description) -1002861 - MV's Hat (LUK) - (no description) -1002851 - Golden Rooster Comb - (no description) -1002821 - Violet Heart Beanie - (no description) -1000000 - Blue Beanie - (no description) -1000001 - Fine Black Hanbok Hat - (no description) -1000002 - Fine Blue Hanbok Hat - (no description) -1000003 - Scream Mask - (no description) -1000004 - Old School Uniform Hat - (no description) -1000005 - Men's Ninja Hat - (no description) -1000006 - Samurai Hair-do - (no description) -1000007 - Hat of Death - (no description) -1000008 - Detective Hat - (no description) -1000009 - Mesoranger Red Helmet - (no description) -1000010 - Mesoranger Blue Helmet - (no description) -1000011 - Mesoranger Green Helmet - (no description) -1000012 - Mesoranger Black Helmet - (no description) -1000013 - Yellow Crown - (no description) -1000014 - Green Crown - (no description) -1000015 - Blue Crown - (no description) -1000016 - Red Crown - (no description) -1000017 - Van Hat - (no description) -1000018 - Kuniragi Hat - (no description) -1000019 - Goya Hat 3 - (no description) -1000020 - Chief Hat - (no description) -1000021 - General's Wig - (no description) -1000022 - General's Wig - (no description) -1000023 - Race Ace Cap - (no description) -1000025 - Pilgrim Hat - (no description) -1000026 - Santa Boy Hat - (no description) -1000027 - Lunar Celebration Cap - (no description) -1000029 - Wedding veil - (no description) -1000030 - Sachiel Wig (M) - (no description) -1000031 - Veamoth Wig (M) - (no description) -1000032 - Janus Wig (M) - (no description) -1000035 - White Floral Hat - (no description) -1001000 - Orange Beanie - (no description) -1001001 - Hanbok Jobawi - (no description) -1001002 - Witch Hat - (no description) -1001003 - Pink Nurse Hat - (no description) -1001004 - White Nurse Hat - (no description) -1001005 - Women's Ninja Hat - (no description) -1001006 - SF Ninja Hat - (no description) -1001007 - Female Wig - (no description) -1001008 - A Ladylike Hat - (no description) -1001009 - Ribbon - (no description) -1001010 - Teddy Bear Hat - (no description) -1001011 - Strawberry Headgear - (no description) -1001012 - Tiara - (no description) -1001013 - Beret - (no description) -1001014 - Mesoranger Pink Helmet - (no description) -1001015 - Mesoranger Yellow Helmet - (no description) -1001016 - Mesoranger Black Helmet - (no description) -1001017 - Princess Tiara - (no description) -1001018 - Lady Blue - (no description) -1001019 - Lady Pink - (no description) -1001020 - Lady Yellow - (no description) -1001021 - The Gabera Hat - (no description) -1001022 - Van Hat w/ Heart - (no description) -1001023 - Picnic Hat - (no description) -1001024 - Diamond Tiara - (no description) -1001025 - Ruby Tiara - (no description) -1001026 - Red-Feathered Indian Bandana - (no description) -1001027 - Blue-Feathered Indian Bandana - (no description) -1001028 - Jami Wig - (no description) -1001029 - Yellow Bride's Veil - Flowing veil that brides wear on their Wedding Day. -1001030 - Diao Chan Headpiece - (no description) -1001031 - White Cat Ears - (no description) -1001032 - Black Cat Ears - (no description) -1001033 - Maid Hat - (no description) -1001035 - Maplehontas - (no description) -1001036 - Santa Girl Hat - (no description) -1001037 - Leopard Print Hat - (no description) -1001038 - Korean Dress Wig - (no description) -1001039 - Lunar Celebration Ornament - (no description) -1001042 - Purple Bride's Veil - Flowing veil that brides wear on their Wedding Day. -1001043 - Royal Tiara - Hand crafted Tiara that brides wear on their Wedding Day -1001044 - Green Bride's Veil - Flowing veil that brides wear on their Wedding Day. -1001045 - Sachiel Wig (F) - (no description) -1001046 - Veamoth Wig (F) - (no description) -1001047 - Janus Wig (F) - (no description) -1001048 - Gothic Mini Hat - (no description) -1001049 - Gothic Headband - (no description) -1002000 - Brown Flight Headgear - (no description) -1002001 - Metal Gear - (no description) -1002002 - Metal Koif - (no description) -1002003 - Steel Helmet - (no description) -1002004 - Great Brown Helmet - (no description) -1002005 - Iron Burgernet Helm - (no description) -1002006 - Bone Helm - (no description) -1002007 - Steel Full Helm - (no description) -1002008 - Brown Skullcap - (no description) -1002009 - Steel Football Helmet - (no description) -1002010 - Brown Winter Hat - (no description) -1002011 - Iron Viking Helm - (no description) -1002012 - Red Baseball Cap - (no description) -1002013 - Golden Pride - (no description) -1002014 - Red Headband - (no description) -1002015 - Red Swimming Goggle - (no description) -1002016 - Green Wizardry Hat - (no description) -1002017 - Brown Apprentice Hat - (no description) -1002018 - Green Camping Hat - (no description) -1002019 - White Bandana - (no description) -1002020 - Red Starry Bandana - (no description) -1002021 - Steel Nordic Helm - (no description) -1002022 - Old Steel Nordic Helm - (no description) -1002023 - Jousting Helmet - (no description) -1002024 - Emerald Dome - (no description) -1002025 - Red Duke - (no description) -1002026 - Brown Bamboo Hat - (no description) -1002027 - Steel Sharp Helm - (no description) -1002028 - Silver Crusader Helm - (no description) -1002029 - Red Oriental Helmet - (no description) -1002030 - Silver Planet - (no description) -1002031 - Cat Hat - (no description) -1002032 - Puffy Brown Hat - (no description) -1002033 - Old Wisconsin - (no description) -1002034 - Blue Jester - (no description) -1002035 - Pink Jester - (no description) -1002036 - Green Jester - (no description) -1002037 - Black Jester - (no description) -1002038 - Brown Jester - (no description) -1002039 - Bronze Helmet - (no description) -1002040 - Mithril Helmet - (no description) -1002041 - Yellow Metal Gear - (no description) -1002042 - Blue Metal Gear - (no description) -1002043 - Bronze Koif - (no description) -1002044 - Mithril Koif - (no description) -1002045 - Blue Bone Helm - (no description) -1002046 - Red Bone Helm - (no description) -1002047 - Great Red Helmet - (no description) -1002048 - Great Blue Helmet - (no description) -1002049 - Gold Burgernet Helm - (no description) -1002050 - Orihalcon Burgernet Helm - (no description) -1002051 - Bronze Full Helm - (no description) -1002052 - Mithril Full Helm - (no description) -1002053 - Green Skullcap - (no description) -1002054 - Red Skullcap - (no description) -1002055 - Bronze Football Helmet - (no description) -1002056 - Mithril Football Helmet - (no description) -1002057 - Green Winter Hat - (no description) -1002058 - Mithril Viking Helm - (no description) -1002059 - Bronze Viking Helm - (no description) -1002060 - Black Baseball Cap - (no description) -1002061 - Yellow Baseball Cap - (no description) -1002062 - Brown Baseball Cap - (no description) -1002063 - Blue Baseball Cap - (no description) -1002064 - Bronze Pride - (no description) -1002065 - Steel Pride - (no description) -1002066 - Black Headband - (no description) -1002067 - Green Headband - (no description) -1002068 - Yellow Headband - (no description) -1002069 - Blue Headband - (no description) -1002070 - Green Swimming Goggle - (no description) -1002071 - Blue Swimming Goggle - (no description) -1002072 - Blue Wizardry Hat - (no description) -1002073 - Red Wizardry Hat - (no description) -1002074 - Blue Apprentice Hat - (no description) -1002075 - Red Apprentice Hat - (no description) -1002076 - Red Flight Headgear - (no description) -1002077 - Blue Flight Headgear - (no description) -1002078 - Sky Blue Camping Hat - (no description) -1002079 - Pink Camping Hat - (no description) -1002080 - Red Bandana - (no description) -1002081 - Blue Bandana - (no description) -1002082 - Yellow Bandana - (no description) -1002083 - Black Bandana - (no description) -1002084 - Blue Oriental Helmet - (no description) -1002085 - Mithril Crusader Helm - (no description) -1002086 - Bronze Crusader Helm - (no description) -1002087 - Mithril Sharp Helm - (no description) -1002088 - Gold Sharp Helm - (no description) -1002089 - Green Bamboo Hat - (no description) -1002090 - Blue Bamboo Hat - (no description) -1002091 - Dark Dome - (no description) -1002092 - Yellow Duke - (no description) -1002093 - Blue Duke - (no description) -1002094 - Bronze Planet - (no description) -1002095 - Mithril Planet - (no description) -1002096 - Sky Blue Starry Bandana - (no description) -1002097 - Yellow Starry Bandana - (no description) -1002098 - Gold Nordic Helm - (no description) -1002099 - Mithril Nordic Helm - (no description) -1002100 - Old Bronze Nordic Helm - (no description) -1002101 - Old Mithril Nordic Helm - (no description) -1002102 - Blue Moon Conehat - (no description) -1002103 - Pink Moon Conehat - (no description) -1002104 - Green Moon Conehat - (no description) -1002105 - Dark Moon Conehat - (no description) -1002106 - Brown Moon Conehat - (no description) -1002107 - Red Thief Hood - (no description) -1002108 - Blue Thief Hood - (no description) -1002109 - Green Thief Hood - (no description) -1002110 - Black Thief Hood - (no description) -1002111 - Yellow Thief Hood - (no description) -1002112 - Red Feather Hat - (no description) -1002113 - Blue Feather Hat - (no description) -1002114 - Green Feather Hat - (no description) -1002115 - Black Feather Hat - (no description) -1002116 - Brown Feather Hat - (no description) -1002117 - Red Robin Hat - (no description) -1002118 - Blue Robin Hat - (no description) -1002119 - Green Robin Hat - (no description) -1002120 - Black Robin Hat - (no description) -1002121 - Brown Robin Hat - (no description) -1002122 - Red Ghetto Beanie - (no description) -1002123 - Blue Ghetto Beanie - (no description) -1002124 - Brown Ghetto Beanie - (no description) -1002125 - Black Ghetto Beanie - (no description) -1002126 - Green Ghetto Beanie - (no description) -1002127 - Red Loosecap - (no description) -1002128 - Blue Loosecap - (no description) -1002129 - Brown Loosecap - (no description) -1002130 - Black Loosecap - (no description) -1002131 - Green Loosecap - (no description) -1002132 - Black Swimming Cap - (no description) -1002133 - Blue Swimming Cap - (no description) -1002134 - Red Swimming Cap - (no description) -1002135 - Brown Pole-Feather Hat - (no description) -1002136 - Dark Pole-Feather Hat - (no description) -1002137 - Green Pole-Feather Hat - (no description) -1002138 - Blue Pole-Feather Hat - (no description) -1002139 - Red Pole-Feather Hat - (no description) -1002140 - Wizet Invincible Hat - (no description) -1002141 - Red Matty - (no description) -1002142 - Blue Matty - (no description) -1002143 - Green Matty - (no description) -1002144 - Brown Matty - (no description) -1002145 - Dark Matty - (no description) -1002146 - Red Tiberian - (no description) -1002147 - Blue Tiberian - (no description) -1002148 - Green Tiberian - (no description) -1002149 - Brown Tiberian - (no description) -1002150 - Dark Tiberian - (no description) -1002151 - Brown Guiltian - (no description) -1002152 - Blue Guiltian - (no description) -1002153 - Red Guiltian - (no description) -1002154 - Dark Guiltian - (no description) -1002155 - White Guiltian - (no description) -1002156 - Red Hunter - (no description) -1002157 - Blue Hunter - (no description) -1002158 - Green Hunter - (no description) -1002159 - Black Hunter - (no description) -1002160 - Brown Hunter - (no description) -1002161 - Red Hawkeye - (no description) -1002162 - Blue Hawkeye - (no description) -1002163 - Green Hawkeye - (no description) -1002164 - Brown Hawkeye - (no description) -1002165 - Dark Hawkeye - (no description) -1002166 - Red Distinction - (no description) -1002167 - Blue Distinction - (no description) -1002168 - Green Distinction - (no description) -1002169 - Brown Distinction - (no description) -1002170 - Dark Distinction - (no description) -1002171 - Red Guise - (no description) -1002172 - Blue Guise - (no description) -1002173 - Green Guise - (no description) -1002174 - Brown Guise - (no description) -1002175 - Dark Guise - (no description) -1002176 - Red Burgler - (no description) -1002177 - Blue Burgler - (no description) -1002178 - Green Burgler - (no description) -1002179 - Brown Burgler - (no description) -1002180 - Dark Burgler - (no description) -1002181 - Red Pilfer - (no description) -1002182 - Blue Pilfer - (no description) -1002183 - Green Pilfer - (no description) -1002184 - Brown Pilfer - (no description) -1002185 - Dark Pilfer - (no description) -1002186 - Transparent Hat - If you want to use the abilities available through hats, yet still want to show off your hairstyle, use this. -1002187 - Blue Cowboy Hat - (no description) -1002188 - Red Cowboy Hat - (no description) -1002189 - Dark Cowboy Hat - (no description) -1002190 - Blue Pre-School Hat - (no description) -1002191 - Red Pre-School Hat - (no description) -1002192 - The Chinese Undead's Hat (Blue) - (no description) -1002193 - The Chinese Undead's Hat (Maroon) - (no description) -1002194 - Rosy Swimming Cap - (no description) -1002195 - Flowery Swimming Cap - (no description) -1002196 - Blue Baseball Helmet - (no description) -1002197 - Red Baseball Helmet - (no description) -1002198 - Indigo Baseball Helmet - (no description) -1002199 - Black Baseball Helmet - (no description) -1002200 - Green Visor - (no description) -1002201 - Sky Blue Visor - (no description) -1002202 - Orange Visor - (no description) -1002203 - Yellow Rain Cap - (no description) -1002204 - Red Rain Cap - (no description) -1002205 - Sky Blue Rain Cap - (no description) -1002206 - Green Rain Cap - (no description) -1002207 - Red Sonata - (no description) -1002208 - Blue Sonata - (no description) -1002209 - Green Sonata - (no description) -1002210 - Brown Sonata - (no description) -1002211 - Blue Maro - (no description) -1002212 - Red Maro - (no description) -1002213 - Green Maro - (no description) -1002214 - Black Maro - (no description) -1002215 - Flame Golden Circlet - (no description) -1002216 - Aqua Golden Circlet - (no description) -1002217 - Orange Golden Circlet - (no description) -1002218 - Dark Golden Circlet - (no description) -1002219 - Zorro Hat - (no description) -1002220 - Black Slanted Visor - (no description) -1002221 - Purple Slanted Visor - (no description) -1002222 - Red Upside-Down Visor - (no description) -1002223 - Blue Upside-Down Visor - (no description) -1002224 - Tiger Mask - (no description) -1002225 - Santa Hat - (no description) -1002226 - Fashionable Hat - (no description) -1002227 - Blue Fisherman Hat - (no description) -1002228 - Cabbie - (no description) -1002229 - Goggled Red Cap - (no description) -1002230 - Goggled Black Cap - (no description) -1002231 - Goggled Blue Cap - (no description) -1002232 - Starry Red Beanie - (no description) -1002233 - Starry Pink Beanie - (no description) -1002234 - Starry Sky Blue Beanie - (no description) -1002235 - Sky Blue Goggled Beanie - (no description) -1002236 - Khaki Goggled Beanie - (no description) -1002237 - Blue Cap - (no description) -1002238 - Construction Hardhat - (no description) -1002239 - The Legendary Gold Poop Hat - While the character chats, the quote bubble is in gold. If combined with the Golden Fly Ring, the fly effect takes place. -1002240 - Hajimaki - (no description) -1002241 - Techwin Wig - (no description) -1002242 - Red Seraphis - (no description) -1002243 - Blue Seraphis - (no description) -1002244 - Green Seraphis - (no description) -1002245 - White Seraphis - (no description) -1002246 - Dark Seraphis - (no description) -1002247 - Bronze Identity - (no description) -1002248 - Silver Identity - (no description) -1002249 - Dark Identity - (no description) -1002250 - Headphone Bandana - (no description) -1002251 - The Graduation Hat - (no description) -1002252 - Red Infinium Circlet - (no description) -1002253 - Blue Infinium Circlet - (no description) -1002254 - Dark Infinium Circlet - (no description) -1002255 - Circus Cowboy Hat - (no description) -1002256 - Orange Mushroom Hat - (no description) -1002257 - Blue Mushroom Hat - (no description) -1002258 - Blue Diamondy Bandana - (no description) -1002259 - Black Top Hat - (no description) -1002260 - Yellow Trucker Hat - (no description) -1002261 - Blue Trucker Hat - (no description) -1002262 - Red Trucker Hat - (no description) -1002263 - Green Trucker Hat - (no description) -1002264 - Hardhat - (no description) -1002265 - Elf's Ear - (no description) -1002266 - Basic Earmuff - (no description) -1002267 - Red Polyfeather Hat - (no description) -1002268 - Brown Polyfeather Hat - (no description) -1002269 - White Polyfeather Hat - (no description) -1002270 - Black Polyfeather Hat - (no description) -1002271 - Green Galaxy - (no description) -1002272 - Blue Galaxy - (no description) -1002273 - Purple Galaxy - (no description) -1002274 - Dark Galaxy - (no description) -1002275 - Blue Falcon - (no description) -1002276 - Red Falcon - (no description) -1002277 - Green Falcon - (no description) -1002278 - Dark Falcon - (no description) -1002279 - Bunny Hat - (no description) -1002280 - Ducky Hat - (no description) -1002281 - Brown Nightfox - (no description) -1002282 - Blue Nightfox - (no description) -1002283 - Purple Nightfox - (no description) -1002284 - White Nightfox - (no description) -1002285 - Blood Nightfox - (no description) -1002286 - Blue Patriot - (no description) -1002287 - Beige Patriot - (no description) -1002288 - Green Patriot - (no description) -1002289 - Dark Patriot - (no description) -1002290 - Camouflaged Helmet - (no description) -1002291 - Starred Hunting Hat - (no description) -1002292 - Pink Frill Pajama Hat - (no description) -1002293 - Blue Pajama Hat - (no description) -1002294 - Red Frill Pajama Hat - (no description) -1002295 - Chef's Hat - (no description) -1002296 - Slime Hat - (no description) -1002297 - Brown Bucket Hat - (no description) -1002298 - Blue Bucket Hat - (no description) -1002299 - Cubic Newsie Hat - (no description) -1002300 - Green Picnic Hat - (no description) -1002301 - Yellow Picnic Hat - (no description) -1002302 - Pink Picnic Hat - (no description) -1002303 - Blue Picnic Hat - (no description) -1002304 - Silver-Chain Hat - (no description) -1002305 - Blue Headband - (no description) -1002306 - Brown Headband - (no description) -1002307 - Blue B-Ball Headband - (no description) -1002308 - Orange B-Ball Headband - (no description) -1002309 - Watermelon Hat - (no description) -1002310 - Flower Crown - (no description) -1002311 - Traveler's Hat - (no description) -1002312 - Evil Watermelon Hat - (no description) -1002313 - Palm Tree Hat - (no description) -1002314 - Zombie Mushroom Hat - (no description) -1002315 - Red Straw Hat - (no description) -1002316 - Blue Straw Hat - (no description) -1002317 - Grey Headband - (no description) -1002318 - Red Headband - (no description) -1002319 - Whale Hat - (no description) -1002320 - Fuji Hat - (no description) -1002321 - Crow Hat - (no description) -1002322 - Lobster Hat - (no description) -1002323 - Green Osfa Hat - (no description) -1002324 - Brown Osfa Hat - (no description) -1002325 - Purple Osfa Hat - (no description) -1002326 - Red Osfa Hat - (no description) -1002327 - Brown Pireta Hat - (no description) -1002328 - Green Pireta Hat - (no description) -1002329 - Red Pireta Hat - (no description) -1002330 - Dark Pireta Hat - (no description) -1002331 - Wind Goblin - (no description) -1002332 - Cloud Goblin - (no description) -1002333 - Angel's Halo - (no description) -1002334 - Raccoon Hat - (no description) -1002335 - Triangular Hat - (no description) -1002336 - Noble Moca - (no description) -1002337 - Laurel Crown - (no description) -1002338 - Red Dragon Babuta - (no description) -1002339 - Blue Dragon Babuta - (no description) -1002340 - Dark Dragon Babuta - (no description) -1002341 - Starry Olive Beanie - (no description) -1002342 - Olive Beanie - (no description) -1002343 - White Beanie - (no description) -1002344 - Woodsman Hat - (no description) -1002345 - Party Hat - (no description) -1002346 - Blue Corporal Hat - (no description) -1002347 - Brown Corporal Hat - (no description) -1002348 - Bamboo Hat - (no description) -1002349 - Black Cowboy Hat - (no description) -1002350 - Red Cowboy Hat - (no description) -1002351 - Yellow Cowboy Hat - (no description) -1002352 - Red Knitted Hat - (no description) -1002353 - Purple Knitted Hat - (no description) -1002354 - Yellow Knitted Hat - (no description) -1002355 - Blue Kitty Beanie - (no description) -1002356 - Yellow Kitty Beanie - (no description) -1002357 - Zakum Helmet - (no description) -1002358 - Green Knitted Gumball - (no description) -1002359 - Blue Knitted Gumball - (no description) -1002360 - Pink Knitted Gumball - (no description) -1002361 - Red Festive Gumball - (no description) -1002362 - White Festive Gumball - (no description) -1002363 - Green Oriental Fury Hat - (no description) -1002364 - Blue Oriental Fury Hat - (no description) -1002365 - Red Oriental Fury Hat - (no description) -1002366 - Black Oriental Fury Hat - (no description) -1002367 - Angel Halo - (no description) -1002368 - Reindeer Hat - (no description) -1002369 - Tentacle Hairband - (no description) -1002370 - Black-Striped Indian Hat - (no description) -1002371 - Red-Dotted Indian Hat - (no description) -1002372 - Indian Hat w/ Hearts - (no description) -1002373 - Cloth Wrapper - (no description) -1002374 - Red Beret - (no description) -1002375 - Yellow Beret - (no description) -1002376 - Pink Beret - (no description) -1002377 - Green Valhalla Helmet - (no description) -1002378 - Blue Valhalla Helmet - (no description) -1002379 - Dark Valhalla Helmet - (no description) -1002380 - Green Canal Hood - (no description) -1002381 - Blue Canal Hood - (no description) -1002382 - Red Canal Hood - (no description) -1002383 - Dark Canal Hood - (no description) -1002384 - Casual Cowboy Hat - (no description) -1002385 - Red Eskimo Hat - (no description) -1002386 - Brown Eskimo Hat - (no description) -1002387 - Green Eskimo Hat - (no description) -1002388 - Peter Pan Hat - (no description) -1002389 - Devil Hat - (no description) -1002390 - Zakum Helmet (2) - (no description) -1002391 - Green Bandana - (no description) -1002392 - Brown Bandana - (no description) -1002393 - Pink Bandana - (no description) -1002394 - Grey Bandana - (no description) -1002395 - Purple Bandana - (no description) -1002396 - Hawaiian Flower - (no description) -1002397 - Sunflower Petal - (no description) -1002398 - Green Varr Hat - (no description) -1002399 - Blue Varr Hat - (no description) -1002400 - Red Varr Hat - (no description) -1002401 - Dark Varr Hat - (no description) -1002402 - Red Arlic Helmet - (no description) -1002403 - Blue Arlic Helmet - (no description) -1002404 - Green Arlic Helmet - (no description) -1002405 - Dark Arlic Helmet - (no description) -1002406 - Red Arnah Cap - (no description) -1002407 - Blue Arnah Cap - (no description) -1002408 - Green Arnah Cap - (no description) -1002409 - Tin Bucket - (no description) -1002410 - Pink Turban - (no description) -1002411 - Yellow Turban - (no description) -1002412 - Skyblue Turban - (no description) -1002413 - Octopus Hat - (no description) -1002414 - Orange Mushroom Hat - (no description) -1002415 - Zombie Mushroom Hat - (no description) -1002416 - Slime Hat - (no description) -1002417 - Drake Hat - (no description) -1002418 - Newspaper Hat - (no description) -1002419 - Mark of the Beta - (no description) -1002420 - Biker Bandana - (no description) -1002421 - Pink Knitted Beanie - (no description) -1002422 - Blue Knitted Beanie - (no description) -1002423 - Yellow Knitted Beanie - (no description) -1002424 - Red Sporty Cap - (no description) -1002425 - Blue Sporty Cap - (no description) -1002426 - Beige Goya Beret - (no description) -1002427 - Green Goya Beret - (no description) -1002428 - Beige Checkered Hat - (no description) -1002429 - Meshcap - (no description) -1002430 - Zakum Helmet (3) - (no description) -1002431 - Bull's Horn - (no description) -1002432 - Spring Hat - (no description) -1002433 - Summer Hat - (no description) -1002434 - Autumn Hat - (no description) -1002435 - Korean Flower Petal - (no description) -1002436 - Chief Stan Hat - (no description) -1002437 - Guan Yu Headpiece - (no description) -1002438 - Zhu-Ge-Liang Hat - (no description) -1002439 - Blue Jelly Cap - (no description) -1002440 - Pink Jelly Cap - (no description) -1002441 - Ribboned Pig Headband - (no description) -1002442 - Rainbow Afro Wig - (no description) -1002443 - Patissier Hat - (no description) -1002444 - Liu Bei Headpiece - (no description) -1002445 - Cao Cao Headpiece - (no description) -1002446 - Sun Quan Headpiece - (no description) -1002447 - Rolled Towel - (no description) -1002448 - Purple Bandana - (no description) -1002449 - Winged Cap - (no description) -1002450 - Conch Cap - (no description) -1002451 - Starfish - (no description) -1002452 - Black Starry Bandana - (no description) -1002453 - White Starry Bandana - (no description) -1002454 - Red Starry Bandana - (no description) -1002455 - Black Starry Bandana - (no description) -1002456 - Horoscope Hat (Aquarius) - (no description) -1002457 - Horoscope Hat (Pisces) - (no description) -1002458 - Horoscope Hat (Aries) - (no description) -1002459 - Horoscope Hat (Taurus) - (no description) -1002460 - Horoscope Hat (Gemini) - (no description) -1002461 - Horoscope Hat (Cancer) - (no description) -1002462 - Horoscope Hat (Leo) - (no description) -1002463 - Horoscope Hat (Virgo) - (no description) -1002464 - Horoscope Hat (Libra) - (no description) -1002465 - Horoscope Hat (Scorpius) - (no description) -1002466 - Horoscope Hat (Sagittarius) - (no description) -1002467 - Horoscope Hat (Capricornos) - (no description) -1002468 - Golden Bulldog Hat - (no description) -1002469 - Jester Hat - (no description) -1002470 - Welding Mask - (no description) -1002471 - Shapka for Hunters - (no description) -1002476 - Rough Hat - (no description) -1002477 - Slime Hair Pin - (no description) -1002478 - Mushroom Hair Pin - (no description) -1002479 - Snowman Mask - (no description) -1002480 - White Wig Hat - (no description) -1002481 - Black Snowboard Helmet - (no description) -1002482 - Red Snowboard Helmet - (no description) -1002483 - Goblin Cap - (no description) -1002484 - Polar Bear Hat - (no description) -1002485 - Grey Visor Beanie - (no description) -1002486 - Green Visor Beanie - (no description) -1002487 - Rainbow Visor Beanie - (no description) -1002488 - Military Fur Hat - (no description) -1002489 - Football Helmet(Home) - (no description) -1002490 - Football Helmet(Away) - (no description) -1002491 - Musashi Hat - (no description) -1002492 - White Baseball Cap - (no description) -1002493 - Teddy Bear Headgear - (no description) -1002495 - Angora Hat - (no description) -1002496 - Black Skull Bandana - (no description) -1002497 - Hunting Cap - (no description) -1002498 - Bald Wig - (no description) -1002499 - White Tiger Hat - (no description) -1002500 - Korean Flag Bandana - (no description) -1002501 - Reggae Hat - (no description) -1002502 - Vintage Denim Hat - (no description) -1002503 - Vintage Pink Hat - (no description) -1002504 - Old Fisherman Hat - (no description) -1002505 - Sergeant Hat - (no description) -1002506 - Flower Crown - (no description) -1002507 - Soccer Ball Hat - (no description) -1002508 - Maple Hat - (no description) -1002509 - Maple Hat - (no description) -1002510 - Maple Hat - (no description) -1002511 - Maple Hat - (no description) -1002512 - Red Spirit Bandana - (no description) -1002513 - Maple Party Hat - (no description) -1002515 - Maple Bandana White - (no description) -1002516 - Maple Bandana Yellow - (no description) -1002517 - Maple Bandana Red - (no description) -1002518 - Maple Bandana Blue - (no description) -1002519 - White Felt Hat - (no description) -1002520 - Red Rose - (no description) -1002521 - White Hairband - (no description) -1002522 - Pink-Dotted Hairband - (no description) -1002523 - Paper Boat Hat - (no description) -1002524 - Coke Hat - (no description) -1002525 - Mummy Hat - (no description) -1002526 - Skull Hat - (no description) -1002527 - Independence Day Hat - (no description) -1002528 - Green Grace Helmet - (no description) -1002529 - Blue Grace Helmet - (no description) -1002530 - Red Grace Helmet - (no description) -1002531 - Silver Grace Helmet - (no description) -1002532 - Dark Grace Helmet - (no description) -1002534 - White Puppy Hat - (no description) -1002536 - Brown Paperbag Mask - (no description) -1002542 - Acorn Headgear - (no description) -1002543 - Acorn Helmet - (no description) -1002544 - Pumpkin Headgear - (no description) -1002545 - Yellow Slime Hat - (no description) -1002547 - Red Hunter - (no description) -1002548 - White Rabbit Hat - (no description) -1002549 - Black Cat Hat - (no description) -1002550 - Black Garina Hood - (no description) -1002551 - Blue Dragon Helmet - (no description) -1002552 - Moon Bunny Headgear - (no description) -1002553 - Genesis Bandana - (no description) -1002554 - Muey Thai String - (no description) -1002555 - Demon Goblin - (no description) -1002556 - Maple-Stein - (no description) -1002557 - Jr. Lioner Hat - (no description) -1002558 - Werebeast - (no description) -1002559 - Nordic Knitted Beanie - (no description) -1002560 - Striped Knitted Beanie - (no description) -1002562 - Training Headgear for Beginners - (no description) -1002565 - Fur Hat - (no description) -1002566 - Skull Beanie - (no description) -1002567 - Elf Hat - (no description) -1002568 - Tweed Headband - (no description) -1002569 - Candlelight hat - (no description) -1002571 - Lord Pirate's Hat - (no description) -1002572 - Lord Pirate's Hat - (no description) -1002573 - Lord Pirate's Hat - (no description) -1002574 - Lord Pirate's Hat - (no description) -1002575 - Angel Headband - (no description) -1002576 - Fallen Angel Headband - (no description) -1002577 - Pickpocket Pilfer - (no description) -1002578 - Herculean Helmet - (no description) -1002579 - LeFay Jester - (no description) -1002580 - Lockewood Hat - (no description) -1002584 - Red Old Wisconsin - (no description) -1002585 - Blue Old Wisconsin - (no description) -1002586 - Purple Old Wisconsin - (no description) -1002587 - Black Old Wisconsin - (no description) -1002590 - Star baseball cap - (no description) -1002591 - Leatty Hat - (no description) -1002592 - Sun Wu Kong hat - (no description) -1002593 - Smiley Headgear - (no description) -1002594 - Goggled Smiley Headgear - (no description) -1002596 - Bulldog Cap - (no description) -1002597 - Husky Hat - (no description) -1002598 - Rabbit Ear - (no description) -1002599 - Golden Trench Helmet - (no description) -1002600 - Red Maple Bandana - (no description) -1002601 - Yellow Maple Bandana - (no description) -1002602 - Blue Maple Bandana - (no description) -1002603 - White Maple Bandana - (no description) -1002607 - Zhu Ba Jie Hat - (no description) -1002608 - Superstar Cap - (no description) -1002610 - Brown Rocky Bandana - (no description) -1002613 - Brown Lagger Cap - (no description) -1002616 - Brown Double Marine - (no description) -1002619 - Brown Pitz Bandana - (no description) -1002622 - White Oceania Cap - (no description) -1002625 - Blue Den Marine - (no description) -1002628 - Red Misty - (no description) -1002631 - Brown Leather Ocean Hat - (no description) -1002634 - Purple Cast Linen - (no description) -1002637 - Black Pirate's Bandana - (no description) -1002640 - Blue Sun Boat Hat - (no description) -1002643 - Red Brave Hamal - (no description) -1002646 - Black Polax Hat - (no description) -1002649 - Canopus Hat - (no description) -1002650 - Vintage Grey Cap - (no description) -1002653 - Stack of Books - (no description) -1002655 - Versal Maro - (no description) -1002656 - White Identity - (no description) -1002657 - Spectre Helm - (no description) -1002658 - Valor Helmet - (no description) -1002660 - Orange Cap w/ Shades - (no description) -1002661 - Bird Nest - (no description) -1002662 - Flower decoration celebrating wedding anniversary - (no description) -1002663 - Cork hat - (no description) -1002666 - White basic cap - (no description) -1002667 - Star Hair Pin - (no description) -1002672 - Helm of the Golden Monk - (no description) -1002674 - Helm of the Bronze Monk - (no description) -1002675 - Antellion Miter - A restored headpiece of the Antellion Guard; extends the wearer's lifeforce and magical power. -1002676 - Infinity Circlet - An ancient, revered symbol of insight. Awarded to those who achieved perfect union of mind, body and soul. -1002677 - Toymaker Cap - (no description) -1002678 - Old Hockey Mask - (no description) -1002679 - Eye Poppers - (no description) -1002691 - Centaurus Horns - (no description) -1002692 - Centaurus Horns (Ghost) - (no description) -1002693 - Centaurus Horns (Green) - (no description) -1002694 - Centaurus Horns (Light) - (no description) -1002695 - Soul Teddy Hat - (no description) -1002696 - Stoplight Hat - (no description) -1002697 - Devilfish Headgear - (no description) -1002698 - Vintage Khaki Cap - (no description) -1002699 - Halloween Pumpkin Hat - (no description) -1002700 - Luscious Eyes Green - (no description) -1002701 - Extravagant Lips Green - (no description) -1002703 - Luscious Eyes - Blue Skin - (no description) -1002704 - Luscious Eyes - Normal - (no description) -1002705 - Extravagant Lips - Blue Skin - (no description) -1002706 - Extravagant Lips - Normal - (no description) -1002707 - Hat of a Masked Man - (no description) -1002708 - Red Vintage Bandana - (no description) -1002709 - Snowy Knitted Hat - (no description) -1002710 - Pink Kitty Hat - (no description) -1002711 - White Kitty Ears - (no description) -1002712 - Black Kitty Ears - (no description) -1002713 - Black Bubble Beanie - (no description) -1002714 - Christmas Tree Hat - (no description) -1002715 - Military Beanie - (no description) -1002716 - Versalmas Hat - (no description) -1002717 - Maplemas Hat - (no description) -1002721 - Raccoon Earmuffs - (no description) -1002722 - Teddy Earmuffs - (no description) -1002723 - Rice Cake Hat - (no description) -1002724 - Cat Hat - (no description) -1002725 - Pierced Apple - (no description) -1002726 - Umbrella Hat - (no description) -1002727 - Huge Pink Ribbon - (no description) -1002728 - Rudolph's Horn - (no description) -1002734 - Chinese Lion Headgear - The famous headgear worn with the lion costume for the lion dance to celebrate Lunar New Year. -1002735 - Glowy Smile Cap - (no description) -1002736 - Glowy Patterned Cap - (no description) -1002737 - White Mouse Headband - (no description) -1002738 - Bunny Earmuffs - (no description) -1002739 - Bosshunter Helm - (no description) -1002740 - Bosshunter Faceguard - (no description) -1002741 - Yellow Baby Dragon Hat - (no description) -1002742 - Baby Turkey Hat - (no description) -1002747 - Superstar Headphones - (no description) -1002748 - Apple-Green Hood - (no description) -1002749 - Bosshunter Helm - (no description) -1002750 - Bosshunter Faceguard - (no description) -1002752 - Celestial Crown - (no description) -1002753 - Stylish Pink Cotton Cap - (no description) -1002755 - Hero's Beret - (no description) -1002756 - Hero's Casket - (no description) -1002757 - football steel helmet - (no description) -1002758 - Maple Hat (level 4) - (no description) -1002759 - Maple Hood Hat - (no description) -1002760 - Globe Cap - (no description) -1002762 - Transform to Kanderun - (no description) -1002763 - Transform to Pergen - (no description) -1002764 - Transform to Helena - (no description) -1002765 - Transform to Dark Lord - (no description) -1002766 - Transform to Euryth - (no description) -1002770 - Cone Ears - (no description) -1002771 - Tiger Cub Hat - (no description) -1002774 - Victory Hairpin - (no description) -1002801 - Raven Ninja Bandana - (no description) -1002673 - Helm of the Silver Monk - (no description) -1002472 - Cabbage Patch Hat - (no description) -1002654 - Orange Mushroom Hat - (no description) -1002823 - Scarface Mask - A well-worn mask that's perfect for scaring friends! -1002824 - Noob Hat - From the early days of Maple Island! Relive the past with this authentic Noob hat! -1002812 - Moon Bloom Hair Pin - (no description) -1002605 - Jet Black Head Scarf - (no description) -1002837 - Tengu Mask - A mask inspired by the nefarious Black Crow. -1002788 - Necomimi - (no description) -1002856 - Miner's Hat - (no description) -1002857 - Hard Hat - (no description) -1002820 - Inferno Horns - (no description) -1002804 - Brown Felt Hat - (no description) -1002582 - Maximus Galea - (no description) -1002796 - Puffy Ram Hat - The secret word to make the ram fly is #cflyhigh#. -1002850 - Rudolph Change Hat - (no description) -1002803 - Mrs. Octopus - (no description) -1002863 - Bear Tassel Hat - (no description) -1002876 - Holly Hair Clip - A traditional festive holly clip accessory to decorate your hair! -1002822 - Bird Nest - (no description) -1002849 - Panda Hat - (no description) -1002880 - Versalmas Hat - (no description) -1002881 - Maplemas Hat - (no description) -1002887 - Pink Ribbon Hairband - (no description) -1002877 - Cow Mask - (no description) -1002840 - Hatched Bird Cap - (no description) -1002903 - Pink Bandana - Suitable for men and women alike! -1002858 - MV's Hat (STR) - (no description) -1002776 - Timeless Fennel - (no description) -1002777 - Timeless Coral - (no description) -1002778 - Timeless Rapido - (no description) -1002779 - Timeless Chive - (no description) -1002780 - Timeless Conrad Henkel - (no description) -1002784 - "A" Cap - (no description) -1002790 - Reverse Fennel - (no description) -1002791 - Reverse Coral - (no description) -1002792 - Reverse Rapido - (no description) -1002793 - Reverse Chive - (no description) -1002794 - Reverse Conrad Henkel - (no description) -1002797 - Agent N's Disposable Receiver - (no description) -1002798 - A Rice Cake on Top of My Head - (no description) -1002800 - Agent N's Receiver - (no description) -1002890 - Blue Ribbon Hairband - (no description) -1002891 - Green Ribbon Hairband - (no description) -1002940 - GMS ??? ??2 - (no description) -1002941 - Moon Bloom Hair Pin - (no description) -1002943 - Sailor Hat - (no description) -1002945 - Heart Hairband - (no description) -1002907 - Checkered Fedora - (no description) -1002913 - Miranda Ribbon - (no description) -1002942 - Green Mushroom Hat - (no description) -1002947 - Arcana Crown - A headpiece not of the Maple World, perhaps another dimension... -1002948 - Blitz Helm - A helmet crafted in the shadows. Gives the wearer additional speed. -1002949 - Power Mane - Strange hair imbued with the power of rage. From an unknown land. -1002950 - Pink Flower Headwrap - (no description) -1002951 - Yellow Flower Headwrap - (no description) -1002952 - Purple Flower Headwrap - (no description) -1002953 - Giant Fiesta Sombrero - (no description) -1002922 - Navy Hoodie Cap - (no description) -1002921 - Blue Mini Hat - (no description) -1002928 - Pink Star Beanie - (no description) -1002929 - Colorful Striped Beanie - (no description) -1002956 - Blue Mushroom Hat - (no description) -1002959 - Junior GM Cap - (no description) -1002773 - Gold Dragon Crown - (no description) -1002785 - Azure Sun Cap - Hat that #cChanges its color depending on a day of the week# -1002839 - Pumpkin Hat - (no description) -1002869 - Elegant Noblesse Hat - (no description) -1002878 - Snow Flake Hat - (no description) -1002978 - Cute Mouse Ears - (no description) -1002979 - Marbum Headgear - Put this on and you'll feel as if you're already riding down the boulevard on your bike! -1002961 - Gray Mask - (no description) -1002968 - Pancake Hat - (no description) -1002984 - Spiegelmann's Hat - (no description) -1002995 - Royal Navy Hat - (no description) -1002831 - Leo Hairpin - (no description) -1002920 - Pink Mini Hat - (no description) -1003001 - Chaos Metallic Helmet - (no description) -1002944 - Honey Bee Hat - (no description) -1003005 - Maple Racing Helmet - (no description) -1002999 - Fire Shadow Hair - (no description) -1002998 - Edwin Wig - (no description) -1002845 - Pink Bunny Cap - (no description) -1002870 - Moon Bunny Hat - (no description) -1002912 - Iljimae Mask - (no description) -1002919 - Courageous Little Lamb Hat - (no description) -1002923 - Treacherous Wolf Hat - (no description) -1002924 - Courageous Little Lamb Hat - (no description) -1002925 - Treacherous Wolf Hat - (no description) -1002930 - 6th Anniversary Hat - (no description) -1002955 - Brave Musashi Helmet - (no description) -1002970 - Moon Bunny Hat - (no description) -1002971 - Pink Bean Hat - (no description) -1002980 - Archeologist Hat - An archeologist hat received for participating in the Artifact Hunt. -1002981 - Archeologist Hat - An archeologist hat received for finishing Top 10 in the Artifact Hunt. -1003023 - Targar Hat(INT) - (no description) -1003024 - Targar Hat(LUK) - (no description) -1003025 - Scarlion Hat(DEX) - (no description) -1003026 - Scarlion Hat(STR) - (no description) -1003031 - Andras Hat - (no description) -1003032 - Marbas Hat - (no description) -1003033 - Valefor Hat - (no description) -1003034 - Amdusias Hat - (no description) -1003035 - Crocell Hat - (no description) -1003036 - Wild Eye's Gas Mask - (no description) -1003027 - Talking Witch Hat - A special hat that witches wear. -1003022 - Devil Horns - (no description) -1002847 - Frog Hat - (no description) -1002976 - Maid Headband - (no description) -1002844 - Chipmunk Ears - (no description) -1002937 - Felt Hat - (no description) -1002889 - Purple Ribbon Hairband - (no description) -1002954 - Aran Helmet - (no description) -1003014 - Scooter Helmet Red - (no description) -1003015 - Scooter Helmet Blue - (no description) -1002834 - Scorpius Hairpin - (no description) -1003009 - Rainbow Bead Hairband - (no description) -1002973 - Fox Mask - (no description) -1002990 - King Pepe Great Blue Helmet - (no description) -1002991 - King Pepe Dark Matty - (no description) -1002992 - King Pepe Red Polefeather Hat - (no description) -1002993 - King Pepe Dark Burglar - (no description) -1002994 - King Pepe Blue Denemarine - (no description) -1003006 - Kitty Camping Hat - (no description) -1003008 - Pharaoh Crown - (no description) -1002867 - Rudolph Antlers - Can be used for 15 days. -1002835 - Sagittarius Hair Clip - (no description) -1002836 - Capricorn Hair Clip - (no description) -1003044 - Clown Hat - (no description) -1003049 - Giant Bear Cap - (no description) -1002969 - Puppy Ears - (no description) -1001055 - Frilly Pink Cap - (no description) -1002974 - Jr. Lucida Hat - (no description) -1003013 - Red Loose-Fit Beanie - (no description) -1002962 - Flower Pin - (no description) -1002960 - Emperial Crown - (no description) -1003047 - Bear Hat - (no description) -1003039 - Time Traveler's Circlet - (no description) -1003038 - Dolfie Hat - (no description) -1003030 - Former Hero Male Face - (no description) -1003029 - Former Hero Female Face - (no description) -1003028 - Average Straw Hat - (no description) -1003016 - Wild Wolf Bandana - (no description) -1003043 - ??? ? - (no description) -1003050 - Bunny Ears - (no description) -1002754 - Orange Mushroom Scholar - (no description) -1002885 - Pink Bow - (no description) -1003052 - Tilted Fedora - (no description) -1002665 - Tomato Hat - (no description) -1003051 - Desert Fox - (no description) -1003057 - Mini Crown - (no description) -1003073 - Archeologist Hat - An archeologist hat received for participating in the Artifact Hunt. diff --git a/tools/MapleIdRetriever/handbook/Equip/Cape.txt b/tools/MapleIdRetriever/handbook/Equip/Cape.txt deleted file mode 100644 index 113117ce61..0000000000 --- a/tools/MapleIdRetriever/handbook/Equip/Cape.txt +++ /dev/null @@ -1,178 +0,0 @@ -1102206 - Blackfist Cloak - (no description) -1102207 - Goldensoul Cape - (no description) -1102000 - Green Napoleon - (no description) -1102001 - Blue Napoleon - (no description) -1102002 - Red Napoleon - (no description) -1102003 - White Napoleon - (no description) -1102004 - Black Napoleon - (no description) -1102005 - Baby Angel Wings - (no description) -1102006 - Devil Wings - (no description) -1102007 - Yellow Star Cape - (no description) -1102008 - Blue Star Cape - (no description) -1102009 - Red Star Cape - (no description) -1102010 - Black Star Cape - (no description) -1102011 - Blue Justice Cape - (no description) -1102012 - Red Justice Cape - (no description) -1102013 - White Justice Cape - (no description) -1102014 - Black Justice Cape - (no description) -1102015 - Blue Magic Cape - (no description) -1102016 - Red Magic Cape - (no description) -1102017 - White Magic Cape - (no description) -1102018 - Black Magic Cape - (no description) -1102019 - Korean-Flagged Cape - (no description) -1102020 - Turtle Shell - (no description) -1102021 - Blue Gaia Cape - (no description) -1102022 - Red Gaia Cape - (no description) -1102023 - White Gaia Cape - (no description) -1102024 - Black Gaia Cape - (no description) -1102025 - Red Hood - (no description) -1102026 - Green Seraph Cape - (no description) -1102027 - Blue Seraph Cape - (no description) -1102028 - Red Seraph Cape - (no description) -1102029 - White Seraph Cape - (no description) -1102030 - Black Seraph Cape - (no description) -1102031 - Green Giles Cape - (no description) -1102032 - Purple Giles Cape - (no description) -1102033 - Red Giles Cape - (no description) -1102034 - Blue Giles Cape - (no description) -1102035 - Black Giles Cape - (no description) -1102036 - Red Landcell Pack - (no description) -1102037 - Black Landcell Pack - (no description) -1102038 - Blue Landcell Pack - (no description) -1102039 - Transparent Cape - Use this Cape if you want to make your Cape transparent while still using all of the stats the Cape possesses. -1102040 - Yellow Adventurer Cape - A yellow cape for the prototypical adventurer. -1102041 - Pink Adventurer Cape - A pink cape for the prototypical adventurer. -1102042 - Purple Adventurer Cape - A purple cape for the prototypical adventurer. -1102043 - Brown Adventurer Cape - A brown cape for the prototypical adventurer. -1102044 - Red G-Wing Jetpack - (no description) -1102045 - Blue G-Wing Jetpack - (no description) -1102046 - Blue Musketeer Cape - (no description) -1102047 - Turquoise Musketeer Cape - (no description) -1102048 - Red Musketeer Cape - (no description) -1102049 - Blue Nymph Wing - (no description) -1102050 - Green Nymph Wing - (no description) -1102051 - Yellow Nymph Wing - (no description) -1102052 - Pink Nymph Wing - (no description) -1102053 - Old Raggedy Cape - (no description) -1102054 - Icarus Cape (1) - (no description) -1102055 - Icarus Cape (2) - (no description) -1102056 - Icarus Cape (3) - (no description) -1102057 - Ludibrium Cape - (no description) -1102058 - Gargoyle Wings - (no description) -1102059 - Michael Wings - (no description) -1102060 - Pink Ribbon - (no description) -1102061 - Oxygen Tank - (no description) -1102062 - Martial Cape - (no description) -1102063 - Fallen Angel Wings - (no description) -1102064 - Goblin Cape - (no description) -1102065 - Christmas Cape - (no description) -1102066 - Dracula Cloak - (no description) -1102067 - Tiger Tail - (no description) -1102068 - Harpie Cape - (no description) -1102069 - Pink Wings - (no description) -1102070 - Blue Book Bag - (no description) -1102072 - Yellow-Green Backpack - (no description) -1102073 - Hot Pink Backpack - (no description) -1102074 - Dragonfly Wings - (no description) -1102075 - Bat's Bane - (no description) -1102076 - Newspaper Cape - (no description) -1102077 - Cotton Blanket - (no description) -1102078 - Eclipse Cloak - (no description) -1102079 - Ragged Red Cape - (no description) -1102080 - Ragged Blue Cape - (no description) -1102081 - Ragged Yellow Cape - (no description) -1102082 - Ragged Black Cape - (no description) -1102083 - Ragged Red Cape - (no description) -1102084 - Pink Gaia Cape - (no description) -1102085 - Yellow Gaia Cape - (no description) -1102086 - Purple Gaia Cape - (no description) -1102087 - Green Gaia Cape - (no description) -1102091 - Summer Kite - (no description) -1102092 - Cuddle Bear - (no description) -1102093 - Heart Balloon - (no description) -1102094 - Sun Wu Kong Tail - (no description) -1102095 - Veamoth Wings - (no description) -1102096 - Sachiel Wings - (no description) -1102097 - Janus Wings - (no description) -1102098 - Coffin of Gloom - (no description) -1102099 - Amos' Royal Cape - (no description) -1102100 - Amos' Spirit Cape - (no description) -1102101 - The Legendary Elias Cape 1 - (no description) -1102102 - The Legendary Elias Cape 2 - (no description) -1102103 - The Legendary Elias Cape 3 - (no description) -1102104 - Cecelia Cloak 1 - (no description) -1102105 - Cecelia Cloak 2 - (no description) -1102106 - Cecelia Cloak 3 - (no description) -1102107 - Rocket Booster - (no description) -1102108 - Fallen Angel Tail - (no description) -1102109 - Cape of warmness - This is a magical cape made by Alcaster. When you put it on, you aren't affected by Elnas's chill. It doesn't look good as Magician made it. -1102110 - Chipmunk Tail - (no description) -1102111 - Elephant Balloon - (no description) -1102112 - Bunny Doll - (no description) -1102135 - Zenumist's cape - A cape that marks one a member of the Zenumists. -1102136 - Alcadno's Cape - This proves that you are a Beginner Magician from Alcadno. -1102137 - Orange Mushroom Balloon - (no description) -1102138 - Pink wing bag - (no description) -1102139 - Zenumist's Cape - The proud owner of this cape signifies the fact that the person's a high-leveled alchemist from Zenumist -1102140 - Alcadno's Cape - The proud owner of this cape signifies the fact that the person's a high-leveled alchemist from Alcadno. -1102141 - Pepe Balloon - (no description) -1102142 - The Flaming Cape - (no description) -1102145 - Sirius Cloak - A supremely powerful cloak which enhances the wearer's speed, strength and movement in battle. -1102146 - Zeta Cape - A mysterious cape based on the Grays' alien technology. Best worn by those with mental fortitude. -1102147 - Toymaker Cape - (no description) -1102148 - Tania Cloak - (no description) -1102149 - Mercury Cloak - (no description) -1102150 - Count Dracula Cape - (no description) -1102151 - Lost Kitty - (no description) -1102152 - Pirate Emblem Flag - (no description) -1102153 - Sunfire Wings - (no description) -1102154 - Zakum Arms - (no description) -1102155 - My Buddy Rex - (no description) -1102156 - Aerial Wave Cape - (no description) -1102157 - Puppet Strings - (no description) -1102158 - Peacock Feather Cape - (no description) -1102159 - White Monkey Balloon - (no description) -1102160 - Baby Lupin Cape - (no description) -1102164 - Maple MSX Guitar - (no description) -1102165 - Taru Spirit Cape - (no description) -1102166 - Maple Cape - (no description) -1102167 - Maple Cape - (no description) -1102168 - Maple Cape - (no description) -1102169 - Blue Wing Bag - (no description) -1102176 - Stirgeman Cape - (no description) -1102177 - Stirgeman Raggedy Cape - (no description) -1102178 - Stirgeman Cape Mk II - (no description) -1102179 - Stirgeman Cape Mk III - (no description) -1102180 - Stirgeman Cape Mk IV - (no description) -1102181 - Stirgeman's Cloak of Wiliness - (no description) -1102182 - Stirgeman's Cloak of Darkness - (no description) -1102143 - Waterworks Cape - (no description) -1102144 - Sage Cape - (no description) -1102183 - Stirgeman's Cloak of Justice - (no description) -1102191 - El Nathian Cape - (no description) -1102192 - Wrath of El Nath - (no description) -1102193 - Cloak of Corruption - (no description) -1102194 - Shroud of Zakum - (no description) -1102175 - Puffy Ram Wings - (no description) -1102185 - Rainbow Scarf - (no description) -1102186 - Kitty Parachute - (no description) -1102196 - Snowflake Scarf - (no description) -1102205 - Crimsonheart Cloak - (no description) -1102172 - Timeless Moonlight - (no description) -1102174 - Agent Cape - (no description) -1102203 - Super Rocket Booster - (no description) -1102184 - Aurora Happy Wing - (no description) -1102216 - Dogtail - (no description) -1102218 - Winged Costume - (no description) -1102222 - Seraphim Cape - (no description) -1102202 - Galactic Flame Cape - (no description) -1102212 - Lost Child - (no description) -1102210 - Honeybee's Sting - (no description) -1102215 - Balloon Bouquet - (no description) -1102211 - Aran Cape - (no description) -1102223 - Star Tail - (no description) -1102224 - Lamby Cape - (no description) -1102236 - Cupid's Wings Cape - Cupid Wings to help guide the wearer to finding love in the Maple World. -1102229 - Bear Cape - (no description) -1102226 - ?? ??? ?? - (no description) -1102227 - ?? ??? ?? - (no description) diff --git a/tools/MapleIdRetriever/handbook/Equip/Coat.txt b/tools/MapleIdRetriever/handbook/Equip/Coat.txt deleted file mode 100644 index 76cd609c4a..0000000000 --- a/tools/MapleIdRetriever/handbook/Equip/Coat.txt +++ /dev/null @@ -1,463 +0,0 @@ -1040000 - Yellow Jangoon Armor - (no description) -1040001 - Black Blazer - (no description) -1040002 - White Undershirt - (no description) -1040003 - Brown Hard Leather Top - (no description) -1040004 - Blue Training Shirt - (no description) -1040005 - Orange Baseball Jacket - (no description) -1040006 - Undershirt - (no description) -1040007 - Green Leather Hoodwear - (no description) -1040008 - Brown Archer Top - (no description) -1040009 - Steel Corporal - (no description) -1040010 - Grey T-Shirt - (no description) -1040011 - Silver Leather Hoodwear - (no description) -1040012 - Blue Sergeant - (no description) -1040013 - Blue One-lined T-Shirt - (no description) -1040014 - Orange Sporty T-Shirt - (no description) -1040015 - Brown Lolico Armor - (no description) -1040016 - Orihalcon Master Sergeant - (no description) -1040017 - Grey / Brown Training Shirt - (no description) -1040018 - Black Split Piece - (no description) -1040019 - Orange Split Piece - (no description) -1040020 - Blue Split Piece - (no description) -1040021 - Red Hwarang Shirt - (no description) -1040022 - Green Bennis Chainmail - (no description) -1040023 - Black Bennis Chainmail - (no description) -1040024 - Blue Bennis Chainmail - (no description) -1040025 - Red Bennis Chainmail - (no description) -1040026 - Green Hwarang Shirt - (no description) -1040027 - Old School Blazer - (no description) -1040028 - Blue Sky - (no description) -1040029 - Blue Dragon - (no description) -1040030 - Gold Dragon - (no description) -1040031 - Blue Cloth Vest - (no description) -1040032 - Red Cloth Vest - (no description) -1040033 - Black Cloth Vest - (no description) -1040034 - Dark Nightshift - (no description) -1040035 - Blue Nightshift - (no description) -1040036 - Blue-Striped Undershirt - (no description) -1040037 - Brown Corporal - (no description) -1040038 - Blue Lolico Armor - (no description) -1040039 - Red Sergeant - (no description) -1040040 - Silver Master Sergeant - (no description) -1040041 - Dark Master Sergeant - (no description) -1040042 - Blue Pao - (no description) -1040043 - Red Pao - (no description) -1040044 - Black Pao - (no description) -1040045 - Red Rider - (no description) -1040046 - Shine Rider - (no description) -1040047 - Dark Rider - (no description) -1040048 - Brown Sneak - (no description) -1040049 - Blue Sneak - (no description) -1040050 - Black Sneak - (no description) -1040051 - Blue Striped Trainer - (no description) -1040052 - Green Striped Trainer - (no description) -1040053 - Orange Striped Trainer - (no description) -1040054 - Green Disco Shirt - (no description) -1040055 - Orange Disco Shirt - (no description) -1040056 - Original Disco Shirt - (no description) -1040057 - Dark Brown Stealer - (no description) -1040058 - Dark Silver Stealer - (no description) -1040059 - Red Gold Stealer - (no description) -1040060 - Silver Black Stealer - (no description) -1040061 - Green Knucklevest - (no description) -1040062 - Red Knucklevest - (no description) -1040063 - Black Knucklevest - (no description) -1040064 - Wild Top - (no description) -1040065 - Brown Wild Top - (no description) -1040066 - Red Wild Top - (no description) -1040067 - Green Hunter's Armor - (no description) -1040068 - Dark Hunter's Armor - (no description) -1040069 - Red Hunter's Armor - (no description) -1040070 - Blue Hunter's Armor - (no description) -1040071 - Green Archer Top - (no description) -1040072 - Red Legolier - (no description) -1040073 - Blue Legolier - (no description) -1040074 - Green Legolier - (no description) -1040075 - Dark Legolier - (no description) -1040076 - Brown Legolier - (no description) -1040077 - Cowboy Top - (no description) -1040078 - Pre-School Uniform Top - (no description) -1040079 - Brown Piette - (no description) -1040080 - Dark Piette - (no description) -1040081 - White Piette - (no description) -1040082 - Khaki Shadow - (no description) -1040083 - Marine Shadow - (no description) -1040084 - Dark Shadow - (no description) -1040085 - Maroon Jangoon Armor - (no description) -1040086 - Blue Jangoon Armor - (no description) -1040087 - Blue Shouldermail - (no description) -1040088 - Oaker Shouldermail - (no description) -1040089 - Umber Shouldermail - (no description) -1040090 - Green Orientican - (no description) -1040091 - Red Orientican - (no description) -1040092 - Blue Orientican - (no description) -1040093 - Dark Orientican - (no description) -1040094 - Red China - (no description) -1040095 - Blue China - (no description) -1040096 - Brown China - (no description) -1040097 - Green China - (no description) -1040098 - Light Scorpio - (no description) -1040099 - Oaker Scorpio - (no description) -1040100 - Dark Scorpio - (no description) -1040101 - Skull T-Shirt - (no description) -1040102 - Bronze Platine - (no description) -1040103 - Mithril Platine - (no description) -1040104 - Orihalcon Platine - (no description) -1040105 - Brown Studded Top - (no description) -1040106 - Blue Studded Top - (no description) -1040107 - Dark Studded Top - (no description) -1040108 - Green Pirate Top - (no description) -1040109 - Red Pirate Top - (no description) -1040110 - Dark Pirate Top - (no description) -1040111 - Green Commodore - (no description) -1040112 - Blue Commodore - (no description) -1040113 - Dark Commodore - (no description) -1040114 - Hawaiian Shirt - (no description) -1040115 - Green Osfa Suit - (no description) -1040116 - Brown Osfa Suit - (no description) -1040117 - Purple Osfa Suit - (no description) -1040118 - Red Osfa Suit - (no description) -1040119 - Ragged Top - (no description) -1040120 - Green Neos - (no description) -1040121 - Blue Neos - (no description) -1040122 - Black Neos - (no description) -1040123 - Prep School Uniform - (no description) -1040124 - Crusader T-Shirt - (no description) -1040125 - Military Cargo Jacket - (no description) -1040126 - Yellow Frill Sleeveless - (no description) -1040127 - Blue Heart Tanktop - (no description) -1040128 - Blue Line Tanktop - (no description) -1040129 - Red Casual Suit - (no description) -1040130 - Green Tie Casual Suit - (no description) -1040131 - Pink Tie Casual Suit - (no description) -1040132 - Palm Tree Tanktop - (no description) -1040133 - Long Blue Shirt - (no description) -1040134 - Orange Puffy Jacket - (no description) -1040135 - Muscle Man T - (no description) -1040137 - Tania Tailored Jacket - (no description) -1040138 - Mercury Leather Jacket (M) - (no description) -1040140 - Pink Mimi Blouse - (no description) -1040141 - Blue Sailor Shirt - (no description) -1040143 - Pink Top [m] - (no description) -1040144 - Bulletproof Vest - (no description) -1041000 - Blue Frill Blouse - (no description) -1041001 - Blue Sailor Shirt - (no description) -1041002 - White Tubetop - (no description) -1041003 - Red Qi Pao - (no description) -1041004 - Pink Starry Shirt - (no description) -1041005 - Pink Mimi Blouse - (no description) -1041006 - Yellow T-Shirt - (no description) -1041007 - Green Avelin - (no description) -1041008 - Green Able Armor - (no description) -1041009 - Red Sailor Shirt - (no description) -1041010 - Green T-Shirt - (no description) -1041011 - Red-Striped Top - (no description) -1041012 - Red-Striped T-Shirt - (no description) -1041013 - Green Shivermail - (no description) -1041014 - Orange Lolica Armor - (no description) -1041015 - Black Armine - (no description) -1041016 - Green Armine - (no description) -1041017 - Purple Arianne - (no description) -1041018 - Green Arianne - (no description) -1041019 - Red Lamelle - (no description) -1041020 - Green Lamelle - (no description) -1041021 - Brown Lamelle - (no description) -1041022 - Blue Shark - (no description) -1041023 - Sky Shark - (no description) -1041024 - Red Shark - (no description) -1041025 - Pink Arianne - (no description) -1041026 - Yellow Arianne - (no description) -1041027 - Red Shivermail - (no description) -1041028 - Purple Shivermail - (no description) -1041029 - Black Split - (no description) -1041030 - Red Split - (no description) -1041031 - Purple Split - (no description) -1041032 - Green Bennis Chainmail - (no description) -1041033 - Red Bennis Chainmail - (no description) -1041034 - Blue Bennis Chainmail - (no description) -1041035 - Yellow Bennis Chainmail - (no description) -1041036 - Red Cloth Vest - (no description) -1041037 - Blue Cloth Vest - (no description) -1041038 - Black Cloth Vest - (no description) -1041039 - Pink Qi Pao - (no description) -1041040 - Blue Qi Pao - (no description) -1041041 - Purple Fairy Top - (no description) -1041042 - Green Fairy Top - (no description) -1041043 - Blue Fairy Top - (no description) -1041044 - Red Nightshift - (no description) -1041045 - Brown Nightshift - (no description) -1041046 - Pink Tanktop - (no description) -1041047 - Red Steal - (no description) -1041048 - Black Steal - (no description) -1041049 - Blue Steal - (no description) -1041050 - Purple Steal - (no description) -1041051 - Red Amoria Top - (no description) -1041052 - Blue Amoria Top - (no description) -1041053 - Black Amoria Top - (no description) -1041054 - Green Huntress Armor - (no description) -1041055 - Black Huntress Armor - (no description) -1041056 - Red Huntress Armor - (no description) -1041057 - Dark Sneak - (no description) -1041058 - Blood Sneak - (no description) -1041059 - Sky Sneak - (no description) -1041060 - Gold Sneak - (no description) -1041061 - Yellow Avelin - (no description) -1041062 - Yellow Able Armor - (no description) -1041063 - Grey Able Armor - (no description) -1041064 - Blueberry Lolica Armor - (no description) -1041065 - Red Legolia - (no description) -1041066 - Blue Legolia - (no description) -1041067 - Green Legolia - (no description) -1041068 - Dark Legolia - (no description) -1041069 - Brown Legolia - (no description) -1041070 - Sky Blue Mimi Blouse - (no description) -1041071 - Yellow Mimi Blouse - (no description) -1041072 - Cowboy Top - (no description) -1041073 - Pre-School Uniform Top - (no description) -1041074 - Purple Shadow - (no description) -1041075 - Red Shadow - (no description) -1041076 - Dark Shadow - (no description) -1041077 - Maroon Moon - (no description) -1041078 - Blue Moon - (no description) -1041079 - Brown Moon - (no description) -1041080 - Red Moon - (no description) -1041081 - White Piettra - (no description) -1041082 - Brown Piettra - (no description) -1041083 - Dark Piettra - (no description) -1041084 - Red Jangoon Armor - (no description) -1041085 - Brown Jangoon Armor - (no description) -1041086 - Black Jangoon Armor - (no description) -1041087 - Red Shouldermail - (no description) -1041088 - Ivory Shouldermail - (no description) -1041089 - Dark Shouldermail - (no description) -1041090 - Pink Top - (no description) -1041091 - Green Ice Queen - (no description) -1041092 - Red Ice Queen - (no description) -1041093 - Blue Ice Queen - (no description) -1041094 - Light Mantis - (no description) -1041095 - Bloody Mantis - (no description) -1041096 - Umber Mantis - (no description) -1041097 - Aqua Platina - (no description) -1041098 - Violet Platina - (no description) -1041099 - Bloody Platina - (no description) -1041100 - Purple Mystique - (no description) -1041101 - Blue Mystique - (no description) -1041102 - Pink Mystique - (no description) -1041103 - Red Mystique - (no description) -1041104 - Old School Uniform Top - (no description) -1041105 - Green Pirate Blouse - (no description) -1041106 - Red Pirate Blouse - (no description) -1041107 - Dark Pirate Blouse - (no description) -1041108 - SF Ninja Top - (no description) -1041109 - Red Trainer Jacket - (no description) -1041110 - Sky Blue Trainer Jacket - (no description) -1041111 - Pink Trainer Jacket - (no description) -1041112 - Black Trainer Jacket - (no description) -1041113 - Pink Frill Pajama Top - (no description) -1041114 - Hawaiian Shirt - (no description) -1041115 - Green Osfa Suit - (no description) -1041116 - Brown Osfa Suit - (no description) -1041117 - Purple Osfa Suit - (no description) -1041118 - Red Osfa Suit - (no description) -1041119 - Green Valkyrie - (no description) -1041120 - Purple Valkyrie - (no description) -1041121 - Dark Valkyrie - (no description) -1041122 - Green Lucida - (no description) -1041123 - Purple Lucida - (no description) -1041124 - Dark Lucida - (no description) -1041125 - Rainbow Knit - (no description) -1041126 - Transparent Top (F) - Use this Top equip if you want to make your Top equip transparent while still using all of the stats your Top equip possesses. -1041127 - Heart Sleeveless - (no description) -1041128 - Cross Sleeveless - (no description) -1041129 - Yellow Frill Camisole - (no description) -1041130 - Blue Frill Camisole - (no description) -1041131 - Pink Ribboned Janie - (no description) -1041132 - Pink Frill Camisole - (no description) -1041133 - Grey Cardigan - (no description) -1041134 - Angora Mustang - (no description) -1041135 - Tube-Top Jacket - (no description) -1041136 - Pink Vest Blouse - (no description) -1041137 - Pink-Dotted Top - (no description) -1041138 - Tania Bolero - (no description) -1041139 - Mercury Leather Jacket (F) - (no description) -1041142 - Ribbon Frilled top - (no description) -1041143 - Green tie Jacket - (no description) -1041146 - Old School Blazer [F] - (no description) -1042000 - Orange Hooded Vest - (no description) -1042001 - Black Hooded Vest - (no description) -1042002 - Red Hooded Vest - (no description) -1042003 - Wizet Plain Suit - (no description) -1042004 - Pink Hooded Vest - (no description) -1042005 - Pink Camping Shirt - (no description) -1042006 - Green Camping Shirt - (no description) -1042007 - Blue Camping Shirt - (no description) -1042008 - Wildcats Baseball Shirt (Basic) - (no description) -1042009 - Wildcats Baseball Shirt (Home) - (no description) -1042010 - Wildcats Baseball Shirt (Away) - (no description) -1042011 - Wildcats Baseball Shirt (Alternate) - (no description) -1042012 - Yellow Snowboard Top - (no description) -1042013 - Green Snowboard Top - (no description) -1042014 - Yellow Layered Combo - (no description) -1042015 - Blue Layered Combo - (no description) -1042016 - Pink Snowboard Top - (no description) -1042017 - Sky Blue Snowboard Top - (no description) -1042018 - Red T-Shirt w/ Heart - (no description) -1042019 - M Layered T-Shirt - (no description) -1042020 - Old Military Uniform - (no description) -1042021 - Starry Layered Combo - (no description) -1042022 - Camouflaged Uniform - (no description) -1042023 - Blue Polka-Dot Pajama Top - (no description) -1042024 - Red Polka-Dot Pajama Top - (no description) -1042025 - Prisoner Top - (no description) -1042026 - Flowery Dress Shirt - (no description) -1042027 - Blue B-Ball Jersey - (no description) -1042028 - Orange B-Ball Jersey - (no description) -1042029 - Octopus T-Shirt - (no description) -1042030 - Slime T-Shirt - (no description) -1042031 - O. Mushroom T-Shirt - (no description) -1042032 - Beetle Longsleeve - (no description) -1042033 - Beige Double-Coat - (no description) -1042034 - Green Double-Coat - (no description) -1042035 - Red Double-Coat - (no description) -1042036 - Christmas Padded Jacket - (no description) -1042037 - Snowman Padded Jacket - (no description) -1042038 - Red Sweater - (no description) -1042039 - Sky Blue Allstar - (no description) -1042040 - Pink Allstar - (no description) -1042041 - Black Allstar - (no description) -1042042 - White Hooded Vest - (no description) -1042043 - Green Striped Rugby Tee - (no description) -1042044 - Pink Striped Rugby Tee - (no description) -1042045 - Bowling Shirt - (no description) -1042046 - White Casual Suit - (no description) -1042047 - Star-Patterned Yellow Shirt - (no description) -1042048 - Star-Patterned Purple Shirt - (no description) -1042049 - Short Denim Jacket - (no description) -1042050 - Baseball Jumper - (no description) -1042051 - Bomber Jacket - (no description) -1042052 - Blue Down Parka - (no description) -1042053 - Blue Wool Jacket - (no description) -1042054 - Pink Wool Jacket - (no description) -1042055 - Pink Down Parka - (no description) -1042056 - Beat Shirt - (no description) -1042058 - Red Half - (no description) -1042059 - Sholl Trainer - (no description) -1042060 - Pola Sweater - (no description) -1042061 - Ball Zone Jumper - (no description) -1042062 - Stitched Leather Jacket - (no description) -1042063 - Red Turtleneck Sweater - (no description) -1042064 - Football Top(Home) - (no description) -1042065 - Football Top(Away) - (no description) -1042066 - Orange Hooded Shirt - (no description) -1042067 - Orange Hooded Zip-Up - (no description) -1042068 - Drill Muffler - (no description) -1042069 - Pink Big-Belt Shirt - (no description) -1042070 - Sky Blue Big-Belt Shirt - (no description) -1042071 - Pastel Layered Hooded Shirt - (no description) -1042072 - Red Layered Hooded Shirt - (no description) -1042073 - Navy Blue Dress Shirt - (no description) -1042074 - White Longsleeve with Star - (no description) -1042075 - Pink Pluto T - (no description) -1042076 - Dotted Disco Shirt - (no description) -1042077 - Rainbow T - (no description) -1042078 - White & Blue Sailor Top - (no description) -1042080 - Red Hot Racer T - (no description) -1042081 - Cherry Layered T - (no description) -1042082 - Black Cardigan Set - (no description) -1042083 - Rainbow Hooded Pancho - (no description) -1042084 - Army General Hoodie - (no description) -1042085 - Canary Heart T - (no description) -1042086 - Tourist T - (no description) -1042087 - Skull Shirt - (no description) -1042088 - Black Skull Hooded Vest - (no description) -1042089 - Blue Skull Hooded Vest - (no description) -1042090 - Red Skull Hooded Vest - (no description) -1042091 - Pink Skull Hooded Vest - (no description) -1042092 - Pelvis Hoodie - (no description) -1042093 - Pointed Double Coat - (no description) -1042094 - Orange Snowflake Sweater - (no description) -1042095 - Vintage Hooded Shirt - (no description) -1042096 - M Shirt - (no description) -1042097 - Print layered Hoody - (no description) -1042098 - Camo Hooded Jacket - (no description) -1042099 - Striped Hooded Shirt - (no description) -1042100 - Checkered Casual Suit - (no description) -1042101 - Blanc Rose Top - (no description) -1042102 - Aqua Road T - (no description) -1042103 - White Outlaw Shirt - (no description) -1042104 - Lime Green Sleeveless - (no description) -1042105 - Crown Hooded T - (no description) -1042106 - Rainbow-striped Hoodie - (no description) -1042107 - Pink Flower T-shirt - When equipped, the flower petals will float around while moving. -1042108 - Spangle sleeveless - (no description) -1042109 - Yellow & Red-Striped Jacket - (no description) -1042110 - Red Hooded Coat - (no description) -1042116 - Orange Pea Coat - (no description) -1042117 - Green Baseball Jacket - (no description) -1042118 - Red Checkered Shirt - (no description) -1042119 - Vintage Muffler Jacket - (no description) -1042120 - Celeste Blue Double Coat - (no description) -1042121 - Opera Pink Double Coat - (no description) -1042122 - Bowtie Jacket - (no description) -1042125 - Yellow Longsleeve w/ Bunny Bag - (no description) -1042126 - Red and Black Blazer - (no description) -1042127 - Green Suspenders - (no description) -1042128 - Apple-Green Sweater - (no description) -1042129 - "Black Tie Affair" Dress Shirt - (no description) -1042130 - Gold Chainz - (no description) -1042131 - Preppy Black Vest - (no description) -1042132 - Aqua Green Star - (no description) -1042133 - Striped Hoodie Shirt - (no description) -1042134 - Yellow Shirt w/ Pads - (no description) -1042135 - Dark Master Sergeant for Transformation - (no description) -1042136 - Red Legolesse for Transformation - (no description) -1042137 - Dark Night for Transformation - (no description) -1042138 - The White Tee - (no description) -1042141 - Pink Star Glow - (no description) -1042140 - Slick Agent Top - (no description) -1042145 - Layered Duckie T - (no description) -1042146 - Superstar Hoodie - (no description) -1042147 - Preppy Knit Vest - (no description) -1042142 - Rainbow Top - (no description) -1042143 - Disco Tank Top - (no description) -1042154 - Bohemian Hooded Jacket - (no description) -1042152 - Rainbow Knitted Top - (no description) -1042150 - Black "Hit Me" Shirt - (no description) -1042153 - Red Plaid Duffle Coat - (no description) -1042155 - Sky Rider Jacket - (no description) -1042151 - Brown Argyle Sweater - (no description) -1042149 - 80's Knit Pullover - (no description) -1049000 - Friendship Shirt - Can be purchased and given to another user as a gift. If two characters wearing this item are standing within a given range, the Friendship effect is generated. -1048000 - Couple Shirt - Can be purchased and given to another user as a gift. If two characters wearing this item are standing within a given range, the Couple effect is generated. -1042166 - Leather Biker Jacket - (no description) -1042160 - Navy Hoodie - (no description) -1042156 - Galaxy T-Shirt - (no description) -1042161 - Spring Jealousy - (no description) -1042163 - Pink Heart T-Shirt & Muffler - (no description) -1042164 - Green Tie & Shirt - (no description) -1042165 - Pink Bowtie & White Vest - (no description) -1042158 - Baseball Classic - (no description) -1042144 - Checkered Resort Shirt - (no description) -1042168 - Lightning T-Shirt - (no description) -1042157 - Lovely Pink T-Shirt - (no description) -1042162 - Blue-Striped Undershirt - (no description) -1042169 - Rainbow Tie-Dye Shirt - (no description) -1040145 - King Pepe Gold Dragon - (no description) -1040146 - King Pepe Dark Legolier - (no description) -1040147 - King Pepe Black Knuckle Vest - (no description) -1041148 - King Pepe Red Shark - (no description) -1041149 - King Pepe Brown Legolas - (no description) -1041150 - King Pepe Purple Steal - (no description) -1042167 - Simple Warrior Top - (no description) -1042170 - Cool Summer Shirt - (no description) -1042172 - Cute Baby Blue Shirt - (no description) -1042173 - Green Smart Tee - (no description) -1042174 - Camping Shirt - (no description) -1042182 - Denim Hoodie - (no description) -1042177 - Vintage Hoodie Jacket - (no description) -1042181 - Napoleon Jacket - (no description) -1042178 - ?? ???? - (no description) -1042180 - ??? ???? - (no description) -1042183 - Pink Argyle Plaid - (no description) -1042186 - Fur Vest - (no description) -1042187 - Pink Sweater - (no description) diff --git a/tools/MapleIdRetriever/handbook/Equip/Face.txt b/tools/MapleIdRetriever/handbook/Equip/Face.txt deleted file mode 100644 index d2ad5ee3c6..0000000000 --- a/tools/MapleIdRetriever/handbook/Equip/Face.txt +++ /dev/null @@ -1,540 +0,0 @@ -20000 - Male 1 (Black) - (no description) -20001 - Male 2 (Black) - (no description) -20002 - Leisure Look (Black) - (no description) -20003 - Male 4 (Black) - (no description) -20004 - Male 5 (Black) - (no description) -20005 - Male 6 (Black) - (no description) -20006 - Male 7 (Black) - (no description) -20007 - Male 8 (Black) - (no description) -20008 - Male 9 (Black) - (no description) -20009 - Male JP (Black) - (no description) -20010 - Male JP (Black) - (no description) -20011 - Male JP (Black) - (no description) -20012 - Male 10 (Black) - (no description) -20013 - Male JP (Black) - (no description) -20014 - Male 11 (Black) - (no description) -20016 - Male Face 12 - (no description) -20017 - Male Face 14 - (no description) -20018 - Male 12 (Black) - (no description) -20019 - Male 13 (Black) - (no description) -20020 - Fierce Edge (Black) - (no description) -20021 - Male Face JP - (no description) -20022 - Male Face 16 - (no description) -20023 - malefaceGL(Black) - (no description) -20024 - Awakening (Black) - (no description) -20100 - Male 1 (Blue) - (no description) -20101 - Male 2 (Blue) - (no description) -20102 - Leisure Look (Blue) - (no description) -20103 - Male 4 (Blue) - (no description) -20015 - Male 15 - (no description) -20115 - Male 15 - (no description) -20215 - Male 15 - (no description) -20315 - Male 15 - (no description) -20415 - Male 15 - (no description) -20515 - Male 15 - (no description) -20615 - Male 15 - (no description) -20715 - Male 15 - (no description) -20104 - Male 5 (Blue) - (no description) -20105 - Male 6 (Blue) - (no description) -20106 - Male 7 (Blue) - (no description) -20107 - Male 8 (Blue) - (no description) -20108 - Male 9 (Blue) - (no description) -20109 - Male JP (Blue) - (no description) -20110 - Male JP (Blue) - (no description) -20111 - Male JP (Blue) - (no description) -20112 - Male 10 (Blue) - (no description) -20113 - Male JP (Blue) - (no description) -20114 - Male 11 (Blue) - (no description) -20116 - Male Face 12 - (no description) -20117 - Male Face 14 - (no description) -20118 - Male 12 (Blue) - (no description) -20119 - Male 13 (Blue) - (no description) -20120 - Fierce Edge (Blue) - (no description) -20121 - Male Face JP - (no description) -20122 - Male Face 16(Blue Eyes) - (no description) -20123 - malefaceGL(Blue) - (no description) -20124 - Awakening (Blue) - (no description) -20200 - Male 1 (Red) - (no description) -20201 - Male 2 (Red) - (no description) -20202 - Leisure Look (Red) - (no description) -20203 - Male 4 (Red) - (no description) -20204 - Male 5 (Red) - (no description) -20205 - Male 6 (Red) - (no description) -20206 - Male 7 (Red) - (no description) -20207 - Male 8 (Red) - (no description) -20208 - Male 9 (Red) - (no description) -20209 - Male JP (Red) - (no description) -20210 - Male JP (Red) - (no description) -20211 - Male JP (Red) - (no description) -20212 - Male 10 (Red) - (no description) -20213 - Male JP (Red) - (no description) -20214 - Male 11 (Red) - (no description) -20216 - Male Face 12 - (no description) -20217 - Male Face 14 - (no description) -20218 - Male 12 (Red) - (no description) -20219 - Male 13 (Red) - (no description) -20220 - Fierce Edge (Red) - (no description) -20221 - Male Face JP - (no description) -20222 - Male Face 16(Red Eyes) - (no description) -20223 - malefaceGL(Red) - (no description) -20224 - Awakening (Red) - (no description) -20300 - Male 1 (Green) - (no description) -20301 - Male 2 (Green) - (no description) -20302 - Leisure Look (Green) - (no description) -20303 - Male 4 (Green) - (no description) -20304 - Male 5 (Green) - (no description) -20305 - Male 6 (Green) - (no description) -20306 - Male 7 (Green) - (no description) -20307 - Male 8 (Green) - (no description) -20308 - Male 9 (Green) - (no description) -20309 - Male JP (Green) - (no description) -20310 - Male JP (Green) - (no description) -20311 - Male JP (Green) - (no description) -20312 - Male 10 (Green) - (no description) -20313 - Male JP (Green) - (no description) -20314 - Male 11 (Green) - (no description) -20316 - Male Face 12 - (no description) -20317 - Male Face 14 - (no description) -20318 - Male 12 (Green) - (no description) -20319 - Male 13 (Green) - (no description) -20320 - Fierce Edge (Green) - (no description) -20321 - Male Face JP - (no description) -20322 - Male Face 16(Green Eyes) - (no description) -20323 - malefaceGL(Green) - (no description) -20324 - Awakening (Green) - (no description) -20400 - Male 1 (Hazel) - (no description) -20401 - Male 2 (Hazel) - (no description) -20402 - Leisure Look (Hazel) - (no description) -20403 - Male 4 (Hazel) - (no description) -20404 - Male 5 (Hazel) - (no description) -20405 - Male 6 (Hazel) - (no description) -20406 - Male 7 (Hazel) - (no description) -20407 - Male 8 (Hazel) - (no description) -20408 - Male 9 (Hazel) - (no description) -20409 - Male JP (Hazel) - (no description) -20410 - Male JP (Hazel) - (no description) -20411 - Male JP (Hazel) - (no description) -20412 - Male 10 (Hazel) - (no description) -20413 - Male JP (Hazel) - (no description) -20414 - Male 11 (Hazel) - (no description) -20416 - Male Face 12 - (no description) -20417 - Male Face 14 - (no description) -20418 - Male 12 (Hazel) - (no description) -20419 - Male 13 (Hazel) - (no description) -20420 - Fierce Edge (Hazel) - (no description) -20421 - Male Face JP - (no description) -20422 - Male Face 16(Brown Eyes) - (no description) -20423 - malefaceGL(Hazel) - (no description) -20424 - Awakening (Hazel) - (no description) -20500 - Male 1 (Sapphire) - (no description) -20501 - Male 2 (Sapphire) - (no description) -20502 - Leisure Look (Sapphire) - (no description) -20503 - Male 4 (Sapphire) - (no description) -20504 - Male 5 (Sapphire) - (no description) -20505 - Male 6 (Sapphire) - (no description) -20506 - Male 7 (Sapphire) - (no description) -20507 - Male 8 (Sapphire) - (no description) -20508 - Male 9 (Sapphire) - (no description) -20509 - Male JP (Sapphire) - (no description) -20510 - Male JP (Sapphire) - (no description) -20511 - Male JP (Sapphire) - (no description) -20512 - Male 10 (Sapphire) - (no description) -20513 - Male JP (Sapphire) - (no description) -20514 - Male 11 (Sapphire) - (no description) -20516 - Male Face 12 - (no description) -20517 - Male Face 14 - (no description) -20518 - Male 12 (Sapphire) - (no description) -20519 - Male 13 (Sapphire) - (no description) -20520 - Fierce Edge (Sapphire) - (no description) -20521 - Male Face JP - (no description) -20522 - Male Face 16(Sapphire Eyes) - (no description) -20523 - malefaceGL(Sapphire) - (no description) -20524 - Awakening (Sapphire) - (no description) -20600 - Male 1 (Violet) - (no description) -20601 - Male 2 (Violet) - (no description) -20602 - Leisure Look (Violet) - (no description) -20603 - Male 4 (Violet) - (no description) -20604 - Male 5 (Violet) - (no description) -20605 - Male 6 (Violet) - (no description) -20606 - Male 7 (Violet) - (no description) -20607 - Male 8 (Violet) - (no description) -20608 - Male 9 (Violet) - (no description) -20609 - Male JP (Violet) - (no description) -20610 - Male JP (Violet) - (no description) -20611 - Male JP (Violet) - (no description) -20612 - Male 10 (Violet) - (no description) -20613 - Male JP (Violet) - (no description) -20614 - Male 11 (Violet) - (no description) -20616 - Male Face 12 - (no description) -20617 - Male Face 14 - (no description) -20618 - Male 12 (Violet) - (no description) -20619 - Male 13 (Violet) - (no description) -20620 - Fierce Edge (Violet) - (no description) -20621 - Male Face JP - (no description) -20622 - Male Face 16(Violet Eyes) - (no description) -20623 - malefaceGL(Violet) - (no description) -20624 - Awakening (Violet) - (no description) -20700 - Male 1 (Amethyst) - (no description) -20701 - Male 2 (Amethyst) - (no description) -20702 - Leisure Look (Amethyst) - (no description) -20703 - Male 4 (Amethyst) - (no description) -20704 - Male 5 (Amethyst) - (no description) -20705 - Male 6 (Amethyst) - (no description) -20706 - Male 7 (Amethyst) - (no description) -20707 - Male 8 (Amethyst) - (no description) -20708 - Male 9 (Amethyst) - (no description) -20709 - Male JP (Amethyst) - (no description) -20710 - Male JP (Amethyst) - (no description) -20711 - Male JP (Amethyst) - (no description) -20712 - Male 10 (Amethyst) - (no description) -20713 - Male JP (Amethyst) - (no description) -20714 - Male 11 (Amethyst) - (no description) -20716 - Male Face 12 - (no description) -20717 - Male Face 14 - (no description) -20718 - Male 12 (Amethyst) - (no description) -20719 - Male 13 (Amethyst) - (no description) -20720 - Fierce Edge (Amethyst) - (no description) -20721 - Male Face JP - (no description) -20722 - Male Face 16(Amethyst Eyes) - (no description) -20723 - malefaceGL(Amethyst) - (no description) -20724 - Awakening (Amethyst) - (no description) -21000 - Female 1 (Black) - (no description) -21001 - Female 2 (Black) - (no description) -21002 - Female 3 (Black) - (no description) -21003 - Female 4 (Black) - (no description) -21004 - Female 5 (Black) - (no description) -21005 - Female 6 (Black) - (no description) -21006 - Female 7 (Black) - (no description) -21007 - Female 8 (Black) - (no description) -21008 - Female 9 (Black) - (no description) -21009 - Female JP (Black) - (no description) -21010 - Female JP (Black) - (no description) -21011 - Female JP (Black) - (no description) -21012 - Female 10 (Black) - (no description) -21013 - Female JP (Black) - (no description) -21014 - Female 11 (Black) - (no description) -21016 - Female Face 12 - (no description) -21017 - Female Face 14 - (no description) -21018 - Athena's Grace (Black) - (no description) -21019 - Hera's Radiance (Black) - (no description) -21020 - Female Face 13 - (no description) -21021 - Compassion's Countenance (Black) - (no description) -21022 - femalefaceGL(Black) - (no description) -21024 - Leisure Look (Black) - (no description) -21100 - Female 1 (Blue) - (no description) -21101 - Female 2 (Blue) - (no description) -21102 - Female 3 (Blue) - (no description) -21103 - Female 4 (Blue) - (no description) -21104 - Female 5 (Blue) - (no description) -21105 - Female 6 (Blue) - (no description) -21106 - Female 7 (Blue) - (no description) -21107 - Female 8 (Blue) - (no description) -21108 - Female 9 (Blue) - (no description) -21109 - Female JP (Blue) - (no description) -21110 - Female JP (Blue) - (no description) -21111 - Female JP (Blue) - (no description) -21112 - Female 10 (Blue) - (no description) -21113 - Female JP (Blue) - (no description) -21114 - Female 11 (Blue) - (no description) -21116 - Female Face 12 - (no description) -21117 - Female Face 14 - (no description) -21118 - Athena's Grace (Blue) - (no description) -21119 - Hera's Radiance (Blue) - (no description) -21120 - Female Face 13 - (no description) -21121 - Compassion's Countenance (Blue) - (no description) -21122 - femalefaceGL(Blue) - (no description) -21124 - Leisure Look (Blue) - (no description) -21200 - Female 1 (Red) - (no description) -21201 - Female 2 (Red) - (no description) -21202 - Female 3 (Red) - (no description) -21203 - Female 4 (Red) - (no description) -21204 - Female 5 (Red) - (no description) -21205 - Female 6 (Red) - (no description) -21206 - Female 7 (Red) - (no description) -21207 - Female 8 (Red) - (no description) -21208 - Female 9 (Red) - (no description) -21209 - Female JP (Red) - (no description) -21210 - Female JP (Red) - (no description) -21211 - Female JP (Red) - (no description) -21212 - Female 10 (Red) - (no description) -21213 - Female JP (Red) - (no description) -21214 - Female 11 (Red) - (no description) -21216 - Female Face 12 - (no description) -21217 - Female Face 14 - (no description) -21218 - Athena's Grace (Red) - (no description) -21219 - Hera's Radiance(Red) - (no description) -21220 - Female Face 13 - (no description) -21221 - Compassion's Countenance (Red) - (no description) -21222 - femalefaceGL(Red) - (no description) -21224 - Leisure Look (Red) - (no description) -21300 - Female 1 (Green) - (no description) -21301 - Female 2 (Green) - (no description) -21302 - Female 3 (Green) - (no description) -21303 - Female 4 (Green) - (no description) -21304 - Female 5 (Green) - (no description) -21305 - Female 6 (Green) - (no description) -21306 - Female 7 (Green) - (no description) -21307 - Female 8 (Green) - (no description) -21308 - Female 9 (Green) - (no description) -21309 - Female JP (Green) - (no description) -21310 - Female JP (Green) - (no description) -21311 - Female JP (Green) - (no description) -21312 - Female 10 (Green) - (no description) -21313 - Female JP (Green) - (no description) -21314 - Female 11 (Green) - (no description) -21316 - Female Face 12 - (no description) -21317 - Female Face 14 - (no description) -21318 - Athena's Grace (Green) - (no description) -21319 - Hera's Radiance (Green) - (no description) -21320 - Female Face 13 - (no description) -21321 - Compassion's Countenance (Green) - (no description) -21322 - femalefaceGL(Green) - (no description) -21324 - Leisure Look (Green) - (no description) -21400 - Female 1 (Hazel) - (no description) -21401 - Female 2 (Hazel) - (no description) -21402 - Female 3 (Hazel) - (no description) -21403 - Female 4 (Hazel) - (no description) -21404 - Female 5 (Hazel) - (no description) -21405 - Female 6 (Hazel) - (no description) -21406 - Female 7 (Hazel) - (no description) -21407 - Female 8 (Hazel) - (no description) -21408 - Female 9 (Hazel) - (no description) -21409 - Female JP (Hazel) - (no description) -21410 - Female JP (Hazel) - (no description) -21411 - Female JP (Hazel) - (no description) -21412 - Female 10 (Hazel) - (no description) -21413 - Female JP (Hazel) - (no description) -21414 - Female 11 (Hazel) - (no description) -21416 - Female Face 12 - (no description) -21417 - Female Face 14 - (no description) -21418 - Athena's Grace (Hazel) - (no description) -21419 - Hera's Radiance (Hazel) - (no description) -21420 - Female Face 13 - (no description) -21421 - Compassion's Countenance (Hazel) - (no description) -21422 - femalefaceGL(Hazel) - (no description) -21424 - Leisure Look (Hazel) - (no description) -21500 - Female 1 (Sapphire) - (no description) -21501 - Female 2 (Sapphire) - (no description) -21502 - Female 3 (Sapphire) - (no description) -21503 - Female 4 (Sapphire) - (no description) -21504 - Female 5 (Sapphire) - (no description) -21505 - Female 6 (Sapphire) - (no description) -21506 - Female 7 (Sapphire) - (no description) -21507 - Female 8 (Sapphire) - (no description) -21508 - Female 9 (Sapphire) - (no description) -21509 - Female JP (Sapphire) - (no description) -21510 - Female JP (Sapphire) - (no description) -21511 - Female JP (Sapphire) - (no description) -21512 - Female 10 (Sapphire) - (no description) -21513 - Female JP (Sapphire) - (no description) -21514 - Female 11 (Sapphire) - (no description) -21516 - Female Face 12 - (no description) -21517 - Female Face 14 - (no description) -21518 - Athena's Grace (Sapphire) - (no description) -21519 - Hera's Radiance(Sapphire) - (no description) -21520 - Female Face 13 - (no description) -21521 - Compassion's Countenance (Sapphire) - (no description) -21522 - femalefaceGL(Sapphire) - (no description) -21524 - Leisure Look (Sapphire) - (no description) -21600 - Female 1 (Violet) - (no description) -21601 - Female 2 (Violet) - (no description) -21602 - Female 3 (Violet) - (no description) -21603 - Female 4 (Violet) - (no description) -21604 - Female 5 (Violet) - (no description) -21605 - Female 6 (Violet) - (no description) -21606 - Female 7 (Violet) - (no description) -21607 - Female 8 (Violet) - (no description) -21608 - Female 9 (Violet) - (no description) -21609 - Female JP (Violet) - (no description) -21610 - Female JP (Violet) - (no description) -21611 - Female JP (Violet) - (no description) -21612 - Female 10 (Violet) - (no description) -21613 - Female JP (Violet) - (no description) -21614 - Female 11 (Violet) - (no description) -21616 - Female Face 12 - (no description) -21617 - Female Face 14 - (no description) -21618 - Athena's Grace (Violet) - (no description) -21619 - Hera's Radiance (Violet) - (no description) -21620 - Female Face 13 - (no description) -21621 - Compassion's Countenance (Violet) - (no description) -21622 - femalefaceGL(Violet) - (no description) -21624 - Leisure Look (Violet) - (no description) -21700 - Female 1 (Amethyst) - (no description) -21701 - Female 2 (Amethyst) - (no description) -21702 - Female 3 (Amethyst) - (no description) -21703 - Female 4 (Amethyst) - (no description) -21704 - Female 5 (Amethyst) - (no description) -21705 - Female 6 (Amethyst) - (no description) -21706 - Female 7 (Amethyst) - (no description) -21707 - Female 8 (Amethyst) - (no description) -21708 - Female 9 (Amethyst) - (no description) -21709 - Female JP (Amethyst) - (no description) -21710 - Female JP (Amethyst) - (no description) -21711 - Female JP (Amethyst) - (no description) -21712 - Female 10 (Amethyst) - (no description) -21713 - Female JP (Amethyst) - (no description) -21714 - Female 11 (Amethyst) - (no description) -21716 - Female Face 12 - (no description) -21717 - Female Face 14 - (no description) -21718 - Athena's Grace (Amethyst) - (no description) -21719 - Hera's Radiance (Amethyst) - (no description) -21720 - Female Face 13 - (no description) -21721 - Compassion's Countenance (Amethyst) - (no description) -21722 - femalefaceGL(Amethyst) - (no description) -21724 - Leisure Look (Amethyst) - (no description) -20800 - Male 1 (White) - (no description) -20801 - Male 2 (White) - (no description) -20802 - Leisure Look (Black) - (no description) -20803 - Male 4 (White) - (no description) -20804 - Male 5 (White) - (no description) -20805 - Male 6 (White) - (no description) -20806 - Male 7 (White) - (no description) -20807 - Male 8 (White) - (no description) -20808 - Male 9 (White) - (no description) -20809 - Male JP (White) - (no description) -20810 - Male JP (White) - (no description) -20811 - Male JP (White) - (no description) -20812 - Male 10 (White) - (no description) -20813 - Male JP (White) - (no description) -20814 - Male 11 (White) - (no description) -20816 - Male Face 12 (White) - (no description) -20817 - Male Face 14 (White) - (no description) -20818 - Male 12 (White) - (no description) -20819 - Male 13 (White) - (no description) -20820 - Fierce Edge (White) - (no description) -20821 - Male Face JP (White) - (no description) -20822 - Male Face 16 (White Eyes) - (no description) -20823 - malefaceGL (White) - (no description) -20824 - Awakening (White) - (no description) -20826 - Closed Lids (White) - (no description) -21800 - Female 1 (White) - (no description) -21801 - Female 2 (White) - (no description) -21802 - Female 3 (White) - (no description) -21803 - Female 4 (White) - (no description) -21804 - Female 5 (White) - (no description) -21805 - Female 6 (White) - (no description) -21806 - Female 7 (White) - (no description) -21807 - Female 8 (White) - (no description) -21808 - Female 9 (White) - (no description) -21809 - Female JP (White) - (no description) -21810 - Female JP (White) - (no description) -21811 - Female JP (White) - (no description) -21812 - Female 10 (White) - (no description) -21813 - Female JP (White) - (no description) -21814 - Female 11 (White) - (no description) -21816 - Female Face 12 (White) - (no description) -21817 - Female Face 14 (White) - (no description) -21818 - Athena's Grace (White) - (no description) -21819 - Hera's Radiance (White) - (no description) -21820 - Female Face 13 (White) - (no description) -21821 - Compassion's Countenance (White) - (no description) -21822 - femalefaceGL (White) - (no description) -21824 - Leisure Look (White) - (no description) -21825 - Closed Lids (White) - (no description) -20126 - Closed Lids (Blue) - (no description) -20226 - Closed Lids (Red) - (no description) -20326 - Closed Lids (Green) - (no description) -20426 - Closed Lids (Hazel) - (no description) -20526 - Closed Lids (Sapphire) - (no description) -20626 - Closed Lids (Violet) - (no description) -20726 - Closed Lids (Amethyst) - (no description) -20026 - Closed Lids (Black) - (no description) -21025 - Closed Lids (Black) - (no description) -21125 - Closed Lids (Blue) - (no description) -21225 - Closed Lids (Red) - (no description) -21325 - Closed Lids (Green) - (no description) -21425 - Closed Lids (Hazel) - (no description) -21525 - Closed Lids (Sapphire) - (no description) -21625 - Closed Lids (Violet) - (no description) -21725 - Closed Lids (Amethyst) - (no description) -20025 - Male 17 (Black) - (no description) -20125 - Male 17 (Blue) - (no description) -20225 - Male 17 (Red) - (no description) -20325 - Male 17 (Green) - (no description) -20425 - Male 17 (Hazel) - (no description) -20525 - Male 17 (Sapphire) - (no description) -20625 - Male 17 (Violet) - (no description) -20725 - Male 17 (Amethyst) - (no description) -20027 - Male 18 (Black) - (no description) -20127 - Male 18 (Blue) - (no description) -20227 - Male 18 (Red) - (no description) -20327 - Male 18 (Green) - (no description) -20427 - Male 18 (Hazel) - (no description) -20527 - Male 18 (Sapphire) - (no description) -20627 - Male 18 (Violet) - (no description) -20727 - Male 18 (Amethyst) - (no description) -20028 - Male Face 19 - (no description) -20128 - Male Face 19(Blue Eyes) - (no description) -20228 - Male Face 19(Red Eyes) - (no description) -20328 - Male Face 19(Green Eyes) - (no description) -20428 - Male Face 19(Brown Eyes) - (no description) -20528 - Male Face 19(Sapphire Eyes) - (no description) -20628 - Male Face 19(Violet Eyes) - (no description) -20728 - Male Face 19(Amethyst Eyes) - (no description) -21023 - Female Face 17 - (no description) -21123 - Female Face 17(Blue Eyes) - (no description) -21223 - Female Face 17(Red Eyes) - (no description) -21323 - Female Face 17(Green Eyes) - (no description) -21423 - Female Face 17(Brown Eyes) - (no description) -21523 - Female Face 17(Sapphire Eyes) - (no description) -21623 - Female Face 17(Violet Eyes) - (no description) -21723 - Female Face 17(Amethyst Eyes) - (no description) -21026 - Female Face 19 - (no description) -21126 - Female Face 19(Blue Eyes) - (no description) -21226 - Female Face 19(Red Eyes) - (no description) -21326 - Female Face 19(Green Eyes) - (no description) -21426 - Female Face 19(Brown Eyes) - (no description) -21526 - Female Face 19(Sapphire Eyes) - (no description) -21626 - Female Face 19(Violet Eyes) - (no description) -21726 - Female Face 19(Amethyst Eyes) - (no description) -20828 - Male Face 19(White Eyes) - (no description) -21823 - Female Face 17(Amethyst Eyes) - (no description) -21826 - Female Face 19(White Eyes) - (no description) -20029 - Male Face 20 - (no description) -20129 - Male Face 20 - (no description) -20229 - Male Face 20 - (no description) -20329 - Male Face 20 - (no description) -20429 - Male Face 20 - (no description) -20529 - Male Face 20 - (no description) -20629 - Male Face 20 - (no description) -20729 - Male Face 20 - (no description) -21027 - Female Face 20 - (no description) -21127 - Female Face 20 - (no description) -21227 - Female Face 20 - (no description) -21327 - Female Face 20 - (no description) -21427 - Female Face 20 - (no description) -21527 - Female Face 20 - (no description) -21627 - Female Face 20 - (no description) -21727 - Female Face 20 - (no description) -20031 - Male Face 21 - (no description) -20131 - Male Face 21 - (no description) -20231 - Male Face 21 - (no description) -20331 - Male Face 21 - (no description) -20431 - Male Face 21 - (no description) -20531 - Male Face 21 - (no description) -20631 - Male Face 21 - (no description) -20731 - Male Face 21 - (no description) -20032 - Male Face 22 - (no description) -20132 - Male Face 22 - (no description) -20232 - Male Face 22 - (no description) -20332 - Male Face 22 - (no description) -20432 - Male Face 22 - (no description) -20532 - Male Face 22 - (no description) -20632 - Male Face 22 - (no description) -20732 - Male Face 22 - (no description) -21029 - Female Face 21 - (no description) -21129 - Female Face 21 - (no description) -21229 - Female Face 21 - (no description) -21329 - Female Face 21 - (no description) -21429 - Female Face 21 - (no description) -21529 - Female Face 21 - (no description) -21629 - Female Face 21 - (no description) -21729 - Female Face 21 - (no description) -21030 - Female Face 22 - (no description) -21130 - Female Face 22 - (no description) -21230 - Female Face 22 - (no description) -21330 - Female Face 22 - (no description) -21430 - Female Face 22 - (no description) -21530 - Female Face 22 - (no description) -21630 - Female Face 22 - (no description) -21730 - Female Face 22 - (no description) diff --git a/tools/MapleIdRetriever/handbook/Equip/Glove.txt b/tools/MapleIdRetriever/handbook/Equip/Glove.txt deleted file mode 100644 index f2be2128c2..0000000000 --- a/tools/MapleIdRetriever/handbook/Equip/Glove.txt +++ /dev/null @@ -1,239 +0,0 @@ -1080000 - White Ninja Gloves - (no description) -1080001 - Red Ninja Gloves - (no description) -1080002 - Black Ninja Gloves - (no description) -1081000 - Red Ninja Gloves - (no description) -1081001 - Blue Ninja Gloves - (no description) -1081002 - Wedding Gloves - (no description) -1081003 - White Cat Gloves - (no description) -1081004 - Black Cat Gloves - (no description) -1082000 - Steel Fingerless Gloves - (no description) -1082001 - White Fingerless Gloves - (no description) -1082002 - Work Gloves - (no description) -1082003 - Juno - (no description) -1082004 - Venon - (no description) -1082005 - Steel Missel - (no description) -1082006 - Orihalcon Missel - (no description) -1082007 - Bronze Missel - (no description) -1082008 - Steel Briggon - (no description) -1082009 - Steel Brist - (no description) -1082010 - Mithril Brist - (no description) -1082011 - Gold Brist - (no description) -1082012 - Basic Archer Gloves - (no description) -1082013 - Blue Diros - (no description) -1082014 - Red Diros - (no description) -1082015 - Green Diros - (no description) -1082016 - Blue Savata - (no description) -1082017 - Red Savata - (no description) -1082018 - Dark Savata - (no description) -1082019 - Lemona - (no description) -1082020 - Blue Morrican - (no description) -1082021 - Green Morrican - (no description) -1082022 - Purple Morrican - (no description) -1082023 - Iron Knuckle - (no description) -1082024 - Adamantium Knuckle - (no description) -1082025 - Dark Knuckle - (no description) -1082026 - Ocean Mesana - (no description) -1082027 - Blood Mesana - (no description) -1082028 - Dark Mesana - (no description) -1082029 - Brown Duo - (no description) -1082030 - Blue Duo - (no description) -1082031 - Black Duo - (no description) -1082032 - Bronze Mischief - (no description) -1082033 - Mithril Mischief - (no description) -1082034 - Dark Mischief - (no description) -1082035 - Yellow Briggon - (no description) -1082036 - Dark Briggon - (no description) -1082037 - Bronze Wolfskin - (no description) -1082038 - Mithril Wolfskin - (no description) -1082039 - Dark Wolfskin - (no description) -1082040 - Red Boxing Gloves - (no description) -1082041 - Blue Boxing Gloves - (no description) -1082042 - Steel Sylvia - (no description) -1082043 - Silver Sylvia - (no description) -1082044 - Gold Sylvia - (no description) -1082045 - Gold Arbion - (no description) -1082046 - Steel Arbion - (no description) -1082047 - Orihalcon Arbion - (no description) -1082048 - Brown Marker - (no description) -1082049 - Green Marker - (no description) -1082050 - Black Marker - (no description) -1082051 - Red Lutia - (no description) -1082052 - Blue Lutia - (no description) -1082053 - Black Lutia - (no description) -1082054 - Red Noel - (no description) -1082055 - Blue Noel - (no description) -1082056 - Dark Noel - (no description) -1082057 - Brown Baseball Glove - (no description) -1082058 - Blue Baseball Glove - (no description) -1082059 - Bronze Clench - (no description) -1082060 - Sapphire Clench - (no description) -1082061 - Dark Clench - (no description) -1082062 - Red Arten - (no description) -1082063 - Blue Arten - (no description) -1082064 - Dark Arten - (no description) -1082065 - Blue Moon Gloves - (no description) -1082066 - Brown Moon Gloves - (no description) -1082067 - Red Moon Gloves - (no description) -1082068 - Bronze Scaler - (no description) -1082069 - Mithril Scaler - (no description) -1082070 - Gold Scaler - (no description) -1082071 - Aqua Brace - (no description) -1082072 - Gold Brace - (no description) -1082073 - Dark Brace - (no description) -1082074 - Dark Cleave - (no description) -1082075 - Red Cleave - (no description) -1082076 - Gold Cleave - (no description) -1082077 - White Bandage - (no description) -1082078 - Brown Bandage - (no description) -1082079 - Black Bandage - (no description) -1082080 - Dark Penance - (no description) -1082081 - Red Pennance - (no description) -1082082 - Blue Pennance - (no description) -1082083 - Dark Willow - (no description) -1082084 - Blue Willow - (no description) -1082085 - Red Willow - (no description) -1082086 - Steel Manute - (no description) -1082087 - Gold Manute - (no description) -1082088 - Dark Manute - (no description) -1082089 - Oaker Garner - (no description) -1082090 - Sephia Garner - (no description) -1082091 - Dark Garner - (no description) -1082092 - Bronze Pow - (no description) -1082093 - Steal Pow - (no description) -1082094 - Gold Pow - (no description) -1082095 - Bronze Rover - (no description) -1082096 - Silver Rover - (no description) -1082097 - Gold Rover - (no description) -1082098 - Brown Lorin - (no description) -1082099 - Blue Lorin - (no description) -1082100 - Dark Lorin - (no description) -1082101 - Santa Gloves - (no description) -1082102 - Transparent Gloves - Use these Gloves if you want to make your Gloves transparent while still using all of the stats your Gloves possess. -1082103 - Bronze Husk - (no description) -1082104 - Mithril Husk - (no description) -1082105 - Dark Husk - (no description) -1082106 - Blue Eyes - (no description) -1082107 - Gold Eyes - (no description) -1082108 - Dark Eyes - (no description) -1082109 - Red Cordon - (no description) -1082110 - Blue Cordon - (no description) -1082111 - Green Cordon - (no description) -1082112 - Dark Cordon - (no description) -1082113 - Hair-Cutter Gloves - (no description) -1082114 - Sapphire Emperor - (no description) -1082115 - Emerald Emperor - (no description) -1082116 - Blood Emperor - (no description) -1082117 - Dark Emperor - (no description) -1082118 - Green Larceny - (no description) -1082119 - Purple Larceny - (no description) -1082120 - Blood Larceny - (no description) -1082121 - Green Clarity - (no description) -1082122 - Blue Clarity - (no description) -1082123 - Dark Clarity - (no description) -1082124 - Mesoranger Gloves - (no description) -1082125 - Red Focus - (no description) -1082126 - Green Focus - (no description) -1082127 - Dark Focus - (no description) -1082128 - Green Imperial - (no description) -1082129 - Purple Imperial - (no description) -1082130 - Dark Imperial - (no description) -1082131 - Blue Sage - (no description) -1082132 - Green Sage - (no description) -1082133 - Red Sage - (no description) -1082134 - Dark Pachone - (no description) -1082135 - Blue Anelin - (no description) -1082136 - Green Anelin - (no description) -1082137 - Red Anelin - (no description) -1082138 - Dark Anelin - (no description) -1082139 - Green Korben - (no description) -1082140 - Blue Korben - (no description) -1082141 - Dark Korben - (no description) -1082142 - Green Mystra - (no description) -1082143 - Purple Mystra - (no description) -1082144 - Dark Mystra - (no description) -1082145 - Yellow Work Gloves - (no description) -1082146 - Red Work Gloves - (no description) -1082147 - Blue Work Gloves - (no description) -1082148 - Purple Work Gloves - (no description) -1082149 - Brown Work Gloves - (no description) -1082150 - Grey Work Gloves - (no description) -1082151 - Green Ciara - (no description) -1082152 - Blue Ciara - (no description) -1082153 - Red Ciara - (no description) -1082154 - Purple Ciara - (no description) -1082155 - Snowman Gloves - (no description) -1082156 - Teddy Bear Gloves - (no description) -1082157 - Skull Gloves - (no description) -1082158 - Red Arcina - (no description) -1082159 - Blue Arcina - (no description) -1082160 - Green Arcina - (no description) -1082161 - Star Gloves - (no description) -1082162 - Love Gloves - (no description) -1082163 - Red Hunter Gloves - (no description) -1082164 - Blue Elemental Gloves - (no description) -1082167 - Black Garina Gloves - (no description) -1082168 - Blue Dragon Gauntlet - (no description) -1082169 - Moon Bunny Gloves - (no description) -1082170 - Rose Crystal Watch - (no description) -1082171 - Blue Watch - (no description) -1082172 - Snowflake Gloves - (no description) -1082173 - Lightning Gloves - (no description) -1082174 - Lunar Gloves - (no description) -1082175 - Red Marker - (no description) -1082176 - Blue Marker - (no description) -1082177 - Purple Marker - (no description) -1082178 - Pink Marker - (no description) -1082179 - Yellow Marker - (no description) -1082180 - Green Lagger Halfglove - (no description) -1082183 - Brown Leather Armor Glove - (no description) -1082186 - Hard Leather Glove - (no description) -1082189 - Yellow Tartis - (no description) -1082192 - Brown Jeweled - (no description) -1082195 - Brown Barbee - (no description) -1082198 - Brown Royce - (no description) -1082201 - Black Schult - (no description) -1082204 - Black Bisk - (no description) -1082207 - Blue Halfglove - (no description) -1082210 - Red Martier - (no description) -1082213 - Black Skellduke - (no description) -1082216 - Canopus Glove - (no description) -1082217 - Wolf Gauntlets - (no description) -1082218 - Dragon Gauntlet - A gauntlet worn by the fearsome Dragon Ninja Clan. Imbued with strange properties, as if it was experiemented on... -1082221 - Golden Gloves - (no description) -1082222 - Mechanical Glove - (no description) -1082223 - Stormcaster Gloves - A relic formerly worn by the Stormcaster knights, these gloves are renowned for their offensive capabilities. -1082224 - Tania Gloves - (no description) -1082225 - Mercury Gloves - (no description) -1082227 - Transparent Skull Glove - (no description) -1082228 - Green Mittens - (no description) -1082229 - Heart Ribbon Glove - (no description) -1082230 - Glitter Gloves - (no description) -1082231 - Luxury Wristwatch - (no description) -1082232 - Goddess Wristband - (no description) -1082233 - Moomoo Gloves - (no description) -1082246 - Flamekeeper Cordon - (no description) -1082249 - Neon Amulet - (no description) -1082247 - Puffy Ram Gloves - (no description) -1082234 - Timeless Bergamot - (no description) -1082235 - Timeless Hermosa - (no description) -1082236 - Timeless Presto - (no description) -1082237 - Timeless Lubav - (no description) -1082238 - Timeless Charlston - (no description) -1082239 - Reverse Bergamot - (no description) -1082240 - Reverse Hermosa - (no description) -1082241 - Reverse Presto - (no description) -1082242 - Reverse Lubav - (no description) -1082243 - Reverse Charlston - (no description) -1082244 - Agent O's Nylon Gloves - (no description) -1082245 - Agent O's Leather Gloves - (no description) -1082251 - Rock Chain Armlet - (no description) -1082255 - Maple Racing Glove - (no description) -1082250 - Treacherous Wolf Gloves - (no description) -1082252 - Maple Gage - (no description) -1082256 - Andras Gloves - (no description) -1082257 - Marbas Gloves - (no description) -1082258 - Valefor Gloves - (no description) -1082259 - Amdusias Gloves - (no description) -1082260 - Crocell Gloves - (no description) -1082254 - Mushking Leather Glove - (no description) -1082261 - Freud's Gloves - (no description) diff --git a/tools/MapleIdRetriever/handbook/Equip/Hair.txt b/tools/MapleIdRetriever/handbook/Equip/Hair.txt deleted file mode 100644 index eebe4640d4..0000000000 --- a/tools/MapleIdRetriever/handbook/Equip/Hair.txt +++ /dev/null @@ -1,1504 +0,0 @@ -30000 - Black Toben - (no description) -30001 - Red Toben - (no description) -30002 - Orange Toben - (no description) -30003 - Blonde Toben - (no description) -30004 - Green Toben - (no description) -30005 - Blue Toben - (no description) -30006 - Purple Toben - (no description) -30007 - Brown Toben - (no description) -30010 - Zeta - (no description) -30020 - Black Rebel - (no description) -30021 - Red Rebel - (no description) -30022 - Orange Rebel - (no description) -30023 - Blonde Rebel - (no description) -30024 - Green Rebel - (no description) -30025 - Blue Rebel - (no description) -30026 - Purple Rebel - (no description) -30027 - Brown Rebel - (no description) -30030 - Black Buzz - (no description) -30031 - Red Buzz - (no description) -30032 - Orange Buzz - (no description) -30033 - Blonde Buzz - (no description) -30034 - Green Buzz - (no description) -30035 - Blue Buzz - (no description) -30036 - Purple Buzz - (no description) -30037 - Brown Buzz - (no description) -30040 - Black Rockstar - (no description) -30041 - Red Rockstar - (no description) -30042 - Orange Rockstar - (no description) -30043 - Blonde Rockstar - (no description) -30044 - Green Rockstar - (no description) -30045 - Blue Rockstar - (no description) -30046 - Purple Rockstar - (no description) -30047 - Brown Rockstar - (no description) -30050 - Black Metro - (no description) -30051 - Red Metro - (no description) -30052 - Orange Metro - (no description) -30053 - Blonde Metro - (no description) -30054 - Green Metro - (no description) -30055 - Blue Metro - (no description) -30056 - Purple Metro - (no description) -30057 - Brown Metro - (no description) -30060 - Black Catalyst - (no description) -30061 - Red Catalyst - (no description) -30062 - Orange Catalyst - (no description) -30063 - Blonde Catalyst - (no description) -30064 - Green Catalyst - (no description) -30065 - Blue Catalyst - (no description) -30066 - Purple Catalyst - (no description) -30067 - Brown Catalyst - (no description) -30070 - All Back - (no description) -30080 - Military Buzzcut - (no description) -30090 - Mohawk - (no description) -30100 - Blue Fantasy - (no description) -30101 - Maroon Fantasy - (no description) -30102 - Brown Fantasy - (no description) -30103 - Green Fantasy - (no description) -30104 - Blue-Green Fantasy - (no description) -30110 - Black Fireball - (no description) -30111 - Red Fireball - (no description) -30112 - Orange Fireball - (no description) -30113 - Blonde Fireball - (no description) -30114 - Green Fireball - (no description) -30115 - Blue Fireball - (no description) -30116 - Purple Fireball - (no description) -30117 - Brown Fireball - (no description) -30120 - Black Vincent - (no description) -30121 - Red Vincent - (no description) -30122 - Orange Vincent - (no description) -30123 - Blonde Vincent - (no description) -30124 - Green Vincent - (no description) -30125 - Blue Vincent - (no description) -30126 - Purple Vincent - (no description) -30127 - Brown Vincent - (no description) -30130 - Black Antagonist - (no description) -30131 - Red Antagonist - (no description) -30132 - Orange Antagonist - (no description) -30133 - Blonde Antagonist - (no description) -30134 - Green Antagonist - (no description) -30135 - Blue Antagonist - (no description) -30136 - Purple Antagonist - (no description) -30137 - Brown Antagonist - (no description) -30140 - Black Topknot - (no description) -30141 - Red Topknot - (no description) -30142 - Orange Topknot - (no description) -30143 - Blonde Topknot - (no description) -30144 - Green Topknot - (no description) -30145 - Blue Topknot - (no description) -30146 - Purple Topknot - (no description) -30147 - Brown Topknot - (no description) -30150 - Black Dreadlocks - (no description) -30151 - Red Dreadlocks - (no description) -30152 - Orange Dreadlocks - (no description) -30153 - Blonde Dreadlocks - (no description) -30154 - Green Dreadlocks - (no description) -30155 - Blue Dreadlocks - (no description) -30156 - Purple Dreadlocks - (no description) -30157 - Brown Dreadlocks - (no description) -30160 - Black Trip Scratch - (no description) -30161 - Red Trip Scratch - (no description) -30162 - Orange Trip Scratch - (no description) -30163 - Blonde Trip Scratch - (no description) -30164 - Green Trip Scratch - (no description) -30165 - Blue Trip Scratch - (no description) -30166 - Purple Trip Scratch - (no description) -30167 - Brown Trip Scratch - (no description) -30170 - Black Line Scratch - (no description) -30171 - Red Line Scratch - (no description) -30172 - Orange Line Scratch - (no description) -30173 - Blonde Line Scratch - (no description) -30174 - Green Line Scratch - (no description) -30175 - Blue Line Scratch - (no description) -30176 - Purple Line Scratch - (no description) -30177 - Brown Line Scratch - (no description) -30180 - Black Mane - (no description) -30181 - Red Mane - (no description) -30182 - Orange Mane - (no description) -30183 - Blonde Mane - (no description) -30184 - Green Mane - (no description) -30185 - Blue Mane - (no description) -30186 - Purple Mane - (no description) -30187 - Brown Mane - (no description) -30190 - Black Bowl Cut - (no description) -30191 - Red Bowl Cut - (no description) -30192 - Orange Bowl Cut - (no description) -30193 - Blonde Bowl Cut - (no description) -30194 - Green Bowl Cut - (no description) -30195 - Blue Bowl Cut - (no description) -30196 - Purple Bowl Cut - (no description) -30197 - Brown Bowl Cut - (no description) -30200 - Black Wind - (no description) -30201 - Red Wind - (no description) -30202 - Orange Wind - (no description) -30203 - Blonde Wind - (no description) -30204 - Green Wind - (no description) -30205 - Blue Wind - (no description) -30206 - Purple Wind - (no description) -30207 - Brown Wind - (no description) -30210 - Black Shaggy Wax - (no description) -30211 - Red Shaggy Wax - (no description) -30212 - Orange Shaggy Wax - (no description) -30213 - Blonde Shaggy Wax - (no description) -30214 - Green Shaggy Wax - (no description) -30215 - Blue Shaggy Wax - (no description) -30216 - Purple Shaggy Wax - (no description) -30217 - Brown Shaggy Wax - (no description) -30220 - Black Grooovy Do - (no description) -30221 - Red Grooovy Do - (no description) -30222 - Orange Grooovy Do - (no description) -30223 - Blonde Grooovy Do - (no description) -30224 - Green Grooovy Do - (no description) -30225 - Blue Grooovy Do - (no description) -30226 - Purple Grooovy Do - (no description) -30227 - Brown Grooovy Do - (no description) -30230 - Black Foil Perm - (no description) -30231 - Red Foil Perm - (no description) -30232 - Orange Foil Perm - (no description) -30233 - Blonde Foil Perm - (no description) -30234 - Green Foil Perm - (no description) -30235 - Blue Foil Perm - (no description) -30236 - Purple Foil Perm - (no description) -30237 - Brown Foil Perm - (no description) -30240 - Black Monkey - (no description) -30241 - Red Monkey - (no description) -30242 - Orange Monkey - (no description) -30243 - Blonde Monkey - (no description) -30244 - Green Monkey - (no description) -30245 - Blue Monkey - (no description) -30246 - Purple Monkey - (no description) -30247 - Brown Monkey - (no description) -30250 - Black Afro - (no description) -30251 - Red Afro - (no description) -30252 - Orange Afro - (no description) -30253 - Blonde Afro - (no description) -30254 - Green Afro - (no description) -30255 - Blue Afro - (no description) -30256 - Purple Afro - (no description) -30257 - Brown Afro - (no description) -30260 - Black Metrosexual - (no description) -30261 - Red Metrosexual - (no description) -30262 - Orange Metrosexual - (no description) -30263 - Blonde Metrosexual - (no description) -30264 - Green Metrosexual - (no description) -30265 - Blue Metrosexual - (no description) -30266 - Purple Metrosexual - (no description) -30267 - Brown Metrosexual - (no description) -30270 - Black w/ Bald Spot - (no description) -30271 - Red w/ Bald Spot - (no description) -30272 - Orange w/ Bald Spot - (no description) -30273 - Blonde w/ Bald Spot - (no description) -30274 - Green w/ Bald Spot - (no description) -30275 - Blue w/ Bald Spot - (no description) -30276 - Purple w/ Bald Spot - (no description) -30277 - Brown w/ Bald Spot - (no description) -30280 - Black Mohecan Shaggy Do - (no description) -30281 - Red Mohecan Shaggy Do - (no description) -30282 - Orange Mohecan Shaggy Do - (no description) -30283 - Blonde Mohecan Shaggy Do - (no description) -30284 - Green Mohecan Shaggy Do - (no description) -30285 - Blue Mohecan Shaggy Do - (no description) -30286 - Purple Mohecan Shaggy Do - (no description) -30287 - Brown Mohecan Shaggy Do - (no description) -30290 - Black Old Man 'Do - (no description) -30291 - Red Old Man 'Do - (no description) -30292 - Orange Old Man 'Do - (no description) -30293 - Blonde Old Man 'Do - (no description) -30294 - Green Old Man 'Do - (no description) -30295 - Blue Old Man 'Do - (no description) -30296 - Purple Old Man 'Do - (no description) -30297 - Brown Old Man 'Do - (no description) -30300 - Black Romance - (no description) -30301 - Red Romance - (no description) -30302 - Orange Romance - (no description) -30303 - Blond Romance - (no description) -30304 - Green Romance - (no description) -30305 - Blue Romance - (no description) -30306 - Purple Romance - (no description) -30307 - Brown Romance - (no description) -30310 - Black Acorn - (no description) -30311 - Red Acorn - (no description) -30312 - Orange Acorn - (no description) -30313 - Blonde Acorn - (no description) -30314 - Green Acorn - (no description) -30315 - Blue Acorn - (no description) -30316 - Purple Acorn - (no description) -30317 - Brown Acorn - (no description) -30320 - Black Afro - (no description) -30321 - Red Afro - (no description) -30322 - Orange Afro - (no description) -30323 - Blonde Afro - (no description) -30324 - Green Afro - (no description) -30325 - Blue Afro - (no description) -30326 - Purple Afro - (no description) -30327 - Brown Afro - (no description) -30330 - Black Cabana Boy - (no description) -30331 - Red Cabana Boy - (no description) -30332 - Orange Cabana Boy - (no description) -30333 - Blonde Cabana Boy - (no description) -30334 - Green Cabana Boy - (no description) -30335 - Blue Cabana Boy - (no description) -30336 - Purple Cabana Boy - (no description) -30337 - Brown Cabana Boy - (no description) -30340 - Black Tristan - (no description) -30341 - Red Tristan - (no description) -30342 - Orange Tristan - (no description) -30343 - Blonde Tristan - (no description) -30344 - Green Tristan - (no description) -30345 - Blue Tristan - (no description) -30346 - Purple Tristan - (no description) -30347 - Brown Tristan - (no description) -30350 - Black Astro - (no description) -30351 - Red Astro - (no description) -30352 - Orange Astro - (no description) -30353 - Blonde Astro - (no description) -30354 - Green Astro - (no description) -30355 - Blue Astro - (no description) -30356 - Purple Astro - (no description) -30357 - Brown Astro - (no description) -30360 - Black Spiky Tail - (no description) -30361 - Red Spiky Tail - (no description) -30362 - Orange Spiky Tail - (no description) -30363 - Blonde Spiky Tail - (no description) -30364 - Green Spiky Tail - (no description) -30365 - Blue Spiky Tail - (no description) -30366 - Purple Spiky Tail - (no description) -30367 - Brown Spiky Tail - (no description) -30370 - Black Shaggy Dragon - (no description) -30371 - Red Shaggy Dragon - (no description) -30372 - Orange Shaggy Dragon - (no description) -30373 - Blond Shaggy Dragon - (no description) -30374 - Green Shaggy Dragon - (no description) -30375 - Blue Shaggy Dragon - (no description) -30376 - Purple Shaggy Dragon - (no description) -30377 - Brown Shaggy Dragon - (no description) -30400 - Black Tribal Buzz - (no description) -30401 - Red Tribal Buzz - (no description) -30402 - Orange Tribal Buzz - (no description) -30403 - Blond Tribal Buzz - (no description) -30404 - Green Tribal Buzz - (no description) -30405 - Blue Tribal Buzz - (no description) -30406 - Purple Tribal Buzz - (no description) -30407 - Brown Tribal Buzz - (no description) -30410 - Black Natural - (no description) -30411 - Red Natural - (no description) -30412 - Orange Natural - (no description) -30413 - Blond Natural - (no description) -30414 - Green Natural - (no description) -30415 - Blue Natural - (no description) -30416 - Purple Natural - (no description) -30417 - Brown Natural - (no description) -30420 - Black Cozy Amber - (no description) -30421 - Red Cozy Amber - (no description) -30422 - Orange Cozy Amber - (no description) -30423 - Blond Cozy Amber - (no description) -30424 - Green Cozy Amber - (no description) -30425 - Blue Cozy Amber - (no description) -30426 - Purple Cozy Amber - (no description) -30427 - Brown Cozy Amber - (no description) -30430 - Skin Head - (no description) -30431 - Skin Head - (no description) -30432 - Skin Head - (no description) -30433 - Skin Head - (no description) -30434 - Skin Head - (no description) -30435 - Skin Head - (no description) -30436 - Skin Head - (no description) -30437 - Skin Head - (no description) -30440 - Black Fury - (no description) -30441 - Red Fury - (no description) -30442 - Orange Fury - (no description) -30443 - Blonde Fury - (no description) -30444 - Green Fury - (no description) -30445 - Blue Fury - (no description) -30446 - Purple Fury - (no description) -30447 - Brown Fury - (no description) -30450 - Black Casanova - (no description) -30451 - Red Casanova - (no description) -30452 - Orange Casanova - (no description) -30453 - Blonde Casanova - (no description) -30454 - Green Casanova - (no description) -30455 - Blue Casanova - (no description) -30456 - Purple Casanova - (no description) -30457 - Brown Casanova - (no description) -30460 - Black Tornade Hair - (no description) -30461 - Red Tornade Hair - (no description) -30462 - Orange Tornade Hair - (no description) -30463 - Blond Tornade Hair - (no description) -30464 - Green Tornade Hair - (no description) -30465 - Blue Tornade Hair - (no description) -30466 - Purple Tornade Hair - (no description) -30467 - Brown Tornade Hair - (no description) -30470 - Black Slick Dean - (no description) -30471 - Red Slick Dean - (no description) -30472 - Orange Slick Dean - (no description) -30473 - Blonde Slick Dean - (no description) -30474 - Green Slick Dean - (no description) -30475 - Blue Slick Dean - (no description) -30476 - Purple Slick Dean - (no description) -30477 - Brown Slick Dean - (no description) -30480 - Black Babby Cut - (no description) -30481 - Red Babby Cut - (no description) -30482 - Orange Babby Cut - (no description) -30483 - Blonde Babby Cut - (no description) -30484 - Green Babby Cut - (no description) -30485 - Blue Babby Cut - (no description) -30486 - Purple Babby Cut - (no description) -30487 - Brown Babby Cut - (no description) -30490 - Black Messy Spike - (no description) -30491 - Red Messy Spike - (no description) -30492 - Orange Messy Spike - (no description) -30493 - Blonde Messy Spike - (no description) -30494 - Green Messy Spike - (no description) -30495 - Blue Messy Spike - (no description) -30496 - Purple Messy Spike - (no description) -30497 - Brown Messy Spike - (no description) -30510 - Black Rockie - (no description) -30511 - Red Rockie - (no description) -30512 - Orange Rockie - (no description) -30513 - Blonde Rockie - (no description) -30514 - Green Rockie - (no description) -30515 - Blue Rockie - (no description) -30516 - Purple Rockie - (no description) -30517 - Brown Rockie - (no description) -30520 - Black Hontas - (no description) -30521 - Red Hontas - (no description) -30522 - Orange Hontas - (no description) -30523 - Blonde Hontas - (no description) -30524 - Green Hontas - (no description) -30525 - Blue Hontas - (no description) -30526 - Purple Hontas - (no description) -30527 - Brown Hontas - (no description) -30530 - Black Baldie - (no description) -30531 - Red Baldie - (no description) -30532 - Orange Baldie - (no description) -30533 - Blonde Baldie - (no description) -30534 - Green Baldie - (no description) -30535 - Blue Baldie - (no description) -30536 - Purple Baldie - (no description) -30537 - Brown Baldie - (no description) -30540 - Black Robot - (no description) -30541 - Red Robot - (no description) -30542 - Orange Robot - (no description) -30543 - Blonde Robot - (no description) -30544 - Green Robot - (no description) -30545 - Blue Robot - (no description) -30546 - Purple Robot - (no description) -30547 - Brown Robot - (no description) -30550 - Black Kongfu Braids - (no description) -30551 - Red Kongfu Braids - (no description) -30552 - Orange Kongfu Braids - (no description) -30553 - Blonde Kongfu Braids - (no description) -30554 - Green Kongfu Braids - (no description) -30555 - Blue Kongfu Braids - (no description) -30556 - Purple Kongfu Braids - (no description) -30557 - Brown Kongfu Braids - (no description) -30560 - Black Grand Lionman - (no description) -30561 - Red Grand Lionman - (no description) -30562 - Orange Grand Lionman - (no description) -30563 - Blonde Grand Lionman - (no description) -30564 - Green Grand Lionman - (no description) -30565 - Blue Grand Lionman - (no description) -30566 - Purple Grand Lionman - (no description) -30567 - Brown Grand Lionman - (no description) -30570 - Black Eternal Elegance - (no description) -30571 - Red Eternal Elegance - (no description) -30572 - Orange Eternal Elegance - (no description) -30573 - Blonde Eternal Elegance - (no description) -30574 - Green Eternal Elegance - (no description) -30575 - Blue Eternal Elegance - (no description) -30576 - Purple Eternal Elegance - (no description) -30577 - Brown Eternal Elegance - (no description) -30580 - Black Saturday Special - (no description) -30581 - Red Saturday Special - (no description) -30582 - Orange Saturday Special - (no description) -30583 - Blonde Saturday Special - (no description) -30584 - Green Saturday Special - (no description) -30585 - Blue Saturday Special - (no description) -30586 - Purple Saturday Special - (no description) -30587 - Brown Saturday Special - (no description) -30590 - Black Super Suave - (no description) -30591 - Red Super Suave - (no description) -30592 - Orange Super Suave - (no description) -30593 - Blonde Super Suave - (no description) -30594 - Green Super Suave - (no description) -30595 - Blue Super Suave - (no description) -30596 - Purple Super Suave - (no description) -30597 - Brown Super Suave - (no description) -30600 - Black The Curl - (no description) -30601 - Red The Curl - (no description) -30602 - Orange The Curl - (no description) -30603 - Blonde The Curl - (no description) -30604 - Green The Curl - (no description) -30605 - Blue The Curl - (no description) -30606 - Purple The Curl - (no description) -30607 - Brown The Curl - (no description) -30610 - Black The Mo Rawk - (no description) -30611 - Red The Mo Rawk - (no description) -30612 - Orange The Mo Rawk - (no description) -30613 - Blonde The Mo Rawk - (no description) -30614 - Green The Mo Rawk - (no description) -30615 - Blue The Mo Rawk - (no description) -30616 - Purple The Mo Rawk - (no description) -30617 - Brown The Mo Rawk - (no description) -30620 - Black Bubba GoaTee - (no description) -30621 - Red Bubba GoaTee - (no description) -30622 - Orange Bubba GoaTee - (no description) -30623 - Blonde Bubba GoaTee - (no description) -30624 - Green Bubba GoaTee - (no description) -30625 - Blue Bubba GoaTee - (no description) -30626 - Purple Bubba GoaTee - (no description) -30627 - Brown Bubba GoaTee - (no description) -30630 - Black Neon Cactus - (no description) -30631 - Red Neon Cactus - (no description) -30632 - Orange Neon Cactus - (no description) -30633 - Blonde Neon Cactus - (no description) -30634 - Green Neon Cactus - (no description) -30635 - Blue Neon Cactus - (no description) -30636 - Purple Neon Cactus - (no description) -30637 - Brown Neon Cactus - (no description) -30640 - Black Urban Dragon - (no description) -30641 - Red Urban Dragon - (no description) -30642 - Orange Urban Dragon - (no description) -30643 - Blonde Urban Dragon - (no description) -30644 - Green Urban Dragon - (no description) -30645 - Blue Urban Dragon - (no description) -30646 - Purple Urban Dragon - (no description) -30647 - Brown Urban Dragon - (no description) -30650 - Black Rise N Shine - (no description) -30651 - Red Rise N Shine - (no description) -30652 - Orange Rise N Shine - (no description) -30653 - Blonde Rise N Shine - (no description) -30654 - Green Rise N Shine - (no description) -30655 - Blue Rise N Shine - (no description) -30656 - Purple Rise N Shine - (no description) -30657 - Brown Rise N Shine - (no description) -30660 - Black Fuzz - (no description) -30661 - Red Fuzz - (no description) -30662 - Orange Fuzz - (no description) -30663 - Blonde Fuzz - (no description) -30664 - Green Fuzz - (no description) -30665 - Blue Fuzz - (no description) -30666 - Purple Fuzz - (no description) -30667 - Brown Fuzz - (no description) -30670 - Black Preppy Spike - (no description) -30671 - Red Preppy Spike - (no description) -30672 - Orange Preppy Spike - (no description) -30673 - Blonde Preppy Spike - (no description) -30674 - Green Preppy Spike - (no description) -30675 - Blue Preppy Spike - (no description) -30676 - Purple Preppy Spike - (no description) -30677 - Brown Preppy Spike - (no description) -30680 - Black Hobo - (no description) -30681 - Red Hobo - (no description) -30682 - Orange Hobo - (no description) -30683 - Blonde Hobo - (no description) -30684 - Green Hobo - (no description) -30685 - Blue Hobo - (no description) -30686 - Purple Hobo - (no description) -30687 - Brown Hobo - (no description) -30690 - Black Metro Man - (no description) -30691 - Red Metro Man - (no description) -30692 - Orange Metro Man - (no description) -30693 - Blonde Metro Man - (no description) -30694 - Green Metro Man - (no description) -30695 - Blue Metro Man - (no description) -30696 - Purple Metro Man - (no description) -30697 - Brown Metro Man - (no description) -30700 - Black Rising Rocker - (no description) -30701 - Red Rising Rocker - (no description) -30702 - Orange Rising Rocker - (no description) -30703 - Blonde Rising Rocker - (no description) -30704 - Green Rising Rocker - (no description) -30705 - Blue Rising Rocker - (no description) -30706 - Purple Rising Rocker - (no description) -30707 - Brown Rising Rocker - (no description) -30710 - Black Puffy Fro - (no description) -30711 - Red Puffy Fro - (no description) -30712 - Orange Puffy Fro - (no description) -30713 - Blonde Puffy Fro - (no description) -30714 - Green Puffy Fro - (no description) -30715 - Blue Puffy Fro - (no description) -30716 - Purple Puffy Fro - (no description) -30717 - Brown Puffy Fro - (no description) -30720 - Black Exotica - (no description) -30721 - Red Exotica - (no description) -30722 - Orange Exotica - (no description) -30723 - Blonde Exotica - (no description) -30724 - Green Exotica - (no description) -30725 - Blue Exotica - (no description) -30726 - Purple Exotica - (no description) -30727 - Brown Exotica - (no description) -30730 - Black Roving Rockstar - (no description) -30731 - Red Roving Rockstar - (no description) -30732 - Orange Roving Rockstar - (no description) -30733 - Blonde Roving Rockstar - (no description) -30734 - Green Roving Rockstar - (no description) -30735 - Blue Roving Rockstar - (no description) -30736 - Purple Roving Rockstar - (no description) -30737 - Brown Roving Rockstar - (no description) -30740 - Black Receding Hair - (no description) -30741 - Red Receding Hair - (no description) -30742 - Orange Receding Hair - (no description) -30743 - Blonde Receding Hair - (no description) -30744 - Green Receding Hair - (no description) -30745 - Blue Receding Hair - (no description) -30746 - Purple Receding Hair - (no description) -30747 - Brown Receding Hair - (no description) -30750 - Black Buddha Fire - (no description) -30751 - Red Buddha Fire - (no description) -30752 - Orange Buddha Fire - (no description) -30753 - Blonde Buddha Fire - (no description) -30754 - Green Buddha Fire - (no description) -30755 - Blue Buddha Fire - (no description) -30756 - Purple Buddha Fire - (no description) -30757 - Brown Buddha Fire - (no description) -30760 - Black Bowling Ball - (no description) -30761 - Red Bowling Ball - (no description) -30762 - Orange Bowling Ball - (no description) -30763 - Blonde Bowling Ball - (no description) -30764 - Green Bowling Ball - (no description) -30765 - Blue Bowling Ball - (no description) -30766 - Purple Bowling Ball - (no description) -30767 - Brown Bowling Ball - (no description) -30770 - Black Lucky Charms - (no description) -30771 - Red Lucky Charms - (no description) -30772 - Orange Lucky Charms - (no description) -30773 - Blonde Lucky Charms - (no description) -30774 - Green Lucky Charms - (no description) -30775 - Blue Lucky Charms - (no description) -30776 - Purple Lucky Charms - (no description) -30777 - Brown Lucky Charms - (no description) -30780 - Black Dragon Tail - (no description) -30781 - Red Dragon Tail - (no description) -30782 - Orange Dragon Tail - (no description) -30783 - Blonde Dragon Tail - (no description) -30784 - Green Dragon Tail - (no description) -30785 - Blue Dragon Tail - (no description) -30786 - Purple Dragon Tail - (no description) -30787 - Brown Dragon Tail - (no description) -30790 - Black Lion Hair - (no description) -30791 - Red Lion Hair - (no description) -30792 - Orange Lion Hair - (no description) -30793 - Blonde Lion Hair - (no description) -30794 - Green Lion Hair - (no description) -30795 - Blue Lion Hair - (no description) -30796 - Purple Lion Hair - (no description) -30797 - Brown Lion Hair - (no description) -30800 - Black Dreamcatcher - (no description) -30801 - Red Dreamcatcher - (no description) -30802 - Orange Dreamcatcher - (no description) -30803 - Blonde Dreamcatcher - (no description) -30804 - Green Dreamcatcher - (no description) -30805 - Blue Dreamcatcher - (no description) -30806 - Purple Dreamcatcher - (no description) -30807 - Brown Dreamcatcher - (no description) -30810 - Black Gruff & Tough - (no description) -30811 - Red Gruff & Tough - (no description) -30812 - Orange Gruff & Tough - (no description) -30813 - Blonde Gruff & Tough - (no description) -30814 - Green Gruff & Tough - (no description) -30815 - Blue Gruff & Tough - (no description) -30816 - Purple Gruff & Tough - (no description) -30817 - Brown Gruff & Tough - (no description) -30820 - Black Matinee Idol - (no description) -30821 - Red Matinee Idol - (no description) -30822 - Orange Matinee Idol - (no description) -30823 - Blond Matinee Idol - (no description) -30824 - Green Matinee Idol - (no description) -30825 - Blue Matinee Idol - (no description) -30826 - Purple Matinee Idol - (no description) -30827 - Brown Matinee Idol - (no description) -30840 - Black Julian Hair - (no description) -30841 - Red Julian Hair - (no description) -30842 - Orange Julian Hair - (no description) -30843 - Blonde Julian Hair - (no description) -30844 - Green Julian Hair - (no description) -30845 - Blue Julian Hair - (no description) -30846 - Purple Julian Hair - (no description) -30847 - Brown Julian Hair - (no description) -30860 - Black Male Runway Hair - (no description) -30861 - Red Male Runway Hair - (no description) -30862 - Orange Male Runway Hair - (no description) -30863 - Blonde Male Runway Hair - (no description) -30864 - Green Male Runway Hair - (no description) -30865 - Blue Male Runway Hair - (no description) -30866 - Purple Male Runway Hair - (no description) -30867 - Brown Male Runway Hair - (no description) -30870 - Black Hector Hair - (no description) -30871 - Red Hector Hair - (no description) -30872 - Orange Hector Hair - (no description) -30873 - Blonde Hector Hair - (no description) -30874 - Green Hector Hair - (no description) -30875 - Blue Hector Hair - (no description) -30876 - Purple Hector Hair - (no description) -30877 - Brown Hector Hair - (no description) -30897 - Brown Eastern Mystery - (no description) -30896 - Purple Eastern Mystery - (no description) -30895 - Blue Eastern Mystery - (no description) -30894 - Green Eastern Mystery - (no description) -30893 - Yellow Eastern Mystery - (no description) -30892 - Orange Eastern Mystery - (no description) -30891 - Red Eastern Mystery - (no description) -30890 - Black Eastern Mystery - (no description) -30907 - Brown Kravitz Locks - (no description) -30906 - Purple Kravitz Locks - (no description) -30905 - Blue Kravitz Locks - (no description) -30904 - Green Kravitz Locks - (no description) -30903 - Yellow Kravitz Locks - (no description) -30902 - Orange Kravitz Locks - (no description) -30901 - Red Kravitz Locks - (no description) -30900 - Black Kravitz Locks - (no description) -30910 - Black Jun Pyo Hair - (no description) -30911 - Red Jun Pyo Hair - (no description) -30912 - Orange Jun Pyo Hair - (no description) -30913 - Yellow Jun Pyo Hair - (no description) -30914 - Green Jun Pyo Hair - (no description) -30915 - Blue Jun Pyo Hair - (no description) -30916 - Purple Jun Pyo Hair - (no description) -30917 - Brown Jun Pyo Hair - (no description) -30940 - Black Hip Hop Cut - (no description) -30941 - Red Hip Hop Cut - (no description) -30942 - Orange Hip Hop Cut - (no description) -30943 - Blond Hip Hop Cut - (no description) -30944 - Green Hip Hop Cut - (no description) -30945 - Blue Hip Hop Cut - (no description) -30946 - Purple Hip Hop Cut - (no description) -30947 - Brown Hip Hop Cut - (no description) -31000 - Black Sammy - (no description) -31001 - Red Sammy - (no description) -31002 - Orange Sammy - (no description) -31003 - Blonde Sammy - (no description) -31004 - Green Sammy - (no description) -31005 - Blue Sammy - (no description) -31006 - Purple Sammy - (no description) -31007 - Brown Sammy - (no description) -31010 - Black Veronica - (no description) -31011 - Red Veronica - (no description) -31012 - Orange Veronica - (no description) -31013 - Blonde Veronica - (no description) -31014 - Green Veronica - (no description) -31015 - Blue Veronica - (no description) -31016 - Purple Veronica - (no description) -31017 - Brown Veronica - (no description) -31020 - Black Francesca - (no description) -31021 - Red Francesca - (no description) -31022 - Orange Francesca - (no description) -31023 - Blonde Francesca - (no description) -31024 - Green Francesca - (no description) -31025 - Blue Francesca - (no description) -31026 - Purple Francesca - (no description) -31027 - Brown Francesca - (no description) -31030 - Black Polly - (no description) -31031 - Red Polly - (no description) -31032 - Orange Polly - (no description) -31033 - Blonde Polly - (no description) -31034 - Green Polly - (no description) -31035 - Blue Polly - (no description) -31036 - Purple Polly - (no description) -31037 - Brown Polly - (no description) -31040 - Black Edgy - (no description) -31041 - Red Edgy - (no description) -31042 - Orange Edgy - (no description) -31043 - Blonde Edgy - (no description) -31044 - Green Edgy - (no description) -31045 - Blue Edgy - (no description) -31046 - Purple Edgy - (no description) -31047 - Brown Edgy - (no description) -31050 - Black Connie - (no description) -31051 - Red Connie - (no description) -31052 - Orange Connie - (no description) -31053 - Blonde Connie - (no description) -31054 - Green Connie - (no description) -31055 - Blue Connie - (no description) -31056 - Purple Connie - (no description) -31057 - Brown Connie - (no description) -31060 - Black Annie - (no description) -31061 - Red Annie - (no description) -31062 - Orange Annie - (no description) -31063 - Blonde Annie - (no description) -31064 - Green Annie - (no description) -31065 - Blue Annie - (no description) -31066 - Purple Annie - (no description) -31067 - Brown Annie - (no description) -31070 - Black Stella - (no description) -31071 - Red Stella - (no description) -31072 - Orange Stella - (no description) -31073 - Blonde Stella - (no description) -31074 - Green Stella - (no description) -31075 - Blue Stella - (no description) -31076 - Purple Stella - (no description) -31077 - Brown Stella - (no description) -31080 - Black Rainbow - (no description) -31081 - Red Rainbow - (no description) -31082 - Orange Rainbow - (no description) -31083 - Blonde Rainbow - (no description) -31084 - Green Rainbow - (no description) -31085 - Blue Rainbow - (no description) -31086 - Purple Rainbow - (no description) -31087 - Brown Rainbow - (no description) -31090 - Black Bridget - (no description) -31091 - Red Bridget - (no description) -31092 - Orange Bridget - (no description) -31093 - Blonde Bridget - (no description) -31094 - Green Bridget - (no description) -31095 - Blue Bridget - (no description) -31096 - Purple Bridget - (no description) -31097 - Brown Bridget - (no description) -31100 - Black Mary - (no description) -31101 - Red Mary - (no description) -31102 - Orange Mary - (no description) -31103 - Blonde Mary - (no description) -31104 - Green Mary - (no description) -31105 - Blue Mary - (no description) -31106 - Purple Mary - (no description) -31107 - Brown Mary - (no description) -31110 - Black Monica - (no description) -31111 - Red Monica - (no description) -31112 - Orange Monica - (no description) -31113 - Blonde Monica - (no description) -31114 - Green Monica - (no description) -31115 - Blue Monica - (no description) -31116 - Purple Monica - (no description) -31117 - Brown Monica - (no description) -31120 - Black Miru - (no description) -31121 - Red Miru - (no description) -31122 - Orange Miru - (no description) -31123 - Blonde Miru - (no description) -31124 - Green Miru - (no description) -31125 - Blue Miru - (no description) -31126 - Purple Miru - (no description) -31127 - Brown Miru - (no description) -31130 - Black Jolie - (no description) -31131 - Red Jolie - (no description) -31132 - Orange Jolie - (no description) -31133 - Blonde Jolie - (no description) -31134 - Green Jolie - (no description) -31135 - Blue Jolie - (no description) -31136 - Purple Jolie - (no description) -31137 - Brown Jolie - (no description) -31140 - Black Pei Pei - (no description) -31141 - Red Pei Pei - (no description) -31142 - Orange Pei Pei - (no description) -31143 - Blonde Pei Pei - (no description) -31144 - Green Pei Pei - (no description) -31145 - Blue Pei Pei - (no description) -31146 - Purple Pei Pei - (no description) -31147 - Brown Pei Pei - (no description) -31150 - Black Angelica - (no description) -31151 - Red Angelica - (no description) -31152 - Orange Angelica - (no description) -31153 - Blonde Angelica - (no description) -31154 - Green Angelica - (no description) -31155 - Blue Angelica - (no description) -31156 - Purple Angelica - (no description) -31157 - Brown Angelica - (no description) -31160 - Black Lori - (no description) -31161 - Red Lori - (no description) -31162 - Orange Lori - (no description) -31163 - Blonde Lori - (no description) -31164 - Green Lori - (no description) -31165 - Blue Lori - (no description) -31166 - Purple Lori - (no description) -31167 - Brown Lori - (no description) -31170 - Black Rastafari - (no description) -31171 - Red Rastafari - (no description) -31172 - Orange Rastafari - (no description) -31173 - Blonde Rastafari - (no description) -31174 - Green Rastafari - (no description) -31175 - Blue Rastafari - (no description) -31176 - Purple Rastafari - (no description) -31177 - Brown Rastafari - (no description) -31180 - Black Cutey Doll - (no description) -31181 - Red Cutey Doll - (no description) -31182 - Orange Cutey Doll - (no description) -31183 - Blonde Cutey Doll - (no description) -31184 - Green Cutey Doll - (no description) -31185 - Blue Cutey Doll - (no description) -31186 - Purple Cutey Doll - (no description) -31187 - Brown Cutey Doll - (no description) -31190 - Black Celeb - (no description) -31191 - Red Celeb - (no description) -31192 - Orange Celeb - (no description) -31193 - Blonde Celeb - (no description) -31194 - Green Celeb - (no description) -31195 - Blue Celeb - (no description) -31196 - Purple Celeb - (no description) -31197 - Brown Celeb - (no description) -31200 - Black Holla' Back Do - (no description) -31201 - Red Holla' Back Do - (no description) -31202 - Orange Holla' Back Do - (no description) -31203 - Blonde Holla' Back Do - (no description) -31204 - Green Holla' Back Do - (no description) -31205 - Blue Holla' Back Do - (no description) -31206 - Purple Holla' Back Do - (no description) -31207 - Brown Holla' Back Do - (no description) -31210 - Black Perfect Stranger - (no description) -31211 - Red Perfect Stranger - (no description) -31212 - Orange Perfect Stranger - (no description) -31213 - Blonde Perfect Stranger - (no description) -31214 - Green Perfect Stranger - (no description) -31215 - Blue Perfect Stranger - (no description) -31216 - Purple Perfect Stranger - (no description) -31217 - Brown Perfect Stranger - (no description) -31220 - Black Caspia - (no description) -31221 - Red Caspia - (no description) -31222 - Orange Caspia - (no description) -31223 - Blonde Caspia - (no description) -31224 - Green Caspia - (no description) -31225 - Blue Caspia - (no description) -31226 - Purple Caspia - (no description) -31227 - Brown Caspia - (no description) -31230 - Black Rose - (no description) -31231 - Red Rose - (no description) -31232 - Orange Rose - (no description) -31233 - Blonde Rose - (no description) -31234 - Green Rose - (no description) -31235 - Blue Rose - (no description) -31236 - Purple Rose - (no description) -31237 - Brown Rose - (no description) -31240 - Black Disheveled - (no description) -31241 - Red Disheveled - (no description) -31242 - Orange Disheveled - (no description) -31243 - Blonde Disheveled - (no description) -31244 - Green Disheveled - (no description) -31245 - Blue Disheveled - (no description) -31246 - Purple Disheveled - (no description) -31247 - Brown Disheveled - (no description) -31250 - Black Bowlcut - (no description) -31251 - Red Bowlcut - (no description) -31252 - Orange Bowlcut - (no description) -31253 - Blonde Bowlcut - (no description) -31254 - Green Bowlcut - (no description) -31255 - Blue Bowlcut - (no description) -31256 - Purple Bowlcut - (no description) -31257 - Brown Bowlcut - (no description) -31260 - Black Daisy Do - (no description) -31261 - Red Daisy Do - (no description) -31262 - Orange Daisy Do - (no description) -31263 - Blonde Daisy Do - (no description) -31264 - Green Daisy Do - (no description) -31265 - Blue Daisy Do - (no description) -31266 - Purple Daisy Do - (no description) -31267 - Brown Daisy Do - (no description) -31270 - Black Pigtails - (no description) -31271 - Red Pigtails - (no description) -31272 - Orange Pigtails - (no description) -31273 - Blonde Pigtails - (no description) -31274 - Green Pigtails - (no description) -31275 - Blue Pigtails - (no description) -31276 - Purple Pigtails - (no description) -31277 - Brown Pigtails - (no description) -31280 - Black Ellie - (no description) -31281 - Red Ellie - (no description) -31282 - Orange Ellie - (no description) -31283 - Blonde Ellie - (no description) -31284 - Green Ellie - (no description) -31285 - Blue Ellie - (no description) -31286 - Purple Ellie - (no description) -31287 - Brown Ellie - (no description) -31290 - Black Naomi - (no description) -31291 - Red Naomi - (no description) -31292 - Orange Naomi - (no description) -31293 - Blonde Naomi - (no description) -31294 - Green Naomi - (no description) -31295 - Blue Naomi - (no description) -31296 - Purple Naomi - (no description) -31297 - Brown Naomi - (no description) -31300 - Black Chantelle - (no description) -31301 - Red Chantelle - (no description) -31302 - Orange Chantelle - (no description) -31303 - Blonde Chantelle - (no description) -31304 - Green Chantelle - (no description) -31305 - Blue Chantelle - (no description) -31306 - Purple Chantelle - (no description) -31307 - Brown Chantelle - (no description) -31310 - Black Carla - (no description) -31311 - Red Carla - (no description) -31312 - Orange Carla - (no description) -31313 - Blonde Carla - (no description) -31314 - Green Carla - (no description) -31315 - Blue Carla - (no description) -31316 - Purple Carla - (no description) -31317 - Brown Carla - (no description) -31320 - Black Roxy - (no description) -31321 - Red Roxy - (no description) -31322 - Orange Roxy - (no description) -31323 - Blonde Roxy - (no description) -31324 - Green Roxy - (no description) -31325 - Blue Roxy - (no description) -31326 - Purple Roxy - (no description) -31327 - Brown Roxy - (no description) -31330 - Black Penelope - (no description) -31331 - Red Penelope - (no description) -31332 - Orange Penelope - (no description) -31333 - Blonde Penelope - (no description) -31334 - Green Penelope - (no description) -31335 - Blue Penelope - (no description) -31336 - Purple Penelope - (no description) -31337 - Brown Penelope - (no description) -31340 - Black Rae - (no description) -31341 - Red Rae - (no description) -31342 - Orange Rae - (no description) -31343 - Blonde Rae - (no description) -31344 - Green Rae - (no description) -31345 - Blue Rae - (no description) -31346 - Purple Rae - (no description) -31347 - Brown Rae - (no description) -31350 - Black Fourtail Braids - (no description) -31351 - Red Fourtail Braids - (no description) -31352 - Orange Fourtail Braids - (no description) -31353 - Blonde Fourtail Braids - (no description) -31354 - Green Fourtail Braids - (no description) -31355 - Blue Fourtail Braids - (no description) -31356 - purple Fourtail Braids - (no description) -31357 - Brown Fourtail Braids - (no description) -31400 - Black Boyish - (no description) -31401 - Red Boyish - (no description) -31402 - Orange Boyish - (no description) -31403 - Blonde Boyish - (no description) -31404 - Green Boyish - (no description) -31405 - Blue Boyish - (no description) -31406 - Purple Boyish - (no description) -31407 - Brown Boyish - (no description) -31410 - Black Paula - (no description) -31411 - Red Paula - (no description) -31412 - Orange Paula - (no description) -31413 - Blonde Paula - (no description) -31414 - Green Paula - (no description) -31415 - Blue Paula - (no description) -31416 - Purple Paula - (no description) -31417 - Brown Paula - (no description) -31420 - Black Lana - (no description) -31421 - Red Lana - (no description) -31422 - Orange Lana - (no description) -31423 - Blonde Lana - (no description) -31424 - Green Lana - (no description) -31425 - Blue Lana - (no description) -31426 - Purple Lana - (no description) -31427 - Brown Lana - (no description) -31430 - Skin Head - (no description) -31431 - Skin Head - (no description) -31432 - Skin Head - (no description) -31433 - Skin Head - (no description) -31434 - Skin Head - (no description) -31435 - Skin Head - (no description) -31436 - Skin Head - (no description) -31437 - Skin Head - (no description) -31440 - Black Ravishing Raven - (no description) -31441 - Red Ravishing Raven - (no description) -31442 - Orange Ravishing Raven - (no description) -31443 - Blonde Ravishing Raven - (no description) -31444 - Green Ravishing Raven - (no description) -31445 - Blue Ravishing Raven - (no description) -31446 - Purple Ravishing Raven - (no description) -31447 - Brown Ravishing Raven - (no description) -31450 - Black Fluffy Dolly - (no description) -31451 - Red Fluffy Dolly - (no description) -31452 - Orange Fluffy Dolly - (no description) -31453 - Blonde Fluffy Dolly - (no description) -31454 - Green Fluffy Dolly - (no description) -31455 - Blue Fluffy Dolly - (no description) -31456 - Purple Fluffy Dolly - (no description) -31457 - Brown Fluffy Dolly - (no description) -31460 - Black Lady Mariko - (no description) -31461 - Red Lady Mariko - (no description) -31462 - Orange Lady Mariko - (no description) -31463 - Blonde Lady Mariko - (no description) -31464 - Green Lady Mariko - (no description) -31465 - Blue Lady Mariko - (no description) -31466 - Purple Lady Mariko - (no description) -31467 - Brown Lady Mariko - (no description) -31470 - Black Ming Ming - (no description) -31471 - Red Ming Ming - (no description) -31472 - Orange Ming Ming - (no description) -31473 - Blonde Ming Ming - (no description) -31474 - Green Ming Ming - (no description) -31475 - Blue Ming Ming - (no description) -31476 - Purple Ming Ming - (no description) -31477 - Brown Ming Ming - (no description) -31480 - Black Classy Sass - (no description) -31481 - Red Classy Sass - (no description) -31482 - Orange Classy Sass - (no description) -31483 - Blonde Classy Sass - (no description) -31484 - Green Classy Sass - (no description) -31485 - Blue Classy Sass - (no description) -31486 - Purple Classy Sass - (no description) -31487 - Brown Classy Sass - (no description) -31490 - Black Cecelia Twist - (no description) -31491 - Red Cecelia Twist - (no description) -31492 - Orange Cecelia Twist - (no description) -31493 - Blonde Cecelia Twist - (no description) -31494 - Green Cecelia Twist - (no description) -31495 - Blue Cecelia Twist - (no description) -31496 - Purple Cecelia Twist - (no description) -31497 - Brown Cecelia Twist - (no description) -31510 - Black Minnie - (no description) -31511 - Red Minnie - (no description) -31512 - Orange Minnie - (no description) -31513 - Blonde Minnie - (no description) -31514 - Green Minnie - (no description) -31515 - Blue Minnie - (no description) -31516 - Purple Minnie - (no description) -31517 - Brown Minnie - (no description) -31520 - Black Curly Stream - (no description) -31521 - Red Curly Stream - (no description) -31522 - Orange Curly Stream - (no description) -31523 - Blonde Curly Stream - (no description) -31524 - Green Curly Stream - (no description) -31525 - Blue Curly Stream - (no description) -31526 - Purple Curly Stream - (no description) -31527 - Brown Curly Stream - (no description) -31530 - Black Zessica - (no description) -31531 - Red Zessica - (no description) -31532 - Orange Zessica - (no description) -31533 - Blonde Zessica - (no description) -31534 - Green Zessica - (no description) -31535 - Blue Zessica - (no description) -31536 - Purple Zessica - (no description) -31537 - Brown Zessica - (no description) -31540 - Black Jean - (no description) -31541 - Red Jean - (no description) -31542 - Orange Jean - (no description) -31543 - Blonde Jean - (no description) -31544 - Green Jean - (no description) -31545 - Blue Jean - (no description) -31546 - Purple Jean - (no description) -31547 - Brown Jean - (no description) -31550 - Black Candy Heart - (no description) -31551 - Red Candy Heart - (no description) -31552 - Orange Candy Heart - (no description) -31553 - Blonde Candy Heart - (no description) -31554 - Green Candy Heart - (no description) -31555 - Blue Candy Heart - (no description) -31556 - Purple Candy Heart - (no description) -31557 - Brown Candy Heart - (no description) -31560 - Black Sunflower Power - (no description) -31561 - Red Sunflower Power - (no description) -31562 - Orange Sunflower Power - (no description) -31563 - Blonde Sunflower Power - (no description) -31564 - Green Sunflower Power - (no description) -31565 - Blue Sunflower Power - (no description) -31566 - Purple Sunflower Power - (no description) -31567 - Brown Sunflower Power - (no description) -31570 - Black Maiden's Weave - (no description) -31571 - Red Maiden's Weave - (no description) -31572 - Orange Maiden's Weave - (no description) -31573 - Blonde Maiden's Weave - (no description) -31574 - Green Maiden's Weave - (no description) -31575 - Blue Maiden's Weave - (no description) -31576 - Purple Maiden's Weave - (no description) -31577 - Brown Maiden's Weave - (no description) -31580 - Black Victorian Wrap - (no description) -31581 - Red Victorian Wrap - (no description) -31582 - Orange Victorian Wrap - (no description) -31583 - Blonde Victorian Wrap - (no description) -31584 - Green Victorian Wrap - (no description) -31585 - Blue Victorian Wrap - (no description) -31586 - Purple Victorian Wrap - (no description) -31587 - Brown Victorian Wrap - (no description) -31590 - Black Ballroom Classic - (no description) -31591 - Red Ballroom Classic - (no description) -31592 - Orange Ballroom Classic - (no description) -31593 - Blonde Ballroom Classic - (no description) -31594 - Green Ballroom Classic - (no description) -31595 - Blue Ballroom Classic - (no description) -31596 - Purple Ballroom Classic - (no description) -31597 - Brown Ballroom Classic - (no description) -31600 - Black Tall Bun - (no description) -31601 - Red Tall Bun - (no description) -31602 - Orange Tall Bun - (no description) -31603 - Blonde Tall Bun - (no description) -31604 - Green Tall Bun - (no description) -31605 - Blue Tall Bun - (no description) -31606 - Purple Tall Bun - (no description) -31607 - Brown Tall Bun - (no description) -31610 - Black Darling Diva - (no description) -31611 - Red Darling Diva - (no description) -31612 - Orange Darling Diva - (no description) -31613 - Blonde Darling Diva - (no description) -31614 - Green Darling Diva - (no description) -31615 - Blue Darling Diva - (no description) -31616 - Purple Darling Diva - (no description) -31617 - Brown Darling Diva - (no description) -31620 - Black Desert Flower - (no description) -31621 - Red Desert Flower - (no description) -31622 - Orange Desert Flower - (no description) -31623 - Blonde Desert Flower - (no description) -31624 - Green Desert Flower - (no description) -31625 - Blue Desert Flower - (no description) -31626 - Purple Desert Flower - (no description) -31627 - Brown Desert Flower - (no description) -31630 - Black The Honeybun - (no description) -31631 - Red The Honeybun - (no description) -31632 - Orange The Honeybun - (no description) -31633 - Blonde The Honeybun - (no description) -31634 - Green The Honeybun - (no description) -31635 - Blue The Honeybun - (no description) -31636 - Purple The Honeybun - (no description) -31637 - Brown The Honeybun - (no description) -31640 - Black Sonara Wave - (no description) -31641 - Red Sonara Wave - (no description) -31642 - Orange Sonara Wave - (no description) -31643 - Blonde Sonara Wave - (no description) -31644 - Green Sonara Wave - (no description) -31645 - Blue Sonara Wave - (no description) -31646 - Purple Sonara Wave - (no description) -31647 - Brown Sonara Wave - (no description) -31650 - Black Dashing Damsel - (no description) -31651 - Red Dashing Damsel - (no description) -31652 - Orange Dashing Damsel - (no description) -31653 - Blonde Dashing Damsel - (no description) -31654 - Green Dashing Damsel - (no description) -31655 - Blue Dashing Damsel - (no description) -31656 - Purple Dashing Damsel - (no description) -31657 - Brown Dashing Damsel - (no description) -31670 - Black Grandma ma' - (no description) -31671 - Red Grandma ma' - (no description) -31672 - Orange Grandma ma' - (no description) -31673 - Blonde Grandma ma' - (no description) -31674 - Green Grandma ma' - (no description) -31675 - Blue Grandma ma' - (no description) -31676 - Purple Grandma ma' - (no description) -31677 - Brown Grandma ma' - (no description) -31680 - Black Lovely Ladyhawk - (no description) -31681 - Red Lovely Ladyhawk - (no description) -31682 - Orange Lovely Ladyhawk - (no description) -31683 - Blonde Lovely Ladyhawk - (no description) -31684 - Green Lovely Ladyhawk - (no description) -31685 - Blue Lovely Ladyhawk - (no description) -31686 - Purple Lovely Ladyhawk - (no description) -31687 - Brown Lovely Ladyhawk - (no description) -31690 - Black Demolishing Diva - (no description) -31691 - Red Demolishing Diva - (no description) -31692 - Orange Demolishing Diva - (no description) -31693 - Blonde Demolishing Diva - (no description) -31694 - Green Demolishing Diva - (no description) -31695 - Blue Demolishing Diva - (no description) -31696 - Purple Demolishing Diva - (no description) -31697 - Brown Demolishing Diva - (no description) -31700 - Black Crazy Medusa - (no description) -31701 - Red Crazy Medusa - (no description) -31702 - Orange Crazy Medusa - (no description) -31703 - Blonde Crazy Medusa - (no description) -31704 - Green Crazy Medusa - (no description) -31705 - Blue Crazy Medusa - (no description) -31706 - Purple Crazy Medusa - (no description) -31707 - Brown Crazy Medusa - (no description) -31710 - Black Princess Warrior - (no description) -31711 - Red Princess Warrior - (no description) -31712 - Orange Princess Warrior - (no description) -31713 - Blonde Princess Warrior - (no description) -31714 - Green Princess Warrior - (no description) -31715 - Blue Princess Warrior - (no description) -31716 - Purple Princess Warrior - (no description) -31717 - Brown Princess Warrior - (no description) -31720 - Black Streaky Siren - (no description) -31721 - Red Streaky Siren - (no description) -31722 - Orange Streaky Siren - (no description) -31723 - Blonde Streaky Siren - (no description) -31724 - Green Streaky Siren - (no description) -31725 - Blue Streaky Siren - (no description) -31726 - Purple Streaky Siren - (no description) -31727 - Brown Streaky Siren - (no description) -31730 - Black Model's Ambition - (no description) -31731 - Red Model's Ambition - (no description) -31732 - Orange Model's Ambition - (no description) -31733 - Blonde Model's Ambition - (no description) -31734 - Green Model's Ambition - (no description) -31735 - Blue Model's Ambition - (no description) -31736 - Purple Model's Ambition - (no description) -31737 - Brown Model's Ambition - (no description) -31740 - Black Frizzle Dizzle - (no description) -31741 - Red Frizzle Dizzle - (no description) -31742 - Orange Frizzle Dizzle - (no description) -31743 - Blonde Frizzle Dizzle - (no description) -31744 - Green Frizzle Dizzle - (no description) -31745 - Blue Frizzle Dizzle - (no description) -31746 - Purple Frizzle Dizzle - (no description) -31747 - Brown Frizzle Dizzle - (no description) -31750 - Black Super Diva - (no description) -31751 - Red Super Diva - (no description) -31752 - Orange Super Diva - (no description) -31753 - Blonde Super Diva - (no description) -31754 - Green Super Diva - (no description) -31755 - Blue Super Diva - (no description) -31756 - Purple Super Diva - (no description) -31757 - Brown Super Diva - (no description) -31760 - Black Shaggy Dog - (no description) -31761 - Red Shaggy Dog - (no description) -31762 - Orange Shaggy Dog - (no description) -31763 - Blonde Shaggy Dog - (no description) -31764 - Green Shaggy Dog - (no description) -31765 - Blue Shaggy Dog - (no description) -31766 - Purple Shaggy Dog - (no description) -31767 - Brown Shaggy Dog - (no description) -31770 - Black Short Shaggy Hair - (no description) -31771 - Red Short Shaggy Hair - (no description) -31772 - Orange Short Shaggy Hair - (no description) -31773 - Blonde Short Shaggy Hair - (no description) -31774 - Green Short Shaggy Hair - (no description) -31775 - Blue Short Shaggy Hair - (no description) -31776 - Brown Short Shaggy Hair - (no description) -31777 - Purple Short Shaggy Hair - (no description) -31790 - Black Princessa - (no description) -31791 - Red Princessa - (no description) -31792 - Orange Princessa - (no description) -31793 - Blonde Princessa - (no description) -31794 - Green Princessa - (no description) -31795 - Blue Princessa - (no description) -31796 - Purple Princessa - (no description) -31797 - Brown Princessa - (no description) -31800 - Black Onna's Honor - (no description) -31801 - Red Onna's Honor - (no description) -31802 - Orange Onna's Honor - (no description) -31803 - Blonde Onna's Honor - (no description) -31804 - Green Onna's Honor - (no description) -31805 - Blue Onna's Honor - (no description) -31806 - Purple Onna's Honor - (no description) -31807 - Brown Onna's Honor - (no description) -31810 - Black Apple Hair - (no description) -31811 - Red Apple Hair - (no description) -31812 - Orange Apple Hair - (no description) -31813 - Blonde Apple Hair - (no description) -31814 - Green Apple Hair - (no description) -31815 - Blue Apple Hair - (no description) -31816 - Purple Apple Hair - (no description) -31817 - Brown Apple Hair - (no description) -31830 - Black Eye-skimming Bang - (no description) -31831 - Red Eye-skimming Bang - (no description) -31832 - Orange Eye-skimming Bang - (no description) -31833 - Blonde Eye-skimming Bang - (no description) -31834 - Green Eye-skimming Bang - (no description) -31835 - Blue Eye-skimming Bang - (no description) -31836 - Purple Eye-skimming Bang - (no description) -31837 - Brown Eye-skimming Bang - (no description) -31840 - Black Female Runway Hair - (no description) -31841 - Red Female Runway Hair - (no description) -31842 - Orange Female Runway Hair - (no description) -31843 - Blonde Female Runway Hair - (no description) -31844 - Green Female Runway Hair - (no description) -31845 - Blue Female Runway Hair - (no description) -31846 - Purple Female Runway Hair - (no description) -31847 - Brown Female Runway Hair - (no description) -31867 - Brown Laguna Beach - (no description) -31866 - Purple Laguna Beach - (no description) -31865 - Blue Laguna Beach - (no description) -31864 - Green Laguna Beach - (no description) -31863 - Yellow Laguna Beach - (no description) -31862 - Orange Laguna Beach - (no description) -31861 - Red Laguna Beach - (no description) -31860 - Black Laguna Beach - (no description) -31877 - Brown Ayu - (no description) -31876 - Purple Ayu - (no description) -31875 - Blue Ayu - (no description) -31874 - Green Ayu - (no description) -31873 - Yellow Ayu - (no description) -31872 - Orange Ayu - (no description) -31871 - Red Ayu - (no description) -31870 - Black Ayu - (no description) -31880 - Black Gardener - (no description) -31881 - Red Gardener - (no description) -31882 - Orange Gardener - (no description) -31883 - Blond Gardener - (no description) -31884 - Green Gardener - (no description) -31885 - Blue Gardener - (no description) -31886 - Purple Gardener - (no description) -31887 - Brown Gardener - (no description) -31890 - Black Short Twin Tails - (no description) -31891 - Red Short Twin Tails - (no description) -31892 - Orange Short Twin Tails - (no description) -31893 - Blond Short Twin Tails - (no description) -31894 - Green Short Twin Tails - (no description) -31895 - Blue Short Twin Tails - (no description) -31896 - Purple Short Twin Tails - (no description) -31897 - Brown Short Twin Tails - (no description) -31910 - Black Housewife - (no description) -31911 - Red Housewife - (no description) -31912 - Orange Housewife - (no description) -31913 - Blond Housewife - (no description) -31914 - Green Housewife - (no description) -31915 - Blue Housewife - (no description) -31916 - Purple Housewife - (no description) -31917 - Brown Housewife - (no description) -31940 - Black Spunky Do - (no description) -31941 - Red Spunky Do - (no description) -31942 - Orange Spunky Do - (no description) -31943 - Blond Spunky Do - (no description) -31944 - Green Spunky Do - (no description) -31945 - Blue Spunky Do - (no description) -31946 - Purple Spunky Do - (no description) -31947 - Brown Spunky Do - (no description) -30830 - Black Alex - (no description) -30831 - Red Alex - (no description) -30832 - Orange Alex - (no description) -30833 - Blond Alex - (no description) -30834 - Green Alex - (no description) -30835 - Blue Alex - (no description) -30836 - Purple Alex - (no description) -30837 - Brown Alex - (no description) -30850 - Black Cornrow - (no description) -30851 - Red Cornrow - (no description) -30852 - Orange Cornrow - (no description) -30853 - Blond Cornrow - (no description) -30854 - Green Cornrow - (no description) -30855 - Blue Cornrow - (no description) -30856 - Purple Cornrow - (no description) -30857 - Brown Cornrow - (no description) -30880 - Black Unbalanced - (no description) -30881 - Red Unbalanced - (no description) -30882 - Orange Unbalanced - (no description) -30883 - Blond Unbalanced - (no description) -30884 - Green Unbalanced - (no description) -30885 - Blue Unbalanced - (no description) -30886 - Purple Unbalanced - (no description) -30887 - Brown Unbalanced - (no description) -31820 - Black Grace - (no description) -31821 - Red Grace - (no description) -31822 - Orange Grace - (no description) -31823 - Blond Grace - (no description) -31824 - Green Grace - (no description) -31825 - Blue Grace - (no description) -31826 - Purple Grace - (no description) -31827 - Brown Grace - (no description) -31850 - Black Dambi - (no description) -31851 - Red Dambi - (no description) -31852 - Orange Dambi - (no description) -31853 - Blonde Dambi - (no description) -31854 - Green Dambi - (no description) -31855 - Blue Dambi - (no description) -31856 - Purple Dambi - (no description) -31857 - Brown Dambi - (no description) -30920 - Black Short Top Tail - (no description) -30921 - Red Short Top Tail - (no description) -30922 - Orange Short Top Tail - (no description) -30923 - Blonde Short Top Tail - (no description) -30924 - Green Short Top Tail - (no description) -30925 - Blue Short Top Tail - (no description) -30926 - Purple Short Top Tail - (no description) -30927 - Brown Short Top Tail - (no description) -31920 - Black CL Hair - (no description) -31921 - Red CL Hair - (no description) -31922 - Orange CL Hair - (no description) -31923 - Yellow CL Hair - (no description) -31924 - Green CL Hair - (no description) -31925 - Blue CL Hair - (no description) -31926 - Purple CL Hair - (no description) -31927 - Brown CL Hair - (no description) -30930 - Black Boy Band Cut - (no description) -30931 - Red Boy Band Cut - (no description) -30932 - Orange Boy Band Cut - (no description) -30933 - Blond Boy Band Cut - (no description) -30934 - Green Boy Band Cut - (no description) -30935 - Blue Boy Band Cut - (no description) -30936 - Purple Boy Band Cut - (no description) -30937 - Brown Boy Band Cut - (no description) -30950 - Black Volume Cut - (no description) -30951 - Red Volume Cut - (no description) -30952 - Orange Volume Cut - (no description) -30953 - Blond Volume Cut - (no description) -30954 - Green Volume Cut - (no description) -30955 - Blue Volume Cut - (no description) -30956 - Purple Volume Cut - (no description) -30957 - Brown Volume Cut - (no description) -31780 - ??? ???? ?? - (no description) -31781 - ??? ???? ?? - (no description) -31782 - ??? ???? ?? - (no description) -31783 - ??? ???? ?? - (no description) -31784 - ??? ???? ?? - (no description) -31785 - ??? ???? ?? - (no description) -31786 - ??? ???? ?? - (no description) -31787 - ?? ???? ?? - (no description) -31930 - Black Bowl Cut - (no description) -31931 - Red Bowl Cut - (no description) -31932 - Orange Bowl Cut - (no description) -31933 - Blond Bowl Cut - (no description) -31934 - Green Bowl Cut - (no description) -31935 - Blue Bowl Cut - (no description) -31936 - Purple Bowl Cut - (no description) -31937 - Brown Bowl Cut - (no description) -31950 - Black Vintage Flip - (no description) -31951 - Red Vintage Flip - (no description) -31952 - Orange Vintage Flip - (no description) -31953 - Blond Vintage Flip - (no description) -31954 - Green Vintage Flip - (no description) -31955 - Blue Vintage Flip - (no description) -31956 - Purple Vintage Flip - (no description) -31957 - Brown Vintage Flip - (no description) -30990 - Black Tentacle Hair - (no description) -30991 - Red Tentacle Hair - (no description) -30992 - Orange Tentacle Hair - (no description) -30993 - Blond Tentacle Hair - (no description) -30994 - Green Tentacle Hair - (no description) -30995 - Blue Tentacle Hair - (no description) -30996 - Purple Tentacle Hair - (no description) -30997 - Brown Tentacle Hair - (no description) -33000 - Black Prince Cut - (no description) -33001 - Red Prince Cut - (no description) -33002 - Orange Prince Cut - (no description) -33003 - Blond Prince Cut - (no description) -33004 - Green Prince Cut - (no description) -33005 - Blue Prince Cut - (no description) -33006 - Purple Prince Cut - (no description) -33007 - Brown Prince Cut - (no description) -34000 - Black Palm Tree Hair - (no description) -34001 - Red Palm Tree Hair - (no description) -34002 - Orange Palm Tree Hair - (no description) -34003 - Blond Palm Tree Hair - (no description) -34004 - Green Palm Tree Hair - (no description) -34005 - Blue Palm Tree Hair - (no description) -34006 - Purple Palm Tree Hair - (no description) -34007 - Brown Palm Tree Hair - (no description) -34010 - Black Rollered Hair - (no description) -34011 - Red Rollered Hair - (no description) -34012 - Orange Rollered Hair - (no description) -34013 - Blond Rollered Hair - (no description) -34014 - Green Rollered Hair - (no description) -34015 - Blue Rollered Hair - (no description) -34016 - Purple Rollered Hair - (no description) -34017 - Brown Rollered Hair - (no description) -34020 - Black School Girl Hair - (no description) -34021 - Red School Girl Hair - (no description) -34022 - Orange School Girl Hair - (no description) -34023 - Blond School Girl Hair - (no description) -34024 - Green School Girl Hair - (no description) -34025 - Blue School Girl Hair - (no description) -34026 - Purple School Girl Hair - (no description) -34027 - Brown School Girl Hair - (no description) -34030 - Black Designer Hair - (no description) -34031 - Red Designer Hair - (no description) -34032 - Orange Designer Hair - (no description) -34033 - Blond Designer Hair - (no description) -34034 - Green Designer Hair - (no description) -34035 - Blue Designer Hair - (no description) -34036 - Purple Designer Hair - (no description) -34037 - Brown Designer Hair - (no description) -33040 - Black Aran Cut - (no description) -33041 - Red Aran Cut - (no description) -33042 - Orange Aran Cut - (no description) -33043 - Blond Aran Cut - (no description) -33044 - Green Aran Cut - (no description) -33045 - Blue Aran Cut - (no description) -33046 - Purple Aran Cut - (no description) -33047 - Brown Aran Cut - (no description) -34050 - Black Aran Hair - (no description) -34051 - Red Aran Hair - (no description) -34052 - Orange Aran Hair - (no description) -34053 - Blond Aran Hair - (no description) -34054 - Green Aran Hair - (no description) -34055 - Blue Aran Hair - (no description) -34056 - Purple Aran Hair - (no description) -34057 - Brown Aran Hair - (no description) -33100 - Black The Coco - (no description) -33102 - Orange The Coco - (no description) -33103 - Blond The Coco - (no description) -33104 - Green The Coco - (no description) -33105 - Blue The Coco - (no description) -33106 - Purple The CoCo - (no description) -34110 - Black Full Bangs - (no description) -34111 - Red Full Bangs - (no description) -34112 - Orange Full Bangs - (no description) -34113 - Blond Full Bangs - (no description) -34114 - Green Full Bangs - (no description) -34115 - Blue Full Bangs - (no description) -34116 - Purple Full Bangs - (no description) -34117 - Brown Full Bangs - (no description) -33107 - Brown The Coco - (no description) diff --git a/tools/MapleIdRetriever/handbook/Equip/Longcoat.txt b/tools/MapleIdRetriever/handbook/Equip/Longcoat.txt deleted file mode 100644 index ba6195672d..0000000000 --- a/tools/MapleIdRetriever/handbook/Equip/Longcoat.txt +++ /dev/null @@ -1,485 +0,0 @@ -1050000 - White Crusader Chainmail - (no description) -1050001 - Brown Doros Robe - (no description) -1050002 - Blood Chaos Robe - (no description) -1050003 - Blue Wizard Robe - (no description) -1050004 - Blue Officer Uniform - (no description) -1050005 - Blue Kendo Robe - (no description) -1050006 - Red Kendo Robe - (no description) -1050007 - White Kendo Robe - (no description) -1050008 - Beige Plain Robe - (no description) -1050009 - Blue Plain Robe - (no description) -1050010 - Green Plain Robe - (no description) -1050011 - Black Dragon Robe - (no description) -1050012 - Grey Skull Overall - (no description) -1050013 - Red Skull Overall - (no description) -1050014 - Green Skull Overall - (no description) -1050015 - Blue Skull Overall - (no description) -1050016 - Orange Skull Overall - (no description) -1050017 - Yellow Tights - (no description) -1050018 - Blue Sauna Robe - If worn inside the hotel sauna, the recovery rate for HP and MP will increase 1.5x. -1050019 - Santa Costume - (no description) -1050020 - Paper Box - (no description) -1050021 - Blue Crusader Chainmail - (no description) -1050022 - Dark Crusader Chainmail - (no description) -1050023 - Blue Doros Robe - (no description) -1050024 - Yellow Doros Robe - (no description) -1050025 - White Doros Robe - (no description) -1050026 - White Wizard Robe - (no description) -1050027 - Black Mage Robe - (no description) -1050028 - Green Wizard Robe - (no description) -1050029 - Dark Chaos Robe - (no description) -1050030 - Blue Chaos Robe - (no description) -1050031 - White Chaos Robe - (no description) -1050032 - Silver Officer Uniform - (no description) -1050033 - Black Officer Uniform - (no description) -1050034 - Red Officer Uniform - (no description) -1050035 - Brown Starlight - (no description) -1050036 - Red Starlight - (no description) -1050037 - Green Starlight - (no description) -1050038 - Blue Starlight - (no description) -1050039 - Dark Starlight - (no description) -1050040 - Red Swimming Trunk - (no description) -1050041 - Blue Swimming Trunk - (no description) -1050042 - Fine Brown Hanbok - (no description) -1050043 - Fine Black Hanbok - (no description) -1050044 - Fine Blue Hanbok - (no description) -1050045 - Blue Calas - (no description) -1050046 - Red Calas - (no description) -1050047 - Orange Calas - (no description) -1050048 - White Calas - (no description) -1050049 - Dark Calas - (no description) -1050050 - Dark Suit - (no description) -1050051 - Red-Lined Kismet - (no description) -1050052 - Blue-Lined Kismet - (no description) -1050053 - Blue Anakamoon - (no description) -1050054 - Red Anakamoon - (no description) -1050055 - White Anakamoon - (no description) -1050056 - Dark Anakamoon - (no description) -1050057 - Ghost Uniform - (no description) -1050058 - Orange Tai - (no description) -1050059 - Blue Tai - (no description) -1050060 - Red Tai - (no description) -1050061 - Blue Linnex - (no description) -1050062 - Beige Linnex - (no description) -1050063 - Green Linnex - (no description) -1050064 - Dark Linnex - (no description) -1050065 - Blue Celebration Hanbok - (no description) -1050066 - Green Celebration Hanbok - (no description) -1050067 - Blue Requiem - (no description) -1050068 - Red Requiem - (no description) -1050069 - Brown Requiem - (no description) -1050070 - Dark Requiem - (no description) -1050071 - Men's Ninja Overall - (no description) -1050072 - Green Enigmatic - (no description) -1050073 - Blue Enigmatic - (no description) -1050074 - Dark Enigmatic - (no description) -1050075 - Red Pris - (no description) -1050076 - Blue Pris - (no description) -1050077 - Green Pris - (no description) -1050078 - Dark Pris - (no description) -1050079 - Black Coat of Death - (no description) -1050080 - Green Battle Road - (no description) -1050081 - Red Battle Road - (no description) -1050082 - Blue Battle Road - (no description) -1050083 - Dark Battle Road - (no description) -1050084 - Red Mesoranger - (no description) -1050085 - Blue Mesoranger - (no description) -1050086 - Mesoranger Green - (no description) -1050087 - Black Mesoranger - (no description) -1050088 - Red Ades - (no description) -1050089 - Blue Ades - (no description) -1050090 - Green Ades - (no description) -1050091 - Dark Ades - (no description) -1050092 - Green Oriental Fury Coat - (no description) -1050093 - Blue Oriental Fury Coat - (no description) -1050094 - Red Oriental Fury Coat - (no description) -1050095 - Black Oriental Fury Coat - (no description) -1050096 - Green Katinas - (no description) -1050097 - Blue Katinas - (no description) -1050098 - Red Katinas - (no description) -1050099 - Dark Katinas - (no description) -1050100 - Bathrobe for Men - (no description) -1050101 - Western Cowboy - (no description) -1050102 - Green Varuna - (no description) -1050103 - Blue Varuna - (no description) -1050104 - Red Varuna - (no description) -1050105 - Dark Varuna - (no description) -1050106 - Green Arzuna - (no description) -1050107 - Blue Arzuna - (no description) -1050108 - Red Arzuna - (no description) -1050109 - Green Picnicwear - (no description) -1050110 - Sky Blue Picnicwear - (no description) -1050111 - Boxer Trunks - (no description) -1050112 - Wedding Dress - (no description) -1050113 - Wedding Tuxedo - (no description) -1050114 - Poseidon Armor - (no description) -1050115 - Sea Hermit Robe - (no description) -1050116 - Race Ace Suit - (no description) -1050117 - Tiny Blue Swimshorts - (no description) -1050118 - Tiny Black Swimshorts - (no description) -1050119 - Santa Boy Overall - (no description) -1050120 - Horoscope Overall (Male) - (no description) -1050123 - Royal Hanbok - (no description) -1050124 - Lunar Celebration Suit - (no description) -1050125 - Brown Casual Look - (no description) -1050126 - Imperial Uniform - (no description) -1050127 - Bath Towel (Black) - (no description) -1050128 - Go! Korea! - (no description) -1050131 - Blue Groomsman's Suit - Suits that guest males can wear to attend a wedding. -1050132 - Brown Groomsman's Suit - Suits that guest males can wear to attend a wedding. -1050133 - Red Groomsman's Suit - Suits that guest males can wear to attend a wedding. -1050134 - White Groomsman's Suit - Suits that guest males can wear to attend a wedding. -1050135 - Beau Tuxedo - Tailor-made Tuxedo for grooms -1050136 - Black Male Fur Coat - (no description) -1050137 - White Male Fur Coat - (no description) -1050138 - School uniform with hoody jumper - (no description) -1050139 - Simple school uniform - (no description) -1050141 - Kitty Hoodie (m) - (no description) -1050142 - Hooded Korean Traditional Costume - (no description) -1050145 - Violet Strapless Dress [m] - (no description) -1050146 - Buddy Overall Jeans (M) - (no description) -1050147 - Princess Korean Traditional Costume - (no description) -1050152 - Sailor Outfit - (no description) -1051000 - Steel Fitted Mail - (no description) -1051001 - Emerald Fitted Mail - (no description) -1051002 - Cat Suit - (no description) -1051003 - Brown Doroness Robe - (no description) -1051004 - Purple Doroness Robe - (no description) -1051005 - Red Doroness Robe - (no description) -1051006 - Dark Avenger - (no description) -1051007 - Red Avenger - (no description) -1051008 - Blue Avenger - (no description) -1051009 - Purple Avenger - (no description) -1051010 - Dark Engrit - (no description) -1051011 - Red Engrit - (no description) -1051012 - Blue Engrit - (no description) -1051013 - Yellow Engrit - (no description) -1051014 - Sapphire Fitted Mail - (no description) -1051015 - Blood Fitted Mail - (no description) -1051016 - Silver Fitted Mail - (no description) -1051017 - Red Sauna Robe - If worn inside the hotel sauna, the recovery rate of HP and MP will be 1.5x faster. -1051018 - Purple Skull Overall - (no description) -1051019 - Orange Skull Overall - (no description) -1051020 - Green Skull Overall - (no description) -1051021 - Blue Skull Overall - (no description) -1051022 - Grey Skull Overall - (no description) -1051023 - Purple Moonlight - (no description) -1051024 - Red Moonlight - (no description) -1051025 - Blue Moonlight - (no description) -1051026 - Dark Moonlight - (no description) -1051027 - Brown Moonlight - (no description) -1051028 - White Swimming Suit - (no description) -1051029 - Red Swimming Suit - (no description) -1051030 - Dark Calaf - (no description) -1051031 - White Calaf - (no description) -1051032 - Blue Calaf - (no description) -1051033 - Red Calaf - (no description) -1051034 - Orange Calaf - (no description) -1051035 - Fine Red Hanbok Dress - (no description) -1051036 - Fine Blue Hanbok Dress - (no description) -1051037 - Blue Lumati - (no description) -1051038 - Green Lumati - (no description) -1051039 - Red Lumati - (no description) -1051040 - Dark Enamel Suit - (no description) -1051041 - Red Choro - (no description) -1051042 - Blue Choro - (no description) -1051043 - Brown Choro - (no description) -1051044 - Blue Anakarune - (no description) -1051045 - Red Anakarune - (no description) -1051046 - White Anakarune - (no description) -1051047 - Dark Anakarune - (no description) -1051048 - Witch Clothes - (no description) -1051049 - Mrs. Claus Costume - (no description) -1051050 - Blue Celebration Hanbok Dress - (no description) -1051051 - Pink Celebration Hanbok Dress - (no description) -1051052 - Blue Requierre - (no description) -1051053 - Red Requierre - (no description) -1051054 - Brown Requierre - (no description) -1051055 - Dark Requierre - (no description) -1051056 - Green Enigma - (no description) -1051057 - Purple Enigma - (no description) -1051058 - Dark Enigma - (no description) -1051059 - Pink Nurse Uniform - (no description) -1051060 - White Nurse Uniform - (no description) -1051061 - Women's Ninja Uniform - (no description) -1051062 - Blue Lineros - (no description) -1051063 - Beige Lineros - (no description) -1051064 - Green Lineros - (no description) -1051065 - Dark Lineros - (no description) -1051066 - Red Pria - (no description) -1051067 - Blue Pria - (no description) -1051068 - Green Pria - (no description) -1051069 - Dark Pria - (no description) -1051070 - Bunny Costume - (no description) -1051071 - Pink Kimono - (no description) -1051072 - White Kimono - (no description) -1051073 - Red Kimono - (no description) -1051074 - Yellow Kimono - (no description) -1051075 - Blue Swimming Suit - (no description) -1051076 - Ghost Suit - (no description) -1051077 - Yellow Battle Empress - (no description) -1051078 - Red Battle Empress - (no description) -1051079 - Blue Battle Empress - (no description) -1051080 - Dark Battle Empress - (no description) -1051081 - Purple Kimono - (no description) -1051082 - Red Anes - (no description) -1051083 - Blue Anes - (no description) -1051084 - Green Anes - (no description) -1051085 - Dark Anes - (no description) -1051086 - Ragged Korean Costume - (no description) -1051087 - Pink Mesoranger - (no description) -1051088 - Yellow Mesoranger - (no description) -1051089 - Black Mesoranger - (no description) -1051090 - Green Katte - (no description) -1051091 - Blue Katte - (no description) -1051092 - Red Katte - (no description) -1051093 - Dark Katte - (no description) -1051094 - Green Oriental Fury Coat - (no description) -1051095 - Blue Oriental Fury Coat - (no description) -1051096 - Red Oriental Fury Coat - (no description) -1051097 - Black Oriental Fury Coat - (no description) -1051098 - Bathrobe for Women - (no description) -1051099 - Prep Uniform - (no description) -1051100 - Western Cowgirl - (no description) -1051101 - Green Bazura - (no description) -1051102 - Blue Bazura - (no description) -1051103 - Red Bazura - (no description) -1051104 - Dark Bazura - (no description) -1051105 - Green Armis - (no description) -1051106 - Blue Armis - (no description) -1051107 - Red Armis - (no description) -1051108 - Pink Picnic Dress - (no description) -1051109 - Yellow Picnic Dress - (no description) -1051110 - Purple Frill One Piece - (no description) -1051111 - Blue Frill One Piece - (no description) -1051112 - Boxing Gear (F) - (no description) -1051113 - Transparent Overall (F) - Use this Overall equip if you want to make your Overall equip transparent while still using all of the stats your Overall equip possesses. -1051114 - Wedding Dress - (no description) -1051115 - Sea Queen Dress - (no description) -1051116 - Race Queen Uniform - (no description) -1051117 - Diao Chan Dress - (no description) -1051118 - Pink Strapless Bikini - (no description) -1051119 - Blue Strapless Bikini - (no description) -1051120 - Flight Attendant Uniform - (no description) -1051121 - Tropical Dress - (no description) -1051122 - White Cat Costume - (no description) -1051123 - Violet Strapless Dress - (no description) -1051124 - Purple Ring One Piece - (no description) -1051125 - Black Cat Costume - (no description) -1051126 - Red Chinese Dress - (no description) -1051127 - Maid Uniform - (no description) -1051128 - Horoscope Overall (Female) - (no description) -1051131 - Santa Girl Overall - (no description) -1051132 - White Coat - (no description) -1051133 - Rough Coat - (no description) -1051134 - Leopard Print Coat - (no description) -1051135 - Ruffled Coat - (no description) -1051136 - Korean Dress for the Palace - (no description) -1051137 - Rabbit Fur Dress - (no description) -1051138 - Lunar Celebration Dress - (no description) -1051139 - White Ribboned Sailor Dress - (no description) -1051140 - Yellow Bath Towel - (no description) -1051141 - Female Shaman Costume - (no description) -1051142 - Vibrant Yellow Dress - (no description) -1051143 - Korean Flag Tank Top & Skirt - (no description) -1051144 - Elegant Blue One Piece - (no description) -1051147 - Street Cred Ensemble - (no description) -1051148 - Navy Blue Au Luxe - (no description) -1051149 - Princess Dress - (no description) -1051150 - Blue Bridesmaid's Dress - Dresses that guest females can wear to attend a wedding. -1051151 - Pink Bridesmaid's Dress - Dresses that guest females can wear to attend a wedding. -1051152 - Red Bridesmaid's Dress - Dresses that guest females can wear to attend a wedding. -1051153 - White Bridesmaid's Dress - Dresses that guest females can wear to attend a wedding. -1051154 - Princess Isis - Elegant Wedding Dress for brides. -1051155 - Queen Mary - Modern, Sexy Wedding Dress for brides -1051156 - Black Female Fur Coat - (no description) -1051157 - White Female Fur Coat - (no description) -1051158 - School uniform with hoody jumper - (no description) -1051159 - Simple school uniform - (no description) -1051160 - Pink-Striped Dress - (no description) -1051162 - Cute Sailor Dress - (no description) -1051163 - Gothic Overall - (no description) -1051164 - Kitty Hoodie (f) - (no description) -1051166 - Dressu Korean Traditional Costume - (no description) -1051167 - Black Rockabilly Dress - (no description) -1051169 - Sky Blue Picnicwear [F] - (no description) -1051170 - Buddy Overall Jeans (F) - (no description) -1051171 - Royal Costume - (no description) -1051180 - Sailor Outfit - (no description) -1052000 - Recycled Box - (no description) -1052001 - Paper Box - (no description) -1052002 - Cardboard Box - (no description) -1052003 - Blue Chinese Undead Costume - (no description) -1052004 - Maroon Chinese Undead Costume - (no description) -1052005 - Yellow Raincoat - (no description) -1052006 - Sky Blue Raincoat - (no description) -1052007 - Red Raincoat - (no description) -1052008 - Green Raincoat - (no description) -1052009 - Orange Overall - (no description) -1052010 - Pink Overall - (no description) -1052011 - Blue Overall - (no description) -1052012 - Green Overall - (no description) -1052013 - Graduation Gown - (no description) -1052014 - Ducky Costume - (no description) -1052015 - Blue Shinsun - (no description) -1052016 - Brown Shinsun - (no description) -1052017 - Orange Life-Jacket - (no description) -1052018 - Green Life-Jacket - (no description) -1052019 - Blue Life-Jacket - (no description) -1052020 - White Body Tights - (no description) -1052021 - Black Body Tights - (no description) -1052022 - White Holed Tights - (no description) -1052023 - Black Holed Tights - (no description) -1052024 - Big Kimono - (no description) -1052025 - Denim Overall - (no description) -1052026 - Grey Full Coat - (no description) -1052027 - Red Full Coat - (no description) -1052028 - Forest Samurai Outfit - (no description) -1052029 - Premium Trenchcoat - (no description) -1052030 - Toga - (no description) -1052031 - Reindeer Suit - (no description) -1052032 - Red Bruma - (no description) -1052033 - Green Bruma - (no description) -1052034 - Blue Bruma - (no description) -1052035 - Guan Yu Armor - (no description) -1052036 - Zhu-Ge-Liang Gown - (no description) -1052037 - Patissier Uniform - (no description) -1052038 - Blue Robot Pilotgear - (no description) -1052039 - Liu Bei Robe - (no description) -1052040 - Cao Cao Robe - (no description) -1052041 - Sun Quan Robe - (no description) -1052042 - Pink Robot Pilotgear - (no description) -1052043 - Hip Hop Sweats - (no description) -1052044 - Scuba Diving Suit - (no description) -1052045 - Mink Coat - (no description) -1052046 - Snowman Costume - (no description) -1052047 - Black Snowboard Overall - (no description) -1052048 - Brown Snowboard Overall - (no description) -1052049 - Yang In - (no description) -1052050 - Red Hip Hop - (no description) -1052051 - Blue Hip Hop - (no description) -1052052 - Musashi Costume - (no description) -1052053 - Teddy Bear Costume - (no description) -1052054 - Welder Look - (no description) -1052055 - Enamer - (no description) -1052056 - Soccer Uniform - (no description) -1052057 - England Soccer Uniform(No.7) - (no description) -1052058 - Brazil Soccer Uniform(No.10) - (no description) -1052059 - France Soccer Uniform(No.14) - (no description) -1052060 - England Soccer Uniform(No.8) - (no description) -1052061 - Brazil Soccer Uniform(No.9) - (no description) -1052062 - France Soccer Uniform(No.10) - (no description) -1052063 - USA Soccer Uniform(No.17) - (no description) -1052064 - Mexico Soccer Uniform(No.4) - (no description) -1052065 - USA Soccer Uniform(No.21) - (no description) -1052066 - Mexico Soccer Uniform(No.9) - (no description) -1052067 - Mummy Suit - (no description) -1052068 - Skull Suit - (no description) -1052069 - Flamboyant Autumn Gear - (no description) -1052071 - Red Mantle - (no description) -1052072 - Black Garina - (no description) -1052075 - Blue Dragon Armor - (no description) -1052076 - Blue Czar - (no description) -1052077 - Moon Bunny Costume - (no description) -1052078 - Soap Bubble Bonanza - (no description) -1052079 - Prince of Darkness - (no description) -1052081 - Training Uniform for Beginners - (no description) -1052082 - Elf Overall - (no description) -1052083 - Son Wu Kong robe - (no description) -1052084 - Golden Armor - (no description) -1052085 - Red Amorian Apron - (no description) -1052086 - Blue Amorian Apron - (no description) -1052087 - Dark Blue Kimono - (no description) -1052089 - Black Overcoat of Doom - (no description) -1052090 - Rompers - (no description) -1052091 - Sachiel Armor - (no description) -1052092 - Veamoth Armor - (no description) -1052093 - Janus Armor - (no description) -1052094 - Zhu Ba Jie Overall - (no description) -1052095 - Brown Rocky Suit - (no description) -1052098 - Brown Cotton Lagger - (no description) -1052101 - Beige Carribean - (no description) -1052104 - Brown Turk Gally - (no description) -1052107 - Brown Pollard - (no description) -1052110 - Blue Brace Look - (no description) -1052113 - Red Barbay - (no description) -1052116 - Green Plasteer - (no description) -1052119 - Black Royal Barone - (no description) -1052122 - Red Viska - (no description) -1052125 - White Pioneer - (no description) -1052128 - White Marquini - (no description) -1052131 - Red Belly Duke - (no description) -1052134 - Canopus Suit - (no description) -1052135 - Centaurus Legs - (no description) -1052142 - Shorts with Suspenders - (no description) -1052143 - Sky Blue Padded Coat - (no description) -1052144 - Luxurious Padded Coat - (no description) -1052145 - Christmas Party Suit - (no description) -1052147 - Chinese Lion Costume - The lion costume worn with the famous lion headgear for the lion dance to celebrate Lunar New Year. -1052148 - Bosshunter Armor - (no description) -1052149 - Bosshunter Gi - (no description) -1052151 - Bosshunter Armor - (no description) -1052152 - Bosshunter Gi - (no description) -1052153 - Red Viska for Transformation - (no description) -1052154 - Tiger Cub Outfit - (no description) -1052170 - Noob Overall - From the early days of Maple Island! Relive the past with this authentic Noob overall! -1052169 - Gaga Suit - (no description) -1052171 - Baby Chick Apron - (no description) -1052175 - Coastal Winter Wear - (no description) -1052179 - Cow Costume - (no description) -1052176 - Fashionable Checkerwear - (no description) -1051173 - Purple Dorothy Dress - (no description) -1052155 - Timeless Taragon - (no description) -1052156 - Timeless Myst Blue - (no description) -1052157 - Timeless Evernew - (no description) -1052158 - Timeless Prinsid - (no description) -1052159 - Timeless Burgunt - (no description) -1052160 - Reverse Taragon - (no description) -1052161 - Reverse Myst Blue - (no description) -1052162 - Reverse Evernew - (no description) -1052163 - Reverse Prinsid - (no description) -1052164 - Reverse Burgunt - (no description) -1052165 - Parachute Agent Suit - (no description) -1052166 - Invincible Agent Suit - (no description) -1052167 - Ultimate Agent Suit - (no description) -1052180 - Denim Overalls - (no description) -1052194 - Caveman Outfit - (no description) -1051179 - Pretty Girl - (no description) -1052168 - Cutie Buck Outfit - (no description) -1052172 - Pumpkin Clothes - (no description) -1052173 - Tacky Manager Uniform - (no description) -1052177 - Fancy Noblesse Robe - (no description) -1052178 - Snowflake knit - (no description) -1052183 - ??? ??? - (no description) -1052200 - Lolli Pink Suit - (no description) -1051183 - Night Fever Ensemble - (no description) -1052199 - Blade Overall - (no description) -1051188 - Blue Daisy Dress - (no description) -1050154 - Seraphim Suit - (no description) -1051190 - Seraphim Suit - (no description) -1052213 - Chaos Armor - (no description) -1052214 - Maple Racing Suit - (no description) -1052211 - Fire Shadow Suit - (no description) -1052210 - Alchemist Overall - (no description) -1052182 - Galactic Hero Suit - (no description) -1052197 - Brave Soldier Armor - (no description) -1052202 - Pink Bean Suit - (no description) -1052203 - One Summer Night - (no description) -1052196 - Aran Armor - (no description) -1052193 - Honeybee Costume - (no description) -1051185 - Maid Dress - (no description) -1052192 - Bombacha - (no description) -1052195 - Aran Armor - (no description) -1052209 - Royal Navy Uniform - (no description) -1051192 - Blue Marine Girl - (no description) -1050155 - King Pepe White Devil Robe - (no description) -1050156 - Blue Towel - (no description) -1051189 - Yellow Anticipation - (no description) -1051191 - King Pepe Red Doroness Robe - (no description) -1051193 - Orange Towel - (no description) -1052208 - King Pepe Blue Suspenders Look - (no description) -1052218 - Clown Suit - (no description) -1051175 - Fur-Trimmed Dress - (no description) -1052226 - Former Hero Robe - (no description) -1052137 - Tomato Suit - (no description) -1052234 - Stylish Layered Plaid - (no description) diff --git a/tools/MapleIdRetriever/handbook/Equip/Pants.txt b/tools/MapleIdRetriever/handbook/Equip/Pants.txt deleted file mode 100644 index 57f7acdd29..0000000000 --- a/tools/MapleIdRetriever/handbook/Equip/Pants.txt +++ /dev/null @@ -1,410 +0,0 @@ -1060000 - Black Jangoon Pants - (no description) -1060001 - Black Suit Pants - (no description) -1060002 - Blue Jean Shorts - (no description) -1060003 - Military Shorts - (no description) -1060004 - Grey Thick Sweat Pants - (no description) -1060005 - Warfare Pants - (no description) -1060006 - Brown Cotton Shorts - (no description) -1060007 - Jean Capris - (no description) -1060008 - Brown Lolico Pants - (no description) -1060009 - Steel Corporal Pants - (no description) -1060010 - Steel Sergeant Kilt - (no description) -1060011 - Orihalcon Master Sergeant Kilt - (no description) -1060012 - Blue Training Pants - (no description) -1060013 - Grey / Brown Training Pants - (no description) -1060014 - Black Split Pants - (no description) -1060015 - White Split Pants - (no description) -1060016 - Black Martial Arts Pants - (no description) -1060017 - White Martial Arts Pants - (no description) -1060018 - Red Martial Arts Pants - (no description) -1060019 - Brown Martial Arts Pants - (no description) -1060020 - White Martial Arts Shorts - (no description) -1060021 - Blue Cloth Pants - (no description) -1060022 - Red Cloth Pants - (no description) -1060023 - Black Cloth Pants - (no description) -1060024 - Dark Nightshift Pants - (no description) -1060025 - Blue Nightshift Pants - (no description) -1060026 - Blue-Striped Boxers - (no description) -1060027 - Brown Corporal Pants - (no description) -1060028 - Blue Lolico Pants - (no description) -1060029 - Red Sergeant Kilt - (no description) -1060030 - Dark Master Sergeant Kilt - (no description) -1060031 - Blue Pao Bottom - (no description) -1060032 - Red Pao Bottom - (no description) -1060033 - Black Pao Bottom - (no description) -1060034 - Blue Rider Pants - (no description) -1060035 - Shine Rider Pants - (no description) -1060036 - Dark Rider Pants - (no description) -1060037 - Dark Brown Sneak Pants - (no description) -1060038 - Brown Sneak Pants - (no description) -1060039 - Black Sneak Pants - (no description) -1060040 - Blue Trainer Pants - (no description) -1060041 - Green Trainer Pants - (no description) -1060042 - Orange Trainer Pants - (no description) -1060043 - Dark Brown Stealer Pants - (no description) -1060044 - Dark Silver Stealer Pants - (no description) -1060045 - Red / Gold Stealer Pants - (no description) -1060046 - Silver / Black Stealer Pants - (no description) -1060047 - Original Disco Pants - (no description) -1060048 - Green Disco Pants - (no description) -1060049 - Blue Disco Pants - (no description) -1060050 - Blue Knucklevest Pants - (no description) -1060051 - Red Knucklevest Pants - (no description) -1060052 - Black Knucklevest Pants - (no description) -1060053 - Wild Pants - (no description) -1060054 - Brown Wild Pants - (no description) -1060055 - Red Wild Pants - (no description) -1060056 - Green Hunter's Pants - (no description) -1060057 - Dark Hunter's Pants - (no description) -1060058 - Red Hunter's Pants - (no description) -1060059 - Blue Hunter's Pants - (no description) -1060060 - Silver Master Sergeant Kilt - (no description) -1060061 - Red Legolier Pants - (no description) -1060062 - Blue Legolier Pants - (no description) -1060063 - Green Legolier Pants - (no description) -1060064 - Dark Legolier Pants - (no description) -1060065 - Brown Legolier Pants - (no description) -1060066 - Cowboy Pants - (no description) -1060067 - Preschool Pants - (no description) -1060068 - Dark Piette Pants - (no description) -1060069 - Brown Piette Pants - (no description) -1060070 - Blue Piette Pants - (no description) -1060071 - Khaki Shadow Pants - (no description) -1060072 - Marine Shadow Pants - (no description) -1060073 - Dark Shadow Pants - (no description) -1060074 - White Jangoon Pants - (no description) -1060075 - Brown Jangoon Pants - (no description) -1060076 - Blue Shouldermail Pants - (no description) -1060077 - Oaker Shouldermail Pants - (no description) -1060078 - Umber Shouldermail Pants - (no description) -1060079 - Green Orientican Pants - (no description) -1060080 - Red Orientican Pants - (no description) -1060081 - Blue Orientican Pants - (no description) -1060082 - Dark Orientican Pants - (no description) -1060083 - Red China Pants - (no description) -1060084 - Blue China Pants - (no description) -1060085 - Brown China Pants - (no description) -1060086 - Green China Pants - (no description) -1060087 - Light Scorpio Pants - (no description) -1060088 - Oaker Scorpio Pants - (no description) -1060089 - Dark Scorpio Pants - (no description) -1060090 - Bronze Platine Pants - (no description) -1060091 - Mithril Platine Pants - (no description) -1060092 - Orihalcon Platine Pants - (no description) -1060093 - Brown Studded Pants - (no description) -1060094 - Blue Studded Pants - (no description) -1060095 - Dark Studded Pants - (no description) -1060096 - Old School Uniform Pants - (no description) -1060097 - Green Pirate Pants - (no description) -1060098 - Red Pirate Pants - (no description) -1060099 - Dark Pirate Pants - (no description) -1060100 - Green Commodore Pants - (no description) -1060101 - Blue Commodore Pants - (no description) -1060102 - Dark Commodore Pants - (no description) -1060103 - Hawaiian Skirt - (no description) -1060104 - Green Osfa Pants - (no description) -1060105 - Brown Osfa Pants - (no description) -1060106 - Purple Osfa Pants - (no description) -1060107 - Red Osfa Pants - (no description) -1060108 - Torn-up Jeans - (no description) -1060109 - Green Neos Pants - (no description) -1060110 - Blue Neos Pants - (no description) -1060111 - Black Neos Pants - (no description) -1060112 - Prep School Uniform Pants - (no description) -1060113 - Blue Leggings - (no description) -1060114 - Washed Jeans - (no description) -1060115 - Transparent Bottom (M) - Use this Bottom equip if you want to make your Bottom equip transparent while still using all of the stats your Bottom equip possesses. -1060116 - Military Cargo Shorts - (no description) -1060117 - Tropical Shorts - (no description) -1060118 - Orange Puffy Pants - (no description) -1060119 - Denim Wrinkled skirt - (no description) -1060120 - Tania Tartan Pants - (no description) -1060121 - Mercury Washed Jeans - (no description) -1060122 - Pink Miniskirt - (no description) -1060123 - Blue Sailor Skirt - (no description) -1060125 - Blue Skirt (m) - (no description) -1060126 - Black Wakeboard Pants - (no description) -1060127 - Stirgeman's Utility Pants - (no description) -1060128 - Stirgeman Utility Pants Mk II - (no description) -1060129 - Stirgeman Utility Pants Mk III - (no description) -1060130 - Stirgeman Utility Pants Mk IV - (no description) -1060131 - Stirgeman Utility Pants Mk V - (no description) -1060132 - Stirgeman Power Pants - (no description) -1060133 - Stirgeman Power Pants Mk II - (no description) -1061000 - Blue Bell Dress - (no description) -1061001 - Blue Sailor Skirt - (no description) -1061002 - Red Miniskirt - (no description) -1061003 - Red Qi Pao Pants - (no description) -1061004 - Pink Miniskirt - (no description) -1061005 - Roll-up Jean - (no description) -1061006 - Green Able Armor Skirt - (no description) -1061007 - Red Sailor Skirt - (no description) -1061008 - Indigo Miniskirt - (no description) -1061009 - Green Avelin Skirt - (no description) -1061010 - Black Armine Skirt - (no description) -1061011 - Green Armine Skirt - (no description) -1061012 - Purple Arianne Skirt - (no description) -1061013 - Green Arianne Skirt - (no description) -1061014 - Rookie Pants - (no description) -1061015 - Blue Shark Skirt - (no description) -1061016 - Red Ramel Skirt - (no description) -1061017 - Green Ramel Skirt - (no description) -1061018 - Brown Ramel Skirt - (no description) -1061019 - Sky Shark Skirt - (no description) -1061020 - Red Shark Skirt - (no description) -1061021 - Pink Arianne Skirt - (no description) -1061022 - Yellow Arianne Skirt - (no description) -1061023 - Sophia Pants - (no description) -1061024 - Green Shivermail Skirt - (no description) -1061025 - Red Shivermail Skirt - (no description) -1061026 - Purple Shivermail Skirt - (no description) -1061027 - Black Split Skirt - (no description) -1061028 - White Split Skirt - (no description) -1061029 - Red Cloth Pants - (no description) -1061030 - Blue Cloth Pants - (no description) -1061031 - Black Cloth Pants - (no description) -1061032 - Purple Qi Pao Pants - (no description) -1061033 - Blue Qi Pao Pants - (no description) -1061034 - Purple Fairy Skirt - (no description) -1061035 - Green Fairy Skirt - (no description) -1061036 - Blue Fairy Skirt - (no description) -1061037 - Red Nightshift Pants - (no description) -1061038 - Brown Nightshift Pants - (no description) -1061039 - Pink Cotton Boxers - (no description) -1061040 - Red Qi Pao Skirt - (no description) -1061041 - Purple Qi Pao Skirt - (no description) -1061042 - Blue Qi Pao Skirt - (no description) -1061043 - Red Steal Pants - (no description) -1061044 - Black Steal Pants - (no description) -1061045 - Blue Steal Pants - (no description) -1061046 - Purple Steal Pants - (no description) -1061047 - Red Amoria Skirt - (no description) -1061048 - Blue Amoria Skirt - (no description) -1061049 - Black Amoria Skirt - (no description) -1061050 - Green Huntress Pants - (no description) -1061051 - Black Huntress Pants - (no description) -1061052 - Red Huntress Pants - (no description) -1061053 - Dark Sneak Pants - (no description) -1061054 - Blood Sneak Pants - (no description) -1061055 - Sky Sneak Pants - (no description) -1061056 - Gold Sneak Pants - (no description) -1061057 - Yellow Avelin Skirt - (no description) -1061058 - Brown Able Skirt - (no description) -1061059 - Grey Able Skirt - (no description) -1061060 - Red Legolia Pants - (no description) -1061061 - Blue Legolia Pants - (no description) -1061062 - Green Legolia Pants - (no description) -1061063 - Dark Legolia Pants - (no description) -1061064 - Brown Legolia Pants - (no description) -1061065 - Sky Blue Miniskirt - (no description) -1061066 - Yellow Mimi Skirt - (no description) -1061067 - Cowboy Shorts - (no description) -1061068 - Pre-School Uniform Skirt - (no description) -1061069 - Purple Shadow Pants - (no description) -1061070 - Red Shadow Pants - (no description) -1061071 - Dark Shadow Pants - (no description) -1061072 - Red Trainer Pants - (no description) -1061073 - Sky Blue Trainer Pants - (no description) -1061074 - Pink Trainer Pants - (no description) -1061075 - Black Trainer Pants - (no description) -1061076 - Maroon Moon Pants - (no description) -1061077 - Blue Moon Pants - (no description) -1061078 - Brown Moon Pants - (no description) -1061079 - Red Moon Pants - (no description) -1061080 - White Piettra Skirt - (no description) -1061081 - Brown Piettra Skirt - (no description) -1061082 - Dark Piettra Skirt - (no description) -1061083 - Red Jangoon Skirt - (no description) -1061084 - Brown Jangoon Skirt - (no description) -1061085 - Black Jangoon Skirt - (no description) -1061086 - Red Shouldermail Pants - (no description) -1061087 - Ivory Shouldermail Pants - (no description) -1061088 - Dark Shouldermail Pants - (no description) -1061089 - Blue Skirt - (no description) -1061090 - Green Ice Queen Skirt - (no description) -1061091 - Red Ice Queen Skirt - (no description) -1061092 - Blue Ice Queen Skirt - (no description) -1061093 - Light Mantis Pants - (no description) -1061094 - Bloody Mantis Pants - (no description) -1061095 - Umber Mantis Pants - (no description) -1061096 - Aqua Platina Pants - (no description) -1061097 - Violet Platina Pants - (no description) -1061098 - Blood Platina Pants - (no description) -1061099 - Purple Mystique Pants - (no description) -1061100 - Blue Mystique Pants - (no description) -1061101 - Pink Mystique Pants - (no description) -1061102 - Red Mystique Pants - (no description) -1061103 - Old School Uniform (Skirt) - (no description) -1061104 - Green Pirate Skirt - (no description) -1061105 - Red Pirate Skirt - (no description) -1061106 - Dark Pirate Skirt - (no description) -1061107 - SF Ninja Pants - (no description) -1061108 - Red Training Shorts - (no description) -1061109 - Sky Blue Training Shorts - (no description) -1061110 - Pink Training Shorts - (no description) -1061111 - Black Training Shorts - (no description) -1061112 - Pink Frill Pajama Bottom - (no description) -1061113 - Hawaiian Skirt - (no description) -1061114 - Green Osfa Pants - (no description) -1061115 - Brown Osfa Pants - (no description) -1061116 - Purple Osfa Pants - (no description) -1061117 - Red Osfa Pants - (no description) -1061118 - Green Valkyrie Skirt - (no description) -1061119 - Purple Valkyrie Skirt - (no description) -1061120 - Blood Valkyrie Skirt - (no description) -1061121 - Green Lucida Skirt - (no description) -1061122 - Purple Lucida Skirt - (no description) -1061123 - Dark Lucida Skirt - (no description) -1061124 - Red Leggings - (no description) -1061125 - Transparent Bottom (F) - Use this Bottom equip if you want to make your Bottom equip transparent while still using all of the stats your Bottom equip possesses. -1061126 - Plitz Skirt - (no description) -1061127 - Blue Diamond Bootcuts - (no description) -1061128 - Pink Diamond Bootcuts - (no description) -1061129 - Butterfly Skirt - (no description) -1061130 - Green Long Skirt - (no description) -1061131 - Blue Slit Skirt - (no description) -1061132 - Skirt w/ Tights - (no description) -1061133 - Orange Long Skirt - (no description) -1061134 - Denim Miniskirt - (no description) -1061135 - Pink Layered Skirt - (no description) -1061136 - Long Khaki Skirt - (no description) -1061137 - Dark Denim Skirt - (no description) -1061138 - Pink-Hearted Hot Pants - (no description) -1061139 - Military Cargo Shorts - (no description) -1061140 - Denim Skirt & Striped Sox - (no description) -1061141 - Tania Tartan Skirt - (no description) -1061142 - Mercury Jean Skirt - (no description) -1061143 - Amorian Pink Skirt - (no description) -1061144 - Blue Jeans - (no description) -1061147 - Old School Uniform Pants (F) - (no description) -1061148 - Pink Frill Swim Skirt - (no description) -1061149 - Stirgeman's Utility Skirt - (no description) -1061150 - Stirgeman Utility Skirt Mk II - (no description) -1061151 - Stirgeman Utility Skirt Mk III - (no description) -1061152 - Stirgeman Utility Skirt Mk IV - (no description) -1061153 - Stirgeman Utility Skirt Mk V - (no description) -1061154 - Stirgeman Power Skirt - (no description) -1061155 - Stirgeman Power Skirt Mk II - (no description) -1062000 - Ice Jeans - (no description) -1062001 - Sandblasted Jeans - (no description) -1062002 - Brown Hard Leather Pants - (no description) -1062003 - Red Hip-Hop Pants - (no description) -1062004 - Archer Pants - (no description) -1062005 - Lined Hip-Hop Pants - (no description) -1062006 - Bennis Chainpants - (no description) -1062007 - Wizet Plain Suit Pants - (no description) -1062008 - Pink Camping Shorts - (no description) -1062009 - Green Camping Shorts - (no description) -1062010 - Blue Camping Shorts - (no description) -1062011 - Wildcats Baseball Pants (Basic) - (no description) -1062012 - Wildcats Baseball Pants (Home) - (no description) -1062013 - Wildcats Baseball Pants (Away) - (no description) -1062014 - Wildcats Baseball Pants (Alternate) - (no description) -1062015 - Ripped Jeans - (no description) -1062016 - Yellow Snowboard Pants - (no description) -1062017 - Green Snowboard Pants - (no description) -1062018 - Bell-Bottomed Faded Jeans - (no description) -1062019 - Pink Snowboard Pants - (no description) -1062020 - Sky Blue Snowboard Pants - (no description) -1062021 - Jean Shorts - (no description) -1062022 - Old Army Pants - (no description) -1062023 - Baggy Jeans - (no description) -1062024 - Camouflaged Army Pants - (no description) -1062025 - Blue Polka-Dot Pajama Pants - (no description) -1062026 - Red Polka-Dot Pajama Pants - (no description) -1062027 - Prisoner Pants - (no description) -1062028 - Picnic Jean Shorts - (no description) -1062029 - Blue B-Ball Shorts - (no description) -1062030 - Orange B-Ball Shorts - (no description) -1062031 - Checkered Shorts - (no description) -1062032 - Cargo Pants - (no description) -1062033 - Red Checkered Pants - (no description) -1062034 - White Checkered Pants - (no description) -1062035 - Bone Buckled Slack - (no description) -1062036 - none - (no description) -1062037 - Blue Burma - (no description) -1062038 - Hip Hop Jeans - (no description) -1062039 - White Jeans - (no description) -1062040 - Washed Denim Cargos - (no description) -1062041 - Denim Cargos - (no description) -1062042 - Jeans w/ Chain - (no description) -1062043 - Black Leather Pants - (no description) -1062044 - Red Leather Pants - (no description) -1062045 - Patched Denim Jeans - (no description) -1062046 - Vintage Pocket Pants - (no description) -1062047 - Brisk - (no description) -1062048 - Brown Checkered Pants - (no description) -1062049 - Football Bottom(Home) - (no description) -1062050 - Football Bottom(Away) - (no description) -1062051 - All-Star Blue Jeans - (no description) -1062052 - White Faded Jeans - (no description) -1062053 - Pink-Lined Shorts - (no description) -1062054 - Busy Bee Shorts - (no description) -1062055 - Jailbird Shorts - (no description) -1062056 - Military Cargo Pants - (no description) -1062057 - Scottish Pants - (no description) -1062058 - Inferno Jeans - (no description) -1062059 - Vintage Black Jeans - (no description) -1062060 - Blue Skinny Jeans - (no description) -1062061 - Olive Skinny Jeans - (no description) -1062062 - Red Wine Skinny Jeans - (no description) -1062063 - Dark Rocker Jeans - (no description) -1062064 - Checks Point Pants - (no description) -1062065 - White-Striped Trainer Shorts - (no description) -1062066 - Vintage Sky Blue Jeans - (no description) -1062067 - Summer Capris - (no description) -1062068 - Rainbow Shorts - (no description) -1062069 - Brown Chained Pants - (no description) -1062070 - Painted Blue Jeans - (no description) -1062071 - Low-rise Ripped Jeans - (no description) -1062072 - Relaxed Fit Jeans - (no description) -1062073 - Olive Pumpkin Pants - (no description) -1062075 - Vintage Black Pants - (no description) -1062076 - Light Blue Ripped Jeans - (no description) -1062077 - Brown Bubble Jeans - (no description) -1062080 - Amorian Pink Skirt - (no description) -1062081 - Bunny-Padded Snowboard Pants - (no description) -1062082 - Red and Black Warm-ups - (no description) -1062083 - Brown Pocket Shorts - (no description) -1062084 - Jewel Chain Jeans - (no description) -1062085 - "Black Tie Affair" Dress Pants - (no description) -1062086 - Dark Master Sergeant Skirt for Transformation - (no description) -1062087 - Red Legollesse Pants for Transformation - (no description) -1062088 - Dark Night Pants for Transformation - (no description) -1062089 - Purple Heart Boxers - (no description) -1062091 - Black Checkered Shorts - (no description) -1062092 - Pink 80s Slacks - (no description) -1062095 - Milan Jeans - (no description) -1062096 - Practical Linen Trousers - (no description) -1062097 - Ella Blue Denim - (no description) -1062098 - Aqua Jeans - (no description) -1062093 - Moss Green Pants - (no description) -1062094 - Ruby-Buckled Shorts - (no description) -1062100 - Rolled-up Baggy Jeans - (no description) -1062106 - Bunny Frill Pants - A cute pair of pants featuring an adorable bunny on the back. -1062101 - Rolled-up Skinny Jeans - (no description) -1062104 - Dark Purple Jeans - (no description) -1062105 - Plaid Roll-Up Jeans - (no description) -1062109 - Neon Skinny Jeans - (no description) -1062111 - Blue Ribbon Shorts - (no description) -1062113 - Crayon Shorts - (no description) -1062114 - Pink Heart Shorts - (no description) -1062074 - Brown Pumpkin Pants - (no description) -1062102 - Twinkle Star Blue Jeans - (no description) -1062103 - Baggy Glow-in-the-dark Pants - (no description) -1062108 - Vintage Jeans - (no description) -1062107 - Shooting Star Jeans - (no description) -1062116 - Star Beach Shorts - (no description) -1062110 - Baby Pink Pants - (no description) -1062119 - Technicolour Funky Pants - (no description) -1062112 - Underpants - (no description) -1060134 - King Pepe White Martial Arts Shorts - (no description) -1060135 - King Pepe Dark Legolier Pants - (no description) -1060136 - King Pepe Black Knucklevest Pants - (no description) -1061156 - King Pepe Red Shark Skirt - (no description) -1061157 - King Pepe Brown Legolia Pants - (no description) -1061158 - King Pepe Purple Steal Pants - (no description) -1062115 - Simple Warrior Pants - (no description) -1062118 - Stone Washed Jeans - (no description) -1061160 - Average Denim Skirt - (no description) -1060138 - Average Denim Shorts - (no description) diff --git a/tools/MapleIdRetriever/handbook/Equip/PetEquip.txt b/tools/MapleIdRetriever/handbook/Equip/PetEquip.txt deleted file mode 100644 index 83ba78ce1e..0000000000 --- a/tools/MapleIdRetriever/handbook/Equip/PetEquip.txt +++ /dev/null @@ -1,67 +0,0 @@ -1802000 - Red Ribbon - (no description) -1802001 - Yellow Hat - (no description) -1802002 - Red Hat - (no description) -1802003 - Black Hat - (no description) -1802004 - Pink Laced Cap - (no description) -1802005 - Sky Blue Laced Cap - (no description) -1802006 - Blue Top Hat - (no description) -1802007 - Red Top Hat - (no description) -1802008 - Rudolph's Hat - (no description) -1802009 - Tree Hat - (no description) -1802010 - Mushroom Suit - An orange mushroom suit custom-fitted for #cblack pigs#. -1802011 - Red Fur Coat - A red coat with white fur hat custom-fitted for #cHuskies#. -1802012 - Chestnut Cap - A very warm-looking chestnut cap that's custom-fitted for #cpandas#. -1802013 - Red Scarf - A red scarf with stripes custom-fitted for #cbunnies#. -1802014 - Mini Kargo Wings - A small, cutesy set of wings for #ckargo's# only. -1802015 - Dino King & Queen - A crown and a cape which can only be worn by #cDino Boy and Dino Girl#. -1802016 - Husky Yellow Tights - A yellow trainer that can only be worn by #cHuskies#. -1802017 - Monkey Sack - A sack which can only be worn by the #cMonkey#. -1802018 - Clown Dress - A Clown constume that can only be worn by the #cPanda#. -1802019 - Rudolph's Sleigh - It is the very vehicle Santa uses on his Christmas trips. Only available for Rudolph. -1802020 - White Tiger Suit - A black thief costume for #cwhite tiger# only. -1802021 - Elephant Hat - Elephant Hat -1802022 - Aladin Vest - Aladin Vest -1802023 - Pelvis Hair - A Pelvis Hair that can only be equipped by a #cMonkey#. -1802024 - White Tiger the Wizard - A purple wizard costume for #cwhite tiger# only. -1802025 - Bunny Suit - A pink bunny suit for #cHusky# only. -1802026 - Prince Pepe - A stubborn Pepe that only wants to be besides #cYeti#. -1802027 - Bare Bones - A scary skeletal look that can only be worn by #cHuskies#. -1802028 - Ghosty - A ghoulish costume that can only be worn by #cDino Boy and Dino Girl#. -1802029 - Pet-o-Lantern - A perfect Halloween costume that can only be worn by #cPandas#. -1802030 - Penguin Earmuff Set - A set of earmuff and scarf only available for #cPenguin#. -1802031 - Cowboy Kargo - A cowboy costume that can only be equipped by a #cKargo#. -1802032 - Snowboard Gear - A full-fledged snowboard gear that can only be equipped by a #cHusky#. -1802033 - Crimson Mask - A Crimson Balrog gear from head to toe that can only be equipped by a #cJr. Balrog#. -1802034 - White Angel - An angel costume that can only be equipped by a #Yeti#. -1802035 - Cute Beggar Overall - An adorable country-looking costume that can only be equipped by a #Monkey#. -1802036 - Golden Pig Fortune Pouch - A Fortune pouch for #cGolden Pig# only. -1802037 - Oinker Suit - A Oinker Suit that can only be worn by the #cHuskies#. -1802038 - Mini Celestial Wand - Equip by #cSun Wu Kong# only. -1802042 - Baby Turkey Carriage - A small carriage built especially for well-behaved baby turkeys. Can only be equipped by a #cturkey#. -1802044 - Dragon's soul - Only available for evolution pet : Dragon -1802045 - Guitar - A stylish, mystical guitar. Can only be played by the #cJr. Reaper#. -1802047 - Porcupine Sunglasses - A set of sunglasses specially made for porcupine. -1802048 - Dragon Armor - Heavy metal for your dragon...as if it weren't imposing enough already! This armor can only be equipped by an adult #cdragon#. -1802049 - Jr. Reaper Sign (I'm with stoopid) - The Jr Reaper isn't afraid to give its owner a little lip. This sign can only be equipped by the #cJr Reaper pet#. -1802050 - Jr. Reaper Sign (<--Noob) - The Jr Reaper isn't afraid to give its owner a little lip. This sign can only be equipped by the #cJr Reaper pet#. -1802051 - Jr. Reaper Sign (cc plz) - The Jr Reaper isn't afraid to give its owner a little lip. This sign can only be equipped by the #cJr Reaper pet#. -1802052 - Jr. Reaper Sign (I love pie) - The Jr Reaper isn't afraid to give its owner a little lip. This sign can only be equipped by the #cJr Reaper pet#. -1802053 - Snowman Gear - A cozy set of gear to keep #cSnowman# warm. -1802054 - Kino's Green Mushroom Hat - An adorable Green Mushroom Hat that can only be adorned by #cKino#. -1802055 - Gas Mask - A gas Mask specially made for Skunk. -1802100 - Pet Collar - (no description) -1812000 - Meso Magnet - With this item, your pet will collect mesos dropped by a monster as it passes by them. Applies only to your monster spoils. -1812001 - Item Pouch - With this item, your pet will collect items dropped by a monster as it passes by them. Applies only to your monster spoils. -1812002 - Auto HP Potion Pouch - Pet will automatically consume potions by setting the HP alert in system option. \n#c Place the pouch in Pet Ability section at Pet Equip window in Equip window as well as the potion for Pet to consume in Pet HP section# -1812003 - Auto MP Potion Pouch - Pet will automatically consume potions by setting the MP alert in system option. \n#c Place the pouch in Pet Ability section at Pet Equip window in Equip window as well as the potion for Pet to consume in Pet MP section# -1812004 - Wing Boots - With these boots, your pet will move to mesos/items dropped by monsters to collect them. Applies only to your monster spoils if not equiped with Magic Scales. Applies only with combination of which items you are equiped with. (Meso Magnet, Item Pouch) -1812005 - Binocular - With this Binocular AND Wing Boots, your pet will move to mesos/items dropped by monsters to collect them in a #cwider range than solely equipping Wing Boots.# -1812006 - Magic Scales - With these scales, your pet will become knowledgable of ownership expiration of dropped mesos/items from monsters and will also pick them up. Applies only with combination of which items you are equiped with. (Meso Magnet, Item Pouch) -1812007 - Item Ignore Pendant - This allows the pet to be selective in picking up dropped items by avoiding selected items. Once the owner has learned the Trainer's Command, the Lead Pet needs to have the skill in order for it to be activated.\n#cAvailable to a pet that can pick up mesos and items.# -1822000 - Pet Label Ring - By equipping this ring, your pet will get its own name tag. Only works with #cPanda, Dino Boy, Dino Girl, Monkey, Tiger, Rudolph, Robot, Mini Yeti, Penguin, Jr.Balrog, Dragon, Jr. Reaper, Porcupine, Snowman, Skunk, Pink Bean.# -1832000 - Pet Quote Ring - By equipping this ring, your pet will get its own decorated quote box. Only works with #cPanda, Dino Boy, Dino Girl, Monkey, Tiger, Rudolph, Robot, Mini Yeti, Penguin, Jr.Balrog, Dragon, Jr. Reaper, Porcupine, Snowman, Skunk, Pink Bean# -1802059 - Jail Bird Pet Costume - Disloyal or obnoxious pet? Sentence it to hard time with this outfit! Can only be equipped by a #cMonkey#. -1802060 - Crystal Rudolph Wings - A set of wings only available for #cCrystal Rudolph# -1802061 - Scuba Mask - A scuba mask #cWhite Duck# likes to wear when diving down under. -1802062 - Starry Stereo Headset - A Stereo Headset to keep your #cPink Bean# entertained at all times. -1802063 - Baby Tiger Wings - A wing accessory exclusively for #cBaby Tiger#. diff --git a/tools/MapleIdRetriever/handbook/Equip/Ring.txt b/tools/MapleIdRetriever/handbook/Equip/Ring.txt deleted file mode 100644 index a4c436f1f5..0000000000 --- a/tools/MapleIdRetriever/handbook/Equip/Ring.txt +++ /dev/null @@ -1,112 +0,0 @@ -1112000 - Sparkling Ring - A sparkling ring. -1112001 - Crush Ring - When purchased, enter the name of the character you're being a couple with, then the item works for both. When the two are together, an effect comes out. Also, it can only be that of one male and one female character. -1112002 - Cloud Ring - After purchasing the ring, enter the name of the character that'll become your partner, so the other character will also receive the ring. Once the two characters equip themselves with the ring, stand next to each other to trigger the special effect. The couple-ring can only be worn by a couple that consists of two characters that are of opposite sex. -1112003 - Cupid Ring - When purchased, enter the name of the character you're being a couple with, then the item works for both. When the two are together, an effect comes out. Also, it can only be that of one male and one female character. -1112005 - Venus Fireworks - Powerful fireworks to express one's love! When purchased, enter the name of the character you're being a couple with, then the item works for both. When the two are together, an effect comes out. Also, it can only be that of one male and one female character. -1112006 - Crossed Hearts - This is the best way to express "Love is a battlefield!" When purchased, enter the name of the character you're being a couple with, then the item works for both. When the two are together, an effect comes out. Also, it can only be that of one male and one female character. -1112100 - White Label Ring - Under the character avatar, the name of the character will be featured in white background and black font. -1112101 - Blue Label Ring - Under the character avatar, the name of the character will be featured in blue background and white font. -1112102 - Blue Label Ring 2 - Under the character avatar, the name of the character will be featured in blue background and white font. -1112103 - The Legendary Gold Ring - Under the character avatar, the name of the character will be featured in gold background and black font. -1112104 - Bubbly Label Ring - Under the character avatar, the name of the character will be featured in blue background and written in stars. -1112105 - Pink-Ribboned Label Ring - Under the character avatar, the name of the character will be featured in pink ribbon background and black font. -1112106 - Blue-Ribboned Label Ring - Under the character avatar, the name of the character will be featured in blue ribbon background and black font. -1112107 - Skull Label Ring - Under the character avatar, the name of the character will be featured in black-skulled background and white font. -1112108 - Butterfly Label Ring - Under the character avatar, the name of the character will be featured in butterfly background and white font. -1112109 - Scoreboard Label Ring - Under the character avatar, the name of the character will be featured in scoreboard background and yellow font. -1112110 - SK Basketball Team Label Ring - Under the character avatar, the name of the character will be featured in blue SK Basketball Team background and white font. -1112111 - KTF Basketball Team Label Ring - Under the character avatar, the name of the character will be featured in orange KTF basketball team background and black font. -1112112 - Beach Label Ring - Under the character avatar, the name of the character will be featured in a sea of clams and starfish, written in white font. -1112113 - Chocolate Label Ring - Under the character avatar, the name of the character will be featured on top of a sweet chocolate as a background with white font. -1112114 - Pink Candy Label Ring - Under the character avatar, the name of the character will be featured on top of a pink candy wrapper as a background with white font. -1112115 - MapleBowl Label Ring - Under the character avatar, the name of the character will be featured in a football helmet with a black background, and in orange font. -1112116 - White Cloud Label Ring - Under the character avatar, the name of the character will be featured in a white cloud background, and in black font. -1112117 - Rainbow Label Ring - Under the character avatar, the name of the character will be featured in a rainbow with a sky blue background, and in black font. -1112118 - Coke Label Ring - Under the character avatar, the name of the character will be featured in coke-themed background and in white font. -1112119 - Coke(Red) Label Ring - Under the character avatar, the name of the character will be featured in a Coke background, and in white font. -1112120 - Coke(White) Label Ring - Under the character avatar, the name of the character will be featured in a Coke background, and in red font. -1112121 - Gingerman Label Ring - Under the character avatar, the name of the character will be featured in a background of a cookieand white font. -1112122 - Rainbow Label Ring - Under the character avatar, the name of the character will be featured in a background of rainbow & cloud and white font. -1112123 - Red Pencil Label Ring - Under the character avatar, the name of the character will be featured in a background of a red colored pencil and white font. -1112124 - Blue Pencil Label Ring - Under the character avatar, the name of the character will be featured in a background of a blue colored pencil and white font. -1112125 - Green Pencil Label Ring - Under the character avatar, the name of the character will be featured in a background of a green colored pencil and white font. -1112200 - Pink Quote Ring - While the character chats, the quote bubble is in pink. -1112201 - Pink-Hearted Quote Ring - While the character chats, the quote bubble comes out as a pink heart. -1112202 - Blue Quote Ring - While the character chats, the quote bubble is in blue. -1112203 - The Golden Fly Ring - While the character chats, the quote bubble is in gold. If combined with the Legendary Gold Poop Hat, the fly effect takes place. -1112204 - Pink-Flowered Quote Ring - While the character chats, the quote bubble comes out decorated in pink flowers. -1112205 - Blue-Flowered Quote Ring - While the character chats, the quote bubble comes out decorated in blue flowers. -1112206 - Pink-Ribboned Quote Ring - While the character chats, the quote bubble comes out decorated in pink ribbons. -1112207 - Blue-Ribboned Quote Ring - While the character chats, the quote bubble comes out decorated in sky blue ribbons. -1112208 - Skull Quote Ring - While the character chats, the quote bubble comes out as a skull. -1112209 - Blue-Hearted Quote Ring - While the character chats, the quote bubble comes out decorated in blue background and heart-shaped. -1112210 - Gold-Yellow Quote Ring - While the character chats, the quote bubble comes out decorated in glimmering yellow star background and in black font. -1112211 - Pink Lady Quote Ring - While the character chats, the quote bubble comes out decorated in glimmering pink star background and in white font. -1112212 - Silver-Blue Quote Ring - While the character chats, the quote bubble comes out decorated in glimmering silver star background and in black font. -1112213 - Gold-Yellow Quote Ring 2 - While the character chats, the quote bubble comes out decorated in glimmering yellow star background and in white font. -1112214 - Pink Lady Quote Ring 2 - While the character chats, the quote bubble comes out decorated in glimmering pink star background and in black font. -1112215 - BlueMarine Quote Ring - While the character chats, the quote bubble comes out decorated in glimmering blue star background and in white font. -1112216 - Kitty Quote Ring - While the character chats, the quote bubble comes out decorated in brown cat background and in black font. -1112217 - Paw-Print Quote Ring - While the character chats, the quote bubble comes out decorated in brown dogprinted background and in white font. -1112218 - Teddy Bear Quote Ring - While the character chats, the quote bubble comes out decorated in brown teddybear background and in black font. -1112219 - Scoreboard Quote Ring - While the character chats, the quote bubble comes out decorated in scoreboard background and in yellow font. -1112220 - SK Basketball Team Quote Ring - While the character chats, the quote bubble comes out decorated in blue SK Basketball Team background and in white font. -1112221 - KTF Basketball Team Quote Ring - While the character chats, the quote bubble comes out decorated in orange KTF basketball gear and in black font. -1112222 - Starflower Ring - While the character chats, the quote bubble comes out decorated in starflower background and in white font. -1112223 - Beach Quote Ring - While the character chats, the quote bubble comes out decorated in beach-themed background. -1112224 - Chocolate Quote Ring - While the character chats, the quote bubble comes out decorated in chocolate. -1112225 - Pink Candy Quote Ring - While the character chats, the quote bubble comes out decorated in pink candy. -1112226 - White Cloud Quote Ring - While the character chats, the quote bubble comes out decorated in white cloud. -1112227 - Rainbow Quote Ring - While the character chats, the quote bubble comes out decorated in rainbow. -1112228 - Coke Quote Ring - While the character chats, the quote bubble comes out decorated in coke-themed background. -1112229 - Coke(Red) Quote Ring - While the character chats, the quote bubble is in a state of Coke. -1112230 - Coke(White) Quote Ring - While the character chats, the quote bubble is in a state of Coke. -1112231 - Gingerman Quote Ring - While the character chats, the quote bubble comes out decorated in Gingerman cookie. -1112232 - Rainbow Quote Ring - While the character chats, the quote bubble comes out decorated in rainbow and clouds. -1112233 - Red Notebook Quote Ring - While the character chats, the quote bubble comes out with a red notepad as a background. -1112234 - Blue Notebook Quote Ring - While the character chats, the quote bubble comes out with a blue notepad as a background. -1112235 - Green Notebook Quote Ring - While the character chats, the quote bubble comes out with a green notepad as a background. -1112300 - Ring of Moon Stone 1Carats - (no description) -1112301 - Ring of Moon Stone: 2 Carats - (no description) -1112302 - Ring of Moon Stone 3Carats - (no description) -1112303 - Ring of Shining Star 1Carats - (no description) -1112304 - Ring of Shining Star 2Carats - (no description) -1112305 - Ring of Shining Star 3Carats - (no description) -1112306 - Gold Heart Ring 1Carats - (no description) -1112307 - Gold Heart Ring: 2 Carats - (no description) -1112308 - Gold Heart Ring: 3 Carats - (no description) -1112309 - Ring of Silver Wing 1Carats - (no description) -1112310 - Ring of Silver Wing: 2 Carats - (no description) -1112311 - Ring of Silver Wing: 3 Carats - (no description) -1112800 - Friendship Ring : Clover - Put on this ring with your friend, stand next to each other, and see the clover effect -1112801 - Friendship Ring : Flower Petal - Put on this ring with your friend, stand next to each other, and see the flower petal effect -1112802 - Friendship Ring : Star - Put on this ring with your friend, stand next to each other, and see the star effect -1112803 - Moonstone Wedding Ring - Wedding ring that shows two people are married -1112806 - Star gem Wedding Ring - Wedding ring that shows two people are married -1112807 - Golden Heart Wedding Ring - Wedding ring that shows two people are married -1112808 - MapleBowl Quote Ring - While the character chats, the quote bubble comes out decorated with a border featuring a football helmet and orange dots, with a white background and written in black font. -1112809 - Silver Swan Wedding Ring - Wedding ring that shows two people are married -1112900 - Lalala Ring - With this ring, colored musical notes swirl around the character. -1112901 - Starry Spotlight Ring - With this ring, sparkling stars swirl around the character. -1112903 - Amorian Aura Ring - It is a floating ring of hearts that surround the avatar. -1112904 - Rainbow Star Ring - It is a floating ring of rainbows that surround the avatar. -1112007 - Mistletoe Crush Ring - A mistletoe is a symbol of love! A wonderful way to show someone you are thinking about them during the holidays! When purchased, enter the name of the character you're being a couple with, then the item works for both. When the two are together, an effect comes out. Also, it can only be that of one male and one female character. -1112908 - Aura Ring - When you walk around with this ring on, the power of the Aura gem on the ring is triggered and gives a #c+1 boost for every stat#. -1112905 - Bright Hot Pink Heart - Numerous bright, pink hearts swirl around the character that wears this ring. -1112906 - Baby Pink Heart - A baby pink heart floats over the character's head, circling around making hearts. -1112012 - Rose Crush Ring - Get tangled in the vines of love with the Rose Crush Ring! A wonderful way to show someone you are thinking about them! When purchased, enter the name of the character you're being a couple with, then the item works for both. When the two are together, an effect comes out. Also, it can only be that of one male and one female character. -1112126 - Brown Teddy Label Ring - Under the character avatar, the name of the character will be featured on top of adorable teddies. -1112236 - Brown Teddy Quote Ring - While the character chats, the quote bubble comes out decorated with a border featuring adorable teddies. -1112400 - Ring of Alchemist - (no description) -1112902 - Baba Blue - Pretty Blue heart that attracts love goes around the character. -1112407 - Circle of Ancient Thought - -1112408 - Circle of Ancient Strength - -1112401 - Spiegelmann's Ring - (no description) -1112402 - Spiegelmann's Ring - (no description) -1112405 - Lilin's Ring - Lilin's Ring that can be shared with any character in the same account. Cannot be put in a transaction with other accounts. -1112810 - Christmas Night Bells - Put on this ring with your friend, stand next to each other, and see the star effect -1112811 - Christmas Party - Put on this ring with your friend, stand next to each other, and see the star effect -1112413 - Lilin's Ring - Lilin's Ring that can be shared with any character in the same account. Cannot be put in a transaction with other accounts. -1112414 - Lilin's Ring - Lilin's Ring that can be shared with any character in the same account. Cannot be put in a transaction with other accounts. -1112812 - Shared Umbrella Ring - (no description) -1112916 - Solo Ring - (no description) diff --git a/tools/MapleIdRetriever/handbook/Equip/Shield.txt b/tools/MapleIdRetriever/handbook/Equip/Shield.txt deleted file mode 100644 index 408dd0de0d..0000000000 --- a/tools/MapleIdRetriever/handbook/Equip/Shield.txt +++ /dev/null @@ -1,57 +0,0 @@ -1092000 - Steel Shield - (no description) -1092001 - Red Triangular Shield - (no description) -1092002 - Red Cross Shield - (no description) -1092003 - Stolen Fence - (no description) -1092004 - Skull Shield - (no description) -1092005 - Wooden Buckler - (no description) -1092006 - Mithril Buckler - (no description) -1092007 - Battle Shield - (no description) -1092008 - Pan Lid - (no description) -1092009 - Wooden Legend Shield - (no description) -1092010 - Silver Legend Shield - (no description) -1092011 - Adamantium Legend Shield - (no description) -1092012 - Steel Tower Shield - (no description) -1092013 - Mithril Tower Shield - (no description) -1092014 - Adamantium Tower Shield - (no description) -1092015 - Steel Ancient Shield - (no description) -1092016 - Silver Ancient Shield - (no description) -1092017 - Gold Ancient Shield - (no description) -1092018 - Seclusion Wristguard - (no description) -1092019 - Nimble Wristguard - (no description) -1092020 - Jurgen Wristguard - (no description) -1092021 - Mystic Shield - (no description) -1092022 - Palette - (no description) -1092023 - Steel Aquila Shield - (no description) -1092024 - Silver Aquila Shield - (no description) -1092025 - Gold Aquila Shield - (no description) -1092026 - Bronze Kalkan - (no description) -1092027 - Silver Kalkan - (no description) -1092028 - Gold Kalkan - (no description) -1092029 - Esther Shield - (no description) -1092030 - Maple Shield - (no description) -1092031 - Ladybug Shield - (no description) -1092032 - Cookie Shield - (no description) -1092033 - Clover Shield - (no description) -1092034 - Red Devil Shield - (no description) -1092035 - Cokeplay Shield - (no description) -1092036 - Green Hoflon - (no description) -1092037 - Violet Hoflon - (no description) -1092038 - Blue Hoflon - (no description) -1092040 - Snowflake Shield - (no description) -1092041 - Skill-Earning Shield - (no description) -1092042 - Gellerhead Shield - (no description) -1092044 - Love Knuckler - (no description) -1092045 - Maple Magician shield - (no description) -1092046 - Maple Warrior shield - (no description) -1092047 - Maple Thief shield - (no description) -1092049 - Dragon Khanjar - (no description) -1092050 - Khanjar - (no description) -1092052 - Black Phoenix Shield - An immensely strong shield imbued with the power of elder warriors. The shield is rumored to grow stronger over time. -1092056 - Transparent Shield - (no description) -1092061 - Crossheider - (no description) -1092057 - Timeless Prelude - (no description) -1092058 - Timeless Kite Shield - (no description) -1092059 - Timeless List - (no description) -1092060 - Blue Dragon Shield - (no description) -1092062 - Maple Girl Shield - (no description) -1092039 - Leaf Fall - (no description) diff --git a/tools/MapleIdRetriever/handbook/Equip/Shoes.txt b/tools/MapleIdRetriever/handbook/Equip/Shoes.txt deleted file mode 100644 index f292b381a4..0000000000 --- a/tools/MapleIdRetriever/handbook/Equip/Shoes.txt +++ /dev/null @@ -1,421 +0,0 @@ -1070000 - Blue Gomushin - (no description) -1070001 - Black Santa Boots - (no description) -1070002 - Kimono Shoes - (no description) -1070003 - Black Shoes of Death - (no description) -1070004 - Blue Western Walkers - (no description) -1070005 - Santa Boy Boots - (no description) -1070006 - Royal Costume Shoes - (no description) -1070007 - Lunar Celebration Shoes - (no description) -1070009 - Paris Wingtips - Snazzy shoes for Grooms -1070014 - Veras Heels [m] - (no description) -1070015 - Bunny Boots [m] - (no description) -1070016 - Dandy Silver Sneaks - (no description) -1071000 - Blue Loose Sox - (no description) -1071001 - Red Loose Sox - (no description) -1071002 - Red Gomushin - (no description) -1071003 - Red Santa Boots - (no description) -1071004 - Pink Nurse Shoes - (no description) -1071005 - White Nurse Shoes - (no description) -1071006 - SF Ninja Shoes - (no description) -1071007 - Bunny Boots - (no description) -1071008 - Kimono Sandals - (no description) -1071009 - Red Western Walkers - (no description) -1071010 - Sea Queen Sandals - (no description) -1071011 - Race Queen Boots - (no description) -1071012 - Diao Chan Shoes - (no description) -1071013 - White Cat Shoes - (no description) -1071014 - Black Cat Shoes - (no description) -1071015 - Maid Shoes - (no description) -1071016 - Santa Girl Boots - (no description) -1071017 - Leopard Print Shoes - (no description) -1071018 - Brown Leather Boots - (no description) -1071019 - Lunar Celebration Pumps - (no description) -1071020 - Veras Heels - Traditional, elegant Bride heels -1071021 - Gothic Boots - (no description) -1071024 - Black Dress Shoes [f] - (no description) -1071025 - Paris Wingtips [f] - (no description) -1071026 - White High Top - (no description) -1072000 - Brown Jangoon Shoes - (no description) -1072001 - Red Rubber Boots - (no description) -1072002 - Steel Trigger - (no description) -1072003 - Emerald Battle Grieves - (no description) -1072004 - White Gomushin - (no description) -1072005 - Leather Sandals - (no description) -1072006 - Brown Basic Boots - (no description) -1072007 - Brown High Boots - (no description) -1072008 - Bronze Aroa Boots - (no description) -1072009 - Steel Grieves - (no description) -1072010 - Black Dress Shoes - (no description) -1072011 - Mithril War Boots - (no description) -1072012 - Red Whitebottom Boots - (no description) -1072013 - Red Air H's - (no description) -1072014 - Camping Boots - (no description) -1072015 - Brown Hard Leather Boots - (no description) -1072016 - Green Woodsman Boots - (no description) -1072017 - Blue Ankle-strap Sandals - (no description) -1072018 - Blue Sneakers - (no description) -1072019 - Blue Jewelry Boots - (no description) -1072020 - Purple Jewelry Boots - (no description) -1072021 - Red Jewelry Boots - (no description) -1072022 - Black Enamel Boots - (no description) -1072023 - Beige Nitty - (no description) -1072024 - Black Nitty - (no description) -1072025 - Deer Huntertop - (no description) -1072026 - Rabbit Huntertop - (no description) -1072027 - Brown Jack Boots - (no description) -1072028 - White Ninja Sandals - (no description) -1072029 - Yellow Ninja Sandals - (no description) -1072030 - Blue Ninja Sandals - (no description) -1072031 - Red Ninja Sandals - (no description) -1072032 - Bronze Chain Boots - (no description) -1072033 - Iron Chain Boots - (no description) -1072034 - Green Jack Boots - (no description) -1072035 - Silver Chain Boots - (no description) -1072036 - Gold Chain Boots - (no description) -1072037 - Yellow Rubber Boots - (no description) -1072038 - Blue Rubber Boots - (no description) -1072039 - Mithril Battle Grieves - (no description) -1072040 - Silver Battle Grieves - (no description) -1072041 - Blood Battle Grieves - (no description) -1072042 - Black Gomushin - (no description) -1072043 - Smelly Gomushin - (no description) -1072044 - Yellow Basic Boots - (no description) -1072045 - Blue Basic Boots - (no description) -1072046 - Orange High Boots - (no description) -1072047 - Blue High Boots - (no description) -1072048 - Brown Aroa Boots - (no description) -1072049 - Green Aroa Boots - (no description) -1072050 - Bronze Grieves - (no description) -1072051 - Silver War Boots - (no description) -1072052 - Dark War Boots - (no description) -1072053 - Gold War Boots - (no description) -1072054 - Orange Whitebottom Boots - (no description) -1072055 - Pink Whitebottom Boots - (no description) -1072056 - Blue Whitebottom Boots - (no description) -1072057 - Blue Air H's - (no description) -1072058 - Black Air H's - (no description) -1072059 - Green Hard Leather Boots - (no description) -1072060 - Brown Woodsman Boots - (no description) -1072061 - Blue Woodsman Boots - (no description) -1072062 - Red Ankle-strap Sandals - (no description) -1072063 - Brown Ankle-strap Sandals - (no description) -1072064 - Red Sneakers - (no description) -1072065 - Red Enamel Boots - (no description) -1072066 - Blue Enamel Boots - (no description) -1072067 - Bear Huntertop - (no description) -1072068 - Lion Huntertop - (no description) -1072069 - Red Jack Boots - (no description) -1072070 - Blue Gidder Shoes - (no description) -1072071 - Brown Gidder Shoes - (no description) -1072072 - Silver Windshoes - (no description) -1072073 - Yellow Windshoes - (no description) -1072074 - Black Windshoes - (no description) -1072075 - Red Magicshoes - (no description) -1072076 - Blue Magicshoes - (no description) -1072077 - White Magicshoes - (no description) -1072078 - Black Magicshoes - (no description) -1072079 - Red Hunter Boots - (no description) -1072080 - Blue Hunter Boots - (no description) -1072081 - Green Hunter Boots - (no description) -1072082 - Black Hunter Boots - (no description) -1072083 - Brown Hunter Boots - (no description) -1072084 - Blue Lappy Boots - (no description) -1072085 - Red Lappy Boots - (no description) -1072086 - Green Lappy Boots - (no description) -1072087 - Black Lappy Boots - (no description) -1072088 - Cowboy Boots - (no description) -1072089 - Purple Salt Shoes - (no description) -1072090 - Red Salt Shoes - (no description) -1072091 - Black Salt Shoes - (no description) -1072092 - Yellow Flippers - (no description) -1072093 - Blue Flippers - (no description) -1072094 - Yellow Rain Boots - (no description) -1072095 - Sky Blue Rain Boots - (no description) -1072096 - Red Rain Boots - (no description) -1072097 - Green Rain Boots - (no description) -1072098 - Blue Baseball Cleats - (no description) -1072099 - Red Baseball Cleats - (no description) -1072100 - Black Baseball Cleats - (no description) -1072101 - Blue Silky Boots - (no description) -1072102 - Green Silky Boots - (no description) -1072103 - Red Silky Boots - (no description) -1072104 - Red White-Lined Boots - (no description) -1072105 - Green White-Lined Boots - (no description) -1072106 - Blue White-Lined Boots - (no description) -1072107 - Black Red-Lined Shoes - (no description) -1072108 - Black Green-Lined Shoes - (no description) -1072109 - Black Yellow-Lined Shoes - (no description) -1072110 - Black Blue-Lines Shoes - (no description) -1072111 - Black Leather Boots - (no description) -1072112 - Mithril Trigger - (no description) -1072113 - Dark Trigger - (no description) -1072114 - Red Moon Shoes - (no description) -1072115 - Blue Moon Shoes - (no description) -1072116 - Gold Moon Shoes - (no description) -1072117 - Dark Moon Shoes - (no description) -1072118 - Red Pierre Shoes - (no description) -1072119 - Yellow Pierre Shoes - (no description) -1072120 - Brown Pierre Shoes - (no description) -1072121 - Blue Pierre Shoes - (no description) -1072122 - Brown Steel-Tip Boots - (no description) -1072123 - Green Steel-Tip Boots - (no description) -1072124 - Blue Steel-Tip Boots - (no description) -1072125 - Purple Steel-Tip Boots - (no description) -1072126 - Maroon Jangoon Shoes - (no description) -1072127 - Blue Jangoon Shoes - (no description) -1072128 - Blue Goni Shoes - (no description) -1072129 - Green Goni Shoes - (no description) -1072130 - Red Goni Shoes - (no description) -1072131 - Purple Goni Shoes - (no description) -1072132 - Emerald Hildon Boots - (no description) -1072133 - Mithril Hildon Boots - (no description) -1072134 - Orihalcon Hildon Boots - (no description) -1072135 - Gold Hildon Boots - (no description) -1072136 - Pink Goldrunners - (no description) -1072137 - Green Goldrunners - (no description) -1072138 - Orange Goldrunners - (no description) -1072139 - Blue Goldrunners - (no description) -1072140 - Pink Goldwind Shoes - (no description) -1072141 - Blue Goldwind Shoes - (no description) -1072142 - Purple Goldwind Shoes - (no description) -1072143 - Green Goldwind Shoes - (no description) -1072144 - Red Gore Boots - (no description) -1072145 - Blue Gore Boots - (no description) -1072146 - Green Gore Boots - (no description) -1072147 - Sapphire Camel Boots - (no description) -1072148 - Orihalcon Camel Boots - (no description) -1072149 - Blood Camel Boots - (no description) -1072150 - Blood Moss Boots - (no description) -1072151 - Gold Moss Boots - (no description) -1072152 - Dark Moss Boots - (no description) -1072153 - Transparent Shoes - Use these Shoes if you want to make your Shoes transparent while still using all of the stats your Shoes possess. -1072154 - Blue Carzen Boots - (no description) -1072155 - Purple Carzen Boots - (no description) -1072156 - Dark Carzen Boots - (no description) -1072157 - Blue Lapiz Sandals - (no description) -1072158 - Red Lapiz Sandals - (no description) -1072159 - Brown Lapiz Sandals - (no description) -1072160 - Gold Lapiz Sandals - (no description) -1072161 - Purple Mystique Shoes - (no description) -1072162 - Blue Mystique Shoes - (no description) -1072163 - Red Mystique Shoes - (no description) -1072164 - Blue Elf Shoes - (no description) -1072165 - Baige Elf Shoes - (no description) -1072166 - Green Elf Shoes - (no description) -1072167 - Dark Elf Shoes - (no description) -1072168 - Red Snowshoes - Put this on, and you won't be slipping around regardless of snow or ice. -1072169 - Blue Snowshoes - Put this on, and you won't be slipping around regardless of snow or ice. -1072170 - Green Snowshoes - Put this on, and you won't be slipping around regardless of snow or ice. -1072171 - Black Snowshoes - Put this on, and you won't be slipping around regardless of snow or ice. -1072172 - Green Pirate Boots - (no description) -1072173 - Red Pirate Boots - (no description) -1072174 - Dark Pirate Boots - (no description) -1072175 - Ninja Shoes - (no description) -1072176 - Military Boots - (no description) -1072177 - Green Enigma Shoes - (no description) -1072178 - Purple Enigma Shoes - (no description) -1072179 - Dark Enigma Shoes - (no description) -1072180 - Flipper Boots - (no description) -1072181 - Green Ting Slippers - (no description) -1072182 - Blue Wing Boots - (no description) -1072183 - Red Wing Boots - (no description) -1072184 - Green Wing Boots - (no description) -1072185 - Dark Wing Boots - (no description) -1072186 - Kitty Slipper - (no description) -1072187 - Blue Marble Slippers - (no description) -1072188 - Red Marble Slippers - (no description) -1072189 - Bunny Slippers - (no description) -1072190 - Blue B-ball Sneakers - (no description) -1072191 - Orange B-ball Sneakers - (no description) -1072192 - Green Osfa Boots - (no description) -1072193 - Brown Osfa Boots - (no description) -1072194 - Purple Osfa Boots - (no description) -1072195 - Red Osfa Boots - (no description) -1072196 - Emerald War Greave - (no description) -1072197 - Orihalcon War Greave - (no description) -1072198 - Dark War Greave - (no description) -1072199 - Ragged Korean Rubber Shoes - (no description) -1072200 - Brown Dress Shoes - (no description) -1072201 - Red Leather Boots - (no description) -1072202 - Mesoranger Boots - (no description) -1072203 - Red Ades Shoes - (no description) -1072204 - Green Ades Shoes - (no description) -1072205 - Dark Ades Shoes - (no description) -1072206 - Blue Neli Shoes - (no description) -1072207 - Green Neli Shoes - (no description) -1072208 - Red Neli Shoes - (no description) -1072209 - Dark Neli Shoes - (no description) -1072210 - Red Rivers Boots - (no description) -1072211 - Blue Rivers Boots - (no description) -1072212 - Dark Rivers Boots - (no description) -1072213 - Green Katina Boots - (no description) -1072214 - Blue Katina Boots - (no description) -1072215 - Red Katina Boots - (no description) -1072216 - Dark Katina Boots - (no description) -1072217 - Beige Golashes - (no description) -1072218 - Sky Blue Golashes - (no description) -1072219 - Pink Golashes - (no description) -1072220 - Green Crescent Boots - (no description) -1072221 - Blue Crescent Boots - (no description) -1072222 - Dark Crescent Boots - (no description) -1072223 - Green Varr Shoes - (no description) -1072224 - Blue Varr Shoes - (no description) -1072225 - Red Varr Shoes - (no description) -1072226 - Dark Varr Shoes - (no description) -1072227 - Red Arnah Shoes - (no description) -1072228 - Blue Arnah Shoes - (no description) -1072229 - Green Arnah Shoes - (no description) -1072230 - Black Boxing Shoes - (no description) -1072231 - Blue Boxing Shoes - (no description) -1072232 - Red Boxing Shoes - (no description) -1072233 - Bear Shoes - (no description) -1072234 - Bubbling Slippers - (no description) -1072235 - Slime Slippers - (no description) -1072236 - Guan Yu Shoes - (no description) -1072237 - Zhu-Ge-Liang Shoes - (no description) -1072238 - Violet Snowshoes - Put this on, and you won't be slipping around regardless of snow or ice. -1072239 - Yellow Snowshoes - Put this on, and you won't be slipping around regardless of snow or ice. -1072240 - Big Rabbit Feet - (no description) -1072241 - Liu Bei Shoes - (no description) -1072242 - Cao Cao Shoes - (no description) -1072243 - Sun Quan Shoes - (no description) -1072244 - Red Enamel Shoes - (no description) -1072245 - Blue Enamel Shoes - (no description) -1072246 - Pink Sneakers - (no description) -1072247 - Hunting Boots - (no description) -1072248 - Blue Basketball Shoes - (no description) -1072249 - Orange Basketball Shoes - (no description) -1072250 - Horoscope Shoes - (no description) -1072251 - Pro-Cat Sticker - (no description) -1072252 - Snowboard Boots - (no description) -1072253 - Snowman Shoes - (no description) -1072254 - Football Cleats(Home) - (no description) -1072255 - Football Cleats(Away) - (no description) -1072256 - Teddy Bear Shoes - (no description) -1072257 - Puppy Slippers - (no description) -1072258 - Kitty Slippers - (no description) -1072259 - Chick Slippers - (no description) -1072260 - Penguin Slippers - (no description) -1072261 - Yellow Strap Shoes - (no description) -1072262 - Black Strap Shoes - (no description) -1072263 - Green Strap Shoes - (no description) -1072264 - Silver Strap Shoes - (no description) -1072265 - Blue Soccer Cleats - (no description) -1072266 - Black Soccer Cleats - (no description) -1072267 - Red Soccer Cleats - (no description) -1072268 - Blue Elemental Shoes - (no description) -1072269 - Red Hunter Shoes - (no description) -1072272 - Black Garina Shoes - (no description) -1072273 - Blue Dragon Boots - (no description) -1072274 - Moon Bunny Paws - (no description) -1072275 - Fonla's Slippers - (no description) -1072276 - Booster Shoes - (no description) -1072277 - Red Elf shoes - (no description) -1072278 - Rudolph Slippers - (no description) -1072279 - Super Booster Shoes - (no description) -1072280 - Golden Shoes - (no description) -1072281 - Sachiel Shoes - (no description) -1072282 - Veamoth Shoes - (no description) -1072283 - Janus Shoes - (no description) -1072284 - Zhu Ba Jie Shoes - (no description) -1072285 - Brown Lagger Slipper - (no description) -1072288 - Brown Skeedy Sandals - (no description) -1072291 - Brown Wooden Krag - (no description) -1072294 - Brown Paulie Boots - (no description) -1072297 - Brown Locote Shoes - (no description) -1072300 - Brown Leather Krag - (no description) -1072303 - Brown Double Boots - (no description) -1072306 - Black Basile Boots - (no description) -1072309 - Black Voyson Shoes - (no description) -1072312 - Blue Pageant - (no description) -1072315 - Black Markintz - (no description) -1072318 - Black Duke Barkin Shoes - (no description) -1072321 - Canopus Boots - (no description) -1072322 - Rollerskates - (no description) -1072323 - Starry Slippers - (no description) -1072324 - Piggy Slippers - (no description) -1072325 - Red Slime Slippers - (no description) -1072326 - Yellow Slime Slippers - (no description) -1072327 - Tania En Fuego - (no description) -1072328 - Mercury Lighning - (no description) -1072329 - Flipped Blue High Top - (no description) -1072330 - Checkered Sneakers - (no description) -1072331 - Velcro Vivid High Shoes - (no description) -1072332 - Black Enamel Shoes - (no description) -1072333 - Green Checkered Sneakers - (no description) -1072334 - Red Checkered Sneakers - (no description) -1072335 - Natural Golashes - (no description) -1072336 - Soccer Cleats - (no description) -1072337 - Fluffy Slippers - (no description) -1072338 - Purple Snowshoes - Put this on, and you won't be slipping around regardless of snow or ice. -1072341 - Orange Checkered Sneakz - (no description) -1072342 - Bosshunter Greaves - (no description) -1072343 - Bosshunter Boots - (no description) -1072344 - Facestompers - (no description) -1072345 - Bosshunter Greaves - (no description) -1072346 - Bosshunter Boots - (no description) -1072347 - Olive Green Kicks - (no description) -1072348 - Elephant Slippers - (no description) -1072349 - Green Checkered Sneakz - (no description) -1072350 - Black High Tops - (no description) -1072351 - Green Ankle Boots for Transformation - (no description) -1072352 - Red Silky Boots for Transformation - (no description) -1072353 - White Ninja Sandals for Transformation - (no description) -1072354 - Black Voyson Shoes for Transformation - (no description) -1072360 - White & Blue Sandals - (no description) -1072367 - Puffy Ram Shoes - (no description) -1072373 - Purple Rainbow Sneaks - (no description) -1072371 - Custom Blue High Tops - (no description) -1072370 - Gaga Shoes - (no description) -1072355 - Timeless Grabbe - (no description) -1072356 - Timeless Cabatina - (no description) -1072357 - Timeless Rontano - (no description) -1072358 - Timeless Moonsteed - (no description) -1072359 - Timeless Faraon - (no description) -1072361 - Reverse Grabbe - (no description) -1072362 - Reverse Cabatina - (no description) -1072363 - Reverse Rontano - (no description) -1072364 - Reverse Moonsteed - (no description) -1072365 - Reverse Faraon - (no description) -1072366 - Parachute Agent Shoes - (no description) -1072368 - Ultimate Agent Shoes - (no description) -1072369 - Squishy Shoes - (no description) -1072379 - Yellow Rainbow Sneaks - (no description) -1072380 - White & Blue Sandals - (no description) -1072384 - Bling Bling Shoes - (no description) -1072395 - Mix-n-Match Sneakers - (no description) -1072394 - Pink Polka-Dotted Boots - (no description) -1072392 - Red Ankle-Strap Shoes - (no description) -1072406 - Chaos Metallic Shoes - (no description) -1072404 - Alchemist Shoes - (no description) -1072408 - Maple Racing Shoes - (no description) -1072405 - Ninja Shoes - (no description) -1072375 - Balrog's Leather Shoes - (no description) -1072376 - Balrog's Fur Shoes - (no description) -1072377 - Treacherous Wolf Shoes - (no description) -1072382 - Brave Soldier Shoes - (no description) -1072383 - Average Musashi Shoes - (no description) -1072419 - Andras Shoes - (no description) -1072420 - Marbas Shoes - (no description) -1072421 - Valefor Shoes - (no description) -1072422 - Amdusias Shoes - (no description) -1072423 - Crocell Shoes - (no description) -1072381 - Aran Combat Shoes - (no description) -1072388 - Stripe Knee Socks - (no description) -1072374 - Lace Long Boots - (no description) -1072407 - Kawaii Kitty Shoes - (no description) -1072399 - King Pepe Dark Walker - (no description) -1072400 - King Pepe Black Salt Shoes - (no description) -1072401 - King Pepe Red Silky Boots - (no description) -1072402 - King Pepe Blue Lined Boots - (no description) -1072403 - King Pepe Brown Pirate Shoes - (no description) -1072417 - Clown Shoes - (no description) -1072427 - Red Christmas Sock - (no description) -1072428 - Green Christmas Sock - (no description) -1072429 - Navy Christmas Sock - (no description) -1072430 - White Christmas Sock - (no description) -1072431 - Yellow Christmas Sock - (no description) -1072432 - Purple Christmas Sock - (no description) -1072418 - Average Black Boots - (no description) -1072425 - Freud's Shoes - (no description) -1072437 - Pink Bean Shoes - (no description) diff --git a/tools/MapleIdRetriever/handbook/Equip/Taming.txt b/tools/MapleIdRetriever/handbook/Equip/Taming.txt deleted file mode 100644 index f9e0cf1646..0000000000 --- a/tools/MapleIdRetriever/handbook/Equip/Taming.txt +++ /dev/null @@ -1,33 +0,0 @@ -1902000 - Hog - (no description) -1902001 - Silver Mane - (no description) -1902002 - Red Draco - (no description) -1912000 - Saddle - (no description) -1912003 - Frog Cover - You must have an in-game mount (Watch Hog, Silver Boar, etc) to use this mount cover. -1912004 - Ostrich Cover - You must have an in-game mount (Watch Hog, Silver Boar, etc) to use this mount cover. -1902008 - Frog - You must have an in-game mount (Watch Hog, Silver Boar, etc) to use this mount cover. -1902009 - Ostrich - You must have an in-game mount (Watch Hog, Silver Boar, etc) to use this mount cover. -1902011 - Turtle - This monster must be used with the #cTurtle Mount#. -1902012 - Yeti - You must have an in-game mount (Watch Hog, Silver Boar, etc) to use this mount cover. -1912008 - Yeti Cover - You must have an in-game mount (Watch Hog, Silver Boar, etc) to use this mount cover. -1912007 - Turtle Mount - This mount must be used with the #cTurtle# monster. -1902005 - Mimiana - (no description) -1902006 - Mimio - (no description) -1902007 - Shinjou - (no description) -1902010 - Frog - You must be over level 70 in order to use this item and have an in-game mount (Hog, Silver Mane, Red Draco) to use this mount cover. -1912005 - Saddle - (no description) -1912006 - Frog Cover - You must be over level 70 in order to use this item and have an in-game mount (Hog, Silver Mane, Red Draco) to use this mount cover. -1902021 - Robot - You must be over level 70 in order to use this item and have an in-game mount (Hog, Silver Mane, Red Draco) to use this mount cover. -1912014 - Robot Cover - You must be over level 70 in order to use this item and have an in-game mount (Hog, Silver Mane, Red Draco) to use this mount cover. -1912029 - Maple Racing Car Cover - You must be over level 70 in order to use this item and have an in-game mount (Hog, Silver Mane, Red Draco) to use this mount cover. -1902036 - Maple Racing Car - You must be over level 70 in order to use this item and have an in-game mount (Hog, Silver Mane, Red Draco) to use this mount cover. -1912031 - Pink Scooter Key - You must have an in-game mount (Watch Hog, Silver Boar, etc) to use this mount cover. -1912032 - Black Scooter Key - You must have an in-game mount (Watch Hog, Silver Boar, etc) to use this mount cover. -1902038 - Pink Scooter - You must have an in-game mount (Watch Hog, Silver Boar, etc) to use this mount cover. -1902039 - Black Scooter - You must have an in-game mount (Watch Hog, Silver Boar, etc) to use this mount cover. -1902020 - Hot Air Balloon - You must be over level 70 in order to use this item and have an in-game mount (Hog, Silver Mane, Red Draco) to use this mount cover. -1912013 - Hot Air Balloon Cover - You must be over level 70 in order to use this item and have an in-game mount (Hog, Silver Mane, Red Draco) to use this mount cover. -1902015 - Werewolf - (no description) -1902016 - Werewolf - (no description) -1902017 - Werewolf - (no description) -1902018 - Ryko - (no description) -1912011 - Wolf Saddle - (no description) diff --git a/tools/MapleIdRetriever/handbook/Equip/Weapon.txt b/tools/MapleIdRetriever/handbook/Equip/Weapon.txt deleted file mode 100644 index 1c0a089baa..0000000000 --- a/tools/MapleIdRetriever/handbook/Equip/Weapon.txt +++ /dev/null @@ -1,1184 +0,0 @@ -1302107 - Black Crystal Blade - (no description) -1302000 - Sword - (no description) -1302001 - Saw - (no description) -1302002 - Viking Sword - (no description) -1302003 - Eloon - (no description) -1302004 - Cutlus - (no description) -1302005 - Sabre - (no description) -1302006 - Machete - (no description) -1302007 - Long Sword - (no description) -1302008 - Gladius - (no description) -1302009 - Traus - (no description) -1302010 - Jeweled Katar - (no description) -1302011 - Neocora - (no description) -1302012 - Red Katana - (no description) -1302013 - Red Whip - (no description) -1302014 - Old Gladius - (no description) -1302015 - Hero's Gladius - (no description) -1302016 - Yellow Umbrella - (no description) -1302017 - Sky Blue Umbrella - (no description) -1302018 - Khan - (no description) -1302019 - Nameless Sword - (no description) -1302020 - Maple Sword - (no description) -1302021 - Pico-Pico Hammer - (no description) -1302022 - Bamboo Sword - (no description) -1302023 - Fraute - (no description) -1302024 - Newspaper Sword - (no description) -1302025 - Red Umbrella - (no description) -1302026 - Black Umbrella - (no description) -1302027 - Green Umbrella - (no description) -1302028 - Light Purple Umbrella - (no description) -1302029 - Beige Umbrella - (no description) -1302030 - Maple Soul Singer - (no description) -1302031 - Diao Chan Sword - (no description) -1302032 - Hwa Ryung Ji Gum - (no description) -1302033 - Maple Flag - (no description) -1302034 - Pumpkin Basket - (no description) -1302035 - Maple Flag : 1000 Days - (no description) -1302036 - Maple Flag : 1000 Days - (no description) -1302037 - Trumpet - (no description) -1302038 - Gladius - (no description) -1302039 - Jeweled Katar - (no description) -1302040 - Neocora - (no description) -1302041 - Red Katana - (no description) -1302042 - Khan - (no description) -1302043 - Gladius - (no description) -1302044 - Jeweled Katar - (no description) -1302045 - Neocora - (no description) -1302046 - Red Katana - (no description) -1302047 - Khan - (no description) -1302049 - Glowing Whip - (no description) -1302050 - Gladius - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1302051 - Jeweled Katar - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1302052 - Neocora - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1302053 - Red Katana - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1302054 - Khan - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1302056 - Sparta - (no description) -1302057 - The Stars and Stripes - (no description) -1302058 - Maple Umbrella - (no description) -1302059 - Dragon Carabella - (no description) -1302060 - Huckle's Lamp - (no description) -1302062 - Pumpkin Basket (2006 SE) - (no description) -1302063 - Flaming Katana - (no description) -1302064 - Maple Glory Sword - (no description) -1302065 - Blue Maple Flag - (no description) -1302066 - Maple 1500 Anniv. Flag - (no description) -1302067 - Maple 1500 Anniv. Flag - (no description) -1302068 - Onyx Blade - (no description) -1302069 - Komodo Sword - (no description) -1302071 - Pink Flower Tube - (no description) -1302073 - Singapore Flag (Beginner) - (no description) -1302074 - Malaysia Flag (Beginner) - (no description) -1302075 - Singapore Flag (One Handed Sword) - (no description) -1302076 - Malaysia Flag (One Handed Sword) - (no description) -1302077 - Beginner Warrior's sword - (no description) -1302079 - Astral Blade - One of the Glimmer Man's custom weapons, this powerful blade is said to harness the very power of the stars. -1302080 - Maplemas Lights - (no description) -1302081 - Timeless Executioners - (no description) -1302083 - Viking Sword for Transformation - (no description) -1302086 - Reverse Executioners - (no description) -1302088 - Stirge-on-a-String - (no description) -1302089 - Stirge-on-a-Rope - (no description) -1302090 - Stirge-o-Whip - (no description) -1302091 - Stirge Grappler - (no description) -1302092 - Swooping Stirge - (no description) -1302093 - Frantic Strige - (no description) -1302094 - Angry Stirge - (no description) -1302095 - Lifeguard Saver - (no description) -1302098 - Lunch box (Lv 20) - A special lunchbox given to hold roughly 2 weeks' worth of lunch. Hits hard, hits fast! -1302099 - Lunch box (Lv 60) - A special lunchbox given to hold roughly 2 weeks' worth of lunch. Hits hard, hits fast! -1302100 - Lunch box (Lv 90) - A special lunchbox given to hold roughly 2 weeks' worth of lunch. Hits hard, hits fast! -1302101 - Lunch box (Lv 120) - A special lunchbox given to hold roughly 2 weeks' worth of lunch. Hits hard, hits fast! -1312000 - Double Axe - (no description) -1312001 - Battle Axe - (no description) -1312002 - Scythe - (no description) -1312003 - Misthil Axe - (no description) -1312004 - Hand Axe - (no description) -1312005 - Fireman's Axe - (no description) -1312006 - Dankke - (no description) -1312007 - Blue Counter - (no description) -1312008 - Buck - (no description) -1312009 - Hawkhead - (no description) -1312010 - Mikhail - (no description) -1312011 - Gaea - (no description) -1312012 - Hula Hoop - (no description) -1312013 - Green Paint Brush - (no description) -1312014 - Black Paint Brush - (no description) -1312015 - Vifennis - (no description) -1312016 - Contra Axe - (no description) -1312017 - Chief Axe - (no description) -1312018 - Buck - (no description) -1312019 - Hawkhead - (no description) -1312020 - Mikhail - (no description) -1312021 - Gaea - (no description) -1312022 - Buck - (no description) -1312023 - Hawkhead - (no description) -1312024 - Mikhail - (no description) -1312025 - Gaea - (no description) -1312026 - Buck - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1312027 - Hawkhead - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1312028 - Mikhail - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1312029 - Gaea - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1312030 - Tomahawk - (no description) -1312031 - Dragon Axe - (no description) -1312032 - Maple Steel Axe - (no description) -1312033 - Maple 1500 Anniv. Flag - (no description) -1312034 - Pink Flower Tube - (no description) -1312037 - Timeless Bardiche - (no description) -1312038 - Reverse Bardiche - (no description) -1322000 - Mace - (no description) -1322001 - Hammer - (no description) -1322002 - Iron Mace - (no description) -1322003 - Lollipop - (no description) -1322004 - Fusion Mace - (no description) -1322005 - Wooden Club - (no description) -1322006 - Steel Pipe - (no description) -1322007 - Leather Purse - (no description) -1322008 - Hard Briefcase - (no description) -1322009 - Plunger - (no description) -1322010 - Square Shovel - (no description) -1322011 - Pointed Shovel - (no description) -1322012 - Red Brick - (no description) -1322013 - Wizet Secret Agent Suitcase - (no description) -1322014 - War Hammer - (no description) -1322015 - Heavy Hammer - (no description) -1322016 - Jacker - (no description) -1322017 - Knuckle Mace - (no description) -1322018 - Tamus - (no description) -1322019 - The Judgement - (no description) -1322020 - Bent Judgement - (no description) -1322021 - Black Tube - (no description) -1322022 - Red Flowery Tube - (no description) -1322023 - Blue Flowery Tube - (no description) -1322024 - Purple Tube - (no description) -1322025 - Emergency Rescue Tube - (no description) -1322026 - Colorful Tube - (no description) -1322027 - Frying Pan - (no description) -1322028 - Heaven's Justice - (no description) -1322029 - Ruin Hammer - (no description) -1322030 - M Purse - (no description) -1322031 - Pig Illustrated - (no description) -1322032 - Iron Hammer - (no description) -1322033 - Goblin Bat - (no description) -1322034 - Chul Jil To Gol Ta - (no description) -1322035 - War Hammer - (no description) -1322036 - Knuckle Mace - (no description) -1322037 - Tamus - (no description) -1322038 - The Judgement - (no description) -1322039 - Heaven's Justice - (no description) -1322040 - War Hammer - (no description) -1322041 - Knuckle Mace - (no description) -1322042 - Tamus - (no description) -1322043 - The Judgement - (no description) -1322044 - Heaven's Justice - (no description) -1322045 - Battle Hammer - (no description) -1322046 - War Hammer - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1322047 - Knuckle Mace - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1322048 - Tamus - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1322049 - The Judgement - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1322050 - Heaven's Justice - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1322051 - Fruity Bamboo - (no description) -1322052 - Dragon Mace - (no description) -1322053 - Golden Mace - (no description) -1322054 - Maple Havoc Hammer - (no description) -1322055 - Maple 1500 Anniv. Flag - (no description) -1322056 - Pink Flower Tube - (no description) -1322059 - Cosmic Scepter - One of the Glimmer Man's custom weapons, this massive mace has an antimatter core which gives it exceptional striking power. -1322060 - Timeless Allargando - (no description) -1322062 - Crushed Skull - (no description) -1322063 - Duck tube - (no description) -1322064 - Duck tube - (no description) -1332000 - Triangular Zamadar - (no description) -1332001 - Halfmoon Zamadar - (no description) -1332002 - Triple-Tipped Zamadar - (no description) -1332003 - Shinkita - (no description) -1332004 - Forked Dagger - (no description) -1332005 - Razor - (no description) -1332006 - Field Dagger - (no description) -1332007 - Fruit Knife - (no description) -1332008 - Coconut Knife - (no description) -1332009 - Cass - (no description) -1332010 - Iron Dagger - (no description) -1332011 - Bazlud - (no description) -1332012 - Reef Claw - (no description) -1332013 - Stinger - (no description) -1332014 - Gephart - (no description) -1332015 - Deadly Fin - (no description) -1332016 - Sai - (no description) -1332017 - Serpent's Coil - (no description) -1332018 - Kandine - (no description) -1332019 - Golden River - (no description) -1332020 - Korean Fan - (no description) -1332021 - Plastic Bottle - (no description) -1332022 - Angelic Betrayal - (no description) -1332023 - Dragon's Tail - (no description) -1332024 - Bushido - (no description) -1332025 - Maple Wagner - (no description) -1332026 - Cursayer - (no description) -1332027 - Varkit - (no description) -1332029 - Liu Bei Dagger - (no description) -1332030 - Fan - (no description) -1332031 - Dragon Toenail - (no description) -1332032 - Christmas Tree - (no description) -1332033 - Reef Claw - (no description) -1332034 - Shinkita - (no description) -1332035 - Deadly Fin - (no description) -1332036 - Kandine - (no description) -1332037 - Dragon's Tail - (no description) -1332038 - Reef Claw - (no description) -1332039 - Shinkita - (no description) -1332040 - Deadly Fin - (no description) -1332041 - Kandine - (no description) -1332042 - Dragon's Tail - (no description) -1332043 - Reef Claw - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1332044 - Shinkita - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1332045 - Deadly Fin - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1332046 - Kandine - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1332047 - Dragon's Tail - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1332049 - Dragon Kanzir - (no description) -1332050 - Dragon Kreda - (no description) -1332051 - Gold Double Knife - (no description) -1332052 - Blood Dagger - (no description) -1332053 - Kebob - (no description) -1332054 - Diamond Dagger - (no description) -1332055 - Maple Dark Mate - (no description) -1332056 - Maple Asura Dagger - (no description) -1332057 - Maple 1500 Anniv. Flag - (no description) -1332058 - Darkstar Dagger - (no description) -1332059 - Pink Flower Tube - (no description) -1332063 - Beginner Thief's short sword - (no description) -1332064 - Nebula Dagger 1 (LUK) - One of the Glimmer Man's custom weapons, this swift dagger is said to strike with the power of a supernova. -1332065 - Nebula Dagger 2 (STR) - One of the Glimmer Man's custom weapons, this swift dagger is said to strike with the power of a supernova. -1332066 - Razor - (no description) -1332067 - Maku(LUK) - (no description) -1332068 - Makusuma(LUK) - (no description) -1332069 - Makumagna(LUK) - (no description) -1332070 - Maku(STR) - (no description) -1332071 - Makusuma(STR) - (no description) -1332072 - Makumagna(STR) - (no description) -1332077 - Raven's Beak - (no description) -1332078 - Night Raven's Beak - (no description) -1332079 - Dawn Raven's Beak - (no description) -1332080 - Dusk Raven's Beak - (no description) -1372000 - Fairy Wand - (no description) -1372001 - Wizard Wand - (no description) -1372002 - Metal Wand - (no description) -1372003 - Mithril Wand - (no description) -1372004 - Ice Wand - (no description) -1372005 - Wooden Wand - (no description) -1372006 - Hardwood Wand - (no description) -1372007 - Cromi - (no description) -1372008 - Hinomaru Fan - (no description) -1372009 - Magicodar - (no description) -1372010 - Dimon Wand - (no description) -1372011 - Zhu-Ge-Liang Wand - (no description) -1372012 - Crystal Wand - (no description) -1372014 - Evil Tale - (no description) -1372015 - Angel Wings - (no description) -1372016 - Phoenix Wand - (no description) -1372017 - Streetlight - (no description) -1372018 - Wizard Wand - (no description) -1372019 - Cromi - (no description) -1372020 - Evil Tale - (no description) -1372021 - Angel Wings - (no description) -1372022 - Wizard Wand - (no description) -1372023 - Cromi - (no description) -1372024 - Evil Tale - (no description) -1372025 - Angel Wings - (no description) -1372027 - Wizard Wand - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1372028 - Cromi - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1372029 - Evil Tale - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1372030 - Angel Wings - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1372031 - Heart Staff - (no description) -1372032 - Dragon Wand - (no description) -1372033 - Heart Wand - (no description) -1372034 - Maple Shine Wand - (no description) -1372035 - Elemental Wand 1 - (no description) -1372036 - Elemental Wand 2 - (no description) -1372037 - Elemental Wand 3 - (no description) -1372038 - Elemental Wand 4 - (no description) -1372039 - Elemental Wand 5 - (no description) -1372040 - Elemental Wand 6 - (no description) -1372041 - Elemental Wand 7 - (no description) -1372042 - Elemental Wand 8 - (no description) -1372043 - Beginner Magician's wand - (no description) -1382000 - Wooden Staff - (no description) -1382001 - Arc Staff - (no description) -1382002 - Wizard Staff - (no description) -1382003 - Sapphire Staff - (no description) -1382004 - Old Wooden Staff - (no description) -1382005 - Emerald Staff - (no description) -1382006 - Thorns - (no description) -1382007 - Evil Wings - (no description) -1382008 - Kage - (no description) -1382009 - Maple Staff - (no description) -1382010 - Dark Ritual - (no description) -1382011 - Mystic Cane - (no description) -1382012 - Maple Lama Staff - (no description) -1382013 - Hwa Ryung Ji Jang - (no description) -1382014 - Sun Quan Staff - (no description) -1382015 - Poison Mushroom - (no description) -1382016 - Pyogo Mushroom - (no description) -1382017 - Circle-Winded Staff - (no description) -1382018 - Petal Staff - (no description) -1382019 - Hall Staff - (no description) -1382020 - Arc Staff - (no description) -1382021 - Thorns - (no description) -1382022 - Evil Wings - (no description) -1382023 - Dark Ritual - (no description) -1382024 - Kage - (no description) -1382025 - Arc Staff - (no description) -1382026 - Thorns - (no description) -1382027 - Evil Wings - (no description) -1382028 - Dark Ritual - (no description) -1382029 - Kage - (no description) -1382030 - Arc Staff - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1382031 - Thorns - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1382032 - Evil Wings - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1382033 - Dark Ritual - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1382034 - Kage - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1382035 - Blue Marine - (no description) -1382036 - Dragon Staff - (no description) -1382037 - Doomsday Staff - (no description) -1382039 - Maple Wisdom Staff - (no description) -1382040 - Maple 1500 Anniv. Flag - (no description) -1382041 - Nocturnal Staff - (no description) -1382042 - Pink Flower Tube - (no description) -1382045 - Elemental Staff 1 - (no description) -1382046 - Elemental Staff 2 - (no description) -1382047 - Elemental Staff 3 - (no description) -1382048 - Elemental Staff 4 - (no description) -1382049 - Elemental Staff 5 - (no description) -1382050 - Elemental Staff 6 - (no description) -1382051 - Elemental Staff 7 - (no description) -1382052 - Elemental Staff 8 - (no description) -1382053 - Celestial Staff - One of the Glimmer Man's custom weapons, this staff contains concentrated chaos magic for devastating effects! -1382054 - Umaru - (no description) -1382055 - Umarusuma - (no description) -1382056 - Umarumagna - (no description) -1382058 - Wooden Staff for Transformation - (no description) -1382060 - Crimson Arcanon - (no description) -1402000 - Two-Handed Sword - (no description) -1402001 - Wooden Sword - (no description) -1402002 - Scimitar - (no description) -1402003 - Lion's Fang - (no description) -1402004 - Blue Screamer - (no description) -1402005 - Berzerker - (no description) -1402006 - Lionheart - (no description) -1402007 - Zard - (no description) -1402008 - Broadsword - (no description) -1402009 - Wooden Baseball Bat - (no description) -1402010 - Aluminum Baseball Bat - (no description) -1402011 - Sparta - (no description) -1402012 - Doombringer - (no description) -1402013 - Japanese Map - (no description) -1402014 - Thermometer - (no description) -1402015 - Heaven's Gate - (no description) -1402016 - Devil's Sunrise - (no description) -1402017 - Daiwa Sword - (no description) -1402018 - Wooden Samurai Sword - (no description) -1402019 - Scimitar - (no description) -1402020 - Lion's Fang - (no description) -1402021 - Sparta - (no description) -1402022 - Doombringer - (no description) -1402023 - Heaven's Gate - (no description) -1402024 - Scimitar - (no description) -1402025 - Lion's Fang - (no description) -1402026 - Sparta - (no description) -1402027 - Doombringer - (no description) -1402028 - Heaven's Gate - (no description) -1402029 - Aluminum Bat - (no description) -1402030 - Scimitar - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1402031 - Lion's Fang - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1402032 - Sparta - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1402033 - Doombringer - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1402034 - Heaven's Gate - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1402035 - The Beheader - (no description) -1402036 - Dragon Claymore - (no description) -1402037 - Stonetooth Sword - (no description) -1402039 - Maple Soul Rohen - (no description) -1402040 - Maple 1500 Anniv. Flag - (no description) -1402041 - Pink Flower Tube - (no description) -1402044 - Pumpkin Lantern - (no description) -1402045 - Tiger's Fang - (no description) -1402046 - Timeless Nibleheim - (no description) -1402048 - Raven's Wing - (no description) -1402049 - Night Raven's Wing - (no description) -1402050 - Dawn Raven's Wing - (no description) -1402051 - Dusk Raven's Wing - (no description) -1412000 - Two-Handed Axe - (no description) -1412001 - Metal Axe - (no description) -1412002 - Iron Axe - (no description) -1412003 - The Rising - (no description) -1412004 - Niam - (no description) -1412005 - Sabretooth - (no description) -1412006 - Blue Axe - (no description) -1412007 - The Shining - (no description) -1412008 - Chrono - (no description) -1412009 - Helios - (no description) -1412010 - Colonian Axe - (no description) -1412011 - Maple Dragon Axe - (no description) -1412012 - Iron Axe - (no description) -1412013 - The Rising - (no description) -1412014 - The Shining - (no description) -1412015 - Chrono - (no description) -1412016 - Helios - (no description) -1412017 - The Rising - (no description) -1412018 - The Shining - (no description) -1412019 - Chrono - (no description) -1412020 - Helios - (no description) -1412021 - Tavar - (no description) -1412022 - The Rising - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1412023 - The Shining - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1412024 - Chrono - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1412025 - Helios - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1412026 - Dragon Battle Axe - (no description) -1412027 - Maple Demon Axe - (no description) -1412028 - Maple 1500 Anniv. Flag - (no description) -1412029 - Pink Flower Tube - (no description) -1412032 - Crescent Moon - One of the Glimmer Man's custom weapons, this deadly axe is known to decimate foes in the blink of an eye. -1412033 - Timeless Tabarzin - (no description) -1422000 - Wooden Mallet - (no description) -1422001 - Mithril Maul - (no description) -1422002 - Heavy Mace - (no description) -1422003 - Square Hammer - (no description) -1422004 - Monkey Wrench - (no description) -1422005 - Golden Mole - (no description) -1422006 - Pickaxe - (no description) -1422007 - Titan - (no description) -1422008 - Sledgehammer - (no description) -1422009 - The Blessing - (no description) -1422010 - Gigantic Sledge - (no description) -1422011 - Sake Bottle - (no description) -1422012 - The Morningstar - (no description) -1422013 - Leomite - (no description) -1422014 - Maple Doom Singer - (no description) -1422015 - Golden Mole - (no description) -1422016 - The Blessing - (no description) -1422017 - Gigantic Sledge - (no description) -1422018 - The Morningstar - (no description) -1422019 - Golden Mole - (no description) -1422020 - The Blessing - (no description) -1422021 - Gigantic Sledge - (no description) -1422022 - The Morningstar - (no description) -1422023 - Golden Mole - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1422024 - The Blessing - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1422025 - Gigantic Sledge - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1422026 - The Morningstar - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1422027 - Golden Smith Hammer - (no description) -1422028 - Dragon Flame - (no description) -1422029 - Maple Belzet - (no description) -1422030 - Pink Seal Cushion - (no description) -1422031 - Blue Seal Cushion - (no description) -1422032 - Maple 1500 Anniv. Flag - (no description) -1422033 - Pink Flower Tube - (no description) -1422036 - Toymaker Hammer - (no description) -1422037 - Timeless Bellocce - (no description) -1432000 - Spear - (no description) -1432001 - Fork on a Stick - (no description) -1432002 - Forked Spear - (no description) -1432003 - Nakamaki - (no description) -1432004 - Serpent's Tongue - (no description) -1432005 - Zeco - (no description) -1432006 - Holy Spear - (no description) -1432007 - Redemption - (no description) -1432008 - Fish Spear - (no description) -1432009 - Bamboo Spear - (no description) -1432010 - Omega Spear - (no description) -1432011 - Fairfrozen - (no description) -1432012 - Maple Impaler - (no description) -1432013 - Pumpkin Spear - (no description) -1432014 - Fish Spear - (no description) -1432015 - Red Ski - (no description) -1432016 - Orange Ski - (no description) -1432017 - Green Ski - (no description) -1432018 - Sky Ski - (no description) -1432019 - Forked Spear - (no description) -1432020 - Serpent's Tongue - (no description) -1432021 - Holy Spear - (no description) -1432022 - Redemption - (no description) -1432023 - Omega Spear - (no description) -1432024 - Forked Spear - (no description) -1432025 - Serpent's Tongue - (no description) -1432026 - Holy Spear - (no description) -1432027 - Redemption - (no description) -1432028 - Omega Spear - (no description) -1432030 - Pinaka - (no description) -1432031 - Forked Spear - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1432032 - Serpent's Tongue - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1432033 - Holy Spear - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1432034 - Redemption - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1432035 - Omega Spear - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1432038 - Dragon Faltizan - (no description) -1432039 - Fishing Pole - (no description) -1432040 - Maple Soul Spear - (no description) -1432041 - Maple 1500 Anniv. Flag - (no description) -1432042 - Pink Flower Tube - (no description) -1432043 - Singapore Flag (Spear) - (no description) -1432044 - Malaysia Flag (Spear) - (no description) -1432045 - Sunspear - One of the Glimmer Man's custom weapons, this spear contains the fiery power of a blazing red sun. -1432046 - Maplemas Tree - (no description) -1432048 - Pooh Pooh Shovel - (no description) -1442000 - Pole Arm - (no description) -1442001 - Mithril Pole Arm - (no description) -1442002 - Eviscerator - (no description) -1442003 - Axe Pole Arm - (no description) -1442004 - Janitor's Mop - (no description) -1442005 - The Nine Dragons - (no description) -1442006 - Iron Ball - (no description) -1442007 - Studded Polearm - (no description) -1442008 - The Gold Dragon - (no description) -1442009 - Crescent Polearm - (no description) -1442010 - Skylar - (no description) -1442011 - Surfboard - (no description) -1442012 - Sky Snowboard - (no description) -1442013 - Aqua Snowboard - (no description) -1442014 - Silver Snowboard - (no description) -1442015 - Golden Snowboard - (no description) -1442016 - Dark Snowboard - (no description) -1442017 - Blood Snowboard - (no description) -1442018 - Frozen Tuna - (no description) -1442019 - Eclipse - (no description) -1442020 - Hellslayer - (no description) -1442021 - Yellow Mop - (no description) -1442022 - White Mop - (no description) -1442023 - Maroon Mop - (no description) -1442024 - Maple Scorpio - (no description) -1442025 - Guan Yu Pole Arm - (no description) -1442026 - Red Surfboard - (no description) -1442027 - Green Surfboard - (no description) -1442028 - Black Surfboard - (no description) -1442029 - Gold Surfboard - (no description) -1442030 - Maple Snowboard - (no description) -1442031 - The Nine Dragons - (no description) -1442032 - Skylar - (no description) -1442033 - The Gold Dragon - (no description) -1442034 - Eclipse - (no description) -1442035 - The Nine Dragons - (no description) -1442036 - Skylar - (no description) -1442037 - The Gold Dragon - (no description) -1442038 - Eclipse - (no description) -1442039 - Frozen Tuna - (no description) -1442040 - The Nine Dragons - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1442041 - Skylar - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1442042 - The Gold Dragon - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1442043 - Eclipse - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1442044 - Zedbug - (no description) -1442045 - Dragon Chelbird - (no description) -1442046 - Super Snowboard - (no description) -1442047 - Yellow Valentine Rose - (no description) -1442048 - Red Valentine Rose - (no description) -1442049 - Blue Valentine Rose - (no description) -1442050 - White Valentine Rose - (no description) -1442051 - Maple Karstan - (no description) -1442052 - Maple 1500 Anniv. Flag - (no description) -1442053 - Pink Flower Tube - (no description) -1442054 - Red Surfboard - (no description) -1442055 - Green Surfboard - (no description) -1442056 - Sky Blue Surfboard - (no description) -1442057 - Purple Surfboard - (no description) -1442060 - Heavenly Messenger - One of the Glimmer Man's custom weapons, this legendary poleaxe is said to strengthen the will of the bearer in battle. -1442061 - Versalmas Cactus - (no description) -1442063 - Timeless Diesra - (no description) -1442065 - Tsunami Wave - (no description) -1442066 - Bullseye Board - (no description) -1442068 - Crimson Arcglaive - (no description) -1452000 - Battle Bow - (no description) -1452001 - Hunter's Bow - (no description) -1452002 - War Bow - (no description) -1452003 - Composite Bow - (no description) -1452004 - Asianic Bow - (no description) -1452005 - Ryden - (no description) -1452006 - Red Viper - (no description) -1452007 - Vaulter 2000 - (no description) -1452008 - Olympus - (no description) -1452009 - Red Hinkel - (no description) -1452010 - Blue Hinkel - (no description) -1452011 - Golden Hinkel - (no description) -1452012 - Marine Arund - (no description) -1452013 - Fire Arund - (no description) -1452014 - Golden Arund - (no description) -1452015 - Dark Arund - (no description) -1452016 - Maple Bow - (no description) -1452017 - Metus - (no description) -1452018 - Bow of Magical Destruction - (no description) -1452019 - White Nisrock - (no description) -1452020 - Golden Nisrock - (no description) -1452021 - Dark Nisrock - (no description) -1452022 - Maple Soul Searcher - (no description) -1452023 - Cao Cao Bow - (no description) -1452025 - Blue Metus - (no description) -1452026 - Black Metus - (no description) -1452027 - Ryden - (no description) -1452028 - Olympus - (no description) -1452029 - Asianic Bow - (no description) -1452030 - Golden Hinkel - (no description) -1452031 - Dark Arund - (no description) -1452032 - Ryden - (no description) -1452033 - Olympus - (no description) -1452034 - Asianic Bow - (no description) -1452035 - Golden Hinkel - (no description) -1452036 - Dark Arund - (no description) -1452038 - Ryden - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1452039 - Olympus - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1452040 - Asianic Bow - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1452041 - Golden Hinkel - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1452042 - Dark Arund - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1452044 - Dragon Shiner Bow - (no description) -1452045 - Maple Kandiva Bow - (no description) -1452046 - Maple 1500 Anniv. Flag - (no description) -1452047 - Barracuda Bow - (no description) -1452048 - Pink Flower Tube - (no description) -1452049 - Singapore Flag (Bow) - (no description) -1452050 - Malaysia Flag (Bow) - (no description) -1452051 - Beginner Bowman's bow - (no description) -1452052 - Andromeda Bow - One of the Glimmer Man's custom weapons, this hybrid bow is powered by an extradimensional essence for high-impact attacks. -1452053 - Winkel - (no description) -1452054 - Akha - (no description) -1452055 - Akhasuma - (no description) -1452056 - Akhamagna - (no description) -1452060 - Crimson Arclancer - (no description) -1462000 - Mountain Crossbow - (no description) -1462001 - Crossbow - (no description) -1462002 - Battle Crossbow - (no description) -1462003 - Balanche - (no description) -1462004 - Eagle Crow - (no description) -1462005 - Heckler - (no description) -1462006 - Silver Crow - (no description) -1462007 - Rower - (no description) -1462008 - Golden Crow - (no description) -1462009 - Gross Jaeger - (no description) -1462010 - Marine Raven - (no description) -1462011 - Fire Raven - (no description) -1462012 - Golden Raven - (no description) -1462013 - Dark Raven - (no description) -1462014 - Maple Crow - (no description) -1462015 - White Neschere - (no description) -1462016 - Golden Neschere - (no description) -1462017 - Dark Neschere - (no description) -1462018 - Casa Crow - (no description) -1462019 - Maple Crossbow - (no description) -1462020 - Hwa Ryung Ji No - (no description) -1462021 - Dark Crow - (no description) -1462022 - Yellow Crow - (no description) -1462023 - Mountain Crossbow - (no description) -1462024 - Rower - (no description) -1462025 - Golden Crow - (no description) -1462026 - Gross Jaeger - (no description) -1462027 - Dark Raven - (no description) -1462028 - Mountain Crossbow - (no description) -1462029 - Rower - (no description) -1462030 - Golden Crow - (no description) -1462031 - Gross Jaeger - (no description) -1462032 - Dark Raven - (no description) -1462033 - Mountain Crossbow - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1462034 - Rower - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1462035 - Golden Crow - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1462036 - Gross Jaeger - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1462037 - Dark Raven - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1462039 - Dragon Shiner Cross - (no description) -1462040 - Maple Nishada - (no description) -1462041 - Maple 1500 Anniv. Flag - (no description) -1462042 - River Rattler - (no description) -1462043 - Pink Flower Tube - (no description) -1462046 - Void Hunter - One of the Glimmer Man's custom weapons, this crossbow is composed of a weightless material said to have originated from Versal. -1462047 - Xaru - (no description) -1462048 - Xarusuma - (no description) -1462049 - Xarumagna - (no description) -1462052 - Raven's Eye - (no description) -1462053 - Night Raven's Eye - (no description) -1462054 - Dawn Raven's Eye - (no description) -1462055 - Dusk Raven's Eye - (no description) -1472000 - Garnier - (no description) -1472001 - Steel Titans - (no description) -1472002 - Mithril Titans - (no description) -1472003 - Gold Titans - (no description) -1472004 - Bronze Igor - (no description) -1472005 - Steel Igor - (no description) -1472006 - Adamantium Igor - (no description) -1472007 - Meba - (no description) -1472008 - Steel Guards - (no description) -1472009 - Mithril Guards - (no description) -1472010 - Adamantium Guards - (no description) -1472011 - Bronze Guardian - (no description) -1472012 - Silver Guardian - (no description) -1472013 - Dark Guardian - (no description) -1472014 - Steel Avarice - (no description) -1472015 - Blood Avarice - (no description) -1472016 - Adamantium Avarice - (no description) -1472017 - Dark Avarice - (no description) -1472018 - Steel Slain - (no description) -1472019 - Blood Slain - (no description) -1472020 - Sapphire Slain - (no description) -1472021 - Dark Slain - (no description) -1472022 - Bronze Gigantic - (no description) -1472023 - Blood Gigantic - (no description) -1472024 - Sapphire Gigantic - (no description) -1472025 - Dark Gigantic - (no description) -1472026 - Brown Scarab - (no description) -1472027 - Green Scarab - (no description) -1472028 - Blue Scarab - (no description) -1472029 - Black Scarab - (no description) -1472030 - Maple Claw - (no description) -1472031 - Black Mamba - (no description) -1472032 - Maple Kandayo - (no description) -1472033 - Casters - (no description) -1472034 - Adamantium Guards - (no description) -1472035 - Dark Slain - (no description) -1472036 - Dark Gigantic - (no description) -1472037 - Black Scarab - (no description) -1472038 - Black Mamba - (no description) -1472039 - Adamantium Guards - (no description) -1472040 - Dark Slain - (no description) -1472041 - Dark Gigantic - (no description) -1472042 - Black Scarab - (no description) -1472043 - Black Mamba - (no description) -1472045 - Adamantium Guards - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1472046 - Dark Slain - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1472047 - Dark Gigantic - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1472048 - Black Scarab - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1472049 - Black Mamba - #cInternet Cafe-only item. Disappears after exiting the game.\n# -1472051 - Dragon Green Sleve - (no description) -1472052 - Dragon Purple Sleve - (no description) -1472053 - Red Craven - (no description) -1472054 - Shinobi Bracer - (no description) -1472055 - Maple Skanda - (no description) -1472056 - Maple 1500 Anniv. Flag - (no description) -1472057 - Celestial Python - (no description) -1472058 - Pink Flower Tube - (no description) -1472061 - Beginner Thief Wrist Guard - (no description) -1472062 - Black Hole - One of the Glimmer Man's custom weapons, this claw is powered by a vortex of stardust particles, allowing its user to throw stars at supreme speeds. No enemy can escape its power. -1472063 - Magical Mitten - A finely-woven mitten that emits warmth all over those fortunate enough to wear it. Enables one to withstand even the harshest of conditions. -1472064 - Neva - (no description) -1472065 - Kuma - (no description) -1472066 - Kumasuma - (no description) -1472067 - Kumamagna - (no description) -1472069 - Steel Avarice for Transformation - (no description) -1472072 - Raven's Claw - (no description) -1472073 - Night Raven's Claw - (no description) -1472074 - Dawn Raven's Claw - (no description) -1472075 - Dusk Raven's Claw - (no description) -1482000 - Steel Knuckler - (no description) -1482001 - Leather Arms - (no description) -1482002 - Double Tail Knuckler - (no description) -1482003 - Norman Grip - (no description) -1482004 - Prime Hands - (no description) -1482005 - Silver Maiden - (no description) -1482006 - Neozard - (no description) -1482007 - Fury Claw - (no description) -1482008 - Psycho Claw - (no description) -1482009 - Beia Crash - (no description) -1482010 - Steelno - (no description) -1482011 - White Fangz - (no description) -1482012 - King Cent - (no description) -1482013 - Dragon Slash Claw - (no description) -1482014 - Scallywag Knuckler - (no description) -1482015 - Prime Hands - #cThis item is for the Internet Cafe only and will disappear once you log out of the game.\n# -1482016 - Fury Claw - #cThis item is for the Internet Cafe only and will disappear once you log out of the game.\n# -1482017 - Seraphims - #cThis item is for the Internet Cafe only and will disappear once you log out of the game.\n# -1482018 - Beia Crash - #cThis item is for the Internet Cafe only and will disappear once you log out of the game.\n# -1482019 - Steelno - #cThis item is for the Internet Cafe only and will disappear once you log out of the game.\n# -1482020 - Maple Knuckle - (no description) -1482021 - Maple Storm Finger - (no description) -1482022 - Maple Golden Claw - (no description) -1482023 - Timeless Equinox - (no description) -1492000 - Pistol - (no description) -1492001 - Dellinger Special - (no description) -1492002 - The Negotiator - (no description) -1492003 - Golden Hook - (no description) -1492004 - Cold Mind - (no description) -1492005 - Shooting Star - (no description) -1492006 - Lunar Shooter - (no description) -1492007 - Mr. Rasfelt - (no description) -1492008 - Burning Hell - (no description) -1492009 - Abyss Shooter - (no description) -1492010 - Infinity's Wrath - (no description) -1492011 - The Peacemaker - (no description) -1492012 - Concerto - (no description) -1492013 - Dragonfire Revolver - (no description) -1492014 - Pirate's Pistol - (no description) -1492015 - Cold Mind - #cThis item is for the Internet Cafe only and will disappear once you log out of the game.\n# -1492016 - Mr. Rasfelt - #cThis item is for the Internet Cafe only and will disappear once you log out of the game.\n# -1492017 - Burning Hell - #cThis item is for the Internet Cafe only and will disappear once you log out of the game.\n# -1492018 - Abyss Shooter - #cThis item is for the Internet Cafe only and will disappear once you log out of the game.\n# -1492019 - Infinity's Wrath - #cThis item is for the Internet Cafe only and will disappear once you log out of the game.\n# -1492020 - Maple Gun - (no description) -1492021 - Maple Storm Pistol - (no description) -1492022 - Maple Canon Shooter - (no description) -1602000 - Basic Skill Effect (warrior) - Attach to your weapon for an added effect to your 1st job skills. (warriors only) -1602001 - Basic Skill Effect (magician) - Attach to your weapon for an added effect to your 1st job skills. (magicians only) -1602002 - Basic Skill Effect (bowman) - Attach to your weapon for an added effect to your 1st job skills. (bowmen only) -1602003 - Basic Skill Effect (thief) - Attach to your weapon for an added effect to your 1st job skills. (thieves only) -1602004 - Combo Skill Effect (warrior) - Attach to your weapon for an added effect to your 1st & 2nd job skills. (warriors only) -1602005 - Combo Skill Effect (magician) - Attach to your weapon for an added effect to your 1st & 2nd job skills. (magicians only) -1602006 - Combo Skill Effect (bowman) - Attach to your weapon for an added effect to your 1st & 2nd job skills. (bowmen only) -1602007 - Combo Skill Effect (thief) - Attach to your weapon for an added effect to your 1st & 2nd job skills. (thieves only) -1702000 - Dual Plasma Blade - A glowing dagger that masks over an equipped #cdagger#. -1702001 - Bouquet - A pretty bouquet that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, or a dagger#. -1702002 - Wooden Slingshot - A toy wooden slingshot that masks over an equipped #cbow#. -1702003 - Plastic Slingshot - A toy plastic slingshot that masks over an equipped #cbow#. -1702004 - Angel Wand - A sparkling Angel Wand that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, wand, dagger, or a staff#. -1702005 - Yellow Candy Cane - A yellow candy cane that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, wand, or a staff#. -1702006 - Red Candy Cane - A red candy cane that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, wand, or a staff#. -1702007 - Green Candy Cane - A green candy cane that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, wand, or a staff#. -1702008 - Santa Sack - A package full of surprises that masks over an equipped #ctwo-handed axe or two-handed blunt weapon#. -1702009 - Tiger Paw - A sharp tiger paw that masks over an equipped #cclaw#. -1702010 - Orange Toy Hammer - An orange toy hammer that masks over an equipped #ctwo-handed sword#. -1702011 - Pink Toy Hammer - A pink toy hammer that masks over an equipped #ctwo-handed sword#. -1702012 - Yellow Spatula - A clean spatula that masks over an equipped #cwand or a staff#. -1702013 - Teddy Bear - An adorable teddy bear that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, wand, or a staff#. -1702014 - Toy Rifle - A huge toy rifle that masks over an equipped #ccrossbow#. -1702015 - Bug Net - A long bug net that masks over an equipped #cspear and pole arm#. -1702016 - Picnic Basket - A picnic basket that masks over an equipped #cdagger#. -1702017 - Pink Rabbit Puppet - A pink bunny that masks over an equipped #cclaw#. -1702018 - Vanilla Ice Cream - A tasty-looking vanilla ice cream that masks over an equipped #cdagger, wand, or a staff#. -1702019 - Pillow - A very comfortable-looking pillow that masks over an equipped #cone-handed sword, one-handed axe, or a one-handed blunt weapon#. -1702020 - Lollipop - A sweet-looking candy that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, wand, dagger or a staff#. -1702021 - Black Electric Guitar - A black electric guitar that masks over an equipped #cpole arm#. -1702022 - Brown Electric Guitar - An electric guitar with a brown frame that can be masked over an equipped #cPole Arm#. -1702023 - Green Electric Guitar - A green electric guitar that masks over an equipped #cpole arm#. -1702024 - Cupid's Bow - A Cupid Bow that masks over an equipped #cbow#. -1702025 - Cherub's Bow - An Angel Bow that masks over an equipped #cbow#. -1702026 - Cupid's Crossbow - A cupid crossbow that masks over an equipped #ccrossbow#. -1702027 - Blazing Sword - A blazing sword that masks over an equipped #cone-handed sword, one-handed blunt weapon, one-handed axe, two-handed sword, two-handed blunt weapon, two-handed axe, dagger, staff, or a wand#. -1702028 - Donut - A warm, freshly-baked donut that masks over an equipped #cclaw#. -1702029 - White Rabbit's Foot - A cute glove that resembles a foot of a white bunny that masks over an equipped #cclaw#. -1702030 - Diao Chan Sword - Diao Chan's weapon that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, or a dagger#. -1702031 - Liu Bei Sword - Liu Bei's sword that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, or a dagger#. -1702032 - Zhu-Ge-Liang Wand - Zhu-Ge-Liang's weapon that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, dagger, wand or a staff#. -1702033 - Sun Quan Staff - Sun Quan's staff that masks over an equipped #cwand or a staff#. -1702034 - Guan Yu Spear - Guan Yu's weapon that masks over an equipped #ca spear, two-handed axe, two-handed mace, pole arm, or as a two-handed sword#. -1702035 - Cao Cao Bow - Cao Cao's bows that masks over an equipped #cbow#. -1702036 - Witch's Broom - A witch broom that masks over an equipped #cspear, or a pole arm#. -1702037 - Coffee Pot - A coffee pot that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, dagger, wand or a staff#. -1702038 - Horoscope Claw - A horoscope themed claw that masks over an equipped #cclaw#. -1702039 - Horoscope Net - A horoscope themed net that masks over an equipped #ca spear, two-handed axe, two-handed mace, pole arm, or as a two-handed sword#. -1702040 - Horoscope Bow - A horoscope themed bow that masks over an equipped #cbow#. -1702041 - Horoscope Sword - A horoscope themed net that masks over an equipped #cone-handed weapon#. -1702042 - Microphone - A microphone that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, dagger, wand or a staff#. -1702043 - Poo Stick - It's crap attack time! A stick with poo on it that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, dagger, wand or a staff#. -1702044 - Toy Machine Gun - A toy machine gun that masks over an equipped #ccrossbow#. -1702045 - Sunflower Stalk - A sunflower stalk that masks over an equipped #ctwo-handed sword, two-handed axe, two-handed blunt weapon, spears, and pole arms#. -1702046 - Horoscope Crossbow - A horoscope themed crossbow that masks over an equipped #ccrossbow#. -1702047 - Snowflake Staff - A snowflake stick that masks over an equipped #cone-haned sword, one-handed axe, one-handed blunt weapon, dagger, wand, or a staff#. -1702048 - Rubber Towel - A rubber towel that masks over an equipped #cclaw#. -1702049 - Snowman Claw - A miniature snowman accent that masks over an equipped #cclaw#. -1702050 - Cellphone - A cellphone that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, or a dagger#. -1702051 - Hong Bao - An oriental lantern that was used in the past and masks over an equipped #cone-handed sword, one-handed axe, one-handed mace, dagger, wand and staff#. -1702052 - In-Hand FB Helmet(Home) - Get tough! A helmet held in-hand as a weapon. Masks over #cone-handed sword, one-handed axe, one-handed blunt weapon, wand, dagger or a staff#. -1702053 - In-Hand FB Helmet(Away) - Get tough! A helmet held in-hand as a weapon. Masks over #cone-handed sword, one-handed axe, one-handed blunt weapon, wand, dagger or a staff#. -1702054 - Football Claw - #cMasks over an equipped claw# as a held football. This item does not have the throwing effect. -1702055 - Ancient Korean Bow - An ancient bow that has been passed down from generation to generation that can be masked over an equipped #cBow#. -1702056 - Guitar - An acoustic guitar that can only be masked over an equipped #ctwo-handed sword#. -1702057 - Blue Guitar - A blue acoustic guitar that can only be masked over an equipped #ctwo-handed sword#. -1702058 - Big Hand - A humongous glove that can be masked over an equipped #cClaw#. -1702059 - Cactus - A Cactus that can be masked over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon or a dagger#. -1702060 - Shiner - A glowing bow that can be masked over an equipped #cbow#. -1702061 - Red Fist of Fury - A tightly-clenched fist covered in red aura; can be masked over an equipped #cclaw#. -1702062 - Blue Fist of Fury - A tightly-clenched fist covered in blue aura; can be masked over an equipped #cclaw#. -1702063 - Scissor Stick - A Scissor Stick that can be masked over an equipped #ctwo-handed sword, two-handed axe, two-handed blunt weapon, spear, or a pole-arm#. -1702064 - Rock Stick - A Rock Stick that can be masked over an equipped #ctwo-handed sword, two-handed axe, two-handed blunt weapon, spear, or a pole-arm#. -1702065 - Paper Stick - A Paper Stick that can be masked over an equipped #ctwo-handed sword, two-handed axe, two-handed blunt weapon, spear, or a pole-arm#. -1702066 - Canvas Tote Bag - A tote bag that can be masked over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, or a dagger#. -1702067 - England Cheer Towel - A World Cup Cheer Towel that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, a dagger, wand or a staff# -1702068 - France Cheer Towel - A World Cup Cheer Towel that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, a dagger, wand or a staff# -1702069 - Brazil Cheer Towel - A World Cup Cheer Towel that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, a dagger, wand or a staff# -1702070 - Sporty Band - A sporty band that can be masked over an equipped #cclaw#. -1702071 - Japan Cheer Towel - A World Cup Cheer Towel that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, a dagger, wand or a staff# -1702072 - Laser Sword - A laser sword that can be masked over an equipped #ctwo-handed sword, two-handed axe, or a two-handed blunt weapon#. -1702073 - Blue Shiner Crossbow - A glowing blue crossbow that can be masked over an equipped #ccrossbow#. -1702074 - Pink Shiner Crossbow - A glowing pink crossbow that can be masked over an equipped #ccrossbow#. -1702075 - USA Cheer Towel - A World Cup Cheer Towel that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, a dagger, wand or a staff# -1702076 - Mexico Cheer Towel - A World Cup Cheer Towel that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, a dagger, wand or a staff# -1702077 - Australia Cheer Towel - A World Cup Cheer Towel that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, a dagger, wand or a staff# -1702078 - Fairy Fan - A multi-colored fan that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, dagger, wand or a staff#. -1702079 - Blue Blazing Sword - A blue sabre sword that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, dagger, two-handed sword, two-handed axe, two-handed blunt weapon, wand, or a staff#. -1702080 - Green Blazing Sword - A green sabre sword that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, dagger, two-handed sword, two-handed axe, two-handed blunt weapon, wand, or a staff#. -1702081 - Purple Blazing Sword - A purple sabre sword that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, dagger, two-handed sword, two-handed axe, two-handed blunt weapon, wand, or a staff#. -1702082 - Harp - Apolon's Harp that masks over an equipped #cbow#. -1702083 - Foam Hand - A foam hand used to cheer your favorite team. Masks over #cany weapon except guns and knucklers#. -1702084 - Toy Pinwheel - A toy pinwheel that masks over #cone-handed sword, one-handed axe, one-handed blunt weapon, dagger, wand, staff, or a Claw# -1702085 - Frog Claw - A cute froggy glove that masks over an equipped as a #cClaw#. -1702086 - Chicken Smackaroo - A rooster that masks over #cany weapon except guns and knucklers#. -1702087 - Red Pencil - A red pencil that masks over an equipped #ctwo-handed sword, two-handed axe, two-handed blunt weapon, spear, or a pole arm#. -1702088 - Super Scrubber - A back brush that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, dagger, wand, staff, or a Claw#. -1702089 - Candy Hammer - This giant, enticing Caramel Apple is the perfect cover for an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, wand, dagger or staff#. -1702090 - Feather Scimitar - A Shiny Feather that masks over #cone-handed sword, one-handed axe, one-handed blunt weapon, dagger, Wand, Staff.# -1702091 - Tennis Racquet - A sturdy-looking tennis racquet that masks over an equipped #ctwo-handed sword, two-handed axe, two-handed blunt weapon, spear, or a pole-arm#. -1702092 - Glowing Pumpkin Basket - A cane featuring a pumpkin that masks over #cany equipped weapon except guns and knucklers#. -1702093 - Okie Donkie - An adorable-looking Donky that masks over #cany equipped weapon except guns and knucklers#. -1702094 - Mad Cow - A Mad Cow weapon that masks over an equipped #cClaw#. -1702095 - Frog Glove - A cute froggy glove that masks over an equipped as a #cClaw#. -1702096 - Pizza Pan - A pizza frying pan that masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, dagger, wand, staff, or a Claw#. -1702098 - Violin - A durable violin that can be masked over an equipped #cCrossbow#. -1702099 - Transparent Claw - Now you see it, now you don't. Equip this if you want to make your claw transparent while still using all of the stats your claw possesses. -1702100 - Christmas Bell - A Christmas bell that masks over #cany equipped weapon except guns and knucklers#. -1702102 - Starblade - A Starblade weapon masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt, short sword, or wand.# -1702103 - Pink Ribbon Umbrella - A pink ribbon umbrella to avoid the sun that masks over an equipped #cbow#. -1702104 - Deluxe Cone - Deluxe Cone can be masked over #call weapons expect for spear, pole-arm, bow, crossbow, claw, knuckler, and gun#. -1702105 - Heart Key - A golden Heart Key that can be masked over an equipped #cwand or staff#. -1702106 - Melting Chocolate - A pot full of hot, Melting Chocolate that can be masked over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, wand, dagger or a staff#. -1702107 - Chocolate - A humongous, neatly-packaged Chocolate that can be masked over an equipped #ctwo-handed sword, two-handed axe or a two-handed blunt weapon#. -1702108 - Giant Lollipop - A rainbow-colored Giant Lollipop that can be masked over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, wand, dagger or a staff#. -1702112 - Celestial Wand - This is the strongest weapon, which can be put on #call weapons except guns and knucklers#. -1702113 - Maoster Pole Arm - Specially designed Maoster Pole Arm that masks over #cpole arm#. -1702114 - Wonky's Leaf - A long, green leaf used by Wonky the Fairy that masks over #cany equipped weapon except guns and knucklers# -1702115 - Red rose - This can be put on #call weapons except guns and knucklers#. -1702118 - Janus Sword - This can be put on #call weapons except guns and knucklers#. -1702119 - Sachiel Sword - This can be put on #call weapons except guns and knucklers#. -1702120 - Veamoth Sword - This can be put on #call weapons except guns and knucklers#. -1702121 - Seal Pillow - A cushy, adorable seal pillow that masks over #cany weapon except guns and knucklers#. -1702122 - Dragon's Fury - This can be put on #ctwo-handed sword, two-handed axe, two-handed blunt weapon, spear, pole Arm#. -1702123 - Forked Pork - A forked pork that can be masked over #cany weapon except guns and knucklers#. -1702124 - Kitty - An adorable kitty that can be masked over #cany weapon except guns and knucklers#. -1702125 - Heart Cane - An adorable pink heart cane that can be equipped in place of #cone-hand sword, one-hand axe, one-hand blunt weapon, short sword, wand, staff#. -1702126 - Blue Shiner - A glowing bow that can be masked over an equipped #cbow#. -1702127 - Water Gun - Spray your friends with lethal water! Use well! A Water Gun that can be masked over an equipped #ccrossbow#. -1702128 - Green Shiner - A glowing bow that can be masked over an equipped #cbow#. -1702129 - Purple Shiner - A glowing bow that can be masked over an equipped #cbow#. -1702130 - Red Shiner - A glowing bow that can be masked over an equipped #cbow#. -1702131 - Pepe Beak - Pepe Claw is one of the winning Artworks of MapleSEA Equipment Creation Contest 2007. It is specially designed by #c# and modified by Wizet. \nMasks over an equipped #cClaw and Dagger.# -1702132 - Slime Stick - A Slime Stick weapon #cMasks over any weapon except guns and knucklers.# -1702133 - Smackdown Fist - Lay the smackdown on foes with this hard-hitting fist! Smack talk not included! Can be equipped over a #cClaw#. -1702134 - Serpent Staff - A gold staff with serpent's head atop that masks over an equipped #wand or a staff# -1702135 - Vengence Claw - A Vengence Claw that masks over an equipped #cclaw#. -1702136 - Ice snow flower ring - This is an ice snow flower ring which can be put on#cany weapon except guns and knucklers#. -1702138 - Spanish Ham - A salt-cured ham derived from a pig's back leg. It masks over an equipped #cone-handed blunt weapon#. -1702140 - Giant Orchid - Specially designed for Maplers in celebration of launching Singapore exclusive map.\n#cMasks over any weapon except guns and knucklers.# -1702141 - My Buddy Max - An adorable puppy that masks over #cany weapon except guns and knucklers#. -1702142 - Pink Angel Stick - An enchanted magic stick that masks over #cany weapon except guns and knucklers#. -1702144 - Broken Sword - A broken sword that can be masked over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, and dagger#. -1702145 - Bionic Claw - A Bionic Claw that masks over an equipped #cclaw#. -1702146 - Skull Staff - A Skull Staff that masks over an equipped #wand or a staff# -1702147 - Skull Axe - A Skull Axe that masks over an equipped #ctwo-handed axe#. -1702148 - Moon Baton - A Moon Baton weapon that masks over a #ctwo-handed sword, two-handed axe, two-handed blunt weapon, spear, and pole-arm#. -1702149 - Tania Sword - A sword of supreme power that masks over #cany weapon except guns and knucklers#. -1702150 - Mercury Sword - A sword with mystical qualities that masks over #cany weapon except guns and knucklers#. -1702151 - Royal Oaken Staff - A glowing Royal Oaken Staff that can be masked over an equipped #ctwo-handed sword, two-handed axe, two-handed blunt weapon, spear, pole-arm, or a staff#. -1702152 - Flame Tongue - A Flame Tongue that masks over an equipped #ctwo-handed sword, two-handed axe, two-handed blunt weapon#. -1702153 - Crissagrim Blade - A Crissagrim Blade weapon that masks over #cany weapon except guns and knucklers#. -1702154 - Plasma Saber - A plasma-emitting saber that masks over #cany weapon except guns and knucklers#. -1702155 - Shooting Star - An adorable Shooting Star that can be masked over #cany weapon except guns and knucklers#. -1702156 - Forked Turkey - A tasty turkey speared on the end of a giant fork. Equips over #ctwo-handed sword, two-handed axe, two-handed blunt weapon, spear, polearm, or staff#. -1702157 - Burning Marshmellow - A flaming marshmallow taken straight from the campfire! This item equips over a #cone-handed sword, one-handed blunt weapon, one-handed axe, wand, or dagger#. -1702158 - The Jackal - This item can be masked over an equipped #cGun#. -1702159 - Blackbeard's Knuckler - This weapon with flashy beads can be masked over an equipped #cKnuckler#. -1702160 - Tiger Paw Knuckler - This weapon that strongly resembles a tiger claw can be masked over an equipped #cKnuckler#. -1702161 - Dogged Out - This dog comes with a lifetime "Ultra-bite" warranty--guaranteed to never let go of your arm! Can be equipped over a #cClaw#. -1702162 - Koala Doll - A seemingly harmless Koala Doll... that hides your weapon perfectly! This item masks over #call weapons except Guns and Knuckles#. -1702163 - Hot Dog Fork - A long fork with a hot dog stuck on it. Masks over an equipped #ctwo-handed sword, two-handed blunt weapon, or two-handed axe#. -1702164 - Bunny Nunchucks - A swift, powerful Nunchuck with a bunny head delivering mighty blows, while the carrot serves as its handle. Equips over a #cone-handed sword, one-handed axe, one-handed blunt weapon, staff or wand#. -1702165 - My Buddy DJ - My stylish buddy DJ, who imitates my every move. Masks over #cany weapon except guns and knucklers#. -1702166 - Holiday Candy Cane - A holiday candy cane that is sure to please the kids. Masks over #ctwo-handed sword, two-handed axe, two-handed blunt weapon, spear, and pole arm#. -1702167 - Glow Fingers - A glowy finger that can be equipped in place of a #cGun#. -1702168 - Holiday Tree Ring - A beautiful holiday ring that perfectly conveys the holiday spirit. Masks over #call weapons except Guns and Knuckles#. -1702169 - My Buddy Tina - My popular high-school friend Tina, who imitates my every move. Masks over #cany weapon except guns and knucklers#. -1702170 - Electric Knuckle - A sparky weapon that masks over a #cKnuckle#. -1702171 - Party Popper - A loud party popper featuring multi-colored lines of paper that masks over an equipped #cbow or a crossbow#. -1702172 - Bluebird - An adorable bluebird, considered a lucky charm in some areas, that masks over #cany weapon except guns and knucklers#. -1702173 - Hessonite Saber - An adorable Hessonite Saber that can be masked over #cany weapon except guns and knucklers#. -1702174 - Butterfly Staff - An adorable Butterfly Staff that can be masked over #cany weapon except guns and knucklers#. -1702175 - Hot Dog Link - A long string of sausages tied up to become an unlikely source of damage. Masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, wand, or a staff#. -1702177 - Power Pesticide - A powerful bug spray that masks over an equipped #cgun#. -1702179 - Cloud 9 Pillow - A Cloud 9 Pillow that masks over #cany weapon except guns and knucklers#. -1702180 - Dark Seraphim - A Dark Seraphim that masks over #cany weapon. -1702181 - Picky Ducky - Masks over #cany weapon except guns and knucklers# -1702182 - Giant Pop with a Swirl - A weapon that can be masked over #cany weapon except guns and knucklers#. -1702183 - Sunset Seraphim - A Sunset Seraphim that masks over #cany weapon except guns and knucklers#. -1702184 - Aqua Seraphim - A Aqua Seraphim that masks over #cany weapon except guns and knucklers#. -1702185 - White & Yellow Seraphim - A White & Yellow Seraphim that masks over #cany weapon except guns and knucklers#. -1702187 - Patriot Seraphim - A Patriot Seraphim that masks over #cany weapon except guns and knucklers#. -1702188 - Pink Seraphim - A Pink Seraphim that masks over #cany weapon except guns and knucklers#. -1702189 - Oh Crab! - A Crab weapon that masks over #cany weapon except guns and knucklers#. -1702143 - Combat Syringe - A Combat Syringe that masks over #cany weapon except guns and knucklers#. -1702193 - Towel Whip - A wet towel whip that masks over an equipped #cone-handed sword#. -1312036 - Malaysia Flag (One Handed Axe) - (no description) -1322057 - Singapore Flag (One Handed Mace) - (no description) -1322058 - Malaysia Flag (One Handed Mace) - (no description) -1332060 - Singapore Flag (Dagger) - (no description) -1332061 - Malaysia Flag (Dagger) - (no description) -1382043 - Singapore Flag (Staff) - (no description) -1382044 - Malaysia Flag (Staff) - (no description) -1402042 - Singapore Flag (Two Handed Sword) - (no description) -1412030 - Singapore Flag (Two Handed Axe) - (no description) -1412031 - Malaysia Flag (Two Handed Axe) - (no description) -1422034 - Singapore Flag (Two Handed Mace) - (no description) -1442058 - Singapore Flag (Pole Arm) - (no description) -1462044 - Singapore Flag (Crossbow) - (no description) -1462045 - Malaysia Flag (Crossbow) - (no description) -1472059 - Singapore Flag (claw) - (no description) -1472060 - Malaysia Flag (Claw) - (no description) -1702201 - Bone Weapon - Give those evil creatures a bone--literally! It masks over an equipped #cone-handed sword, one-handed axe, one-handed blunt weapon, and dagger#. -1702204 - Japanese War Fan - Japanese War Fan that masks over an equipped #cone-handed sword#. -1302106 - Crystal Blade - (no description) -1492032 - Kyrin's Pistol - (no description) -1302105 - Seraphim One-handed Sword - (no description) -1312039 - Seraphim One-handed Axe - (no description) -1322065 - Seraphim One-handed Blunt Weapon - (no description) -1332081 - Seraphim Dagger - (no description) -1372046 - Seraphim Wand - (no description) -1382062 - Seraphim Staff - (no description) -1402053 - Seraphim Two-handed Sword - (no description) -1412035 - Seraphim Two-handed Axe - (no description) -1422039 - Seraphim Two-handed Blunt Weapon - (no description) -1432050 - Seraphim Spear - (no description) -1442071 - Seraphim Pole Arm - (no description) -1452062 - Seraphim Bow - (no description) -1462056 - Seraphim Crossbow - (no description) -1472077 - Seraphim Claw - (no description) -1482029 - Seraphim Knuckler - (no description) -1492030 - Seraphim Gun - (no description) -1702210 - Santa Buddy - Santa buddy is here to follow you around and spread cheer around Maple! This item can be equipped over #call weapons#. -1702209 - Rudolph Stick - A slim and sturdy rudolph stick weapon just in time for the holidays! Can be equipped over #cany weapon except guns and knucklers#. -1702191 - Rainbow Sabre - An interesting sabre that masks over #call weapons except Guns and Knuckles#, and the color of the weapon changes everyday.(Mon - Red, Tue - Orange, Wed- Green, Thur - Blue, Fri - Purple, Sat - Black, Sun -White) -1702195 - MapleGirl Wand - A Maply wand that masks #call weapons#. -1702196 - Fly Blue Bird - A twitty little blue bird that masks #call weapons#. -1702202 - Baby Ellie - An adorable pink Baby Ellie that masks over #call weapons#. -1702213 - Heartbreak Sword - Give monsters a broken heart with this stylish weapon! Masks over and equipped #wand, staff, pole-arm, two-handed sword, two-handed axe, and two-handed blunt weapon#. -1702207 - Musical Violin - Mesmerize mobs with an enchanting fiddle tune. Masks over #all weapons#. -1412040 - Redner - One of the huge Versalian axes wielded by Red Nirg. -1432056 - Stormshear - (no description) -1322061 - Reverse Allargando - (no description) -1332073 - Timeless Pescas - (no description) -1332074 - Timeless Killic - (no description) -1332075 - Reverse Pescas - (no description) -1332076 - Reverse Killic - (no description) -1372044 - Timeless Enreal Tear - (no description) -1372045 - Reverse Enreal Tear - (no description) -1382057 - Timeless Aeas Hand - (no description) -1382059 - Reverse Aeas Hand - (no description) -1402047 - Reverse Nibleheim - (no description) -1412034 - Reverse Tabarzin - (no description) -1422038 - Reverse Bellocce - (no description) -1432047 - Timeless Alchupiz - (no description) -1432049 - Reverse Alchupiz - (no description) -1442067 - Reverse Diesra - (no description) -1452057 - Timeless Engaw - (no description) -1452059 - Reverse Engaw - (no description) -1462050 - Timeless Black Beauty - (no description) -1462051 - Reverse Black Beauty - (no description) -1472068 - Timeless Lampion - (no description) -1472071 - Reverse Lampion - (no description) -1482024 - Reverse Equinox - (no description) -1482025 - Pink Flower Tube - (no description) -1492023 - Timeless Blindness - (no description) -1492025 - Reverse Blindness - (no description) -1492026 - Pink Flower Tube - (no description) -1302114 - GMS Carabella - (no description) -1312044 - GMS Axe - (no description) -1322072 - GMS Flame - (no description) -1402061 - GMS Claymore - (no description) -1412041 - GMS Battle Axe - (no description) -1422044 - GMS Maul - (no description) -1482034 - GMS Knuckle - (no description) -1702217 - Ducky Tube - This item can be equipped over #call weapons#. -1702218 - Dumbell Weapon - Masks over an equipped #cone handed sword, one-handed axe, one-handed blunt weapon, and dagger.# -1702219 - Knockout Boxing Gloves - Masks over an equipped #cclaw#. -1702220 - Transparent Wand - Masks over #cany wand#. -1492024 - Lunar Shooter for transformation - (no description) -1702190 - Transparent Knuckle - Transparent Knuckle that mask over #cKnuckle#. -1702203 - Halloween Teddy - Equipped on #call weapons#. -1702211 - Blizzard Stick - Equipped on #call weapons#. -1702229 - Demon Sickle - Equips over #ctwo-handed sword, two-handed axe, two-handed blunt weapon, spear, or pole arm#. -1702233 - Rainbow Brush - Can be equipped in place of #call weapons#. -1702226 - My Buddy Whale - Equips over #ctwo-handed sword, two-handed axe, two-handed blunt weapon, spear, or pole arm#. -1702228 - Choco Banana - Equips over #ctwo-handed sword, two-handed axe, two-handed blunt weapon, spear, or pole arm#. -1702230 - Popsicle Sword - Equips over #cone-handed sword, one-handed blunt weapon, one-handed axe, dagger and claw#. -1702208 - Alligator Tube - Specially made alligator shape tube that masks over #cany equipped weapon except guns and knuckles#. -1702235 - Metallic Arm - (no description) -1702139 - Hook Hand - Masks over an equipped #cclaw#. -1302112 - Balrog's Khan - (no description) -1302113 - Balrog's Fraute - (no description) -1312042 - Balrog's Gaea - (no description) -1312043 - Balrog's Vifennis - (no description) -1322068 - Balrog's Golden Hammer - (no description) -1322069 - Balrog's Runi Hammer - (no description) -1332084 - Balrog's Angelic Betrayal - (no description) -1332085 - Dragon's Tail of Balrog - (no description) -1332086 - Balrog's Cursayer - (no description) -1332087 - Balrog's Varkit - (no description) -1372049 - Zakum's Tree Branch - (no description) -1372050 - Balrog's Magicodar - (no description) -1372051 - Balrog's Phoenix Wand - (no description) -1382066 - Balrog's Kage - (no description) -1382067 - Balrog's Blue Marine - (no description) -1382068 - Bain Wings - (no description) -1402056 - Balrog's Blue Screamer - (no description) -1402057 - Heaven's Gate of Balrog - (no description) -1402058 - Balrog's Berzerker - (no description) -1402059 - Devil's Sunrise of Balrog - (no description) -1402062 - Bain Sword - (no description) -1412038 - Balrog's Helios - (no description) -1412039 - Balrog's Colonian Axe - (no description) -1422042 - Balrog's Morningstar - (no description) -1422043 - Balrog's Leomite - (no description) -1432054 - Balrog's Omega Spear - (no description) -1432055 - Balrog's Fairfrozen - (no description) -1442074 - Balrog's Eclipse - (no description) -1442075 - Balrog's Hellslayer - (no description) -1442078 - Bain Pole Arm - (no description) -1442079 - Basic Polearm - (no description) -1452066 - Balrog's Marine Arund - (no description) -1452067 - Balrog's Fire Arund - (no description) -1452068 - Balrog's Golden Arund - (no description) -1452069 - Balrog's Dark Arund - (no description) -1452070 - Balrog's Metus - (no description) -1452071 - Bain Long Bow - (no description) -1462059 - Balrog's Marine Raven - (no description) -1462060 - Balrog's Fire Raven - (no description) -1462061 - Balrog's Golden Raven - (no description) -1462062 - Balrog's Dark Raven - (no description) -1462063 - Balrog's Casa Crow - (no description) -1472083 - Balrog's Black Mamba - (no description) -1472084 - Balrog's Caster - (no description) -1472086 - Bain Biter - (no description) -1482031 - Balrog's Steel Renault - (no description) -1482032 - Balrog's White Evil - (no description) -1492035 - Balrog's Infinity - (no description) -1492036 - Balrog's Peacemaker - (no description) -1492037 - Bain Shooter - (no description) -1702212 - Galactic Legend - A weapon that masks over #call weapons#. -1702216 - Magic Heart Stick - A weapon that masks over #call weapons#. -1302133 - Astaroth One-Handed Sword - #cYou can feel Astaroth's dark energy.# -1332099 - Astaroth Short Sword - #cYou can feel Astaroth's dark energy.# -1372058 - Astaroth Wand - #cYou can feel Astaroth's dark energy.# -1382080 - Astaroth Staff - #cYou can feel Astaroth's dark energy.# -1402072 - Astaroth Two-Handed Sword - #cYou can feel Astaroth's dark energy.# -1412046 - Astaroth Axe - #cYou can feel Astaroth's dark energy.# -1432061 - Astaroth Spear - #cYou can feel Astaroth's dark energy.# -1442103 - Astaroth Polearm - #cYou can feel Astaroth's dark energy.# -1452083 - Solomon's Unstable Bow - (no description) -1452084 - Solomon's Bow - Completed Solomon's Bow -1452085 - Astaroth Bow - #cYou can feel Astaroth's dark energy.# -1462075 - Astaroth Crossbow - #cYou can feel Astaroth's dark energy.# -1472100 - Astaroth Claw - #cYou can feel Astaroth's dark energy.# -1482046 - Astaroth Knuckles - #cYou can feel Astaroth's dark energy.# -1492048 - Astaroth Gun - #cYou can feel Astaroth's dark energy.# -1302131 - Broomstick - (no description) -1702246 - Ghost Weapon - This item can be equipped over #call weapons#. -1702215 - Boleadoras - This item can be equipped #cany weapon except guns and knuckles#. -1442076 - Aran Polearm Maha - (no description) -1702249 - Gosling Cushion - An adorable pillow that can be equipped on #cany weapon except for guns and knuckles#. -1702250 - Steel Briefcase - A briefcase that can be equipped on #cany weapon except for guns and knuckles#. -1702238 - Soft Plush Dolphin - Can be equipped with #call weapons#. -1302119 - King Pepe Cutlass - (no description) -1302120 - Angel Sword - (no description) -1312045 - King Pepe Danker - (no description) -1322073 - King Pepe Heavy Hammer - (no description) -1332088 - King Pepe Gephart - (no description) -1372053 - King Pepe Wizard Wand - (no description) -1382070 - King Pepe Petal Staff - (no description) -1402064 - King Pepe Highlander - (no description) -1412042 - King Pepe Niam - (no description) -1422045 - King Pepe Big Hammer - (no description) -1432057 - King Pepe Nakamaki - (no description) -1442077 - Practice Polearm - (no description) -1442080 - Steel Polearm - (no description) -1442081 - Tru's Mithril Polearm - A Mithril Polearm from Tru. It will disappear the moment you log out of the game. -1442082 - King Pepe Axe Polearm - (no description) -1452073 - King Pepe Red Viper - (no description) -1462066 - King Pepe Eagle Crow - (no description) -1472089 - King Pepe Dark Guardian - (no description) -1482037 - King Pepe Silver Maiden - (no description) -1492038 - King Pepe Shooting Star - (no description) -1702251 - Saw Machine Gun - A machine gun with a terrifying, rotating saw blade. You can apply this item to #cany weapon# of your choice. diff --git a/tools/MapleIdRetriever/handbook/Etc.txt b/tools/MapleIdRetriever/handbook/Etc.txt deleted file mode 100644 index 61d29e4940..0000000000 --- a/tools/MapleIdRetriever/handbook/Etc.txt +++ /dev/null @@ -1,2385 +0,0 @@ -4001257 - Staff of First Magic - A symbolic weapon of Mage mastery. Although it can't be equipped, its power is palpable. This item must be placed in the Altar of Mastery to activate it. -4001258 - Ancestral Bow - A symbolic weapon of Bowman mastery. Although it can't be equipped, its power is palpable. This item must be placed in the Altar of Mastery to activate it. -4001259 - Master Sword - A symbolic weapon of Warrior mastery. Although it can't be equipped, its power is palpable. This item must be placed in the Altar of Mastery to activate it. -4001260 - Forbidden Gun - A symbolic weapon of Pirate mastery. Although it can't be equipped, its power is palpable. This item must be placed in the Altar of Mastery to activate it. -4000488 - MasteriaPQ Mob Summon - (no description) -4031867 - A secret letter - A secret letter that contains information about the traitorous MV. Needs to be delivered to Charles the Adventurer. -4032234 - Piece of Courage - A piece that represents courage -4032235 - Piece of Wisdom - A piece that represents wisdom -4032236 - Piece of Accuracy - A piece that represents accuracy -4032237 - Piece of Dexterity - A piece that represents dexterity -4032238 - Piece of Freedom - A piece that represents freedom -4001249 - Maple Necklace Gem - A beautiful gem that can be set on the Mind of Maple Necklace. -4001250 - Maple Necklace Pendant - This can be used to create the Mind of Maple Necklace. -4220147 - Mind of Maple Necklace - A Mind of Maple Necklace that brings luck and hope to anyone who wears it. -4290000 - Golden Chicken Effect - Golden Chicken Effect was given as a reward for helping Lazy Daisy. You can turn it ON/OFF by double-clicking the icon or using the key configuration menu to assign a shortcut key. -4290001 - Bummer Effect - This effect is for people who helped Lazy Daisy but failed to hatch the egg. You can turn it ON/OFF by double-clicking the icon or using the key configuration menu to assign a shortcut key. -4220089 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220090 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220091 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220092 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220093 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220094 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220095 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220096 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220097 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220098 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220099 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220100 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220101 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220102 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220103 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220104 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220105 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220106 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220107 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220108 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220109 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220110 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220111 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220112 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220113 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220114 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220115 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220116 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220117 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220118 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220119 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220120 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220121 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220122 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220123 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220124 - Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220125 - Golden Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220126 - Golden Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220127 - Golden Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220128 - Golden Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220129 - Golden Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220130 - Golden Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220131 - Golden Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220132 - Golden Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220133 - Golden Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220134 - Golden Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220135 - Golden Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4220136 - Golden Egg - This is Lazy Daisy's egg she has left in your care. If you double-click and leave the UI open, it will grow faster. -4032135 - Growth Powder - Sprinkle it on eggs or chicks to expedite their growth. -4032093 - Alcaster's Reply - A reply letter written by Alcaster of El Nath for Snow Spirit. -4032199 - Transparent Icon 1 - A transparent item. -4032200 - Transparent Icon 2 - A transparent item. -4000000 - Blue Snail Shell - A shell removed from a snail -4000001 - Orange Mushroom Cap - A cap removed from a mushroom -4000002 - Pig's Ribbon - Taken off from the pig with a ribbon -4000003 - Tree Branch - The branch bent away from a tree -4000004 - Squishy Liquid - Very thick and sticky liquid -4000005 - Leaf - The leaf that's taken out of a tree -4000006 - Octopus Leg - The leg removed from an octopus -4000007 - Evil Eye Tail - A tail removed from a lizard -4000008 - Charm of the Undead - A charm taken out of an undead monster. -4000009 - Blue Mushroom Cap - A cap removed from a mushroom -4000010 - Slime Bubble - A bubble removed from the slime -4000011 - Mushroom Spore - A spore of a mushroom -4000012 - Green Mushroom Cap - A cap removed from a mushroom -4000013 - Curse Eye Tail - A tail removed from a lizard -4000014 - Drake Skull - It's a skull of Drake -4000015 - Horny Mushroom Cap - A cap removed from a mushroom -4000016 - Red Snail Shell - A shell removed from a snail. -4000017 - Pig's Head - Head of a pig -4000018 - Firewood - A high-quality firewood from an Axe-Stump. -4000019 - Snail Shell - Shell removed from a snail -4000020 - Wild Boar Tooth - The canine tooth taken off from the Wild Boar -4000021 - Leather - An animal's skin that's been cut away -4000022 - Stone Golem Rubble - A mystic rubble that was a part of Stone Golem. -4000023 - Cold Eye Tail - A tail removed from a lizard -4000024 - Fire Boar's Tooth - The canine tooth taken off from the Fire Boar -4000025 - Dark Stone Golem Rubble - A mystic rubble that was a part of Dark Stone Golem. -4000026 - Lupin Doll - A miniature figure of Lupin -4000027 - Wild Kargo Eye - An eye removed from Wild Kargo -4000028 - Tauromacis Horn - A very solid and heavy piece of a horn from Tauromacis. -4000029 - Lupin's Banana - It's Lupin's favorite: a tasty banana -4000030 - Dragon Skin - A solid piece of dragon's skin that gives off a mysterious light. -4000031 - Cursed Doll - A cursed doll possessed by the Zombie Lupin's. -4000032 - Ligator Skin - A very solid and tough piece of skin from the Ligator. -4000033 - Croco Skin - A very solid and tough piece of skin from Croco. -4000034 - Jr. Necki Skin - A piece of skin from the Jr. Necki. -4000035 - Tablecloth - A tablecloth donned by Jr. Wraith. -4000036 - Medicine With Weird Vibes - A medicine with weird vibes left by Wraith -4000037 - Bubbling's Huge Bubble - A huge bubble removed from a Bubbling -4000038 - Event Trophy - A souvenir for entering the event. Made out of gold, so you can sell it for a high price. -4000039 - Iron Hog's Metal Hoof - A metal hoof that covered the legs of Iron Hog. -4000040 - Mushmom Spore - A spore from Mushmom, a humongous mushroom -4000041 - Malady's Experimental Frog - A bottle containing frogs that Malady had for various experiments. -4000042 - Stirge Wing - A wing cut out of Stirge. -4000043 - Lorang Claw - A huge piece of claw cut out of Lorang. -4000044 - Clang Claw - A huge piece of claw cut out of Clang. -4000045 - Tortie Shell - A shell cut out of Tortie's back. -4000046 - Taurospear Horn - A very tough and heavy piece of horn from Taurospear. -4000047 - Mouse - A computer mouse probably taken from an internet cafe. -4000048 - Jr. Yeti Skin - A skin cut out of Jr. Yeti. Very soft and full of white fur. -4000049 - Yeti Horn - A horn cut out of Yeti. Very solid and hard to break. -4000050 - Pepe Beak - A beak cut out of Pepe. Solid and gold-colored. -4000051 - Hector Tail - A tail cut out of Hector. Brown, and a tad rough. -4000052 - White Pang Tail - A tail cut out of White Pang. Very soft, white hair. -4000053 - Werewolf Toenail - A toenail cut out of Werewolf. Better be careful, because it's really sharp. -4000054 - Lycanthrope Toenail - A toenail cut out of Werewolf. Better be careful, because it's not only really sharp, but almost unbreakable. -4000055 - Dark Jr. Yeti Skin - A skin cut out of Dark Jr. Yeti. Consists of rough, black hair. -4000056 - Dark Yeti Horn - A horn cut out of Dark Yeti. Very solid and hard to break. -4000057 - Dark Pepe Beak - A beak cut out of Dark Pepe. Solid and black-colored. -4000058 - Nependeath Seed - A seed cut out of Nependeath. It's poisonous, so it shouldn't be taken lightly. -4000059 - Star Pixie's Starpiece - A piece of star dropped by Star Pixie. It glows beautifully. -4000060 - Lunar Pixie's Moonpiece - A piece of moon dropped by Lunar Pixie. It glows beautifully. -4000061 - Luster Pixie's Sunpiece - A piece of sun dropped by Luster Pixie. It glows beautifully. -4000062 - Dark Nependeath Seed - A seed cut out of Dark Nependeath. Should be handled with care, because it's poisonous with thorns around it. -4000063 - Sentinel Shellpiece - A hard shellpiece from Sentinel. -4000064 - Crow Feather - The feather of a crow. -4000065 - Raccoon Firewood - Raccoon's firewood. -4000066 - Cloud Foxtail - Cloud Fox's tail. -4000067 - Jr. Boogie Horn - A horn removed from Jr. Boogie. Small, dense, and hard to break. -4000068 - Fierry's Tentacle - A tentacle removed from Fierry. Very small and delicate, so it should be handled with care. -4000069 - Zombie's Lost Tooth - A lost tooth from a Zombie. It's very decayed, looking to break apart any minute. -4000070 - Cellion Tail - A tail removed from Cellion. Very soft and scorching hot. -4000071 - Lioner Tail - A tail removed from Lioner. Very soft and electric. -4000072 - Grupin Tail - A tail removed from Grupin. Very soft and ice cold. -4000073 - Solid Horn - A horn that can be obtained from Jr. Cellion, Jr. Lioner, and Jr. Grupin. -4000074 - Lucida Tail - A tail removed from Lucida. It is overflowing with evil force. -4000075 - Triangular Bandana of the Nightghost - Triangular Bandana that Nightghost wears while spooking other. -4000076 - Fly-Eye Wing - A wing removed from Fly-Eye. Spiky and very dirty. -4000077 - Dark Cloud Foxtail - Dark Cloud Fox's tail -4000078 - Jr. Cerebes Tooth - A tooth removed from Jr. Cerebes. Very small and dense, it also looks very hard to break. -4000079 - Cerebes Tooth - A tooth removed from Cerebes. Very long and massive, enough for it to be a threat to someone. -4000080 - Bain's Spiky Collar - A collar stolen from Bain. Spiked in everywhich way, enough for it to be a threat to someone. -4000081 - Firebomb Flame - A collection of sparks from Firebomb. Scorching hot, looking to explode any minute. -4000082 - Zombie's Lost Gold Tooth - A lost gold tooth from the zombie. -4000083 - Jr. Sentinel Shellpiece - A hard shellpiece that's a part of Jr. Sentinel. -4000084 - Ice Sentinel Shellpiece - A hard shellpiece that's a part of Ice Sentinel. -4000085 - Fire Sentinel Shellpiece - A hard shellpiece that's a part of Fire Sentinel -4000086 - Leatty Furball - Leatty's Furball. So soft and small that it looks like it may just float away. -4000087 - Dark Leatty Furball - Dark Leatty's Furball. So soft and small that it looks like it may just float away. -4000088 - Jr. Pepe's Fish - A snackery of Jr. Pepe : a live, fresh fish. -4000089 - Littleman A's Badge - The badge of Littleman A -4000090 - Littleman B's Name Plate - The name plate of Littleman B -4000091 - Littleman C's Necklace - The necklace of Littleman C. -4000092 - Leader A's Shades - The shades of leader A -4000093 - Leader B's Charm - The charm of Leader B. -4000094 - Boss's Pomade - Boss's pomade. -4000095 - Rat Trap - Some one must have set up this rat trap. Make sure it doesn't go off. -4000096 - Hard Walnut - A hard walnut that may have been nibbled away before. -4000097 - Spiderweb - A small spiderweb that's been intricately made. Sticks onto anything. -4000098 - Sticky Spiderweb - A very adhesive spiderweb. Much more sticky than the regular spiderweb. -4000099 - Bloctopus Key Chain - A small, octopus-shaped key chain made out of plastic. -4000100 - Plastic Crown - A toy crown made out of plastic. -4000101 - Yellow Toy Block - A toy block that's a part of Golem. -4000102 - Blue Toy Block - A toy block that's a part of Golem -4000103 - Propeller - A propeller that's a part of the toy plane. -4000104 - Motor - A motor that's a part of the toy plane. -4000105 - Plane Controller - A controller used to navigate the toy plane. -4000106 - Teddy's Cotton - A soft piece of cotton from Teddy. -4000107 - Teddy's Yellow Ribbon - A yellow ribbon from Teddy. -4000108 - Panda Doll - A small, adorable-looking panda doll. Looks so real that it may just get up and walk around any minute. -4000109 - Toy Duckling - A miniature toy duckling with wheels. -4000110 - Toy Trojan Sword - A plastic sword from the toy trojan. -4000111 - Cheap Battery - A cheap battery from the inside of a robot. Looks like it still can be used for a little bit. -4000112 - Mechanical Heart - A mechanical heart from the inside of the robot. Looks like it's still working. -4000113 - Clock Spring - A tiny spring of the clock. -4000114 - Table Clock - A very pretty-looking table clock. It's still running. -4000115 - Cog - An important part of a clock. -4000116 - Small Egg - Small egg, which is easily breakable -4000117 - Space Food - Food from the Space. You are not supposed to eat this. -4000118 - Small Spaceship - Small-sized spaceship. There seems to be a special way of making this work -4000119 - Receiving Apparatus - Apparatus, which enables you to receive informations from the space. There seems to be a special way of making this work -4000120 - Mateon's Tentacle - Mateon's tentacle, which collects lots of information. -4000121 - Plateon's Helmet - A helmet that Plateon wears all the times. It's slimy inside -4000122 - Mecateon's Laser Gun - A laser gun that Mecateon carries. There seems to be a special way of making this work -4000123 - Worn-Out Goggle - It is a worn-out goggle. It is too small. -4000124 - Rombot's Memory Card - A memory card that contains the program that controls Rombot. -4000125 - Chief Gray's Sign - A sign only the Chief Grays have. The mystical power that the Chief Gray's possess seem to originate from it. -4000126 - MT-09's Fuel - A fuel tank of MT-09 that contains unknown liquid. Looks like it has a lot of punch even with a small amount. -4000127 - Toy Drum - A toy drum from the Drum Bunny. -4000128 - Buffy Hat - A multi-colored hat from Buffy. -4000129 - Lazy Buffy Marble - A marble from the tip of the hat that Lazy Buffy wore. Seems to have a mystierious power hidden in it. -4000130 - Buffoon's Grandpa Clock - An old, humongous grandfather's clock Buffoon uses as a weapon. -4000131 - Deep Buffoon's Rock Piece - A rock piece that Deep Buffoon donned on its waste. Quite heavy. -4000132 - Ghost Pirate Key - A key stuck on the boat that Pirate was riding on. -4000133 - Dual Pirate's Propeller - A propeller of the boat that Dual Pirate rides on. -4000134 - Viking Sail - A sail on the ship that Viking was riding on. -4000135 - Gigantic Viking Hat - A huge hat that Gigantic Viking donned. -4000136 - Coconut - A fresh coconut made in Florina Beach. -4000137 - Subordinate D Fingernail - Looks like a fingernail of a Subordinate D. -4000138 - Lady Boss's Comb - A comb that the lady boss always carries with. -4000139 - Bodyguard A's Tie Pin - A pin stuck on the tie of Bodyguard A. -4000140 - Bodyguard B's Bullet Shell - A bullet shell of the gun that Bodyguard B used. -4000141 - Big Boss Flashlight - Maybe the Big Boss uses it as a secret weapon... -4000142 - Jr. Sentinel Shellpiece - A hard piece of rock that forms the body of Jr. Sentinel. -4000143 - Zombie Teddy Bear - A Teddy plushy that's been controlled by Soul Teddy. The soul is long gone, and what's left is a torn-up toy. -4000144 - Free Spirit - A soul that used to be stuck on the back of Master Soul Teddy. The soul is now set free, and it's smiling. -4000145 - Sealed-up Grandpa Clock - Sealed up the center of the clock with a charm . -4000146 - Evil Spirit - The heart of the Dark Clock is broken, and the charm is stuck on it, but it's still not fully sealed up. As a result, it gives off black aura all around it. -4000147 - Sealed Teddy Bear - A sealed-up Teddy bear that's been controlled by Death Teddy. -4000148 - Binding Bridle - The bridle that bound Master Death Teddy's hand and the Teddys. -4000149 - Sealed Bottle - A pot that is a source of power that sealed up the phantom watch. -4000150 - Ice Piece - An ice piece formed after the death of Grim Phantom Watch. -4000151 - Gatekeeper Armband - An armband from the Gatekeeper. -4000152 - Tanathos Strap - A strap from Tanathos -4000153 - Snorkle - Used by Scuba Pepe to breathe while swimming. -4000154 - Toy Baby Seal - A toy figure that's modeled after Jr. Seal. -4000155 - Seal Skin - A seal skin made with processed Freezer skins. -4000156 - Seal Tooth - A long tooth removed from Sparker; looks very strong and powerful. -4000157 - Seal Meat - Seal meat is as nutritious a food as it gets. -4000158 - Poopa Egg - A small egg laid by a Poopa. -4000159 - Poison Poopa's Poisonous Spikes - A poisoned set of spikes from Poison Poopa. -4000160 - Needle - A long, sharp needle from Pinboom's body. -4000161 - Sea Horse Tail - A rolled-up tail from Seacle. -4000162 - Flamboyant Scale Skin - A scale skin with flamboyant colors in tact from Krappi. -4000163 - Sea Horse Horn - A round horn from the head of Cico. -4000164 - Bubble Fish's Thoughts - A small, red jewel from the inside of Bubblefish. -4000165 - Flamboyant Petal - A flower petal from the head of Flowerfish. -4000166 - Shrimp Meat - A delicious shrimp from Krip. -4000167 - Hard Needle - A hard, solid needle from Mask Fish. -4000168 - Sunflower Seed - A sunflower seed that Ratz enjoys. Has a long black stripe on it. -4000169 - Pounder - A pounder that the Moon Bunny always carries around. Used to pound away the crops in the mortar. -4000170 - Tiger Stamp - A slate that has Tiger's thick footprint engraved. -4000171 - Tiger Skin - A tiger skin that Hogul wears. -4000172 - Three-Tailed Foxtail - A soft foxtail that Three-Tailed Fox removed from itself. -4000173 - Broom - A small broom made from bushes that Blins dropped. -4000174 - Money Envelope - You can sell this envelope for 10,000 meso in the store. -4000175 - Minature Pianus - A miniature version of Pianus -4000176 - Poisonous Mushroom - A poisonous mushroom that lives on the humongous Zombie Mushroom. -4000177 - Mixed Block - A block from Mix Golem that consists of its chest area. -4000178 - Iron Boar Armor - A small piece of the solid armor from Iron Boar. -4000179 - A Bundle of Goby - A bundle of Goby wrapped around with a rope. -4000180 - Shark Denture - A sharp shark denture. -4000181 - Frozen Shark's Fin - A frozen, cooked shark's fin from the Cold Shark. -4000182 - Lime Powder Bottle - A bottle of lime powder from the bones of Bone Fish. -4000183 - Ink Bottle - A bottle of Squid ink. -4000184 - Butter-Toasted Squid - Risell Squid, buttered up and toasted. -4000185 - Ice Backbone - A backbone from Ice Drake. -4000186 - Dark Drake's Horn - A horn from Dark Drake's head. -4000187 - Chicken Feet - A chicken's foot -4000188 - Duck Egg - A round, white egg laid by a duck. -4000189 - Sheep Skin - A white fluffy wool from white sheep. -4000190 - White Horn - A white horn from a goat. -4000191 - Black Horn - A black horn shed from the black goat. -4000192 - Nose Ring - A nose ring stuck on the nose of cows. -4000193 - Plow - A plow that's on the back of the oxen to plow the field. -4000194 - Black Fur - A fluffy black wool from the black sheep. -4000195 - Seedling - A branch from Ghost Stump. -4000196 - Wooden Board - A wooden board that Wooden Mask wears. -4000197 - Slate - A slate that Stone Mask wears. -4000198 - Wild Dog Tail - A short and stiff tail of Wild Dog -4000199 - Wild Dog Shades - A pair of cool-looking sunglasses adorned by stylish Wild Dog. -4000200 - Wild Dog Denture - A denture worn by the intimidating Wild Dog. -4000201 - Monkey Bike - A unicycle ridden by Circus Monkey. -4000202 - Motorcycle Helmet - A helmet adorned by Biker Monkey -4000204 - Skeledog's Bone - A bone that fell out of Skeledog. -4000205 - Dirty Bandage - A string of dirty bandage that was wrapped around Mummydog. -4000206 - Rib - A rib from Skeleton Soldier. -4000207 - Pelvic Bone - A pelvic bone from Skeleton Officer. -4000208 - Horse Skull - A horse skull from the horse of Skeleton Commander. -4000215 - Axe - An axe stuck in a trunk. -4000222 - Worn Paper Lantern - Worn paper lantern from Purple ghost. -4000223 - Cucumber - A delicious looking cucumber that Hadong Dropped. -4000224 - Sabots - Pair of Sabots that Red nose was wearing. -4000225 - Kimono Piece - A piece of cloth that Mong Ghost was wearing. -4000226 - Rash's Furball - A ball of hair that fell off from Rash. -4000227 - Tree Fruit - Rash's favorite food. Not for humans! -4000228 - Anesthetic Powder - A sparkling powder that fell from Rash. Be careful, because this powder is anesthetic. -4000229 - Dark Rash's Furball - A ball of hair that fell off from Dark Rash. -4000230 - Curse Powder - A sparkling powder that fell from Rash. Be careful, because this powder is packed with a potent curse. -4000231 - Hankie's Pan Flute - An exotic instrument played by Hankie. -4000232 - Kentaurus's Flame - The root of Kentaurus's awesome power. -4000233 - Kentaurus's Marrow - The root of Kentaurus's awesome power. -4000234 - Kentaurus's Skull - The root of Kentaurus's awesome power. -4000235 - Manon's Tail - A tail that's been cut off from Manon. It looks quite enticing, but it actually doesn't taste very good. -4000236 - Beetle's Horn - A horn removed from Beetle's head. Very solid and sharp. -4000237 - Dual Beetle's Horn - A horn removed from Dual Beetle's head. Bigger and stronger than Beetle's horn. -4000238 - Harp's Tail Feather - A tail feather removed from Harp. Visually pleasing enough to use as an accessory.. -4000239 - Blood Harp's Crown - A small crown worn by Blood Harp. Very soft and comfortable. -4000240 - Small Flaming Feather - A soft, flaming-like feather that fell from Blood Harp. -4000241 - Birk's Chewed Grass - A batch of grass Birk likes to chew on a regular basis. Should not be chewn by anyone else. -4000242 - Dual Birk's Tiny Tail - A tiny tail from Dual Birk. Girls love its distinctively cute design. -4000243 - Griffey Horn - A horn removed from Griffey. Solid white, but also pretty enough to be used as a material for accessories. -4000244 - Dragon Spirit - A crystal with rough edges that has a small dragon engraved on it. A mysterious force can be felt just by looking at it. -4000245 - Dragon Scale - A piece of scale that fell from dragon. A mysterious force can be felt just by looking at it. -4000246 - Toad Poisoin - A bottle full of poison from Toad's skin. -4000247 - Frog Legs - A very chewy back leg of a frog. -4000248 - Snake Scale - A piece of scale that fell off the snake. -4000249 - Snake Skin - A snake skin removed from the animal. -4000250 - Lizard Tail - A piece of lizard tail that an animal dropped when it felt threatened. -4000251 - Lizard Tongue - A lizard tongue that features distinctively lively color. -4000252 - Chicken - A featherless chicken ready to be cooked. -4000253 - White Egg - A white egg that was laid this morning. -4000254 - Red Bubble - A red bubble used for bubble teas. -4000255 - Yellow Bubble - A yellow bubble used for bubble teas. -4000256 - Green Bubble - A green bubble used for bubble teas. -4000257 - Yeti Key Chain - A key chain with a doll that resembles Yeti. -4000258 - Jr. Pepe Key Chain - A key chain with a doll that resembles Jr. Pepe. -4000259 - UFO Catcher - A key chain with a doll that resembles the UFO Catcher. -4000260 - Hov's Shorts - A ragged pair of brown shorts that Hov wore. -4000261 - Pin Hov's Charm - A rabbit-foot charm that Pin Hov kept to himself. It looks very poorly made. -4000262 - Cracked Shell - A grey shell from the Blue Dragon Turtle. It has a little bit of crack on it, but it's still rock-solid and heavy. -4000263 - Red Shell - A red shell from the Red Dragon Turtle. Features an intimidating set of spikes on the shell. -4000264 - Rexton Leather - A piece of skin that protects Rexton from bodily harm. -4000265 - Strange Egg - A strange-looking egg that rode on top of Brexton. -4000266 - Wooden Shoulder Pad - A shoulder pad from Green Cornian. Made with wood. -4000267 - Skull Shoulder Pad - A shoulder pad from Dark Cornian. Composed entirely out of a skull, which instills fear in anyone taking a look at it. -4000268 - Wyvern Wing - A torn red wing from Red Wyvern. -4000269 - Wyvern Gill - A small gill that is attached to both sides of Blue Wyvern's face. -4000270 - Wyvern Toenail - A small, sharp toenail attached at the end of Dark Wyvern's wings. -4000271 - Destroyed Nest - A dragon nest that has been utterly destroyed. -4000272 - Egg Shell - A broken piece of egg shell that Newt Jr. had on its head. -4000273 - Old Neck Bone - An old neck bone from Skelosaurus. -4000274 - Broken Horn - A horn that used to adorn the head of Skelegon. It's now broken off. -4000275 - Broken Horn - A horn that used to adorn the head of Skelegon. It's now broken off. -4000276 - Acorn - A small acorn that the squirrels collect. -4000277 - Thimble - A small piece of rubber used to protect fingers while sewing. -4000278 - Needle Pouch - A pouch used to keep needles by poking the needle through it. -4000279 - Necki Flower - A red flower petal that used to be on the head of Red Retro Snake. -4000280 - Necki Swimming Cap - A swimming cap fully adorned with flowers that used to be on the head of Blue Retro Snake. -4000281 - Snake Leather - A high-quality snake leather with snake patterns clearly featured on it. -4000282 - Peach Seed - A peach seed spat out by the Peach Monkey. -4000283 - Bear Foot - A huge, thick bear foot. -4000284 - Yellow Belt - A long yellow belt that the Grizzly wears around its waist. -4000285 - Red Belt - A long red belt that the Panda wears around its waist. -4000286 - Straw Doll - A yellow doll stuffed with straw. -4000287 - Wooden Doll - A wooden doll sculpted from head to toe. -4000288 - Broken Deer Horn - A white deer horn with the bottom snapped off. -4000289 - Cat Doll - A slouched grey cat doll. -4000290 - Porcupine Spine - A sharp porcupine spine that's dropped by Red or Black Porky. -4000291 - Broken Piece of Pot - A piece that fell out of a broken pot. -4000292 - Ginseng-Boiled Water - A hot pot that contains water that's been boiling with ginseng for a long time. -4000293 - Bellflower - A commonly-found root of a bellflower. -4000294 - 100-Year-Old Bellflower - The root of a 100-year-old bellflower. -4000295 - Mr. Alli's Leather - A freshly torn piece of Mr. Alli's leather. -4000296 - Mark of the Pirate - A unique piece of cloth used for identification among pirates. -4000297 - Captain's Hat - A pirate captain's hat. -4000298 - Old Paper - An old, blank piece of paper. Due to age, the color has tinted a faint yellow. -4000299 - The Book Ghost's Sheet of Paper - A sheet from the book that contains a writing of divination of the Mountain God. Contains unrecognizable writings. -4000300 - Letty's Hairball - A hairball from Leatty. So small and soft, it could easily fly away. -4000301 - Toy Drum - A toy drum from the drumming rabbit. -4000313 - Golden Maple Leaf - A maple leaf that contains the mysterious power of the golden pig. -4000324 - Clover - A Sand Rabbit's food. Also known as rabbit grass, it usually has three leaves. -4000325 - Carrot - A Sand Rabbit's food. They love eating the plump orange root! -4000326 - Earmuff - Earmuffs that keep the ears warm. The muffs on this pair are old and shaggy. -4000327 - Ragged Scarf - An old ragged scarf. It doesn't look like it's been washed in a very long time. -4000328 - Snake Rattle - Bellamoa's rattle. Shaking it might draw Bellamoa out. -4000329 - Cactus Stem - Cut pieces of a Cactus. The liquid from the cactus is good for healing wounds. -4000330 - Cactus Thorn - A cactus' thorn. Although it contains no poison, being pricked by one is extremely painful. -4000331 - Cactus' Flower - A flower that can be obtained from Royal Cactus. The sweet sap from the flower is also used in teas. -4000332 - Sand - Shiny, fine sand that has been ground many times over for many years by the desert. -4000333 - Telescope - A telescope that lets you see far away. It makes things that are really far away appear very close. -4000334 - Empty Sack - The sack that the sand elfs used to excavate Lidium stones. It is currently empty. -4000335 - Kiyo's Beek - Kiyo's long and bent beak. It is very hard. -4000336 - Bible of the Corrupt - Richie's book. -4000350 - Wooden Hammer - A wooden hammer that can be obtained by catching a sand mole. -4000351 - Scorpion Sting - The scorpion's poisonous stinger. The poison is located at the tip of its sharp tail. -4000352 - Flaming Desert - A red sand crystal that the Dark Sand Dwarfs carry around. -4000353 - Gelatin - A firm and transparent blob of gelatin. -4000354 - Beaker - A beaker that has been used in science experiments. -4000355 - Homunculus's Sand - Sand that was a party of Homunculus's body. There is a slight scent of chemicals. -4000356 - Flask - A flask that has been used in science experiments. -4000357 - Piece of Steel - A piece of steel that was a part of Iron Mutae. -4000358 - Hardened Piece of Steel - A hardened piece of steel that was a part of the upgraded Iron Muten. -4000359 - Piece of Mithril - A piece of Mithril that was a part of Mithril Mutae. -4000360 - Hardened Piece of Mithril - A hardened piece of Mithril that was a part of the upgraded Mithril Mutae. -4000361 - May Mist - An ingredient that was used to capture Homunculus. -4000362 - Broken Mechanical Heart - A mechanical heart. Although it is currently broken, if fixed, it might be useful. -4000363 - Entry Pass - A pass that is needed to enter the research center. -4000364 - Wires - Coil of electric wires that was a part of Lloyd's body. -4000365 - Plug - An outlet that powers Neo Huroid. -4000366 - Waste Paper - A piece of trash Paper lying here and there in CBD. -4000391 - Boomer Core - The small core of a Boomer, still packs an explosive punch. Handle with caution! -4000399 - Loaded Spring - The neckpiece of a jack-in-the-box. -4000400 - Lock of Doll's Hair - A lock of blonde hair from one of Prendergast's dolls. -4000411 - Blacklist - A list of people that have trespassed to a Personnel-only area captured on the Security Camera. -4000412 - Proof of Training - A proof of training that's earned by defeating the Master Dummy. This signifies that the receiver has trained for a significant amount of time. -4000413 - Someone's Hat - An abandoned hat that used to be worn by someone. It resembles that of the subway workers. No idea why Shade would have this. -4000414 - Bamboo Nameplate - An item with a name engraved on a piece of bamboo. Used to be used as a form of ID. -4000415 - Ice Tear - A drop of tear made out of ice. Beautiful like a jewelry, but it's so cold that not everyone can touch it. -4000416 - Traditional Scholar Hat - A hat adorned by ancient scholars. Old, ragged, and crumpled. -4000417 - trans - trans -4000418 - Useless Mechanical Heart - A useless mechanical heart because it's totally destroyed. -4000419 - Purple Liquid - A purple liquid no one knows what it's for. Probably not for drinking. -4000422 - Christmas Present box (White) - A present box from snowman. -4000423 - Christmas Present box (Red) - A present box from snowman. -4000424 - Christmas Present box (Blue) - A present box from snowman. -4000425 - Christmas Present box (Purple) - A present box from snowman. -4000436 - Moss Snail Shell - A snail shell from Moss Snail. Very tough and solid, as if made with rocks. -4000437 - Black Mushroom Spore - A black mushroom spore from Moss Mushroom. It's quite dark. -4000438 - Tree Trunk - A strange tree trunk that's wrapped all over Lord Tree. -4000439 - Rubble - A piece of rubble from Stone Bug. -4000440 - Tough Leather - A tough, stiff leather from an animal. -4001000 - Arwen's Glass Shoes - A shiny glass shoes for women-only. -4001001 - VIP Mirror - A fancily decorated mirror. -4001002 - The Girl Next Door - A book with a dangerous content. -4001003 - Old Gold Watch - An old gold watch. An article left by Alex's late mother. -4001004 - "Blackbull's" deed to the land - A lost deed to the land for "Blackbull" of Perion. -4001005 - Ancient Scroll - A scroll from long ago that contains powerful, mysterious magic from then. -4001006 - Flaming Feather - A flame with the look of a feather. It never stops burning. -4001007 - Coupon - A coupon earned by taking down a monster. Can be traded with a pass. -4001008 - Pass - A pass earned by trading with a coupon. Can only advance to the next stage with a pass. -4001009 - Stump Eraser - An eraser shaped as a stump. -4001010 - Mushmom Eraser - An eraser shaped as the Mushmom. -4001011 - Lupin Eraser - An eraser shaped as the Lupin. -4001012 - Wraith Eraser - An eraser shaped as the Wraith. -4001013 - Slime Eraser - An eraser shaped as the slime. -4001014 - Octopus Eraser - An eraser shaped as the octopus. -4001015 - Paper Document - A document that contains informations about the studies on return scrolls. Collect these to exchange with return scroll to Mines. -4001016 - The Key - An important key that'll allow access to the huge tresure chest at the Mine Quest. -4001017 - Eye of Fire - A manmade seed of Zakum tree, which is actually sealed up. Used as the sacrifice to the altar. -4001018 - Fire Ore - The ore that contains the power of fire. Used as a material for the sacrifice to the altar. -4001019 - Orbis Rock Scroll - Use it at the magic rock on either the 1st or the 20th floor of Orbis Tower to teleport to one another. -4001020 - Eos Rock Scroll - You can transport to the other Eos Rocks by activating them using this scroll -4001021 - Fire Raccoon Eraser - An eraser that looks like the fire raccoon. -4001022 - Pass of Dimension - A pass earned through defeating the monster. Need the pass to move to the next level. -4001023 - Key of Dimension - A key possessed by Alishar. It can be used to block the entrances that leads to other places. -4001024 - Rubian - A breathtakingly beautiful red jewel. Need to be careful not to be too enamored with its color, though. -4001025 - Longinus Spear - A spear of mythical force. It contains elements that disables the seal of Eregoth. -4001026 - Key - A key made out of pure gold that is used to open a locked door. -4001027 - Medal of Valor - An honorable medal bestowed by the leader of Sharenian to the loyal subjects. -4001028 - Scroll of Wisdom - A scroll that contains various invaluable strategies that can be used in combat. -4001029 - Spoiled Food - A cup full of rotten, aged food in which its putrid smell cannot be ignored. -4001030 - Jr. Necki Drink - 700 Yrs Old - A fine alcoholic drink made out of Jr. Necki. This drink has been matured for 700 years. -4001031 - Sharen III's Pants - Pants worn by Sharen III. -4001032 - Sharen III's Shoes - Shoes worn by Sharen III. -4001033 - Sharen III's Top - Top worn by Sharen III. -4001034 - Sharen III's Crown - A gorgeous crown adorned by Sharen III. -4001035 - Mark of Evil - A mark that signifies that of Ergoth's faithful. Its pure force of evil can be felt just by looking at it. -4001036 - . - . -4001037 - Rusty Key - A rusty key that opens a door to a small, secret room. -4001038 - Stump Eraser - An eraser shaped like a Stump. There are five other erasers featuring different shapes of forms. Try collecting them all! -4001039 - Mushmom Eraser - An eraser shaped like a Mushmom. There are five other erasers featuring different shapes of forms. Try collecting them all! -4001040 - Lupin Eraser - An eraser shaped like a Lupin. There are five other erasers featuring different shapes of forms. Try collecting them all!. -4001041 - Wraith Eraser - An eraser shaped like a Wraith. There are five other erasers featuring different shapes of forms. Try collecting them all! -4001042 - Slime Eraser - An eraser shaped like a Slime. There are five other erasers featuring different shapes of forms. Try collecting them all! -4001043 - Octopus Eraser - An eraser shaped like an Octopus. There are five other erasers featuring different shapes of forms. Try collecting them all!. -4001044 - Statue of Goddess : 1st Piece - The first piece from the Statue of Goddess. -4001045 - Statue of Goddess : 2nd Piece - The second piece from the Statue of Goddess. -4001046 - Statue of Goddess : 3rd Piece - The third piece from the Statue of Goddess. -4001047 - Statue of Goddess : 4th Piece - The fourth piece from the Statue of Goddess. -4001048 - Statue of Goddess : 5th Piece - The fifth piece from the Statue of Goddess. -4001049 - Statue of Goddess : 6th Piece - The sixth piece from the Statue of Goddess. -4001050 - 1st Small Piece - A small piece among the pieces that formed the first piece of the Statue of Goddess. -4001051 - 2nd Small Piece - A small piece among the pieces that formed the second piece of the Statue of Goddess. -4001052 - 5th Small Piece - A small piece among the pieces that formed the fifth piece of the Statue of Goddess. -4001053 - Strange Seed - A strange seed that summons Nependeath. -4001054 - Even Stranger Seed - An even stranger seed that summons the Grass of Life. -4001055 - Grass of Life - A grass of life that is powerful enough to resurrect the Goddess. -4001056 - LP : Operatic Music - An LP that contains mostly operatic scores. -4001057 - LP : Cute Music - An LP that offers cute, charming scores. -4001058 - LP : Scary Music - An LP that offers scary music perfect for horror movies. -4001059 - LP : Fun Music - An LP that offers fun, bouncy music. -4001060 - LP : Sad Music - An LP that offers sad, melancholic music. -4001061 - LP : Cold Music - An LP that offers cold, chilly music. -4001062 - LP : Tight Music - An LP that offers music with tight arrangements. -4001063 - Cloud Piece - A piece of a cloud. -4001064 - Diary : 1st Page - April 16th\nTitle : I have finally started writing a diary.\nThe Owl of Minerva today...\n 1 / 10 page -4001065 - Diary : 2nd Page - April 19th\nTitle : My Statue\nThe humans have been building a tall tower for me...\n 2 / 10 page -4001066 - Diary : 3rd Page - April 23rd\nTitle : On a Lazy Afternoon...\nLately, every morning I have been...\n 3 / 10 page -4001067 - Diary : 4th Page - April 24th\nTitle : Unwelcome Guest\nToday, Papa Pixie came by for a visit wearing this round, weird-looking hat...\n 4 / 10 page -4001068 - Diary : 5th Page - April 27th\nTitle : Busted Statue of Goddess\nToday was really a rough day...\n 5 / 10 page -4001069 - Diary : 6th Page - April 28th\nTitle : Papa Pixie's 2nd Visit\nPapa Pixie, who came by a couple of days ago...\n 6 / 10 page -4001070 - Diary : 7th Page - April 30th\nTitle : A Visit by Human\nToday, the humans paid a visit to the tower...\n 7 / 10 page -4001071 - Diary : 8th Page - May 3rd\nTitle : Lazy Papa Pixie\nToday I felt like watering the garden...\n 8 / 10 page -4001072 - Diary : 9th Page - May 5th\nTitle : Eak's Lecture\nEak was following me around all day...\n 9 / 10 page -4001073 - Diary : 10th Page - May 7th\nTitle : Restoring the Statue\nLooking at the busted statue of goddess, Papa Pixie...\n 10 / 10 page -4001074 - Transparent Item - This item is very transparent. -4001075 - Cornian's Marrow - A solvent that contained the force of Cornian. Emits a mysterious color. -4001076 - Manon's Cry - A horn that contains the cry of Manon. -4001077 - Tough Dragon Skin - A dragon skin that is multiple times tougher than a regular dragon skin. -4001078 - Cornian's Dagger - A dagger that resembles a tide which was used by Green Cornian. Very sharp around the edges, making it a lethal weapon. -4001079 - Busted Dagger - An old, worn dagger by Dark Cornian. Due to long periods of use, this once-sharp blade is now dull -4001080 - Mark of the Squad 1 - A mark carried by the Dragon Squad as the means of identification. -4001081 - Mark of the Squad 2 - A mark carried by the Dragon Squad as the means of identification. -4001082 - Mark of the Squad 3 - A mark carried by the Dragon Squad as the means of identification. -4001083 - Zakum Certificate - A mystic piece of rock dropped by Zakum. The ultimate proof that you have slain Zakum. -4001084 - Papulatus Certificate - A mystic piece of rock dropped by Papulatus. The ultimate proof that you have slain Papulatus. -4001085 - Pianus Certificate - A mystic piece of rock dropped by Pianus. The ultimate proof that you have slain Pianus. -4001086 - Certificate of the Dragon Squad - A certificate that signifies the exclusive membership of the Dragon Squad. -4001087 - Crystal Key : 1st Room of Maze - A crystal key that opens the door to the first room of maze. -4001088 - Crystal Key : 2nd Room of Maze - A crystal key that opens the door to the second room of maze. -4001089 - Crystal Key : 3rd Room of Maze - A crystal key that opens the door to the third room of maze. -4001090 - Crystal Key : 4th Room of Maze - A crystal key that opens the door to the fourth room of maze. -4001091 - Crystal Key : 5th Room of Maze - A crystal key that opens the door to the fifth room of maze. -4001092 - Red Key - A special key that saps the strength of Horntail, the monster protecting the cave door. -4001093 - Blue Key - A special key that saps the strength of Horntail, the monster protecting the cave door. -4001094 - Nine Spirit's Egg - The egg of Nine Spirit that Horntail stole. Need to return the egg to its original nest. -4001095 - Green Primrose Seed - A seed that'll eventually grow into a primrose. -4001096 - Purple Primrose Seed - A seed that'll eventually grow into a primrose. -4001097 - Pink Primrose Seed - A seed that'll eventually grow into a primrose. -4001098 - Brown Primrose Seed - A seed that'll eventually grow into a primrose. -4001099 - Yellow Primrose Seed - A seed that'll eventually grow into a primrose. -4001100 - Blue Primrose Seed - A seed that'll eventually grow into a primrose. -4001101 - Moon Bunny's Rice Cake - A chewy rice cake made by Moon Bunny. -4001102 - Treasure Chest - A chest full of rare, valuable jewelries. -4001103 - Cornian's Marrow - A solvent that contained the force of Cornian. Emits a mysterious color. -4001104 - Manon's Cry - A horn that contains the cry of Manon. -4001105 - Tough Dragon Skin - A dragon skin that is multiple times tougher than a regular dragon skin. -4001106 - Entrance Ticket to the Ludibrium Maze - This ticket is used to enter the Ludibrium Maze. -4001107 - [Storybook]Black book - A book with a black cover. I got a eery and evil energy from it and could not open it. I should take it to Bishop Gritto.\nOnly for : #cBishop# -4001108 - Cold Flame - A small flame that'll slowly build up to be a cold fire. -4001109 - Hardened Glass Bottle - A glass bottle that can hold the lava's marrow. One of the materials used while making the bottle was a diamond; thus, the bottle is multiple times more powerful than a regular glass bottle. -4001110 - [Storybook] Unknown Letter - It's an anonymous letter. It just said #c 'I have what you want. Meet me at the Cloud Balcony'#.\nOnly for : #cNight Lord# -4001111 - [Storybook] Crimson Balrog's Proposal - It's half of the note about the plan to kidnap Tylus that Crimson Balrog had.\nOnly for : #c4th job Warrior# -4001112 - [Storybook] Indecipherable Book - It's a book written with monster language that I can't read. Would Manji know about the book?\nOnly for : #c4th Job Warrior# -4001113 - Phoenix's Egg - An egg of a legendary bird Phoenix. -4001114 - Freezer's Egg - An egg of a legendary bird Freezer. -4001115 - Undine's Cloth - An arcane piece of cloth from Undine, the powerful water spirit. Something may happen if this is combined with the Monster Eraser... -4001116 - Hectagon Necklace - A beautiful piece of necklace featuring the hexagon-shaped jewelry. Something may happen if brought with the Monster Eraser... -4001117 - Old Metal Key - An old metal key used to lock the door of the pirate ship. -4001118 - Piece of the Pirate Map - A ripped piece of the map that featured the routes the pirates took. -4001119 - Pirate Map - It's the map that details the routes that the pirates take. -4001120 - Mark of the Rookie Pirate - A mark that signifies that the owner is in the lower ranks among the pirates. -4001121 - Mark of the Rising Pirate - A mark that signifies that the owner is in the middle ranks among the pirates. -4001122 - Mark of the Veteran Pirate - A mark that signifies that the owner is in the top ranks among the pirates. -4001123 - Transparent Item - A transparent item for summoning Wu Yang. -4001124 - Dr. Do's Marble - It's the marble I received after giving medicinal ingredients to Dr. Do. -4001125 - Bloctopus Blueprint - A blueprint that contains information on constructing a Bloctoplus. -4001126 - Maple Leaf - It's a beautiful Maple Leaf. -4001127 - Fuse - This is used to make firecrackers. -4001128 - Powder keg - This is used to make firecrackers. -4001129 - Maple Coin - A maple mark is engrained on this shiny coin. Exchangeable for an item via Spiegelmann. -4001130 - Romeo's Letter - A letter that Romeo wrote to Juliet, warning of a suspicious plan that is to occur. -4001131 - Juliet's Letter - A letter that Juliet wrote to Romeo, warning of a suspicious plan that is to occur. -4001132 - Suspicious Liquid - A bottle that contains a green liquid that has been treated with a peculiar chemical. -4001133 - Card Key - The card key that allows you to enter Eurek's special laboratory. -4001134 - Alcadno's Experiment Files - Research information on Alcadno's stolen ingredient. -4001135 - Zenumist's Experiment Files - Research information on Zenumist's stolen ingredient. -4001136 - Piece of Scroll - A piece of a scroll. I should collect the pieces and take it to Cassandra before September 19th, 2008. -4001141 - Snowman Branch - A tree branch used to make a Kid Snowman arm. Represents a pure innocense of the kids that made the Snowman. -4001147 - Call of The Nautilus - Nautilus -4001154 - El Nath Dead Mine - El Nath Dead Mine -4001155 - Dragon Forest - Dragon Forest -4001156 - Pass of Dimension - A pass earned by defeating a monster. This pass is required in order to enter the next stage. -4001157 - Star Stamp - A star stamp earned by protecting the candle given by the Administrator. -4001158 - Feather of Goddess - A feather from Minerva the Goddess. -4001159 - Zenumist Marble - A marble taken care of by Romeo. -4001160 - Alcadno Marble - A marble taken care of by Juliet. -4001161 - Concentrated Poison - This poison is too strong for anyone to handle. -4001162 - Diluted Poison - This poison has been diluted with water. It can now be handled. -4001163 - Purple Stone of Magic - It's a magic stone that's purple.\nIt can probably trigger a reaction from something... -4001164 - Golem's Marble - It's the essence of Poison Golem. It will have to be cleansed in clear spring water. -4001165 - Sunshine - Maple Tree loves this sunshine. Give it an ample amount of sunshine, and the tree will grow. -4001166 - Snow Silk - A ball of silk that's cold like snow, as if it'll melt away. -4001167 - Piece of Birthday Cake - A piece of the MapleStory's 4 Year Anniversary cake. You can complete the cake by opening the cake box and placing 4 cake pieces on the plate. -4001168 - Golden Maple Leaf - A Golden Maple Leaf that fell from a Maple Tree specially for MapleStory's 4 Year Anniversary. Take it to the keeper of the maple tree and receive a special present. -4001169 - Monster Marble - This marble contains a poisoned monster. The monster is being purified within it -4002000 - Snail Stamp - A stamp with a snail drawn in. -4002001 - Blue Snail Stamp - A stamp with a blue snail drawn in. -4002002 - Stump Stamp - A stamp with a stump drawn in. -4002003 - Slime Stamp - A stamp with a slime drawn in. -4003000 - Screw - A small screw made out of steel. Used as a material to make weapons or armors. -4003001 - Processed Wood - A processed wood made out of tree branches. Used as a material to make weapons or armors. -4003002 - Piece of Ice - Water frozen through the power of magic. Doesn't melt easily. -4003003 - Fairy Wing - A piece of wing from a fairy. It's soft and brittle, so it should be handled with care. -4003004 - Stiff Feather - A feather that's stiff and rough. Used to make arrows. -4003005 - Soft Feather - A soft and light feather. Used to make arrows. -4004000 - Power Crystal Ore - An ore of a crystal that possesses power. -4004001 - Wisdom Crystal Ore - An ore of a crystal that possesses wisdom. -4004002 - DEX Crystal Ore - An ore of a crystal that possesses dexterity. -4004003 - LUK Crystal Ore - An ore of a crystal that possesses luck. -4004004 - Dark Crystal Ore - An ore of a crystal that possesses dark power. An incredible power lay asleep in it. -4005000 - Power Crystal - A mysterious crystal with the source of power in it. -4005001 - Wisdom Crystal - A mysterious crystal with the source of wisdom in it. -4005002 - DEX Crystal - A mysterious crystal with the source of dexterity in it. -4005003 - LUK Crystal - A mysterious crystal with the source of luck in it. -4005004 - Dark Crystal - A mysterious crystal with the source of dark power in it. An incredible power lay asleep in it. -4006000 - The Magic Rock - A mythical rock with the power of magic in it. Used with high-leveled skills. -4006001 - The Summoning Rock - A mythical rock with the power of summoning in it. Used with high-leveled skills. -4010000 - Bronze Ore - The ore of a light and weak bronze. -4010001 - Steel Ore - The ore of a tough steel -4010002 - Mithril Ore - The ore of a light, solid Mithril. -4010003 - Adamantium Ore - The ore of a heavy, strong Adamantium -4010004 - Silver Ore - The ore of a shiny silver -4010005 - Orihalcon Ore - An ore of a very rare mineral, Orihalcon. -4010006 - Gold Ore - The ore of gold, a very rare mineral -4010007 - Lidium Ore - Lidium Ore that in formed under the sand. -4011000 - Bronze Plate - A light, weak, refined bronze. -4011001 - Steel Plate - A tough, refined steel. -4011002 - Mithril Plate - A solid, light, refined Mithril. -4011003 - Adamantium Plate - A heavy, strong, refined Adamantium. -4011004 - Silver Plate - A shiny, refined silver. -4011005 - Orihalcon Plate - A refined Orihalcon, a very rare mineral. -4011006 - Gold Plate - A very rare, refined gold. -4011007 - Moon Rock - A glittering mineral that possesses the mysterious power of the moon. -4011008 - Lidium - Hard yet transparent processed Lidium. -4020000 - Garnet Ore - The ore of a red jewel. -4020001 - Amethyst Ore - The ore of a purple jewel. -4020002 - AquaMarine Ore - The ore of a blue jewel. -4020003 - Emerald Ore - The ore of a green jewel. -4020004 - Opal Ore - The ore of a jewel with many colors. -4020005 - Sapphire Ore - The ore of a blue, transparent jewel. -4020006 - Topaz Ore - The ore of a yellow jewel -4020007 - Diamond Ore - The ore of a jewel that's transparent -4020008 - Black Crystal Ore - An ore of a crystal that has dark powers stored in it -4021000 - Garnet - A red jewel. -4021001 - Amethyst - A purple jewel. -4021002 - AquaMarine - A blue jewel. -4021003 - Emerald - A green jewel. -4021004 - Opal - A jewel with many colors. -4021005 - Sapphire - A blue, transparent jewel. -4021006 - Topaz - A yellow jewel. -4021007 - Diamond - A transparent jewel. -4021008 - Black Crystal - A very rare crystal with a dark power that lay asleep in it. -4021009 - Star Rock - A glittering jewel that possesses a mysterious power of a star. -4030000 - Omok Piece : Slime - A slime-shaped Omok piece to play Omok. -4030001 - Omok Piece : Mushroom - A mushroom-shaped Omok piece to play Omok. -4030002 - Tetris Piece - Funny-looking piece. -4030003 - Tetris Piece - Funny-looking piece -4030004 - Tetris Piece - Funny-looking piece -4030005 - Tetris Piece - Funny-looking piece -4030006 - Tetris Piece - Funny-looking piece -4030007 - Tetris Piece - Funny-looking piece -4030008 - Tetris Piece - Funny-looking piece -4030009 - Omok Table - A wooden table that allows you to play Omok. -4030010 - Omok Piece : Octopus - An octopus-shaped Omok piece to play Omok. -4030011 - Omok Piece : Pig - A pig-shaped Omok piece to play Omok. -4030012 - Monster Card - The monster cards needed for the game of Match Cards. Need to have plenty of cards. -4030013 - Omok Piece : Bloctopus - A Bloctopus-shaped Omok piece to play Omok. -4030014 - Omok Piece : Pink Teddy - A Pink Teddy-shaped Omok piece to play Omok. -4030015 - Omok Piece : Panda Teddy - A Panda Teddy-shaped Omok piece to play Omok. -4030016 - Omok Piece : Trixter - A Trixter-shaped Omok piece to play Omok. -4031000 - Maria's Letter - A letter by Maria. Needs to be delivered to Lucas of Amherst. -4031001 - Lucas' Letter - A letter by Lucas. Needs to be sent to Mushroom Town's Maria. -4031002 - Lucas's Gold Watch - Lucas's gold watch made out of pure gold. -4031003 - Sera's Mirror - Sera's mirror. Has lots of decorations on it. -4031004 - Sparkling Rock - A sparking rock that shines by itself. -4031005 - Arcon's Blood - A bottle full of Arcon's blood -4031006 - Weird Medicine - No telling the power of this mysterious, weird medicine -4031007 - Old Gold Watch - An old gold watch. An article left by Alex's late mother. -4031008 - Dances with Balrog's Letter - A letter from 'Dances with Balrog' of Perion. Needs to be shown to the 'Warrior Job Instructor' at somewhere around the highland. -4031009 - Grendel the Really Old's Letter - A letter from Grendel the Really Old of Ellinia. Needs to be shown to the "Test Instructor For Magicians" at somewhere around the forrest. -4031010 - Athena Pierce's Letter - A letter from Athena Pierce of Henesys. Needs to be shown to the "Test Instructor For Bowmen" at somewhere around the Dungeon. -4031011 - Dark Lord's Letter - A letter from "Dark Lord" of Kerning City. Needs to be shown to the "Test Instructor For Thieves" at somewhere around the city. -4031012 - The Proof of a Hero - A proof from the instructor that you have passed the test for the 2nd job advancement. Once possessed, you'll be recognized as a hero. -4031013 - Dark Marble - A mysterious marble that possesses the dark, ugly nature of the monster. -4031014 - Rina's Unagi Special - A special Unagi consisting of the tails of Curse Eye...and pig's head. Needs to be delivered to Ronnie. -4031015 - Fresh Milk - A fresh milk from the fairies. Needs to be delivered to Ronnie. -4031016 - Secret Book - No one knows what's in this book. -4031017 - Magic Box - A box locked away with a powerful magical lock. Apparently there are jewels inside. -4031018 - Treasure Scroll - A map that shows where the jewels are hidden away. -4031019 - Scroll of Secrets - A mystical scroll written in a lost ancient language. -4031020 - Pink Anthurium - A pile of flowers that give off pink, mystical colors.. -4031021 - Orange Anthurium - A pile of flowers that give off orange, mystical colors. -4031022 - Blue Anthurium - A pile of flowers that give off blue, mystical colors. -4031023 - Yellow Anthurium - A pile of flowers that give off yellow, mystical colors. -4031024 - Purple Viola - A purple flower with a huge flower bud. -4031025 - Pink Viola - A pink flower with a huge flower bud. -4031026 - Blue Viola - A blue flower with a huge flower bud. -4031027 - Orange Viola - An orange flower with a huge flower bud. -4031028 - White Viola - A white flower with a huge flower bud. -4031029 - Single-Rooted Ginseng - A single-rooted Ginseng that appears to be aged. -4031030 - Double-Rooted Ginseng - A double-rooted Ginseng that appears to be aged. -4031031 - Triple-Rooted Ginseng - A triple-rooted Ginseng that appears to be aged. -4031032 - Double-Rooted Red Ginseng - A double-rooted Red Ginseng. -4031033 - Triple-Rooted Red Ginseng - A triple-rooted Red Ginseng. -4031034 - Life Scroll - A scroll with unrecognizable ancient characters on it. -4031035 - Bartos' Letter - A letter from Bartos the instructor. Needs to be delivered to Frod. -4031036 - Ticket to Construction Site B1 - The ticket that allows you to enter Construction Site B1 of Kerning City Subway. -4031037 - Ticket to Construction Site B2 - The ticket that allows you to enter Construction Site B2 of Kerning City Subway. -4031038 - Ticket to Construction Site B3 - The ticket that allows you to enter Construction Site B3 of Kerning City Subway. -4031039 - Shumi's Coin - The coin that Shumi lost. -4031040 - Shumi's Roll of Cash - The roll of cash that Shumi lost. -4031041 - Shumi's Sack of Cash - The sack of money that Shumi lost. -4031042 - Black Feather - A feather burning in black. So light, it feels like it's going to fly away. -4031043 - Red Cape - A red cape for women-only. Looks like it's going to be very warm. -4031044 - Ticket to Orbis (Basic) - A basic ticket needed to get on the ship that heads to Orbis Station of Ossyria Continent. -4031045 - Ticket to Orbis (Regular) - A regular ticket needed to get on the ship that heads to Orbis Station of Ossyria Continent. -4031046 - Ticket to Ellinia (Basic) - A basic ticket needed to get on the ship that heads to Ellinia of Victoria Island. -4031047 - Ticket to Ellinia (Regular) - A regular ticket needed to get on the ship that heads to Ellinia of Victoria Island. -4031048 - Blank Scroll - A scroll written in unrecognizable letters. Get this to Chef of Lith Harbor to trade with a prize. -4031049 - A Piece of an Ancient Scroll - An old piece of paper that seems to be part of an ancient document. -4031050 - Cracked Black Crystal - A black crystal that seems like the one Spiruna lost. It's broken, probably by the monsters stepping on it. -4031051 - Fairy Dust - A collection of dust from the fairies flapping their wings. It has a mysterious light to it. -4031052 - Hella's Pendant - A pendant Hella has been keeping since childhood. Needs to deliver this to Jade. -4031053 - Old Ring - An old ring found from a tomb in the deep valley of snowfield. Maybe Alcaster may have seen this before... -4031054 - Old Piece of Map - An old piece of paper that seems to be a part of an ancient map. -4031055 - Memory Powder - A very fine powder that's hard to feel. Has the power to return the memory of a person. -4031056 - The Book of Ancient - A book that contains incredible spells that are banned. A regular person can't even open the book; it's that powerful... -4031057 - The Necklace of Strength - A necklace earned by deservingly defeating the "other self" at the Other Dimension with power. -4031058 - The Necklace of Wisdom - A necklace earned by convincingly answering all the questions at the Holy Land with poise and full of wisdom. -4031059 - Black Charm - A charm earned by defeating the "other self" at the world of new dimension. -4031060 - Nick's Ring - The ring of Nick, the long-lost son of Scadur. -4031061 - Piece of Fire Ore - A piece of an ore that has the power of fire in it. Used as a material to make the sacrifice for the Zakum altar. -4031062 - The Breath of Lava - Contains the scorching heat of the lava needed to refine a sacrifice. -4031063 - Torr's Horn - A little horn that Torr lost. -4031064 - Orange Marble - Orange marble that Boss kitty has stolen from Sakura. -4031065 - Excellent Luck Fortune Cookie Message - Fortune cookie message, which tells you excellent luck -4031066 - Great Luck Fortune Cookie Message - Fortune cookie message, which tells you great luck -4031067 - Good Luck Fortune Message - Fortune cookie message, which tells you good luck -4031068 - Ordinary Luck Fortune Cookie Message - Fortune cookie message, which tells you ordinary luck -4031069 - Bad Luck Fortune Cookie Message - Fortune cookie message, which tells you bad luck -4031070 - Terrible Luck Fortune Cookie Message - Fortune cookie message, which tells you terrible luck -4031071 - Worst Luck Fortune Cookie Message - Fortune cookie message, which tells you worst luck -4031072 - A Key of the Magic Box - An item, which enables you to open the magic box. You should bring this to Geny -4031073 - Ticket to Ludibrium (Basic) - A basic ticket to Ludibrium in Ossyria -4031074 - Ticket to Ludibrium (Regular) - A regular ticket to Ludibrium in Ossyria -4031075 - New Year's Card from Blackbull - A New Year's Card from Blackbull of Perion. This needs to be delivered to Grendel the Really Old of Ellinia. -4031076 - New Year's Card from Grendel the Really Old - A New Year's Card from Grendel the Really Old of Ellinia. This needs to be delivered to Helena of Henesys. -4031077 - New Year's Card from Helena - A New Year's Card from Helena of Henesys. This needs to be delivered to Dark Lord of Kerning City. -4031078 - Manager Karl's Camera - A camera borrowed from Manager Karl. This is used to take pictures of the 10 workers at Eos Tower. -4031079 - Photo of Roly-Poly 1 - A picture of a roly-poly at Eos Tower through Manager Karl's camera. Need to look for 9 more. -4031080 - Photo of Roly-Poly 2 - 2 pictures of roly-poly workers at Eos Tower through Manager Karl's camera. Need to look for 8 more. -4031081 - Photo of Roly-Poly 3 - 3 pictures of roly-poly workers at Eos Tower through Manager Karl's camera. Need to look for 7 more. -4031082 - Photo of Roly-Poly 4 - 4 pictures of roly-poly workers at Eos Tower through Manager Karl's camera. Need to look for 6 more. -4031083 - Photo of Roly-Poly 5 - 5 pictures of roly-poly workers at Eos Tower through Manager Karl's camera. Need to look for 5 more. -4031084 - Photo of Roly-Poly 6 - 6 pictures of roly-poly workers at Eos Tower through Manager Karl's camera. Need to look for 4 more. -4031085 - Photo of Roly-Poly 7 - 7 pictures of roly-poly workers at Eos Tower through Manager Karl's camera. Need to look for 3 more. -4031086 - Photo of Roly-Poly 8 - 8 pictures of roly-poly workers at Eos Tower through Manager Karl's camera. Need to look for 2 more. -4031087 - Photo of Roly-Poly 9 - 9 pictures of roly-poly workers at Eos Tower through Manager Karl's camera. Need to look for 1 more. -4031088 - Photo of Roly-Poly 10 - 10 pictures of roly-poly workers at Eos Tower through Manager Karl's camera. Now I got them all! -4031089 - Screwdriver - A screwdriver that Roly-Poly 6 lost. Used to tighten screws. -4031090 - Piece of Memory - Korin's pieces of lost memory earned through defeating the aliens. -4031091 - Korin's Memory - Korin's pieces of lost memory put together in one. -4031092 - Machine Parts - Parts lost in the toy factory. Have to gather up 10 of them and get them to Cheng the assistant. -4031093 - Tasty Walnut - You can definitely smell this from afar. Very much stuffed inside, which would be perfect for Delv the Toy Soldier. -4031094 - Pendulum - An important part of the clock for the Ludibrium Clocktower. Need to get this to Mark the Toy Soldier. -4031095 - Box of Parts #1 - A box of robotic parts 1 that Dr. Kim of Omega Sector requested. -4031096 - Box of Parts #2 - A box of robotic parts 2 that Dr. Kim of Omega Sector requested. -4031097 - Box of Parts #3 - A box of robotic parts 3 that Dr. Kim of Omega Sector requested. -4031098 - All-purpose Clock Spring - A spring that is needed to make the grandpa clock run. -4031099 - Sealed Letter - Appears to be a very old letter from the outer space. Sealed in an old, raggedy envelope with the candle wax used as a stamp. -4031100 - Blueprint Machine - A machine with the robot's blueprint on it. Can't look at it unless you know how to run it. -4031101 - Laser Gun - A laser gun used by Hoony to defeat the aliens. -4031102 - Note - A note full of descriptions on the history of the Grays and their past actions. -4031103 - Barnard Gray's Cell - The DNA of an alien. It may contain lots of informatin regarding them. -4031104 - Zeta Gray's Cell - The DNA of an alien. It may contain lots of informatin regarding them. -4031105 - Ultra Gray's Cell - The DNA of an alien. It may contain lots of informatin regarding them. -4031106 - Chief Gray's Cell - The DNA of an alien. It may contain lots of informatin regarding them. -4031107 - Dogon's Report - A report that contains valuable information regarding the hidden headquarters of an alien follower. -4031108 - Super Alarm Clock - An alarm clock with many functions that'll surely wake up the Pink Mesoranger. -4031109 - White Chocolate - An ingredient used to make a chocolate. Melt it, mix it with water, then mold it accordingly to make a delicious-looking chocolate. -4031110 - Dark Chocolate - An ingredient used to make a chocolate. Melt it, mix it with water, then mold it accordingly to make a delicious-looking chocolate. -4031111 - Heart Box - A heart-shaped box with no decoration whatsoever. Used to carry the chocolate. -4031112 - Gold Ribbon - Used to decorate the chocolate. -4031113 - Basket - A basket with a handle. Decorate it with ribbons and chocolate, and this may come out as something nice. -4031114 - Cover Material - All the materials used to decorate the chocolate basket are in here. It looks like ribbons, marbles, and fabrics in it. -4031115 - Special Battery - A special battery used to move Master Robo. -4031116 - Secret Document - A secret document that contains classified information on the Omega Sector. A security device is attached to it. -4031117 - Meteorite Sample - A sample of the meteorite that was recently discovered at the Coolan Field. -4031118 - Deciphered Memory Card - Rombot 's memory card that Porter deciphered. -4031119 - Black Toy Heena - A black Toy Heena; no way to find out how it originally looked like. -4031120 - Toy Heena - A toy that resembles someone. -4031121 - Clam Shell - A light clam shell. -4031122 - Sugar - Used to make candies. Melt it to turn it into syrup, then sprinkle them onto the fruits to make tasty fruit candies. -4031123 - Pineapple - Cut in triangles. Used to make tasty fruit candies. -4031124 - Strawberry - A very ripe, red strawberry. Used to make tasty fruit candies. -4031125 - Wooden Skewer - A long wooden skewer for the fruits. -4031126 - Porter's Letter - A letter from Porter of the Omega Sector. I need to deliver this to Kay the Engineer, who should be at the Omega Sector Silo, on time. -4031127 - Pilot's Letter - A letter recovered from a broken transport in what appears to be written by a missing pilot. Need to get this to Kay the Engineer, who should be at the Omega Sector Silo. -4031128 - Weaver's Letter - A letter from Weaver the assistant. Need to get this to Nerr. -4031129 - Savory Cheese - As soft as it gets. I can make a soup out of this. -4031130 - Maintenance Manual - A maintenance manual with the blueprint of the machine at the Toy Factory. Mac the Mechanic had originally lost it. -4031131 - Blue Carp - A blue koynobori used on children's day. -4031132 - Red Carp - A red koynobori used on children's day. -4031133 - Green Baby Carp - A green koynobori used on children's day. -4031134 - VIP Ticket to Florina Beach - It is needed to go to Florina Beach. If in possession of the ticket, you can simply head to Florina Beach for free FOR LIFE. -4031135 - Dull Crystal - A crystal without the sparkling light, because its powers have been used up while inside the body of the Drum Bunny. -4031136 - Gray's Document - A document of a Gray in what appears to be an alien writing. Hard to decipher. -4031137 - Box of Presents - A box of presents for the kids on children's day. -4031138 - Money Sack - A money sack for the kids on children's day. -4031139 - Mariwakawa's Bag - A bag of Mariwakawa -4031140 - Dull Crystal - A crystal without the sparkling light, because its powers have been used up while inside the body of the Drum Bunny. -4031141 - Parts #1 - A box full of robotic parts no. 1 that Dr. Kim of Omega Sector lost. -4031142 - Parts #2 - A box full of robotic parts no. 2 that Dr. Kim of Omega Sector lost. -4031143 - Parts #3 - A box full of robotic parts no. 3 that Dr. Kim of Omega Sector lost. -4031144 - Hero's Gladius - A fully reawaken Gladius that a hero has used. -4031145 - Pendulum - An important part of the clock for the Ludibrium Clocktower. Need to get this to Mark the Toy Soldier. -4031146 - Animal Fossil - A fossil of an animal from thousands of years ago. -4031147 - Plant Fossil - A fossil of a leaf of a plant from thousands and thousands of years ago. -4031148 - Winston's Recommendation - A letter of recommendation from Winston the Archeologist. Need to deliver this to Dr. Betty of Ellinia. -4031149 - Fossil Box - A wooden box that contains fossils. On the cover reads 'WARNING: Handle with CARE.' -4031150 - Plant Sample - A plant that's been dug out and kept with everything in tact, -4031151 - Stuffed Drake Skull - Drake Skull kept in its original state through chemicals. -4031152 - Fossil Report - Dr. Betty's final report on the studies of fossils. -4031153 - Stump's Teardrop - Very rarely found on Dark Axe Stump's. A hardened liquid from Stump. -4031154 - Estelle's Special Sauce - A special sauce from Estelle of Ellinia. Its ingredients and formulas are all kept secret. -4031155 - Broken Mirror Glass - A piece of a shattered mirror. -4031156 - Sparkling Glass Marble - A huge glass marble that is transparent and radiates in multiple colors. At the corner of it says "To My Friend Utah." -4031157 - Maple History Book I - An important history book that contains everything about the history of MapleStory. -4031158 - Maple History Book II - Part II of the Maple History Books trilogy contains mostly of the growth of Maple. This book is also an important reference for the future of MapleStory. -4031159 - Maple History Book III - Part III of the Maple History Books trilogy contains the history behind the emergence of evil monsters in the MapleStory. -4031160 - Medal of Honor - Got all 3 Maple History Books and gave it to Tigun. According to him, this is a medal personally awarded by the King of Ludibrium. -4031161 - Rusty Screw - A rusty screw from an old, unusable box that has been broken down. Can this be recycled? -4031162 - Old Wooden Board - An old wooden board from an old, unusable box that has been broken down. Can this be recycled? -4031163 - Flying Medicine - A fairy medicine made with a collection of rare, hard-to-find ingredients. There's a legend that anyone that takes pill can fly, but it's only been passed around from generations to generations. -4031164 - Alligator Skin Pouch - A pouch made out of alligator skin. Looks sturdy enough to hold on to most anything. -4031165 - Witchgrass Leaf - Leaves of the Witchgrass growing in the swamps. Laiden with incredible magical powers, it is used as a primary source for herbal medicine. -4031166 - Olaf's Recommendation - A letter of recommendation written by Olaf the job agent. -4031167 - Blue Present Box for Training - A blue present box that the GM hung on the monster for the event "Face the Hotness." -4031168 - Yellow Present Box for Training - A yellow present box that the GM hung on the monster for the event "Face the Hotness." -4031169 - Green Present Box for Training - A green present box that the GM hung on the monster for the event "Face the Hotness." -4031170 - Tachion - A particle that is the source of power for the time sphere; it is used to trigger the force in relations to time. -4031171 - Mysterious Powder - A mysterious powder that glows in gold. -4031172 - Ludibrium Medal - A medal earned from the gatekeepeer, and is apparently needed to enter a certain door. The word Ludibrium is engraved at the center of this gold medal. -4031173 - Ayan's Letter - A letter from Ayan. Must be delievered to Bruce of Henesys. -4031174 - Ayan's Toy Sword - A toy sword that Ayan played with growing up. -4031175 - Tachion - A particle that is the source of power for the time sphere; a new bundle of energy can be formed through this. -4031176 - Piece of Cracked Dimension A - This must be what Flo mentioned as "a piece of cracked dimension." -4031177 - Piece of Cracked Dimension B - This must be what Flo mentioned as "a piece of cracked dimension." -4031178 - Piece of Cracked Dimension C - This must be what Flo mentioned as "a piece of cracked dimension." -4031179 - Piece of Cracked Dimension - A piece of the cracked dimension that Papulatus used to enter this world. Use this piece to seal up the cracks of dimension. -4031180 - Beginner's Shopping Guide - A Shopping guide for beginners that Yoona asked to bring for the quiz. -4031181 - Rice Powder - A sack of well-grinded rice powder. Add this with honey and leaf for something delicious! -4031182 - Honey - A beehive full of sweet honey. -4031183 - Leaf - A strong-scented leaf. Put this in when making the Song Pyun for optimal results -4031184 - Glutinous Rice Powder - A sack of well-grinded Glutinous Rice Powder. Add this with honey and oil for nice Yugwa. -4031185 - Pot of Honey - A pot full of sweet honey -4031186 - Bottle of Oil - A bottle full of sesami oil. -4031187 - Gold Song Pyun - How about a nice Gold Song Pyun for the elderly, like Chief Stan of Victoria? -4031188 - Han Gwa Set - How about a nice Han Gwa Set for the elderly, like Manager Karl of Ludibrium? -4031189 - Aurora Marble - It's an aurora marble from Buffy. Unlike other marbles, this one seems to emit a special force. -4031190 - Horn Flute - A horn flute that emits a soothing sound that spreads all over the area. It is decorated with a feather and has a leather handle on it. -4031191 - Golden Bell - A small gold bell that is needed to make a new necklace for Nero.\n#cUsed as a : Quest Item# -4031192 - Red Ribbon - A red ribbon needed to make a new necklace for Nero.\n#cUsed as a : Quest Item# -4031193 - Soul Collector - Ghosthunter Bob uses this to collect souls. There must be something incredible inside, since it has DANGER written on it. -4031194 - Nella's Korean Costume - A Korean costume Nella will wear for Korean Thanksgiving. -4031195 - Aurora Marble - An aurora marble that was held by Buffy. Probably the one that Mason mentioned before. -4031196 - Dark Tachion - Tachion, the source of power for the time sphere, is emitting a force of evil. Destroy this by throwing it in the lava at the deepest part of El Nath. -4031197 - Tears of Kelvelos - A bottle that contains the tears of a legendary monster, Kelvelos -4031198 - Empty Potion Bottle - An empty bottle that used to contain spell ingredients. -4031199 - Lunar Wristband - A wristband made of Lunar Pixie Moonpiece and Star Pixie Starpiece. -4031200 - Sap of Nependeath - A squeezed-out sap of Nependeath and Dark Nependeath seeds. -4031201 - Sweet Syrup - A sugar-sweet syrup made by Estelle of Ellinia. -4031202 - Nependeath Juice - A nutritious, tasty juice made by Elma the Housekeeper. -4031203 - Halloween Candies - Halloween candies acquired from the monsters. -4031204 - Lisa's Recommendation - A recommendation letter by Lisa. Needs to be delivered to Scadur of El Nath for approval. -4031205 - Lisa's Special Medicine - A special medicine made by Lisa. Very sweet-scented, it drives up the appetite of everyone near it. -4031206 - Ripped Travel Ticket 1 - An unknown travel ticket ripped in half. -4031207 - Ripped Travel Ticket 2 - The other half of a ripped traveling ticket. -4031208 - Empty Bottle - An empty bottle. -4031209 - SOS Letter - A letter requesting rescue inside a glass bottle. Since the bottle contains dry sand, it looks like someone is lost in the middle of an island where there is full of sand. -4031210 - Robinson's ID - The pilot Robinson's ID.\n\n#cName : Robinson\nTeam : Transport - Pilot\nID number : XXX-XXXXX# -4031211 - Lama's Sign - A piece of paper that has Lama's Sign on. -4031212 - Cold Steam - A cold steam from the mouth of Cold Eye. -4031213 - Wild Kargo's Spirit Rock - A purple rock which contains a sealed-up soul of Wild Kargo. -4031214 - Tauromacis's Spirit Rock - A green rock which contains a sealed-up soul of Tauromacis. -4031215 - Taurospear's Spirit Rock - A blue rock which contains a sealed-up soul of Taurospear. -4031216 - Jr. Balrog's Spirit Rock - A dark rock which contains a sealed-up soul of Jr. Balrog. -4031217 - Golden Key - A golden key, which emits a mysterious white light. -4031218 - The Contract of Darkness - The source of power for all zombies. A contract written on a raggedy old paper, it details the contract with the dark force as well as the dates. -4031219 - Scadur's Bow - Icadur made this bow for his brother Scadur. Light, solid, and very powerful. -4031220 - Mythical Flour - A mythical flour that Ace of Hearts uses to make cookies. -4031221 - Omega Sector Warp Capsule - A warp capsule only available for the members of the Omega Sector. Unlike other warp capsules, this one allows one to teleport directly to the Omega Sector, regardless of which island or continent the person is on. -4031222 - Steel Hoe - A rock-solid hoe that is used for farming. Since the blade is made out of steel, it should last a while. -4031223 - Box of Jewelry - A box full of expensive jewelry and other treasures that emerged from Hongbu's gourd. -4031224 - Warrant of Attachment - A warrant of attachment that emerged from Nolbu's gourd; \nAll of Nolbu's possessions will be seized and auctioned off by OO/OO/OO. -4031225 - Magic Seed - A small, white seed that Swallow brought from across the river. Plant it somewhere safe, and it'll grow. -4031226 - Gwin's Bag - A heavy bag that is full of mysterious items. Looking into the corner of the back of the bag, the name GWIN is written on it. -4031227 - Centipede Red Marble - A red marble previously possessed by the Centipede. A weird vibe can be felt on it. -4031229 - Sack of Rice - A sack full of rice. -4031230 - New Pot - A glossy new pot. -4031231 - Artemisia - This plant can be seen everywhere around spring time. -4031232 - Goblin Cap - A black cap worn by the Goblin when pulling pranks on someone. Legend has it that when this cap is worn, the person will become invisible. -4031233 - Goblin Bat - A wooden bat with lots of horns attached to its surface. Goblins carry these around all the time. Legend has it that this bat will make all the wishes come true. -4031234 - Goblin Cape - A cape made out of tiger skin. Very furry and warm, legend has it that anyone that dons this cape will become courageous. -4031235 - Storybook on Hongbu and Nolbu - The storybook that features a Korean Folk Tale on Hongbu and Nolbu. -4031236 - Storybook on Kong Ji and Pat Ji - The storybook that features a Korean Folk Tale on Kong Ji and Pat Ji. -4031237 - Storybook on Brotherly Love - The storybook that features the Korean Folk Tale 'Brothery Love'. -4031238 - Storybook on the Goblin Story - The storybook that features the Korean Folk Tale 'The Goblin Story'. -4031239 - The Letter to Camila - A letter to Camila from a pen pal far far away. -4031240 - Camila's Reply - A letter Camila wrote for her pen pal far far away, Kong Jwi. -4031241 - Swallow's Lost Seed - A seed that Swallow, who is very prone to losing things, lost in the middle of the mountain. -4031242 - Dolphin Taxi Coupon - This coupon allows the owner to use the Dolphin Taxi available in Aquarium. Ride the taxi all the way to the Sharp Unknown. -4031243 - Ripped Travel Ticket 1 - An unknown travel ticket ripped in half. -4031244 - Hongbu's Seed - A seed given by Hongbu to be planted on top of the roof of his house. I better drop it on the roof. -4031245 - Nolbu's Seed - A seed given by Nolbu to be planted on top of the roof of his house. I better drop it on the roof. -4031246 - Sack of Rice - A sack full of rice, ready to be cooked. -4031247 - Sack of Rice - A sack full of rice, ready to be cooked. -4031248 - Sack of Rice - A sack full of rice, ready to be cooked. -4031249 - Red Envelope - An open envelope colored in warm red. -4031251 - Sea Dust - A small dust that floats around the sea. -4031252 - Wripped Note - An old, ragged notebook that's been wripped here and there. Something must have been written on it, but there's no way to find out what's in it. -4031253 - Pianus's Scream - A metal can that contains the scream of a huge creature inside the cave in the ocean. -4031254 - Broken Flashlight - Someone must have used this flashlight, and busted the light bulb. -4031255 - Broken Camera - A totally busted camera. The lens is cracked, and the film is nowhere to be found. -4031256 - Cold Tear - Bone Fish's tear, which is made out of ice. -4031257 - Empty Bottle of Perfume - An empty bottle of perfume. -4031258 - Chrysanthemum - A beautiful yellow flower that can be found near Korean Folk Town. -4031259 - Seacle's DNA Sample - A slide that contains the DNA sample of Seacle. -4031260 - Cico's DNA Sample - A slide that contains the DNA sample of Cico. -4031261 - Pin Boom's DNA Sample - A slide that contains the DNA sample of Pin Boom. -4031262 - Flower Fish's DNA Sample - A slide that contains the DNA sample of Flower Fish. -4031263 - Masked Fish's DNA Sample - A slide that contains the DNA sample of Masked Fish. -4031264 - Bubble Fish's DNA Sample - A slide that contains the DNA sample of Bubble Fish. -4031265 - Pooper's DNA Sample - A slide that contains the DNA sample of Pooper. -4031266 - Sparker's DNA Sample - A slide that contains the DNA sample of Sparker. -4031267 - Freezer's DNA Sample - A slide that contains the DNA sample of Freezer. -4031268 - Tough Rope - A tightly wound rope. -4031269 - Slippery Oil - A container full of slippery oil. -4031270 - Storybook on The Kids That Became the Sun and the Moon - The storybook that features the Korean Folk Tale 'The Kids that Became the Sun and the Moon'. -4031271 - Empty Bottle of Perfume - An empty bottle of perfume. -4031272 - Empty Bottle of Perfume - An empty bottle of perfume. -4031273 - Red Ball of Yarn - A red ball of yarn that Fanzy the mysterious cat lost. -4031274 - Piece of Paper A - A piece of paper hidden by Kenta the Animal Trainer of the Aquarium Zoo. -4031275 - Piece of Paper B - A piece of paper hidden by Kenta the Animal Trainer of the Aquarium Zoo. -4031276 - Piece of Paper C - A piece of paper hidden by Kenta the Animal Trainer of the Aquarium Zoo. -4031277 - Piece of Paper D - A piece of paper hidden by Kenta the Animal Trainer of the Aquarium Zoo. -4031278 - Piece of Paper E - A piece of paper hidden by Kenta the Animal Trainer of the Aquarium Zoo. -4031279 - State-held Rice - A sack full of state-held rice. These sacks feature stamps of approval from the government. -4031280 - Storybook on Shim Chung - The storybook that features the Korean Folk Tale on Shim Chung. -4031281 - Muse's Dish - A tasty dish of Shark's Fin and Squid Ink Pasta tightly packaged to make it easier to carry. -4031282 - Evil Energy - An energy that control those who are weak. -4031283 - Easter Basket - A well-decorated basket full of Easter eggs. Disappears after the event is over. -4031284 - Golden Egg - A freshly boiled egg colored with real gold. -4031285 - Treasure Chest - A treasure chest that Vikin gave me to deliver to Erikson. -4031286 - Treasure Chest - A treasure chest that Vikin gave me to deliver to Ian. -4031288 - Recommendation Letter - A recommendation letter written by Mr. Yang -4031289 - Shanghai Permit - A permit issued to individuals that are capable of protecting Shanghai. -4031290 - Tripod - An important item to prevent cameras from shaking while taking pictures. -4031291 - The Perfect Box - The perfect box made by a legendary figure. There's nothing with this box, at all. -4031292 - Hero's Drum - A drum that only the legendary heroes are permitted to play with. -4031293 - Tears of Eternity - A legendary tale in which a fairy, feeling despondent over not seeing, shed a tear or two. -4031294 - Dog Food - (no description) -4031295 - Yan Zi's Letter - A letter written by the superstar Yan Zi for her dear friend. -4031296 - New Cellphone - A brand-new cellphone that boasts lots of new features. A must-have for everyone. It is written as Made In Korea on the back. -4031297 - Party Invitation - A formal invitation to the Big Gala for the 3rd Anniversary of MapleStory. -4031298 - Storybook on the Story of Axes - The storybook that features the Korean Folk Tale 'The Story of Axes'. -4031299 - Stamp for "Excellent" - Stamp for "Excellent" -4031300 - Maple Stamp - Maple Stamp -4031301 - Invitation to Aquarium - An invitation to Aquarium that Icarus lost. -4031302 - Sea Trash - A filthy, dirty can of trash that pollutes the sea. -4031303 - Storage Key - An elegantly designed key with a large jewel in the center. -4031304 - Invitation to Aquarium - An invitation to Aquarium that Ronnie lost. -4031305 - Birthday Candle - A candle for birthday cakes. Used for MapleStory Anniversary Event. -4031306 - Birthday Present (Red) - A box that may contain a birthday present. No one knows what's inside the box... Used for MapleStory Anniversary Event. -4031307 - Birthday Present (Blue) - A box that may contain a birthday present. No one knows what's inside the box... Used for MapleStory Anniversary Event. -4031308 - Cloud Sprayer - A sprayer normally used to water the flowers, but instead sprays clouds. -4031309 - Cloud Piece - A piece of the cloud torn apart from a corner of the Orbis Cloud. -4031310 - Aquaroad Photo Album - A photo album full of gorgeous pictures that capture the true beauty of ocean. -4031311 - Snow Crystal - A snow crystal that's ready to melt any minute. -4031312 - Snow Crystal Sphere - A beautiful snow crystal that's wrapped around in transparent, protective sphere. -4031315 - Tree Cutter's Steel Axe - A lost axe from the tree cutter. This item should be returned to its rightful owner. -4031316 - Chil Sung's Steel Axe - A lost axe from Chil Sung of Korean Folk Town. -4031317 - Tree's Steel Axe - A lost axe from a fella named 'Tree'. -4031318 - Chil Nam's Steel Axe - A lost axe from Chil Nam of Korean Folk Town. -4031319 - Steel Axe for Tree Cutters - A steel axe only used by tree cutters. -4031320 - Broken Steel Axe - An old, rusty broken axe. -4031321 - Sea Trash - A filthy, dirty can of trash that pollutes the sea. -4031322 - Coca Fruit - Coca fruit that is used to make the secret ingredient for Coca-Cola. -4031323 - CO2 - CO2 that is used to make the secret ingredient for Coca-Cola. -4031324 - Caramel - Caramel that is used to make the secret ingredient for Coca-Cola. -4031325 - Secret Coca-Cola Liquid - Secret ingredient that is used to make Coca-Cola. I should take it to the North Polar bear, Poach, since he likes Coca-Cola. -4031330 - Ticket to Leafre (Basic) - A basic ticket to Leafre... This ticket is needed to get on the ride to Leafre. -4031331 - Ticket to Leafre (Reg) - A regular ticket to Leafre... This ticket is needed to get on the ride to Leafre. -4031332 - Certificate of 1-straight Win - A document certifying 1 straight win in Rock, Paper, Scissors. Take the ticket to the NPC's Paul, Jean, Martin, or Tony to exchange to another item. -4031333 - Certificate of 2-straight Wins - A document certifying 2 straight wins in Rock, Paper, Scissors. Take the ticket to the NPC's Paul, Jean, Martin, or Tony to exchange to another item. -4031334 - Certificate of 3-straight Wins - A document certifying 3 straight wins in Rock, Paper, Scissors. Take the ticket to the NPC's Paul, Jean, Martin, or Tony to exchange to another item. -4031335 - Certificate of 4-straight Wins - A document certifying 4 straight wins in Rock, Paper, Scissors. Take the ticket to the NPC's Paul, Jean, Martin, or Tony to exchange to another item. -4031336 - Certificate of 5-straight Wins - A document certifying 5 straight wins in Rock, Paper, Scissors. Take the ticket to the NPC's Paul, Jean, Martin, or Tony to exchange to another item. -4031337 - Certificate of 6-straight Wins - A document certifying 6 straight wins in Rock, Paper, Scissors. Take the ticket to the NPC's Paul, Jean, Martin, or Tony to exchange to another item. -4031338 - Certificate of 7-straight Wins - A document certifying 7 straight wins in Rock, Paper, Scissors. Take the ticket to the NPC's Paul, Jean, Martin, or Tony to exchange to another item. -4031339 - Certificate of 8-straight Wins - A document certifying 8 straight wins in Rock, Paper, Scissors. Take the ticket to the NPC's Paul, Jean, Martin, or Tony to exchange to another item. -4031340 - Certificate of 9-straight Wins - A document certifying 9 straight wins in Rock, Paper, Scissors. Take the ticket to the NPC's Paul, Jean, Martin, or Tony to exchange to another item. -4031341 - Certificate of 10-straight Wins - A document certifying 10 straight wins in Rock, Paper, Scissors. Take the ticket to the NPC's Paul, Jean, Martin, or Tony to exchange to another item. -4031342 - Certificate of Switch - A letter or recommendation that the Chieves in El Nath write to the priest living in Minar Forest. -4031343 - The Heroic Pentagon - A five-sided pendant that signfies the heroic nature of the owner. -4031344 - The Heroic Star - A star-shaped pendant to represent heroicism and other good qualities in life. -4031345 - Pure Water of Protection - An item Tatamo requested for Grendel the Really Old. Drop the water on top of an item to kick in the protective spell. -4031346 - Magic Seed - A vegetable seed with the magical power hidden inside. It has an ability to connect from one space to another. -4031347 - Toy Castle Present - A toy castle full of presents as a gesture of goodwill from Ludibrium to Leafre. -4031348 - Secret Spell Scroll - A scroll that contains an unknown secret. In the hands of someone who knows how to use the scroll, it can unlock enormous power. -4031352 - Pink Yeti Doll - A PINK Yeti doll, unlike other Yeti dolls. -4031353 - Music Box - A secret present for Jay Chou's secret lover. -4031354 - Necklace - Women love wearing this as an accessory. -4031355 - Porridge - A hot bowl of porridige, mixed with chicken. -4031356 - Christine's Introduction letter - A letter written by Christine. I better get this to the Grandpa at the fruit market. -4031357 - Moonstone Engagement Ring Box (Empty) - Empty engagement ring box. Has no ring, required for marriage. -4031358 - Moonstone Engagement Ring - Engagement Ring made of Moon Rock. This is the actual ring design. There is a diamond in the center. Required for marriage. -4031359 - Star gem Engagement Ring Box (Empty) - Empty engagement ring box. Has no ring, required for marriage. -4031360 - Star gem Engagement Ring - Engagement Ring made of Star Rock. This is the actual ring design. There is a diamond in the center. Required for marriage. -4031361 - Golden Heart Engagement Ring Box (Empty) - Empty engagement ring box. Has no ring, required for marriage. -4031362 - Golden Heart Engagement Ring - Engagement Ring made of gold. This is the actual ring design. There is a diamond in the center. Required for marriage. -4031363 - Silver Swan Engagement Ring Box (Empty) - Empty engagement ring box. Has no ring, required for marriage. -4031364 - Silver Swan Engagement Ring - Engagement Ring made of silver. This is the actual ring design. There is a diamond in the center. Required for marriage. -4031367 - Proof of Love - Proof of Love that Nana makes for the couples. There is a cupid bow attached to a heart -4031368 - Proof of Love - Proof of Love that Nana makes for the couples. There is a cupid bow attached to a heart -4031369 - Proof of Love - Proof of Love that Nana makes for the couples. There is a cupid bow attached to a heart -4031370 - Proof of Love - Proof of Love that Nana makes for the couples. There is a cupid bow attached to a heart -4031371 - Proof of Love - Proof of Love that Nana makes for the couples. There is a cupid bow attached to a heart -4031372 - Proof of Love - Proof of Love that Nana makes for the couples. There is a cupid bow attached to a heart -4031373 - Parent's Blessing - A sign that symbolizes the blessings received from Mom and Dad. You need this to ask high priest for preside at the wedding. -4031374 - Officiator's Permission - Proof that couple got permission from High Priest John to officiate at their wedding. Etc -4031375 - Premium Cathedral Reservation Receipt - Receipt that proves that a couple made reservations at the Cathedral. Required for Cathedral Wedding -4031376 - Premium Chapel Reservation Receipt - Receipt that proves that couples made reservations at the Vegas Chapel. Required for Chapel Wedding -4031377 - Invitation - Chapel - A Wedding Invitation. Only the people you invite will be able to come into your Wedding ceremony. To invite someone, simply #cDouble-Click# the invitation and put the character name you want to invite. Please check your spelling for the character name before sending. -4031382 - Party Dress - A beautiful dress made by the wife of Puyai Lee's. -4031383 - Defense Squad Enrollment Permission - A document that acknowledges one as a Floating Market Defense Squad member -4031384 - Defense Squad Enrollment Permission - A document that acknowledges one as a Floating Market Defense Squad member -4031385 - Defense Squad Enrollment Permission - A document that acknowledges one as a Floating Market Defense Squad member -4031386 - Defense Squad Enrollment Permission - A document that acknowledges one as a Floating Market Defense Squad member -4031387 - Defense Squad Enrollment Permission - A document that acknowledges one as a Floating Market Defense Squad member -4031388 - Kid's Key - A key used by Kid. -4031391 - Fake Blueprint - A fake blueprint that poorly copied that of a legendary invention. -4031392 - Face Lotion - Lisa's face lotion, the most expensive one of its kind. -4031395 - Invitation - Cathedral - A Wedding Invitation. Only the people you invite will be able to come into your Wedding ceremony. To invite someone, simply #cDouble-Click# the invitation and put the character name you want to invite. Please check your spelling for the character name before sending. -4031400 - Papaya - A tropical fruit with a pleasant smell that has lots of seeds in it. -4031401 - Rose Apple - A red tropical fruit that is both sweet and sour at the same time. Can also be used as an ingredient for jello and cocktail. -4031405 - Glass Shoes - A beautiful, sparkling glass shoes apparently made by the fairies. -4031406 - Invitation - Chapel - A Wedding Invitation. Only the people invited can enter the Special Wedding. For detailed information, please Double-Click this invitation. Also, if the Wedding for this invitation is started, #cDouble-Click# the item as well to instantly enter the Wedding. -4031407 - Invitation - Cathedral - A Wedding Invitation. Only the people invited can enter the Special Wedding. For detailed information, please Double-Click this invitation. Also, if the Wedding for this invitation is started, #cDouble-Click# the item as well to instantly enter the Wedding. -4031409 - Amoria Heart Key - This key is used to unlock the treasure chest in the Amoria hunting ground. -4031410 - Grendel the Really Old's Message - A letter written by Grendel the Really Old that answers Tatamo's questions. -4031411 - Tatamo's Letter - A letter written by Tatamo to Grendel the Really Old regardint a strange set of events that have taken place at Minar Forest. -4031412 - Black Soul of Dark Rash - A black, tainted soul that seemed to hover around Dark Rash. -4031413 - Black Soul of Dual Birk - A black, tainted soul that seemed to hover around Dual Birk. -4031414 - Black Soul of Dark Cornian - A black, tainted soul that seemed to hover around Dark Comian. -4031415 - Black Soul of Dark Wyvern - A black, tainted soul that seemed to hover around Dark Wyvern. -4031416 - Yellow Turkey Egg - An oversized Yellow Turkey Egg. You can turn this in to Cody. -4031417 - Green Turkey Egg - An oversized Green Turkey Egg. You can turn this in to Cody. -4031418 - Pie Crust - An ingredient needed for Grandma Benson's pumpkin pie. -4031419 - Pumpkin - An ingredient needed for Grandma Benson's pumpkin pie. -4031420 - Flour - An ingredient needed for Grandma Benson's pumpkin pie. -4031421 - Powder Sugar - An ingredient needed for Grandma Benson's pumpkin pie. -4031423 - Onyx Chest - This mysterious chest of Amorian legend appears at all Wedding Parties, and gives a very lucky guest a fantastic prize. -4031424 - Onyx Chest for Bride and Groom - This mysterious chest of Amorian legend appears at all Wedding Parties, and gives a very lucky guest a fantastic prize. -4031425 - Miniature Turkey Pet - An adorable-looking miniature turkey pet that will transform into a fully-grown Turkey Pet after the conclusion of the Thanksgiving Event. -4031426 - Anne's Letter - A letter written by Anne to Cliff. The letter contains requests for a nice present. -4031427 - Cliff's Gift Box - A heavily-gift box sent by Cliff. No one knows what's inside the box. -4031428 - Delicious Snowball - A sparkly ball of snow that sparkles so much that one can mistake it for a ball of sugar. -4031429 - Straw - A handful of straw that filled up the straw hats. -4031430 - The Legendary Being's Scroll - A scroll that describes the courses of the studies of becoming The Legendary Being. On the cover of the scroll has number 1 written in Chinese. -4031431 - The Legendary Being's Scroll - A scroll that describes the courses of the studies of becoming The Legendary Being. On the cover of the scroll has number 1 written in Chinese. -4031432 - The Legendary Being's Scroll - A scroll that describes the courses of the studies of becoming The Legendary Being. On the cover of the scroll has number 1 written in Chinese. -4031433 - Kitty Spirit - A marble that resembles that of a cat's eye. -4031435 - Captain Hat - A captain hat that is always worn by the captain of the pirates. -4031436 - Hook - A hook-shaped metal hand. -4031437 - Lord Pirate's Key to Chest - The key that opens Lord Pirate's treasure chest. A red accessory is donned at the end of the key. -4031438 - Lord Pirate's Travel Diary - A travel diary recorded by Lord Pirate during his heydays as a forceful pirate. Stories abound regarding places people are unaware of, as well as trasures. -4031439 - Blue/White Present - A present box that fell out of Maple Claws' sled. Can be given to Maple Claws, O-Pongo or Mr. Grubber. -4031440 - Red/White Present - A present box that fell out of Maple Claws' sled. Can be given to Maple Claws, O-Pongo or Mr. Grubber. -4031441 - Red/Blue Present - A present box that fell out of Maple Claws' sled. Can be given to Maple Claws, O-Pongo or Mr. Grubber. -4031442 - White/Green Present - A present box that fell out of Maple Claws' sled. Can be given to Maple Claws, O-Pongo or Mr. Grubber. -4031443 - Red/Green Present - A present box that fell out of Maple Claws' sled. Can be given to Maple Claws, O-Pongo or Mr. Grubber. -4031444 - Sabbath Candle - A candle needed to begin the Festival of Lights. -4031445 - Altar Piece - A piece needed to build the Altar at the Festival of Lights. -4031446 - Graham Cracker - A large, sweet graham cracker used to build houses. -4031447 - Bob's Snail Shell - Threatened for his life, Bob went back into his shell. You can carry him. He's not too heavy. -4031448 - Deathly Fear - A deathly fear taken from the deathly darkness. -4031449 - Dragon Heart - A bright, shiny rock that can be found inside the Dragon. Inside the rock features the unbelievable power of the dragon, condensed. Looks vaguely like a red jewelry. -4031450 - Orihalcon Hammer - A rock-hard hammer made out of Orihalcon, which means it'll never break. -4031451 - Summoning Frame - A frame that sets the basic boundaries of the summoning. -4031452 - Shawn's Request - There's no way to tell what it is, but there's an item inside this small wooden box. Need to take this to Shawn. -4031453 - Magical Array of the Spirit - A magical array that obtained the ability to heal by eliminating the sealed force of the black soul. -4031454 - Holy Cup - A gold cup with decorations all over it. -4031455 - Holy Water of Life - A holy water endlessly streaming from the Cave of Life. -4031456 - Maple Marble - A transparent glass marble that contains a maple leaf. -4031457 - Griffey Wind - A soft breeze created by Griffey's wings. -4031458 - Thanatos's Black Tornado - A black tornado made by Thanatos's powerful spells. -4031459 - Boogie's Cursed Whirlwind - A whirlwind made out of Boogie's cursed powers. -4031460 - Cold Heart of a Wolf - A cold, non-beating heart of Lycanthrope. -4031461 - Life Roots - A root of a plant that grows in the Cave of Life. -4031462 - Ventilating Fan - Engineer Kay of the Omega Secto created this device for some ventilation. -4031463 - Mithril Wristband - A blue wristband made out of Mithril. -4031464 - Ragged Wristband - A wristband so ragged that it cannot be worn anymore. -4031465 - Helena's Old Gloves - An old glove she bought years ago for Legor. It may be dirty with accumulated usage, but it also shows how hard the owner of the glove worked with them on. -4031466 - Dark Soul Rock - A soul rock that contains the force of darkness. -4031467 - Sayram's Necklace - A necklace Sayram made for his trustworthy horse Griffey. There used to be a drawing of where they first met on the necklace, but it's erased now. -4031468 - Soul Pouch - A small pouch that contains both free spirits as well as the evil ones. -4031469 - Fire Soul Rock - A soul rock that contains the force of fire. -4031470 - Icy Soul Rock - A soul rock that contains the force of ice. -4031471 - Sayram's Shield - A shield that was carried around by the legendary Warrior Sayram. If the owner is in trouble, the shield is known to make a shrieking cry; therefore it is also known as the singing shield. -4031472 - Piece of Courage - A small piece of courage that can be obtained through monsters at Warped Dimension. -4031473 - Key to the Other World - This is the key that opens the door to Thanatos's room. -4031474 - Soul Contract - A contract that allows the black soul it to obtain the ability to bless by eliminating the black soul's sealed-up hidden force. -4031475 - Key to the Forgotten Shrine - This key is needed to head to the Forgotten Shrine. -4031476 - Glass Marble - A transparent glass marble. -4031477 - Lycanthrope's Plans - The other half of the note that detailed Lycanthrope's planned kidnapping of Tylus. -4031478 - Long-lasting Battery - Porter of Omega Sector invented this battery, which lasts a long long time. -4031479 - Sayram's Necklace - A necklace Sayram made for his trustworthy horse Griffey. There used to be a drawing of where they first met on the necklace, but it's erased now. -4031480 - Normal Cathedral Reservation Receipt - Receipt that proves that a couple made reservations at the Cathedral. Required for Cathedral Wedding -4031481 - Normal Chapel Reservation Receipt - Receipt that proves that a couple made reservations at the Vegas Chapel. Required for Chapel Wedding -4031482 - Dragon Heart - A bright, shiny rock that can be found inside the Dragon. Inside the rock features the unbelievable power of the dragon, condensed. Looks vaguely like a red jewelry. -4031483 - Dragon Heart - A bright, shiny rock that can be found inside the Dragon. Inside the rock features the unbelievable power of the dragon, condensed. Looks vaguely like a red jewelry. -4031484 - Dragon Heart - A bright, shiny rock that can be found inside the Dragon. Inside the rock features the unbelievable power of the dragon, condensed. Looks vaguely like a red jewelry. -4031485 - Dragon Heart - A bright, shiny rock that can be found inside the Dragon. Inside the rock features the unbelievable power of the dragon, condensed. Looks vaguely like a red jewelry. -4031486 - Lost Present - A present that must be delivered to someone accepting them for Maple Claws. -4031487 - Helena's Old Gloves - An old glove she bought years ago for Legor. It may be dirty with accumulated usage, but it also shows how hard the owner of the glove worked with them on. -4031488 - Soul Pouch - A small pouch that contains both free spirits as well as the evil ones. -4031495 - Tylus's Trust - An item that Tylus gave as a sign of trust. -4031496 - Key to the Other World - This is the key that opens the door to Thanatos's room. -4031497 - Summoning Frame - A frame that sets the basic boundaries of the summoning. -4031504 - Blue Gift Box - A blue gift box that features the Christmas presents. -4031505 - Yellow Gift Box - A yellow gift box that features the Christmas presents. -4031506 - Green Gift Box - A green gift box that features the Christmas presents. -4031507 - Pheromone - Used as an ingredient for Pheromone perfume. -4031508 - Kenta's Report - A report that features the results of Kenta's studies. -4031509 - Dragon's Perfume Bottle - A very important perfume bottle, needed to create the Pheromone perfume. -4031510 - Recommendation Letter for Job Adv. - A letter of recommendation written by the Chiefs in El Nath to the priest at Minar Forest. -4031511 - Heroic Pentagon - A pentagon pendant which brings out the show of ultimate respect. The true sign of a hero.. -4031512 - Heroic Star - A star-shaped pendant which brings out the show of ultimate respect. The true sign of a hero.. -4031513 - Recommendation Letter for Job Adv. - A letter of recommendation written by the Chiefs in El Nath to the priest at Minar Forest. -4031514 - Heroic Pentagon - A pentagon pendant which brings out the show of ultimate respect. The true sign of a hero.. -4031515 - Heroic Star - A star-shaped pendant which brings out the show of ultimate respect. The true sign of a hero.. -4031516 - Recommendation Letter for Job Adv. - A letter of recommendation written by the Chiefs in El Nath to the priest at Minar Forest. -4031517 - Heroic Pentagon - A pentagon pendant which brings out the show of ultimate respect. The true sign of a hero.. -4031518 - Heroic Star - A star-shaped pendant which brings out the show of ultimate respect. The true sign of a hero.. -4031519 - Christmas Present - A present from Maple Claws. In the spirit of the holidays, you must give this to a lucky person for it to be opened. -4031520 - New Year's Present - Bring in the New Year with this present from MapleStory! Thanks for playing! -4031521 - Hanukkah Present - Hannah's gift. In the spirit of the holidays, you must give this to a lucky person for it to be opened. -4031523 - Cherry Blossom Seed - A mystical seed that produces a fully bloomed Cherry Blossom tree. -4031524 - Silk Feather - A large, silk-like feather. Can be used in pillows and beds for added comfort. -4031525 - Ring Fragment - A piece from a set of broken engagement rings. -4031526 - Repaired Rings - A pair of rings mended by Moony for Gary and Shatima. -4031527 - White/Purple Ribbon Gift Box - An empty gift box in perfect condition. Goes well with new gifts. -4031528 - Claudia's Coupon (EXP Hair) - Given by Claudia in exchange for help. Grants the user a free EXP hair style change. One-time only! -4031529 - Allowance - Money from Mom and Dad. Can be used to purchase a Nexon Prepaid. -4031530 - Nexon Prepaid - 100 points - A Nexon Prepaid from Mr. Spot worth 100 points. Will be redeemed into Maple Points. -4031531 - Nexon Prepaid - 250 points - A Nexon Prepaid from Mr. Spot worth 250 points. Will be redeemed into Maple Points. -4031542 - Mouse - A new computer mouse perfect for Mom and Dad's new computer. -4031543 - Yellow Wish Ticket - Yellow Wish Ticket -4031544 - Green Wish Ticket - Green Wish Ticket -4031545 - Blue Wish Ticket - Blue Wish Ticket -4031551 - Lord Pirate's Treasures - A stack of treasures Lord Pirate had collected over the years. Looks very expensive. -4031552 - Body & Physics Medicine Herb Pouch - A herb pouch ready to be heated and squeezed out to make Body & Physics Medicine. -4031553 - Mind & Heart Medicine Herb Pouch - A herb pouch ready to be heated and squeezed out to make Mind & Heart Medicine. -4031554 - Peach Tree Herb Pouch - A herb pouch ready to be heated and squeezed out to make a medicine that aids in the growth of trees. -4031555 - Herb Pouch for Birds - A herb pouch ready to be heated and squeezed out to make a great medicine for birds. Not for humans! -4031556 - Maria's Nutritional Juice - Maria's special juice made of squishy liquid and mushroom spore. -4031557 - Cassandra's Cellphone - A broken cellphone that Cassandra lost. -4031558 - Dances with Balrog's Stamp - A Stamp that must be placed on the package, sent to Warriors. -4031559 - Grendel the Really Old's Stamp - A Stamp that must be placed on the package, sent to the Magicians. -4031560 - Dark Lord Stamp - Stamp that is needed to put on the package that is sent to the Thieves. -4031561 - Athena Pierce's Stamp - Stamp that is needed to put on the package that is sent to the Archers. -4031563 - Richard's Letter - A love letter written by Richard. Needs to be delivered to Angelique of Amoria... -4031564 - Richard's Letter - A love letter written by Richard. Needs to be delivered to Angelique of Amoria... -4031565 - Richard's Letter - A love letter written by Richard. Needs to be delivered to Angelique of Amoria... -4031566 - Richard's Letter - A love letter written by Richard. Needs to be delivered to Angelique of Amoria... -4031567 - Richard's Letter - A love letter written by Richard. Needs to be delivered to Angelique of Amoria... -4031568 - Cat's Eye - A gem that resembles the eye of a cat. Obtainable from Meowcat. -4031569 - Dancer's Swords - Decorative swords with fancy ornamentations on the blade and handle. They don't seem like they were meant to be used for fighting. -4031570 - Piece of Tigun's Beard - A lock of Tigun's beard that has been plucked. -4031571 - Queen's Silk - Silks with fine colors that the Queen ordered. It seems very expensive. -4031572 - Schegerazade's Storybook - Schegerazade's book that contains all the stories he knows. -4031573 - Wiz's Storybook - A storybook that Wiz kept safely in the Helios Tower. -4031574 - Sky Jewel - A gem that is known to contain Heaven's power. No one actually knows what kind of power it contains. -4031575 - Ticket to Ariant (Basic) - A basic ticket needed to board the boat that goes to Ariant in Ossyria. -4031576 - Ticket to Ariant (Regular) - A regular ticket needed to board the boat that goes to Ariant in Ossyria. -4031577 - Fairy's Tea Leaf - A tea leaf that is grown by fairies. -4031578 - Queen's Ring - An elaborately decorated ring. It looks really expensive. -4031579 - Small Sack of Jewelry - A small portion of treasure that has been brought back, carried inside a small sack. -4031580 - Wrapped Food - A food that has been wrapped so that it will stay in one piece. -4031581 - Sand Picture Member Badge - A badge that is only given to those qualify to be a Sand Picture member. -4031582 - Entry Pass to the Palace - A piece of paper that grants the right to enter the Palace. -4031583 - Purple Leaf of Transformation - A purple leaf with a sweet aroma. If you smell the flower, you can't transform back for 1 hour. -4031584 - Pink Leaf of Transformation - A pink leaf with a sweet aroma. If you smell the flower, you can't transform back for 1 hour. -4031585 - Yellow Leaf of Transformation - A yellow leaf with a sweet aroma. If you smell the flower, you can't transform back for 1 hour. -4031586 - Lonely Baking Powder - Baking powder that contains loneliness. -4031587 - Black Bean Paste of Longing - Black Bean Paste that contains the sorrow of missing someone. -4031588 - Pork of Loneliness - Pork that contains loneliness. -4031589 - Schegerazade's Letter - A letter that Schegerazade, the palace's gossiper, wrote to her younger brother Jiyur. -4031590 - Birthday Candle - A candle for birthday cakes. Used for MapleStory Anniversary Event. -4031591 - The Little Maple Prince Storybook - A book that contains the story of the 'Little Maple Prince'. -4031592 - Entrance Ticket - Entrance Ticket to the Amorian Challenge! Party Quest -4031593 - Lip Lock Key - One of many keys scattered throughout Amoria. You can give 10 of these to Amos to enter his Hunting Ground. -4031594 - Geist Fang - An enchanted fang from the Geist Balrog. Must be given to Amos as proof of triumph. -4031595 - Magik Mirror Shard - A shattered piece from a Magik Mirror. -4031596 - Wing Hammer - A unique hammer that can shatter anything with one swing. -4031597 - Cupid Code Piece - A special kind of multi-numeral key used for complex locks. -4031606 - Maple Leaf in the Box - A maple leaf that Kun received from a hero. The leaf is slowly dying. -4031607 - Maple Leaf in the Box - A maple leaf that Kun received from a hero. It is kept alive by Grendel the Really Old's magic. -4031608 - Infinity Scroll - A scroll that is needed to activate the maple leaf marble. You must have this to converse with the maple leaf marble. -4031610 - Maple Leaf Earring - A maple leaf shaped earring. Currently unuseable. -4031611 - Infinity Scroll - A scroll that is needed to activate the maple leaf marble. You must have this to converse with the maple leaf marble. -4031612 - Infinity Scroll - A scroll that is needed to activate the maple leaf marble. You must have this to converse with the maple leaf marble. -4031613 - Maple Leaf in the Box - A maple leaf that Kun received from a hero. It is kept alive by Grendel the Really Old' magic. -4031614 - Maple Leaf in the Box - A maple leaf that Kun received from a hero. It is kept alive by Grendel the Really Old' magic. -4031615 - Maple Leaf in the Box - A maple leaf that Kun received from a hero. It is kept alive by Grendel the Really Old' magic. -4031616 - Maple Leaf Earring - A maple leaf shaped earring. Currently unuseable. -4031617 - Maple Leaf Earring - A maple leaf shaped earring. Currently unuseable. -4031619 - Moppie's Little Box - A small box that Moppie had around his neck. It said 'to Ariant's Eleska...' -4031620 - Byron's Recommendation Letter - A recommendation letter written by Byron. I should take it to Dances With Balrog in Perion. -4031621 - Byron's Recommendation Letter - A recommendation letter written by Byron. I should take it to Grendel the Really Old in Ellinia. -4031622 - Byron's Recommendation Letter - A recommendation letter written by Byron. I should take it to Athena in Henesys. -4031623 - Byron's Recommendation Letter - A recommendation letter written by Byron. I should take it to the Dark Lord in Kerning City. -4031624 - Moppie's Little Box - A small box that Moppie had around his neck. It was sealed and it said 'to Ariant's Eleska...' -4031625 - Aquarium Invitation - An invitation to the Aquarium that a kid lost. -4031627 - Whitebait (3cm) - It measures 3cm in length, with high nutritional value, and it is suitable for steaming with the egg ingredients. It is delicious & low in fats. -4031628 - Sailfish (120cm) - It measures 120cm in length, containing protein, calcium, magnesium and vitamin D that a human body needs. It is a very healthy seafood. -4031629 - Pot - This superior heat conduction pot is easy to clean, and it is very suitable for those who are on diet. -4031630 - Carp (30cm) - It measures 30cm in length, with rich protein contents. It has the essential quantity of amino acids that a human body needs. -4031631 - Salmon(150cm) - It measures 150cm in length, with green and tender flesh. It is always the first choice in Sashimi. -4031632 - Shovel - An equipment used for stir-frying dishes -4031633 - Whitebait (3.6cm) - It measures 3.6cm in length, with high nutritional value, and it is suitable for steaming with the egg ingredients. It is delicious & low in fats. -4031634 - Whitebait (5cm) - It measures 5cm in length, with high nutritional value, and it is suitable for steaming with the egg ingredients. It is delicious & low in fats. -4031635 - Whitebait (6.5cm) - It measures 6.5cm in length, with high nutritional value, and it is suitable for steaming with the egg ingredients. It is delicious & low in fats. -4031636 - Whitebait (10cm) - It measures 10cm in length, with high nutritional value, and it is suitable for steaming with the egg ingredients. It is delicious & low in fats. -4031637 - Carp (53cm) - It measures 53cm in length, with rich protein contents. It has the essential quantity of amino acids that a human body needs. -4031638 - Carp (60cm) - It measures 60cm in length, with rich protein contents. It has the essential quantity of amino acids that a human body needs. -4031639 - Carp (100cm) - It measures 100cm in length, with rich protein contents. It has the essential quantity of amino acids that a human body needs. -4031640 - Carp (113cm) - It measures 113cm in length, with rich protein contents. It has the essential quantity of amino acids that a human body needs. -4031641 - Sailfish (128cm) - It measures 128cm in length, containing protein, calcium, magnesium and vitamin D that a human body needs. It is a very healthy seafood. -4031642 - Sailfish (131cm) - It measures 131cm in length, containing protein, calcium, magnesium and vitamin D that a human body needs. It is a very healthy seafood. -4031643 - Sailfish (140cm) - It measures 140cm in length, containing protein, calcium, magnesium and vitamin D that a human body needs. It is a very healthy seafood. -4031644 - Sailfish (148cm) - It measures 148cm in length, containing protein, calcium, magnesium and vitamin D that a human body needs. It is a very healthy seafood. -4031645 - Salmon (166cm) - It measures 166cm in length, with green and tender flesh. It is always the first choice in Sashimi. -4031646 - Salmon (183cm) - It measures 183cm in length, with green and tender flesh. It is always the first choice in Sashimi. -4031647 - Salmon (227cm) - It measures 227cm in length, with green and tender flesh. It is always the first choice in Sashimi. -4031648 - Salmon (288cm) - It measures 288cm in length, with green and tender flesh. It is always the first choice in Sashimi. -4031658 - Charcoal - Heats up the grill, needed for any BBQ. -4031659 - BBQ Sauce - Spicy sauce. Goes perfect with Maple Meat. -4031660 - Maple Raw Meat - Fresh meat ready to be cooked. Tastes excellent with BBQ sauce. -4031661 - Bottle of Emotion - A water bottle with shiny purple liquid inside. You can capture emotions in it. -4031662 - Ragged Steel Sword - A ragged steel sword. Judging by the clean handle, it seems like it's a valuable item to someone. -4031663 - Emergency Kit - Bandage and Medicine bottle that Mrs. Ming Ming has made. -4031664 - Charcoal - Heats up the grill, needed for any BBQ. -4031665 - BBQ Sauce - Spicy sauce. Goes perfect with Maple Meat. -4031666 - Maple Raw Meat - Fresh meat ready to be cooked. Tastes excellent with BBQ sauce. -4031667 - Bottle of Emotion - A water bottle with shiny purple liquid inside. You can capture emotions in it. -4031668 - Dark Lord's New Year Card - A New Year's card from Dark Lord of Kerning City. I'll have to deliver this to 'Kyrin', the Pirate Captain over in the Nautilus. -4031669 - Luck Sack - A red sack of "luck" with a Chinese character for luck engraved on the front. -4031674 - Elpam Magnet - A strange magnet not of the Maple World. Rumored to come from Versal. -4031675 - Temporal Fragment - An odd timepiece said to contain 1 second of time. -4031676 - Lost Ankh - An arcane key needed to unlock Bigger Ben's Pharoah Gate. -4031677 - Komodo Key - A key dropped from the Komodo Duo. Can be used to enter Foxwit's Den. -4031678 - Lift Key - A key used for the Elevator in Bigger Ben. -4031679 - Dragon Jewel - A jewel passed down through the Dragon Ninja clan. Allows access to any member's inner sanctum. -4031680 - Hyper Glyph - A peculiar crystal that seems to decipher languages. -4031681 - MesoGear Map Piece - A fraction of the MesoGears Map, said to reveal a hidden cavern within the MesoGears. -4031682 - Gullivera Coin - A mystic coin that temporarily bonds with the traveler for a short period of time. -4031683 - Maya's seal of love - This is a seal of true love given by Maya. -4031684 - Lowen's seal of love - This is a seal of true love given by Lowen. -4031685 - Ayan's seal of love - This is a seal of true love given by Ayan. -4031686 - Nela's seal of love - This is a seal of true love given by Nela -4031687 - Erikson's seal of love - This is a seal of true love given by Erikson. -4031688 - Tigun's seal of love - This is a seal of true love given by Tigun. -4031689 - Muse's seal of love - This is a seal of true love given by Muse. -4031690 - Pam's seal of love - This is a seal of true love given by Pam. -4031691 - Taesoo's Proof of Love - A badge of love that Taesoo gave me, acknowledging the sincerity of my love. -4031692 - Jiyur's Proof of Love - A badge of love that Jiyur gave me, acknowledging the sincerity of my love. -4031693 - Mute's Model - A miniature model of Mute. It was made for research purposes by the alchemists. -4031694 - Lumo's Leaf - A rare leaf obtained from Lumo. It contains the power of life but can easily die if mistreated. -4031695 - Snow Rose - A rose that is white like snow. It was created by the alchemists. -4031696 - Snow Rose Seed - A small and white seed. It can grow into a snow rose but you'll need to use alchemy to raise it. -4031697 - Silver Pendant - A pendant with a rose engraving. It is not yet attached to a chain. -4031698 - Magic Device - A device that has a gem that controls magic. Only the alchemists know how it works. -4031699 - Drop of Sun - A cure for fairies made by fairies. It's been made by sunlight. -4031700 - Drop of Moon - A cure for fairies made by fairies. It's been made by moonlight. -4031701 - Chumji's Watermelon - Sweet watermelon that is grown from Chumji's field. -4031702 - Transparent Item - A transparent item that is used to fight off the watermelon keeper. -4031703 - Regular Tree Branch - A regular looking tree branch. It doesn't seem to have any special powers. -4031704 - Anonymous Research Report - A research report that an unknown person compiled. The research seems to be about using metal to strengthen your body. -4031705 - Strange Bottle of Water - A water bottle containing transparent water. It is tightly locked. -4031706 - Phyllia's Letter - A letter Phyllia wrote to Erikson. It seems to be about Kini's condition. -4031707 - Ericsson's Letter - A letter Ericsson wrote to Phyllia. It seems to be about the medicine for Keeny. -4031708 - Secret Document - A secretive document written with codes. The bottom part is badly damaged and not readable. -4031709 - Lightless Magic Device - A magic device that has been completely used up. There is no more use for it. -4031710 - Subway Ticket to NLC (Basic) - A basic ticket needed to get on the subway that goes from Kerning City to New Leaf City of Masteria Continent. -4031711 - Subway Ticket to NLC (Regular) - A Regular ticket needed to get on the subway that goes from Kerning City to New Leaf City of Masteria Continent. -4031712 - Subway Ticket to Kerning City (Basic) - A basic ticket needed to get on the subway that goes from New Leaf City to Kerning City of Victoria Island. -4031713 - Subway Ticket to Kerning City (Regular) - A Regular ticket needed to get on the subway that goes from New Leaf City to Kerning City of Victoria Island. -4031731 - Ticket to Singapore (From Kerning City) - A regular ticket needed to get on the plane that heads from Kerning City to Changi airport. -4031732 - Ticket to Kerning City (From CBD) - A regular ticket needed to get on the plane that heads from Changi airport to Kerning City. -4031733 - Ticket to Singapore (From Orbis) - A regular ticket needed to get on the plane that heads from Oribs to Changi airport. -4031734 - Ticket to Orbis (From CBD) - A regular ticket needed to get on the plane that heads from Changi airport to Orbis. -4031737 - Homunculus's Blood - Blood that is made by Homunculus's magic. It has the power to reveal truth. -4031738 - Dran's Medicine - Medicine that Dran made for his daughter Kini. It seems rather ordinary but it is actually very difficult to make. -4031739 - Magic Stone of Humility - An orange magic stone that signifies humility. What kind of powers does this item have? -4031740 - Magic Stone of Honesty - A green magic stone that signifies honesty. What kind of powers does this item have? -4031741 - Magic Stone of Trust - A blue magic stone that signifies trust. What kind of powers does this item have? -4031743 - Unknown Medicine - A medicine carried by Humanoid A. There's no way to tell what kind of effect it has when consumed. -4031744 - Silver Pendant - A pendant with a rose engraving. It seems to be missing its chain. -4031745 - Parwen's Entry Pass - Entry pass that was used by Parwen. It looks like any other entry passes but has a different number on it. -4031750 - Dark Matter - Strange matter from the depths of space. When used in the construction of items, who knows what effect it'll have! -4031751 - Vorticular Gyro - A futuristic machine part that perpetually makes whirling noises. Once a part of a bigger machine, it can be used to create something new. -4031752 - Blinking Dingbat - A futuristic machine part that blinks steadily and mysteriously. It's original use is unknown but it can be broken down to create something else. -4031753 - Zeta Residue - Residual matter from the explosion of a distant dying star that's taken eons to reach here. -4031754 - Black Versal Materia - A form of concentrated energy, harvested from the alternate dimension of Versal. The dark energy denotes a chaotic element. -4031755 - Taru Totem - An ancient totem that pulses with mystic energy. -4031756 - Mystic Astrolabe - A golden instrument used for navigation. Said to have magical effects when combined with other items. -4031757 - Antellion Relic - An old world tablet with strange markings. These are said to combine with other objects. -4031758 - Naricain Jewel - A lost jewel created by Naricain, the demon sorceror. Said to add tremendous dark power to crafted items. -4031759 - Subani Ankh - One of Subani's Ankhs. Said to have protective powers and ward off darkness. -4031760 - White Versal Materia - A form of concentrated energy, harvested from the alternate dimension of Versal. The blinding white energy indicates it is still unstable. -4031761 - Materia Orb - Materia from Versal that has been stabilized into an orb form. It still pulses with energy. -4031762 - Relic Weapon Blueprint - Relic Weapon Blueprint -4031763 - Materia Weapon Blueprint - Materia Weapon Blueprint -4031764 - Paranormal Activity Report Page - A page from a file detailing strange activity and possible locations for ghosts. It doesn't look very professional. -4031765 - Blank Paranormal Subject Questionnaire - This is an official MBI form that is intended for gathering data on paranormal subjects. It is currently blank. -4031766 - Completed Paranormal Subject Questionnaire - This official MBI form has been completed by a paranormal subject. Hmmm... very interesting information. -4031767 - Sophilia's First Doll - A worn, happy looking doll that has seen better days. -4031768 - "Perfect" Sophilia Doll - A doll that is a chilling likeness of Sophilia but looks odd and unnatural. -4031769 - Tarrymore Earring - This beautiful, elegant earring belongs to Ludmilla. -4031770 - Sepha Earring - This expensive, stylish earring belongs to Ludmilla. -4031771 - Omni Key - A strange key kept in excellent condition. Can be used to enter fireplaces in the Prendergast Mansion. -4031772 - Toy Workshop Key - Jonas' key to his Toy Workshop at the top of the Prendergast Mansion. -4031773 - Dry Branch - An arid branch so devoid of water, it looks like even the slightest touch might break it. -4031774 - Yulete's Lab Report - A compilation of Yulete's lab work and research. Very neat! -4031775 - Frankenroid's Blueprint - A blueprint of Frankenroid created by Yulete. -4031776 - Sirin's Pattern - The pattern of the clothes Sirin designed. Comes with a detailed step-by-step guide for beginners. -4031777 - Juliet's Present - Juliet made this for Romeo. What kind of guy would enjoy this as a gift? -4031778 - Romeo's Love Letter - A letter Romeo wrote to profess his love for Juliet. -4031779 - Juliet's Lunch Box - A lunch box Juliet made for Romeo. I am not sure if the food inside is completely edible...I'll let Romeo try it instead. -4031780 - Mysterious Red Liquid - A red liquid Yulete made for the combination of reagents. -4031781 - Mysterious Green Liquid - A green liquid Yulete made for the combination of reagents. -4031782 - Mysterious Yellow Liquid - A yellow liquid Yulete made for the combination of reagents. -4031783 - Mysterious Blue Liquid - A blue liquid Yulete made for the combination of reagents. -4031784 - Mysterious Purple Liquid - A purple liquid Yulete made for the combination of reagents. -4031785 - Lunchbox Recipe - A lunch box recipe sold by Han the Broker. The author's name is on the cover - H. No way it's written by Han the Broker... -4031788 - Red Marble - A glowing Red Marble Master Goblin prepared for Do Gong. Apparently it helps mastering spells. -4031789 - Antidote Marble - An antidote to King Sage Cat's poison. -4031790 - Small Clue - A cloth from a robe found from Tri-Tailed Foxes. This may explain Chil Nam's bizarre behavior. -4031791 - Ice Crystal - A piece of ice with mysterious powers that may recover the Statue of the Spirit of Snow. -4031792 - Mushroom Candy - A sweet candy that resembles a mushroom. -4031793 - Old Fox's Tail - One of the tails from the Old Fox. Very soft and shiny. -4031794 - Tae Soo's Peach - A special Peach Tae Soo plucked out of the Peach Farm with Tae Sang's blessings. Only the sweetest and the most delicious Peaches can be found here. -4031795 - Cat Doll Under a Spell - A cat doll from Sage Cat with a spell from Do Gong. -4031796 - Yulete's Lab Report - A compilation of Yulete's lab work and research. The notes, while very neat, are complicated. -4031797 - Yulete's Report - A report full of notes from Yulete's various expriments. -4031798 - Finished Reagent - A reagent made with a combination of liquids. -4031799 - Romeo's Snow Rose - A snow rose from Romeo to Juliet. -4031800 - Maria's Letter - A letter from Maria to Lucas, the chief of Amherst. -4031801 - Lucas's Recommendation Letter - A recommendation letter from Lucas for a beginner. -4031802 - Jr. Sentinel Shellpiece - A hard shellpiece that's a part of Jr. Sentinel. -4031805 - Bob's Snail Shell - Threatened for his life, Bob went back into his shell. You can carry him. He's not too heavy.. -4031806 - Romeo's Engagement Ring - A beautiful set of silver rings that Romeo got for Juliet for the engagement, with help from Allegro. -4031811 - Sophilia's First Doll - A worn, happy looking doll that has seen better days. -4031812 - Paranormal Activity Report Page - A page from a file detailing strange activity and possible locations for ghosts. It doesn't look very professional. -4031815 - Heartstopper - Just one taste of this spicy candy and it'll feel like your heart's on fire! -4031816 - Pumpkin Taffy - Sweetened pumpkin taffy on a candy cane stick. -4031817 - Red Gummy Slime - Super-chewy gummy slimes. This one is cherry-flavored. If only real Slimes tasted this good. -4031818 - Green Gummy Slime - Super-chewy gummy slimes. This one is cherry-flavored. If only real Slimes tasted this good. -4031819 - Purple Gummy Slime - Super-chewy gummy slimes. This one is cherry-flavored. If only real Slimes tasted this good. -4031820 - Orange Gummy Slime - Super-chewy gummy slimes. This one is cherry-flavored. If only real Slimes tasted this good. -4031821 - Maple Pop - A mouth-watering, delectable sweet treat! -4031822 - Infinity Circlet Forging Manual - John Barricade's hastily drawn notes for creating an Infinity Circlet. -4031823 - Antellion Miter Forging Manual - John Barricade's hastily drawn notes for creating an Antellion Miter. -4031824 - Stormcaster Gloves Forging Manual - John Barricade's hastily drawn notes for creating Stormcaster Gloves. -4031825 - Crystal Leaf Earrings Forging Manual - John Barricade's hastily drawn notes for creating Crystal Leaf Earrings. -4031826 - Zeta Cape Forging Manual - Professor Foxwit's blueprint for creating a Zeta Cape. -4031827 - Sirius Cloak Forging Manual - Professor Foxwit's blueprint for creating a Sirius Cloak. -4031828 - Dark Shard Earrings Forging Manual - Professor Foxwit's blueprint for creating Dark Shard Earrings. -4031829 - Black Phoenix Shield Forging Manual - Professor Foxwit's blueprint for creating a Black Phoenix Shield. -4031830 - Ghost Sack - A strange sack that contains ghosts. If I mistakenly open this, I feel like a million ghosts might try and possess me. -4031831 - Mirror Piece - A piece of a mirror. If I have this with me, I'll be able to see ghosts with my own eyes. -4031839 - Crumpled Letter - An old, crumpled letter. It is extremely damaged and therefore not very legible. -4031840 - Old Orgel - A beautiful, yet old orgel that shows the traces of time. Written on the inside of the orgel are the words, "For Dear Miss Helena". -4031841 - Magic Flask (Empty) - An empty bottle that can be filled with magic. -4031842 - Magic Flask (Filled) - The Vigor of the Sea fills this magic flask. -4031843 - Large Pearl - A beautiful, large pearl. -4031844 - Rolonay's Research Report - A report document compiled by Rolonay in response to Dr. Kim's research request. -4031845 - Daily Log - Bart's log report of various happenings nearby, as seen from the watchtower. -4031846 - Black Magician's Token - A token of proof that one is a follower of the Black Magician. -4031847 - Milk Jug - A large, empty milk bottle. -4031848 - Milk Jug (1/3) - A jug filled with 1/3rd of milk. Exact measurements. -4031849 - Milk Jug (2/3) - A jug filled with 2/3rds of milk. Exact measurements. -4031850 - Milk Jug (Full) - A jug filled to the brim with milk. Don't spill it! -4031851 - Whalean Canned Food - Kenta's special, canned delicacy of cooked sea horse tail, beloved by Whales. -4031852 - Dress - A fancy, fashionable dress made by Madame Ming Ming herself. The inscription says "Kyrin". -4031853 - Abel's Glasses - Abel's lost pair of glasses. Black, horn-rimmed and polished. -4031854 - Miscellaneous Glasses - Someone's lost pair of glasses. To whom do they belong? -4031855 - Miscellaneous Glasses - Someone's lost pair of glasses. To whom do they belong? -4031856 - Potent Power Crystal - A Power Crystal that contains concentrated monster power. -4031857 - Potent Wind Crystal - A Wind Crystal that contains concentrated dexterity extract, drained from evasive monsters. Enables agility. -4031858 - Porchay's Letter - Porchay's letter to Kenta. -4031859 - Recommendation Letter for 4th Job Advancement - A recommendation letter written by the Chiefs in El Nath to the Priest of Minar Forest. -4031860 - Heroic Pentagon - A pentagon-shaped badge proving one's status as a hero. -4031861 - Heroic Star - A star-shaped pendant proving one's status as a hero. -4031862 - Black Magician's Token - A token of proof that one is a follower of the Black Magician. -4031863 - Confidential Report - A highly confidential report compiled by Baine. Keep it a secret! -4031864 - Allowance - Money from Mom and Dad. Can be used to purchase a Nexon Game Card. -4031865 - Nexon Game Card - 100 points - A Nexon Game Card worth 100 points. Will be redeemed into Maple Points! -4031866 - Nexon Game Card - 250 points - A Nexon Game Card worth 250 points. Will be redeemed into Maple Points! -4031868 - Spirit Jewel - A fossilized jewel which contains the pure essence of a monster in crystallized form. It gives off a potent aura of evil. -4031869 - Papulatus' Key - A mysterious key held by Papulatus. Wonder where the key might fit? -4031870 - Papulatus' Key - A mysterious key that enables separation from different dimensions. What did Papulatus use this key for? -4031871 - Sturdy Leather - Sturdy leather belonging to a Blue Dragon Turtle. -4031872 - Heart of Stone - A heart made of stone that can fill the Red Dragon Turtle's heart with cruelty. -4031873 - Spirit Viking Flags - The flag that the Spirit Vikings carry with them everywhere. They say that without this flag, they are not acknowledged as a Spirit Viking. -4031874 - Spirit Viking Token - A token of proof that one is a member of the Vikings. The Gigantic Spirit Vikings take this token with them wherever they go. -4031875 - Nevermelting Snow - A batch of snow that stays powdery. It never melts for some reason. -4031876 - Flyers - A flyer that contains some important message from Rooney on it. -4031877 - Little Suzy's Wishlist - Little Suzy's Wishlist. Neatly written in pencil. Must be taken to Maple Claws or O-Pongo. -4031878 - Star of Maplemas Spirit - The spirit of Maplemas, the holiday celebrated annually in the Maple World! -4031879 - Orb of Versalmas Cheer - The spirit of Versalmas, the holiday celebrating the 99 days of sunshine in Versal. -4031880 - Stock Certificate for Grubber Industries - A stock certificate good for one share in Mr. Grubber's company. It may be worth a lot of money someday! -4031887 - Tamed Rudolph - A lost Rudolph that has been tamed through spells. -4031890 - Warp Card - A special card needed to travel to the Command Center in Omega Sector. Can only be used inside the Nautilus' Warp Machine. -4031891 - Gold Pouch - A cloth pouch full of gold. -4031892 - Tattered Map - An old, tattered map from hundreds of years ago. -4031893 - Byron's Recommendation Letter - A recommendation letter from Byron the scholar. Give it to Kyrin at Notilus. -4031894 - Crumpled Piece of Paper - When this crumpled piece of paper is straightened out, some familiar names are featured. Jake, Shumi, Nella, Mr. Pickall... -4031895 - Piece of Cheese - A tasty piece of cheese, the main dish for mice. -4031896 - Magic Reagent - Pour it on the horoscope paper, and the future can be seen right then and there. -4031897 - Ancient Helm - An ancient, broken version of the Bosshunter Helm that has lost its original power. With a magic ritual and the right spell components, this can be restored to its original, equippable condition. -4031898 - Ancient Armor - An ancient, broken version of the Bosshunter Armor that has lost its original power. With a magic ritual and the right spell components, this can be restored to its original, equippable condition. -4031899 - Ancient Greaves - An ancient, broken version of the Bosshunter Greaves that has lost its original power. With a magic ritual and the right spell components, this can be restored to its original, equippable condition. -4031900 - Ridley's Book of Rituals - A handy guide and how-to book for all things arcane. No need to hire a professional magician, Ridley shows you how to do it yourself! -4031901 - Papulatus Curl - This is the curl taken from the top of Papulatus' head. -4031902 - Tengu Nose - This is the nose that has been cut off from Black Crow's face. -4031903 - Jack O'Lantern - This is the head of the Headless Horseman. -4031904 - Ergoth's Jawbone - This is the lower jawbone taken from defeating Ergoth. -4031905 - Pianus Scale - This is a scale taken from the giant demonfish Pianus. -4031906 - Balrog Claw - This is a claw taken from either the Crimson Balrog or the Geist Balrog. -4031907 - Tiger's Fang Forging Manual - John Barricade's hastily drawn notes for creating a Tiger's Fang. -4031908 - Neva Forging Manual - John Barricade's hastily drawn notes for creating a Neva. -4031909 - Winkel Forging Manual - John Barricade's hastily drawn notes for creating a Winkel. -4031910 - Glitter Gloves Forging Manual - John Barricade's hastily drawn notes for creating a pair of Glitter Gloves. -4031911 - Facestompers Forging Manual - John Barricade's hastily drawn notes for creating a pair of Facestompers. -4031912 - Crystal Ilbi Forging Manual - John Barricade's hastily drawn notes for creating a Crystal Ilbi. -4031913 - Stone Tiger Head - The figure of a roaring tiger's head, carved from an unknown material. -4031914 - Typhon Crest - A crest marked with the sign of Typhon, a wind beast. -4031915 - LeFay Jewel - A jewel from the former headpiece worn by the dark sorceress LeFay. -4031916 - Pharoah's Wrappings - The remnant of an ancient king's burial garb, probably found from a Nihalian tomb. -4031917 - Crystal Shard - A shard from a legendary crystal sword shattered when used to slay a powerful demon. -4031918 - Ancient Faceguard - An ancient, broken version of the Bosshunter Faceguard that has lost its original power. With a magic ritual and the right spell components, this can be restored to its original, equippable condition. -4031919 - Ancient Gi - An ancient, broken version of the Bosshunter Gi that has lost its original power. With a magic ritual and the right spell components, this can be restored to its original, equippable condition. -4031920 - Ancient Boots - An ancient, broken version of the Bosshunter Boots that has lost its original power. With a magic ritual and the right spell components, this can be restored to its original, equippable condition. -4031921 - Hidden note - In order to prove the worth as a pet trainer, you have to find this. -4031922 - Pet poop - It's Pet poop. -4031923 - Radio Parts - A radio part that can be used to fix Petit's radio. -4031924 - Fairy Hair - Some hair from a fairy with mysterious powers. Apparently, fairies give a piece of their hair to someone as a sign of apology. -4031925 - Cursing Nail - A nail used for curse. Make a voodoo doll, press this nail against it, and the curse is on! -4031926 - Gray Tentacle - A tentacle from Gray's head. Apparently Grays use this tentacle to communicate, instead of their mouths. -4031927 - Wave Translator - A wave translator invented by Dr. Kim of Omega Sector to translate supersonic waves Grays use to communicate to one another. May be subject to malfunction. -4031928 - Wave Translator - A wave translator invented by Dr. Kim of Omega Sector to translate supersonic waves Grays use to communicate to one another. May be subject to malfunction. -4031933 - Solid Purple Lumber - A solid, purple lumber. Can be used to build things. -4031934 - Solid Pink Lumber - A solid, pink lumber. Can be used to build things. -4031935 - Solid Yellow Lumber - A solid, yellow lumber. Can be used to build things. -4031936 - Taru Spirit Feather - A special feather given to a Taru warrior to mark a brave deed. [This item is required to upgrade Taru weapons.] -4031937 - Jungle Lily - A rare, exotic flower that grows in the Krakian Jungle. -4031938 - 99% Dark Chocolate - A 99% Cacao dark chocolate that tastes like crayon. It's so bitter, some call it a tearjerker. -4031939 - 99% Dark Chocolate - A 99% Cacao dark chocolate that tastes like crayon. It's so bitter, some call it a tearjerker. -4031940 - 99% Dark Chocolate - A 99% Cacao dark chocolate that tastes like crayon. It's so bitter, some call it a tearjerker. -4031945 - Mysterious Cloth - A mysterious cloth created by Arwen using Snow Silk. It's transparent and sparkly, but also very tightly woven. -4032003 - Phantom Seed - A seed dropped by the possessed trees of Phantom Forest. -4032004 - Crimson Wood - Resilient wood from the Crimson Tree. -4032005 - Typhon Feather - A feather from the mythical Typhon. These are thought to contain the essence of their wind nature. -4032006 - Stormbreaker Badge - An emblem that marks one as a member of the Stormbreakers. -4032007 - Windraider Badge - An emblem that marks one as a member of the Windraiders. -4032008 - Firebrand Badge - An emblem that marks one as a member of the Firebrands. -4032009 - Nightshadow Badge - An emblem that marks one as a member of the Nightshadows. -4032010 - Elder Ashes - The Elder Wraiths are spirits of Crimsonwood Keep heroes who fell in battle but were never buried. These are the burnt ashes of their remains (ashes of the dead) and should basically look like a pile of grey dust. -4032011 - Soiled Rags - The Elder Wraiths are spirits of Crimsonwood Keep heroes who fell in battle but were never buried. These are the burnt ashes of their remains (ashes of the dead) and should basically look like a pile of grey dust. -4032012 - Crimson Heart - A dark red crystal that pulses with unknown energy, used to power the Crimson Guardians. -4032013 - Bigfoot's Toe - The big toe of Bigfoot. Even though it has a pretty ribbon tied around it, it still looks kinda gross. -4032014 - Jack's Letter to John - A letter the Jack has written to John. It seems to be written in some secret code known only between the Barricade Brothers. -4032015 - Tao of Shadows - A ancient Shadowknight artifact. Its use is known only to the Raven Ninjas. -4032016 - Tao of Sight - A ancient Shadowknight artifact. Its use is known only to the Raven Ninjas. -4032017 - Tao of Harmony - A ancient Shadowknight artifact. Its use is known only to the Raven Ninjas. -4032032 - Coded Communique - (no description) -4032018 - Translated Communique - (no description) -4032021 - Triferium Fuel Cell - A futuristic, super-efficient power unit designed for everything from cybernetic protectors to microwaves. -4032022 - Diferium Fuel Cell - A futuristic power unit suitable for powering everything from toasters to toy robot dogs. -4032023 - Sparkplug - A useful component for many electronic devices, especially cybernetic protectors. -4032024 - Jumper Cable - A pair of jumper cables. Anyone need a start? -4032025 - T-1 Socket Adapter - Looks like a socket adapter for the T-1 line of robotic devices. -4032026 - Ridley's Stone - An ancient magical stone bearing the mark of Ridley, the master artisan-magician. It hums when in vicinity of a Ridley's Statue. -4032027 - Coat Hanger - A wire coat hanger that can be bent into different shapes, for function or for fun. -4032028 - Wad of Gum - A wad of gum that has been slightly chewed. Still sticky! -4032029 - Duct Tape - A roll of silver duct tape. Never know when this may come in handy! -4032030 - Stretchy Material - A piece of highly stretchy, elastic cloth. -4032031 - Lucky Charm - A small silver lucky charm. Hopefully, it'll bring you more luck than it did the leprechaun. -4032055 - Event Ticket (Regular) - A ticket that's required to enter the Mini Dungeon during the event period. Without this, you won't be able to fully participate in the event. -4032056 - Magic Crystal - A beautiful crystal with a red maple leaf inside. Hand this in to the Event Personnel, and she'll exchange this with a prize. -4032057 - Attendance Sheet - An attendance sheet that checks your daily attendance to MapleStory. -4032058 - PB & J Sandwich - A scrumptious Peanut Butter and Jelly Sandwich. The staple of lunch for all ages! -4032059 - Chocolate Milk - Rich Happyville chocolate combined with high-quality milk straight from the fields of Henesys. A delicious treat! -4032060 - Chips - An irresistible snack. Way too tasty to eat just one! -4032061 - Cookie - A chocolate chip cookie found in the wild, now prepared to eat. Guaranteed to bring a smile to someone's face. -4032062 - Fruit Roll Up - A favorite in Victoria Island, this delectable snack bursts with the taste of strawberries. -4032063 - Notebook - A special notebook used for the 2008 Back to School Event. Can be turned into the Maple Admin. May the best server team win! -4055000 - Cassandra's Divine Coupon - Use this at #cHenesys Plastic Surgery# to #ctemporarily# change face once -4055001 - Cassandra's Divine Coupon - Use this at #cKerning City# Hair Salon to #ctemporarily# change hairstyle once -4055004 - Henesys Plastic Surgery Event Coupon - Use this at #cHenesys Plastic Surgery# to #ctemporarily# change face once -4055005 - Kerning City Hair Salon Coupon - Use this at #cKerning City# Hair Salon to #ctemporarily# change hairstyle once -4080000 - Slime & Mushroom Omok Set - A set that allows you to play Omok. Uses slime and mushroom-shaped figures for the game. -4080001 - Slime & Octopus Omok Set - A set that allows you to play Omok. Uses slime and octopus-shaped figures for the game. -4080002 - Slime & Pig Omok Set - A set that allows you to play Omok. Uses pig and slime-shaped figures for the game. -4080003 - Octopus & Mushroom Omok Set - A set that allows you to play Omok. Uses octopus and mushroom-shaped figures for the game. -4080004 - Pig & Octopus Omok Set - A set that allows you to play Omok. Uses pig and octopus-shaped figures for the game. -4080005 - Pig & Mushroom Omok Set - A set that allows you to play Omok. Uses pig and mushroom-shaped figures for the game. -4080006 - Bloctopus & Pink Teddy Omok Set - A set that allows you to play Omok. Uses Bloctopus & Pink Teddy-shaped figures for the game. -4080007 - Bloctopus & Trixter Omok Set - A set that allows you to play Omok. Uses Bloctopus & Trixter-shaped figures for the game. -4080008 - Pink Teddy & Trixter Omok Set - A set that allows you to play Omok. Uses Pink Teddy & Trixter-shaped figures for the game. -4080009 - Panda Teddy & Blocktopus Omok Set - A set that allows you to play Omok. Uses Blocktopus & Panda Teddy-shaped figures for the game. -4080010 - Panda Teddy & Pink Teddy Omok Set - A set that allows you to play Omok. Uses Panda Teddy & Pink Teddy-shaped figures for the game. -4080011 - Panda Teddy & Trixter Omok Set - A set that allows you to play Omok. Uses Panda Teddy & Trixter-shaped figures for the game. -4080100 - A set of Match Cards - A set of Match Cards the game to play. -4130000 - Gloves Production Stimulator - Item option changes when you make gloves with this stimulator. However, creating item may result in failure by 10%. -4130001 - Shoes Production Stimulator - Item option changes when you make shoes with this stimulator. However, creating item may result in failure by 10%. -4130002 - One-Handed Sword Forging Stimulator - Item option changes when you make one-handed sword with this stimulator. However, creating item may result in failure by 10%. -4130003 - One-Handed Axe Forging Stimulator - Item option changes when you make one-handed axe with this stimulator. However, creating item may result in failure by 10%. -4130004 - One-Handed Blunt Weapon Forging Stimulator - Item option changes when you make one-handed blunt weapon with this stimulator. However, creating item may result in failure by 10%. -4130005 - Two-Handed Sword Forging Stimulator - Item option changes when you make two-handed sword with this stimulator. However, creating item may result in failure by 10%. -4130006 - Two-Handed Axe Forging Stimulator - Item option changes when you make two-handed axe with this stimulator. However, creating item may result in failure by 10%. -4130007 - Two-Handed Mace Forging Stimulator - Item option changes when you make two-handed mace with this stimulator. However, creating item may result in failure by 10%. -4130008 - Spear Forging Stimulator - Item option changes when you make spear with this stimulator. However, creating item may result in failure by 10%. -4130009 - Pole Arm Forging Stimulator - Item option changes when you make pole arm with this stimulator. However, creating item may result in failure by 10%. -4130010 - Wand Production Stimulator - Item option changes when you make wand with this stimulator. However, creating item may result in failure by 10%. -4130011 - Staff Production Stimulator - Item option changes when you make staff with this stimulator. However, creating item may result in failure by 10%. -4130012 - Bow Production Stimulator - Item option changes when you make bow with this stimulator. However, creating item may result in failure by 10%. -4130013 - Crossbow Production Stimulator - Item option changes when you make crossbow with this stimulator. However, creating item may result in failure by 10%. -4130014 - Dagger Forging Stimulator - Item option changes when you make dagger with this stimulator. However, creating item may result in failure by 10%. -4130015 - Claw Production Stimulator - Item option changes when you make claw with this stimulator. However, creating item may result in failure by 10%. -4130016 - Knuckler Production Stimulator - Item option changes when you make the Knuckler with this stimulator. However, there's a 10% chance of failure. -4130017 - Gun Production Stimulator - Item option changes when you make the gun with this stimulator. However, there's a 10% chance of failure. -4131000 - One-Handed Sword Forging Manual - Worn-out one-handed sword forging manual. -4131001 - One-Handed Axe Forging Manual - Worn-out one-handed axe forging manual. -4131002 - One-Handed Blunt Weapon Forging Manual - Worn-out one-handed blunt weapon forging manual. -4131003 - Two-Handed Sword Forging Manual - Worn-out two-handed sword forging manual. -4131004 - Two-Handed Axe Forging Manual - Worn-out two-handed axe forging manual. -4131005 - Two-Handed Mace Forging Manual - Worn-out two-handed blunt weapon forging manual -4131006 - Spear Forging Manual - Worn-out spear forging manual -4131007 - Pole Arm Forging Manual - Worn-out pole arm forging manual -4131008 - Wand Production Manual - Worn-out wand production manual -4131009 - Staff Production Manual - Worn-out staff production manual -4131010 - Bow Production Manual - Worn-out bow production manual -4131011 - Crossbow Production Manual - Worn-out crossbow production manual -4131012 - Dagger Forging Manual - Worn-out dagger forging manual -4131013 - Claw Production Manual - Worn-out claw production manual -4131014 - Knuckler Production Manual - A worn-out Knuckler production manual. -4131015 - Gun Production Manual - A worn-out gun production manual. -4140000 - Chocolate Stick - A tasty-looking chocolate-dipped cookie stick. -4140100 - Heart Chocolate - A chocolate encased in a heart-shaped box. -4140101 - Pineapple Candy for White Day - A tasty pineapple candy. -4140102 - Strawberry Candy for White Day - A tasty strawberry candy. -4140103 - Certificate of Assistant - Much like the Safety Charm, it does not let the user lose EXP points after death, as long as it's in possession. #cCan be used ONCE within the expiration date# -4140200 - Chocolate Basket - A well-decorated basket full of chocolate. -4140201 - Candy Basket for White Day - A candy basket full of sweet candies. It does not let the user lose EXP points after death, as long as it's in possession. #cCan be used ONCE within the expiration date# -4140300 - Power of Moon - A piece of rock that contains the mysterious power of moon. It does not let the user lose EXP points after death, as long as it's in possession. #cCan be used ONCE within the expiration date# -4140301 - Power of Star - A piece of rock that contains the mysterious power of a star. It does not let the user lose EXP points after death, as long as it's in possession. #cCan be used ONCE within the expiration date# -4140302 - Defense Charm - A self-defense charm given as an event prize. It prevents EXP loss upon death. \n Good for 1 use. -4140900 - White Day - Strawberry Candy - A sweet strawberry candy. Much like the Safety Charm, it does not let the user lose EXP points after death, as long as it's in possession. #cCan be used ONCE within the expiration date# -4140901 - White Day - Candy Basket - A candy basket full of love. Much like the Safety Charm, it does not let the user lose EXP points after death, as long as it's in possession. #cCan be used ONCE within the expiration date# -4140902 - Pineapple Candy - A sweet pineapple candy. Much like the Safety Charm, it does not let the user lose EXP points after death, as long as it's in possession. #cCan be used ONCE within the expiration date# -4140903 - Easter Charm - This will allow the possessor of the item to retain all of the EXP points even after death. The item will be discarded after use. -4160000 - Pet Command Guide : Puppy - A guide that has all the commands for the puppy.\n#cDouble-click on the item to open the guide.# -4160001 - Pet Command Guide : Kitty - A guide that has all the commands for the Kitty.\n#cDouble-click on the item to open the guide.# -4160002 - Pet Command Guide : Bunny - A guide that has all the commands for the Bunny.\n#cDouble-click on the item to open the guide.# -4160003 - Pet Command Guide : Mini Kargo - A guide that has all the commands for Mini Kargo.\n#cDouble-click on the item to open the guide.# -4160004 - Pet Command Guide : Husky - A guide that has all the commands for the Husky.\n#cDouble-click on the item to open the guide.# -4160005 - Pet Command Guide : Pig - A guide that has all the commands for the pig.\n#cDouble-click on the item to open the guide.# -4160006 - Pet Command Guide : Panda - A guide that has all the commands for the Panda.\n#cDouble-click on the item to open the guide.# -4160007 - Pet Command Guide : Dino - A guide that has all the commands for the Dino.\n#cDouble-click on the item to open the guide.# -4160008 - Pet Command Guide : White Tiger - A guide that has all the commands for the White Command.\n#cDouble-click on the item to open the guide.# -4160009 - Pet Command Guide : Rudolph - A guide that has all the commands for the Rudolph.\n#cDouble-click on the item to open the guide.# -4160010 - Pet Command Guide : Monkey - A guide that has all the commands for Monkey.\n#cDouble-click on the item to open the guide.# -4160011 - Pet AP Reset Scroll - An important scroll that enables one to adjust the pet ability points. \n#cDouble-click on the item for more information.# -4160012 - Pet Command Guide : Mini Yeti - A guidebook that details the commands that can be said to Mini Yeti.#cDouble-click on the item to open the book.# -4160013 - Pet Command Guide : Robot - A guide that has all the commands for the Robot.\n#cDouble-click on the item to open the guide.# -4160014 - Pet Command Guide : Penguin - A guide that has all the commands for the Penguin.\n#cDouble-click on the item to open the guide.# -4160015 - Pet Command Guide : Jr. Balrog - A guide that has all the commands for the Jr. Balrog.\n#cDouble-click on the item to open the guide.# -4160016 - Pet Command Guide : Elephant - A guide that has all the commands for the Elephant.\n#cDouble-click on the item to open the guide.# -4160017 - Pet Command Guide : Golden Pig - A guide that has all the commands for the Golden Pig.\n#cDouble-click on the item to open the guide.# -4160019 - Pet Command Guide : Sun Wu Kong - A guide that has all the commands for Sun Wu Kong.\n#cDouble-click on the item to open the guide.# -4160020 - Pet Command Guide : Turkey - A guide that has all the commands for the Turkey.\n#cDouble-click on the item to open the guide.# -4160022 - Pet Command Guide : Baby Dragon - A guide that has all the commands for the Baby Dragon.\n#cDouble-click on the item to open the guide.# -4160023 - Pet Command Guide : Green/Red/Blue Dragon - A guide that has all the commands for the Green/Red/Blue Dragon.\n#cDouble-click on the item to open the guide.# -4160024 - Pet Command Guide : Black Dragon - A guide that has all the commands for the Black Dragon.\n#cDouble-click on the item to open the guide.# -4160026 - Pet Command Guide : Jr. Reaper - A guide that has all the commands for the Jr. Reaper.\n#cDouble-click on the item to open the guide.# -4160027 - Pet Command Guide : Porcupine - A guide that has all the commands for the porcupine.\n#cDouble-click on the item to open the guide.# -4160028 - Pet Command Guide : Jr. Reaper - A guide that has all the commands for the pet Jr. Reaper.n#cDouble-click on the item to open the guide.# -4160029 - Pet Command Guide : Snowman - A guide that has all the commands for the Snowman.\n#cDouble-click on the item to open the guide.# -4160031 - Pet Command Guide : Hedgehog - A guide that has all the commands for the pet hedgehog.n#cDouble-click on the item to open the guide.# -4160032 - Pet Command Guide : Skunk - A guide that has all the commands for the Skunk.\n#cDouble-click on the item to open the guide.# -4160033 - Pet Command Guide : Kino - A guide that has all the commands for the pet Kino.n#cDouble-click on the item to open the guide.# -4161000 - Gwin's Diary - A diary that was inside what appears to be Gwin's bag. Can we findout his whereabouts?\n#cDouble-click on the item to open the diary.# -4161001 - Beginner's Guide - A thorough guide for the beginners.\n#cDouble-click on the item to open the book.# -4161002 - Attendance Book - An attendance book that proves you are an honest traveler.\n#cYou can open the book by double clicking the item.# -4161003 - Attendance Book - An attendance book that proves you are an honest traveler.\n#cYou can open the book by double clicking the item.# -4161004 - Attendance Book - A diligent traveler in MapleStory can now prove his/her diligence in traveling through this attendance book. \n#cDouble-click on the item to open the book.# -4161005 - Attendance Book - A diligent traveler in MapleStory can now prove his/her diligence in traveling through this attendance book. \n#cDouble-click on the item to open the book.# -4161006 - Attendance Book - A diligent traveler in MapleStory can now prove his/her diligence in traveling through this attendance book. \n#cDouble-click on the item to open the book.# -4161007 - Attendance Book - A diligent traveler in MapleStory can now prove his/her diligence in traveling through this attendance book. \n#cDouble-click on the item to open the book.# -4161008 - Attendance Book - A diligent traveler in MapleStory can now prove his/her diligence in traveling through this attendance book. \n#cDouble-click on the item to open the book.# -4161009 - Attendance Book - A diligent traveler in MapleStory can now prove his/her diligence in traveling through this attendance book. \n#cDouble-click on the item to open the book.# -4161010 - Attendance Book - A diligent traveler in MapleStory can now prove his/her diligence in traveling through this attendance book. \n#cDouble-click on the item to open the book.# -4161011 - Attendance Book - A diligent traveler in MapleStory can now prove his/her diligence in traveling through this attendance book. \n#cDouble-click on the item to open the book.# -4161012 - Attendance Book - A diligent traveler in MapleStory can now prove his/her diligence in traveling through this attendance book. \n#cDouble-click on the item to open the book.# -4161013 - Leafre Guidebook - A book that details different ways to get to Leafre in Ossyria. \n#cDouble-click on the item to open the book.# -4161014 - Diary of the Goddess - This diary is written by Minerva the Goddess.\n#cDouble-click on the item to read the book.# -4161015 - [Storybook] Burning Book of Fire - A book with a flaming cover. There's nothing written inside. Perhaps Bishop Gritto can help?\nJob : #cArch Mage (Fire/Poison)# -4161016 - [Storybook] Frozen Book of Ice - A book with frozen ice on its cover. There's nothing written inside. Perhaps Bishop Gritto can help?\nJob : #cArch Mage (Ice/Lightning)# -4161017 - Caron's Note - A black notebook with no title or whatsoever. Some of the notes inside were taken by Caron, the sailor sailiing through the River of Death -4161018 - [Storybook] Ancient Book - A strange, blank book with neither a title nor anything written inside it. Wiz the librarian might know something about this book.\nOnly for :#c4th Job Bowman# -4161019 - Sayram's Journey - A book that chronicles the various adventures of Sayram, a legendary Warrior. -4161020 - Story of a Magician - A book that chronicles the life of a magician who, despite showing signs of pure genius, managed to fall in love with banned magic and became a mad magician. -4161021 - [Storybook] Formula for Black Cloud - A book that features the blueprint on the device that creates black clouds, as well as the step-by-step guide to using the device.\nJob : #cShadower# -4161022 - Burning Book of Fire - A book with a flaming cover. Inside, the book features texts on fire magic, as well as some undiscipherable phrases. -4161023 - Frozen Book of Ice - A book with frozen ice on its cover. Inside, the book features texts on ice magic, as well as some undiscipherable phrases. -4161024 - Bowman's Way - A bible for bowmen. It details the way bowmen train, as well as insights on 'Bowman Training Ground'. -4161025 - Road of Bowman - This is a training guideline book for Bowman. It contains how to train Bowman and the story of training field. -4161026 - Road of Bowman - This is a training guideline book for Bowman. It contains how to train Bowman and the story of training field. -4161027 - Road of Bowman - This is a training guideline book for Bowman. It contains how to train Bowman and the story of training field. -4161028 - Road of Bowman - This is a training guideline book for Bowman. It contains how to train Bowman and the story of training field. -4161029 - Road of Bowman - This is a training guideline book for Bowman. It contains how to train Bowman and the story of training field. -4161030 - Book on Herbal Medicine - This book contains formulas of various medicines created by Mr. Do, some more outrageous and questionable than others. If in possession of this book, Mr. Do will create those medicines. -4161031 - Dran's Note - A book written by the missing alchemist, Dran, on his studies. Looking into the book, it doesn't resemble study notes as much as a diary. -4161032 - Dran's Note - A book written by the missing alchemist, Dran, on his studies. Looking into the book, it doesn't resemble study notes as much as a diary. -4161033 - Dran's Note - A book written by the missing alchemist, Dran, on his studies. Looking into the book, it doesn't resemble study notes as much as a diary. -4161034 - Dran's Note - A book written by the missing alchemist, Dran, on his studies. Looking into the book, it doesn't resemble study notes as much as a diary. -4161035 - The Legend of Snail - A book chronicling the history of snails, the creature with the longest life span in Maple World. -4161036 - Song : Twinkle Twinkle Little Star - A book that contains the notes to play beautiful music. This book has the notes of Twinkle Twinkle Little Star. -4170000 - Pigmy Egg - Pigmy of Henesys laid this egg. The egg is so hard and dense that it will simply not break unless using a special tool. -4170001 - Pigmy Egg - Pigmy of Ellinia laid this egg. The egg is so hard and dense that it will simply not break unless using a special tool. -4170002 - Pigmy Egg - Pigmy of Kerning City laid this egg. The egg is so hard and dense that it will simply not break unless using a special tool. -4170003 - Pigmy Egg - Pigmy of Perion laid this egg. The egg is so hard and dense that it will simply not break unless using a special tool. -4170004 - Pigmy Egg - Pigmy of El Nath laid this egg. The egg is so hard and dense that it will simply not break unless using a special tool. -4170005 - Pigmy Egg - Pigmy of Ludibrium laid this egg. The egg is so hard and dense that it will simply not break unless using a special tool. -4170006 - Pigmy Egg - Pigmy of Orbis laid this egg. The egg is so hard and dense that it will simply not break unless using a special tool. -4170007 - Pigmy Egg - Pigmy of Aquarium laid this egg. The egg is so hard and dense that it will simply not break unless using a special tool. -4170009 - Pigmy Egg - An egg laid by Pigmy in Notilus. The egg is so steely strong, that unless a special device is used, this doesn't crack. #cDouble-click it to put it on the incubator.# -4210000 - Moon stone ring - This is a seal of love that you promised to marry someone you love. If you discard it, you break off the engagement. -4210001 - Moon stone ring 2 karat - This is a seal of love that you promised to marry someone you love. If you discard it, you break off the engagement. -4210002 - Moon stone ring 3 karat - This is a seal of love that you promised to marry someone you love. If you discard it, you break off the engagement.. -4210003 - Shining star ring - This is a seal of love that you promised to marry someone you love. If you discard it, you break off the engagement. -4210004 - Shining star ring 2 karat - This is a seal of love that you promised to marry someone you love. If you discard it, you break off the engagement. -4210005 - Shining star ring 3 karat - This is a seal of love that you promised to marry someone you love. If you discard it, you break off the engagement. -4210006 - Gold heart ring - This is a seal of love that you promised to marry someone you love. If you discard it, you break off the engagement. -4210007 - Gold heart ring 2 karat - This is a seal of love that you promised to marry someone you love. If you discard it, you break off the engagement. -4210008 - Gold heart ring 3 karat - This is a seal of love that you promised to marry someone you love. If you discard it, you break off the engagement. -4210009 - Silver wing ring - This is a seal of love that you promised to marry someone you love. If you discard it, you break off the engagement. -4210010 - Silver wing ring 2 karat - This is a seal of love that you promised to marry someone you love. If you discard it, you break off the engagement. -4210011 - Silver wing ring 3 karat - This is a seal of love that you promised to marry someone you love. If you discard it, you break off the engagement. -4211000 - Simple wedding invitation - This is to invite someone to wedding. You can send it by double click. -4211001 - Sweetie wedding invitation - This is to invite someone to wedding. You can send it by double click. -4211002 - Premium wedding invitation - This is to invite someone to wedding. You can send it by double click. -4212000 - Simple wedding invitation - This is to invite someone to wedding. You can send it by double click. -4212001 - Sweetie wedding invitation - This is to invite someone to wedding. You can send it by double click. -4212002 - Premium wedding invitation - This is to invite someone to wedding. You can send it by double click. -4213000 - Love vow - This is a doll contains a love vow of a couple who are engaged. -4213001 - Approval for officiation - This is an approval document that priest Reberto will officiate the couple. -4214000 - Simple wedding receipt - This is a receipt that you got after simple wedding reservation. -4214001 - Sweetie wedding receipt - This is a receipt that you got after sweetie wedding reservation. -4214002 - Premium wedding receipt - This is a receipt that you got after premium wedding reservation. -4220000 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220001 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220002 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220003 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220004 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220005 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220006 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220007 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220008 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220009 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220010 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220011 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220012 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220013 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220014 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220015 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220016 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220017 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220018 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220019 - Flowerpot - Double click on the item to open the UI and it will grow faster with the help of sun. -4220020 - Stumpy's Seedling - A baby seedling from a dead Stumpy. -4220021 - Rag Doll - A doll made out of rag. Double-click it to make a doll out of the skeletal figure. If there comes a time where the doll is not needed, this needs to be returned to Jonas. -4220023 - Fortune Sheet - A sheet that details this year's fortunes on horoscope. -4031993 - Bartos' Favorite Juice - A savory juice that Bartos really likes to drink. -4220045 - Birthday Cake Box - A box that contains the cake commemorating the 5th anniversary of MapleStory. Double-click to see the cake. -4000367 - Recycle Water Bottle - An empty unwanted bottle dropped by Biner. -4000368 - Broken Wing - A fallen broken wing from batoo. -4000369 - Stop Sign - A piece of metal written with a stop word. Dropped by Stopnow. -4000370 - Metal Pole - An piece of extracted metal. It can be found from Stopnow and Nospeed. -4000371 - Speed Limit Sign - A piece of metal indicating speed limitation warning. -4000372 - Fire Extinguisher - Red Fire extinguisher that Freezer stole from CBD buildings. -4000373 - Ink - Octobunny's Ink. So dark but not toxic. -4000374 - Headlight - An old rusty light projector dropped by Trucker. -4000375 - Tires - Mini set of tires. It doesn't seem like it is usuable. -4000376 - Batteries - Car batteries that dropped from Trucker. It seems like it has ran out of power. -4000377 - Small Poop - A tiny stinky poop, relatively small sized. -4000378 - Big Poop - An enormous poop. It is extremely smelly. -4000379 - Green Essence - This Green Essence is extracted from Slimy. It contains a mysterious power. -4000380 - Pink Essence - This Pink Essence is extracted from Pac Pinky. It contains a mysterious power. -4000381 - White Essence - This White Essence is extracted from Mr. Anchor. It contains a mysterious power to unlock the door to secret. -4000382 - Blue Essence - This Blue Essence is extracted from Selkie Jr. It contains a mysterious power. -4000383 - Red Essence - This Red Essence is extracted from Mr. Anchor. It contains mysterious power. -4000384 - Black Essence - The black soul from Capt. Latanica. It seems extremely powerful. -4000385 - Soul Lantern - A mysterious lantern that glows in dark. It is believed that this lantern will produce an incredible power if it is used correctly. -4032133 - Zakum Diamond - (no description) -4032134 - Stone Denari - (no description) -4160034 - Pet Command Guide : Baby Robo - A guide that has all the commands for the Baby Robo.\n#cDouble-click on the item to open the guide.# -4160035 - Pet Command Guide : Blue/Red/Green/Gold Robo - A guide that has all the commands for the Blue/Red/Green/Gold Robo.\n#cDouble-click on the item to open the guide.# -4160036 - Pet Command Guide : Gorilla Robo - A guide that has all the commands for the Gorilla Robo.\n#cDouble-click on the item to open the guide.# -4001232 - White Gift Box - A white gift box that can be found inside the New Year's Lucky Pouch. Bring it to the Game Administrator to receive a gift from the box. -4001233 - Red Gift Box - A red gift box that can be found inside the New Year's Lucky Pouch. Bring it to the Game Administrator to receive a gift from the box. -4001234 - Blue Gift Box - A blue gift box that can be found inside the New Year's Lucky Pouch. Bring it to the Game Administrator to receive a gift from the box. -4001235 - Purple Gift Box - A purple gift box that can be found inside the New Year's Lucky Pouch. Bring it to the Game Administrator to receive a gift from the box. -4032176 - Rascal Snowpiece - A snowpiece dropped by those that are only too eager to spoil Maplemas for everyone. -4300000 - New Year's Card (Send) - A beautiful card with season's greetings. -4301000 - New Year's Card (Receive) - A beautiful card with season's greetings. Double click on it to read! -4032092 - Force of the Spirit - A magical item that contains the magic force of the Snow Spirit. Apparently it contains mystical magic... -4032094 - Snow Vigor - A magical vigor of snow that provides much-needed support to the snowman. Drop this item on the snowman and magical things may happen. -4032095 - Fake Snow Vigor - A magical vigor of snow that provides much-needed support to the snowman. Drop this item on the snowman and magical things may happen. -4032091 - A Secret Note - A secret note writen by Snow Spirit of Happyville for Alcaster. -4160037 - Pet Command Guide : Crystal Rudolph - A guide that has all the commands for the Crystal Rudolph.\n#cDouble-click on the item to open the guide.# -4032233 - Maple Necklace Chain - This can be used to create the Mind of Maple Necklace. -4032239 - Piece of Mind of Maple - A piece of Mind of Maple given by Chief Stan -4032247 - Richard's Letter - A love letter written by Richard. Needs to be delivered to Angelique of Amoria... -4160039 - Pet Command Guide : White Duck - A guide that has all the commands for the pet white duck.\n#cDouble-click on the item to open the guide.# -4032119 - MV's Sabre - A shining sabre of MV, hidden deep in the treasure dungeon. -4032118 - A secret letter - A secret letter that contains information about the traitorous MV. Needs to be delivered to Charles the Adventurer. -4032248 - Map to MV's Lair - (no description) -4000487 - Shadow Meso - (no description) -4001256 - Primal Claw - A symbolic weapon of Thief mastery. Although it can't be equipped, its power is palpable. This item must be placed in the Altar of Mastery to activate it. -4000443 - Cracked Hourglass - Cracked hourglass. It looks broken but it still functions. -4000444 - Green Cloth - A piece of clothing from the Memory Monk. -4000445 - Green Cone Hat - Hat worn by the Memory Monk Trainee -4000446 - Smiley Mask - A mask made from a smiley face. -4000447 - Green Helmet - Helmet worn by the Memory Guardian -4000448 - Green Heart - Heart of the Chief Memory Guardian -4000449 - Blue Cloth - A piece of clothing from the Qualm Monk -4000450 - Blue Cone Hat - Hat worn by the Qualm Monk Trainee. -4000451 - Neutral Mask - A mask made from an expressionless face. -4000452 - Blue Helmet - Helmet worn by the Qualm Guardian -4000453 - Blue Heart - Heart of the Chief Qualm Guardian -4000454 - Red Cloth - A piece of clothing from the Oblivion Monk. -4000455 - Red Cone Hat - Hat worn by the Oblivion Monk Trainee. -4000456 - Frowny Mask - A mask made from a frowny face. -4000457 - Red Helmet - It's a helmet that an Oblivion Guardian was wearing. -4000458 - Red Heart - Heart of the Chief Oblivion Guardian. -4000459 - Black Armor Fragment - A piece of the armor that was covering the guardian's shoulder. -4000460 - Whale's Helmet - Helmet worn by Dodo, the Whale of Time. -4000461 - Knight's Mask - Mask worn by Lilynouch, the Ice Knight. -4000462 - Guardian's Horn - Guardian Lyka's horn. -4001176 - Shovel - A small shovel with a short handle for easier shoveling. -4001177 - White Crewneck Shirt - A plain, white cotton shirt. -4001178 - Beach Sandals - A pair of sandals perfect for walking around the beach on a hot summer day. -4001179 - Water Gun for Training - It looks exactly like the Laser Gun, but it's a water gun, making it an optimal weapon for training. -4001180 - Gloves for Outside - A durable pair of gloves perfect for outside. -4001181 - Mittens - A warm, red furry pair of mittens. -4001182 - Clean Mop - A clean mop that hasn't been used yet. -4001183 - Training Uniform - A white training uniform featuring a red belt. The uniform lets in air and is very light, so the students won't pass out training under the sun. -4001184 - Durable Rake - A metal rake used to rake the farm. -4001185 - Warm Fur Boots - A pair of warm fur boots that goes up to the ankle. -4001186 - King's Turban - A special turban ordered by Abdullah VIII. Very fancy, to say the least. -4001190 - Blackhole Marble - Inside a clear marble, there is a black hole like figure swirling around. -4001191 - Excellent Agent Badge - A badge that is given to an agent who accomplishes their mission with excellence. -4001192 - Intelligence Document - Intelligence document that contains investigations regarding Master M and party quest monsters. -4001193 - Transparent Item for Lightning - A transparent item for lightning expressions. -4001198 - Altaire Fragment - This is given to those who save Altaire Camp from Forest of Poison Haze. -4020009 - Piece of Time - A raw ore of a gem that contains the power of time. -4021010 - Rock of Time - A fascinating gem that contains the power of time. -4031988 - Special Agent Badge - Item Agent O asked me to retrieve. I should take it back to Agent O. -4031991 - Timer's Egg - This is Timer's egg. It's too hard to crack. Ghosthunter Bob must know what to do with this. -4031992 - Springy Worm - This little worm lives in Ludirium. It's so small it's not at all threatening. -4031999 - Master M's Direction Scroll - Directions believed be written by Master M. -4032000 - Master M's Order Scroll - An order believed to be written by Master M. -4032001 - Master M's Command Scroll - A command believed to be written by Master M. -4032002 - Marble of Chaos - This marble was created by Temple Keeper. It can break the barrier with the chaotic power within. -4032086 - Mysterious Small Egg - A Fairy with a luscious purple hair said something that's hard to understand, then left a mysterious, small egg in the pocket. Can't figure out what this egg really is, but the Fairy may help identify the egg. -4161037 - A Guide to Using the Maker Skill - [Maker] This is a guide to help you use the Maker Skill. -4161042 - Santa Encyclopedia No.6 - Santa Encyclopedia that explains about the Santa village of Finland.\n#cDouble click on the item to open the book. -4161044 - Cygnus Knight's Book Volume 1 - A recording of the conversation I had with the book containing Cygnus' thoughts. -4161045 - Cygnus Knight's Book Volume 2 - A recording of the conversation I had with the book containing Cygnus' thoughts. -4161046 - Cygnus Knight's Book Volume 3 - A recording of the conversation I had with the book containing Cygnus' thoughts. -4220046 - Timer's Egg - This is Timer's egg. If you look closely in the half cracked shell, you'll see a baby Timer with wet feathers. -4280000 - Gold Box - A gold treasure chest dropped by a monster. This can be opened with the Gold Master Key available at the Cash Shop. If you already have the Master Key, just double-click the box to open it. -4280001 - Silver Box - A silver treasure chest dropped by a monster. This can be opened with the Silver Master Key available at the Cash Shop. If you already have the Master Key, just double-click the box to open it. -4220074 - Birthday Cake Box - A box that contains the cake commemorating the 4th anniversary of MapleStory. Double-click to see the cake. -4032306 - Yellow Birthday Candle - A candle Cody was looking for. -4032307 - Blue Birthday Candle - A candle Cody was looking for. -4032308 - Pink Birthday Candle - A candle Cody was looking for. -4032096 - Proof of Exam - The Proof of Exam used for the Knighthood Exam. Take it over to Mihile, and you will be acknowledged as a legitimate knight. -4032097 - Proof of Exam - The Proof of Exam used for the Knighthood Exam. Take it over to Oz, and you will be acknowledged as a legitimate knight. -4032098 - Proof of Exam - The Proof of Exam used for the Knighthood Exam. Take it over to Irena, and you will be acknowledged as a legitimate knight. -4032099 - Proof of Exam - The Proof of Exam used for the Knighthood Exam. Take it over to Eckhart, and you will be acknowledged as a legitimate knight. -4032100 - Proof of Exam - The Proof of Exam used for the Knighthood Exam. Take it over to Hawkeye, and you will be acknowledged as a legitimate knight. -4032101 - The Lost Treasure - The lost treasure that was stolen by the Master of Disguise who brazenly entered Ereve. Let's take it back to Mihile. -4032102 - The Lost Treasure - The lost treasure that was stolen by the Master of Disguise who brazenly entered Ereve. Let's take it back to Oz. -4032103 - The Lost Treasure - The lost treasure that was stolen by the Master of Disguise who brazenly entered Ereve. Let's take it back to Irena. -4032104 - The Lost Treasure - The lost treasure that was stolen by the Master of Disguise who brazenly entered Ereve. Let's take it back to Eckhart. -4032105 - The Lost Treasure - The lost treasure that was stolen by the Master of Disguise who brazenly entered Ereve. Let's take it back to Hawkeye. -4000209 - Co-ke Slime’s Bell - The bell of Co-ke Slime that has been taken off. -4000210 - Co-ke Pig’s Ribbon - A piece of Co-ke Pig’s ribbon. -4000211 - Coca-Cola Cube - A cube with a drawing of a Coca-Cola bottle on it. -4000212 - CokePLAY Cube - A cube with the CokePLAY symbol. -4000213 - Coca-Cola Card - A card with a drawing of Coca-Cola. -4000214 - Coca-Cola Gem - A red gem with a Coca-Cola logo engraved on it. -4000216 - Coca-Cola Can - An empty can that had been filled with the sweet and tangy Coca-Cola. -4000217 - Coca-Cola Light Can - An empty can that had been filled with Coke Light, a drink with zero calories. -4000218 - Ice Shell - A turtle shell shaped like an igloo that is made of ice. -4000219 - Coke Ice Block - A block that had been part of the hard body of a Coke Golem. It looks like frozen Cola. -4000220 - Ice Block - A block that had been part of the hard body of an Ice Golem. -4000221 - Coke Bottle Lid - A bottle lid that a Coke Mushroom used to wear on its head. -4001142 - Henesys - Henesys -4001143 - Elinia - Elinia -4001144 - Perion - Perion -4001145 - Kerning City - Kerning City -4001146 - Lith Harbor - Lith Harbor -4001148 - Sleepywood - Sleepywood -4001149 - Aquarium - Aquarium -4001150 - Baekcho Village - Baekcho Village -4001151 - Happy Valley - Happy Valley -4001152 - Ariant - Ariant -4001153 - Magatia - Magatia -4031832 - Sophelia’s Portrait - A portrait of Sophelia. -4031833 - Pumpkin Juice - A juice made with pumpkin. It is very fragrant. -4031834 - Perfect Tool - The most perfect tool for making dolls. -4031835 - Lyudmilla’s Earring - The earrings that Lyudmilla lost. They shine with brilliance. -4031836 - Score - The score that Lyudmilla asked for. No one knows what kind of music is in it. -4031837 - Dumped Doll - A doll that Sophelia used to cherish a long time ago. She threw it away when she got a new doll. -4031838 - Piece of Cloth - A small piece of cloth. If you drag and drop it onto the rag doll, the doll will be completed bit by bit. -4000482 - Tino's Feather - Tino's feather that is as light as a flowerseed. -4000483 - Tiv's Feather - Tiv's Feather. So light, I was concerned it might just blow away. -4000484 - Timu's Feather - Timu's Feather. Still very soft in texture. -4000485 - Tiru's Feather - Tiru's Feather. A combination of numerous light Tiru's feathers. -4000486 - Tiguru's Feather - Tiguru's Feathers that are so soft and slick, one can make a pillow out of it. -4001174 - Practice Shoes - The most basic form of shoes for practice. -4001175 - Kid Shoes - Adorable cute shoes that are obviously only for dids. -4001187 - Beltin - A mysterious fish that allows one to sing well and in tune after eating it. -4001188 - Breakin - A mysterious fish that allows one to rock the dance floor after eating it. -4001189 - Poppin - A mysterious fish that allows one to sing well and in rhythm after eaten it. -4001197 - Bluish Mineral - A mineral featuring bluish color -4001199 - Straw - A warm set of straws used to make a bird's nest. Gather them all up, and bring them together and show them to Gaga. -4001201 - Funny Travel Stories - A tape that contained all the fun adventure stories recorded while on the road. -4001202 - Top 10 Pop Star Hits - A tape that only contained the lastest from radio and tv. -4001203 - Manji's Ragged Diary - An old, ragged diary that includes the war stories of Manji in Perion. Let's return it to the Maple Admin. -4001204 - Gwin's Travel Stories - A collection of travel storries that Gwin wrote. Need to hand it back to the Maple Admin. -4001205 - Ericsson's Travel Stories - A handwritten, gripping account of Ericsson's days as an explorer. -4001207 - Black Scale - A scale that's slightly dyed in black. Something doesn't seem right with this. -4001213 - Strange Mark - A mysterious-looking mark. -4001214 - Richie Gold - Golden Key - A key that leads to Richie Gold's treasure storage. Entering this storage alone requires 3 keys. \n#cRelated Quest:Richie Gold's Maze -4001215 - Whatever Charm - A charm that lets one skip a mission. -4001216 - Diamond Mark - It's a diamond mark. -4001217 - Heart Mark - It's a diamond mark. -4001218 - Space Mark - It's a space mark. -4001219 - Clover Mark - It's a clover mark. -4001237 - Slightly Polluted Rock - This rock has a slight hint of that unmistakable force of darkness. -4001238 - Polluted Rock - This rock really has the force of Black Mage stored in it. -4001239 - Heavily Polluted Rock - This rock contains a powerful force of Black Mage stored in it. -4001240 - Polluted Item - A piece of rock that has been irreparable damaged because of the force of the Black Mage. -4007000 - Magic Powder (Brown) - A brown Magic Powder used to create armors. -4007001 - Magic Powder (White) - A white Magic Powder used to create armors. -4007002 - Magic Powder (Blue) - A blue Magic Powder used to create armors. -4007003 - Magic Powder (Green) - A green Magic Powder used to create armors. -4007004 - Magic Powder (Yellow) - A yellow Magic Powder used to create armors. -4007005 - Magic Powder (Purple) - A purple Magic Powder used to create armors. -4007006 - Magic Powder (Red) - A red Magic Powder used to create armors. -4007007 - Magic Powder (Black) - A black Magic Powder used to create armors. -4031963 - Eel's Half Pendant - A pendant that Eels carries with, with a broken jewel on the pendant. -4031964 - Piece of Pendant - The other half of Eels's necklace. A perfect tft it with Eels's pendant. -4031965 - Eel's Pendant - Eels's pendant that is finally seeing its original night of day. It looks like it might have some mysterious power in it. -4031966 - Practice Shoes Order Form - Order : Keol\nItem : Practice Shoes\nUnits : 1\nUsage : For Test -4031967 - Kids' Shoes Order Form - Order : Keol\nItem : Kids' Shoes\nUnits : 1\nUsage : Gift -4031968 - Work Shovel Order Form - Order : Manager Karl\nItem : Shovel for work\nUnits : 10\nUsage : Restoring Eos Tower -4031969 - White Cotton Shirt Order Form - Order : Maple Admin\nItem : White Cotton Shirt\nUnits : 100\nUsage : For Beginners -4031970 - Beach Sandals Order Form - Order : Valen\nItem : Beach Sandals\nUnits : 5\nUsage : Store -4031971 - Training Gun Order Form - Order : General Maester\nItem : Training Gun\nUnits : 7\nUsage : For soldier trainees -4031972 - Outdoor Gloves Order Form - Order : Keol\nItem : Outdoor Gloves\nUnits : 1\nUsage : Personal -4031973 - Mittens Order Form - Order : Cliff\nItem : Mittens\nUnits : 1\nUsage : Personal -4031974 - Clean Mop Order Form - Order : Kyrin\nItem : Clean Mop\nUnits : 6\nUsage : To clean the deck -4031975 - Training Uniform Order Form - Order : No Gong\nItem : Training Uniform\nUnits : 30\nUsage : Worn during training -4031976 - Strong Rake Order Form - Order : Chil Sung, Chil Name\nItem : Solid, Strong Rake\nUnits : 2\nUsage : Farming, raking -4031977 - Fur Boots Order Form - Order : Nanuke\nItem : Warm Fur Boots\nUnits : 1\nUsage : Personal -4031978 - King's Turban Order Form - Order : Abdullah VIII\nItem : King's Turban\nUnits : 1\nUsage : Personal -4031979 - Doodly Paper - A piece of paper with illegible doodling on it.\n#Mix gold and iron in the ratio of 6:2, then cover it with wisdom and courage stored in Lithium.# Then... -4031980 - Gold Anvil - An anvil that glows in gold. -4032035 - A Lost Snipe - A Snipe that has lost her way. Take her and move up to a high point, where she can use the launch pad-like area to try to fly her way back home. -4032036 - Special Ticket to the Moon - As long as you have this with you, the Moon Bunny will give you the Sweet Rice Cake 5 times a day. -4032037 - Beef Slice - A single slice of beef. Marinate it, then grill it to try to make the Fire Grill Skewer. -4032038 - Dry Mushroom - A single slice of dried mushroom. Mix it with some seasoning to make a Fire Grill Skewer. -4032039 - Whole Bellflower - A whole bellflower that can be used as part of the Fire Grill Skewer if soaked in salt water -4032040 - Fire Grill Skewer Dish - Simply a Fire Grill Skewer placed on a pretty dish. Nothing says Thank You quite like a nice dish of Fire Grill Skewer. -4032041 - Moon Flower - A beautiful flower that apparently only grows on the moon. Constantly glitters, thanks to all that moonlight it's been soaking up. -4032042 - 1st Moon Photo Piece - The first piece of photo of the moon. Collect the other two, and it'll turn into a photo of a beautiful full moon. Place the pictures inside the envelope to make sure they don't rip. -4032043 - 2nd Moon Photo Piece - The second piece of photo of the moon. Collect the other two, and it'll turn into a photo of a beautiful full moon. Place the pictures inside the envelope to make sure they don't rip. -4032044 - 3rd Moon Photo Piece - The third piece of photo of the moon. Collect the other two, and it'll turn into a photo of a beautiful full moon. Place the pictures inside the envelope to make sure they don't rip. -4032066 - Baby Bird Feather - A soft feather presumably from a baby bird. Gaga will definitely like this. -4032083 - Ludmilla's Photo Albm - Ludmilla's Family Photo Albm -4032084 - Sophilia's Perfect Doll - A perfect Sophilia Doll made by Jonas -4032085 - Peto Doll - A doll that has the ability to transform into Peto. -4032087 - Lucky White Monkey Doll - A white monkey doll that is considered a lucky charm. Whether it really brings good luck remains to be seen. -4032088 - Ludmilla's Photo Albm - Ludmilla's Family Photo Albm -4032115 - Neinheart's Letter - A letter of introduction from Neinheart. Hand this to Kiridu the Mount Trainer, and you'll learn to ride a Mount available exclusively to the knights. -4032116 - Kiridu's Letter - A letter of introduction from Kiridu. Hand this to Kenta of Aquarium, and you'll receive a saddle for your Mount. -4032117 - Kenta's Special Supplements - A special form of supplements concocted by Kenta. -4032120 - Proof of Qualification - The Proof of Qualification that is required to learn a new skill. This proof signifies that you are ready to learn a new skill. -4032121 - Proof of Qualification - The Proof of Qualification that is required to learn a new skill. This proof signifies that you are ready to learn a new skill. -4032122 - Proof of Qualification - The Proof of Qualification that is required to learn a new skill. This proof signifies that you are ready to learn a new skill. -4032123 - Proof of Qualification - The Proof of Qualification that is required to learn a new skill. This proof signifies that you are ready to learn a new skill. -4032124 - Proof of Qualification - The Proof of Qualification that is required to learn a new skill. This proof signifies that you are ready to learn a new skill. -4032125 - Proof of Ability - The Proof of Ability that is required to learn a new skill. This proof signifies that you are ready to learn a new skill. -4032126 - Proof of Ability - The Proof of Ability that is required to learn a new skill. This proof signifies that you are ready to learn a new skill. -4032127 - Proof of Ability - The Proof of Ability that is required to learn a new skill. This proof signifies that you are ready to learn a new skill. -4032128 - Proof of Ability - The Proof of Ability that is required to learn a new skill. This proof signifies that you are ready to learn a new skill. -4032129 - Proof of Ability - The Proof of Ability that is required to learn a new skill. This proof signifies that you are ready to learn a new skill. -4032130 - Pig Doll - An adorable doll that resembles a pig. However, something doesn't seem right… -4032131 - Pig Doll - An adorable doll that resembles a pig. However, something doesn't seem right… -4032132 - Roca's Mission Report - A mission report written by Roca, the Agent for Henesys. This compiles a list of events that have taken place recently. -4032136 - Bubbling Doll - An adorable doll that was designed based on Bubbling, but something doesn't seem right. The way it smiles just seems a bit off, as if it has hidden agenda. -4032137 - Bubbling Doll - An adorable doll that was designed based on Bubbling, but something doesn't seem right. The way it smiles just seems a bit off, as if it has hidden agenda. -4032138 - Bubbling Doll - An adorable doll that was designed based on Bubbling, but something doesn't seem right. It's in…tears. -4032139 - Old Key - An old, rusty key that Mr. Pickall has been looking for. -4032140 - Bubbling Doll - An adorable doll that was designed based on Bubbling, but something doesn't seem right. It's in…tears. -4032141 - Mattias' Mission Report - A mission report written by Roca, the Agent for Kerning City. This compiles a list of events that have taken place recently. -4032142 - Clear Tree Sap - A clear tree sap that can only be found at the very top of the skyscraping trees. Accompanied by the freshest green scent. -4032143 - Fruit - A fruit picked from plants near Henesys. -4032144 - Hersha's Mission Report - A mission report written by Hersha, the Agent for Ellinia. This compiles a list of events that have taken place recently. -4032145 - Detector - A detector made to detect any forces of darkness. Take this to the 10 Boogies. -4032146 - Wooden Mask Doll - An adorable doll modeled after the Wooden Mask, but something doesn't seem right… -4032147 - Rocky Mask Doll - An adorable doll modeled after the Stone Mask, but something doesn't seem right… -4032148 - Detector - A detector created with the sole purpose of detecting the Puppeteer's movements. We put it to good use, so let's return it to Neinheart. -4032149 - 10 Boogies' Mission Report - A mission report written by 10 Boogies, the Agents for Perion. This compiles a list of events that have taken place recently. -4032178 - Hack Attempt - A record that shows that Chief Grays tried to hack into the system. -4032179 - Ereve Investigation Permit - A permitt that allows one to investigate every part of Ereve. When the Red Alert is on, this permit is the only way you can roam freely around Ereve. -4032190 - Orange Mushroom Doll - An adorable doll modeled after the Orange Mushroom, but something doesn't seem right… -4032196 - Concentrated Formula: Step 1 - A formula concentrated with effective and potent ingredients. The first formula used to raise Mimiana and Mimio -4032197 - Concentrated Formula: Step 2 - A formula concentrated with effective and potent ingredients. The second formula used to raise Mimiana and Mimio. -4032198 - Concentrated Formula: Step 3 - A formula concentrated with effective and potent ingredients. The third formula used to raise Mimiana and Mimio. -4032206 - Ellinia Alpine Plants - Plants that only grow in Ellinia. They closely resemble fernbrakes. -4032208 - Neinheart's Letter - A letter of introduction from Neinheart. Give this to Kiridu the Mount Trainer, and you'll learn to ride a Mount available exclusively to the knights. -4130018 - Armor Production Stimulator - Use this when making a headgear to change the item option. Beware that this also carries a 10% risk of ruining the item production. -4130019 - Topwear Production Stimulator - Use this when making a topwear to change the item option. Beware that this also carries a 10% risk of ruining the item production. -4130020 - Bottomwear Production Stimulator - Use this when making a bottomwear to change the item option. Beware that this also carries a 10% risk of ruining the item production. -4130021 - Overall Production Stimulator - Use this when making an overall to change the item option. Beware that this also carries a 10% risk of ruining the item production. -4130022 - Shield Production Stimulator - Use this when making a shield to change the item option. Beware that this also carries a 10% risk of ruining the item production. -4220067 - Moon - An envelope used to contain a picture of the moon. Made out of durable paper that will not rip as a result of shock caused by jumping. Once you acquire a piece of the moon photo, double-click on it to open the envelope, then drag the piece of photo into it. -4220137 - Mimiana Egg - An egg of Mimiana, the Mount for knights. Watch the egg grow into a full-grown Mimiana by sharing your experiences with it. Once it matures into a full-grown creature, take it to Kiridu the Mount Trainer. -4220138 - Glass Incubator - A glass incubator where Mimiana is stored. Drag the food into the incubator to feed Mimiana. Once it matures, take it back to Kiridu the Mount Trainer. -4220139 - Mimiana Egg - An egg of Mimiana, the Mount for knights. Watch the egg grow into a full-grown Mimiana by sharing your experiences with it. Once it matures into a full-grown creature, take it to Kiridu the Mount Trainer. -4220145 - Mimiana Egg - An egg of Mimiana, the Mount for knights. Watch the egg grow into a full-grown Mimiana by sharing your experiences with it. Once it matures into a full-grown creature, take it to Kiridu the Mount Trainer. -4220146 - Mimiana Egg - An egg of Mimiana, the Mount for knights. Watch the egg grow into a full-grown Mimiana by sharing your experiences with it. Once it matures into a full-grown creature, take it to Kiridu the Mount Trainer. -4250000 - Basic Diamond - A jewel used primarily for item-production.\nWeapon ATT+1 -4250001 - Intermediate Diamond - A jewel used primarily for item-production.\nWeapon ATT+2 -4250002 - Advanced Diamond - A jewel used primarily for item-production.\nWeapon ATT+3 -4250100 - Basic Sapphire - A jewel used primarily for item-production.\nMagic ATT+1 -4250101 - Intermediate Sapphire - A jewel used primarily for item-production.\nMagic ATT+2 -4250102 - Advanced Sapphire - A jewel used primarily for item-production.\nMagic ATT+3 -4250200 - Basic Garnet - A jewel used primarily for item-production.\nAccuracy+2 -4250201 - Intermediate Garnet - A jewel used primarily for item-production.\nAccuracy+3 -4250202 - Advanced Garnet - A jewel used primarily for item-production.\nAccuracy+5 -4250300 - Basic Opal - A jewel used primarily for item-production.\nAvoidability+2 -4250301 - Intermediate Opal - A jewel used primarily for item-production.\nAvoidability+3 -4250302 - Advanced Opal - A jewel used primarily for item-production.\nAvoidability+5 -4250400 - Basic Amethyst - A jewel used primarily for item-production.\nSpeed+2 -4250401 - Intermediate Amethyst - A jewel used primarily for item-production.\nSpeed+3 -4250402 - Advanced Amethyst - A jewel used primarily for item-production.\nSpeed+5 -4250500 - Basic AquaMarine - A jewel used primarily for item-production.\nJump+1 -4250501 - Intermediate AquaMarine - A jewel used primarily for item-production.\nJump+2 -4250502 - Advanced AquaMarine - A jewel used primarily for item-production.\nJump+3 -4250600 - Basic Topaz - A jewel used primarily for item-production.\nMaxHP+10 -4250601 - Intermediate Topaz - A jewel used primarily for item-production.\nMaxHP+20 -4250602 - Advanced Topaz - A jewel used primarily for item-production.\nMaxHP+30 -4250700 - Basic Emerald - A jewel used primarily for item-production.\nMaxMP+10 -4250701 - Intermediate Emerald - A jewel used primarily for item-production.\nMaxMP+20 -4250702 - Advanced Emerald - A jewel used primarily for item-production.\nMaxMP+30 -4250800 - Basic Power Crystal - A jewel used primarily for item-production.\nSTR+2 -4250801 - Intermediate Power Crystal - A jewel used primarily for item-production.\nSTR+3 -4250802 - Advanced Power Crystal - A jewel used primarily for item-production.\nSTR+5 -4250900 - Basic Wisdom Crystal - A jewel used primarily for item-production.\nINT+2 -4250901 - Intermediate Wisdom Crystal - A jewel used primarily for item-production.\nINT+3 -4250902 - Advanced Wisdom Crystal - A jewel used primarily for item-production.\nINT+5 -4251000 - Basic LUK Crystal - A jewel used primarily for item-production.\nLUK+2 -4251001 - Intermediate LUK Crystal - A jewel used primarily for item-production.\nLUK+3 -4251002 - Advanced LUK Crystal - A jewel used primarily for item-production.\nLUK+5 -4251100 - Basic DEX Crystal - A jewel used primarily for item-production.\nDEX+2 -4251101 - Intermediate DEX Crystal - A jewel used primarily for item-production.\nDEX+3 -4251102 - Advanced DEX Crystal - A jewel used primarily for item-production.\nDEX+5 -4251200 - Basic Secret Crystal - A jewel used primarily for item-production.\nRequired Level -1 -4251201 - Intermediate Secret Crystal - A jewel used primarily for item-production.\nRequired Level -2 -4251202 - Advanced Secret Crystal - A jewel used primarily for item-production.\nRequired Level -3 -4251300 - Basic Black Crystal - A jewel used primarily for item-production.\nThere's no way to tell how the item will turn out with this. -4251301 - Intermediate Black Crystal - A jewel used primarily for item-production.\nThere's no way to tell how the item will turn out with this. -4251302 - Advanced Black Crystal - A jewel used primarily for item-production.\nThere's no way to tell how the item will turn out with this. -4251400 - Basic Dark Crystal - A jewel used primarily for item-production.\nThere's no way to tell how the item will turn out with this. -4251401 - Intermediate Dark Crystal - A jewel used primarily for item-production.\nThere's no way to tell how the item will turn out with this. -4251402 - Advanced Dark Crystal - A jewel used primarily for item-production.\nThere's no way to tell how the item will turn out with this. -4260000 - Basic Monster Crystal 1 - A Monster Crystal that was formed by combining the droppings of monsters on level 31 ~ 50. -4260001 - Basic Monster Crystal 2 - A Monster Crystal that was formed by combining the droppings of monsters on level 51 ~ 60. -4260002 - Basic Monster Crystal 3 - A Monster Crystal that was formed by combining the droppings of monsters on level 61 ~ 70. -4260003 - Intermediate Monster Crystal 1 - A Monster Crystal that was formed by combining the droppings of monsters on level 71 ~ 80. -4260004 - Intermediate Monster Crystal 2 - A Monster Crystal that was formed by combining the droppings of monsters on level 81 ~ 90. -4260005 - Intermediate Monster Crystal 3 - A Monster Crystal that was formed by combining the droppings of monsters on level 91 ~ 100. -4260006 - Advanced Monster Crystal 1 - A Monster Crystal that was formed by combining the droppings of monsters on level 101 ~ 110. -4260007 - Advanced Monster Crystal 2 - A Monster Crystal that was formed by combining the droppings of monsters on level 111 ~ 120. -4260008 - Advanced Monster Crystal 3 - A Monster Crystal that was formed by combining the droppings of monsters on level 121 ~ 130. -4000508 - Miwok Artifact - An artifact in which the Miwok tribe has sealed their treasure. Purchase an Enchanted Scroll at the Cash Shop in order to release the seal and retrieve the treasure, and take it to NPC Toh Relicseeker. -4000509 - Old Tree Branch of the Wise One - The Old Tree Branch that the Wise One from the Miwok tribe used to predict the future. Kopee Relicseeker says she can make the legendary ring using the tree branch. -4000510 - Bluejay Feather of the Wise One - The Bluejay Feather that the Wise One from the Miwok tribe used to predict the future. Kopee Relicseeker says she can make the legendary ring using the feather. -4000511 - Red Bird Feather of the Wise One - The Red Bird Feather that the Wise One from the Miwok tribe used to predict the future. Kopee Relicseeker says she can make the legendary ring using the feather. -4000512 - Cat Eye of the Brave One - The cat eye with which the Brave One from the Miwok tribe equipped himself in battles. Kopee Relicseeker says she can make the legendary ring using the cat eye. -4000513 - Buffalo Horns of the Brave One - The buffalo horn with which the Brave One from the Miwok tribe equipped himself in battles. Kopee Relicseeker says she can make the legendary ring using the horn. -4000514 - Puma Bones of the Brave One - The puma bone with which the Brave One from the Miwok tribe equipped himself in battles. Kopee Relicseeker says she can make the legendary ring using the puma bones. -4032404 - Miwok Artifact Piece - A piece that appears to be a fragment of the Miwok Artifact. -4001254 - Shiny Maple Coin - An octagonal gold coin with a maple mark. The Shiny Maple Coins can be traded for items from Spiegelmann. -4000515 - Aramia's Book - Aramia's Book-Drive Book -4160040 - Pet Guide : Pink Bean - A guide that has all the commands for the Pink Bean.\n#cDouble-click on the item to open the guide.# -4032246 - Spirit of Fantasy Theme Park - Very important key item to save Fantasy Theme Park from monsters' threat. -4000469 - Scarf - Must have fashion item. -4000470 - Tall Hat - Victorian silk hat. -4000471 - Rodeo's Master - Master of a Rodeo -4000472 - Charmer's Flute - Deadly weapon of Charmer. -4000473 - Dented Barrel - Dented wooden barrel soaked with oil. -4000474 - Lucky Hat - Cute little hat that Froscola loves to wear. -4000475 - Lucky Bus Ticket - Bus ticket that can take you to the city. -4000476 - Toy Plane - Cute little toy plane, perfect as a gift for children. -4000477 - Viking Helmet - Nice sturdy Viking style helmet. -4000478 - Wooden Pony Tail - Wooden tail of Gallopera. -4001242 - Scarlion Boss's Foot - Scarlion Boss's magical foot. -4001241 - Targa's Foot - Targa's magical foot. -4000465 - Coconut Husk - Coconut husk that Chlorotrap had left. -4000466 - Rebab - Traditional musical instrument of Malaysia. -4000467 - Yellow Wig - Silky and shiny hair of Dark Fission. -4000468 - Somebody's Tire - A tire that Oly Oly stole from someone. -4001245 - Pigmy's Golden Egg - Pigmy's Golden Egg. It can only be hatched by a fairy from a fairytale. -4001246 - Warm Sunlight - Drop the Warm Sunlight in front of the Bean Stalk to make it grow. -4001247 - Story Treasure Box - A Treasure Box hidden in the Dungeon. -4001255 - Golden Pig's Hard Egg - It's too hard to open. It may be a good idea to bring it to Goldrich. -4001261 - Piece of Balrog Leather - A piece of leather from a Balrog's rough hide. -4001263 - Fine Wool - This wool is fine. -4001264 - Shepherd Boy's Lunch. - This is a Shepherd Boy's Lunch. Collect and deliver them to the Lamb. You can get a reward when you win. -4001268 - Brown Krypto Crystal - A Brown Krypto Crystal containing the mysterious energies of space. -4001269 - Emerald Krypto Crystal - An Emerald Krypto Crystal containing the mysterious energies of space. -4001270 - Warm-hearted Child's Note - An item that is falsely rumored to be only visible to warm-hearted children. Take it to Cassandra. -4001271 - Lost Child - A child that is lost. -4001272 - Giant Nependeath Seed - A seed from a Giant Nependeath. It's very big. -4001300 - Granada - A captivating single rose loved by the Witch. -4001301 - Gaga's Excavation Permit - A permit that allows one to dig up relics. Talk to Gaga to receive another permit. -4001302 - Valuable Artifact - A relic that looks very rare. -4001303 - Petrified Mouse - The first of 8 treasures mentioned by Shuang. -4001304 - Gaga's Glasses - The second of 8 treasures mentioned by Shuang. -4001305 - Cassandra's Crystal Ball - The third of 8 treasures mentioned by Shuang. -4001306 - The Shiny Watch - The fourth of 8 treasures mentioned by Shuang. -4001307 - A Soccer Cleat - The fifth of 8 treasures mentioned by Shuang. -4001308 - The Quest Completion Book - The sixth of 8 treasures mentioned by Shuang. -4001309 - A Pretty Hair-Tie - The seventh of 8 treasures mentioned by Shuang. -4001310 - An Old Shoe - The last of 8 treasures mentioned by Shuang. -4001311 - Ancient Relic - A relic that appears to be very old. -4001316 - Cassandra's Album - A photo album filled with Cassandra's baby pictures. -4032250 - Mysterious Piece of Paper - A piece of paper filled with mysterious scribbles. It looks like an item lost by Mu Young, Manji's apprentice. Take it to Mu Young. -4032262 - Mu Young's Message - A letter that Mu Young asked you to deliver to Manji, his teacher. You must deliver it to Manji in Perion. -4032263 - Shaman Charm - A Charm given to you by Chrishrama to be placed on a Shaman Rock. It is said that it contains energies that can chase away evil. -4032264 - Spring Flower Seed - A seed that grows into a Spring Flower. -4032265 - Spring Flower Petal - The petals that make up the Spring Flower. -4032266 - Dazzling Sunlight - Dazzling sunlight filled with the feeling of spring. -4032267 - Building Stone - A hard building stone that came out of a box. Looks suitable for making a chair. -4032268 - Drape - A drape that came out of a box. Looks suitable for making a chair. -4032269 - Noblesse Certificate - A certificate proving that you've learned the basic controls for the game. You must show it to Empress Cygnus. -4032270 - Glistening Sunlight - Glistening sunlight filled with the feeling of spring. -4032271 - Pure Small Sprout - A fragrant new sprout filled with the energies of spring. Used as an ingredient for Pure Perfume. -4032272 - Stationery of Longing - Pink stationary that's rumored to return a favorable response if used to send a letter to a secret crush. -4032273 - Pencil of Courage X 10 - A pencil that's used to write things you don’t have the courage to say. -4032275 - Pure Normal Sprout - A fragrant new sprout filled with the energies of spring. Used as an ingredient for Pure Perfume. -4032276 - Pure Sprout - A fragrant new sprout filled with the energies of spring. Used as an ingredient for Pure Perfume. -4032277 - Pure Large Sprout - A fragrant new sprout filled with the energies of spring. Used as an ingredient for Pure Perfume. -4032278 - Stationery of Deep Longing - Pink stationary that's rumored to return a favorable response if used to send a letter to a secret crush. -4032279 - Stationary of Hope and Longing - Pink stationary that's rumored to return a favorable response if used to send a letter to a secret crush. -4032280 - Letter of Love and Longing - Pink stationary that's rumored to return a favorable response if used to send a letter to a secret crush. -4032281 - Pencil of Courage X 100 - A pencil that's used to write things you don’t have the courage to say. -4032282 - Pencil of Courage X 1000 - AA pencil that's used to write things you don’t have the courage to say. -4032283 - Pencil of Courage X 10000 - A pencil that's used to write things you don’t have the courage to say. -4032284 - Child's Broken Toy - A toy stolen from a child by a monster. It's broken and cannot be used. -4032285 - Child's Broken Toy - A toy stolen from a child by a monster. It's broken and cannot be used. -4032286 - Child's Broken Toy - A toy stolen from a child by a monster. It's broken and cannot be used. -4032287 - Child's Broken Toy - A toy stolen from a child by a monster. It's broken and cannot be used. -4032288 - Neinheart's Taxi Coupon - A Taxi coupon given to you by Neinheart. If you're in Ellinia, a taxi will take you to Henesys for free 1 time. -4032298 - Party Balloon - A MapleStory 6th Anniversary Party Item. -4032299 - Party Firecracker - A MapleStory 6th Anniversary Party Item. -4032300 - Party Candle - A MapleStory 6th Anniversary Party Item. -4032301 - Party Conehat - A MapleStory 6th Anniversary Party Item. -4032302 - Amazing Watercolor Paint - These amazing watercolor paints can be used to draw portraits of the Orange Mushroom, Octopus, and Yeti. -4032303 - Mystical Watercolor Paint - These mystical watercolor paints can be used to draw portraits of the Orange Mushroom, Octopus, and Yeti. -4032304 - Magical Watercolor Paint - These magical watercolor paints can be used to draw portraits of the Orange Mushroom, Octopus, and Yeti. -4032348 - Secure Bundle of Straw - A secure bundle of straw that can be used to make the Witch's Broomstick. -4032349 - Solid Bundle of Straw - A solid bundle of straw that can be used to make the Witch's Broomstick. -4032350 - Strong Bundle of Straw - A strong bundle of straw that can be used to make the Witch's Broomstick. -4161047 - Noblesse Guide - A guide for Noblesses.\n#cThe book can be opened by double-clicking on it.# -4170012 - DS Egg - A small egg taken out of the DS egg basket. The egg is hard as steel and cannot be opened without a special device. #cWill be placed in an incubator when you double-click it.# -4220148 - Portrait of an Orange Mushroom - Drawing paper on which you can draw a portrait of an Orange Mushroom. The portrait of an Orange Mushroom can be completed by using the Amazing, Mystical, or Magical watercolor paint on it. \r\n#cCan be opened by double-clicking on it with the mouse.# -4220149 - Portrait of an Octopus - Drawing paper on which you can draw a portrait of an Octopus. The portrait of an Octupus can be completed by using the Amazing, Mystical, or Magical watercolor paint on it. \r\n#cCan be opened by double-clicking on it with the mouse.# -4220150 - Portrait of a Yeti - Drawing paper on which you can draw a portrait of a Yeti. The portrait of a Yeti can be completed by using the Amazing, Mystical, or Magical watercolor paint on it. \r\n#cCan be opened by double-clicking on it with the mouse.# -4220151 - Hanging Scroll - A Hanging Scroll given to you by the Black Wing Shadow Warrior. The erased content can be restored by using special ink.\r\n#cCan be opened by double-clicking on it with a mouse.# -4032366 - Vague Aran Memory - A vague memory of the Aran. -4032367 - Dim Aran Memory - A dim memory of the Aran. -4032368 - Faint Aran Memory - A faint memory of the Aran. -4032369 - Cloudy Aran Memory - A cloudy memory of the Aran. -4032370 - Lingering Aran Memory - A lingering memory of the Aran. -4032371 - Flickering Aran Memory - A flickering memory of the Aran. -4001340 - Foreign Object - A green-colored foreign object that was blocking the pipes. Looks very dirty. -4001341 - Broken Iron Fragment - Looks like a fragment that broke off of something...? -4001342 - Pig Shaped Bottle - Wine would taste great in this bottle. -4001343 - Pig Vein - Very durable looking pig vein. -4001344 - Dark Wooden Board - Straight wooden board. -4001345 - Sunglasses - Looks like it belongs to a rock star. -4001346 - Antique - An old antique from Leafre. -4001347 - Ellinia Tree Barrel - A tree stump from Ellinia with a brown tint. -4001348 - Memory Fragment - Contains the memory of Solomon's bow. -4001349 - Octopus Leg Stick - An Octopus Leg that has been dried to resemble a stick. -4001350 - Pumpkin Head - Wearing this item compels you to listen to some Rock'n Roll. -4001351 - Devil Hunting Scroll - Scroll that contains the Devil's weakness... -4001352 - Lost Book - Jay's lost book. -4001353 - Lost Statue - A statue from Leafre that was lost in Nautilus. -4001354 - Young Soul - The soul of an innocent child. -4001355 - Golden Feather - Strange to think that it comes from an animal. -4001356 - Flint - Can this really be used to start a fire? -4001357 - Pork - Goes great with wine. -4001358 - Long Strong Stick - A long stick made of wood. -4001359 - Small Snail Shell - A curious shell that amplifies sound and reverberates when you scream. -4001360 - Piece of White Pants - A partial sheet of fabric taken from someone's pants. -4001361 - Ink - Black ink from an Octopus. -4001362 - Old Worn-out Paper - This is the treasure that was so hard to get?! But it does have some strange markings on it. -4001363 - Old Key - Is this the key to the Treasure Box? Not sure where this is supposed to be used. -4001364 - Orange Mushroom Sample - An extracted portion of the Orange Mushroom. -4001365 - Octopus Sample - An extracted portion of the Octopus. -4001366 - Paper with Strange Markings - There appears to be strange markings drawn on it. -4001367 - Ripped Paper-1 - Clue found near the Dark Portal where Andras is located. -4001368 - Ripped Paper-2 - Clue found near the Dark Portal where Valefor is located. -4001369 - Ripped Paper-3 - Clue found near the Dark Portal where Amdusias is located. -4001370 - Ripped Paper-4 - Clue found near the Dark Portal where Crocell is located. -4001371 - Ripped Paper-5 - Clue found near the Dark Portal where Marbas is located. -4001372 - Wild Boar Leather - Smelly leather from a Wild Boar. It's very pungent. -4001373 - Evil Eye Eyeball - Eek, so disgusting...could you really see with that thing? -4032478 - V.I. Orange Mushroom Wine - An expensive wine made with Orange Mushroom Caps from Victoria Islands. -4032479 - Training Instructor's Badge - Token indicating the Perion Training Instructor. -4032480 - Stanlica's Guitar - Music can expose the most painful roots of the heart, but it will always reveal the truth.\r\n#c- Chief Stan -# -4032481 - Unseemly Ocarina - It's missing some holes, as though it were constructed hastily. But the sound seems to be fine. -4032482 - Darkween's Monster Drum - You must live life with passion, so that the rest of the world might learn how to live.\r\n#c- Dark Lord -# -4032483 - Solomon's Sealed Bow - Looks quite ordinary for a supposedly legendary bow. -4032484 - Kyrinvana's Guitar - Blast this song until the rhythm pumps your blood and the chorus echoes through your bones...\r\n#c- Kyrin -# -4032485 - Large Model of a Coin - A large replica of a coin made by Shumi. Looks very desirable. -4032486 - Green Slime Eraser - An eraser made by collecting slime liquids. Use it on the dirty Treasure Map. -4032487 - Improved Flint - Its heat is strong enough to evaporate water from afar. Use it on the Slightly Cleaned Treasure Map. -4032488 - Ayan Mercury's Microphone - I will love my life just as I love the melody of this song.(Use it on the dirty Treasure Map.)\r\n#c- Ayan -# -4032489 - Ink Sack - A Sack containing Ink. Use it on the dirty Treasure Map. -4032490 - Cold Medicine - Effective Cold Medicine from Henesys. -4032491 - Andras' Emblem - Emblem of the demon Andras who was sealed up in Perion. It allows you to enter the location in which Andras resides. -4032492 - Amdusias' Emblem - Emblem of the demon Amdusias who was sealed up in Henesys. It allows you to enter the location in which Amdusias resides. -4032493 - Valefor's Emblem - Emblem of the demon Valefor who was sealed up in Kerning City. It allows you to enter the location in which Valefor resides. -4032494 - Crocell's Emblem - Emblem of the demon Crocell who was sealed up in Nautilus. It allows you to enter the location in which Crocell resides. -4032495 - Marbas' Emblem - Emblem of the demon Marbas who was sealed up in Ellinia. It allows you to enter the location in which Marbas resides. -4032496 - Devil Hunter's Necklace - Necklace shows that you defeat a Demon. -4220153 - Dirty Treasure Map - A treasure map given by Kyrin. There are three sections--red, green, and white--that are invisible. The green section should be cleaned first. \r\n\r\n*If you don't need the item anymore, just go to Jack in the Top Floor - Hallway to discard it.# -4032435 - Tombstone - I wonder who this tombstone belongs to? -4032436 - Tombstone - I wonder who this tombstone belongs to? -4032437 - Tombstone - I wonder who this tombstone belongs to? -4032438 - Haunted Mansion Brass Key - A key that looks like it can unlock the doors inside the Haunted Mansion. -4032439 - Haunted Mansion Silver Key - A key that looks like it can unlock the doors inside the Haunted Mansion. -4032440 - Haunted Mansion Gold Key - A key that looks like it can unlock the doors inside the Haunted Mansion. -4032441 - Olivia's Letter - Olivia's Letter -4032442 - Olivia's Letter - Olivia's Letter -4032443 - Olivia's Letter - Olivia's Letter -4032444 - Green Halloween Stick Candy - A green-colored Halloween Candy that Cassandra likes. -4032445 - Blue Halloween Stick Candy - A blue-colored Halloween Candy that Cassandra likes. -4032446 - Red Halloween Stick Candy - A red-colored Halloween Candy that Cassandra likes. -4000517 - Sophilia's Favorite Doll - Sophilia's Favorite Doll -4000518 - Haunted Mansion Gold Key - A key that looks like it can unlock the doors inside the Haunted Mansion. -4000519 - Haunted Mansion Silver Key - A key that looks like it can unlock the doors inside the Haunted Mansion. -4000520 - Haunted Mansion Brass Key - A key that looks like it can unlock the doors inside the Haunted Mansion. -4000521 - Olivia's Doll - Olivia's doll, which is obtained by defeating Olivia in the secret room. -4000522 - Cursed Frog Egg - A frog egg that has been cursed by Black Magic. Also, it is used as an ingredient in Witch Malady's cooking. -4000523 - Cursed Cat Spittle - Cat saliva that has been cursed with Black Magic. Also, it is used as an ingredient in Witch Malady's cooking. -4000524 - Dark Token - Looks like a type of currency used in a world other than Maple World. -4000489 - Tutorial Tino's Feather - Tutorial Tino's Feather. -4280002 - Premium Gold Box - A gold treasure chest dropped by a monster. This can be opened with the Premium Gold Master Key available at the Cash Shop. If you already have the Premium Gold Master Key, just double-click the box to open it. -4280003 - Premium Silver Box - A silver treasure chest dropped by a monster. This can be opened with the Premium Silver Master Key available at the Cash Shop. If you already have the Premium Silver Master Key, just double-click the box to open it. -4032522 - Yellow Turkey Egg - An oversized Yellow Turkey Egg. You can turn this in to Cody. -4032523 - Green Turkey Egg - An oversized Green Turkey Egg. You can turn this in to Cody. -4032524 - Blue Turkey Egg - An oversized Blue Turkey Egg. You can turn this in to Cody. -4032525 - Turkey Commando's Eye - A pair of futuristic eyeglasses previously worn by Turkey Commando. -4000499 - Mutated Spore - Comes from the Renegade Spores. -4000500 - Poison Mushroom Cap - A cap from the Poison Mushroom. It contains potent poison. -4000501 - Intoxicated Pig Tail - A pig tail that's been intoxicated by the mysterious herb in El Nath. -4000502 - Destroyed Helmet - A destroyed helmet that Helmet Pepe wore. -4000503 - Broken Spear - A spear used by Royal Guard Pepe. -4000504 - Chief Grey Yeti Horn - A horn from Grey Yeti, one of the head security members of King Pepe. -4000505 - Chief White Yeti Horn - A horn from White Yeti, one of the head security members of King Pepe. -4000506 - Chief Gold Yeti Horn - A horn from Gold Yeti, one of the head security members of King Pepe. -4000507 - Poison Spore - A powerful poisonous spore dropped by the Poison Mushroom. It can penetrate through the barrier of the magic spore once. -4001317 - Helmet Pepe's Helmet - A helmet worn by Helmet Pepe. Put it on to disguise yourself as a Helmet Pepe. -4001318 - The Royal Seal of the Mushking Empire - The Royal Seal that represents the power of the Mushking Empire. -4001320 - Flower Tube Coupon - Take this to Cassandra, and exchange it for a pretty Pink Flower Tube. -4001321 - Train 999 Boarding Pass - Allows one to board Train 999 through Mr. Lim. -4001322 - Pharaoh Yeti's Sapphire - A sapphire mounted on Pharaoh Yeti's necklace. Give it to Duarte, and he'll take you to Pharaoh Yeti's tomb. -4001323 - Pharaoh Yeti's Ruby - A ruby mounted on Pharaoh Yeti's necklace. Give it to Duarte, and he'll take you to Pharaoh Yeti's tomb. -4001324 - Pharaoh Yeti's Emerald - An emerald mounted on Pharaoh Yeti's necklace. Give it to Duarte, and he'll take you to Pharaoh Yeti's tomb. -4001325 - Pharaoh Yeti's Topaz - A topaz mounted on Pharaoh Yeti's necklace. Give it to Duarte, and he'll take you to Pharaoh Yeti's tomb. -4032372 - Giant Polearm Image - (no description) -4032373 - Tutorial Muru's Furball - A white, cold furball from Tutorial Muru. -4032374 - Letter of Commendation - Warrior Adventurer - The letter of commendation Power B. Fore lost. -4032375 - Recommendation Letter - Job Instructor - A recommendation letter from the job instructor. Take this and show it to the Head Security Officer at the Mushking Empire. -4032376 - Letter of Commendation - Magician Adventurer - The letter of commendation Power B. Fore lost. -4032377 - Letter of Commendation - Bowman Adventurer - The letter of commendation Power B. Fore lost. -4032378 - Letter of Commendation - Thief Adventurer - The letter of commendation Power B. Fore lost. -4032379 - Letter of Commendation - Pirate Adventurer - The letter of commendation Power B. Fore lost. -4032386 - King Pepe's Crown - A crown that King Pepe sported. -4032387 - Prime Minister Emblem - An emblem worn by the Prime Minister of the Mushking Empire. -4032389 - Killer Mushroom Spore Sample - A completed sample of Killer Mushroom Spores. -4032388 - Wedding Hall Key - The key that opens the wedding hall, where Princess Violetta will be married. -4032390 - Tainted Horny Mushroom Cap - A tainted Horny Mushroom cap that was discovered by The Rememberer. -4032399 - Recording Charm - A charm that stores the final scream of Zombie Mushroom before its death. -4032400 - Recommendation Letter - The Rememberer - Hand this letter to Karacas at Nihal Desert. -4032401 - Gold Poison Sting - A special gold sting that the Scorpion carries. -4032402 - Sand Mole Hat - Sand Mole Hat -4032405 - Secret Key - A key to the secret place where Prime Minster's remaining army is hiding. -4032418 - Bingo Necklace - The necklace of a puppy named Bingo -4032419 - Bingo Necklace - The necklace of a puppy named Bingo -4032420 - Bingo Necklace - The necklace of a puppy named Bingo -4032421 - Bingo Necklace - The necklace of a puppy named Bingo -4032422 - Bingo Necklace - The necklace of a puppy named Bingo -4032423 - Arthritis Medicine - Medicine that alleviates arthritis. -4032424 - Missed Mark - A mark that warns one of Missed Monsters. -4161048 - Legend's Guide - A guide strictly for the Legends. \n#cDouble-click the item to open.# -4000497 - Murukun's Furball - Murukun's furball. Covers up Murukun's sharp piece of horn. -4000496 - Murumuru's Furball - Murumuru's Furball. Highly resembles that of a snowman. -4000495 - Murupia's Furball - Murupia's Furball. Looks like something's growing out of it. -4000494 - Murupa's Furball - Murupa's Furball. A small leaf is stuck in the ball. -4000493 - Muru's Furball - A handful of white, cold furball of Muru's. -4000492 - Certificate of Great Tester - A certificate that certifies one as a great tester. The more the certificate, the better the chance of being selected as a Great Tester. -4032309 - Piece of Bamboo - A piece of bamboo snapped from Rien. A prime material for building a chair. -4032310 - Wood - A wood carved out of a tree from Rien. A prime material for building a chair. -4032311 - Sign of Acceptance - A sign of acceptance the Scarred Bear was carrying with. Take it to Sir Blacksmith to get accepted. -4032312 - Red Jade - A red jade that decorated Maha. A portion of Maha's powers is instilled in it. -4032313 - Tru Taxi Coupon - A taxi coupon from Tru. Use the coupon at the cab in Lith Harbor to get one free ride to Henesys. -4032314 - Orange Mushroom Horn - A horn from Orange Mushroom that's on the verge of evolving into a Horny Mushroom. -4032315 - Cynical Orange Mushroom Puppet - A cute puppet based on Orange Mushroom, but something about its facial expression seems odd. -4032316 - Dejected Green Mushroom Puppet - A cute puppet based on Green Mushroom, but something about its facial expression seems odd. -4032317 - Dejected Green Mushroom Puppet - A cute puppet based on Green Mushroom, but something about its facial expression seems odd. -4032318 - Dejected Green Mushroom Puppet - A cute puppet based on Green Mushroom, but something about its facial expression seems odd. -4032319 - Smirking Ghost Stump Puppet - A cute puppet based on Ghost Stump, but something about its facial expression seems odd. -4032320 - Report from 10 Boogies - A report written by 10 Boogies. Better take this to Nineheart. -4032321 - Annoyed Zombie Mushroom Doll - A cute doll based on Zombie Mushroom, but something about its facial expression seems odd. -4032322 - Puppeteer Document - A document written by the puppeteer. It looks it like contains the sinister plans of Black Wing. -4032323 - Seal Stone of Victoria Island - The seal stone of Victoria Island that Black Wing had been desperately looking for. No one knows exactly what the stone is for. -4032324 - Rapid Growth Stimulator - A stimulator that promotes rapid growth. Probably came as a result of the appearance of Giant Nependeath. -4032325 - Storage Key - A key that opens the storage. Better take it to Helena. -4032326 - Wooden Key - A key made out of wood. -4032327 - Clean Letter - A letter that Helena held on to for a long time. Wonder what's written on it. -4032328 - Old Letter - A letter that Helena held on to for a long time. The condition of the letter shows its age. -4032329 - Old Letter - A letter that Helena held on to for a long time. It's impossible to see what's written on it. -4032330 - Lilin's Envelope - An Envelope from Lilin. Contains documents related to Black Wing. -4032331 - Wolf Cub Vitamins - Vitamins that contain nutrients required for Wolf Cub. -4032332 - Wolf Cub Meal - A delicious meal meant for Wolf Cub. -4032333 - Puberty Wolf Vitamins - Vitamins that contain nutrients essential for wolf in puberty. -4032334 - Life Water for Wolf - A special type of water the wolf drinks in order to become an adult. -4032335 - Wolf Tooth - An important ingredient for wolf's Life Water. -4032338 - Lilin's Letter - A letter handwritten by Lilin. Hand the letter to Tru, the Info Merchant at Lith Harbor, and just follow his directions. -4032339 - Red Jade - A red jade Tititi accidentally lost. Better hand it back to Tititi. -4032340 - Pig Tail - A pig tail that is rarely available through pigs. There's not much value in it. -4032341 - Puppeteer Document - A document written by the puppeteer. It looks it like contains the sinister plans of Black Wing. Lilin may be able to decipher this letter. -4032342 - Special Ink - A special form of ink made by the artist of Mu Lung, Jin Jin. -4001231 - Candy Cane - A Chrismas Candy Cane for Jump Event -4032185 - 1st Place Medal - A medal acquired from the Christmas High Jump map. -4032186 - 2nd Place Medal - A medal acquired from the Christmas High Jump map. -4032187 - 3rd Place Medal - A medal acquired from the Christmas High Jump map. -4032343 - Picture Scroll - A warning shot fired by the shadow warrior of Black Wing. -4000421 - Qualified Knitting Ball - Qualified Knitting Ball to make the Christmas Sock. #cPlease click and drag# this item into the Socks Frame UI to make your own socks. -4031881 - Picture of Rudolph - Someone took a picture of Rudolph flying in the night sky of Happy ville. Rudolph seems happy in this picture. -4031882 - Chimney Broom - This will enable you to sweep inside the Chimney eventhough it is long and wide. -4031883 - Flashlight - This will enable you to light up the dark chimney. -4031884 - Warm Milk - This warm milk will help Icarus to go to bed. -4031885 - Mapler Recommendation - Recommendation written by Happyville people. -4031886 - Completed Socks - Happyville Trend Socks made with skill from Mrs. Santa Claus -4161038 - Santa Encyclopedia No.2 - Santa Encyclopedia that contains the history of Santa's Family.\n#cDouble click on the item to open the book. -4161039 - Santa Encyclopedia No.3 - Santa Encyclopedia that contains method about how to make the Christmas Socks.\n#cDouble click on the item to open the book. -4161040 - Santa Encyclopedia No.4 - Santa Encyclopedia that contains characteristics of Santa.\n#cDouble click on the item to open the book. -4161041 - Santa Encyclopedia No.5 - Santa Encyclopedia that contains how to do a good thing for Christmas.\n#cDouble click on the item to open the book. -4220022 - Socks Frame - Double click on the item to open the UI to add knitting balls to make the Christmas socks. -4161043 - Santa Encyclopedia No.1 - Santa Encyclopedia that contains the history of Santa.\n#cDouble click on the item to open the book. -4031408 - Gachapon Stamp - Can be traded for an awesome gift depending on the number of stamps collected. - -4001428 - Cupid's Lost Arrow - One of Cupid's Lost Arrows. -4001429 - Mardi Gras Bead Necklace - A necklace that Gaga wants. -4032576 - Green Mardi Gras Feather - (no description) -4032577 - Purple Mardi Gras Feather - (no description) -4032578 - Red Mardi Gras Feather - (no description) -4000525 - Kid Mannequin's Bunny Suit - A bunny suit that the Kid Mannequin was wearing. -4000526 - Female Mannequin's Wig - A blonde wig that the Female Mannequin was wearing. -4000527 - Male Mannequin's Fedora - A black fedora that the Male Mannequin was wearing. -4000528 - Latest Hits Compilation - A CD of latest hits. -4000529 - Greatest Oldies - A CD of the greatest oldies. -4000530 - Blue Perfume - A lavender-scented perfume. Musky and rich. -4000532 - Yellow Perfume - A freesia-scented perfume. Fresh and smooth. -4000534 - Pink Perfume - A rose-scented perfume. Light and airy. -4000536 - Cheap Speakers - Low-quality speakers. -4000537 - Fancy Amplifier Cables - Fancy cables that connect to fancy amplifiers. -4000538 - Spirit of Rock's Music Score - A music score that Spirit of Rock treasures. -4000539 - Cherry Bubble - Refreshing cherry-flavored bubble from a cherry bubble tea. -4000540 - Melon Bubble - Sweet melon-flavored bubble from a melon bubble tea. -4000541 - Mango Bubble - Sweet mango-flavored bubble from a mango bubble tea. -4000542 - Yeti Keychain - A cute keychain with a dangling Yeti doll. -4000543 - Jr. Pepe Keychain - A cute keychain with a dangling Jr. Pepe doll. -4000544 - Orange Mushroom Doll - A pretty Orange Mushroom doll from the claw vending machine. -4000545 - Red Squishy Liquid - Cherry-scented jelly from a Red Slime. -4000546 - Silver Squishy Liquid - Jelly from a Silver Slime. It looks pretty heavy. -4000547 - Gold Squishy Liquid - Jelly from a Gold Slime. It looks expensive. -4000548 - Overlord A Radar Device - A radar that detects anything within a 10m radius. -4000549 - Overlord B Radar Device - A radar that detects anything within a 30m radius. -4000550 - Robby's Electronic Induction Device - A device that communicates using the nearest inductive material. -4000551 - Iruvata Laser Sword - Iruvata's laser sword, which can be used as a weapon. -4000552 - Afterlord Chained Tire - Appears durable enough to maneuver through the wilderness. -4000553 - Prototype Lord Propulsion System - This propulsion system uses nitrogen energy as its propellant. -4000554 - Maverick Type A Component - A component of Maverick Type A that is abrasion-resistant due to its ergonomic design. -4000555 - Maverick Type S Laser Gun - A high-tech laser gun that consumes minimal energy yet ejects maximum power. -4000556 - Maverick Type D Booster - A booster that provides a temporary increase in thrust for flight. -4000557 - Imperial Guard Vacuum Tube - A vacuum tube that uses air pressure to maintain an output of at least 5 tons. -4000558 - Royal Guard Armor - Special armor that features a special alloy for maximum durability. -4001170 - ?? - (no description) -4001171 - ?? - (no description) -4001172 - ?? - (no description) -4001173 - ?? - (no description) -4001326 - ??? ???? - ??? ?????. ??? ??? ??? ? ????. -4001327 - ??? ???? - ??? ?????. ??? ??? ??? ? ????. -4001328 - ??? ???? - ??? ?????. ??? ??? ??? ? ????. -4001329 - ??? ???? - ??? ?????. ??? ??? ??? ? ????. -4001330 - ??? ???? - ??? ?????. ??? ??? ??? ? ????. -4001331 - ?? ???? - ?? ?????. ??? ??? ??? ? ????. -4001332 - ??? ???? - ??? ?????. ??? ??? ??? ? ????. -4001333 - Pot - A small pot with a flower bud in it. Watch it for 30 minutes to see a flower bloom. -4001334 - Yellow Flower Pot - A small pot that contains a yellow flower. Take it to Gaga to trade it for a crayon. -4001339 - Treacherous Fox Tail - The tail of a Treacherous Fox. It seems pretty useless, especially since it is covered in coarse fur. -4001393 - Time Traveler's Pocket Watch - An object that signifies authorized use of the Time Gate in Tera Forest. It looks like an average pocket watch but has something engraved on the back. It reads, 'Time is Golden.' -4001394 - Time Traveler's Free Pass - An object that signifies authorized use of the Time Gate in Tera Forest for a limited time. -4032430 - Photo of the Moon - A photo of the moon that hasn't developed yet. The image should become more vivid in 30 minutes. The photo will disappear if you log out! -4032431 - Photo of the Moon - A faint photo of the moon that hasn't been fully developed yet. The image should become more vivid in 30 minutes. The photo will disappear if you log out! -4032432 - Photo of the Moon - A blurry photo of the moon that hasn't been fully developed yet. The image should become more vivid in 30 minutes. The photo will disappear if you log out! -4032433 - Photo of the Moon - A clear photo of the moon. This will certainly make the Baby Moon Bunny happy. -4032434 - Yellow Butterfly - A cute little yellow butterfly. It might fly away if you don't keep your eye on it. -4032447 - Dog Food - A small bag of dog food. Bulldogs go crazy for this stuff. -4032448 - Lunch Made with Love - A special lunch Anna made for Gustav. It's packed with tender loving care. -4032449 - Piglet - A piglet that escaped from the farm. Return it to the farm. -4032450 - Empty Lunch Box - Someone has devoured everything that was inside the lunch box. -4032451 - Egg - Eggs from the hen house in the back yard. -4032452 - Bundle of Hay - A bundle of hay used to feed livestock. Baby dragons might like it too. -4032453 - Pork - Juicy pork. Baby dragons might like it. -4032454 - Milk for Baby Dragon - Cow milk. Baby dragons might like it. -4032455 - Letter from Gustav - A letter Gustav wrote to Chief Stan in Henesys. The letter mentions something about pork delivery. -4032456 - Recommendation Letter - Chief Stan - A recommendation letter from Stan. Take it to Power B. Fore and he might let you use the training center. -4032457 - Power B. Fore's Certificate of Training - A certificate that states the recipient has completed Power B. Fore's training. It also appears to be a free pass to use Power B. Fore's training center. -4032458 - Rina's Blue Mushroom Porridge - Some Blue Mushroom porridge Rina made. It's packed nicely and ready for delivery. -4032459 - Blue Mushroom Doll - A cute doll that resembles a Blue Mushroom. -4032460 - Refreshing Stump Sap - Tree sap from a Stump. It is surprisingly refreshing. -4032461 - Zombie Mushroom Doll - A doll that resembles a Zombie Mushroom, though something isn't quite right with the face. -4032462 - Wild Boar Doll - A cute doll that resembles a Wild Boar. -4032463 - Document with Clue - A document that has a clue about the thief that stole Sabitrama's herb written on it. It looks like an ordinary letter, though. -4032464 - Sabitrama's Herb - A pouch with a pleasant herbal scent that obviously contains Sabitrama's herb. -4032465 - Nella's Letter of Introduction - A letter of introduction from Nella. It states that the recipient is a capable adventurer. -4032466 - Golem Doll - A cute doll that resembles a Golem. -4032467 - Dragon Scales - A few scales from dragon. -4032468 - Rapid Growth Accelerant - A rapid growth accelerant that was created by a secret organization. It appears to accelerate the growth of plants. -4032469 - John's Map - John's map, which contains information about some island. That island is said to be the place where the dragon lies asleep. -4032470 - Tropical Fruit Punch - Specially ordered tropical fruit punch that can only be made in Florina Beach. -4032471 - Black Key - A key you received from Shammos on a mission for a secret organization. What is this key used for? -4032472 - Map of Turtle Island - The map of Turtle Island you received from Captain Hwang. It has the location of an island but not much else is known. -4032473 - Gruesome Bone - Bone that exudes a gruesome energy. -4032474 - Seruf Pearl - A shiny pearl acquired from Seruf. Based on its shade, it appears to be of the highest quality. -4032475 - Lycanthrope Leather - A tough piece of Lycanthrope leather. -4032476 - Captain Alpha's Buckle - Captain Alpha's buckle, which was discovered deep inside the ocean in a treasure chest near the shipwreck. It looks extremely fancy. -4032477 - Unbreakable Porcelain - Unbreakable Porcelain that Herb Town is known for. -4032497 - Potter - A master craftsman in Herb Town. He is as light as a feather. -4032498 - Thick Branch - A tree branch from a Stump. You can use it to repair the fence. -4032502 - Dragon Scale - Scale left behind after the Onyx Dragon's ecdysis. It stores the force of the dragon. Something remarkable could be created using the Maker skill. -4032503 - Shiny Dragon Scale - Scale left behind after the Onyx Dragon's ecdysis. The force of the dragon is stored inside the golden emblem. Something remarkable could be created using the Maker skill. -4032504 - Lycanthrope Leather - A tough piece of Lycanthrope leather. -4032505 - Captain Alpha's Buckle - Captain Alpha's buckle, which was discovered deep inside the ocean in a treasure chest near the shipwreck. It looks extremely fancy. -4032506 - Locker Key - Key to a locker at the Kerning Square Station. -4032507 - Composition Notes - Lost composition notes that belong to Maestro Rho, a genius composer. -4032508 - Secret Recipe - The seven star chef Robby Fray's secret recipe. -4032509 - Latest Model MP3 - Latest model MP3 with a sophisticated design and increased memory capacity. -4032510 - Legendary Scissors - Marshall the hair stylist's legendary scissors. -4032511 - Andy's Pocket Watch - An item that activates the Time Gate. It has Andy the Time Traveler's name engraved on it, so only he can use it. -4032512 - Primary Clue to the Case - A piece of paper that contains a clue to the case Andy is working on. It's hard to read what it says. The paper has been severely damaged. -4032513 - Wrinkled Sketchbook Loose-Leaf - A sheet of paper that appears to be from a sketchbook. -4032514 - Shelter Key - A key to the shelter at the harbor. -4032515 - Bergamot's Time Sand - Time Sand that belonged to Bergamot. -4032516 - Dunas's Time Sand - Time Sand that belonged to Dunas. -4032517 - Aufheben's Time Sand - Time Sand that belonged to Aufheben. -4032518 - Oberon's Time Sand - Time Sand that belonged to Oberon. -4032519 - Nibelung's Time Sand - Time Sand that belonged to Nibelung. -4032520 - Maid Apron - An apron Bao is giving May as a present. An apron? That's a strange gift, but take it over to May anyway. -4032521 - VIP Invitation - An invitation that grants admission to the VIP Zone. -4032526 - John's Map - John's map that contains information on some island. That island is said to be the place where the dragon lies asleep. -4160041 - Pet Command Guide : Gold Pig - A guide that has all the commands for the Gold Pig.\n#cDouble-click on the item to open the guide.# -4220152 - Rainbow Drawing - A sheet of sketch paper that has a rainbow drawing. \r\n#cYou can open it with your mouse by double-clicking.# -4310000 - Perfect Pitch - This Music Note gives Inkwell the perfect pitch he's been dying to find. You can trade it for a rare item if you go to the Free Market Entrance or talk to Inkwell in Henesys before March 30th. -4160044 - Pet Command Guide : Baby Tiger - A guide that contains commands for Baby Tiger. \n#cYou can open the book by double-clicking on it.# -4001434 - Gachapon Food Coupon - Use this coupon on a Gachapon machine to het a veriety of food. diff --git a/tools/MapleIdRetriever/handbook/Map.txt b/tools/MapleIdRetriever/handbook/Map.txt deleted file mode 100644 index c0a07f3ad0..0000000000 --- a/tools/MapleIdRetriever/handbook/Map.txt +++ /dev/null @@ -1,4447 +0,0 @@ -maple - -0 - Maple Road - Entrance - Mushroom Town Training Camp -1 - Maple Road - Upper level of the Training Camp -10000 - Maple Road - Mushroom Town -1000000 - Rainbow Street - Amherst -1000001 - Rainbow Street - Amherst Weapon Store -1000002 - Rainbow Street - Amherst Townstreet -1000003 - Rainbow Street - Amherst Department Store -1000004 - Rainbow Street - Snail Garden -1000005 - Rainbow Street - Hunting Ground Middle of the Forest I -1000006 - Rainbow Street - Hunting Ground Middle of the Forest II -1010000 - Maple Road - Entrance to Adventurer Training Center -1010001 - Rainbow Street - Amherst Weapon Store -1010002 - Rainbow Street - Amherst Townstreet -1010003 - Rainbow Street - Amherst Department Store -1010004 - Rainbow Street - Snail Field of Flowers -1020000 - Maple Road - Split Road of Destiny -1020001 - Rainbow Street - Tomato Field -2 - Maple Road - Lower level of the Training Camp -20000 - Maple Road - Snail Garden -20001 - Maple Road - Mushroom Town Townstreet -3 - Maple Road - Entrance - Mushroom Town Training Camp -30000 - Maple Road - Snail Field of Flowers -40000 - Maple Road - In a Small Forest -40001 - Maple Road - Snail Hunting Ground II -40002 - Maple Road - Snail Hunting Ground III -50000 - Maple Road - Dangerous Forest -50001 - Maple Road - The Field West of Southperry -60000 - Maple Road - Southperry -60001 - Maple Road - Southperry Armor Store -30001 - Maple Road - Mushroom Town Townstreet -1010100 - Maple Road - Adventurer Training Center 1 -1010200 - Maple Road - Adventurer Training Center 2 -1010300 - Maple Road - Adventurer Training Center 3 -1010400 - Maple Road - Adventurer Training Center 4 -2000000 - Maple Road - Southperry -2000001 - Maple Road - Southperry Armor Store - -victoria - -100000000 - Victoria Road - Henesys -100000001 - Victoria Road - Henesys Townstreet -100000002 - Hidden Street - An Empty House -100000003 - Hidden Street - Pig Park -100000004 - Hidden Street - Pig Park II -100000005 - Hidden Street - Someone Else's House -100000006 - Hidden Street - The Resting Spot, Pig Park -100000100 - Victoria Road - Henesys Market -100000101 - Victoria Road - Henesys Weapon Store -100000102 - Victoria Road - Henesys Department Store -100000103 - Victoria Road - Henesys Plastic Surgery -100000104 - Victoria Road - Henesys Hair Salon -100000105 - Victoria Road - Henesys Skin-Care -100000110 - Victoria Road - Henesys Free Market Entrance -100000111 - Victoria Road - Henesys Free Market <1> -100000112 - Victoria Road - Henesys Free Market <2> -100000113 - Victoria Road - Henesys Free Market <3> -100000114 - Victoria Road - Henesys Free Market <4> -100000115 - Victoria Road - Henesys Free Market <5> -100000116 - Victoria Road - Henesys Free Market <6> -100000117 - Victoria Road - Henesys Free Market <7> -100000118 - Victoria Road - Henesys Free Market <8> -100000119 - Victoria Road - Henesys Free Market <9> -100000200 - Victoria Road - Henesys Park -100000201 - Victoria Road - Bowman Instructional School -100000202 - Victoria Road - Pet-Walking Road -100000203 - Victoria Road - Henesys Game Park -100010000 - Victoria Road - The Hill East of Henesys -100020000 - Victoria Road - The Rain-Forest East of Henesys -100030000 - Victoria Road - The Forest East of Henesys -100030001 - Hidden Street - The Blue Mushroom Forest -100040000 - Victoria Road - The Forest South of Ellinia -100040001 - Victoria Road - Dungeon, Southern Forest I -100040002 - Victoria Road - Dungeon, Southern Forest II -100040003 - Victoria Road - Dungeon, Southern Forest III -100040004 - Victoria Road - Dungeon, Southern Forest IV -100040100 - Victoria Road - The Forest of Wisdom -100040101 - Hidden Street - Monkey Forest I -100040102 - Victoria Road - Tree Dungeon, Monkey Forest I -100040103 - Victoria Road - Monkey Forest II -100040104 - Hidden Street - Tree Dungeon, Monkey Forest II -100040105 - Hidden Street - The Forest of Evil I -100040106 - Hidden Street - The Forest of Evil II -100040110 - Hidden Street - Downstairs at the Forest -100050000 - Victoria Road - The Field South of Ellinia -101000000 - Victoria Road - Ellinia -101000001 - Victoria Road - Ellinia Weapon Store -101000002 - Victoria Road - Ellinia Department Store -101000003 - Victoria Road - Magic Library -101000100 - Hidden Street - The Forest of Patience -101000101 - Hidden Street - The Forest of Patience -101000102 - Hidden Street - The Forest of Patience -101000103 - Hidden Street - The Forest of Patience -101000104 - Hidden Street - The Forest of Patience -101000200 - Hidden Street - Mar's Forest -101000300 - Victoria Road - Ellinia Station -101000301 - Victoria Road - Before Takeoff -101010000 - Victoria Road - The Field Up North of Ellinia -101010100 - Victoria Road - The Tree That Grew I -101010101 - Victoria Road - The Tree That Grew II -101010102 - Victoria Road - The Tree That Grew III -101020000 - Victoria Road - The Forest North of Ellinia -101020001 - Victoria Road - The Tree Tunnel At the Forest Up North -101020002 - Victoria Road - Tree Dungeon, Forest Up North I -101020003 - Victoria Road - Tree Dungeon, Forest Up North II -101020004 - Victoria Road - Tree Dungeon, Forest Up North III -101020005 - Victoria Road - Tree Dungeon, Forest Up North IV -101020006 - Victoria Road - Tree Dungeon, Forest Up North V -101020007 - Victoria Road - Tree Dungeon, Forest Up North VI -101020008 - Victoria Road - Tree Dungeon, Forest Up North VII -101020009 - Victoria Road - Tree Dungeon, Forest Up North -101020010 - Victoria Road - Tree Dungeon, Forest Up North IX -101030000 - Victoria Road - East Domain of Perion -101030001 - Hidden Street - The Land of Wild Boar II -101030100 - Victoria Road - Rocky Road III -101030101 - Victoria Road - Excavation Site I -101030102 - Victoria Road - Excavation Site II -101030103 - Victoria Road - Excavation Site III -101030104 - Victoria Road - Excavation Site -101030105 - Victoria Road - Remains I -101030106 - Victoria Road - Remains II -101030107 - Victoria Road - Remains III -101030108 - Victoria Road - Remains IV -101030109 - Victoria Road - Remains -101030110 - Victoria Road - Camp 1 -101030111 - Victoria Road - Camp 2 -101030112 - Victoria Road - Camp 3 -101030200 - Victoria Road - Rocky Road II -101030300 - Victoria Road - Rocky Road I -101030400 - Victoria Road - East Rocky Mountain I -101030401 - Victoria Road - East Rocky Mountain II -101030402 - Victoria Road - East Rocky Mountain III -101030403 - Victoria Road - East Rocky Mountain IV -101030404 - Victoria Road - East Rocky Mountain V -101030405 - Victoria Road - East Rocky Mountain VI -101030406 - Victoria Road - East Rocky Mountain VII -101040000 - Victoria Road - Perion Street Corner -101040001 - Hidden Street - Land of Wild Boar -101040002 - Hidden Street - Over the Wall -101040003 - Hidden Street - Iron Boar Land -102000000 - Victoria Road - Perion -102000001 - Victoria Road - Perion Weapon Store -102000002 - Victoria Road - Perion Department Store -102000003 - Victoria Road - Warriors' Sanctuary -102000100 - Victoria Road - Entrance of Perion Free Market -102000101 - Victoria Road - Perion Free Market <1> -102000102 - Victoria Road - Perion Free Market <2> -102000103 - Victoria Road - Perion Free Market <3> -102000104 - Victoria Road - Perion Free Market <4> -102000105 - Victoria Road - Perion Free Market <5> -102000106 - Victoria Road - Perion Free Market <6> -102000107 - Victoria Road - Perion Free Market <7> -102000108 - Victoria Road - Perion Free Market <8> -102000109 - Victoria Road - Perion Free Market <9> -102010000 - Victoria Road - West Street Corner of Perion -102020000 - Victoria Road - West Rocky Mountain I -102020100 - Victoria Road - West Rocky Mountain II -102020200 - Victoria Road - West Rocky Mountain III -102020300 - Victoria Road - West Rocky Mountain IV -102030000 - Victoria Road - West Domain of Perion -102040000 - Victoria Road - Construction Site North of Kerning City -102040001 - Hidden Street - Northern Top of Construction Site -102050000 - Victoria Road - Sunset Sky -103000000 - Victoria Road - Kerning City -103000001 - Victoria Road - Kerning City Self-Defence Item Store -103000002 - Victoria Road - Kerning City Pharmacy -103000003 - Victoria Road - Thieves' Hideout -103000004 - Victoria Road - Naora Hospital -103000005 - Victoria Road - Kerning City Hair Salon -103000006 - Victoria Road - Kerning City Repair Shop -103000100 - Victoria Road - Subway Ticketing Booth -103000101 - Kerning City Subway - Line 1 -103000102 - Kerning City Subway - Transfer Area -103000103 - Kerning City Subway - Line 1 -103000104 - Kerning City Subway - Line 1 -103000105 - Kerning City Subway - Line 1 -103000200 - Kerning City Subway - Line 2 -103000201 - Kerning City Subway - Line 2 -103000202 - Kerning City Subway - Line 2 -103000800 - Hidden Street - 1st Accompaniment <1st Stage> -103000801 - Hidden Street - 1st Accompaniment <2nd Stage> -103000802 - Hidden Street - 1st Accompaniment <3rd Stage> -103000803 - Hidden Street - 1st Accompaniment <4th stage> -103000804 - Hidden Street - 1st Accompaniment -103000805 - Hidden Street - 1st Accompaniment -103000890 - Hidden Street - 1st Accompaniment -103000900 - Line 3 Construction Site - B1 -103000901 - Line 3 Construction Site - B1 -103000902 - Line 3 Construction Site - B1 -103000903 - Line 3 Construction Site - B2 -103000904 - Line 3 Construction Site - B2 -103000905 - Line 3 Construction Site - B2 -103000906 - Line 3 Construction Site - B3 -103000907 - Line 3 Construction Site - B3 -103000908 - Line 3 Construction Site - B3 -103000909 - Line 3 Construction Site - B3 -103010000 - Victoria Road - Kerning City Construction Site -103010001 - Hidden Street - Caution Falling Down -103020000 - Victoria Road - L Forest I -103020100 - Victoria Road - L Forest II -103020200 - Victoria Road - L Forest III -103030000 - Victoria Road - Kerning City Middle Forest I -103030100 - Victoria Road - Kerning City Middle Forest II -103030200 - Victoria Road - Kerning City Middle Forest III -104000000 - Victoria Road - Lith Harbor -104000001 - Victoria Road - Lith Harbor Armor Shop -104000002 - Victoria Road - Lith Harbor Department Store -104000003 - Victoria Road - Lith Harbor Weapon Shop -104000100 - Victoria Road - Right Around Lith Harbor -104000200 - Victoria Road - Thicket Around the Beach I -104000300 - Victoria Road - Thicket Around the Beach II -104000400 - Victoria Road - Thicket Around the Beach III -104010000 - Victoria Road - 3-Way Road-Split -104010001 - Hidden Street - The Pig Beach -104010002 - Hidden Street - Beach Hunting Ground -104020000 - Victoria Road - Forest West of Henesys -104030000 - Victoria Road - A Hill West of Henesys -104030001 - Hidden Street - Mushroom Garden -104040000 - Victoria Road - Henesys Hunting Ground I -104040001 - Victoria Road - Henesys Hunting Ground II -104040002 - Victoria Road - Henesys Hunting Ground III -105030000 - Dungeon - Deep Forest -105040000 - Dungeon - Swampy Land in a Deep Forest -105040100 - Dungeon - Hunting Ground in the Deep Forest I -105040200 - Dungeon - Hunting Ground in the Deep Forest II -105040300 - Dungeon - Sleepywood -105040301 - Dungeon - Sleepy Dungeon I -105040302 - Dungeon - Sleepy Dungeon II -105040303 - Dungeon - Sleepy Dungeon III -105040304 - Dungeon - Sleepy Dungeon IV -105040305 - Dungeon - Sleepy Dungeon V -105040306 - Dungeon - The forest of Golem -105040310 - Hidden Street - The Deep Forest of Patience -105040311 - Hidden Street - The Deep Forest of Patience -105040312 - Hidden Street - The Deep Forest of Patience -105040313 - Hidden Street - The Deep Forest of Patience -105040314 - Hidden Street - The Deep Forest of Patience -105040315 - Hidden Street - The Deep Forest of Patience -105040316 - Hidden Street - The Deep Forest of Patience -105040400 - Dungeon - Sleepywood Hotel -105040401 - Dungeon - Regular Sauna -105040402 - Dungeon - VIP Sauna -105050000 - Dungeon - Ant Tunnel I -105050100 - Dungeon - Ant Tunnel II -105050200 - Dungeon - Ant Tunnel III -105050300 - Dungeon - Ant Tunnel IV -105050400 - Dungeon - Dark Cave -105060000 - Dungeon - Dangerous Steam -105060100 - Dungeon - Deep Ant Tunnel I -105070000 - Dungeon - Deep Ant Tunnel II -105070001 - Dungeon - Ant Tunnel Park -105070002 - Dungeon - The Grave of Mushmom -105070100 - Dungeon - The Cave of Evil Eye I -105070200 - Dungeon - The Cave of Evil Eye II -105070300 - Dungeon - The Cave of Evil Eye III -105070400 - Dungeon - The Cave of Evil Eye IV -105080000 - Dungeon - Drake Hunting Ground -105090000 - Dungeon - The Tunnel That Lost Light I -105090100 - Dungeon - The Tunnel That Lost Light II -105090200 - Dungeon - Another Entrance -105090300 - Dungeon - Drake's Meal Table -105090301 - Dungeon - Wild Cargo's Area -105090310 - Dungeon - Drake Area -105090311 - Dungeon - Cold Cradle -105090312 - Dungeon - Drake's Nest -105090400 - Dungeon - Another Path -105090500 - Dungeon - Sanctuary Entrance I -105090600 - Dungeon - Sanctuary Entrance II -105090700 - Dungeon - Sanctuary Entrance III -105090800 - Dungeon - Sanctuary Entrance IV -105090900 - Dungeon - The Cursed Sanctuary -106000000 - Warning Street - Deep Valley I -106000001 - Hidden Street - Dangerous Valley -106000002 - Hidden Street - Dangerous Valley II -106000100 - Warning Street - Deep Valley II -106000101 - Warning Street - The Burnt Land I -106000110 - Warning Street - The Burnt Land II -106000120 - Warning Street - The Burnt Land III -106000130 - Warning Street - The Burnt Land IV -106000140 - Warning Street - The Burnt Land V -106000200 - Warning Street - Deep Valley III -106000300 - Warning Street - Perion Dungeon Entrance -106010000 - Warning Street - The Road to the Dungeon -106010100 - Warning Street - Henesys Dungeon Entrance -106010101 - Hidden Street - The Breathing Rock -106010102 - Victoria Road - The Entrance of Golem's Temple -106010103 - Victoria Road - Golem's Temple I -106010104 - Victoria Road - Golem's Temple II -106010105 - Victoria Road - Golem's Temple III -106010106 - Victoria Road - Golem's Temple IV -107000000 - Warning Street - The Swamp of Despair I -107000001 - Hidden Street - Swamp of the Jr.Necki -107000100 - Warning Street - The Swamp of Despair II -107000200 - Warning Street - The Swamp of Despair III -107000300 - Warning Street - Dangerous Croko I -107000400 - Warning Street - Dangerous Croko II -107000401 - Hidden Street - Monkey Swamp I -107000402 - Hidden Street - Monkey Swamp II -107000403 - Hidden Street - Monkey Swamp III -107000500 - Dungeon - Damp Tree-Forest -107000501 - Dungeon - Damp Forest -108000100 - Hidden Street - Ant Tunnel For Bowman -108000101 - Hidden Street - Ant Tunnel For Bowman -108000102 - Hidden Street - Ant Tunnel For Bowman -108000200 - Hidden Street - Magician's Tree Dungeon -108000201 - Hidden Street - Magician's Tree Dungeon -108000202 - Hidden Street - Magician's Tree Dungeon -108000300 - Hidden Street - Warrior's Rocky Mountain -108000301 - Hidden Street - Warrior's Rocky Mountain -108000302 - Hidden Street - Warrior's Rocky Mountain -108000400 - Hidden Street - Thief's Construction Site -108000401 - Hidden Street - Thief's Construction Site -108000402 - Hidden Street - Thief's Construction Site -108010100 - Hidden Street - The Path of Glittering Crystal -108010101 - Hidden Street - The Other Dimension -108010200 - Hidden Street - The Path of Glittering Crystal -108010201 - Hidden Street - The Other Dimension -108010300 - Hidden Street - The Path of Glittering Crystal -108010301 - Hidden Street - The Other Dimension -108010400 - Hidden Street - The Path of Glittering Crystal -108010401 - Hidden Street - The Other Dimension -109010000 - Hidden Street - Find the Jewel -109010100 - Hidden Street - Eastern Field -109010101 - Hidden Street - Hidden Place in the East -109010102 - Hidden Street - Hidden Place in the East -109010103 - Hidden Street - Hidden Place in the East -109010104 - Hidden Street - Hidden Place in the East -109010105 - Hidden Street - Hidden Place in the East -109010106 - Hidden Street - Hidden Place in the East -109010107 - Hidden Street - Hidden Place in the East -109010108 - Hidden Street - Hidden Place in the East -109010109 - Hidden Street - Hidden Place in the East -109010110 - Hidden Street - Hidden Place in the East -109010200 - Hidden Street - Southern Field -109010201 - Hidden Street - Hidden Place in South -109010202 - Hidden Street - Hidden Place in South -109010203 - Hidden Street - Hidden Place in South -109010204 - Hidden Street - Hidden Place in South -109010205 - Hidden Street - Hidden Place in South -109010206 - Hidden Street - Hidden Place in South -109010300 - Hidden Street - Northern Field -109010301 - Hidden Street - Hidden Room in North 1 -109010302 - Hidden Street - Hidden Room in North 2 -109010303 - Hidden Street - Hidden Room in North 3 -109010400 - Hidden Street - Western Field -109010401 - Hidden Street - Hidden Room in West 1 -109010402 - Hidden Street - Hidden Room in West 2 -109010403 - Hidden Street - Hidden Room in West 3 -109020001 - Hidden Street - OX Quiz -109030001 - Hidden Street - Ola Ola -109030002 - Hidden Street - Ola Ola -109030003 - Hidden Street - Ola Ola -109030101 - Hidden Street - Ola Ola -109030102 - Hidden Street - Ola Ola -109030103 - Hidden Street - Ola Ola -109030201 - Hidden Street - Ola Ola -109030202 - Hidden Street - Ola Ola -109030203 - Hidden Street - Ola Ola -109030301 - Hidden Street - Ola Ola -109030302 - Hidden Street - Ola Ola -109030303 - Hidden Street - Ola Ola -109030401 - Hidden Street - Ola Ola -109030402 - Hidden Street - Ola Ola -109030403 - Hidden Street - Ola Ola -109040000 - Hidden Street - MapleStory Physical Fitness Test -109040001 - Hidden Street - MapleStory Physical Fitness Challenge -109040002 - Hidden Street - MapleStory Physical Fitness Challenge -109040003 - Hidden Street - MapleStory Physical Fitness Challenge -109040004 - Hidden Street - MapleStory Physical Fitness Challenge -109050000 - Hidden Street - Receiving the Reward For the Event -109050001 - Hidden Street - Leaving the Event -109060000 - Hidden Street - Snowball -109060001 - Hidden Street - Event Map Entrance -109060002 - Hidden Street - Event Map Entrance -109070000 - Hidden Street - Minigame Challenge -109080000 - Hidden Street - Coconut Harvest -109080001 - Hidden Street - Coconut Harvest -109080002 - Hidden Street - Coconut Harvest -109080003 - Hidden Street - G? Coconut Season -110000000 - Florina Road - Florina Beach -110010000 - Florina Road - A Look-Out Shed Around the Beach -110020000 - Florina Road - Lorang Lorang -110020001 - Hidden Street - Lorang Lorang Lorang -110030000 - Florina Road - Lorang and Clang -110030001 - Florina Road - Clang and Lorang -110040000 - Florina Road - Hot Sand -180000000 - Victoria Road - Ellinia -180000001 - Victoria Road - Ellinia -180000002 - Victoria Road - Ellinia -180000003 - Victoria Road - Ellinia -190000000 - Premium Road - Another Sanctuary -190000001 - Premium Road - Breathing Sanctuary I -190000002 - Premium Road - Breathing Sanctuary II -191000000 - Premium Road - The Monkey Forest -191000001 - Premium Road - Tree Dungeon -192000000 - Premium Road - Dry Rocky Mountain -192000001 - Premium Road - Dry Rocky Mountain II -193000000 - Premium Road - Kerning City Internet Cafe -195000000 - Premium Road - Dangerous Ant-Hole -195010000 - Premium Road - Evil Eye's Cave -195020000 - Premium Road - The Lightless Cave -195030000 - Premium Road - Cargo Hunting Ground -196000000 - Premium Road - The Chilly Hill -196010000 - Premium Road - The Chilly Cliff -197000000 - Premium Road - Windy Terrace I -197010000 - Premium Road - Windy Terrace II -120000000 - Victoria Road - Nautilus Harbor -120000100 - The Nautilus - Top Floor - Hallway -120000101 - The Nautilus - Navigation Room -120000102 - The Nautilus - Lord Jonathan's Room -120000103 - The Nautilus - Cafeteria -120000104 - The Nautilus - Training Room -120000200 - The Nautilus - Mid Floor - Hallway -120000201 - The Nautilus - Conference Room -120000202 - The Nautilus - Bedroom -120000300 - The Nautilus - Bottom Floor - Hallway -120000301 - The Nautilus - Generator Room -120010000 - Victoria Road - On the Way to the Harbor -108000500 - Hidden Street - Pirate Test Room -108000501 - Hidden Street - Pirate Test Room -108000502 - Hidden Street - Pirate Test Room -108000503 - Hidden Street - Pirate Test Room -108010500 - Shadow Zone - The Path of Glittering Crystal -108010501 - Shadow Zone - The Other Dimension -100020100 - Mini Dungeon - Henesys Pig Farm -100020101 - Mini Dungeon - Henesys Pig Farm -100020102 - Mini Dungeon - Henesys Pig Farm -100020103 - Mini Dungeon - Henesys Pig Farm -100020104 - Mini Dungeon - Henesys Pig Farm -100020105 - Mini Dungeon - Henesys Pig Farm -100020106 - Mini Dungeon - Henesys Pig Farm -100020107 - Mini Dungeon - Henesys Pig Farm -100020108 - Mini Dungeon - Henesys Pig Farm -100020109 - Mini Dungeon - Henesys Pig Farm -100020110 - Mini Dungeon - Henesys Pig Farm -100020111 - Mini Dungeon - Henesys Pig Farm -100020112 - Mini Dungeon - Henesys Pig Farm -100020113 - Mini Dungeon - Henesys Pig Farm -100020114 - Mini Dungeon - Henesys Pig Farm -100020115 - Mini Dungeon - Henesys Pig Farm -100020116 - Mini Dungeon - Henesys Pig Farm -100020117 - Mini Dungeon - Henesys Pig Farm -100020118 - Mini Dungeon - Henesys Pig Farm -100020119 - Mini Dungeon - Henesys Pig Farm -100020120 - Mini Dungeon - Henesys Pig Farm -100020121 - Mini Dungeon - Henesys Pig Farm -100020122 - Mini Dungeon - Henesys Pig Farm -100020123 - Mini Dungeon - Henesys Pig Farm -100020124 - Mini Dungeon - Henesys Pig Farm -100020125 - Mini Dungeon - Henesys Pig Farm -100020126 - Mini Dungeon - Henesys Pig Farm -100020127 - Mini Dungeon - Henesys Pig Farm -100020128 - Mini Dungeon - Henesys Pig Farm -100020129 - Mini Dungeon - Henesys Pig Farm -100010100 - Hidden Street - Nefarious Hill -101000400 - Victoria Road - Sky Ferry -101010103 - Victoria Road - Top of the Tree That Grew -105040320 - Mini Dungeon - Golem's Castle Ruins -105040321 - Mini Dungeon - Golem's Castle Ruins -105040322 - Mini Dungeon - Golem's Castle Ruins -105040323 - Mini Dungeon - Golem's Castle Ruins -105040324 - Mini Dungeon - Golem's Castle Ruins -105040325 - Mini Dungeon - Golem's Castle Ruins -105040326 - Mini Dungeon - Golem's Castle Ruins -105040327 - Mini Dungeon - Golem's Castle Ruins -105040328 - Mini Dungeon - Golem's Castle Ruins -105040329 - Mini Dungeon - Golem's Castle Ruins -105040330 - Mini Dungeon - Golem's Castle Ruins -105040331 - Mini Dungeon - Golem's Castle Ruins -105040332 - Mini Dungeon - Golem's Castle Ruins -105040333 - Mini Dungeon - Golem's Castle Ruins -105040334 - Mini Dungeon - Golem's Castle Ruins -105040335 - Mini Dungeon - Golem's Castle Ruins -105040336 - Mini Dungeon - Golem's Castle Ruins -105040337 - Mini Dungeon - Golem's Castle Ruins -105040338 - Mini Dungeon - Golem's Castle Ruins -105040339 - Mini Dungeon - Golem's Castle Ruins -105040340 - Mini Dungeon - Golem's Castle Ruins -105040341 - Mini Dungeon - Golem's Castle Ruins -105040342 - Mini Dungeon - Golem's Castle Ruins -105040343 - Mini Dungeon - Golem's Castle Ruins -105040344 - Mini Dungeon - Golem's Castle Ruins -105040345 - Mini Dungeon - Golem's Castle Ruins -105040346 - Mini Dungeon - Golem's Castle Ruins -105040347 - Mini Dungeon - Golem's Castle Ruins -105040348 - Mini Dungeon - Golem's Castle Ruins -105040349 - Mini Dungeon - Golem's Castle Ruins -105040350 - Mini Dungeon - Golem's Castle Ruins -105040351 - Mini Dungeon - Golem's Castle Ruins -105040352 - Mini Dungeon - Golem's Castle Ruins -105040353 - Mini Dungeon - Golem's Castle Ruins -105040354 - Mini Dungeon - Golem's Castle Ruins -105040355 - Mini Dungeon - Golem's Castle Ruins -105040356 - Mini Dungeon - Golem's Castle Ruins -105040357 - Mini Dungeon - Golem's Castle Ruins -105040358 - Mini Dungeon - Golem's Castle Ruins -105040359 - Mini Dungeon - Golem's Castle Ruins -105050101 - Mini Dungeon - Cave of Mushrooms -105050102 - Mini Dungeon - Cave of Mushrooms -105050103 - Mini Dungeon - Cave of Mushrooms -105050104 - Mini Dungeon - Cave of Mushrooms -105050105 - Mini Dungeon - Cave of Mushrooms -105050106 - Mini Dungeon - Cave of Mushrooms -105050107 - Mini Dungeon - Cave of Mushrooms -105050108 - Mini Dungeon - Cave of Mushrooms -105050109 - Mini Dungeon - Cave of Mushrooms -105050110 - Mini Dungeon - Cave of Mushrooms -105050111 - Mini Dungeon - Cave of Mushrooms -105050112 - Mini Dungeon - Cave of Mushrooms -105050113 - Mini Dungeon - Cave of Mushrooms -105050114 - Mini Dungeon - Cave of Mushrooms -105050115 - Mini Dungeon - Cave of Mushrooms -105050116 - Mini Dungeon - Cave of Mushrooms -105050117 - Mini Dungeon - Cave of Mushrooms -105050118 - Mini Dungeon - Cave of Mushrooms -105050119 - Mini Dungeon - Cave of Mushrooms -105050120 - Mini Dungeon - Cave of Mushrooms -105050121 - Mini Dungeon - Cave of Mushrooms -105050122 - Mini Dungeon - Cave of Mushrooms -105050123 - Mini Dungeon - Cave of Mushrooms -105050124 - Mini Dungeon - Cave of Mushrooms -105050125 - Mini Dungeon - Cave of Mushrooms -105050126 - Mini Dungeon - Cave of Mushrooms -105050127 - Mini Dungeon - Cave of Mushrooms -105050128 - Mini Dungeon - Cave of Mushrooms -105050129 - Mini Dungeon - Cave of Mushrooms -105050130 - Mini Dungeon - Cave of Mushrooms -109080010 - Hidden Street - Coke Play Season -109080011 - Hidden Street - Coke Play Season -109080012 - Hidden Street - Coke Play Season -107000301 - Hidden Street - Hut in the Swamp -108000600 - Hidden Street - The 2nd Drill Hall -108000601 - Hidden Street - The 2nd Drill Hall -108000602 - Hidden Street - The 2nd Drill Hall -108010600 - Hidden Street - Tino's Forest -108010610 - Hidden Street - Tiv's Forest -108010620 - Hidden Street - Timu's Forest -108010630 - Hidden Street - Tiru's Forest -108010640 - Hidden Street - Entrance to the Drill Hall -109060003 - Hidden Street - Event Map Entrance -109060004 - Hidden Street - Rolling Snowball<2Stage> -109060005 - Hidden Street - Event Map Entrance -130000000 - Empress' Road - Ereve -130000100 - Empress' Road - Knights Chamber -130000110 - Empress' Road - Knights Chamber 2nd Floor -130000120 - Empress' Road - Knights Chamber 3rd Floor -130000200 - Empress' Road - Crossroads of Ereve -130000210 - Empress' Road - Sky Ferry -130010000 - Empress' Road - Training Forest I -130010010 - Empress' Road - Tino's Forest -130010020 - Empress' Road - Tiv's Forest -130010100 - Empress' Road - Training Forest II -130010110 - Empress' Road - Timu's Forest -130010120 - Empress' Road - Tiru's Forest -130010200 - Empress' Road - Training Forest III -130010210 - Empress' Road - Tiguru's Forest -130010220 - Empress' Road - Kiridu's Hatchery -130020000 - Empress' Road - Entrance to the Drill Hall -103000007 - Victoria Road - Kerning City Night Market -105090320 - Mini Dungeon - Drake's Blue Cave -105100000 - Dungeon - Stairway to the Underground Temple -105100100 - Dungeon - Bottom of the Temple -105100101 - Hidden Street - Tristan's Resting Place -105100300 - Dungeon - Balrog's Tomb -105100301 - Dungeon - Balrog's Disappearance Site -105100400 - Dungeon - Balrog's Tomb -105100401 - Dungeon - Balrog's Disappearance Site -109090000 - Hidden Street - Sheep Ranch Lobby -109090001 - Hidden Street - Sheep Ranch Lobby -109090002 - Hidden Street - Sheep Ranch Lobby -109090003 - Hidden Street - Sheep Ranch Lobby -109090004 - Hidden Street - Sheep Ranch Lobby -109090100 - Hidden Street - Sheep Camp Waiting Room -109090101 - Hidden Street - Sheep Camp Waiting Room -109090102 - Hidden Street - Sheep Camp Waiting Room -109090103 - Hidden Street - Sheep Camp Waiting Room -109090104 - Hidden Street - Sheep Camp Waiting Room -109090200 - Hidden Street - Wolf Camp Waiting Room -109090201 - Hidden Street - Wolf Camp Waiting Room -109090202 - Hidden Street - Wolf Camp Waiting Room -109090203 - Hidden Street - Wolf Camp Waiting Room -109090204 - Hidden Street - Wolf Camp Waiting Room -109090300 - Hidden Street - Sheep Ranch Event -109090301 - Hidden Street - Sheep Ranch Event -109090302 - Hidden Street - Sheep Ranch Event -109090303 - Hidden Street - Sheep Ranch Event -109090304 - Hidden Street - Sheep Ranch Event -130030000 - Empress's Road - Forest of Beginning 1 -130030001 - Empress's Road - Forest of Beginning 2 -130030002 - Empress's Road - Forest of Beginning 3 -130030003 - Empress's Road - Forest of Beginning 4 -130030004 - Empress's Road - Forest of Beginning 5 -130030005 - Empress's Road - A path out of the Forest of Beginning -130030006 - Empress's Road - Small Bridge -100000204 - Victoria Road - Hall of Bowmen -101000004 - Victoria Road - Hall of Magicians -102000004 - Victoria Road - Hall of Warriors -103000008 - Victoria Road - Hall of Thieves -104000004 - Victoria Road - Lith Harbor Info Shop -105040201 - Dungeon - Puppeteer's Hiding Place -106020000 - Mushroom Castle - Mushroom Forest Field -106020100 - Mushroom Castle - Secluded Mushroom Forest -106020200 - Mushroom Castle - Isolated Mushroom Forest -106020300 - Mushroom Castle - Deep Inside Mushroom Forest -106020400 - Mushroom Castle - Split Road of Destiny -106020401 - Mushroom Castle - Steep Downhill 1 -106020402 - Mushroom Castle - Steep Downhill 2 -106020403 - Mushroom Castle - Shadow Cliffs -106020500 - Mushroom Castle - Castle Wall Edge -106020501 - Mushroom Castle - Castle Wall Edge -106020600 - Mushroom Castle - Outer Castle Wall -106020601 - Mushroom Castle - On the Watch -106020700 - Mushroom Castle - Skyscraper 1 -106020800 - Mushroom Castle - Skyscraper 2 -106020900 - Mushroom Castle - West Castle Tower -106021000 - Mushroom Castle - Skyscraper 3 -106021001 - Mushroom Castle - Security Room -106021100 - Mushroom Castle - Skyscraper 4 -106021200 - Mushroom Castle - Skyscraper 5 -106021201 - Mushroom Castle - Central Castle Tower -106021300 - Mushroom Castle - Skyscraper 6 -106021400 - Mushroom Castle - East Castle Tower -106021401 - Mushroom Castle - Entrance to Wedding Hall -106021402 - Mushroom Castle - The Last Castle Tower -106021500 - Mushroom Castle - Entrance to Wedding Hall -106021501 - Mushroom Castle - Castle Tower that leads to the Top -106021600 - Mushroom Castle - Wedding Hall -106021601 - Mushroom Castle - Wedding Hall -106021700 - Mushroom Castle - Wedding Hall -106021800 - Mushroom Castle - Dead End -108000700 - Aran's Past - Head Blacksmith's Shop -108000701 - Aran's Past - Head Blacksmith's Shop -108000702 - Aran's Past - Head Blacksmith's Shop -108000703 - Aran's Past - Head Blacksmith's Shop -108000704 - Aran's Past - Head Blacksmith's Shop -108000705 - Aran's Past - Head Blacksmith's Shop -108000706 - Aran's Past - Head Blacksmith's Shop -108000707 - Aran's Past - Head Blacksmith's Shop -108000708 - Aran's Past - Head Blacksmith's Shop -108000709 - Aran's Past - Head Blacksmith's Shop -108000710 - Aran's Past - Outside Blacksmith's Shop -108000711 - Aran's Past - Outside Blacksmith's Shop -108000712 - Aran's Past - Outside Blacksmith's Shop -108000713 - Aran's Past - Outside Blacksmith's Shop -108000714 - Aran's Past - Outside Blacksmith's Shop -108000715 - Aran's Past - Outside Blacksmith's Shop -108000716 - Aran's Past - Outside Blacksmith's Shop -108000717 - Aran's Past - Outside Blacksmith's Shop -108000718 - Aran's Past - Outside Blacksmith's Shop -108000719 - Aran's Past - Outside Blacksmith's Shop -108010700 - Penguin Port in Emergency - Find the Black Crow! -108010701 - Aran's Past - Razor Sharp Cliff -108010702 - Aran's Past - Black Crow Region -140000000 - Snow Island - Rien -140000001 - Snow Island - Lilin's Home -140000010 - Snow Island - Rien Library 1st Floor -140000011 - Snow Island - Rien Library 2nd Floor -140000012 - Snow Island - Rien Library 3rd Floor -140010000 - Snow Island - Dangerous Forest -140010100 - Snow Island - Dangerous Forest -140010110 - Snow Island - Palace of the Master -140010200 - Snow Island - Dangerous Forest -140010210 - Hidden Street - Field of Wolves -140020000 - Snow Island - Snow-covered Field 1 -140020100 - Snow Island - Snow-covered Field 2 -140020110 - Snow Island - Dangerous Forest -140020200 - Snow Island - Snow-covered Field 3 -140020300 - Snow Island - Dangerous Forest -140030000 - Snow Island - Mirror Cave -140090000 - Snow Island - Ice Cave -140090100 - Snow Island - Cold Forest 1 -140090200 - Snow Island - Cold Forest 2 -140090300 - Snow Island - Cold Forest 3 -140090400 - Snow Island - Cold Forest 4 -140090500 - Snow Island - Cold Forest 5 -140000002 - Snow Island - Rien Library -100000205 - Victoria Road - Hall of Bowmen -100030100 - Utah's House - Small Attic -100030101 - Utah's House - Living Room -100030102 - Utah's House - Front Yard -100030103 - Utah's House - Back Yard -100030200 - Farm Street - Small Forest Trail -100030300 - Farm Street - Farm Center -100030310 - Farm Street - Large Forest Trail -100030400 - Farm Street - Farm Entrance -101000005 - Victoria Road - Hall of Magicians -102000005 - Victoria Road - Hall of Warriors -103000009 - Victoria Road - Hall of Thieves -103000300 - Kerning City Subway - Subway Train -103000301 - Kerning City Subway - Subway Train -103000302 - Kerning City Subway - Subway Train -103000310 - Kerning City Subway - Kerning Square Station -103040000 - Kerning Square - Kerning Square Lobby -103040100 - Kerning Square - 1st Floor 2nd Floor Area A -103040101 - Kerning Square - 1st Floor 2nd Floor Area B -103040102 - Kerning Square - 1st Floor 2nd Floor Area C -103040103 - Kerning Square - 1st Floor 2nd Floor Area D -103040200 - Kerning Square - 3rd Floor 4th Floor Area A -103040201 - Kerning Square - 3rd Floor 4th Floor Area B -103040202 - Kerning Square - 3rd Floor 4th Floor Area C -103040203 - Kerning Square - 3rd Floor 4th Floor Area D -103040300 - Kerning Square - 5th Floor 6th Floor Area A -103040301 - Kerning Square - 5th Floor 6th Floor Area B -103040302 - Kerning Square - 5th Floor 6th Floor Area C -103040303 - Kerning Square - 5th Floor 6th Floor Area D -103040400 - Kerning Square - 7th Floor 8th Floor Area A -103040410 - Kerning Square - 7th Floor 8th Floor Area B -103040420 - Kerning Square - 7th Floor 8th Floor Area C -103040430 - Kerning Square - 7th Floor 8th Floor Area D -103040440 - Kerning Square - VIP Zone Area A -103040450 - Kerning Square - VIP Zone Area B -103040460 - Kerning Square - VIP Zone Area C -120000105 - The Nautilus - Training Room -130000101 - Empress's Road - Knights Chamber -140010111 - Snow Island - Palace of the Master - -ossyria - -200000000 - Orbis - Orbis -200000001 - Orbis - Orbis Weapon Store -200000002 - Orbis - Orbis Department Store -200000100 - Orbis - Orbis Station Enterence -200000110 - Orbis - Station Tunnel -200000111 - Orbis - Station -200000112 - Orbis - Before Takeoff -200000120 - Orbis - Station Pathway -200000121 - Orbis - Station -200000122 - Orbis - Before the Departure -200000130 - Orbis - Cabin Path -200000131 - Orbis - Cabin -200000132 - Orbis - Cabin -200000140 - Orbis - Cabin Path -200000141 - Orbis - Cabin -200000150 - Orbis - Station Tunnel -200000151 - Orbis - Station -200000152 - Orbis - Station -200000200 - Orbis - Orbis Park -200000201 - Orbis Park - Orbis Plastic Surgery -200000202 - Orbis Park - Orbis Hair Salon -200000203 - Orbis Park - Orbis Skin-Care -200000300 - Orbis - Top of the Hill -200000301 - Orbis - Guild Headquarters -200010000 - Orbis - Cloud Park I -200010100 - Orbis - The Road to Garden of 3 Colors -200010110 - Orbis - Garden of Red I -200010111 - Orbis - Garden of Red II -200010120 - Orbis - Garden of Yellow I -200010121 - Orbis - Garden of Yellow II -200010130 - Orbis - Garden of Green I -200010131 - Orbis - Garden of Green II -200010200 - Orbis - Stairway to the Sky I -200010300 - Orbis - Stairway to the Sky II -200010301 - Orbis - Garden of Darkness I -200010302 - Orbis - Garden of Darkness II -200020000 - Orbis - Cloud Park II -200030000 - Orbis - Strolling Path -200040000 - Orbis - Cloud Park III -200040001 - Orbis - Disposed Flower Garden -200050000 - Orbis - Cloud Park IV -200050001 - Orbis - Old Man's House -200060000 - Orbis - Strolling Path II -200070000 - Orbis - Cloud Park V -200080000 - Orbis - Cloud Park VI -200080100 - Orbis - Entrance to Orbis Tower -200080101 - Orbis - The Unknown Tower -200080200 - Orbis - Orbis Tower <20th Floor> -200080300 - Orbis - Orbis Tower <19th Floor> -200080400 - Orbis - Orbis Tower <18th Floor> -200080500 - Orbis - Orbis Tower <17th Floor> -200080600 - Orbis - Orbis Tower <16th Floor> -200080700 - Orbis - Orbis Tower <15th Floor> -200080800 - Orbis - Orbis Tower <14th Floor> -200080900 - Orbis - Orbis Tower <13th Floor> -200081000 - Orbis - Orbis Tower <12th Floor> -200081100 - Orbis - Orbis Tower <11th Floor> -200081200 - Orbis - Orbis Tower <10th Floor> -200081201 - Orbis - Orbis Tower -200081300 - Orbis - Orbis Tower <9th Floor> -200081400 - Orbis - Orbis Tower <8th Floor> -200081500 - Orbis - Orbis Tower <7th Floor> -200081600 - Orbis - Orbis Tower <6th Floor> -200081700 - Orbis - Orbis Tower <5th Floor> -200081800 - Orbis - Orbis Tower <4th Floor> -200081900 - Orbis - Orbis Tower <3rd Floor> -200082000 - Orbis - Orbis Tower <2nd Floor> -200082100 - Orbis - Orbis Tower <1st Floor> -200082200 - Orbis - Orbis Tower -200082300 - Orbis - Orbis Tower -200082301 - Orbis - Orbis Tower -200090000 - During the Ride - To Ellinia -200090001 - During the Ride - Cabin -200090010 - During the Ride - To Orbis -200090011 - During the Ride - Cabin -200090100 - On a Voyage - Ludibrium -200090110 - On a Voyage - Orbis -200090200 - During the Ride - To Leafre -200090210 - During the Ride - To Orbis -200090300 - During the Ride - To Mu Lung -200090310 - During the Ride - To Orbis -200090400 - Cruising - To Ariant -200090410 - Cruising - To Orbis -209000000 - Hidden Street - Happyville -209000001 - Hidden Street - The Hill of Christmas -209000002 - Hidden Street - The Hill of Christmas -209000003 - Hidden Street - The Hill of Christmas -209000004 - Hidden Street - The Hill of Christmas -209000005 - Hidden Street - The Hill of Christmas -209000006 - Hidden Street - The Hill of Christmas -209000007 - Hidden Street - The Hill of Christmas -209000008 - Hidden Street - The Hill of Christmas -209000009 - Hidden Street - The Hill of Christmas -209000010 - Hidden Street - The Hill of Christmas -209000011 - Hidden Street - The Hill of Christmas -209000012 - Hidden Street - The Hill of Christmas -209000013 - Hidden Street - The Hill of Christmas -209000014 - Hidden Street - The Hill of Christmas -209000015 - Hidden Street - The Hill of Christmas -209080000 - Hidden Street - Extra Frosty Snow Zone -211000000 - El Nath - El Nath -211000001 - El Nath - Chief's Residence -211000100 - El Nath - El Nath Market -211000101 - El Nath - El Nath Weapon Store -211000102 - El Nath - El Nath Department Store -211000110 - El Nath - Entrance to El Nath Free Market -211000111 - El Nath - El Nath Free Market <1> -211000112 - El Nath - El Nath Free Market <2> -211000113 - El Nath - El Nath Free Market <3> -211000114 - El Nath - El Nath Free Market <4> -211000115 - El Nath - El Nath Free Market <5> -211000200 - El Nath - Snowy Hill -211010000 - El Nath - Watch Out for Icy Path I -211020000 - El Nath - Watch Out for Icy Path II -211030000 - El Nath - Cold Field I -211040000 - El Nath - Cold Field II -211040001 - Hidden Street - The Crown-Flyer -211040100 - El Nath - Ice Valley I -211040101 - Hidden Street - Valley of Snowman -211040200 - El Nath - Ice Valley II -211040300 - El Nath - Sharp Cliff I -211040400 - El Nath - Sharp Cliff II -211040401 - Hidden Street - Holy Ground at the Snowfield -211040500 - El Nath - Wolf Territory I -211040600 - El Nath - Wolf Territory II -211040700 - El Nath - Dangerous Cliff -211040800 - El Nath - Wolf Territory III -211040900 - El Nath - Wolf Territory IV -211041000 - El Nath - Wolf Territory V -211041100 - El Nath - Forest of Dead Trees I -211041200 - El Nath - Forest of Dead Trees II -211041300 - El Nath - Forest of Dead Trees III -211041400 - El Nath - Forest of Dead Trees IV -211041500 - El Nath - Dead Mine I -211041600 - El Nath - Dead Mine II -211041700 - El Nath - Dead Mine III -211041800 - El Nath - Dead Mine IV -211041900 - El Nath - The Passage -211042000 - El Nath - The Cave of Trial I -211042100 - El Nath - The Cave of Trial II -211042101 - Hidden Street - Cave Within the Cave -211042200 - El Nath - The Cave of Trial III -211042300 - El Nath - The Door to Zakum -211042400 - El Nath - Entrance to Zakum Altar -211050000 - El Nath - Icy Cold Field -220000000 - Ludibrium - Ludibrium -220000001 - Ludibrium - Ludibrium Weapon Store -220000002 - Ludibrium - Ludibrium Pharmacy -220000003 - Ludibrium - Ludibrium Plastic Surgery -220000004 - Ludibrium - Ludibrium Hair Salon -220000005 - Ludibrium - Ludibrium Skin Care -220000006 - Ludibrium - Ludibrium Pet Walkway -220000100 - Ludibrium - Ludibrium Ticketing Place -220000110 - Ludibrium - Station -220000111 - Ludibrium - Before the Departure -220000200 - Ludibrium - Free Market Entrance -220000201 - Ludibrium - Free Market<1> -220000202 - Ludibrium - Free Market<2> -220000203 - Ludibrium - Free Market<3> -220000204 - Ludibrium - Free Market<4> -220000205 - Ludibrium - Free Market<5> -220000206 - Ludibrium - Free Market<6> -220000207 - Ludibrium - Free Market<7> -220000208 - Ludibrium - Free Market<8> -220000209 - Ludibrium - Free Market<9> -220000300 - Ludibrium - Ludibrium Village -220000301 - Ludibrium - Korin's House -220000302 - Ludibrium - Manager Karl's House -220000303 - Ludibrium - Tara and Sarah's House -220000304 - Ludibrium - Chloe's House -220000305 - Ludibrium - Empty House I -220000306 - Ludibrium - Empty House II -220000307 - Ludibrium - Mason's House -220000400 - Ludibrium - Eos Tower Entrance -220000500 - Ludibrium - Helios Tower Entrance -220010000 - Ludibrium - Cloud Terrace<5> -220010001 - Ludibrium - Cloud Balcony -220010100 - Ludibrium - Cloud Terrace<4> -220010200 - Ludibrium - Cloud Terrace<3> -220010300 - Ludibrium - Cloud Terrace<2> -220010400 - Ludibrium - Cloud Terrace<1> -220010500 - Ludibrium - Terrace Hall -220010600 - Ludibrium - Sky Terrace<1> -220010700 - Ludibrium - Sky Terrace<2> -220010800 - Ludibrium - Sky Terrace<3> -220010900 - Ludibrium - Sky Terrace<4> -220011000 - Ludibrium - Sky Terrace<5> -220011001 - Ludibrium - Sky Terrace -220020000 - Ludibrium - Toy Factory Zone 1 -220020100 - Ludibrium - Toy Factory Zone 2 -220020200 - Ludibrium - Toy Factory Zone 3 -220020300 - Ludibrium - Toy Factory

-220020400 - Ludibrium - Toy Factory Zone 5 -220020500 - Ludibrium - Toy Factory Zone 6 -220020600 - Ludibrium - Toy Factory -220030000 - Ludibrium - Toy Factory Zone 1 -220030100 - Ludibrium - Toy Factory Zone 2 -220030200 - Ludibrium - Toy Factory
-220030300 - Ludibrium - Toy Factory Zone 3 -220030400 - Ludibrium - Toy Factory Zone 4 -220040000 - Ludibrium - The Path of Time <1> -220040100 - Ludibrium - The Path of Time <2> -220040200 - Ludibrium - Crossroad of Time -220040300 - Ludibrium - The Path of Time <3> -220040400 - Ludibrium - The Path of Time <4> -220050000 - Ludibrium - Lost Time <1> -220050100 - Ludibrium - Whirlpool of Time -220050200 - Ludibrium - Lost Time <2> -220050300 - Ludibrium - Path of Time -220060000 - Ludibrium - Warped Path of Time<1> -220060100 - Ludibrium - Warped Path of Time<2> -220060200 - Ludibrium - Warped Path of Time<3> -220060201 - Hidden Street - Unbalanced Time -220060300 - Ludibrium - Warped Path of Time<4> -220060301 - Hidden Street - Twisted Time -220060400 - Ludibrium - Warped Passage -220070000 - Ludibrium - Forgotten Path of Time<1> -220070100 - Ludibrium - Forgotten Path of Time<2> -220070200 - Ludibrium - Forgotten Path of Time<3> -220070201 - Hidden Street - Lost Time -220070300 - Ludibrium - Forgotten Path of Time<4> -220070301 - Hidden Street - Forbidden Time -220070400 - Ludibrium - Forgotten Passage -220080000 - Ludibrium - Deep Inside the Clocktower -220080001 - Ludibrium - Origin of Clocktower -221000000 - Omega Sector - Omega Sector -221000001 - Omega Sector - Tunnel -221000100 - Omega Sector - HQ -221000200 - Omega Sector - Silo -221000300 - Omega Sector - Command Center -221000400 - Omega Sector - Safety Zone -221020000 - Ludibrium - Eos Tower 1st Floor -221020100 - Ludibrium - Eos Tower 2nd Floor -221020200 - Ludibrium - Eos Tower 3rd Floor -221020300 - Ludibrium - Eos Tower 4th Floor -221020400 - Ludibrium - Eos Tower 5th Floor -221020500 - Ludibrium - Eos Tower 6th Floor -221020600 - Ludibrium - Eos Tower 7th Floor -221020700 - Ludibrium - Eos Tower 8th Floor -221020701 - Hidden Street - Hidden Tower -221020800 - Ludibrium - Eos Tower 9th Floor -221020900 - Ludibrium - Eos Tower 10th Floor -221021000 - Ludibrium - Eos Tower 11th ~ 20th Floor -221021100 - Ludibrium - Eos Tower 21st Floor -221021200 - Ludibrium - Eos Tower 22nd Floor -221021300 - Ludibrium - Eos Tower 23rd Floor -221021400 - Ludibrium - Eos Tower 24th Floor -221021500 - Ludibrium - Eos Tower 25th Floor -221021600 - Ludibrium - Eos Tower 26th ~ 40th Floor -221021700 - Ludibrium - Eos Tower 41st Floor -221021800 - Ludibrium - Eos Tower 42nd Floor -221021900 - Ludibrium - Eos Tower 43rd Floor -221022000 - Ludibrium - Eos Tower 44th Floor -221022100 - Ludibrium - Eos Tower 45th Floor -221022200 - Ludibrium - Eos Tower 46th ~ 55th Floor -221022300 - Ludibrium - Eos Tower 56th Floor -221022400 - Ludibrium - Eos Tower 57th Floor -221022500 - Ludibrium - Eos Tower 58th Floor -221022600 - Ludibrium - Eos Tower 59th Floor -221022700 - Ludibrium - Eos Tower 60th Floor -221022800 - Ludibrium - Eos Tower 61st ~ 70th Floor -221022900 - Ludibrium - Eos Tower 71st Floor -221023000 - Ludibrium - Eos Tower 72nd Floor -221023100 - Ludibrium - Eos Tower 73rd Floor -221023200 - Ludibrium - Eos Tower 74th Floor -221023300 - Ludibrium - Eos Tower 75th Floor -221023400 - Ludibrium - Eos Tower 76th ~ 90th Floor -221023500 - Ludibrium - Eos Tower 91st Floor -221023600 - Ludibrium - Eos Tower 92nd Floor -221023700 - Ludibrium - Eos Tower 93rd Floor -221023800 - Ludibrium - Eos Tower 94th Floor -221023900 - Ludibrium - Eos Tower 95th Floor -221024000 - Ludibrium - Eos Tower 96th Floor -221024100 - Ludibrium - Eos Tower 97th Floor -221024200 - Ludibrium - Eos Tower 98th Floor -221024300 - Ludibrium - Eos Tower 99th Floor -221024400 - Ludibrium - Eos Tower 100th Floor -221024500 - Ludibrium - Eos Tower 101st Floor -221030000 - Omega Sector - Off-Limits -221030100 - Omega Sector - Boswell Field I -221030200 - Omega Sector - Boswell Field II -221030300 - Omega Sector - Boswell Field III -221030301 - Hidden Street - Mateon Field -221030400 - Omega Sector - Boswell Field IV -221030401 - Hidden Street - Plateon Field -221030500 - Omega Sector - Boswell Field V -221030501 - Hidden Street - Mecateon Field -221030600 - Omega Sector - Boswell Field VI -221030601 - Hidden Street - Defeat Monsters -221040000 - Omega Sector - Kulan Field I -221040100 - Omega Sector - Kulan Field II -221040200 - Omega Sector - Kulan Field III -221040201 - Hidden Street - Barnard Field -221040300 - Omega Sector - Kulan Field IV -221040400 - Omega Sector - Kulan Field V -221040401 - Hidden Street - Entrance to Dogon's HQ -221040402 - Hidden Street - Dogon's HQ -222000000 - Korean Folk Town - Korean Folk Town -222000001 - Korean Folk Town - Pond -222010000 - Korean Folk Town - Entrance to Black Mountain -222010001 - Korean Folk Town - Black Mountain -222010002 - Korean Folk Town - A Small Well -222010100 - Korean Folk Town - Around the Pond -222010101 - Korean Folk Town - Tiger Forest I -222010102 - Korean Folk Town - Tiger Forest II -222010200 - Korean Folk Town - Tiger Ridge -222010201 - Korean Folk Town - Black Mountain -222010300 - Korean Folk Town - Fox Ridge -222010400 - Korean Folk Town - Top of Black Mountain -222010401 - Hidden Street - Haunted House -222020000 - Ludibrium - Helios Tower -222020100 - Ludibrium - Helios Tower <2nd Floor> -222020110 - Ludibrium - Elevator -222020111 - Ludibrium - Elevator -222020200 - Ludibrium - Helios Tower <99th Floor> -222020210 - Ludibrium - Elevator -222020211 - Ludibrium - Elevator -222020300 - Ludibrium - Helios Tower (100th Floor) -222020400 - Hidden Street - Time Control Room -230000000 - Aquarium - Aquarium -230000001 - Aquarium - The Center Hall -230000002 - Aquarium - Department Store -230000003 - Aquarium - Zoo -230010000 - Aqua Road - Ocean I.C -230010001 - Hidden Street - Penguin's Playground -230010100 - Aqua Road - Crystal Gorge -230010200 - Aqua Road - Red Coral Forest -230010201 - Aqua Road - Snowy Whale's Island -230010300 - Aqua Road - Turban Shell Hill -230010400 - Aqua Road - Forked Road : West Sea -230020000 - Aqua Road - Forked Road : East Sea -230020100 - Aqua Road - The Seaweed Tower -230020101 - Hidden Street - The Hidden Town -230020200 - Aqua Road - Sand Castle Playground -230020201 - Aqua Road - Two Palm Trees -230020300 - Aqua Road - Big Fish Valley -230030000 - Aqua Road - Blue Seaweed Road -230030001 - Hidden Street - Fish Resting Spot -230030100 - Aqua Road - Mushroom Coral Hill -230030101 - Aqua Road - Tae Gong's Ferry -230030200 - Aqua Road - The Sharp Unknown -230040000 - Aqua Road - Deep Sea Gorge I -230040001 - Aqua Road - Carta's Cave -230040100 - Aqua Road - Deep Sea Gorge II -230040200 - Aqua Road - Dangerous Sea Gorge I -230040300 - Aqua Road - Dangerous Sea Gorge II -230040301 - Aqua Road - A Small Cave -230040400 - Aqua Road - The Grave of a Wrecked Ship -230040401 - Aqua Road - A Small Wrecked Ship -230040410 - Aqua Road - The Dangerous Cave -230040420 - Aqua Road - The Cave of Pianus -240000000 - Leafre - Leafre -240000001 - Leafre - Chief's House -240000002 - Leafre - Department Store -240000003 - Leafre - Yaku's House -240000004 - Leafre - Ito's House -240000005 - Leafre - Kumo's House -240000006 - Leafre - Pam's House -240000100 - Leafre - Leafre Station Enterence -240000110 - Leafre - Station -240000111 - Leafre - Before Takeoff -240010000 - Leafre - West Leafre Forest -240010100 - Leafre - Minar Forest : West Border -240010101 - Leafre - Peach Monkey Forest -240010200 - Leafre - Cranky Forest -240010300 - Leafre - Steep Hill -240010400 - Leafre - Forest : Crossroad -240010500 - Leafre - Valley of the Antelope -240010501 - Leafre - Forest of the Priest -240010600 - Leafre - Sky Nest II -240010700 - Leafre - Sky Nest I -240010800 - Leafre - Entrance to Sky Nest -240010900 - Leafre - Minar Forest : East Border -240010901 - Leafre - Beetle Forest -240011000 - Leafre - Leafre : East Forest -240020000 - Leafre - The Area of Red Kentaurus -240020100 - Leafre - Battlefield of Fire and Darkness -240020101 - Leafre - Griffey Forest -240020102 - Leafre - Griffey Forest -240020200 - Leafre - The Area of Black Kentaurus -240020300 - Leafre - Battlefield of Water and Darkness -240020400 - Leafre - The Area of Blue Kentaurus -240020401 - Leafre - Manon's Forest -240020402 - Leafre - Manon's Forest -240020500 - Leafre - Battlefield of Fire and Water -240030000 - Leafre - Entrance to Dragon Forest -240030100 - Leafre - Dragon Forest I -240030101 - Leafre - The Burning Forest -240030102 - Leafre - The Forest That Disappeared -240030103 - Hidden Street - The Hidden Dragon Tomb I -240030104 - Hidden Street - The Hidden Dragon Tomb II -240030200 - Leafre - Dragon Forest II -240030300 - Leafre - Dragon Forest III -240040000 - Leafre - The Dragon Canyon -240040100 - Leafre - Canyon : Crossroad -240040200 - Leafre - Canyon : East Road -240040210 - Hidden Street - Blue Wyvern's Nest -240040300 - Leafre - Canyon : West Road -240040310 - Hidden Street - Red Wyvern's Nest -240040400 - Leafre - Wyvern Canyon -240040500 - Leafre - Entrance to Dragon Nest -240040510 - Leafre - Nest of a Dead Dragon -240040511 - Leafre - The Dragon Nest Left Behind -240040520 - Leafre - Destroyed Dragon Nest -240040521 - Leafre - Dangerous Dragon Nest -240040600 - Leafre - Peak of the Big Nest -240040610 - Leafre - Below the Dangerous Nest -240040611 - Leafre - Nine Spirit's Nest -240040700 - Leafre - Cave of Life - Entrance -240050000 - Cave of Life - Cave Entrance -240050100 - Cave of Life - Room of Maze -240050101 - Cave of Life - 1st Room of Maze -240050102 - Cave of Life - 2nd Room of Maze -240050103 - Cave of Life - 3rd Room of Maze -240050104 - Cave of Life - 4th Room of Maze -240050105 - Cave of Life - 5th Room of Maze -240050200 - Cave of Life - Cave of Choice -240050300 - Cave of Life - Cave of Light -240050310 - Cave of Life - Cave of Darkness -240050400 - Cave of Life - Entrance to Horntail's Cave -240050500 - Cave of Life - Cave Exit -240050600 - Cave of Life - Cave : The Road in Between -240060000 - Cave of Life - The Cave of Trial I -240060100 - Cave of Life - The Cave of Trial II -240060200 - Cave of Life - Horntail's Cave -250000000 - Mu Lung - Mu Lung -250000001 - Mu Lung - Tae Sang's House -250000002 - Mu Lung - Mu Lung Department Store -250000003 - Mu Lung - Mu Lung Hair Salon -250000100 - Mu Lung - Mu Lung Temple -250010000 - Mu Lung - Entrance to Sky Forest -250010100 - Mu Lung - Sky Forest : The Train -250010200 - Mu Lung - Deep in the Sky Forest -250010300 - Mu Lung - Snake Area -250010301 - Mu Lung - Wild Bear Area 1 -250010302 - Mu Lung - Wild Bear Area 2 -250010303 - Mu Lung - Wild Bear Area 3 -250010304 - Mu Lung - Territory of Wandering Bear -250010400 - Mu Lung - Where the Sky Forest Ends -250010500 - Mu Lung - Peach Farm1 -250010501 - Mu Lung - Foggy Forest -250010502 - Mu Lung - Virtuous Forest -250010503 - Mu Lung - Goblin Forest 1 -250010504 - Mu Lung - Goblin Forest 2 -250010600 - Mu Lung - Peach Farm 2 -250010700 - Mu Lung - Peach Farm 3 -250020000 - Mu Lung - Practice Field : Beginner -250020100 - Mu Lung - Practice Field : Easy Level -250020200 - Mu Lung - Practice Field : Normal Level -250020300 - Mu Lung - Practice Field : Advanced Level -251000000 - Herb Town - Herb Town -251000100 - Herb Town - Pier on the Beach -251010000 - Herb Town - 10-Year-Old Herb Garden -251010100 - Herb Town - 50-Year-Old Herb Garden -251010101 - Herb Town - 60-Year-Old Herb Garden -251010102 - Herb Town - 80-Year-Old Herb Garden -251010200 - Herb Town - 100-Year-Old Herb Garden -251010300 - Herb Town - Bellflower Valley -251010400 - Herb Town - Old Swamp -251010401 - Herb Town - Red-Nose Pirate Den 1 -251010402 - Herb Town - Red-Nose Pirate Den 2 -251010403 - Herb Town - Red-Nose Pirate Den 3 -251010404 - Herb Town - Over the Pirate Ship -251010410 - Mini Dungeon - Pillage of Treasure Island -251010500 - Herb Town - Isolated Swamp -260000000 - The Burning Road - Ariant -260000100 - Ariant - Ariant Station Platform -260000110 - Ariant - Before Takeoff -260000200 - Ariant - The Town of Ariant -260000201 - Town of Ariant - An Old, Empty House -260000202 - Town of Ariant - Residential Area 1 -260000203 - Town of Ariant - Residential Area 2 -260000204 - Town of Ariant - Residential Area 3 -260000205 - Town of Ariant - Residential Area 4 -260000206 - Town of Ariant - Residential Area 5 -260000207 - Town of Ariant - Residential Area 6 -260000300 - Ariant - Ariant Castle -260000301 - Ariant Castle - Castle Garden -260000302 - Ariant Castle - Palace Hallway -260000303 - Ariant Castle - King's Room -260010000 - The Burning Sands - Outside the West Entrance of Ariant -260010001 - Hidden Street - Young Catthus Desert -260010100 - The Burning Sands - Cactus Desert 1 -260010200 - The Burning Sands - Cactus Desert 2 -260010201 - Hidden Street - Royal Catthus Desert -260010300 - The Burning Sands - White Rock Desert -260010301 - Hidden Street - Bellamoa's Cave -260010400 - The Burning Sands - The Scorching Desert -260010401 - Hidden Street - Rocky Hill -260010402 - Hidden Street - Red Scorpion's Lair -260010500 - The Burning Sands - Dry Desert -260010501 - Hidden Street - Frilled Field -260010600 - The Burning Sands - Tent of the Entertainers -260010700 - The Burning Sands - Outside East Entrance of Ariant -260020000 - The Burning Sands - Outside North Entrance of Ariant -260020100 - The Burning Sands - North Desert Road 1 -260020200 - Sunset Road - North Desert Road 2 -260020300 - Sunset Road - The Desert of Red Sand -260020400 - Sunset Road - The Ruins of Desert Nomads -260020401 - Hidden Street - The Giant of the Sunset -260020500 - Sunset Road - Sahel 3 -260020600 - Sunset Road - Sahel 2 -260020610 - Sunset Road - The Desert of Serenity -260020620 - Sunset Road - The Desert of Dreams -260020700 - Sunset Road - Sahel 1 -280010000 - Adobis's Mission I - Unknown Dead Mine -280010010 - Adobis's Mission I - Area 1-1 -280010011 - Adobis's Mission I - Area 1-2 -280010020 - Adobis's Mission I - Area 2-1 -280010030 - Adobis's Mission I - Area 3-1 -280010031 - Adobis's Mission I - Area 3-2 -280010040 - Adobis's Mission I - Area 4-1 -280010041 - Adobis's Mission I - Area 4-2 -280010050 - Adobis's Mission I - Area 5-1 -280010060 - Adobis's Mission I - Area 6-1 -280010070 - Adobis's Mission I - Area 7-1 -280010071 - Adobis's Mission I - Area 7-2 -280010080 - Adobis's Mission I - Area 8-1 -280010081 - Adobis's Mission I - Area 8-2 -280010090 - Adobis's Mission I - Area 9-1 -280010091 - Adobis's Mission I - Area 9-2 -280010100 - Adobis's Mission I - Area 10-1 -280010101 - Adobis's Mission I - Area 10-2 -280010110 - Adobis's Mission I - Area 11-1 -280010120 - Adobis's Mission I - Area 12-1 -280010130 - Adobis's Mission I - Area 13-1 -280010140 - Adobis's Mission I - Area 14-1 -280010150 - Adobis's Mission I - Area 15-1 -280011000 - Adobis's Mission I - Area 16 -280011001 - Adobis's Mission I - Area 16-1 -280011002 - Adobis's Mission I - Area 16-2 -280011003 - Adobis's Mission I - Area 16-3 -280011004 - Adobis's Mission I - Area 16-4 -280011005 - Adobis's Mission I - Area 16-5 -280011006 - Adobis's Mission I - Area 16-6 -280020000 - Adobis's Mission I - Breath of Lava -280020001 - Adobis's Mission I - Breath of Lava -280030000 - Last Mission - Zakum's Altar -280090000 - Adobis's Mission I - The Room of Tragedy -261000000 - Sunset Road - Magatia -261000001 - Magatia - Home of the Missing Alchemist -261000002 - Magatia - Weapon & Armor Shop -261000010 - Magatia - Zenumist Society -261000011 - Magatia - Zenumist - Hidden Room -261000020 - Magatia - Alcadno Society -261000021 - Magatia - Alcadno - Hidden Room -261010000 - Zenumist Research Institute - Lab - 1st Floor Hallway -261010001 - Zenumist Research Institute - Lab - Unit 101 -261010002 - Zenumist Research Institute - Lab - Unit 102 -261010003 - Zenumist Research Institute - Lab - Unit 103 -261010100 - Zenumist Research Institute - Lab - 2nd Floor Hallway -261010101 - Zenumist Research Institute - Lab - Unit 201 -261010102 - Zenumist Research Institute - Lab - Unit 202 -261010103 - Zenumist Research Institute - Lab - Unit 203 -261020000 - Alcadno Research Institute - Lab - Center Gate -261020100 - Alcadno Research Institute - Lab - Area A-1 -261020200 - Alcadno Research Institute - Lab - Area B-1 -261020300 - Alcadno Research Institute - Lab - Area C-1 -261020301 - Hidden Street - Critical Error -261020302 - Hidden Street - Critical Error -261020303 - Hidden Street - Critical Error -261020304 - Hidden Street - Critical Error -261020305 - Hidden Street - Critical Error -261020306 - Hidden Street - Critical Error -261020307 - Hidden Street - Critical Error -261020308 - Hidden Street - Critical Error -261020309 - Hidden Street - Critical Error -261020310 - Hidden Street - Critical Error -261020311 - Hidden Street - Critical Error -261020312 - Hidden Street - Critical Error -261020313 - Hidden Street - Critical Error -261020314 - Hidden Street - Critical Error -261020315 - Hidden Street - Critical Error -261020316 - Hidden Street - Critical Error -261020317 - Hidden Street - Critical Error -261020318 - Hidden Street - Critical Error -261020319 - Hidden Street - Critical Error -261020320 - Hidden Street - Critical Error -261020321 - Hidden Street - Critical Error -261020322 - Hidden Street - Critical Error -261020323 - Hidden Street - Critical Error -261020324 - Hidden Street - Critical Error -261020325 - Hidden Street - Critical Error -261020326 - Hidden Street - Critical Error -261020327 - Hidden Street - Critical Error -261020328 - Hidden Street - Critical Error -261020329 - Hidden Street - Critical Error -261020330 - Hidden Street - Critical Error -261020331 - Hidden Street - Critical Error -261020332 - Hidden Street - Critical Error -261020333 - Hidden Street - Critical Error -261020334 - Hidden Street - Critical Error -261020335 - Hidden Street - Critical Error -261020336 - Hidden Street - Critical Error -261020337 - Hidden Street - Critical Error -261020338 - Hidden Street - Critical Error -261020339 - Hidden Street - Critical Error -261020340 - Hidden Street - Critical Error -261020400 - Alcadno Research Institute - Lab - Area C-2 -261020401 - Hidden Street - Authorized Personnel Only -261020500 - Alcadno Research Institute - Lab - Area C-3 -261020600 - Alcadno Research Institute - Lab - Area B-3 -261020700 - Alcadno Research Institute - Lab - Area A-3 -261030000 - Hidden Street - Lab - Secret Basement Path -261030001 - Hidden Street - The Unknown Underground Passage -261040000 - Hidden Street - Black Magician's Lab -200090500 - In Flight - Way to Temple of Time -200090510 - In Flight - Way to Minar Forest -221023401 - Mini Dungeon - Drummer Bunny's Lair -221023402 - Mini Dungeon - Drummer Bunny's Lair -221023403 - Mini Dungeon - Drummer Bunny's Lair -221023404 - Mini Dungeon - Drummer Bunny's Lair -221023405 - Mini Dungeon - Drummer Bunny's Lair -221023406 - Mini Dungeon - Drummer Bunny's Lair -221023407 - Mini Dungeon - Drummer Bunny's Lair -221023408 - Mini Dungeon - Drummer Bunny's Lair -221023409 - Mini Dungeon - Drummer Bunny's Lair -221023410 - Mini Dungeon - Drummer Bunny's Lair -221023411 - Mini Dungeon - Drummer Bunny's Lair -221023412 - Mini Dungeon - Drummer Bunny's Lair -221023413 - Mini Dungeon - Drummer Bunny's Lair -221023414 - Mini Dungeon - Drummer Bunny's Lair -221023415 - Mini Dungeon - Drummer Bunny's Lair -221023416 - Mini Dungeon - Drummer Bunny's Lair -221023417 - Mini Dungeon - Drummer Bunny's Lair -221023418 - Mini Dungeon - Drummer Bunny's Lair -221023419 - Mini Dungeon - Drummer Bunny's Lair -221023420 - Mini Dungeon - Drummer Bunny's Lair -221023421 - Mini Dungeon - Drummer Bunny's Lair -221023422 - Mini Dungeon - Drummer Bunny's Lair -221023423 - Mini Dungeon - Drummer Bunny's Lair -221023424 - Mini Dungeon - Drummer Bunny's Lair -221023425 - Mini Dungeon - Drummer Bunny's Lair -221040301 - Hidden Street - Gray's Prairie -222010310 - Hidden Street - Moon Ridge -222010402 - Hidden Street - Goblin House -240020501 - Mini Dungeon - The Round Table of Kentaurus -240020502 - Mini Dungeon - The Round Table of Kentaurus -240020503 - Mini Dungeon - The Round Table of Kentaurus -240020504 - Mini Dungeon - The Round Table of Kentaurus -240020505 - Mini Dungeon - The Round Table of Kentaurus -240020506 - Mini Dungeon - The Round Table of Kentaurus -240020507 - Mini Dungeon - The Round Table of Kentaurus -240020508 - Mini Dungeon - The Round Table of Kentaurus -240020509 - Mini Dungeon - The Round Table of Kentaurus -240020510 - Mini Dungeon - The Round Table of Kentaurus -240020511 - Mini Dungeon - The Round Table of Kentaurus -240020512 - Mini Dungeon - The Round Table of Kentaurus -240020513 - Mini Dungeon - The Round Table of Kentaurus -240020514 - Mini Dungeon - The Round Table of Kentaurus -240020515 - Mini Dungeon - The Round Table of Kentaurus -240020516 - Mini Dungeon - The Round Table of Kentaurus -240020517 - Mini Dungeon - The Round Table of Kentaurus -240020518 - Mini Dungeon - The Round Table of Kentaurus -240020519 - Mini Dungeon - The Round Table of Kentaurus -240020520 - Mini Dungeon - The Round Table of Kentaurus -240020521 - Mini Dungeon - The Round Table of Kentaurus -240020522 - Mini Dungeon - The Round Table of Kentaurus -240020523 - Mini Dungeon - The Round Table of Kentaurus -240020524 - Mini Dungeon - The Round Table of Kentaurus -240020525 - Mini Dungeon - The Round Table of Kentaurus -240020526 - Mini Dungeon - The Round Table of Kentaurus -240020527 - Mini Dungeon - The Round Table of Kentaurus -240020528 - Mini Dungeon - The Round Table of Kentaurus -240020529 - Mini Dungeon - The Round Table of Kentaurus -240020530 - Mini Dungeon - The Round Table of Kentaurus -240020600 - Hidden Street - Isolated Forest -240040401 - Hidden Street - Leviathan's Canyon -240040612 - Hidden Street - Nine Spirit's Nest -240040800 - Mini Dungeon - The Restoring Memory -240040801 - Mini Dungeon - The Restoring Memory -240040802 - Mini Dungeon - The Restoring Memory -240040803 - Mini Dungeon - The Restoring Memory -240040804 - Mini Dungeon - The Restoring Memory -240040805 - Mini Dungeon - The Restoring Memory -240040806 - Mini Dungeon - The Restoring Memory -240040807 - Mini Dungeon - The Restoring Memory -240040808 - Mini Dungeon - The Restoring Memory -240040809 - Mini Dungeon - The Restoring Memory -240040810 - Mini Dungeon - The Restoring Memory -240040811 - Mini Dungeon - The Restoring Memory -240040812 - Mini Dungeon - The Restoring Memory -240040813 - Mini Dungeon - The Restoring Memory -240040814 - Mini Dungeon - The Restoring Memory -240040815 - Mini Dungeon - The Restoring Memory -240040816 - Mini Dungeon - The Restoring Memory -240040817 - Mini Dungeon - The Restoring Memory -240040818 - Mini Dungeon - The Restoring Memory -240040819 - Mini Dungeon - The Restoring Memory -240040820 - Mini Dungeon - The Restoring Memory -240040821 - Mini Dungeon - The Restoring Memory -240040822 - Mini Dungeon - The Restoring Memory -240040823 - Mini Dungeon - The Restoring Memory -240040824 - Mini Dungeon - The Restoring Memory -240040825 - Mini Dungeon - The Restoring Memory -240040826 - Mini Dungeon - The Restoring Memory -240040827 - Mini Dungeon - The Restoring Memory -240040828 - Mini Dungeon - The Restoring Memory -240040829 - Mini Dungeon - The Restoring Memory -240040900 - Mini Dungeon - Newt Secured Zone -240040901 - Mini Dungeon - Newt Secured Zone -240040902 - Mini Dungeon - Newt Secured Zone -240040903 - Mini Dungeon - Newt Secured Zone -240040904 - Mini Dungeon - Newt Secured Zone -240040905 - Mini Dungeon - Newt Secured Zone -240040906 - Mini Dungeon - Newt Secured Zone -240040907 - Mini Dungeon - Newt Secured Zone -240040908 - Mini Dungeon - Newt Secured Zone -240040909 - Mini Dungeon - Newt Secured Zone -240040910 - Mini Dungeon - Newt Secured Zone -240040911 - Mini Dungeon - Newt Secured Zone -240040912 - Mini Dungeon - Newt Secured Zone -240040913 - Mini Dungeon - Newt Secured Zone -240040914 - Mini Dungeon - Newt Secured Zone -240040915 - Mini Dungeon - Newt Secured Zone -240040916 - Mini Dungeon - Newt Secured Zone -240040917 - Mini Dungeon - Newt Secured Zone -240040918 - Mini Dungeon - Newt Secured Zone -240040919 - Mini Dungeon - Newt Secured Zone -240040920 - Mini Dungeon - Newt Secured Zone -240040921 - Mini Dungeon - Newt Secured Zone -240040922 - Mini Dungeon - Newt Secured Zone -240040923 - Mini Dungeon - Newt Secured Zone -240040924 - Mini Dungeon - Newt Secured Zone -240040925 - Mini Dungeon - Newt Secured Zone -240040926 - Mini Dungeon - Newt Secured Zone -240040927 - Mini Dungeon - Newt Secured Zone -240040928 - Mini Dungeon - Newt Secured Zone -240040929 - Mini Dungeon - Newt Secured Zone -260020630 - Mini Dungeon - Hill of Sandstorms -260020631 - Mini Dungeon - Hill of Sandstorms -260020632 - Mini Dungeon - Hill of Sandstorms -260020633 - Mini Dungeon - Hill of Sandstorms -260020634 - Mini Dungeon - Hill of Sandstorms -260020635 - Mini Dungeon - Hill of Sandstorms -260020636 - Mini Dungeon - Hill of Sandstorms -260020637 - Mini Dungeon - Hill of Sandstorms -260020638 - Mini Dungeon - Hill of Sandstorms -260020639 - Mini Dungeon - Hill of Sandstorms -260020640 - Mini Dungeon - Hill of Sandstorms -260020641 - Mini Dungeon - Hill of Sandstorms -260020642 - Mini Dungeon - Hill of Sandstorms -260020643 - Mini Dungeon - Hill of Sandstorms -260020644 - Mini Dungeon - Hill of Sandstorms -260020645 - Mini Dungeon - Hill of Sandstorms -260020646 - Mini Dungeon - Hill of Sandstorms -260020647 - Mini Dungeon - Hill of Sandstorms -260020648 - Mini Dungeon - Hill of Sandstorms -260020649 - Mini Dungeon - Hill of Sandstorms -260020650 - Mini Dungeon - Hill of Sandstorms -260020651 - Mini Dungeon - Hill of Sandstorms -260020652 - Mini Dungeon - Hill of Sandstorms -260020653 - Mini Dungeon - Hill of Sandstorms -260020654 - Mini Dungeon - Hill of Sandstorms -260020655 - Mini Dungeon - Hill of Sandstorms -260020656 - Mini Dungeon - Hill of Sandstorms -260020657 - Mini Dungeon - Hill of Sandstorms -260020658 - Mini Dungeon - Hill of Sandstorms -260020659 - Mini Dungeon - Hill of Sandstorms -260020660 - Mini Dungeon - Hill of Sandstorms -260020661 - Mini Dungeon - Hill of Sandstorms -260020662 - Mini Dungeon - Hill of Sandstorms -260020663 - Mini Dungeon - Hill of Sandstorms -260020664 - Mini Dungeon - Hill of Sandstorms -270000000 - Time Lane - Three Doors -270000100 - Time Lane - Temple of Time -270010000 - Time Lane - Past of the Verdure -270010100 - Time Lane - Memory Lane1 -270010110 - Time Lane - Resting Spot of Memory1 -270010111 - Time Lane - Memory Keeper's Room -270010200 - Time Lane - Memory Lane2 -270010210 - Time Lane - Resting Spot of Memory2 -270010300 - Time Lane - Memory Lane3 -270010310 - Time Lane - Resting Spot of Memory3 -270010400 - Time Lane - Memory Lane4 -270010410 - Memory Keeper - Resting Spot of Memory4 -270010500 - Time Lane - Memory Lane5 -270020000 - Time Lane - Frozen Past -270020100 - Time Lane - Road of Regrets1 -270020110 - Time Lane - Resting Spot of Regret1 -270020200 - Time Lane - Road of Regrets2 -270020210 - Time Lane - Resting Spot of Regret2 -270020211 - Time Lane - Sorcerer's Room -270020300 - Time Lane - Road of Regrets3 -270020310 - Time Lane - Resting Spot of Regret3 -270020400 - Time Lane - Road of Regrets4 -270020410 - Time Lane - Resting Spot of Regret4 -270020500 - Time Lane - Road of Regrets5 -270030000 - Time Lane - Burning Past -270030100 - Time Lane - Road to Oblivion1 -270030110 - Time Lane - Resting Spot of Oblivion1 -270030200 - Time Lane - Road to Oblivion2 -270030210 - Time Lane - Resting Spot of Oblivion2 -270030300 - Time Lane - Road to Oblivion3 -270030310 - Time Lane - Resting Spot of Oblivion3 -270030400 - Time Lane - Road to Oblivion4 -270030410 - Time Lane - Resting Spot of Oblivion4 -270030411 - Time Lane - Record Keeper's Room -270030500 - Time Lane - Road to Oblivion5 -270040000 - Deep Place of Temple - Broken Corridor -270040100 - Deep Place of Temple - Temple Ruins -270050000 - Deep Place of Temple - Forgotten Twilight -270050100 - Deep Place of Temple - Twilight of Gods -270050200 - Deep Place of Temple - Forgotten Twilight -270050300 - Deep Place of Temple - Between Twilight and Daybreak -200000160 - Orbis - Station Hall -200000161 - Orbis - Station -200000204 - Orbis Park - Counseling Room -200090020 - Empress' Road - To Ereve -200090021 - Empress' Road - To Orbis -200090022 - Empress' Road - To Ereve -200090023 - Empress' Road - To Orbis -200090024 - Empress' Road - To Ereve -200090025 - Empress' Road - To Orbis -200090026 - Empress' Road - To Ereve -200090027 - Empress' Road - To Orbis -200090028 - Empress' Road - To Ereve -200090029 - Empress' Road - To Orbis -200090030 - Empress' Road - To Ereve -200090031 - Empress' Road - To Ellinia -200090032 - Empress' Road - To Ereve -200090033 - Empress' Road - To Ellinia -200090034 - Empress' Road - To Ereve -200090035 - Empress' Road - To Ellinia -200090036 - Empress' Road - To Ereve -200090037 - Empress' Road - To Ellinia -200090038 - Empress' Road - To Ereve -200090039 - Empress' Road - To Ellinia -200090040 - Empress' Road - To Ereve -200090041 - Empress' Road - To Orbis -200090042 - Empress' Road - To Ereve -200090043 - Empress' Road - To Orbis -200090044 - Empress' Road - To Ereve -200090045 - Empress' Road - To Orbis -200090046 - Empress' Road - To Ereve -200090047 - Empress' Road - To Orbis -200090048 - Empress' Road - To Ereve -200090049 - Empress' Road - To Orbis -200090050 - Empress' Road - To Ereve -200090051 - Empress' Road - To Ellinia -200090052 - Empress' Road - To Ereve -200090053 - Empress' Road - To Ellinia -200090054 - Empress' Road - To Ereve -200090055 - Empress' Road - To Ellinia -200090056 - Empress' Road - To Ereve -200090057 - Empress' Road - To Ellinia -200090058 - Empress' Road - To Ereve -200090059 - Empress' Road - To Ellinia -200010303 - Hidden Street - Eliza’s Garden -211040102 - Hidden Street - Snow Soul’s Resting Place -209000100 - Happy Village - Cliff’s Hut -219000000 - Hidden Street - Coke Town -219000001 - Hidden Street - Coke Town Sundry Goods Shop -219000002 - Hidden Street - House of Pouch -219000003 - Hidden Street - House of Lolo -219000004 - Hidden Street - Empty House in Coke Town -219000005 - Hidden Street - House of Puch -219010000 - Hidden Street - Coke Ski Camp -219010001 - Hidden Street - Coke Ski Camp -219010100 - Hidden Street - Coke Ski Camp -219010101 - Hidden Street - Coke Ski Camp -219010200 - Hidden Street - Coke Ski Camp -219010201 - Hidden Street - Coke Ski Camp -219010300 - Hidden Street - Coke Ski Camp B1648 -219020000 - Hidden Street - Coke ValleyI -219020001 - Hidden Street - Small Alley -219020100 - Hidden Street - Coke ValleyII -219020200 - Hidden Street - Coke ValleyIII -219020300 - Hidden Street - Coke ValleyIV -219020301 - Hidden Street - Forest of Coke Golem -200060001 - Hidden Street - Neglected Strolling Path -200090060 - Snow Island - To Rien -200090061 - Snow Island - To Rien -200090062 - Snow Island - To Rien -200090063 - Snow Island - To Rien -200090064 - Snow Island - To Rien -200090065 - Snow Island - To Rien -200090066 - Snow Island - To Rien -200090067 - Snow Island - To Rien -200090068 - Snow Island - To Rien -200090069 - Snow Island - To Rien -200090071 - Snow Island - To Lith Harbor -200090070 - Snow Island - To Lith Harbor -200090072 - Snow Island - To Lith Harbor -200090073 - Snow Island - To Lith Harbor -200090074 - Snow Island - To Lith Harbor -200090075 - Snow Island - To Lith Harbor -200090076 - Snow Island - To Lith Harbor -200090077 - Snow Island - To Lith Harbor -200090078 - Snow Island - To Lith Harbor -200090079 - Snow Island - To Lith Harbor -200080601 - Orbis - Orbis Tower -200090080 - ?? ?? - ?? ?? ??? -200090090 - ?? ?? - ????? -240070000 - Tera Forest - Tera Forest Time Gate -240070010 - Tera Forest - Old Tree in Tera Forest -240070020 - Tera Forest - Old Tree in Tera Forest -240070030 - Tera Forest - Old Tree in Tera Forest -240070040 - Tera Forest - Old Tree in Tera Forest -240070050 - Tera Forest - Old Tree in Tera Forest -240070060 - Tera Forest - Old Tree in Tera Forest -240070100 - Neo City - Average Town Entrance -240070101 - Neo City - Average Town Playground -240070102 - Neo City - Average Town Outskirt -240070200 - Neo City - Midnight Harbor Entrance -240070201 - Neo City - Midnight Harbor Loading Dock -240070202 - Neo City - Midnight Harbor Warehouse -240070203 - Neo City - Midnight Harbor Pier -240070300 - Neo City - Bombed City Center Retail District -240070301 - Neo City - Bombed City Center Overpass -240070302 - Neo City - Bombed City Center Shopping District -240070303 - Neo City - Bombed City Center Square -240070400 - Neo City - Ruined City Intersection -240070401 - Neo City - Ruined City Center -240070402 - Neo City - Ruined City Construction Site -240070403 - Neo City - Ruined City Land Mark -240070500 - Neo City - Dangerous Tower Lobby -240070501 - Neo City - Dangerous Tower Ventilator -240070502 - Neo City - Dangerous Tower Emergency Exit -240070503 - Neo City - Dangerous Tower Penthouse -240070600 - Neo City - Air Battleship Bow -240070601 - Neo City - Air Battleship Area A -240070602 - Neo City - Air Battleship Area B -240070603 - Neo City - Air Battleship Stern - -elin - -300000000 - Ellin Forest - Altaire Camp -300000100 - Altaire Camp - Small Forest -300000010 - Altaire Camp - Camp Conference Room -300000011 - Camp Conference Room - Library -300000012 - Camp Conference Room - Cellar -300000001 - Altaire Camp - Tent House 1 -300000002 - Altaire Camp - Tent House 2 -300010000 - Ellin Forest - Mossy Tree Forest Entrance -300010100 - Ellin Forest - Western Region of Mossy Tree Forest 1 -300010200 - Ellin Forest - Western Region of Mossy Tree Forest 2 -300010300 - Ellin Forest - Mossy Tree Forest Trail -300010400 - Ellin Forest - Boulder Mountain Entrance -300020000 - Ellin Forest - Souther Region of Mossy Tree Forest 1 -300020100 - Ellin Forest - Southern Region of Mossy Tree Forest 2 -300020200 - Ellin Forest - Mushroom Hill Entrance -300030000 - Ellin Forest - Eastern Region of Mossy Tree Forest -300030100 - Ellin Forest - Deep Fairy Forest -390000100 - Unique Road - Gold Richie's Treasures <2> -390000000 - Unique Road - Gold Richie's Treasures <1> -390000200 - Unique Road - Gold Richie's Treasures <3> -390000300 - Unique Road - Gold Richie's Treasures <4> -390000400 - Unique Road - Gold Richie's Treasures <5> -390000500 - Unique Road - Gold Richie's Treasures <6> -390000600 - Unique Road - Gold Richie's Treasures <7> -390000700 - Unique Road - Gold Richie's Treasures <8> -390000800 - Unique Road - Gold Richie's Treasures <9> -390000900 - Unique Road - Gold Richie's Treasures <10> -390001000 - Unique Road - Gold Richie's Treasures <11> -390009999 - Unique Road - Treasure Storage Exit - -weddingGL - -670000100 - Hidden Street - Purplewood Forest 1 -670000200 - Hidden Street - Purplewood Forest 2 -670010000 - Hidden Street - Amos' Training Ground -670010100 - Hidden Street - Entrance of Amorian Challenge -670010200 - Hidden Street - Stage 1 - Magik Mirror -670010300 - Hidden Street - Stage 2 - Heart Strings -670010301 - Hidden Street - Stage 2 - Heart Strings -670010302 - Hidden Street - Stage 2 - Heart Strings -670010400 - Hidden Street - Stage 3 - Twisted Switcher -670010500 - Hidden Street - Stage 4 - Last Man Standing -670010600 - Hidden Street - Stage 5 - Fluttering Hearts -670010700 - Hidden Street - Stage 6 - Love Hurts -670010750 - Hidden Street - Stage 7 - Amos' Vault for Couples -670010800 - Hidden Street - Stage 7 - Amos' Vault -670011000 - Hidden Street - Exit -680000000 - Amoria - Amoria -680000001 - Amoria - Amoria Wedding Shop -680000002 - Amoria - Amoria Hair Salon -680000003 - Amoria - Amoria Plastic Surgery -680000004 - Amoria - Meet the Parents -680000100 - Amoria - White Wedding Lounge -680000110 - Amoria - White Wedding Altar -680000200 - Amoria - Saint Maple Lounge -680000210 - Amoria - Saint Maple Altar -680000300 - Amoria - Cherished Visage Photos -680000400 - Amoria - Untamed Hearts Hunting Ground -680000401 - Amoria - The Love Pinata -680000500 - Amoria - Wedding Exit map -680010000 - Hidden Street - Purple Plains 1 -680010100 - Hidden Street - Purple Plains 2 -681000000 - Hidden Street - Shalom Temple - -MasteriaGL - -610030010 - Crimsonwood Keep - Hall of Mastery -610030011 - Crimsonwood Keep - Tornado Corridor -610030012 - Crimsonwood Keep - The Inferno Chamber -610030013 - Crimsonwood Keep - The Wrath of Night -610030014 - Crimsonwood Keep - Stormhall -610030015 - Crimsonwood Keep - Eternal Vigilance -610030020 - Crimsonwood Keep - Hall to Inner Sanctum -610030100 - Party Quest - Inner Sanctum Hallway -610030200 - Party Quest - Forgotten Storage Chamber -610030300 - Party Quest - The Test of Agility -610030400 - Party Quest - The Test of Wit -610030500 - Party Quest - The Test of Unity -610030510 - Party Quest - Warrior Mastery Room -610030520 - Party Quest - Mage Mastery Room -610030521 - Party Quest - Mage Mastery Room -610030522 - Party Quest - Mage Mastery Room -610030530 - Party Quest - Thief Mastery Room -610030540 - Party Quest - Bowman Mastery Room -610030550 - Party Quest - Pirate Mastery Room -610030600 - Party Quest - Grandmaster Council Hall -610030700 - Party Quest - Grandmaster Secret Chamber -610030800 - Party Quest - Crimsonwood Armory -600000000 - New Leaf City Town Street - New Leaf City - Town Center -600000001 - New Leaf City Town Street - NLC Mall -600010000 - Badlands - Urban Underground -600010001 - New Leaf City Town Street - NLC Subway Station -600010002 - New Leaf City Town Street - Waiting Room(From NLC to KC) -600010003 - Hidden Street - Inside Subway(From NLC to KC) -600010004 - Kerning City Town Street - Waiting Room(From KC to NLC) -600010005 - Hidden Street - Inside Subway(From KC to NLC) -600010100 - Masteria - Jungle Clearing -600010200 - Masteria - Krakian Jungle Basin -600010300 - Masteria - Jungle Valley -600010400 - Masteria - Mountain Slopes -600010500 - Masteria - Mountain Cliffs -600010600 - Masteria - Highlands -600020000 - Bigger Ben - Lobby -600020100 - MesoGears - Deity Room -600020200 - MesoGears - Soul Corridor -600020300 - MesoGears - Wolf Spider Cavern -600020400 - MesoGears - Fire Chamber -600020500 - MesoGears - Ice Chamber -600020600 - MesoGears - Enigma Chamber -610010000 - Phantom Forest - Bent Tree -610010001 - Phantom Forest - Haunted Hill -610010002 - Phantom Forest - Swamp Bog -610010003 - Phantom Forest - Phantom Road -610010004 - Phantom Forest - Dead Man's Gorge -610010005 - Phantom Forest - Forgotten Path -610010010 - Phantom Forest - Hidden Evil -610010011 - Phantom Forest - Creeping Evil -610010012 - Phantom Forest - Evil Rising -610010013 - Phantom Forest - The Evil Dead -610010100 - Phantom Forest - Twisted Paths -610010101 - Phantom Forest - Twisted Paths -610010102 - Phantom Forest - Twisted Paths -610010103 - Phantom Forest - Twisted Paths -610010104 - Phantom Forest - Twisted Paths -610010200 - Phantom Forest - Crossroads -610010201 - Phantom Forest - Crossroads -610010202 - Phantom Forest - Crossroads -610020000 - Crimsonwood Mountain - Valley of Heroes 1 -610020001 - Crimsonwood Mountain - Valley of Heroes 2 -610020002 - Crimsonwood Mountain - Lower Ascent -610020003 - Crimsonwood Mountain - The Path of Strength -610020004 - Crimsonwood Mountain - The Path of Peril -610020005 - Crimsonwood Mountain - Upper Ascent -610020006 - Crimsonwood Mountain - Crimsonwood Keep -610020010 - Crimsonwood Mountain - Cavern of Fear -610020011 - Crimsonwood Mountain - Cavern of Pain -610020012 - Crimsonwood Mountain - Cavern of Shame -610020013 - Crimsonwood Mountain - Cavern of Honor -610020014 - Crimsonwood Mountain - Cavern of Fortitude -610020015 - Crimsonwood Mountain - Cavern of Valor -610030000 - Crimsonwood Keep - Courtyard - -HalloweenGL - -682000000 - Phantom Forest - Haunted House -682000001 - Phantom Forest - Hollowed Ground -682000100 - Haunted House - Foyer -682000200 - Haunted House - Ghost Chimney -682000300 - Haunted House - Hallway -682000301 - Haunted House - Sophilia's Bedroom -682000302 - Haunted House - Vanity Room -682000303 - Haunted House - Study -682000304 - Haunted House - Piano Room -682000305 - Haunted House - Toy Room -682000306 - Haunted House - Barren Room -682000400 - Haunted House - Hallway - Where am I? -682000401 - Haunted House - Sophilia's Bedroom -682000402 - Haunted House - Vanity Room -682000403 - Haunted House - Study -682000404 - Haunted House - Piano Room -682000405 - Haunted House - Toy Room -682000406 - Haunted House - Barren Room -682000500 - Haunted House - Hallway - Where are you? -682000501 - Haunted House - Sophilia's Bedroom -682000502 - Haunted House - Vanity Room -682000503 - Haunted House - Study -682000504 - Haunted House - Piano Room -682000505 - Haunted House - Toy Room -682000506 - Haunted House - Barren Room -682000600 - Haunted House - Hallway - This Again? -682000601 - Haunted House - Sophilia's Bedroom -682000602 - Haunted House - Vanity Room -682000603 - Haunted House - Study -682000604 - Haunted House - Piano Room -682000605 - Haunted House - Toy Room -682000606 - Haunted House - Barren Room -682000700 - Hidden Street - Pumpkin Vault -682000800 - Haunted House - Library -682000900 - Haunted House - Toy Workshop -682010000 - Haunted House - Mansion's Hidden Hall 1 -682010100 - Haunted House - Olivia's Secret Room 1 -682010001 - Haunted House - Mansion's Hidden Hall 2 -682010101 - Haunted House - Olivia's Secret Room 2 -682010002 - Haunted House - Mansion's Hidden Hall 3 -682010102 - Haunted House - Olivia's Secret Room 3 -682010200 - Haunted House - Mansion's Main Chimney -682010201 - Haunted House - Chimney Possessed by the Skeletons -682010202 - Haunted House - Chimney Possessed by the Scarecrow -682010203 - Haunted House - Chimney Possessed by the Clown - -jp - -800000000 - Zipangu - Mushroom Shrine -800010000 - Zipangu - Mushroom Forest -800010001 - Zipangu - The Mountain of Cloud Fox -800010100 - Zipangu - Hall of Mushroom -800020000 - Zipangu - Crow Forest -800020100 - Zipangu - Road to Cemetery -800020101 - Zipangu - Crow Forest 2 -800020110 - Zipangu - A Night in the Forest -800020120 - Zipangu - Vanished Village -800020130 - Zipangu - Encounter with the Buddha -800020200 - Zipangu - A Desolate Cemetery -800020300 - Zipangu - Cemetery Full of Ghosts -800020400 - Zipangu - WanWan Spa of Hell -800030000 - Zipangu - Forest of Animals -801000000 - Zipangu - Showa Town -801000001 - Zipangu - Hair Salon -801000002 - Zipangu - Plastic Surgery -801000100 - Zipangu - Locker Room (M) -801000110 - Zipangu - The Secret Spa (M) -801000200 - Zipangu - Locker Room (F) -801000210 - Zipangu - The Secret Spa (F) -801000300 - Zipangu - Showa Street Market -801010000 - Zipangu - Showa Street 1 -801020000 - Zipangu - Showa Street 2 -801030000 - Zipangu - Showa Street 3 -801040000 - Zipangu - Near the Hideout -801040001 - Zipangu - Parking Lot -801040002 - Zipangu - Finance of Flaming Raccoon -801040003 - Zipangu - Parlor -801040004 - Zipangu - Armory -801040100 - Zipangu - The Nightmarish Last Days -801040101 - Zipangu - Near the Hideout (Beautiful Sky) -809000101 - Zipangu - Spa (M) -809000201 - Zipangu - Spa (F) -809010000 - Florina Beach - Hinamatsuri -809020000 - - Zakum Helmet (Upgraded) -809030000 - - Slot Machine -809040000 - - The Survival Challenge (Waiting Room) -809040100 - - The Survival Challenge -809050000 - Ludibrium - Ludibrium Maze 1 -809050001 - Ludibrium - Ludibrium Maze 2 -809050002 - Ludibrium - Ludibrium Maze 3 -809050003 - Ludibrium - Ludibrium Maze 4 -809050004 - Ludibrium - Ludibrium Maze 5 -809050005 - Ludibrium - Ludibrium Maze 6 -809050006 - Ludibrium - Ludibrium Maze 7 -809050007 - Ludibrium - Ludibrium Maze 8 -809050008 - Ludibrium - Ludibrium Maze 9 -809050009 - Ludibrium - Ludibrium Maze 10 -809050010 - Ludibrium - Ludibrium Maze 11 -809050011 - Ludibrium - Ludibrium Maze 12 -809050012 - Ludibrium - Ludibrium Maze 13 -809050013 - Ludibrium - Ludibrium Maze 14 -809050014 - Ludibrium - Ludibrium Maze 15 -809050015 - Ludibrium - Ludibrium Maze 16 -809050016 - Ludibrium - Exit of the Maze -809050017 - Ludibrium - Exit of the Maze -810000000 - Ludibrium - Entrance to Slot Machine Arcade -880000000 - - WanWan Spa of Hell -881000000 - - The Pirate Hideout -890000001 - - ????????? - -etc - -926100000 - Hidden Street - Mysterious Lab -926100001 - Hidden Street - Dark Tunnel -926100100 - Hidden Street - Unpleasant Lab -926100200 - Hidden Street - Special Lab -926100201 - Hidden Street - Dark Lab 1 -926100202 - Hidden Street - Dark Lab 2 -926100203 - Hidden Street - Yulete's Office -926100300 - Hidden Street - Lab Tunnel -926100301 - Hidden Street - Lab - Unit 101 -926100302 - Hidden Street - Lab - Unit 102 -926100303 - Hidden Street - Lab - Unit 103 -926100304 - Hidden Street - Lab - Unit 104 -926100400 - Hidden Street - Entrance to Center Lab -926100401 - Hidden Street - Center Lab -926100500 - Hidden Street - Traces of Yulete -926100600 - Hidden Street - Romeo and Juliet -926100700 - Hidden Street - Exit -926110000 - Hidden Street - Mysterious Lab -926110001 - Hidden Street - Dark Tunnel -926110100 - Hidden Street - Unpleasant Lab -926110200 - Hidden Street - Special Lab -926110201 - Hidden Street - Dark Lab 1 -926110202 - Hidden Street - Dark Lab 2 -926110203 - Hidden Street - Yulete's Office -926110300 - Hidden Street - Lab Tunnel -926110301 - Hidden Street - Lab - Unit 101 -926110302 - Hidden Street - Lab - Unit 102 -926110303 - Hidden Street - Lab - Unit 103 -926110304 - Hidden Street - Lab - Unit 104 -926110400 - Hidden Street - Entrance to Center Lab -926110401 - Hidden Street - Center Lab -926110500 - Hidden Street - Traces of Yulete -926110600 - Hidden Street - Romeo and Juliet -926110700 - Hidden Street - Exit -926120000 - Hidden Street - Dark Lab -926120100 - Hidden Street - Closed Lab -926120200 - Hidden Street - Dran's Lab -926120300 - Hidden Street - Where Snow Rose Grows -926120400 - Hidden Street - Cheese Storage -926120401 - Hidden Street - Cheese Storage -926120402 - Hidden Street - Cheese Storage -926120403 - Hidden Street - Cheese Storage -926120404 - Hidden Street - Cheese Storage -926120405 - Hidden Street - Cheese Storage -926120406 - Hidden Street - Cheese Storage -926120407 - Hidden Street - Cheese Storage -926120408 - Hidden Street - Cheese Storage -926120409 - Hidden Street - Cheese Storage -926120410 - Hidden Street - Exit - Cheese Storage -926130000 - Hidden Street - Yulete's Lab -926130100 - Hidden Street - Lab Entrance -926130101 - Hidden Street - Yulete's Lab 1 -926130102 - Hidden Street - Yulete's Lab 2 -926130103 - Hidden Street - Yulete's Lab 3 -926130200 - Hidden Street - Lab Exit 1 -926130201 - Hidden Street - Lab Exit 2 -926130203 - Hidden Street - Lab Exit 3 -900000000 - Hidden Street - Utah's Pig Farm -910000000 - Hidden Street - Free Market Entrance -910000001 - Hidden Street - Free Market<1> -910000002 - Hidden Street - Free Market<2> -910000003 - Hidden Street - Free Market<3> -910000004 - Hidden Street - Free Market<4> -910000005 - Hidden Street - Free Market<5> -910000006 - Hidden Street - Free Market<6> -910000007 - Hidden Street - Free Market<7> -910000008 - Hidden Street - Free Market<8> -910000009 - Hidden Street - Free Market<9> -910000010 - Hidden Street - Free Market<10> -910000011 - Hidden Street - Free Market<11> -910000012 - Hidden Street - Free Market<12> -910000013 - Hidden Street - Free Market<13> -910000014 - Hidden Street - Free Market<14> -910000015 - Hidden Street - Free Market<15> -910000016 - Hidden Street - Free Market<16> -910000017 - Hidden Street - Free Market<17> -910000018 - Hidden Street - Free Market<18> -910000019 - Hidden Street - Free Market<19> -910000020 - Hidden Street - Free Market<20> -910000021 - Hidden Street - Free Market<21> -910000022 - Hidden Street - Free Market<22> -910010000 - Hidden Street - Primrose Hill -910010100 - Hidden Street - Shortcut -910010200 - Hidden Street - Pig Town -910010300 - Hidden Street - Back to Town -910010400 - Hidden Street - Shortcut -910200000 - Hidden Street - Hidden Relic -910200001 - Hidden Street - Hidden Relic -910200002 - Hidden Street - Hidden Relic -910300000 - Hidden Street - Dark Lord's Practice Field -910500000 - Hidden Street - Another World : Practice Field -910500100 - Hidden Street - Secret Shrine -910500200 - Hidden Street - Forgotten Shrine -920010000 - Hidden Street - Tower of Goddess -920010100 - Hidden Street - Tower of Goddess
-920010200 - Hidden Street - Tower of Goddess -920010300 - Hidden Street - Tower of Goddess -920010400 - Hidden Street - Tower of Goddess -920010500 - Hidden Street - Tower of Goddess -920010600 - Hidden Street - Tower of Goddess -920010601 - Hidden Street - Tower of Goddess -920010602 - Hidden Street - Tower of Goddess -920010603 - Hidden Street - Tower of Goddess -920010604 - Hidden Street - Tower of Goddess -920010700 - Hidden Street - Tower of Goddess -920010800 - Hidden Street - Tower of Goddess -920010900 - Hidden Street - Tower of Goddess -920010910 - Hidden Street - Tower of Goddess -920010911 - Hidden Street - Tower of Goddess -920010912 - Hidden Street - Tower of Goddess -920010920 - Hidden Street - Tower of Goddess -920010921 - Hidden Street - Tower of Goddess -920010922 - Hidden Street - Tower of Goddess -920010930 - Hidden Street - Tower of Goddess -920010931 - Hidden Street - Tower of Goddess -920010932 - Hidden Street - Tower of Goddess -920011000 - Hidden Street - Tower of Goddess -920011100 - Hidden Street - Tower of Goddess -920011200 - Hidden Street - Tower of Goddess -920011300 - Hidden Street - Tower of Goddess -921100000 - Hidden Street - Heart of Lava -921100100 - Hidden Street - Ice Valley -921100200 - Hidden Street - Phoenix's Nest -921100210 - Hidden Street - Freezer's Nest -921100300 - Hidden Street - Protect Tylus -921100301 - Hidden Street - Protecting Tylus : Complete -922000000 - Hidden Street - Toy Factory -922000009 - Hidden Street - Secret Passage -922000010 - Hidden Street - Doll's House -922000020 - Hidden Street - Secret Factory -922000021 - Hidden Street - Secret Factory -922010000 - Hidden Street - Abandoned Tower -922010100 - Hidden Street - Abandoned Tower -922010200 - Hidden Street - Abandoned Tower -922010201 - Hidden Street - Tower's Trap -922010300 - Hidden Street - Abandoned Tower -922010400 - Hidden Street - Abandoned Tower -922010401 - Hidden Street - Darkness in the Tower -922010402 - Hidden Street - Darkness in the Tower -922010403 - Hidden Street - Darkness in the Tower -922010404 - Hidden Street - Darkness in the Tower -922010405 - Hidden Street - Darkness in the Tower -922010500 - Hidden Street - Abandoned Tower -922010501 - Hidden Street - Tower's Maze -922010502 - Hidden Street - Tower's Maze -922010503 - Hidden Street - Tower's Maze -922010504 - Hidden Street - Tower's Maze -922010505 - Hidden Street - Tower's Maze -922010506 - Hidden Street - Tower's Maze -922010600 - Hidden Street - Abandoned Tower -922010700 - Hidden Street - Abandoned Tower -922010800 - Hidden Street - Abandoned Tower -922010900 - Hidden Street - A Crack on the Wall -922011000 - Hidden Street - Abandoned Tower -922011100 - Hidden Street - Abandoned Tower -922020000 - Hidden Street - The Forgotten Darkness -922020100 - Hidden Street - Room of Thanatos -922020200 - Hidden Street - Hidden Balcony -922200000 - Hidden Street - The Area of Wild Hog -923000000 - Hidden Street - Warped Dimension -923000100 - Hidden Street - Cold Cave -923010000 - Hidden Street - Kenta's Breeding Room -923010100 - Hidden Street - Path to the Breeding Room -924000000 - Hidden Street - On the Way to the Practice Field -924000001 - Hidden Street - Moose's Practice Field -924000002 - Hidden Street - Exiting the Practice Field -924000100 - Hidden Street - The Top of the Sky Nest -925100000 - Hidden Street - On the Way to the Pirate Ship -925100100 - Hidden Street - Through the Head of the Ship! -925100200 - Hidden Street - Through the Deck I -925100201 - Hidden Street - The Area of 100yrOld Bellflower I -925100202 - Hidden Street - Lord Pirate's Servant I -925100300 - Hidden Street - Through the Deck II -925100301 - Hidden Street - The Area of 100yrOld Bellflower II -925100302 - Hidden Street - Lord Pirate's Servant II -925100400 - Hidden Street - Eliminate Pirates! -925100500 - Hidden Street - The Captain's Dignity -925100600 - Hidden Street - Wu Yang Giving Thanks -925100700 - Hidden Street - Pirate Ship On its Way Out -980000000 - Monster Carnival - Spiegelmann's Office -980000010 - Monster Carnival - Exit -980000020 - Monster Carnival - Prizes -980000100 - Monster Carnival - Carnival Field 1 -980000101 - Monster Carnival - Carnival Field 1 -980000102 - Monster Carnival - Carnival Field 1 -980000103 - Monster Carnival - Carnival Field 1 -980000104 - Monster Carnival - Carnival Field 1 -980000200 - Monster Carnival - Carnival Field 2 -980000201 - Monster Carnival - Carnival Field 2 -980000202 - Monster Carnival - Carnival Field 2 -980000203 - Monster Carnival - Carnival Field 2 -980000204 - Monster Carnival - Carnival Field 2 -980000300 - Monster Carnival - Carnival Field 3 -980000301 - Monster Carnival - Carnival Field 3 -980000302 - Monster Carnival - Carnival Field 3 -980000303 - Monster Carnival - Carnival Field 3 -980000304 - Monster Carnival - Carnival Field 3 -980000400 - Monster Carnival - Carnival Field 4 -980000401 - Monster Carnival - Carnival Field 4 -980000402 - Monster Carnival - Carnival Field 4 -980000403 - Monster Carnival - Carnival Field 4 -980000404 - Monster Carnival - Carnival Field 4 -980000500 - Monster Carnival - Carnival Field 5 -980000501 - Monster Carnival - Carnival Field 5 -980000502 - Monster Carnival - Carnival Field 5 -980000503 - Monster Carnival - Carnival Field 5 -980000504 - Monster Carnival - Carnival Field 5 -980000600 - Monster Carnival - Carnival Field 6 -980000601 - Monster Carnival - Carnival Field 6 -980000602 - Monster Carnival - Carnival Field 6 -980000603 - Monster Carnival - Carnival Field 6 -980000604 - Monster Carnival - Carnival Field 6 -980010000 - Ariant Coliseum - Battle Arena Lobby -980010010 - Ariant Coliseum - King's Room -980010020 - Ariant Coliseum - Battle Arena Exit -980010100 - Ariant Coliseum - Battle Arena 1 Entrance -980010101 - Ariant Coliseum - Battle Arena 1 -980010200 - Ariant Coliseum - Battle Arena 2 Entrance -980010201 - Ariant Coliseum - Battle Arena 2 -980010300 - Ariant Coliseum - Battle Arena 3 Entrance -980010301 - Ariant Coliseum - Battle Arena 3 -990000000 - Sharenian - Excavation Site -990000100 - Sharenian - Valley of the Guard -990000200 - Sharenian - Entrance to the Remains -990000300 - Sharenian - Door to the Sharenian Castle -990000301 - Sharenian - Road to the Fortress -990000400 - Sharenian - Hall of the Knight -990000401 - Sharenian - Middle Path -990000410 - Sharenian - Room of Glory -990000420 - Sharenian - Room of Courage -990000430 - Sharenian - Room of Faith -990000431 - Sharenian - Room of Pledge -990000440 - Sharenian - Room of Justice -990000500 - Sharenian - Fountain of the Wiseman -990000501 - Sharenian - Center Banquet -990000502 - Sharenian - Wine Cellar -990000600 - Sharenian - Underground Waterway -990000610 - Sharenian - Waterway Maze -990000611 - Sharenian - End of the Maze -990000620 - Sharenian - Waterway Maze -990000630 - Sharenian - Waterway Maze -990000631 - Sharenian - End of the Maze -990000640 - Sharenian - Waterway Maze -990000641 - Sharenian - End of the Maze -990000700 - Sharenian - Sharen III's Grave -990000800 - Sharenian - King's Corridor -990000900 - Sharenian - Ergoth's Throne -990001000 - Sharenian - Sharen III's Treasure Wearhouse -990001100 - Sharenian - Returning Path -990001101 - Sharenian - Guild Union Camp -912000000 - Hidden Chamber - Secret Place -912000100 - Hidden Chamber - The Nautilus - Stable -912010000 - Hidden Chamber - Kyrin's Training Room -912010100 - Hidden Chamber - Kyrin's Training Room -912010200 - Hidden Chamber - Kyrin's Training Room -912020000 - Hidden Chamber - Bart's Room -925010000 - Hidden Street - Looking for Delli 1 -925010100 - Hidden Street - Looking for Delli 2 -925010200 - Hidden Street - Looking for Delli 3 -925010300 - Hidden Street - Save Delli! -925010400 - Hidden Street - The Nautilus Hideout Room -889100000 - (no street name) - Entrance - Snow Man's Land -889100001 - (no street name) - Snow Man's Land -889100002 - (no street name) - Exit - Snow Man's Land -889100010 - (no street name) - Entrance - Snow Man's Land -889100011 - (no street name) - Snow Man's Land -889100012 - (no street name) - Exit - Snow Man's Land -889100020 - (no street name) - Entrance - Snow Man's Land -889100021 - (no street name) - Snow Man's Land -889100022 - (no street name) - Exit - Snow Man's Land -889100100 - (no street name) - Path to Snow Man's Land -680100000 - Maple 7th Day Market - Maple 7th Day Market -680100001 - Maple 7th Day Market - Maple 7th Day Market -680100002 - Maple 7th Day Market - Maple 7th Day Market -680100003 - Maple 7th Day Market - Maple 7th Day Market -674030300 - Treasure Dungeon - (no map name) -674030000 - Initiation - (no map name) -674030100 - Entrance to MV's Lair - (no map name) -674030200 - The Lair of MV - (no map name) -910020000 - Hidden Street - Nest of a Baby Bird -910100000 - Hidden Street - The Cursed Forest -910100001 - Hidden Street - The Cursed Forest -922210000 - Hidden Street - Field of Refreshing Watermelons -922210100 - Hidden Street - Field of Tasty Watermelons -922210200 - Hidden Street - Field of Sweet Watermelons -922210300 - Hidden Street - Watermelon Field Exit -922210400 - Hidden Street - Field of Refreshing Watermelons -922210500 - Hidden Street - Field of Tasty Watermelons -922210600 - Hidden Street - Field of Sweet Watermelons -922210700 - Hidden Street - Field of Refreshing Watermelons -922210800 - Hidden Street - Field of Tasty Watermelons -922210900 - Hidden Street - Field of Sweet Watermelons -922211000 - Hidden Street - Field of Refreshing Watermelons -922211100 - Hidden Street - Field of Tasty Watermelons -922211200 - Hidden Street - Field of Sweet Watermelons -922211300 - Hidden Street - Field of Refreshing Watermelons -922211400 - Hidden Street - Field of Tasty Watermelons -922211500 - Hidden Street - Field of Sweet Watermelons -922211600 - Hidden Street - Field of Refreshing Watermelons -922211700 - Hidden Street - Field of Tasty Watermelons -922211800 - Hidden Street - Field of Sweet Watermelons -922211900 - Hidden Street - Field of Refreshing Watermelons -922212000 - Hidden Street - Field of Tasty Watermelons -922212100 - Hidden Street - Field of Sweet Watermelons -922212200 - Hidden Street - Field of Refreshing Watermelons -922212300 - Hidden Street - Field of Tasty Watermelons -922212400 - Hidden Street - Field of Sweet Watermelons -922212500 - Hidden Street - Field of Refreshing Watermelons -922212600 - Hidden Street - Field of Tasty Watermelons -922212700 - Hidden Street - Field of Sweet Watermelons -922212800 - Hidden Street - Field of Refreshing Watermelons -922212900 - Hidden Street - Field of Tasty Watermelons -922213000 - Hidden Street - Field of Sweet Watermelons -926130500 - Hidden Street - Lab Exit -930000000 - Forest of Poison Haze - Pre-Entrance -930000010 - Forest of Poison Haze - Forest Entrance -930000100 - Forest of Poison Haze - Mouth of the Forest -930000200 - Forest of Poison Haze - Deteriorated Forest -930000300 - Forest of Poison Haze - Forest of Haze -930000400 - Forest of Poison Haze - Poisoned Forest -930000500 - Forest of Poison Haze - Forest's Empty Lot -930000600 - Forest of Poison Haze - Forest of Poison -930000700 - Forest of Poison Haze - Ellin's Forest -930000800 - Forest of Poison Haze - Outer Forest Exit -970000000 - Hidden Street - Studio Entrance -970000001 - Hidden Street - Ludibrium Studio -970000002 - Hidden Street - Orbis Studio -970000003 - Hidden Street - Ariant Studio -970000004 - Hidden Street - Mu Lung Studio -970000005 - Hidden Street - Magatia Studio -970010000 - Hidden Street - Maple Hill -970020000 - Hidden Street - Cassandra's Shore -970020001 - Hidden Street - Nautilus Coast -970020002 - Hidden Street - Mu Lung Clouds -970020003 - Hidden Street - Herb Town Pier -970020004 - Hidden Street - Magatia Waterway -970020005 - Hidden Street - Aqua Road Ferry -970030000 - Hidden Street - Exclusive Training Center -970030001 - Hidden Street - Resting Spot I -970030002 - Hidden Street - Resting Spot II -970030003 - Hidden Street - Resting Spot III -970030004 - Hidden Street - Resting Spot IV -970030005 - Hidden Street - Last Resting Spot -970030006 - Hidden Street - Resting Spot I -970030007 - Hidden Street - Resting Spot II -970030008 - Hidden Street - Resting Spot III -970030009 - Hidden Street - Resting Spot IV -970030010 - Hidden Street - Last Resting Spot -970030020 - Hidden Street - Agent HQ -970030100 - Hidden Street - Stage 1 -970030101 - Hidden Street - Stage 1 -970030102 - Hidden Street - Stage 1 -970030103 - Hidden Street - Stage 1 -970030104 - Hidden Street - Stage 1 -970030105 - Hidden Street - Stage 1 -970030106 - Hidden Street - Stage 1 -970030107 - Hidden Street - Stage 1 -970030200 - Hidden Street - Stage 2 -970030201 - Hidden Street - Stage 2 -970030202 - Hidden Street - Stage 2 -970030203 - Hidden Street - Stage 2 -970030204 - Hidden Street - Stage 2 -970030205 - Hidden Street - Stage 2 -970030206 - Hidden Street - Stage 2 -970030207 - Hidden Street - Stage 2 -970030300 - Hidden Street - Stage 3 -970030301 - Hidden Street - Stage 3 -970030302 - Hidden Street - Stage 3 -970030303 - Hidden Street - Stage 3 -970030304 - Hidden Street - Stage 3 -970030305 - Hidden Street - Stage 3 -970030306 - Hidden Street - Stage 3 -970030307 - Hidden Street - Stage 3 -970030400 - Hidden Street - Stage 4 -970030401 - Hidden Street - Stage 4 -970030402 - Hidden Street - Stage 4 -970030403 - Hidden Street - Stage 4 -970030404 - Hidden Street - Stage 4 -970030405 - Hidden Street - Stage 4 -970030406 - Hidden Street - Stage 4 -970030407 - Hidden Street - Stage 4 -970030500 - Hidden Street - Stage 5 -970030501 - Hidden Street - Stage 5 -970030502 - Hidden Street - Stage 5 -970030503 - Hidden Street - Stage 5 -970030504 - Hidden Street - Stage 5 -970030505 - Hidden Street - Stage 5 -970030506 - Hidden Street - Stage 5 -970030507 - Hidden Street - Stage 5 -970030600 - Hidden Street - Stage 6 -970030601 - Hidden Street - Stage 6 -970030602 - Hidden Street - Stage 6 -970030603 - Hidden Street - Stage 6 -970030604 - Hidden Street - Stage 6 -970030605 - Hidden Street - Stage 6 -970030606 - Hidden Street - Stage 6 -970030607 - Hidden Street - Stage 6 -970030700 - Hidden Street - Stage 7 -970030701 - Hidden Street - Stage 7 -970030702 - Hidden Street - Stage 7 -970030703 - Hidden Street - Stage 7 -970030704 - Hidden Street - Stage 7 -970030705 - Hidden Street - Stage 7 -970030706 - Hidden Street - Stage 7 -970030707 - Hidden Street - Stage 7 -970030800 - Hidden Street - Stage 8 -970030801 - Hidden Street - Stage 8 -970030802 - Hidden Street - Stage 8 -970030803 - Hidden Street - Stage 8 -970030804 - Hidden Street - Stage 8 -970030805 - Hidden Street - Stage 8 -970030806 - Hidden Street - Stage 8 -970030807 - Hidden Street - Stage 8 -970030900 - Hidden Street - Stage 9 -970030901 - Hidden Street - Stage 9 -970030902 - Hidden Street - Stage 9 -970030903 - Hidden Street - Stage 9 -970030904 - Hidden Street - Stage 9 -970030905 - Hidden Street - Stage 9 -970030906 - Hidden Street - Stage 9 -970030907 - Hidden Street - Stage 9 -970031000 - Hidden Street - Stage 10 -970031001 - Hidden Street - Stage 10 -970031002 - Hidden Street - Stage 10 -970031003 - Hidden Street - Stage 10 -970031004 - Hidden Street - Stage 10 -970031005 - Hidden Street - Stage 10 -970031006 - Hidden Street - Stage 10 -970031007 - Hidden Street - Stage 10 -970031100 - Hidden Street - Stage 11 -970031101 - Hidden Street - Stage 11 -970031102 - Hidden Street - Stage 11 -970031103 - Hidden Street - Stage 11 -970031104 - Hidden Street - Stage 11 -970031105 - Hidden Street - Stage 11 -970031106 - Hidden Street - Stage 11 -970031107 - Hidden Street - Stage 11 -970031200 - Hidden Street - Stage 12 -970031201 - Hidden Street - Stage 12 -970031202 - Hidden Street - Stage 12 -970031203 - Hidden Street - Stage 12 -970031204 - Hidden Street - Stage 12 -970031205 - Hidden Street - Stage 12 -970031206 - Hidden Street - Stage 12 -970031207 - Hidden Street - Stage 12 -970031300 - Hidden Street - Stage 13 -970031301 - Hidden Street - Stage 13 -970031302 - Hidden Street - Stage 13 -970031303 - Hidden Street - Stage 13 -970031304 - Hidden Street - Stage 13 -970031305 - Hidden Street - Stage 13 -970031306 - Hidden Street - Stage 13 -970031307 - Hidden Street - Stage 13 -970031400 - Hidden Street - Stage 14 -970031401 - Hidden Street - Stage 14 -970031402 - Hidden Street - Stage 14 -970031403 - Hidden Street - Stage 14 -970031404 - Hidden Street - Stage 14 -970031405 - Hidden Street - Stage 14 -970031406 - Hidden Street - Stage 14 -970031407 - Hidden Street - Stage 14 -970031500 - Hidden Street - Stage 15 -970031501 - Hidden Street - Stage 15 -970031502 - Hidden Street - Stage 15 -970031503 - Hidden Street - Stage 15 -970031504 - Hidden Street - Stage 15 -970031505 - Hidden Street - Stage 15 -970031506 - Hidden Street - Stage 15 -970031507 - Hidden Street - Stage 15 -970031600 - Hidden Street - Stage 16 -970031601 - Hidden Street - Stage 16 -970031602 - Hidden Street - Stage 16 -970031603 - Hidden Street - Stage 16 -970031604 - Hidden Street - Stage 16 -970031605 - Hidden Street - Stage 16 -970031606 - Hidden Street - Stage 16 -970031607 - Hidden Street - Stage 16 -970031700 - Hidden Street - Stage 17 -970031701 - Hidden Street - Stage 17 -970031702 - Hidden Street - Stage 17 -970031703 - Hidden Street - Stage 17 -970031704 - Hidden Street - Stage 17 -970031705 - Hidden Street - Stage 17 -970031706 - Hidden Street - Stage 17 -970031707 - Hidden Street - Stage 17 -970031800 - Hidden Street - Stage 18 -970031801 - Hidden Street - Stage 18 -970031802 - Hidden Street - Stage 18 -970031803 - Hidden Street - Stage 18 -970031804 - Hidden Street - Stage 18 -970031805 - Hidden Street - Stage 18 -970031806 - Hidden Street - Stage 18 -970031807 - Hidden Street - Stage 18 -970031900 - Hidden Street - Stage 19 -970031901 - Hidden Street - Stage 19 -970031902 - Hidden Street - Stage 19 -970031903 - Hidden Street - Stage 19 -970031904 - Hidden Street - Stage 19 -970031905 - Hidden Street - Stage 19 -970031906 - Hidden Street - Stage 19 -970031907 - Hidden Street - Stage 19 -970032000 - Hidden Street - Stage 20 -970032001 - Hidden Street - Stage 20 -970032002 - Hidden Street - Stage 20 -970032003 - Hidden Street - Stage 20 -970032004 - Hidden Street - Stage 20 -970032005 - Hidden Street - Stage 20 -970032006 - Hidden Street - Stage 20 -970032007 - Hidden Street - Stage 20 -970032100 - Hidden Street - Stage 21 -970032101 - Hidden Street - Stage 21 -970032102 - Hidden Street - Stage 21 -970032103 - Hidden Street - Stage 21 -970032104 - Hidden Street - Stage 21 -970032105 - Hidden Street - Stage 21 -970032106 - Hidden Street - Stage 21 -970032107 - Hidden Street - Stage 21 -970032200 - Hidden Street - Stage 22 -970032201 - Hidden Street - Stage 22 -970032202 - Hidden Street - Stage 22 -970032203 - Hidden Street - Stage 22 -970032204 - Hidden Street - Stage 22 -970032205 - Hidden Street - Stage 22 -970032206 - Hidden Street - Stage 22 -970032207 - Hidden Street - Stage 22 -970032300 - Hidden Street - Stage 23 -970032301 - Hidden Street - Stage 23 -970032302 - Hidden Street - Stage 23 -970032303 - Hidden Street - Stage 23 -970032304 - Hidden Street - Stage 23 -970032305 - Hidden Street - Stage 23 -970032306 - Hidden Street - Stage 23 -970032307 - Hidden Street - Stage 23 -970032400 - Hidden Street - Stage 24 -970032401 - Hidden Street - Stage 24 -970032402 - Hidden Street - Stage 24 -970032403 - Hidden Street - Stage 24 -970032404 - Hidden Street - Stage 24 -970032405 - Hidden Street - Stage 24 -970032406 - Hidden Street - Stage 24 -970032407 - Hidden Street - Stage 24 -970032500 - Hidden Street - Stage 25 -970032501 - Hidden Street - Stage 25 -970032502 - Hidden Street - Stage 25 -970032503 - Hidden Street - Stage 25 -970032504 - Hidden Street - Stage 25 -970032505 - Hidden Street - Stage 25 -970032506 - Hidden Street - Stage 25 -970032507 - Hidden Street - Stage 25 -970032600 - Hidden Street - Stage 26 -970032601 - Hidden Street - Stage 26 -970032602 - Hidden Street - Stage 26 -970032603 - Hidden Street - Stage 26 -970032604 - Hidden Street - Stage 26 -970032605 - Hidden Street - Stage 26 -970032606 - Hidden Street - Stage 26 -970032607 - Hidden Street - Stage 26 -970032700 - Hidden Street - Stage 27 -970032701 - Hidden Street - Stage 27 -970032702 - Hidden Street - Stage 27 -970032703 - Hidden Street - Stage 27 -970032704 - Hidden Street - Stage 27 -970032705 - Hidden Street - Stage 27 -970032706 - Hidden Street - Stage 27 -970032707 - Hidden Street - Stage 27 -970040100 - Hidden Street - Stage 1 -970040101 - Hidden Street - Stage 1 -970040102 - Hidden Street - Stage 1 -970040103 - Hidden Street - Stage 1 -970040104 - Hidden Street - Stage 1 -970040105 - Hidden Street - Stage 1 -970040106 - Hidden Street - Stage 1 -970040107 - Hidden Street - Stage 1 -970040108 - Hidden Street - Stage 1 -970040109 - Hidden Street - Stage 1 -970040110 - Hidden Street - Stage 1 -970040111 - Hidden Street - Stage 1 -970040200 - Hidden Street - Stage 2 -970040201 - Hidden Street - Stage 2 -970040202 - Hidden Street - Stage 2 -970040203 - Hidden Street - Stage 2 -970040204 - Hidden Street - Stage 2 -970040205 - Hidden Street - Stage 2 -970040206 - Hidden Street - Stage 2 -970040207 - Hidden Street - Stage 2 -970040208 - Hidden Street - Stage 2 -970040209 - Hidden Street - Stage 2 -970040210 - Hidden Street - Stage 2 -970040211 - Hidden Street - Stage 2 -970040300 - Hidden Street - Stage 3 -970040301 - Hidden Street - Stage 3 -970040302 - Hidden Street - Stage 3 -970040303 - Hidden Street - Stage 3 -970040304 - Hidden Street - Stage 3 -970040305 - Hidden Street - Stage 3 -970040306 - Hidden Street - Stage 3 -970040307 - Hidden Street - Stage 3 -970040308 - Hidden Street - Stage 3 -970040309 - Hidden Street - Stage 3 -970040310 - Hidden Street - Stage 3 -970040311 - Hidden Street - Stage 3 -970040400 - Hidden Street - Stage 4 -970040401 - Hidden Street - Stage 4 -970040402 - Hidden Street - Stage 4 -970040403 - Hidden Street - Stage 4 -970040404 - Hidden Street - Stage 4 -970040405 - Hidden Street - Stage 4 -970040406 - Hidden Street - Stage 4 -970040407 - Hidden Street - Stage 4 -970040408 - Hidden Street - Stage 4 -970040409 - Hidden Street - Stage 4 -970040410 - Hidden Street - Stage 4 -970040411 - Hidden Street - Stage 4 -970040500 - Hidden Street - Stage 5 -970040501 - Hidden Street - Stage 5 -970040502 - Hidden Street - Stage 5 -970040503 - Hidden Street - Stage 5 -970040504 - Hidden Street - Stage 5 -970040505 - Hidden Street - Stage 5 -970040506 - Hidden Street - Stage 5 -970040507 - Hidden Street - Stage 5 -970040508 - Hidden Street - Stage 5 -970040509 - Hidden Street - Stage 5 -970040510 - Hidden Street - Stage 5 -970040511 - Hidden Street - Stage 5 -970040600 - Hidden Street - Stage 6 -970040601 - Hidden Street - Stage 6 -970040602 - Hidden Street - Stage 6 -970040603 - Hidden Street - Stage 6 -970040604 - Hidden Street - Stage 6 -970040605 - Hidden Street - Stage 6 -970040606 - Hidden Street - Stage 6 -970040607 - Hidden Street - Stage 6 -970040608 - Hidden Street - Stage 6 -970040609 - Hidden Street - Stage 6 -970040610 - Hidden Street - Stage 6 -970040611 - Hidden Street - Stage 6 -970040700 - Hidden Street - Stage 7 -970040701 - Hidden Street - Stage 7 -970040702 - Hidden Street - Stage 7 -970040703 - Hidden Street - Stage 7 -970040704 - Hidden Street - Stage 7 -970040705 - Hidden Street - Stage 7 -970040706 - Hidden Street - Stage 7 -970040707 - Hidden Street - Stage 7 -970040708 - Hidden Street - Stage 7 -970040709 - Hidden Street - Stage 7 -970040710 - Hidden Street - Stage 7 -970040711 - Hidden Street - Stage 7 -970040800 - Hidden Street - Stage 8 -970040801 - Hidden Street - Stage 8 -970040802 - Hidden Street - Stage 8 -970040803 - Hidden Street - Stage 8 -970040804 - Hidden Street - Stage 8 -970040805 - Hidden Street - Stage 8 -970040806 - Hidden Street - Stage 8 -970040807 - Hidden Street - Stage 8 -970040808 - Hidden Street - Stage 8 -970040809 - Hidden Street - Stage 8 -970040810 - Hidden Street - Stage 8 -970040811 - Hidden Street - Stage 8 -970040900 - Hidden Street - Stage 9 -970040901 - Hidden Street - Stage 9 -970040902 - Hidden Street - Stage 9 -970040903 - Hidden Street - Stage 9 -970040904 - Hidden Street - Stage 9 -970040905 - Hidden Street - Stage 9 -970040906 - Hidden Street - Stage 9 -970040907 - Hidden Street - Stage 9 -970040908 - Hidden Street - Stage 9 -970040909 - Hidden Street - Stage 9 -970040910 - Hidden Street - Stage 9 -970040911 - Hidden Street - Stage 9 -970041000 - Hidden Street - Stage 10 -970041001 - Hidden Street - Stage 10 -970041002 - Hidden Street - Stage 10 -970041003 - Hidden Street - Stage 10 -970041004 - Hidden Street - Stage 10 -970041005 - Hidden Street - Stage 10 -970041006 - Hidden Street - Stage 10 -970041007 - Hidden Street - Stage 10 -970041008 - Hidden Street - Stage 10 -970041009 - Hidden Street - Stage 10 -970041010 - Hidden Street - Stage 10 -970041011 - Hidden Street - Stage 10 -970041100 - Hidden Street - Stage 11 -970041101 - Hidden Street - Stage 11 -970041102 - Hidden Street - Stage 11 -970041103 - Hidden Street - Stage 11 -970041104 - Hidden Street - Stage 11 -970041105 - Hidden Street - Stage 11 -970041106 - Hidden Street - Stage 11 -970041107 - Hidden Street - Stage 11 -970041108 - Hidden Street - Stage 11 -970041109 - Hidden Street - Stage 11 -970041110 - Hidden Street - Stage 11 -970041111 - Hidden Street - Stage 11 -970041200 - Hidden Street - Stage 12 -970041201 - Hidden Street - Stage 12 -970041202 - Hidden Street - Stage 12 -970041203 - Hidden Street - Stage 12 -970041204 - Hidden Street - Stage 12 -970041205 - Hidden Street - Stage 12 -970041206 - Hidden Street - Stage 12 -970041207 - Hidden Street - Stage 12 -970041208 - Hidden Street - Stage 12 -970041209 - Hidden Street - Stage 12 -970041210 - Hidden Street - Stage 12 -970041211 - Hidden Street - Stage 12 -970041300 - Hidden Street - Stage 13 -970041301 - Hidden Street - Stage 13 -970041302 - Hidden Street - Stage 13 -970041303 - Hidden Street - Stage 13 -970041304 - Hidden Street - Stage 13 -970041305 - Hidden Street - Stage 13 -970041306 - Hidden Street - Stage 13 -970041307 - Hidden Street - Stage 13 -970041308 - Hidden Street - Stage 13 -970041309 - Hidden Street - Stage 13 -970041310 - Hidden Street - Stage 13 -970041311 - Hidden Street - Stage 13 -970041400 - Hidden Street - Stage 14 -970041401 - Hidden Street - Stage 14 -970041402 - Hidden Street - Stage 14 -970041403 - Hidden Street - Stage 14 -970041404 - Hidden Street - Stage 14 -970041405 - Hidden Street - Stage 14 -970041406 - Hidden Street - Stage 14 -970041407 - Hidden Street - Stage 14 -970041408 - Hidden Street - Stage 14 -970041409 - Hidden Street - Stage 14 -970041410 - Hidden Street - Stage 14 -970041411 - Hidden Street - Stage 14 -970041500 - Hidden Street - Stage 15 -970041501 - Hidden Street - Stage 15 -970041502 - Hidden Street - Stage 15 -970041503 - Hidden Street - Stage 15 -970041504 - Hidden Street - Stage 15 -970041505 - Hidden Street - Stage 15 -970041506 - Hidden Street - Stage 15 -970041507 - Hidden Street - Stage 15 -970041508 - Hidden Street - Stage 15 -970041509 - Hidden Street - Stage 15 -970041510 - Hidden Street - Stage 15 -970041511 - Hidden Street - Stage 15 -970041600 - Hidden Street - Stage 16 -970041601 - Hidden Street - Stage 16 -970041602 - Hidden Street - Stage 16 -970041603 - Hidden Street - Stage 16 -970041604 - Hidden Street - Stage 16 -970041605 - Hidden Street - Stage 16 -970041606 - Hidden Street - Stage 16 -970041607 - Hidden Street - Stage 16 -970041608 - Hidden Street - Stage 16 -970041609 - Hidden Street - Stage 16 -970041610 - Hidden Street - Stage 16 -970041611 - Hidden Street - Stage 16 -970041700 - Hidden Street - Stage 17 -970041701 - Hidden Street - Stage 17 -970041702 - Hidden Street - Stage 17 -970041703 - Hidden Street - Stage 17 -970041704 - Hidden Street - Stage 17 -970041705 - Hidden Street - Stage 17 -970041706 - Hidden Street - Stage 17 -970041707 - Hidden Street - Stage 17 -970041708 - Hidden Street - Stage 17 -970041709 - Hidden Street - Stage 17 -970041710 - Hidden Street - Stage 17 -970041711 - Hidden Street - Stage 17 -970041800 - Hidden Street - Stage 18 -970041801 - Hidden Street - Stage 18 -970041802 - Hidden Street - Stage 18 -970041803 - Hidden Street - Stage 18 -970041804 - Hidden Street - Stage 18 -970041805 - Hidden Street - Stage 18 -970041806 - Hidden Street - Stage 18 -970041807 - Hidden Street - Stage 18 -970041808 - Hidden Street - Stage 18 -970041809 - Hidden Street - Stage 18 -970041810 - Hidden Street - Stage 18 -970041811 - Hidden Street - Stage 18 -970041900 - Hidden Street - Stage 19 -970041901 - Hidden Street - Stage 19 -970041902 - Hidden Street - Stage 19 -970041903 - Hidden Street - Stage 19 -970041904 - Hidden Street - Stage 19 -970041905 - Hidden Street - Stage 19 -970041906 - Hidden Street - Stage 19 -970041907 - Hidden Street - Stage 19 -970041908 - Hidden Street - Stage 19 -970041909 - Hidden Street - Stage 19 -970041910 - Hidden Street - Stage 19 -970041911 - Hidden Street - Stage 19 -970042000 - Hidden Street - Stage 20 -970042001 - Hidden Street - Stage 20 -970042002 - Hidden Street - Stage 20 -970042003 - Hidden Street - Stage 20 -970042004 - Hidden Street - Stage 20 -970042005 - Hidden Street - Stage 20 -970042006 - Hidden Street - Stage 20 -970042007 - Hidden Street - Stage 20 -970042008 - Hidden Street - Stage 20 -970042009 - Hidden Street - Stage 20 -970042010 - Hidden Street - Stage 20 -970042011 - Hidden Street - Stage 20 -970042100 - Hidden Street - Stage 21 -970042101 - Hidden Street - Stage 21 -970042102 - Hidden Street - Stage 21 -970042103 - Hidden Street - Stage 21 -970042104 - Hidden Street - Stage 21 -970042105 - Hidden Street - Stage 21 -970042106 - Hidden Street - Stage 21 -970042107 - Hidden Street - Stage 21 -970042108 - Hidden Street - Stage 21 -970042109 - Hidden Street - Stage 21 -970042110 - Hidden Street - Stage 21 -970042111 - Hidden Street - Stage 21 -970042200 - Hidden Street - Stage 22 -970042201 - Hidden Street - Stage 22 -970042202 - Hidden Street - Stage 22 -970042203 - Hidden Street - Stage 22 -970042204 - Hidden Street - Stage 22 -970042205 - Hidden Street - Stage 22 -970042206 - Hidden Street - Stage 22 -970042207 - Hidden Street - Stage 22 -970042208 - Hidden Street - Stage 22 -970042209 - Hidden Street - Stage 22 -970042210 - Hidden Street - Stage 22 -970042211 - Hidden Street - Stage 22 -970042300 - Hidden Street - Stage 23 -970042301 - Hidden Street - Stage 23 -970042302 - Hidden Street - Stage 23 -970042303 - Hidden Street - Stage 23 -970042304 - Hidden Street - Stage 23 -970042305 - Hidden Street - Stage 23 -970042306 - Hidden Street - Stage 23 -970042307 - Hidden Street - Stage 23 -970042308 - Hidden Street - Stage 23 -970042309 - Hidden Street - Stage 23 -970042310 - Hidden Street - Stage 23 -970042311 - Hidden Street - Stage 23 -970042400 - Hidden Street - Stage 24 -970042401 - Hidden Street - Stage 24 -970042402 - Hidden Street - Stage 24 -970042403 - Hidden Street - Stage 24 -970042404 - Hidden Street - Stage 24 -970042405 - Hidden Street - Stage 24 -970042406 - Hidden Street - Stage 24 -970042407 - Hidden Street - Stage 24 -970042408 - Hidden Street - Stage 24 -970042409 - Hidden Street - Stage 24 -970042410 - Hidden Street - Stage 24 -970042411 - Hidden Street - Stage 24 -970042500 - Hidden Street - Stage 25 -970042501 - Hidden Street - Stage 25 -970042502 - Hidden Street - Stage 25 -970042503 - Hidden Street - Stage 25 -970042504 - Hidden Street - Stage 25 -970042505 - Hidden Street - Stage 25 -970042506 - Hidden Street - Stage 25 -970042507 - Hidden Street - Stage 25 -970042508 - Hidden Street - Stage 25 -970042509 - Hidden Street - Stage 25 -970042510 - Hidden Street - Stage 25 -970042511 - Hidden Street - Stage 25 -970042600 - Hidden Street - Stage 26 -970042601 - Hidden Street - Stage 26 -970042602 - Hidden Street - Stage 26 -970042603 - Hidden Street - Stage 26 -970042604 - Hidden Street - Stage 26 -970042605 - Hidden Street - Stage 26 -970042606 - Hidden Street - Stage 26 -970042607 - Hidden Street - Stage 26 -970042608 - Hidden Street - Stage 26 -970042609 - Hidden Street - Stage 26 -970042610 - Hidden Street - Stage 26 -970042611 - Hidden Street - Stage 26 -970042700 - Hidden Street - Stage 27 -970042701 - Hidden Street - Stage 27 -970042702 - Hidden Street - Stage 27 -970042703 - Hidden Street - Stage 27 -970042704 - Hidden Street - Stage 27 -970042705 - Hidden Street - Stage 27 -970042706 - Hidden Street - Stage 27 -970042707 - Hidden Street - Stage 27 -970042708 - Hidden Street - Stage 27 -970042709 - Hidden Street - Stage 27 -970042710 - Hidden Street - Stage 27 -970042711 - Hidden Street - Stage 27 -980020000 - Goldrich's Maze - Maze Entrance -980020001 - Goldrich's Maze - Maze Exit -980020100 - Goldrich's Maze - Snail's Maze -980020200 - Goldrich's Maze - Snail's Maze -980020300 - Goldrich's Maze - Snail's Maze -980020400 - Goldrich's Maze - Snail's Maze -980020500 - Goldrich's Maze - Snail's Maze -980020600 - Goldrich's Maze - Snail's Maze -980020700 - Goldrich's Maze - Snail's Maze -980020800 - Goldrich's Maze - Snail's Maze -980020900 - Goldrich's Maze - Goldrich's Treasure Vault -980021000 - Goldrich's Maze - Rainbow Snail's Maze -980021100 - Goldrich's Maze - Rainbow Snail's Maze -980021200 - Goldrich's Maze - Rainbow Snail's Maze -980021300 - Goldrich's Maze - Rainbow Snail's Maze -980021400 - Goldrich's Maze - Rainbow Snail's Maze -980021500 - Goldrich's Maze - Dragon Nest Maze -980021600 - Goldrich's Maze - Dragon Nest Maze -980021700 - Goldrich's Maze - Dragon Nest Maze -980021800 - Goldrich's Maze - Dragon Nest Maze -980021900 - Goldrich's Maze - Dragon Nest Maze -980022000 - Goldrich's Maze - High! Low! -980022100 - Goldrich's Maze - High! Low! -980022200 - Goldrich's Maze - High! Low! -980022300 - Goldrich's Maze - High! Low! -980022400 - Goldrich's Maze - High! Low! -980022500 - Goldrich's Maze - Maze of Golden Fruit -980022600 - Goldrich's Maze - Maze of Golden Fruit -980022700 - Goldrich's Maze - Maze of Golden Fruit -980022800 - Goldrich's Maze - Maze of Golden Fruit -980022900 - Goldrich's Maze - Maze of Golden Fruit -980023000 - Goldrich's Maze - Maze of Numbers -980023100 - Goldrich's Maze - Maze of Numbers -980023200 - Goldrich's Maze - Maze of Numbers -980023300 - Goldrich's Maze - Maze of Numbers -980023400 - Goldrich's Maze - Maze of Numbers -980023500 - Goldrich's Maze - Ribbon Pig's Maze -980023600 - Goldrich's Maze - Ribbon Pig's Maze -980023700 - Goldrich's Maze - Ribbon Pig's Maze -980023800 - Goldrich's Maze - Ribbon Pig's Maze -980023900 - Goldrich's Maze - Ribbon Pig's Maze -980024000 - Goldrich's Maze - Maze of Mushroom -980024100 - Goldrich's Maze - Maze of Mushroom -980024200 - Goldrich's Maze - Maze of Mushroom -980024300 - Goldrich's Maze - Maze of Mushroom -980024400 - Goldrich's Maze - Maze of Mushroom -980024500 - Goldrich's Maze - Glowing Maze of Mushroom -980024600 - Goldrich's Maze - Glowing Maze of Mushroom -980024700 - Goldrich's Maze - Glowing Maze of Mushroom -980024800 - Goldrich's Maze - Glowing Maze of Mushroom -980024900 - Goldrich's Maze - Glowing Maze of Mushroom -980025000 - Goldrich's Maze - Twin Maze -980025100 - Goldrich's Maze - Twin Maze -980025200 - Goldrich's Maze - Twin Maze -980025300 - Goldrich's Maze - Twin Maze -980025400 - Goldrich's Maze - Twin Maze -980025500 - Goldrich's Maze - Twin Maze -980025600 - Goldrich's Maze - Twin Maze -980025700 - Goldrich's Maze - Twin Maze -980025800 - Goldrich's Maze - Twin Maze -980025900 - Goldrich's Maze - Twin Maze -980026000 - Goldrich's Maze - Round Up! -980026100 - Goldrich's Maze - Round Up! -980026200 - Goldrich's Maze - Round Up! -980026300 - Goldrich's Maze - Round Up! -980026400 - Goldrich's Maze - Round Up! -980026500 - Goldrich's Maze - Maze of Erosion -980026600 - Goldrich's Maze - Maze of Erosion -980026700 - Goldrich's Maze - Maze of Erosion -980026800 - Goldrich's Maze - Maze of Erosion -980026900 - Goldrich's Maze - Maze of Erosion -980027000 - Goldrich's Maze - Maze of Erosion -980027100 - Goldrich's Maze - Maze of Erosion -980027200 - Goldrich's Maze - Maze of Erosion -980027300 - Goldrich's Maze - Beginning of the Maze… -980027400 - Goldrich's Maze - Monster's Maze -980027500 - Goldrich's Maze - Monster's Maze -980027600 - Goldrich's Maze - Monster's Maze -980027700 - Goldrich's Maze - Monster's Maze -980027800 - Goldrich's Maze - Monster's Maze -980027900 - Goldrich's Maze - Maze of the Golden Key -980028000 - Goldrich's Maze - Maze of Exploration -980028100 - Goldrich's Maze - Maze of Exploration -980020101 - Goldrich's Maze - Snail's Maze -980020201 - Goldrich's Maze - Snail's Maze -980020301 - Goldrich's Maze - Snail's Maze -980020401 - Goldrich's Maze - Snail's Maze -980020501 - Goldrich's Maze - Snail's Maze -980020601 - Goldrich's Maze - Snail's Maze -980020701 - Goldrich's Maze - Snail's Maze -980020801 - Goldrich's Maze - Snail's Maze -980020901 - Goldrich's Maze - Goldrich's Treasure Vault -980021001 - Goldrich's Maze - Rainbow Snail's Maze -980021101 - Goldrich's Maze - Rainbow Snail's Maze -980021201 - Goldrich's Maze - Rainbow Snail's Maze -980021301 - Goldrich's Maze - Rainbow Snail's Maze -980021401 - Goldrich's Maze - Rainbow Snail's Maze -980021501 - Goldrich's Maze - Dragon Nest Maze -980021601 - Goldrich's Maze - Dragon Nest Maze -980021701 - Goldrich's Maze - Dragon Nest Maze -980021801 - Goldrich's Maze - Dragon Nest Maze -980021901 - Goldrich's Maze - Dragon Nest Maze -980022001 - Goldrich's Maze - High! Low! -980022101 - Goldrich's Maze - High! Low! -980022201 - Goldrich's Maze - High! Low! -980022301 - Goldrich's Maze - High! Low! -980022401 - Goldrich's Maze - High! Low! -980022501 - Goldrich's Maze - Maze of Golden Fruit -980022601 - Goldrich's Maze - Maze of Golden Fruit -980022701 - Goldrich's Maze - Glowing Mushroom's Room -980022801 - Goldrich's Maze - Glowing Mushroom's Room -980022901 - Goldrich's Maze - Glowing Mushroom's Room -980023001 - Goldrich's Maze - Maze of Numbers -980023101 - Goldrich's Maze - Maze of Numbers -980023201 - Goldrich's Maze - Maze of Numbers -980023301 - Goldrich's Maze - Maze of Numbers -980023401 - Goldrich's Maze - Maze of Numbers -980023501 - Goldrich's Maze - Ribbon Pig's Maze -980023601 - Goldrich's Maze - Ribbon Pig's Maze -980023701 - Goldrich's Maze - Ribbon Pig's Maze -980023801 - Goldrich's Maze - Ribbon Pig's Maze -980023901 - Goldrich's Maze - Ribbon Pig's Maze -980024001 - Goldrich's Maze - Maze of Mushroom -980024101 - Goldrich's Maze - Maze of Mushroom -980024201 - Goldrich's Maze - Maze of Mushroom -980024301 - Goldrich's Maze - Maze of Mushroom -980024401 - Goldrich's Maze - Maze of Mushroom -980024501 - Goldrich's Maze - Glowing Maze of Mushroom -980024601 - Goldrich's Maze - Glowing Maze of Mushroom -980024701 - Goldrich's Maze - Glowing Maze of Mushroom -980024801 - Goldrich's Maze - Glowing Maze of Mushroom -980024901 - Goldrich's Maze - Glowing Maze of Mushroom -980025001 - Goldrich's Maze - Twin Maze -980025101 - Goldrich's Maze - Twin Maze -980025201 - Goldrich's Maze - Twin Maze -980025301 - Goldrich's Maze - Twin Maze -980025401 - Goldrich's Maze - Twin Maze -980025501 - Goldrich's Maze - Twin Maze -980025601 - Goldrich's Maze - Twin Maze -980025701 - Goldrich's Maze - Twin Maze -980025801 - Goldrich's Maze - Twin Maze -980025901 - Goldrich's Maze - Twin Maze -980026001 - Goldrich's Maze - Round Up! -980026101 - Goldrich's Maze - Round Up! -980026201 - Goldrich's Maze - Round Up! -980026301 - Goldrich's Maze - Round Up! -980026401 - Goldrich's Maze - Round Up! -980026501 - Goldrich's Maze - Maze of Erosion -980026601 - Goldrich's Maze - Maze of Erosion -980026701 - Goldrich's Maze - Maze of Erosion -980026801 - Goldrich's Maze - Maze of Erosion -980026901 - Goldrich's Maze - Maze of Erosion -980027001 - Goldrich's Maze - Maze of Erosion -980027101 - Goldrich's Maze - Maze of Erosion -980027201 - Goldrich's Maze - Maze of Erosion -980027301 - Goldrich's Maze - Beginning of the Maze… -980027401 - Goldrich's Maze - Monster's Maze -980027501 - Goldrich's Maze - Monster's Maze -980027601 - Goldrich's Maze - Monster's Maze -980027701 - Goldrich's Maze - Monster's Maze -980027801 - Goldrich's Maze - Monster's Maze -980027901 - Goldrich's Maze - Maze of the Golden Key -980028001 - Goldrich's Maze - Maze of Exploration -980028101 - Goldrich's Maze - Maze of Exploration -980020102 - Goldrich's Maze - Snail's Maze -980020202 - Goldrich's Maze - Snail's Maze -980020302 - Goldrich's Maze - Snail's Maze -980020402 - Goldrich's Maze - Snail's Maze -980020502 - Goldrich's Maze - Snail's Maze -980020602 - Goldrich's Maze - Snail's Maze -980020702 - Goldrich's Maze - Snail's Maze -980020802 - Goldrich's Maze - Snail's Maze -980020902 - Goldrich's Maze - Goldrich's Treasure Vault -980021002 - Goldrich's Maze - Rainbow Snail's Maze -980021102 - Goldrich's Maze - Rainbow Snail's Maze -980021202 - Goldrich's Maze - Rainbow Snail's Maze -980021302 - Goldrich's Maze - Rainbow Snail's Maze -980021402 - Goldrich's Maze - Rainbow Snail's Maze -980021502 - Goldrich's Maze - Dragon Nest Maze -980021602 - Goldrich's Maze - Dragon Nest Maze -980021702 - Goldrich's Maze - Dragon Nest Maze -980021802 - Goldrich's Maze - Dragon Nest Maze -980021902 - Goldrich's Maze - Dragon Nest Maze -980022002 - Goldrich's Maze - High! Low! -980022102 - Goldrich's Maze - High! Low! -980022202 - Goldrich's Maze - High! Low! -980022302 - Goldrich's Maze - High! Low! -980022402 - Goldrich's Maze - High! Low! -980022502 - Goldrich's Maze - Maze of Golden Fruit -980022602 - Goldrich's Maze - Maze of Golden Fruit -980022702 - Goldrich's Maze - Glowing Mushroom's Room -980022802 - Goldrich's Maze - Glowing Mushroom's Room -980022902 - Goldrich's Maze - Glowing Mushroom's Room -980023002 - Goldrich's Maze - Maze of Numbers -980023102 - Goldrich's Maze - Maze of Numbers -980023202 - Goldrich's Maze - Maze of Numbers -980023302 - Goldrich's Maze - Maze of Numbers -980023402 - Goldrich's Maze - Maze of Numbers -980023502 - Goldrich's Maze - Ribbon Pig's Maze -980023602 - Goldrich's Maze - Ribbon Pig's Maze -980023702 - Goldrich's Maze - Ribbon Pig's Maze -980023802 - Goldrich's Maze - Ribbon Pig's Maze -980023902 - Goldrich's Maze - Ribbon Pig's Maze -980024002 - Goldrich's Maze - Maze of Mushroom -980024102 - Goldrich's Maze - Maze of Mushroom -980024202 - Goldrich's Maze - Maze of Mushroom -980024302 - Goldrich's Maze - Maze of Mushroom -980024402 - Goldrich's Maze - Maze of Mushroom -980024502 - Goldrich's Maze - Glowing Maze of Mushroom -980024602 - Goldrich's Maze - Glowing Maze of Mushroom -980024702 - Goldrich's Maze - Glowing Maze of Mushroom -980024802 - Goldrich's Maze - Glowing Maze of Mushroom -980024902 - Goldrich's Maze - Glowing Maze of Mushroom -980025002 - Goldrich's Maze - Twin Maze -980025102 - Goldrich's Maze - Twin Maze -980025202 - Goldrich's Maze - Twin Maze -980025302 - Goldrich's Maze - Twin Maze -980025402 - Goldrich's Maze - Twin Maze -980025502 - Goldrich's Maze - Twin Maze -980025602 - Goldrich's Maze - Twin Maze -980025702 - Goldrich's Maze - Twin Maze -980025802 - Goldrich's Maze - Twin Maze -980025902 - Goldrich's Maze - Twin Maze -980026002 - Goldrich's Maze - Round Up! -980026102 - Goldrich's Maze - Round Up! -980026202 - Goldrich's Maze - Round Up! -980026302 - Goldrich's Maze - Round Up! -980026402 - Goldrich's Maze - Round Up! -980026502 - Goldrich's Maze - Maze of Erosion -980026602 - Goldrich's Maze - Maze of Erosion -980026702 - Goldrich's Maze - Maze of Erosion -980026802 - Goldrich's Maze - Maze of Erosion -980026902 - Goldrich's Maze - Maze of Erosion -980027002 - Goldrich's Maze - Maze of Erosion -980027102 - Goldrich's Maze - Maze of Erosion -980027202 - Goldrich's Maze - Maze of Erosion -980027302 - Goldrich's Maze - Beginning of the Maze… -980027402 - Goldrich's Maze - Monster's Maze -980027502 - Goldrich's Maze - Monster's Maze -980027602 - Goldrich's Maze - Monster's Maze -980027702 - Goldrich's Maze - Monster's Maze -980027802 - Goldrich's Maze - Monster's Maze -980027902 - Goldrich's Maze - Maze of the Golden Key -980028002 - Goldrich's Maze - Maze of Exploration -980028102 - Goldrich's Maze - Maze of Exploration -999999998 - Maple World - Destiny's Call -970030108 - Hidden Street - Stage 1 -970030109 - Hidden Street - Stage 1 -970030110 - Hidden Street - Stage 1 -970030111 - Hidden Street - Stage 1 -970030208 - Hidden Street - Stage 2 -970030209 - Hidden Street - Stage 2 -970030210 - Hidden Street - Stage 2 -970030211 - Hidden Street - Stage 2 -970030308 - Hidden Street - Stage 3 -970030309 - Hidden Street - Stage 3 -970030310 - Hidden Street - Stage 3 -970030311 - Hidden Street - Stage 3 -970030408 - Hidden Street - Stage 4 -970030409 - Hidden Street - Stage 4 -970030410 - Hidden Street - Stage 4 -970030411 - Hidden Street - Stage 4 -970030508 - Hidden Street - Stage 5 -970030509 - Hidden Street - Stage 5 -970030510 - Hidden Street - Stage 5 -970030511 - Hidden Street - Stage 5 -970030608 - Hidden Street - Stage 6 -970030609 - Hidden Street - Stage 6 -970030610 - Hidden Street - Stage 6 -970030611 - Hidden Street - Stage 6 -970030708 - Hidden Street - Stage 7 -970030709 - Hidden Street - Stage 7 -970030710 - Hidden Street - Stage 7 -970030711 - Hidden Street - Stage 7 -970030808 - Hidden Street - Stage 8 -970030809 - Hidden Street - Stage 8 -970030810 - Hidden Street - Stage 8 -970030811 - Hidden Street - Stage 8 -970030908 - Hidden Street - Stage 9 -970030909 - Hidden Street - Stage 9 -970030910 - Hidden Street - Stage 9 -970030911 - Hidden Street - Stage 9 -970031008 - Hidden Street - Stage 10 -970031009 - Hidden Street - Stage 10 -970031010 - Hidden Street - Stage 10 -970031011 - Hidden Street - Stage 10 -970031108 - Hidden Street - Stage 11 -970031109 - Hidden Street - Stage 11 -970031110 - Hidden Street - Stage 11 -970031111 - Hidden Street - Stage 11 -970031208 - Hidden Street - Stage 12 -970031209 - Hidden Street - Stage 12 -970031210 - Hidden Street - Stage 12 -970031211 - Hidden Street - Stage 12 -970031308 - Hidden Street - Stage 13 -970031309 - Hidden Street - Stage 13 -970031310 - Hidden Street - Stage 13 -970031311 - Hidden Street - Stage 13 -970031408 - Hidden Street - Stage 14 -970031409 - Hidden Street - Stage 14 -970031410 - Hidden Street - Stage 14 -970031411 - Hidden Street - Stage 14 -970031508 - Hidden Street - Stage 15 -970031509 - Hidden Street - Stage 15 -970031510 - Hidden Street - Stage 15 -970031511 - Hidden Street - Stage 15 -970031608 - Hidden Street - Stage 16 -970031609 - Hidden Street - Stage 16 -970031610 - Hidden Street - Stage 16 -970031611 - Hidden Street - Stage 16 -970031708 - Hidden Street - Stage 17 -970031709 - Hidden Street - Stage 17 -970031710 - Hidden Street - Stage 17 -970031711 - Hidden Street - Stage 17 -970031808 - Hidden Street - Stage 18 -970031809 - Hidden Street - Stage 18 -970031810 - Hidden Street - Stage 18 -970031811 - Hidden Street - Stage 18 -970031908 - Hidden Street - Stage 19 -970031909 - Hidden Street - Stage 19 -970031910 - Hidden Street - Stage 19 -970031911 - Hidden Street - Stage 19 -970032008 - Hidden Street - Stage 20 -970032009 - Hidden Street - Stage 20 -970032010 - Hidden Street - Stage 20 -970032011 - Hidden Street - Stage 20 -970032108 - Hidden Street - Stage 21 -970032109 - Hidden Street - Stage 21 -970032110 - Hidden Street - Stage 21 -970032111 - Hidden Street - Stage 21 -970032208 - Hidden Street - Stage 22 -970032209 - Hidden Street - Stage 22 -970032210 - Hidden Street - Stage 22 -970032211 - Hidden Street - Stage 22 -970032308 - Hidden Street - Stage 23 -970032309 - Hidden Street - Stage 23 -970032310 - Hidden Street - Stage 23 -970032311 - Hidden Street - Stage 23 -970032408 - Hidden Street - Stage 24 -970032409 - Hidden Street - Stage 24 -970032410 - Hidden Street - Stage 24 -970032411 - Hidden Street - Stage 24 -970032508 - Hidden Street - Stage 25 -970032509 - Hidden Street - Stage 25 -970032510 - Hidden Street - Stage 25 -970032511 - Hidden Street - Stage 25 -970032608 - Hidden Street - Stage 26 -970032609 - Hidden Street - Stage 26 -970032610 - Hidden Street - Stage 26 -970032611 - Hidden Street - Stage 26 -970032708 - Hidden Street - Stage 27 -970032709 - Hidden Street - Stage 27 -970032710 - Hidden Street - Stage 27 -970032711 - Hidden Street - Stage 27 -970040112 - Hidden Street - Stage 1 -970040113 - Hidden Street - Stage 1 -970040114 - Hidden Street - Stage 1 -970040115 - Hidden Street - Stage 1 -970040116 - Hidden Street - Stage 1 -970040117 - Hidden Street - Stage 1 -970040212 - Hidden Street - Stage 2 -970040213 - Hidden Street - Stage 2 -970040214 - Hidden Street - Stage 2 -970040215 - Hidden Street - Stage 2 -970040216 - Hidden Street - Stage 2 -970040217 - Hidden Street - Stage 2 -970040312 - Hidden Street - Stage 3 -970040313 - Hidden Street - Stage 3 -970040314 - Hidden Street - Stage 3 -970040315 - Hidden Street - Stage 3 -970040316 - Hidden Street - Stage 3 -970040317 - Hidden Street - Stage 3 -970040412 - Hidden Street - Stage 4 -970040413 - Hidden Street - Stage 4 -970040414 - Hidden Street - Stage 4 -970040415 - Hidden Street - Stage 4 -970040416 - Hidden Street - Stage 4 -970040417 - Hidden Street - Stage 4 -970040512 - Hidden Street - Stage 5 -970040513 - Hidden Street - Stage 5 -970040514 - Hidden Street - Stage 5 -970040515 - Hidden Street - Stage 5 -970040516 - Hidden Street - Stage 5 -970040517 - Hidden Street - Stage 5 -970040612 - Hidden Street - Stage 6 -970040613 - Hidden Street - Stage 6 -970040614 - Hidden Street - Stage 6 -970040615 - Hidden Street - Stage 6 -970040616 - Hidden Street - Stage 6 -970040617 - Hidden Street - Stage 6 -970040712 - Hidden Street - Stage 7 -970040713 - Hidden Street - Stage 7 -970040714 - Hidden Street - Stage 7 -970040715 - Hidden Street - Stage 7 -970040716 - Hidden Street - Stage 7 -970040717 - Hidden Street - Stage 7 -970040812 - Hidden Street - Stage 8 -970040813 - Hidden Street - Stage 8 -970040814 - Hidden Street - Stage 8 -970040815 - Hidden Street - Stage 8 -970040816 - Hidden Street - Stage 8 -970040817 - Hidden Street - Stage 8 -970040912 - Hidden Street - Stage 9 -970040913 - Hidden Street - Stage 9 -970040914 - Hidden Street - Stage 9 -970040915 - Hidden Street - Stage 9 -970040916 - Hidden Street - Stage 9 -970040917 - Hidden Street - Stage 9 -970041012 - Hidden Street - Stage 10 -970041013 - Hidden Street - Stage 10 -970041014 - Hidden Street - Stage 10 -970041015 - Hidden Street - Stage 10 -970041016 - Hidden Street - Stage 10 -970041017 - Hidden Street - Stage 10 -970041112 - Hidden Street - Stage 11 -970041113 - Hidden Street - Stage 11 -970041114 - Hidden Street - Stage 11 -970041115 - Hidden Street - Stage 11 -970041116 - Hidden Street - Stage 11 -970041117 - Hidden Street - Stage 11 -970041212 - Hidden Street - Stage 12 -970041213 - Hidden Street - Stage 12 -970041214 - Hidden Street - Stage 12 -970041215 - Hidden Street - Stage 12 -970041216 - Hidden Street - Stage 12 -970041217 - Hidden Street - Stage 12 -970041312 - Hidden Street - Stage 13 -970041313 - Hidden Street - Stage 13 -970041314 - Hidden Street - Stage 13 -970041315 - Hidden Street - Stage 13 -970041316 - Hidden Street - Stage 13 -970041317 - Hidden Street - Stage 13 -970041412 - Hidden Street - Stage 14 -970041413 - Hidden Street - Stage 14 -970041414 - Hidden Street - Stage 14 -970041415 - Hidden Street - Stage 14 -970041416 - Hidden Street - Stage 14 -970041417 - Hidden Street - Stage 14 -970041512 - Hidden Street - Stage 15 -970041513 - Hidden Street - Stage 15 -970041514 - Hidden Street - Stage 15 -970041515 - Hidden Street - Stage 15 -970041516 - Hidden Street - Stage 15 -970041517 - Hidden Street - Stage 15 -970041612 - Hidden Street - Stage 16 -970041613 - Hidden Street - Stage 16 -970041614 - Hidden Street - Stage 16 -970041615 - Hidden Street - Stage 16 -970041616 - Hidden Street - Stage 16 -970041617 - Hidden Street - Stage 16 -970041712 - Hidden Street - Stage 17 -970041713 - Hidden Street - Stage 17 -970041714 - Hidden Street - Stage 17 -970041715 - Hidden Street - Stage 17 -970041716 - Hidden Street - Stage 17 -970041717 - Hidden Street - Stage 17 -970041812 - Hidden Street - Stage 18 -970041813 - Hidden Street - Stage 18 -970041814 - Hidden Street - Stage 18 -970041815 - Hidden Street - Stage 18 -970041816 - Hidden Street - Stage 18 -970041817 - Hidden Street - Stage 18 -970041912 - Hidden Street - Stage 19 -970041913 - Hidden Street - Stage 19 -970041914 - Hidden Street - Stage 19 -970041915 - Hidden Street - Stage 19 -970041916 - Hidden Street - Stage 19 -970041917 - Hidden Street - Stage 19 -970042012 - Hidden Street - Stage 20 -970042013 - Hidden Street - Stage 20 -970042014 - Hidden Street - Stage 20 -970042015 - Hidden Street - Stage 20 -970042016 - Hidden Street - Stage 20 -970042017 - Hidden Street - Stage 20 -970042112 - Hidden Street - Stage 21 -970042113 - Hidden Street - Stage 21 -970042114 - Hidden Street - Stage 21 -970042115 - Hidden Street - Stage 21 -970042116 - Hidden Street - Stage 21 -970042117 - Hidden Street - Stage 21 -970042212 - Hidden Street - Stage 22 -970042213 - Hidden Street - Stage 22 -970042214 - Hidden Street - Stage 22 -970042215 - Hidden Street - Stage 22 -970042216 - Hidden Street - Stage 22 -970042217 - Hidden Street - Stage 22 -970042312 - Hidden Street - Stage 23 -970042313 - Hidden Street - Stage 23 -970042314 - Hidden Street - Stage 23 -970042315 - Hidden Street - Stage 23 -970042316 - Hidden Street - Stage 23 -970042317 - Hidden Street - Stage 23 -970042412 - Hidden Street - Stage 24 -970042413 - Hidden Street - Stage 24 -970042414 - Hidden Street - Stage 24 -970042415 - Hidden Street - Stage 24 -970042416 - Hidden Street - Stage 24 -970042417 - Hidden Street - Stage 24 -970042512 - Hidden Street - Stage 25 -970042513 - Hidden Street - Stage 25 -970042514 - Hidden Street - Stage 25 -970042515 - Hidden Street - Stage 25 -970042516 - Hidden Street - Stage 25 -970042517 - Hidden Street - Stage 25 -970042612 - Hidden Street - Stage 26 -970042613 - Hidden Street - Stage 26 -970042614 - Hidden Street - Stage 26 -970042615 - Hidden Street - Stage 26 -970042616 - Hidden Street - Stage 26 -970042617 - Hidden Street - Stage 26 -970042712 - Hidden Street - Stage 27 -970042713 - Hidden Street - Stage 27 -970042714 - Hidden Street - Stage 27 -970042715 - Hidden Street - Stage 27 -970042716 - Hidden Street - Stage 27 -970042717 - Hidden Street - Stage 27 -926000010 - Hidden Street - Treasure Room of Queen -926000000 - Hidden Street - Ariant Back Street -910020100 - Hidden Street - Thornbush Leading to Jump Stand -910020101 - Hidden Street - Thornbush Leading to Jump Stand -910020102 - Hidden Street - Thornbush Leading to Jump Stand -910020103 - Hidden Street - Thornbush Leading to Jump Stand -910020104 - Hidden Street - Thornbush Leading to Jump Stand -910020200 - Hidden Street - Playground of Lupin Leading to Jump Stand -910020201 - Hidden Street - Playground of Lupin Leading to Jump Stand -910020202 - Hidden Street - Playground of Lupin Leading to Jump Stand -910020203 - Hidden Street - Playground of Lupin Leading to Jump Stand -910020204 - Hidden Street - Playground of Lupin Leading to Jump Stand -910020300 - Hidden Street - Jumping Board Leading to Jump Stand -910020301 - Hidden Street - Jumping Board Leading to Jump Stand -910020302 - Hidden Street - Jumping Board Leading to Jump Stand -910020303 - Hidden Street - Jumping Board Leading to Jump Stand -910020304 - Hidden Street - Jumping Board Leading to Jump Stand -910021000 - Hidden Street - Under the High Branch -910110000 - Hidden Street - Magic Library -910210000 - Hidden Street - Sharenian Castle Gate -910510000 - Hidden Street - Puppeteer's Cave -910510001 - Hidden Street - Puppeteer's Cave -913000000 - Hidden Street - The 1st Drill Hall -913000100 - Hidden Street - The 1st Drill Hall -913000200 - Hidden Street - The 1st Drill Hall -913010000 - Hidden Street - The 3rd Drill Hall -913010100 - Hidden Street - The 3rd Drill Hall -913010200 - Hidden Street - The 3rd Drill Hall -913010300 - Hidden Street - The 3rd Drill Hall -913020000 - Hidden Street - The 4th Drill Hall -913020100 - Hidden Street - The 4th Drill Hall -913020200 - Hidden Street - The 4th Drill Hall -913020300 - Hidden Street - The 4th Drill Hall -913030000 - Hidden Street - Quiet Ereve -913040000 - Opening - Cygnus Knights -913040001 - Opening - Cygnus Knights -913040002 - Opening - Cygnus Knights -913040003 - Opening - Cygnus Knights -913040004 - Opening - Cygnus Knights -913040005 - Opening - Cygnus Knights -913040006 - Opening - Cygnus Knights -913040007 - Opening - Cygnus Knights -913040008 - Opening - Cygnus Knights -913040009 - Opening - Cygnus Knights -920020000 - Hidden Street - Eliza’s Garden -922020300 - Hidden Street - Origin of the Clock Tower -922220000 - Hidden Street - Gloomy Forest -922230000 - Hidden Street - Lunar World -922230001 - Hidden Street - Hole of the Moon -922230002 - Hidden Street - Under the Moon -922230100 - Hidden Street - Silent Yard of Moon Flowers -922230101 - Hidden Street - Silent Yard of Moon Flowers -922230102 - Hidden Street - Silent Yard of Moon Flowers -922230103 - Hidden Street - Silent Yard of Moon Flowers -922230104 - Hidden Street - Silent Yard of Moon Flowers -922230105 - Hidden Street - Silent Yard of Moon Flowers -922230106 - Hidden Street - Silent Yard of Moon Flowers -922230200 - Hidden Street - Shiny Yard of Moon Flowers -922230201 - Hidden Street - Shiny Yard of Moon Flowers -922230202 - Hidden Street - Shiny Yard of Moon Flowers -922230203 - Hidden Street - Shiny Yard of Moon Flowers -922230204 - Hidden Street - Shiny Yard of Moon Flowers -922230205 - Hidden Street - Shiny Yard of Moon Flowers -922230206 - Hidden Street - Shiny Yard of Moon Flowers -922230300 - Hidden Street - Fragrant Yard of Moon Flowers -922230301 - Hidden Street - Fragrant Yard of Moon Flowers -922230302 - Hidden Street - Fragrant Yard of Moon Flowers -922230303 - Hidden Street - Fragrant Yard of Moon Flowers -922230304 - Hidden Street - Fragrant Yard of Moon Flowers -922230305 - Hidden Street - Fragrant Yard of Moon Flowers -922230306 - Hidden Street - Fragrant Yard of Moon Flowers -922231000 - Hidden Street - Playground of Moon Bunnies -924010000 - Hidden Street - Cave of Black Witches -924010100 - Hidden Street - Cave of Black Witches -924010200 - Hidden Street - Cave of Black Witches -925000000 - Hidden Street - Forest of the Ghost Priest -925020000 - Mu Lung Dojo - Mu Lung Dojo Entrance -925020001 - Mu Lung Dojo - Mu Lung Dojo Hall -925020002 - Mu Lung Dojo - Mu Lung Dojo Exit -925020003 - Mu Lung Dojo - Mu Lung Dojo Rooftop -925020010 - Mu Lung Dojo - So Gong's Room -925020011 - Mu Lung Dojo - So Gong's Room -925020012 - Mu Lung Dojo - So Gong's Room -925020013 - Mu Lung Dojo - So Gong's Room -925020014 - Mu Lung Dojo - So Gong's Room -925020100 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925020101 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925020102 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925020103 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925020104 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925020105 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925020106 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925020107 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925020108 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925020109 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925020110 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925020111 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925020112 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925020113 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925020114 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925020200 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925020201 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925020202 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925020203 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925020204 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925020205 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925020206 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925020207 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925020208 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925020209 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925020210 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925020211 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925020212 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925020213 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925020214 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925020300 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925020301 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925020302 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925020303 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925020304 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925020305 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925020306 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925020307 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925020308 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925020309 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925020310 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925020311 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925020312 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925020313 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925020314 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925020400 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925020401 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925020402 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925020403 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925020404 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925020405 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925020406 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925020407 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925020408 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925020409 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925020410 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925020411 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925020412 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925020413 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925020414 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925020500 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925020501 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925020502 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925020503 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925020504 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925020505 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925020506 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925020507 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925020508 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925020509 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925020510 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925020511 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925020512 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925020513 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925020514 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925020600 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925020601 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925020602 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925020603 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925020604 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925020605 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925020606 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925020607 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925020608 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925020609 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925020610 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925020611 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925020612 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925020613 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925020614 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925020700 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925020701 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925020702 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925020703 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925020704 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925020705 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925020706 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925020707 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925020708 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925020709 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925020710 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925020711 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925020712 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925020713 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925020714 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925020800 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925020801 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925020802 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925020803 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925020804 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925020805 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925020806 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925020807 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925020808 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925020809 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925020810 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925020811 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925020812 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925020813 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925020814 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925020900 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925020901 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925020902 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925020903 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925020904 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925020905 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925020906 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925020907 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925020908 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925020909 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925020910 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925020911 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925020912 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925020913 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925020914 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925021000 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925021001 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925021002 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925021003 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925021004 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925021005 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925021006 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925021007 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925021008 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925021009 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925021010 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925021011 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925021012 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925021013 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925021014 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925021100 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925021101 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925021102 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925021103 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925021104 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925021105 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925021106 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925021107 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925021108 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925021109 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925021110 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925021111 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925021112 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925021113 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925021114 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925021200 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925021201 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925021202 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925021203 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925021204 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925021205 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925021206 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925021207 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925021208 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925021209 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925021210 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925021211 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925021212 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925021213 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925021214 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925021300 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925021301 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925021302 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925021303 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925021304 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925021305 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925021306 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925021307 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925021308 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925021309 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925021310 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925021311 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925021312 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925021313 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925021314 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925021400 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925021401 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925021402 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925021403 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925021404 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925021405 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925021406 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925021407 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925021408 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925021409 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925021410 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925021411 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925021412 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925021413 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925021414 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925021500 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925021501 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925021502 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925021503 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925021504 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925021505 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925021506 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925021507 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925021508 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925021509 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925021510 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925021511 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925021512 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925021513 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925021514 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925021600 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925021601 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925021602 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925021603 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925021604 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925021605 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925021606 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925021607 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925021608 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925021609 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925021610 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925021611 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925021612 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925021613 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925021614 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925021700 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925021701 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925021702 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925021703 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925021704 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925021705 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925021706 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925021707 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925021708 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925021709 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925021710 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925021711 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925021712 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925021713 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925021714 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925021800 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925021801 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925021802 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925021803 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925021804 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925021805 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925021806 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925021807 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925021808 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925021809 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925021810 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925021811 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925021812 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925021813 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925021814 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925021900 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925021901 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925021902 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925021903 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925021904 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925021905 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925021906 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925021907 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925021908 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925021909 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925021910 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925021911 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925021912 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925021913 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925021914 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925022000 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925022001 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925022002 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925022003 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925022004 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925022005 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925022006 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925022007 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925022008 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925022009 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925022010 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925022011 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925022012 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925022013 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925022014 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925022100 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925022101 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925022102 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925022103 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925022104 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925022105 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925022106 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925022107 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925022108 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925022109 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925022110 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925022111 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925022112 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925022113 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925022114 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925022200 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925022201 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925022202 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925022203 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925022204 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925022205 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925022206 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925022207 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925022208 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925022209 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925022210 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925022211 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925022212 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925022213 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925022214 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925022300 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925022301 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925022302 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925022303 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925022304 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925022305 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925022306 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925022307 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925022308 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925022309 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925022310 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925022311 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925022312 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925022313 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925022314 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925022400 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925022401 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925022402 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925022403 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925022404 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925022405 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925022406 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925022407 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925022408 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925022409 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925022410 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925022411 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925022412 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925022413 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925022414 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925022500 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925022501 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925022502 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925022503 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925022504 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925022505 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925022506 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925022507 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925022508 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925022509 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925022510 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925022511 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925022512 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925022513 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925022514 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925022600 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925022601 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925022602 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925022603 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925022604 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925022605 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925022606 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925022607 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925022608 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925022609 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925022610 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925022611 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925022612 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925022613 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925022614 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925022700 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925022701 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925022702 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925022703 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925022704 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925022705 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925022706 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925022707 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925022708 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925022709 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925022710 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925022711 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925022712 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925022713 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925022714 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925022800 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925022801 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925022802 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925022803 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925022804 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925022805 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925022806 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925022807 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925022808 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925022809 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925022810 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925022811 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925022812 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925022813 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925022814 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925022900 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925022901 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925022902 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925022903 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925022904 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925022905 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925022906 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925022907 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925022908 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925022909 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925022910 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925022911 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925022912 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925022913 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925022914 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925023000 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925023001 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925023002 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925023003 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925023004 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925023005 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925023006 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925023007 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925023008 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925023009 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925023010 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925023011 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925023012 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925023013 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925023014 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925023100 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925023101 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925023102 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925023103 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925023104 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925023105 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925023106 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925023107 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925023108 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925023109 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925023110 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925023111 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925023112 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925023113 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925023114 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925023200 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925023201 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925023202 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925023203 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925023204 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925023205 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925023206 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925023207 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925023208 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925023209 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925023210 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925023211 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925023212 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925023213 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925023214 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925023300 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925023301 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925023302 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925023303 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925023304 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925023305 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925023306 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925023307 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925023308 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925023309 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925023310 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925023311 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925023312 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925023313 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925023314 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925023400 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925023401 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925023402 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925023403 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925023404 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925023405 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925023406 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925023407 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925023408 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925023409 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925023410 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925023411 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925023412 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925023413 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925023414 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925023500 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925023501 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925023502 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925023503 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925023504 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925023505 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925023506 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925023507 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925023508 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925023509 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925023510 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925023511 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925023512 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925023513 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925023514 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925023600 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925023601 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925023602 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925023603 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925023604 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925023605 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925023606 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925023607 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925023608 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925023609 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925023610 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925023611 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925023612 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925023613 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925023614 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925023700 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925023701 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925023702 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925023703 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925023704 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925023705 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925023706 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925023707 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925023708 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925023709 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925023710 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925023711 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925023712 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925023713 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925023714 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925023800 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925023801 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925023802 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925023803 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925023804 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925023805 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925023806 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925023807 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925023808 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925023809 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925023810 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925023811 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925023812 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925023813 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925023814 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925030100 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925030101 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925030102 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925030103 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925030104 - Mu Lung Dojo - Mu Lung Dojo 1st Floor -925030200 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925030201 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925030202 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925030203 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925030204 - Mu Lung Dojo - Mu Lung Dojo 2nd Floor -925030300 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925030301 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925030302 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925030303 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925030304 - Mu Lung Dojo - Mu Lung Dojo 3rd Floor -925030400 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925030401 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925030402 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925030403 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925030404 - Mu Lung Dojo - Mu Lung Dojo 4th Floor -925030500 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925030501 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925030502 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925030503 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925030504 - Mu Lung Dojo - Mu Lung Dojo 5th Floor -925030600 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925030601 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925030602 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925030603 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925030604 - Mu Lung Dojo - Mu Lung Dojo 6th Floor -925030700 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925030701 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925030702 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925030703 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925030704 - Mu Lung Dojo - Mu Lung Dojo 7th Floor -925030800 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925030801 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925030802 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925030803 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925030804 - Mu Lung Dojo - Mu Lung Dojo 8th Floor -925030900 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925030901 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925030902 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925030903 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925030904 - Mu Lung Dojo - Mu Lung Dojo 9th Floor -925031000 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925031001 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925031002 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925031003 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925031004 - Mu Lung Dojo - Mu Lung Dojo 10th Floor -925031100 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925031101 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925031102 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925031103 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925031104 - Mu Lung Dojo - Mu Lung Dojo 11th Floor -925031200 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925031201 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925031202 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925031203 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925031204 - Mu Lung Dojo - Mu Lung Dojo 12th Floor -925031300 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925031301 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925031302 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925031303 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925031304 - Mu Lung Dojo - Mu Lung Dojo 13th Floor -925031400 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925031401 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925031402 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925031403 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925031404 - Mu Lung Dojo - Mu Lung Dojo 14th Floor -925031500 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925031501 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925031502 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925031503 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925031504 - Mu Lung Dojo - Mu Lung Dojo 15th Floor -925031600 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925031601 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925031602 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925031603 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925031604 - Mu Lung Dojo - Mu Lung Dojo 16th Floor -925031700 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925031701 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925031702 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925031703 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925031704 - Mu Lung Dojo - Mu Lung Dojo 17th Floor -925031800 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925031801 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925031802 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925031803 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925031804 - Mu Lung Dojo - Mu Lung Dojo 18th Floor -925031900 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925031901 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925031902 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925031903 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925031904 - Mu Lung Dojo - Mu Lung Dojo 19th Floor -925032000 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925032001 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925032002 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925032003 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925032004 - Mu Lung Dojo - Mu Lung Dojo 20th Floor -925032100 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925032101 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925032102 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925032103 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925032104 - Mu Lung Dojo - Mu Lung Dojo 21st Floor -925032200 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925032201 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925032202 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925032203 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925032204 - Mu Lung Dojo - Mu Lung Dojo 22nd Floor -925032300 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925032301 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925032302 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925032303 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925032304 - Mu Lung Dojo - Mu Lung Dojo 23rd Floor -925032400 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925032401 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925032402 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925032403 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925032404 - Mu Lung Dojo - Mu Lung Dojo 24th Floor -925032500 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925032501 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925032502 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925032503 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925032504 - Mu Lung Dojo - Mu Lung Dojo 25th Floor -925032600 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925032601 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925032602 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925032603 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925032604 - Mu Lung Dojo - Mu Lung Dojo 26th Floor -925032700 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925032701 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925032702 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925032703 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925032704 - Mu Lung Dojo - Mu Lung Dojo 27th Floor -925032800 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925032801 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925032802 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925032803 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925032804 - Mu Lung Dojo - Mu Lung Dojo 28th Floor -925032900 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925032901 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925032902 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925032903 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925032904 - Mu Lung Dojo - Mu Lung Dojo 29th Floor -925033000 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925033001 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925033002 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925033003 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925033004 - Mu Lung Dojo - Mu Lung Dojo 30th Floor -925033100 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925033101 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925033102 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925033103 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925033104 - Mu Lung Dojo - Mu Lung Dojo 31st Floor -925033200 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925033201 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925033202 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925033203 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925033204 - Mu Lung Dojo - Mu Lung Dojo 32nd Floor -925033300 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925033301 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925033302 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925033303 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925033304 - Mu Lung Dojo - Mu Lung Dojo 33rd Floor -925033400 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925033401 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925033402 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925033403 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925033404 - Mu Lung Dojo - Mu Lung Dojo 34th Floor -925033500 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925033501 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925033502 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925033503 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925033504 - Mu Lung Dojo - Mu Lung Dojo 35th Floor -925033600 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925033601 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925033602 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925033603 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925033604 - Mu Lung Dojo - Mu Lung Dojo 36th Floor -925033700 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925033701 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925033702 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925033703 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925033704 - Mu Lung Dojo - Mu Lung Dojo 37th Floor -925033800 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925033801 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925033802 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925033803 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -925033804 - Mu Lung Dojo - Mu Lung Dojo 38th Floor -913040010 - Opening - Cygnus Knights -913040011 - Opening - Cygnus Knights -980030000 - The 2nd Monster Carnival - Spiegelmann's Office -980030010 - The 2nd Monster Carnival - Exit -980031000 - The 2nd Monster Carnival - Carnival Field 1 -980031100 - The 2nd Monster Carnival - Carnival Field 1 -980031200 - The 2nd Monster Carnival - Carnival Field -980031300 - The 2nd Monster Carnival - Carnival Field -980031400 - The 2nd Monster Carnival - Carnival Field -980032000 - The 2nd Monster Carnival - Carnival Field 2 -980032100 - The 2nd Monster Carnival - Carnival Field 2 -980032200 - The 2nd Monster Carnival - Carnival Field -980032300 - The 2nd Monster Carnival - Carnival Field -980032400 - The 2nd Monster Carnival - Carnival Field -980033000 - The 2nd Monster Carnival - Carnival Field 3 -980033100 - The 2nd Monster Carnival - Carnival Field 3 -980033200 - The 2nd Monster Carnival - Carnival Field -980033300 - The 2nd Monster Carnival - Carnival Field -980033400 - The 2nd Monster Carnival - Carnival Field -910030000 - Fairytale Land - Fairytale Land Entrance -910030001 - Fairytale Land - Fairytale Land Exit -910031000 - Fairytale Land - Witch Cat and the Gingerbread House -910032000 - Fairytale Land - Back Yard -910032100 - Fairytale Land - Beanstalk Climb -910032200 - ???? - ???? ?? ??? -910033000 - Fairytale Land - Ocean Cave Escape! -910033100 - Fairytale Land - Ocean Cave Escape!! -910033200 - Fairytale Land - Ocean Cave Escape!!! -910033300 - Fairytale Land - Ocean Cave End -910040000 - Sheep Ranch - Ranch Entrance -910040001 - Sheep Ranch - Ranch Backstreet -910040002 - Sheep Ranch - Fenced Street -910040003 - Sheep Ranch - Big Bad Wolf's Victory -910040004 - Sheep Ranch - Little Lamb's Victory -910040005 - Sheep Ranch - Wolf's Defeat -910040006 - Sheep Ranch - Little Lamb's Defeat -910040110 - Sheep Ranch - Little Lamb's Courage -910040120 - Sheep Ranch - Wolf's Treachery -910040100 - Sheep Ranch - Sheep Ranch -910520000 - Hidden Street - Hero's Memory -913040100 - Neinheart's Job Introduction - Cygnus Knights -913040101 - Neinheart's Job Introduction - Cygnus Knights -913040102 - Neinheart's Job Introduction - Cygnus Knights -913040103 - Neinheart's Job Introduction - Cygnus Knights -913040104 - Neinheart's Job Introduction - Cygnus Knights -913040105 - Neinheart's Job Introduction - Cygnus Knights -913040106 - Neinheart's Job Introduction - Cygnus Knights -922240000 - Space Gaga - Rescue Gaga! -922240100 - Space Gaga - Gaga's Rescue Success?! -922240200 - Space Gaga - Moon Corner -922241000 - Space Mine - Space Mine -922241100 - Space Mine - Back of Space Mine -970000100 - Hidden Street - Family Studio Waiting Room -970000101 - Hidden Street - Maple Studio -970000102 - Hidden Street - Ludibrium Studio -970000103 - Hidden Street - Ariant Studio -970000104 - Hidden Street - Orbis Studio -970000105 - Hidden Street - Mu Lung Studio -970000106 - Hidden Street - Magatia Studio -970000107 - Hidden Street - Ereve Studio -970000108 - Hidden Street - Studio Made of Cookies -980040000 - Witch Tower - Witch Tower Entrance -980040010 - Witch Tower - Witch's Grave Site -980041000 - Witch Tower - Witch Tower 1st Floor -980041100 - Witch Tower - Witch Tower 2nd Floor -980041200 - Witch Tower - Witch Tower 3rd Floor -980042000 - Witch Tower - Witch Tower 1st Floor -980042100 - Witch Tower - Witch Tower 2nd Floor -980042200 - Witch Tower - Witch Tower 3rd Floor -980043000 - Witch Tower - Witch Tower 1st Floor -980043100 - Witch Tower - Witch Tower 2nd Floor -980043200 - Witch Tower - Witch Tower 3rd Floor -980044000 - Witch Tower - Witch Tower 1st Floor -980044100 - Witch Tower - Witch Tower 2nd Floor -980044200 - Witch Tower - Witch Tower 3rd Floor -950000000 - ?????? - ??? ??? -910050000 - ?????? - ??? ?? ????? -910060000 - Victoria Road - Bowman Training Center -910060001 - Victoria Road - Bowman Training Center -910060002 - Victoria Road - Bowman Training Center -910060003 - Victoria Road - Bowman Training Center -910060004 - Victoria Road - Bowman Training Center -910120000 - Victoria Road - Magician Training Center -910120001 - Victoria Road - Magician Training Center -910120002 - Victoria Road - Magician Training Center -910120003 - Victoria Road - Magician Training Center -910120004 - Victoria Road - Magician Training Center -910220000 - Victoria Road - Warrior Training Center -910220001 - Victoria Road - Warrior Training Center -910220002 - Victoria Road - Warrior Training Center -910220003 - Victoria Road - Warrior Training Center -910220004 - Victoria Road - Warrior Training Center -910310000 - Victoria Road - Thief Training Center -910310001 - Victoria Road - Thief Training Center -910310002 - Victoria Road - Thief Training Center -910310003 - Victoria Road - Thief Training Center -910310004 - Victoria Road - Thief Training Center -910400000 - Hidden Street - Dangerous Info Shop -910330300 - Hidden Street - Dusty Platform -910330200 - Hidden Street - Dusty Platform -910330100 - Hidden Street - Dusty Platform -910330001 - Hidden Street - Last Platform -910320300 - Hidden Street - Dusty Platform -910320200 - Hidden Street - Dusty Platform -910320100 - Hidden Street - Dusty Platform -910320010 - Hidden Street - Platform - Train 999 -910320001 - Hidden Street - Dusty Platform -910320000 - Hidden Street - Abandoned Subway Station -910510100 - Hidden Street - Puppeteer's Secret Passage -910510200 - Hidden Street - Puppeteer's Cave -910510201 - Hidden Street - Puppeteer's Cave -910510202 - Hidden Street - Puppeteer's Cave -912030000 - Victoria Road - Pirate Training Center -912030001 - Victoria Road - Pirate Training Center -912030002 - Victoria Road - Pirate Training Center -912030003 - Victoria Road - Pirate Training Center -912030004 - Victoria Road - Pirate Training Center -914000000 - Black Road - Wounded Soldier's Camp -914000100 - Black Road - Ready to Leave -914000200 - Black Road - Burning Forest 1 -914000210 - Black Road - Burning Forest 2 -914000220 - Black Road - Burning Forest 3 -914000300 - Black Road - Dead End Forest -914000400 - Black Road - Burning Forest 3 -914000410 - Black Road - Burning Forest 2 -914000420 - Black Road - Burning Forest 1 -914000500 - Black Road - Ready to Leave -914010000 - Snow Island - Training Ground 1 -914010100 - Snow Island - Training Ground 2 -914010200 - Snow Island - Training Ground 3 -914020000 - Hidden Street - Battle Against Maha -914030000 - Hidden Street - Wolf's Agony -920030000 - Hidden Street - Quiet Walk -920030001 - Hidden Street - Sealed Garden -921110000 - Hidden Street - Rider's Field -925040000 - Hidden Street - Back Alley of Mu Lung Training Center -925040001 - Hidden Street - Special Floor of Mu Lung Training Center -925040100 - Hidden Street - Sealed Temple -926010000 - Hidden Street - Pyramid Dunes -926010001 - Hidden Street - Nett's Pyramid -926010010 - Hidden Street - Tomb of Pharaoh Yeti -926010070 - Hidden Street - Tomb of Pharaoh Yeti -926010100 - Hidden Street - Nett's Pyramid -926010200 - Hidden Street - Nett's Pyramid -926010300 - Hidden Street - Nett's Pyramid -926010400 - Hidden Street - Nett's Pyramid -926010500 - Hidden Street - Nett's Pyramid -926011100 - Hidden Street - Nett's Pyramid -926011200 - Hidden Street - Nett's Pyramid -926011300 - Hidden Street - Nett's Pyramid -926011400 - Hidden Street - Nett's Pyramid -926011500 - Hidden Street - Nett's Pyramid -926012100 - Hidden Street - Nett's Pyramid -926012200 - Hidden Street - Nett's Pyramid -926012300 - Hidden Street - Nett's Pyramid -926012400 - Hidden Street - Nett's Pyramid -926012500 - Hidden Street - Nett's Pyramid -926013100 - Hidden Street - Nett's Pyramid -926013200 - Hidden Street - Nett's Pyramid -926013300 - Hidden Street - Nett's Pyramid -926013400 - Hidden Street - Nett's Pyramid -926013500 - Hidden Street - Nett's Pyramid -926020001 - Hidden Street - Shades of the Pyramid -926020100 - Hidden Street - Nett's Pyramid -926020200 - Hidden Street - Nett's Pyramid -926020300 - Hidden Street - Nett's Pyramid -926020400 - Hidden Street - Nett's Pyramid -926020500 - Hidden Street - Nett's Pyramid -926021100 - Hidden Street - Nett's Pyramid -926021200 - Hidden Street - Nett's Pyramid -926021300 - Hidden Street - Nett's Pyramid -926021400 - Hidden Street - Nett's Pyramid -926021500 - Hidden Street - Nett's Pyramid -926022100 - Hidden Street - Nett's Pyramid -926022200 - Hidden Street - Nett's Pyramid -926022400 - Hidden Street - Nett's Pyramid -926022300 - Hidden Street - Nett's Pyramid -926022500 - Hidden Street - Nett's Pyramid -926023100 - Hidden Street - Nett's Pyramid -926023200 - Hidden Street - Nett's Pyramid -926023300 - Hidden Street - Nett's Pyramid -926023400 - Hidden Street - Nett's Pyramid -926023500 - Hidden Street - Nett's Pyramid -930010000 - Hidden Street - Dangerous Library - -singapore - -540000000 - Singapore - CBD -540000100 - Singapore - Central Way 1 -540000200 - Singapore - Central Way 2 -540000300 - Singapore - Central Way 3 -540010000 - Singapore - Changi Airport -540010001 - Singapore - Before Departure (To Kerning City) -540010002 - Singapore - On the way to Kerning City -540010100 - Victoria Island - Kerning Airport -540010101 - Victoria Island - On the way to CBD -540020000 - Singapore - Suburban Area 1 -540020100 - Singapore - Suburban Area 2 -541000000 - Singapore - Boat Quay Town -541000100 - Singapore - Mysterious Path 1 -541000200 - Singapore - Mysterious Path 2 -541000300 - Singapore - Mysterious Path 3 -541010000 - Singapore - Ghost ship 1 -541010010 - Singapore - Ghost Ship 2 -541010020 - Singapore - Ghost Ship 3 -541010030 - Singapore - Ghost Ship 4 -541010040 - Singapore - Ghost Ship 5 -541010050 - Singapore - Ghost Ship 6 -541010060 - Singapore - Ghost ship 7 -541010100 - Singapore - The Engine Room -541010110 - Singapore - The Peaceful Ship -550000000 - Malaysia - Trend Zone Metropolis -550000100 - Malaysia - Outskirts of Muddy Banks -550000200 - Malaysia - Muddy Banks 1 -550000300 - Malaysia - Muddy Banks 2 -550000400 - Malaysia - Muddy Banks 3 -551000000 - Malaysia - Kampung Village -551000100 - Malaysia - Hibiscus Road 1 -551000200 - Malaysia - Hibiscus Road 2 -551010000 - Malaysia - Fantasy Theme Park 1 -551020000 - Malaysia - Fantasy Theme Park 2 -551030000 - Malaysia - Fantasy Theme Park 3 -551030100 - Malaysia - Entrance to the Spooky World -551030200 - Malaysia - Spooky World -551030001 - Malaysia - Longest Ride on ByeBye Station -551030020 - Malaysia - Longest Ride on ByeBye Station -551030019 - Malaysia - Longest Ride on ByeBye Station -551030018 - Malaysia - Longest Ride on ByeBye Station -551030017 - Malaysia - Longest Ride on ByeBye Station -551030016 - Malaysia - Longest Ride on ByeBye Station -551030015 - Malaysia - Longest Ride on ByeBye Station -551030014 - Malaysia - Longest Ride on ByeBye Station -551030013 - Malaysia - Longest Ride on ByeBye Station -551030012 - Malaysia - Longest Ride on ByeBye Station -551030011 - Malaysia - Longest Ride on ByeBye Station -551030010 - Malaysia - Longest Ride on ByeBye Station -551030009 - Malaysia - Longest Ride on ByeBye Station -551030008 - Malaysia - Longest Ride on ByeBye Station -551030007 - Malaysia - Longest Ride on ByeBye Station -551030006 - Malaysia - Longest Ride on ByeBye Station -551030005 - Malaysia - Longest Ride on ByeBye Station -551030004 - Malaysia - Longest Ride on ByeBye Station -551030003 - Malaysia - Longest Ride on ByeBye Station -551030002 - Malaysia - Longest Ride on ByeBye Station - -event - -683000000 - Hidden Street - Sweet Cake Hill Entrance -683000100 - Mini Dungeon - Sweet Cake Hill 1 -683000101 - Mini Dungeon - Sweet Cake Hill 1 -683000102 - Mini Dungeon - Sweet Cake Hill 1 -683000103 - Mini Dungeon - Sweet Cake Hill 1 -683000104 - Mini Dungeon - Sweet Cake Hill 1 -683000105 - Mini Dungeon - Sweet Cake Hill 1 -683000106 - Mini Dungeon - Sweet Cake Hill 1 -683000107 - Mini Dungeon - Sweet Cake Hill 1 -683000108 - Mini Dungeon - Sweet Cake Hill 1 -683000109 - Mini Dungeon - Sweet Cake Hill 1 -683000110 - Mini Dungeon - Sweet Cake Hill 2 -683000111 - Mini Dungeon - Sweet Cake Hill 2 -683000112 - Mini Dungeon - Sweet Cake Hill 2 -683000113 - Mini Dungeon - Sweet Cake Hill 2 -683000114 - Mini Dungeon - Sweet Cake Hill 2 -683000115 - Mini Dungeon - Sweet Cake Hill 2 -683000116 - Mini Dungeon - Sweet Cake Hill 2 -683000117 - Mini Dungeon - Sweet Cake Hill 2 -683000118 - Mini Dungeon - Sweet Cake Hill 2 -683000119 - Mini Dungeon - Sweet Cake Hill 2 -683000120 - Mini Dungeon - Sweet Cake Hill 3 -683000121 - Mini Dungeon - Sweet Cake Hill 3 -683000122 - Mini Dungeon - Sweet Cake Hill 3 -683000123 - Mini Dungeon - Sweet Cake Hill 3 -683000124 - Mini Dungeon - Sweet Cake Hill 3 -683000125 - Mini Dungeon - Sweet Cake Hill 3 -683000126 - Mini Dungeon - Sweet Cake Hill 3 -683000127 - Mini Dungeon - Sweet Cake Hill 3 -683000128 - Mini Dungeon - Sweet Cake Hill 3 -683000129 - Mini Dungeon - Sweet Cake Hill 3 - -Episode1GL - -677000000 - Mini Dungeon - Marbas Strolling Path -677000001 - Mini Dungeon - Marbas Hiding Place -677000002 - Mini Dungeon - Amdusias Strolling Path -677000003 - Mini Dungeon - Amdusias Hiding Place -677000004 - Mini Dungeon - Andras Strolling Path -677000005 - Mini Dungeon - Andras Hiding Place -677000006 - Mini Dungeon - Crocell Strolling Path -677000007 - Mini Dungeon - Crocell Hiding Place -677000008 - Mini Dungeon - Valefor Strolling Path -677000009 - Mini Dungeon - Valefor Hiding Place -677000010 - Mini Dungeon - Fog Forest -677000011 - Mini Dungeon - Astaroth Strolling Place -677000012 - Mini Dungeon - Astaroth Hiding Place - diff --git a/tools/MapleIdRetriever/handbook/Mob.txt b/tools/MapleIdRetriever/handbook/Mob.txt deleted file mode 100644 index cd9329b5b6..0000000000 --- a/tools/MapleIdRetriever/handbook/Mob.txt +++ /dev/null @@ -1,1597 +0,0 @@ -100100 - Snail -100101 - Blue Snail -100120 - Tino -100121 - Tiv -100122 - Timu -100123 - Tiru -100124 - Tiguru -1110100 - Green Mushroom -1110101 - Dark Stump -1120100 - Octopus -1130100 - Axe Stump -1140100 - Ghost Stump -120100 - Shroom -1210100 - Pig -1210101 - Ribbon Pig -1210102 - Orange Mushroom -2230131 - Annoyed Zombie Mushroom -1110130 - Dejected Green Mushroom -1140130 - Smirking Ghost Stump -1210103 - Bubbling -130100 - Stump -130101 - Red Snail -2100100 - Desert Rabbit (F) -2100101 - Desert Rabbit (M) -2100102 - Jr. Cactus -9501018 - Stat Change Test -9300383 - Tutorial Muru -2100103 - Cactus -2100104 - Royal Cactus -2100105 - Bellamoa -2100106 - Ear Plug Plead -2100107 - Scarf Plead -210100 - Slime -2110200 - Horny Mushroom -2110300 - Sand Rat -2110301 - Scorpion -2130100 - Dark Axe Stump -2130103 - Jr. Necki -2220000 - Mano -2220100 - Blue Mushroom -2230100 - Evil Eye -2230101 - Zombie Mushroom -2230102 - Wild Boar -2230103 - Trixter -2230104 - Green Trixter -2230105 - Seacle -2230106 - Cico -2230107 - Krappy -2230108 - Pinboom -2230109 - Bubble Fish -2230110 - Wooden Mask -2230111 - Rocky Mask -2230200 - Flower Fish -2300100 - Stirge -3000000 - Sentinel -3000001 - Fairy 1 -3000002 - Fairy 2 -3000003 - Fairy 3 -3000004 - Fairy 4 -3000005 - Brown Teddy -3000006 - Krip -3100101 - Sand Dwarf -3100102 - Kiyo -3110100 - Ligator -3110101 - Pink Teddy -3110102 - Ratz -3110300 - Cube Slime -3110301 - Dark Sand Dwarf -3110302 - Rumo -3110303 - Triple Rumo -3210100 - Fire Boar -3210200 - Jr. Cellion -3210201 - Jr. Lioner -3210202 - Jr. Grupin -3210203 - Panda Teddy -3210204 - Roloduck -3210205 - Black Ratz -3210206 - Helly -3210207 - Tick -3210208 - Retz -3210450 - Scuba Pepe -3210800 - Lupin -3220000 - Stumpy -3220001 - Deo -3230100 - Curse Eye -3230101 - Jr. Wraith -3230102 - Lorang -3230103 - King Bloctopus -3230104 - Mask Fish -3230200 - Star Pixie -3230300 - Jr. Boogie 1 -3230301 - Jr. Boogie 2 -3230302 - Bloctopus -3230303 - Propelly -3230304 - Planey -3230305 - Toy Trojan -3230306 - Chronos -3230307 - Chirppy -3230308 - Tweeter -3230400 - Drumming Bunny -3230405 - Jr. Seal -4090000 - Iron Hook -4110300 - Iron Mutae -4110301 - Reinforced Iron Mutae -4110302 - Mithril mutae -4130100 - Copper Drake -4130101 - Tortie -4130102 - Dark Nependeath -4130103 - Rombot -4130104 - Dark Nependeath -4220000 - Seruf -4220001 - Seruf -4230100 - Cold Eye -4230101 - Zombie Lupin -4230102 - Wraith -4230103 - Iron Hog -4230104 - Clang -4230105 - Nependeath -4230106 - Lunar Pixie -4230107 - Flyeye -4230108 - Jr. Cerebes -4230109 - Block Golem -4230110 - King Block Golem -4230111 - Robo -4230112 - Master Robo -4230113 - Tick-Tock -4230114 - Platoon Chronos -4230115 - Master Chronos -4230116 - Barnard Gray -4230117 - Zeta Gray -4230118 - Ultra Gray -4230119 - Mateon -4230120 - Plateon -4230121 - Mecateon -4230122 - Nependeath -4230123 - Sparker -4230124 - Freezer -4230125 - Skeledog -4230126 - Mummydog -4230200 - Poopa -4230201 - Poison Poopa -4230300 - Moon Bunny -4230400 - Iron Boar -4230500 - Chipmunk -4230501 - Red Porky -4230502 - Black Porky -4230503 - Blue Flower Serpent -4230504 - Red Flower Serpent -4230505 - Jar -4230506 - Ginseng Jar -4230600 - Desert Giant -4240000 - Chief Gray -4250000 - Mossy Snail -4250001 - Tree Rod -5090000 - Shade -5090001 - Master Dummy -5100000 - Jr. Yeti -5100001 - Transforming Jr. Yeti -5100002 - Firebomb -5100003 - Hodori -5100004 - Samiho -5100005 - Hogul -5110300 - Reinforced Mithril Mutae -5110301 - Roid -5110302 - Neo Huroid -5120000 - Luster Pixie -5120001 - Cellion -5120002 - Lioner -5120003 - Grupin -5120100 - MT-09 -5120500 - Grizzly -5120501 - Bellflower Root -5120502 - Sr. Bellflower Root -5120503 - Straw Target Dummy -5120504 - Wooden Target Dummy -5120505 - Reindeer -5120506 - The Book Ghost -5130100 - Drake -5130101 - Stone Golem -5130102 - Dark Stone Golem -5130103 - Croco -5130104 - Hector -5130105 - Dark Jr. Yeti -5130106 - Transforming Dark Jr. Yeti -5130107 - Coolie Zombie -5130108 - Miner Zombie -5140000 - White Fang -5150000 - Mixed Golem -5150001 - Skeleton Soldier -5200000 - Jr. Sentinel -5200001 - Ice Sentinel -5200002 - Fire Sentinel -5220000 - King Clang -5220001 - King Clang -5220002 - Faust -5220003 - Timer -5220004 - Giant Centipede -5250000 - Mossy Mushroom -5250001 - Stone Bug -5250002 - Primitive Boar -5300000 - Leatty -5300001 - Dark Leatty -5300100 - Malady -5400000 - Jr. Pepe -6090000 - Riche -6090001 - Snow Witch -6090002 - Bamboo Warrior -6090003 - Scholar Ghost -6090004 - Rurumo -6110300 - Homun -6110301 - Saitie -6130100 - Red Drake -6130101 - Mushmom -6130102 - Separated Pepe -6130103 - Pepe -6130104 - Boogie -6130200 - Buffy -6130201 - Blin -6130202 - Morphed Blin -6130203 - Panda -6130204 - Mr. Alli -6130207 - Peach Monkey -6130208 - Kru -6130209 - Sage Cat -6220000 - Dyle -6220001 - Zeno -6230100 - Wild Kargo -6230101 - Puco -6230200 - Dark Pepe -6230201 - Separated Dark Pepe -6230300 - Lazy Buffy -6230400 - Soul Teddy -6230401 - Jr. Lucida -6230500 - Master Soul Teddy -6230600 - Ice Drake -6230601 - Dark Drake -6230602 - Officer Skeleton -6300000 - Yeti -6300001 - Transformed Yeti -6300002 - Separated Yeti -6300003 - Punco -6300004 - Pachu -6300005 - Zombie Mushmom -6300100 - Buffoon -6400000 - Dark Yeti -6400001 - Transformed Dark Yeti -6400002 - Separated Dark Yeti -6400003 - Cuzco -6400004 - Opachu -6400005 - ??? ?? -6400100 - Deep Buffoon -7090000 - Security Camera -7110300 - D. Roy -7110301 - Homunculus -7130000 - Lucida -7130001 - Cerebes -7130002 - Beetle -7130003 - Dual Beetle -7130004 - Hankie -7130010 - Death Teddy -7130020 - Goby -7130100 - Tauromacis -7130101 - Taurospear -7130102 - Yeti and Pepe -7130103 - Commander Skeleton -7130104 - Captain -7130200 - Werewolf -7130300 - Master Death Teddy -7130400 - Yellow King Goblin -7130401 - Blue King Goblin -7130402 - Green King Goblin -7130500 - Rash -7130501 - Dark Rash -7130600 - Hobi -7130601 - Green Hobi -7130602 - Thorny Vine -7140000 - Ghost Pirate -7160000 - Dual Ghost Pirate -7220000 - Tae Roon -7220001 - Nine-Tailed Fox -7220002 - King Sage Cat -8090000 - Deet and Roi -8110300 - Homunscullo -8130100 - Jr. Balrog -8140000 - Lycanthrope -8140001 - Harp -8140002 - Blood Harp -8140100 - Dark Yeti and Pepe -8140101 - Black Kentaurus -8140102 - Red Kentaurus -8140103 - Blue Kentaurus -8140110 - Birk -8140111 - Dual Birk -8140200 - Klock -8140300 - Dark Klock -8140500 - Bain -8140555 - Bombing Fish House -8140600 - Bone Fish -8140700 - Blue Dragon Turtle -8140701 - Red Dragon Turtle -8140702 - Rexton -8140703 - Brexton -8141000 - Spirit Viking -8141100 - Gigantic Spirit Viking -8141300 - Squid -8142000 - Phantom Watch -8142100 - Risell Squid -8143000 - Grim Phantom Watch -8150000 - Crimson Balrog -8150100 - Shark -8150101 - Cold Shark -8150200 - Green Cornian -8150201 - Dark Cornian -8150300 - Red Wyvern -8150301 - Blue Wyvern -8150302 - Dark Wyvern -8160000 - Gatekeeper -8170000 - Thanatos -8180000 - Manon -8180001 - Griffey -8190000 - Jr. Newtie -8190001 - Jr. Newtie -8190002 - Nest Golem -8190003 - Skelegon -8190004 - Skelosaurus -8190005 - Nest Golem -8200000 - Eye of Time -8200001 - Memory Monk -8200002 - Memory Monk Trainee -8200003 - Memory Guardian -8200004 - Chief Memory Guardian -8200005 - Qualm Monk -8200006 - Qualm Monk Trainee -8200007 - Qualm Guardian -8200008 - Chief Qualm Guardian -8200009 - Oblivion Monk -8200010 - Oblivion Monk Trainee -8200011 - Oblivion Guardian -8200012 - Chief Oblivion Guardian -8220000 - Eliza -8220001 - Snowman -8220002 - Chimera -8220003 - Leviathan -8220004 - Dodo -8220005 - Lilynouch -8220006 - Lyka -8220007 - Blue Mushmom -8220009 - Snack Bar -8500000 - Time Sphere -8500001 - Papulatus Clock -8500002 - Papulatus -8500003 - High Darkstar -8500004 - Low Darkstar -8510000 - Pianus -8510100 - Bloody Boom -8520000 - Pianus -8800000 - Zakum1 -8800001 - Zakum2 -8800002 - Zakum3 -8800003 - Zakum's Arm 1 -8800004 - Zakum's Arm 2 -8800005 - Zakum's Arm 3 -8800006 - Zakum's Arm 4 -8800007 - Zakum's Arm 5 -8800008 - Zakum's Arm 6 -8800009 - Zakum's Arm 7 -8800010 - Zakum's Arm 8 -8810000 - Horntail's Left Head -8810001 - Horntail's Right Head -8810002 - Horntail's Head A -8810003 - Horntail's Head B -8810004 - Horntail's Head C -8810005 - Horntail's Left Hand -8810006 - Horntail's Right Hand -8810007 - Horntail's Wings -8810008 - Horntail's Legs -8810009 - Horntail's Tails -8810010 - Dead Horntail's Head A -8810011 - Dead Horntail's Head B -8810012 - Dead Horntail's Head C -8810013 - Dead Horntail's Left Hand -8810014 - Dead Horntail's Right Hand -8810015 - Dead Horntail's Wings -8810016 - Dead Horntail's Legs -8810017 - Dead Horntail's Tails -8810018 - Horntail -8810019 - Red Wyvern -8810020 - Blue Wyvern -8810021 - Dark Wyvern -8810022 - Green Cornian -8810023 - Dark Cornian -8810024 - Summon Horntail's Left Head -8810025 - Summon Horntail's Right Head -8810026 - Summon Horntail -8820000 - Pink Bean -8820001 - Pink Bean -8820002 - Ariel -8820003 - Solomon the Wise -8820004 - Rex the Wise -8820005 - Hugin -8820006 - Munin -8820007 - Mini Bean -8820008 - Transparent Mob for summoning baby boss -8820009 - set0 Transparent Mob -8820010 - Pink Bean -8820011 - Pink Bean -8820012 - Pink Bean -8820013 - Pink Bean -8820014 - Pink Bean -8820015 - Solomon the Wise -8820016 - Rex the Wise -8820017 - Hugin -8820018 - Munin -8820019 - Ariel -8820020 - Solomon the Wise -8820021 - Rex the Wise -8820022 - Hugin -8820023 - Munin -8820024 - Solomon the Wise -8820025 - Rex the Wise -8820026 - Hugin -8820027 - Munin -9000001 - Curse Eye 2 -9000002 - Horned Mushroom 2 -9000100 - Fire Boar 2 -9000101 - Lupin 2 -9000200 - Evil Eye 2 -9000201 - Zombie Mushroom 2 -9000300 - Cold Eye 2 -9000301 - Blue Mushroom 2 -9001000 - Dances with Balrog's Clone -9001001 - Grendel the Really Old's Clone -9001002 - Athena Pierce's Clone -9001003 - Dark Lord's Clone -9001004 - Shadow Kyrin -9001005 - OctoPirate -9001006 - OctoPirate -9001007 - Scarecrow for Training -9001008 - Shadow Kyrin's Clone -9001009 - Master of Disguise -9001010 - Black Witch -9001011 - Tiguru of Exam -9100000 - Super Slime -9100001 - Super Jr. Necki -9100002 - Super Stirge -9100003 - Ultra Jr. Necki 1 -9100004 - Ultra Jr. Necki 2 -9100005 - Super Trickster -9100006 - Super Green Trickster -9100007 - Super Ribbon-Pig -9100008 - Super Coke Snail 1 -9100009 - Super Coke Snail 2 -9100010 - Mr. Black Sheep -9100013 - Adin -9200000 - Wild Boar (PC) -9200001 - Fire Boar (PC) -9200002 - Dark Stump (PC) -9200003 - Horned Mushroom (PC) -9200004 - Green Mushroom (PC) -9200005 - Slime (PC) -9200006 - Lupin (PC) -9200007 - Zombie Lupin (PC) -9200008 - Blue Mushroom (PC) -9200009 - Stone Golem (PC) -9200010 - Zombie Mushroom (PC) -9200011 - Evil Eye (PC) -9200012 - Drake (PC) -9200013 - Cold Eye (PC) -9200014 - Wild Kargo (PC) -9200015 - Brown Tanny -9200016 - Drumming Bunny -9200017 - Pink Tanny -9200018 - Jr. Yetti -9200019 - White Fang -9200020 - Yetti & Pepe -9200021 - Separated Yetti -9200022 - Separated Pepe -9300000 - Jr. Necki (PC) -9300001 - Ligator (PC) -9300002 - Curse Eye (PC) -9300003 - King Slime -9300004 - Mimic -9300005 - Ratz from Another Dimension -9300006 - Black Ratz from Another Dimension -9300007 - Bloctopus from Another Dimension -9300008 - Shadow Eye from Another Dimension -9300009 - Block Golem from Another Dimension -9300010 - Rombad from Another Dimension -9300011 - Toy Trojan -9300012 - Alishar -9300013 - King Block Golem from Another Dimension -9300014 - Dark Eye from Another Dimension -9300015 - Cronos -9300016 - Platoon Cronos -9300017 - Master Cronos -9300018 - Tutorial Jr. Sentinel -9300019 - Master Muscle Stone -9300020 - Muscle Stone -9300021 - Dark Muscle Stone -9300022 - Black Knight -9300023 - Myst Knight -9300024 - Puppet Golem -9300025 - Gargoyle -9300026 - Jr. Gargoyle -9300027 - Devil Slime -9300028 - Ergoth -9300029 - Lion Statue A -9300030 - Lion Statue B -9300031 - Knight Statue A -9300032 - Knight Statue B -9300033 - Jr. Gargoyle -9300034 - Mist Knight -9300035 - Jr. Gargoyle -9300036 - Black Knight -9300037 - Mist Knight -9300038 - Ghost Pixie -9300039 - Papa Pixie -9300040 - Cellion in Tower of Goddess -9300041 - Cellion in Tower of Goddess -9300042 - Grupin in Tower of Goddess -9300043 - Lioner in Tower of Goddess -9300044 - Lucida in Tower of Goddess -9300045 - Lunar Pixie in Tower of Goddess -9300046 - Star Pixie in Tower of Goddess -9300047 - Luster Pixie in Tower of Goddess -9300048 - Nependeath in Tower of Goddess -9300049 - Royal Nependeath in Tower of Goddess -9300050 - Flying Boogie -9300051 - Jr. Cellion in Tower of Goddess -9300052 - Jr. Lioner in Tower of Goddess -9300053 - Jr. Grupin in Tower of Goddess -9300054 - Lunar Pixie in Tower of Goddess(Summon Boss) -9300055 - Star Pixie in Tower of Goddess(Summon Boss) -9300056 - Luster Pixie in Tower of Goddess(Summon Boss) -9300057 - Cellion in Tower of Goddess -9300058 - Pig -9300059 - Ribbon Pig -9300060 - Iron Hog -9300061 - Moon Bunny -9300062 - Flyeye -9300063 - Stirge -9300064 - Goblin Fire -9300065 - Green Cornian1 in Cave -9300066 - Green Cornian 2 in Cave -9300067 - Dark Cornian 1 in Cave -9300068 - Dark Cornian 2 in Cave -9300069 - Red Wyvern 1 in Cave -9300070 - Red Wyvern 2 in Cave -9300071 - Blue Wyvern 1 in Cave -9300072 - Blue Wyvern 2 in Cave -9300073 - Dark Wyvern 1 in Cave -9300074 - Dark Wyvern 2 in Cave -9300075 - Skelegon 1 in Cave -9300076 - Skelegon 2 in Cave -9300077 - T-Skelegon in Cave -9300078 - Jr. Newtie in Cave -9300079 - Nest Golem in Cave -9300080 - Kru -9300081 - Flyeye -9300082 - Stirge -9300083 - Goblin Fire -9300084 - Deathly Fear -9300085 - Jr. Balrog in Another World -9300086 - The Elemental Thanatos -9300087 - The Charging Taurospear -9300088 - Dark Lord's Disciple -9300089 - Phoenix -9300090 - Freezer -9300091 - Buff Rocky in the Dark -9300092 - Jr. Balrog in Forgotten Shrine -9300093 - Tylus -9300094 - Crimson Balrog the Kidnapper -9300095 - Lycanthrope the Kidnapper -9300096 - Black Kentaurus -9300097 - Goby in Warped Dimension -9300098 - Bone Fish in Warped Dimension -9300099 - Shark in Warped Dimension -9300100 - The Elemental Thanatos -9300101 - Tamable Hog -9300102 - Watchhog -9300103 - Barnard Gray -9300104 - Zeta Gray -9300105 - Angry Lord Pirate -9300106 - Enraged Lord Pirate -9300107 - Peeking Lord Pirate -9300108 - Lord Pirate's Jar -9300109 - Lord Pirate's Ginseng Jar -9300110 - Lord Pirate's Bellflower -9300111 - Lord Pirate's Ancient Bellflower -9300112 - Lord Pirate's 100yrOld Bellflower -9300113 - Lord Pirate's 100yrOld Ancient Bellflower -9300114 - Lord Pirate's Enraged Mr. Alli -9300115 - Lord Pirate's Enraged Kru -9300116 - Lord Pirate's Enraged Captain -9300117 - Lord Pirate's Devoted Kru -9300118 - Lord Pirate's Devoted Captain -9300119 - Lord Pirate -9300120 - Lord Pirate's Furious Mr. Alli -9300121 - Lord Pirate's Furious Kru -9300122 - Lord Pirate's Furious Captain -9300123 - Lord Pirate's Mr. Alli -9300124 - Lord Pirate's Kru -9300125 - Lord Pirate's Captain -9300126 - Lord Pirate's Enraged Ginseng Jar -9300127 - Brown Teddy -9300128 - Bloctopus -9300129 - Ratz -9300130 - Chronos -9300131 - Toy Trojan -9300132 - Tick-Tock -9300133 - Robo -9300134 - King Bloctopus -9300135 - Master Chronos -9300136 - Rombot -9300137 - Juliet -9300138 - Romeo -9300139 - Frankenroid -9300140 - Angry Frankenroid -9300141 - Homun of Closed Laboratory -9300142 - Homunculu of hidden laboratory -9300143 - Reinforced Iron Mutae -9300144 - Reinforced Mithril Mutae -9300145 - Homun -9300146 - Cyti -9300147 - Homunculus -9300148 - Neo Huroid -9300149 - Roid -9300150 - Neo Huroid -9300151 - Frankenroid -9300152 - Angry Frankenroid -9300153 - Obstacle Mutae -9300154 - Experimental Neo Huroid -9300155 - Pig -9300156 - Black Magician's Disciple -9300157 - Scorpion -9300158 - Kyrin -9300159 - Inferno Kyrin -9300160 - Blue Flower Serpent -9300161 - Red Flower Serpent -9300162 - Willi -9300163 - Sage Cat -9300164 - The Book Ghost -9300165 - Peach Monkey -9300166 - Bomb -9300167 - Degraded Rumo -9300168 - Reinforced Roid -9300169 - Ratz from Another Dimension -9300170 - Black Ratz from Another Dimension -9300171 - Bloctopus from Another Dimension -9300172 - Poisoned Lord Tree -9300173 - Poisoned Stone Bug -9300174 - Poisoned Spright -9300175 - Poison Flower -9300176 - Poison Golem -9300177 - Poison Golem Level 2 -9300178 - Poison Golem Level 3 -9300179 - Spright -9300180 - Poison Golem -9300181 - Charged Poison Golem -9300182 - Super-Charged Poison Golem -9300183 - Deeply Poisoned Stone Bug -9300184 - Mano -9300185 - Stumpy -9300186 - Deo -9300187 - King Slime -9300188 - Giant Centipede -9300189 - Faust -9300190 - King Clang -9300191 - Mushmom -9300192 - Alishar -9300193 - Timer -9300194 - Dyle -9300195 - Papa Pixie -9300196 - Zombie Mushmom -9300197 - Zeno -9300198 - Lord Pirate -9300199 - Nine-Tailed Fox -9300200 - Tae Roon -9300201 - Super-Charged Poison Golem -9300202 - King Sage Cat -9300203 - Jr. Balrog -9300204 - Eliza -9300205 - Frankenroid -9300206 - Chimera -9300207 - Snack Bar -9300208 - Snowman -9300209 - Blue Mushmom -9300210 - Crimson Balrog -9300211 - Manon -9300212 - Griffey -9300213 - Leviathan -9300214 - Papulatus -9300215 - Mu Gong Merits -9300216 - A transparent item for checking elimination -9300217 - Blue Snail -9300218 - Red Snail -9300219 - Stump -9300220 - Axe Stump -9300221 - Cactus -9300222 - Royal Cactus -9300223 - Slime -9300224 - Black Sheep -9300225 - Lupin -9300226 - Zombie Lupin -9300227 - Lorang -9300228 - Clang -9300229 - Orange Mushroom -9300230 - Platoon Chronos -9300231 - Master Chronos -9300232 - Tick -9300233 - Tick-Tock -9300234 - Ligator -9300235 - Croko -9300236 - Luster Pixie -9300237 - Ghost Pixie -9300238 - Zombie Mushroom -9300239 - Zeta -9300240 - Ultra Gray -9300241 - Kru -9300242 - Captain -9300243 - Samiho -9300244 - Grizzly -9300245 - Panda -9300246 - Tree Road -9300247 - Stone Bug -9300248 - Sage Cat -9300249 - Tauromacis -9300250 - Taurospear -9300251 - Lucida -9300252 - Reinforced Iron Mutae -9300253 - Reinforced Mithril Mutae -9300254 - Reinforced Iron Mutae -9300255 - Mithril Mutae -9300256 - Transforming Doll Machine (Before) -9300257 - Transforming Doll Machine (After) -9300258 - Yeti -9300259 - Blue Mushroom -9300260 - Jr. Balrog -9300261 - Black Kentaurus -9300262 - Red Kentaurus -9300263 - Blue Kentaurus -9300264 - Dark Wyvern -9300265 - Blue Wyvern -9300266 - High Darkstar -9300267 - Low Darkstar -9300268 - Tae Roon -9300269 - So Gong -9300270 - Mingu -9300271 - Target Slime -9300272 - Target Orange Mushroom -9300273 - Target Pig -9300274 - Cynical Orange Mushroom -9300275 - Yellow Snail of the Maze -9300276 - Green Snail of the Maze -9300277 - Blue Snail of the Maze -9300278 - Red Snail of the Maze -9300279 - Purple Snail of the Maze -9300280 - Transforming Yellow Snail of the Maze -9300281 - Transforming Green Snail of the Maze -9300282 - Blue Transforming Snail of the Maze -9300283 - Transforming Yellow Snail of the Maze -9300284 - Transforming Yellow Snail of the Maze -9300285 - Puppeteer -9300286 - Dangerous Blue Mushroom -9300287 - Snowman of Competence -9300288 - Crimson Balrog of Competence -9300289 - Snipe of Competence -9300290 - Lilynouch of Competence -9300291 - Advanced Manon -9300292 - Advanced Griffey -9300293 - Advanced Leviathan -9300294 - Advanced Pianus -9300295 - The Dangerous Tree of the Maze -9300296 - The Cool Shade of the Maze -9300297 - Mutae of the Maze -9300298 - Red Ribbon Pig of the Maze -9300299 - Green Ribbon Pig of the Maze -9300300 - Blue Ribbon Pig of the Maze -9300301 - Purple Ribbon Pig of the Maze -9300302 - Pig of the Maze -9300303 - Sky Mushroom of the Maze I -9300304 - Sky Mushroom of the Maze II -9300305 - Sky Mushroom of the Maze III -9300306 - Sky Mushroom of the Maze IV -9300307 - Sky Mushroom of the Maze V -9300308 - Sky Mushroom of the Maze VI -9300309 - Rash of the Maze -9300310 - Sand Rabbit of the Maze -9300315 - Buffy -9300316 - Soul Teddy -9300317 - Lazy Buffy -9300318 - Master Soul Teddy -9300319 - Klock -9300320 - Buffoon -9300321 - Deep Buffoon -9300322 - Ghost Pirate -9300323 - Death Teddy -9300324 - Viking -9300325 - Cat Sleeping Spot -9300328 - Tutorial Tino -9300329 - Wolf's Bomb -9300330 - Rose Thorn -9300331 - Gaga -9300332 - Barnard Gray -9300333 - Ultra Gray -9300334 - Chief Gray -9300335 - Mateon -9300336 - Mecateon -9300337 - Mecateon -9300338 - Rescued Gaga -9300339 - Space Mateon -9300340 - Maple Bday Cake -9300341 - Target Slime -9300342 - Target Orange Mushroom -9300343 - Target Pig -9300344 - Puppeteer -9300345 - Puppeteer -9300346 - Puppeteer -9300347 - Giant Nependeath -9300348 - Giant -9300349 - Gentleman -9300350 - Mu Gong's Shadow -9300351 - Shadow Knight -9300352 - Gentleman -9300353 - Gentleman -9300354 - Wolf Underling -9300355 - Shapeshifter -9300356 - Sma Gingerman -9300357 - Grii Gingerman -9300358 - Grii Gingerman -9300359 - Sma Gingerman -9300360 - Grii Gingerman -9300361 - Grii Gingerman -9300362 - Grii Gingerman -9300363 - Grii Gingerman -9300364 - Sma Gingerman -9300365 - Grii Gingerman -9300366 - Grii Gingerman -9300367 - Witch Bear -9300368 - Witch Bear -9300369 - Witch Bear -9300370 - Witch Bear -9300371 - Witch Bear -9300372 - Witch Bear -9300373 - Witch Bear -9300374 - Witch Bear -9300375 - Witch Bear -9300376 - Witch Bear -9300377 - Witch Bear -9300378 - Giant Nependeath -9300379 - Black Mage Wyvern -9300380 - Black Mage Cornian -9300381 - Black Mage Skelegon -9300382 - ??? -9301000 - Bain -9301001 - Gigantic Viking -9301002 - Viking -9301003 - Dual Ghost Pirate -9301004 - Ghost Pirate -9400000 - Crow -9400001 - Fire Raccoon -9400002 - Cloud Fox -9400003 - Nightghost -9400004 - Big Cloud Fox -9400005 - Red Boogie -9400006 - Blue Boogie -9400007 - Green Boogie -9400008 - Black Boogie -9400009 - Crow -9400010 - Flaming Raccoon -9400011 - Paper Lantern Ghost -9400012 - Water Goblin -9400013 - Dreamy Ghost -9400014 - Black Crow -9400100 - Extra A -9400101 - Extra B -9400102 - Extra C -9400103 - Extra D -9400110 - Leader A -9400111 - Leader B -9400112 - Bodyguard A -9400113 - Bodyguard B -9400114 - Slot Machine -9400120 - Male Boss -9400121 - Female Boss -9400122 - Male Boss -9400200 - Malady -9400201 - Wild Cargo -9400202 - Golden Slime -9400203 - Silver Slime -9400204 - Red Slime -9400205 - Blue Mushmom -9400209 - Miner Zombie (JP) -9400210 - Coolie Zombie (JP) -9400211 - Dark Stone Golem (JP) -9400212 - Stone Golem (JP) -9400213 - Dark Jr. Yeti (JP) -9400214 - Master Chronos (JP) -9400215 - Ultra Gray (JP) -9400216 - Zeta Gray (JP) -9400217 - Flyeye (JP) -9400218 - Tauromacis (JP) -9400238 - Drumming Bunny -9400239 - Sand Rat -9400240 - Roid -9400241 - Pig -9400242 - Ribbon Pig -9400243 - Stone Golem -9400244 - Mixed Golem -9400245 - Zombie Mushroom -9400246 - Horny Mushroom -9400247 - Drumming Bunny -9400248 - Sand Rat -9400249 - Roid -9400300 - The Boss -9400310 - Tic (Easy) -9400311 - Tac (Easy) -9400312 - Toe (Easy) -9400313 - Tic (Medium) -9400314 - Tac (Medium) -9400315 - Toe (Medium) -9400316 - Tic (Hard) -9400317 - Tac (Hard) -9400318 - Toe (Hard) -9400319 - Cross (Easy) -9400320 - Cross (Medium) -9400321 - Cross (Hard) -9400322 - Giant Snowman (Lvl 1) - Easy -9400323 - Giant Snowman (Lvl 2) - Easy -9400324 - Giant Snowman (Lvl 3) - Easy -9400325 - Giant Snowman (Lvl 4) - Easy -9400326 - Giant Snowman (Lvl 5) - Easy -9400327 - Giant Snowman (Lvl 1) - Medium -9400328 - Giant Snowman (Lvl 2) - Medium -9400329 - Giant Snowman (Lvl 3) - Medium -9400330 - Giant Snowman (Lvl 4) - Medium -9400331 - Giant Snowman (Lvl 5) - Medium -9400332 - Giant Snowman (Lvl 1) - Hard -9400333 - Giant Snowman (Lvl 2) - Hard -9400334 - Giant Snowman (Lvl 3) - Hard -9400335 - Giant Snowman (Lvl 4) - Hard -9400336 - Giant Snowman (Lvl 5) - Hard -9400500 - Malady -9400501 - Jr. Wraith -9400502 - Wraith -9400503 - Stirge -9400504 - Coolie Zombie -9400505 - Turkey -9400506 - Candle Monster -9400507 - Cake Monster -9400508 - Mad Turkey -9400509 - Sakura Cellion -9400510 - Green Eggy Popp -9400511 - Yellow Eggy Popp -9400512 - Cake Mob (2nd) -9400513 - Candle Mob (2nd) -9400514 - Geist Balrog Phase 3 -9400515 - Indigo Eye -9400516 - Crystal Boar -9400517 - Magik Fierry A -9400518 - Magik Fierry B -9400519 - G Slime -9400520 - P Slime -9400521 - O Slime -9400522 - B Slime -9400523 - Evil Eye GL -9400524 - Curse Eye GL -9400525 - Cold Eye GL -9400526 - Fierry GL -9400527 - Fire Boar GL -9400528 - Sentinel GL -9400529 - Ice Sentinel GL -9400530 - Zombie Lupin GL -9400531 - Toy Trojan GL -9400532 - King Slime GL -9400533 - Indigo Eye PQ -9400534 - Crystal Boar PQ -9400535 - Magik Fiarry A PQ -9400536 - Geist Balrog Phase 1 -9400537 - Geist Balrog Phase 2 -9400538 - Street Slime -9400539 - Urban Fungus -9400540 - Killa Bee -9400541 - Killa Bee -9400542 - Fire Tusk -9400543 - Electrophant -9400544 - Gryphon -9400545 - Wolf Spider -9400546 - I.AM.ROBOT -9400547 - Boomer -9400548 - Mighty Maple Eater -9400549 - Headless Horseman -9400550 - Boomer -9400551 - Bob -9400552 - Zoo Snail -9400553 - Purple Flying Book -9400554 - Orange Flying Book -9400555 - Blue Flying Book -9400556 - Glutton Ghoul -9400557 - Psycho Jack Box -9400558 - Psycho Jack -9400559 - Sophilia Doll Ground -9400560 - Sophilia Doll -9400561 - Voodoo -9400562 - Hoodoo -9400563 - Nightmare -9400564 - Mirror Ghost -9400565 - Glutton Ghoul -9400566 - Loki Box Ex -9400567 - Loki Box Tr -9400568 - Turkey Commando -9400569 - Big Puff Daddy -9400570 - Anniversary Cake -9400571 - Headless Horseman -9400572 - Geist Balrog -9400573 - Baby typhon -9400574 - Typhon -9400575 - Bigfoot -9400576 - Windraider -9400577 - Firebrand -9400578 - Firebrand -9400579 - Nightshadow -9400580 - Elderwraith -9400581 - Stormbreaker -9400582 - Crimson Guardian -9400583 - Leprechaun -9400584 - Leprechaun -9400585 - Crimson Tree -9400586 - Crimson Tree -9400587 - Phantom Tree -9400588 - Phantom Tree -9400589 - MV -9400590 - Margana -9400591 - Red Nirg -9400592 - Rellik -9400593 - Hsalf -9400594 - Master Guardian -9400595 - Blood Stirge -9400596 - Scarlet Phoenix -9400597 - Azure Ocelot -9400598 - Dark Menhir -9400599 - Black Bird -9400600 - MasteriaPQ Mob Summoner -9400601 - Birthday Candle -9400602 - Strawberry Cake -9400603 - Angry Strawberry Cake -9400604 - Deluxe Candle -9400605 - Chocolate Cake -9400606 - Giant Cake -9400607 - Cake Monster -9400608 - Big Puff Daddy -9400704 - Beef Eater -9400706 - Jr. MV -9400707 - Item Maker -9400708 - Snowman1 -9400709 - Snowman2 -9400710 - Snowman3 -9400711 - Transparent Mob -9400712 - Little Snowman -9400713 - Item Killer -9400714 - Snow Blower -9400715 - Snow Blower -9400716 - Snow Blower -9400717 - Snow Blower -9400718 - Snow Blower -9400719 - Snow Blower -9400720 - Snow Blower -9400721 - Snow Blower -9400722 - Snow Blower -9400723 - Snow Blower -9400724 - Snow Blower -9400739 - MV Minion -9400740 - MV Minion -9400741 - Skel Guard Dog -9400742 - Mummy Guard Dog -9400743 - Angry Guard Dog -9400744 - Crimson Balrog Minion -9400745 - Jr. Balrog Minion -9400746 - Muscle Stone Minion -9400747 - Bain Minion -9400748 - MV -9400749 - Red Eggy Popp -9409000 - Tutorial Leatty -9409001 - Tutorial Drumming Rabbit -9410000 - Stray Dog -9410001 - Stylish Stray Dog -9410002 - Angry Stray Dog -9410003 - Clown Monkey -9410004 - Biker Monkey -9410005 - Red Bubble Tea -9410006 - Yellow Bubble Tea -9410007 - Green Bubble Tea -9410008 - Yeti UFO Catcher -9410009 - Yeti Doll -9410010 - Jr. Pepe UFO Catcher -9410011 - Jr. Pepe Doll -9410012 - UFO Catcher -9410013 - Doll Vending Machine -9410014 - Snack Bar -9410015 - Snack Bar -9410016 - Bubble Fish -9410017 - Krappi -9410018 - Poopa -9410019 - Cico -9410020 - Jr. Seal -9420000 - Toad -9420001 - Frog -9420002 - Python -9420003 - Red Lizard -9420004 - Yellow Lizard -9420005 - White Rooster -9420006 - Book Monster -9420015 - NooNoo -9420500 - Stopnow -9420501 - Freezer -9420502 - Biner -9420503 - Nospeed -9420504 - Tippo Red -9420505 - Tippo Blue -9420506 - Batoo -9420507 - Trucker -9420508 - Octobunny -9420509 - Pac Pinky -9420510 - Slimy -9420511 - Selkie Jr. -9420512 - Mr. Anchor -9420513 - Capt. Latanica -9500000 - Making a wish to full moon -9500001 - Making a wish to the full moon -9500002 - Making a wish to the full moon -9500003 - Making a wish to the full moon -9500004 - Making a wish to the full moon -9500005 - Making a wish to the full moon -9500100 - Slime -9500101 - Pig -9500102 - Orange Mushroom -9500103 - Bubbling -9500104 - Octopus -9500105 - Green Mushroom -9500106 - Horny Mushroom -9500107 - Drumming Bunny -9500108 - Ligator -9500109 - Ratz -9500110 - Star Pixie -9500111 - Jr. Wraith -9500112 - Jr. Pepe -9500113 - Panda Teddy -9500114 - King Blockpus -9500115 - Lorang -9500116 - Zombie Lupin -9500117 - Helly -9500118 - Tweeter -9500119 - Toy Trojan -9500120 - King Block Golem -9500121 - Wraith -9500122 - Chief Gray -9500123 - Mixed Golem -9500124 - Mushmom -9500125 - Red Drake -9500126 - Ice Drake -9500127 - Master Soul Teddy -9500128 - Dark Yeti -9500129 - Taurospear -9500130 - Blue King Goblin -9500131 - Lucida -9500132 - Werewolf -9500133 - Yeti and Pepe -9500134 - Lycanthrope -9500135 - Death Teddy -9500136 - Gigantic Viking -9500137 - G. Phantom Watch -9500138 - Bain -9500139 - Jr. Balrog -9500140 - Crimson Balrog -9500141 - Separated Yeti -9500142 - Separated Pepe -9500143 - Coke Pig -9500144 - Coke Snail -9500145 - Coke Seal -9500146 - Play Seal -9500147 - Yeti and Coketump -9500148 - Igloo Turtle -9500149 - Coke Golem -9500150 - Ice Golem -9500151 - Coke Slime -9500152 - Coke Mushroom -9500153 - Coketump -9500154 - Coketump Lite -9500155 - Three-Tailed Fox -9500156 - Wraith -9500157 - Jr. Wraith -9500158 - Yellow King Goblin -9500159 - Blue King Goblin -9500160 - Green King Goblin -9500161 - Hankie -9500162 - Harp -9500163 - Blood Harp -9500164 - Black Kentaurus -9500165 - Red Kentaurus -9500166 - Blue Kentaurus -9500167 - Golden Pig -9500168 - King Slime -9500169 - Jr. Balrog -9500170 - Papa Pixie -9500171 - Crimson Balrog -9500172 - Alishar -9500173 - Griffey -9500174 - Manon -9500175 - Angry Lord Pirate -9500176 - Blue Mushmom -9500177 - Giant Centipede -9500178 - Snack Bar -9500179 - Transformed Snack Bar -9500180 - Papulatus -9500181 - Papulatus -9500182 - Watermelon Guard Hogol -9500183 - Watermelon Guard Hogol -9500184 - Rideword P -9500185 - Rideword Y -9500186 - Rideword B -9500187 - Busted Doll -9500188 - Destroyed Doll -9500189 - Gift Box -9500190 - Toy Clown -9500191 - Green Phantom -9500192 - Pumpkin Knight -9500193 - Fire Steed -9500194 - Mirror Ghost -9500195 - Jack-o-Lantern -9500196 - Ghost -9500197 - Ghost -9500198 - Gift Box -9500199 - Toy Clown -9500200 - Zoo Balrog -9500201 - Zoo Yeti -9500202 - Zoo White Fang -9500203 - Zoo Pig -9500204 - Zoo Ribbon Pig -9500300 - Busted Doll -9500301 - Destroyed Doll -9500302 - Jack-o-Lantern at Pumpkin Farm -9500303 - Mirror Ghost 2 -9500304 - Mirror Ghost 3 -9500305 - Jack-o-Lantern -9500306 - Mano -9500307 - Stumpy -9500308 - Faust -9500309 - King Clang -9500310 - Timer -9500311 - Dyle -9500312 - Nine-Tailed Fox -9500313 - Tae Roon -9500314 - King Sage Cat -9500315 - Eliza -9500316 - Snow Yeti -9500317 - Kid Snowman -9500318 - Angry Snowman -9500319 - Giant Snowman -9500320 - Lost Rudolph -9500321 - Snowman -9500322 - Kid Snowman -9500323 - Kitty from Cheese Storage -9500324 - Kitty from Cheese Storage -9500325 - King Slime -9500326 - Mushmom -9500327 - Jr. Balrog -9500328 - Crimson Balrog -9500329 - Papa Pixie -9500330 - Alishar -9500331 - Papulatus -9500332 - Pianus -9500333 - Leviathan -9500334 - Lord Pirate -9500335 - Frankenroid -9500336 - P Junior -9500337 - Mano -9500338 - Stumpy -9500339 - Deo -9500340 - King Slime -9500341 - Faust -9500342 - King Clang -9500343 - Alishar -9500344 - Timer -9500345 - Mushmom -9500346 - Dyle -9500347 - Zeno -9500348 - Nine-Tailed Fox -9500349 - Lord Pirate -9500350 - Tae Roon -9500351 - Papa Pixie -9500352 - King Sage Cat -9500353 - Jr. Balrog -9500354 - Frankenroid -9500355 - Eliza -9500356 - Chimera -9500357 - Snow Yeti -9500358 - Crimson Balrog -9500359 - Manon -9500360 - Griffey -9500361 - Leviathan -9500362 - Papulatus -9500363 - Pianus -9500364 - Mini Dungeon Transparent Monster -9500365 - Mini Dungeon Agent Box -9500366 - Barnard Gray -9500367 - Zeta Gray -9500368 - Ultra Gray -9500369 - Chief Gray -9500370 - Mecateon -9500371 - Mateon -9500372 - Plateon -9500373 - Machine MT-09 -9500400 - Gourd -9501000 - Sealed -9501001 - Darkness -9501002 - Weakness -9501003 - Knocked Out -9501004 - Cursed -9501005 - Poisoned -9501006 - Slow -9501007 - Disable Buff -9501008 - Seduce -9501009 - Immune to Weapon -9501010 - Immune to Magic -9501011 - Cancel Element -9501012 - Reduce Element -9501013 - Expand Element -9501014 - Undead -9501015 - Boss -9501016 - Monster Book Test -9501017 - Skull -9600001 - Rooster -9600002 - Duck -9600003 - Sheep -9600004 - Goat -9600005 - Black Goat -9600006 - Cow -9600007 - Plow Ox -9600008 - Black Sheep -9600009 - Giant Centipede -9600010 - Giant Centipede -9600065 - Holiday Super Sock -9600066 - New Year's Party Pouch -9999998 - Star Monster -9999999 - ??? -9400630 - Event Horntail's Left Head -9400631 - Event Horntail's Right Head -9400632 - Event Pink Bean -9420527 - Chlorotrap -9420528 - Emo Slime -9420529 - Dark Fission -9420530 - Oly Oly -9420531 - Scaredy Scarlion -9420532 - Ratatula -9420533 - Rodeo -9420534 - Charmer -9420535 - Jester Scarlion -9420536 - Froscola -9420537 - Yabber Doo -9420538 - Booper Scarlion -9420539 - Vikerola -9420540 - Gallopera -9420541 - Targa -9420542 - Targa -9420543 - Angry Targa -9420544 - Furious Targa -9420545 - Ratatula -9420546 - Scarlion Boss -9420547 - Scarlion Boss -9420548 - Angry Scarlion Boss -9420549 - Furious Scarlion Boss -9420550 - Scaredy Scarlion -6400006 - Crimson Balrog -6400007 - Baby Balrog -6400008 - Jr. Balrog -6400009 - Crimson Balrog -8830000 - Balrog -8830001 - Balrog -8830002 - Balrog -8830003 - Balrog -8830004 - Balrog -8830005 - Balrog -8830006 - Balrog -8830007 - Balrog -8830008 - Balrog -8830009 - Balrog -8830010 - Balrog -8830011 - Balrog -8830012 - Balrog -8830013 - Balrog -9300311 - Bam Bam Cat -9300312 - Pigmy that lays Golden Eggs -9300313 - Witch Cat -9300314 - Witch Cat -9300326 - Unknown Jr. Balrog -9300327 - Balrog Corpse -9302011 - Lupin Pig -9001013 - Thief Crow -9001014 - Uncontrollable Maha -9303000 - Mano -9303001 - Stumpy -9303002 - King Slime -9303003 - Deo -9303004 - Mushmom -9303005 - Tae Roon -9303006 - Rombot -9303007 - Zeno -9303008 - Nine-Tailed Fox -9303009 - King Sage Cat -9303010 - Jr. Balrog -9303011 - Lord Pirate -9303012 - Papa Pixie -9303013 - Crimson Balrog -9303014 - Seruf -9303015 - Eliza -9303016 - Leviathan -9302000 - Golden Pig -9302001 - Golden Pig -9302002 - Golden Pig -9302003 - Golden Pig -9302004 - Golden Pig -9302005 - Golden Pig -9302006 - Golden Pig -9302007 - Golden Pig -9302008 - Golden Pig -9302009 - Golden Pig -9302010 - Golden Pig -100130 - Muru -100131 - Murupa -100132 - Murupia -100133 - Murumuru -100134 - Murukun -9400609 - Andras -9400610 - Amdusias -9400611 - Crocell -9400612 - Marbas -9400613 - Valefor -9400614 - Strange Orange Mushroom -9400615 - Strange Ribbon Pig -9400616 - Strange Green Mushroom -9400617 - Strange Pig -9400618 - Strange Dark Axe Stump -9400619 - Strange Zombie Mushroom -9400620 - Strange Dark Stump -9400621 - Strange Horny Mushroom -9400622 - Strange Blue Mushroom -9400623 - Amdusias -9400633 - Astaroth -9400645 - Totem1 -9400646 - Totem2 -9400647 - A Parasite -9400634 - Frog -9400635 - Cursed Frog -9400636 - Black Cat -9400637 - Cursed Black Cat -9400638 - Rotting Skeleton -9400639 - Dead Scarecrow -9400640 - Twisted Jester -9400641 - Olivia -9400642 - Olivia -9400643 - Olivia -9400644 - Malady -9400648 - Possessed Bear Doll -9400649 - Possessed Rabbit Doll -9400650 - Possessed Bear Doll -9400651 - Possessed Rabbit Doll -9400652 - Possessed Bear Doll -9400653 - Possessed Rabbit Doll -9400654 - Event Pink Bean -9400655 - Strange Orange Mushroom -9400656 - Strange Ribbon Pig -9400657 - Strange Green Mushroom -3300000 - Renegade Spores -3300001 - Poison Mushroom -3300002 - Intoxicated Pig -3300003 - Helmet Pepe -3300004 - Royal Guard Pepe -3300005 - Grey Yeti and King Pepe -3300006 - Gold Yeti and King Pepe -3300007 - White Yeti and King Pepe -3300008 - Prime Minister -9101000 - Green Mushroom -9101001 - Zombie Mushroom -9101002 - Ghost Stump -9700000 - Subway Slime -9700001 - Subway Orange Mushroom -9700002 - Subway Ribbon Pig -9700003 - Subway Horny Mushroom -9700004 - Pyramid Mummydog -9700005 - Pyramid Skeleton -9700006 - Mummy -9700007 - Pharaoh Snake -9700008 - Anubis -9700009 - Pyramid Mummydog -9700010 - Pyramid Skeleton -9700011 - Mummy -9700012 - Pharaoh Snake -9700013 - Anubis -9700014 - Pyramid Mummydog -9700015 - Pyramid Skeleton -9700017 - Pharaoh Snake -9700016 - Mummy -9700018 - Anubis -9700019 - Pharaoh Jr. Yeti -9700020 - Metro Bubbling -9700021 - Pharaoh Yeti -9700022 - Transparent Pharaoh Yeti -9700023 - Transparent Pharaoh Yeti -9700024 - Pyramid Mummydog -9700025 - Pyramid Skeleton -9700026 - Mummy -9700027 - Pharaoh Snake -9700028 - Anubis -9700029 - Pharaoh Jr. Yeti -8220008 - Unknow Snack Bar -9001012 - Scarred Bear -9101003 - ???? -1210111 - Strange Pig -2220110 - Crying Blue Mushroom -2230112 - Terrified Wild Boar -3400000 - Cherry Bubble Tea -3400001 - Mango Bubble Tea -3400002 - Melon Bubble Tea -3400003 - Yeti Doll Claw Game -3400004 - Yeti Doll -3400005 - Jr. Pepe Doll Claw Game -3400006 - Jr. Pepe Doll -3400007 - Transformed Doll Claw Game -3400008 - Transformed Doll Claw Game -4300000 - Blue Perfume -4300001 - Blue Perfume -4300002 - Yellow Perfume -4300003 - Yellow Perfume -4300004 - Pink Perfume -4300005 - Pink Perfume -4300006 - Kid Mannequin -4300007 - Female Mannequin -4300008 - Male Mannequin -4300009 - Latest Hits Compilation -4300010 - Greatest Oldies -4300011 - Cheap Amplifier -4300012 - Fancy Amplifier -4300013 - Spirit of Rock -4300014 - Greatest Oldies -4300015 - Cheap Amplifier -4300016 - Fancy Amplifier -4300017 - Spirit of Rock's Soul -7120100 - Gatekeeper Nex -7120101 - Gatekeeper Nex -7120102 - Gatekeeper Nex -7120103 - Red Slime -7120104 - Silver Slime -7120105 - Gold Slime -7120106 - Overlord A -7120107 - Overlord B -7120108 - Robby -7120109 - Iruvata -7220003 - Bergamot -7220004 - Bergamot -7220005 - Bergamot -8120100 - Gatekeeper Nex -8120101 - Gatekeeper Nex -8120102 - Afterlord -8120103 - Prototype Lord -8120104 - Maverick Type A -8120105 - Maverick Type S -8120106 - Maverick Type D -8120107 - Maverick Type D -8140510 - Gatekeeper Nex -8140511 - Imperial Guard -8140512 - Royal Guard -8220010 - Dunas -8220011 - Aufheben -8220012 - Oberon -8220013 - Nibelung -8220014 - Nibelung -8220015 - Nibelung -9300384 - Red Slime -9300385 - Treacherous Fox -9300386 - Trainee Spore -9300387 - Enraged Golem -9300388 - Free Spirit -9300389 - Safe Guard -9300390 - Door Block -9300391 - Ice Wall -9300392 - Black Wing Henchman -9300393 - Gentleman -9700030 - ?? ??? ?? -9700031 - ?? ??? ?? -9700032 - ?? ?? ?? -9700033 - ?? ?? ?? -9700034 - ?? ?? ?? -9700035 - ?? ??? -9700036 - ?? ?? -9700037 - ??? ?? -9700038 - ??? ??? ?? -2100108 - Meerkat diff --git a/tools/MapleIdRetriever/handbook/NPC.txt b/tools/MapleIdRetriever/handbook/NPC.txt deleted file mode 100644 index 75d518a315..0000000000 --- a/tools/MapleIdRetriever/handbook/NPC.txt +++ /dev/null @@ -1,1733 +0,0 @@ -10000 - Pio -1001000 - Silver -1001001 - Natasha -1001100 - Mina -1002000 - Phil -1002001 - Teo -1002002 - Pason -1002003 - Mr. Goldstein -1002004 - VIP Cab -1002005 - Mr. Kim -1002006 - Chef -1002100 - Jane -1002101 - Olaf -1002102 - Eels -1002103 - Captain Al -1010100 - Rina -1011000 - Karl -1011001 - Sam -1011100 - Luna -1012000 - Regular Cab -1012001 - Dr. Squint -1012002 - Vicious -1012003 - Chief Stan -1012004 - Doofus -1012005 - Cloy -1012006 - Trainer Bartos -1012007 - Trainer Frod -1012008 - Casey -1012009 - Mr. Lee -1012100 - Athena Pierce -1012101 - Maya -1012102 - Pia -1012103 - Natalie -1012104 - Brittany -1012105 - Ms. Tan -1012106 - Mrs. Ming Ming -1012107 - Utah -1012108 - Camila -1012109 - Jay -1012110 - Anne -1012111 - Bruce -1012112 - Tory -1012113 - Tommy -1012114 - Growlie -1012115 - Henesys Forest -1012116 - Henesys Forest -1012117 - Big Headward -1020000 - Blackbull -1021000 - River -1021001 - Harry -1021100 - Arturo -1022000 - Dances with Balrog -1022001 - Regular Cab -1022002 - Manji -1022003 - Mr. Thunder -1022004 - Mr. Smith -1022005 - Mr. Wang -1022006 - Winston -1022007 - Ayan -1022008 - Burnt Sword -1022100 - Sophia -1022101 - Rooney -1022102 - The Excavator Board -1022103 - Fountain Statue -1031000 - Flora the Fairy -1031001 - Serabi the Fairy -1031100 - Len the Fairy -1032000 - Regular Cab -1032001 - Grendel the Really Old -1032002 - Francois -1032003 - Shane -1032004 - Louis -1032005 - VIP Cab -1032006 - Mr. Park -1032007 - Joel -1032008 - Cherry -1032009 - Purin -1032100 - Arwen the Fairy -1032101 - Rowen the Fairy -1032102 - Mar the Fairy -1032103 - El Moth -1032104 - Betty -1032105 - Estelle -1032106 - Wing the Fairy -1032107 - Reef -1032108 - Reef -1032109 - Corner of the Magic Library -1032110 - Corner of the Magic Library -1032111 - Small Tree Stump -1040000 - Luke -1040001 - Mike -1040002 - Fanzy -1043000 - a pile of flowers -1043001 - a pile of herbs -1051000 - Cutthroat Manny -1051001 - Don Hwang -1051002 - Dr. Faymus -1052000 - Alex -1052001 - Dark Lord -1052002 - JM From tha Streetz -1052003 - Chris -1052004 - Denma the Owner -1052005 - Dr. Feeble -1052006 - Jake -1052007 - The Ticket Gate -1052008 - Treasure Chest -1052009 - Treasure Chest -1052010 - Treasure Chest -1052011 - Exit -1052012 - Mong from Kong -1052013 - Computer -1052014 - Vending Machine -1052015 - Billy -1052016 - Regular Cab -1052017 - Mr. Hong -1052100 - Don Giovanni -1052101 - Andre -1052102 - Shumi -1052103 - Nella -1052104 - Tulcus -1052105 - Jane Doe -1052106 - Icarus -1052107 - Small Street Light -1052108 - Knocked Trash Can -1052109 - Subway Trash Can -1052110 - Subway Trash Can -1052111 - Subway Trash Can -1052112 - Subway Trash Can -1061000 - Chrishrama -1061001 - 24 Hr Mobile Store -1061002 - Mr. Sweatbottom -1061003 - Mr. Wetbottom -1061004 - Ronnie -1061005 - Sabitrama -1061006 - Mysterious Statue -1061007 - Crumbling Statue -1061008 - Mr. Oh -1061009 - Door of Dimension -1061010 - Sparkling Crystal -1061011 - The Rememberer -1061012 - Insignificant Being -1061013 - Gwin -1061014 - Mu Young -1061015 - Tristan's Spirit -1061016 - Suspicious Man -1061017 - Tristan's Spirit -1061018 - Mu Young -1061019 - Ilji -1061100 - Hotel Receptionist -1063000 - a pile of pink flowers -1063001 - a pile of blue flowers -1063002 - a pile of white flowers -1063003 - Wanted : G. Mushroom -1063004 - Wanted : Curse Eye -1063005 - Wanted : Evil Eye -1063006 - Wanted : Cold Eye -1063007 - Wanted : Z. Mushroom -1063008 - Wanted : H. Mushroom -1063009 - Wanted : Jr. Boogie -1063010 - Wanted : Drake -1063011 - Cave Wall of Evil Eye -1063012 - Shaman Rock -1063013 - Shaman Rock -1063014 - Mysterious Piece of Paper -1063015 - Underground Temple Entrance -1063016 - Strange Looking Statue -1063017 - Monstrous Looking Statue -1072000 - Warrior Job Instructor -1072001 - Magician Job Instructor -1072002 - Bowman Job Instructor -1072003 - Thief Job Instructor -1072004 - Warrior Job Instructor -1072005 - Magician Job Instructor -1072006 - Bowman Job Instructor -1072007 - Thief Job Instructor -1072008 - Kyrin -1081000 - Valen -1081001 - Pison -1081100 - Riel -1081101 - Roel -1081102 - Rael -1090000 - Kyrin -1091000 - Morgan -1091001 - Rodos -1091002 - Gali -1091003 - Serryl -1091004 - Dondlass -1092000 - Tangyoon -1092001 - Bonnie -1092002 - Baine -1092003 - Sharyl -1092004 - Calico -1092006 - Black Bark -1092007 - Muirhat -1092008 - Shulynch -1092009 - Mrs. Reade -1092010 - Jack -1092011 - Bartol -1092012 - Rolonay -1092013 - Porchay -1092014 - Nautilus' Mid-Sized Taxi -1092015 - Water Filter -1092016 - Shiny Stone -1092017 - Anonymous Merchant -1092018 - Trash Can -1092019 - Lord Jonathan -1092090 - Mother Milk Cow -1092091 - Mother Milk Cow -1092092 - Mother Milk Cow -1092093 - Baby Milk Cow -1092094 - Baby Milk Cow -1092095 - Baby Milk Cow -1092097 - Mother of Pearl -1093000 - Pupa -1094000 - Bart -1094001 - Abel -1094002 - Bush -1094003 - Bush -1094004 - Bush -1094005 - Bush -1094006 - Bush -1095000 - Shulynch -11000 - Sid -1100000 - Kirium -1100001 - Kiriyu -1100002 - Kiriwing -1100003 - Kiriru -1100004 - Kiru -1100005 - Kiruru -1100006 - Kiru -1100007 - Kiriru -1100008 - Kiru -1101000 - Cygnus -1101001 - Shinsoo -1101002 - Neinheart -1101003 - Mihile -1101004 - Oz -1101005 - Irena -1101006 - Eckhart -1101007 - Hawkeye -1101008 - Mimo -1102000 - Kiku -1102001 - Kiriko -1102002 - Kiridu -1102003 - Kidan -1102004 - Kimu -1102005 - Kizan -1102006 - Kinu -1102007 - Kia -1102008 - Kisha -1102009 - Neinheart -1103000 - Dunamis -1103001 - Roca -1103002 - Matthias -1103003 - Hersha -1103004 - 10 Boogies -1103005 - Neinheart -1104000 - Francis -1104001 - Baroq -1104002 - Eleanor -1104100 - Mihile -1104101 - Oz -1104102 - Irena -1104103 - Eckhart -1104104 - Hawkeye -1104200 - Fallen Knight -1104201 - Cygnus -1104202 - Neinheart -1104203 - Mihile -1104204 - Oz -1104205 - Irena -1104206 - Eckhart -1104207 - Hawkeye -1104208 - Shinsoo -11100 - Lucy -12000 - Lucas -12100 - Mai -12101 - Rain -2000 - Roger -20000 - John -20001 - Bari -20002 - Biggs -2001 - Sen -2001000 - Cliff -2001001 - Branch Snowman -2001002 - Metal Bucket Snowman -2001003 - Straw Hat Snowman -2001004 - Scarf Snowman -2001005 - Rupert -2002 - Peter -2002000 - Rupi -2002001 - Rudi -2002002 - Torr -2003 - Robin -2004 - Todd -2005 - Sam -2006 - Tienk -20100 - Yoona -2010000 - Staff Sergeant Charlie -2010001 - Mino the Owner -2010002 - Franz the Owner -2010003 - Neve -2010004 - Corporal Wilson -2010005 - Shuri -2010006 - Trina -2010007 - Heracle -2010008 - Lea -2010009 - Lenario -2012000 - Agatha -2012001 - Rini -2012002 - Erin -2012003 - Neri the Fairy -2012004 - Nuri the Fairy -2012005 - Edel the Fairy -2012006 - Isa the Station Guide -2012007 - Rinz the Assistant -2012008 - Romi -2012009 - Riza the Assistant -2012010 - Elma the Housekeeper -2012011 - Kriel the Fairy -2012012 - Lisa -2012013 - Sunny -2012014 - Orbis Magic Spot -2012015 - El Nath Magic Spot -2012016 - Aileen -2012017 - Hughes the Fuse -2012018 - Ericsson -2012019 - Moppie -2012020 - Alfonse Green -2012021 - Ramini -2012022 - Pelace -2012023 - Maple Leaf Marble -2012024 - Egnet -2012025 - Geras -2012026 - Elliza -2012027 - Harp String -2012028 - Harp String -2012029 - Harp String -2012030 - Harp String -2012031 - Harp String -2012032 - Harp String -2012033 - Harp String -2013000 - Wonky the Fairy -2013001 - Chamberlain Eak -2013002 - Minerva the Goddess -2020000 - Vogen -2020001 - Scott -2020002 - Gordon -2020003 - Master Sergeant Fox -2020004 - Mr. Mohammed -2020005 - Alcaster -2020006 - Jade -2020007 - Scadur -2020008 - Tylus -2020009 - Robeira -2020010 - Rene -2020011 - Arec -2020012 - Spirit of Snow Statue -2020013 - Pedro -2022000 - Rumi -2022001 - Hana -2022002 - Barun -2022003 - Shammos -2022004 - Tylus -2023000 - Danger Zone Taxi -2030000 - Jeff -2030001 - Sergeant Bravo -2030002 - Corporal Easy -2030003 - Rock Covered in Snow -2030004 - Small Tomb -2030005 - Statue -2030006 - Holy Stone -2030007 - Piece of Statue -2030008 - Adobis -2030009 - Glibber -2030010 - Amon -2030011 - Ali -2030012 - Huckle -2030013 - Adobis -2030014 - Ancient Icy Stone -2032000 - ???? -2032001 - Spiruna -2032002 - Aura -2032003 - Lira -2032004 - Suspicious Lava -2040000 - Mel -2040001 - Delv the Toy Soldier -2040002 - Olson the Toy Soldier -2040003 - Assistant Cheng -2040004 - Roly-Poly 1 -2040005 - Roly-Poly 2 -2040006 - Roly-Poly 3 -2040007 - Roly-Poly 4 -2040008 - Roly-Poly 5 -2040009 - Roly-Poly 6 -2040010 - Roly-Poly 7 -2040011 - Roly-Poly 8 -2040012 - Roly-Poly 9 -2040013 - Roly-Poly 10 -2040014 - Chico -2040015 - Manager Karl -2040016 - Pi -2040017 - Green Mesoranger -2040018 - Black Mesoranger -2040019 - Everton -2040020 - Sarah -2040021 - Tara -2040022 - Rydole -2040023 - Lost Soldier -2040024 - First Eos Rock -2040025 - Second Eos Rock -2040026 - Third Eos Rock -2040027 - Fourth Eos Rock -2040028 - Mark the Toy Soldier -2040029 - Grandpa Clock -2040030 - Wisp -2040031 - Document Roll -2040032 - Weaver -2040033 - Neru -2040034 - Red Sign -2040035 - Arturo -2040036 - Red Balloon -2040037 - Orange Balloon -2040038 - Yellow Balloon -2040039 - Lime Balloon -2040040 - Green Balloon -2040041 - Aqua Balloon -2040042 - Sky-Blue Balloon -2040043 - Blue Balloon -2040044 - Violet Balloon -2040045 - Pink Balloon -2040046 - Robert Holly -2040047 - Sgt. Anderson -2040048 - Nara -2040049 - Gumball Machine -2040050 - Eurek the Alchemist -2040051 - Toly -2040052 - Wiz the Librarian -2041000 - Tian -2041001 - Rosey -2041002 - Hid -2041003 - Miru -2041004 - Marcel -2041005 - Nemi -2041006 - Misky -2041007 - Miyu -2041008 - Seppy -2041009 - Mini -2041010 - Ellie -2041011 - Yellow Mesoranger -2041012 - Pink Mesoranger -2041013 - Gina -2041014 - Patricia -2041015 - Korin -2041016 - Vega -2041017 - Ace of Hearts -2041018 - Hans the Assembler -2041019 - Rocky the Repairman -2041020 - Mac the Mechanic -2041021 - Mr. Bouffon -2041022 - Tigun the Advisor -2041023 - Flo -2041024 - Tombstone -2041025 - Machine Apparatus -2041026 - Ghosthunter Bob -2041027 - Mason the Collector -2041028 - Unknown Thief -2041029 - Karen -2042000 - Spiegelmann -2042001 - Spiegelmann -2042002 - Spiegelmann -2042003 - Assistant Red -2042004 - Assistant Blue -2042005 - Spiegelmann -2042006 - Spiegelmann -2042007 - Spiegelmann -2042008 - Assistant Red -2042009 - Assistant Blue -2043000 - Papulatus -2050000 - Dr. San -2050001 - Dr. Kim -2050002 - Alien Gray -2050003 - Spacen -2050004 - Kubo the Storageman -2050005 - Chury -2050006 - Hoony -2050007 - Gunny -2050008 - General Maestro -2050009 - Jr. Officer Medin -2050010 - Rice the Medic -2050011 - Kevin the Soldier -2050012 - Agent M -2050013 - Porter -2050014 - Meteorite 1 -2050015 - Meteorite 2 -2050016 - Meteorite 3 -2050017 - Meteorite 4 -2050018 - Meteorite 5 -2050019 - Meteorite 6 -2050020 - Dropship -2051000 - Dr. Pepper -2051001 - Kay -2060000 - Nanuke -2060001 - Robinson -2060002 - Tae Gong -2060003 - Melias -2060004 - Oannes -2060005 - Kenta -2060006 - Muse -2060007 - Calypso -2060008 - Gerrard -2060009 - Dolphin -2060100 - Carta -2060101 - Taeng the Explorer -2060102 - Door to the Warped Dimension -2070000 - Mr. Noh -2070001 - Bung's Mama -2070002 - Moki -2070003 - Dori -2071000 - Chumji -2071001 - Hongbu -2071002 - Nolbu -2071003 - Chil Nam -2071004 - Kong Ji -2071005 - Chil Sung -2071006 - Swallow -2071007 - Grandma Yeon -2071008 - Haenim -2071009 - Mr. Shim -2071010 - God of Mountains -2071011 - Tree Cutter -2071012 - A Familiar Lady -2071013 - Yellow King Goblin -2071014 - Blue King Goblin -2071015 - Green King Goblin -2072000 - Chil Sung's Rice Stacks -2072001 - Chil Nam's Rice Stacks -2073000 - Park Chum Ji -2080000 - Mos -2080001 - Sly -2080002 - Max -2080003 - Norman -2080004 - Moodie -2080005 - Koscu -2080006 - Dolphin -2081000 - Chief Tatamo -2081001 - Kumo -2081002 - Ito -2081003 - Yaku -2081004 - Pam -2081005 - Keroben -2081006 - Moira -2081007 - Raul the Knight -2081008 - Nein Spirit's Baby Dragon -2081009 - Moose -2081010 - Moose -2081011 - Nein Spirit's Baby Dragon -2081012 - Nix -2081013 - Frightening Marble -2081014 - Dunamis -2081100 - Harmonia -2081200 - Gritto -2081300 - Legor -2081400 - Hellin -2081500 - Samuel -2082000 - Mue -2082001 - Tommie -2082002 - Harry -2082003 - Corba -2083000 - Encrypted Slate of the Squad -2083001 - Horned Tail's Schedule -2083002 - Crystal of Roots -2083003 - Stump at the Room of Maze -2083004 - Mark of the Squad -2083005 - Fountain of Life -2084000 - Gold Compass -2084001 - Gold Richie -2084002 - Gold Richie -2084003 - Gold Richie -2084004 - Gold Richie -2084005 - Gold Richie -2084006 - Gold Richie -2084007 - Gold Richie -2084008 - Gold Richie -2084009 - OX Bird -2084010 - Gold Key Box -2090000 - Mr. Pan -2090001 - Gong Gong -2090002 - Bidiwon -2090003 - Dalsuk -2090004 - Mr. Do -2090005 - Crane -2090006 - Laya -2090100 - Grandpa Luo -2090101 - Lilishu -2090102 - Naran -2090103 - Pata -2090104 - Noma -2091000 - No Gong -2091001 - Do Gong -2091002 - Tae Sang -2091003 - Tae Soo -2091004 - Master Goblin -2091005 - So Gong -2091006 - Mu Lung Dojo Bulletin Board -2092000 - Mr. Ku -2092001 - Captain Hwang -2093000 - Mu Tan -2093001 - So Won -2093002 - Lan Ming -2093003 - Mr. Gong -2093004 - Dolphin -2094000 - Guon -2094001 - Wu Yang -2094002 - Guon -2095000 - Delli -2096000 - Practice Chart -2100 - Sera -21000 - Pan -2100000 - Ahmad -2100001 - Muhamad -2100002 - Zaid -2100003 - Jasmin -2100004 - SagaT -2100005 - Shati -2100006 - Mazra -2100007 - Lila -2100008 - Vard -2100009 - Aldin -2101 - Heena -2101000 - Sirin -2101001 - Jiyur -2101002 - Eleska -2101003 - Ardin -2101004 - Tigun -2101005 - Byron -2101006 - Le Petit Prince -2101007 - Areda -2101008 - Schegerazade -2101009 - Abdullah VIII -2101010 - Jano -2101011 - Sejan -2101012 - Strange Guy -2101013 - Karcasa -2101014 - Cesar -2101015 - Abdullah VIII -2101016 - Areda -2101017 - Cesar -2101018 - Cesar -2102 - Nina -2102000 - Asesson -2102001 - Slyn -2102002 - Syras -2103 - Maria -2103000 - Palace Oasis -2103001 - Secret wall -2103002 - Queen's cabinet -2103003 - Ariant private house1 -2103004 - Ariant private house2 -2103005 - Ariant private house4 -2103006 - Ariant private house6 -2103007 - Treasure Box -2103008 - Mysterious voice -2103009 - Ariant private house1 Cupboard -2103010 - Ariant private house2 Cupboard -2103011 - Ariant private house4 Cupboard -2103012 - Ariant private house6 Cupboard -2110000 - Rosen -2110001 - Jerry -2110002 - Keol -2110003 - Ramain -2110004 - Moren -2110005 - Camel Cab -2111000 - Carson -2111001 - Maed -2111002 - Dr. De Lang -2111003 - Humanoid A -2111004 - Phyllia -2111005 - Keeny -2111006 - Parwen -2111007 - Han the Broker -2111008 - Bedin -2111009 - Russellon -2111010 - Alcando's Cabinet. -2111011 - Wall -2111012 - Cabinet -2111013 - Picture frame -2111014 - Desk -2111015 - Russellon's Desk -2111016 - Dr. De Lang's Secret book -2111017 - 1st Pipe handle -2111018 - 2nd Pipe handle -2111019 - 3rd Pipe handle -2111020 - 1st Magic Pentagram -2111021 - 2nd Magic Pentagram -2111022 - 3rd Magic Pentagram -2111023 - Center of the Magic Pentagram -2111024 - Secret Passage -2111025 - Control Device -2111026 - Incomplete Magic Square -2112000 - Yulete -2112001 - Yulete -2112002 - Yulete -2112003 - Juliet -2112004 - Romeo -2112005 - Juliet -2112006 - Romeo -2112007 - Investigation Result. -2112008 - Juliet -2112009 - Romeo -2112010 - Yulete -2112011 - Yulete -2112012 - Yulete -2112013 - Investigation Result. -2112014 - Yulete -2112015 - Yulete -2112016 - Hidden Documents -2112017 - Dropped Piece of Paper -2112018 - Romeo & Juliet -2120000 - Masked Gentleman -2120001 - Gatekeeper -2120002 - Steward -2120003 - Maid -2120004 - Jonas -2120005 - Sophelia -2120006 - Lyudmila -2120007 - Joey -2120008 - Ghost T -2120009 - Steward -2120010 - Butler -2121000 - Nameless Cat -2121001 - A grave with a collapsed gravestone -2121002 - Nameless Grave -2121003 - Unvisited Grave -2121004 - Somebody's Grave -2121005 - Piano -2121006 - Someone's Picture Frame 1 -2121007 - Someone's Picture Frame 2 -2121008 - Someone's Picture Frame 3 -2121009 - Someone's Picture Frame 4 -2121010 - Someone's Picture Frame 5 -2121011 - Sophelia's Picture Frame -2121012 - A Girl Dressed In Her Halloween Outfit -2130000 - Mayoren -2131000 - Athena Pierce -2131001 - Perzen -2131002 - Yuris -2131003 - Loha -2131004 - Crawls with Balrog -2131005 - Sion -2131006 - Duru -2131007 - Tess -2132000 - Kanderune -2132001 - Lohd -2132002 - Rius -2132003 - Shadrion -2133000 - Ellin -2133001 - Ellin -2133002 - Ellin Forest Milepost -2133003 - Wooden Desk -2133004 - Sprite -2140000 - Temple Keeper -2140001 - Memory Keeper -2140002 - Sorcerer -2140003 - Record Keeper -2141000 - Kirston -2141001 - Forgotten Temple Keeper -2141002 - Forgotten Temple Keeper -22000 - Shanks -9000000 - Paul -9000001 - Jean -9000002 - Pietro -9000003 - Vikan -9000004 - Vikon -9000005 - Vikone -9000006 - Vikoon -9000007 - Chun Ji -9000008 - Mr. Pickall -9000009 - Vikin -9000010 - Pietra -9000011 - Martin -9000012 - Harry -9000013 - Tony -9000014 - Geanie -9000015 - Tamis -9000016 - Jester -9000017 - Coco -9000018 - Matilda -9000019 - Rock, Paper, Scissor Admin -9000020 - Spinel -9000021 - Gaga -9000032 - Agent W -9000033 - Agent C -9000034 - Agent O -9000035 - Agent P -9000036 - Agent E -9000037 - Agent Meow -9000038 - Agent Kitty -9000039 - Agent W -9000040 - Dalair -9000041 - Donation Box -9000042 - Gaga -9000043 - The Lost Snipe -9000044 - The Lost Snipe -9000045 - The Lost Snipe -9000046 - Cygnus Mentality -9000047 - Fairytale Pinnochio -9000048 - Fairytale Jack -9000049 - Fairytale Crackers -9000050 - Sign Inside Whale -9000051 - Jump Wings -9000052 - Courageous Little Lamb -9000053 - Big Bad Wolf -9000054 - Ranch Owner -9000055 - Aramia -9000056 - Small Gift Box -9000057 - Candy Gift Box -9000058 - Cake Gift Box -9000059 - Gingerbread man -9000060 - Gingerbread man -9000061 - Agent M -9000062 - Agent C -9000063 - Agent E -9000064 - Agent S -9000065 - Agent O -9000066 - Dalair -9000067 - Wolf Awaiting It's Owner -9000068 - Ice Piece -9001000 - Cokebear operator -9001001 - Lolo -9001002 - Polar bear Poch -9001003 - Polar bear Nell -9001004 - Polar bear Hoop -9001005 - Polar bear Poch -9001006 - Polar bear Poch -9001008 - Bohun -9001009 - Shimmy -9001100 - Gaga -9001101 - Master Moon Bunny -9001102 - Baby Moon Bunny -9001103 - Moon Bunny the Salesman -9001104 - Smart Moon Bunny -9001105 - Grandpa Moon Bunny -9001106 - The Lost Grey -9001107 - Guide Moon Bunny -9001108 - Gatekeeper Moon Bunny -9010000 - Maple Administrator -9010001 - Tia -9010002 - Mia -9010003 - Ria -9010004 - Mia -9010005 - Diane -9010006 - Sally -9010007 - Josh -9010008 - Pettite -9010009 - Duey -9010010 - Cassandra -9010011 - Orange Mushroom -9010012 - Star Pixie -9010013 - Hengki -9010014 - Aramia -9010015 - Street Cat -9010016 - Aru -9010017 - Dev Doll -9010018 - Cryssea -9010019 - Mushroomie -9010020 - Witch's Tomb -9020000 - Lakelis -9020001 - Cloto -9020002 - Nella -9030000 - Fredrick -9030100 - Scrooge -9040000 - Shuang -9040001 - Nuris -9040002 - Shawn -9040003 - Sharen III's Soul -9040004 - Honorable Rock -9040005 - Returning Rock -9040006 - Guard Statue -9040007 - Sharen III's Will -9040008 - Guild Rank Board -9040009 - Gatekeeper -9040010 - Tiger Statue -9040011 - Bulletin Board -9040012 - Knight Armor -9050000 - Pigmi the Summoner -9050001 - Pigmi the Summoner -9050002 - Pigmi the Summoner -9050003 - Pigmi the Summoner -9050004 - Pigmi the Summoner -9050005 - Pigmi the Summoner -9050006 - Pigmi the Summoner -9050007 - Pigmi the Summoner -9050008 - Pigmi and Etran -9050009 - Etran's Information Board -9050010 - Pet Pygmy -9060000 - Kenta -9060001 - Kenta -9090000 - Mu Mu -9100000 - Kerning City Manekineko -9100001 - Henesys Manekineko -9100002 - Ellinia Manekineko -9100003 - Perion Manekineko -9100004 - Sleepywood Manekineko -9100100 - Gachapon -9100101 - Gachapon -9100102 - Gachapon -9100103 - Gachapon -9100104 - Gachapon -9100105 - Gachapon -9100106 - Gachapon -9100107 - Gachapon -9100108 - Gachapon -9100109 - Gachapon -9100110 - Gachapon -9100111 - Gachapon -9100112 - EXP Gachapon -9100117 - Gachapon -9100200 - Pachinko 1 -9100201 - Pachinko 2 -9100202 - Pachinko 3 -9100203 - Pachinko 4 -9100204 - Pachinko 5 -9100205 - Pachinko 6 -9101000 - No String -9101001 - Peter -9101002 - Todd -9101003 - Peter -9102000 - Scon -9102001 - Garnox -9102100 - ? -9102101 - ? -9103000 - Pietri -9103001 - Rolly -9103002 - Rolly -9103003 - Rolly -9105002 - Naomi -9105003 - Snow Spirit -9105004 - Snow Spirit -9105005 - Snowman -9110000 - Perry -9110001 - Raimu the Warrior -9110002 - Kino Konoko -9110003 - Janken -9110004 - Taru -9110005 - Bronze -9110006 - Jin Jia -9110007 - Robo -9110008 - Perry -9110009 - Gachapon Charity Box -9110010 - Gachapon Statue -9110011 - Gachapon -9110012 - Gachapon -9110013 - Gachapon -9110014 - Gachapon -9110015 - Mushroom Statue -9110016 - No String. -9110100 - Charity Box -9120000 - Shinta -9120001 - Hanako -9120002 - Doran -9120003 - Hikari -9120004 - Momoyo -9120005 - Umi -9120006 - Skai -9120007 - Furano -9120008 - Tsuri -9120009 - Yuse -9120010 - Faito -9120011 - Sakura -9120012 - Fraidy Cat -9120013 - Boss Kitty -9120014 - Popo -9120015 - Konpei -9120016 - Mariwaka -9120017 - Poni Chai -9120018 - Grako -9120019 - Momoyo -9120020 - Minstein -9120021 - Clamshell -9120022 - Manstein -9120023 - YokoYoko -9120024 - Ueriba -9120100 - Tepei -9120101 - Midori -9120102 - Hikekuro -9120103 - Saeko -9120104 - Naoko -9120200 - Konpei -9120201 - Konpei -9120202 - Konpei -9120203 - Konpei -9200000 - Cody -9200001 - Mad Bunny -9200100 - Dr. Lenu -9200101 - Dr. Rhomes -9200102 - Dr. Bosch -9201000 - Moony -9201001 - Nana(H) -9201002 - High Priest John -9201003 - Mom and Dad -9201004 - Ames the Wise -9201005 - Assistant Nicole -9201006 - Assistant Debbie -9201007 - Assistant Nancy -9201008 - Assistant Bonnie -9201009 - Assistant Jackie -9201010 - Assistant Travis -9201011 - Pelvis Bebop -9201012 - Wayne -9201013 - Victoria -9201014 - Pila Present -9201015 - Julius Styleman -9201016 - Salon Seamus -9201017 - Dr.Roberts -9201018 - Dr. 90212 -9201019 - Intern Shakihands -9201020 - Vivian Boutique -9201021 - Robin The Huntress -9201022 - Thomas Swift -9201023 - Nana(K) -9201024 - Nana(E) -9201025 - Nana(O) -9201026 - Nana(L) -9201027 - Nana(P) -9201028 - Malady -9201029 - Grandma Benson -9201030 - Maple Claws -9201031 - Hannah -9201032 - Mr. Kit Kat -9201033 - Simon -9201034 - Ben -9201035 - Jacob -9201036 - Angelique -9201037 - Gary and Shatima -9201038 - Richard the Sailor -9201039 - Claudia -9201040 - Mr. Spot -9201041 - Bullseye -9201042 - Mr. Sandman -9201043 - Amos the Strong -9201044 - Amos the Strong -9201045 - Amos the Strong -9201046 - Amos the Strong -9201047 - The Glimmer Man -9201048 - Amos the Strong -9201049 - Ames the Wise -9201050 - Icebyrd Slimm -9201051 - John Barricade -9201052 - Professor Foxwit -9201053 - Jack Masque -9201054 - Lita Lawless -9201055 - Elpam Gorlab -9201056 - NLC Taxi -9201057 - Bell -9201058 - Delphi -9201059 - Kyle -9201060 - Miki -9201061 - Bomack -9201062 - J.J. -9201063 - Ari -9201064 - Mani -9201065 - Miranda -9201066 - NLC Maple TV -9201067 - Claw Machine -9201068 - NLC ticket gate -9201069 - V. Isage -9201070 - Nerbit -9201071 - Sunstone Grave -9201072 - Moonstone Grave -9201073 - Tombstone -9201074 - Bob -9201075 - Agent Falcon -9201076 - Ludmilla -9201077 - Jonas Prendergast -9201078 - Sophilia -9201079 - Old Man Tom -9201080 - Edmunds -9201081 - Rob -9201082 - Spindle -9201083 - The Glimmer Man -9201084 - Tombstone -9201085 - Nicholas -9201086 - Andy -9201087 - Kate -9201088 - Barry -9201089 - Alex -9201090 - Jill -9201091 - O-Pongo -9201092 - Mr. Grubber -9201093 - Little Suzy -9201094 - Corine -9201095 - Fiona -9201096 - Jack -9201097 - Joko -9201098 - Lukan -9201099 - Mo -9201100 - Taggrin -9201101 - T-1337 -9201102 - Stirgeman -9201103 - Ridley -9201104 - Sage -9201105 - Sage -9201106 - Adonis -9201107 - Master Warrior -9201108 - Master Bowman -9201109 - Master Mage -9201110 - Master Thief -9201111 - Master Pirate -9201112 - Jack -9201113 - Jack -9201114 - Gate -9201115 - Battle Statue -9201116 - Kopee Relicseeker -9201117 - Toh Relicseeker -9201118 - Hill -9201119 - Silence of the Wolf -9201120 - Ervine -9201121 - Lucci -9201122 - Old Bow -9201123 - Warrior Statue -9201124 - Bowman Statue -9201125 - Magician Statue -9201126 - Thief Statue -9201127 - Pirate Statue -9201128 - Demon's Doorway -9201129 - Demon's Doorway -9201130 - Demon's Doorway -9201131 - Demon's Doorway -9201132 - Demon's Doorway -9201133 - Astaroth's Doorway -9201134 - Aldol -9201135 - Audrey -9201136 - Olivia -9201137 - Joe -9201143 - Steward -9201139 - Olivia's Mirror1 -9201140 - Olivia's Mirror2 -9201141 - Olivia's Mirror3 -9201142 - Witch Malady -9209000 - Abdula -9209001 - Mimi -9209002 - Mr. Oh -9209003 - Lung Tup -9209004 - Lena -9209005 - Tae Gong -9209006 - Hanako -9209007 - Lazy Daisy -9209008 - Lazy Daisy -9209100 - Santa -9209101 - Santa -9220000 - Milla -9220001 - Charles -9220004 - Happy -9220005 - Roodolph -9220006 - Bill -9220016 - Lara -9220018 - Charles -9220019 - Milla -9220020 - Charles -9250000 - Ponlaa -9250001 - Apaporn -9250003 - Kith -9250004 - Jit -9250005 - Pond -9250006 - Nid -9250007 - Dang -9250008 - Parn -9250009 - Noi-nha -9250010 - Pornsak -9250011 - Chut -9250012 - Chai -9250013 - Lung Tup -9250014 - Pooyai Lee -9250016 - Toon -9250022 - Yai Bua -9250023 - Aquarium Maple TV -9250024 - El Nath Maple TV -9250025 - Free Market Maple TV -9250026 - Ludibrium Maple TV -9250027 - Kob -9250028 - Lung Thid -9250029 - Thawee -9250042 - Henesys Maple TV -9250043 - Kerning City Maple TV -9250044 - Elinia Maple TV -9250045 - Perion Maple TV -9250046 - Orbis Maple TV -9250052 - News Stand -9250053 - Christmas Tree -9250054 - Bicho -9270000 - Amoria Maple TV -9270001 - Lith Harbor Maple TV -9270002 - Sleepywood Maple TV -9270003 - Omega Sector Maple TV -9270004 - Korean Folk Town Maple TV -9270005 - Leafre Maple TV -9270006 - Murung Maple TV -9270007 - Bak Cho Maple TV -9270008 - Y Tan Maple TV -9270009 - Yuan Maple TV -9270010 - SeuMunJung Maple TV -9270011 - NightMarket Maple TV -9270012 - Mushroom Shine Maple TV -9270013 - Showa Maple TV -9270014 - Ninja Maple TV -9270015 - Taiwan Water Market Maple TV -9270016 - Golden Temple Maple TV -9270017 - Xinga -9270018 - Kerny -9270019 - Chan -9270020 - Hui Ting -9270021 - Wendy -9270022 - Candy -9270023 - Noel -9270024 - Kelvin -9270025 - Xan -9270026 - Sixx -9270027 - Alwyn -9270028 - Adrian -9270029 - Johnson -9270030 - Ralph the wanderer -9270031 - Dave & Iris -9270032 - Angie -9270033 - Bob -9270034 - Airu -9270035 - Eunice -9270036 - Eric -9270037 - Jimmy -9270038 - Shalon -9270039 - Sureen -9270040 - Singapore Maple TV -9270041 - Irene -9270042 - Mr. Hwang -9270043 - Gachapon -9270047 - Aldol -9270054 - Encik Musa -9270055 - Chiang -9270056 - Riduan -9270057 - Kok Hua -9270058 - Hurliza -9270059 - Nuri -9270060 - Chee Wee -9270061 - Village Chief Malek -9270062 - Lam -9270063 - Mutu -9270064 - Theme Park Owner -9270065 - Ali -9270066 - MY Maple TV -9300000 - Tang San Zang -9300001 - Fa Hai -9300002 - Di Zang Wang -9300003 - Yue Lao -9300004 - Wu Yuan -9300005 - Hong Niang -9300006 - Banquet Master -9300007 - Tian Bing -9300008 - Tian Sha Gu Xing -9300009 - Mi Le -9300010 - Mr. Moneybags -9300011 - Cai Shen -9300012 - Guan Zhong -9300013 - Sima Qian -9300014 - Zhang Liang -9310000 - Hong the Pilot -9310001 - Lady Li -9310002 - Owner Jang -9310003 - Lady Jin -9310004 - Officer Lim -9310005 - Officer Chung -9310006 - Officer Huh -9310007 - Officer Kang -9310008 - Chief Officer Chu -9310009 - Ms. Jo -9310010 - Mr. Yang -9310011 - Owner Yeo -9310012 - Cho the photographer -9310013 - Yang the Pilot -9310014 - TMS -9310015 - TMS -9310016 - TMS -9310017 - TMS -9310018 - TMS -9310019 - TMS -9310021 - TMS -9330000 - ? -9330001 - ?? -9330002 - ??? -9330003 - ??? -9330004 - ??? -9330005 - ??? -9330006 - ??? -9330007 - ?? -9330008 - FAQ ??? npc 1 -9330009 - FAQ ??? npc 2 -9330010 - FAQ ??? npc 3 -9330011 - FAQ ??? npc 4 -9330012 - FAQ npc -9330013 - FAQ ??? npc 5 -9330014 - ?? -9330015 - ?? -9330016 - ??? ?? -9330017 - ??? ?? -9330018 - ??? ?? ?? -9330019 - ?? -9330020 - ???? -9330021 - ?? -9330022 - ?? -9330023 - ??? -9330024 - ??? -9330025 - ??? -9330026 - ?? ?? -9330027 - ?? ??? -9330028 - ???? ???? -9330029 - ?? -9330030 - ?? ??? -9330031 - ???? ??? -9330032 - ???? ???? -9330045 - Kedrick -9330046 - Madrick -9900000 - KIN -9900001 - NimaKIN -9901000 - -9901001 - -9901002 - -9901003 - -9901004 - -9901005 - -9901006 - -9901007 - -9901008 - -9901009 - -9901010 - -9901011 - -9901012 - -9901013 - -9901014 - -9901015 - -9901016 - -9901017 - -9901018 - -9901019 - -9901100 - -9901101 - -9901102 - -9901103 - -9901104 - -9901105 - -9901106 - -9901107 - -9901108 - -9901109 - -9901110 - -9901111 - -9901112 - -9901113 - -9901114 - -9901115 - -9901116 - -9901117 - -9901118 - -9901119 - -9901200 - -9901201 - -9901202 - -9901203 - -9901204 - -9901205 - -9901206 - -9901207 - -9901208 - -9901209 - -9901210 - -9901211 - -9901212 - -9901213 - -9901214 - -9901215 - -9901216 - -9901217 - -9901218 - -9901219 - -9901300 - -9901301 - -9901302 - -9901303 - -9901304 - -9901305 - -9901306 - -9901307 - -9901308 - -9901309 - -9901310 - -9901311 - -9901312 - -9901313 - -9901314 - -9901315 - -9901316 - -9901317 - -9901318 - -9901319 - -9901500 - -9901501 - -9901502 - -9901503 - -9901504 - -9901505 - -9901506 - -9901507 - -9901508 - -9901509 - -9901510 - -9901511 - -9901512 - -9901513 - -9901514 - -9901515 - -9901516 - -9901517 - -9901518 - -9901519 - -9901520 - -9901521 - -9901522 - -9901523 - -9901524 - -9901525 - -9901526 - -9901527 - -9901528 - -9901529 - -9901530 - -9901531 - -9901532 - -9901533 - -9901534 - -9901535 - -9901536 - -9901537 - -9901538 - -9901539 - -9901540 - -9901541 - -9901542 - -9901543 - -9901544 - -9901545 - -9901546 - -9901547 - -9901548 - -9901549 - -9901550 - -9901551 - -9999999 - test -9201138 - Jonas -9201144 - Steward -2007 - Maple Administrator -10200 - Athena Pierce -10201 - Grendel the Really Old -10202 - Dances with Balrog -10203 - Dark Lord -10204 - Kyrin -1002007 - Regular Cab at Lith Harbor -1002104 - Tru -1012118 - Power B. Fore -1012119 - Power B. Fore -1022104 - Power B. Fore -1022105 - Power B. Fore -1032112 - Talking Tree -1032113 - Power B. Fore -1032114 - Power B. Fore -1052113 - Power B. Fore -1052114 - Power B. Fore -1052115 - Mr. Lim -1095001 - Power B. Fore -1095002 - Power B. Fore -1200000 - Pusla -1200001 - Puno -1200002 - Puri Puri -1200003 - Puro -1200004 - Puro -1200005 - Puro -1200006 - Puro -1201000 - Lilin -1201001 - Giant Polearm -1201002 - Maha -1202000 - Tutorial Lilin -1202001 - Puka -1202002 - Puen -1202003 - Puir -1202004 - Purun -1202005 - Putzki -1202006 - Puo -1202007 - Pucci -1202008 - Head Wolf -1202009 - Wolf Guard -1202010 - Pudin -1203000 - Sir Blacksmith -1203001 - Tititi -1204000 - Shadow -1204001 - Francis -1204002 - Francis -1204003 - Francis -1204004 - ??? -1204005 - Tru -1204006 - Francis -1204007 - Tru -1204010 - Dargoth -1204020 - Nameless -1204030 - Storage Bookshelf -1204031 - ??? -1204032 - Athena Pierce -1209000 - Athena Pierce -1209001 - Refugee -1209002 - Refugee -1209003 - 3 Refugees -1209004 - Refugee -1209005 - Refugee -1209006 - Lost Kid -1209007 - Athena Pierce -1300000 - Mushking -1300001 - King Pepe -1300002 - Violetta -1300003 - Secretary of Domestic Affairs -1300004 - Secretary of Magic -1300005 - Head Security Officer -1300006 - Prince Giuseppe -1300007 - Scarrs -1300008 - James -1300009 - Mushroom Soldier -1300010 - Killer Spore Potion -1300011 - Thorn Remover -1300012 - Door to East Castle Tower -1300013 - Blocked Entrance -1300014 - SELF -1301000 - Thorr -2091007 - Mu Gong -2091008 - Jin Jin -2091009 - Entrance of Sealed Shrine -2103013 - Duarte -9000022 - John -9000023 - Athena Pierce -9000024 - Dances with Balrog -9000025 - Grendel the Really Old -9000026 - Dark Lord -9000027 - Kyrin -9000028 - Tae Gong -9000029 - Winky the Fairy -9000030 - Maple Admin the Witness -9000031 - Cassandra -9901600 - -9901601 - -9901602 - -9901603 - -9901604 - -9901605 - -9901606 - -9901607 - -9901608 - -9901609 - -9901610 - -9901611 - -9901612 - -9901613 - -9901614 - -9901615 - -9901616 - -9310083 - Talking Snow Man -1204033 - John's Box -9250051 - Mrs. Claus -9310058 - Santa -1013000 - ?? -1013001 - ??? -1013002 - ???? ?? -1013100 - ?? -1013101 - ?? -1013102 - ?? -1013103 - ??? -1013104 - ?? -1013105 - ?? -1013201 - ??? -1013202 - ?? ??? -1013203 - ??? -1013200 - Baby Pig -9000070 - Full Moon -1022106 - Christopher -1022107 - Perion Warning Post -1052116 - Thompson -1052117 - Blake -1052118 - Lockers -1052119 - Lala -1052120 - Maestro Rho -1052121 - Lana -1052122 - Tina -1052123 - Robby Fray -1052124 - Marshall -1052125 - June -1063018 - Doll Left Behind -1205000 - Afrien -2012034 - Hidden Brick -2030015 - Hidden Rock -2060010 - Dolphin -2060103 - Norrington -2082004 - Andy -2082005 - Brainy Boy -2082006 - Crying Girl -2082007 - Policeman -2082008 - Captain Edmond -2082009 - May -2082010 - Bao -2082011 - Hoya -2082012 - Nalo -2082013 - Ashura -2082014 - Asia -2082015 - Electronic Induction Device -2082016 - Isabella -2082017 - Ken -2083006 - Time Gate -2092100 - Potter -9010022 - Dimensional Mirror -9010021 - Wolf Spirit Ryko -9901700 - -9901701 - -9901702 - -9901703 - -9901704 - -9901705 - -9901706 - -9901707 - -9901708 - -9901709 - -9901710 - -9901711 - -9901712 - -9901713 - -9901714 - -9901715 - -9901716 - -9901717 - -9901718 - -9901719 - -9901720 - -9901721 - -9901722 - -9901723 - -9901724 - -9901725 - -9901726 - -9901727 - -9901728 - -9901729 - -9901730 - -9901731 - -9901732 - -9901733 - -9901734 - -9901735 - -9901736 - -9901737 - -9901738 - -9901739 - -9901740 - -9901741 - -9901742 - -9901743 - -9901744 - -9901745 - -9901746 - -9901747 - -9901748 - -9901749 - -9901800 - -9901801 - -9901802 - -9901803 - -9901804 - -9901805 - -9901806 - -9901807 - -9901808 - -9901809 - -9901810 - -9901811 - -9901812 - -9901813 - -9901814 - -9901815 - -9901816 - -9901817 - -9901818 - -9901819 - -9901820 - -9901821 - -9901822 - -9901823 - -9901824 - -9901825 - -9901826 - -9901827 - -9901828 - -9901829 - -9901830 - -9901831 - -9901832 - -9901833 - -9901834 - -9901835 - -9901836 - -9901837 - -9901838 - -9901839 - -9901840 - -9901841 - -9901842 - -9901843 - -9901844 - -9901845 - -9901846 - -9901847 - -9901848 - -9901849 - -9901900 - -9901901 - -9901902 - -9901903 - -9901904 - -9901905 - -9901906 - -9901907 - -9901908 - -9901909 - -9000069 - Inkwell diff --git a/tools/MapleIdRetriever/handbook/Pet.txt b/tools/MapleIdRetriever/handbook/Pet.txt deleted file mode 100644 index ee5e9915a3..0000000000 --- a/tools/MapleIdRetriever/handbook/Pet.txt +++ /dev/null @@ -1,57 +0,0 @@ -5000000 - Brown Kitty - They are quiet and gentle in nature, so they don't go craving for food too often. They don't seem to be too obedient of their owners. -5000001 - Brown Puppy - They are outgoing and active in nature, so they can't sit still for a period of time, which makes them hungry often. They are very obedient of their owners. -5000002 - Pink Bunny - They are well-behaved and quiet, so they don't need to be fed more than the usual amount. They are smart and obedient, but also stubborn. -5000003 - Mini Kargo - They are very very active, so they get hungry pretty often. Very intelligent, they are quite obedient of their owners. -5000004 - Black Kitty - They are quiet and gentle in nature, so they don't go craving for food too often. They don't seem to be too obedient of their owners. -5000005 - White Bunny - They are well-behaved and quiet, so they don't need to be fed more than the usual amount. They are smart and obedient, but also stubborn. -5000006 - Husky - Active, yet calm at times. Can be moderately fed. Very smart in general. -5000007 - Black Pig - Very active and hungry at all times. Need to be fed often. Very friendly in nature, so it's easy to increase the level of closeness with it. -5000008 - Panda - Calm, relaxed, and gentle. A very rare creature. -5000009 - Dino Boy - A very adorable male baby dinosaur that is both active and unpredictable. -5000010 - Dino Girl - A very adorable female baby dinosaur that is both active and unpredictable. -5000011 - Monkey - The always-curious monkey never rests, wanders around. -5000012 - White Tiger - They are very gentle and obedient in nature, easily becoming friendly with the owner, which in turn speeds up the level-up process. -5000013 - Elephant - Very outgoing and mature; doesn't need to be fed all the time. An intelligent pet that easily understands the commands from the master. -5000014 - Rudolph - Every Christmas, Santa Claus rides on the sleigh driven by his trusty sidekick, Rudolph. -5000015 - Dasher - They are smart and obedient by nature, picking up commands faster than other pets, but they also can get hungry in a hurry. -5000017 - Robot - A hyper-active robot that always changes its mind on everything. Very unpredictable, yet easy to please. -5000018 - Husky - Active, yet calm at times. Can be moderately fed. Very smart in general. -5000020 - Mini Yeti - A trustworthy pet that quietly watches everyone's back. Quiet, but smart and gets a lot of things done. -5000021 - Monkey - Very charming who is also very intuitive, but not as obedient as some of the others -5000022 - Turkey - Somewhat active, quiet and not well-behaved in nature. It is not very obedient, but isn't hungry very often. -5000023 - Penguin - Penguins are always energetic and in good spirits. Use the Meso Magnet and Item Pouch on the Penguin to pick up the mesos and items on the ground. -5000024 - Jr. Balrog - A trustworthy pet who is equally quick-witted. Unlike its masculine appearance, it is prone to insecurity and shyness. -5000025 - Golden Pig - This designed Golden Pig will definately bring you a Good Luck! Use the Meso Magnet and Item Pouch to pick up the mesos and items on the ground. -5000028 - Dragon - A special egg that becomes a mythical Baby Dragon upon hatching. -5000029 - Baby Dragon - A Baby Dragon hatched out of the special Dragon Egg. At Level 15, the pet can be evolved into a full-fledged Adult Dragon with the help of Garnox the NPC using the Rock of Evolution. -5000030 - Green Dragon - Mysterious magical powers aligned and sucessfully evolved the Baby Dragon into a Green Dragon! -5000031 - Red Dragon - Mysterious magical powers aligned and sucessfully evolved the Baby Dragon into a Red Dragon! -5000032 - Blue Dragon - Mysterious magical powers aligned and sucessfully evolved the Baby Dragon into a Blue Dragon! -5000033 - Black Dragon - Mysterious magical powers aligned and sucessfully evolved the Baby Dragon into the rare and majestic Black Dragon! -5000034 - Black Bunny - They are well-behaved and quiet, so they don't need to be fed more than the usual amount. They are smart and obedient, but also stubborn. -5000036 - Jr. Reaper - Miniature death incarnate. Makes for a loyal but cheeky sidekick that is prone to talking back. -5000037 - Husky - Active, yet calm at times. Can be moderately fed. Very smart in general. -5000039 - Porcupine - A small, furry creature with very, very sharp spikes. A lovable pet. -5000041 - Snowman - An adorable Snowman that is also very active. May seem a little rude at times, but the more it is loved, the more affable it becomes. -5000044 - Orange tiger - They are very gentle and obedient in nature, easily becoming friendly with the owner, which in turn speeds up the level-up process. -5000045 - Skunk - Calm and quiet by nature, the easy-going, eccentric Skunk has a rather humorous and pompous outlook on life, the finer things are what it enjoys. -5000026 - Sun Wu Kong - Sun Wu Kong ran out of Tang Shan Zhang. He is lazy and moody but can be changed with love. -5000040 - ??? ?? - ??? ??? ??? ??? ???????. ??? ????? ??? ?????, ??? ? ?? ??? ??? ???? ??? ?? ????. \n#c??: ?? ??, ??? ??, ??? ?? ???&?? ??, ?? ??, ???? ??, MP ????# -5000042 - Kino - A happy-go-lucky, orange mushroom that loves shiny stones. -5000043 - ???? - ??? ????, ?? ??? ??? ???????. ??? ?? ? ????, ??? ??? ???? ??? ?? ????. \n#c??: ????, ?????# -5000046 - ?? - ???? ?? ?? ???? ???? ??? ???????. \n#c??:????, ?????# -5000047 - Robo - A special egg that becomes a mythical Robo upon hatching. -5000048 - Baby Robo - A Baby Robo hatched out of the special Capsule. At Level 15, the pet can be evolved into a full-fledged Adult Robo with the help of Garnox the NPC using the Rock of Evolution. -5000049 - Blue Robo - Mysterious magical powers aligned and sucessfully evolved the Baby Robo into a Blue Robo! -5000050 - Red Robo - Mysterious magical powers aligned and sucessfully evolved the Baby Robo into a Red Robo! -5000051 - Green Robo - Mysterious magical powers aligned and sucessfully evolved the Baby Robo into a Green Robo! -5000052 - Gold Robo - Mysterious magical powers aligned and sucessfully evolved the Baby Robo into a Gold Robo! -5000053 - Gorilla Robo - Mysterious magical powers aligned and sucessfully evolved the Baby Robo into the rare and majestic Gorilla Robo! -5000055 - Crys.Rudolph - The star of this year's Holidays. Projects an aura of nobility and gentleness. Only available during the winter Holidays! -5000058 - White Duck - Silly and foolish, but hard working and easy-going by nature, White Duck is easy to please, and enjoys good food and a swim. -5000054 - Snail - A snail that is really hard to figure out. -5000060 - Pink Bean - A short and chubby pet summoned through the Goddess' mirror. It is temperamental.\n#cA pet whose life will never expire.# -5000100 - Kino - A happy-go-lucky, orange mushroom that loves shiny stones.\n#cA pet whose life will never expire.# -5000101 - White Tiger - They are very gentle and obedient in nature, easily becoming friendly with the owner, which in turn speeds up the level-up process.\n#cA pet whose life will never expire.# -5000102 - Mini Yeti - A trustworthy pet that quietly watches everyone's back. Quiet, but smart and gets a lot of things done.\n#cA pet whose life will never expire.# -5000066 - Baby Tiger - Baby Tiger, the big star of 2010. diff --git a/tools/MapleIdRetriever/handbook/Setup.txt b/tools/MapleIdRetriever/handbook/Setup.txt deleted file mode 100644 index 7deebab82d..0000000000 --- a/tools/MapleIdRetriever/handbook/Setup.txt +++ /dev/null @@ -1,251 +0,0 @@ -3010000 - The Relaxer - Catch your breath and relax by sitting on this chair to recover 50 HP every 10 seconds.\n#cCannot be traded or dropped.# -3010001 - Sky-blue Wooden Chair - A specially-made sky-blue wooden chair that's only available in Lith Harbor. Recover 35 HP every 10 seconds. -3010002 - Green Chair - A comfortable, plush green chair, complete with arm-rests. Recovers 50 HP every 10 seconds. -3010003 - Red Chair - A comfortable, plush red chair, complete with arm-rests.. Recovers 50 HP every 10 seconds. -3010004 - The Yellow Relaxer - Catch your breath and relax by sitting on this chair to recover 50 HP every 10 seconds. Perfect for a quick break from training. -3010005 - The Red Relaxer - Catch your breath and relax by sitting on this chair to recover 50 HP every 10 seconds. Perfect for a quick break from training. -3010006 - Yellow Chair - A comfortable, plush yellow chair, complete with arm-rests. Recovers 50 HP every 10 seconds. -3010007 - Pink Seal Cushion - An adorable pink cushion that resembles a seal. Recovers HP 60 every 10 seconds. -3010008 - Blue Seal Cushion - An adorable blue cushion that resembles a seal. Recovers HP 60 every 10 seconds. -3010009 - Red Round Chair - Rumored to be crafted in Amoria, this special chair is also known as the Love Seat. Recover 20 HP and 20 MP every 10 seconds. -3010010 - White Seal Cushion - An adorable white cushion that resembles a seal. Recovers HP 50 every 10 seconds. -3010011 - Amorian Relaxer - A chair crafted by Jacob. Recovers 75 HP every 10 seconds.\n#cCannot be traded or dropped.# -3010012 - Warrior Throne - A powerful chair used often on the battlefield. Recovers 60 HP every 10 seconds.\n#cCannot be traded or dropped.# -3010013 - Beach Chair - A chair straight from the relaxation experts in Florina Beach. Recover 20 HP every 10 seconds. -3010014 - Moon Star Chair - A light, stylish chair that seems to be sent from the heavens. Recover 30 HP and 30 MP every 10 seconds. -3010015 - The Red Relaxer - A chair with magical properties crafted in Ellinia. Restores 35 MP per 10 Seconds while sitting. -3010016 - Grey Seal Cushion - An adorable grey cushion that resembles a seal. Recovers HP 60 every 10 seconds. -3010017 - Gold Seal Cushion - An adorable gold cushion that resembles a seal. Recovers MP 60 every 10 seconds. -3010018 - Palm Tree Beach Chair - A beach chair placed in the shades under the palm tree at Ariant. Sit on it to recover HP 40 and MP 20 every 10 seconds. -3010019 - Kadomatsu - A specially-made chair that's only available in Mushroom Shrine. Recover 60 MP every 10 seconds. -3010025 - Under the Maple Tree... - A white chair commemorating the 4th anniversary of MapleStory. Sit on it to recover HP 35 and MP 10 every 10 seconds. -3011000 - Fishing Chair - The perfect chair for fishing. -3990000 - Red No. 1 - A red #1 to decorate the tree. -3990001 - Red No. 2 - A red #2 to decorate the tree. -3990002 - Red No. 3 - A red #3 to decorate the tree. -3990003 - Red No. 4 - A red #4 to decorate the tree. -3990004 - Red No. 5 - A red #5 to decorate the tree. -3990005 - Red No. 6 - A red #6 to decorate the tree. -3990006 - Red No. 7 - A red #7 to decorate the tree. -3990007 - Red No. 8 - A red #8 to decorate the tree. -3990008 - Red No. 9 - A red #9 to decorate the tree. -3990009 - Red No. 0 - A red #0 to decorate the tree. -3990010 - Green No. 1 - A green #1 to decorate the tree. -3990011 - Green No. 2 - A green #2 to decorate the tree. -3990012 - Green No. 3 - A green #3 to decorate the tree. -3990013 - Green No. 4 - A green #4 to decorate the tree. -3990014 - Green No. 5 - A green #5 to decorate the tree. -3990015 - Green No. 6 - A green #6 to decorate the tree. -3990016 - Green No. 7 - A green #7 to decorate the tree. -3990017 - Green No. 8 - A green #8 to decorate the tree. -3990018 - Green No. 9 - A green #9 to decorate the tree. -3990019 - Green No. 0 - A green #0 to decorate the tree. -3990020 - Red " + " - A red " + " to decorate the tree. -3990021 - Red " - " - A red " - " to decorate the tree. -3990022 - Green " + " - A green " + " to decorate the tree. -3990023 - Green " - " - A green " - " to decorate the tree. -3991000 - Red "A" - A red "A" to decorate the tree. -3991001 - Red "B" - A red "B" to decorate the tree. -3991002 - Red "C" - A red "C" to decorate the tree. -3991003 - Red "D" - A red "D" to decorate the tree. -3991004 - Red "E" - A red "E" to decorate the tree. -3991005 - Red "F" - A red "F" to decorate the tree. -3991006 - Red "G" - A red "G" to decorate the tree. -3991007 - Red "H" - A red "H" to decorate the tree. -3991008 - Red "I" - A red "I" to decorate the tree. -3991009 - Red "J" - A red "J" to decorate the tree. -3991010 - Red "K" - A red "K" to decorate the tree. -3991011 - Red "L" - A red "L" to decorate the tree. -3991012 - Red "M" - A red "M" to decorate the tree. -3991013 - Red "N" - A red "N" to decorate the tree. -3991014 - Red "O" - A red "O" to decorate the tree. -3991015 - Red "P" - A red "P" to decorate the tree. -3991016 - Red "Q" - A red "Q" to decorate the tree. -3991017 - Red "R" - A red "R" to decorate the tree. -3991018 - Red "S" - A red "S" to decorate the tree. -3991019 - Red "T" - A red "T" to decorate the tree. -3991020 - Red "U" - A red "U" to decorate the tree. -3991021 - Red "V" - A red "V" to decorate the tree. -3991022 - Red "W" - A red "W" to decorate the tree. -3991023 - Red "X" - A red "X" to decorate the tree. -3991024 - Red "Y" - A red "Y" to decorate the tree. -3991025 - Red "Z" - A red "Z" to decorate the tree. -3991026 - Green "A" - A green "A" to decorate the tree. -3991027 - Green "B" - A green "B" to decorate the tree. -3991028 - Green "C" - A green "C" to decorate the tree. -3991029 - Green "D" - A green "D" to decorate the tree. -3991030 - Green "E" - A green "E" to decorate the tree. -3991031 - Green "F" - A green "F" to decorate the tree. -3991032 - Green "G" - A green "G" to decorate the tree. -3991033 - Green "H" - A green "H" to decorate the tree. -3991034 - Green "I" - A green "I" to decorate the tree. -3991035 - Green "J" - A green "J" to decorate the tree. -3991036 - Green "K" - A green "K" to decorate the tree. -3991037 - Green "L" - A green "L" to decorate the tree. -3991038 - Green "M" - A green "M" to decorate the tree. -3991039 - Green "N" - A green "N" to decorate the tree. -3991040 - Green "O" - A green "O" to decorate the tree. -3991041 - Green "P" - A green "P" to decorate the tree. -3991042 - Green "Q" - A green "Q" to decorate the tree. -3991043 - Green "R" - A green "R" to decorate the tree. -3991044 - Green "S" - A green "S" to decorate the tree. -3991045 - Green "T" - A green "T" to decorate the tree. -3991046 - Green "U" - A green "U" to decorate the tree. -3991047 - Green "V" - A green "V" to decorate the tree. -3991048 - Green "W" - A green "W" to decorate the tree. -3991049 - Green "X" - A green "X" to decorate the tree. -3991050 - Green "Y" - A green "Y" to decorate the tree. -3991051 - Green "Z" - A green "Z" to decorate the tree. -3992000 - Santa Ornament - A santa ornament for the tree. -3992001 - Rudolph Ornament - A Rudolph ornament for the tree. -3992002 - Mushroom Ornament - A mushroom ornament for the tree. -3992003 - Pig Ornament - A pig ornament for the tree. -3992004 - Slime Ornament - A slime ornament for the tree. -3992005 - Red Gift-Box Ornament - A red gift-box ornament for the tree. -3992006 - Blue Gift-Box Ornament - A blue gift-box ornament for the tree. -3992007 - Yellow Gift-Box Ornament - A yellow gift-box ornament for the tree. -3992008 - Red Star Miniature Bulb - A red star miniature bulb for the tree. -3992009 - Blue Star Miniature Bulb - A blue star miniature bulb for the tree. -3992010 - Green Star Miniature Bulb - A green star miniature bulb for the tree. -3992011 - Pink Star Miniature Bulb - A pink star miniature bulb for the tree. -3992012 - Orange Star Miniature Bulb - An orange star miniature bulb for the tree. -3992013 - Red Miniature Bulb - A red miniature bulb for the tree. -3992014 - Blue Miniature Bulb - A blue miniature bulb for the tree. -3992015 - Yellow Miniature Bulb - A yellow miniature bulb for the tree. -3992016 - Green Miniature Bulb - A green miniature bulb for the tree. -3992017 - Red Ball Ornament - A red ball ornament for the tree. -3992018 - Blue Ball Ornament - A blue ball ornament for the tree. -3992019 - Yellow Ball Ornament - A yellow ball ornament for the tree. -3992020 - Red Sock - A red sock for the tree. -3992021 - The gingerbread man - The gingerbread man for the tree. -3992022 - The gingerbread woman - The gingerbread lady for the tree. -3992023 - Candy Cane - A candy cane for the tree. -3992024 - Circular Tree Ornament - A circular ornament for the tree. -3992025 - King-sized Star - A king-sized star for the tree. -3992026 - Christmas wreath - A christmas wreath for the tree. -3992027 - Red Candle - A red candle for the tree. -3992028 - Blue Candle - A blue candle for the tree. -3992029 - Yellow Candle - A yellow candle for the tree. -3992030 - Red Candy Canes - Red candy canes for the tree. -3992031 - Blue Candy Canes - Blue candy canes for the tree. -3992032 - Yellow Candy Canes - Yellow candy canes for the tree. -3992033 - Red Fruit Leaves - Red fruit leaves for the tree. -3992034 - Yellow Fruit Leaves - Yellow fruit leaves for the tree. -3992035 - Red-Ribboned Giftbox - A red-ribboned giftbox for the tree. -3992036 - Blue-Ribboned Giftbox - A blue-ribboned giftbox for the tree. -3992037 - Yellow-Ribboned Giftbox - A yellow-ribboned giftbox for the tree. -3992038 - Ruldolph Santa Boots - A Rudolph Santa Boots for the tree. -3992039 - Marker of Heroism - A small figurine embedded with a gem that emanates heroism. This item allows you to activate and use the Heroic Statues in the Valley of Heroes. -3992040 - Map of Phantom Forest - This map marks the hidden paths of Phantom Forest, which are now open to you. -3992041 - Crimsonwood Keystone - A magical stone that unlocks the gates to the Inner Sanctum of Crimsonwood Keep. -3993000 - Lucky Dish - A pair of luck dish out of bamboos. Common in Korean culture -3993001 - Luck Sack - A red luck sack common in Korean culture. -3993002 - Bamboo Luck Sack - A pair of luck sack made of bamboo. -3993003 - Red Luck Sack - A red luck sack with 'luck' written on it. -3994000 - Alphabet Soup Pasta "A" - An alphabet "A" made out of pasta. Gather up other alphabets, and bring them all to the Maple Administrator. -3994001 - Alphabet Soup Pasta "E" - An alphabet "E" made out of pasta. Gather up other alphabets, and bring them all to the Maple Administrator. -3994002 - Alphabet Soup Pasta "I" - An alphabet "I" made out of pasta. Gather up other alphabets, and bring them all to the Maple Administrator. -3994003 - Alphabet Soup Pasta "L" - An alphabet "L" made out of pasta. Gather up other alphabets, and bring them all to the Maple Administrator. -3994004 - Alphabet Soup Pasta "N" - An alphabet "N" made out of pasta. Gather up other alphabets, and bring them all to the Maple Administrator. -3994005 - Alphabet Soup Pasta "O" - An alphabet "O" made out of pasta. Gather up other alphabets, and bring them all to the Maple Administrator. -3994006 - Alphabet Soup Pasta "P" - An alphabet "P" made out of pasta. Gather up other alphabets, and bring them all to the Maple Administrator. -3994007 - Alphabet Soup Pasta "R" - An alphabet "R" made out of pasta. Gather up other alphabets, and bring them all to the Maple Administrator. -3994008 - Alphabet Soup Pasta "T" - An alphabet "T" made out of pasta. Gather up other alphabets, and bring them all to the Maple Administrator. -3994009 - Alphabet Soup Pasta "X" - An alphabet "X" made out of pasta. Gather up other alphabets, and bring them all to the Maple Administrator. -3994010 - Alphabet Soup Pasta "Y" - An alphabet "Y" made out of pasta. Gather up other alphabets, and bring them all to the Maple Administrator. -3994011 - Alphabet Soup Pasta "Z" - An alphabet "Z" made out of pasta. Gather up other alphabets, and bring them all to the GM to... -3994012 - Special "M" - A special alphabet "M". Gather up other alphabets, and bring them all to the Maple Administrator. -3994013 - Special "S" - A special alphabet "S". Gather up other alphabets, and bring them all to the Maple Administrator. -3994014 - Special "W" - A special alphabet "W". Gather up other alphabets, and bring them all to the GM to... -3994015 - Wooden Alphabet C - (no description) -3994016 - Wooden Alphabet H - (no description) -3994017 - Alphabet A - An alphabet A. Collect other alphabets and hand them to Maple Administrator to... -3994018 - Alphabet E - An alphabet E. Collect other alphabets and hand them to Maple Administrator to... -3994019 - Alphabet H - An alphabet H. Collect other alphabets and hand them to Maple Administrator to... -3994020 - Alphabet N - An alphabet N. Collect other alphabets and hand them to Maple Administrator to... -3994021 - Alphabet P - An alphabet P. Collect other alphabets and hand them to Maple Administrator to... -3994022 - Alphabet R - An alphabet R. Collect other alphabets and hand them to Maple Administrator to... -3994023 - Alphabet W - An alphabet W. Collect other alphabets and hand them to Maple Administrator to... -3994024 - Alphabet Y - An alphabet Y. Collect other alphabets and hand them to Maple Administrator to... -3994085 - Admin's Candle - A small candle from the Admin. This candle will turn itself off when the game is ended. -3994086 - Birthday Cake Candle - A candle used on the birthday cake for the 4th anniversary of Maplestory. The flame will be blown out when the player exits the game and lit again upon returning to the game. -3995000 - . - (no description) -3010040 - The Stirge Seat - A chair hand-crafted by Stirgeman for aspiring superheroes! Recovers 50 HP and 50 MP every 10 seconds. -3010041 - Skull Throne - A chair crafted within the Phantom Forest, complete with...ornaments...from unlucky travelers. Recovers 50 HP and 50 MP every 10 seconds. -3010045 - Ice Chair - A chair made out of Ice Queen's ice pieces. Sit on it to recover HP 40 and MP 30 per 10 seconds. -3994090 - Spices - Mr. Oh sells these rare spices at the Maple 7th Day Market. You can sell them to Abdula for a profit. -3994091 - Memorabilia from Thailand - You can find these memorabilia from Thailand at the Maple 7th Day Market. You can sell them to Abdula for a profit. -3994092 - Unagi - Lena sells delicious unagi at the Maple 7th Day Market. You can sell it to Abdula for a profit. -3994093 - Taxidermy Shark - This taxydermy shark, handmade by Tae Gong himself, can be found at the Maple 7th Day Market. You can sell it to Abdula for a profit. -3994094 - Crow-feather Hat - Hanako sells this exquisite at the Maple 7th Day Market. You can sell it to Abdula for a profit. -3012005 - Amorian Loveseat - A comfortable, stylish seat that only forms when true love exists between two people. Recovers 45 HP, 45 MP every 10 seconds. -3994089 - Agent W's Memory Chip - A memory chip Agent W left with me. Information regarding 'Master M' is said to be contained in it. If I don't enter the secret code every hour, it will self-destruct. -3994096 - ??1 - ??1??. -3994097 - ??2 - ??2??. -3994098 - ??3 - ??3??. -3994099 - ??4 - ??4??. -3994100 - ??5 - ??5??. -3010046 - Dragon Chair(Inferno) - Inferno will comfort your body. Recovers 60 HP every 10 seconds. -3010047 - Dragon Chair(Abyss) - Abyss will comfort your mind. Recovers 60 MP every 10 seconds. -3010072 - Miwok Chief's Chair - The chair in which the chiefs of the Miwok tribe sat. If you sit in this chair, you can receive the strength of the Miwok ancestors and recover 65MP in 10 seconds. -3994141 - Cassandra's Candle - A small candle given by Cassandra. This candle will turn off automatically when the game ends. -3010058 - WorldEnd - You will recover 50 HP every 10 seconds. Perhaps, as you recline, you will find the answer to many of life's questions. -3010057 - BloodyRose - You will recover 50 HP every 10 seconds. You will experience the might of a conqueror after recovery. -3010060 - Noblesse Chair - A chair makes you feel like you're sitting in the lap of luxury. Also recovers 50 HP every 10 seconds. -3010061 - Underneath the Maple Tree… - A white chair created to celebrate Maple Story's 6th Anniversary. Sit on it to restore 35 HP and 10 MP every 10 seconds. -3010062 - Bamboo Chair - A chair that restores HP every 10 seconds when used. It's very strong since it was made from bamboo grown on Rien. -3010063 - Moon and Star Cushion - A pretty cushion shaped like a moon. Recovers 60 HP every 10 seconds. -3010064 - Male Desert Rabbit Cushion - 60 HP is restored every 10 seconds if you lean back on this cute Male Desert Rabbit Cushion. -3010065 - Pink Beach Parasol - A pink beach chair that makes you want to go to the beach. Restores 60 HP every 10 seconds. -3010066 - Navy Velvet Sofa - A luxurious velvet sofa dyed with a beautiful shade of navy. Restores 60 HP every 10 seconds. -3010067 - Red Designer Chair - A designer chair that glows with a passionate red. Restores 60 HP every 10 seconds. -3994101 - Cassandra's Giant Star - A Giant Star that Cassandra made for you. If you hold it during the Starlight Festival, you can receive 1 Star Stamp every hour. \n#cDisappears when you log out of the game. -3994102 - Letter N for Compass - A Letter N that looks like it would fit perfectly on the Empty Compass. -3994103 - Letter E for Compass - A Letter E that looks like it would fit perfectly on the Empty Compass. -3994104 - Letter W for Compass - A Letter W that looks like it would fit perfectly on the Empty Compass. -3994105 - Letter S for Compass - A Letter S that looks like it would fit perfectly on the Empty Compass. -3994106 - 6th Anniversary Maple Leaf of Journey - A Maple Leaf that signifies Maple Story's 6 year journey. Something good will happen if you hold onto it for 1 hour. -3994115 - Easy Mode - Easy Mode -3994116 - Normal Mode - Normal Mode -3994117 - Hard Mode - Hard Mode -3994118 - Hell Mode - Hell Mode -3994120 - Unknown - An unknown being that has yet to be explained. -3994121 - Agent M - An Agent. -3994122 - Agent C - An Agent. -3994123 - Agent E - An Agent. -3994124 - Agent S - An Agent. -3994125 - Agent O - An Agent. -3010043 - Halloween Broomstick Chair - When you sit on the Halloween Broomstick Chair, 50 MP is restored every 10 seconds -3010071 - Mini Shinsoo Chair - When you rest on the Shinsoo, 50 HP and 50 MP are restored every 10 seconds -3010085 - Olivia's Chair - An eerie looking chair that resembles Olivia. Recovers 40 HP and 35 MP every 10 seconds -3010098 - TV Recliner - A new chair to recline and relax in throughout the Thanksgiving holiday.\nRecovers 60 HP and 30 MP every 10 seconds. -3010116 - The Spirit of Rock Chair - A new chair that makes you feel like a Rock Star.\nRecovers 60 HP and 30 MP every 10 seconds. -3994126 - Aran Memory Fragments - The Arans are reviving. -3994127 - Aran Memory Fragments - The Arans are reviving. -3994128 - Aran Memory Fragments - The Arans are reviving. -3994129 - Aran Memory Fragments - The Arans are reviving. -3994130 - Aran Memory Fragments - The Arans are reviving. -3994131 - Aran Memory Fragments - The Arans are reviving. -3994132 - Aran Memory Fragments - The Arans are reviving. -3994133 - Aran Memory Fragments - The Arans are reviving. -3994134 - Aran Memory Fragments - The Arans are reviving. -3994135 - Aran Memory Fragments - The Arans are reviving. -3994136 - Aran Memory Fragments - The Arans are reviving. -3994137 - Aran Memory Fragments - The Arans are reviving. -3994138 - Ice Crystal - A solid ice crystal that contains Maha Charm. Hold onto it for one hour and the crystal will melt, enabling you to acquire the Charm. -3994139 - Maha Charm - A charm that contains protection from Maha, the spirit of Polearm. Take this to Cassandra for a chance to answer questions and receive prizes. -3010101 - Christmas Gift Box - A huge X-mas Gift Box big enough to fit a grownup. It has a message that reads, "I am here for you." Sitting in it will recover 50 HP and MP every 10 seconds. -3010073 - Giant Pink Bean Cushion - A cushion that resembles Pink Bean, the underling of the Black Mage. Leaning against the cushion and resting will recover 50 HP and 30 MP every 10 seconds. -3010099 - Cuddly Polar Bear - Cuddling with the Polar Bear for some cozy, comfy rest will recover 50 HP and 50 MP every 10 seconds. -3010044 - Winter Red Chair - A chair with a big umbrella. Recovers 30 HP and 30 MP every 10 seconds. -3010106 - Ryko Chair - Snuggle up with Aran's loyal mount, Ryko, to recover 50 HP and MP every 10 seconds. -3010111 - Tiger Skin Chair - Lean back on this imposing Tiger Skin Chair to restore 50 HP and 30 MP every 10 seconds. -3010080 - Swing on the Persimmon Tree - There is a swing on the Persimmon Tree with ripe persimmons. -3010081 - ??? ?? ?? - ??? ??? ?? ??? ? ??? ??? ??? ? ? ??. -3010082 - ??? ?? ?? - ??? ??? ?? ??? ? ??? ??? ??? ? ? ??. -3010083 - ??? ?? ?? - ??? ??? ??? ?? ???? ?? ??? ??? ? ? ??. -3010084 - ??? ?? ?? - ??? ??? ??? ?? ?? ???? ??? ? ? ??. -3010092 - Witch's Broomstick - Hold onto the Broomstick so you don't fall off. -3012010 - Half-Heart Chocolate Cake Chair - Sink yourself into this heavenly cake chair next to someone else who owns it as well, and watch it create a scrumptious effect! Mmm, this chair is so delicious you'll recover 50 HP every 10 seconds. -3012011 - Chocolate Fondue Chair - Yummy! Use this chair next to someone else who's also using it, and a mouth-watering chocolate fondue appears. Smack your lips and dream about treats as you recover 50 HP every 10 seconds. -3010069 - Yellow Robot Chair - Perch yourself on the hand of this powerful yellow robot to recover 50 HP and 30 MP every 10 seconds. diff --git a/tools/MapleIdRetriever/handbook/Skill.txt b/tools/MapleIdRetriever/handbook/Skill.txt deleted file mode 100644 index bec0e116e3..0000000000 --- a/tools/MapleIdRetriever/handbook/Skill.txt +++ /dev/null @@ -1,541 +0,0 @@ -0000008 - Follow the Lead - Allows one to lead up to 3 pets at once. (Passive skill) -0001000 - Three Snails - [Master Level : 3]\nHurls snail shells to attack monsters from long distance. -0001001 - Recovery - [Master Level : 3]\nEnables the user to recover HP constantly for 30 sec. \n#cTerms between skills : 10 min.# -0001003 - Legendary Spirit - [Master Level : 1]\nUses the spirit of a legend to use a scroll on an item that cannot be normally equipped by the character. -0001004 - Monster Rider - [Master Level : 1]\nEnables one to ride on a tamed monster and use it as a method of transportation. -0001002 - Nimble Feet - [Master Level : 3]\nEnables the character to move around quickly for a short amount of time. \n#cTerms between skills : 1 min.# -0001013 - Spaceship - [Master Level : 2]\nYou board a spaceship. While aboard, you can increase your movement and jump abilities by pressing the right/left direction key twice. #Available until: 06-08-2009 at 00 hour# -0001014 - Space Dash - [Master Level : 1]\nIncrease your movement and jump abilities by pressing the right/left direction key twice. #cAvailable until 06-08-2009 at 00 hour# -0001015 - Space Beam - [Master Level : 1]\nChanges the condition of the Krypto found at the Space Mine. #cAvailable until: 06-08-2009 at 00 hour# -1000000 - Improved HP Recovery - [Master Level : 16]\nRecover additional HP every 10 sec. while standing still. -1000001 - Improved MaxHP Increase - Master Level : 10] This skill boosts up the amount of increase on MaxHP after each Level UP, or AP used on MaxHP.\nRequired Skill : #cAt least Level 5 on Improving HP Recovery.# -1000002 - Endure - [Master Level : 8]\nEven when hanging on the rope or on a ladder, you'll be able to recover some HP after a certain amount of time.\nRequired Skill : #cAt least Level 3 on Improving MaxHP Increase.# -1001003 - Iron Body - [Master Level : 20]\nTemporarily increases your weapon defense.\nRequired Skill : #cAt least Level 3 on Endure# -1001004 - Power Strike - [Master Level : 20]\nUse MP to deliver a killer blow to the monsters with a sword. -1001005 - Slash Blast - [Master Level : 20]\nUse HP and MP to attack every enemy around you with a sword.\nRequired Skill : #cAt least Level 1 on Power Strike# -2000000 - Improved MP Recovery - [Master Level : 16]\nRecovering even more MP every 10 sec. The higher the level of the character and the skill level, the more recovery it enables the character to have. -2000001 - Improved MaxMP Increase - Master Level : 10] This skill boosts up the amount of increase on MaxMP after each Level UP, or AP used on MaxMP.\nRequired Skill : #cAt least Level 5 on Improving MP Recovery# -2001002 - Magic Guard - [Master Level : 20]\nTemporarily replaces damage with MP instead of HP. If MP reaches 0, the HP takes a full hit. -2001003 - Magic Armor - [Master Level : 20]\nTemporarily boosts the weapon def. of the armor by blowing magic into it.\nRequired Skill : #cAt least Level 3 on Magic Guard# -2001004 - Energy Bolt - [Master Level : 20]\nUse MP to attack one enemy. -2001005 - Magic Claw - [Master Level : 20]\nUse MP to attack an enemy twice.\nRequired Skill : #cAt least Level 1 on Energy Bolt# -3000000 - The Blessing of Amazon - [Master Level : 16]\nIncreases accuracy. -3000001 - Critical Shot - [Master Level : 20]\nLaunches a critical attack with a given success rate. -3000002 - The Eye of Amazon - [Master Level : 8]\nIncreases the range of attack for bows and crossbows.\nRequired Skill : #cAt least Level 3 on The Blessing of Amazon# -3001003 - Focus - [Master Level : 20]\nFocusing to temporarily increase accuracy and avoidability.\nRequired Skill : #cAt least Level 3 on The Blessing of Amazon# -3001004 - Arrow Blow - [Master Level : 20]\nFires an arrow with authority. Applies more damage than usual. -3001005 - Double Shot - [Master Level : 20]\nFires two arrows at once to attack an enemy twice.\nRequired Skill : #cAt least Level 1 on Arrow Blow# -4000000 - Nimble Body - [Master Level : 20]\nIncreases accuracy and avoidability. -4000001 - Keen Eyes - [Master Level : 8]\nIncreases the range of attack using throwing weapons such as throwing stars & knives.\nRequired Skill : #cAt least Level 3 on Nimble Body# -4001002 - Disorder - [Master Level : 20]\nTemporarily decreases the weapon def. and attacking abilities of the affected, even stunting the ongoing attacks. Can't use this skill on a monster that's already in "disorder." -4001003 - Dark Sight - [Master Level : 20]\nUse MP to hide behind the shadows. Can't be attacked, and can't attack either.\nRequired Skill : #cAt least Level 3 on Disorder# -4001334 - Double Stab - [Master Level : 20]\nUse MP to quickly stab a monster twice in one turn using a dagger. -4001344 - Lucky Seven - [Master Level : 20]\nUse MP to throw 2 throwing stars and apply damage based on LUK, regardless of the rate of Claw Mastery. -1100000 - Sword Mastery - [Master Level : 20]\nIncreases the sword mastery and accuracy. It only applies when either a one-handed or a two-handed sword is in hand. -1100001 - Axe Mastery - [Master Level : 20]\nIncreases the axe mastery and accuracy. It only applies when either a one-handed or a two-handed axe is in hand. -1100002 - Final Attack : Sword - [Master Level : 30]\nStrikes an another, far deadlier blow following the initial attack with a given success rate. It works only when holding a one-hand or two-hand sword.\nRequired Skill : #cAt least Level 3 on Sword Mastery# -1100003 - Final Attack : Axe - [Master Level : 30]\nStrikes an another, far deadlier blow following the initial attack with a given success rate. It works only when holding a one-hand or two-hand axe.\nRequired Skill : #cAt least Level 3 on Axe Mastery# -1101004 - Sword Booster - [Master Level : 20]\nUses HP and MP to temporarily boost up the attacking speed of the equipped sword. It only applies when either a one-handed or a two-handed sword is in hand.\nRequired Skill : #cAt least Level 5 on Sword Mastery# -1101005 - Axe Booster - [Master Level : 20]\nUses HP and MP to temporarily boost up the attacking speed of the equipped axe. It only applies when either a one-handed or a two-handed axe is in hand.\nRequired Skill : #cAt least Level 5 on Axe Mastery# -1101006 - Rage - [Master Level : 20]\nTemporarily boosts the weapon attack level of everyone in the party around the area, but also decreases the level of weapon attack defense. -1101007 - Power Guard - [Master Level : 30]\nReturns a portion of the damage received from the enemy. Can't return more than 10% of the enemy's Max HP at once, however.\nRequired Skill : #cAt least Level 3 on Rage# -1200000 - Sword Mastery - [Master Level : 20]\nIncreases the sword mastery and accuracy. It only applies when either a one-handed or a two-handed sword is in hand. -1200001 - BW Mastery - [Master Level : 20]\nIncreases the mastery of blunt weapons and accuracy. It only applies when either a one-handed or a two-handed blunt weapon is in hand. -1200002 - Final Attack : Sword - [Master Level : 30]\nStrikes an another, far deadlier blow following the initial attack with a given success rate. It works only when holding a one-hand or two-hand sword.\nRequired Skill : #cAt least Level 3 on Sword Mastery# -1200003 - Final Attack : BW - [Master Level : 30]\nStrikes an another, far deadlier blow following the initial attack with a given success rate. It works only when holding a one-hand or two-hand blunt weapon.\nRequired Skill : #cAt least Level 3 on BW Mastery# -1201004 - Sword Booster - [Master Level : 20]\nUses HP and MP to temporarily boost up the attacking speed of the equipped sword. It only applies when either a one-handed or a two-handed sword is in hand.\nRequired Skill : #cAt least Level 5 on Sword Mastery# -1201005 - BW Booster - [Master Level: 20]\nUses HP and MP to temporarily boost up the attacking speed of the equipped blunt weapon. It only applies when either a one-handed or a two-handed blunt weapon is in hand.\nRequired Skill : #cAt least Level 5 on Mace Mastery# -1201006 - Threaten - [Master Level : 20]\nUse MP to temporarily threaten a monster. Decreases the level of weapon attack and weapon defense of every monster around the area. -1201007 - Power Guard - [Master Level : 30]\nReturns a portion of the damage received from the enemy. Can't return more than 10% of the enemy's Max HP at once, however.\nRequired Skill : #cAt least Level 3 on Threaten# -1300000 - Spear Mastery - [Master Level : 20]\nIncreases the spear mastery and accuracy. It only applies when a spear is in hand. -1300001 - Pole Arm Mastery - [Master Level : 20]\nIncreases the mastery of pole arms and accuracy. It only applies when a pole arm is in hand. -1300002 - Final Attack : Spear - [Master Level : 30]\nStrikes an another, far deadlier blow following the initial attack with a given success rate. It works only when holding a one-hand or two-hand spear.\nRequired Skill : #cAt least Level 3 on Spear Mastery# -1300003 - Final Attack : Pole Arm - [Master Level : 30]\nStrikes an another, far deadlier blow following the initial attack with a given success rate. It works only when holding a one-hand or two-hand pole arm.\nRequired Skill : #cAt least Level 3 on Pole Arm Mastery# -1301004 - Spear Booster - [Master Level : 20]\nUses HP and MP to temporarily boost up the attacking speed of the equipped spear. It only applies when a spear is in hand.\nRequired Skill : #cAt least Level 5 on Spear Mastery# -1301005 - Pole Arm Booster - [Master Level : 20]\nUses HP and MP to temporarily boost up the attacking speed of the equipped pole arm. It only applies when a pole arm is in hand.\nRequired Skill : #cAt least Level 5 on Pole Arm Mastery# -1301006 - Iron Will - [Master Level : 20]\nTemporarily increases the level of weapon and magic defense on every member of the party around the area. -1301007 - Hyper Body - [Master Level : 30]\nTemporarily increases the Max HP and Max MP of all members of the party around the area.\nRequired Skill : #cAt least Level 3 on Iron Will# -2100000 - MP Eater - [Master Level : 20]\nAbsorbs the enemy's MP when attacking with Magic skills, until it reaches 0. -2101001 - Meditation - [Master Level : 20]\nMeditate for a bit to temporarily boost up the magic attack of party members around the area.\nRequired Skill : #cAt least Level 3 on MP Eater# -2101002 - Teleport - [Master Level : 20]\nUse the arrow keys to teleport to other places in the same map on a set distance. -2101003 - Slow - [Master Level : 20]\nTemporarily slows down the movement of up to 6 monsters. Cannot be used on the same monsters more than twice in a row.\nRequired Skill : #cAt least Level 5 on Teleport# -2101004 - Fire Arrow - [Master Level : 30]\nAttacks a single monster with a fire arrow using the magic power. Applies 1.5 times the damage to the ice-based enemies, whereas fire-based enemies receive half the damage, if that. -2101005 - Poison Breath - [Master Level : 30]\nAttacks a single monster by splashing a Poison drop. With a given success rate, the monster gets temporarily poisoned. -2200000 - MP Eater - [Master Level : 20]\nAbsorbs the enemy's MP when attacking with Magic skills, until it reaches 0. -2201001 - Meditation - [Master Level : 20]\nMeditate for a bit to temporarily boost up the magic attack of party members around the area.\nRequired Skill : #cAt least Level 3 on MP Eater# -2201002 - Teleport - [Master Level : 20]\nUse the arrow keys to teleport to other places in the same map on a set distance. -2201003 - Slow - [Master Level : 20]\nTemporarily slows down the movement of up to 6 monsters. Cannot be used on the same monsters more than twice in a row.\nRequired Skill : #cAt least Level 5 on Teleport# -2201004 - Cold Beam - [Master Level : 30]\nAttacks a single monster with a sharp piece of Ice. The monster will freeze if hit. Damages the fire-based enemies 1.5 times more, where as the ice-based enemies get only half the damage. -2201005 - Thunder Bolt - [Master Level : 30]\nAttacks surrounding monsters with a thunder bolt. All monsters in the range receive damage. -2300000 - MP Eater - [Master Level : 20]\nAbsorbs the enemy's MP when attacking with Magic skills, until it reaches 0. -2301001 - Teleport - [Master Level : 20]\nUse the arrow keys to teleport to other places in the same map on a set distance. -2301002 - Heal - [Master Level : 30]\nRecovers the HP of all party members around the area. The amount of healing depends on the number of people being healed, and the undead monster in the vicinity of this will receive damage. -2301003 - Invincible - [Master Level : 20]\nTemporarily decreases the weapon damage received. It has no effect, however, on the magic attack.\nRequired Skill : #cAt least Level 5 on Heal# -2301004 - Bless - [Master Level : 20]\nTemporarily increases the weapon def., magic def., accuracy, and avoidability of all party members around the area. This cannot be combined with a skill or a potion.\nRequired Skill : #cAt least Level 5 on Invincible# -2301005 - Holy Arrow - [Master Level : 30]\nAttacks a single monster by firing Holy Arrows. Very effective against the undead's or devil-based monsters. -3100000 - Bow Mastery - [Master Level : 20]\nIncreases the bow mastery and accuracy. It only applies when a bow is in hand. -3100001 - Final Attack : Bow - [Master Level : 30]\nStrikes an another, far deadlier blow following the initial attack with a given success rate. It works only when holding a bow.\nRequired Skill : #cAt least Level 3 on Bow Mastery# -3101002 - Bow Booster - [Master Level : 20]\nUses HP and MP to temporarily boost up the attacking speed of the bow. It only works with a bow in hand.\nRequired Skill : #cAt least Level 5 on Bow Mastery# -3101003 - Power Knock-Back - [Master Level : 20]\nIncreases the success rate for pushing off the monsters when swinging a bow. As the level rises, the number of monsters that one can push off with one swing increases. -3101004 - Soul Arrow : Bow - [Master Level : 20]\nTemporarily allows the character to fire bow arrows without using up the arrows. Only works with a bow in hand.\nRequired Skill : #cAt least Level 5 on Bow Booster# -3101005 - Arrow Bomb : Bow - [Master Level : 30]\nFires arrows with bombs attached to it. If struck cleanly, the bomb explodes on the enemy, knocking out some of the enemies around with a certain success rate. Can't attack more than 6 at once, and it only works with a bow in hand. -3200000 - Crossbow Mastery - [Master Level : 20]\nIncreases the crossbow mastery and accuracy. It only applies when a crossbow is in hand. -3200001 - Final Attack : Crossbow - [Master Level : 30]\nStrikes an another, far deadlier blow following the initial attack with a given success rate. It works only when holding a crossbow.\nRequired Skill : #cAt least Level 3 on Crossbow Mastery# -3201002 - Crossbow Booster - [Master Level : 20]\nUses HP and MP to temporarily boost up the attacking speed of the crossbow. It only works with a crossbow in hand.\nRequired Skill : #cAt least Level 5 on Crossbow Mastery# -3201003 - Power Knock-Back - [Master Level : 20]\nIncreases the success rate for pushing off the monsters when swinging a crossbow. As the level rises, the number of monsters that one can push off with one swing increases. -3201004 - Soul Arrow : Crossbow - [Master Level : 20]\nTemporarily allows the character to fire crossbow arrows without using up the arrows. Only works with a crossbow in hand.\nRequired Skill : #cAt least Level 5 on Bow Booster# -3201005 - Iron Arrow : Crossbow - [Master Level : 30]\nAttacks up to 6 monsters at once with a powerful arrow, which penetrates through them. Damage decreases as the arrow flies through. -4100000 - Claw Mastery - [Master Level : 20]\nIncreases the mastery of throwing stars and accuracy, along with the maximum number of throwing stars to recharge. It only applies when the character is throwing stars. -4100001 - Critical Throw - [Master Level : 30]\nEnables the character to make a critical attack with throwing stars on a certain success rate.\nRequired Skill : #cAt least Level 3 on Claw Mastery# -4100002 - Endure - [Master Level : 20]\nRecovers additional amount of HP and MP. -4101003 - Claw Booster - [Master Level : 20]\nUse HP and MP to temporarily boost up the attacking speed of the claw. It only applies when the character is equipped with a claw throwing stars.\nRequired Skill : #cAt least Level 5 on Claw Mastery# -4101004 - Haste - [Master Level : 20]\nTemporarily improves the speed and jumping ability of every member of the party. -4101005 - Drain - [Master Level : 30]\nAbsorb some of the damage dished out to the enemy as HP. The most one can absorb at once is the character's MaxHP / 2, and can't absorb more than the MaxHP of the enemy.\nRequired Skill : #cAt least Level 3 on Endure# -4200000 - Dagger Mastery - [Master Level: 20]\nIncreases the dagger mastery and accuracy. It only applies when the character has a dagger in hand. -4200001 - Endure - [Master Level : 20]\nRecovers additional amount of HP and MP. -4201002 - Dagger Booster - [Master Level : 20]\nUse HP and MP to temporarily boost up the attacking speed of the dagger. Only applies when the character has a dagger in hand. \nRequired Skill : #cAt least Level 5 on Dagger Mastery# -4201003 - Haste - [Master Level : 20]\nTemporarily boosts the speed and jumping ability of everyone in the party. -4201004 - Steal - [Master Level : 30]\nSteals one of the monster's items with a given success rate. It works only once against the same monster. The effort can be continued till its success.\nRequired Skill : #cAt least Level 5 on Haste# -4201005 - Savage Blow - [Master Level : 30]\nUse MP to attack an enemy up to 6 times in a row with a dagger. -1110000 - Improving MP Recovery - [Master Level : 20]\nRecovers MP at a faster rate than the norm every 10 seconds by standing still. -1110001 - Shield Mastery - [Master Level : 20]\nIncreases shield defense. However, it does not affect if the character does not equip the shield. -1111002 - Combo Attack - [Master Level : 30]\nPrepares for combo attack. Combo counter can be used to strike a deadly blow to the monster. Max. for combo counter is 5 and midpoint is 3. -1111003 - Panic : Sword - [Master Level : 30]\n Attack a single monster using dark powers. This skill can only be used when equipped with a sword and the combo all charged up.\nRequired Skill : #cAt least Level 1 on Combo Attack# -1111004 - Panic : Axe - [Master Level : 30]\n Attack a single monster using dark powers. This skill can only be used when equipped with an axe and the combo all charged up.\nRequired Skill : #cAt least Level 1 on Combo Attack# -1111005 - Coma: Sword - [Master Level : 30]\n If struck cleanly, the monster becomes panicked. This skill can only be used when equipped with a sword and the combo all charged up.\nRequired Skill : #cAt least Level 1 on Combo Attack# -1111006 - Coma: Axe - [Master Level : 30]\n If struck cleanly, the monster becomes panicked. This skill can only be used when equipped with an axe and the combo all charged up.\nRequired Skill : #cAt least Level 1 on Combo Attack# -1111007 - Armor Crash - [Master Level : 20]\n Nullifies the defense buff used by the monster with a given success rate.\nRequired Skill : #cAt least Level 3 on Shout# -1111008 - Shout - [Master Level : 30]\nTemporarily stuns up to 6 monsters nearby with damage. -1210000 - Improving MP Recovery - [Master Level : 20]\nRecovering even more MP every 10 sec. -1210001 - Shield Mastery - [Master Level : 20]\nShield Defense increases. However, it does not affect if the character does not equip the shield. -1211002 - Charged Blow - [Master Level : 30]\n Make the enemy stun. You can use this skill only when your combo is charged up. -1211003 - Fire Charge: Sword - [Master Level: 30]\n Temporarily adds an element of fire into the sword. It gets cancelled when the charge blow is used or it simply expires. -1211004 - Flame Charge: BW - [Master Level: 30]\n Temporarily adds an element of fire into the blunt weapon. It gets cancelled when the charge blow is used or it simply expires. -1211005 - Ice Charge: Sword - [Master Level: 30]\n You can attack with ice power. The skill get canceled if you use Charge Blow or if the time runs out. -1211006 - Blizzard Charge: BW - [Master Level: 30]\n Temporarily adds an element of blizzard into the blunt weapon. It gets cancelled when the charge blow is used or it simply expires. -1211007 - Thunder Charge: Sword - [Master Level: 30]\n Temporarily adds an element of thunder into the sword. It gets cancelled when the charge blow is used or it simply expires. -1211008 - Lightning Charge: BW - [Master Level: 30]\n Temporarily adds an element of lightning into the blunt weapon. It gets cancelled when the charge blow is used or it simply expires. -1211009 - Magic Crash - [Master Level : 20]\n Nullifies the magic defense buff used by the monster with a given success rate.\nRequired Skill : #cAt least Level 3 on Charged Blow# -1310000 - Elemental Resistance - [Master Level : 20]\n Gains resistance against all Magic attacks (Fire, Cold, Lightning & Poison.) -1311001 - Spear Crusher - [Master Level : 30]\nAttacks multiple monsters several times by thrusting the spear. -1311002 - Pole Arm Crusher - [Master Level : 30]\nAttacks multiple monsters several times by thrusting the pole arm. -1311003 - Dragon Fury: Spear - [Master Level : 30]\n Attacks up to 6 monsters nearby in relatively distant range by swinging the Spear. -1311004 - Dragon Fury: Pole Arm - [Master Level : 30]\n Attacks up to 6 monsters nearby in relatively distant range by swinging the pole arm. -1311005 - Sacrifice - [Master Level: 30]\n Attacks a single monster while disabling the monster's defending capacity. However, some damage will be done to the attacker him/herself. -1311006 - Dragon Roar - [Master Level : 30]\n Attacks up to 15 monsters at once by temporarily stunning them. It works only when more than 50% of HP is left.\nRequired Skill : #cAt least Level 3 on Sacrifice# -1311007 - Power Crash - [Master Level : 20]\n Nullifies "power-up" skills of multiple monsters with a given success rate.\nRequired Skill : #cAt least Level 3 on Dragon Blood# -1311008 - Dragon Blood - [Master Level : 20]\nIncreases the attacking capacity, but decreases HP steadily until 4 seconds before the remaining HP exhausts. -2110000 - Partial Resistance - [Master Level : 20]\n Gains resistance against Magic attacks of Fire and Poison. -2110001 - Element Amplification - [Master Level : 30]\n Boosts the capacity for all Magic attacks by using additional MP. -2111002 - Explosion - [Master Level : 30]\nAttacks up to 6 surrounding monsters by creating an explosion around the character, using fire-based attacks. -2111003 - Poison Mist - [Master Level : 30]\n Makes a poison fog around the character. Deceases HP of all monsters in the range. -2111004 - Seal - [Master Level : 20]\nTemporarily seals up all surrounding monsters. Once sealed, monsters can't use skills. Does not work against boss-level monsters.\nRequired Skill : #cAt least Level 3 on Element Amplification# -2111005 - Spell Booster - [Master Level : 20]\nUses up a significant amount of HP and MP to increase the attacking speed for spells.\nRequired Skill : #cAt least Level 3 on Element Amplification# -2111006 - Element Composition - [Master Level : 30]\nAttacks a single monster by splashing a Poison drop. With a given success rate, the monster gets temporarily poisoned. -2210000 - Partial Resistance - [Master Level : 20]\n Gains resistance against Magic attacks of Ice and Lightning. -2210001 - Element Amplification - [Master Level : 30]\n Boosts the capacity for all Magic attacks by using additional MP. -2211002 - Ice Strike - [Master Level : 30]\nFires ice blocks at multiple enemies. If struck, all monsters other than ice-based ones will freeze. Cannot attack more than 6 at once. -2211003 - Thunder Spear - [Master Level : 30]\nGathers up the power of lightening and turns it into a spear, attacking a single enemy. Monsters will be damaged with a lightening-based attack. -2211004 - Seal - [Master Level : 20]\nSeals up the enemies around you for a certain amount of time. Once sealed up, the monsters can't use attacking skills, but the skill does not work on boss monsters.\nRequired Skill : #cAt least Level 3 on Element Amplification# -2211005 - Spell Booster - [Master Level : 20]\nUses up a significant amount of HP and MP to increase the attacking speed for spells. -2211006 - Element Composition - [Master Level : 30]\nAttacks a single monster with Magic attack of Ice and Lightning features combined. Very effective to the monsters vulnerable to ice and lightning, and if struck, the monster will freeze. -2310000 - Elemental Resistance - [Master Level : 20]\nGains a higher tolerance for all element-based spell attacks from the enemy. -2311001 - Dispel - [Master Level : 20]\nNullifies all monsters' Magic effects within the targeted area while healing all abnormal conditions suffered by all surrounding party members. -2311002 - Mystic Door - [Master Level : 20]\nCreates a portal that heads to the nearest town. All members of the party can use it multiple times until the portal disappears. Press? to move.\nRequired Skill : #cAt least Level 3 on Dispell# -2311003 - Holy Symbol - [Master Level : 30]\nTemporarily allows all members of the party nearby to gain additional EXP while hunting. It becomes fully effective only when there are more than 2 members of the party around.\nRequired Skill : #cAt least Level 3 on Dispell# -2311004 - Shining Ray - [Master Level : 30]\nAttacks multiple enemies at once with the ray of holy light. Applies massive damage to the undead + devil-based monsters. -2311005 - Doom - [Master Level : 30]\nTurns up to 6 monsters into snails. Changes the look, the attacking capacity, and the speed of movement. Cannot be used against boss-level monsters. -2311006 - Summon Dragon - [Master Level : 30]\nSummons a holy dragon for a certain amount of time. The dragon will stay beside you and attack the enemies in the process. The higher the skill level, the stronger the summoned dragon is. -3110000 - Thrust - [Master Level : 20]\nBoosts up the moving speed. -3110001 - Mortal Blow - [Master Level : 20]\nEnables to shoot monsters within a very close range with a given success rate. Even kills a monster with a single shot every once in a while. -3111002 - Puppet - [Master Level : 20]\nTemporarily summons a puppet, which takes all the attacks from the monsters instead. -3111003 - Inferno - [Master Level : 30]\nUses fire-based arrows to attack up to 6 monsters at once. Only works when equipped with a bow. -3111004 - Arrow Rain - [Master Level : 30]\nFires a number of arrows into the sky, attacking upto 6 monsters at once on its way down. Only available when equipped with a bow.\nRequired Skill : #cAt least Level 5 on Mortal Blow# -3111005 - Silver Hawk - [Master Level : 30]\nSummons a silver hawk. The hawk will be hovering around you, attacking monsters nearby.\nRequired Skill : #cAt least Level 5 on Puppet# -3111006 - Strafe - [Master Level : 30]\nFires 4 arrows at an enemy. -3210000 - Thrust - [Master Level : 20]\nBoosts up the moving speed. -3210001 - Mortal Blow - [Master Level : 20]\nFor a certain rate, allows you to fire crossbow arrows even at a very close range. Even kills a monster with one shot every once in a while. -3211002 - Puppet - [Master Level : 20]\nSummons a puppet (your other self) for a certain amount of time. While the puppet is around, the monsters will attack the puppet, not you. -3211003 - Blizzard - [Master Level : 30]\nUses ice-based arrows to attack up to 6 monsters at once. Only works when equipped with a bow. -3211004 - Arrow Eruption - [Master Level : 30]\nAttacks up to 6 monsters simultaneously by shooting multiple arrows. Only works with a crossbow equipped. -3211005 - Golden Eagle - [Master Level : 30]\nSummons a golden eagle. The eagle will be hovering around you, attacking monsters nearby.\nRequired Skill : #cAt least Level 5 on Puppet# -3211006 - Strafe - [Master Level : 30]\nFires 4 arrows at an enemy. -4110000 - Alchemist - [Master Level : 20]\nIncreases the effect of the recovery-based items like potions and others, and lengthen time for the effect, if the item is based on such. However, items such as Elixir and others that base the recovery in % do not apply in this skill. -4111001 - Meso Up - [Master Level : 20]\nFor a certain amount of time, everyone in the party can make the enemies drop more mesos than usual with this skill. -4111002 - Shadow Partner - [Master Level : 30]\nTemporarily summons a shadow of oneself, repeating every move. There's no real stamina in it, and it will disappear after a while. -4111003 - Shadow Web - [Spider Web : 20]\nCreates a web of shadow of oneself to hold up to 6 monsters. Once stuck, the monsters held in the spiderweb will be unable to move. -4111004 - Shadow Meso - [Master Level : 30]\nAttacks enemies with mesos and the damage is based on the amount of mesos thrown. Nullifies the monsters' "weapon def. up" and "magic guard up." \nRequired Skill : #cAt least Level 5 on Meso Up# -4111005 - Avenger - [Master Level : 30]\nUses MP to make an enormous throwing star for attack. The throwing star will go through an enemy, and attack the ones behind it, too. -4111006 - Flash Jump - [Master Level : 20]\nWhile in the air after a jump, use this skill + the arrow for a second jump. The higher the skill level, the farther the distance for the jump.\nRequired Skill : #cAt least Level 5 on Avenger# -4210000 - Shield Mastery - [Master Level : 20]\nIncreases the def. of the equipped shield. Only works when the shield is equipped. -4211001 - Chakra - [Master Level : 30]\nUses MP to recover HP. Only works when the HP is less than 50%, and it'll stop if either attacked or moved. -4211002 - Assaulter - [Master Level : 30]\nAttacks a single monster with incredible power and speed. The attacked may even be stunned on a low succcess rate. -4211003 - Pickpocket - [Master Level : 20]\nTemporarily increases the amount of mesos dropped off from the attacked monsters. The amount of mesos increases in proportion to the skill level and damage done to the monsters.\nRequired Skill : #cAt least Level 3 on Meso Explosion# -4211004 - Band of Thieves - [Master Level : 30]\nSummons fellow bandits to attack up to 6 monsters around the area. -4211005 - Meso Guard - [Master Level : 20]\nUses mesos to guard 50% of the damage received. Once the skill is used, it saves up a certain amount of mesos, and once damaged from then on out, the mesos will be used based on the damage received. The skill will be turned off when the saved mesos are used up.\nRequired Skill : #cAt least Level 3 on Chakra# -4211006 - Meso Explosion - [Master Level : 30]\nExplodes the mesos dropped on the ground around you to attack monsters. The mesos from the monsters killed by someone else will not be able to be used for this. -9001000 - Haste (Normal) - [Master Level : 1]\n Haste -9001001 - Super Dragon Roar - [Master Level : 1]\n Super Dragon Roar -9001002 - Teleport - [Master Level : 1]\n Teleport -9101000 - Heal + Dispel - [Master Level : 1]\nHeal + Dispel -9101001 - Haste (Super) - [Master Level : 1]\n Haste -9101002 - Holy Symbol - [Master Level : 1]\n Holy Symbol -9101003 - Bless - [Master Level : 1]\n Bless -9101004 - Hide - [Master Level : 1]\n Hide -9101005 - Resurrection - [Master Level : 1]\n Resurrection -9101006 - Super Dragon Roar - [Master Level : 1]\n Super Dragon Roar -9101007 - Teleport - [Master Level : 1]\n Teleport -9101008 - Hyper Body - [Master Level : 1]\nIncrease the Max HP and Max MP for 15 mins. -0001005 - Echo of Hero - [Master Level : 1]\n Increase weapon attack and magic attack on all players around. \n#cTerms between skills : 2hours# -1121000 - Maple Warrior - Increase all players' stats within a party by certain percentage -1121001 - Monster Magnet - Pulls a monster from afar up close. -1121002 - Power Stance - Enables one to stay at the same spot after being struck, resisting knock-back effects. -1120003 - Advanced Combo Attack - By maximizing the potential of the combo attack, it enables one to charge up the combo counter up to 10, and with a given success rate, the combo counter gets charged twice as fast. The Skill can only be obtained by fully mastered Combo Attack. \nRequired skill : #cCombo attack level 30# -1120004 - Achilles - Permanently increases the weapon defense of one's armor -1120005 - Guardian - Blocks the monster's attack by using the shield with a given success rate. Additionally, if the close-range attack is blocked, the attacking monster will be stunned for 2 seconds. The skill only works when equipped with a shield -1121006 - Rush - Makes a mad dash forward, pushing off up to 10 monsters. -1121008 - Brandish - Enables one to attack multiple monsters forward twice -1121010 - Enrage - Temporarily increases the attacking ability by using up the 10 combo counters. -1121011 - Hero's Will - Enables one to shrug off abnormal conditions. The higher the skill level, the more types of abnormal conditions one can nullify. -1221000 - Maple Warrior - Increase all players' stats within a party by certain percentage -1221001 - Monster Magnet - Pulls a monster from afar up close. -1221002 - Power Stance - Enables one to stay at the same spot after being struck, resisting knock-back effects. -1221003 - Holy Charge : Sword - Temporarily adds a holy element to the sword. The skill gets cancelled when the charge blow is used or expires. -1221004 - Divine Charge : BW - Temporarily adds a divine element to the blunt weapon. The skill gets cancelled when the charge blow is used or expires. -1220005 - Achilles - Permanently increases the weapon defense of one's armor -1220006 - Guardian - Blocks the monster's attack by using the shield with a given success rate. Additionally, if the close-range attack is blocked, the attacking monster will be stunned for 2 seconds. The skill only works when equipped with a shield -1221007 - Rush - Makes a mad dash forward, pushing off up to 10 monsters. -1221009 - Blast - Strikes a single, tremendous blow to a single monster. -1220010 - Advanced Charge - Increases the damage incurred when using Charge Blow. With a given success rate, the charge does not expire even after the initial Charge Blow. -1221011 - Heaven's Hammer - Strikes the ground with a huge hammer to attack up to 15 monsters. The skill works when charged up in a Holy Charge. -1221012 - Hero's Will - Enables one to shrug off abnormal conditions. The higher the skill level, the more types of abnormal conditions one can nullify. -1321000 - Maple Warrior - Increase all players' stats within a party by certain percentage -1321001 - Monster Magnet - Pulls a monster from afar up close. -1321002 - Power Stance - Enables one to stay at the same spot after being struck, resisting knock-back effects. -1321003 - Rush - Makes a mad dash forward, pushing off up to 10 monsters. -1320005 - Achilles - Permanently increases the weapon defense of one's armor -1320006 - Berserk - Increases overall attack once the knight's HP drops below a certain level. However, the additional attack boost is nullified once HP recovers back past that level. -1321007 - Beholder - Temporarily summons Beholder. With the Beholder's incredible powers, the knight's weapon mastery permanently increases. -1320008 - Aura of the Beholder - The black spirit periodically restores the Dark Knight's HP. The amount of healing increases as the skill level rises. -1320009 - Hex of the Beholder - The black spirit periodically buffs the Dark Knight. Buff type depends on skill level. -1321010 - Hero's Will - Enables one to shrug off abnormal conditions. The higher the skill level, the more types of abnormal conditions one can nullify. -2121000 - Maple Warrior - Increase all players' stats within a party by certain percentage -2121001 - Big Bang - Gathers up numerous particles from the surrounding area to form an energy vortex, culminating in a powerful explosion. -2121002 - Mana Reflection - By drawing an incredible inner strength, enables one to reverse the flow of Mana back to the monster, returning the damage received from the monster. The returned damage cannot exceed 20% of maxHP of the monster. -2121003 - Fire Demon - Provides consistent damage to a monster using a ball of fire from the Fire Demon. Monsters stricken by Fire Demon become vulnerable to ice-based attacks. -2121004 - Infinity - Enables one to temporarily draw magic powers from sources surrounding the mage and use it in place of one's own MP. -2121005 - Elquines - Calls upon the Elquines familiar, who is ice-based. Attacks up to 3 monsters.\nRequired skill : #cFire Demon level 5 and above# -2121006 - Paralyze - Temporarily paralyzes the monster with a poison-based attack. -2121007 - Meteor Shower - Summons meteors from outer space to shower the ground, striking up to 15 monsters at once. Incurs tremendous fire-based damages to those struck. -2121008 - Hero's Will - Enables one to shrug off abnormal conditions. The higher the skill level, the more types of abnormal conditions one can nullify. -2221000 - Maple Warrior - Increase all players' stats within a party by certain percentage -2221001 - Big Bang - Gathers up numerous particles from the surrounding area to form an energy vortex, culminating in a powerful explosion. -2221002 - Mana Reflection - By drawing on incredible inner strength, enables one to reverse the flow of Mana back to the monster, returning the damage received from the monster. The returned damage cannot exceed 20% of maxHP of the monster. -2221003 - Ice Demon - Provides consistent damage to a monster using ice pieces from Ice Demon. Monsters stricken by Ice Demon become vulnerable to fire-based attacks. -2221004 - Infinity - Enables one to temporarily draw magic powers from sources surrounding the mage and use it in place of one's own MP. -2221005 - Ifrit - Calls upon the Ifrit familiar, who is fire-based. Attacks up to 3 monsters. -2221006 - Chain Lightning - Attacks a single monster using a high-voltage lightning attack. If struck, monsters around the affected monster will receive damage as well. -2221007 - Blizzard - Summons spears of ice from the sky, showering up to 15 monsters at one time with a nasty blizzard. Incurs tremedous ice-based damages to the attacked. -2221008 - Hero's Will - Enables one to shrug off abnormal conditions. The higher the skill level, the more types of abnormal conditions one can nullify. -2321000 - Maple Warrior - Increase all players' stats within a party by certain percentage -2321001 - Big Bang - Gathers up numerous particles from the surrounding area to form an energy vortex, culminating in a powerful explosion. -2321002 - Mana Reflection - By drawing on incredible inner strength, enables one to reverse the flow of Mana back to the monster, returning the damage received from the monster. The returned damage cannot exceed 20% of maxHP of the monster. -2321003 - Bahamut - Temporarily summons Bahamut, a holy dragon. Attacks up to 3 monsters..\nRequired skill : #cSummon Dragon level 15 and above# -2321004 - Infinity - Enables one to temporarily draw magic powers from sources surrounding the mage and use it in place of one's own MP. -2321005 - Holy Shield - Temporarily protects all party members from abnormal conditions. -2321006 - Resurrection - Resurrects a member instantly. -2321007 - Angel Ray - Attacks a single monster with a holy arrow, incurring tremendous holy damage. -2321008 - Genesis - A holy ray of light shines down from the sky, burning up to 15 monsters at one time. Incurs tremendous holy damage to the targets. -2321009 - Hero's Will - Enables one to shrug off abnormal conditions. The higher the skill level, the more types of abnormal conditions one can nullify. -3121000 - Maple Warrior - Increase all players' stats within a party by certain percentage -3121002 - Sharp Eyes - Grants party members the ability to locate enemy weaknesses, and in turn inflict more damage by exploiting them. -3121003 - Dragon's Breath - Drawing upon the spirit of the dragon, fires a powerful arrow of tremendous force that will knock back the target a long distance. -3121004 - Hurricane - Fires away arrows at a tremendous speed, as chaotic as a nasty rainstorm. -3120005 - Bow Expert - Increases the bow mastery as well as weapon attack. Only applied with a bow equipped. -3121006 - Phoenix - Temporarily summons the Phoenix, who is a fire-based ally. Attacks up to 4 monsters. -3121007 - Hamstring - Attacks a monster's leg with a given success rate, slowing it down tremendously in the process -3121008 - Concentrate - Temporarily increases weapon attack, while simultaneously decreases skill-based MP usage.\n#c Terms between skills : 6 Minutes# -3121009 - Hero's Will - Enables one to shrug off abnormal conditions. The higher the skill level, the more types of abnormal conditions one can nullify. -3221000 - Maple Warrior - Increase all players' stats within a party by certain percentage -3221001 - Piercing Arrow - Fires a special arrow that penetrates through monsters. The arrow's power increases with each monster it pierces, inflicting more damage to each consecutive monster. -3221002 - Sharp Eyes - Grants party members the ability to locate enemy weaknesses, and in turn inflict more damage by exploiting them. -3221003 - Dragon's Breath - Drawing upon the spirit of the dragon, fires a powerful arrow of tremendous force that will knock back the target a long distance. -3220004 - Marksman Boost - Increases the crossbow mastery as well as weapon attack. Only applied with a crossbow equipped. -3221005 - Frostprey - Temporarily summons the Frostprey, an ice-based hawk. Attacks up to 4 monsters. -3221006 - Blind - Delivers a blinding strike that impairs a monster's vision with a certain success rate, decreasing its accuracy. -3221007 - Snipe - Delivers a lethal blow to a monster by aiming for its weak spot. -3221008 - Hero's Will - Enables one to shrug off abnormal conditions. The higher the skill level, the more types of abnormal conditions one can nullify. -4121000 - Maple Warrior - Increase all players' stats within a party by certain percentage -4120002 - Shadow Shifter - With great reflexes, enables one to avoid the monster's attack. -4121003 - Taunt - Provokes a monster, causing its general defense to increase. As a result, EXP earned and drop rate for items will increase for this monster. -4121004 - Ninja Ambush - For a set period of time, a group of ninjas hiding around the bushes will periodically ambush up to 6 monsters at once. : #cShadow Shifter level 5 and above# -4120005 - Venomous Star - Throws a star that's been smeared with poison; the monster struck has a chance of being poisoned. Usable up to 3 times against each monster. -4121006 - Shadow Stars - Attacks a monster using 200 stars out of the currently equipped star. Allows an infinite number of stars to be thrown for a short period of time. -4121007 - Triple Throw - Attacks one monster by simultaneously throwing 3 stars. -4121008 - Ninja Storm - Summons ninjas to push back surrounding monsters. -4121009 - Hero's Will - Enables one to shrug off abnormal conditions. The higher the skill level, the more types of abnormal conditions one can nullify. -4221000 - Maple Warrior - Increase all players' stats within a party by certain percentage -4221001 - Assassinate - Strikes an unsuspecting monster at its vital spots 4 times. The last strike can be lethal with a given success rate. Only works with Dark Sight enabled. -4220002 - Shadow Shifter - With great reflexes, enables one to avoid the monster's attack. -4221003 - Taunt - Provokes a monster, causing its general defense to increase. As a result, EXP earned and drop rate for items will increase for this monster. -4221004 - Ninja Ambush - For a set period of time, a group of ninjas hiding around the bushes will periodically ambush up to 6 monsters at once. : #cShadow Shifter level 5 and above# -4220005 - Venomous Stab - Stab a monster with a dagger that's been smeared with poison; the monster struck has a chance of being poisoned. Usable up to 3 times against each monster. -4221006 - Smokescreen - Sets off a smoke grenade to escape from a tight situation. All members of the party in the vicinity of smoke will not receive damage while the smokescreen is up. -4221007 - Boomerang Step - With great quickness, stabs multiple monsters TWICE. Under the set success rate, the monsters attacked will be stunned. -4221008 - Hero's Will - Enables one to shrug off abnormal conditions. The higher the skill level, the more types of abnormal conditions one can nullify. -0001006 - Jump Down - [Master Level : 1]nJump downward. -5000000 - Bullet Time - [Master Level : 20]\nIncreases accuracy and avoidability. -5001001 - Flash Fist - [Master Level : 20]\nUses MP to speed up the punch to rapidly attack enemies. -5001002 - Sommersault Kick - [Master Level : 20]\nA devastating kick that accompanies a backward sommersault. Attacks all enemies in the vicinity. -5001003 - Double Shot - [Master Level : 20]\nFires two bullets at once to apply double damage to monsters. -5001005 - Dash - [Master Level : 10]\nPress left or right arrow twice to temporarily boost your speed and jump. -5100000 - Improve MaxHP - [Master Level : 10]\nApply AP to MaxHP to improve the rate of increase for MaxHP. -5100001 - Knuckler Mastery - [Master Level : 20]\nBoosts the accuracy and the mastery of Knucklers. This skill only applies when you equip a Knuckler. -5101002 - Backspin Blow - [Master Level : 20]\nThis skill allows you to quickly slide back and elbow multiple monsters at once to apply damage and temporarily stun them. -5101003 - Double Uppercut - [Master Level : 20]\nA quick round of two punches to apply damage and temporarily stun a monster. -5101004 - Corkscrew Blow - [Master Level : 20]\nThis skill allows you to run forward and punch multiple monsters in front at once. -5101005 - MP Recovery - [Master Level : 10]\nRecovers MP by using up a bit of HP. -5101006 - Knuckler Booster - [Master Level : 20]\nUses parts of HP and MP to temporarily boost the speed of a Knuckler. This skill can only be triggered when a Knuckler is equipped. \nRequired Skill : #cLevel 5 or above on Knuckler Mastery -5101007 - Oak Barrel - [Master Level : 10]\nThis skill will allow you to safely navigate your way through monsters without being recognized by them...by donning an Oak Barrel. Some clever monsters may be able to tell, though, so be careful. If you are lying down, it's literally impossible to tell the difference! -5200000 - Gun Mastery - [Master Level : 20]\nBoosts the accuracy and the mastery of your Guns. This skill only applies when you equip a Gun. -5201001 - Invisible Shot - [Master Level : 20]\nAttacks multiple monsters by quickly firing a few bullets, so fast that the naked eye can't see the shooting. -5201002 - Grenade - [Master Level : 20]\nAttacks a monster by throwing a grenade. The distance the grenade travels depends on how long you press the skill key. -5201003 - Gun Booster - [Master Level : 20]\nUses parts of HP and MP to temporarily boost the firing speed of the Gun.This skill can only be triggered when the Gun is equipped. \nRequired Skill : #cLevel 5 or above on Gun Mastery -5201004 - Blank Shot - [Master Level : 20]\nThis skill allows you to pretend shooting a gun, faking out the monsters, and instead of firing bullets, it'll fire a flag. This will temporarily stun up to 3 monsters. -5201005 - Wings - [Master Level : 10]\nAllows for a longer, more sustained jump than a regular jump. -5201006 - Recoil Shot - [Master Level : 20]\nUses the recoil of the gun to run back after a gunshot. \nRequired Skill : #cLevel 5 or above on Wings# -5110000 - Stun Mastery - [Master Level : 20]\nWhen attacking a monster that's stunned, the critical attack will be triggered at a set rate. -5110001 - Energy Charge - [Master Level : 40]\nA set amount of energy is charged after every attack. When the energy is fully charged, this will automatically trigger the effects of the Body Attack and Stance will be triggered at a specific rate. This will allow you to use energy-related skills. -5111002 - Energy Blast - [Master Level : 30]\nBlasts a ball of energy to attack multiple monsters at once. This skill can only be used when #cthe energy is fully charged#.\nRequired Skill : #cLevel 1 of Energy Charge# -5111004 - Energy Drain - [Master Level : 20]\nUses energy to convert the lost HP of a monster into your own HP. This skill can only be used when #cthe energy is full charged#.\nRequired Skill : #cLevel 1 of Energy Charge# -5111005 - Transformation - [Master Level : 20]\nTransforms you into a more powerful state for 120 seconds. \nSkills available : Changes have been made so that while using the Buccaneer skill, Transform, you can now use all skills besides the Oak Barrel, Double Fire, Demolition and Snatch. -5111006 - Shockwave - [Master Level : 30]\nStrikes the ground with tremendous force, affecting multiple monsters. This skill can only be used during #cTransformation or Super Transformation#.\nRequired Skill : #cLevel 1 of Transformation# -5210000 - Burst Fire - [Master Level : 20]\nIncreases the potency and the number of bullets fired when using Double Shot.\nRequired Skill : #cLevel 20 of Double Shot# -5211001 - Octopus - [Master Level : 30]\nSummons a loyal octopus that'll aid your attacks. The summoned octopus will not move, however.\n#cWaiting time until the next summon : 10 sec# -5211002 - Gaviota - [Master Level : 30]\nSummons Gaviota, who's trained to throw a grenade at monsters. The summoned Gaviota will seek a monster, and when it finds one, it'll toss the grenade and disappear. \n#cWaiting time : 5 sec.# -5211004 - Flamethrower - [Master Level : 30]\nAttacks a monster nearby with a fire-based attack. The affected monster will keep receiving damage for a short period of time. -5211005 - Ice Splitter - [Master Level : 30]\nAttacks the closest monster with an ice-based attack. The affected monster will be frozen for a short period of time. -5211006 - Homing Beacon - [Master Level : 30]\nSends a parrot that'll mark a target on a monster. From then on out, all attacks will be focused on that monster. -5121000 - Maple Warrior - Increase all players' stats within a party by certain percentage -5121001 - Dragon Strike - Summons a sleeping dragon from the depths of the ground to apply damage to a number of monsters. -5121002 - Energy Orb - Uses a blast of powerful energy to strike a monster. If there are other monsters around the affected monster, they will also be affected by this potent ball of energy. Only available when the #cenergy is fully charged#.\nRequired Skill : #cLevel 1 of Ener -5121003 - Super Transformation - Increases power to extreme levels for 120 seconds. \nAvailable skills : Changes have been made so that while using the Viper skill, Super Transform, you can now use all skills excluding the Oak Barrel and the Double Fire. \nRequired Skill : #cLevel 20 of Transformation# -5121004 - Demolition - Apply a significant damage to a single monster by attacking it in a blinding speed. Only available when under a state of #cSuper Transformation#.\nRequired Skill : #cLevel 1 of Super Transformation# -5121005 - Snatch - Applies damage to a monster that's far away, and drags it right in front of you. Only available when under a state of #cSuper Transformation#.\nRequired Skill : #cLevel 1 of Super Transformation# -5121007 - Barrage - Attacks a monster nearby 6 times in quick succession. -5121008 - Pirate's Rage - Allows you to break out of an abnormal state. As its level increases, the number of abnormal states that can be broken out increases. \n#cWaiting time : 10 min.# -5121009 - Speed Infusion - Uses HP and MP to temporarily increase the attacking speed of a weapon. This can be combined with other boosters, and everyone in the party will have their attacking speed increased.\nRequired Skill : #cLevel 20 of Knuckle Booster# -5121010 - Time Leap - Resets the waiting time for skills for yourself and everyone in the party. This does not reset the waiting time for Time Leap. -5221000 - Maple Warrior - Increase all players' stats within a party by certain percentage -5220001 - Elemental Boost - Increases the potency of Flamethrower and Ice Splitter. -5220002 - Wrath of the Octopi - An additional octopus is summoned, increasing the fire rate and the damage.\nRequired Skill : #cLevel 30 of Octopus# -5221003 - Aerial Strike - Uses the grenade attack of Gaviota to damage up to 6 monsters. \nRequired Skill : #cLevel 15 of Gaviota# -5221004 - Rapid Fire - Fires rounds of bullets very quickly. Hold on to the skill key for continued shooting.\nRequired Skill : #cLevel 20 of Burst Fire# -5221006 - Battleship - Calls forth a ship that you can mount and launch attacks from. The durability of the ship decreases per damage received, and when it reaches 0, you will not be able to get back on board for a short period of time. \nAvailable Skills : Battleship skills, Grenades, Gun Booster, Flamethower. -5221007 - Battleship Cannon - Rapidly fires a number of cannonballs. Only available when aboard the Battleship.\nRequired Skill : #cLevel 1 of Battleship# -5221008 - Battleship Torpedo - Fires a hardened cannonball that goes through monsters. Only available when aboard the Battleship.\nRequired Skill : #cLevel 1 of Battleship# -5221009 - Hypnotize - Hypnotizes monsters to temporarily make it attack other monsters instead of you. -5221010 - Speed Infusion - Uses HP and MP to temporarily increase the attacking speed of a weapon. This can be combined with other boosters, and everyone in the party will be positively affected by this.\nRequired Skill : #cLevel 20 of Knuckler Booster# -5220011 - Bullseye - Applies more damage to monsters under the effect of Homing Beacon.\nRequired Skill : #cLevel 30 of Homing Beacon# -0001009 - Bamboo Rain - An attack using a bamboo stick. -0001010 - Invincibility - You become invincible for a fixed amount of time. -0001011 - Power Explosion - Increased damage rate for a fixed amount of time. -8001000 - ??? ??? - [??? ?? : 1]\n???? ???? ???? ???? ??? ???? ????. -8001001 - ???? - [??? ?? : 1]\n?, ?, ?, ? ???? ???? ?? ? ?? ?? ??? ?? ???? ??? ? ??. -11001002 - Power Strike - [Master Level : 20]\nInflict damage on the opponent using the weapon with which the character used MP to equip. -11001003 - Slash Blast - [Master Level : 20]\nInflict damage on all nearby opponents using the weapon with which the character used HP and MP to equip.\nRequired Skill : #cAt least Level 1 on Power Strike# -11101003 - Rage - [Master Level : 20]\nTemporarily enhances the Weapon Attack rate of everyone in the party nearby, while decreasing the rate of Weapon Defense. -13111001 - Strafe - [Master Level : 30]\nFires 4 arrows at a single enemy. -15111007 - Shark Wave - [Master Level : 30]\nAttack multiple monsters in front. -15100000 - Improve MaxHP - [Master Level : 10]\nThis skill boosts up the amount of increase on MaxHP after each Level UP, or AP used on MaxHP. -15100001 - Knuckle Mastery - [Master Level : 20]\nBoosts the accuracy and the mastery of Knuckles. This skill only applies when you equip a Knuckle. -15101002 - Knuckle Booster - [Master Level : 20]\nUses parts of HP and MP to temporarily boost the speed of a Knuckle. This skill can only be triggered when a Knuckle is equipped. \nRequired Skill : #cLevel 5 or above on Knuckle Mastery -15101003 - Corkscrew Blow - [Master Level : 20]\nThis skill allows you to run forward and punch multiple monsters in front at once. -15100004 - Energy Charge - [Master Level : 20]\nA set amount of energy is charged after every attack. When the energy is full charged, this will automatically trigger the effects of the Body Attack and Stance, and will allow you to use energy-related skills. -15101005 - Energy Blast - [Master Level : 20]\nBlasts a ball of energy to attack multiple monsters at once. This skill can only be used when #cthe energy is full charged#.\nRequired Skill : #cLevel 1 of Energy Charge# -15101006 - Lightning Charge - [Master Level : 20]\nKnuckle will be empowered with lightning element for certain period of time. -15110000 - Critical Punch - [Master Level : 20]\nCritical attack available at certain rate. -15111001 - Energy Drain - [Master Level : 20]\nUses energy to convert the lost HP of a monster into your own HP. This skill can only be used when #cthe energy is full charged#.\nRequired Skill : #cLevel 1 of Energy Charge# -15111002 - Transformation - [Master Level : 10]\nTransforms you into a more powerful state for 120 seconds. -15111003 - Shockwave - [Master Level : 20]\nStrikes the ground with tremendous force, affecting multiple monsters. This skill can only be used during #cTransformation#.\nRequired Skill : #cLevel 1 of Transformation# -15111004 - Barrage - [Master Level : 20]\nAttacks a monster nearby 6 times in quick succession. -15111005 - Speed Infusion - Uses HP and MP to temporarily increase the attacking speed of a weapon. This can be combined with other boosters, and everyone in the party will have their attacking speed increased.\nRequired Skill : #cLevel 20 of Knuckle Booster# -15111006 - Spark - [Master Level : 20]\nMake additional attack by the power of lightning fairy. Monsters around the monster that is attacked will get damage at the same time. -14111005 - Triple throw - [Master Level : 20]\nAttacks monsters by throwing 3 stars at once. -14111006 - Poison Bomb - [Master Level : 30]\nThrows a bomb that generates a poisonous cloud. Monsters within the range of the poisonous cloud will continuously incur damage. -15000000 - Quick Motion - [Master Level : 10]\nIncreases accuracy and avoidability. -15001001 - Straight - [Master Level : 20]\nUses MP to speed up the punch to rapidly attack enemies. -15001002 - Somersault Kick - [Master Level : 20]\nA devastating kick that accompanies a backward somersault. Attacks all enemies in the vicinity. -15001003 - Dash - [Master Level : 10]\nPress left or right arrow twice to temporarily boost your speed and jump. -15001004 - Lightning - [Master Level : 20]\nSummon guardian fairy and attack monsters in the close distance. -13100000 - Bow Mastery - [Master Level : 20]\nEnhnaces Mastery and Accuracy of bow-type weapons. It only applies when the bow is in hand. -13101001 - Bow Booster - [Master Level : 20]\nEnhances the Speed of bow attack for a given duration using HP and MP. It only applies when the bow is in hand. \nRequired Skill : #c At least Level 5 on Bow Mastery # -13101002 - Final Attack - [Master Level : 30]\nConsecutive attack is activated by using a pre-established amount of MP after applying the attack skill at a regular interval. It only applies when the bow is equipped in hand. \nRequired Skill : #c At least Level 3 on Bow Mastery # -13101003 - Soul Arrow - [Master Level : 20]\nTemporarily allows the character to fire crossbow arrows without using up the arrows. It only applies when the crossbow is equipped in hand.\nRequired Skill : #c At least Level 5 on Bow Booster # -13100004 - Thrust - [Master Level : 20]\nEnhances Speed. -13101005 - Storm Break - [Master Level : 20]\nCast Damage to monsters in a close distance and Knock-back to far away. -13101006 - Wind Walk - [Master Level : 10]\nTemporarily hides one�s self from the monsters. Attacking an opponent in the state of Wind Walk can inflict additional damage. -13111000 - Arrow Rain - [Master Level : 20]\nFires a number of arrows into the sky, attacking up to 6 monsters at once. It can only be applied when the character is equipped with a bow. -13111002 - Hurricane - [Master Level : 20]\nLaunches arrows at a tremendous speed like a catastrophic rainstorm. Pressing the skill key will launch the arrows continuously. -13110003 - Bow Expert - [Master Level : 20]\nEnhances Mastery and Attack Rate of bow-type weapons. It can only be applied when the character is equipped with a bow. \nRequired Skill: #c Bow Mastery level 20 # -13111004 - Puppet - [Master Level : 20]\nSummons a Puppet (a doppelganger) for a given duration. When the Puppet is summoned, the monsters will attack the Puppet instead of the actual character. -13111005 - Eagle Eye - [Master Level : 10]\nTransforms into Eagle Eye, a heroic figure who was able to use his bow more freely and skillfully than anyone else for 120 sec. This will enhance the character's Speed and Jump stats and allow the character to use the exclusive skills of Eagle Eye. -13111006 - Wind Piercing - [Master Level : 20]\nInflicts a significant damage on multiple monsters at once with a single powerful blow. Available only during the character�s transformed state of Eagle Eye. \nRequired skill : #cEagle Eye over level 1# -13111007 - Wind Shot - [Master Level : 20]\nFires 3 arrows to inflict damage on monsters. Available only during the character�s transformed state of Eagle Eye. \nRequired skill : #cEagle Eye over level 1# -14000000 - Nimble Body - [Master Level : 10]\nIncreases accuracy and avoidability. -14000001 - Keen Eyes - [Master Level : 8]\nIncreases the range of attack for throwing weapons such as the Throwing Stars and Knives.\nRequired Skill : #cAt least Level 3 on Nimble Body# -14001002 - Disorder - [Master Level : 10]\nTemporarily decreases the enemy�s Weapon Attack and Defense, eventually disabling the monster�s attack. It cannot be used on the same monster repeatedly. -14001003 - Dark Sight - [Master Level : 10]\nUses MP to hide behind the shadows. With this skill activated, the character can neither attack nor be attacked.\nRequired Skill : #c At least Level 3 on Disorder # -14001004 - Lucky Seven - [Master Level : 20]\nUses MP to throw 2 Throwing Stars and inflict damage according to the LUK stats regardless of the character's level of Claw Mastery. -14001005 - Darkness - [Master Level : 20]\nSummons the Guardian Fairy to attack monsters nearby. -14100000 - Claw Mastery - [Master Level : 20]\nIncreases the character�s skill in using the Throwing Stars, and enhances the max number of charges. It only applies when the character is equipped with Throwing Stars. -14100001 - Critical Throw - [Master Level : 30]\nEnables Critical Attack with Throwing Stars at a pre-established success rate.\nRequired Skill: #c At least Level 3 on Claw Mastery # -14101002 - Claw Booster - [Master Level : 20]\nUse HP and MP to temporarily boost up the attack speed of the claw. It only applies when the character is equipped with a claw Throwing Stars.\nRequired Skill : \n#cAt least Level 5 on Claw Mastery# -14101003 - Haste - [Master Level : 20]\nTemporarily enhances Speed and Jump stats of every member in the party. -14101004 - Flash Jump - [Master Level : 20]\n[Master Level : 20]\nAllows a second Jump toward the direction which the character was headed when used while the character is in the air. The distance of the Jump increases in accordance with the advancement of the character�s skill level. -14100005 - Vanish - [Master Level : 10]\nInflicts additional damage on monsters when used while Dark Sight is activated. Dark Sight deactivates as soon as this skill is applied. \nRequired skill : #cDark Sight over level 10# -14101006 - Vampire - [Master Level : 20]\nCan attack multiple monsters 4 times and partially consumes the damage to recover HP. No more than � of the character�s max HP and the Monster�s max HP can be consumed. -14111000 - Shadow Partner - [Master Level : 30]\nSummons a shadow, which repeats the character�s every move, for a given duration. It has no special strength. -14111001 - Shadow Web - [Master Level : 20]\nMakes a spider web of the character�s shadow, and holds up to 6 enemies in one spot at once. Mobility of the monsters caught in the spider web will be disabled. -14111002 - Avenger - [Master Level : 30]\nUses MP to make an enormous Throwing Star for attack. The Throwing Star will penetrate the enemy, and attack the ones behind it, too. -14110003 - Alchemist - [Master Level : 20]\nEnhances the effects of recovery items including potions or lengthens the duration of items applied to the status of the character, with an exception of recovery items such as the Elixir that provide recovery based on %. -14110004 - Venom - [Master Level : 20]\nThrows a poisonous Throwing Star. Monsters that have been struck will be poisoned according to the pre-established success rate. It can be used against one monster up to 3 times during which the monster's HP will not go any lower than 1. -11101004 - Soul Blade - [Master Level : 30]\nTransforms invisible Soul into visible form and inflicts damage on an enemy. -11101005 - Soul Rush - [Master Level : 10]\nReceives the power of Soul, which allows the character to instantaneously move at a fast speed. -11110000 - MP Recovery Rate Enhancement - [Master Level : 20]\nCan recover more MP every 10 sec. -11111001 - Combo Attack - [Master Level : 20]\nCan build up one�s Comb Attack. The Finish Attack is enabled when the Combo Counter increases every time the attack is used. The Max Combo Counter is 5 and the standard Damage inflicted is when the Combo Counter is at 3. -11111002 - Panic - [Master Level : 20]\nAttacks a single enemy. It is only available when the Sword is equipped and the Combo Counter is activated.\nRequired Skill: #cCombo Attack higher than level 1.# -11111003 - Coma - [Master Level : 20]\nPut monsters nearby in coma. Only available when the Sword is equipped and Combo Counter is activated : #cCombo Attack higher than level 1 required.# -11111004 - Brandish - [Master Level : 30]\nEnables two attacks on multiple monsters nearby. -11110005 - Advanced combo - [Master Level : 20]\nIncreases max Combo Counter stats to 10 and charges 2 Combo Counts at a pre-established rate. It only applies when the Combo Attack is mastered. \nRequired Skill: #cCombo Attack Lv.20# -11111006 - Soul Driver - [Master Level : 30]\nAttacks multiple monsters 4 times at once via the power of Soul. -11111007 - Soul Charge - [Master Level : 20]\nEmpower the sword with sanctity attribute for a given duration. -12000000 - Increasing Max MP. - [Master Level : 10]\nIncreases the Max MP when AP is applied to Max MP at the time of Level Up. -12001001 - Magic Guard - [Master Level : 10]\nTemporarily replaces damage with MP instead of HP. If MP reaches 0, the HP takes a full hit. -12001002 - Magic Armor - [Master Level : 10]\nTemporarily enhances the Weapon Def. of the armor by applying magic for a given duration.\nRequired Skill : \n#cAt least Level 3 on Magic Guard# -12001003 - Magic Claw - [Master Level : 20]\nUse MP to attack an enemy twice. -12001004 - Flame - [Master Level : 20]\nSummon the Guardian Fairy to attack monsters nearby. -12101000 - Meditation - [Master Level : 20]\nTemporarily enhances the Magic Attack of all party members nearby by Meditation. -12101001 - Slow - [Master Level : 20]\nTemporrily slows down the enemies around you. Can't use it on them twice at once, and affects only 6 enemies per say.\nRequired Skill : \n#cAt least Level 5 on Teleport# -12101002 - Fire Arrow - [Master Level : 20]\nA Fire Arrow is generated using magic and is shot at an enemy. It is especially effective on enemies with ice attribute. -12101003 - Teleport - [Master Level : 20]\nCan move a pre-established distance to other locations within the map using the arrow keys. -12101004 - Spell Booster - [Master Level : 20]\nConsumes a significant amount of HP and MP to enhance the speed of Magic Attack. -12101005 - Elemental Reset - [Master Level : 20]\nMake all Elemental Attack to Non-elemental Attack for a given duration. -12101006 - Fire Pillar - [Master Level : 20]\nInflicts fire damage on nearby monster. It can be applied to attack up to 6 monsters. -12110000 - Elemental Resistance - [Master Level : 20]\nGains a higher tolerance for all Elemental Attacks from the enemy. -12110001 - Element Amplification - [Master Level : 20]\nIncrease all Magic Attacks by using more MP. -12111002 - Seal - [Master Level : 20]\nSeals multiple enemies nearby for a given duration. Once sealed, the monsters will not be able to use their skills to attack. This does not apply to the Boss Monsters. \nRequired Skill : #c At least Level 3 on Element Amplification # -12111003 - Meteor Shower - [Master Level : 20]\nInflicts significant fire damages on up to 15 monsters at once via the meteor shower. -12111004 - Ifrit - [Master Level : 20]\nTemporarily summons Ifrit of Fire Attribute for a given duration. Attacks up to 3 monsters. -12111005 - Flame Gear - [Master Level : 30]\n Temporarily creates a wall of fire near the character for a given duration. The monsters inside the wall continuously receive damage. -12111006 - Fire Strike - [Master Level : 30]\nThrow huge fireball to attack up to 6 monsters. -13000000 - Critical Shot - [Master Level : 20]\nEnables Critical Attack at a pre-established success rate. -13000001 - The Eye of Amazon - [Master Level : 8]\nIncreases the range of attack for bows and crossbows. -13001002 - Focus - [Master Level : 10]\nEnhances Accuracy and Avoidability for a given duration. \nRequired Skill : #c At least Level 3 on the Eye of Amazon # -13001003 - Double Shot - [Master Level : 20]\nAttacks an enemy twice using two arrows at once. -13001004 - Storm - [Master Level : 20]\nSummon the Guardian Fairy to attack monsters nearby. -11001004 - Soul - [Master Level : 20]\nSummons a Fairy who attacks enemies within a given range. -11100000 - Sword Mastery - [Master Level : 20]\nIncreases the Sword Mastery and Accuracy. It only applies when either a one-handed or a two-handed Sword is in hand. -11101001 - Sword Booster - [Master Level : 20]\nUses HP and MP to temporarily boost the attack speed of the Sword. It only applies when either a one-handed or a two-handed Sword is in hand.\nRequired Skill : \n#cAt least Level 5 on Sword Mastery# -11101002 - Final Attack - [Master Level : 30]\nEnables consecutive attacks when an attack skill is applied at a regular interval and pre-established amount of MP is used. It only applies when a one-handed or a two-handed Sword is in hand. \nRequired Skill : #c At least Lv.3 on Sword Mastery# -10000018 - Follow the Lead - Allows one to lead up to 3 pets at once. (Passive skill) -10001000 - Three Snails - [Master Level : 3]\nHurls snail shells to attack monsters from long distance. -10001001 - Recovery - [Master Level : 3]\nEnables the user to recover HP constantly for 30 sec. \n#cTerms between skills : 10 min.# -10001002 - Nimble Feet - [Master Level : 3]\nEnables the character to move around quickly for a short amount of time. \n#cTerms between skills : 1 min.# -10001003 - Legendary Spirit - [Master Level : 1]\nUses the spirit of a legend to use a scroll on an item that cannot be equipped with your character. -10001004 - Monster Rider - [Master Level : 1]\nEnables one to ride on a tamed monster and use it as a method of transportation. -10001005 - Echo of Hero - [Master Lever : 1]\n Increase weapon attack and magic attack on all players around. \n#cTerms between skills : 2hours# -10001006 - Jump Down - [Master Level:1]\nJump down. -10001007 - Maker - [Master Level : 3]\nCan create item by using alchemy. Created item is different by level. -10001009 - Bamboo Thrust - Use bamboo as weapon and attack. -10001010 - Invincible Barrier - Become invincible for certain period of time. -10001011 - Meteo Shower - Damage will increase for certain period of time. -10000012 - Blessing of the Fairy - [Master Level : 20]\nSkill Point will increase by 1 when the related character reaches above Lv.10. -11000000 - Max HP Enhancement - [Master Level : 10]\nIncreases the Max HP when AP is applied during the Level Up. -11001001 - Iron Body - [Master Level : 10]\nTemporarily increases your Weapon Defense. -0000012 - Blessing of the Fairy - [Master Level : 20]\nSkill Point will increase by 1 when the related character reaches above Lv.10. -0001007 - Maker - [Master Level : 3]\nCan create item by using alchemy. Items that can be created will vary depending on your Character level. -9001003 - Bless - [Master Level:1]\nIncreases all abilities of those around you for 15 minutes. -9001004 - Hide - [Master Level : 1]\n Hide -9001005 - Resurrection - [Master Level : 1]\n Resurrection -9001006 - Super Dragon Roar - [Master Level : 1]\n Super Dragon Roar -9001007 - Teleport - [Master Level : 1]\n Teleport -9001009 - ADMIN_ANTIMACRO - [Master Level:1]\nActivate Lie Detector on the suspicious macro user. -9001008 - Hyper Body - [Master Level:1]\nMax HP, Max MP increases for 15 minutes. -10001014 - Spaceship - [Master Level : 2]\nYou board a spaceship. While aboard, you can increase your movement and jump abilities by pressing the right/left direction key twice. #Available until: 06-08-2009 at 00 hour# -10001015 - Space Dash - [Master Level : 1]\nIncrease your movement and jump abilities by pressing the right/left direction key twice. #cAvailable until 06-08-2009 at 00 hour# -10001016 - Space Beam - [Master Level : 1]\nChanges the condition of the Krypto found at the Space Mine. #cAvailable until: 06-08-2009 at 00 hour# -20001000 - Three Snails - [Master Level : 3]\nHurls snail shells to attack monsters from long distance. -20001001 - Recovery - [Master Level : 3]\nEnables the user to recover HP constantly for 30 sec. \n#cTerms between skills : 2 min.# -20001002 - Agile Body - [Master Level : 3]\nExplosive speed for an instant. \n#cTakes about 1 min. until the next call.# -20001003 - Legendary Spirit - [Master Level : 1]\nUses the spirit of a legend to use a scroll on an item that cannot be normally equipped by the character. -20001004 - Monster Rider - [Master Level : 1]\nEnables one to ride on a tamed monster and use it as a method of transportation. -20001005 - Echo of Hero - [Master Level : 1]\n Increase weapon attack and magic attack on all players around. \n#cTerms between skills : 2hours# -20001006 - Jump Down - [Master Level : 1]nJump downward. -20001007 - Maker - [Master Level : 3]\nCan create item by using alchemy. Created item is different by level. -20001009 - Bamboo Thrust - Use bamboo as weapon and attack. -20001010 - Invincible Barrier - Become invincible for certain period of time. -20001011 - Meteo Shower - Damage will increase for certain period of time. -20000012 - Blessing of the Fairy - [Master Level : 20]\nSkill Point will increase by 1 when the related character reaches above Lv.10. -20001013 - Helper - Damage increases for a fixed time period. -20000014 - Tutorial Skill - Tutorial Skill -20000015 - Tutorial Skill - Tutorial Skill -20000016 - Tutorial Skill - Tutorial Skill -20000017 - Tutorial Skill - Tutorial Skill -20000018 - Tutorial Skill - Tutorial Skill -20000024 - Follow the Lead - Allows one to lead up to 3 pets at once. (Passive skill) -21000000 - Combo Ability - [Master Level : 10]\nEverytime the combo count reaches 10, the stats increase.\nRequired Skill : #cLevel 10 on Double Swing# -21000002 - Double Swing - [Master Level : 20]\nTap the attack key twice to attack up to 12 enemies by attacking twice. -21001003 - Polearm Booster - [Master Level : 20]\n\nUses HP and MP to temporarily boost up the attacking speed of the equipped polearm. It only applies when either a one-handed or a two-handed polearm is in hand.\nRequired Skill : \n#cAt least Level 5 on Polearm Mastery#\n\nRequired Skill : #cCombat Step Level 5# -21100000 - Polearm Mastery - [Master Level : 20]\nIncreases the mastery of pole arms and accuracy. It only applies when a pole arm is in hand. This skill only gets triggered when the owner is carrying the secuity stuff.\nRequired Skill : #cTriple Swing Level 3# -21100002 - Final Charge - [Master Level : 30]\nJust pushes the enemy forward. Only available right after #cTriple Swing#.\nRequired Skill : #cTriple Swing Level 20 and above#\n[Command : triple attack, #cArrow Key : Right + attack#] -21101003 - Body Pressure - [Master Level : 20]\nAllows one to feel very powerful for a small period of time, by being able to body-check monsters, and completely render the monster useless. -21110000 - Combo Critical - [Master Level : 20]\nEvery time the combo count reaches 10, that's when the critical rate and the damage increases.\nRequired Skill : #cCombo Ability Level 10# -21111001 - Smart Knockback - [Master Level : 20]\nUtilizes efficiency over power, in that it dishes out less damage than a regular knockback, yet still manages to knock back an enemy. -21110004 - Combo Fenrir - [Master Level : 30]\nShoots a wave of concentrated energy, mixing with the spirit of wolves. Can only be used when the #cCombo Count reaches at least 100.#\nRequired Skill : #cCombo Smash Level 10#\n[Command : #cArrow Key : Down + Right + attack key#] -21111005 - Snow Charge - [Master Level : 20]\nFor a set period of time, add the element of ice on the Pole Arm. The skill cancels itself when the time is up, while the attacked monsters become much slower. -21110007 - (hidden) Full Swing - Double Swing - [Master Level : 20] -21110008 - (hidden) Full Swing - Triple Swing - [Master Level : 20] -21121000 - Maple Warrior - Temporarily boosts the stats of everyone in the party. -21120001 - High Mastery - Improves the overall mastery of Polearm-related weapons and attack.\nRequired Skill : #cPolearm Mastery Level 20# -21121003 - Freeze Standing - Stand heavy like a frozen block of ice and back down from no one. -21120004 - High Defense - A new level of defense, in that it permanently decreases the damage suffering from the same attacks. -21120006 - Combo Tempest - Creates an ice that is so deadly that even a slight collision would kill the monster, while incurring significant damage to boss monsters as well. #cOnly avilable when the combo count reaches 200 or more#.\nRequired Skill : #cCombo Fenrir Level 10#\n[command : #cArrow Key : Down + Right + attck\#] -21120007 - Combo Barrier - A buff that decreases the amount of damage received over a set time. A welcome skill in party formats a la cleric. Only available once the #ccombo count reaches 200#.\nRequired Skill : #cCombo Drain Level 10#\n[Command : #cArrow key : Down + Down + attack#] -21121008 - Hero's Will - Allows one to snap out of abnormal conditions. The higher the character's level, the less the character has to wait. -21120009 - (hidden) Over Swing - Double Swing - [Master Level : 30] -21120010 - (hidden) Over Swing - Triple Swing - [Master Level : 30] -0001020 - Rage of Pharaoh - [Master Level : 1]\nUtilizes the rage of Pharaoh as an attack. -0009000 - Pig's Weakness - [Master Level : 1]\n Inflicts 150% damage on Pigs. -0009001 - Stump's Weakness - [Master Level : 1]\n Inflicts 150% damage on Stumps. -0009002 - Slime's Weakness - [Master Level : 1]\n Inflicts 150% damage on Slimes. -10000013 - Helper - Damage increases for a fixed time period. -10001019 - Yeti Rider - [Master Level : 1]\nAllows one to ride on a Yeti.\n#cAvailable until : 7/9/2009 at 00:00# -10001020 - Rage of Pharaoh - [Master Level : 1]\nUtilizes the rage of Pharaoh as an attack. -10009000 - Pig's Weakness - [Master Level : 1]\n Inflicts 150% damage on Pigs. -10009001 - Stump's Weakness - [Master Level : 1]\n Inflicts 150% damage on Stumps. -10009002 - Slime's Weakness - [Master Level : 1]\n Inflicts 150% damage on Slimes. -20001019 - Yeti Rider - [Master Level : 1]\nAllows one to ride on a Yeti.\n#cAvailable until : 7/9/2009 at 00:00# -20001020 - Rage of Pharaoh - [Master Level : 1]\nUtilizes the rage of Pharaoh as an attack. -20009000 - Pig's Weakness - [Master Level : 1]\n Inflicts 150% damage on Pigs. -20009001 - Stump's Weakness - [Master Level : 1]\n Inflicts 150% damage on Stumps. -20009002 - Slime's Weakness - [Master Level : 1]\n Inflicts 150% damage on Slimes. -0001017 - Yeti Rider - [Master Level : 1]\nAllows one to ride on a Yeti.\n#cAvailable until : 7/9/2009 at 00:00# -21001001 - Combat Step - [Master Level : 15]\nQuickly tap the direction arrows twice to quickly cover a short distance.\nRequired Skill : #cDouble Swing Level 5#\n[How-to : #cArrow Key : Right + Right#] -21100001 - Triple Swing - [Master Level : 20]\nPress the attack key 3 times in a row to privde triple-hit combos on up to 12 enemies.\nRequired Skill : #cDouble Swing 20# -21100004 - Combo Smash - [Master Level : 20]\nAchieves excellent amound of danger at the booth. Only available when the #cCombo Count reaches 30 or above#.\nRequired Skill : #cPolearm combo 1#\n[Command : #cArrow Key : Down + Right + attack key#] -21100005 - Combo Drain - [Master Level : 20]\nA buff that allows one to recover a portion of damage dished out by attacking back as HP. #cCombo Count must reach 30# and can only be used then.\nRequired Skill : #cCombo Ability Level 1#\n[Command : #cArrow Key : Down + Down + attack#] -21120005 - Final Blow - Swings Polearm widely to incur significant damage to up to 12 monsters at once. Only works right after triggering #cTriple Swing#.\nRequired Skill : #cTriple Swing Level 20#\n[Command : Triple Swing + #cArrow Key : Down + attack key#] -21120002 - Over Swing - Expands the damage caused by Double Swing and Triple Swing to the extreme.\nRequired Skill : #cFull Swing Level 20# -21110006 - Rolling Spin - [Master Level : 20]\nCauses a strong wind which flies out monsters left and right.\n[command : #cArrow Key : Up + Up + Attack key#] -21110003 - Final Cross - [Master Level : 30]\nTosses up 12 monsters in the air. The monsters that are in the air will be vulnerable to attacks, therefore receiving more damage than on the ground. Can only triggered right after Triple Swing.\nRequired Skill : #cTriple Swing Level 20#\n[Command : #cArrow Key : Up + attack key#] -21110002 - Full Swing - [Master Level : 20]\nIncreases the damage rate of Double Swing and Triple Swing. \nRequired Skill : #cTriple Swing Level 20# -0001018 - Yeti Mount - [Master Level : 1]\nAllows you to move around while being mounted on a Yeti. -0001019 - Witch's Broomstick - [Master Level : 1]\nAllows you to move around while being mounted on a Broomstick. -10001023 - Witch's Broomstick - [Master Level : 1]\nAllows you to move around while being mounted on a Broomstick. -10001022 - Yeti Mount - [Master Level : 1]\nAllows you to move around while being mounted on a Yeti. -20001023 - Witch's Broomstick - [Master Level : 1]\nAllows you to move around while being mounted on a Broomstick. -20001022 - Yeti Mount - [Master Level : 1]\nAllows you to move around while being mounted on a Yeti. -0001031 - Barlog Mount - [Master Level : 1]\nAllows you to move around while being mounted on a Barlog. -10001031 - Barlog Mount - [Master Level : 1]\nAllows you to move around while being mounted on a Barlog. -20001031 - Barlog Mount - [Master Level : 1]\nAllows you to move around while being mounted on a Barlog. diff --git a/tools/MapleIdRetriever/handbook/Use.txt b/tools/MapleIdRetriever/handbook/Use.txt deleted file mode 100644 index 0fcd125a84..0000000000 --- a/tools/MapleIdRetriever/handbook/Use.txt +++ /dev/null @@ -1,2295 +0,0 @@ -2000000 - Red Potion - A potion made out of red herbs.\nRecovers 50 HP. -2000001 - Orange Potion - A concentrated potion made out of red herbs.\nRecovers 150 HP. -2000002 - White Potion - A highly-concentrated potion made out of red herbs.\nRecovers 300 HP. -2000003 - Blue Potion - A potion made out of blue herbs.\nRecovers 100 MP. -2000004 - Elixir - A legendary potion.\nRecovers 50% HP and 50% MP. -2000005 - Power Elixir - A legendary potion.\nRecovers all HP and MP. -2000006 - Mana Elixir - A legendary potion.\nRecovers around 300 MP. -2000007 - Red Pill - A pill of concentrated red potion, which restores 50 HP. You can carry more pills than potions because they're smaller -2000008 - Orange Pill - A pill of concentrated orange potion, which restores 150 HP. You can carry more pills than potions because they're smaller -2000009 - White Pill - A pill of concentrated white potion, which restores 300 HP. You can carry more pills than potions because they're smaller -2000010 - Blue Pill - A pill of concentrated blue potion, which restores 100 MP. You can carry more pills than potions because they're smaller -2000011 - Mana Elixir Pill - A pill of concentrated Mana Elixir, which restores 300 MP. You can carry more pills than potions because they're smaller -2000012 - Elixir - A legendary secret potion.\nRecovers 50% of HP and MP. -2000013 - Red Potion for Beginners - A potion made out of red herbs made especially for beginners. \nRecovers 40 HP. -2000014 - Blue Potion for Beginners - A potion made out of blue herbs made especially for beginners. \nRecovers 80 MP. -2000015 - Orange Potion for Beginners - A concentrated potion made out of red herbs.\nRecovers 150 HP. -2000016 - White Potion - A highly-concentrated potion made out of red herbs.\nRecovers 300 HP. -2000017 - Blue Potion - A potion made out of blue herbs.\nRecovers 100 MP. -2000018 - Mana Elixir - A legendary potion.\nRecovers around 300 MP. -2000019 - Power Elixir - A legendary potion.\nRecovers all HP and MP. -2001000 - Watermelon - A very ripe watermelon.\nRecovers about 1000 HP and 1000 MP. -2001001 - Ice Cream Pop - A tasty ice cream pop.\nRecovers around 2000 HP. -2001002 - Red Bean Sundae - Definitely lets you forget about the hot hot summer. \nRecovers around 2000 MP. -2002000 - Dexterity Potion - Adds quickness.\nAvoidability +5 for 3 min. -2002001 - Speed Potion - Increases speed.\nSpeed +8 for 3 min. -2002002 - Magic Potion - Increases magic attack.\nMagic Attack +5 for 3 min. -2002003 - Wizard Potion - Increases magic attack.\nMagic Attack +10 for 3 min. -2002004 - Warrior Potion - Increases attacking ability.\nAttack +5 for 3 min. -2002005 - Sniper Potion - Increases accuracy.\nAccuracy +5 for 5 min. -2002006 - Warrior Pill - A pill of concentrated warrior potion. Att. + 5 for 10 minutes -2002007 - Magic Pill - A pill of concentrated magic potion. Magic Att. + 5 for 10 minutes -2002008 - Sniper Pill - A pill of concentrated sniper potion. Accuracy + 10 for 10 minutes -2002009 - Dexterity Pill - A pill of concentrated dexterity potion. Avoidablity + 10 for 10 minutes -2002010 - Speed Pill - A pill of concentrated speed potion. Increased speed for 10 minutes -2002011 - Pain Reliever - A special pain reliever created in Omega Sector.nWeapon Def + 30 for 30 min. -2002012 - Elixir - Recovers both HP and MP by 50%. -2002013 - Power Elixir - Fully recovers HP and MP. -2002014 - Iron Body Medicine - A n enhanced pain reliever smuggled out of Omega Sector.n Def + 30 for 30 min. (Modification Request) -2002015 - Elpam Elixir - A rare, powerful elixir from Versal. Restores 90% HP & MP, and gives a boost of +5 Att and +40 Def for a duration of 15 minutes. -2002016 - Thief Elixir - A special elixir for Thieves. Gives +9 Accuracy and +15 Avoidability for 8 minutes. -2002017 - Warrior Elixir - A special elixir for Warriors. Gives +12 W. Att for 8 minutes. -2002018 - Wizard Elixir - A special elixir for Magicians. Gives +20 M.Att for 8 minutes. -2002019 - Archer Elixir - A special elixir for Bowmen. Gives +20 Avoidability for 8 minutes. -2002020 - Mana Bull - A special potion made in New Leaf City, recovers 60% MP. -2002021 - Honster - A special potion made in New Leaf City, recovers 60% HP. -2002022 - Ginseng Root - Pure ginseng extract that recovers 40% of HP and MP. -2002023 - Ginger Ale - Strong brewed Ginger Ale. Recovers 75% of HP and MP. -2002024 - Sorcerer Elixir - A rare potion perfect for Magicians. Recovers 1500 MP. -2002025 - Barbarian Elixir - A volatile potion mixed on the battlefield. Recovers 1500 HP. -2002026 - Ginger Ale - Strong brewed Ginger Ale. Recovers 75% of HP and MP. -2002027 - Stirge Signal - A makeshift device that looks like it's been duct-taped together. Can be used to distract enemies... slightly. [Gives +5 Avoidability for 20 minutes.] -2002028 - T-1337 Supercharger - A charger for an advanced model cyborg. Looks like it would give quite a shock to the system! [Gives +25 Weapon Attack, +60 Magic Attack for 20 minutes.] -2002029 - Ridley's Scroll of Defense - Why wear cumbersome armor when Ridley can provide the same protection, weightlessly and more comfortably! (Legal Disclaimer: Effect is temporary) [Gives +100 Overall Defense for 10 minutes.] -2010000 - Apple - A red, ripe, and tasty apple.\nRecovers around 30 HP -2010001 - Meat - A tasty-looking meat. .\nRecovers around 100 HP. -2010002 - Egg - A nutritious egg.nImproves around 50 HP. -2010003 - Orange - A sweet, tasty orange.\nRecovers around 50 MP. -2010004 - Lemon - Very sour.\nRecovers around 150 MP. -2010005 - Honey - Fresh honey extracted from the beehive. \nRecovers around 30% of both HP and MP. -2010006 - Pot of Honey - A pot full of fresh honey.\nRecovers 50% of both HP and MP. -2010007 - Roger's Apple - A ripe, red apple.\nRecovers HP 30.nn#cTo eat Roger's Apple, simply double-click on it in your use inventory#. -2010009 - Green Apple - Sour and crunchy green apple.\nRecovers MP +30. -2011000 - Poisonous Mushroom - A very poisonous mushroom. -2012000 - Drake's Blood - Drake's blood. nAttack +8 for 5 min. -2012001 - Fairy's Honey - It's honey, the fairies' favorite.nAvoidability +10 for 5 min. -2012002 - Sap of Ancient Tree - Sap of a thousands-of-years-old tree. \nMagic Attack +10 for 5 min. -2012003 - Drake's Meat - Drake's meat.nWeapon Def. +10 for 5 min. -2012004 - Purified Honey - Fairies favorite purified honey.nAvoidability +40 for 5 min. (Modification Request) -2020000 - Salad - Made out of fresh vegetable.\nRecovers 200 MP. -2020001 - Fried Chicken - Well-fried chicken.\nRecovers around 200 HP. -2020002 - Cake - A cake full of sweetness. Recovers 100 for both HP and MP. -2020003 - Pizza - A freshly-baked pizza. Recovers 400 HP. -2020004 - Hamburger - A hamburger with bulgogi in it. Recovers 400 HP. -2020005 - Hot Dog - A hotdog with ketchup on it. Recovers 300 HP. -2020006 - Hot Dog Supreme - A huge hot dog. Recovers 500 HP. -2020007 - Dried Squid - Well-dried. Recovers 600 HP. -2020008 - Fat Sausage - Tastes great, and is quite nutritious. Recovers 1200 HP. -2020009 - Orange Juice - Pure OJ... Recovers 450 MP. -2020010 - Grape Juice - Used real grapes for this. Recovers 900 MP. -2020011 - W Ramen - A cup ramen with awesome soup.\nRecovers 40% of HP and MP.. -2020012 - Melting Cheese - A mouth-watering cheese made out of fresh milk.\nRecovers 4000 HP. -2020013 - Reindeer Milk - Fresh milk squeezed out of a reindeer.\nRecovers 5000 HP. -2020014 - Sunrise Dew - Dew collected early morning. Recovers 4000 MP -2020015 - Sunset Dew - Dew collected late in the afternoon. Recovers 5000 MP. -2020016 - Cheesecake - MapleStory's 4th Anniversary Cake. Recovers 1200 HP and MP. -2020017 - Strawberry Cream Cake - MapleStory 4th Anniversary Cake. Recovers 1400 HP and MP. -2020018 - Chocolate Cream Cake - MapleStory 4th Anniversary Cake. Recovers 1600 HP and MP. -2020019 - Chocolate Cake - MapleStory 4th Anniversary Cake. Recovers 1800 HP and MP. -2020020 - Wedding Cake - A Wedding cake that coming Recovers 2000 HP and MP. -2020021 - Nemi's Lunch Box - A fresh-made lunch box made by Nemi of Ludibrium for her dad, Kaho of the Toy Factory. Recovers 10 HP. -2020022 - White Chocolate - A very delicious, home-made white chocolate. Attack + 5 for 30 minutes. -2020023 - Dark Chocolate - A very delicious, home-made dark chocolate. Magic Attack + 5 for 30 minutes. -2020024 - Chocolate Basket - A basket full of delicious, home-made chocolate decorated with ribbons and marbles. Avoidability, speed and accuracy +10 each for 30 minutes. -2020025 - Pineapple Candy - A very sweet, home-made pineapple candy. Attack +5 for 30 minutes. -2020026 - Strawberry Candy - A very sweet, home-made strawberry candy. Magic Att. +5 for 30 minutes. -2020027 - Candy Basket - A basket full of sweet home-made fruit candies decorated with ribbons and marbles. Avoidability, speed and accuracy +10 each for 30 minutes. -2020028 - Chocolate - Milk chocolate that has a strong sweet scent. This is used to make the chocolate-dipped cookie stick.\nRecovers each of HP and MP by 1000. -2020029 - Corn - A fresh corn plucked right off the stalk.\nRecovers 100 MP. -2020030 - Roasted Turkey - A well-roasted turkey enough to feed the whole family.\nRecovers 100 HP. -2020031 - Coca_Cola - Sweet refreshing #cCoca-Cola#.\nRecovers HP and MP by 30%. -2020032 - Birthday Cake - A tasty-looking cake full of whipped cream and fruit toppings.\nRecovers 365 MP and HP. -2022000 - Pure Water - Very clean water.\nRecovers up to 800 MP. -2022001 - Red Bean Porridge - A hot steamy porridge made out of red beans. At an HP-decreasing map, whenever such map damage is dealt, 10 HP will be protected. -2022002 - Cider - A cold soft drink.\nIncreases weapon attack for 5 min.\nAccuracy -5 for 5 min., though. -2022003 - Unagi - Well-seasoned eel.\nRecovers 1000 HP. -2022004 - Song Pyun - Filled with royal jelly.\nRecovers 1500 HP. -2022005 - Han Gwa - A traditional Korean snack.\nRecovers 1500 MP. -2022006 - Rice-Cake Soup - Just got done boiling.\nRecovers 500 for both HP and MP. -2022007 - Triangular Sushi(plum) - A nice triangular sushi with plum in it. \nRecovers 20% of both HP and MP. -2022008 - Triangular Sushi(salmon) - A nice triangular sushi with salmon in it. \nRecovers 30% of both HP and MP. -2022009 - Triangular Sushi(bonito) - A nice triangular sushi with bonito in it. \nRecovers 40% of both HP and MP. -2022010 - Triangular Sushi(pollack) - A nice triangular sushi with pollack in it. \nRecovers 50% of both HP and MP. -2022011 - Triangular Sushi(mushroom) - A nice triangular sushi with mushroom in it. \nRecovers 60% of both HP and MP. -2022012 - Sushi(tuna) - Sushi made out of fresh fish near Victoria Island.\nRecovers 1000 HP. -2022013 - Sushi(salmon) - Sushi made out of fresh fish near Victoria Island.\nRecovers 500 HP. -2022014 - Dango - Taste the sweetness of this dango.\nRecovers 200 HP & MP. -2022015 - Mushroom Miso Ramen - Only the finest ingredients are used to make this Miso Ramen.\nRecovers 80% for both HP and MP. -2022016 - Maple Special Bento - A special bento with meat and mushroom.\nRecovers 500 for both HP and MP. -2022017 - Ramen - A bowl of ramen cooked with Robo's special recipe.\nRecovers HP 1000. -2022018 - Kinoko Ramen(roasted pork) - A bowl of ramen cooked with roasted pork in the soup.\nRecovers HP 1500. -2022019 - Kinoko Ramen(pig head) - A bowl of ramen cooked with pig head in the soup.\nRecovers HP 800. -2022020 - Kinoko Ramen(salt) - A bowl of ramen cooked with salt in the soup. Tastes a little peculiar...\nRecovers HP 500. -2022021 - Fish Cake(skewer) - A Fish Cake skewer which also includes a bunch of vegetables.\nRecovers MP 250. -2022022 - Fish Cake(dish) - A dish full of tasty Fish Cake.\nRecovers MP 500. -2022023 - Tri-colored Dango - A tri-colored dango that includes a handful of tasty dango.\nRecovers each of HP and MP by 400. -2022024 - Takoyaki (Octopus Ball) - A hot, tasty-looking Takoyaki.nAttack +8 for 5 minutes. -2022025 - Takoyaki (jumbo) - Two servings worth of Takoyaki.nAttack +8 for 10 minutes. -2022026 - Yakisoba - A bowl of Yakisoba which includes vegetable, seafood, and noodles mixed with a delicious sauce.nMagic Attack +10 for 5 minutes. -2022027 - Yakisoba (x2) - Double the serving of a normal bowl of Yakisoba which includes vegetable, seafood, and noodles mixed with a delicious sauce.nMagic Attack +10 for 10 minutes. -2022028 - Valentine Chocolate (Dark) - A rich, dark chocolate for your special someone on Valentine's Day. Recovers 50% of HP and MP. -2022029 - Valentine Chocolate (Strawberry) - A rich, dark chocolate for your special someone on Valentine's Day. Recovers 100% of HP and MP. -2022030 - Valentine Chocolate (White) - A tasty white chocolate for your special someone on Valentine's Day. Accuracy +10 for 5 minutes. -2022031 - Cookie - Crispy on the cover and soft inside, this cookie is definitely worth a bite. -2022032 - Marshmallow - A mushy, yummy-looking marshmallow. -2022033 - Candy - A sparkling candy with a scent of tropical fruit. -2022034 - Zong Zi - A tiny seed of a fruit.\nRecovers 50 HP. -2022035 - Maple Cola - none -2022036 - Candy Basket - Defense and avoidablity will be increased by 300 for 30 minutes. -2022037 - Pink Rice Cake - Recovers 500 HP and MP. -2022038 - Rice Cookie - Recovers 1500 for both HP and MP. -2022039 - Nependeath's Honey - Recovers 1000 for both HP and MP. -2022040 - Air Bubble - Air bubble enables breathing in the water for 15 minutes. -2022041 - Fried shrimp - Recovers 500 of HP and MP. -2022042 - Cookie - Crispy on the outside, marshmellow-soft on the inside, this cookie can be traced from afar by its sweet smell.nWeapon & Magic Attack +20 for 30 minutes. -2022043 - Fruity Candy - Multi-colored, fruity-flavored candies.nSpeed +10 for 30 minutes. -2022044 - New Year Rice Cake - Attack +20 for 10 min. -2022045 - New Year Lunchbox - Recovers 2000 HP & MP -2022046 - Seaweed - null -2022047 - Cooked Sea Bream - Magic Attack +35 for 10 min. -2022048 - New Year Rice Soup - Accuracy +30 for 5 min. -2022049 - Steamed Crab - Weapon Def. +100 for 5 min. -2022050 - Roasted pork - A piece of roasted pork that is favorite of Yellow King Goblin. Marinated just right, and it even looks delicious enough for one to salivate over it. Recovers 800 HP. -2022051 - Buckwheat paste - A buckwheat paste that is the favorite of Green King Goblin. Bouncy like jelly, yet very nutritious. Recovers 800 MP. -2022052 - Rice Wine - A cup of wine made out of fermented rice that is the favorite of Blue King Goblin. An aroma of a combination of vinegar-like spike and smoothness of a tea tickles the nose of those near it. Recovers 400 each of HP and MP. -2022053 - Jujube - A ripe, red jujube.\nRecovers 30 HP. -2022054 - Pear - A big, juicy-looking pear.\nRecovers 30 HP. -2022055 - Persimmon - A ripe, orangy Persimmon.\nRecovers 30 HP. -2022056 - Chestnut - A ripe, brown chestnut just picked out of a tree.\nRecovers 30 HP. -2022057 - Tofu - Made out of soy beans, it is one healthy food recommended for everyone.\nRecovers 50 HP. -2022058 - Dumpling - A mixture of pork and vegetable wrapped up in a thin layer of wheat.\nRecovers 1500 HP. -2022060 - Lotus Perfume - A perfume that contains power-boosting aroma. nAttack, Defense, Magic Attack +10 for 20 min. -2022061 - Oriental Perfume - A perfume that contains power-boosting aroma. nAttack, Defense, Magic Attack +15 for 20 min. -2022062 - Chrysanthemum Perfume - A perfume that contains power-boosting aroma. nAttack, Defense, Magic Attack +20 for 20 min. -2022063 - Corn Stick - A roasted corn on a skewer. Very delicious looking. \nRecovers HP 800. -2022064 - Fruit Stick - A snackery with fruity-flavored candies on the skewer.\nRecovers MP 800. -2022065 - Yellow Easter Egg - A freshly boiled egg colored in yellow. Recovers 100 HP and MP. -2022066 - Green Easter Egg - A freshly boiled egg colored in green. \nRecovers 200 HP and MP. -2022068 - Yellow Cider - A cold soft-drink. Magic Attack +35 for 5 min. -2022069 - Red Cider - A cold soft-drink. Attack +34 for 5 min. -2022070 - Congrats from GM - A mystical spell that can only be casted by a GM as a sign of congratulation. Weapon & Magic Attack +20, Defense +100, Accuracy & Avoidability +50, Speed & Jump +10 for 1 HOUR. -2022071 - Korean Warrior - Weapon Attack +20, Magic Attack +20 for 10 min. -2022072 - Forza Corea - Gives +50 Weapon Defense and +50 Magic Defense for 10 minutes. -2022073 - A Prayer for Victory - Increases Jump +10, Speed +20 for 20 minutes. -2022074 - Oolleung Squid - Dried squid from Oolleung renowned for its taste. \nRecovers 500 HP & MP. -2022075 - Mini Coke - A sweet, tasty, carbonated Coke featured in a Mini Can. nAttack +8, Magic Attack +8 for 20 minutes. -2022076 - Coke Pill - A pill made out of a sweet, tasty, carbonated Coke. nAttack +10, Magic Attack +10, Defense +10 for 15 minutes. -2022077 - Coke Lite Pill - A pill made out of a sweet, tasty, carbonated Coke. nAttack +12, Magic Attack +12, Defense +12 for 15 minutes. -2022078 - Coke Zero Pill - A pill made out of a sweet, tasty, carbonated Coke. nAttack +15, Magic Attack +15, Defense +15 for 15 minutes. -2022079 - Barbecue - A fresh Barbecue meat.\nRecovers 1000 HP. -2022086 - Red Fruit - A curious-looking fruit that increases Attack by 8 for 10 minutes. Kicks in as soon as the first bite is taken. -2022087 - Black Fruit - A curious-looking fruit that increases Defense by 15 for 10 minutes. Kicks in as soon as the first bite is taken. -2022088 - Blue Fruit - A curious-looking fruit that increases Magic Attack by 10 for 10 minutes. Kicks in as soon as the first bite is taken. -2022089 - Baby Dragon Food - A delicious bowl of baby food for the baby dragon. Attack +7 for 20 minutes. -2022090 - Blessing from Wonky the Fairy - A blessing from Wonky the Fairy. Increases attack & magic attack. -2022091 - Blessing from Wonky the Fairy - A blessing from Wonky the Fairy. Increases weapon defense & magic defense. -2022092 - Blessing from Wonky the Fairy - A blessing from Wonky the Fairy. Increases accuracy and avoidability. -2022093 - Blessing from Wonky the Fairy - A blessing from Wonky the Fairy. Increases speed and jump. -2022094 - Chicken Soup - Weapon Attack+20, Magic Attack +30 for 15 minutes. -2022096 - Fried Chicken - Crispy on the outside, soft on the inside. \nRecovers HP 400. -2022097 - Chun Gwon - A dish full of renowned Chun Gwon. nnRecovers MP 400. -2022098 - Bubble Gum - A fruity bubble gum that can make a huge bubble.n Jump +5 for 20 minutes. -2022099 - HP up - HP up -2022100 - Song Pyun - Weapon Attack +20, Magic Attack +30 for 15 minutes. -2022101 - Han Gwa - Weapon Attack +20, Magic Attack +30 for 15 minutes. -2022102 - Massage Oil - A massage oil used for the Thai Body Massage session. Attack +8 for 10 minutes. -2022103 - Thai Cookie - A sweet, Thai treat. \nRecovers HP 150. -2022105 - Green Malady's Candy - A magical concoction bewitched for wellness by Malady. \nRecovers 50% of the HP. Also recovers 50% of MP. -2022106 - Red Malady's Candy - An enticing piece of candy straight from Malady's finest pot. \nRecovers around 300 MP. -2022107 - Blue Malady's Candy - This delicious candy holds a special blessing from Malady. \nRecovers all HP and MP. -2022108 - Horntail Squad : Victory - Weapon Attack +30, Magic Attack +40, Weapon Defense +200, Magic Defense +200 for one hour. -2022109 - The Breath of Nine Spirit - Weapon Attack +25, Magic Attack +35, Weapon Defense +150, Magic Defense +150 for one hour. -2022112 - Baby Witch - Weapon Attack +20, Magic Attack +30 nfor 15 minutes. -2022113 - Pumpkin Pie - A piping hot, delicious pie right from Grandma Benson's oven. Eat up! \nRecovers 700 HP, 400 MP and Defense +50 for 10 mins. -2022114 - Enchanted Apple Crisp - A hot pastry made from mystic apples. At an HP-decreasing map, whenever such map damage is dealt, 50% HP will be protected. (Modification Request) -2022116 - Peach - Recovers a set amount of HP and MP. Only obtainable in Mu Lung. -2022117 - Maple Syrup - A mystical syrup from maple tree. Weapon & Magic Attack +20, Defense +50, Accuracy & Avoidability +30, Speed & Jump +10 for 20 MINUTES. -2022118 - Admin's Congrats - A mysterious form of bless given by the administrator. Attack +10, Magic Attack +10, Defense+ 30, Accuracy +20, Avoidability +20, Speed +3 and Jump +3 for 20 minutes -2022119 - Tree Ornament - Weapon Attack +20, Magic Attack +30 forn15 minutes. -2022120 - Christmas Melon - A special melon imbued with Holiday blessings. Delicious! nRecovers 2000 HP and 1000 MP. -2022121 - Gelt Chocolate - A special piece of tasty chocolate given out at the Festival of Lights. \nRecovers 100 HP & MP, and +120 Attack +120 Weapon Def. +30 Accuracy +30 Avoidability + 10 Speed +10 Jump for 10 minutes. -2022123 - Banana Graham Pie - This scrumptious pie is sure to lighten your spirits! nRecovers 400 HP & 500 MP, and +120 Magic +120 Magic Def. +30 Accuracy +30 Avoidability + 10 Speed +10 Jump for 10 minutes. -2022124 - Magic of Kasandra - Double the meso drop rate. -2022125 - Increase in Weapon Defense - An increase in weapon defense with a little help from a Dark Spirit. -2022126 - Increase in Magic Defense - An increase in magic defense with a little help from a Dark Spirit. -2022127 - Increase in Accuracy - An increase in accuracy with a little help from a Dark Spirit. -2022128 - Increase in Avoidablility - An increase in avoidability with a little help from a Dark Spirit. -2022129 - Increase in Attack - An increase in attack with a little help from a Dark Spirit. -2022130 - Blossom Juice - A special energy drink made from crushed Cherry Blossoms and other mystic ingredients. Recovers 1200 HP, 900 MP and +12 to DEF for 20 minutes. -2022131 - Ginseng Concentrate - A ginseng concentrate. Recovers both HP and MP by 400. -2022132 - Bellflower Concentrate - A Bellflower concentrate. Recovers both HP and MP by 200. -2022142 - Mind & Heart Medicine - A hot, soup-like medicine made out of bear paws. Drinking this will revitalize the brain to the tune of Accuracy +10 for 15 minutes. -2022143 - Mastery Medicine - A hot, soup-like medicine that allegedly turns students into bona-fide Masters. Magic Attack +10 for 15 minutes. -2022144 - Body & Physics Medicine - A hot, soup-like medicine made out of snake tails. Drinking this will revitalize the body to the tune of Attack +8 for 15 minutes. -2022145 - Canned Peach - Homemade canned peach made by the weird pharmacist in Mu Lung, Dr. Do.\nRecovers around 1000 nHP. -2022146 - Peach Juice - Peace juice made by the weird pharmacist in Mu Lung, Dr. DonRecovers around 500 MP. -2022147 - Bellflower Medicine Soup - A herb medicine made from bellflowers and snake.nAttack + 6 for 10 minutes. -2022148 - Pill of Tunnel Vision - A pill of acorn powder. The marksman's liquid medicine. Increases +12 accuracy for 10 minutes. -2022149 - Pill of Intelligence - A pill of powdered deer antler and wild ginseng. Increases Magic Attack by +10 for 10 minutes. -2022150 - Slithering Balm - Ointment medicine made from Mr. Alli's skin. Gives +12 Avoidability for 10 minutes. -2022151 - Cassandra's Magic - A mysterious spell cast by Cassandra. Gives +20 Att and Magic, +100 Defense, +50 accuracy and avoidability, and +10 speed and jump for 1 hour. -2022152 - Cassandra's Magic - A mysterious spell cast by Cassandra. Gives +10 Att and Magic, +30 Defense, +20 accuracy and avoidability, and +3 speed and jump for 20 minutes. -2022153 - Happy birthday - Gives +20 W. Att, +30 M. Att for 15 minutes to all the characters in the map when item was used. -2022154 - Petit Rose - Gives +20 Weapon Attack, +30 Magic Attack for 15 minutes. -2022155 - Desert Mist - Pure water extracted from Katuse roots. Recovers 200 MP. -2022156 - Black Bean Noodle - Nothing like a hot bowl of noodles to cap off a great day. Increases Weapon Attack and Magic Attack by +13 for 30 minutes. -2022160 - Party Mana Elixir - Recovers 300 MP for all members of your party. -2022161 - Party Elixir - Recovers 50% of HP and MP for all members of your party. -2022162 - Party Power Elixir - Recovers all HP and HP for all members of your party. -2022163 - Party All Cure Potion - Cures any abnormal state affecting any members of your party. -2022164 - Mini Cube of Darkness - One of the members in the opposing party will have their buffs nullified. -2022165 - Cube of Darkness - Everyone in the opposing party will have their buffs nullified. -2022166 - Stunner - One of the members of the opposing party will be stunned. -2022174 - White Potion - A highly-concentrated potion made out of red herbs.\nRecovers 300 HP. -2022179 - Onyx Apple - A rare, ripe apple imbued with power. Recovers 90% HP & MP, and provides +100 W.Att, +100 M.Att, +20 Def for 10 minutes. -2022180 - Amorian Rice Cookie - A special Rice Cookie from Amos. Recovers 3000 HP and MP. -2022181 - Victoria's Amorian Basket - Victoria's special basket, made just for Amos. Provides a boost of +40 to Avoidability, speed and accuracy for 10 minutes -2022182 - Crystalized Pineapple Chew - A very sweet, home-made pineapple chew. Provides a bonus of +20 ATT for 7 minutes. -2022183 - Flower Shower - Increases physical attack by 20, Magic attack by 30 for 15 minutes. -2022184 - Maple BBQ - Delicious, succulent BBQ meat. Take a big bite--you know you want to. Weapon attack +13, Magic Attack +13 for 20 min. -2022185 - Fireworks - The fireworks for celebrating MV's defeat. Attack +20, Magic Attack +20 for 10 min. -2022186 - Soft White Bun - Freshly baked bread, hot from the oven! Makes you warm inside and prevents HP loss for 30 minutes in the El Nath region. -2022187 - Cassandra's Magic - Breathe comfortably underwater for 30 minutes with Cassandra's magic. Prevents the constant HP damage you receive for every 10 seconds underwater. -2022189 - Grilled Cheese - A tasty, golden brown, grilled cheese sandwich. Recovers 500 HP & MP and gives a boost of +20 Def for 30 mins. -2022190 - Cherry Pie - A piping hot pie that warrants eating. Recovers 2000 HP/MP and has a bonus of +2 ATT for 8 minutes. -2022191 - Supreme Pizza - A piping hot pizza with all toppings. Recovers 900 HP and 600 MP. -2022192 - Waffle - A hot, buttery waffle that's ready to eat. Recovers 300 HP and MP -2022193 - Merlin Orb - A majestic orb said to have been the property of a powerful mage. Gives a boost of +40 M. Att for 15 mins. -2022194 - Leaf Crystal - An uncommon crystal formed by the leaves of an Ellinian vine. Provides a boost of +12 W. Att, +20 M. Att, +20 DEF/M. DEF, +8 Avoidability/Accuracy for 20 minutes. May only be used 5 times before it vanishes. -2022195 - Mapleade - Refreshing drink for thirsty travelers! Recovers 80% HP, 90% MP and gives a boost of +2 Att for 30 mins. -2022196 - Wedding Bouquet - A special wedding bouquet. Gives +5 Weapon Attack and +3 Magic Attack for 5 minutes. -2022197 - Wedding Bouquet - A special wedding bouquet. Gives +8 Weapon Attack and +5 Magic Attack for 5 minutes. -2022198 - Russellon's Pills - A pill made by Russellon from Magatia. The actual effects of this pill remain a mystery... -2022199 - Russellon's Potion - A potion made by Russellon from Magatia. The actual effects of this potion remain a mystery... -2022200 - Wedding Bouquet - A special wedding bouquet. Gives +10 Weapon Attack and +8 Magic Attack for 5 minutes. -2022203 - Laksa - Singapore local speciality spicy noodle. It triggers one to sweat after consumpsion.\nRecovers 800 HP. -2022204 - Hokkien Mee - Singapore's local speciality prawn noodles. It is normally served with prawns, chili & lime. \nRecovers 1200 HP. -2022205 - Carrot Cake - A delicious local traditional food. It is made up of carrot extracts & secret recipes. \nRecovers 1800 HP. -2022206 - Chicken Rice - A delicious Singapore local traditional food. The rice is covered with the fragrant secret recipes of chicken extracts.\nRecovers 2200 HP. -2022207 - Satay - A delicious Singapore local traditional BBQ food. It is normally served with curry sauces. Its fragrance can be sensed a distance away.\nRecovers 2600 HP. -2022208 - Guava - A fruit that is hard & sour. Its nutritional value improves our digestive system.\nRecovers 500 MP. -2022209 - Rambutan - A fruit that is delicious & juicy. It is so sweet that it attracts ants if they are not well attended to. \nRecovers 800 MP -2022210 - Dragon Fruit - Another fruit that is delicious & juicy, similar to Rambutan, it will attract unwanted pests if they are not attended. \nRecovers 1600 MP. -2022211 - Durian - The fruit is nominated as the King of Fruits around the region. Despite having a hard & thorny shell, the fruit that lies within is extremely fragrant, and it tastes great! nRecovers 3200 MP. -2022212 - Nasi Lemak - A popular Malay Traditional Dish mainly made up of rice, egg & cucumber, soaked with pandan fragrant.nImproves Magic Attack +8 for 5 minutes. -2022213 - Roti Prata - A popular Indian Traditional Dish made up of flour. It is normally served with sugar & curry sauces.n Improves Magic Attack +8 for 10 Minutes. -2022214 - Pepper Crab - A popular Chinese traditional dish made of up fresh steam crab, pepper, egg & secret recipes.nImproves Weapon Attack +8 for 5 minutes. -2022215 - Chili Crab - A popular Chinese traditional dish made of up fresh steam crab, chili power, egg & secret recipes.nImproves Weapon Attack +8 for 10 minutes. -2022224 - Russellon's Potion - A potion made by Russellon from Magatia. The actual effects of this potion remain a mystery... -2022225 - Russellon's Potion - A potion made by Russellon from Magatia. The actual effects of this potion remain a mystery... -2022226 - Russellon's Potion - A potion made by Russellon from Magatia. The actual effects of this potion remain a mystery... -2022227 - Russellon's Potion - A potion made by Russellon from Magatia. The actual effects of this potion remain a mystery... -2022228 - Russellon's Potion - A potion made by Russellon from Magatia. The actual effects of this potion remain a mystery... -2022238 - MesoGears Ring - An ancient ring of wondrous power. There appears to be a faded inscription along the side..."Subani". Provides a boost of +8 W. Att, +15 M. Att, +12 Def/M. Def. for 8 minutes. -2022239 - Cassandra's Magic - A special magic spell cast by Cassandra. For 30 minutes, Attack +10, Magic Attack +10, DEF +30, Accuracy +20, Avoidability +20, Speed +7, and Jump +5. -2022240 - Cassandra's Magic - A special magic spell cast by Cassandra. For 1 hour, Attack +10, Magic Attack +10, DEF +30, Accuracy +20, Avoidability +20, Speed +7, and Jump +5. -2022242 - Edmund's Special Brew - A healing tonic made with Edmund's secret recipe. Just the thing when you're feeling under the weather! [Restores 50% of HP and MP, also gives +14 W. Att + 30 M.Att, for 10 minutes.] -2022243 - Sophilia's Necklace - A jewel crafted by Prendergast for his daughter, intended as a protective gift for her 16th birthday. -2022244 - Smore - A tasty, hot smore. Perfect for a toasty Halloween night! -2022245 - Heartstopper - Just one taste of this spicy candy and it'll feel like your heart's on fire! -2022246 - Pumpkin Taffy - Sweetened pumpkin taffy on a candy cane stick. [Gives +15 Weapon Defense, +15 Magic Defense for 5 minutes] -2022247 - Red Gummy Slime - Super-chewy gummy slimes. This one is cherry-flavored. If only real Slimes tasted this good. [Restore 1200HP, 1200MP] -2022248 - Green Gummy Slime - Super-chewy gummy slimes. This one is lime-flavored. If only real Slimes tasted this good. [Restores 600 HP] -2022249 - Purple Gummy Slime - Super-chewy gummy slimes. This one is grape-flavored. If only real Slimes tasted this good. [Restores 600 MP] -2022250 - Orange Gummy Slime - Super-chewy gummy slimes. This one is orange-flavored. If only real Slimes tasted this good. [Restores 600HP, 600MP] -2022251 - Maple Pop - A mouth-watering, delectable sweet treat! [Gives +100 Accuracy for 1 minute] -2022252 - Tae Roon's Note - A small note written by Tae Roon. This note is enchanted, so it boosts weapon attack and magic attack by 3 for 1 minute. -2022253 - Mushroom Candy - Delicious mushroom candy from Sen. This candy makes anyone feel good about themselves. So good, that it boosts Jump +3 for 3 minutes. -2022255 - Pumpkin Pieces - Pieces of pumpkin left over from making halloween Jack-o'-Lanterns. The pumpkin, perfectly ripe, has an aroma that is sweeter than ever. Each piece recovers 50 HP and 50 MP. -2022256 - Halloween Candy - A candy wrapped in stripes. Kids love it. Recovers 20 HP and MP. -2022257 - Power of the Glowing Rock - Received a mysterious power from the Glowing Rock. Boosts the weapon attack and magic attack slightly for 10 minutes. -2022258 - Coconut Juice - A small hole is up on the top of the Coconut, where the straw goes in. Drink the juice with the straw for maximum refreshment. Recovers 100 HP. -2022259 - Attack Crystal - A red crystal with a mysterious power packed in. Attack +5 for 5 minutes. -2022260 - Accuracy Crystal - A blue crystal with a mysterious power packed in. Accuracy +5 for 5 minutes. -2022261 - Stuffing Scoop - A delicious scoop of stuffing. This treat comes around only once in a while so eat it up before it gets cold. \n[Restores 600 HP/ 600 MP] -2022262 - Cranberry Sauce - This delicious cranberry sauce complements almost any meal! \n[Gives + 30 Magic Attack for 3 minutes] -2022263 - Mashed Potato - It looks like someone dropped this potato. \n[Restores 800 HP] -2022264 - Gravy - The only thing better than a gravy boat is a gravy train. \n[Restores 800 MP] -2022265 - Snowing Fishbread - Increases Physical Attack Power by 20 and Magic Attack Power by 30 for 15 minutes. -2022266 - Power Punch - A fist used during the Hunting Tournament. Boosts weapon and magic attack. -2022267 - Wing of the Wind - A set of wings used during the Hunting Tournament. Boosts speed and jump. -2022268 - Crazy Skull - An eyeball-rotating skull used during the Hunting Tournament. Inverts directions. -2022269 - Shield - A shield used during the Hunting Tournament. Protects the owner from the bomb once. -2022271 - Maplemas Ham - A delicious looking Christmas Ham with a sprig of mistletoe on top.\nRecovers 3000 HP and MP. -2022272 - Smoken Salmon - The traditional Versalmas dinner. Smells... like fish. \nRecovers 2385 HP and 3791 MP. -2022273 - Ssiws Cheese - Cheese from the alternate dimension of Versal. Looks funny but smells quite nice. nGives +220 Magic Attack for 2 minutes -2022274 - Sugar-Coated Olives - Olives frosted with pink sugar -- a special treat beloved by children from Versal! nGives +40 Speed and + 25 Jump for 5 minutes. -2022275 - Caramel Onion - O-Pongo's favorite treat! Creamy caramel with a crunchy onion center! nRestores 800 HP and MP. -2022276 - Chocolate Wafers - A crispy wafer layered with chocolate creme. nGives +40 Weapon Attack for 3 minutes -2022277 - Sunblock - SPF 1000. Blocks all harmful rays, including magical ones. nGives +200 Magic Defense for 10 minutes. -2022278 - Lump of Coal - Restores 1 HP and 1 MP. -2022279 - Snow Cake Piece - A piece of cake that consists of snow-white whipped cream and cherry. Recovers 300 HP and MP. -2022280 - A Flurry of Snow - Increases Physical Attack Power by 20 and Magic Attack Power by 30 for 15 minutes. -2022281 - Chinese Firecrackers - A string of Chinese firecrackers known to scare away ghoulish spirits. -2022282 - Naricain's Demon Elixir - A fiery black liquid that gives the user the power of a thousand demons when consumed. [Gives +140 Weapon Attack for 8 minutes] -2022283 - Subani's Mystic Cauldron - Drinking the swirling blue liquid within this small iron pot fills the user with an energy that emanates a protective aura. [Gives +100 Overall Defense, +200 Magic Attack for 10 minutes] -2022284 - Barricade Booster - John Barricade's special concoction, used to get him out of tight jams. For use in emergencies! [Gives +50 Avoidability, +50 Accuracy, +10 Jump for 5 minutes] -2022285 - Sweet Heart - Weapon attack +20, Magic attack +30 for 15 minutes. -2022296 - Power Scream - A power scream from Maple Admin. Weapon attack +8, Magic attack +12 for 30 minutes. -2022302 - Party Bear - Weapon attack +20, Magic attack +30 for 15 minutes. -2022305 - Taru Face Paint - This mystical camouflage allows the user to blend into his or her surroundings. [Gives +100 Avoidability for 5 minutes.] -2022306 - Primal Brew - A mixture made from an ancient Taru shaman recipe. Instills warriors with the primal strength of the Jungle Spirit. [Gives +35 Weapon Attack, +10 Accuracy for 20 minutes.] -2022307 - Spirit Herbs - Special incense used by ancient Taru shamans for communion rituals with the Jungle Spirit. [Gives +90 Magic Attack for 20 minutes.] -2022308 - Jungle Juice - A delicious natural beverage made from a secret blend of jungle fruits, flowers, roots, and vines. The perfect thing to fuel a Taru brave through a long jungle trek! [Restores 1000 HP and 2000 MP.] -2022309 - Treasure Hunt Note - Spread all over the Maple World for the 4th anniversary of MapleStory, this note contains the prizes that you'll win when this is found. -2022310 - Chocolate Cream Cupcake - A delicious chocolate cupcake with vanilla cream filling. One taste and you'll be hooked! [Restores 300 HP & MP, and gives +30 Accuracy, +30 Speed, and +30 Jump for 3 minutes.] -2022311 - Big Cream Puff - A rare, tasty dessert. Known as the 'Warrior's Dessert' to some and the 'Fattening Treat' to others. [Gives +30 Weapon Attack for 3 minutes.] -2022332 - Agent O's Encouragement - An encouraging message from Agent O. Jump rate will be increased by 20 for 30 minutes. -2022333 - Agent O's Encouragement - An encouraging message from Agent O. Speed will be increased by 40 for 30 minutes. -2022335 - Baby Chick Cookie - This is a cookie shaped like a baby chick. Recovers 1000 HP and MP. -2022336 - Secret Box - Secret Box -2022337 - Sorcerer's Potion - This is a potion that you can buy from Sorcerer. It's potent, but its side-effects are equally strong. It's also very expensive, so be careful with it. -2022338 - VitroJuice - A futuristic power pack full of liquid fuel synthesized by T-1337. Looks suspiciously like an energy drink. Drink at your own risk! [Gives +14 Weapon Attack for 15 minutes] -2022339 - NitroJuice - A futuristic power pack full of liquid fuel synthesized by T-1337. Looks suspiciously like an energy drink. Drink at your own risk! [Gives +22 Weapon Attack for 10 minutes] -2022340 - BlastroJuice - A futuristic power pack full of liquid fuel synthesized by T-1337. Looks suspiciously like an energy drink. Drink at your own risk! [Gives +90 Weapon Attack for 1 minute] -2022341 - ElectroJuice - A futuristic power pack full of liquid fuel synthesized by T-1337. Looks suspiciously like an energy drink, but drink at your own risk! [Gives +50 Magic Attack for 10 minutes.] -2022342 - MegaJuice - A futuristic power pack full of liquid fuel synthesized by T-1337. Looks suspiciously like an energy drink, but drink at your own risk! [Gives +200 Magic Attack for 30 seconds.] -2022343 - GigaJuice - A futuristic power pack full of liquid fuel synthesized by T-1337. Tasty and strong enough to dissolve rust from machinery! Drink at your own risk! [Gives +700 Magic Attack for 10 seconds.] -2022344 - JigaJuice - A futuristic power pack full of liquid fuel synthesized by T-1337. Drink at your own risk! Gives the user a sudden jolting surge of energy, so use it or lose it! [Gives +1000 Magic Attack for 5 seconds.] -2022345 - The Energizer Drink - An energizing drink packed with electrolytes. For 30 minutes, you will receive a boost of: Attack +25, Magic Attack +30, Defense +30 -2022354 - Tick-Tock's Egg - This is Tick-Tock's egg. There must be something inside. -2022355 - Cronos' Egg - This is Cronos' egg. There must be something inside. -2022436 - Holiday Buff - A Holiday present from the Snow Spirit. For 15 min., Speed +5. -2022437 - Holiday Buff - A Holiday present from the Snow Spirit. For 15 min., Jump +7. -2022438 - Holiday Buff - A Holiday present from the Snow Spirit. For 15 min., Speed and Jump +10. -2022439 - Elixir of Darkness - A mysterious concoction of herbs brewed deep within the mountains of El Nath. [Gives +200 Magic Attack, -25 Defense for 5 minutes.] -2022440 - Gold Dust - Ancient dust found long ago by the miners in El Nath. [Gives +20 Defense for 5 minutes.] -2022441 - Adonis Cauldron - A rather clumsy attempt at potion creation by Adonis. Still useful in the hands of a skilled warrior. [Gives +40 Weapon Attack, +50 Avoidability, -30 Defense for 10 minutes.] -2022443 - Fireworks - The fireworks for celebrating MV's defeat. Speed +5, Physical & Magic Attack +5 for 20 min. -2022444 - Mihile's Blessing - Once I used the 'Torn Cygnus' Book', a mysterious power covered me and blessed me. -2022445 - Oz's Blessing - Once I used the 'Torn Cygnus' Book', a mysterious power covered me and blessed me. -2022446 - Irena's Blessing - Once I used the 'Torn Cygnus' Book', a mysterious power covered me and blessed me. -2022447 - Eckhart's Blessing - Once I used the 'Torn Cygnus' Book', a mysterious power covered me and blessed me. -2022448 - Hawkeye's Blessing - Once I used the 'Torn Cygnus' Book', a mysterious power covered me and blessed me. -2022449 - Pink Bean Squad : Victory - Weapon Attack +35, Magic Attack +45, Weapon Defense +250, Magic Defense +250 for one hour. -2022453 - Fireworks - The fireworks for celebrating MV's defeat. Speed +5, Physical & Magic Attack +5 for 20 min. -2022454 - Cygnus's Blessing - Once I completed Cygnus' Book, the spirit's power covered me and blessed me. It increased my Attack Rate by 10, Physical Defense Rate by 80 and Speed by 5 for 10 minutes. -2022538 - Red Easter Egg - A freshly boiled egg colored in red. Recovers 400 HP and MP. -2030000 - Return Scroll - Nearest Town - Returns you to the nearest town. -2030001 - Return Scroll to Lith Harbor - Returns you to Lith Harbor. -2030002 - Return Scroll to Ellinia - Returns you to Ellinia. -2030003 - Return Scroll to Perion - Returns you to Perion. -2030004 - Return Scroll to Henesys - Returns you to Henesys. -2030005 - Return Scroll to Kerning City - Returns you to the dark Kerning City. -2030006 - Return Scroll to Sleepywood - Returns you to Sleepywood, a quiet and dark forest-town. -2030007 - Return Scroll for Dead Mine - Returns you to the dead mine at the higher ground of El Nath.nCan only be used in Orbis and El Nath. -2030008 - Coffee Milk - Returns you to the nearest town. -2030009 - Strawberry Milk - Returns you to Mushroom Shrine. -2030010 - Fruit Milk - Returns you to Showa Town. -2030011 - Command Center Warp Capsule - A warp capsule that allows the owner of the capsule to warp to the Command Center of Omega Sector. -2030012 - Ludibrium Warp Capsule - A warp capsule that returns you to Ludibrium. -2030016 - Phyllia's Warp Powder - Warp powder made by fairy Phyllia. Teleports you to Magatia when used inside the Nihal desert region. -2030019 - Nautilus Return Scroll - This scroll enables you to return to the Pirate village, Nautilus. This is a one use item and will disappear after use. -2030020 - Return to New Leaf City Scroll - Use this scroll to venture back to New Leaf City whenever you want! -2030100 - Return Scroll - Banished Area - Returns you to the map where you were last banished. Requires immediate use and not have changed maps. -2031000 - Masked Man's Invitation - An invitation from the Masked Man to the Halloween Party at the Haunted Mansion. Double-click to move straight to the mansion. -2031001 - Studio Invitation - An invitation to the studio for the event "For Guild Only". -2040000 - Scroll for Helmet for DEF - Improves the helmet's weapon def.\nSuccess rate:100%, weapon def. +1 -2040001 - Scroll for Helmet for DEF - Improves helmet def.\nSuccess rate:60%, weapon def.+2, magic def., +2. The success rate of this scroll can be enhanced by Vega's Spell. -2040002 - Scroll for Helmet for DEF - Improves helmet def.\nSuccess Rate:10%, weapon def.+5, magic def.+3, accuracy+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040003 - Scroll for Helmet for HP - Improves MaxHP on hats.\nSuccess rate:100%, MaxHP+5 -2040004 - Scroll for Helmet for HP - Improves MaxHP on hats.\nSuccess rate:60%, MaxHP+10. The success rate of this scroll can be enhanced by Vega's Spell. -2040005 - Scroll for Helmet for HP - Improves MaxHP on hats.\nSuccess rate:10%, MaxHP+30. The success rate of this scroll can be enhanced by Vega's Spell. -2040006 - Scroll for Helmet for DEF - Improves helmet def.\nSuccess rate:100%, weapon def.+5, magic def.+3, accuracy+1 -2040007 - Scroll for Helmet for HP - Improves MaxHP on hats.\nSuccess rate:100%, MaxHP+30 -2040008 - Dark scroll for Helmet for DEF - Improves helmet def.\nSuccess rate:70%, weapon def.+2, magic def.+1nIf failed, the item will be destroyed at a 50% rate. -2040009 - Dark Scroll for Helmet for DEF - Improves the helmet def.\nSuccess rate:30%, weapon def.+5, magic def.+3, accuracy+1nIf failed, the item will be destroyed in a 50% rate. -2040010 - Scroll for Helmet for HP - Improves MaxHP on hats.\nSuccess Rate:70%, MaxHP+10nIf failed, the item will be destroyed in a 50% rate. -2040011 - Dark Scroll for Helmet for HP - Improves MaxHP on hats.\nSuccess Rate:30%, MaxHP+30nIf failed, the item will be destroyed in a 50% rate. -2040012 - Dark Scroll for Helmet for INT - Improves INT on hats.\nSuccess Rate: 70%. INT+2nIf failed, the item will be destroyed in a 50% rate. -2040013 - Dark Scroll for Helmet for INT - Improves INT on hats.\nSuccess Rate: 30%, INT +3nIf failed, the item will be destroyed in a 50% rate. -2040014 - Dark Scroll for Helmet for Accuracy - Improves the accuracy on the helmet.\nSuccess Rate 70%, Dex+1, accuracy +2nIf failed, the item will be destroyed at a 50% rate. -2040015 - Dark Scroll for Helmet for Accuracy - Improves the accuracy on the helmet.\nSuccess Rate 30%, Dex+2, accuracy +4nIf failed, the item will be destroyed at a 50% rate. -2040016 - Scroll for Helmet for Accuracy - Improves the helmet's accuracy option.\nSuccess Rate 10%, Dex+2, Accuracy +4. The success rate of this scroll can be enhanced by Vega's Spell. -2040017 - Scroll for Helmet for Accuracy - Improves the helmet's accuracy option.\nSuccess Rate 60%, Dex+1, Accuracy +2. The success rate of this scroll can be enhanced by Vega's Spell. -2040018 - Scroll for Helmet for Accuracy - Improves the helmet's accuracy option.\nSuccess Rate 100%, Accuracy +1 -2040019 - Scroll for Helmet for DEF - Improves Weapon Defense on a Helmet.\nSuccess rate: 65%, Weapon Def. +2, Magic Def. +1 -2040020 - Scroll for Helmet for DEF - Improves Weapon Defense on a Helmet.\nSuccess rate: 15%, Weapon Def.+5, Magic Def.+3, Accuracy+1 -2040021 - Scroll for Helmet for MaxHP - Improves MaxHP on a Helmet.\nSuccess rate: 65%, MaxHP +10 -2040022 - Scroll for Helmet for MaxHP - Improves MaxHP on a Helmet.\nSuccess rate: 15%, MaxHP +30 -2040023 - Scroll for Rudolph's Horn 60% - Increases the weapon attack and magic attack of Rudolph's Horn.\nSuccess rate:60%, attack +1, magic att. +1 -2040024 - Scroll for Helmet for INT 100% - Improves INT on headwear..Success rate 100%, INT+1 -2040025 - Scroll for Helmet for INT 60% - Improves INT on headwear.\nSuccess rate 60%, INT+2. The success rate of this scroll can be enhanced by Vega's Spell. -2040026 - Scroll for Helmet for INT 10% - Improves INT on headwear.\nSuccess rate 10%, INT+3. The success rate of this scroll can be enhanced by Vega's Spell. -2040027 - Scroll for Helmet for DEX 100% - Improves DEX on headwear..Success rate 100%, DEX+1 -2040028 - Scroll for Helmet for DEX 70% - Improves DEX on headwear..Success rate 70%, DEX+2nIf failed, the item will be destroyed at a 50% rate. -2040029 - Scroll for Helmet for DEX 60% - Improves DEX on headwear.\nSuccess rate 60%, DEX+2. The success rate of this scroll can be enhanced by Vega's Spell. -2040030 - Scroll for Helmet for DEX 30% - Improves DEX on headwear..Success rate 30%, DEX+3nIf failed, the item will be destroyed at a 50% rate. -2040031 - Scroll for Helmet for DEX 10% - Improves DEX on headwear.\nSuccess rate 10%, DEX+3. The success rate of this scroll can be enhanced by Vega's Spell. -2040100 - Scroll for Face Accessory for HP - Improves MaxHP on face accessories.\nSuccess rate:10%, MaxHP +30. The success rate of this scroll can be enhanced by Vega's Spell. -2040101 - Scroll for Face Accessory for HP - Improves MaxHP on face accessories.\nSuccess rate:60%, MaxHP +15. The success rate of this scroll can be enhanced by Vega's Spell. -2040102 - Scroll for Face Accessory for HP - Improves MaxHP on face accessories.\nSuccess rate:100%, MaxHP +5 -2040103 - Dark Scroll for Face Accessory for HP - Improves MaxHP on face accessories.\nSuccess rate:30%, MaxHP +30 nIf failed, the item will be destroyed at a 50% rate. -2040104 - Dark Scroll for Face Accessory for HP - Improves MaxHP on face accessories.\nSuccess rate:70%, MaxHP +15 nIf failed, the item will be destroyed at a 50% rate. -2040105 - Scroll for Face Accessory for Avoidability - Improves avoidability on face accessories.\nSuccess rate:10%, Avoidability +2, DEX +2. The success rate of this scroll can be enhanced by Vega's Spell. -2040106 - Scroll for Face Accessory for Avoidability - Improves avoidability on face accessories.\nSuccess rate:60%, Avoidability +1, DEX +1. The success rate of this scroll can be enhanced by Vega's Spell. -2040107 - Scroll for Face Accessory for Avoidability - Improves avoidability on face accessories.\nSuccess rate:100%, Avoidability +1 -2040108 - Dark Scroll for Face Accessory for Avoidability - Improves avoidability on face accessories.\nSuccess rate:30%, Avoidability +2, DEX +2 nIf failed, the item will be destroyed at a 50% rate. -2040109 - Dark Scroll for Face Accessory for Avoidability - Improves avoidability on face accessories.\nSuccess rate:70%, Avoidability +1, DEX +1 nIf failed, the item will be destroyed at a 50% rate. -2040200 - Scroll for Eye Accessory for Accuracy - Improves accuracy on eye accessories.\nSuccess rate:10%, Accuracy +3, DEX +1. The success rate of this scroll can be enhanced by Vega's Spell. -2040201 - Scroll for Eye Accessory for Accuracy - Improves accuracy on eye accessories.\nSuccess rate:60%, Accuracy +2. The success rate of this scroll can be enhanced by Vega's Spell. -2040202 - Scroll for Eye Accessory for Accuracy - Improves accuracy on eye accessories.\nSuccess rate:100%, Accuracy +1 -2040203 - Dark Scroll for Eye Accessory for Accuracy - Improves accuracy on eye accessories.\nSuccess rate:30%, Accuracy +3, DEX +1 nIf failed, the item will be destroyed at a 50% rate. -2040204 - Dark Scroll for Eye Accessory for Accuracy - Improves accuracy on eye accessories.\nSuccess rate:70%, Accuracy +2 nIf failed, the item will be destroyed at a 50% rate. -2040205 - Scroll for Eye Accessory for INT - Improves INT on eye accessories.\nSuccess rate:10%, INT +3, Magic Def. +2. The success rate of this scroll can be enhanced by Vega's Spell. -2040206 - Scroll for Eye Accessory for INT - Improves INT on eye accessories.\nSuccess rate:60%, INT +1, Magic Def. +1. The success rate of this scroll can be enhanced by Vega's Spell. -2040207 - Scroll for Eye Accessory for INT - Improves INT on eye accessories.\nSuccess rate:100%, INT +1 -2040208 - Dark Scroll for Eye Accessory for INT - Improves INT on eye accessories.\nSuccess rate:30%, INT +3, Magic Def. +2 nIf failed, the item will be destroyed at a 50% rate. -2040209 - Dark Scroll for Eye Accessory for INT - Improves INT on eye accessories.\nSuccess rate:70%, INT +1, Magic Def. +1 nIf failed, the item will be destroyed at a 50% rate. -2040300 - Scroll for Earring for INT - Improves INT on ear accessory.\nSuccess rate:100%, magic attack+1 -2040301 - Scroll for Earring for INT - Improves INT on ear accessory.\nSuccess rate:60%, magic attack +2, INT+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040302 - Scroll for Earring for INT - Improves INT on ear accessory.\nSuccess rate:10%, magic attack +5, INT+3, magic def. +1. The success rate of this scroll can be enhanced by Vega's Spell. -2040303 - Scroll for Earring for INT - Improves INT on ear accessory.\nSuccess rate:30%, magic attack +5, INT+3, magic def. +1 -2040304 - Dark scroll for Earring for INT - Improves INT on ear accessory.\nSuccess rate:70%, magic attack +2, INT+1nIf failed, the item will be destroyed at a 50% rate. -2040305 - Dark scroll for Earring for INT - Improves INT on ear accessory.\nSuccess rate:30%, magic attack +5, INT+3, magic def. +1nIf failed, the item will be destroyed at a 50% rate. -2040306 - Dark scroll for Earring for DEX - Improves DEX on ear accesrroy.\nSuccess rate: 70%. DEX + 2nIf failed, the item will be destroyed at a 50% rate. -2040307 - Dark scroll for Earring for DEX - Improves DEX on ear accessorynSuccess rate: 30%. DEX + 3nIf failed, the item will be destroyed at a 50% rate. -2040308 - Dark Scroll for Earrings for DEF - Improves DEF on earringsnSuccess Rate 70%, weapon defense+1, magic defense+1nIf failed, the item will be destroyed at a 50% rate. -2040309 - Dark Scroll for Earrings for DEF - Improves DEF on earringsnSuccess Rate 30%, weapon defense+3, magic defense+3, accuracy+1nIf failed, the item will be destroyed at a 50% rate. -2040310 - Scroll for Earring for DEF - Improves DEF on earrings.\nSuccess Rate 10%, weapon defense+3, magic defense+3, Accuracy+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040311 - Scroll for Earring for DEF - Improves DEF on earrings.\nSuccess Rate 60%, weapon defense+1, magic defense+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040312 - Scroll for Earring for DEF - Improves DEF on earringsnSuccess Rate 100%, weapon defense+1 -2040313 - Scroll for Earring for INT - Improves INT on Earrings.\nSuccess rate: 65%, Magic Attack +2, INT+1 -2040314 - Scroll for Earring for INT - Improves INT on Earrings.\nSuccess rate:15%, Magic Attack +5, INT +3, Magic Def. +1 -2040315 - [4yrAnniv]Scroll for Earring for INT - Improves INT on Maple Earring.\nSuccess rate: 40%, Magic Attack +3, INT +2 nIf failed, the item has a 30% chance of being destroyed. -2040316 - Scroll for Earring for DEX 100% - Improves DEX on earrings..\nSuccess rate:100%, DEX+1 -2040317 - Scroll for Earring for DEX 60% - Improves DEX on earrings.\nSuccess rate:60%, DEX+2. The success rate of this scroll can be enhanced by Vega's Spell. -2040318 - Scroll for Earring for DEX 10% - Improves DEX on earrings.\nSuccess rate:10%, DEX+3. The success rate of this scroll can be enhanced by Vega's Spell. -2040319 - Scroll for Earring for LUK 100% - Improves LUK on earrings..\nSuccess rate:100%, LUK+1 -2040320 - Scroll for Earring for LUK 70% - Improves LUK on earrings..\nSuccess rate:70%, LUK+2nIf failed, the item will be destroyed at a 50% rate. -2040321 - Scroll for Earring for LUK 60% - Improves LUK on earrings.\nSuccess rate:60%, LUK+2. The success rate of this scroll can be enhanced by Vega's Spell. -2040322 - Scroll for Earring for LUK 30% - Improves LUK on earrings..\nSuccess rate:30%, LUK+3nIf failed, the item will be destroyed at a 50% rate. -2040323 - Scroll for Earring for LUK 10% - Improves LUK on earrings.\nSuccess rate:10%, LUK+3. The success rate of this scroll can be enhanced by Vega's Spell. -2040324 - Scroll for Earring for HP 100% - Improves HP on earrings..\nSuccess rate:100%, MaxHP+5 -2040325 - Scroll for Earring for HP 70% - Improves HP on earrings..\nSuccess rate:70%, MaxHP+15nIf failed, the item will be destroyed at a 50% rate. -2040326 - Scroll for Earring for HP 60% - Improves HP on earrings.\nSuccess rate:60%, MaxHP+15. The success rate of this scroll can be enhanced by Vega's Spell. -2040327 - Scroll for Earring for HP 30% - Improves HP on earrings..\nSuccess rate:30%, MaxHP+30nIf failed, the item will be destroyed at a 50% rate. -2040328 - Scroll for Earring for HP 10% - Improves HP on earrings.\nSuccess rate:10%, MaxHP+30. The success rate of this scroll can be enhanced by Vega's Spell. -2040400 - Scroll for Topwear for DEF - Improves weapon def. on topwear.\nSuccess rate:100%, weapon def.+1 -2040401 - Scroll for Topwear for DEF - Improves weapon def. on topwear.\nSuccess rate:60%, weapon def.+2, magic def.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040402 - Scroll for Topwear for DEF - Improves weapon def. on topwear.\nSuccess rate:10%, weapon def. +5, magic def. +3, MaxHP+10. The success rate of this scroll can be enhanced by Vega's Spell. -2040403 - Scroll for Topwear for DEF - Improves weapon def. on topwear.\nSuccess rate:100%, weapon def. +5, magic def. +3, MaxHP+10 -2040404 - Dark scroll for Topwear for DEF - Improves weapon def. on topwear.\nSuccess rate:70%, weapon def. +2, magic def. +1nIf failed, the item will be destroyed at a 50% rate. -2040405 - Dark scroll for Topwear for DEF - Improves weapon def. on topwear.\nSuccess rate:30%, weapon def. +5, magic def. +3, MaxHP+10nIf failed, the item will be destroyed at a 50% rate. -2040406 - Dark scroll for Topwear for STR - Improves STR on topwear.\nSuccess rate: 70%, STR + 2nIf failed, the item will be destroyed at a 50% rate. -2040407 - Dark scroll for Topwear for STR - Improves STR on topwear.\nSuccess rate: 30%, STR + 3nIf failed, the item will be destroyed at a 50% rate. -2040408 - Dark scroll for Topwear for HP - Improves HP on topwear.\nSuccess rate: 70%, MaxHP + 15nIf failed, the item will be destroyed at a 50% rate. -2040409 - Dark scroll for Topwear for HP - Improves HP on topwear.\nSuccess rate: 30%, MaxHP + 30nIf failed, the item will be destroyed at a 50% rate. -2040410 - Dark Scroll for Topwear for LUK - Improves LUK on the topwear.\nSuccess Rate 70%, LUK+2, avoidability+1nIf failed, the item will be destroyed at a 50% rate. -2040411 - Dark Scroll for Topwear for LUK - Improves LUK on the topwear.\nSuccess Rate 30%, LUK+3, avoidability+3nIf failed, the item will be destroyed at a 50% rate. -2040412 - Scroll for Topwear for LUK - Improves LUK on the topwear.\nSuccess Rate 10%, LUK+3, avoidability+3. The success rate of this scroll can be enhanced by Vega's Spell. -2040413 - Scroll for Topwear for LUK - Improves LUK on the topwear.\nSuccess Rate 60%, LUK+2, avoidability+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040414 - Scroll for Topwear for LUK - Improves LUK on the topwear.\nSuccess Rate 100%, LUK+1 -2040415 - Scroll for Topwear for DEF - Improves Weapon Def. on Topwear.\nSuccess rate: 65%, Weapon Def. +2, Magic Def. +1 -2040416 - Scroll for Topwear for DEF - Improves Weapon Def. on Topwear.\nSuccess rate: 15%, Weapon Def. +5, Magic Def. +3, MaxHP +10 -2040417 - Scroll for Topwear for STR 100% - Improves strength on topwear..Success rate 100%, STR+1 -2040418 - Scroll for Topwear for STR 60% - Improves strength on topwear.\nSuccess rate 60%, STR+2. The success rate of this scroll can be enhanced by Vega's Spell. -2040419 - Scroll for Topwear for STR 10% - Improves strength on topwear.\nSuccess rate 10%, STR+3. The success rate of this scroll can be enhanced by Vega's Spell. -2040420 - Scroll for Topwear for HP 100% - Improves HP on topwear..Success rate 100%, MaxHP + 5 -2040421 - Scroll for Topwear for HP 60% - Improves HP on topwear.\nSuccess rate 60%, MaxHP + 15. The success rate of this scroll can be enhanced by Vega's Spell. -2040422 - Scroll for Topwear for HP 10% - Improves HP on topwear.\nSuccess rate 10%, MaxHP + 30. The success rate of this scroll can be enhanced by Vega's Spell. -2040423 - Scroll for Topwear for LUK 100% - Improves luck on topwear..\nSuccess rate:100%, LUK+1 -2040424 - Scroll for Topwear for LUK 70% - Improves luck on topwear..\nSuccess rate:70%, LUK+2nIf failed, the item will be destroyed at a 50% rate. -2040425 - Scroll for Topwear for LUK 60% - Improves luck on topwear.\nSuccess rate:60%, LUK+2. The success rate of this scroll can be enhanced by Vega's Spell. -2040426 - Scroll for Topwear for LUK 30% - Improves luck on topwear..\nSuccess rate:30%, LUK+3nIf failed, the item will be destroyed at a 50% rate. -2040427 - Scroll for Topwear for LUK 10% - Improves luck on topwear.\nSuccess rate:10%, LUK+3. The success rate of this scroll can be enhanced by Vega's Spell. -2040500 - Scroll for Overall Armor for DEX - Improves dexterity on the overall armor.\nSuccess rate:100%, DEX+1 -2040501 - Scroll for Overall Armor for DEX - Improves dexterity on the overall armor.\nSuccess rate:60%, DEX+2, accuracy+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040502 - Scroll for Overall Armor for DEX - Improves dexterity on the overall armor.\nSuccess rate:10%, DEX+5, accuracy+3, speed+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040503 - Scroll for Overall Armor for DEF - Improves weapon def. on the overall armor.\nSuccess rate:100%, weapon def.+1 -2040504 - Scroll for Overall Armor for DEF - Improves def. on the overall armor.\nSuccess rate:60%, weapon def.+2, magic def.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040505 - Scroll for Overall Armor for DEF - Improves def. on the overall armor.\nSuccess rate:10%, wepon def. +5, magic def. +3, MaxHP+10. The success rate of this scroll can be enhanced by Vega's Spell. -2040506 - Scroll for Overall Armor for DEX - Improves dexterity on the overall armor.\nSuccess rate:100%, DEX+5, accuracy+3, speed+1 -2040507 - Scroll for Overall Armor for DEF - Improves weapon def. on the overall armor.\nSuccess rate:30%, weapon def.+5, magic def.+3, MaxHP+10 -2040508 - Dark scroll for Overall Armor for DEX - Improves dexterity on the overall armor.\nSuccess rate:70%, DEX+2, accuracy+1nIf failed, the item will be destroyed at a 50% rate. -2040509 - Dark scroll for Overall Armor for DEX - Improves dexterity on the overall armor.\nSuccess rate:30%, DEX+4, accuracy+3, speed+1nIf failed, the item will be destroyed at a 50% rate. -2040510 - Dark scroll for Overall Armor for DEF - Improves weapon def. on the overall armor.\nSuccess rate:70%, weapon def.+2, magic def.+1nIf failed, the item will be destroyed at a 50% rate. -2040511 - Dark scroll for Overall Armor for DEF - Improves weapon def. on the overall armor.\nSuccess rate:30%, weapon def.+5, magic def.+3, MaxHP+10nIf failed, the item will be destroyed at a 50% rate. -2040512 - Scroll for Overall Armor for INT - Improves INT on the overall armor.\nSuccess rate: 100%, INT + 1 -2040513 - Scroll for Overall Armor for INT - Improves INT on the overall armor.\nSuccess rate: 60%, INT + 2, magic def. +1. The success rate of this scroll can be enhanced by Vega's Spell. -2040514 - Scroll for Overall Armor for INT - Improves INT on the overall armor.\nSuccess rate: 10%, INT + 5, magic def. + 3, MaxMP + 10. The success rate of this scroll can be enhanced by Vega's Spell. -2040515 - Scroll for Overall Armor for LUK - Improves LUK on the overall armor.\nSuccess rate: 100%, LUK + 1 -2040516 - Scroll for Overall Armor for LUK - Improves LUK on the overall armor.\nSuccess rate: 60%, LUK + 2, avoidability + 1. The success rate of this scroll can be enhanced by Vega's Spell. -2040517 - Scroll for Overall Armor for LUK - Improves LUK on the overall armor.\nSuccess rate: 10%, LUK + 5, avoidability + 3, accuracy + 1. The success rate of this scroll can be enhanced by Vega's Spell. -2040518 - Dark scroll for Overall Armor for INT - Improves INT on the overall armor.\nSuccess rate:70%, INT+2, magic defense+1nIf failed, the item will be destroyed at a 50% rate. -2040519 - Dark scroll for Overall Armor for INT - Improves INT on the overall armor.\nSuccess rate:30%, INT+5, magic defense+3, MaxMP+10nIf failed, the item will be destroyed at a 50% rate. -2040520 - Dark scroll for Overall Armor for LUK - Improves LUK on the overall armor.\nSuccess rate:70%, LUK+2, avoidability+1nIf failed, the item will be destroyed at a 50% rate. -2040521 - Dark scroll for Overall Armor for LUK - Improves LUK on the overall armor.\nSuccess rate:30%, LUK+5, avoidability+3, accuracy+1nIf failed, the item will be destroyed at a 50% rate. -2040522 - Scroll for Overall Armor for DEX - Improves DEX on Overall Armor.\nSuccess rate: 65%, DEX +2, Accuracy +1 -2040523 - Scroll for Overall Armor for DEX - Improves DEX on Overall Armor.\nSuccess rate: 15%, DEX +5, Accuracy+3, Speed +1 -2040524 - Overall Armor Scroll for DEF - Improves Weapon Def. on Overall Armor.\nSuccess rate: 65%, Weapon Def. +2, Magic Def. +1 -2040525 - Overall Armor Scroll for DEF - Improves Weapon Def. on Overall Armor.\nSuccess rate: 15%, Weapon Def. +5, Magic Def. +3, MaxHP +10 -2040526 - Scroll for Overall Armor for INT - Improves INT on the Overall Armor.\nSuccess rate: 65%, INT +2, Magic Def. +1 -2040527 - Scroll for Overall Armor for INT - Improves INT on the overall armor.\nSuccess rate:15%, INT+5, magic def.+3, MaxMP+10 -2040528 - Scroll for Overall Armor for LUK - Improves LUK on the overall armor.\nSuccess rate:65%, LUK+2, avoidability+1 -2040529 - Scroll for Overall Armor for LUK - Improves LUK on the overall armor.\nSuccess rate:15%, LUK+5, avoidability+3, accuracy+1 -2040530 - Scroll for Overall for STR 100% - Improves strength on overalls..\nSuccess rate:100%, STR+1 -2040531 - Scroll for Overall for STR 70% - Improves strength on overalls..\nSuccess rate:70%, STR+2, weapon def.+1nIf failed, the item will be destroyed at a 50% rate. -2040532 - Scroll for Overall for STR 60% - Improves strength on overalls.\nSuccess rate:60%, STR+2, weapon def.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040533 - Scroll for Overall for STR 30% - Improves strength on overalls..\nSuccess rate:30%, STR+5, weapon def.+3, MaxHp+5nIf failed, the item will be destroyed at a 50% rate. -2040534 - Scroll for Overall for STR 10% - Improves strength on overalls.\nSuccess rate:10%, STR+5, weapon def.+3, MaxHP+5. The success rate of this scroll can be enhanced by Vega's Spell. -2040600 - Scroll for Bottomwear for DEF - Improves weapon def. on the bottomwear. nSuccess rate:100%, weapon def. +1 -2040601 - Scroll for Bottomwear for DEF - Improves weapon def. on the bottomwear.\nSuccess rate:60%, weapon def. +2, magic def. +1. The success rate of this scroll can be enhanced by Vega's Spell. -2040602 - Scroll for Bottomwear for DEF - Improves weapon def. on the bottomwear.\nSuccess rate:10%, weapon def.+5, magic def.+3, MaxHP+10. The success rate of this scroll can be enhanced by Vega's Spell. -2040603 - Scroll for Bottomwear for DEF - Improves weapon def. on the bottomwear.\nSuccess rate:100%, weapon def.+5, magic def.+3, MaxHP+10 -2040604 - Dark scroll for Bottomwear for DEF - Improves weapon def. on the bottomwear.\nSuccess rate:70%, weapon def.+2, magic def.+1nIf failed, the item will be destroyed at a 50% rate. -2040605 - Dark scroll for Bottomwear for DEF - Improves weapon def. on the bottomwear.\nSuccess rate: 30%, weapon def.+5, magic def. + 3, MaxHP + 10nIf failed, the item will be destroyed at a 50% rate. -2040606 - Dark scroll for Bottomwear for Jump - Improves jump on the bottomwear.\nSuccess rate: 70%, jump + 2, avoidability + 1nIf failed, the item will be destroyed at a 50% rate. -2040607 - Dark scroll for Bottomwear for Jump - Improves jump on the bottomwear.\nSuccess rate: 30%. jump + 4, avoidability + 2nIf failed, the item will be destroyed at a 50% rate. -2040608 - Dark scroll for Bottomwear for HP - Improves HP on the bottomwear.\nSuccess rate: 70%. MaxHP + 15nIf failed, the item will be destroyed at a 50% rate. -2040609 - Dark scroll for Bottomwear for HP - Improves HP on the bottomwear.\nSuccess rate: 30%. MaxHP + 30nIf failed, the item will be destroyed at a 50% rate. -2040610 - Dark Scroll for Bottomwear for DEX - Improves dexterity on the bottomwear.\nSuccess Rate 70%, DEX+2, speed+1nIf failed, the item will be destroyed at a 50% rate. -2040611 - Dark Scroll for Bottomwear for DEX - Improves dexterity on the bottomwear.\nSuccess Rate 30%, DEX+3, speed+3nIf failed, the item will be destroyed at a 50% rate. -2040612 - Scroll for Bottomwear for DEX - Improves dexterity on the bottomwear.\nSuccess Rate 10%, DEX+3, speed+3. The success rate of this scroll can be enhanced by Vega's Spell. -2040613 - Scroll for Bottomwear for DEX - Improves dexterity on the bottomwear.\nSuccess Rate 60%, DEX+2, speed+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040614 - Scroll for Bottomwear for DEX - Improves dexterity on the bottomwear.\nSuccess Rate 100%, DEX+1 -2040615 - Scroll for Bottomwear for DEF - Improves weapon def. on bottomwear.\nSuccess rate:65%, weapon def.+2, magic def.+1 -2040616 - Scroll for Bottomwear for DEF - Improves weapon def. on bottomwear.\nSuccess rate:15%, weapon def.+5, magic def.+3, MaxHP+10 -2040617 - Scroll for Bottomwear for Jump 100% - Improves jumping abilities on bottomwears..\nSuccess rate:100%, jump+1 -2040618 - Scroll for Bottomwear for Jump 60% - Improves jumping abilities on bottomwears.\nSuccess rate:60%, jump+2, avoidability+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040619 - Scroll for Bottomwear for Jump 10% - Improves jumping abilities on bottomwears..\nSuccess rate:10%, jump+4, avoidability+2. The success rate of this scroll can be enhanced by Vega's Spell. -2040620 - Scroll for Bottomwear for HP 100% - Improves HP on bottomwears..\nSuccess rate:100%, MaxHP+5 -2040621 - Scroll for Bottomwear for HP 60% - Improves HP on bottomwears.\nSuccess rate:60%, MaxHP+15. The success rate of this scroll can be enhanced by Vega's Spell. -2040622 - Scroll for Bottomwear for HP 10% - Improves HP on bottomwears.\nSuccess rate:10%, MaxHP+30. The success rate of this scroll can be enhanced by Vega's Spell. -2040623 - Scroll for Bottomwear for DEX 100% - Improves dexterity on bottomwears..\nSuccess rate:100%, DEX+1 -2040624 - Scroll for Bottomwear for DEX 70% - Improves dexterity on bottomwears..\nSuccess rate:70%, DEX+2, accuracy+1nIf failed, the item will be destroyed at a 50% rate. -2040625 - Scroll for Bottomwear for DEX 60% - Improves dexterity on bottomwears.\nSuccess rate:60%, DEX+2, accuracy+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040626 - Scroll for Bottomwear for DEX 30% - Improves dexterity on bottomwears..\nSuccess rate:30%, DEX+3, accuracy+2, speed+1nIf failed, the item will be destroyed at a 50% rate. -2040627 - Scroll for Bottomwear for DEX 10% - Improves dexterity on bottomwears.\nSuccess rate:10%, DEX+3, accuracy+2, speed+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040700 - Scroll for Shoes for DEX - Improves dexterity on shoes.\nSuccess rate:100%, Avoidability+1 -2040701 - Scroll for Shoes for DEX - Improves dexterity on shoes.\nSuccess rate:60%, Avoidability +2, Accuracy+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040702 - Scroll for Shoes for DEX - Improves dexterity on shoes.\nSuccess rate:10%, Avoidability +5, accuracy +3, speed+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040703 - Scroll for Shoes for Jump - Improves jump on shoes.\nSuccess rate:100%, jump +1 -2040704 - Scroll for Shoes for Jump - Improves jump on shoes.\nSuccess rate: 60%, jump +2, DEX+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040705 - Scroll for Shoes for Jump - Improves jump on shoes.\nSuccess rate:10%, jump+5, DEX+3, speed+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040706 - Scroll for Shoes for Speed - Improves speed on shoes.\nSuccess rate:100%, speed+1 -2040707 - Scroll for Shoes for Speed - Improves speed on shoes.\nSuccess rate:60%, speed+2 -2040708 - Scroll for Shoes for Speed - Improves speed on shoes.\nSuccess rate:10%, speed+3. The success rate of this scroll can be enhanced by Vega's Spell. -2040709 - Scroll for Shoes for DEX - Improves DEX on shoes.\nSuccess rate:100%, avoidability+5, accuracy+3, speed+1 -2040710 - Scroll for Shoes for Jump - Improves jump on shoes.\nSuccess rate:100%, jump+5, DEX+3, speed+1 -2040711 - Scroll for Shoes for Speed - Improves speed on shoes.\nSuccess rate:100%, speed+3 -2040712 - Dark scroll for Shoes for DEX - Improves DEX on shoes.\nSuccess rate:70%, avoidability+2, accuracy+1nIf failed, the item will be destroyed at a 50% rate. -2040713 - Dark scroll for Shoes for DEX - Improves DEX on shoes.\nSuccess rate:30%, avoidability+5, accuracy+3, speed+1nIf failed, the item will be destroyed at a 50% rate. -2040714 - Dark scroll for Shoes for Jump - Improves jump on shoes.\nSuccess rate:70%, jump+2, DEX+1nIf failed, the item will be destroyed at a 50% rate. -2040715 - Dark scroll for Shoes for Jump - Improves jump on shoes.\nSuccess rate:30%, jump+5, DEX+3, speed+1nIf failed, the item will be destroyed at a 50% rate. -2040716 - Dark scroll for Shoes for Speed - Improves speed on shoes.\nSuccess rate:70%, speed+2nIf failed, the item will be destroyed at a 50% rate. -2040717 - Dark scroll for Shoes for Speed - Improves speed on shoes.\nSuccess rate:30%, speed+3nIf failed, the item will be destroyed at a 50% rate. -2040718 - Scroll for Shoes for DEX - Improves dexterity on shoes.\nSuccess rate:65%, avoidability+2, accuracy+1 -2040719 - Scroll for Shoes for DEX - Improves dexterity on shoes.\nSuccess rate:15%, avoidability+5, accuracy+3, speed+1 -2040720 - Scroll for Jump for DEX - Improves jump on shoes.\nSuccess rate:65%, jump+2, DEX+1 -2040721 - Scroll for Jump for DEX - Improves jump on shoes.\nSuccess rate:15%, jump+5, DEX+3, speed+1 -2040722 - Scroll for Speed for DEX - Improves speed on shoes.\nSuccess rate:65%, speed+2 -2040723 - Scroll for Speed for DEX - Improves speed on shoes.\nSuccess rate:15%, speed+3 -2040727 - Scroll for Spikes on Shoes 10% - Adds traction to the shoes, which prevents the shoes from slipping on slippery surface.\nSuccess rate:10%, Does not affect the number of upgrades available. The success rate of this scroll can be enhanced by Vega's Spell. -2040800 - Scroll for Gloves for DEX - Improves dexterity on gloves.\nSuccess rate:100%, accurcacy +1 -2040801 - Scroll for Gloves for DEX - Improves dexterity on gloves.\nSuccess rate: 60%, accuracy+2, DEX+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040802 - Scroll for Gloves for DEX - Improves dexterity on gloves.\nSuccess rate:10%, accuracy+5, DEX+3, avoidability+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040803 - Scroll for Gloves for ATT - Improves attack on gloves.\nSuccess rate:100%, weapon att. +1 -2040804 - Scroll for Gloves for ATT - Improves attack on gloves.\nSuccess rate 60%, weapon att. +2. The success rate of this scroll can be enhanced by Vega's Spell. -2040805 - Scroll for Gloves for ATT - Improves attack on gloves.\nSuccess rate:10%, weapon att.+3. The success rate of this scroll can be enhanced by Vega's Spell. -2040806 - Scroll for Gloves for DEX - Improves DEX on the glove.\nSuccess rate:100%, accuracy+5, DEX+3, avoidability+1 -2040807 - Scroll for Gloves for ATT - Improves weapon att. on the glove.\nSuccess rate:100%, weapon att.+3 -2040808 - Dark scroll for Gloves for DEX - Improves DEX on the glove.\nSuccess rate:70%, accuracy+2, DEX+1nIf failed, the item will be destroyed at a 50% rate. -2040809 - Dark scroll for Gloves for DEX - Improves DEX on the glove.\nSuccess rate:30%, accuracy+5, DEX+3, avoidability+1nIf failed, the item will be destroyed at a 50% rate. -2040810 - Dark scroll for Gloves for ATT - Improves weapon att. on the glove.\nSuccess rate:70%, weapon att.+2nIf failed, the item will be destroyed at a 50% rate. -2040811 - Dark scroll for Gloves for ATT - Improves weapon att. on the glove.\nSuccess rate:30%, weapon att.+3nIf failed, the item will be destroyed at a 50% rate. -2040812 - Dark scroll for Gloves for HP - Improves HP on the glove.\nSuccess rate: 70%, MaxHP+15nIf failed, the item will be destroyed at a 50% rate. -2040813 - Dark scroll for Gloves for HP - Improves HP on the glove.\nSuccess rate: 30%, MaxHP + 30nIf failed, the item will be destroyed at a 50% rate. -2040814 - Dark Scroll for Gloves for Magic Att. - Improves magic attack on the glove.\nSuccess Rate 70%, magic attack+1, INT+1nIf failed, the item will be destroyed at a 50% rate. -2040815 - Dark Scroll for Gloves for Magic Att. - Improves magic attack on the glove.\nSuccess Rate 30%, magic attack+3, INT+3, magic defense+1nIf failed, the item will be destroyed at a 50% rate. -2040816 - Scroll for Gloves for Magic Att. - Improves magic attack on the glove.\nSuccess Rate 10%, magic defense+1, magic attack+3, INT+3. The success rate of this scroll can be enhanced by Vega's Spell. -2040817 - Scroll for Gloves for Magic Att. - Improves magic attack on the glove.\nSuccess Rate 60%, magic attack+1, INT+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040818 - Scroll for Gloves for Magic Att. - Improves magic attack on the glove.\nSuccess Rate 100%, magic attack+1 -2040819 - Scroll for Gloves for DEX - Improves dexterity on gloves.\nSuccess rate:65%, accuracy+2, DEX+1 -2040820 - Scroll for Gloves for DEX - Improves dexterity on gloves.\nSuccess rate:15%, accuracy+5, DEX+3, avoidability+1 -2040821 - Scroll for Gloves for ATT - Improves attack on gloves.\nSuccess rate:65%, weapon attack+2 -2040822 - Scroll for Gloves for ATT - Improves attack on gloves.\nSuccess rate:15%, weapon attack+3 -2040823 - Scroll for Gloves for HP 100% - Improves HP on gloves..\nSuccess rate:100%, MaxHP+5 -2040824 - Scroll for Gloves for HP 60% - Improves HP on gloves.\nSuccess rate:60%, MaxHP+15. The success rate of this scroll can be enhanced by Vega's Spell. -2040825 - Scroll for Gloves for HP 10% - Improves HP on gloves.\nSuccess rate:10%, MaxHP+30. The success rate of this scroll can be enhanced by Vega's Spell. -2040900 - Scroll for Shield for DEF - Improves weapon def. on the shield.\nSuccess rate:100%, weapon def. +1 -2040901 - Scroll for Shield for DEF - Improves weapon def. on the shield.\nSuccess rate:60%, weapon def.+2, magic def.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040902 - Scroll for Shield for DEF - Improves weapon def. on the shield.\nSuccess rate 10%, weapon def.+5, magic def.+3, MaxHP+10. The success rate of this scroll can be enhanced by Vega's Spell. -2040903 - Scroll for Shield for DEF - Improves weapon def. on the shield.\nSuccess rate 100%, weapon def.+5, magic def.+3, MaxHP+10 -2040904 - Dark scroll for Shield for DEF - Improves weapon def. on the shield.\nSuccess rate 70%, weapon def.+2, magic def.+1nIf failed, the item will be destroyed at a 50% rate. -2040905 - Dark scroll for Shield for DEF - Improves weapon def. on the shield.\nSuccess rate 30%, weapon def.+5, magic def.+3, MaxHP+10nIf failed, the item will be destroyed at a 50% rate. -2040906 - Dark scroll for Shield for LUK - Improves LUK on the shield.\nSuccess rate: 70%, LUK + 2nIf failed, the item will be destroyed at a 50% rate. -2040907 - Dark scroll for Shield for LUK - Improves LUK on the shield.\nSuccess rate: 30%, LUK + 3nIf failed, the item will be destroyed at a 50% rate. -2040908 - Dark scroll for Shield for HP - Improves HP on the shield.\nSuccess rate: 70%, MaxHP + 15nIf failed, the item will be destroyed at a 50% rate. -2040909 - Dark scroll for Shield for HP - Improves HP on the shield.\nSuccess rate: 30%, MaxHP + 30nIf failed, the item will be destroyed at a 50% rate. -2040910 - Scroll for Shield for DEF - Improves weapon defense on the shield.\nSuccess rate:65%, weapon def.+2, magic def.+1 -2040911 - Scroll for Shield for DEF - Improves weapon defense on the shield.\nSuccess rate:15%, weapon def.+5, magic def.+3, MaxHP+10 -2040912 - [4yrAnniv]Scroll for Shield for DEF - Improves weapon defense for Maple Magician shield, Maple warrior shield, and the Maple Shibus shield. nSuccess rate:40%, weapon def.+3, magic def.+2 nIf failed, the item will be destroyed at a 30% rate. -2040914 - Scroll for Shield for Weapon Att. - Improves weapon attack on the shield.\nSuccess Rate 60%, W. attack+2, STR+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040915 - Scroll for Shield for Weapon Att. - Improves weapon attack on the shield.\nSuccess Rate 10%, W. attack+3, STR+2. The success rate of this scroll can be enhanced by Vega's Spell. -2040916 - Dark Scroll for Shield for Weapon Att. - Improves weapon attack on the shield.\nSuccess Rate 70%, W. attack+2, STR+1nIf failed, the item will be destroyed at a 50% rate. -2040917 - Dark Scroll for Shield for Weapon Att. - Improves weapon attack on the shield.\nSuccess Rate 30%, W. attack+3, STR+2nIf failed, the item will be destroyed at a 50% rate. -2040918 - Scroll for Shield for Magic Att. - Improves magic attack on the shield.\nSuccess Rate 100%, magic attack+1 -2040919 - Scroll for Shield for Magic Att. - Improves magic attack on the shield.\nSuccess Rate 60%, magic attack+2, INT+1. The success rate of this scroll can be enhanced by Vega's Spell. -2040920 - Scroll for Shield for Magic Att. - Improves magic attack on the shield.\nSuccess Rate 10%, magic attack+3, INT+2. The success rate of this scroll can be enhanced by Vega's Spell. -2040921 - Dark Scroll for Shield for Magic Att. - Improves magic attack on the shield.\nSuccess Rate 70%, magic attack+2, INT+1nIf failed, the item will be destroyed at a 50% rate. -2040922 - Dark Scroll for Shield for Magic Att. - Improves magic attack on the shield.\nSuccess Rate 50%, magic attack+3, INT+2nIf failed, the item will be destroyed at a 50% rate. -2040923 - Scroll for Shield for LUK 100% - Improves LUK on shields..\nSuccess rate:100%, LUK+1 -2040924 - Scroll for Shield for LUK 60% - Improves LUK on shields.\nSuccess rate:60%, LUK+2. The success rate of this scroll can be enhanced by Vega's Spell. -2040925 - Scroll for Shield for LUK 10% - Improves LUK on shields.\nSuccess rate:10%, LUK+3. The success rate of this scroll can be enhanced by Vega's Spell. -2040926 - Scroll for Shield for HP 100% - Improves HP on shields..\nSuccess rate:100%, MaxHP+5 -2040927 - Scroll for Shield for HP 60% - Improves HP on shields.\nSuccess rate:60%, MaxHP+15. The success rate of this scroll can be enhanced by Vega's Spell. -2040928 - Scroll for Shield for HP 10% - Improves HP on shields.\nSuccess rate:10%, MaxHP+30. The success rate of this scroll can be enhanced by Vega's Spell. -2040929 - Scroll for Shield for STR 100% - Improves strength on shields..\nSuccess rate:100%, STR+1 -2040930 - Scroll for Shield for STR 70% - Improves strength on shields..\nSuccess rate:70%, STR+2nIf failed, the item will be destroyed at a 50% rate. -2040931 - Scroll for Shield for STR 60% - Improves strength on shields.\nSuccess rate:60%, STR+2. The success rate of this scroll can be enhanced by Vega's Spell. -2040932 - Scroll for Shield for STR 30% - Improves strength on shields..\nSuccess rate:30%, STR+3nIf failed, the item will be destroyed at a 50% rate. -2040933 - Scroll for Shield for STR 10% - Improves strength on shields.\nSuccess rate:10%, STR+3. The success rate of this scroll can be enhanced by Vega's Spell. -2041000 - Scroll for Cape for Magic Def. - Improves magic def. on the cape.\nSuccess rate:100%, magic def. +1 -2041001 - Scroll for Cape for Magic Def. - Improves magic def. on the cape.\nSuccess rate:60%, magic def.+3, weapon def.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2041002 - Scroll for Cape for Magic Def. - Improves magic def. on the cape.\nSuccess rate:10%, magic def. +5, weapon def. +3, MaxMP+10. The success rate of this scroll can be enhanced by Vega's Spell. -2041003 - Scroll for Cape for Weapon Def. - Improves weapon def. on the cape.\nSuccess rate:100%, weapon def.+1 -2041004 - Scroll for Cape for Weapon Def. - Improves weapon def. on the cape.\nSuccess rate:60%, weapon def.+3, magic def. +1. The success rate of this scroll can be enhanced by Vega's Spell. -2041005 - Scroll for Cape for Weapon Def. - Improves weapon def. on the cape.\nSuccess rate:10%, weapon def. +5, magic def.+3, MaxHP+10. The success rate of this scroll can be enhanced by Vega's Spell. -2041006 - Scroll for Cape for HP - Improves MaxHP on the cape.\nSuccess rate:100%, MaxHP+5 -2041007 - Scroll for Cape for HP - Improves MaxHP on the cape.\nSuccess rate:60%, MaxHP+10. The success rate of this scroll can be enhanced by Vega's Spell. -2041008 - Scroll for Cape for HP - Improves MaxHP on the cape.\nSuccess rate:10%, MaxHP+20. The success rate of this scroll can be enhanced by Vega's Spell. -2041009 - Scroll for Cape for MP - Improves MaxMP on the cape.\nSuccess rate:100%, MaxMP+5 -2041010 - Scroll for Cape for MP - Improves MaxMP on the cape.\nSuccess rate:60%, MaxMP+10. The success rate of this scroll can be enhanced by Vega's Spell. -2041011 - Scroll for Cape for MP - Improves MaxMP on the cape.\nSuccess rate:10%, MaxMP+20. The success rate of this scroll can be enhanced by Vega's Spell. -2041012 - Scroll for Cape for STR - Improves STR on the cape.\nSuccess rate:100%, STR+1 -2041013 - Scroll for Cape for STR - Improves STR on the cape.\nSuccess rate:60%, STR+2. The success rate of this scroll can be enhanced by Vega's Spell. -2041014 - Scroll for Cape for STR - Improves STR on the cape.\nSuccess rate:10%, STR+3. The success rate of this scroll can be enhanced by Vega's Spell. -2041015 - Scroll for Cape for INT - Improves INT on the cape.\nSuccess rate:100%, INT+1 -2041016 - Scroll for Cape for INT - Improves INT on the cape.\nSuccess rate:60%, INT+2. The success rate of this scroll can be enhanced by Vega's Spell. -2041017 - Scroll for Cape for INT - Improves INT on the cape.\nSuccess rate:10%, INT+3. The success rate of this scroll can be enhanced by Vega's Spell. -2041018 - Scroll for Cape for DEX - Improves DEX on the cape.\nSuccess rate:100%, DEX+1 -2041019 - Scroll for Cape for DEX - Improves DEX on the cape.\nSuccess rate:60%, DEX+2. The success rate of this scroll can be enhanced by Vega's Spell. -2041020 - Scroll for Cape for DEX - Improves DEX on the cape.\nSuccess rate:10%, DEX+3. The success rate of this scroll can be enhanced by Vega's Spell. -2041021 - Scroll for Cape for LUK - Improves LUK on the cape.\nSuccess rate:100%, LUK+1 -2041022 - Scroll for Cape for LUK - Improves LUK on the cape.\nSuccess rate:60%, LUK+2. The success rate of this scroll can be enhanced by Vega's Spell. -2041023 - Scroll for Cape for LUK - Improves LUK on the cape.\nSuccess rate:10%, LUK+3. The success rate of this scroll can be enhanced by Vega's Spell. -2041024 - Scroll for Cape for Magic Def. - Improves magic def. on the cape.\nSuccess rate:100%, magic def.+5, weapon def.+3, MaxMP+10 -2041025 - Scroll for Cape for Weapon Def. - Improves weapon def. on the cape.\nSuccess rate:100%, weapon def.+5, magic def.+3, MaxHP+10 -2041026 - Dark scroll for Cape for Magic Def. - Improves magic def. on the cape.\nSuccess rate:70%, magic def.+3, weapon def.+1nIf failed, the item will be destroyed at a 50% rate. -2041027 - Dark scroll for Cape for Magic Def. - Improves magic def. on the cape.\nSuccess rate:30%, magic def.+5, weapon def.+3, MaxMP+10nIf failed, the item will be destroyed at a 50% rate. -2041028 - Dark scroll for Cape for Weapon Def. - Improves weapon def. on the cape.\nSuccess rate:70%, weapon def.+3, magic def.+1nIf failed, the item will be destroyed at a 50% rate. -2041029 - Dark scroll for Cape for Weapon Def. - Improves weapon def. on the cape.\nSuccess rate:30%, weapon def.+5, magic def.+3, MaxHP+10nIf failed, the item will be destroyed at a 50% rate. -2041030 - Dark scroll for Cape for HP - Improves MaxHP on the cape.\nSuccess rate:70%, MaxHP+10nIf failed, the item will be destroyed at a 50% rate. -2041031 - Dark scroll for Cape for HP - Improves MaxHP on the cape.\nSuccess rate:30%, MaxHP+20nIf failed, the item will be destroyed at a 50% rate. -2041032 - Dark scroll for Cape for MP - Improves MaxMP on the cape.\nSuccess rate:70%, MaxMP+10nIf failed, the item will be destroyed at a 50% rate. -2041033 - Dark scroll for Cape for MP - Improves MaxMP on the cape.\nSuccess rate:30%, MaxMP+20nIf failed, the item will be destroyed at a 50% rate. -2041034 - Dark scroll for Cape for STR - Improves STR on the cape.\nSuccess rate:70%, STR+2nIf failed, the item will be destroyed at a 50% rate. -2041035 - Dark scroll for Cape for STR - Improves STR on the cape.\nSuccess rate:30%, STR+3nIf failed, the item will be destroyed at a 50% rate. -2041036 - Dark scroll for Cape for INT - Improves INT on the cape.\nSuccess rate:70%, INT+2nIf failed, the item will be destroyed at a 50% rate. -2041037 - Dark scroll for Cape for INT - Improves INT on the cape.\nSuccess rate:30%, INT+3nIf failed, the item will be destroyed at a 50% rate. -2041038 - Dark scroll for Cape for DEX - Improves DEX on the cape.\nSuccess rate:70%, DEX+2nIf failed, the item will be destroyed at a 50% rate. -2041039 - Dark scroll for Cape for DEX - Improves DEX on the cape.\nSuccess rate:30%, DEX+3nIf failed, the item will be destroyed at a 50% rate. -2041040 - Dark scroll for Cape for LUK - Improves LUK on the cape.\nSuccess rate:70%, LUK+2nIf failed, the item will be destroyed at a 50% rate. -2041041 - Dark scroll for Cape for LUK - Improves LUK on the cape.\nSuccess rate:30%, LUK+3nIf failed, the item will be destroyed at a 50% rate. -2041042 - Scroll for Cape for Magic DEF - Improves magic defense on the cape.\nSuccess rate:65%, magic def.+3, weapon def.+1 -2041043 - Scroll for Cape for Magic DEF - Improves magic defense on the cape.\nSuccess rate:15%, magic def.+5, weapon def.+3, MaxMP+10 -2041044 - Scroll for Cape for Weapon DEF - Improves weapon defense on the cape.\nSuccess rate:65%, weapon def.+3, magic def.+1 -2041045 - Scroll for Cape for Weapon DEF - Improves weapon defense on the cape.\nSuccess rate:15%, weapon def.+5, magic def.+3, MaxHP+10 -2041046 - Scroll for Cape for MaxHP - Improves MaxHP on the cape.\nSuccess rate:65%, MaxHP+10 -2041047 - Scroll for Cape for MaxHP - Improves MaxHP on the cape.\nSuccess rate:15%, MaxHP+20 -2041048 - Scroll for Cape for MP - Improves MaxMP on the cape.\nSuccess rate:65%, MaxMP+10 -2041049 - Scroll for Cape for MP - Improves MaxMP on the cape.\nSuccess rate:15%, MaxMP+20 -2041050 - Scroll for Cape for STR - Improves STR on the cape.\nSuccess rate:65%, STR+2 -2041051 - Scroll for Cape for STR - Improves STR on the cape.\nSuccess rate:15%, STR+3 -2041052 - Scroll for Cape for INT - Improves INT on the cape.\nSuccess rate:65%, INT+2 -2041053 - Scroll for Cape for INT - Improves INT on the cape.\nSuccess rate:15%, INT+3 -2041054 - Scroll for Cape for DEX - Improves dexterity on the cape.\nSuccess rate:65%, DEX+2 -2041055 - Scroll for Cape for DEX - Improves dexterity on the cape.\nSuccess rate:15%, DEX+3 -2041056 - Scroll for Cape for LUK - Improves LUK on the cape.\nSuccess rate:65%, LUK+2 -2041057 - Scroll for Cape for LUK - Improves LUK on the cape.\nSuccess rate:15%, LUK+3 -2041058 - Scroll for Cape for Cold Protection 10% - Includes the effect of protection from cold weather on the cape.\nSuccess rate: 10%. Does not affect the number of upgrades available. The success rate of this scroll can be enhanced by Vega's Spell. -2041059 - [4yrAnniv] Scroll for Cape for STR 20% - Improves strength on Maple Cape.\nSuccess rate:20%, STR+3 nIf failed, the item will be destroyed at a 30% rate. -2041060 - [4yrAnniv] Scroll for Cape for INT 20% - Improves INT on Maple Cape.\nSuccess rate:20%, INT+3 nIf failed, the item will be destroyed at a 30% rate. -2041061 - [4yrAnniv] Scroll for Cape for DEX 20% - Improves dexterity on Maple Cape.\nSuccess rate:20%, DEX+3 nIf failed, the item will be destroyed at a 30% rate. -2041062 - [4yrAnniv] Scroll for Cape for LUK 20% - Improves luck on Maple Cape.\nSuccess rate:20%, LUK+3 nIf failed, the item will be destroyed at a 30% rate. -2041200 - Dragon Stone - A powerful stone that contains the mysterious power of the dragon. Can only be used on Horntail Necklace.\nSuccess rate:100%, Weapon Defense +140, Magic Defense +140, Avoidability +15, All Stats +15 -2041212 - Rock of Wisdom - Can only be used on Horus's Eye.\nSuccess rate:60%, HP +70, MP +70 -2043000 - Scroll for One-Handed Sword for ATT - Improves attack on one-handed sword.\nSuccess rate:100%, weapon attack+1 -2043001 - Scroll for One-Handed Sword for ATT - Improves attack on one-handed sword.\nSuccess rate:60%, weapon attack+2, STR+1. The success rate of this scroll can be enhanced by Vega's Spell. -2043002 - Scroll for One-Handed Sword for ATT - Improves attack on one-handed sword.\nSuccess rate:10%, weapon attack+5, STR+3, weapon def.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2043003 - Scroll for One-Handed Sword for ATT - Improves attack on one-handed sword.\nSuccess rate:100%, weapon attack+5, STR+3, weapon def.+1 -2043004 - Dark scroll for One-Handed Sword for ATT - Improves attack on one-handed sword.\nSuccess rate:70%, weapon attack+2, STR+1nIf failed, the item will be destroyed at a 50% rate. -2043005 - Dark scroll for One-Handed Sword for ATT - Improves attack on one-handed sword.\nSuccess rate:30%, weapon attack+5, STR+3, weapon def.+1nIf failed, the item will be destroyed at a 50% rate. -2043006 - Dark Scroll for One-Handed Sword for Magic Att. - Improves magic attack on one-handed sword.\nSuccess Rate 70%, magic attack+1, INT+1nIf failed, the item will be destroyed at a 50% rate. -2043007 - Dark Scroll for One-Handed Sword for Magic Att. - Improves magic attack on one-handed sword.\nSuccess Rate 30%, magic attack+2, INT+2, magic defense+1nIf failed, the item will be destroyed at a 50% rate. -2043008 - Scroll for One-Handed Sword for Magic Att. - Improves magic attack on one-handed sword.\nSuccess Rate 10%, magic attack+2, magic defense+1, INT+2. The success rate of this scroll can be enhanced by Vega's Spell. -2043009 - Scroll for One-Handed Sword for Magic Att. - Improves magic attack on one-handed sword.\nSuccess Rate 60%, magic attack+1, INT+1. The success rate of this scroll can be enhanced by Vega's Spell. -2043010 - Scroll for One-Handed Sword for Magic Att. - Improves magic attack on one-handed sword.\nSuccess Rate 100%, magic attack+1 -2043011 - Scroll for One-Handed Sword for ATT - Improves attack on the one-handed sword.\nSuccess rate:65%, weapon attack+2, STR+1 -2043012 - Scroll for One-Handed Sword for ATT - Improves attack on the one-handed sword.\nSuccess rate:15%, weapon attack+5, STR+3, weapon def.+1 -2043013 - [4yrAnniv]Scroll for One-Handed Sword for ATT - Improves attack for Maple Glory Sword. nSuccess rate:40%, weapon attack+3, STR+2 nIf failed, the item will be destroyed at a 30% rate. -2043015 - Scroll for One-Handed Sword for Accuracy 100% - Improves accuracy on one-handed swords.\nSuccess rate:100%, accuracy+1 -2043016 - Scroll for One-Handed Sword for Accuracy 70% - Improves accuracy on one-handed swords.\nSuccess rate:70%, accuracy+3, DEX+2, weapon att.+1nIf failed, the item will be destroyed at a 50% rate. -2043017 - Scroll for One-Handed Sword for Accuracy 60% - Improves accuracy on one-handed swords.\nSuccess rate:60%, accuracy+3, DEX+2, weapon att.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2043018 - Scroll for One-Handed Sword for Accuracy 30% - Improves accuracy on one-handed swords.\nSuccess rate:30%, accuracy+5, DEX+3, weapon att.+3nIf failed, the item will be destroyed at a 50% rate. -2043019 - Scroll for One-Handed Sword for Accuracy 10% - Improves accuracy on one-handed swords.\nSuccess rate:10%, accuracy+5, DEX+3, weapon att.+3. The success rate of this scroll can be enhanced by Vega's Spell. -2043100 - Scroll for One-Handed Axe for ATT - Improves attack on one-handed axe.\nSuccess rate:100%, weapon attack+1 -2043101 - Scroll for One-Handed Axe for ATT - Improves attack on one-handed axe.\nSuccess rate:60%, weapon attack+2, STR+1. The success rate of this scroll can be enhanced by Vega's Spell. -2043102 - Scroll for One-Handed Axe for ATT - Improves attack on one-handed axe.\nSuccess rate: 10%, weapon attack +5, STR+3, weapon def. +1. The success rate of this scroll can be enhanced by Vega's Spell. -2043103 - Scroll for One-Handed Axe for ATT - Improves attack on one-handed axe.\nSuccess rate:100%, weapon attack+5, STR+3, weapon def.+1 -2043104 - Dark scroll for One-Handed Axe for ATT - Improves attack on one-handed axe.\nSuccess rate:70%, weapon attack+2, STR+1nIf failed, the item will be destroyed at a 50% rate. -2043105 - Dark scroll for One-Handed Axe for ATT - Improves attack on one-handed axe.\nSuccess rate:30%, weapon attack+5, STR+3, weapon def.+1nIf failed, the item will be destroyed at a 50% rate. -2043106 - Scroll for One-Handed Axe for ATT - Improves attack on the one-handed axe.\nSuccess rate:65%, weapon attack+2, STR+1 -2043107 - Scroll for One-Handed Axe for ATT - Improves attack on the one-handed axe.\nSuccess rate:15%, weapon attack+5, STR+3, weapon def.+1 -2043108 - [4yrAnniv]Scroll for One-Handed Axe for ATT - Improves attack on the Maple Steel Axe. nSuccess rate:40%, weapon attack+3, STR+2nIf failed, the item will be destroyed at a 30% rate. -2043110 - Scroll for One-Handed Axe for Accuracy 100% - Improves accuracy on one-handed axe.\nSuccess rate:100%, accuracy+1 -2043111 - Scroll for One-Handed Axe for Accuracy 70% - Improves accuracy on one-handed axe.\nSuccess rate:70%, accuracy+3, DEX+2, weapon att.+1nIf failed, the item will be destroyed at a 50% rate. -2043112 - Scroll for One-Handed Axe for Accuracy 60% - Improves accuracy on one-handed axe.\nSuccess rate:60%, accuracy+3, DEX+2, weapon att.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2043113 - Scroll for One-Handed Axe for Accuracy 30% - Improves accuracy on one-handed axe.\nSuccess rate:30%, accuracy+5, DEX+3, weapon att.+3nIf failed, the item will be destroyed at a 50% rate. -2043114 - Scroll for One-Handed Axe for Accuracy 10% - Improves accuracy on one-handed axe.\nSuccess rate:10%, accuracy+5, DEX+3, weapon att.+3. The success rate of this scroll can be enhanced by Vega's Spell. -2043200 - Scroll for One-Handed BW for ATT - Improves attack on one-handed blunt weapon.\nSuccess rate:100%, weapon attack+1 -2043201 - Scroll for One-Handed BW for ATT - Improves attack on one-handed blunt weapon.\nSuccess rate:60%, weapon attack+2, STR+1. The success rate of this scroll can be enhanced by Vega's Spell. -2043202 - Scroll for One-Handed BW for ATT - Improves attack on one-handed blunt weapon.\nSuccess rate: 10%, weapon attack +5, STR+3, weapon def.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2043203 - Scroll for One-Handed BW for ATT - Improves attack on one-handed blunt weaponnSuccess rate:100%, weapon attack+5, STR+3, weapon def.+1 -2043204 - Dark scroll for One-Handed BW for ATT - Improves attack on one-handed blunt weapon.\nSuccess rate:70%, weapon attack+2, STR+1nIf failed, the item will be destroyed at a 50% rate. -2043205 - Dark scroll for One-Handed BW for ATT - Improves attack on one-handed blunt weapon.\nSuccess rate:30%, weapon attack+5, STR+3, weapon def.+1nIf failed, the item will be destroyed at a 50% rate. -2043206 - Scroll for One-Handed BW for ATT - Improves attack on the one-handed blunt weapon.\nSuccess rate:65%, weapon attack+2, STR+1 -2043207 - Scroll for One-Handed BW for ATT - Improves attack on the one-handed blunt weapon.\nSuccess rate:15%, weapon attack+5, STR+3, weapon def.+1 -2043208 - [4yrAnniv]Scroll for One-Handed BW for ATT - Added attack upgrade option for the Maple Havoc Hammer. nSuccess rate:40%, weapon attack+3, STR+2nIf failed, the item will be destroyed at a 30% rate. -2043210 - Scroll for One-Handed BW for Accuracy 100% - Improves accuracy on one-handed blunt weapon.\nSuccess rate:100%, accuracy+1 -2043211 - Scroll for One-Handed BW for Accuracy 70% - Improves accuracy on one-handed blunt weapon.\nSuccess rate:70%, accuracy+3, DEX+2, weapon att.+1nIf failed, the item will be destroyed at a 50% rate. -2043212 - Scroll for One-Handed BW for Accuracy 60% - Improves accuracy on one-handed blunt weapon.\nSuccess rate:60%, accuracy+3, DEX+2, weapon att.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2043213 - Scroll for One-Handed BW for Accuracy 30% - Improves accuracy on one-handed blunt weapon.\nSuccess rate:30%, accuracy+5, DEX+3, weapon att.+3nIf failed, the item will be destroyed at a 50% rate. -2043214 - Scroll for One-Handed BW for Accuracy 10% - Improves accuracy on one-handed blunt weapon.\nSuccess rate:10%, accuracy+5, DEX+3, weapon att.+3. The success rate of this scroll can be enhanced by Vega's Spell. -2043300 - Scroll for Dagger for ATT - Improves attack on dagger.\nSuccess rate:100%, weapon attack+1 -2043301 - Scroll for Dagger for ATT - Improves attack on dagger.\nSuccess rate:60%, weapon attack+2, LUK+1. The success rate of this scroll can be enhanced by Vega's Spell. -2043302 - Scroll for Dagger for ATT - Improves attack on dagger.\nSuccess rate: 10%, weapon attack +5, LUK+3, weapon def.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2043303 - Scroll for Dagger for ATT - Improves attack on dagger.\nSuccess rate:100%, weapon attack+5, LUK+3, weapon def.+1 -2043304 - Dark scroll for Dagger for ATT - Improves attack on dagger.\nSuccess rate:70%, weapon attack +2, LUK +1nIf failed, the item will be destroyed at a 50% rate. -2043305 - Dark scroll for Dagger for ATT - Improves attack on dagger.\nSuccess rate:30%, weapon attack +5, LUK +3, weapon def. +1nIf failed, the item will be destroyed at a 50% rate. -2043306 - Scroll for Dagger for ATT - Improves attack on the dagger.\nSuccess rate:65%, weapon attack+2, LUK+1 -2043307 - Scroll for Dagger for ATT - Improves attack on the dagger.\nSuccess rate:15%, weapon attack+5, LUK+3, weapon def.+1 -2043308 - [4yrAnniv]Scroll for Dagger for ATT - Improves attack on the Maple Dark Mate and Maple Asura DaggernSuccess rate:40%, weapon attack+3, LUK+2nIf failed, the item will be destroyed at a 30% rate. -2043700 - Scroll for Wand for Magic Att. - Improves magic on wand.\nSuccess rate:100%, magic attack+1 -2043701 - Scroll for Wand for Magic Att. - Improves magic on wand.\nSuccess rate:60%, magic attack+2, INT+1. The success rate of this scroll can be enhanced by Vega's Spell. -2043702 - Scroll for Wand for Magic Att. - Improves magic on wand.\nSuccess rate:10%, magic attack+5, INT+3, magic def.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2043703 - Scroll for Wand for Magic Att. - Improves magic on wand.\nSuccess rate:100%, magic attack+5, INT+3, magic def.+1 -2043704 - Dark scroll for Wand for Magic Att. - Improves magic on wand.\nSuccess rate:70%, magic attack+2, INT+1nIf failed, the item will be destroyed at a 50% rate. -2043705 - Dark scroll for Wand for Magic Att. - Improves magic on wand.\nSuccess rate:30%, magic attack+5, INT+3, magic def.+1nIf failed, the item will be destroyed at a 50% rate. -2043706 - Scroll for Wand for Magic Att. - Improves magic attack on the wand.\nSuccess rate:65%, magic attack+2, INT+1 -2043707 - Scroll for Wand for Magic Att. - Improves magic attack on the wand.\nSuccess rate:15%, magic attack+5, INT+3, magic def.+1 -2043708 - [4yrAnniv]Scroll for Wand for Magic Att. - Improves magic attack on Maple Shine Wand.\nSuccess rate:40%, magic attack+3, INT+2nIf failed, the item will be destroyed at a 30% rate. -2043800 - Scroll for Staff for Magic Att. - Improves magic on staff.\nSuccess rate:100%, magic attack+1 -2043801 - Scroll for Staff for Magic Att. - Improves magic on staff.\nSuccess rate:60%, magic attack+2, INT+1. The success rate of this scroll can be enhanced by Vega's Spell. -2043802 - Scroll for Staff for Magic Att. - Improves magic on staff.\nSuccess rate:10%, magic attack+5, INT+3, magic def.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2043803 - Scroll for Staff for Magic Att. - Improves magic on staff.\nSuccess rate:100%, magic attack+5, INT+3, magic def.+1 -2043804 - Dark scroll for Staff for Magic Att. - Improves magic on staff.\nSuccess rate:70%, magic attack+2, INT+1nIf failed, the item will be destroyed at a 50% rate. -2043805 - Dark scroll for Staff for Magic Att. - Improves magic on staff.\nSuccess rate:30%, magic attack+5, INT+3, magic def.+1nIf failed, the item will be destroyed at a 50% rate. -2043806 - Scroll for Staff for Magic Att. - Improves magic attack on the staff.\nSuccess rate:65%, magic attack+2, INT+1 -2043807 - Scroll for Staff for Magic Att. - Improves magic attack on the staff.\nSuccess rate:15%, magic attack+5, INT+3, magic def.+1 -2043808 - [4yrAnniv]Scroll for Staff for Magic Att. - Improves magic attack on Maple Wisdom Staff.\nSuccess rate:40%, magic attack+3, INT+2nIf failed, the item will be destroyed at a 30% rate. -2044000 - Scroll for Two-handed Sword for ATT - Improves attack on two-handed sword.\nSuccess rate:100%, weapon attack+1 -2044001 - Scroll for Two-handed Sword for ATT - Improves attack on two-handed sword.\nSuccess rate:60%, weapon attack+2, STR+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044002 - Scroll for Two-handed Sword for ATT - Improves attack on two-handed sword.\nSuccess rate:10%, weapon attack+5, STR+3, weapon def.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044003 - Scroll for Two-handed Sword for ATT - Improves attack on two-handed sword weapon.\nSuccess rate:100%, weapon attack+5, STR+3, weapon def.+1 -2044004 - Dark scroll for Two-handed Sword for ATT - Improves attack on two-handed sword.\nSuccess rate:70%, weapon attack+2, STR+1nIf failed, the item will be destroyed at a 50% rate. -2044005 - Dark scroll for Two-handed Sword for ATT - Improves attack on two-handed sword.\nSuccess rate:30%, weapon attack+5, STR+3, weapon def.+1nIf failed, the item will be destroyed at a 50% rate. -2044006 - Scroll for Two-Handed Sword for ATT - Improves attack on the two-handed sword.\nSuccess rate:65%, weapon attack+2, STR+1 -2044007 - Scroll for Two-Handed Sword for ATT - Improves attack on the two-handed sword.\nSuccess rate:15%, weapon attack+5, STR+3, weapon def.+1 -2044008 - [4yrAnniv]Scroll for Two-Handed Sword for ATT - Improves attack for Maple Soul Rohen. nSuccess rate:40%, weapon attack+3, STR+2nIf failed, the item will be destroyed at a 30% rate. -2044010 - Scroll for Two-Handed Sword for Accuracy 100% - Improves accuracy on two-handed swords.\nSuccess rate:100%, accuracy+1 -2044011 - Scroll for Two-Handed Sword for Accuracy 70% - Improves accuracy on two-handed swords.\nSuccess rate:70%, accuracy+3, DEX+2, weapon att.+1nIf failed, the item will be destroyed at a 50% rate. -2044012 - Scroll for Two-Handed Sword for Accuracy 60% - Improves accuracy on two-handed swords.\nSuccess rate:60%, accuracy+3, DEX+2, weapon att.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044013 - Scroll for Two-Handed Sword for Accuracy 30% - Improves accuracy on two-handed swords.\nSuccess rate:30%, accuracy+5, DEX+3, weapon att.+3nIf failed, the item will be destroyed at a 50% rate. -2044014 - Scroll for Two-Handed Sword for Accuracy 10% - Improves accuracy on two-handed swords.\nSuccess rate:10%, accuracy+5, DEX+3, weapon att.+3. The success rate of this scroll can be enhanced by Vega's Spell. -2044100 - Scroll for Two-handed Axe for ATT - Improves attack on two-handed axe.\nSuccess rate:100%, weapon attack+1 -2044101 - Scroll for Two-handed Axe for ATT - Improves attack on two-handed axe.\nSuccess rate:60%, weapon attack+2, STR+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044102 - Scroll for Two-handed Axe for ATT - Improves attack on two-handed axe.\nSuccess rate:10%, weapon attack+5, STR+3, weapon def. +1. The success rate of this scroll can be enhanced by Vega's Spell. -2044103 - Scroll for Two-handed Axe for ATT - Improves attack on two-handed axe.\nSuccess rate:100%, weapon attack+5, STR+3, weapon def.+1 -2044104 - Dark scroll for Two-handed Axe for ATT - Improves attack on two-handed axe.\nSuccess rate:70%, weapon attack+2, STR+1nIf failed, the item will be destroyed at a 50% rate. -2044105 - Dark scroll for Two-handed Axe for ATT - Improves attack on two-handed axe.\nSuccess rate:30%, weapon attack+5, STR+3, weapon def.+1nIf failed, the item will be destroyed at a 50% rate. -2044106 - Scroll for Two-Handed Axe for ATT - Improves attack on the two-handed axe.\nSuccess rate:65%, weapon attack+2, STR+1 -2044107 - Scroll for Two-Handed Axe for ATT - Improves attack on the two-handed axe.\nSuccess rate:15%, weapon attack+5, STR+3, weapon def.+1 -2044108 - [4yrAnniv]Scroll for Two-Handed Axe for ATT - Improves attack for Maple Demon Axe. nSuccess rate:40%, weapon attack+3, STR+2nIf failed, the item will be destroyed at a 30% rate. -2044110 - Scroll for Two-Handed Axe for Accuracy 100% - Improves accuracy on two-handed axe.\nSuccess rate:100%, accuracy+1 -2044111 - Scroll for Two-Handed Axe for Accuracy 70% - Improves accuracy on two-handed axe.\nSuccess rate:70%, accuracy+3, DEX+2, weapon att.+1nIf failed, the item will be destroyed at a 50% rate. -2044112 - Scroll for Two-Handed Axe for Accuracy 60% - Improves accuracy on two-handed axe.\nSuccess rate:60%, accuracy+3, DEX+2, weapon att.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044113 - Scroll for Two-Handed Axe for Accuracy 30% - Improves accuracy on two-handed axe.\nSuccess rate:30%, accuracy+5, DEX+3, weapon att.+3nIf failed, the item will be destroyed at a 50% rate. -2044114 - Scroll for Two-Handed Axe for Accuracy 10% - Improves accuracy on two-handed axe.\nSuccess rate:10%, accuracy+5, DEX+3, weapon att.+3. The success rate of this scroll can be enhanced by Vega's Spell. -2044200 - Scroll for Two-handed BW for ATT - Improves attack on two-handed blunt weapon.\nSuccess rate:100%, weapon attack+1 -2044201 - Scroll for Two-handed BW for ATT - Improves attack on two-handed blunt weapon.\nSuccess rate:60%, weapon attack+2, STR+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044202 - Scroll for Two-handed BW for ATT - Improves attack on two-handed blunt weapon.\nSuccess rate:10%, weapon attack+5, STR+3, weapon def.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044203 - Scroll for Two-handed BW for ATT - Improves attack on two-handed blunt weapon.\nSuccess rate:100%, weapon attack+5, STR+3, weapon def.+1 -2044204 - Dark scroll for Two-handed BW for ATT - Improves attack on two-handed blunt weapon.\nSuccess rate:70%, weapon attack+2, STR+1nIf failed, the item will be destroyed at a 50% rate. -2044205 - Dark scroll for Two-handed BW for ATT - Improves attack on two-handed blunt weapon.\nSuccess rate:30%, weapon attack+5, STR+3, weapon def.+1nIf failed, the item will be destroyed at a 50% rate. -2044206 - Scroll for Two-Handed BW for ATT - Improves attack on the two-handed blunt weapon.\nSuccess rate:65%, weapon attack+2, STR+1 -2044207 - Scroll for Two-Handed BW for ATT - Improves attack on the two-handed blunt weapon.\nSuccess rate:15%, weapon attack+5, STR+3, weapon def.+1 -2044208 - [4yrAnniv]Scroll for Two-Handed BW for ATT - Improves attack on Maple Belzet. nSuccess rate:40%, weapon attack+3, STR+2nIf failed, the item will be destroyed at a 30% rate. -2044210 - Scroll for Two-Handed BW for Accuracy 100% - Improves accuracy on two-handed blunt weapon.\nSuccess rate:100%, accuracy+1 -2044211 - Scroll for Two-Handed BW for Accuracy 70% - Improves accuracy on two-handed blunt weapon.\nSuccess rate:70%, accuracy+3, DEX+2, weapon att.+1nIf failed, the item will be destroyed at a 50% rate. -2044212 - Scroll for Two-Handed BW for Accuracy 60% - Improves accuracy on two-handed blunt weapon.\nSuccess rate:60%, accuracy+3, DEX+2, weapon att.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044213 - Scroll for Two-Handed BW for Accuracy 30% - Improves accuracy on two-handed blunt weapon.\nSuccess rate:30%, accuracy+5, DEX+3, weapon att.+3nIf failed, the item will be destroyed at a 50% rate. -2044214 - Scroll for Two-Handed BW for Accuracy 10% - Improves accuracy on two-handed blunt weapon.\nSuccess rate:10%, accuracy+5, DEX+3, weapon att.+3. The success rate of this scroll can be enhanced by Vega's Spell. -2044300 - Scroll for Spear for ATT - Improves attack on spear.\nSuccess rate:100%, weapon attack+1 -2044301 - Scroll for Spear for ATT - Improves attack on spear.\nSuccess rate:60%, weapon attack+2, STR+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044302 - Scroll for Spear for ATT - Improves attack on spear.\nSuccess rate:10%, weapon attack+5, STR+3, weapon def.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044303 - Scroll for Spear for ATT - Improves attack on spear.\nSuccess rate:100%, weapon attack +5, STR+3, weapon def.+1 -2044304 - Dark scroll for Spear for ATT - Improves attack on spear.\nSuccess rate:70%, weapon attack +2, STR+1nIf failed, the item will be destroyed at a 50% rate. -2044305 - Dark scroll for Spear for ATT - Improves attack on spear.\nSuccess rate:30%, weapon attack +5, STR+3, weapon def.+1nIf failed, the item will be destroyed at a 50% rate. -2044306 - Scroll for Spear for ATT - Improves attack on the Spear. nSuccess rate:65%, weapon attack+2, STR+1 -2044307 - Scroll for Spear for ATT - Improves attack on the Spear. nSuccess rate:15%, weapon attack+5, STR+3, weapon def.+1 -2044308 - [4yrAnniv]Scroll for Spear for ATT - Improves attack on Maple Soul Spear. nSuccess rate:40%, weapon attack+3, STR+2nIf failed, the item will be destroyed at a 30% rate. -2044310 - Scroll for Spear for Accuracy 100% - Improves accuracy on spears.\nSuccess rate:100%, accuracy+1 -2044311 - Scroll for Spear for Accuracy 70% - Improves accuracy on spears.\nSuccess rate:70%, accuracy+3, DEX+2, weapon att.+1nIf failed, the item will be destroyed at a 50% rate. -2044312 - Scroll for Spear for Accuracy 60% - Improves accuracy on spears.\nSuccess rate:60%, accuracy+3, DEX+2, weapon att.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044313 - Scroll for Spear for Accuracy 30% - Improves accuracy on spears.\nSuccess rate:30%, accuracy+5, DEX+3, weapon att.+3nIf failed, the item will be destroyed at a 50% rate. -2044314 - Scroll for Spear for Accuracy 10% - Improves accuracy on spears.\nSuccess rate:10%, accuracy+5, DEX+3, weapon att.+3. The success rate of this scroll can be enhanced by Vega's Spell. -2044400 - Scroll for Pole Arm for ATT - Improves attack on pole arm.\nSuccess rate:100%, weapon attack+1 -2044401 - Scroll for Pole Arm for ATT - Improves attack on pole arm.\nSuccess rate:60%, weapon attack+2, STR+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044402 - Scroll for Pole Arm for ATT - Improves attack on pole arm.\nSuccess rate:10%, weapon attack+5, STR+3, weapon def.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044403 - Scroll for Pole Arm for ATT - Improves attack on pole arm.\nSuccess rate:100%, weapon attack +5, STR+3, weapon def.+1 -2044404 - Dark scroll for Pole Arm for ATT - Improves attack on pole arm.\nSuccess rate:70%, weapon attack +2, STR+1nIf failed, the item will be destroyed at a 50% rate. -2044405 - Dark scroll for Pole Arm for ATT - Improves attack on pole arm.\nSuccess rate:30%, weapon attack +5, STR+3, weapon def.+1nIf failed, the item will be destroyed at a 50% rate. -2044406 - Scroll for Pole Arm for ATT - Improves attack on the Pole arm. nSuccess rate:65%, weapon attack+2, STR+1 -2044407 - Scroll for Pole Arm for ATT - Improves attack on the Pole arm. nSuccess rate:15%, weapon attack+5, STR+3, weapon def.+1 -2044408 - [4yrAnniv]Scroll for Pole Arm for ATT - Improves attack for Maple Karstan nSuccess rate:40%, weapon attack+3, STR+2nIf failed, the item will be destroyed at a 30% rate. -2044410 - Scroll for Pole-Arm for Accuracy 100% - Improves accuracy on pole-arms.\nSuccess rate:100%, accuracy+1 -2044411 - Scroll for Pole-Arm for Accuracy 70% - Improves accuracy on pole-arms.\nSuccess rate:70%, accuracy+3, DEX+2, weapon att.+1nIf failed, the item will be destroyed at a 50% rate. -2044412 - Scroll for Pole-Arm for Accuracy 60% - Improves accuracy on pole-arms.\nSuccess rate:60%, accuracy+3, DEX+2, weapon att.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044413 - Scroll for Pole-Arm for Accuracy 30% - Improves accuracy on pole-arms.\nSuccess rate:30%, accuracy+5, DEX+3, weapon att.+3nIf failed, the item will be destroyed at a 50% rate. -2044414 - Scroll for Pole-Arm for Accuracy 10% - Improves accuracy on pole-arms.\nSuccess rate:10%, accuracy+5, DEX+3, weapon att.+3. The success rate of this scroll can be enhanced by Vega's Spell. -2044500 - Scroll for Bow for ATT - Improves attack on bow.\nSuccess rate:100%, weapon attack+1 -2044501 - Scroll for Bow for ATT - Improves attack on bow.\nSuccess rate: 60%, weapon attack+2, accuracy +1. The success rate of this scroll can be enhanced by Vega's Spell. -2044502 - Scroll for Bow for ATT - Improves attack on bow.\nSuccess rate:10%, weapon attack+5, accuracy+3, DEX+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044503 - Scroll for Bow for ATT - Improves attack on bow.\nSuccess rate:100%, weapon attack +5, accuracy +3, DEX+1 -2044504 - Dark scroll for Bow for ATT - Improves attack on bow.\nSuccess rate:70%, weapon attack +2, accuracy +1nIf failed, the item will be destroyed at a 50% rate. -2044505 - Dark scroll for Bow for ATT - Improves attack on bow.\nSuccess rate:30%, weapon attack +5, accuracy +3, DEX+1nIf failed, the item will be destroyed at a 50% rate. -2044506 - Scroll for Bow for ATT - Improves attack on the Bow. nSuccess rate:65%, weapon attack+2, accuracy+1 -2044507 - Scroll for Bow for ATT - Improves attack on the Bow. nSuccess rate:15%, weapon attack+5, accuracy+3, DEX+1 -2044508 - [4yrAnniv]Scroll for Bow for ATT - Improves attack on Maple Kandiva Bow. nSuccess rate:40%, weapon attack+3, accuracy+1nIf failed, the item will be destroyed at a 30% rate. -2044600 - Scroll for Crossbow for ATT - Improves attack on crossbow.\nSuccess rate:100%, weapon attack+1 -2044601 - Scroll for Crossbow for ATT - Improves attack on crossbow.\nSuccess rate:60%, weapon attack+2, accuracy+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044602 - Scroll for Crossbow for ATT - Improves attack on crossbow.\nSuccess rate:10%, weapon attack+5, accuracy+3, DEX+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044603 - Scroll for Crossbow for ATT - Improves attack on crossbow.\nSuccess rate:100%, weapon attack+5, accuracy+3, DEX+1 -2044604 - Dark scroll for Crossbow for ATT - Improves attack on crossbow.\nSuccess rate:70%, weapon attack+2, accuracy+1nIf failed, the item will be destroyed at a 50% rate. -2044605 - Dark scroll for Crossbow for ATT - Improves attack on crossbow.\nSuccess rate:30%, weapon attack+5, accuracy+3, DEX+1nIf failed, the item will be destroyed at a 50% rate. -2044606 - Scroll for Crossbow for ATT - Improves attack on the Crossbow. nSuccess rate:65%, weapon attack+2, accuracy+1 -2044607 - Scroll for Crossbow for ATT - Improves attack on the Crossbow. nSuccess rate:15%, weapon attack+5, accuracy+3, DEX+1 -2044608 - [4yrAnniv]Scroll for Crossbow for ATT - Improves attack on Maple Nishada. nSuccess rate:40%, weapon attack+3, accuracy+2nIf failed, the item will be destroyed at a 30% rate. -2044700 - Scroll for Claw for ATT - Improves attack on claw.\nSuccess rate:100%, weapon attack+1 -2044701 - Scroll for Claw for ATT - Improves attack on claw.\nSuccess rate:60%, weapon attack+2, accuracy+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044702 - Scroll for Claw for ATT - Improves attack on claw.\nSuccess rate:10%, weapon attack+5, accuracy+3, LUK+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044703 - Scroll for Claw for ATT - Improves attack on claw.\nSuccess rate:100%, weapon attack+5, accuracy+3, LUK+1 -2044704 - Dark Scroll for Claw for ATT - Improves attack on claw.\nSuccess rate:70%, weapon attack +2, accuracy +1nIf failed, the item will be destroyed at the 50% rate. -2044705 - Dark scroll for Claw for ATT - Improves attack on claw.\nSuccess rate:30%, weapon attack +5, accuracy +3, LUK+1nIf failed, the item will be destroyed at a 50% rate. -2044706 - Scroll for Claw for ATT - Improves attack on the Claw. nSuccess rate:65%, weapon attack+2, accuracy+1 -2044707 - Scroll for Claw for ATT - Improves attack on the Claw. nSuccess rate:15%, weapon attack+5, accuracy+3, LUK+1 -2044708 - [4yrAnniv]Scroll for Claw for ATT - Improves attack on Maple Scandar. nSuccess rate:40%, weapon attack+3, accuracy+2nIf failed, the item will be destroyed at a 30% rate. -2044800 - Scroll for Knuckler for Attack 100% - Improves attack on Knucklers.\nSuccess rate:100%, weapon att. +1 -2044801 - Scroll for Knuckler for Attack 60% - Improves attack on Knucklers.\nSuccess rate:60%, weapon att. +2, STR+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044802 - Scroll for Knuckler for ATT - Improves attack on Knucklers.\nSuccess rate:10%, weapon att. +5, STR+3, weapon def. +1. The success rate of this scroll can be enhanced by Vega's Spell. -2044803 - Scroll for Knuckler for Attack 70% - Improves attack on Knucklers.\nSuccess rate:70%, weapon att. +2, STR+1nIf failed, the item will be destroyed at a 50% rate -2044804 - Scroll for Knuckler for Attack 30% - Improves attack on Knucklers.\nSuccess rate:30%, weapon att. +5, STR+3, weapon def. +1nIf failed, the item will be destroyed at a 50% rate -2044805 - Scroll for Knuckle for Accuracy 100% - Improves accuracy on knuckles.\nSuccess rate:100%, accuracy+1 -2044806 - Scroll for Knuckle for Accuracy 70% - Improves accuracy on knuckles.\nSuccess rate:70%, accuracy+3, DEX+2, weapon att.+1nIf failed, the item will be destroyed at a 50% rate.. -2044807 - Scroll for Knuckle for Accuracy 60% - Improves accuracy on knuckles.\nSuccess rate:60%, accuracy+3, DEX+2, weapon att.+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044808 - Scroll for Knuckle for Accuracy 30% - Improves accuracy on knuckles.\nSuccess rate:30%, accuracy+5, DEX+3, weapon att.+3nIf failed, the item will be destroyed at a 50% rate.. -2044809 - Scroll for Knuckle for Accuracy 10% - Improves accuracy on knuckles.\nSuccess rate:10%, accuracy+5, DEX+3, weapon att.+3. The success rate of this scroll can be enhanced by Vega's Spell. -2044810 - [4yrAnniv] Scroll for Knuckle for Attack 40% - Improves the attack on Maple Golden Claw. nSuccess rate:40%,weapon att.+3,STR+2nIf failed, the item will be destroyed at a 30% rate. -2044900 - Scroll for Gun for Attack 100% - Improves attack on Guns.\nSuccess rate:100%, weapon att. +1 -2044901 - Scroll for Gun for Attack 60% - Improves attack on Guns.\nSuccess rate:60%, weapon att. +2, accuracy+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044902 - Scroll for Gun for ATT - Improves attack on Guns.\nSuccess rate:10%, weapon att. +5, accuracy+3, DEX+1. The success rate of this scroll can be enhanced by Vega's Spell. -2044903 - Scroll for Gun for Attack 70% - Improves attack on Guns.\nSuccess rate:70%, weapon att. +2, accuracy+1nIf failed, the item will be destroyed at a 50% rate -2044904 - Scroll for Gun for Attack 30% - Improves attack on Guns.\nSuccess rate:30%, weapon att. +5, accuracy+3, DEX+1nIf failed, the item will be destroyed at a 50% rate -2044905 - [4yrAnniv] Gun for Attack 40% - Improves the attact on Maple Canon Shooter. nSuccess rate:40%, weapon att.+3,naccuracy+2nIf failed, the item will be destroyed at a 30% rate. -2048000 - Scroll for Pet Equip. for Speed - Improves speed on pet equip.\nSuccess rate:100%, speed+1 -2048001 - Scroll for Pet Equip. for Speed - Improves speed on pet equip.\nSuccess rate:60%, moving speed+2. The success rate of this scroll can be enhanced by Vega's Spell. -2048002 - Scroll for Pet Equip. for Speed - Improves speed on pet equip.\nSuccess rate:10%, moving speed+3. The success rate of this scroll can be enhanced by Vega's Spell. -2048003 - Scroll for Pet Equip. for Jump - Improves jump on pet equip.\nSuccess rate:100%, jump+1 -2048004 - Scroll for Pet Equip. for Jump - Improves jump on pet equip.\nSuccess rate:60%, jump+2. The success rate of this scroll can be enhanced by Vega's Spell. -2048005 - Scroll for Pet Equip. for Jump - Improves jump on pet equip.\nSuccess rate:10%, jump+3. The success rate of this scroll can be enhanced by Vega's Spell. -2048006 - Scroll for Speed for Pet Equip. - Improves speed on Pet Equip. nSuccess rate:65%, speed+2 -2048007 - Scroll for Speed for Pet Equip. - Improves speed on Pet Equip. nSuccess rate:15%, speed+3 -2048008 - Scroll for jump for Pet Equip. - Improves jump on Pet equip. nSuccess rate:65%, jump+2 -2048009 - Scroll for jump for Pet Equip. - Improves jump on Pet equip. nSuccess rate:15%, jump+3 -2048010 - Scroll for Pet Equip. for STR 60% - Improves strength on pet equipments.\nSuccess rate:60%, STR+1. The success rate of this scroll can be enhanced by Vega's Spell. -2048011 - Scroll for Pet Equip. for INT 60% - Improves intelligence on pet equipments.\nSuccess rate:60%, INT+1. The success rate of this scroll can be enhanced by Vega's Spell. -2048012 - Scroll for Pet Equip. for DEX 60% - Improves dexterity on pet equipments.\nSuccess rate:60%, DEX+1. The success rate of this scroll can be enhanced by Vega's Spell. -2048013 - Scroll for Pet Equip. for LUK 60% - Improves luck on pet equipments.\nSuccess rate:60%, LUK+1. The success rate of this scroll can be enhanced by Vega's Spell. -2049000 - Clean Slate Scroll 1% - Recovers the lost number of upgrades due to failed scroll by 1. Not available on Cash Items. Success rate:1%, If failed, the item will be destroyed at a 2% rate... -2049001 - Clean Slate Scroll 3% - Recovers the lost number of upgrades due to failed scroll by 1. Success rate:3%, If failed, the item will be destroyed at a 6% rate.. -2049002 - Clean Slate Scroll 5% - Recovers the lost number of upgrades due to failed scroll by 1. Success rate:5%, If failed, the item will be destroyed at a 10% rate.. -2049003 - Clean Slate Scroll 20% - Recovers the lost number of upgrades due to failed scroll by 1. Success rate:20%, If failed, the item will be destroyed at a 50% rate.. -2049100 - Chaos Scroll 60% - Alters the equipment for better or worse. Not available on Cash Items.\nSuccess rate:60% -2049101 - Liar Tree Sap 100% - Use this on Pinocchio's nose to improve or downgrade the item options.\nSuccess rate:100% -2049102 - Maple Syrup 100% - Use it on Maple Leaf to improve or downgrade the item option. Success rate:100% -2049104 - Agent Equipment Scroll 100% - Can be used on an agent equipment to either enhance or worsen the function.\nSuccess rate:100% -2050000 - Antidote - Cures the state of being poisoned. -2050001 - Eyedrop - Cures the state of darkness -2050002 - Tonic - Cures the state of weakness. -2050003 - Holy Water - Allows you to recover from the state of curse or being sealed up. -2050004 - All Cure Potion - Allows you to recover from any abnormal state. -2050005 - One View - Use it on view-restricted map to increase the vision of your partymates and yourself for 1 minute. -2050006 - Owl Potion - Recover total vision in vision-restricted map for 30 seconds. -2050098 - The Lost eye - The Lost eye -2050099 - Flaming feather - Flaming feather -2060000 - Arrow for Bow - A barrel full of arrows. Only usable with bows. -2060001 - Bronze Arrow for Bow - A barrel full of bronze arrows. Only usable with bows.\nAttack + 1 -2060002 - Steel Arrow for Bow - A barrel full of steel arrows. Only usable with bows.\nSTR +1, Attack +1 -2060003 - Red Arrow for Bow - A case full of arrows. Can only be used with a bow. \nAttack + 4. -2060004 - Diamond Arrow for Bow - A case full of arrows. Can only be used with a bow.nAttack + 4. -2060005 - Snowball - A packed ball of snow. Can be thrown to inflict damage. -2060006 - Big Snowball - A bigger, more intimidating packed ball of snow. Can be thrown to inflict damage. -2061000 - Arrow for Crossbow - A barrel full of arrows. Only usable with crossbows. -2061001 - Bronze Arrow for Crossbow - A barrel full of bronze arrows. Only usable with crossbows.\nAttack + 1 -2061002 - Steel Arrow for Crossbow - A barrel full of steel arrows. Only usable with crossbows.nAttack +2 -2061003 - Blue Arrow for Crossbow - A case full of arrows. Can only be used with a crossbow.nAttack + 4. -2061004 - Diamond Arrow for Crossbow - A case full of arrows. Can only be used with a crossbow.nAttack + 4. -2070000 - Subi Throwing-Stars - A throwing-star made out of steel. Once they run out, they need to be recharged.\nLevel Limit : 10, Attack + 15 -2070001 - Wolbi Throwing-Stars - A throwing-star made out of steel. Once they run out, they need to be recharged.\nLevel Limit : 10, Attack + 17 -2070002 - Mokbi Throwing-Stars - A throwing-star made out of steel. Once they run out, they need to be recharged.\nLevel Limit : 10, Attack + 19 -2070003 - Kumbi Throwing-Stars - A throwing-star made out of steel. Once they run out, they need to be recharged.\nLevel Limit : 10, Attack + 21 -2070004 - Tobi Throwing-Stars - A throwing-star made out of steel. Once they run out, they need to be recharged.\nLevel Limit : 10, Attack + 23 -2070005 - Steely Throwing-Knives - A throwing-star made out of steel. Once they run out, they need to be recharged.\nLevel Limit : 10, Attack + 25 -2070006 - Ilbi Throwing-Stars - A throwing-star made out of steel. Once they run out, they need to be recharged.\nLevel Limit : 10, Attack + 27 -2070007 - Hwabi Throwing-Stars - A throwing-star made out of steel. Once they run out, they need to be recharged.\nLevel Limit : 10, Attack + 27 -2070008 - Snowball - A well-packed snowball. Once they run out, they need to be recharged.\nLevel Limit : 10, Attack + 17 -2070009 - Wooden Top - When thrown, it spins fast and flies at great speed. Once they are all used up, they need to be recharged.\nLevel Limit : 10, Attack + 19 -2070010 - Icicle - Sharp icicles. Once they run out, they need to be recharged.rnLevel Limit : 10, Attack + 21 -2070011 - Maple Throwing-Stars - Maple-shaped steel throwing-stars. Once they run out, they need to be recharged.rnLevel Limit : 10, Attack + 21 -2070012 - Paper Fighter Plane - A paper plane that can be thrown at things. Once they run out, they need to be recharged. Attack +20 -2070013 - Orange - A tasty orange that can be thrown at things. Attack + 20 -2070014 - Devil Rain Throwing Star - Throwing Star -2070015 - A Beginner Thief's Throwing Stars - These are steel throwing stars given by Dark Lord for Beginner Thieves. Unlike normal throwing stars, you can't recharge it. \nAttack + 15 -2070016 - Crystal Ilbi Throwing-Stars - A throwing-star made of crystal. Once they run out, they need to be recharged. rnAttack + 29 -2070018 - Balanced Fury - Ancient Shadowknight throwing stars made from black crystal. These can be recharged when used up. rnAttack + 30 -2083000 - Heart Megaphone - Shout to everyone in the world your character is on with this megaphone. (Heart accents) -2084000 - Skull Megaphone - Shout to everyone in the world your character is on with this megaphone. (Skull accents) -2100000 - Black Sack - If you think your level's too low, don't bother opening it. -2100001 - Monster Sack 1 - Summons weak monsters of level 10 and under -2100002 - Monster Sack 2 - Summons weak monsters between levels 10 and 20 -2100003 - Monster Sack 3 - Summons mid-lower-leveled monsters between levels 20 and 30 -2100004 - Monster Sack 4 - Summons mid-level monsters between levels 30 and 40 -2100005 - Monster Sack 5 - Summons mid-leveled monsters between levels 40 and 50 -2100006 - Monster Sack 6 - Summons high-leveled monsters between levels 50 and 60 -2100007 - Monster Sack 7 - Summons high-leveled monsters between levels 60 and 70 -2100008 - Summoning the Boss - To the old, the pregnant, and the low-leveled : don't even bother... -2100009 - Summoning New-Type Balrog - The moment you summon it...you're dead already -2100010 - Summoning "Dances with Balrog's Clone" - Summons Dances with Balrog's Clone -2100011 - Summoning Grendel the Really Old's Clone - Summons Grendel the Really Old's Clone -2100012 - Summoning Athena Pierce's Clone - Summons Athena Pierce's Clone -2100013 - Summoning Dark Lord's Clone - Summons Dark Lord's Clone -2100014 - Brand New Monster Galore - Bam! -2100015 - Summoning Bag of Birds - A bag, which summons blue and pink birds living in Eos Tower -2100016 - Different Sack - A sack that summons monsters. -2100017 - Alien Sack - A sack full of aliens -2100018 - Toy Robot Sack - A sack full of toy robots. -2100019 - Toy Trojan Sack - A sack full of toy trojans. -2100020 - Moon Sack - Make your wish in front of the full moon. -2100021 - Moon Sack - Make your wish in front of the full moon. -2100022 - Moon Sack - Make your wish in front of the full moon. -2100023 - Moon Sack - Make your wish in front of the full moon. -2100024 - Moon Sack - Make your wish in front of the full moon. -2100025 - Moon Sack - Make your wish in front of the full moon. -2100026 - Penalty Monster Sack 1 - Summons Black Knight. -2100027 - Penalty Monster Sack 2 - Summons Myst Knight. -2100028 - Summoning Three-Tail Fox - A peculiar summon sack that summons Three-Tail Fox -2100029 - Summoning Ghosts - A peculiar summon sack that summons ghosts. No way to tell which one, though... -2100030 - Summoning Goblins - A peculiar summon sack that summons goblins. No way to tell which one, though... -2100031 - Summoning Horntail A - Summons Head A of Horntail. -2100032 - Summoning Horntail C - Summons Head C of Horntail. -2100033 - Monster Sack 8 - Summons high-leveled monsters between levels 70 and 80 -2100034 - Monster Sack 9 - Summons high-leveled monsters between levels 80 and 90 -2100035 - Monster Sack 10 - Summons high-leveled monsters between levels 90 and 100 -2100036 - Monster Sack 11 - Summons high-leveled monsters between levels 100 and 110 -2100037 - Summon Master Monsters 1 - Summon the Event-only Mano & Stumpy. -2100038 - Summon Master Monsters 2 - Summon the Event-only Faust, King Clang, Timer, and Dyle. -2100039 - Summon Master Monsters 3 - Summon the Event-only Nine-Tailed Fox, Tae Roon, and King Sage Cat. -2100040 - Summon Master Monsters 4 - Summon the Event-only Elliza, and Snowman. -2100041 - Summoning Lord Pirate - Summons Lord Pirate. -2100042 - Summoning Peeking Lord Pirate - Summons Peeking Lord Pirate. -2100043 - Summoning Angry Lord Pirate - Summons Angry Lord Pirate. -2100044 - Summoning Enraged Lord Pirate - Summons Enraged Lord Pirate. -2100045 - Summoning Lord Pirate's Jar - Summoning Lord Pirate's Jar. -2100046 - Summoning Lord Pirate's Ginseng Jar - Summons Lord Pirate's Ginseng Jar. -2100047 - Summoning Lord Pirate's Bellflower - Summons Lord Pirate's Bellflower. -2100048 - Summoning Lord Pirate's Old Bellflower - Summoning Lord Pirate's Old Bellflower. -2100049 - Summoning Lord Pirate's Mr. Alli - Summons Lord Pirate's Mr. Alli -2100050 - Summoning Lord Pirate's Kru - Summons Lord Pirate's Kru. -2100051 - Summoning Lord Pirate's Captain - Summons Lord Pirate's Captain. -2100052 - Moon Rabit Monster Sack - You can summon Moon Rabbit. -2100053 - Summon Romeo and Juliet PQ Mob - Summon Rabbit bundle -2100054 - Summon Romeo and Juliet PQ Mob - Summon Frankenroid -2100055 - Summon Romeo and Juliet PQ Mob - Summon Angry Frankenroid -2100056 - Summon Romeo and Juliet PQ Mob - Summon Fallen Romeo -2100057 - Summon Romeo and Juliet PQ Mob - Summon Fallen Romeo -2100058 - Summon Romeo and Juliet PQ Mob - Summon Frankenroid -2100059 - Summon Romeo and Juliet PQ Mob - Summon Angry Frankenroid -2100060 - Weird Sack - Summon Halloween Monster! -2100061 - Strange Sack - Summon Halloween Monster!! -2100062 - Interesting Sack - Summon Halloween Monster!!! -2100063 - Summon Ghost - Summon Mirror Ghost -2100064 - Summon Ghost 2 - Summon Mirror Ghost -2100065 - Summon Ghost 3 - Summon Mirror Ghost -2100066 - Summon Slime - A summoning sack to summon 10 Slimes. -2100067 - Bombs for Hunting Competition - A bomb used for the Hunting Competition. If hit with the bomb, the victim will lose the Spirit Jewel. -2100068 - Snowman Summon Sack - A sack that summons small Snowman made with hands. After 3 minutes, the summoned snowman will melt and disappear. -2100069 - Event Box - For Events -2100070 - 1st Monster Marble - A marble that contains poisoned monsters on the 1st floor. Use it to bring out the poisoned monster from the marble. -2100071 - Mu Lung Dojo Summon Package1_Mano - Summon Mano -2100072 - Mu Lung Dojo Summon Package2_Stumpy - Summon Stumpy -2101000 - Summoning Mushmom - Summons a Mushmom -2101001 - Summoning Crimson Balrog - Summons a Crimson Balrog -2101002 - Summoning Werewolf - Summons a Werewolf -2101003 - Summoning Yeti & Pepe - Summons one set of Yeti & Pepe -2101004 - Summoning Superslime - Summons a Superslime -2101005 - Summoning Tauromacis - Summons a Tauromacis -2101006 - Summoning Taurospear - Summons a Taurospear -2101007 - Summoning Lycanthrope - Summons a Lycanthrope. -2101008 - Summoning Dark Yeti & Pepe - Summons a set of Dark Yeti & Pepe. -2101009 - Summon Red Boogie - Summons Red Boogies. -2101010 - Summon Blue Boogie - Summons Blue Boogies. -2101011 - Summon Green Boogie - Summons Green Boogies. -2101012 - Summon Black Boogie - Summons Black Boogies. -2101013 - Summon Showa Boss - Summons Showa Boss. -2101014 - Summon Monsters - Summon particular monsters. -2101015 - Summon Bodyguard A - Summons Bodyguard A. -2101016 - Summon Toy Robot - Summons toy robots. -2101017 - Summon Black Boogie - Summons Black Boogie. -2101018 - Summon Black Boogie - (no description) -2101019 - Summon Pachinko Monster - (no description) -2101020 - Halloween Monster Sack - Summon Halloween monsters. -2101021 - Monster Sack (Jr. Mimick) - Summons 1 Jr. Mimick -2101022 - Monster Sack (Golden Egg) - (no description) -2101023 - Monster Sack (Slime Gold) - Summons 3 Slime Gold. -2101024 - Monster Sack (Slime Silver) - Summons 1 Slime Silver. -2101025 - Monster Sack (Slime Red) - Summons 5 Slime Red. -2101026 - Monster Sack (Mushmom Blue) - Summons 1 Mushmom Blue. -2101039 - Monster Summoning Sack(Alishar) - Summons 1 Alishar. -2101043 - Amoria Penalty Monster Sack1 - Summons some monsters. -2101044 - Amoria Penalty Monster Sack2 - Summons some monsters. -2101045 - Amoria Penalty Monster Sack3 - Summons some monsters. -2101046 - Amoria Penalty Monster Sack4 - Summons some monsters. -2101047 - Amoria Penalty Monster Sack5 - Summons some monsters. -2101048 - Amoria Penalty Monster Sack6 - Summons some monsters. -2101049 - Amoria Penalty Monster Sack7 - Summons some monsters. -2101050 - GM event Sack1 - Summons some monsters. Slime Storm. -2101051 - GM event Sack2 - Summons some monsters. Mushroom Boom -2101052 - GM event Sack3 - Summons some monsters. Pigs in a Blanket -2101053 - GM event Sack4 - Summons some monsters. Eye See You -2101054 - GM event Sack5 - Summons some monsters. Alien Armada -2101055 - GM event Sack6 - Summons some monsters. Toying Around -2101056 - GM event Sack7 - Summons some monsters. Crimson Crash -2101057 - Amoria Penalty Monster Sack8 - Summons some monsters. -2101058 - Amoria Penalty Monster Sack8 - Summons some monsters. -2101060 - Monster Sack (SG CBD) - Summons 9 SG Exclusive monsters. -2101061 - Monster Sack (SG Ghost ship) - Summons 4 SG Exclusive monsters. -2101072 - Monster Sack - Summons some monsters. -2101073 - Monster Sack - Summons some monsters. -2101080 - Monster Sack(x-mas07_1) - Monster Sack(x-mas07_1) -2101081 - Monster Sack(x-mas07_2) - Monster Sack(x-mas07_2) -2101082 - Monster Sack(x-mas07_3) - Monster Sack(x-mas07_3) -2101083 - Monster Sack(x-mas07_4) - Monster Sack(x-mas07_4) -2101084 - Monster Sack(x-mas07_5) - Monster Sack(x-mas07_5) -2101085 - Monster Sack(x-mas07_6) - Monster Sack(x-mas07_6) -2101086 - Monster Sack(x-mas07_7) - Monster Sack(x-mas07_7) -2101087 - Monster Sack(x-mas07_8) - Monster Sack(x-mas07_8) -2101088 - Monster Sack(x-mas07_9) - Monster Sack(x-mas07_9) -2101089 - Monster Sack(x-mas07_10) - Monster Sack(x-mas07_10) -2101090 - Monster Sack(x-mas07_11) - Monster Sack(x-mas07_11) -2101091 - Monster Sack(x-mas07_12) - Monster Sack(x-mas07_12) -2101092 - Monster Sack(x-mas07_13) - Monster Sack(x-mas07_13) -2101093 - Monster Sack(x-mas07_14) - Monster Sack(x-mas07_14) -2101124 - Giant Snowman (Lvl 1) - Easy Sack - A monster sack that summons a Giant Snowman. -2101125 - Giant Snowman (Lvl 1) - Medium Sack - A monster sack that summons a Giant Snowman. -2101126 - Giant Snowman (Lvl 1) - Hard Sack - A monster sack that summons a Giant Snowman. -2101127 - Cross (Easy) Sack - A monster sack that summons Cross. -2101128 - Cross (Medium) Sack - A monster sack that summons Cross. -2101129 - Cross (Hard) Sack - A monster sack that summons Cross. -2101130 - Summon Christmas Socks - Summons Christmas Sock monsters. -2101131 - Summon Luck Sack - Summons luck sack. -2101137 - Masteria Summoning Bag-Jungle Jam - A mysterious black sack that calls forth monsters from the Krakian Jungle. -2101138 - Masteria Summoning Bag-Corrupted Army - A mysterious black sack that calls forth monsters from Crimsonwood Mountain. -2101139 - Masteria Summoning Bag-Bosses - A mysterious black sack that calls forth powerful monsters from Masteria. Not for the faint of heart! Bigfoot will stomp nearly anyone! -2101140 - MasteriaPQ Summon Bag1 - (no description) -2101141 - MasteriaPQ Summon Bag2 - (no description) -2101142 - MasteriaPQ Summon Bag3 - (no description) -2101143 - MasteriaPQ Summon Bag4 - (no description) -2101144 - MasteriaPQ Summon Bag5 - (no description) -2101145 - MasteriaPQ Summon Bag6 - (no description) -2101146 - MasteriaPQ Summon Bag7 - (no description) -2101147 - MasteriaPQ Summon Bag8 - (no description) -2101148 - MasteriaPQ Summon Bag9 - (no description) -2101158 - Big Puff Daddy Sack - A sack filled with Big Puff Daddys -2102000 - Monster Attack Lvl 1 - Summons 3 Slimes, Pigs, Orange Mushrooms, Bubblings, Octopuses, Green Mushrooms, and Horny Mushrooms each. -2102001 - Monster Attack Lvl 2 - Summons 3 Drumming Bunnies, Ligators, Ratz, Star Pixie's, Jr. Wraith's, and Jr. Pepe's each. -2102002 - Monster Attack Lvl 3 - Summons 3 Panda Teddy's, King Bloctopuses, Lorangs, Zombie Lupins, Hellies, and Tweeters each. -2102003 - Monster Attack Lvl 4 - Summons 3 Toy Trojans, King Block Golems, Wraiths, Cheif Grey's, and Mixed Golems each. -2102004 - Monster Attack Lvl 5 - Summons 3 Mushmoms, Red Drakes, Ice Drakes, Master Soul Teddy's, and Dark Yeti's each. -2102005 - Monster Attack Lvl 6 - Summons 3 Taurospears, King Blue Goblins, Luinels, Werewolves, and Yeti & Pepes each. -2102006 - Monster Attack Lvl 7 - Summons 3 Lycanthropes, Death Teddy's, Gigantic Spirit Vikings, and G. Phantom Watches each. -2102007 - Monster Attack Lvl 8 - Summons 5 Bains, 2 Jr. Balrogs, and 1 Crimson Balrog. -2102008 - Monster Attack Package 1 - Summons one of each monsters featured in Monster Attack Level 1 ~ Level 3. -2102009 - Monster Attack Package 2 - Summons one of each monsters featured in Monster Attack Level 4 ~ Level 7. -2109000 - Monster Marble - A marble that contains poisoned monsters. Use it to bring out the poisoned monster from the marble. -2109001 - 1st Monster Marble - A marble that contains poisoned monsters on the 1st floor. Use it to bring out the poisoned monster from the marble. -2109002 - 2nd Monster Marble - A marble that contains poisoned monsters on the 2nd floor. Use it to bring out the poisoned monster from the marble. -2109003 - 3rd Monster Marble - A marble that contains poisoned monsters on the 3rd floor. Use it to bring out the poisoned monster from the marble. -2120000 - Pet Food - Small pets love them. Recovers 30 Fullness. NOT for human! -2120008 - Dry Treat - A high-quality dry treat that the Pigmies love. Pets love them, too. -2160101 - New Year's Card - Double-click on the item to send a New Year's card to a character of your choice. -2190000 - Lie Detector Test - Can be used on suspected botters. Usable only when a suspect is hunting. -2210000 - Orange Mushroom Piece - A crystal piece that resembles Orange Mushroom. When used, the crystal will melt into the body, and its mythical power will transform the user into Orange Mushroom. This mythical power will last for an hour. -2210001 - Ribbon Pig Piece - A crystal piece that resembles Ribbon Pig. When used, the crystal will melt into the body, and its mythical power will transform the user into Ribbon Pig. This mythical power will last for an hour. -2210002 - Grey Piece - A crystal piece that resembles Grey. When used, the crystal will melt into the body, and its mythical power will transform the user into Grey. This mythical power will last for an hour. -2210003 - Dragon Elixir - A mysterious elixir made by Moira which enables anyone that drinks this potion to temporarily transform into a dragon. -2210005 - Tigun Transformation Bundle. - A secret medicine that allows you to transform into Tigun, the patrol guard. -2210006 - Rainbow-colored Snail Shell - A special shell only found through Mano. Apparently it's powerful enough to grant a wish... -2210007 - Change to Ghost - First the body feels light, then all of a sudden, you're floating. Oh no, you're a ghost! -2210008 - Ghost Candy - A ghost-shaped candy with a mysterious set of ingredients. Apparently it has some special powers. -2210009 - Sophillia's Abandoned Doll - An abandoned doll that Sophillia threw away a long time ago, but revived by the Masked Man. Pet its hair, and you'll turn into Sophillia for 3 minutes. -2210010 - Potion of Transformation - The moment this potion is taken, you'll become a powerful, otherworldly being. -2210011 - Potion of Transformation - The moment this potion is taken, you'll become a powerful, otherworldly being. -2210012 - Change to Mouse - Transform into a small, tiny mouse. -2210016 - Mini Draco Transformation - The mysterious skills of an old halfling has transformed you into a form of a dragon. You can now fly. -2210023 - Cliff's Special Potion - No one knows what you'll transform into when you drink this, but something WILL happen for one hour. It's all about the risk... -2210024 - Maplemas Party Potion - Double-click on this to transform a character of your choice. Which one? Try it and find out! -2210032 - Cody's Picture - A picture given by Cody of himself. I get a feeling something fun will happen when I use it. -2210033 - Cake Picture - A picture of a delicious cake that Cody gave as a gift. I get a feeling something funny with happen when I use it. -2211000 - Cliff's Special Potion - No one knows what you'll transform into when you drink this, but something WILL happen for one hour. It's all about the risk... -2212000 - Maplemas Party Potion - Double-click on this to transform a character of your choice. Which one? Try it and find out! -2240000 - Moonstone Engagement Ring Box - Engagement Ring made of Moon Rock. The ring will be inside a wrapped box. Required for proposal. -2240001 - Star gem Engagement Ring Box - Engagement Ring made of Star Rock. The ring will be inside a wrapped box. Required for proposal. -2240002 - Golden Heart Engagement Ring Box - Engagement Ring made of gold. The ring will be inside a wrapped box. Required for proposal. -2240003 - Silver Swan Engagement Ring Box - Engagement Ring made of silver. The ring will be inside a wrapped box. Required for proposal. -2240004 - Ring of Moon Stone - An engagement ring crafted out of Moon Rock and Diamond. Use this to propose to your loved one. -2240005 - Ring of Moon Stone: 2 Carats - An engagement ring crafted out of Moon Rock and 2 carats of Diamond. Use this to propose to your loved one. -2240006 - Ring of Moon Stone: 3 Carats - An engagement ring crafted out of Moon Rock and 3 carats of Diamond. Use this to propose to your loved one. -2240007 - Ring of Shining Star - An engagement ring crafted out of Star Rock and Diamond. Use this to propose to your loved one. -2240008 - Ring of Shining Star: 2 Carats - An engagement ring crafted out of Star Rock and 2 carats of Diamond. Use this to propose to your loved one. -2240009 - Ring of Shining Star: 3 Carats - An engagement ring crafted out of Star Rock and 3 carats of Diamond. Use this to propose to your loved one. -2240010 - Gold Heart Ring - An engagement ring crafted out of Gold and Diamond. Use this to propose to your loved one. -2240011 - Gold Heart Ring: 2 Carats - An engagement ring crafted out of Gold and 2 carats of Diamond. Use this to propose to your loved one. -2240012 - Gold Heart Ring: 3 Carats - An engagement ring crafted out of Gold and 3 carats of Diamond. Use this to propose to your loved one. -2240013 - Ring of Silver Wing - An engagement ring crafted out of Silver and Diamond. Use this to propose to your loved one. -2240014 - Ring of Silver Wing: 2 Carats - An engagement ring crafted out of Silver and 2 carats of Diamond. Use this to propose to your loved one. -2240015 - Ring of Silver Wing: 3 Carats - An engagement ring crafted out of Silver and 3 carats of Diamond. Use this to propose to your loved one. -2260000 - Revitalizer - Restores tamed monster's fatigue level by 30. -2270000 - Pheromone Perfume - A perfume created by Kenta using Pheromone. Enables the user to tame hogs down at the Korean Folk Village. -2270001 - Pouch - A pouch with a jewel on the surface. Possesses a special power in that double-clicking the pouch will suck up the surrounding ghosts in the area. -2270002 - Element Rock - A special alchemist tool that converts an absorbed power of monster into a jewel. The inner part seems to be slightly transparent. -2270003 - Cliff's Magic Cane - A magic cane that tames the lost Rudolph. -2270004 - Purification Marble - It's a special magic marble that can contain and purify a monster. -2270005 - 1st Transparent Marble - A special magic marble that can contain a poisoned monster on the 1st floor. -2270006 - 2nd Transparent Marble - A special magic marble that can contain a poisoned monster on the 2nd floor. -2270007 - 3rd Transparent Marble - A special magic marble that can contain a poisoned monster on the 3rd floor. -2280000 - Lava Bottle - A glass bottle that contains an actual lava, which is waiting to be spilled out. Drink this lava, and the lava will consume the body with fire, which will enable the drinker to master Fire Demon. -2280001 - Black Cloud Machine - A mechanical device that produces black clouds. Enables the character to acquire the Smokescreen skill using the clouds. -2280002 - Firm Hand - A stimulant packaged inside a bottle that resembles a clenched fist. Drinking the stimulant will allow the character to acquire The Will of a Warrior. -2280003 - [Skill Book] Maple Warrior - You can learn #cMaple Warrior# with this book.rnJob : All 4th jobsrnCondition : #cMaple Warrior# not acquired. -2280004 - [Skill Book] Infinity - You can learn #Infinity# with this book.rnJob : 4th Advancement MagicianrnCondition : #cInfinity# not acquired -2280005 - [Skill Book] Dragon's Breath - You can learn #cDragon's Breath# with this book.wnJob : 4th Advancement BowmanrnCondition : #cDragon's Breath# not acquired -2280006 - [Skill Book] Taunt - You can learn #cTaunt# with this book.rnJob : 4th Advancement ThiefrnCondition : #cTaunt# not acquired -2280007 - [Skill Book] Advanced Combo Attack - You can learn #cAdvanced Combo Attack# with this book.rnClass : HerornCondition : #cAdvanced Combo# not acquired -2280008 - [Skill Book] Advanced Charge - You can learn #cAdvanced Charge# with this book.rnClass : PaladinrnCondition : #cAdvanced Charge# not acquired -2280009 - [Skill Book] Angel Ray - You can learn #cAngel Ray# with this book.rnClass : BishoprnCondition : #cAngel Ray# not acquired -2280010 - [Skill Book] Triple Throw - You can learn #cTriple Throw# with this book.rnClass : Night LordrnCondition : #cTriple Throw# not acquired -2280011 - Ancient Ice Powder - This is a pack full of ancient ice powder. If you eat this, you will feel chilled and can learn Ice Demon. -2280012 - [Skill Book] Rush - You can learn #cRush# with this book.rnJob : 4th Advancement WarriorrnCondition : #cRush# not acquired -2290000 - [Mastery Book] Monster Magnet - This increases master level of the #cMonster Magnet# skill up to 20 with 70% chance of success.rnJob : 4th Advancement WarriorrnCondition : Skill level above 5 -2290001 - [Mastery Book] Monster Magnet - This increases master level of the #cMonster Magnet# skill up to 30 with 50% chance of success. rnJob : 4th Advancement WarriorrnCondition : Skill Level above 15 -2290002 - [Mastery Book] Achilles - This increases the master level of #cAchilles# up to 20 with 70% of chance.rnJob : 4th Advancement WarriorrnCondition : Skill level above 5 -2290003 - [Mastery Book] Achilles - This increases the master level of #cAchilles# up to 30 with 50% of chance.rnJob : 4th Advancement WarriorrnCondition : Skill level above 15 -2290004 - [Mastery Book] Rush - This increases the master level of #cRush# up to 20 with 70% of chance.rnJob : 4th Advancement WarriorrnCondition : Skill level above 5 -2290005 - [Mastery Book] Rush - This increases the master level of #cRush# up to 30 with 50% of chance.rnJob : 4th Advancement WarriorrnCondition : Skill level above 15 -2290006 - [Mastery Book] Power Stance - This increases the master level of #cPower Stance# up to 20 with 70% of chance.rnJob : 4th Advancement WarriorrnCondition : Skill level above 5 -2290007 - [Mastery Book] Power Stance - This increases the master level of #cPower Stance# up to 30 with 50% of chance.rnJob : 4th Advancement WarriorrnCondition : Skill level above 15 -2290008 - [Mastery Book] Advanced Combo Attack - This increases the master level of #cAdvanced Combo Attack# up to 20 with 70% of chance.rnClass : HerornCondition : Skill level above 5 -2290009 - [Mastery Book] Advanced Combo Attack - This increases the master level of #cAdvanced Combo Attack# up to 30 with 50% of chance.rnClass : HerornCondition : Skill level above 15 -2290010 - [Mastery Book] Brandish - This increases the master level of #cBrandish# up to 20 with 70% of chance.rnClass : HerornCondition : Skill level above 5 -2290011 - [Mastery Book] Brandish - This increases the master level of #cBrandish# up to 30 with 50% of chance.rnClass : HerornCondition : Skill level above 15 -2290012 - [Mastery Book] Blast - This increases the master level of #cBlast # up to 20 with 70% of chance.rnClass : PaladinrnCondition : Skill level above 5 -2290013 - [Mastery Book] Blast - This increases the master level of #cBlast# up to 30 with 50% of chance.rnClass : PaladinrnCondition : Skill level above 15 -2290014 - [Mastery Book] Guardian - This increases the master level of #cGuardian# up to 20 with 70% of chance.rnClass : Hero,PaladinrnCondition : Skill level above 5 -2290015 - [Mastery Book] Guardian - This increases the master level of #cGuardian# up to 30 with 50% of chance.rnClass : Hero,PaladinrnCondition : Skill level above 15 -2290016 - [Mastery Book] Enrage - This increases the master level of #cEnrage# up to 20 with 70% of chance.rnClass : HerornCondition : Skill level above 5 -2290017 - [Mastery Book] Enrage - This increases the master level of #cEnrage# up to 30 with 50% of chance.rnClass : HerornCondition : Skill level above 15 -2290018 - [Mastery Book] Holy Charge - This increases the master level of #cHoly Charge# up to 20 with 70% of chance.rnClass : PaladinrnCondition : Skill level above 5 -2290019 - [Mastery Book] Divine Charge - This increases the master level of #cDivine Charge# up to 20 with 70% of chance.rnClass : PaladinrnCondition : Skill level above 5 -2290020 - [Mastery Book] Heaven's Hammer - This increases the master level of #cHeaven's Hammer# up to 20 with 70% of chance.rnClass : PaldainrnCondition : Skill level above 5 -2290021 - [Mastery Book] Heaven's Hammer - This increases the master level of #cHeaven's Hammer# up to 30 with 50% of chance.rnClass : PaladinrnCondition : Skill level above 15 -2290022 - [Mastery Book] Berserk - This increases the master level of #cBerserk# up to 20 with 70% of chance.rnClass : Dark KnightrnCondition : Skill level above 5 -2290023 - [Mastery Book] Berserk - This increases the master level of #cBerserk# up to 30 with 50% of chance.rnClass : Dark KnightrnCondition : Skill level above 15 -2290024 - [Mastery Book] Mana Reflection - This increases the master level of #cMana Reflection# up to 20 with 70% of chance.rnJob : 4th Advancement MagicianrnCondition : Skill level above 5 -2290025 - [Mastery Book] Mana Reflection - This increases the master level of #cMana Reflection# up to 30 with 50% of chance.rnJob : 4th Advancement MagicianrnCondition : Skill level above 15 -2290026 - [Mastery Book] Big Bang - This increases the master level of #cBig Bang# up to 20 with 70% of chance.rnJob : 4th Advancement MagicianrnCondition : Skill level above 5 -2290027 - [Mastery Book] Big Bang - This increases the master level of #cBig Bang # up to 30 with 50% of chance.rnJob : 4th Advancement MagicianrnCondition : Skill level above 15 -2290028 - [Mastery Book] Infinity - This increases the master level of #cInfinity# up to 20 with 70% of chance.rnJob : 4th Advancement MagicianrnCondition : Skill level above 5 -2290029 - [Mastery Book] Infinity - This increases the master level of #cInfinity# up to 30 with 50% of chance.rnJob : 4th Advancement MagicianrnCondition : Skill level above 15 -2290030 - [Mastery Book] Paralyze - This increases the master level of #cParalyze# up to 20 with 70% of chance.rnClass : Arch Mage(Fire,Poison)rnCondition : Skill level above 5 -2290031 - [Mastery Book] Paralyze - This increases the master level of #cParalyze# up to 30 with 50% of chance.rnClass : Arch Mage(Fire,Poison)rnCondition : Skill level above 15 -2290032 - [Mastery Book] Chain Lightning - This increases the master level of #cChain Lightning# up to 20 with 70% of chance.rnClass : Arch Mage(Ice, Lightning)rnCondition : Skill level above 5 -2290033 - [Mastery Book] Chain Lightning - This increases the master level of #cChain Lightning# up to 30 with 50% of chance.rnClass : Arch Mage(Ice, Lightning)rnCondition : Skill level above 15 -2290034 - [Mastery Book] Holy Shield - This increases the master level of #cHoly Shield# up to 20 with 70% of chance.rnClass : BishoprnCondition : Skill Level above 5 -2290035 - [Mastery Book] Holy Shield - This increases the master level of #cHoly Shield# up to 30 with 50% of chance.rnClass : BishoprnCondition : Skill level above 15 -2290036 - [Mastery Book] Fire Demon - This increases the master level of #cFire Demon# up to 20 with 70% of chance.rnClass : Arch Mage(Fire,Poison)rnCondition : Skill level above 5 -2290037 - [Mastery Book] Fire Demon - This increases the master level of #cFire Demon# up to 30 with 50% of chance.rnClass : Arch Mage(Fire,Poison)rnCondition : Skill level above 15 -2290038 - [Mastery Book] Elquines - This increases the master level of #cElquines# up to 20 with 70% of chance.rnClass : Arch Mage(Fire,Poison)rnCondition : Skill level above 5 -2290039 - [Mastery Book] Elquines - This increases the master level of #cElquines# up to 30 with 50% of chance.rnClass : Arch Mage(Fire,Poison)rnCondition : Skill level above 15 -2290040 - [Mastery Book] Meteor Shower - This increases the master level of #cMeteor Shower# up to 20 with 70% of chance.rnClass : Arch Mage(Fire,Poison)rnCondition : Skill level above 5 -2290041 - [Mastery Book] Meteor Shower - This increases the master level of #cMeteor Shower# up to 30 with 50% of chance.rnClass : Arch Mage(Fire,Poison)rnCondition : Skill level above 15 -2290042 - [Mastery Book] Ice Demon - This increases the master level of #cIce Demon# up to 20 with 70% of chance.rnClass : Arch Mage(Ice, Lightning)rnCondition : Skill level above 5 -2290043 - [Mastery Book] Ice Demon - This increases the master level of #cIce Demon# up to 30 with 50% of chance.rnClass : Arch Mage(Ice, Lightning)rnCondition : Skill level above 15 -2290044 - [Mastery Book] Ifrit - This increases the master level of #cIfrit# up to 20 with 70% of chance.rnClass : Arch Mage(Ice,Lightning)rnCondition : Skill level above 5 -2290045 - [Mastery Book] Ifrit - This increases the master level of #cIfrit# up to 30 with 50% of chance.rnClass : Arch Mage(Ice,Lightning)rnCondition : Skill level above 15 -2290046 - [Mastery Book] Blizzard - This increases the master level of #cBlizzard# up to 20 with 70% of chance.rnClass : Arch Mage(Ice,Lightning)rnCondition : Skill level above 5 -2290047 - [Mastery Book] Blizzard - This increases the master level of #cBlizzard# up to 30 with 50% of chance.rnClass : Arch Mage(Ice,Lightning)rnCondition : Skill level above 15 -2290048 - [Mastery Book] Genesis - This increases the master level of #cGenesis# up to 20 with 70% of chance.rnClass : BishoprnCondition : Skill level above 5 -2290049 - [Mastery Book] Genesis - This increases the master level of #cGenesis# up to 30 with 50% of chance.rnClass : BishoprnCondition : Skill level above 15 -2290050 - [Mastery Book] Angel Ray - This increases the master level of #cAngel Ray# up to 20 with 70% of chance.rnClass : BishoprnCondition : Skill level above 5 -2290051 - [Mastery Book] Angel Ray - This increases the master level of #cAngel Ray# up to 30 with 50% of chance.rnClass : BishoprnCondition : Skill level above 15 -2290052 - [Mastery Book] Sharp Eyes - This increases the master level of #cSharp Eyes# up to 20 with 70% of chance.rnJob : 4th Advancement BowmanrnCondition : Skill level above 5 -2290053 - [Mastery Book] Sharp Eyes - This increases the master level of #cSharp Eyes# up to 30 with 50% of chance.rnJob : 4th Advancement BowmanrnCondition : Skill level above 15 -2290054 - [Mastery Book] Dragon's Breath - This increases the master level of #cDragon's Breath# up to 20 with 70% of chance.rnJob : 4th Advancement BowmanrnCondition : Skill level above 5 -2290055 - [Mastery Book] Dragon's Breath - This increases the master level of #cDragon's Breath# up to 30 with 50% of chance.rnJob : 4th Advancement BowmanrnCondition : Skill level above 15 -2290056 - [Mastery Book] Bow Expert - This increases the master level of #cBow Expert# up to 20 with 70% of chance.rnClass : Bow MasterrnCondition : Skill level above 5 -2290057 - [Mastery Book] Bow Expert - This increases the master level of #cBow Expert # up to 30 with 50% of chance.rnClass : Bow MasterrnCondition : Skill level above 15 -2290058 - [Mastery Book] Hamstring Shot - This increases the master level of #cHamstring Shot# up to 20 with 70% of chance.rnClass : Bow MasterrnCondition : Skill level above 5 -2290059 - [Mastery Book] Hamstring Shot - This increases the master level of #cHamstring Shot# up to 30 with 50% of chance.rnClass : Bow MasterrnCondition : Skill level above 15 -2290060 - [Mastery Book] Hurricane - This increases the master level of #cHurricane# up to 20 with 70% of chance.rnClass : Bow MasterrnCondition : Skill level above 5 -2290061 - [Mastery Book] Hurricane - This increases the master level of #cHurricane# up to 30 with 50% of chance.rnClass : Bow MasterrnCondition : Skill level above 15 -2290062 - [Mastery Book] Phoenix - This increases the master level of #cPhoenix# up to 20 with 70% of chance.rnClass : Bow MasterrnCondition : Skill level above 5 -2290063 - [Mastery Book] Phoenix - This increases the master level of #cPhoenix# up to 30 with 50% of chance.rnClass : Bow MasterrnCondition : Skill level above 15 -2290064 - [Mastery Book] Concentrate - This increases the master level of #cConcentrate# up to 20 with 70% of chance.rnClass : Bow MasterrnCondition : Skill level above 5 -2290065 - [Mastery Book] Concentrate - This increases the master level of #cConcentrate# up to 30 with 50% of chance.rnClass : Bow MasterrnCondition : Skill level above 15 -2290066 - [Mastery Book] Marksman Boost - This increases the master level of #cMarksman Boost# up to 20 with 70% of chance.rnClass : MarksmanrnCondition : Skill level above 5 -2290067 - [Mastery Book] Marksman Boost - This increases the master level of #cMarksman Boost# up to 30 with 50% of chance.rnClass : MarksmanrnCondition : Skill level above 15 -2290068 - [Mastery Book] Blind - This increases the master level of #cBlind# up to 20 with 70% of chance.rnClass : MarksmanrnCondition : Skill level above 5 -2290069 - [Mastery Book] Blind - This increases the master level of #cBlind# up to 30 with 50% of chance.rnClass : MarksmanrnCondition : Skill level above 15 -2290070 - [Mastery Book] Piercing Arrow - This increases the master level of #cPiercing Arrow# up to 20 with 70% of chance.rnClass : MarksmanrnCondition : Skill level above 5 -2290071 - [Mastery Book] Piercing Arrow - This increases the master level of #cPiercing Arrow# up to 30 with 50% of chance. rnClass : MarksmanrnCondition : Skill level above 15 -2290072 - [Mastery Book] Frostprey - This increases the master level of #cFrostprey# up to 20 with 70% of chance.rnClass : MarksmanrnCondition : Skill level above 5 -2290073 - [Mastery Book] Frostprey - This increases the master level of #cFrostprey# up to 30 with 50% of chance.rnClass : MarksmanrnCondition : Skill level above 15 -2290074 - [Mastery Book] Snipe - This increases the master level of #cSnipe# up to 20 with 70% of chance.rnClass : MarksmanrnCondition : Skill level above 5 -2290075 - [Mastery Book] Snipe - This increases the master level of #cSnipe# up to 30 with 50% of chance.rnClass : MarksmanrnCondition : Skill level above 15 -2290076 - [Mastery Book] Shadow Shifter - This increases the master level of #cShadow Shifter# up to 20 with 70% of chance.rnJob : 4th Advancement ThiefrnCondition : Skill level above 5 -2290077 - [Mastery Book] Shadow Shifter - This increases the master level of #cShadow Shifter# up to 30 with 50% of chance.rnJob : 4th Advancement ThiefrnCondition : Skill level above 15 -2290078 - [Mastery Book] Venomous Star/Venomous Stab - This increases the master level of #cVenomous Star or Venomous Stab# up to 20 with 70% of chance.rnJob : 4th Advancement ThiefrnCondition : Skill level above 5 -2290079 - [Mastery Book] Venomous Star/Venomous Stab - This increases the master level of #cVenomous Star or Venomous Stab# up to 30 with 50% of chance. rnJob : 4th Advancement ThiefrnCondition : Skill level above 15 -2290080 - [Mastery Book] Taunt - This increases the master level of #cTaunt# up to 20 with 70% of chance.rnJob : 4th Advancement ThiefrnCondition : Skill level above 5 -2290081 - [Mastery Book] Taunt - This increases the master level of #cTaunt# up to 30 with 50% of chance.rnJob : 4th Advancement ThiefrnCondition : Skill level above 15 -2290082 - [Mastery Book] Ninja Ambush - This increases the master level of #cNinja Ambush# up to 20 with 70% of chance.rnJob : 4th Advancement ThiefrnCondition : Skill level above 5 -2290083 - [Mastery Book] Ninja Ambush - This increases the master level of #cNinja Ambush# up to 30 with 50% of chance.rnJob : 4th Advancement ThiefrnCondition : Skill level above 15 -2290084 - [Mastery Book] Triple Throw - This increases the master level of #cTriple Throw# up to 20 with 70% of chance.rnClass : Night LordrnCondition : Skill level above 5 -2290085 - [Mastery Book] Triple Throw - This increases the master level of #cTriple Throw# up to 30 with 50% of chance.rnClass : Night LordrnCondition : Skill level above 15 -2290086 - [Mastery Book] Ninja Storm - This increases the master level of #cNinja Storm# up to 20 with 70% of chance.rnClass : Night LordrnCondition : Skill level above 5 -2290087 - [Mastery Book] Ninja Storm - This increases the master level of #cNinja Storm# up to 30 with 50% of chance.rnClass : Night LordrnCondition : Skill level above 15 -2290088 - [Mastery Book] Shadow Claw - This increases the master level of #cShadow Claw# up to 20 with 70% of chance.rnClass : Night LordrnCondition : Skill level above 5 -2290089 - [Mastery Book] Shadow Claw - This increases the master level of #cShadow Claw# up to 30 with 50% of chance.rnClass : Night LordrnCondition : Skill level above 15 -2290090 - [Mastery Book] Boomerang Step - This increases the master level of #cBoomerang Step# up to 20 with 70% of chance.rnClass : ShadowerrnCondition : Skill level above 5 -2290091 - [Mastery Book] Boomerang Step - This increases the master level of #cBoomerang Step# up to 30 with 50% of chance.rnClass : ShadowerrnCondition : Skill level above 15 -2290092 - [Mastery Book] Assassinate - This increases the master level of #cAssassinate# up to 20 with 70% of chance.rnClass : ShadowerrnCondition : Skill level above 5 -2290093 - [Mastery Book] Assassinate - This increases the master level of #cAssassinate# up to 30 with 50% of chance.rnClass : ShadowerrnCondition : Skill level above 15 -2290094 - [Mastery Book] Smokescreen - This increases the master level of #cSmokescreen# up to 20 with 70% of chance.rnClass : ShadowerrnCondition : Skill level above 5 -2290095 - [Mastery Book] Smokescreen - This increases the master level of #cSmokescreen# up to 30 with 50% of chance.rnClass : ShadowerrnCondition : Skill level above 15 -2290096 - [Mastery Book] Maple Warrior 20 - This increases the master level of #cMaple Warrior# up to 20 with 70% of chance.rnJob : All 4th Advancement JobsrnCondition : Skill level above 5 -2290097 - [Mastery Book] Dragon Strike - With a 70% success rate, it raises the Master Level of #cDragon Strike# to 20.nJob : BuccaneernRequirement : At least Level 5 in this skill -2290098 - [Mastery Book] Dragon Strike - With a 50% success rate, it raises the Master Level of #cDragon Strike# to 30.nJob : BuccaneernRequirement : At least Level 15 in this skill -2290099 - [Mastery Book] Energy Orb - With a 70% success rate, it raises the Master Level of #cEnergy Orb# to 20.nJob : BuccaneernRequirement : At least Level 5 in this skill -2290100 - [Mastery Book] Energy Orb - With a 50% success rate, it raises the Master Level of #cEnergy Orb# to 30.nJob : BuccaneernRequirement : At least Level 15 in this skill -2290101 - [Mastery Book] Super Transformation - With a 70% success rate, it raises the Master Level of #cSuper Transformation# to 20.nJob : BuccaneernRequirement : At least Level 5 in this skill -2290102 - [Mastery Book] Demolition - With a 70% success rate, it raises the Master Level of #cDemolition# to 20.nJob : BuccaneernRequirement : At least Level 5 in this skill -2290103 - [Mastery Book] Demolition - With a 50% success rate, it raises the Master Level of #cDemolition# to 30.nJob : BuccaneernRequirement : At least Level 15 in this skill -2290104 - [Mastery Book] Snatch - With a 70% success rate, it raises the Master Level of #cSnatch# to 20.nJob : BuccaneernRequirement : At least Level 5 in this skill -2290105 - [Mastery Book] Snatch - With a 50% success rate, it raises the Master Level of #cSnatch# to 30.nJob : BuccaneernRequirement : At least Level 15 in this skill -2290106 - [Mastery Book] Barrage - With a 70% success rate, it raises the Master Level of #cBarrage# to 20.nJob : BuccaneernRequirement : At least Level 5 in this skill -2290107 - [Mastery Book] Barrage - With a 50% success rate, it raises the Master Level of #cBarrage# to 30.nJob : BuccaneernRequirement : At least Level 15 in this skill -2290108 - [Mastery Book] Speed Infusion - With a 70% success rate, it raises the Master Level of #cSpeed Infusion# to 20.nJob : BuccaneernRequirement : At least Level 5 in this skill -2290109 - [Mastery Book] Wind Booster - With a 50% success rate, it raises the Master Level of #cWind Booster# to 30. nJob : BuccaneernRequirement : At least Level 15 in this skill -2290110 - [Mastery Book] Time Leap - With a 70% success rate, it raises the Master Level of #cTime Leap# to 20.nJob : BuccaneernRequirement : At least Level 5 in this skill -2290111 - [Mastery Book] Time Leap - With a 50% success rate, it raises the Master Level of #cTime Leap# to 30.nJob : BuccaneernRequirement : At least Level 15 in this skill -2290112 - [Mastery Book] Elemental Boost - With a 70% success rate, it raises the Master Level of #cElemental Boost# to 20.nJob : CorsairnRequirement : At least Level 5 in this skill -2290113 - [Mastery Book] Elemental Boost - With a 50% success rate, it raises the Master Level of #cElemental Boost# to 30.nJob : CorsairnRequirement : At least Level 15 in this skill -2290114 - [Mastery Book] Wrath of the Octopi - With a 70% success rate, it raises the Master Level of #cWrath of the Octopi# to 20.nJob : CorsairnRequirement : At least Level 5 in this skill -2290115 - [Mastery Book] Air Strike - With a 70% success rate, it raises the Master Level of #cAir Strike# to 20.nJob : CorsairnRequirement : At least Level 5 in this skill -2290116 - [Mastery Book] Air Strike - With a 50% success rate, it raises the Master Level of #cAir Strike# to 30.nJob : CorsairnRequirement : At least Level 15 in this skill -2290117 - [Mastery Book] Rapid Fire - With a 70% success rate, it raises the Master Level of #cRapid Fire# to 20.\nJob : Corsair\nRequirement : At least Level 5 in this skill -2290118 - [Mastery Book] Rapid Fire - With a 50% success rate, it raises the Master Level of #cRapid Fire# to 30.nJob : CorsairnRequirement : At least Level 15 in this skill -2290119 - [Mastery Book] Battleship Cannon - With a 70% success rate, it raises the Master Level of #cBattleship Cannon# to 20.nJob : CorsairnRequirement : At least Level 5 in this skill -2290120 - [Mastery Book] Battleship Cannon - With a 50% success rate, it raises the Master Level of #cBattleship Cannon# to 30.nJob : CorsairnRequirement : At least Level 15 in this skill -2290121 - [Mastery Book] Battleship Torpedo - With a 70% success rate, it raises the Master Level of #cBattleship Torpedo# to 20.nJob : CorsairnRequirement : At least Level 5 in this skill -2290122 - [Mastery Book] Battleship Torpedo - With a 50% success rate, it raises the Master Level of #cBattleship Torpedo# to 30.nJob : CorsairnRequirement : At least Level 15 in this skill -2290123 - [Mastery Book] Hypnotize - With a 70% success rate, it raises the Master Level of #cHypnotize# to 20.nJob : CorsairnRequirement : At least Level 5 in this skill -2290124 - [Mastery Book] Bullseye - With a 70% success rate, it raises the Master Level of #cBullseye# to 20.nJob : CorsairnRequirement : At least Level 5 in this skill -2290125 - [Mastery Book] Maple Warrior 30 - This increases the master level of #cMaple Warrior# up to 30 with 50% of chance.rnJob : All 4th Advancement JobsrnCondition : Skill level above 15 -2310000 - The Owl of Minerva - #cThe Owl of Minerva#, which represents wisdom, can be used to search for items sold at the Free Market. #cDisappears right after showing the results of the item search#. -2320000 - Teleport Rock - Remembers 5 maps of your choice. This rock will enable you to #cteleport to the map you remembered#. It can even allow you to #cmove to the map where a certain character is#, provided that the person is in the same channel at the same world. -2330000 - Bullet - A bullet made out of steel. A set contains numerous bullets and once they are used up, they'll need to be recharged.\nAttack + 10 -2330001 - Split Bullet - A bullet made out of steel. A set contains numerous bullets and once they are used up, they'll need to be recharged.rnAttack + 12 -2330002 - Mighty Bullet - A bullet made out of steel. A set contains numerous bullets and once they are used up, they'll need to be recharged.rnAttack + 14 -2330003 - Vital Bullet - A bullet made out of steel. A set contains numerous bullets and once they are used up, they'll need to be recharged.rnAttack + 16 -2330004 - Shiny Bullet - A bullet made out of steel. A set contains numerous bullets and once they are used up, they'll need to be recharged.rnAttack + 18 -2330005 - Eternal Bullet - A bullet made out of steel. A set contains numerous bullets and once they are used up, they'll need to be recharged.\nAttack + 20 -2330006 - Bullet for Novice Pirates - A bullet made out of steel. A set contains numerous bullets.rnAttack + 10 -2331000 - Blaze Capsule - A capsule used for fire-elemental attacks. -2332000 - Glaze Capsule - A capsule used for ice-elemental attacks. -2340000 - White Scroll - One of Subani's sacred Scrolls. If used in conjunction with a normal or Dark Scroll, the number of item upgrade slots will not be deducted if the scroll fails. However, if using a Dark Scroll, there is still a chance that your weapon will be destroyed. -2360000 - Change to Ghost - First the body feels light, then all of a sudden, you're floating. Oh no, you're a ghost! -2360001 - Ghost Candy - A ghost-shaped candy with a mysterious set of ingredients. Take this to change into a ghost for 1 hour. -2370000 - The Songs of Solomon - An ancient collection of poems and life lessons from various elders, sages and warriors in the Maple World. Reading this allows one to gain their collective experience (EXP) in a single second. This edition provides 100,000 EXP. Only available fo -2370001 - The Stories of Solomon - An ancient book of stories, fables and other myths from various elders, sages and warriors in the Maple World. Reading this allows one to gain their collective experience (EXP) in a single second. This edition provides 50,000 EXP. Only available -2370002 - The Travels of Solomon - An ancient collection of map routes, hidden paths and shortcuts from various elders, sages and warriors in the Maple World. Reading this allows one to gain their collective experience (EXP) in a single second. This edition provides 30,000 EXP. On -2370003 - The Writs of Solomon X - An ancient document of collected wisdom from various elders, sages and warriors in the Maple World. Reading this allows one to gain their collective experience (EXP) in a single second. This edition provides 20,000 EXP. Only available for users u -2370004 - The Writs of Solomon IX - An ancient document of collected wisdom from various elders, sages and warriors in the Maple World. Reading this allows one to gain their collective experience (EXP) in a single second. This edition provides 10,000 EXP. Only available for users u -2370005 - The Writs of Solomon VIII - An ancient document of collected wisdom from various elders, sages and warriors in the Maple World. Reading this allows one to gain their collective experience (EXP) in a single second. This edition provides 5,000 EXP. Only available for users un -2370006 - The Writs of Solomon VII - An ancient document of collected wisdom from various elders, sages and warriors in the Maple World. Reading this allows one to gain their collective experience (EXP) in a single second. This edition provides 3,000 EXP. Only available for users un -2370007 - The Writs of Solomon VI - An ancient document of collected wisdom from various elders, sages and warriors in the Maple World. Reading this allows one to gain their collective experience (EXP) in a single second. This edition provides 2,000 EXP. Only available for users un -2370008 - The Writs of Solomon V - An ancient document of collected wisdom from various elders, sages and warriors in the Maple World. Reading this allows one to gain their collective experience (EXP) in a single second. This edition provides 1,000 EXP. Only available for users un -2370009 - The Writs of Solomon IV - An ancient document of collected wisdom from various elders, sages and warriors in the Maple World. Reading this allows one to gain their collective experience (EXP) in a single second. This edition provides 500 EXP. Only available for users under -2370010 - The Writs of Solomon III - An ancient document of collected wisdom from various elders, sages and warriors in the Maple World. Reading this allows one to gain their collective experience (EXP) in a single second. This edition provides 300 EXP. Only available for users under -2370011 - The Writs of Solomon II - An ancient document of collected wisdom from various elders, sages and warriors in the Maple World. Reading this allows one to gain their collective experience (EXP) in a single second. This edition provides 200 EXP. Only available for users under -2370012 - The Writs of Solomon I - An ancient document of collected wisdom from various elders, sages and warriors in the Maple World. Reading this allows one to gain their collective experience (EXP) in a single second. This edition provides 100 EXP. Only available for users under -2380000 - Snail Card - A card that features Snail. -2380001 - Blue Snail Card - A card that features Blue Snail. -2380002 - Spore Card - A card that features Spore. -2380003 - Stump Card - StumpA card that features -2380004 - Red Snail Card - Red SnailA card that features -2380005 - Slime Card - A card that features Slime -2380006 - Pig Card - A card that features Pig -2380007 - Orange Mushroom Card - A card that features Orange Mushroom. -2380008 - Dark Stump Card - A card that features Dark Stump. -2380009 - Ribbon Pig Card - A card that features Ribbon Pig -2380010 - Octopus Card - A card that features Octopus. -2380011 - Green Mushroom Card - A card that features Green Mushroom. -2380012 - Bubbling Card - A card that features Bubbling. -2381000 - Axe Stump Card - A card that features Axe Stump -2381001 - Ghost Stump Card - A card that features Ghost Stump. -2381002 - Blue Mushroom Card - A card that features Blue Mushroom. -2381003 - Stirge Card - A card that features Stirge. -2381004 - Female Desert Rabbit Card - A card that features Female Desert Rabbit. -2381005 - Male Desert Rabbit Card - A card that features Male Desert Rabbit. -2381006 - Jr. Necki Card - A card that features Jr. Necki. -2381007 - Horny Mushroom Card - A card that features Horny Mushroom. -2381008 - Dark Axe Stump Card - A card that features Dark Axe Stump. -2381009 - Pinboom Card - A card that features Pinboom. -2381010 - Jr. Cactus Card - A card that features Jr. Cactus. -2381011 - Trixter Card - A card that features Trixter. -2381012 - Jr. Sentinel Card - A card that features Jr. Sentinel. -2381013 - Seacle Card - A card that features Seacle. -2381014 - Wooden Mask Card - A card that features Wooden Mask. -2381015 - Bellamoa Card - A card that features Bellamoa. -2381016 - Zombie Mushroom Card - A card that features Zombie Mushroom. -2381017 - Krappy Card - A card that features Krappy. -2381018 - Rocky Mask Card - A card that features Rocky Mask. -2381019 - Ear Plug Plead Card - A card that features Ear Plug Plead. -2381020 - Sand Rat Card - A card that features Sand Rat. -2381021 - Cico Card - A card that features Cico -2381022 - Wild Boar Card - A card that features Wild Boar. -2381023 - Cactus Card - A card that features Cactus. -2381024 - Evil Eye Card - A card that features Evil Eye. -2381025 - Scarf Plead Card - A card that features Scarf Plead. -2381026 - Bubble Fish Card - A card that features Bubble Fish. -2381027 - Green Trixter Card - A card that features Green Trixter. -2381028 - Royal Cactus Card - A card that features Royal Cactus. -2381029 - Flower Fish Card - A card that features Flower Fish. -2381030 - Meercat Card - A card that features Meercat. -2381031 - Scorpion Card - A card that features Scorpion. -2381032 - Sentinel Card - A card that features Sentinel. -2381033 - Fairy Card - A card that features Fairy. -2381034 - Brown Teddy Card - A card that features Brown Teddy. -2381035 - Krip Card - A card that features Krip. -2381036 - Kiyo Card - A card that features Kiyo. -2381037 - Ice Sentinel Card - A card that features Ice Sentinel. -2381038 - Fire Sentinel Card - A card that features Fire Sentinel. -2382000 - Chirppy Card - A card that features Chirppy.n#cIf hunting at Eos TowernSpeed +1# -2382001 - Drum Bunny Card - A card that features Drum Bunny.n#cImproves the drop rate of the Drum Bunny.# -2382002 - Ligator Card - A card that features Ligator.n#cIf hunting at the SwampnAvoidability +1# -2382003 - Fireboar Card - A card that features Fireboar.n#cIf hunting at PerionnDefense against fire-based attacks +3%# -2382004 - Pink Teddy Card - A card that features Pink Teddy.n#cIf hunting at the upper floors of the ClocktowernJump +1# -2382005 - Ratz Card - A card that features Ratz.n#cIf hunting at Eos TowernMeso drop rate is increased# -2382006 - Leatty Card - A card that features Leatty.n#cIf hunting at Orbis TowernAccuracy +1# -2382007 - Mask Fish Card - A card that features Mask Fishn#cIf hunting at Aqua Roadnavoidability+1# -2382008 - Sand Dwarf Card - A card that features Sand Dwarf.n#cIf hunting at the DesertnThe drop rate for ores are increased# -2382009 - Cube Slime Card - A card that features Cube Slime.n#cIf hunting at the Zenumist InstitutenJump +1# -2382010 - Red Sand Dwarf Card - A card that features Red Sand Dwarf.n#cIf hunting at the DesertnThe drop rate for jewels are increased# -2382011 - Jr. Cellion Card - A card that features Jr. Cellion.n#cIf hunting at the Orbis GardennDefense against fire-based attacks +3%# -2382012 - Jr. Lioner Card - A card that features Jr. Lioner.n#cIf hunting at the Orbis GardennDefense against electric-based attacks +3%# -2382013 - Jr. Grupin Card - A card that features Jr. Grupin.n#cIf hunting at the Orbis GardennDefense against ice-based attacks +3%# -2382014 - Dark Leatty Card - A card that features Dark Leatty.n#cIf hunting at Orbis TowernAccuracy +1# -2382015 - Roloduck Card - A card that features Roloduck.n#cWhen party huntingnAccuracy +1# -2382016 - Black Ratz Card - A card that features Black Ratz.n#cIf hunting at Eos TowernMeso drop rate is increased# -2382017 - Tick Card - A card that features Tickn#cIf hunting at the upper floors of the ClocktowernAccuracy +1# -2382018 - Curse Eye Card - A card that features Curse Eye.n#cIf hunting at Victoria IslandnDefense against poison-based attacks +3%# -2382019 - Jr. Wraith Card - A card that features Jr. Wraith.n#cIf hunting at the SubwaynSpeed +1# -2382020 - Star Pixie Card - A card that features Star Pixie.n#cIf hunting at the Cloud ParknSpeed +1# -2382021 - Jr. Boogie Card - A card that features Jr. Boogie.n#cDefense against curse +5%# -2382022 - Bloctopus Card - A card that features Bloctopus.n#cIf hunting at Eos TowernJump +1# -2382023 - Jr. Pepe Card - A card that features Jr. Pepe.n#cIf hunting at Orbis TowernSpeed + 1# -2382024 - Rumo Card - A card that features Rumo.n#cIf hunting at the Zenumist InstitutenDefense against poison-based attacks +3%# -2382025 - Panda Teddy Card - A card that features Panda Teddy.n#cIf attacking a weapon-carrying monsternAccuracy +1# -2382026 - Helly Card - A card that features Helly.n#cIf hunting at Eos TowernAvoidability +1# -2382027 - Scuba Pepe Card - A card that features Scuba Pepe.n#cCancels out drowning damage underwater# -2382028 - Retz - A card that features Retz.n#cIf hunting at Helios TowernItem drop rates are increased# -2382029 - Lupin Card - A card that features Lupin.n#cIf hunting at Victoria IslandnSpeed +1# -2382030 - Lorang Card - A card that features Lorang.n#cIf hunting at Victoria IslandnSpeed +1# -2382031 - Propelly Card - A card that features Propelly.n#cIf hunting at Eos TowernSpeed +1# -2382032 - Chronos Card - A card that features Chronos.n#cIf hunting at the upper floors of the ClocktowernAvoidability +1# -2382033 - King Bloctopus Card - A card that features King Bloctopus.n#cIf hunting at Eos TowernJump +1# -2382034 - Planey Card - A card that features Planey.n#cIf hunting at Eos TowernAccuracy +1# -2382035 - Jr. Seal Card - A card that features Jr. Seal.n#cIf hunting at Aqua RoadnJump +1# -2382036 - Triple Rumo Card - A card that features Triple Rumo.n#cIf hunting at the Zenumist InstitutenDefense against poison-based attacks +3%# -2382037 - Tweeter Card - A card that features Tweeter.n#cIf hunting at Eos TowernAccuracy +1# -2382038 - Toy Trojan Card - A card that features Toy Trojan.n#cIf hunting at the upper floors of the ClocktowernSpeed +1# -2382039 - Cold Eye Card - A card that features Cold Eye.n#cIf hunting at Victoria IslandnDefense against ice-based attacks +3%# -2382040 - Zombie Lupin Card - A card that features Zombie Lupin.n#cIncreases the drop rate of Cursed Doll# -2382041 - Tick-Tock Card - A card that features Tick-Tock.n#cIf hunting at the upper floors of the ClocktowernAccuracy +1# -2382042 - Barnard Grey Card - A card that features Barnard Grey.n#cIf hunting at Kulan FieldnJump +1# -2382043 - Poopa Card - A card that features Poopa.n#cIf hunting at Aqua RoadnSpeed +1# -2382044 - Poison Poopa Card - A card that features Poison Poopa.n#cIf hunting at Aqua RoadnDefense against poison-based attacks +3%# -2382045 - Chipmunk Card - A card that features Chipmunk.n#cIf hunting at Mu LungnSpeed +1# -2382046 - Desert Giant Card - A card that features Desert Giant.n#cIf hunting at the DesertnSpeed +1# -2382047 - Flyeye - A card that features Flyeye.n#cIf hunting at the CavenAvoidability +1# -2382048 - Robo Card - A card that features Robo.n#cIf hunting at the upper floors of the ClocktowernDefense against electric-based attacks +3%# -2382049 - Platoon Chronos Card - A card that features Platoon Chronos.n#cIf hunting at the upper floors of the ClocktowernSpeed +1# -2382050 - Mateon Card - A card that features Mateon.n#cIf hunting at Boswell FieldnThe drop rates for droppings are increased# -2382051 - Red Porky Card - A card that features Red Porky.n#cIf hunting at Mu LungnAvoidability +1# -2382052 - Nependeath Card - A card that features Nependeath.n#cIncreases drop rate of Nependeath Honey# -2382053 - Iron Hog Card - A card that features Iron Hog.n#cIf hunting at Victoria IslandnJump +1# -2382054 - Block Golem - A card that features Block Golem.n#cIf hunting at Eos TowernAccuracy +1# -2382055 - Zeta Grey Card - A card that features Zeta Grey.n#cIf hunting at Kulan FieldnSpeed +1# -2382056 - Freezer Card - A card that features Freezer.n#cIf hunting at Aqua RoadnDefense against ice-based attacks +3%# -2382057 - Iron Mutae - A card that features Iron Mutae.n#cIf hunting at the Alcadno InstitutenSpeed +1# -2382058 - Jr. Cerebes Card - A card that features Jr. Cerebes.n#cIf hunting at Dead MinenJump +1# -2382059 - Sparker Card - A card that features Sparker.n#cIf hunting at Aqua RoadnDefense against electric-based attacks +3%# -2382060 - Black Porky Card - A card that features Black Porky.n#cIf hunting at Mu LungnAvoidability +1# -2382061 - Plateon Card - A card that features Plateon.n#cIf hunting at Boswell FieldnSpeed +1# -2382062 - Master Robo Card - A card that features Master Robo.n#cIf hunting at the upper floors of the ClocktowernDefense against electric-based attacks +3%# -2382063 - Skeledog Card - A card that features Skeledog.n#cIf hunting at PerionnSpeed +1# -2382064 - Lunar Pixie Card - A card that features Lunar Pixie.n#cIf hunting at the Cloud ParknJump +1# -2382065 - Copper Drake Card - A card that features Copper Drake.n#cIf hunting at Victoria IslandnSpeed +1# -2382066 - King Block Golem Card - A card that features King Block Golem.n#cIf hunting at Eos TowernAccuracy +1# -2382067 - Ultra Grey Card - A card that features Ultra Grey.n#cIf hunting at Kulan FieldnAvoidability +1# -2382068 - Moon Bunny Card - A card that features Moon Bnny.n#cIf hunting at the Black MountainnJump +1# -2382069 - Iron Boar Card - A card that features Iron Boar.n#cIf hunting at Victoria IslandnAccuracy +1# -2382070 - Blue Flower Serpent - A card that features Blue Flower Serpent.n#cIf hunting at Mu LungnAvoidability +1# -2382071 - Red Flower Serpent - A card that features Red Flower Serpent.n#cIf hunting at Mu LungnAvoidability +1# -2382072 - Reinforced Iron Mutae - A card that features Reinforced Iron Mutae.n#cIf hunting at the Alcadno InstitutenAccuracy +1# -2382076 - Mossy Snail Card - A picture of Mossy Snail is on this card.n#cWhile hunting in Ellin ForestnAccuracy +1 -2383000 - Mecateon Card - A card that features Mecateon..n#cIf hunting at Boswell FieldnSpeed +2# -2383001 - Tortie Card - A card that features Tortie Card.n#cIf hunting at Florina BeachnAccuracy +2# -2383002 - Master Chronos Card - A card that features Master Chronos.n#cIf hunting at the upper floors of the ClocktowernJump +2# -2383003 - Dark Nependeath Card - A card that features Dark Nependeath.n#cIf hunting at the Cloud ParknIncreases drop rate of Nependeath Honey# -2383004 - Rombot Card - A card that features Rombot.n#cIf hunting at Eos TowernItem drop rates are increased# -2383005 - Mummy Dog Card - A card that features Mummy Dog.n#cIf hunting at PerionnJump +2# -2383006 - Jar Card - A card that features Jar.n#cIf hunting at Herb Townn??Item drop rates are increased# -2383007 - Mithril Mutae Card - A card that features Mithril Mutae.n#cIf hunting at the Alcadno InstitutenAccuracy +2# -2383008 - Wraith Card - A card that features Wraith.n#cIf hunting at the SubwaynSpeed +2# -2383009 - Clang Card - A card that features Clang.n#cIf hunting at Florina BeachnSpeed +2# -2383010 - Ginseng Jar - A card that features Ginseng Jar.n#cIf hunting at Herb Townnthe "Use" item drop rates are increased# -2383011 - Chief Grey Card - A card that features Chief Grey.n#cIf hunting at Kulan FieldnAccuracy +2# -2383012 - Drake Card - A card that features Drake.n#cIf hunting at Victoria IslandnSpeed +2# -2383013 - Jr. Yeti Card - A card that features Jr. Yeti.n#If hunting at the SnowfieldnCancels out damage penalty# -2383014 - Hodori Card - A card that features Hodori.n#cIf hunting at the Black MountainnSpeed +2# -2383015 - Straw Target Dummy - A card that features Straw Target Dummy.n#cIf hunting at the Training FieldnAvoidability +2# -2383016 - Reinforced Mithril Mutae - A card that features Reinforced Mithril Mutae.n#cIf hunting at the Alcadno InstitutenAvoidability +2# -2383017 - Firebomb Card - A card that features Firebomb.n#cIf hunting at Dead MinenDefense against fire-based attacks +6%# -2383018 - Wooden Target Dummy - A card that features Wooden Target Dummy.n#cIf hunting at the Training FieldnAccuracy +2# -2383019 - Croco Card - A card that features Croco.n#cIf hunting at the SwampnAvoidability +2# -2383020 - Luster Pixe Card - A card that features Luster Pixe.n#cIf hunting at Cloud ParknAccuracy +2# -2383021 - Cellion Card - A card that features Cellion Card.n#cIf hunting at the Orbis GardennDefense against fire-based attacks +6%# -2383022 - Lioner Card - A card that features Lioner.n#cIf hunting at the Orbis GardennDefense against electric-based attacks +6%# -2383023 - Grupin Card - A card that features Grupin.n#cIf hunting at the Orbis GardennDefense against ice-based attacks +6%# -2383024 - Hogul - A card that features Hogul.n#cIf hunting at the Black MountainnProtection against being knocked out +10%# -2383025 - Bellflower Root Card - A card that features Bellflower Root.n#cIf hunting at Herb TownnJump +2# -2383026 - MT-09 Card - A card that features MT-09.n#cIf hunting at Kulan FieldnAccuracy +2# -2383027 - Sr. Bellflower Root Card - A card that features Sr. Bellflower Root.n#cIf hunting at Herb TownnJump +2# -2383028 - Roid Card - A card that features Roid Card.n#cIf hunting at the Alcadno InstitutenDefense against electric-based attacks +6%# -2383029 - Malady Card - A card that features Malady.n#cIf hunting at EllinianSpeed +2# -2383030 - Stone Golem Card - A card that features Stone Golem.n#cIf hunting at Victoria IslandnAccuracy +2# -2383031 - Hector Card - A card that features Hector Card.n#cIf hunting at the SnowfieldnSpeed +2# -2383032 - The Book Ghost Card - A card that features the Book Ghost.n#cIf hunting at Mu LungnAvoidability +2# -2383033 - Dark Jr. Yeti Card - A card that features Dark Jr. Yeti.n#cIf hunting at the SnowfieldnCancels out the damage penalty# -2383034 - Tri-Tailed Fox Card - A card that features Tri-Tailed Fox.n#cIf hunting at the Black MountainnDefense against curse +10%# -2383035 - Grizzly Card - A card that features Grizzly.n#If hunting at Mu LungnJump +2# -2383036 - Skeleton Soldier - A card that features Skeleton Soldier.n#cIf hunting at PerionnAvoidability +2# -2383037 - Coolie Zombie Card - A card that features Coolie Zombie Card.n#cIf hunting at El NathnDefense against poison-based attacks +6%# -2383038 - Miner Zombie - A card that features Miner Zombie.n#cIf hunting at El NathnDefense against poison-based attacks +6%# -2383039 - Dark Stone Golem - A card that features Dark Stone Golem.n#cIf hunting at Victoria IslandnAccuracy +2# -2383040 - White Fang Card - A card that features White Fang.n#cIf hunting at the SnowfieldnSpeed +2# -2383041 - Reindeer Card - A card that features Reindeer.n#cIf hunting at Mu LungnJump +2# -2383042 - Neo Huroid Card - A card that features Neo Huroid.n#cIf hunting at the Alcadno InstitutenDefense against electric-based attacks +6%# -2383043 - Mixed Golem Card - A card that features Mixed Golem.n#cIf hunting at Victoria IslandnAccuracy +2/Avoidability +2# -2383044 - Red Drake Card - A card that features Red Drake.n#cIf hunting at Victoria IslandnDefense against fire-based attacks +6%# -2383045 - Pepe Card - A card that features Pepe.n#cIf hunting at the SnowfieldnSpeed +2# -2383046 - Blin Card - A card that features Blin.n#cIf hunting at the Black MountainnAvoidability +2# -2383047 - Panda Card - A card that features Panda.n#cIf hunting at Mu LungnDefense against weakness +10%# -2383048 - Shade Card - A card that features Shade.n#cIf hunting at the SubwaynAvoidability +2# -2383049 - Master Dummy Card - A card that features Master Dummy.n#cIf hunting at Mu Lung Training GroundnAvoidability +2# -2383056 - Tree Rod Card - A picture of Tree Rod is on this card.n#cWhile hunting in Ellin ForestnAvoidability +2# -2383057 - Mossy Mushroom Card - A picture of Mossy Mushroom is on this card.n#cWhile hunting in Ellin ForestnJump +2# -2383058 - Primitive Boar Card - A picture of Primitive Boar is on this card.n#cWhile hunting in Ellin ForestnSpeed +2# -2383059 - Stone Bug Card - A picture of Stone Bug is on this card.n#cWhile hunting in Ellin ForestnAccuracy +2# -2384000 - Buffy Card - A card that features Buffy.n#cIf hunting at the lower levels of the ClocktowernJump +3# -2384001 - Wild Cargo Card - A card that features Wild Cargo.n#cIf hunting at Victoria IslandnJump +3# -2384002 - Peach Monkey Card - A card that features Peach Monkey.n#cIf hunting at Mu LungnAccuracy +3# -2384003 - Officer Skeleton Card - A card that features Officer Skeleton.n#cIf hunting at PerionnAvoidability +3# -2384004 - Soul Teddy Card - A card that features Soul Teddy.n#cIf hunting at the lower levels of the ClocktowernAvoidability +3# -2384005 - Jr. Luinel Card - A card that features Jr. Luinel.n#cIf hunting at the Orbis GardennDefense against darkness +15%# -2384006 - Ice Drake Card - A card that features Ice Drake.n#cIf hunting at Victoria IslandnDefense against ice-based attacks +9%# -2384007 - Dark Pepe Card - A card that features Dark Pepe.n#cIf hunting at the SnowfieldnSpeed +3# -2384008 - Mr. Alli Card - A card that features Mr. Alli.n#cIf hunting at Herb TownnProtection against being knocked out +15%# -2384009 - Yeti Card - A card that features Yeti.n#cIf hunting at the SnowfieldnDefense against ice-based attacks +9%# -2384010 - Riche Card - A card that features Riche.n#cIf hunting at the SnowfieldnDefense against seal +15%# -2384011 - Homun Card - A card that features Homun.n#cIf hunting at the Zenumist InstitutenAvoidability +3# -2384012 - Lazy Buffy Card - A card that features Lazy Buffy.n#cIf hunting at the lower levels of the ClocktowernAvoidability +3# -2384013 - Sage Cat Card - A card that features Sage Cat.n#cIf hunting at Mu LungnAccuracy +3# -2384014 - Master Soul Teddy Card - A card that features Master Soul Teddy.n#cIf hunting at the lower levels of the ClocktowernAvoidability +3# -2384015 - Dark Drake Card - A card that features Dark Drake.n#cIf hunting at Victoria IslandnDefense against darkness +15%# -2384016 - Dark Yeti Card - A card that features Dark Yeti.n#cIf hunting at the SnowfieldnDefense against ice-based attacks +9%# -2384017 - Kru Card - A card that features Kru.n#cIf hunting at Herb TownnSpeed +3# -2384018 - Cyti Card - A card that features Cyti.n#cIf hunting at the labnAvoidability +3# -2384019 - Klock Card - A card that features Klock.n#cIf hunting at the lower levels of the ClocktowernAccuracy +3# -2384020 - Tauromacis Card - A card that features Tauromacis.n#cIf hunting at Victoria IslandnDefense against poison-based attacks +9%# -2384021 - Yellow King Goblin Card - A card that features Yellow King Goblin.n#cIf hunting at the Black MountainnDefense against fire-based attacks +9%# -2384022 - Blue King Goblin Card - A card that features Blue King Goblin.n#cIf hunting at the Black MountainnDefense against ice-based attacks +9%# -2384023 - Green King Goblin Card - A card that features Green King Goblin.n#cIf hunting at the Black MountainnDefense against poison-based attacks +9%# -2384024 - Rash Card - A card that features Rash.n#cIf hunting at Leafre ForestnDefense against curse +15%# -2384025 - Captain Card - A card that features Captain.n#cIf hunting at Herb TownnJump +3# -2384026 - Cerebes Card - A card that features Cerebes.n#cIf hunting at Dead MinenAccuracy +3# -2384027 - Beetle Card - A card that features Beetle.n#cIf hunting at Leafre ForestnAvoidability +3# -2384028 - Hobi Card - A card that features Hobi.n#cIf hunting at Leafre ForestnDefense against poison-based attack +15%# -2384029 - Commander Skeleton Card - A card that features Commander Skeleton.n#cIf hunting at PerionnAccuracy +3/Avoidability +3# -2384030 - Luinel Card - A card that features Luinel.n#cIf hunting at the Orbis GardennDefense against darkness +15%# -2384031 - Homunculu Card - A card that features Homunculu.n#cIf hunting at the Zenumist InstitutenAvoidability +3# -2384032 - Buffoon Card - A card that features Buffoon.n#cIf hunting at the lower levels of the ClocktowernSpeed +3# -2384033 - Dark Rash Card - A card that features Dark Rash.n#cIf hunting at Leafre ForestnDefense against curse +15%# -2384034 - D.Roy Card - A card that features D. Roy.n#cIf hunting at the Alcadno InstitutenAccuracy +3/Avoidability +3# -2384035 - Werewolf Card - A card that features Werewolf.n#cIf hunting at the SnowfieldnAccuracy +3# -2384036 - Taurospear Card - A card that features Taurospear.n#cIf hunting at Victoria IslandnAccuracy +3# -2384037 - Snow Witch Card - A card that features Snow Witch.n#cIf hunting at the SnowfieldnDefense against ice-based attacks +9%# -2384038 - Security Camera Card - A card that features Security Camera.n#cIf hunting at the Alcadno InstitutenSpeed +3# -2384039 - Scholar Ghost Card - A card that features Scholar Ghost.n#cIf hunting at the Black MountainnItem drop rate increased# -2384040 - Rurumo Card - A card that features Rurumo.n#cIf hunting at the Alcadno InstitutenItem drop rate increased# -2385000 - Dark Klock Card - A card that features Dark Klock.n#cIf hunting at the lower levels of the ClocktowernAvoidability +4# -2385001 - Dual Beetle Card - A card that features Dual Beetle.n#cIf hunting at Leafre ForestnAvoidability +4# -2385002 - Green Hobi Card - A card that features Green Hobi.n#cIf hunting at Minar ForestnAccuracy +4/Avoidability +4# -2385003 - Deep Buffoon Card - A card that features Deep Buffoon.n#cIf hunting at the lower levels of the ClocktowernSpeed +4# -2385004 - Yeti and Pepe Card - A card that features Yeti and Pepe.n#cIf hunting at the SnowfieldnAvoidability +4# -2385005 - Hankie Card - A card that features Hankie.n#cIf hunting at Leafre ForestnJump +4# -2385006 - Lycanthrope Card - A card that features Lycanthrope.n#cIf hunting at the SnowfieldnAccuracy +4# -2385007 - Harp Card - A card that features Harp.n#cIf hunting at Minar ForestnAvoidability +4# -2385008 - Homunscullo Card - A card that features Homunscullo.n#cIf hunting at the Zenumist InstitutenJump +4# -2385009 - Dark Yeti and Pepe Card - A card that features Dark Yeti and Pepe.n#cIf hunting at the SnowfieldnAvoidability +4# -2385010 - Pirate Card - A card that features Pirate.n#cIf hunting at the lower levels of the ClocktowernAccuracy +4# -2385011 - Blood Harp Card - A card that features Blood Harp.n#cIf hunting at Minar ForestnAccuracy +4# -2385012 - Death Teddy Card - A card that features Death Teddy.n#cIf hunting at the lower levels of the ClocktowernAccuracy +4# -2385013 - Goby Card - A card that features Goby.n#cIf hunting at Aqua Roadn15% chance of breaking through the monster's magic defense# -2385014 - Birk Card - A card that features Birk.n#cIf hunting at Leafre ForestnSpeed +4# -2385015 - Dual Pirate Card - A card that features Dual Pirate.n#cIf hunting at the lower levels of the ClocktowernAccuracy +4# -2385016 - Black Kentaurus Card - A card that features Black Kentaurus.n#cIf hunting at Leafre ForestnDefense against darkness +20%# -2385017 - Red Kentaurus Card - A card that features Red Kentaurus.n#cIf hunting at Leafre ForestnDefense against fire-based attacks +12%# -2385018 - Blue Kentaurus Card - A card that features Blue Kentaurus.n#cIf hunting at Leafre ForestnDefense against ice-based attacks +12%# -2385019 - Dual Birk Card - A card that features Dual Birk.n#cIf hunting at Leafre ForestnSpeed +4# -2385020 - Master Death Teddy Card - A card that features Master Death Teddy.n#cIf hunting at the lower levels of the ClocktowernAccuracy +4/Avoidability +4# -2385021 - Bain Card - A card that features Bain.n#cIf hunting at Dead MinenDefense against fire-based attacks +12%# -2385022 - Blue Dragon Turtle Card - A card that features Blue Dragon Turtle.n#cIf hunting at the Dragon ForestnAccuracy +4# -2385023 - Deet and Roi Card - A card that features Deet amd Roi.n#cIf hunting at the Zenumist InstitutenSpeed +4# -2385025 - Eye of Time Card - A card with a picture of the Eye of Time.nWhen hunting on the Temple of TimenSpeed +4# -2386000 - Bone Fish Card - A card that features Bone Fish.n#cIf hunting at Aqua Roadn30% chance of breaking through monster's weapon defense# -2386001 - Red Dragon Turtle Card - A card that features Red Dragon Turtle.n#cIf hunting at the Dragon ForestnAvoidability +5# -2386002 - Viking Card - A card that features Viking.n#cIf hunting at the lower levels of the ClocktowernDefense against fire-based attacks +15%# -2386003 - Squid Card - A card that features Squid.n#cIf hunting at Aqua RoadnDefense against darkness +25%# -2386004 - Phantom Watch Card - A card that features Phantom Watch.n#cIf hunting at the lower levels of the ClocktowernDefense against ice-based attacks +15%# -2386005 - Rexton Card - A card that features Rexton.n#cIf hunting at the Dragon ForestnSpeed +5# -2386006 - Brexton Card - A card that features Brexton.n#cIf hunting at the Dragon ForestnAccuracy +5# -2386007 - Risell Squid Card - A card that features Risell Squid.n#cIf hunting at Aqua RoadnDefense against darkness +25%# -2386008 - Red Wyvern Card - A card that features Red Wyvern.n#cIf hunting at the Dragon ForestnDefense against fire-based attacks +15%# -2386009 - Gigantic Viking Card - A card that features Gigantic Viking.n#cIf hunting at the lower levels of the ClocktowernDefense against fire-based attacks +15%# -2386010 - G. Phantom Watch Card - A card that features G. Phantom Watch.n#cIf hunting at the lower levels of the ClocktowernDefense against ice-based attacks +15%# -2386011 - Green Cornian Card - A card that features Green Cornian.n#cIf hunting at the Dragon ForestnSpeed +5# -2386012 - Shark Card - A card that features Sharkn#cIf hunting at Aqua RoadnDefense against ice-based attacks +15%# -2386013 - Blue Wyvern Card - A card that features Blue Wyvern.n#cIf hunting at the Dragon ForestnDefense against ice-based attacks +15%# -2386014 - Cold Shark Card - A card that features Cold Shark.n#cIf hunting at Aqua RoadnAccuracy +5# -2386015 - Dark Wyvern Card - A card that features Dark Wyvern.n#cIf hunting at the Dragon ForestnDefense against darkness +25%# -2386016 - Dark Cornian Card - A card that features Dark Cornian.n#cIf hunting at the Dragon ForestnAccuracy +5# -2386017 - Jr. Newtie Card - A card that features Jr. Newtie.n#cIf hunting at the Dragon ForestnAvoidability +5# -2386021 - Memory Monk Card - A card with a picture of the Memory Monk.n#cWhen hunting on Memory LanenEvasion rate +5# -2386022 - Memory Monk Trainee Card - A card with a picture of the Memory Monk Trainee.n#cWhen hunting on Memory LanenAccuracy +5# -2386023 - Memory Guardian Card - A card with a picture of the Memory Guardian.n#cWhen hunting on Memory LanenJump +5# -2386024 - Chief Memory Guardian Card - A card with a picture of the Chief Memory Guardian.n#cWhen hunting on Memory LanenSpeed +5# -2387000 - Gatekeeper Card - A card that features Gatekeeper.n#If hunting at the lower levels of the Clocktowern25% chance of breaking through monster's weapon defense# -2387001 - Thanatos Card - A card that features Thanatosn#cIf hunting at the lower levels of the Clocktowern25% chance of breaking through monster's magic defense# -2387002 - Skelegon Card - A card that features Skelegon.n#cIf hunting at the Dragon ForestnAccuracy +6/Avoidability +6# -2387003 - Skelosaurus Card - A card that features Skelosaurusn#cIf hunting at the Dragon Forestn20% chance of breaking through monster's weapon/magic defense# -2387004 - Nest Golem Card - A card that features Nest Golem.n#cIf hunting at the Dragon ForestnAccuracy +5 -2387006 - Qualm Monk Card - A card with a picture of the Qualm Monk.n#cWhen hunting on the Road of RegretsnEvasion rate +6# -2387007 - Qualm Monk Trainee Card - A card with a picture of the Qualm Monk Trainee.n#cWhen hunting on the Road of RegretsnAccuracy +6# -2387008 - Qualm Guardian Card - A card with a picture of the Qualm Guardian.n#cWhen hunting on the Road of RegretsnJump +6# -2387009 - Chief Qualm Guardian Card - A card with a picture of the Chief Qualm Guardian.n#cWhen hunting on the Road of RegretsnSpeed +6# -2387010 - Oblivion Monk Card - A card with a picture of the Oblivion Monk.n#cWhen hunting on the Road to OblivionnEvasion rate +6# -2387011 - Oblivion Monk Trainee Card - A card with a picture of the Oblivion Monk Trainee.n#cWhen hunting on the Road to OblivionnAccuracy +6# -2387012 - Oblivion Guardian Card - A card with a picture of the Oblivion Guardian.n#cWhen hunting on the Road to OblivionnJump +6# -2387013 - Chief Oblivion Guardian Card - A card with a picture of the Chief Oblivion Guardian.n#cWhen hunting on the Road to OblivionnSpeed +6# -2388000 - Mano Card - A card that features Mano.n#cIf hunting around the area of Lith HarbornItem/Meso drop rate is increased# -2388001 - King Slime Card - A card that features King Slime.n#cIf hunting around the area of Kerning CitynSpeed +1/Jump +1 -2388002 - Faust Card - A card that features Faust.n#cIf hunting around the area of EllinianItem/Meso drop rate is increased# -2388003 - King Clang Card - A card that features King Clang.n#cIf hunting around the area of Florina BeachnItem/Meso drop rate is increased# -2388004 - Alishar Card - A card that features Alishar.n#cIf hunting around the area of Eos TowernItem/Meso drop rate is increased# -2388005 - Timer Card - A card that features Timer.n#cIf hunting at the upper floors of the ClocktowernItem/Meso drop rate is increased# -2388006 - Mushmom Card - A card that features Mushmom.n#cIf hunting around the area of HenesysnItem/Meso drop rate is increased# -2388007 - Dyle Card - A card that features Dyle.n#cIf hunting around the area of Kerning CitynItem/Meso drop rate is increased# -2388008 - Zombie Mushmom - A card that features Zombie Mushmom.n#cIf hunting around the area of Ant TunnelnItem/Meso drop rate is increased# -2388009 - Nine-Tailed Fox Card - A card that features Nine-Tailed Fox.n#cIf hunting around the area of Korean Folk TownnItem/Meso drop rate is increased# -2388010 - Tae Roon Card - A card that features Tae Roon.n#cIf hunting around the area of Sky ForestnItem/Meso drop rate is increased# -2388011 - Lord Pirate Card - A card that features Lord Pirate.n#cIf hunting around the area of Herb TownnItem/Meso drop rate is increased# -2388012 - Papa Pixie Card - A card that features Papa Pixie.n#cIf hunting around the area of Cloud TownnItem/Meso drop rate is increased# -2388013 - King Sage Cat Card - A card that features King Sage Cat.n#cIf hunting around the area of Peach FarmnItem/Meso drop rate is increased# -2388014 - Frankenroid Card - A card that features Frankenroid.n#cIf hunting around the area of MagatianItem/Meso drop rate is increased# -2388015 - Elliza Card - A card that features Elliza.n#cIf hunting around the area of Orbis gardennItem/Meso drop rate is increased# -2388016 - Snowman Card - A card that features Snowman.n#cIf hunting around the area of SnowfieldsnItem/Meso drop rate is increased# -2388017 - Crimson Balrog Card - A card that features Crimson Balrog.n#cIf hunting at El Nath / OrbisnItem/Meso drop rate is increased# -2388018 - Manon Card - A card that features Manon.n#cIf hunting at Leafre ForestnMeso drop rate is increased# -2388019 - Griffey Card - A card that features Griffey.n#cIf hunting at Leafre ForestnItem drop rates are increased# -2388020 - Pianus Card - A card that features Pianus.n#cIf hunting around the Aqua Road areanItem/Meso drop rate is increased# -2388021 - Ergoth Card - A card that features Ergoth.n#cWhen party huntingnJump +6/Speed +6# -2388022 - Papulatus Card - A card that features Papulatus.n#cIf hunting at the lower levels of the ClocktowernItem/Meso drop rate is increased# -2388023 - Zakum Card - A card that features Zakum.n#cIf hunting around the area of the Dead MinenItem/Meso drop rate is increased# -2388024 - Horned Tail Card - A card that features Horned Tail.n#cIf hunting around the area of Minar ForestnItem/Meso drop rate is increased# -2388025 - Stumpy Card - A card that features Stumpyn#cIf hunting around the area of PerionnItem/Meso drop rate is increased# -2388026 - Jr. Balrog Card - A card that features Jr. Balrog.n#cIf hunting around the area of SleepywoodnItem/Meso drop rate is increased# -2388027 - Rudolph Card - A card that features Santa's favorite, Rudolph. -2388028 - Kid Snowman Card - A card that features the little rascal that is the Kid Snowman. -2388029 - Deo Card - A card that features Deo.n#cIf hunting around the desert areanItem/Meso drop rate will be increased# -2388030 - Seruf Card - A card that features Seruf.n#cIf hunting at a shallow seanItem/Meso drop rate will be increased# -2388031 - Zeno Card - A card that features Zeno.n#cIf hunting around the area of Omega SectornItem/Meso drop rate will be increased# -2388032 - Kimera Card - A card that features Kimera.n#cIf hunting around the lab areanItem/meso drop rate increases# -2388033 - Leviathan Card - A card that features Leviathan.n#cIf hunting around the area of Dragon ForestnItem/Meso drop rate will be increased# -2388039 - Poison Golme Card - A picture of Poison Golem is on this card.n#cWhile hunting in Ellin ForestnDrop rate of item and meso increase# -2388040 - Dodo Card - A card with a picture of Dodo.n#cWhen hunting on Memory LanenItem/Meso Drop rate increase# -2388041 - Lilynouch Card - A card with a picture of Lilynouch.n#cWhen hunting on the Road of RegretsnItem/Meso Drop rate increase# -2388042 - Lyka Card - A card with a picture of Lyka.n#cWhen hunting on the Road to OblivionnItem/Meso Drop rate increase# -2388043 - Pink Bean - A card with a picture of Pink Bean.n#cWhen hunting at the Temple of TimenItem/Meso Drop rate increase# -2390000 - Helena's Marble - A marble given by Helena. Use this to communicate with her regardless of the place. This item is good for one-time use only... -2430000 - Torn Cygnus' Book Volume 1 - When used one at a time, a special power covers my body and blesses me. I think if I collect 20, I'll be able to read what's written inside. -2430001 - Torn Cygnus' Book Volume 2 - When used one at a time, a special power covers my body and blesses me. I think if I collect 20, I'll be able to read what's written inside. -2430002 - Torn Cygnus' Book Volume 3 - When used one at a time, a special power covers my body and blesses me. I think if I collect 20, I'll be able to read what's written inside. -2430003 - Cygnus Quiz - I can receive a reward by answering questions regarding the Cygnus Knights. I should click on it and try. -2022554 - Independence Day Firecracker 1 - This firecracker has been specially made to celebrate July 4th, 1776, our Independence Day. For 10 minutes, Speed and Jump increase by 5. -2022555 - Independence Day Firecracker 2 - This firecracker has been specially made to celebrate July 4th, 1776, our Independence Day. For 10 minutes, Attack and Magic increase by 5. -2022556 - Independence Day Firecracker 3 - This firecracker has been specially made to celebrate July 4th, 1776, our Independence Day. For 10 minutes, Def. and Magic Def. increase by 10. -2000020 - Red Potion for Noblesse - A special potion made out of herbs that exclusively grow in Ereve. Made specifically for Noblesss. nHP +50. -2000021 - Blue Potion for Noblesse - A special potion made out of herbs that exclusively grow in Ereve. Made specifically for Noblesss. nMP +100. -2022323 - Fish Net with a Catch - The fish net seems to have caught something. Let's double-click it to check its content. -2022324 - Big Belly Fish - A fish that apparently swallowed something. Let's double-click on the fish to check its content. -2022326 - Blessing of the Forest - With the purified forest raining gold rain, all affected will receive a temporary boost on speed and jump. -2022352 - Fire Grill Skewer - A delicious holiday food made out of beef, mushroom, and bellflower on a skewer. -2022356 - Sweet Rice Cake - A sweet, tasty rice cake. Recovers 1,500 HP and MP. -2022357 - Sweet Rice Cake - A sweet, tasty rice cake. ATT +8, MP +8 for 15 minutes. -2022358 - Sweet Rice Cake - A sweet, tasty rice cake. For 15 min., Speed +5, Jump +3. -2022359 - Increases Physical Attack Rat. - An item that only works inside Mu Lung Dojo. -2022360 - Increases Magic Attack Rate. - An item that only works inside Mu Lung Dojo. -2022361 - Increases Physical Defense Rate. - An item that only works inside Mu Lung Dojo. -2022362 - Increases Magic Defense Rate. - An item that only works inside Mu Lung Dojo. -2022363 - Increases Accuracy - An item that only works inside Mu Lung Dojo. -2022364 - Increases Avoidability - An item that only works inside Mu Lung Dojo. -2022365 - Increases Speed - An item that only works inside Mu Lung Dojo. -2022366 - Increases Max HP - An item that only works inside Mu Lung Dojo. -2022367 - Increases Max MP - An item that only works inside Mu Lung Dojo. -2022368 - Increases Physical Attack Rate - An item that only works inside Mu Lung Dojo. -2022369 - Increases Magic Attack Rate - An item that only works inside Mu Lung Dojo. -2022370 - Increases Physical Defense Rate - An item that only works inside Mu Lung Dojo. -2022371 - Increases Magic Defense Rate - An item that only works inside Mu Lung Dojo. -2022372 - Increases Accuracy - An item that only works inside Mu Lung Dojo. -2022373 - Increases Avoidability - An item that only works inside Mu Lung Dojo. -2022374 - Increases Speed - An item that only works inside Mu Lung Dojo. -2022375 - Increases MaxHP - An item that only works inside Mu Lung Dojo. -2022376 - Increases Max MP - An item that only works inside Mu Lung Dojo. -2022377 - Increases Physical Attack Rate - An item that only works inside Mu Lung Dojo. -2022378 - Increases Magic Attack Rate - An item that only works inside Mu Lung Dojo. -2022379 - Increases Physical Defense Rate - An item that only works inside Mu Lung Dojo. -2022380 - Increases Magic Defense Rate - An item that only works inside Mu Lung Dojo. -2022381 - Increases Accuracy - An item that only works inside Mu Lung Dojo. -2022382 - Increases Avoidability - An item that only works inside Mu Lung Dojo. -2022383 - Increases Speed - An item that only works inside Mu Lung Dojo. -2022384 - Increases Max HP - An item that only works inside Mu Lung Dojo. -2022385 - Increases Max MP - An item that only works inside Mu Lung Dojo. -2022386 - Increases Physical Attack Rate - An item that only works inside Mu Lung Dojo. -2022387 - Increases Magic Attack Rate - An item that only works inside Mu Lung Dojo. -2022388 - Increases Physical Defense Rate - An item that only works inside Mu Lung Dojo. -2022389 - Increases Magic Defense Rate - An item that only works inside Mu Lung Dojo. -2022390 - Increases Accuracy - An item that only works inside Mu Lung Dojo. -2022391 - Increases Avoidability - An item that only works inside Mu Lung Dojo. -2022392 - Increases Speed - An item that only works inside Mu Lung Dojo. -2022393 - Increases Max HP - An item that only works inside Mu Lung Dojo. -2022394 - Increases Max MP - An item that only works inside Mu Lung Dojo. -2022395 - Increases Physical Attack Rate - An item that only works inside Mu Lung Dojo. -2022396 - Increases Magic Attack Rate - An item that only works inside Mu Lung Dojo. -2022397 - Increases Physical Defense Rate - An item that only works inside Mu Lung Dojo. -2022398 - Increases Magic Defense Rate - An item that only works inside Mu Lung Dojo. -2022399 - Increases Accuracy - An item that only works inside Mu Lung Dojo. -2022400 - Increases Avoidability - An item that only works inside Mu Lung Dojo. -2022401 - Increases Speed - An item that only works inside Mu Lung Dojo. -2022402 - Increases Max HP - An item that only works inside Mu Lung Dojo. -2022403 - Increases Max MP - An item that only works inside Mu Lung Dojo. -2022404 - Increases Physical Attack Rate - An item that only works inside Mu Lung Dojo. -2022405 - Increases Magic Attack Rate - An item that only works inside Mu Lung Dojo. -2022406 - Increases Physical Defense Rate - An item that only works inside Mu Lung Dojo. -2022407 - Increases Magic Defense Rate - An item that only works inside Mu Lung Dojo. -2022408 - Increases Accuracy - An item that only works inside Mu Lung Dojo. -2022409 - Increases Avoidability - An item that only works inside Mu Lung Dojo. -2022410 - Increases Speed - An item that only works inside Mu Lung Dojo. -2022411 - Increases Max HP - An item that only works inside Mu Lung Dojo. -2022412 - Increases Max MP - An item that only works inside Mu Lung Dojo. -2022413 - Increases Physical Attack Rate - An item that only works inside Mu Lung Dojo. -2022414 - Increases Magic Attack Rate - An item that only works inside Mu Lung Dojo. -2022415 - Increases Physical Defense Rate - An item that only works inside Mu Lung Dojo. -2022416 - Increases Magic Defense Rate - An item that only works inside Mu Lung Dojo. -2022417 - Increases Accuracy - An item that only works inside Mu Lung Dojo. -2022418 - Increases Avoidability - An item that only works inside Mu Lung Dojo. -2022419 - Increases Speed - An item that only works inside Mu Lung Dojo. -2022420 - Increases Max HP - An item that only works inside Mu Lung Dojo. -2022421 - Increases Max MP - An item that only works inside Mu Lung Dojo. -2022422 - Small Stories - A tape that contains various small stories from daily life. You can fine view its content by double-clicking on it. -2022423 - Gaga's Appreciation - Gaga's appreciation. For an hour, your attack and magic rate will go up 20, defense rate 100, accuracy and avoidability 50, and speed and jump ability will go up 10. -2022424 - Gaga's Appreciation - Gaga's appreciation. For 20 minutes, your attack rate and magic will go up 10, defense rate 30, accuracy and avoidability 20, and speed and jump ability will go up 3. -2022428 - Mysterious Box - A box with something mysterious inside. I should open it to see what it could be. If it's my lucky day, I might find an awesome gift inside.n#cYou can open it by double-clicking on it.# -2022429 - Protective Shield - It can only be used in Mu Lung Dojo. It blocks an attack up to 3 times. -2022430 - Mu Lung Dojo Mana Elixir - It recovers your MP. -2022431 - Mu Lung Dojo Elixir - It recovers 50% of your HP and MP. -2022432 - Mu Lung Dojo Power Elixir - It recovers both HP and MP. -2022433 - Mu Lung Dojo Cure-All Medicine - It recovers any status error. -2022434 - Warm and Fuzzy Winter - Weapon Att +20, Magic Att +30 for 15 minutes. -2022442 - Maze Reward - The EXP awarded by completing the maze created by Richie Gold. -2022450 - EXP Increase(S) - Provides 50 Bonus EXP. -2022451 - EXP Increase(M) - Provides 200 Bonus EXP. -2022452 - EXP Increase(L) - Provides 500 Bonus EXP. -2022455 - Happy New Year! - Weapon Att +20, Magic Att +30 for 15 min. -2022456 - Elixir - A legendary potion.\nRecovers 50% of HP and MP. -2022457 - Power Elixir - A legendary potion.nFully recovers HP and MP. -2022458 - Shinsoo's Blessing - For 1 hour, Weapon Att +5, MP +10, Weapon DEF +20, Magic DEF +20, Speed +10. -2022459 - Cassandra's Reward 1 - For 1 hour, Meso Drop Rate +30%. -2022460 - Cassandra's Reward 2 - For 40 minutes, Meso Drop Rate +50%. -2022461 - Cassandra's Reward 3 - For 30 min., Meso Drop Rate 2x. -2022462 - Cassandra's Reward 4 - For 1 hour, Item Drop Rate +50%. -2022463 - Cassandra's Reward 5 - For 30 min., Item Drop Rate 2x. -2022465 - Heartpounding Box - A box in which no one has a clue what's in it. If the luck in is your side, then a beautiful present might be in store.n#cDouble-click to open.# -2022466 - Heartpounding Box - A box in which no one has a clue what's in it. If the luck in is your side, then a beautiful present might be in store.n#cDouble-click to open.# -2022467 - Heartpounding Box - A box in which no one has a clue what's in it. If the luck in is your side, then a beautiful present might be in store.n#cDouble-click to open.# -2022468 - Heartpounding Box - A box in which no one has a clue what's in it. If the luck in is your side, then a beautiful present might be in store.n#cDouble-click to open.# -2031002 - Invitation to the Moon - An invitation to the moon, sent by the Moon Bunnies. Using this will send you directly to Moon Bunny's ????. -2031003 - Invitation to the Nest - An invitation to the baby bird's nest sent by Gaga. Use it to be sent directly to the nest. -2031004 - Invitation to Ereve - An invitation to Ereve from Neinheart. This invitation will allow you to instantly move to Ereve. -2032000 - Richie Gold's Strange Lamp - An unbelievable lamp made by Richie Gold. Use this, and you'll be led somewhere in in the maze. No one knows exactly where you'll be sent, though. -2040110 - Red-Nose STR Bandage 60% - Improves STR on Rudolf's Red Nose.\nSuccess Rate:60%, STR +1 -2040111 - Red-Nose DEX Bandage 60% - Improves DEX on Rudolf's Red Nose.\nSuccess Rate:60%, DEX +1 -2040112 - Red-Nose INT Bandage 60% - Improves INT on Rudolf's Red Nose.\nSuccess Rate:60%, INT +1 -2040113 - Red-Nose LUK Bandage 60% - Improves LUK on Rudolf's Red Nose.\nSuccess Rate:60%, LUK +1 -2040114 - Red-Nose ATT Bandage 60% - Improves ATT on Rudolf's Red Nose.\nSuccess Rate:60%, ATT +1 -2040115 - Red-Nose Weapon DEF Bandage 60% - Improves Weapon DEF on Rudolf's Red Nose.\nSuccess Rate:60%, Weapon DEF+1 -2040116 - Red-Nose MP Bandage 60% - Improves MP on Rudolf's Red Nose.\nSuccess Rate:60%, MP+1 -2040117 - Red-Nose Magic DEF Bandage 60% - Improves Magic DEF on Rudolf's Red Nose.\nSuccess Rate:60%, Magic DEF+1 -2040118 - Red-Nose Avoidability Bandage 60% - Improves Avoidability on Rudolf's Red Nose.\nSuccess Rate:60%, Avoidability+1 -2040119 - Red-Nose Accuracy Bandage 60% - Improves Accuracy on Rudolf's Red Nose.\nSuccess Rate:60%, Accuracy+1 -2044811 - Scroll for Knuckles for ATT 65% - Improves ATT on Knuckles.\nSuccess Rate:65%, Weapon Att+2, STR+1 -2044812 - Scroll for Knuckles for ATT 15% - Improves ATT on Knuckles.\nSuccess Rate:15%, Weapon Att+5, STR+3, Weapon DEF+1 -2044813 - Scroll for Knuckles for Accuracy 65% - Improves Accuracy on Knuckles.\nSuccess Rate:65%, Accuracy+3, DEX+2, Weapon Att+1 -2044814 - Scroll for Knuckles for Accuracy 15% - Improves Accuracy on Knuckles.\nSuccess Rate:15%, Accuracy+5, DEX+3, Weapon Att+3 -2044906 - Gun ATT Scroll 65% - Improves ATT on guns.\nSuccess Rate:65%, Weapon Att.+2, Accuracy+1 -2044907 - Gun ATT Scroll 15% - Improves ATT on guns.\nSuccess Rate:15%, Weapon Att.+5, Accuracy+3, DEX+1 -2049103 - Beach Sandals Scroll 100% - Used on limited-edition beach sandals, with the options of improving/decreasing the stats.\nSuccess rate:100% -2100073 - Mu Lung Dojo Summon Package3_Deo - Summon Deo -2100074 - Mu Lung Dojo Summon Package4_King Slime - Summon King Slime -2100075 - Mu Lung Dojo Summon Package5_Giant Centepede - Summon Giant Centepede -2100076 - Mu Lung Dojo Summon Package6_Faust - Summon Faust -2100077 - Mu Lung Dojo Summon Package7_King Clang - Summon King Clang -2100078 - Mu Lung Dojo Summon Package8_Mushroom - Summon Mushmom -2100079 - Mu Lung Dojo Summon Package9_Alishar - Summon Alishar -2100080 - Mu Lung Dojo Summon Package10_Timer - Summon Timer -2100081 - Mu Lung Dojo Summon Package11_Dyle - Summon Dyle -2100082 - Mu Lung Dojo Summon Package12_Papa Pixie - Summon Papa Pixie -2100083 - Mu Lung Dojo Summon Package13_Zombie Mushroom - Summon Zombie Mushmom -2100084 - Mu Lung Dojo Summon Package14_Zeno - Summon Zeno -2100085 - Mu Lung Dojo Summon Package15_Lord Pirate - Summon Lord Pirate -2100086 - Mu Lung Dojo Summon Package16_Nine-Tailed Fox - Summon Nine-Tailed Fox -2100087 - Mu Lung Dojo Summon Package17_Tae Room - Summon Tae Roon -2100088 - Mu Lung Dojo Summon Package18_Poison Golem - Summon Poison Golem -2100089 - Mu Lung Dojo Summon Package19_Priest Cat - Summon Priest Cat -2100090 - Mu Lung Dojo Summon Package20_Jr. Balrog - Summon Jr. Balrog -2100091 - Mu Lung Dojo Summon Package21_Elliza - Summon Eliza -2100092 - Mu Lung Dojo Summon Package22_Franken Lloyd - Summon Franken Lloyd -2100093 - Mu Lung Dojo Summon Package23_Kimera - Summon Kimera -2100094 - Mu Lung Dojo Summon Package24_Snack Bar - Summon Snack Bar -2100095 - Mu Lung Dojo Summon Package25_Snowman - Summon Snowman -2100096 - Mu Lung Dojo Summon Package26_Blue Mushroom - Summon Blue Mushroom -2100097 - Mu Lung Dojo Summon Package27_Crimson Balrog - Summon Crimson Balrog -2100098 - Mu Lung Dojo Summon Package28_Manon - Summon Manon -2100099 - Mu Lung Dojo Summon Package29_Griffey - Summon Griffey -2100100 - Mu Lung Dojo Summon Package30_Leviathan - Summon Leviathan -2100101 - Mu Lung Dojo Summon Package31_Papulatus - Summon Papulatus -2100102 - Mu Lung Dojo Summon Package32_Moo Gong - Summon Moo Gong -2100103 - Mu Lung Dojo Summon Package00_So Gong - Summon So Gong -2100104 - Maple Ambush Sack - Unwrap this sack, and the aliens will bring doom to the world of Maple. -2100105 - Maze Snail Set - A Maze Snail set, including 5 types of snails for a total of 25 snails. -2100106 - Maze Transformation Snail Set - A Maze Transformation Snail Set, including 3 types of snails for a total of 3, but they change their look every 3 seconds. -2100107 - Maze Transformation Snail Set2 - A Maze Transformation Snail Set, including 2 types of snails for a total of 2, but they change their look every 10 seconds. -2100112 - Summon Flying Monsters (Mark) - Summons marked monsters -2100116 - Summon Maze Pigs - Summons Maze Pig. -2100117 - Summon Maze Rash - Summons Maze Rash -2100118 - Dr. Kim's Anti-Virus Project - Eliminates Chief Greys. -2100119 - Summons Maze Sand Bunny - Summons Maze Sand Bunnies. -2210017 - Moon Photo - The more you look at it, the more you feel lightheaded� and you feel closer to the moon. -2210018 - Sweet Rice Cake - A sweet, delicious rice cake. Sometimes creates an interesting set of powers. -2210021 - Gaga Transformation Potion - The moment you drink this potion, you'll become the biggest star in the world of Maple, Gaga. -2210022 - Peto Transformation Potion - A transformation potion from the masked gentleman that allows you to transform into Peto for 15 minutes. -2270012 - Purple Ribbon Pig - A purple ribbon that helps catch Maze Pig. -2270008 - Fish Net - A fish net intended to catch something. Can be used with Gaga. -2270009 - Red Ribbon Pig - A red ribbon that helps catch Maze Pig. -2270010 - Green Ribbon Pig - A green ribbon that helps catch Maze Pig. -2270011 - Blue Ribbon Pig - A blue ribbon that helps catch Maze Pig. -2380013 - Cynical Orange Mushroom Card - A card featuring the Cynical Orange Mushroom. -2388046 - Mu Gong Card - A card with a drawing of Moo Gong on it.n#cWhen hunting in Mu Lungnincrease Item/Meso drop rate.# -2430004 - Richie Gold's Random Key Pot - Resets the Gold Key Room in Richie Gold's Maze. -2430005 - Memorial Map - Allows you to check your current position, along with the spot of the Gold Key Room. -2440000 - Richie Gold's Fake Lead - Using this will randomly take you to a spot in the maze. -2022157 - Carnival Point 1 - Enhances CP 3. -2022158 - Carnival Point 2 - Enhances CP 3. -2022159 - Carnival Point 3 - Enhances CP 3. -2022175 - Elixir - A legendary potion.\nRecovers about 50% of HP and MP. (Exclusively for Monster Carnival) -2022176 - Power Elixir - A legendary Potion.\nRecovers all HP and MP. (Exclusively for Monster Carnival) -2022177 - Mana Elixir - A legendary potion.\nRecovers about 300 MP. (Exclusively for Monster Carnival) -2022178 - All-Cure Potion - Recovers the character from any abnormal state. (Exclusively for Monster Carnival) -2041211 - Spiegelmann's Marble - Can only be used on Spiegelmann's Necklace.\nSuccess Rate: 60%, HP +30, MP +30 -2044712 - Scroll for Claw for ATT 100% - Improves attack on claw.\nSuccess rate:100%, weapon attack+2, accuracy+3 -2044612 - Scroll for Crossbow for ATT 100% - Improves attack on crossbow.\nSuccess rate:100%, weapon attack+2, accuracy+3 -2044512 - Scroll for Bow for ATT 100% - Improves attack on bow.\nSuccess rate: 100%, weapon attack+2, accuracy +3 -2044417 - Scroll for Pole Arm for ATT 100% - Improves attack on pole arm.\nSuccess rate:100%, weapon attack+2, STR+2 -2044317 - Scroll for Spear for ATT 100% - Improves attack on spear.\nSuccess rate:100%, weapon attack+2, STR+2 -2044217 - Scroll for Two-handed BW for ATT 100% - Improves attack on two-handed blunt weapon.\nSuccess rate:100%, weapon attack+2, STR+2 -2044117 - Scroll for Two-handed Axe for ATT 100% - Improves attack on two-handed axe.\nSuccess rate:100%, weapon attack+2, STR+2 -2044025 - Scroll for Two-handed Sword for ATT 100% - Improves attack on two-handed sword.\nSuccess rate:100%, weapon attack+2, STR+2 -2043812 - Scroll for Staff for Magic ATT 100% - Improves magic on staff.\nSuccess rate:100%, magic attack+2, INT+2 -2043712 - Scroll for Wand for Magic ATT 100% - Improves magic on wand.\nSuccess rate:100%, magic attack+2, INT+2 -2043312 - Scroll for Dagger for ATT 100% - Improves attack on dagger.\nSuccess rate:100%, weapon attack+2, LUK+2 -2043217 - Scroll for One-Handed BW for ATT 100% - Improves attack on one-handed blunt weapon.\nSuccess rate:100%, weapon attack+2, STR+2 -2043117 - Scroll for One-Handed Axe for ATT 100% - Improves attack on one-handed axe.\nSuccess rate:100%, weapon attack+2, STR+2 -2043023 - Scroll for One-Handed Sword for ATT 100% - Improves attack on one-handed sword.\nSuccess rate:100%, weapon attack+2, STR+2 -2041066 - Scroll for Cape for Magic DEF 100% - Improves magic def. on the cape.\nSuccess rate:100%, magic def.+3, weapon def.+2 -2041067 - Scroll for Cape for Weapon DEF 100% - Improves weapon def. on the cape.\nSuccess rate:100%, weapon def.+3, magic def. +2 -2040936 - Scroll for Shield for DEF 100% - Improves weapon def. on the shield.\nSuccess rate:100%, weapon def.+2, magic def.+3 -2040829 - Scroll for Gloves for DEX 100% - Improves dexterity on gloves.\nSuccess rate: 100%, accuracy+2, DEX+2 -2040830 - Scroll for Gloves for ATT 100% - Improves attack on gloves.\nSuccess rate 100%, weapon att. +2 -2040740 - Scroll for Shoes for DEX 100% - Improves dexterity on shoes.\nSuccess rate:100%, Avoidability +2, Accuracy+3 -2040741 - Scroll for Shoes for Jump 100% - Improves jump on shoes.\nSuccess rate: 100%, jump +2, DEX+2 -2040742 - Scroll for Shoes for Speed 100% - Improves speed on shoes.\nSuccess rate:100%, speed+2 -2040630 - Scroll for Bottomwear for DEF 100% - Improves weapon def. on the bottomwear.\nSuccess rate:100%, weapon def. +2, magic def. +3 -2040538 - Scroll for Overall Armor for DEX 100% - Improves dexterity on the overall armor.\nSuccess rate:100%, DEX+2, accuracy+3 -2040539 - Scroll for Overall Armor for DEF 100% - Improves def. on the overall armor.\nSuccess rate:100%, weapon def.+2, magic def.+3 -2040430 - Scroll for Topwear for DEF 100% - Improves weapon def. on topwear.\nSuccess rate:100%, weapon def.+2, magic def.+3 -2040334 - Scroll for Earring for INT 100% - Improves INT on ear accessory.\nSuccess rate:100%, magic attack +2, INT+2 -2040041 - Scroll for Helmet for DEF 100% - Improves helmet def.\nSuccess rate:100%, weapon def.+2, magic def., +3 -2040042 - Scroll for Helmet for HP 100% - Improves MaxHP on hats.\nSuccess rate:100%, MaxHP+15 -2101200 - GMEvent_Horntail's Left Head - GMEvent_Horntail's Left Head -2101201 - GMEvent_Horntail's Right Head - GMEvent_Horntail's Right Head -2101202 - GMEvent_Pink Bean - GMEvent_Pink Bean -2022481 - Mysterious Maple - The excitement of waiting for an adventure makes you feel good. Weapon and Magic Defense +10. -2022482 - Pigmy's Wings - Pigmy's Wings can be used to grant Speed +8. -2022496 - Cassandra's Star - Blessings from the star given to explorers who participated in the Starlight Festival. Weapon and Magic Defense +5 for 15 minutes. -2022499 - Point Improvement Treasure Chest - Improves point acquisition in the Biscuit Map. -2022500 - Point Increase Treasure Chest - Improves point acquisition in the Biscuit Map for 1 minute. -2022501 - Geppetto's Writing Analysis - Your Speed and Jump skills have increased because Geppetto has deciphered the letters. -2022502 - Hero's Gladius - Tristan's Powerful Strength -2022503 - Golden Pig's Shiny Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022504 - Golden Pig's Shiny Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022505 - Golden Pig's Shiny Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022506 - Golden Pig's Shiny Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022507 - Golden Pig's Shiny Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022508 - Golden Pig's Shiny Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022509 - Golden Pig's Shiny Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022510 - Golden Pig's Shiny Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022511 - Golden Pig's Shiny Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022512 - Golden Pig's Shiny Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022513 - Golden Pig's Shiny Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022514 - Golden Pig's Dazzling Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022515 - Golden Pig's Dazzling Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022516 - Golden Pig's Dazzling Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022517 - Golden Pig's Dazzling Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022518 - Golden Pig's Dazzling Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022519 - Golden Pig's Dazzling Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022520 - Golden Pig's Dazzling Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022521 - Golden Pig's Dazzling Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022522 - Golden Pig's Dazzling Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022523 - Golden Pig's Dazzling Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022524 - Golden Pig's Dazzling Egg - An egg from a Golden Pig. You cannot tell what's inside. Double-click to crack it open. -2022526 - Azalea - A spring flower that especially enjoys sunlight. Restores approximately 2000 HP. -2022527 - Forsythia - The first flower to bloom in the spring. Restores approximately 2000 HP. -2022528 - Clover - A spring flower that symbolizes good luck. Restores approximately 2000 HP. -2022529 - Meaning of Azaleas - The meaning of Azaleas is love. 2x Meso drops for 30 minutes. -2022530 - Meaning of Forsythias - The meaning of Forsythias is hope. 2X item drops for 30 minutes. -2022531 - Meaning of Clovers - The meaning of Clovers in luck. 2X item drops for 1 hour. -2022536 - Underground Temple's Seal - The Seal's energy has been placed on the Underground Temple in order to trap the Balrog inside. It restricts the abilites of all living things. -2022537 - Gladius' Strength - The abilites of the person wieldng the Hero's Gladius is amplified under the protection of Tristan. Weapon ATT +30 and Magic ATT +30. -2022539 - Cry of a Little Lamb - Wolves slow down when they hear a lamb cry. -2022540 - Danger Escape - Movement speed increased for 3 seconds. -2022541 - Self Protection - Protects from a Wolf's attack 1 time. -2022542 - Little Lamb's Surprise Attack - Attacks a Wolf's back, temporarily immobolizing it. -2022543 - Great Confusion - Causes the sheep to become confused and lose direction. -2022547 - Sound of the Sheep's Bells - Slows wolves' movement speed. -2022548 - Sound of the Wolf's Bells - Sheep are temporarily unable to move. -2022549 - Wolf's Threat - Intimidates the sheep, making them weaker. -2022550 - Sheep Ranch Golden ? Egg - A golden egg that can only be obtained at the Sheep Ranch. It has a question mark engraved on it. Double-click to find out what's inside. -2022552 - 6th Anniversary Gift Box - A gift box celebrating Maple Story's 6th Anniversary. What could be inside? rn#cCan be opened by double-clicking.# -2022553 - Crackers's Buff - A buff that Crackers has placed on the Witch's Treasure. Weapon and Magic Attack +10, Defense +20, Accuracy +20, and Avoidability +20 for 40 minutes. -2022562 - Artifact Hunt Encouragement Buff - A buff to encourage you upon accumulating 2,500 points in the Artifact Hunt. Attack +3, Magic Attack +6, Speed +6 -2022563 - Artifact Hunt Encouragement Buff - A buff to encourage you upon accumulating 4,000 points in the Artifact Hunt. Attack +5, Magic Attack +10, Speed +15 -2031006 - Family Studio Photo Coupon - A coupon that allows you to attend the 6th Anniversary Family Photo Shoot Event. -2040329 - Scroll for Earring for DEX 10% - Improves DEX on earrings. nSuccess rate: 10%, Dex +3. The success rate of this scroll can be enhanced by Vega's Spell. -2040330 - Scroll for Earring for INT 10% - Improves INT on earrings. nSuccess rate: 10%, Magic ATT +5, INT +3, Magic Defense +1. The success rate of this scroll can be enhanced by Vega's Spell. -2040331 - Scroll for Earring for LUK 10% - Improves LUK on earrings. nSuccess rate: 10%, LUK +3. The success rate of this scroll can be enhanced by Vega's Spell. -2040728 - Balrog's STR Scroll 30% - Improves STR on Balrog Leather Shoes. nSuccess rate: 30%, STR +2 -2040729 - Balrog's INT Scroll 30% - Improves INT on Balrog Leather Shoes. nSuccess rate: 30%, INT +2 -2040730 - Balrog's LUK Scroll 30% - Improves LUK on Balrog Leather Shoes. nSuccess rate: 30%, LUK +2 -2040731 - Balrog's DEX Scroll 30% - Improves DEX on Balrog Leather Shoes. nSucess rate: 30%, DEX +2 -2040732 - Balrog's HP Scroll 30% - Improves HP on Balrog Leather Shoes. nSuccess rate: 30%, MaxHP +30 -2040733 - Balrog's MP Scroll 30% - Improves MP on Balrog Leather Shoess. nSuccess rate: 30%. MaxMP +30 -2040734 - Balrog's Speed Scroll 30% - Improves Speed on Balrog Leather Shoes. nSuccess rate: 30%, Speed +3 -2040735 - Balrog's Jump Scroll 30% - Improves Jump on Balrog Leather Shoes. nSuccess rate: 30%, Jump +3 -2040736 - Balrog's Accuracy Scroll 30% - Improves Accuracty on Balrog Leather Shoes. nSuccess rate: 30%, Accuracy +5 -2040737 - Balrog's Avoidability Scroll 30% - Improves Avoidability on Balrog Leather Shoes. nSuccess rate: 30%, Avoidability +5 -2040738 - Balrog's Defense Scroll 30% - Improves Defense on Balrog Leather Shoes. nSuccess rate: 30%, Weapons Defense +10, Magic Defense +10 -2040739 - Balrog's Twilight Scroll 5% - Improves the function of Balrog Leather Shoes.\nSuccess rate: 5%, STR +4, INT +4, DEX +4, LUK +4, Speed +4, Jump +4, Avoidability +4, Accuracy +4, Weapons Defense +14, Magic Defense +14, MaxHP +40, MaxMP +40 -2040826 - Scroll for Gloves for ATT 60% - Improves ATT on Gloves.\nSuccess rate: 60%, Weapons ATT +2. The success rate of this scroll can be enhanced by Vega's Spell. -2041100 - Scroll for Ring for STR 100% - Improves STR on Rings. nSuccess rate: 100%, STR +1 -2041101 - Scroll for Rings for STR 60% - Improves STR on Rings.\nSuccess rate: 60%, STR +2. The success rate of this scroll can be enhanced by Vega's Spell. -2041102 - Scroll for Rings for STR 10% - Improves STR on Rings.\nSuccess rate: 10%, STR +3. The success rate of this scroll can be enhanced by Vega's Spell. -2041103 - Scroll for Rings for INT 100% - Improves INT on Rings. nSuccess rate: 100%, INT +1 -2041104 - Scroll for Rings for INT 60% - Improves INT on Rings.\nSuccess rate: 60%, INT +2. The success rate of this scroll can be enhanced by Vega's Spell. -2041105 - Scroll for Rings for INT 10% - Improves INT on Rings.\nSuccess rate: 10%, INT +2. The success rate of this scroll can be enhanced by Vega's Spell. -2041106 - Scroll for Rings for DEX 100% - Improves DEX on Rings. nSuccess rate: 100%, DEX +1 -2041107 - Scroll for Rings for DEX 60% - Improves DEX on Rings.\nSuccess rate: 100%, DEX +2. The success rate of this scroll can be enhanced by Vega's Spell. -2041108 - Scroll for Rings for DEX 10% - Improves DEX on Rings.\nSuccess rate: 10%, DEX +3. The success rate of this scroll can be enhanced by Vega's Spell. -2041109 - Scroll for Rings for LUK 100% - Improves LUK on Rings. nSuccess rate: 100%, LUK +1 -2041110 - Scroll for Rings for LUK 60% - Improves LUK on Rings.\nSuccess rate: 60%, LUK+2. The success rate of this scroll can be enhanced by Vega's Spell. -2041111 - Scroll for Rings for LUK 10% - Improves LUK on Rings.\nSuccess rate: 10%, LUK +3. The success rate of this scroll can be enhanced by Vega's Spell. -2041112 - Dark Scroll for Rings for STR 70% - Improves STR on Rings. nSuccess rate: 70%, STR +2nIf unsuccessful, item has a 50% chance of being destroyed. -2041113 - Dark Scroll for Rings for STR 30% - Improves STR on Rings. nSuccess rate: 30%, STR +3nIf unsuccessful, item has a 50% chance of being destroyed. -2041114 - Dark Scroll for Rings for INT 70% - Improves INT on Rings.\nSuccess rate: 70%, INT +2nIf unsuccessful, item has a 50% chance of being destroyed. -2041115 - Dark Scroll for Rings for INT 30% - Improves INT on Rings.\nSuccess rate: 30%, INT +3nIf unsuccessful, item has a 50% chance of being destroyed. -2041116 - Dark Scroll for Rings for DEX 70% - Improves DEX on Rings.\nSuccess rate: 70%, DEX +2nIf unsuccessful, item has a 50% chance of being destroyed. -2041117 - Dark Scroll for Rings for DEX 30% - Improves DEX on Rings. nSuccess rate: 30%, DEX +3nIf unsuccessful, item has a 50% chance of being destroyed. -2041118 - Dark Scroll for Rings for LUK 70% - Improves LUK on Rings. nSuccess rate: 70%, LUK +2nIf unsuccessful, item has a 50% chance of being destroyed. -2041119 - Dark Scroll for Rings for LUK 30% - Improves LUK on Rings. nSuccess rate: 30%, LUK +3nIf unsuccessful, item has a 50% chance of being destroyed. -2041300 - Scroll for Belts for STR 100% - Improves STR on Belts. nSuccess rate: 100%, STR +1 -2041301 - Scroll for Belts for STR 60% - Improves STR on Belts.\nSuccess rate: 60%, STR +2. The success rate of this scroll can be enhanced by Vega's Spell. -2041302 - Scroll for Belts for STR 10% - Improves STR on Belts.\nSuccess rate: 10%, STR +3. The success rate of this scroll can be enhanced by Vega's Spell. -2041303 - Scroll for Belts for INT 100% - Improves INT on Belts. nSuccess rate: 100%, INT +1 -2041304 - Scroll for Belts for INT 60% - Improves INT on Belts.\nSuccess rate: 60%, INT +2. The success rate of this scroll can be enhanced by Vega's Spell. -2041305 - Scroll for Belts for INT 10% - Improves INT on Belts.\nSuccess rate: 10%, INT +3. The success rate of this scroll can be enhanced by Vega's Spell. -2041306 - Scroll for Belts for DEX 100% - Improves DEX on Belts. nSuccess rate: 100%, DEX +1 -2041307 - Scroll for Belts for DEX 60% - Improves DEX on Belts.\nSuccess rate: 60%, DEX +2. The success rate of this scroll can be enhanced by Vega's Spell. -2041308 - Scroll for Belts for DEX 10% - Improves DEX on Belts.\nSuccess rate: 10%, DEX +2. The success rate of this scroll can be enhanced by Vega's Spell. -2041309 - Scroll for Belts for LUK 100% - Improves LUK on Belts. nSuccess rate: 100%, LUK +1 -2041310 - Scroll for Belts for LUK 60% - Improves LUK on Belts.\nSuccess rate: 60%, LUK +2. The success rate of this scroll can be enhanced by Vega's Spell. -2041311 - Scroll for Belts for LUK 10% - Improves LUK on Belts.\nSuccess rate: 10%, LUK +3. The success rate of this scroll can be enhanced by Vega's Spell. -2041312 - Dark Scroll for Belts for STR 70% - Improves STR on Belts. nSuccess rate: 70%, STR +2nIf unsuccessful, item has a 50% chance of being destroyed. -2041313 - Dark Scroll for Belts for STR 30% - Improves STR on Belts. nSuccess rate: 30%, STR +3nIf unsuccessful, item has a 50% chance of being destroyed. -2041314 - Dark Scroll for Belts for INT 70% - Improves INT on Belts. nSuccess rate: 70%, INT +2nIf unsuccessful, item has a 50% chance of being destroyed. -2041315 - Dark Scroll for Belts for INT 30% - Improves INT on Belts. nSuccess rate: 30%, INT +3nIf unsuccessful, item has a 50% chance of being destroyed. -2041316 - Dark Scroll for Belts for DEX 70% - Improves DEX on Belts. nSuccess rate: 70%, DEX +2nIf unsuccessful, item has a 50% chance of being destroyed. -2041317 - Dark Scroll for Belts for DEX 30% - Improves DEX on Belts. nSuccess rate: 30%, DEX +3nIf unsuccessful, item has a 50% chance of being destroyed. -2041318 - Dark Scroll for Belts for LUK 70% - Improves LUK on Belts. nSuccess rate: 70%, LUK +2nIf unsuccessful, item has a 50% chance of being destroyed. -2041319 - Dark Scroll for Belts for LUK 30% - Improves LUK on Belts. nSuccess rate: 30%, LUK +3nIf unsuccessful, item has a 50% chance of being destroyed. -2044015 - Scroll for Two-Handed Swords for ATT 10% - Improves ATT on Two-Handed Swords. nSuccess rate: 10%, Weapons ATT +5, STR +3, Weapons Defense +1 -2049105 - [6th Anniversary] Dark Scroll for Gloves for ATT 70% - Improves ATT on Gloves. nSuccess rate: 70%, Weapons ATT +1nIf unsuccessful, item has a 50% chance of being destroyed. -2049106 - [6th Anniversary] Dark Scroll for Gloves for ATT 30% - Improves ATT on Gloves. nSucces rate: 30%, Weapons ATT +2nIf unsuccessful, item has an 80% chance of being destroyed. -2049107 - [6th Anniversary] Dark Scroll for Gloves for STR 70% [ - Improves STR on Gloves. nSuccess rate: 70%, Accuracy +2, STR +1nIf unsuccessful, item has a 50% chance of being destroyed. -2049108 - [6th Anniversary] Dark Scroll for Gloves for LUK 70% - Improves LUK on Gloves. nSuccess rate: 70%, Accuracy +2, LUK +1nIf unsuccessful, item has a 50% chance of being destroyed. -2049109 - [6th Anniversary] Dark Scroll for Gloves for INT 70% - Improves INT on Gloves. nSuccess rate: 70%, Accuracy +2, INT +1nIf unsuccessful, item has a 50% chance of being destroyed. -2049110 - [6th Anniversary] Dark Scroll for Gloves for DEX 70% - Improves DEX on Gloves. nSuccess rate: 70%, Accuracy +2, DEX +1nIf unsuccessful, item has a 50% chance of being destroyed. -2100108 - Master of Disguise Summoning Sack - Summons the Master of Disguise. -2100109 - Black Witch Summoning Summoning Sack - Summons the Black Witch. -2100110 - Blue Mushroom Summoning Sack - Summons a group of Blue Mushrooms. -2100111 - Puppeteer Summoning Sack - Summons the Puppeteer. -2100113 - Tristan's Balrog Summon - Summons Tristan's Balrog. -2100120 - Snail Summoning Sack - Summons a group of Snails. -2100121 - Slime Summoning Sack - Summons a group of Slimes. -2100122 - Green Mushroom Summoning Sack - Summons a group of Green Mushrooms. -2100123 - Octopus Summoning Sack - Summons a group of Octopuses. -2100124 - Pig Summoning Sack - Summons a group of Pigs. -2100125 - Ribbon Pig Summoning Sack - Summons a group of Ribbon Pigs. -2100126 - Orange Mushroom Summoning Sack - Summons a group of Orange Mushrooms. -2100127 - Bubbling Summoning Sack - Summons a group of Bubblings. -2100128 - Horny Mushroom Summoning Sack - Summons a group of Horny Mushrooms. -2100129 - Jr. Necki Summoning Sack. - Summons Jr. Necki. -2100130 - Blue Mushroom Summoning Sack - Summons a group of Blue Mushrooms -2100131 - Tristan's Balrog Summoning Sack - Summons Tristan's Balrog. -2100132 - Balrog Summoning Sack - Balrog Summoning Sack -2100133 - Balrog's Spirit - Balrog's Spirit -2100134 - Rescued Gaga Summoning Sack - Summons Gaga, who has been rescued. -2100135 - Test MOB Summoning Sack - Test MOB Summoning Sack -2100136 - Easy Mode Balrog Summoning Sack - Easy Mode Balrog Summoning Sack -2100137 - Easy Mode Balrog's Spirit - Easy Mode Balrog's Spirit -2100138 - Puppeteer Summoning Sack - Summons the Puppeteer. -2100139 - Puppeteer Summoning Sack - Summons the Puppeteer. -2100140 - Puppeteer Summong Sack - Summons the Puppeteer. -2101110 - Monster Summoning Sack(Leviathan) - Summons 1 Leviathan. -2210004 - Blue Ribbon Pig Piece - A crystal piece that resembles Blue Ribbon Pig. When used, the crystal will melt into the body, and its mythical power will transform the user into Blue Ribbon Pig. This mythical power will last for an hour. -2100900 - Mysterious Sack - Cassandra says that it's impossible to know what monsters will be summoned from this sack, but it may summon special, hard-to-find monsters. -2109004 - Steal Sheep Wool - Summons a bomb to steel wool from sheep. -2109005 - Plant a Rose Thorn - Plants a Rose Thorn Bush to keep Wolves away. -2210030 - Geppetto Transformation - You've entered a fable and transformed into Geppetto. You�re feel a bit sluggish, but do your best to leave the dungeon with your party members. -2210034 - Alien Gray Transformation - The mysterious force emanating from the crystal statue shall be absorbed into your body, and you will no longer find yourself as you are. -2210035 - Penguin Transformation 1 - Will transform you into a penguin. -2210036 - Penguin Transformation 2 - Will transform you into a penguin. -2210037 - Penguin Transformation 3 - Will transform you into a penguin. -2210038 - Penguin Transformation 4 - Will transform you into a penguin. -2210039 - Penguin Transformation 5 - Will transform you into a penguin. -2360002 - Board the Spaceship - Let's go rescue Gaga! -2388055 - Balrog Card - A card that features a Balrog.ncIncreases the Item/Meso drop rates in the central dungeon of Victoria.# -2430006 - Mysterious Piece of Paper - It's full of mysterious scribbles. n#cA quest will begin when you double-click it.# -2430007 - Empty Compass - A compass with no markings. However, it can be turned into a working compass if you have the letters #cN,E, W,S#. -2430008 - Golden Compass - A golden compass that reveals the location of Gold Richie's Treasure Island. n#cBy double-clicking it# you can move to the island. -2430009 - Pure Perfume - A perfume that contains the scent of an inexperienced adventurer. n#cBy double-clicking on it#, that scent is released to confuse monsters. -2430010 - Mysterious Artifact - An artifact with an unknown date of origin.\n#cDouble-click# on it to find out its date of origin. -2430011 - Agent Summon - Summons Agents. (For GM Event Use) -2430012 - Agent Removal - Removes Agents. (For GM Event Use) -2022476 - Chicken Kapitan - A popular Malaysian dish. This mild curry contains chicken pieces with rich coconut milk, onions and spices. \nRecovers 4000 HP. -2022477 - Mee Siam - A popular Malaysian dish made up of thin rice noodles. Served with salted soy beans, dried bean curd, boiled egg and tamarind. \nRecovers 4000 MP. -2022478 - Rojak - This famous dish is served with generous amounts of sweet thick, spicy peanut sauce with bean curds, prawn fritters, hard-boiled eggs and bean sprouts.\nRecovers 1000 HP and 1000 MP. -2022479 - Kangkung belacan - This spicy vegetable dish is served with KanKung (water spinach) and spicy sambal.nImproves Weapon Attack and Magic Attack +8 for 10 minutes. -2022480 - Kuih - These sweet, bite-sized delights are a favorite pastry dish served during parties and just for tea.nImproves Speed +10 for 30 minutes. -2044713 - Scroll for Claw for ATT 50% - Improves attack on claw.\nSuccess rate:50%, weapon attack+5, LUK+1, DEX+1 -2044613 - Scroll for Crossbow for ATT 50% - Improves attack on crossbow.\nSuccess rate:50%, weapon attack+5, DEX+1, STR+1 -2044513 - Scroll for Bow for ATT 50% - Improves attack on bow.\nSuccess rate:50%, weapon attack +5, DEX+1, STR+1 -2044420 - Scroll for Pole Arm for ATT 50% - Improves attack on pole arm.\nSuccess rate:50%, weapon attack+5, STR+3, DEX+1 -2044320 - Scroll for Spear for ATT 50% - Improves attack on spear.\nSuccess rate:50%, weapon attack+5, STR+3, DEX+1 -2044220 - Scroll for Two-handed BW for ATT 50% - Improves attack on two-handed blunt weapon.\nSuccess rate:50%, weapon attack+5, STR+3, DEX+1 -2044120 - Scroll for Two-handed Axe for ATT 50% - Improves attack on two-handed axe.\nSuccess rate:50%, weapon attack+5, STR+3, DEX+1 -2044028 - Scroll for Two-handed Sword for ATT 50% - Improves attack on two-handed sword.\nSuccess rate:50%, weapon attack+5, STR+3, DEX+1 -2043813 - Scroll for Staff for Magic Att. 50% - Improves magic on staff.\nSuccess rate:50%, magic attack+5, INT+3, LUK+1 -2043713 - Scroll for Wand for Magic Att. 50% - Improves magic on wand.\nSuccess rate:50%, magic attack+5, INT+3, LUK+1 -2043313 - Scroll for Dagger for ATT 50% - Improves attack on dagger.\nSuccess rate: 50%, weapon attack +5, LUK+3, DEX+1 -2043220 - Scroll for One-Handed BW for ATT 50% - Improves attack on one-handed blunt weapon.\nSuccess rate: 50%, weapon attack +5, STR+3, DEX+1 -2043120 - Scroll for One-Handed Axe for ATT 50% - Improves attack on one-handed axe.\nSuccess rate: 50%, weapon attack +5, STR+3, DEX+1 -2043022 - Scroll for One-Handed Sword for ATT 50% - Improves attack on one-handed sword.\nSuccess rate:50%, weapon attack+5, STR+3, DEX+1 -2041068 - Scroll for Cape for Magic Def. 50% - Improves magic def. on the cape.\nSuccess rate:50%, magic def. +5, weapon def. +4 -2041069 - Scroll for Cape for Weapon Def. 50% - Improves weapon def. on the cape.\nSuccess rate:50%, weapon def. +5, magic def.+4 -2040943 - Scroll for Shield for DEF 50% - Improves weapon def. on the shield.\nSuccess rate 50%, weapon def.+5, magic def.+4 -2040833 - Scroll for Gloves for DEX 50% - Improves dexterity on gloves.\nSuccess rate:50%, accuracy+3, DEX+3, avoidability+2 -2040834 - Scroll for Gloves for ATT 50% - Improves attack on gloves.\nSuccess rate:50%, weapon att.+3 -2040755 - Scroll for Shoes for DEX 50% - Improves dexterity on shoes.\nSuccess rate:50%, Avoidability +3, accuracy +3, speed+2 -2040756 - Scroll for Shoes for Jump 50% - Improves jump on shoes.\nSuccess rate:50%, jump+6, speed+1 -2040757 - Scroll for Shoes for Speed 50% - Improves speed on shoes.\nSuccess rate:50%, speed+3, jump+1 -2040629 - Scroll for Bottomwear for DEF 50% - Improves weapon def. on the bottomwear.\nSuccess rate:50%, weapon def.+5, magic def.+4 -2040542 - Scroll for Overall Armor for DEX 50% - Improves dexterity on the overall armor.\nSuccess rate:50%, DEX+5, avoidability+1, speed+1 -2040543 - Scroll for Overall Armor for DEF 50% - Improves def. on the overall armor.\nSuccess rate:50%, wepon def. +5, magic def. +4 -2040429 - Scroll for Topwear for DEF 50% - Improves weapon def. on topwear.\nSuccess rate:50%, weapon def. +5, magic def. +4 -2040333 - Scroll for Earring for INT 50% - Improves INT on ear accessory.\nSuccess rate:50%, magic attack +5, INT+3, magic def. +2 -2040045 - Scroll for Helmet for DEF 50% - Improves helmet def.\nSuccess Rate:50%, weapon def.+5, magic def.+4 -2040046 - Scroll for Helmet for HP 50% - Improves MaxHP on hats.\nSuccess rate:50%, MaxHP+35 -2101207 - A Parasite Summoning Sack - (no description) -2101208 - Andras Summoning Sack - (no description) -2101209 - Marbas Summoning Sack - (no description) -2101210 - Amdusias Summoning Sack - (no description) -2101211 - Valefor Summoning Sack - (no description) -2101212 - Crocell Summoning Sack - (no description) -2101213 - Astaroth Summoning Sack - (no description) -2022623 - Seasoned Frog Eggs and Mushrooms - A stinky dish made with Cursed Frog Eggs. Increases 400 HP if eaten. -2022624 - Bloody Mushroom Wine - A non-alcoholic wine made by the Witch using Cursed Cat Spittle. Increases 200 MP when consumed. -2022625 - Slimy Canape - A creepy and slimy Canape that the Witch has made for you. Increases Weapon ATT and Weapon DEF +15 for 15 minutes. -2022626 - Zingy Kabab - A suspiciously sharp-tasting Kabab that the Witch has made for you. Increases Magic ATT And Magic DEF +15 for 15 minutes. -2022627 - Swamp Wrap - The Witch's wrap dish that fills your mouth with the aroma of the swamp with each bite. Increases Weapon ATT and Weapon DEF +25 for 15 minutes. -2022628 - Rough Leather Steak - A rough leather steak that the Witch has carefully grilled for you. Increases Magic ATT And Magic Defense +25 for 15 minutes. -2022629 - Witch's Special Stew - The Witch's special stew that gives off a sour stink. Increases Weapon and Magic ATT +40, Weapons and Magic DEF +100, and Speed and Jump +15 for 15 minutes. -2049113 - Normal Witch Scroll - A scroll that, depending on chance, will either improve or worsen the Talking Witch Hat or Broomstick obtained from the Witch. -2049114 - Witch's Belt Scroll - A scroll that, depending on chance, will either improve or worsen the Witch's Belts obtained from the Witch. -2101203 - Suspicious Black Sack - A sack that Cassandra gave you as a gift. On it appears a note that reads "Open with Friends." -2101204 - Olivia (30) Monster Sack - Sack containing a Lv. 30 Olivia. -2101205 - Olivia (50) Monster Sack - Sack containing a Lv. 50 Olivia. -2101206 - Olivia (70) Monster Sack - Sack containing a Lv. 70 Olivia. -2210043 - Leech Costume - An offensive-looking leech costume. Can be worn to trick your friends. -2022634 - Turkey Leg - A huge roasted turkey leg. It's so big that it seems like it would take all day to finish eating.\n[Gives +30 Physical Attack for 3 minutes] -2101236 - GMEvent_Pink Bean2 - GMEvent_Pink Bean2 -2000022 - Special Rien Red Potion - A special bottle of potion consisting of herbs that only grow in Rien. \nRecovers HP +100. -2000023 - Special Rien Blue Potion - A special bottle of potion consisting of herbs that only grow in Rien. \nRecovers MP +50. -2002030 - Angelic Steps - Allows one to move fast. \nWill increase your speed for 10 minutes. -2012005 - Angel Apple - A red, ripe apple.\nRecovers 200 HP. -2012006 - Angel Lemon - A very sour fruit.\nRecovers 200 MP. -2022564 - Aran Paper Box - A paper box containing a special present commemorating the Aran release. It is well-packed, so you may need to #cdouble-click# to open. -2022570 - King Pepe Warrior Weapon Box - King Pepe's box containing a Warrior weapon. -2022571 - King Pepe Magician Weapon Box - King Pepe's box containing a Magician weapon. -2022572 - King Pepe Bowman Weapon Box - King Pepe's box containing a Bowman weapon. -2022573 - King Pepe Thief Weapon Box - King Pepe's box containing a Thief weapon. -2022574 - King Pepe Pirate Weapon Box - King Pepe's box containing a Pirate weapon. -2022575 - King Pepe Warrior Armor Box - King Pepe's box containing armor for Warriors. -2022576 - King Pepe Magician Armor Box - King Pepe's box containing armor for Magicians. -2022577 - King Pepe Bowman Armor Box - King Pepe's box containing armor for Bowmen. -2022578 - King Pepe Thief Armor Box - King Pepe's box containing armor for Thieves. -2022579 - King Pepe Pirate Armor Box - King Pepe's box containing armor for Pirates. -2022580 - King Pepe Warrior Box - King Pepe's box containing an equipment item for Warriors. -2022581 - King Pepe Magician Box - King Pepe's box containing an equipment item for Magicians. -2022582 - King Pepe Bowman Box - King Pepe's box containing an equipment item for Bowmen. -2022583 - King Pepe Thief Box - King Pepe's box containing an equipment item for Thieves. -2022584 - King Pepe Pirate Box - King Pepe's box containing an equipment item for Pirates. -2022585 - Pharaoh's Blessing Lv. 1 - 100% Damage, Attack Speed +1 -2022586 - Pharaoh's Blessing Lv. 2 - 200% Damage, Attack Speed +2 -2022587 - Pharaoh's Blessing Lv. 3 - 300% Damage, Attack Speed +3 -2022588 - Pharaoh's Blessing Lv. 4 - 400% Damage, Attack Speed +4 -2022613 - Pharaoh's Treasure Chest - A treasure chest containing Pharaoh's treasured items. Double-click to open. -2022614 - Bingo Gift Box - A surprise gift box received after completing a line on the Bingo Board. Open it to discover what's inside! -2022615 - Subway Lost and Found - A Lost and Found box accidentally ingested by Bubbling. Double-click to open. -2022616 - Power Buff Lv. 1 - 100% Damage, Attack Speed +1 -2022617 - Power Buff Lv. 2 - 200% Damage, Attack Speed +2 -2022618 - Pharaoh's Treasure Chest - A treasure chest containing Pharaoh's precious items. Double-click to open. -2031008 - Rien Teleport Ticket - A teleport ticket given by the Maple Admin. It will immediately teleport you to Rien. -2043021 - King Pepe's 60% Scroll for One-handed Sword Attacks - Improves the Attack strength of King Pepe's Cutlass.\nSuccess Rate: 60%, Weapon Attack +2, STR +1. The success rate of this scroll can be enhanced by Vega's Spell. -2043116 - King Pepe's 60% Scroll for One-handed Axe Attacks - Improves the Attack strength of King Pepe's Danker.\nSuccess Rate: 60%, Weapon Attack +2, STR +1. The success rate of this scroll can be enhanced by Vega's Spell. -2043216 - King Pepe's 60% Scroll for One-handed BW Attacks - Improves the Attack strength of King Pepe's Heavy Hammer.\nSuccess Rate: 60%, Weapon Attack +2, STR +1. The success rate of this scroll can be enhanced by Vega's Spell. -2043311 - King Pepe's 60% Scroll for Dagger Attacks - Improves the Attack strength of King Pepe's Gephart.\nSuccess Rate: 60%, Weapon Attack +2, Luck +1. The success rate of this scroll can be enhanced by Vega's Spell. -2043711 - King Pepe's 60% Scroll for Wand Magic Attacks - Improves the Magic Attack strength of King Pepe's Wizard Wand.\nSuccess Rate: 60%, Magic Attack +2, Intelligence +1. The success rate of this scroll can be enhanced by Vega's Spell. -2043811 - King Pepe's 60% Scroll for Staff Magic Attacks - Improves the Magic Attacks strength of King Pepe's Petal Staff.\nSuccess Rate: 60%, Magic Attack +2, Intelligence +1. The success rate of this scroll can be enhanced by Vega's Spell. -2044024 - King Pepe's 60% Scroll for Two-handed Sword Attacks - Improves the Attack strength of King Pepe's Highlander.\nSuccess Rate: 60%, Weapon Attack +2, Strength +1. The success rate of this scroll can be enhanced by Vega's Spell. -2044116 - King Pepe's 60% Scroll for Two-handed Axe Attacks - Improves the Attack strength of King Pepe's Niam.\nSuccess Rate: 60%, Weapon Attack +2, Strength +1. The success rate of this scroll can be enhanced by Vega's Spell. -2044216 - King Pepe's 60% Scroll for Two-handed BW Attacks - Improves the Attack strength of King Pepe's Big Hammer.\nSuccess Rate: 60%, Weapon Attack +2, Strength +1. The success rate of this scroll can be enhanced by Vega's Spell. -2044316 - King Pepe's 60% Scroll for Spear Attacks - Improves the Attack strength of King Pepe's Nakamaki.\nSuccess Rate: 60%, Weapon Attack +2, Strength +1. The success rate of this scroll can be enhanced by Vega's Spell. -2044416 - King Pepe's 60% Scroll for Polearm Attacks - Improves the Attack strength of King Pepe's Axe Polearm.\nSuccess Rate: 60%, Weapon Attack +2, Strength +1. The success rate of this scroll can be enhanced by Vega's Spell. -2044511 - King Pepe's 60% Scroll for Bow Attacks - Improves the Attack strength of King Pepe's Red Viper.\nSuccess Rate: 60%, Weapon Attack +2, Accuracy +1. The success rate of this scroll can be enhanced by Vega's Spell. -2044611 - King Pepe's 60% Scroll for Crossbow Attacks - Improves the Attack strength of King Pepe's Eagle Crow.\nSuccess Rate: 60%, Weapon Attack +2, Accuracy +1. The success rate of this scroll can be enhanced by Vega's Spell. -2044711 - King Pepe's 60% Scroll for Thief Attacks - Improves the Attack strength of King Pepe's Dark Guardian.\nSuccess Rate: 60%, Weapon Attack +2, Accuracy +1. The success rate of this scroll can be enhanced by Vega's Spell. -2044816 - King Pepe's 60% Scroll for Knuckle Attacks - Improves the Attack strength of King Pepe's Silver Maden.\nSuccess Rate: 60%, Weapon Attack +2, Strength +1. The success rate of this scroll can be enhanced by Vega's Spell. -2044909 - King Pepe's 60% Scroll for Gun Attacks - Improves the Attack strength of King Pepe's Shooting Star.\nSuccess Rate: 60%, Weapon Attack +2, Accuracy +1. The success rate of this scroll can be enhanced by Vega's Spell. -2049112 - King Pepe's 100% Scroll for Weapons - Improves or decreases the effectiveness of King Pepe weapons.\nSuccess Rate: 100% -2100160 - Gray Yeti and King Pepe Summoning Bag - Summons Gray Yeti and King Pepe. -2100161 - Gold Yeti and King Pepe Summoning Bag - Summons Gold Yeti and King Pepe. -2100162 - White Yeti and King Pepe Summoning Bag - Summons White Yeti and King Pepe. -2100163 - Prime Minister Summoning Bag - Summons Prime Minister. -2109006 - Pharaoh Yeti Summoning Bag - Summons Pharaoh Yeti. -2109007 - Pharaoh Yeti Summoning Bag - Summons Pharaoh Yeti in 90 seconds. -2109008 - Bubbling Summoning Bag - For use in the restricted bonus map area of the subway station. -2109009 - Jr. Yeti Pharaoh Summoning Bag - Summons Jr. Yeti Pharaoh for the bonus stage of Nett's Pyramid (Easy, Normal, Hard) -2109010 - Jr. Yeti Pharaoh Summoning Bag - Summons Jr. Yeti Pharaoh for the bonus stage of Nett's Pyramid (Hell Mode) -2280013 - [Skill Book] Final Blow - Skill Book from which you can learn about the #cFinal Blow# skill.\nJob: 4th Lv Aran\nCondition: #cFinal Blow# not available -2280014 - [Skill Book] High Defense - Skill Book from which you can learn about the #cHigh Defense# skill.\nJob: 4th Lv Aran\nCondition: #cHigh Defense# not available -2280015 - [Skill Book] Combo Tempest - Skill Book from which you can learn about the #cCombo Tempest# skill.\nJob: 4th Lv Aran\nCondition: #cCombo Tempest# not available -2280017 - [Skill Book] Pig's Weakness - Skill Book from which you can learn about the #cPig's Weakness# skill.\nCondition: #cPig's Weakness# not available -2280016 - [Skill Book] Combo Barrier - Skill Book from which you can learn about the #cCombo Barrier# skill.\nJob: 4th Lv Aran\nCondition: #cCombo Barrier# not available -2280018 - [Skill Book] Stump's Weakness - Skill Book from which you can learn about the #cStump's Weakness# skill.\nCondition: #cStump's Weakness# not available -2280019 - [Skill Book] Slime's Weakness - Skill Book from which you can learn about the #cSlime's Weakness# skill.\nCondition: #cSlime's Weakness# not available -2290126 - [Mastery Book] Overswing 20 - With a 70% success rate, raises the Mastery Level of #cOverswing# to 20.\nJob: Aran\nCondition: Min Skill Lv. 5 -2290127 - [Mastery Book] Overswing 30 - With a 50% success rate, raises the Mastery Level of #cOverswing# to 30.\nJob: Aran\nCondition: Min Skill Lv. 15 -2290128 - [Mastery Book] High Mastery 20 - With a 70% success rate, raises the Mastery Level of #cHigh Mastery# to 20.\nJob: Aran\nCondition: Min Skill Lv. 5 -2290129 - [Mastery Book]High Mastery 30 - With a 50% success rate, raises the Mastery Level of #cHigh Mastery# to 30.\nJob: Aran\nCondition: Min Skill Lv. 15 -2290130 - [Mastery Book] Freeze Standing 20 - With a 70% success rate, raises the Mastery Level of #cFreeze Standing# to 20.\nJob: Aran\nCondition: Min Skill Lv. 5 -2290131 - [Mastery Book] Freeze Standing 30 - With a 50% success rate, raises the Mastery Level of #cFreeze Standing# to 30.\nJob: Aran\nCondition: Min Skill Lv. 15 -2290132 - [Mastery Book] Final Blow 20 - With a 70% success rate, raises the Mastery Level of #cFinal Blow# to 20.\nJob: Aran\nCondition: Min Skill Lv. 5 -2290133 - [Mastery Book] Final Blow 30 - With a 50% success rate, raises the Mastery Level of #cFinal Blow# to 30.\nJob: Aran\nCondition: Min Skill Lv. 15 -2290134 - [Mastery Book] High Defense 20 - With a 70% success rate, raises the Mastery Level of #cHigh Defense# to 20.\nJob: Aran\nCondition: Min Skill Lv. 5 -2290135 - [Mastery Book] High Defense 30 - With a 50% success rate, raises the Mastery Level of #cHigh Defense# to 30.\nJob: Aran\nCondition: Min Skill Lv. 15 -2290136 - [Mastery Book] Combo Tempest 20 - With a 70% success rate, raises the Mastery Level of #cCombo Tempest# to 20.\nJob: Aran\nCondition: Min Skill Lv. 5 -2290137 - [Mastery Book] Combo Tempest 30 - With a 50% success rate, raises the Mastery Level of #cCombo Tempest# to 30.\nJob: Aran\nCondition: Min Skill Lv. 15 -2290138 - [Mastery Book] Combo Barrier 20 - With a 70% success rate, raises the Mastery Level of #cCombo Barrier# to 20.\nJob: Aran\nCondition: Min Skill Lv. 5 -2290139 - [Mastery Book] Combo Barrier 30 - With a 50% success rate, raises the Mastery Level of #cCombo Barrier# to 30.\nJob: Aran\nCondition: Min Skill Lv. 15 -2380014 - Dejected Green Mushroom Card - A card featuring the Dejected Green Mushroom. -2380015 - Muru Card - A card featuring Muru. -2380016 - Murupa Card - A card featuring Murupa. -2380017 - Murupia Card - A card featuring Murupia. -2380018 - MuruMuru Card - A card featuring MuruMuru. -2380019 - Murukun Card - A card featuring Murukun. -2381082 - Smiling Ghost Stump Card - A card featuring the Smiling Ghost Stump. -2381083 - Annoyed Zombie Mushroom Card - A card featuring the Annoyed Zombie Mushroom. -2382092 - Renegade Spore Card - A card featuring Renegade Spores\n#cWhen hunting in the Mushroom Castle: \nJump +1 -2382093 - Poison Mushroom Card - A card featuring the Poison Mushroom\n#cWhen hunting in the Mushroom Castle: \nAccuracy +1 -2382094 - Intoxicated Pig Card - A card featuring the Intoxicated Pig\n#cWhen hunting in the Mushroom Castle: \nSpeed +1 -2382095 - Helmet Pepe Card - A card featuring Helmet Pepe\n#cWhen hunting in the Mushroom Castle: \nJump +1 -2382096 - Royal Guard Pepe Card - A card featuring Royal Guard Pepe\n#cWhen hunting in the Mushroom Castle: \nSpeed +1 -2388052 - Giant Centipede Card - A card that features Giant Centipede.\n#ctem drop rates are increased at Herb Town# -2388053 - Blue Mushmom Card - A card that features Blue Mushmom.\n#c#tem drop rates are increased at Korean Folk Town# -2388054 - Snack Bar Card - A card that features Snack Bar.\n#ctem drop rates are increased at Drake's area# -2388067 - Gray Yeti and King Pepe Card - A card featuring the Gray Yeti and King Pepe.\n#cIncreases the item drop rate when used inside the Mushroom Castle.# -2388068 - Gold Yeti and King Pepe Card - A card featuring the Gold Yeti and King Pepe.\n#cIncreases the item drop rate when used inside the Mushroom Castle.# -2388069 - White Yeti and King Pepe Card - A card featuring the White Yeti and King Pepe.\n#cIncreases the item drop rate when used inside the Mushroom Castle.# -2388070 - Prime Minister Mushroom Card - A card featuring the Prime Minister Mushroom.\n\cIncreases the item/meso drop rate when used inside the Mushroom Castle.# -2430013 - Peng Peng Popsicle - A frozen popsicle that tranforms you into a Peng Peng. There's no determining the type of Peng Peng you'll transform into. -2430014 - Killer Mushroom Spore - A powerful chemical extracted from a Poison Mushroom. Helps you remove sprawling, thorny magic barriers in the forest. -2430015 - Thorn Remover - A magic powder that eliminates the thorns from sprawling vines. -2430016 - Crystal Chest - A chest full of items that's sure to excite anyone who sees it. Open it by August 31st, 2009, or it'll disappear. -2450000 - Hunter's Luck - For 30 minutes, doubles your EXP from hunting. -2040758 - Scroll for Shoes for ATT - Improves attack on shoes.\nSuccess rate: 100%. Weapon Attack +1 -2040759 - Scroll for Shoes for ATT - Improves attack on gloves.\nSuccess rate: 60%. Weapon Attack +2. The success rate of this scroll can be enhanced by Vega's Spell. -2040760 - Scroll for Shoes for ATT - Improves attack on shoes.\nSuccess rate: 10%, Weapon Attack +3. The success rate of this scroll can be enhanced by Vega's Spell. -2044815 - Scroll for Knuckler for Attack 100% - Improves attack on Knucklers.\nSuccess rate: 100%. Weapon Attack +2, STR +1 -2044817 - Scroll for Knuckler for Attack 50% - Improves attack on Knucklers.\nSuccess rate: 50%. Weapon Attack +5, STR +3, DEX +1 -2044908 - Scroll for Gun for Attack 100% - Improves attack on Guns.\nSuccess rate: 100%. Weapon Attack +2, Accuracy +1 -2044910 - Scroll for Gun for Attack 50% - Improves attack on Guns.\nSuccess rate: 50%. Weapon Attack +5, LUK +1, DEX +1 -2022544 - White Elixir - A legendary potion. \nRecovers 50% HP and MP and cancels abnormal statuses. It can recover all abnormal statuses. -2022545 - Dynamite Drink EX - A drink with "Energy Boost" written on the label. Consuming this drink will grant ATT +25, MP +30, DEF +30, and Jump +10 for 30 minutes. -2022546 - Energy Drink - Consuming this drink will increase MAX HP for a set amount of time. -2430032 - Black Bag - A black bag you received from Hiver, a member of the Black Wings. Release it in front of the Safe... -2430030 - Golden Compass - A golden compass that will lead you to Goldrich's Treasure Island. \n#cDouble-click it to# be transported to the Treasure Island. -2430029 - Mystery Box - A box whose contents are unknown, though a Yellow Butterfly might just be hidden inside. -2430028 - Mystery Box - A box whose contents are unknown, though a Yellow Butterfly might just be hidden inside. It will be empty if opened by a character higher than Lv. 101. -2430027 - Mystery Box - A box whose contents are unknown, though a Yellow Butterfly might just be hidden inside. It will be empty if opened by a character higher than Lv. 71. -2430026 - Mystery Box - A box whose contents are unknown, though a Yellow Butterfly might just be hidden inside. It will be empty if opened by a character higher than Lv. 41. -2430031 - Instant Camera - An instant camera that can be used to take a picture of the moon. To take a picture of the moon, double-click on the moon that can be seen from town. If you fail to capture the picture, return to the Moon Bunny for another instant camera. -2100164 - Black Wing Henchman Summoning Sack - Summons the Black Wing's Henchman -2100165 - Hiver Summoning Sack - Summons Hiver -2100152 - Giant Summoning Sack - Summons the Giant -2100153 - Shadow Knight Summoning Sack - Summons the Shadow Knight -2100154 - Gentleman Summoning Sack - Summons the Gentleman -2100155 - Master of Disguise Summoning Sack - Summons the Master of Disguise -2100159 - Transformed Tru Summoning Sack - Summons Transformed Tru -2049200 - Dark Scroll for Accessory for STR 70% - Improves STR on Accessories (Pendants, Belts, Rings).\nSuccess Rate: 70%, STR+2\nIf failed, the item will be destroyed at a 50% rate. -2049201 - Dark Scroll for Accessory for STR 30% - Improves STR on Accessories (Pendants, Belts, Rings).\nSuccess Rate: 30%, STR+3\nIf failed, the item will be destroyed at a 50% rate. -2049202 - Dark Scroll for Accessory for DEX 70% - Improves DEX on Accessories (Pendants, Belts, Rings).\nSuccess Rate: 70%, DEX+2\nIf failed, the item will be destroyed at a 50% rate. -2049203 - Dark Scroll for Accessory for DEX 30% - Improves DEX on Accessories (Pendants, Belts, Rings).\nSuccess Rate: 30%, DEX+3\nIf failed, the item will be destroyed at a 50% rate. -2049204 - Dark Scroll for Accessory for INT 70% - Improves INT on Accessories (Pendants, Belts, Rings).\nSuccess Rate: 70%. INT+2\nIf failed, the item will be destroyed at a 50% rate. -2049205 - Dark Scroll for Accessory for INT 30% - Improves INT on Accessories (Pendants, Belts, Rings).\nSuccess Rate: 30%. INT+3\nIf failed, the item will be destroyed at a 50% rate. -2049206 - Dark Scroll for Accessory for LUK 70% - Improves LUK on Accessories (Pendants, Belts, Rings).\nSuccess Rate: 70%, LUK+2\nIf failed, the item will be destroyed at a 50% rate. -2049207 - Dark Scroll for Accessory for LUK 30% - Improves LUK on Accessories (Pendants, Belts, Rings).\nSuccess Rate: 30%, LUK+3\nIf failed, the item will be destroyed at a 50% rate. -2049208 - Dark Scroll for Accessory for HP 70% - Improves MaxHP on Accessories (Pendants, Belts, Rings).\nSuccess Rate: 70%, MaxHP+10\nIf failed, the item will be destroyed at a 50% rate. -2049209 - Dark Scroll for Accessory for HP 30% - Improves MaxHP on Accessories (Pendants, Belts, Rings).\nSuccess Rate: 30%, MaxHP+30\nIf failed, the item will be destroyed at a 50% rate. -2049210 - Dark Scroll for Accessory for MP 70% - Improves MaxMP on Accessories (Pendants, Belts, Rings).\nSuccess Rate: 70%, MaxMP+10\nIf failed, the item will be destroyed at a 50% rate. -2049211 - Dark Scroll for Accessory for MP 30% - Improves MaxMP on Accessories (Pendants, Belts, Rings).\nSuccess Rate: 30%, MaxMP+30\nIf failed, the item will be destroyed at a 50% rate. -2044418 - Scroll for Polearm for Accuracy 65% - Improves Accuracy on Polearms.\nSuccess Rate: 65%, Accuracy+3, DEX+2, Weapon Attack+1 -2044419 - Scroll for Polearm for Accuracy 15% - Improves Accuracy on Polearms.\nSuccess Rate: 15%, Accuracy+5, DEX+3, Weapon Attack+3 -2044318 - Scroll for Spears for Accuracy 65% - Improves Accuracy on Spears.\nSuccess Rate: 65%, Accuracy+3, DEX+2, Weapon Attack+1 -2044319 - Scroll for Spears for Accuracy 15% - Improves Accuracy on Spears.\nSuccess Rate: 15%, Accuracy+5, DEX+3, Weapon Attack+3 -2044218 - Scroll for Two-Handed BW for Accuracy 65% - Improves Accuracy on Two-Handed Blunt Weapons.\nSuccess Rate: 65%, Accuracy+3, DEX+2, Weapon Attack+1 -2044219 - Scroll for Two-Handed BW for Accuracy 15% - Improves Accuracy on Two-Handed Blunt Weapons.\nSuccess Rate: 15%, Accuracy+5, DEX+3, Weapon Attack+3 -2044118 - Scroll for Two-Handed Axe for Accuracy 65% - Improves Accuracy on Two-Handed Axe.\nSuccess Rate: 65%, Accuracy+3, DEX+2, Weapon Attack+1 -2044119 - Scroll for Two-Handed Axe for Accuracy 15% - Improves Accuracy on Two-Handed Axe.\nSuccess Rate: 15%, Accuracy+5, DEX+3, Weapon Attack+3 -2044026 - Scroll for Two-Handed Sword for Accuracy 65% - Improves Accuracy on Two-Handed Swords.\nSuccess Rate: 65%, Accuracy+3, DEX+2, Weapon Attack+1 -2044027 - Scroll for Two-Handed Sword for Accuracy 15% - Improves Accuracy on Two-Handed Swords.\nSuccess Rate: 15%, Accuracy+5, DEX+3, Weapon Attack+3 -2043218 - Scroll for One-Handed BW for Accuracy 65% - Improves Accuracy on One-Handed Blunt Weapons.\nSuccess Rate: 65%, Accuracy+3, DEX+2, Weapon Attack+1 -2043219 - Scroll for One-Handed BW for Accuracy 15% - Improves Accuracy on One-Handed Blunt Weapons.\nSuccess Rate: 15%, Accuracy+5, DEX+3, Weapon Attack+3 -2043118 - Scroll for One-Handed Axe for Accuracy 65% - Improves Accuracy on One-Handed Axe.\nSuccess Rate: 65%, Accuracy+3, DEX+2, Weapon Attack+1 -2043119 - Scroll for One-Handed Axe for Accuracy 15% - Improves Accuracy on One-Handed Axe.\nSuccess Rate: 15%, Accuracy+5, DEX+3, Weapon Attack+3 -2043024 - Scroll for One-Handed Sword for Accuracy 65% - Improves Accuracy on One-Handed Swords.\nSuccess Rate: 65%, Accuracy+3, DEX+2, Weapon Attack+1 -2043025 - Scroll for One-Handed Sword for Accuracy 15% - Improves Accuracy on One-Handed Swords.\nSuccess Rate: 15%, Accuracy+5, DEX+3, Weapon Attack+3 -2040937 - Scroll for Shield for LUK 65% - Improves LUK on Shields.\nSuccess Rate: 65%, LUK+2 -2040938 - Scroll for Shield for LUK 15% - Improves LUK on Shields.\nSuccess Rate: 15%, LUK+3 -2040939 - Scroll for Shield for HP 65% - Improves HP on Shields.\nSuccess Rate: 65%, MaxHP+15 -2040940 - Scroll for Shield for HP 15% - Improves HP on Shields.\nSuccess Rate: 15%, MaxHP+30 -2040941 - Scroll for Shield for STR 65% - Improves STR on Shields.\nSuccess Rate: 65%, STR+2 -2040942 - Scroll for Shield for STR 15% - Improves STR on Shields.\nSuccess Rate: 15%, STR+3 -2040831 - Scroll for Gloves for HP 65% - Improves HP on Gloves.\nSuccess Rate: 65%, MaxHP+15 -2040832 - Scroll for Gloves for HP 15% - Improves HP on Gloves.\nSuccess Rate: 15%, MaxHP+30 -2040631 - Scroll for Bottomwear for Jump 65% - Improves Jump on Bottomwear.\nSuccess Rate: 65%, Jump+2, Avoidability+1 -2040632 - Scroll for Bottomwear for Jump 15% - Improves Jump on Bottomwear.\nSuccess Rate: 15%, Jump+4, Avoidability+2 -2040633 - Scroll for Bottomwear for HP 65% - Improves HP on Bottomwear.\nSuccess Rate: 65%, MaxHP+15 -2040634 - Scroll for Bottomwear for HP 15% - Improves HP on Bottomwear.\nSuccess Rate: 15%, MaxHP+30 -2040635 - Scroll for Bottomwear for DEX 65% - Improves DEX on Bottomwear.\nSuccess Rate: 65%, DEX+2, Accuracy+1 -2040636 - Scroll for Bottomwear for DEX 15% - Improves DEX on Bottomwear.\nSuccess Rate: 15%, DEX+3, Accuracy+2, Speed+1 -2040540 - Scroll for Overall Armor for STR 65% - Improves STR on Overall Armor.\nSuccess Rate: 65%, STR+2, Weapon Attack+1 -2040541 - Scroll for Overall Armor for STR 15% - Improves STR on Overall Armor.\nSuccess Rate: 15%, STR+5, Weapon Attack+3, MaxHP+5 -2040431 - Scroll for Topwear for STR 65% - Improves STR on Topwear.\nSuccess Rate 65%, STR+2 -2040432 - Scroll for Topwear for STR 15% - Improves STR on Topwear.\nSuccess Rate 15%, STR+3 -2040433 - Scroll for Topwear for HP 65% - Improves HP on Topwear.\nSuccess Rate 65%, MaxHP + 15 -2040434 - Scroll for Topwear for HP 15% - Improves HP on Topwear.\nSuccess Rate 15%, MaxHP + 30 -2040435 - Scroll for Topwear for LUK 65% - Improves LUK on Topwear.\nSuccess Rate: 65%, LUK+2 -2040436 - Scroll for Topwear for LUK 15% - Improves LUK on Topwear.\nSuccess Rate: 15%, LUK+3 -2040335 - Scroll for Earring for DEX 65% - Improves DEX on Earrings.\nSuccess Rate: 65%, DEX+2 -2040336 - Scroll for Earring for DEX 15% - Improves DEX on Earrings.\nSuccess Rate: 15%, DEX+3 -2040337 - Scroll for Earring for LUK 65% - Improves LUK on Earrings.\nSuccess Rate: 65%, LUK+2 -2040338 - Scroll for Earring for LUK 15% - Improves LUK on Earrings.\nSuccess Rate: 15%, LUK+3 -2040339 - Scroll for Earring for HP 65% - Improves HP on Earrings.\nSuccess Rate: 65%, MaxHP+15 -2040340 - Scroll for Earring for HP 15% - Improves HP on Earrings.\nSuccess Rate: 15%, MaxHP+30 -2040043 - Scroll for Helmet for DEX 65% - Improves DEX on Helmets.\nSuccess Rate 65%, DEX+2 -2040044 - Scroll for Helmet for DEX 15% - Improves DEX on Helmets.\nSuccess Rate 15%, DEX+3 -2022620 - Handmade Sandwich - A sandwich made personally by Anna. Eat it in the morning to guarantee a sense of satisfaction all throughout the day. -2022621 - Tasty Milk - Fresh milk produced at the farm. \nRecovers around 100 HP. -2022622 - Squeezed Juice - Fresh juice produced at the farm. \nRecovers around 50 MP. -2022631 - Rose Scent - As you are surrounded by the fragrant scent of Roses, you get a strange headache and your feet start to feel heavy. Go see Lana before the scent disappears. -2022632 - Freesia Scent - As you are surrounded by the refreshing scent of Freesias, you get a strange headache and your feet start to feel heavy. Go see Lana before the scent disappears. -2022633 - Lavender Scent - As you are surrounded by the sweet scent of Lavenders, you get a strange headache and your feet start to feel heavy. Go see Lana before the scent disappears. -2012008 - Unripe Onyx Apple - A mysterious and unripe Onyx Apple. When consumed, it grants the following: ATT +60, Magic ATT +70, DEF +10 for 1 minute. diff --git a/tools/MapleIdRetriever/lib/fetch.txt b/tools/MapleIdRetriever/lib/fetch.txt deleted file mode 100644 index 7f21619401..0000000000 --- a/tools/MapleIdRetriever/lib/fetch.txt +++ /dev/null @@ -1,25 +0,0 @@ -Dark Cloud Foxtail -Pole Arm Forging Stimulator -Spear Forging Stimulator -Wand Production Stimulator - -Red Umbrella -Blue Moon -Thermometer - -Oaker Shouldermail Pants -Arc Staff -White Piettra Skirt -Red Moon Pants - -Mithril Ore -Aquamarine Ore -Diamond Ore -Dark Crystal Ore - -Kinoko Ramen (Pig Head) -Yakisoba -Fish Cake (Dish) -Tobi Throwing-Star -Dark Scroll for Overall Armor for DEF 70% -Dark Scroll for Dagger for ATT 30% \ No newline at end of file diff --git a/tools/MapleIdRetriever/lib/result.txt b/tools/MapleIdRetriever/lib/result.txt deleted file mode 100644 index 4e2f065af0..0000000000 --- a/tools/MapleIdRetriever/lib/result.txt +++ /dev/null @@ -1,26 +0,0 @@ -4000077 -4130009 -4130008 -4130010 - -1302025 -1032011 1041078 -1402014 - -1060077 -1382001 1382020 1382025 1382030 -1061080 -1061079 - -4010002 -4020002 -4020007 -4004004 - -2022019 -2022026 -2022022 - -2070004 * -2040510 -2043305 From 932ed9f7847428fa2b841fe5aef861058347bca9 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 11:08:16 +0200 Subject: [PATCH 21/36] Move MapleMapInfoRetriever to main module --- .../tools/mapletools/MapInfoRetriever.java | 157 +++++++++++++++ tools/MapleMapInfoRetriever/lib/MapReport.txt | 1 - .../MapleMapInfoRetriever.java | 183 ------------------ 3 files changed, 157 insertions(+), 184 deletions(-) create mode 100644 src/main/java/tools/mapletools/MapInfoRetriever.java delete mode 100644 tools/MapleMapInfoRetriever/lib/MapReport.txt delete mode 100644 tools/MapleMapInfoRetriever/src/maplemapinforetriever/MapleMapInfoRetriever.java diff --git a/src/main/java/tools/mapletools/MapInfoRetriever.java b/src/main/java/tools/mapletools/MapInfoRetriever.java new file mode 100644 index 0000000000..6c35a62a06 --- /dev/null +++ b/src/main/java/tools/mapletools/MapInfoRetriever.java @@ -0,0 +1,157 @@ +package tools.mapletools; + +import org.apache.commons.io.FileUtils; +import provider.wz.WZFiles; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * @author RonanLana + *

+ * The main objective of this tool is to locate all mapids that doesn't have + * the "info" node in their WZ node tree. + */ +public class MapInfoRetriever { + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("map_info_report.txt"); + private static final List missingInfo = new ArrayList<>(); + + private static BufferedReader bufferedReader = null; + private static byte status = 0; + private static boolean hasInfo; + + private static String getName(String token) { + int i, j; + char[] dest; + String d; + + i = token.lastIndexOf("name"); + i = token.indexOf("\"", i) + 1; //lower bound of the string + j = token.indexOf("\"", i); //upper bound + + dest = new char[50]; + token.getChars(i, j, dest, 0); + + d = new String(dest); + return (d.trim()); + } + + private static void forwardCursor(int st) { + String line = null; + + try { + while (status >= st && (line = bufferedReader.readLine()) != null) { + simpleToken(line); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void simpleToken(String token) { + if (token.contains("/imgdir")) { + status -= 1; + } else if (token.contains("imgdir")) { + status += 1; + } + } + + private static boolean translateToken(String token) { + String d; + int temp; + + if (token.contains("/imgdir")) { + status -= 1; + } else if (token.contains("imgdir")) { + if (status == 1) { + d = getName(token); + if (d.contains("info")) { + hasInfo = true; + return true; + } + + temp = status; + forwardCursor(temp); + } + + status += 1; + } + + return false; + } + + private static void searchMapDirectory(int mapArea) { + final File mapDirectory = new File(WZFiles.MAP.getFilePath() + "/Map/Map" + mapArea); + try { + Iterator iter = FileUtils.iterateFiles(mapDirectory, new String[]{"xml"}, true); + System.out.println("Parsing map area " + mapArea); + + while (iter.hasNext()) { + File file = iter.next(); + searchMapFile(file); + } + } catch (UncheckedIOException e) { + System.err.println("Directory " + mapDirectory.getPath() + " does not exist"); + } + } + + private static void searchMapFile(File file) { + // This will reference one line at a time + String line = null; + + try { + InputStreamReader fileReader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8); + bufferedReader = new BufferedReader(fileReader); + + hasInfo = false; + status = 0; + + while ((line = bufferedReader.readLine()) != null) { + if (translateToken(line)) { + break; + } + } + + if (!hasInfo) { + missingInfo.add(Integer.valueOf(file.getName().split(".img.xml")[0])); + } + + bufferedReader.close(); + fileReader.close(); + } catch (IOException ex) { + System.out.println("Error reading file '" + file.getName() + "'"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void writeReport() { + try { + PrintWriter printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); + + if (!missingInfo.isEmpty()) { + for (Integer i : missingInfo) { + printWriter.println(i); + } + } else { + printWriter.println("All map files contain 'info' node."); + } + + printWriter.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + for (int i = 0; i <= 9; i++) { + searchMapDirectory(i); + } + writeReport(); + } + +} + diff --git a/tools/MapleMapInfoRetriever/lib/MapReport.txt b/tools/MapleMapInfoRetriever/lib/MapReport.txt deleted file mode 100644 index ab46af9362..0000000000 --- a/tools/MapleMapInfoRetriever/lib/MapReport.txt +++ /dev/null @@ -1 +0,0 @@ -All map files contains 'info' node. diff --git a/tools/MapleMapInfoRetriever/src/maplemapinforetriever/MapleMapInfoRetriever.java b/tools/MapleMapInfoRetriever/src/maplemapinforetriever/MapleMapInfoRetriever.java deleted file mode 100644 index f153f36e18..0000000000 --- a/tools/MapleMapInfoRetriever/src/maplemapinforetriever/MapleMapInfoRetriever.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package maplemapinforetriever; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import org.apache.commons.io.FileUtils; - -/** - * - * @author RonanLana - * - * The main objective of this tool is to locate all mapids that doesn't have - * the "info" node in their WZ node tree. - */ -public class MapleMapInfoRetriever { - static String mapWzPath = "../../wz/Map.wz/Map"; - static String newFile = "lib/MapReport.txt"; - - static List missingInfo = new ArrayList<>(); - - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - static byte status = 0; - static boolean hasInfo; - - private static String getName(String token) { - int i, j; - char[] dest; - String d; - - i = token.lastIndexOf("name"); - i = token.indexOf("\"", i) + 1; //lower bound of the string - j = token.indexOf("\"", i); //upper bound - - dest = new char[50]; - token.getChars(i, j, dest, 0); - - d = new String(dest); - return(d.trim()); - } - - private static void forwardCursor(int st) { - String line = null; - - try { - while(status >= st && (line = bufferedReader.readLine()) != null) { - simpleToken(line); - } - } - catch(Exception e) { - e.printStackTrace(); - } - } - - private static void simpleToken(String token) { - if(token.contains("/imgdir")) { - status -= 1; - } - else if(token.contains("imgdir")) { - status += 1; - } - } - - private static boolean translateToken(String token) { - String d; - int temp; - - if(token.contains("/imgdir")) { - status -= 1; - } - else if(token.contains("imgdir")) { - if(status == 1) { - d = getName(token); - if(d.contains("info")) { - hasInfo = true; - return true; - } - - temp = status; - forwardCursor(temp); - } - - status += 1; - } - - return false; - } - - private static void searchMapDirectory(int mapArea) { - try { - Iterator iter = FileUtils.iterateFiles(new File(mapWzPath + "/Map" + mapArea), new String[]{"xml"}, true); - System.out.println("Parsing map area " + mapArea); - - while(iter.hasNext()) { - File file = (File) iter.next(); - searchMapFile(file); - } - } catch(IllegalArgumentException e) {} - } - - private static void searchMapFile(File file) { - // This will reference one line at a time - String line = null; - - try { - fileReader = new InputStreamReader(new FileInputStream(file), "UTF-8"); - bufferedReader = new BufferedReader(fileReader); - - hasInfo = false; - status = 0; - - while((line = bufferedReader.readLine()) != null) { - if(translateToken(line)) { - break; - } - } - - if(!hasInfo) missingInfo.add(Integer.valueOf(file.getName().split(".img.xml")[0])); - - bufferedReader.close(); - fileReader.close(); - } - - catch(IOException ex) { - System.out.println("Error reading file '" + file.getName() + "'"); - } - catch(Exception e) { - e.printStackTrace(); - } - } - - private static void writeReport() { - try { - printWriter = new PrintWriter(newFile, "UTF-8"); - - if(!missingInfo.isEmpty()) { - for(Integer i : missingInfo) { - printWriter.println(i); - } - } else { - printWriter.println("All map files contains 'info' node."); - } - - printWriter.close(); - } catch(IOException e) { - e.printStackTrace(); - } - } - - public static void main(String[] args) { - for(int i = 0; i < 10; i++) { - searchMapDirectory(i); - } - writeReport(); - } - -} From 6d49ab45c34a3b36ecd2c60f86454f9449d3038b Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 11:15:03 +0200 Subject: [PATCH 22/36] Move MapleWorldMapChecker to main module --- .../tools/mapletools/WorldmapChecker.java | 203 +++++++----------- tools/MapleWorldmapChecker/lib/Report.txt | 76 ------- .../src/mapleworldmapchecker/Pair.java | 121 ----------- 3 files changed, 83 insertions(+), 317 deletions(-) rename tools/MapleWorldmapChecker/src/mapleworldmapchecker/MapleWorldmapChecker.java => src/main/java/tools/mapletools/WorldmapChecker.java (60%) delete mode 100644 tools/MapleWorldmapChecker/lib/Report.txt delete mode 100644 tools/MapleWorldmapChecker/src/mapleworldmapchecker/Pair.java diff --git a/tools/MapleWorldmapChecker/src/mapleworldmapchecker/MapleWorldmapChecker.java b/src/main/java/tools/mapletools/WorldmapChecker.java similarity index 60% rename from tools/MapleWorldmapChecker/src/mapleworldmapchecker/MapleWorldmapChecker.java rename to src/main/java/tools/mapletools/WorldmapChecker.java index e4c4724518..5fda287730 100644 --- a/tools/MapleWorldmapChecker/src/mapleworldmapchecker/MapleWorldmapChecker.java +++ b/src/main/java/tools/mapletools/WorldmapChecker.java @@ -1,57 +1,32 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package mapleworldmapchecker; +import provider.wz.WZFiles; +import tools.Pair; import java.io.*; +import java.nio.charset.StandardCharsets; import java.util.*; -import java.util.Map.Entry; /** - * * @author RonanLana - - This application parses the Map.wz file inputted and reports areas (mapids) that are supposed to be referenced - throughout the map tree (area map -> continent map -> world map) but are currently missing. - + *

+ * This application parses the Map.wz file inputted and reports areas (mapids) that are supposed to be referenced + * throughout the map tree (area map -> continent map -> world map) but are currently missing. */ -public class MapleWorldmapChecker { - - static String newFile = "lib/Report.txt"; - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static String worldmapPath = "../../wz/Map.wz/WorldMap"; - static int initialStringLength = 50; - - static Map> worldMapids = new HashMap<>(); - static Map parentWorldmaps = new HashMap<>(); - static Set rootWorldmaps = new HashSet<>(); - //static String rootWorldmap = ""; - - static Set currentWorldMapids; - static String currentParent; - - static byte status = 0; - static boolean isInfo; - +public class WorldmapChecker { + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("worldmap_report.txt"); + private static final int INITIAL_STRING_LENGTH = 50; + private static final Map> worldMapids = new HashMap<>(); + private static final Map parentWorldmaps = new HashMap<>(); + private static final Set rootWorldmaps = new HashSet<>(); + + private static PrintWriter printWriter = null; + private static BufferedReader bufferedReader = null; + private static Set currentWorldMapids; + private static String currentParent; + private static byte status = 0; + private static boolean isInfo; + private static String getName(String token) { int i, j; char[] dest; @@ -61,13 +36,13 @@ public class MapleWorldmapChecker { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static String getValue(String token) { int i, j; char[] dest; @@ -77,68 +52,57 @@ public class MapleWorldmapChecker { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static void forwardCursor(int st) { String line = null; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { simpleToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } private static void simpleToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; } } - + private static void translateToken(String token) { String d; - - if(token.contains("/imgdir")) { + + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; - + if (status == 2) { d = getName(token); - + switch (d) { - case "MapList": - isInfo = false; - break; - - case "info": - isInfo = true; - break; - - default: - forwardCursor(status); + case "MapList" -> isInfo = false; + case "info" -> isInfo = true; + default -> forwardCursor(status); } } else if (status == 4) { d = getName(token); - + if (!d.contentEquals("mapNo")) { forwardCursor(status); } } - } - else { + } else { if (status == 4) { currentWorldMapids.add(Integer.valueOf(getValue(token))); } else if (status == 2 && isInfo) { @@ -151,64 +115,63 @@ public class MapleWorldmapChecker { } } catch (Exception e) { System.out.println("failed '" + token + "'"); - + } } } } - + private static void parseWorldmapFile(File worldmapFile) throws IOException { String line; - - fileReader = new InputStreamReader(new FileInputStream(worldmapFile), "UTF-8"); + + InputStreamReader fileReader = new InputStreamReader(new FileInputStream(worldmapFile), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - + currentParent = ""; status = 0; - + currentWorldMapids = new HashSet<>(); - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { translateToken(line); } - + String worldmapName = worldmapFile.getName(); worldMapids.put(worldmapName, currentWorldMapids); - - if (!currentParent.isEmpty()) parentWorldmaps.put(worldmapName, currentParent); - else rootWorldmaps.add(worldmapName); + + if (!currentParent.isEmpty()) { + parentWorldmaps.put(worldmapName, currentParent); + } else { + rootWorldmaps.add(worldmapName); + } bufferedReader.close(); fileReader.close(); } - + private static void parseWorldmapDirectory() { - System.out.println("Parsing directory '" + worldmapPath + "'"); - File folder = new File(worldmapPath); + File folder = new File(WZFiles.MAP.getFilePath(), "WorldMap"); + System.out.println("Parsing directory '" + folder.getPath() + "'"); for (File file : folder.listFiles()) { if (file.isFile()) { try { parseWorldmapFile(file); - } - catch(FileNotFoundException ex) { + } catch (FileNotFoundException ex) { System.out.println("Unable to open worldmap file " + file.getAbsolutePath() + "."); - } - catch(IOException ex) { + } catch (IOException ex) { System.out.println("Error reading worldmap file " + file.getAbsolutePath() + "."); - } - - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } } } - + private static void printReportFileHeader() { printWriter.println(" # Report File autogenerated from the MapleWorldmapChecker feature by Ronan Lana."); printWriter.println(" # Generated data takes into account several data info from the server-side WZ.xmls."); printWriter.println(); } - + private static void printReportFileResults(List>>> results) { printWriter.println("Missing mapid references in top hierarchy:\n"); for (Pair>> res : results) { @@ -221,32 +184,32 @@ public class MapleWorldmapChecker { printWriter.println("\n"); } } - + private static void verifyWorldmapTreeMapids() { try { - printWriter = new PrintWriter(newFile, "UTF-8"); + printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); printReportFileHeader(); - + if (rootWorldmaps.size() > 1) { printWriter.println("[WARNING] Detected several root worldmaps: " + rootWorldmaps + "\n"); } - + Set worldmaps = new HashSet<>(parentWorldmaps.keySet()); worldmaps.addAll(rootWorldmaps); - + Map> tempMapids = new HashMap<>(worldMapids.size()); - for (Entry> e : worldMapids.entrySet()) { + for (Map.Entry> e : worldMapids.entrySet()) { tempMapids.put(e.getKey(), new HashSet<>(e.getValue())); } - + Map>> unreferencedMapids = new HashMap<>(); - + for (String s : worldmaps) { List> currentUnreferencedMapids = new ArrayList<>(); for (Integer i : tempMapids.get(s)) { String parent = parentWorldmaps.get(s); - + while (parent != null) { Set mapids = worldMapids.get(parent); if (!mapids.contains(i)) { @@ -255,39 +218,39 @@ public class MapleWorldmapChecker { } else { tempMapids.get(parent).remove(i); } - + parent = parentWorldmaps.get(parent); } } - + if (!currentUnreferencedMapids.isEmpty()) { unreferencedMapids.put(s, currentUnreferencedMapids); } } - + if (!unreferencedMapids.isEmpty()) { List>>> unreferencedEntries = new ArrayList<>(20); - for (Entry>> e : unreferencedMapids.entrySet()) { + for (Map.Entry>> e : unreferencedMapids.entrySet()) { List> list = new ArrayList<>(e.getValue()); - Collections.sort(list, (o1, o2) -> o1.getLeft().compareTo(o2.getLeft())); + list.sort((o1, o2) -> o1.getLeft().compareTo(o2.getLeft())); unreferencedEntries.add(new Pair<>(e.getKey(), list)); } - - Collections.sort(unreferencedEntries, (o1, o2) -> o1.getLeft().compareTo(o2.getLeft())); + + unreferencedEntries.sort((o1, o2) -> o1.getLeft().compareTo(o2.getLeft())); printReportFileResults(unreferencedEntries); } - + printWriter.close(); } catch (Exception e) { e.printStackTrace(); } } - + public static void main(String[] args) { parseWorldmapDirectory(); verifyWorldmapTreeMapids(); } - } + diff --git a/tools/MapleWorldmapChecker/lib/Report.txt b/tools/MapleWorldmapChecker/lib/Report.txt deleted file mode 100644 index 781ea1284f..0000000000 --- a/tools/MapleWorldmapChecker/lib/Report.txt +++ /dev/null @@ -1,76 +0,0 @@ - # Report File autogenerated from the MapleWorldmapChecker feature by Ronan Lana. - # Generated data takes into account several data info from the server-side WZ.xmls. - -Missing mapid references in top hierarchy: - -'WorldMap000.img.xml': - 1020000:WorldMap.img.xml - - -'WorldMap010.img.xml': - 101000400:WorldMap.img.xml - 105040306:WorldMap.img.xml - 105050500:WorldMap.img.xml - 193000000:WorldMap.img.xml - 680000100:WorldMap.img.xml - 680000110:WorldMap.img.xml - 680000200:WorldMap.img.xml - 680000210:WorldMap.img.xml - 680000300:WorldMap.img.xml - 680000400:WorldMap.img.xml - 680000401:WorldMap.img.xml - 680010000:WorldMap.img.xml - 680010100:WorldMap.img.xml - - -'WorldMap012.img.xml': - 107000500:WorldMap010.img.xml - - -'WorldMap014.img.xml': - 106021401:WorldMap010.img.xml - 106021402:WorldMap010.img.xml - 106021800:WorldMap010.img.xml - - -'WorldMap020.img.xml': - 200080101:WorldMap.img.xml - 200082301:WorldMap.img.xml - 211040401:WorldMap.img.xml - - -'WorldMap021.img.xml': - 280030000:WorldMap020.img.xml - - -'WorldMap030.img.xml': - 220010001:WorldMap.img.xml - 220011001:WorldMap.img.xml - 221022100:WorldMap.img.xml - 221022200:WorldMap.img.xml - 222010310:WorldMap.img.xml - - -'WorldMap050.img.xml': - 240040201:WorldMap.img.xml - 240040301:WorldMap.img.xml - - -'WorldMap060.img.xml': - 251000100:WorldMap.img.xml - 251010404:WorldMap.img.xml - - -'WorldMap100.img.xml': - 140020110:WorldMap.img.xml - - -'WorldMap142.img.xml': - 600010002:WorldMap.img.xml - - -'WorldMap211.img.xml': - 801040100:WorldMap210.img.xml - 801040101:WorldMap210.img.xml - - diff --git a/tools/MapleWorldmapChecker/src/mapleworldmapchecker/Pair.java b/tools/MapleWorldmapChecker/src/mapleworldmapchecker/Pair.java deleted file mode 100644 index 04c8fcdf39..0000000000 --- a/tools/MapleWorldmapChecker/src/mapleworldmapchecker/Pair.java +++ /dev/null @@ -1,121 +0,0 @@ -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 ~ 2010 Patrick Huy -Matthias Butz -Jan Christian Meyer - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License version 3 -as published by the Free Software Foundation. You may not use, modify -or distribute this program under any other version of the -GNU Affero General Public License. - -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 . - */ -package mapleworldmapchecker; - -/** - * Represents a pair of values. - * - * @author Frz - * @since Revision 333 - * @version 1.0 - * - * @param The type of the left value. - * @param The type of the right value. - */ -public class Pair { - - public E left; - public F right; - - /** - * Class constructor - pairs two objects together. - * - * @param left The left object. - * @param right The right object. - */ - public Pair(E left, F right) { - this.left = left; - this.right = right; - } - - /** - * Gets the left value. - * - * @return The left value. - */ - public E getLeft() { - return left; - } - - /** - * Gets the right value. - * - * @return The right value. - */ - public F getRight() { - return right; - } - - /** - * Turns the pair into a string. - * - * @return Each value of the pair as a string joined with a colon. - */ - @Override - public String toString() { - return left.toString() + ":" + right.toString(); - } - - /** - * Gets the hash code of this pair. - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((left == null) ? 0 : left.hashCode()); - result = prime * result + ((right == null) ? 0 : right.hashCode()); - return result; - } - - /** - * Checks to see if two pairs are equal. - */ - @SuppressWarnings("unchecked") - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Pair other = (Pair) obj; - if (left == null) { - if (other.left != null) { - return false; - } - } else if (!left.equals(other.left)) { - return false; - } - if (right == null) { - if (other.right != null) { - return false; - } - } else if (!right.equals(other.right)) { - return false; - } - return true; - } -} \ No newline at end of file From cbb0f7f09bdffcc7c8cef90af58c924677571069 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 11:31:22 +0200 Subject: [PATCH 23/36] Move MapleGachaponItemidRetriever to main module --- .../mapletools/GachaponItemIdRetriever.java | 233 +++++++--------- .../lib/gachapons/aquarium.txt | 98 ------- .../lib/gachapons/el_nath.txt | 216 --------------- .../lib/gachapons/ellinia.txt | 255 ------------------ .../lib/gachapons/henesys.txt | 174 ------------ .../lib/gachapons/kerning_city.txt | 117 -------- .../lib/gachapons/leafre.txt | 113 -------- .../lib/gachapons/ludibrium.txt | 159 ----------- .../lib/gachapons/mushroom_shrine.txt | 119 -------- .../lib/gachapons/perion.txt | 117 -------- .../lib/gachapons/showa_spa_female.txt | 69 ----- .../lib/gachapons/showa_spa_male.txt | 109 -------- .../lib/gachapons/sleepywood.txt | 165 ------------ tools/input/.gitignore | 3 +- .../lib => input}/gachapon_items.txt | 0 15 files changed, 104 insertions(+), 1843 deletions(-) rename tools/MapleGachaponItemidRetriever/src/maplegachaponitemidretriever/MapleGachaponItemidRetriever.java => src/main/java/tools/mapletools/GachaponItemIdRetriever.java (67%) delete mode 100644 tools/MapleGachaponItemidRetriever/lib/gachapons/aquarium.txt delete mode 100644 tools/MapleGachaponItemidRetriever/lib/gachapons/el_nath.txt delete mode 100644 tools/MapleGachaponItemidRetriever/lib/gachapons/ellinia.txt delete mode 100644 tools/MapleGachaponItemidRetriever/lib/gachapons/henesys.txt delete mode 100644 tools/MapleGachaponItemidRetriever/lib/gachapons/kerning_city.txt delete mode 100644 tools/MapleGachaponItemidRetriever/lib/gachapons/leafre.txt delete mode 100644 tools/MapleGachaponItemidRetriever/lib/gachapons/ludibrium.txt delete mode 100644 tools/MapleGachaponItemidRetriever/lib/gachapons/mushroom_shrine.txt delete mode 100644 tools/MapleGachaponItemidRetriever/lib/gachapons/perion.txt delete mode 100644 tools/MapleGachaponItemidRetriever/lib/gachapons/showa_spa_female.txt delete mode 100644 tools/MapleGachaponItemidRetriever/lib/gachapons/showa_spa_male.txt delete mode 100644 tools/MapleGachaponItemidRetriever/lib/gachapons/sleepywood.txt rename tools/{MapleGachaponItemidRetriever/lib => input}/gachapon_items.txt (100%) diff --git a/tools/MapleGachaponItemidRetriever/src/maplegachaponitemidretriever/MapleGachaponItemidRetriever.java b/src/main/java/tools/mapletools/GachaponItemIdRetriever.java similarity index 67% rename from tools/MapleGachaponItemidRetriever/src/maplegachaponitemidretriever/MapleGachaponItemidRetriever.java rename to src/main/java/tools/mapletools/GachaponItemIdRetriever.java index c539bd4f52..0761d804a1 100644 --- a/tools/MapleGachaponItemidRetriever/src/maplegachaponitemidretriever/MapleGachaponItemidRetriever.java +++ b/src/main/java/tools/mapletools/GachaponItemIdRetriever.java @@ -1,68 +1,36 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2018 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package maplegachaponitemidretriever; +package tools.mapletools; import java.io.*; -import java.sql.*; +import java.nio.charset.StandardCharsets; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /** - * * @author RonanLana - * + *

* This application reads metadata for the gachapons found on the "gachapon_items.txt" * recipe file, then checks up the Handbook DB (installed through MapleIdRetriever) * and translates the item names from the recipe file into their respective itemids. * The translated itemids are then stored in specific gachapon files inside the * "lib/gachapons" folder. - * + *

* Estimated parse time: 1 minute */ -public class MapleGachaponItemidRetriever { +public class GachaponItemIdRetriever { + private static final File INPUT_FILE = ToolConstants.getInputFile("gachapon_items.txt"); + private static final File OUTPUT_DIRECTORY = ToolConstants.getOutputFile("gachapons"); + private static final Connection con = SimpleDatabaseConnection.getConnection(); + private static final Pattern pattern = Pattern.compile("(\\d*)%"); + private static final int[] scrollsChances = new int[]{10, 15, 30, 60, 65, 70, 100}; + private static final Map> scrollItemids = new HashMap<>(); + + private static PrintWriter printWriter = null; - static String host = "jdbc:mysql://localhost:3306/cosmic"; - static String driver = "com.mysql.jdbc.Driver"; - static String username = "cosmic_server"; - static String password = "snailshell"; - - static Connection con = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - static PrintWriter printWriter = null; - - // ------- SET-UP section arguments -------- - - static String directoryName = "./handbook/"; - - // ------- SEARCH section arguments -------- - - static String inputName = "lib/gachapon_items.txt"; - static String outputPath = "lib/gachapons/"; - - static Pattern p = Pattern.compile("(\\d*)%"); - static int[] scrollsChances = new int[]{10, 15, 30, 60, 65, 70, 100}; - - static Map> scrollItemids = new HashMap<>(); - private static void insertGachaponScrollItemid(Integer id, String name, String description, boolean both) { GachaponScroll gachaScroll = getGachaponScroll(name, description, both); @@ -74,25 +42,25 @@ public class MapleGachaponItemidRetriever { list.add(id); } - + private static void loadHandbookUseNames() throws SQLException { PreparedStatement ps = con.prepareStatement("SELECT * FROM `handbook` WHERE `id` >= 2040000 AND `id` < 2050000 ORDER BY `id` ASC;"); ResultSet rs = ps.executeQuery(); - while(rs.next()) { + while (rs.next()) { Integer id = rs.getInt("id"); String name = rs.getString("name"); - + if (isUpgradeScroll(name)) { String description = rs.getString("description"); insertGachaponScrollItemid(id, name, description, false); insertGachaponScrollItemid(id, name, description, true); } } - + rs.close(); ps.close(); - + /* for (Entry> e : scrollItemids.entrySet()) { System.out.println(e); @@ -100,41 +68,41 @@ public class MapleGachaponItemidRetriever { System.out.println("------------"); */ } - + private static class GachaponScroll { private String header; private String target; private String buff; private int prop; - + private GachaponScroll(GachaponScroll from, int prop) { this.header = from.header; this.target = from.target; this.buff = from.buff; this.prop = prop; } - + private GachaponScroll(String name, String description, boolean both) { String[] params = name.split(" for "); if (params.length < 3) { return; } - + String header = both ? "scroll" : " " + params[0]; String target = params[1]; int prop = 0; String buff = params[2]; - Matcher m = p.matcher(buff); + Matcher m = pattern.matcher(buff); if (m.find()) { - prop = Integer.valueOf(m.group(1)); + prop = Integer.parseInt(m.group(1)); buff = buff.substring(0, m.start() - 1).trim(); } else { - m = p.matcher(description); - + m = pattern.matcher(description); + if (m.find()) { - prop = Integer.valueOf(m.group(1)); + prop = Integer.parseInt(m.group(1)); } } @@ -143,45 +111,54 @@ public class MapleGachaponItemidRetriever { buff = buff.substring(0, idx); } buff = buff.replace(".", ""); - + this.header = header; this.target = target; this.buff = buff; this.prop = prop; } - - @Override + + @Override public int hashCode() { int result = prop ^ (prop >>> 32); - result = 31 * result + (header != null ? header.hashCode() : 0); + result = 31 * result + (header != null ? header.hashCode() : 0); result = 31 * result + (target != null ? target.hashCode() : 0); result = 31 * result + (buff != null ? buff.hashCode() : 0); - return result; + return result; } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - GachaponScroll sc = (GachaponScroll) o; - if (header != null ? !header.equals(sc.header) : sc.header != null) return false; - if (target != null ? !target.equals(sc.target) : sc.target != null) return false; - if (buff != null ? !buff.equals(sc.buff) : sc.buff != null) return false; - if (prop != sc.prop) return false; - return true; + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + GachaponScroll sc = (GachaponScroll) o; + if (header != null ? !header.equals(sc.header) : sc.header != null) { + return false; + } + if (target != null ? !target.equals(sc.target) : sc.target != null) { + return false; + } + if (buff != null ? !buff.equals(sc.buff) : sc.buff != null) { + return false; + } + return prop == sc.prop; } - + @Override public String toString() { return header + " for " + target + " for " + buff + " - " + prop + "%"; } - + } - + private static String getGachaponScrollResults(String line, boolean both) { String str = ""; List gachaScrollList; - + GachaponScroll gachaScroll = getGachaponScroll(line, "", both); if (gachaScroll.prop != 0) { gachaScrollList = Collections.singletonList(gachaScroll); @@ -192,7 +169,7 @@ public class MapleGachaponItemidRetriever { gachaScrollList.add(new GachaponScroll(gachaScroll, prop)); } } - + for (GachaponScroll gs : gachaScrollList) { List gachaItemids = scrollItemids.get(gs); if (gachaItemids != null) { @@ -209,10 +186,10 @@ public class MapleGachaponItemidRetriever { } } } - + return str; } - + private static GachaponScroll getGachaponScroll(String name, String description, boolean both) { name = name.toLowerCase(); name = name.replace("for acc ", "for accuracy "); @@ -222,22 +199,22 @@ public class MapleGachaponItemidRetriever { name = name.replace("for attack", "for att"); name = name.replace("1-handed", "one-handed"); name = name.replace("2-handed", "two-handed"); - + return new GachaponScroll(name, description, both); } - + private static boolean isUpgradeScroll(String name) { return name.matches("^(([D|d]ark )?[S|s]croll for).*"); } - + private static void fetchLineOnMapleHandbook(String line, String rarity) throws SQLException { String str = ""; if (!isUpgradeScroll(line)) { - PreparedStatement ps = con.prepareStatement("SELECT `id` FROM `handbook` WHERE `name` LIKE ? COLLATE latin1_general_ci ORDER BY `id` ASC;"); + PreparedStatement ps = con.prepareStatement("SELECT `id` FROM `handbook` WHERE `name` LIKE ? ORDER BY `id` ASC;"); ps.setString(1, line); ResultSet rs = ps.executeQuery(); - while(rs.next()) { + while (rs.next()) { int id = rs.getInt("id"); str += Integer.toString(id); @@ -250,37 +227,37 @@ public class MapleGachaponItemidRetriever { str += getGachaponScrollResults(line, false); if (str.isEmpty()) { str += getGachaponScrollResults(line, true); - + if (str.isEmpty()) { System.out.println("NONE for '" + line + "' : " + getGachaponScroll(line, "", false)); } } } - + if (str.isEmpty()) { str += line; } - + if (rarity != null) { str += ("- " + rarity); } printWriter.println(str); } - + private static void fetchDataOnMapleHandbook() throws SQLException { String line; - + try { - fileReader = new InputStreamReader(new FileInputStream(inputName), "UTF-8"); - bufferedReader = new BufferedReader(fileReader); - + InputStreamReader fileReader = new InputStreamReader(new FileInputStream(INPUT_FILE), StandardCharsets.UTF_8); + BufferedReader bufferedReader = new BufferedReader(fileReader); + int skip = 0; boolean lineHeader = false; - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { if (skip > 0) { skip--; - + if (lineHeader) { if (!line.isEmpty()) { lineHeader = false; @@ -291,14 +268,19 @@ public class MapleGachaponItemidRetriever { } else if (line.isEmpty()) { printWriter.println(""); } else if (line.startsWith("Gachapon ")) { - String s[] = line.split("� "); + String[] s = line.split("� "); String gachaponName = s[s.length - 1]; gachaponName = gachaponName.replace(" ", "_"); gachaponName = gachaponName.toLowerCase(); - - if (printWriter != null) printWriter.close(); - printWriter = new PrintWriter(outputPath + gachaponName + ".txt", "UTF-8"); - + + if (printWriter != null) { + printWriter.close(); + } + File outputFile = new File(OUTPUT_DIRECTORY, gachaponName + ".txt"); + setupDirectories(outputFile); + + printWriter = new PrintWriter(outputFile, StandardCharsets.UTF_8); + skip = 2; lineHeader = true; } else if (line.startsWith(".")) { @@ -316,44 +298,33 @@ public class MapleGachaponItemidRetriever { } } - if (printWriter != null) printWriter.close(); + if (printWriter != null) { + printWriter.close(); + } bufferedReader.close(); fileReader.close(); - } - catch(FileNotFoundException ex) { - System.out.println(ex.getMessage()); - } - catch(IOException ex) { + } catch (IOException ex) { System.out.println(ex.getMessage()); + ex.printStackTrace(); } } - + + private static void setupDirectories(File file) { + if (!file.getParentFile().exists()) { + file.getParentFile().mkdirs(); + } + } + public static void main(String[] args) { - try { - Class.forName(driver).newInstance(); - con = DriverManager.getConnection(host, username, password); - loadHandbookUseNames(); fetchDataOnMapleHandbook(); con.close(); - } - - catch(SQLException e) { + } catch (SQLException e) { System.out.println("Error: invalid SQL syntax"); System.out.println(e.getMessage()); } - - catch(ClassNotFoundException e) { - System.out.println("Error: could not find class"); - System.out.println(e.getMessage()); - } - - catch(InstantiationException | IllegalAccessException e) { - System.out.println("Error: instantiation failure"); - System.out.println(e.getMessage()); - } } - } + diff --git a/tools/MapleGachaponItemidRetriever/lib/gachapons/aquarium.txt b/tools/MapleGachaponItemidRetriever/lib/gachapons/aquarium.txt deleted file mode 100644 index d96deb4d5c..0000000000 --- a/tools/MapleGachaponItemidRetriever/lib/gachapons/aquarium.txt +++ /dev/null @@ -1,98 +0,0 @@ - -Scroll: -2040605 -2040626 -2040609 -2040607 -2041029 -2041027 -2041031 -2041037 -2041033 -2041039 -2041041 -2041035 -2040811 - uncommon -2040809 -2040813 -2040815 - uncommon -2040015 -2040009 -2040011 -2040013 -2040509 -2040521 -2040519 -2040507 -2040905 -2040909 -2040907 -2040713 -2040715 -2040717 -2040405 -2040409 -2040407 -2040426 -2040303 -2040307 -2040309 -2044505 -2044705 -2044605 -2043305 -2043105 -2043205 -2043005 -2043007 -2044405 -2044305 -2043805 -2044105 -2044205 -2044005 -2043705 - -Useable drop: -2012000 -2000004 2000012 2002012 2022175 2022456 -2020008 -2000005 2000019 2002013 2022176 2022457 -2012002 -2101001 - uncommon -2101004 -2101005 -2101002 -2101003 -4006000 - -Warrior equipment: -1092014 -1402017 - -Magician equipment: -1002037 -1002034 -1002064 -1002038 -1382037 -1372000 -1002013 -1002035 -1002065 -1382000 - -Bowman equipment: -1452018 - -Thief equipment: -1472010 1472034 1472039 1472045 -1002175 -1472017 -1472025 1472036 1472041 1472047 - -Pirate Scroll: -2044901 - -Pirate equipment: -1002637 diff --git a/tools/MapleGachaponItemidRetriever/lib/gachapons/el_nath.txt b/tools/MapleGachaponItemidRetriever/lib/gachapons/el_nath.txt deleted file mode 100644 index 2060fce7e0..0000000000 --- a/tools/MapleGachaponItemidRetriever/lib/gachapons/el_nath.txt +++ /dev/null @@ -1,216 +0,0 @@ - -Scroll: -2041012 -2048003 -[2043800 2043803 2043812 ] -2043301 -2040301 -[2040804 2040826 ]- uncommon -2043101 -2043201 -2043001 -2044301 -2043801 -2044201 -2043701 -2044502 -2041011 -2041014 -2044602 -2043302 -2040805 - uncommon -2043202 -2043002 -2048005 -2044402 -2044302 -2043802 -2044102 -2044202 -2043702 - -Useable drop: -2340000 - uncommon -2000004 2000012 2002012 2022175 2022456 -2000005 2000019 2002013 2022176 2022457 - -Common equipment: -1402010 -1032003 -1442013 -1432009 -1302022 -1302029 -1322021 -1302026 -1442017 -1322023 -1102011 -1032008 4031568 -1322026 -1442016 -1312000 -1032007 -1322025 -1322027 -1032020 -1442015 -1432017 -1302027 -1302049 -1372006 -1032022 -1032021 -1372004 -1332020 -1322007 -1032006 -1302028 -1322003 1702020 -1302007 -1092030 -1302021 -1322024 -1322012 -1032005 -1322022 -1032013 -1302025 -1302013 -1032017 -1032002 -1032001 -1302017 -1432018 -1442012 -1302000 -1032000 -1102013 -1442022 -1372005 -1442021 -1032009 -1302016 - -Warrior equipment: -1442003 -1312007 -1402008 -1312008 1312018 1312022 1312026 -1412008 1412015 1412019 1412024 -1442009 -1302004 -1312006 -1442016 -1402012 1402022 1402027 1402033 -1302003 -1312005 -1432002 1432019 1432024 1432031 -1432001 -1302008 1302038 1302043 1302050 -1040030 -1402015 1402023 1402028 1402034 -1322015 -1432006 1432021 1432026 1432033 -1322002 -1302010 1302039 1302044 1302051 -1322017 1322036 1322041 1322047 -1402003 1402020 1402025 1402031 -1402006 -1322000 -1422001 -1442001 -1422004 -1412004 -1322009 -1322011 -1442000 -1412005 -1402002 1402019 1402024 1402030 -1432004 1432020 1432025 1432032 -1442010 1442032 1442036 1442041 -1422008 -1442007 -1422009 1422016 1422020 1422024 -1322019 1322038 1322043 1322049 -1412003 1412013 1412017 1412022 -1412007 1412014 1412018 1412023 -1302009 -1412000 -1322014 1322035 1322040 1322046 -1402001 -1402007 -1432005 - -Magician equipment: -1382001 1382020 1382025 1382030 -1372007 1372019 1372023 1372028 -1382010 1382023 1382028 1382033 -1382007 1382022 1382027 1382032 -1372000 -1372003 -1382011 -1382006 1382021 1382026 1382031 -1382000 - -Bowman equipment: -1452004 1452029 1452034 1452040 -1452000 -1452010 -1452015 1452031 1452036 1452042 -1452014 -1462012 -1462010 -1452017 -1462000 1462023 1462028 1462033 -1452008 1452028 1452033 1452039 -1452006 -1462006 -1452007 -1452002 -1402001 - -Thief equipment: -1472006 -1472010 1472034 1472039 1472045 -1332022 -1332011 -1472015 -1472016 -1472023 -1472028 -1472022 -1472011 -1472026 -1332024 -1332009 -1472017 -1472013 -1472029 1472037 1472042 1472048 -1472021 1472035 1472040 1472046 -1332015 1332035 1332040 1332045 -1332031 -1332023 1332037 1332042 1332047 -1332004 -1472000 -1332019 -1472027 -1332018 1332036 1332041 1332046 -1472007 -1332012 1332033 1332038 1332043 -1332016 -1472024 -1332017 -1332003 1332034 1332039 1332044 -1472012 -1472014 -1472005 -1472018 -1472001 - -Pirate Scroll: -2044812 - -Pirate equipment: -1072294 -1492009 1492018 diff --git a/tools/MapleGachaponItemidRetriever/lib/gachapons/ellinia.txt b/tools/MapleGachaponItemidRetriever/lib/gachapons/ellinia.txt deleted file mode 100644 index 2bf74ba510..0000000000 --- a/tools/MapleGachaponItemidRetriever/lib/gachapons/ellinia.txt +++ /dev/null @@ -1,255 +0,0 @@ - -Scroll: -2043302 -2040002 -2043102 -2043002 -2044402 -2044302 -2043802 -2044002 -2041017 2041053 2041016 2041052 2041015 - -Useable drop: -2000004 2000012 2002012 2022175 2022456 -2000005 2000019 2002013 2022176 2022457 -2022025 -2022026 - -Common equipment: -1402010 -1442013 -1432009 -1002060 -1002063 -1322023 -1002042 -1050018 -1082147 -1002026 -1002392 -1082149 - uncommon -1062024 -1442016 -1322025 -1322027 -1002391 - uncommon -1302027 -1372006 -1002419 - uncommon -1302019 -1092022 -1302021 -1041004 -1002395 1002448 -1322024 -1082148 -1002012 -1322012 -1032028 -1102012 -1322022 -1051017 -1302013 -1082146 -1442014 -1302017 -1102013 -1102003 -1002041 -1002097 -1302016 -1082145 - -Warrior equipment: -1412006 -1040029 5000032 -1040086 -1050005 -1060028 -1002059 -1060008 -1061088 -1402012 1402022 1402027 1402033 -1302003 -1432002 1432019 1432024 1432031 -1312011 1312021 1312025 1312029 -1302008 1302038 1302043 1302050 -1040030 -1002004 -1402015 1402023 1402028 1402034 -1322028 1322039 1322044 1322050 -1322015 -1432006 1432021 1432026 1432033 -1442006 -1322000 -1002085 -1002056 -1092013 -1002058 -1002050 -1060011 -1322009 -1322011 -1442000 -1051011 -1061016 -1060018 -1041024 -1061020 -1302005 -1402002 1402019 1402024 1402030 -1002030 -1092004 -1041023 -1422008 -1060009 -1051000 -1002021 -1442005 1442031 1442035 1442040 -1412003 1412013 1412017 1412022 -1412007 1412014 1412018 1412023 -1422007 -1302009 -1402000 -1402001 -1402007 -1432005 - -Magician equipment: -1382001 1382020 1382025 1382030 -1002037 -1060014 -1040018 -1061027 -1050002 -1002152 -1051027 -1050035 -1050056 -1051047 -1051030 -1002274 -1050074 -1002218 -1002254 -1082088 -1382007 1382022 1382027 1382032 -1002013 -1082087 -1372008 -1382008 1382024 1382029 1382034 -1372002 -1372003 -1382011 -1382004 -1050047 -1040019 -1041041 -1061034 -1041051 -1051045 -1051024 -1082081 -1041030 -1040018 -1002073 -1382003 -1082086 -1382014 1702033 -1050055 -1050025 -1002155 -1060015 - -Bowman equipment: -1452004 1452029 1452034 1452040 -1462003 -1060070 -1002118 -1061058 -1040003 -1002160 -1002121 -1040068 -1061063 -1040080 -1462004 -1041008 -1061006 -1061009 -1040022 1041032 -1002168 -1040067 -1060056 -1041054 -1041067 -1060063 -1002213 -1002119 -1462005 -1452001 -1462000 1462023 1462028 1462033 -1040025 1041033 -1002166 -1002161 -1040069 -1051039 -1452006 -1462006 -1452007 -1402001 -1041062 - -Thief equipment: -1472010 1472034 1472039 1472045 -1472006 -1332011 -1472031 1472038 1472043 1472049 -1041048 -1472019 -1041095 -1040095 -1002128 -1061077 -1060025 -1041040 -1061033 -1472028 -1472022 -1472011 -1040096 -1062002 -1002129 -1472026 -1332009 -1060043 -1002249 -1472021 1472035 1472040 1472046 -1040084 1041076 -1332015 1332035 1332040 1332045 -1002173 -1002148 -1332004 -1332018 1332036 1332041 1332046 -1472009 -1061069 -1002176 -1041044 -1061037 -1060032 -1472020 -1040060 -1472018 -1332013 -1332002 -1402001 - -Pirate Scroll: -2044902 2044907 2044904 2044901 2044906 2044903 [2044900 2044908 ] - -Pirate equipment: -1052107 -1082189 -1052116 -1072309 diff --git a/tools/MapleGachaponItemidRetriever/lib/gachapons/henesys.txt b/tools/MapleGachaponItemidRetriever/lib/gachapons/henesys.txt deleted file mode 100644 index f6fa09f500..0000000000 --- a/tools/MapleGachaponItemidRetriever/lib/gachapons/henesys.txt +++ /dev/null @@ -1,174 +0,0 @@ - -Scroll: -2040001 -2041002 -2040805 - uncommon -2040702 -2043802 -2040402 -2043702 - -Useable Drops: -2000004 2000012 2002012 2022175 2022456 -2000005 2000019 2002013 2022176 2022457 -2020012 -2030007 - -Common equipment: -1432009 -1302022 -1322021 -1302026 -1442017 -1082147 -1102043 -1322026 -1442016 -1402012 1402022 1402027 1402033 -1322025 -1322027 -1302027 -1312012 -1062000 -1332020 -1302028 -1372002 -1002033 -1092022 -1302021 -1102041 - uncommon -1322009 -1102042 - uncommon -1322024 -1082148 -1002012 -1322012 -1322022 -1002020 1002454 -1302013 -1082146 -1442014 -1002096 -1302017 -1442012 - -Beginner equipment: -1442018 1442039 - uncommon - -Warrior equipment: -1092011 -1092014 -1302003 -1432001 -1312011 1312021 1312025 1312029 -1002088 -1041020 -1322015 -1442004 -1422008 -1302056 1402011 1402021 1402026 1402032 -1432000 -1442005 1442031 1442035 1442040 - -Magician equipment: -1382001 1382020 1382025 1382030 -1041053 -1041029 -1050053 -1051032 -1050073 -1061036 -1002253 -1002034 -1051025 -1050067 -1051052 -1002072 -1002144 -1051054 -1050069 -1372007 1372019 1372023 1372028 -1050056 -1050074 -1002254 -1002274 -1002218 -1051055 -1382010 1382023 1382028 1382033 -1002246 -1050039 -1382007 1382022 1382027 1382032 -1372000 -1002013 -1050072 -1002036 -1002244 -1372008 -1382008 1382024 1382029 1382034 -1382011 -1092021 -1051034 -1050047 -1040019 -1041031 -1051033 -1002153 -1002252 -1051024 -1051053 -1050068 -1382003 -1382006 1382021 1382026 1382031 -1050055 -1051031 -1050025 -1002155 -1002245 -1372001 1372018 1372022 1372027 - -Bowman equipment: -1452004 1452029 1452034 1452040 -1452023 1702035 -1060057 -1432001 -1040071 -1002137 -1462009 1462026 1462031 1462036 -1452017 -1040025 1041033 -1041027 -1452005 1452027 1452032 1452038 -1452007 -1061057 - -Thief equipment: -1472006 -1472019 -1060084 -1472028 -1472004 -1002179 -1082074 -1472029 1472037 1472042 1472048 -1040100 -1332015 1332035 1332040 1332045 -1432001 -1040097 -1060071 -1472007 -1472002 -1051009 -1041044 -1041003 -1332016 -1472020 -1332003 1332034 1332039 1332044 - -Pirate Scroll: -2044813 - -Pirate equipment: -1002622 -1082204 -1082213 -1082198 diff --git a/tools/MapleGachaponItemidRetriever/lib/gachapons/kerning_city.txt b/tools/MapleGachaponItemidRetriever/lib/gachapons/kerning_city.txt deleted file mode 100644 index c47981fd21..0000000000 --- a/tools/MapleGachaponItemidRetriever/lib/gachapons/kerning_city.txt +++ /dev/null @@ -1,117 +0,0 @@ - -Scroll: -2041016 -2043302 -2040805 - uncommon -2040902 - -Useable drop: -2000004 2000012 2002012 2022175 2022456 -2000005 2000019 2002013 2022176 2022457 -2022025 -2022027 - -Common equipment: -1442013 -1432009 -1322021 -1050018 -1002392 -1082149 - uncommon -1002394 -1442004 -1372002 -1002418 -1002033 -1092008 -1102041 - uncommon -1082148 -1062001 -1302017 -1032023 -1102013 -1102040 -1002041 -1002097 - -Warrior equipment: -1332026 -1051010 -1432001 -1422005 1422015 1422019 1422023 -1332019 -1302010 1302039 1302044 1302051 -1002056 -1060011 -1322011 -1432004 1432020 1432025 1432032 -1002028 -1051000 -1442007 -1302002 - -Magician equipment: -1002037 -1002034 -1082020 -1050039 -1372000 -1002215 -1051034 -1040019 -1061034 -1382003 -1382006 1382021 1382026 1382031 -1050025 - -Bowman equipment: -1002118 -1061081 -1452011 1452030 1452035 1452041 -1462012 -1452006 -1452007 - -Thief equipment: -1472010 1472034 1472039 1472045 -1472029 1472037 1472042 1472048 -1041048 -1041095 -1060031 -1061033 -1041049 -1472011 -1040096 -1472033 -1332026 -1051006 -1082074 -1472025 1472036 1472041 1472047 -1061106 -1040084 1041076 -1332015 1332035 1332040 1332045 -1472000 -1332019 -1002183 -1002209 -1092020 -1332029 -1092019 -1061099 -1060106 1061116 -1040032 1041036 -1040059 -1332003 1332034 1332039 1332044 -1040060 -1060046 -1472005 -1332027 - -Pirate Scroll: -2044804 -2044906 - -Pirate equipment: -1482004 1482015 -1072318 -1492007 1492016 diff --git a/tools/MapleGachaponItemidRetriever/lib/gachapons/leafre.txt b/tools/MapleGachaponItemidRetriever/lib/gachapons/leafre.txt deleted file mode 100644 index 4d85851b1b..0000000000 --- a/tools/MapleGachaponItemidRetriever/lib/gachapons/leafre.txt +++ /dev/null @@ -1,113 +0,0 @@ - -Scroll: -2040407 2040406 -2040409 2040408 -2040405 2040404 -2040411 2040410 -2040409 2040408 -2044405 2044404 -2040611 2040610 -2040607 2040606 -2040813 2040812 -2041039 2041038 -2041041 2041040 -2041035 2041034 -2041031 2041030 -2041037 2041036 -2043105 2043104 -2043305 2043304 -2040103 2040104 -2040605 2040604 -2040611 2040610 -2043005 2043004 -2043205 2043204 -2044205 2044204 -2044005 2044004 -2040521 -2040511 2040510 -2043305 2043304 -2040909 2040908 -2040905 2040904 -2040907 2040906 -2040809 2040808 -2040813 2040812 -2040811 - uncommon -2040015 2040014 -2040715 2040714 -2040713 2040712 -2044005 2044004 -2043705 2043704 -2044505 2044504 -2040519 2040518 -2040203 2040204 -2040103 2040104 -2040108 2040109 -2044705 2044704 -2040907 2040906 -2040815 2040814 - uncommon -2044305 2044304 -2043007 2043006 -2040307 -2040305 2040304 -2040309 2040308 -2040811 - uncommon -2040208 -2040209 - -Useable drop: - -Common equipment: -1102040 -1102041 - uncommon -1102042 - uncommon -1102086 -1082145 -1032027 -1082146 -1002395 1002448 -1002083 -1002392 -1082149 - uncommon -1002587 -1022047 - -Beginner equipment: - -Warrior equipment: -1312002 -1432013 -1060030 -1422008 -1050022 -1050011 -1402013 -1402017 -1302012 1302041 1302046 1302053 - -Mage equipment: -1002074 -1050029 -1040093 -1050056 -1050039 -1382008 1382024 1382029 1382034 - -Bowman equipment: -1002159 -1061051 -1040023 - -Thief equipment: -1061054 -1061106 -1002249 -1040084 1041076 -1060052 -1472054 - -Pirate Scroll: -2044803 - -Pirate equipment: -1482009 1482018 -1072303 diff --git a/tools/MapleGachaponItemidRetriever/lib/gachapons/ludibrium.txt b/tools/MapleGachaponItemidRetriever/lib/gachapons/ludibrium.txt deleted file mode 100644 index 26b5c0d7a7..0000000000 --- a/tools/MapleGachaponItemidRetriever/lib/gachapons/ludibrium.txt +++ /dev/null @@ -1,159 +0,0 @@ - -Scroll: -2048000 -2040601 -2041019 -2041007 -2041016 -2041022 -2041001 -2041010 -2041013 -2041004 -2044701 -2043301 -2040301 -2048004 -2048001 -2040901 -2040701 -2040704 -2040707 -2040602 -2041020 -2041008 -2041017 -2041023 -2041002 -2041011 -2041014 -2041005 -2044702 -2043302 -[2040302 2040330 ] -2040805 - uncommon -2040002 -2044402 -2048005 -2048002 -2040702 -2040705 -2040708 -2044302 -2043802 -2040402 -2043702 - -Useable drop: -2000004 2000012 2002012 2022175 2022456 -2000005 2000019 2002013 2022176 2022457 -4006000 -4006001 - -Common equipment: -1032003 -1432009 -1302022 -1302029 -1102014 -1102018 -1312014 -1302026 -1102015 -1032011 1041078 -1312013 -1032008 4031568 -1032019 -1032007 -1332030 -1032020 -1032004 -1302027 -1032022 -1312012 -1032021 -1032006 -1302028 -1322003 1702020 -1002419 - uncommon -1032016 -1032015 -1302024 -1092008 -1032018 -1302021 -1032014 -1332021 -1322012 -1032005 -1032013 -1102012 -1302025 -1302013 -1032002 -1032001 -1032012 -1302017 -1032010 -1402014 -1102017 -1102013 -1442021 -1032009 - -Beginner equipment: -1442018 1442039 - uncommon -1332021 -1422011 - -Warrior equipment: -1402017 -1422005 1422015 1422019 1422023 -1002023 -1332016 -1432005 - -Magician equipment: -1002037 -1002034 -1002064 -1002038 -1002013 -1002036 -1382011 -1002035 -1002065 -1382014 1702033 -1372001 1372018 1372022 1372027 - -Bowman equipment: -1452026 -1002162 -1002164 -1462018 -1002165 -1452014 -1002163 -1452012 -1002161 -1452009 -1462007 1462024 1462029 1462034 - -Thief Equipment: -1332022 -1002175 -1002172 -1002174 -1040096 -1472033 -1002173 -1332054 -1472054 -1002171 -1332016 - -Pirate Scroll: -2044811 - -Pirate equipment: -1002646 diff --git a/tools/MapleGachaponItemidRetriever/lib/gachapons/mushroom_shrine.txt b/tools/MapleGachaponItemidRetriever/lib/gachapons/mushroom_shrine.txt deleted file mode 100644 index 068c099704..0000000000 --- a/tools/MapleGachaponItemidRetriever/lib/gachapons/mushroom_shrine.txt +++ /dev/null @@ -1,119 +0,0 @@ - -Scroll: -2040305 2040304 -2040306 -2040309 2040308 -2044604 -2041039 -2041037 -2041035 -2041034 -2041041 -2040608 -2040605 -2040604 -2040611 -2040610 -2040811 - uncommon -2040810 - uncommon -2040813 2040812 -2040815 2040814 - uncommon -2040809 2040808 -2043004 -2040017 -2040015 -2040011 -2040013 2040012 -2040405 -2040407 2040406 -2040411 2040410 -2040511 -2040509 -2040508 -2040519 -2040521 2040520 -2040108 2040109 -2040904 -2040909 2040908 -2043105 2043104 -2044105 2044104 -2043005 -2043004 -2043007 2043006 -2044005 2044004 -2044205 2044204 -2043305 2043304 -2040607 2040606 -2040715 2040714 -2040713 -2044305 2044304 - -Useable drop: - -Common equipment: -1102041 - uncommon -1102042 - uncommon -1102040 -1102084 -1002392 -1432009 -1002393 1002903 -1002394 -1082149 - uncommon -1082147 -1082148 -1032028 -1002585 -1002586 -1432013 -1022047 -1322027 -1432018 - -Beginner equipment: -1072264 -1072262 -1072263 - -Warrior equipment: -1060074 -1322002 -1002340 -1442004 -1402037 -1422008 -1050022 - -Mage equipment: -1382037 -1060014 -1051026 -1050056 -1050029 -1051030 -1382036 -1372032 -1041015 -1382015 3300001 -1372008 -1382008 1382024 1382029 1382034 - -Bowman equipment: -1452018 -1041068 -1462007 1462024 1462029 1462034 - -Thief equipment: -1060052 -1472013 -1002180 -1002170 -1060073 1061071 -1060099 - -Pirate Scroll: -2044904 - -Pirate equipment: -1492004 1492015 -1492012 diff --git a/tools/MapleGachaponItemidRetriever/lib/gachapons/perion.txt b/tools/MapleGachaponItemidRetriever/lib/gachapons/perion.txt deleted file mode 100644 index a64db932f0..0000000000 --- a/tools/MapleGachaponItemidRetriever/lib/gachapons/perion.txt +++ /dev/null @@ -1,117 +0,0 @@ - -Useable drop: -2000004 2000012 2002012 2022175 2022456 -2000005 2000019 2002013 2022176 2022457 - -Common equipment: -1402010 -1302022 -1002060 -1322021 -1082147 -1002006 -1002026 -1002392 -1082149 - uncommon -1322025 -1322027 -1002391 - uncommon -1102000 -1082150 -1332020 -1322007 -1002419 - uncommon -1302021 -1102041 - uncommon -1002395 1002448 -1082148 -1322012 -1302017 -1322010 -1032000 -1102013 -1002097 - -Warrior equipment: -1322020 -1312007 -1312008 1312018 1312022 1312026 -1302004 -1312006 -1082036 -1082117 -1061088 -1302008 1302038 1302043 1302050 -1422005 1422015 1422019 1422023 -1002048 -1061087 -1302018 1302042 1302047 1302054 -1322017 1322036 1322041 1322047 -1422001 -1040103 -1060077 -1002022 -1002050 -1442000 -1432030 -1402037 -1092002 -1041092 -1050006 -1432004 1432020 1432025 1432032 -1061019 -1432000 -1060009 -1051000 -1002021 -1322014 1322035 1322040 1322046 -1432005 - -Magician equipment: -1051032 -1040018 -1051027 -1372007 1372019 1372023 1372028 -1050049 -1002036 -1382012 -1002217 -1051033 -1382006 1382021 1382026 1382031 -1050048 - -Bowman equipment: -1061061 -1060062 -1040075 -1462013 1462027 1462032 1462037 -1041065 -1452006 - -Thief equipment: -1040095 -1060084 -1002182 -1041049 -1002247 -1332024 -1332009 -1060024 -1332015 1332035 1332040 1332045 -1041060 -1061032 -1041074 -1041003 -1332016 -1472020 -1332003 1332034 1332039 1332044 -1041059 - -Pirate Scroll: -2044907 -2044802 2044804 2044801 2044803 [2044800 2044815 ] - -Pirate equipment: -1002631 -1052122 -1482012 diff --git a/tools/MapleGachaponItemidRetriever/lib/gachapons/showa_spa_female.txt b/tools/MapleGachaponItemidRetriever/lib/gachapons/showa_spa_female.txt deleted file mode 100644 index acecbf0b79..0000000000 --- a/tools/MapleGachaponItemidRetriever/lib/gachapons/showa_spa_female.txt +++ /dev/null @@ -1,69 +0,0 @@ - -Scroll: -2048005 -2048002 -2043202 -2044602 -2043214 -2041307 -2040916 - uncommon -2041035 -2044104 -2044505 -2044305 -2043304 -2041309 -2044010 - -Useable drop: -2022016 -2000005 2000019 2002013 2022176 2022457 -2022025 -2022027 - -Common equipment: -1402000 -1402013 -1002418 -1022047 -1102042 - uncommon -1082145 -1082147 -1082146 -1082178 -1082175 - -Common setup: -3010073 -3010099 - -Beginner equipment: - -Warrior equipment: -1422013 -1432030 - -Magician equipment: -1372002 -1382003 - -Bowman equipment: -1040023 - -Thief equipment: -1332003 1332034 1332039 1332044 -1002209 - -Pirate Scroll: -2044803 -2044814 -2044904 -2044902 -2044901 - -Pirate equipment: -1082198 -1082213 -1482007 1482016 -1492004 1492015 -1002646 diff --git a/tools/MapleGachaponItemidRetriever/lib/gachapons/showa_spa_male.txt b/tools/MapleGachaponItemidRetriever/lib/gachapons/showa_spa_male.txt deleted file mode 100644 index 521dea07cf..0000000000 --- a/tools/MapleGachaponItemidRetriever/lib/gachapons/showa_spa_male.txt +++ /dev/null @@ -1,109 +0,0 @@ - -Scroll: -2048005 -2048002 -2043202 -2044602 -2043214 -2041307 -2040916 - uncommon -2041035 -2044104 -2044505 -2044305 -2043304 - -Useable drop: -2022016 -2000005 2000019 2002013 2022176 2022457 -2022025 -2022027 - -Common equipment: -1332020 -1312004 -1332032 5010034 9250053 -1322023 -1322026 -1322022 -1322012 -1302014 -1302049 -1302017 -1332007 -1432009 -1432016 -1432017 -1432009 -1402013 -1402044 -1442014 -1442017 -1442016 -1442025 -1002418 -1082178 -1082179 -1082148 -1032027 -1032032 -1102028 -1102086 -1102042 - uncommon - -Common setup: -3010073 -3010111 - -Beginner equipment: - -Warrior equipment: -1412005 -1402048 -1402049 -1322011 -1302003 -1302004 -1302008 1302038 1302043 1302050 - -Magician equipment: -1372000 -1372009 -1372001 1372018 1372022 1372027 -1372011 1702032 -1382006 1382021 1382026 1382031 -1382014 1702033 - -Bowman equipment: -1452018 -1452006 -1452008 1452028 1452033 1452039 -1452005 1452027 1452032 1452038 -1462002 -1462007 1462024 1462029 1462034 -1462003 -1002169 - -Thief equipment: -1472023 -1332012 1332033 1332038 1332043 -1332017 -1332022 -1332006 -1332029 -1040097 - -Pirate Scroll: -2044902 -2044901 -2044811 -2044903 -2044804 - -Pirate equipment: -1052107 -1082204 -1072318 -1002637 -1482009 1482018 -1492007 1492016 diff --git a/tools/MapleGachaponItemidRetriever/lib/gachapons/sleepywood.txt b/tools/MapleGachaponItemidRetriever/lib/gachapons/sleepywood.txt deleted file mode 100644 index e9f5dad0a1..0000000000 --- a/tools/MapleGachaponItemidRetriever/lib/gachapons/sleepywood.txt +++ /dev/null @@ -1,165 +0,0 @@ - -Scroll: -2048003 -2048000 -2040601 -2044501 -2041019 -2041016 -2041022 -2041010 -2041013 -2043301 -2040301 -[2040804 2040826 ]- uncommon -2040801 -2040817 - uncommon -2040001 -2040004 -2043101 -2043201 -2043001 -2040504 -2040501 -2048004 -2048001 -2044401 -2040901 -2040701 -2040704 -2040707 -2044301 -2043801 -2044101 -2044201 -2044001 -2040602 -2044502 -2041020 -2041017 -2041023 -2041014 -2041005 -2044702 -2044602 -2043302 -[2040302 2040330 ] -2040805 - uncommon -2040802 -2040005 -2043202 -2043002 -2040505 -2040502 -2048005 -2048002 -2044402 -2040902 -2040702 -2040705 -2040708 -2044302 -2043802 -2044202 -2044002 - -Useable drop: -2340000 - uncommon -2012000 -2012003 -2020007 -2000004 2000012 2002012 2022175 2022456 -2012001 -2020008 -2070006 -2020012 -2000005 2000019 2002013 2022176 2022457 -2030007 -2012002 -2002001 -2070005 - -Common equipment: -1032003 -1432009 -1102014 -1102018 -1002392 -1082149 - uncommon -1322026 -1032022 -1312012 -1332020 -1092030 -1032016 -1032015 -1032014 -1322024 -1032013 -1322022 -1102016 -1032012 -1032023 -1402014 -1032000 -1102017 - -Beginner equipment: -1442018 1442039 - uncommon - -Warrior equipment: -1402017 -1051010 -1432011 -1442006 -1322002 -1422004 -1432010 1432023 1432028 1432035 -1051011 -1060018 -1432000 -1422003 -1412003 1412013 1412017 1412022 -1422000 - -Magician equipment: -1002034 -1002142 -1382010 1382023 1382028 1382033 -1002013 -1382008 1382024 1382029 1382034 -1382011 -1050047 -1002065 - -Bowman equipment: -1452003 -1002165 -1040068 -1462013 1462027 1462032 1462037 -1462011 -1462012 -1061050 -1462010 -1002161 - -Thief equipment: -1332022 -1002175 -1040042 -1472004 -1040057 -1332031 -1332023 1332037 1332042 1332047 -1332010 -1002171 -1060046 - -Pirate Scroll: -2044801 -2044903 -2044814 - -Pirate equipment: -1052131 -1482007 1482016 diff --git a/tools/input/.gitignore b/tools/input/.gitignore index ff456c3654..5a82606193 100644 --- a/tools/input/.gitignore +++ b/tools/input/.gitignore @@ -2,4 +2,5 @@ !*/ !/cosmetics/** !.gitignore -!CouponCodes.img.xml \ No newline at end of file +!CouponCodes.img.xml +!gachapon_items.txt \ No newline at end of file diff --git a/tools/MapleGachaponItemidRetriever/lib/gachapon_items.txt b/tools/input/gachapon_items.txt similarity index 100% rename from tools/MapleGachaponItemidRetriever/lib/gachapon_items.txt rename to tools/input/gachapon_items.txt From c6e915448efa394ff8570f42567324f6f3406d05 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 11:40:59 +0200 Subject: [PATCH 24/36] Move MapleMobBookIndexer to main module --- pom.xml | 3 +- .../java/tools/mapletools/MobBookIndexer.java | 169 + .../lib/MonsterBook.img.xml | 14866 ---------------- .../MapleMobBookIndexer.java | 219 - 4 files changed, 171 insertions(+), 15086 deletions(-) create mode 100644 src/main/java/tools/mapletools/MobBookIndexer.java delete mode 100644 tools/MapleMobBookIndexer/lib/MonsterBook.img.xml delete mode 100644 tools/MapleMobBookIndexer/src/maplemobbookindexer/MapleMobBookIndexer.java diff --git a/pom.xml b/pom.xml index cb56cd7ae4..753a9d9b08 100644 --- a/pom.xml +++ b/pom.xml @@ -47,10 +47,11 @@ jcip-annotations 1.0 - + commons-io commons-io 2.10.0 + diff --git a/src/main/java/tools/mapletools/MobBookIndexer.java b/src/main/java/tools/mapletools/MobBookIndexer.java new file mode 100644 index 0000000000..403b470430 --- /dev/null +++ b/src/main/java/tools/mapletools/MobBookIndexer.java @@ -0,0 +1,169 @@ +package tools.mapletools; + +import provider.wz.WZFiles; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * @author RonanLana + *

+ * This application simply gets from the MonsterBook.img.xml all mobid's and + * puts them on a SQL table with the correspondent mob cardid. + */ +public class MobBookIndexer { + private static final File INPUT_FILE = new File(WZFiles.STRING.getFile(), "MonsterBook.img.xml"); + private static final Connection con = SimpleDatabaseConnection.getConnection(); + + private static BufferedReader bufferedReader = null; + private static byte status = 0; + private static int mobId = -1; + + private static String getName(String token) { + int i, j; + char[] dest; + String d; + + i = token.lastIndexOf("name"); + i = token.indexOf("\"", i) + 1; //lower bound of the string + j = token.indexOf("\"", i); //upper bound + + if (j - i < 7) { + dest = new char[6]; + } else { + dest = new char[7]; + } + token.getChars(i, j, dest, 0); + + d = new String(dest); + return (d); + } + + private static void forwardCursor(int st) { + String line = null; + + try { + while (status >= st && (line = bufferedReader.readLine()) != null) { + simpleToken(line); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void simpleToken(String token) { + if (token.contains("/imgdir")) { + status -= 1; + } else if (token.contains("imgdir")) { + status += 1; + } + } + + private static boolean isCard(int itemId) { + return itemId / 10000 == 238; + } + + private static void loadPairFromMob() { + System.out.println("Loading mob id " + mobId); + + try { + PreparedStatement ps, ps2; + ResultSet rs; + + ps = con.prepareStatement("SELECT itemid FROM drop_data WHERE (dropperid = ? AND itemid > 0) GROUP BY itemid;"); + ps.setInt(1, mobId); + rs = ps.executeQuery(); + + while (rs.next()) { + int itemId = rs.getInt("itemid"); + if (isCard(itemId)) { + ps2 = con.prepareStatement("INSERT INTO `monstercardwz` (`cardid`, `mobid`) VALUES (?, ?)"); + ps2.setInt(1, itemId); + ps2.setInt(2, mobId); + + ps2.executeUpdate(); + } + } + + rs.close(); + ps.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + private static void translateToken(String token) { + String d; + int temp; + + if (token.contains("/imgdir")) { + status -= 1; + } else if (token.contains("imgdir")) { + if (status == 1) { //getting MobId + d = getName(token); + mobId = Integer.parseInt(d); + } else if (status == 2) { + d = getName(token); + + if (d.contains("reward")) { + temp = status; + + loadPairFromMob(); + forwardCursor(temp); + } + } + + status += 1; + } + + } + + private static void indexFromDropData() { + // This will reference one line at a time + String line = null; + + try { + InputStreamReader fileReader = new InputStreamReader(new FileInputStream(INPUT_FILE), StandardCharsets.UTF_8); + bufferedReader = new BufferedReader(fileReader); + + PreparedStatement ps = con.prepareStatement("DROP TABLE IF EXISTS monstercardwz;"); + ps.execute(); + + ps = con.prepareStatement("CREATE TABLE `monstercardwz` (" + + "`id` int(10) unsigned NOT NULL AUTO_INCREMENT," + + "`cardid` int(10) NOT NULL DEFAULT '-1'," + + "`mobid` int(10) NOT NULL DEFAULT '-1'," + + "PRIMARY KEY (`id`)" + + ");"); + ps.execute(); + + while ((line = bufferedReader.readLine()) != null) { + translateToken(line); + } + + bufferedReader.close(); + fileReader.close(); + + con.close(); + } catch (FileNotFoundException ex) { + System.out.println("Unable to open file '" + INPUT_FILE + "'"); + } catch (IOException ex) { + System.out.println("Error reading file '" + INPUT_FILE + "'"); + } catch (SQLException e) { + System.out.println("Warning: Could not establish connection to database to change card chance rate."); + System.out.println(e.getMessage()); + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + indexFromDropData(); + } +} + diff --git a/tools/MapleMobBookIndexer/lib/MonsterBook.img.xml b/tools/MapleMobBookIndexer/lib/MonsterBook.img.xml deleted file mode 100644 index 4275039b99..0000000000 --- a/tools/MapleMobBookIndexer/lib/MonsterBook.img.xml +++ /dev/null @@ -1,14866 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleMobBookIndexer/src/maplemobbookindexer/MapleMobBookIndexer.java b/tools/MapleMobBookIndexer/src/maplemobbookindexer/MapleMobBookIndexer.java deleted file mode 100644 index ded162c95c..0000000000 --- a/tools/MapleMobBookIndexer/src/maplemobbookindexer/MapleMobBookIndexer.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package maplemobbookindexer; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.sql.PreparedStatement; -import java.sql.ResultSet; - -import java.io.*; - - -/** - * @author RonanLana - * - * This application simply gets from the MonsterBook.img.xml all mobid's and - * puts them on a SQL table with the correspondent mob cardid. - * - */ -public class MapleMobBookIndexer { - static String host = "jdbc:mysql://localhost:3306/cosmic"; - static String driver = "com.mysql.jdbc.Driver"; - static String username = "cosmic_server"; - static String password = "snailshell"; - - static String fileName = "lib/MonsterBook.img.xml"; - - static Connection con = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - static byte status = 0; - static int mobId = -1; - - private static String getName(String token) { - int i, j; - char[] dest; - String d; - - i = token.lastIndexOf("name"); - i = token.indexOf("\"", i) + 1; //lower bound of the string - j = token.indexOf("\"", i); //upper bound - - if(j - i < 7) dest = new char[6]; - else dest = new char[7]; - token.getChars(i, j, dest, 0); - - d = new String(dest); - return(d); - } - - private static void forwardCursor(int st) { - String line = null; - - try { - while(status >= st && (line = bufferedReader.readLine()) != null) { - simpleToken(line); - } - } - catch(Exception e) { - e.printStackTrace(); - } - } - - private static void simpleToken(String token) { - if(token.contains("/imgdir")) { - status -= 1; - } - else if(token.contains("imgdir")) { - status += 1; - } - } - - private static boolean isCard(int itemId) { - return itemId / 10000 == 238; - } - - private static void loadPairFromMob() { - System.out.println("Loading mob id " + mobId); - - try { - int itemId, rid = 1; - - PreparedStatement ps, ps2; - ResultSet rs; - - ps = con.prepareStatement("SELECT itemid FROM drop_data WHERE (dropperid = ? AND itemid > 0) GROUP BY itemid;"); - ps.setInt(1, mobId); - rs = ps.executeQuery(); - - while(rs.next()) { - itemId = rs.getInt("itemid"); - if(isCard(itemId)) { - ps2 = con.prepareStatement("INSERT INTO `monstercardwz` (`cardid`, `mobid`) VALUES (?, ?)", rid); - rid++; - ps2.setInt(1, itemId); - ps2.setInt(2, mobId); - - ps2.executeUpdate(); - } - } - - rs.close(); - ps.close(); - } - catch(SQLException e) { - e.printStackTrace(); - } - } - - private static void translateToken(String token) { - String d; - int temp; - - if(token.contains("/imgdir")) { - status -= 1; - } - else if(token.contains("imgdir")) { - if(status == 1) { //getting MobId - d = getName(token); - mobId = Integer.parseInt(d); - } - else if(status == 2) { - d = getName(token); - - if(d.contains("reward")) { - temp = status; - - loadPairFromMob(); - forwardCursor(temp); - } - } - - status += 1; - } - - } - - private static void IndexFromDropData() { - // This will reference one line at a time - String line = null; - - try { - Class.forName(driver).newInstance(); - con = DriverManager.getConnection(host, username, password); - - fileReader = new InputStreamReader(new FileInputStream(fileName), "UTF-8"); - bufferedReader = new BufferedReader(fileReader); - - PreparedStatement ps = con.prepareStatement("DROP TABLE IF EXISTS monstercardwz;"); - ps.execute(); - - ps = con.prepareStatement("CREATE TABLE `monstercardwz` (" - + "`id` int(10) unsigned NOT NULL AUTO_INCREMENT," - + "`cardid` int(10) NOT NULL DEFAULT '-1'," - + "`mobid` int(10) NOT NULL DEFAULT '-1'," - + "PRIMARY KEY (`id`)" - + ") ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;"); - ps.execute(); - - while((line = bufferedReader.readLine()) != null) { - translateToken(line); - } - - bufferedReader.close(); - fileReader.close(); - - con.close(); - } - - catch(FileNotFoundException ex) { - System.out.println("Unable to open file '" + fileName + "'"); - } - catch(IOException ex) { - System.out.println("Error reading file '" + fileName + "'"); - } - - catch(SQLException e) { - System.out.println("Warning: Could not establish connection to database to change card chance rate."); - System.out.println(e.getMessage()); - } - - catch(ClassNotFoundException e) { - System.out.println("Error: could not find class"); - System.out.println(e.getMessage()); - } - - catch(InstantiationException e) { - System.out.println("Error: instantiation failure"); - System.out.println(e.getMessage()); - } - - catch(Exception e) { - e.printStackTrace(); - } - } - - public static void main(String[] args) { - IndexFromDropData(); - } - -} From f8ef9afdd995726489748ed390472f49f4bba396 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 11:46:40 +0200 Subject: [PATCH 25/36] Move MapleMobBookUpdate to main module --- .../java/tools/mapletools/MobBookUpdate.java | 154 +- .../lib/MonsterBook.img.xml | 15116 --------------- .../lib/MonsterBook_updated.img.xml | 15267 ---------------- 3 files changed, 55 insertions(+), 30482 deletions(-) rename tools/MapleMobBookUpdate/src/maplemobbookupdate/MapleMobBookUpdate.java => src/main/java/tools/mapletools/MobBookUpdate.java (52%) delete mode 100644 tools/MapleMobBookUpdate/lib/MonsterBook.img.xml delete mode 100644 tools/MapleMobBookUpdate/lib/MonsterBook_updated.img.xml diff --git a/tools/MapleMobBookUpdate/src/maplemobbookupdate/MapleMobBookUpdate.java b/src/main/java/tools/mapletools/MobBookUpdate.java similarity index 52% rename from tools/MapleMobBookUpdate/src/maplemobbookupdate/MapleMobBookUpdate.java rename to src/main/java/tools/mapletools/MobBookUpdate.java index 158ce16788..fe5e28743b 100644 --- a/tools/MapleMobBookUpdate/src/maplemobbookupdate/MapleMobBookUpdate.java +++ b/src/main/java/tools/mapletools/MobBookUpdate.java @@ -1,65 +1,39 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package maplemobbookupdate; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.sql.PreparedStatement; -import java.sql.ResultSet; +import provider.wz.WZFiles; import java.io.*; - +import java.nio.charset.StandardCharsets; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; /** * @author RonanLana - * + *

* This application updates the Monster Book drop data with the actual underlying drop data from * the Maplestory database specified in the URL below. - * + *

* In other words all items drops from monsters listed inside the Mob Book feature will be patched to match exactly like the item * drop list specified in the URL's Maplestory database. - * + *

* The original file "MonsterBook.img.xml" from String.wz must be copied to the directory of this application and only then * executed. This program will generate another file that must replace the original server file to make the effects take place * to on your server. - * + *

* After replacing on server, this XML must be updated on the client via WZ Editor (HaRepack for instance). Once inside the repack, * remove the property 'MonsterBook.img' inside 'string.wz' and choose to import the xml generated with this software. - * */ -public class MapleMobBookUpdate { - static String host = "jdbc:mysql://localhost:3306/cosmic"; - static String driver = "com.mysql.jdbc.Driver"; - static String username = "cosmic_server"; - static String password = "snailshell"; +public class MobBookUpdate { + private static final File INPUT_FILE = new File(WZFiles.STRING.getFile(), "MonsterBook.img.xml"); + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("MonsterBook_updated.img.xml"); + private static final Connection con = SimpleDatabaseConnection.getConnection(); - static String fileName = "lib/MonsterBook.img.xml"; - static String newFile = "lib/MonsterBook_updated.img.xml"; - - static Connection con = null; - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - static byte status = 0; - static int mobId = -1; + private static PrintWriter printWriter = null; + private static BufferedReader bufferedReader = null; + private static byte status = 0; + private static int mobId = -1; private static String getName(String token) { int i, j; @@ -70,33 +44,36 @@ public class MapleMobBookUpdate { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - if(j - i < 7) dest = new char[6]; - else dest = new char[7]; + if (j - i < 7) { + dest = new char[6]; + } else { + dest = new char[7]; + } token.getChars(i, j, dest, 0); d = new String(dest); - return(d); + return (d); } private static void forwardCursor(int st) { String line = null; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { simpleToken(line); } - if(line != null) printWriter.println(line); - } - catch(Exception e) { + if (line != null) { + printWriter.println(line); + } + } catch (Exception e) { e.printStackTrace(); } } private static void simpleToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; } } @@ -112,9 +89,11 @@ public class MapleMobBookUpdate { ps.setInt(1, mobId); ResultSet rs = ps.executeQuery(); - while(rs.next()) { + while (rs.next()) { toPrint = ""; - for(int k = 0; k <= status; k++) toPrint += " "; + for (int k = 0; k <= status; k++) { + toPrint += " "; + } toPrint += " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleMobBookUpdate/lib/MonsterBook_updated.img.xml b/tools/MapleMobBookUpdate/lib/MonsterBook_updated.img.xml deleted file mode 100644 index e81f16c253..0000000000 --- a/tools/MapleMobBookUpdate/lib/MonsterBook_updated.img.xml +++ /dev/null @@ -1,15267 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 56f3511395f9fbab5dcedbd18b86e31ae714fb3c Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 12:00:05 +0200 Subject: [PATCH 26/36] Move MapleQuestItemFetcher to main module --- .../tools/mapletools/QuestItemFetcher.java | 438 +++++------- .../MapleQuestItemFetcher/lib/QuestReport.txt | 258 ------- .../lib/commons-io-2.6.jar | Bin 214788 -> 0 bytes .../src/provider/MapleCanvas.java | 30 - .../src/provider/MapleData.java | 34 - .../src/provider/MapleDataDirectoryEntry.java | 34 - .../src/provider/MapleDataEntity.java | 31 - .../src/provider/MapleDataEntry.java | 33 - .../src/provider/MapleDataFileEntry.java | 30 - .../src/provider/MapleDataProvider.java | 27 - .../provider/MapleDataProviderFactory.java | 55 -- .../src/provider/MapleDataTool.java | 145 ---- .../provider/wz/FileStoredPngMapleCanvas.java | 70 -- .../src/provider/wz/ImgMapleSound.java | 39 - .../src/provider/wz/ListWZFile.java | 86 --- .../src/provider/wz/MapleDataType.java | 26 - .../src/provider/wz/PNGMapleCanvas.java | 151 ---- .../src/provider/wz/WZDirectoryEntry.java | 68 -- .../src/provider/wz/WZEntry.java | 61 -- .../src/provider/wz/WZFile.java | 154 ---- .../src/provider/wz/WZFileEntry.java | 42 -- .../src/provider/wz/WZIMGEntry.java | 118 --- .../src/provider/wz/WZIMGFile.java | 227 ------ .../src/provider/wz/WZTool.java | 188 ----- .../src/provider/wz/XMLDomMapleData.java | 219 ------ .../src/provider/wz/XMLWZFile.java | 85 --- .../src/tools/ArrayMap.java | 149 ---- .../src/tools/DatabaseConnection.java | 51 -- .../src/tools/FilePrinter.java | 188 ----- .../src/tools/HexTool.java | 79 -- .../tools/MapleItemInformationProvider.java | 672 ------------------ .../MapleQuestItemFetcher/src/tools/Pair.java | 121 ---- .../src/tools/StringUtil.java | 128 ---- .../tools/data/input/ByteArrayByteStream.java | 72 -- .../src/tools/data/input/ByteInputStream.java | 35 - .../input/GenericLittleEndianAccessor.java | 239 ------- .../GenericSeekableLittleEndianAccessor.java | 91 --- .../data/input/InputStreamByteStream.java | 93 --- .../data/input/LittleEndianAccessor.java | 45 -- .../data/input/RandomAccessByteStream.java | 84 --- .../input/SeekableInputStreamBytestream.java | 51 -- .../input/SeekableLittleEndianAccessor.java | 27 - .../data/output/BAOSByteOutputStream.java | 56 -- .../tools/data/output/ByteOutputStream.java | 38 - .../output/GenericLittleEndianWriter.java | 183 ----- .../tools/data/output/LittleEndianWriter.java | 114 --- .../output/MaplePacketLittleEndianWriter.java | 73 -- 47 files changed, 188 insertions(+), 5050 deletions(-) rename tools/MapleQuestItemFetcher/src/maplequestitemfetcher/MapleQuestItemFetcher.java => src/main/java/tools/mapletools/QuestItemFetcher.java (58%) delete mode 100644 tools/MapleQuestItemFetcher/lib/QuestReport.txt delete mode 100644 tools/MapleQuestItemFetcher/lib/commons-io-2.6.jar delete mode 100644 tools/MapleQuestItemFetcher/src/provider/MapleCanvas.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/MapleData.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/MapleDataDirectoryEntry.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/MapleDataEntity.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/MapleDataEntry.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/MapleDataFileEntry.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/MapleDataProvider.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/MapleDataProviderFactory.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/MapleDataTool.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/wz/FileStoredPngMapleCanvas.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/wz/ImgMapleSound.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/wz/ListWZFile.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/wz/MapleDataType.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/wz/PNGMapleCanvas.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/wz/WZDirectoryEntry.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/wz/WZEntry.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/wz/WZFile.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/wz/WZFileEntry.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/wz/WZIMGEntry.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/wz/WZIMGFile.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/wz/WZTool.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/wz/XMLDomMapleData.java delete mode 100644 tools/MapleQuestItemFetcher/src/provider/wz/XMLWZFile.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/ArrayMap.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/DatabaseConnection.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/FilePrinter.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/HexTool.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/MapleItemInformationProvider.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/Pair.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/StringUtil.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/data/input/ByteArrayByteStream.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/data/input/ByteInputStream.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/data/input/GenericLittleEndianAccessor.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/data/input/InputStreamByteStream.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/data/input/LittleEndianAccessor.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/data/input/RandomAccessByteStream.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/data/input/SeekableInputStreamBytestream.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/data/output/BAOSByteOutputStream.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/data/output/ByteOutputStream.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/data/output/GenericLittleEndianWriter.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/data/output/LittleEndianWriter.java delete mode 100644 tools/MapleQuestItemFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java diff --git a/tools/MapleQuestItemFetcher/src/maplequestitemfetcher/MapleQuestItemFetcher.java b/src/main/java/tools/mapletools/QuestItemFetcher.java similarity index 58% rename from tools/MapleQuestItemFetcher/src/maplequestitemfetcher/MapleQuestItemFetcher.java rename to src/main/java/tools/mapletools/QuestItemFetcher.java index 5f32706f02..2950387e25 100644 --- a/tools/MapleQuestItemFetcher/src/maplequestitemfetcher/MapleQuestItemFetcher.java +++ b/src/main/java/tools/mapletools/QuestItemFetcher.java @@ -1,102 +1,72 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package maplequestitemfetcher; +package tools.mapletools; import org.apache.commons.io.FileUtils; -import tools.MapleItemInformationProvider; +import provider.wz.WZFiles; +import server.MapleItemInformationProvider; +import tools.DatabaseConnection; import tools.Pair; import java.io.*; -import java.sql.*; +import java.nio.charset.StandardCharsets; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.*; -import java.util.Map.Entry; /** - * * @author RonanLana - * + *

* This application haves 2 objectives: fetch missing drop data relevant to quests, * and update the questid from items that are labeled as "Quest Item" on the DB. - * - * To test a server instance with this feature, MapleQuestItemFetcher must be set - * just like it is displayed on the HeavenMS source: 2 folders ahead - * of the root of the main source. - * - * Running it should generate a report file under "lib" folder with the search results. - * + *

+ * Running it should generate a report file under "output" folder with the search results. + *

* Estimated parse time: 1 minute */ -public class MapleQuestItemFetcher { - static MapleItemInformationProvider ii; - - static String host = "jdbc:mysql://localhost:3306/cosmic"; - static String driver = "com.mysql.jdbc.Driver"; - static String username = "cosmic_server"; - static String password = "snailshell"; +public class QuestItemFetcher { + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("quest_report.txt"); + private static final int INITIAL_STRING_LENGTH = 50; + private static final int INITIAL_LENGTH = 200; + private static final boolean DISPLAY_EXTRA_INFO = true; // display items with zero quantity over the quest act WZ - static String wzPath = "../../wz"; - static String directoryName = "../.."; - static String newFile = "lib/QuestReport.txt"; + private static final Connection con = SimpleDatabaseConnection.getConnection(); + private static final Map> startQuestItems = new HashMap<>(INITIAL_LENGTH); + private static final Map> completeQuestItems = new HashMap<>(INITIAL_LENGTH); + private static final Map> zeroedStartQuestItems = new HashMap<>(); + private static final Map> zeroedCompleteQuestItems = new HashMap<>(); + private static final Map mixedQuestidItems = new HashMap<>(); + private static final Set limitedQuestids = new HashSet<>(); - static Connection con = null; - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static int initialLength = 200; - static int initialStringLength = 50; - static boolean displayExtraInfo = true; // display items with zero quantity over the quest act WZ - - static Map> startQuestItems = new HashMap<>(initialLength); - static Map> completeQuestItems = new HashMap<>(initialLength); - - static Map> zeroedStartQuestItems = new HashMap<>(); - static Map> zeroedCompleteQuestItems = new HashMap<>(); - static Map mixedQuestidItems = new HashMap<>(); - static Set limitedQuestids = new HashSet<>(); - - static byte status = 0; - static int questId = -1; - static int isCompleteState = 0; - - static int currentItemid = 0; - static int currentCount = 0; + private static MapleItemInformationProvider ii; + private static PrintWriter printWriter = null; + private static BufferedReader bufferedReader = null; + private static byte status = 0; + private static int questId = -1; + private static int isCompleteState = 0; + private static int currentItemid = 0; + private static int currentCount = 0; private static String getName(String token) { int i, j; char[] dest; String d; - + i = token.lastIndexOf("name"); i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - if(j < i) return "0"; //node value containing 'name' in it's scope, cheap fix since we don't deal with strings anyway - - dest = new char[initialStringLength]; + if (j < i) { + return "0"; //node value containing 'name' in it's scope, cheap fix since we don't deal with strings anyway + } + + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static String getValue(String token) { int i, j; char[] dest; @@ -106,56 +76,53 @@ public class MapleQuestItemFetcher { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static void forwardCursor(int st) { String line = null; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { simpleToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } private static void simpleToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; } } - + private static void inspectQuestItemList(int st) { String line = null; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { readItemToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } private static void processCurrentItem() { try { - if(ii.isQuestItem(currentItemid)) { - if(currentCount != 0) { - if(isCompleteState == 1) { - if(currentCount < 0) { + if (ii.isQuestItem(currentItemid)) { + if (currentCount != 0) { + if (isCompleteState == 1) { + if (currentCount < 0) { Set qi = completeQuestItems.get(questId); - if(qi == null) { + if (qi == null) { Set newSet = new HashSet<>(); newSet.add(currentItemid); @@ -165,9 +132,9 @@ public class MapleQuestItemFetcher { } } } else { - if(currentCount > 0) { + if (currentCount > 0) { Set qi = startQuestItems.get(questId); - if(qi == null) { + if (qi == null) { Set newSet = new HashSet<>(); newSet.add(currentItemid); @@ -178,9 +145,9 @@ public class MapleQuestItemFetcher { } } } else { - if(isCompleteState == 1) { + if (isCompleteState == 1) { Set qi = zeroedCompleteQuestItems.get(questId); - if(qi == null) { + if (qi == null) { Set newSet = new HashSet<>(); newSet.add(currentItemid); @@ -190,7 +157,7 @@ public class MapleQuestItemFetcher { } } else { Set qi = zeroedStartQuestItems.get(questId); - if(qi == null) { + if (qi == null) { Set newSet = new HashSet<>(); newSet.add(currentItemid); @@ -201,27 +168,26 @@ public class MapleQuestItemFetcher { } } } - } catch(Exception e) {} + } catch (Exception e) { + } } - + private static void readItemToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - + processCurrentItem(); - + currentItemid = 0; currentCount = 0; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; - } - else { + } else { String d = getName(token); - - if(d.equals("id")) { + + if (d.equals("id")) { currentItemid = Integer.parseInt(getValue(token)); - } else if(d.equals("count")) { + } else if (d.equals("count")) { currentCount = Integer.parseInt(getValue(token)); } } @@ -231,22 +197,19 @@ public class MapleQuestItemFetcher { String d; int temp; - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { - if(status == 1) { //getting QuestId + } else if (token.contains("imgdir")) { + if (status == 1) { //getting QuestId d = getName(token); questId = Integer.parseInt(d); - } - else if(status == 2) { //start/complete + } else if (status == 2) { //start/complete d = getName(token); isCompleteState = Integer.parseInt(d); - } - else if(status == 3) { + } else if (status == 3) { d = getName(token); - if(d.contains("item")) { + if (d.contains("item")) { temp = status; inspectQuestItemList(temp); } else { @@ -256,41 +219,38 @@ public class MapleQuestItemFetcher { status += 1; } else { - if(status == 3) { + if (status == 3) { d = getName(token); - if(d.equals("end")) { + if (d.equals("end")) { limitedQuestids.add(questId); } } } } - + private static void translateCheckToken(String token) { String d; - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { - if(status == 1) { //getting QuestId + } else if (token.contains("imgdir")) { + if (status == 1) { //getting QuestId d = getName(token); questId = Integer.parseInt(d); - } - else if(status == 2) { //start/complete + } else if (status == 2) { //start/complete d = getName(token); isCompleteState = Integer.parseInt(d); - } - else if(status == 3) { + } else if (status == 3) { forwardCursor(status); } status += 1; } else { - if(status == 3) { + if (status == 3) { d = getName(token); - if(d.equals("end")) { + if (d.equals("end")) { limitedQuestids.add(questId); } } @@ -299,14 +259,14 @@ public class MapleQuestItemFetcher { private static void calculateQuestItemDiff() { // This will remove started quest items from the "to complete" item set. - - for(Entry> qd : startQuestItems.entrySet()) { - for(Integer qi : qd.getValue()) { + + for (Map.Entry> qd : startQuestItems.entrySet()) { + for (Integer qi : qd.getValue()) { Set questSet = completeQuestItems.get(qd.getKey()); - - if(questSet != null) { - if(questSet.remove(qi)) { - if(completeQuestItems.isEmpty()) { + + if (questSet != null) { + if (questSet.remove(qi)) { + if (completeQuestItems.isEmpty()) { completeQuestItems.remove(qd.getKey()); } } @@ -314,37 +274,37 @@ public class MapleQuestItemFetcher { } } } - + private static List> getPairsQuestItem() { // quest items not gained at WZ's quest start - List> list = new ArrayList<>(initialLength); - - for(Entry> qd : completeQuestItems.entrySet()) { - for(Integer qi : qd.getValue()) { + List> list = new ArrayList<>(INITIAL_LENGTH); + + for (Map.Entry> qd : completeQuestItems.entrySet()) { + for (Integer qi : qd.getValue()) { list.add(new Pair<>(qi, qd.getKey())); } } - + return list; } - + private static String getTableName(boolean dropdata) { return dropdata ? "drop_data" : "reactordrops"; } - + private static void filterQuestDropsOnTable(Pair iq, List> itemsWithQuest, boolean dropdata) throws SQLException { PreparedStatement ps = con.prepareStatement("SELECT questid FROM " + getTableName(dropdata) + " WHERE itemid = ?;"); ps.setInt(1, iq.getLeft()); ResultSet rs = ps.executeQuery(); if (rs.isBeforeFirst()) { - while(rs.next()) { + while (rs.next()) { int curQuest = rs.getInt(1); - if(curQuest != iq.getRight()) { + if (curQuest != iq.getRight()) { Set sqSet = startQuestItems.get(curQuest); - if(sqSet != null && sqSet.contains(iq.getLeft())) { + if (sqSet != null && sqSet.contains(iq.getLeft())) { continue; } - + int[] mixed = new int[3]; mixed[0] = iq.getLeft(); mixed[1] = curQuest; @@ -360,176 +320,171 @@ public class MapleQuestItemFetcher { rs.close(); ps.close(); } - + private static void filterQuestDropsOnDB(List> itemsWithQuest) throws SQLException { List> copyItemsWithQuest = new ArrayList<>(itemsWithQuest); try { - for(Pair iq : copyItemsWithQuest) { + for (Pair iq : copyItemsWithQuest) { filterQuestDropsOnTable(iq, itemsWithQuest, true); filterQuestDropsOnTable(iq, itemsWithQuest, false); } - } - catch(SQLException e) { + } catch (SQLException e) { e.printStackTrace(); } } - - private static void filterDirectorySearchMatchingData(String path, List> itemsWithQuest) { - Iterator iter = FileUtils.iterateFiles(new File(directoryName + "/" + path), new String[]{"sql", "js", "txt","java"}, true); - while(iter.hasNext()) { - File file = (File) iter.next(); + private static void filterDirectorySearchMatchingData(String path, List> itemsWithQuest) { + Iterator iter = FileUtils.iterateFiles(new File(path), new String[]{"sql", "js", "txt", "java"}, true); + + while (iter.hasNext()) { + File file = iter.next(); fileSearchMatchingData(file, itemsWithQuest); } } - + private static boolean foundMatchingDataOnFile(String fileContent, String searchStr) { return fileContent.contains(searchStr); } - + private static void fileSearchMatchingData(File file, List> itemsWithQuest) { try { - String fileContent = FileUtils.readFileToString(file, "UTF-8"); - + String fileContent = FileUtils.readFileToString(file, StandardCharsets.UTF_8); + List> copyItemsWithQuest = new ArrayList<>(itemsWithQuest); - for(Pair iq : copyItemsWithQuest) { - if(foundMatchingDataOnFile(fileContent, String.valueOf(iq.getLeft()))) { + for (Pair iq : copyItemsWithQuest) { + if (foundMatchingDataOnFile(fileContent, String.valueOf(iq.getLeft()))) { itemsWithQuest.remove(iq); } } - } catch(IOException ioe) { + } catch (IOException ioe) { System.out.println("Failed to read file: " + file.getAbsolutePath()); ioe.printStackTrace(); } } - + private static void printReportFileHeader() { printWriter.println(" # Report File autogenerated from the MapleQuestItemFetcher feature by Ronan Lana."); printWriter.println(" # Generated data takes into account several data info from the underlying DB, server source files and the server-side WZ.xmls."); printWriter.println(); } - - private static List> getSortedMapEntries0(Map map) { - List> list = new ArrayList<>(map.size()); + + private static List> getSortedMapEntries0(Map map) { + List> list = new ArrayList<>(map.size()); list.addAll(map.entrySet()); - - Collections.sort(list, (o1, o2) -> o1.getKey() - o2.getKey()); - + + list.sort((o1, o2) -> o1.getKey() - o2.getKey()); + return list; } - - private static List> getSortedMapEntries1(Map map) { - List> list = new ArrayList<>(map.size()); + + private static List> getSortedMapEntries1(Map map) { + List> list = new ArrayList<>(map.size()); list.addAll(map.entrySet()); - - Collections.sort(list, (o1, o2) -> o1.getKey() - o2.getKey()); - + + list.sort((o1, o2) -> o1.getKey() - o2.getKey()); + return list; } - + private static List>> getSortedMapEntries2(Map> map) { List>> list = new ArrayList<>(map.size()); - for(Entry> e : map.entrySet()) { + for (Map.Entry> e : map.entrySet()) { List il = new ArrayList<>(2); il.addAll(e.getValue()); - - Collections.sort(il, (o1, o2) -> o1 - o2); - + + il.sort((o1, o2) -> o1 - o2); + list.add(new Pair<>(e.getKey(), il)); } - - Collections.sort(list, (o1, o2) -> o1.getLeft() - o2.getLeft()); - + + list.sort((o1, o2) -> o1.getLeft() - o2.getLeft()); + return list; } - + private static String getExpiredStringLabel(int questid) { return (!limitedQuestids.contains(questid) ? "" : " EXPIRED"); } - - private static void ReportQuestItemData() { + + private static void reportQuestItemData() { // This will reference one line at a time String line = null; String fileName = null; try { - Class.forName(driver).newInstance(); - System.out.println("Reading WZs..."); - - fileName = wzPath + "/Quest.wz/Check.img.xml"; - fileReader = new InputStreamReader(new FileInputStream(fileName), "UTF-8"); + + fileName = WZFiles.QUEST.getFilePath() + "/Check.img.xml"; + InputStreamReader fileReader = new InputStreamReader(new FileInputStream(fileName), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { translateCheckToken(line); // fetch expired quests through here as well } - + bufferedReader.close(); fileReader.close(); - - fileName = wzPath + "/Quest.wz/Act.img.xml"; - fileReader = new InputStreamReader(new FileInputStream(fileName), "UTF-8"); + + fileName = WZFiles.QUEST.getFilePath() + "/Act.img.xml"; + fileReader = new InputStreamReader(new FileInputStream(fileName), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { translateActToken(line); } - + bufferedReader.close(); fileReader.close(); - + System.out.println("Calculating table diffs..."); calculateQuestItemDiff(); - + System.out.println("Filtering drops on DB..."); List> itemsWithQuest = getPairsQuestItem(); - - // filter drop data on DB - con = DriverManager.getConnection(host, username, password); + filterQuestDropsOnDB(itemsWithQuest); con.close(); - + System.out.println("Filtering drops on project files..."); // finally, filter whether this item is mentioned on the source code or not. filterDirectorySearchMatchingData("scripts", itemsWithQuest); filterDirectorySearchMatchingData("sql", itemsWithQuest); filterDirectorySearchMatchingData("src", itemsWithQuest); - + System.out.println("Reporting results..."); // report suspects of missing quest drop data, as well as those drop data that may have incorrect questids. - printWriter = new PrintWriter(newFile, "UTF-8"); - + printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); + printReportFileHeader(); - - if(!mixedQuestidItems.isEmpty()) { + + if (!mixedQuestidItems.isEmpty()) { printWriter.println("INCORRECT QUESTIDS ON DB"); - for(Entry emqi : getSortedMapEntries1(mixedQuestidItems)) { + for (Map.Entry emqi : getSortedMapEntries1(mixedQuestidItems)) { int[] mqi = emqi.getValue(); printWriter.println(mqi[0] + " : " + mqi[1] + " -> " + mqi[2] + getExpiredStringLabel(mqi[2])); } printWriter.println("\n\n\n\n\n"); } - - if(!itemsWithQuest.isEmpty()) { + + if (!itemsWithQuest.isEmpty()) { Map mapIwq = new HashMap<>(itemsWithQuest.size()); - for(Pair iwq : itemsWithQuest) { + for (Pair iwq : itemsWithQuest) { mapIwq.put(iwq.getLeft(), iwq.getRight()); } - + printWriter.println("ITEMS WITH NO QUEST DROP DATA ON DB"); - for(Entry iwq : getSortedMapEntries0(mapIwq)) { + for (Map.Entry iwq : getSortedMapEntries0(mapIwq)) { printWriter.println(iwq.getKey() + " - " + iwq.getValue() + getExpiredStringLabel(iwq.getValue())); } printWriter.println("\n\n\n\n\n"); } - - if(displayExtraInfo) { - if(!zeroedStartQuestItems.isEmpty()) { + + if (DISPLAY_EXTRA_INFO) { + if (!zeroedStartQuestItems.isEmpty()) { printWriter.println("START QUEST ITEMS WITH ZERO QUANTITY"); - for(Pair> iwq : getSortedMapEntries2(zeroedStartQuestItems)) { + for (Pair> iwq : getSortedMapEntries2(zeroedStartQuestItems)) { printWriter.println(iwq.getLeft() + getExpiredStringLabel(iwq.getLeft()) + ":"); - for(Integer i : iwq.getRight()) { + for (Integer i : iwq.getRight()) { printWriter.println(" " + i); } printWriter.println(); @@ -537,11 +492,11 @@ public class MapleQuestItemFetcher { printWriter.println("\n\n\n\n\n"); } - if(!zeroedCompleteQuestItems.isEmpty()) { + if (!zeroedCompleteQuestItems.isEmpty()) { printWriter.println("COMPLETE QUEST ITEMS WITH ZERO QUANTITY"); - for(Pair> iwq : getSortedMapEntries2(zeroedCompleteQuestItems)) { + for (Pair> iwq : getSortedMapEntries2(zeroedCompleteQuestItems)) { printWriter.println(iwq.getLeft() + getExpiredStringLabel(iwq.getLeft()) + ":"); - for(Integer i : iwq.getRight()) { + for (Integer i : iwq.getRight()) { printWriter.println(" " + i); } printWriter.println(); @@ -552,40 +507,23 @@ public class MapleQuestItemFetcher { printWriter.close(); System.out.println("Done!"); - } - - catch(FileNotFoundException ex) { + } catch (FileNotFoundException ex) { System.out.println("Unable to open file '" + fileName + "'"); - } - catch(IOException ex) { + } catch (IOException ex) { System.out.println("Error reading file '" + fileName + "'"); - } - - catch(SQLException e) { + } catch (SQLException e) { System.out.println("Warning: Could not establish connection to database to report quest data."); System.out.println(e.getMessage()); - } - - catch(ClassNotFoundException e) { - System.out.println("Error: could not find class"); - System.out.println(e.getMessage()); - } - - catch(InstantiationException e) { - System.out.println("Error: instantiation failure"); - System.out.println(e.getMessage()); - } - - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + public static void main(String[] args) { - System.setProperty("wzpath", wzPath); + DatabaseConnection.initializeConnectionPool(); // MapleItemInformationProvider loads some unrelated db data ii = MapleItemInformationProvider.getInstance(); - - ReportQuestItemData(); + + reportQuestItemData(); } - } + diff --git a/tools/MapleQuestItemFetcher/lib/QuestReport.txt b/tools/MapleQuestItemFetcher/lib/QuestReport.txt deleted file mode 100644 index 8b24fabf13..0000000000 --- a/tools/MapleQuestItemFetcher/lib/QuestReport.txt +++ /dev/null @@ -1,258 +0,0 @@ - # Report File autogenerated from the MapleQuestItemFetcher feature by Ronan Lana. - # Generated data takes into account several data info from the underlying DB, server source files and the server-side WZ.xmls. - -INCORRECT QUESTIDS ON DB -2022055 : -1 -> 9330 EXPIRED -2022056 : -1 -> 9330 EXPIRED -4001352 : 28205 -> 28206 -4001366 : 28194 -> 28195 -4001367 : 28257 -> 28262 -4001368 : 28258 -> 28262 -4001369 : 28259 -> 28262 -4001370 : 28260 -> 28262 -4001371 : 28261 -> 28262 -4001372 : 28344 -> 28282 -4031107 : -1 -> 3409 -4031116 : -1 -> 3419 -4031130 : 0 -> 3238 -4031164 : 0 -> 2084 -4031189 : 0 -> 3448 -4031218 : 0 -> 3071 -4031223 : 3607 -> 3608 -4031405 : 0 -> 4207 EXPIRED -4031511 : 6904 -> 6914 -4031856 : 0 -> 2191 -4031857 : 0 -> 2192 -4032319 : -1 -> 21723 -4032324 : 21736 -> 21737 -4032339 : 0 -> 21303 - - - - - - -ITEMS WITH NO QUEST DROP DATA ON DB -1302014 - 2048 -2022053 - 9330 EXPIRED -2022054 - 9330 EXPIRED -2022057 - 9332 EXPIRED -3994139 - 10360 EXPIRED -4000142 - 1018 -4001353 - 28227 -4031014 - 2020 -4031015 - 2020 -4031020 - 2050 -4031025 - 2052 -4031026 - 2053 -4031028 - 2054 -4031032 - 2051 -4031039 - 2055 -4031040 - 2056 -4031041 - 2057 -4031042 - 2035 -4031063 - 9260 EXPIRED -4031064 - 8012 -4031117 - 3421 -4031122 - 9340 EXPIRED -4031124 - 9340 EXPIRED -4031144 - 2047 -4031167 - 9052 EXPIRED -4031168 - 9055 EXPIRED -4031169 - 9058 EXPIRED -4031180 - 8020 -4031181 - 9140 EXPIRED -4031182 - 9140 EXPIRED -4031183 - 9140 EXPIRED -4031184 - 9150 EXPIRED -4031185 - 9150 EXPIRED -4031186 - 9150 EXPIRED -4031190 - 3055 -4031191 - 3063 -4031192 - 8700 EXPIRED -4031199 - 3045 -4031201 - 3048 -4031202 - 3050 -4031207 - 3443 -4031220 - 9210 EXPIRED -4031226 - 9321 EXPIRED -4031227 - 4103 EXPIRED -4031230 - 3619 -4031235 - 3615 -4031236 - 3616 -4031237 - 3617 -4031238 - 3618 -4031243 - 3443 -4031257 - 9350 EXPIRED -4031270 - 3630 -4031271 - 9351 EXPIRED -4031272 - 9352 EXPIRED -4031280 - 3633 -4031290 - 4104 EXPIRED -4031291 - 4006 EXPIRED -4031292 - 4006 EXPIRED -4031293 - 4006 EXPIRED -4031296 - 4010 EXPIRED -4031297 - 9386 EXPIRED -4031298 - 3639 -4031301 - 9391 EXPIRED -4031302 - 9503 EXPIRED -4031303 - 4007 EXPIRED -4031304 - 9392 EXPIRED -4031321 - 9504 EXPIRED -4031352 - 4005 EXPIRED -4031354 - 4013 EXPIRED -4031388 - 4218 EXPIRED -4031418 - 8823 EXPIRED -4031419 - 8823 EXPIRED -4031420 - 8823 EXPIRED -4031421 - 8823 EXPIRED -4031448 - 6134 -4031455 - 6280 -4031456 - 6230 -4031462 - 6210 -4031468 - 6222 -4031478 - 6210 -4031488 - 6312 -4031504 - 9640 EXPIRED -4031505 - 9641 EXPIRED -4031506 - 9642 EXPIRED -4031554 - 3821 -4031557 - 9710 EXPIRED -4031558 - 9711 EXPIRED -4031559 - 9712 EXPIRED -4031560 - 9713 EXPIRED -4031561 - 9714 EXPIRED -4031563 - 8855 -4031564 - 8856 -4031565 - 8857 -4031566 - 8858 -4031567 - 8859 -4031570 - 3938 -4031571 - 3940 -4031578 - 3923 -4031582 - 3949 -4031584 - 9731 EXPIRED -4031585 - 9732 EXPIRED -4031586 - 9740 EXPIRED -4031587 - 9741 EXPIRED -4031588 - 9742 EXPIRED -4031590 - 8881 EXPIRED -4031608 - 9803 EXPIRED -4031611 - 9804 EXPIRED -4031612 - 9805 EXPIRED -4031625 - 9820 -4031661 - 9861 EXPIRED -4031662 - 9866 EXPIRED -4031667 - 9863 EXPIRED -4031696 - 3334 -4031697 - 3322 -4031708 - 3309 -4031764 - 4949 EXPIRED -4031766 - 4959 EXPIRED -4031767 - 4947 EXPIRED -4031769 - 4946 EXPIRED -4031770 - 4946 EXPIRED -4031772 - 4942 -4031774 - 3361 -4031785 - 3376 -4031796 - 3362 -4031797 - 3367 -4031806 - 3379 -4031812 - 4950 EXPIRED -4031837 - 9942 EXPIRED -4031839 - 2162 -4031850 - 2180 -4031881 - 4484 EXPIRED -4031921 - 4646 -4032037 - 9154 EXPIRED -4032038 - 9154 EXPIRED -4032039 - 9154 EXPIRED -4032087 - 10081 EXPIRED -4032119 - 28109 EXPIRED -4032136 - 20710 -4032138 - 20712 -4032142 - 20716 -4032196 - 20528 -4032197 - 20528 -4032198 - 20528 -4032233 - 8298 EXPIRED -4032234 - 8299 EXPIRED -4032235 - 8299 EXPIRED -4032236 - 8299 EXPIRED -4032237 - 8299 EXPIRED -4032238 - 8299 EXPIRED -4032239 - 8298 EXPIRED -4032248 - 28108 EXPIRED -4032264 - 10240 EXPIRED -4032265 - 10241 EXPIRED -4032266 - 10240 EXPIRED -4032270 - 10241 EXPIRED -4032271 - 10260 EXPIRED -4032272 - 10268 EXPIRED -4032273 - 10268 EXPIRED -4032275 - 10261 EXPIRED -4032276 - 10262 EXPIRED -4032277 - 10263 EXPIRED -4032278 - 10270 EXPIRED -4032279 - 10271 EXPIRED -4032280 - 10272 EXPIRED -4032281 - 10270 EXPIRED -4032282 - 10271 EXPIRED -4032283 - 10272 EXPIRED -4032284 - 10264 EXPIRED -4032285 - 10265 EXPIRED -4032286 - 10266 EXPIRED -4032287 - 10267 EXPIRED -4032306 - 28120 EXPIRED -4032307 - 28121 EXPIRED -4032308 - 28122 EXPIRED -4032325 - 21751 -4032326 - 21752 -4032331 - 21601 -4032333 - 21608 -4032348 - 10300 EXPIRED -4032349 - 10301 EXPIRED -4032350 - 10302 EXPIRED -4032401 - 2261 -4032402 - 2263 -4032404 - 28128 EXPIRED -4032423 - 21767 -4032435 - 28307 EXPIRED -4032436 - 28314 EXPIRED -4032437 - 28321 EXPIRED -4161000 - 9322 EXPIRED - - - - - - -COMPLETE QUEST ITEMS WITH ZERO QUANTITY -8142: - 4000300 - 4000301 - -8218 EXPIRED: - 4031664 - 4031665 - 4031666 - -8886 EXPIRED: - 4031659 - -8887 EXPIRED: - 4031658 - -8888 EXPIRED: - 4031660 - -28104: - 4032247 - - - - - - - diff --git a/tools/MapleQuestItemFetcher/lib/commons-io-2.6.jar b/tools/MapleQuestItemFetcher/lib/commons-io-2.6.jar deleted file mode 100644 index 00556b119d45dd85a3c3073b1826916c3c60b9c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214788 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

M`<`y}6#-im4-#}g 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%0AvVBjm&;RJ>Kn<2&;(OV+wD=TU;oOZ`se%a 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 - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.awt.image.BufferedImage; - -public interface MapleCanvas { - int getHeight(); - int getWidth(); - BufferedImage getImage(); -} diff --git a/tools/MapleQuestItemFetcher/src/provider/MapleData.java b/tools/MapleQuestItemFetcher/src/provider/MapleData.java deleted file mode 100644 index 4d90a93804..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/MapleData.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.util.List; -import provider.wz.MapleDataType; - -public interface MapleData extends MapleDataEntity, Iterable { - @Override - public String getName(); - public MapleDataType getType(); - public List getChildren(); - public MapleData getChildByPath(String path); - public Object getData(); -} diff --git a/tools/MapleQuestItemFetcher/src/provider/MapleDataDirectoryEntry.java b/tools/MapleQuestItemFetcher/src/provider/MapleDataDirectoryEntry.java deleted file mode 100644 index cb043e0c94..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/MapleDataDirectoryEntry.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.util.List; - -/** - * - * @author Matze - */ -public interface MapleDataDirectoryEntry extends MapleDataEntry { - public List getSubdirectories(); - public List getFiles(); - public MapleDataEntry getEntry(String name); -} diff --git a/tools/MapleQuestItemFetcher/src/provider/MapleDataEntity.java b/tools/MapleQuestItemFetcher/src/provider/MapleDataEntity.java deleted file mode 100644 index 03ff77649c..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/MapleDataEntity.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataEntity { - public String getName(); - public MapleDataEntity getParent(); -} diff --git a/tools/MapleQuestItemFetcher/src/provider/MapleDataEntry.java b/tools/MapleQuestItemFetcher/src/provider/MapleDataEntry.java deleted file mode 100644 index 62db6d0abe..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/MapleDataEntry.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataEntry extends MapleDataEntity { - public String getName(); - public int getSize(); - public int getChecksum(); - public int getOffset(); -} diff --git a/tools/MapleQuestItemFetcher/src/provider/MapleDataFileEntry.java b/tools/MapleQuestItemFetcher/src/provider/MapleDataFileEntry.java deleted file mode 100644 index 902130a612..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/MapleDataFileEntry.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataFileEntry extends MapleDataEntry { - public void setOffset(int offset); -} diff --git a/tools/MapleQuestItemFetcher/src/provider/MapleDataProvider.java b/tools/MapleQuestItemFetcher/src/provider/MapleDataProvider.java deleted file mode 100644 index 5237b7ac37..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/MapleDataProvider.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -public interface MapleDataProvider { - MapleData getData(String path); - MapleDataDirectoryEntry getRoot(); -} diff --git a/tools/MapleQuestItemFetcher/src/provider/MapleDataProviderFactory.java b/tools/MapleQuestItemFetcher/src/provider/MapleDataProviderFactory.java deleted file mode 100644 index 14753d4406..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/MapleDataProviderFactory.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.io.File; -import java.io.IOException; -import provider.wz.WZFile; -import provider.wz.XMLWZFile; - -public class MapleDataProviderFactory { - private final static String wzPath = System.getProperty("wzpath"); - - private static MapleDataProvider getWZ(File in, boolean provideImages) { - if (in.getName().toLowerCase().endsWith("wz") && !in.isDirectory()) { - try { - return new WZFile(in, provideImages); - } catch (IOException e) { - throw new RuntimeException("Loading WZ File failed", e); - } - } else { - return new XMLWZFile(in); - } - } - - public static MapleDataProvider getDataProvider(File in) { - return getWZ(in, false); - } - - public static MapleDataProvider getImageProvidingDataProvider(File in) { - return getWZ(in, true); - } - - public static File fileInWZPath(String filename) { - return new File(wzPath, filename); - } -} \ No newline at end of file diff --git a/tools/MapleQuestItemFetcher/src/provider/MapleDataTool.java b/tools/MapleQuestItemFetcher/src/provider/MapleDataTool.java deleted file mode 100644 index 25f4c7f817..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/MapleDataTool.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.awt.Point; -import java.awt.image.BufferedImage; -import provider.wz.MapleDataType; - -public class MapleDataTool { - public static String getString(MapleData data) { - return ((String) data.getData()); - } - - public static String getString(MapleData data, String def) { - if (data == null || data.getData() == null) { - return def; - } else { - return ((String) data.getData()); - } - } - - public static String getString(String path, MapleData data) { - return getString(data.getChildByPath(path)); - } - - public static String getString(String path, MapleData data, String def) { - return getString(data.getChildByPath(path), def); - } - - public static double getDouble(MapleData data) { - return ((Double) data.getData()).doubleValue(); - } - - public static float getFloat(MapleData data) { - return ((Float) data.getData()).floatValue(); - } - - public static int getInt(MapleData data) { - if (data == null || data.getData() == null) { - return 0;// DEF? - } - return ((Integer) data.getData()).intValue(); - } - - public static int getInt(String path, MapleData data) { - return getInt(data.getChildByPath(path)); - } - - public static int getIntConvert(MapleData data) { - if (data.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(data)); - } else { - return getInt(data); - } - } - - public static int getIntConvert(String path, MapleData data) { - MapleData d = data.getChildByPath(path); - if (d.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(d)); - } else { - return getInt(d); - } - } - - public static int getInt(MapleData data, int def) { - if (data == null || data.getData() == null) { - return def; - } else if (data.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(data)); - } else { - return ((Integer) data.getData()).intValue(); - } - } - - public static int getInt(String path, MapleData data, int def) { - return getInt(data.getChildByPath(path), def); - } - - public static int getIntConvert(String path, MapleData data, int def) { - MapleData d = data.getChildByPath(path); - if (d == null) { - return def; - } - if (d.getType() == MapleDataType.STRING) { - try { - return Integer.parseInt(getString(d)); - } catch (NumberFormatException nfe) { - nfe.printStackTrace(); - return def; - } - } else { - return getInt(d, def); - } - } - - public static BufferedImage getImage(MapleData data) { - return ((MapleCanvas) data.getData()).getImage(); - } - - public static Point getPoint(MapleData data) { - return ((Point) data.getData()); - } - - public static Point getPoint(String path, MapleData data) { - return getPoint(data.getChildByPath(path)); - } - - public static Point getPoint(String path, MapleData data, Point def) { - final MapleData pointData = data.getChildByPath(path); - if (pointData == null) { - return def; - } - return getPoint(pointData); - } - - public static String getFullDataPath(MapleData data) { - String path = ""; - MapleDataEntity myData = data; - while (myData != null) { - path = myData.getName() + "/" + path; - myData = myData.getParent(); - } - return path.substring(0, path.length() - 1); - } -} diff --git a/tools/MapleQuestItemFetcher/src/provider/wz/FileStoredPngMapleCanvas.java b/tools/MapleQuestItemFetcher/src/provider/wz/FileStoredPngMapleCanvas.java deleted file mode 100644 index 21736c2c16..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/wz/FileStoredPngMapleCanvas.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import javax.imageio.ImageIO; -import provider.MapleCanvas; - -public class FileStoredPngMapleCanvas implements MapleCanvas { - private File file; - private int width; - private int height; - private BufferedImage image; - - public FileStoredPngMapleCanvas(int width, int height, File fileIn) { - this.width = width; - this.height = height; - this.file = fileIn; - } - - @Override - public int getHeight() { - return height; - } - - @Override - public int getWidth() { - return width; - } - - @Override - public BufferedImage getImage() { - loadImageIfNecessary(); - return image; - } - - private void loadImageIfNecessary() { - if (image == null) { - try { - image = ImageIO.read(file); - // replace the dimensions loaded from the wz by the REAL dimensions from the image - should be equal tho - width = image.getWidth(); - height = image.getHeight(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } -} diff --git a/tools/MapleQuestItemFetcher/src/provider/wz/ImgMapleSound.java b/tools/MapleQuestItemFetcher/src/provider/wz/ImgMapleSound.java deleted file mode 100644 index 8add2ccb36..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/wz/ImgMapleSound.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -public class ImgMapleSound { - private int dataLength, offset; - - public ImgMapleSound(int dataLength, int offset) { - this.dataLength = dataLength; - this.offset = offset; - } - - public int getDataLength() { - return dataLength; - } - - public int getOffset() { - return offset; - } -} diff --git a/tools/MapleQuestItemFetcher/src/provider/wz/ListWZFile.java b/tools/MapleQuestItemFetcher/src/provider/wz/ListWZFile.java deleted file mode 100644 index 1672a08c59..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/wz/ListWZFile.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import provider.MapleDataProviderFactory; -import tools.data.input.GenericLittleEndianAccessor; -import tools.data.input.InputStreamByteStream; -import tools.data.input.LittleEndianAccessor; - -public class ListWZFile { - private LittleEndianAccessor lea; - private List entries = new ArrayList(); - private static Collection modernImgs = new HashSet(); - - public static byte[] xorBytes(byte[] a, byte[] b) { - byte[] wusched = new byte[a.length]; - for (int i = 0; i < a.length; i++) { - wusched[i] = (byte) (a[i] ^ b[i]); - } - return wusched; - } - - public ListWZFile(File listwz) throws FileNotFoundException { - lea = new GenericLittleEndianAccessor(new InputStreamByteStream(new BufferedInputStream(new FileInputStream(listwz)))); - while (lea.available() > 0) { - int l = lea.readInt() * 2; - byte[] chunk = new byte[l]; - for (int i = 0; i < chunk.length; i++) { - chunk[i] = lea.readByte(); - } - lea.readChar(); - final String value = String.valueOf(WZTool.readListString(chunk)); - entries.add(value); - } - entries = Collections.unmodifiableList(entries); - } - - public List getEntries() { - return entries; - } - - public static void init() { - final String listWz = System.getProperty("listwz"); - if (listWz != null) { - ListWZFile listwz; - try { - listwz = new ListWZFile(MapleDataProviderFactory.fileInWZPath("List.wz")); - modernImgs = new HashSet(listwz.getEntries()); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - } - - public static boolean isModernImgFile(String path) { - return modernImgs.contains(path); - } -} diff --git a/tools/MapleQuestItemFetcher/src/provider/wz/MapleDataType.java b/tools/MapleQuestItemFetcher/src/provider/wz/MapleDataType.java deleted file mode 100644 index e074d57d14..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/wz/MapleDataType.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -public enum MapleDataType { - NONE, IMG_0x00, SHORT, INT, FLOAT, DOUBLE, STRING, EXTENDED, PROPERTY, CANVAS, VECTOR, CONVEX, SOUND, UOL, UNKNOWN_TYPE, UNKNOWN_EXTENDED_TYPE; -} \ No newline at end of file diff --git a/tools/MapleQuestItemFetcher/src/provider/wz/PNGMapleCanvas.java b/tools/MapleQuestItemFetcher/src/provider/wz/PNGMapleCanvas.java deleted file mode 100644 index 97c2303804..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/wz/PNGMapleCanvas.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.Point; -import java.awt.image.BufferedImage; -import java.awt.image.DataBuffer; -import java.awt.image.DataBufferByte; -import java.awt.image.PixelInterleavedSampleModel; -import java.awt.image.Raster; -import java.awt.image.SampleModel; -import java.awt.image.WritableRaster; -import java.util.zip.DataFormatException; -import java.util.zip.Inflater; -import provider.MapleCanvas; - -public class PNGMapleCanvas implements MapleCanvas { - private static final int[] ZAHLEN = new int[]{2, 1, 0, 3}; - private int height; - private int width; - private int dataLength; - private int format; - private byte[] data; - - public PNGMapleCanvas(int width, int height, int dataLength, int format, byte[] data) { - super(); - this.height = height; - this.width = width; - this.dataLength = dataLength; - this.format = format; - this.data = data; - } - - public int getHeight() { - return height; - } - - public int getWidth() { - return width; - } - - public int getFormat() { - return format; - } - - private byte[] getData() { - return data; - } - - @Override - public BufferedImage getImage() { - int sizeUncompressed = 0; - int size8888 = 0; - int maxWriteBuf = 2; - int maxHeight = 3; - byte[] writeBuf = new byte[maxWriteBuf]; - @SuppressWarnings ("unused") - byte[] rowPointers = new byte[maxHeight]; - switch (getFormat()) { - case 1: - case 513: - sizeUncompressed = getHeight() * getWidth() * 4; - break; - case 2: - sizeUncompressed = getHeight() * getWidth() * 8; - break; - case 517: - sizeUncompressed = getHeight() * getWidth() / 128; - break; - } - size8888 = getHeight() * getWidth() * 8; - if (size8888 > maxWriteBuf) { - maxWriteBuf = size8888; - writeBuf = new byte[maxWriteBuf]; - } - if (getHeight() > maxHeight) { - maxHeight = getHeight(); - rowPointers = new byte[maxHeight]; - } - Inflater dec = new Inflater(); - dec.setInput(getData(), 0, dataLength); - int declen = 0; - byte[] uc = new byte[sizeUncompressed]; - try { - declen = dec.inflate(uc); - } catch (DataFormatException ex) { - throw new RuntimeException("zlib fucks", ex); - } - dec.end(); - if (getFormat() == 1) { - for (int i = 0; i < sizeUncompressed; i++) { - byte low = (byte) (uc[i] & 0x0F); - byte high = (byte) (uc[i] & 0xF0); - writeBuf[(i << 1)] = (byte) (((low << 4) | low) & 0xFF); - writeBuf[(i << 1) + 1] = (byte) (high | ((high >>> 4) & 0xF)); - } - } else if (getFormat() == 2) { - writeBuf = uc; - } else if (getFormat() == 513) { - for (int i = 0; i < declen; i += 2) { - byte bBits = (byte) ((uc[i] & 0x1F) << 3); - byte gBits = (byte) (((uc[i + 1] & 0x07) << 5) | ((uc[i] & 0xE0) >> 3)); - byte rBits = (byte) (uc[i + 1] & 0xF8); - writeBuf[(i << 1)] = (byte) (bBits | (bBits >> 5)); - writeBuf[(i << 1) + 1] = (byte) (gBits | (gBits >> 6)); - writeBuf[(i << 1) + 2] = (byte) (rBits | (rBits >> 5)); - writeBuf[(i << 1) + 3] = (byte) 0xFF; - } - } else if (getFormat() == 517) { - byte b = 0x00; - int pixelIndex = 0; - for (int i = 0; i < declen; i++) { - for (int j = 0; j < 8; j++) { - b = (byte) (((uc[i] & (0x01 << (7 - j))) >> (7 - j)) * 255); - for (int k = 0; k < 16; k++) { - pixelIndex = (i << 9) + (j << 6) + k * 2; - writeBuf[pixelIndex] = b; - writeBuf[pixelIndex + 1] = b; - writeBuf[pixelIndex + 2] = b; - writeBuf[pixelIndex + 3] = (byte) 0xFF; - } - } - } - } - DataBufferByte imgData = new DataBufferByte(writeBuf, sizeUncompressed); - SampleModel sm = new PixelInterleavedSampleModel(DataBuffer.TYPE_BYTE, getWidth(), getHeight(), 4, getWidth() * 4, ZAHLEN); - WritableRaster imgRaster = Raster.createWritableRaster(sm, imgData, new Point(0, 0)); - BufferedImage aa = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); - aa.setData(imgRaster); - return aa; - } -} diff --git a/tools/MapleQuestItemFetcher/src/provider/wz/WZDirectoryEntry.java b/tools/MapleQuestItemFetcher/src/provider/wz/WZDirectoryEntry.java deleted file mode 100644 index d24b8cb2b9..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/wz/WZDirectoryEntry.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataEntity; -import provider.MapleDataEntry; -import provider.MapleDataFileEntry; - -public class WZDirectoryEntry extends WZEntry implements MapleDataDirectoryEntry { - private List subdirs = new ArrayList(); - private List files = new ArrayList(); - private Map entries = new HashMap(); - - public WZDirectoryEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(name, size, checksum, parent); - } - - public WZDirectoryEntry() { - super(null, 0, 0, null); - } - - public void addDirectory(MapleDataDirectoryEntry dir) { - subdirs.add(dir); - entries.put(dir.getName(), dir); - } - - public void addFile(MapleDataFileEntry fileEntry) { - files.add(fileEntry); - entries.put(fileEntry.getName(), fileEntry); - } - - public List getSubdirectories() { - return Collections.unmodifiableList(subdirs); - } - - public List getFiles() { - return Collections.unmodifiableList(files); - } - - public MapleDataEntry getEntry(String name) { - return entries.get(name); - } -} diff --git a/tools/MapleQuestItemFetcher/src/provider/wz/WZEntry.java b/tools/MapleQuestItemFetcher/src/provider/wz/WZEntry.java deleted file mode 100644 index 1e921b2082..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/wz/WZEntry.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import provider.MapleDataEntity; -import provider.MapleDataEntry; - -public class WZEntry implements MapleDataEntry { - private String name; - private int size; - private int checksum; - private int offset; - private MapleDataEntity parent; - - public WZEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(); - this.name = name; - this.size = size; - this.checksum = checksum; - this.parent = parent; - } - - public String getName() { - return name; - } - - public int getSize() { - return size; - } - - public int getChecksum() { - return checksum; - } - - public int getOffset() { - return offset; - } - - public MapleDataEntity getParent() { - return parent; - } -} diff --git a/tools/MapleQuestItemFetcher/src/provider/wz/WZFile.java b/tools/MapleQuestItemFetcher/src/provider/wz/WZFile.java deleted file mode 100644 index c6c0abf537..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/wz/WZFile.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.RandomAccessFile; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataFileEntry; -import provider.MapleDataProvider; -import tools.data.input.GenericLittleEndianAccessor; -import tools.data.input.GenericSeekableLittleEndianAccessor; -import tools.data.input.InputStreamByteStream; -import tools.data.input.LittleEndianAccessor; -import tools.data.input.RandomAccessByteStream; -import tools.data.input.SeekableLittleEndianAccessor; - -public class WZFile implements MapleDataProvider { - static { - ListWZFile.init(); - } - private File wzfile; - private LittleEndianAccessor lea; - private SeekableLittleEndianAccessor slea; - private int headerSize; - private WZDirectoryEntry root; - private boolean provideImages; - private int cOffset; - - public WZFile(File wzfile, boolean provideImages) throws IOException { - this.wzfile = wzfile; - lea = new GenericLittleEndianAccessor(new InputStreamByteStream(new BufferedInputStream(new FileInputStream(wzfile)))); - RandomAccessFile raf = new RandomAccessFile(wzfile, "r"); - slea = new GenericSeekableLittleEndianAccessor(new RandomAccessByteStream(raf)); - root = new WZDirectoryEntry(wzfile.getName(), 0, 0, null); - this.provideImages = provideImages; - load(); - } - - private void load() throws IOException { - lea.readAsciiString(4); - lea.readInt(); - lea.readInt(); - headerSize = lea.readInt(); - lea.readNullTerminatedAsciiString(); - lea.readShort(); - parseDirectory(root); - cOffset = (int) lea.getBytesRead(); - getOffsets(root); - } - - private void getOffsets(MapleDataDirectoryEntry dir) { - for (MapleDataFileEntry file : dir.getFiles()) { - file.setOffset(cOffset); - cOffset += file.getSize(); - } - for (MapleDataDirectoryEntry sdir : dir.getSubdirectories()) { - getOffsets(sdir); - } - } - - private void parseDirectory(WZDirectoryEntry dir) { - int entries = WZTool.readValue(lea); - for (int i = 0; i < entries; i++) { - byte marker = lea.readByte(); - String name = null; - int size, checksum; - switch (marker) { - case 0x02: - name = WZTool.readDecodedStringAtOffsetAndReset(slea, lea.readInt() + this.headerSize + 1); - size = WZTool.readValue(lea); - checksum = WZTool.readValue(lea); - lea.readInt(); //dummy int - dir.addFile(new WZFileEntry(name, size, checksum, dir)); - break; - case 0x03: - case 0x04: - name = WZTool.readDecodedString(lea); - size = WZTool.readValue(lea); - checksum = WZTool.readValue(lea); - lea.readInt(); //dummy int - if (marker == 3) { - dir.addDirectory(new WZDirectoryEntry(name, size, checksum, dir)); - } else { - dir.addFile(new WZFileEntry(name, size, checksum, dir)); - } - break; - default: - } - } - for (MapleDataDirectoryEntry idir : dir.getSubdirectories()) { - parseDirectory((WZDirectoryEntry) idir); - } - } - - public WZIMGFile getImgFile(String path) throws IOException { - String segments[] = path.split("/"); - WZDirectoryEntry dir = root; - for (int x = 0; x < segments.length - 1; x++) { - dir = (WZDirectoryEntry) dir.getEntry(segments[x]); - if (dir == null) { - return null; - } - } - WZFileEntry entry = (WZFileEntry) dir.getEntry(segments[segments.length - 1]); - if (entry == null) { - return null; - } - String fullPath = wzfile.getName().substring(0, wzfile.getName().length() - 3).toLowerCase() + "/" + path; - return new WZIMGFile(this.wzfile, entry, provideImages, ListWZFile.isModernImgFile(fullPath)); - } - - @Override - public synchronized MapleData getData(String path) { - try { - WZIMGFile imgFile = getImgFile(path); - if (imgFile == null) { - return null; - } - MapleData ret = imgFile.getRoot(); - return ret; - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - @Override - public MapleDataDirectoryEntry getRoot() { - return root; - } -} diff --git a/tools/MapleQuestItemFetcher/src/provider/wz/WZFileEntry.java b/tools/MapleQuestItemFetcher/src/provider/wz/WZFileEntry.java deleted file mode 100644 index 792371d9cf..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/wz/WZFileEntry.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import provider.MapleDataEntity; -import provider.MapleDataFileEntry; - -public class WZFileEntry extends WZEntry implements MapleDataFileEntry { - private int offset; - - public WZFileEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(name, size, checksum, parent); - } - - @Override - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } -} diff --git a/tools/MapleQuestItemFetcher/src/provider/wz/WZIMGEntry.java b/tools/MapleQuestItemFetcher/src/provider/wz/WZIMGEntry.java deleted file mode 100644 index 385d785183..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/wz/WZIMGEntry.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import provider.MapleData; -import provider.MapleDataEntity; - -public class WZIMGEntry implements MapleData { - private String name; - private MapleDataType type; - private List children = new ArrayList(10); - private Object data; - private MapleDataEntity parent; - - public WZIMGEntry(MapleDataEntity parent) { - this.parent = parent; - } - - @Override - public String getName() { - return name; - } - - @Override - public MapleDataType getType() { - return type; - } - - @Override - public List getChildren() { - return Collections.unmodifiableList(children); - } - - @Override - public MapleData getChildByPath(String path) { - String segments[] = path.split("/"); - if (segments[0].equals("..")) { - return ((MapleData) getParent()).getChildByPath(path.substring(path.indexOf("/") + 1)); - } - MapleData ret = this; - for (int x = 0; x < segments.length; x++) { - boolean foundChild = false; - for (MapleData child : ret.getChildren()) { - if (child.getName().equals(segments[x])) { - ret = child; - foundChild = true; - break; - } - } - if (!foundChild) { - return null; - } - } - return ret; - } - - @Override - public Object getData() { - return data; - } - - public void setName(String name) { - this.name = name; - } - - public void setType(MapleDataType type) { - this.type = type; - } - - public void setData(Object data) { - this.data = data; - } - - public void addChild(WZIMGEntry entry) { - children.add(entry); - } - - @Override - public Iterator iterator() { - return getChildren().iterator(); - } - - @Override - public String toString() { - return getName() + ":" + getData(); - } - - public MapleDataEntity getParent() { - return parent; - } - - public void finish() { - ((ArrayList) children).trimToSize(); - } -} diff --git a/tools/MapleQuestItemFetcher/src/provider/wz/WZIMGFile.java b/tools/MapleQuestItemFetcher/src/provider/wz/WZIMGFile.java deleted file mode 100644 index bec06c78bd..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/wz/WZIMGFile.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.Point; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.io.RandomAccessFile; -import tools.data.input.GenericSeekableLittleEndianAccessor; -import tools.data.input.RandomAccessByteStream; -import tools.data.input.SeekableLittleEndianAccessor; - -public class WZIMGFile { - private WZFileEntry file; - private WZIMGEntry root; - private boolean provideImages; - @SuppressWarnings ("unused") - private boolean modernImg; - - public WZIMGFile(File wzfile, WZFileEntry file, boolean provideImages, boolean modernImg) throws IOException { - RandomAccessFile raf = new RandomAccessFile(wzfile, "r"); - SeekableLittleEndianAccessor slea = new GenericSeekableLittleEndianAccessor(new RandomAccessByteStream(raf)); - slea.seek(file.getOffset()); - this.file = file; - this.provideImages = provideImages; - root = new WZIMGEntry(file.getParent()); - root.setName(file.getName()); - root.setType(MapleDataType.EXTENDED); - this.modernImg = modernImg; - parseExtended(root, slea, 0); - root.finish(); - raf.close(); - } - - protected void dumpImg(OutputStream out, SeekableLittleEndianAccessor slea) throws IOException { - DataOutputStream os = new DataOutputStream(out); - long oldPos = slea.getPosition(); - slea.seek(file.getOffset()); - for (int x = 0; x < file.getSize(); x++) { - os.write(slea.readByte()); - } - slea.seek(oldPos); - } - - public WZIMGEntry getRoot() { - return root; - } - - private void parse(WZIMGEntry entry, SeekableLittleEndianAccessor slea) { - byte marker = slea.readByte(); - switch (marker) { - case 0: { - String name = WZTool.readDecodedString(slea); - entry.setName(name); - break; - } - case 1: { - String name = WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt()); - entry.setName(name); - break; - } - default: - System.out.println("Unknown Image identifier: " + marker + " at offset " + (slea.getPosition() - file.getOffset())); - } - marker = slea.readByte(); - switch (marker) { - case 0: - entry.setType(MapleDataType.IMG_0x00); - break; - case 2: - case 11: //??? no idea, since 0.49 - entry.setType(MapleDataType.SHORT); - entry.setData(Short.valueOf(slea.readShort())); - break; - case 3: - entry.setType(MapleDataType.INT); - entry.setData(Integer.valueOf(WZTool.readValue(slea))); - break; - case 4: - entry.setType(MapleDataType.FLOAT); - entry.setData(Float.valueOf(WZTool.readFloatValue(slea))); - break; - case 5: - entry.setType(MapleDataType.DOUBLE); - entry.setData(Double.valueOf(slea.readDouble())); - break; - case 8: - entry.setType(MapleDataType.STRING); - byte iMarker = slea.readByte(); - if (iMarker == 0) { - entry.setData(WZTool.readDecodedString(slea)); - } else if (iMarker == 1) { - entry.setData(WZTool.readDecodedStringAtOffsetAndReset(slea, slea.readInt() + file.getOffset())); - } else { - System.out.println("Unknown String type " + iMarker); - } - break; - case 9: - entry.setType(MapleDataType.EXTENDED); - long endOfExtendedBlock = slea.readInt(); - endOfExtendedBlock += slea.getPosition(); - parseExtended(entry, slea, endOfExtendedBlock); - break; - default: - System.out.println("Unknown Image type " + marker); - } - } - - private void parseExtended(WZIMGEntry entry, SeekableLittleEndianAccessor slea, long endOfExtendedBlock) { - byte marker = slea.readByte(); - String type; - switch (marker) { - case 0x73: - type = WZTool.readDecodedString(slea); - break; - case 0x1B: - type = WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt()); - break; - default: - throw new RuntimeException("Unknown extended image identifier: " + marker + " at offset " + - (slea.getPosition() - file.getOffset())); - } - if (type.equals("Property")) { - entry.setType(MapleDataType.PROPERTY); - slea.readByte(); - slea.readByte(); - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry cEntry = new WZIMGEntry(entry); - parse(cEntry, slea); - cEntry.finish(); - entry.addChild(cEntry); - } - } else if (type.equals("Canvas")) { - entry.setType(MapleDataType.CANVAS); - slea.readByte(); - marker = slea.readByte(); - if (marker == 0) { - // do nothing - } else if (marker == 1) { - slea.readByte(); - slea.readByte(); - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry child = new WZIMGEntry(entry); - parse(child, slea); - child.finish(); - entry.addChild(child); - } - } else { - System.out.println("Canvas marker != 1 (" + marker + ")"); - } - int width = WZTool.readValue(slea); - int height = WZTool.readValue(slea); - int format = WZTool.readValue(slea); - int format2 = slea.readByte(); - slea.readInt(); - int dataLength = slea.readInt() - 1; - slea.readByte(); - if (provideImages) { - byte[] pngdata = slea.read(dataLength); - entry.setData(new PNGMapleCanvas(width, height, dataLength, format + format2, pngdata)); - } else { - entry.setData(new PNGMapleCanvas(width, height, dataLength, format + format2, null)); - slea.skip(dataLength); - } - } else if (type.equals("Shape2D#Vector2D")) { - entry.setType(MapleDataType.VECTOR); - int x = WZTool.readValue(slea); - int y = WZTool.readValue(slea); - entry.setData(new Point(x, y)); - } else if (type.equals("Shape2D#Convex2D")) { - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry cEntry = new WZIMGEntry(entry); - parseExtended(cEntry, slea, 0); - cEntry.finish(); - entry.addChild(cEntry); - } - } else if (type.equals("Sound_DX8")) { - entry.setType(MapleDataType.SOUND); - slea.readByte(); - int dataLength = WZTool.readValue(slea); - WZTool.readValue(slea); // no clue what this is - int offset = (int) slea.getPosition(); - entry.setData(new ImgMapleSound(dataLength, offset - file.getOffset())); - slea.seek(endOfExtendedBlock); - } else if (type.equals("UOL")) { - entry.setType(MapleDataType.UOL); - slea.readByte(); - byte uolmarker = slea.readByte(); - switch (uolmarker) { - case 0: - entry.setData(WZTool.readDecodedString(slea)); - break; - case 1: - entry.setData(WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt())); - break; - default: - System.out.println("Unknown UOL marker: " + uolmarker + " " + entry.getName()); - } - } else { - throw new RuntimeException("Unhandled extended type: " + type); - } - } -} diff --git a/tools/MapleQuestItemFetcher/src/provider/wz/WZTool.java b/tools/MapleQuestItemFetcher/src/provider/wz/WZTool.java deleted file mode 100644 index 7f5452cd03..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/wz/WZTool.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import tools.data.input.LittleEndianAccessor; -import tools.data.input.SeekableLittleEndianAccessor; - -import javax.crypto.BadPaddingException; -import javax.crypto.Cipher; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.NoSuchPaddingException; -import javax.crypto.spec.SecretKeySpec; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; - -/* - * Ported Code, see WZFile.java for more info - */ -public class WZTool { - private static byte[] encKey; - - static { - byte[] iv = new byte[]{(byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b,}; - byte[] key = new byte[]{(byte) 0x13, 0x00, 0x00, 0x00, - (byte) 0x08, 0x00, 0x00, 0x00, - (byte) 0x06, 0x00, 0x00, 0x00, - (byte) 0xB4, 0x00, 0x00, 0x00, - (byte) 0x1B, 0x00, 0x00, 0x00, - (byte) 0x0F, 0x00, 0x00, 0x00, - (byte) 0x33, 0x00, 0x00, 0x00, - (byte) 0x52, 0x00, 0x00, 0x00 - }; - Cipher cipher = null; - SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); - try { - cipher = Cipher.getInstance("AES"); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (NoSuchPaddingException e) { - e.printStackTrace(); - } - try { - cipher.init(Cipher.ENCRYPT_MODE, skeySpec); - } catch (InvalidKeyException e) { - e.printStackTrace(); - } - encKey = new byte[0xFFFF]; - for (int i = 0; i < (0xFFFF / 16); i++) { - try { - iv = cipher.doFinal(iv); - } catch (IllegalBlockSizeException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } - System.arraycopy(iv, 0, encKey, (i * 16), 16); - } - try { - iv = cipher.doFinal(iv); - } catch (IllegalBlockSizeException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } - System.arraycopy(iv, 0, encKey, 65520, 15); - } - - public static byte[] readListString(byte[] str) { - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ encKey[i]); - } - return str; - } - - public static String readDecodedString(LittleEndianAccessor llea) { - int strLength; - byte b = llea.readByte(); - if (b == 0x00) { - return ""; - } - if (b >= 0) { - if (b == 0x7F) { - strLength = llea.readInt(); - } else { - strLength = b; - } - if (strLength < 0) { - return ""; - } - byte str[] = new byte[strLength * 2]; - for (int i = 0; i < strLength * 2; i++) { - str[i] = llea.readByte(); - } - return DecryptUnicodeStr(str); - } else { - if (b == -128) { - strLength = llea.readInt(); - } else { - strLength = -b; - } - if (strLength < 0) { - return ""; - } - byte str[] = new byte[strLength]; - for (int i = 0; i < strLength; i++) { - str[i] = llea.readByte(); - } - return DecryptAsciiStr(str); - } - } - - public static String DecryptAsciiStr(byte[] str) { - byte xorByte = (byte) 0xAA; - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ xorByte ^ encKey[i]); - xorByte++; - } - return new String(str); - } - - public static String DecryptUnicodeStr(byte[] str) { - int xorByte = 0xAAAA; - char[] charRet = new char[str.length / 2]; - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ encKey[i]); - } - for (int i = 0; i < (str.length / 2); i++) { - char toXor = (char) ((str[i] << 8) | str[i + 1]); - charRet[i] = (char) (toXor ^ xorByte); - xorByte++; - } - return String.valueOf(charRet); - } - - public static String readDecodedStringAtOffset(SeekableLittleEndianAccessor slea, int offset) { - slea.seek(offset); - return readDecodedString(slea); - } - - public static String readDecodedStringAtOffsetAndReset(SeekableLittleEndianAccessor slea, int offset) { - long pos = 0; - pos = slea.getPosition(); - slea.seek(offset); - String ret = readDecodedString(slea); - slea.seek(pos); - return ret; - } - - public static int readValue(LittleEndianAccessor lea) { - byte b = lea.readByte(); - if (b == -128) { - return lea.readInt(); - } else { - return b; - } - } - - public static float readFloatValue(LittleEndianAccessor lea) { - byte b = lea.readByte(); - if (b == -128) { - return lea.readFloat(); - } else { - return 0; - } - } -} \ No newline at end of file diff --git a/tools/MapleQuestItemFetcher/src/provider/wz/XMLDomMapleData.java b/tools/MapleQuestItemFetcher/src/provider/wz/XMLDomMapleData.java deleted file mode 100644 index 151a04c2fd..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/wz/XMLDomMapleData.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package provider.wz; - -import java.awt.Point; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.text.NumberFormat; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import provider.MapleData; -import provider.MapleDataEntity; -import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -public class XMLDomMapleData implements MapleData { - private Node node; - private File imageDataDir; - private NumberFormat nf; - - public XMLDomMapleData(FileInputStream fis, File imageDataDir) { - try { - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - Document document = documentBuilder.parse(fis); - this.node = document.getFirstChild(); - } catch (ParserConfigurationException e) { - throw new RuntimeException(e); - } catch (SAXException e) { - throw new RuntimeException(e); - } catch (IOException e) { - throw new RuntimeException(e); - } - this.imageDataDir = imageDataDir; - this.nf = NumberFormat.getInstance(Locale.FRANCE); - } - - private XMLDomMapleData(Node node) { - this.node = node; - this.nf = NumberFormat.getInstance(Locale.FRANCE); - } - - @Override - public MapleData getChildByPath(String path) { - String segments[] = path.split("/"); - if (segments[0].equals("..")) { - return ((MapleData) getParent()).getChildByPath(path.substring(path.indexOf("/") + 1)); - } - - Node myNode = node; - for (int x = 0; x < segments.length; x++) { - NodeList childNodes = myNode.getChildNodes(); - boolean foundChild = false; - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if (childNode.getNodeType() == Node.ELEMENT_NODE && childNode.getAttributes().getNamedItem("name").getNodeValue().equals(segments[x])) { - myNode = childNode; - foundChild = true; - break; - } - } - if (!foundChild) { - return null; - } - } - XMLDomMapleData ret = new XMLDomMapleData(myNode); - ret.imageDataDir = new File(imageDataDir, getName() + "/" + path).getParentFile(); - return ret; - } - - @Override - public List getChildren() { - List ret = new ArrayList(); - NodeList childNodes = node.getChildNodes(); - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if (childNode.getNodeType() == Node.ELEMENT_NODE) { - XMLDomMapleData child = new XMLDomMapleData(childNode); - child.imageDataDir = new File(imageDataDir, getName()); - ret.add(child); - } - } - return ret; - } - - @Override - public Object getData() { - NamedNodeMap attributes = node.getAttributes(); - MapleDataType type = getType(); - switch (type) { - case DOUBLE: - case FLOAT: - case INT: - case SHORT: { - String value = attributes.getNamedItem("value").getNodeValue(); - Number nval; - - try { - nval = nf.parse(value); - } - catch(java.text.ParseException pe) { - pe.printStackTrace(); - nval = 0.0f; - } - - switch (type) { - case DOUBLE: - return nval.doubleValue(); - case FLOAT: - return nval.floatValue(); - case INT: - return nval.intValue(); - case SHORT: - return nval.shortValue(); - default: - return null; - } - } - case STRING: - case UOL: { - String value = attributes.getNamedItem("value").getNodeValue(); - return value; - } - case VECTOR: { - String x = attributes.getNamedItem("x").getNodeValue(); - String y = attributes.getNamedItem("y").getNodeValue(); - return new Point(Integer.parseInt(x), Integer.parseInt(y)); - } - case CANVAS: { - String width = attributes.getNamedItem("width").getNodeValue(); - String height = attributes.getNamedItem("height").getNodeValue(); - return new FileStoredPngMapleCanvas(Integer.parseInt(width), Integer.parseInt(height), new File( - imageDataDir, getName() + ".png")); - } - default: - return null; - } - } - - @Override - public MapleDataType getType() { - String nodeName = node.getNodeName(); - if (nodeName.equals("imgdir")) { - return MapleDataType.PROPERTY; - } else if (nodeName.equals("canvas")) { - return MapleDataType.CANVAS; - } else if (nodeName.equals("convex")) { - return MapleDataType.CONVEX; - } else if (nodeName.equals("sound")) { - return MapleDataType.SOUND; - } else if (nodeName.equals("uol")) { - return MapleDataType.UOL; - } else if (nodeName.equals("double")) { - return MapleDataType.DOUBLE; - } else if (nodeName.equals("float")) { - return MapleDataType.FLOAT; - } else if (nodeName.equals("int")) { - return MapleDataType.INT; - } else if (nodeName.equals("short")) { - return MapleDataType.SHORT; - } else if (nodeName.equals("string")) { - return MapleDataType.STRING; - } else if (nodeName.equals("vector")) { - return MapleDataType.VECTOR; - } else if (nodeName.equals("null")) { - return MapleDataType.IMG_0x00; - } - return null; - } - - @Override - public MapleDataEntity getParent() { - Node parentNode = node.getParentNode(); - if (parentNode.getNodeType() == Node.DOCUMENT_NODE) { - return null; - } - XMLDomMapleData parentData = new XMLDomMapleData(parentNode); - parentData.imageDataDir = imageDataDir.getParentFile(); - return parentData; - } - - @Override - public String getName() { - return node.getAttributes().getNamedItem("name").getNodeValue(); - } - - @Override - public Iterator iterator() { - return getChildren().iterator(); - } -} diff --git a/tools/MapleQuestItemFetcher/src/provider/wz/XMLWZFile.java b/tools/MapleQuestItemFetcher/src/provider/wz/XMLWZFile.java deleted file mode 100644 index 2a7694fdc9..0000000000 --- a/tools/MapleQuestItemFetcher/src/provider/wz/XMLWZFile.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataProvider; - -public class XMLWZFile implements MapleDataProvider { - private File root; - private WZDirectoryEntry rootForNavigation; - - public XMLWZFile(File fileIn) { - root = fileIn; - rootForNavigation = new WZDirectoryEntry(fileIn.getName(), 0, 0, null); - fillMapleDataEntitys(root, rootForNavigation); - } - - private void fillMapleDataEntitys(File lroot, WZDirectoryEntry wzdir) { - for (File file : lroot.listFiles()) { - String fileName = file.getName(); - if (file.isDirectory() && !fileName.endsWith(".img")) { - WZDirectoryEntry newDir = new WZDirectoryEntry(fileName, 0, 0, wzdir); - wzdir.addDirectory(newDir); - fillMapleDataEntitys(file, newDir); - } else if (fileName.endsWith(".xml")) { - wzdir.addFile(new WZFileEntry(fileName.substring(0, fileName.length() - 4), 0, 0, wzdir)); - } - } - } - - @Override - public MapleData getData(String path) { - File dataFile = new File(root, path + ".xml"); - File imageDataDir = new File(root, path); - if (!dataFile.exists()) { - return null;//bitches - } - FileInputStream fis; - try { - fis = new FileInputStream(dataFile); - } catch (FileNotFoundException e) { - throw new RuntimeException("Datafile " + path + " does not exist in " + root.getAbsolutePath()); - } - final XMLDomMapleData domMapleData; - try { - domMapleData = new XMLDomMapleData(fis, imageDataDir.getParentFile()); - } finally { - try { - fis.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - return domMapleData; - } - - @Override - public MapleDataDirectoryEntry getRoot() { - return rootForNavigation; - } -} diff --git a/tools/MapleQuestItemFetcher/src/tools/ArrayMap.java b/tools/MapleQuestItemFetcher/src/tools/ArrayMap.java deleted file mode 100644 index c08508f7e3..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/ArrayMap.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools; - -import java.util.AbstractMap; -import java.util.AbstractSet; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; - -public class ArrayMap extends AbstractMap { - - static class Entry implements Map.Entry { - protected K key; - protected V value; - - public Entry(K key, V value) { - this.key = key; - this.value = value; - } - - @Override - public K getKey() { - return key; - } - - @Override - public V getValue() { - return value; - } - - @Override - public V setValue(V newValue) { - V oldValue = value; - value = newValue; - return oldValue; - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof Map.Entry)) { - return false; - } - Map.Entry e = (Map.Entry) o; - return (key == null ? e.getKey() == null : key.equals(e.getKey())) && (value == null ? e.getValue() == null : value.equals(e.getValue())); - } - - @Override - public int hashCode() { - int keyHash = (key == null ? 0 : key.hashCode()); - int valueHash = (value == null ? 0 : value.hashCode()); - return keyHash ^ valueHash; - } - - @Override - public String toString() { - return key + "=" + value; - } - } - private Set> entries = null; - private ArrayList> list; - - public ArrayMap() { - list = new ArrayList<>(); - } - - public ArrayMap(Map map) { - list = new ArrayList<>(); - putAll(map); - } - - public ArrayMap(int initialCapacity) { - list = new ArrayList<>(initialCapacity); - } - - @Override - @SuppressWarnings ("unchecked") - public Set> entrySet() { - if (entries == null) { - entries = new AbstractSet>() { - @Override - public void clear() { - throw new UnsupportedOperationException(); - } - - @Override - public Iterator> iterator() { - return list.iterator(); - } - - @Override - public int size() { - return list.size(); - } - }; - } - return (Set>) entries; - } - - @Override - public V put(K key, V value) { - int size = list.size(); - Entry entry = null; - int i; - if (key == null) { - for (i = 0; i < size; i++) { - entry = (list.get(i)); - if (entry.getKey() == null) { - break; - } - } - } else { - for (i = 0; i < size; i++) { - entry = (list.get(i)); - if (key.equals(entry.getKey())) { - break; - } - } - } - V oldValue = null; - if (i < size) { - oldValue = entry.getValue(); - entry.setValue(value); - } else { - list.add(new Entry<>(key, value)); - } - return oldValue; - } -} diff --git a/tools/MapleQuestItemFetcher/src/tools/DatabaseConnection.java b/tools/MapleQuestItemFetcher/src/tools/DatabaseConnection.java deleted file mode 100644 index b887280343..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/DatabaseConnection.java +++ /dev/null @@ -1,51 +0,0 @@ -package tools; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; - -/** - * @author Frz (Big Daddy) - * @author The Real Spookster - some modifications to this beautiful code - */ -public class DatabaseConnection { - private static String DB_URL = "jdbc:mysql://localhost:3306/cosmic"; - private static String DB_USER = "cosmic_server"; - private static String DB_PASS = "snailshell"; - - public static final int RETURN_GENERATED_KEYS = 1; - - private static ThreadLocal con = new ThreadLocalConnection(); - - public static Connection getConnection() { - Connection c = con.get(); - try { - c.getMetaData(); - } catch (SQLException e) { // connection is dead, therefore discard old object 5ever - con.remove(); - c = con.get(); - } - return c; - } - - private static class ThreadLocalConnection extends ThreadLocal { - - @Override - protected Connection initialValue() { - try { - Class.forName("com.mysql.jdbc.Driver"); // touch the mysql driver - } catch (ClassNotFoundException e) { - System.out.println("[SEVERE] SQL Driver Not Found. Consider death by clams."); - e.printStackTrace(); - return null; - } - try { - return DriverManager.getConnection(DB_URL, DB_USER, DB_PASS); - } catch (SQLException e) { - System.out.println("[SEVERE] Unable to make database connection."); - e.printStackTrace(); - return null; - } - } - } -} \ No newline at end of file diff --git a/tools/MapleQuestItemFetcher/src/tools/FilePrinter.java b/tools/MapleQuestItemFetcher/src/tools/FilePrinter.java deleted file mode 100644 index 340129765c..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/FilePrinter.java +++ /dev/null @@ -1,188 +0,0 @@ -package tools; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.text.SimpleDateFormat; -import java.util.Calendar; - -public class FilePrinter { - - public static final String - ACCOUNT_STUCK = "accountStuck.txt", - EXCEPTION_CAUGHT = "exceptionCaught.txt", - CLIENT_START = "clientStartError.txt", - ADD_PLAYER = "addPlayer.txt", - MAPLE_MAP = "mapleMap.txt", - ERROR38 = "error38.txt", - PACKET_LOG = "log.txt", - EXCEPTION = "exceptions.txt", - SQL_EXCEPTION = "sqlexceptions.txt", - PACKET_HANDLER = "PacketHandler/", - PORTAL = "portals/", - NPC = "npcs/", - INVOCABLE = "invocable/", - REACTOR = "reactors/", - QUEST = "quests/", - ITEM = "items/", - MOB_MOVEMENT = "mobmovement.txt", - MAP_SCRIPT = "mapscript/", - DIRECTION = "directions/", - SAVE_CHAR = "saveToDB.txt", - INSERT_CHAR = "insertCharacter.txt", - LOAD_CHAR = "loadCharFromDB.txt", - UNHANDLED_EVENT = "doesNotExist.txt", - SESSION = "sessions.txt", - EXPLOITS = "exploits/", - STORAGE = "storage/", - PACKET_LOGS = "packetlogs/", - DELETED_CHARACTERS = "deletedchars/", - FREDRICK = "fredrick/", - NPC_UNCODED = "uncodedNPCs.txt", - QUEST_UNCODED = "uncodedQuests.txt", - AUTOSAVING_CHARACTER = "saveCharAuto.txt", - SAVING_CHARACTER = "saveChar.txt", - USED_COMMANDS = "usedCommands.txt";//more to come (maps) - - private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //for file system purposes, it's nice to use yyyy-MM-dd - private static final String FILE_PATH = "logs/" + sdf.format(Calendar.getInstance().getTime()) + "/"; // + sdf.format(Calendar.getInstance().getTime()) + "/" - private static final String ERROR = "error/"; - - public static void printError(final String name, final Throwable t) { - System.out.println("Error thrown: " + name); - System.out.println(getString(t)); - FileOutputStream out = null; - final String file = FILE_PATH + ERROR + name; - try { - File outputFile = new File(file); - if (outputFile.getParentFile() != null) { - outputFile.getParentFile().mkdirs(); - } - out = new FileOutputStream(file, true); - out.write(getString(t).getBytes()); - out.write("\n---------------------------------\r\n".getBytes()); - } catch (IOException ess) { - ess.printStackTrace(); - } finally { - try { - if (out != null) { - out.close(); - } - } catch (IOException ignore) { - ignore.printStackTrace(); - } - } - } - - public static void printError(final String name, final Throwable t, final String info) { - System.out.println("Error thrown: " + name); - System.out.println(getString(t)); - FileOutputStream out = null; - final String file = FILE_PATH + ERROR + name; - try { - File outputFile = new File(file); - if (outputFile.getParentFile() != null) { - outputFile.getParentFile().mkdirs(); - } - out = new FileOutputStream(file, true); - out.write((info + "\r\n").getBytes()); - out.write(getString(t).getBytes()); - out.write("\n---------------------------------\r\n".getBytes()); - } catch (IOException ess) { - ess.printStackTrace(); - } finally { - try { - if (out != null) { - out.close(); - } - } catch (IOException ignore) { - ignore.printStackTrace(); - } - } - } - - public static void printError(final String name, final String s) { - System.out.println("Error thrown: " + name); - System.out.println(s); - FileOutputStream out = null; - final String file = FILE_PATH + ERROR + name; - try { - File outputFile = new File(file); - if (outputFile.getParentFile() != null) { - outputFile.getParentFile().mkdirs(); - } - out = new FileOutputStream(file, true); - out.write(s.getBytes()); - //out.write("\n---------------------------------\n".getBytes()); - } catch (IOException ess) { - ess.printStackTrace(); - } finally { - try { - if (out != null) { - out.close(); - } - } catch (IOException ignore) { - ignore.printStackTrace(); - } - } - } - - public static void print(final String name, final String s) { - print(name, s, true); - } - - public static void print(final String name, final String s, boolean line) { - System.out.println("Log: " + name); - System.out.println(s); - FileOutputStream out = null; - String file = FILE_PATH + name; - try { - File outputFile = new File(file); - if (outputFile.getParentFile() != null) { - outputFile.getParentFile().mkdirs(); - } - out = new FileOutputStream(file, true); - out.write(s.getBytes()); - out.write("\r\n".getBytes()); - if (line) { - out.write("---------------------------------\r\n".getBytes()); - } - } catch (IOException ess) { - ess.printStackTrace(); - } finally { - try { - if (out != null) { - out.close(); - } - } catch (IOException ignore) { - ignore.printStackTrace(); - } - } - } - - private static String getString(final Throwable e) { - String retValue = null; - StringWriter sw = null; - PrintWriter pw = null; - try { - sw = new StringWriter(); - pw = new PrintWriter(sw); - e.printStackTrace(pw); - retValue = sw.toString(); - } finally { - try { - if (pw != null) { - pw.close(); - } - if (sw != null) { - sw.close(); - } - } catch (IOException ignore) { - ignore.printStackTrace(); - } - } - return retValue; - } -} \ No newline at end of file diff --git a/tools/MapleQuestItemFetcher/src/tools/HexTool.java b/tools/MapleQuestItemFetcher/src/tools/HexTool.java deleted file mode 100644 index 8cc0c8aa84..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/HexTool.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools; - -import java.io.ByteArrayOutputStream; - -public class HexTool { - private static final char[] HEX = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; - - private static String toString(byte byteValue) { - int tmp = byteValue << 8; - char[] retstr = new char[]{HEX[(tmp >> 12) & 0x0F], HEX[(tmp >> 8) & 0x0F]}; - return String.valueOf(retstr); - } - - public static String toString(byte[] bytes) { - StringBuilder hexed = new StringBuilder(); - for (int i = 0; i < bytes.length; i++) { - hexed.append(toString(bytes[i])); - hexed.append(' '); - } - return hexed.substring(0, hexed.length() - 1); - } - - public static byte[] getByteArrayFromHexString(String hex) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - int nexti = 0; - int nextb = 0; - boolean highoc = true; - outer: - for (;;) { - int number = -1; - while (number == -1) { - if (nexti == hex.length()) { - break outer; - } - char chr = hex.charAt(nexti); - if (chr >= '0' && chr <= '9') { - number = chr - '0'; - } else if (chr >= 'a' && chr <= 'f') { - number = chr - 'a' + 10; - } else if (chr >= 'A' && chr <= 'F') { - number = chr - 'A' + 10; - } else { - number = -1; - } - nexti++; - } - if (highoc) { - nextb = number << 4; - highoc = false; - } else { - nextb |= number; - highoc = true; - baos.write(nextb); - } - } - return baos.toByteArray(); - } -} diff --git a/tools/MapleQuestItemFetcher/src/tools/MapleItemInformationProvider.java b/tools/MapleQuestItemFetcher/src/tools/MapleItemInformationProvider.java deleted file mode 100644 index ec7519db34..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/MapleItemInformationProvider.java +++ /dev/null @@ -1,672 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package tools; - -import provider.*; - -import java.io.File; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.*; -//import server.life.MapleMonsterInformationProvider; - -/** - * - * @author Matze - * - */ -public class MapleItemInformationProvider { - - private static MapleItemInformationProvider instance = null; - protected MapleDataProvider itemData; - protected MapleDataProvider equipData; - protected MapleDataProvider stringData; - protected MapleData cashStringData; - protected MapleData consumeStringData; - protected MapleData eqpStringData; - protected MapleData etcStringData; - protected MapleData insStringData; - protected MapleData petStringData; - protected Map slotMaxCache = new HashMap<>(); - protected Map itemEffects = new HashMap<>(); - protected Map> equipStatsCache = new HashMap<>(); - protected Map equipCache = new HashMap<>(); - protected Map priceCache = new HashMap<>(); - protected Map wholePriceCache = new HashMap<>(); - protected Map projectileWatkCache = new HashMap<>(); - protected Map nameCache = new HashMap<>(); - protected Map descCache = new HashMap<>(); - protected Map msgCache = new HashMap<>(); - protected Map dropRestrictionCache = new HashMap<>(); - protected Map pickupRestrictionCache = new HashMap<>(); - protected Map getMesoCache = new HashMap<>(); - protected Map monsterBookID = new HashMap<>(); - protected Map onEquipUntradableCache = new HashMap<>(); - protected Map karmaCache = new HashMap<>(); - protected Map triggerItemCache = new HashMap<>(); - protected Map expCache = new HashMap<>(); - protected Map levelCache = new HashMap<>(); - protected List> itemNameCache = new ArrayList<>(); - protected Map consumeOnPickupCache = new HashMap<>(); - protected Map isQuestItemCache = new HashMap<>(); - protected Map equipmentSlotCache = new HashMap<>(); - protected Map noCancelMouseCache = new HashMap<>(); - - private MapleItemInformationProvider() { - loadCardIdData(); - itemData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Item.wz")); - equipData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Character.wz")); - stringData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/String.wz")); - cashStringData = stringData.getData("Cash.img"); - consumeStringData = stringData.getData("Consume.img"); - eqpStringData = stringData.getData("Eqp.img"); - etcStringData = stringData.getData("Etc.img"); - insStringData = stringData.getData("Ins.img"); - petStringData = stringData.getData("Pet.img"); - } - - public static MapleItemInformationProvider getInstance() { - if (instance == null) { - instance = new MapleItemInformationProvider(); - } - return instance; - } - - public List> getAllItems() { - if (!itemNameCache.isEmpty()) { - return itemNameCache; - } - List> itemPairs = new ArrayList<>(); - MapleData itemsData; - itemsData = stringData.getData("Cash.img"); - for (MapleData itemFolder : itemsData.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - itemsData = stringData.getData("Consume.img"); - for (MapleData itemFolder : itemsData.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - itemsData = stringData.getData("Eqp.img").getChildByPath("Eqp"); - for (MapleData eqpType : itemsData.getChildren()) { - for (MapleData itemFolder : eqpType.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - } - itemsData = stringData.getData("Etc.img").getChildByPath("Etc"); - for (MapleData itemFolder : itemsData.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - itemsData = stringData.getData("Ins.img"); - for (MapleData itemFolder : itemsData.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - itemsData = stringData.getData("Pet.img"); - for (MapleData itemFolder : itemsData.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - return itemPairs; - } - - public List> getAllEtcItems() { - if (!itemNameCache.isEmpty()) { - return itemNameCache; - } - - List> itemPairs = new ArrayList<>(); - MapleData itemsData; - - itemsData = stringData.getData("Etc.img").getChildByPath("Etc"); - for (MapleData itemFolder : itemsData.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - return itemPairs; - } - - private MapleData getStringData(int itemId) { - String cat = "null"; - MapleData theData; - if (itemId >= 5010000) { - theData = cashStringData; - } else if (itemId >= 2000000 && itemId < 3000000) { - theData = consumeStringData; - } else if ((itemId >= 1010000 && itemId < 1040000) || (itemId >= 1122000 && itemId < 1123000) || (itemId >= 1132000 && itemId < 1133000) || (itemId >= 1142000 && itemId < 1143000)) { - theData = eqpStringData; - cat = "Eqp/Accessory"; - } else if (itemId >= 1000000 && itemId < 1010000) { - theData = eqpStringData; - cat = "Eqp/Cap"; - } else if (itemId >= 1102000 && itemId < 1103000) { - theData = eqpStringData; - cat = "Eqp/Cape"; - } else if (itemId >= 1040000 && itemId < 1050000) { - theData = eqpStringData; - cat = "Eqp/Coat"; - } else if (itemId >= 20000 && itemId < 22000) { - theData = eqpStringData; - cat = "Eqp/Face"; - } else if (itemId >= 1080000 && itemId < 1090000) { - theData = eqpStringData; - cat = "Eqp/Glove"; - } else if (itemId >= 30000 && itemId < 35000) { - theData = eqpStringData; - cat = "Eqp/Hair"; - } else if (itemId >= 1050000 && itemId < 1060000) { - theData = eqpStringData; - cat = "Eqp/Longcoat"; - } else if (itemId >= 1060000 && itemId < 1070000) { - theData = eqpStringData; - cat = "Eqp/Pants"; - } else if (itemId >= 1802000 && itemId < 1842000) { - theData = eqpStringData; - cat = "Eqp/PetEquip"; - } else if (itemId >= 1112000 && itemId < 1120000) { - theData = eqpStringData; - cat = "Eqp/Ring"; - } else if (itemId >= 1092000 && itemId < 1100000) { - theData = eqpStringData; - cat = "Eqp/Shield"; - } else if (itemId >= 1070000 && itemId < 1080000) { - theData = eqpStringData; - cat = "Eqp/Shoes"; - } else if (itemId >= 1900000 && itemId < 2000000) { - theData = eqpStringData; - cat = "Eqp/Taming"; - } else if (itemId >= 1300000 && itemId < 1800000) { - theData = eqpStringData; - cat = "Eqp/Weapon"; - } else if (itemId >= 4000000 && itemId < 5000000) { - theData = etcStringData; - cat = "Etc"; - } else if (itemId >= 3000000 && itemId < 4000000) { - theData = insStringData; - } else if (itemId / 1000 == 5000) { - theData = petStringData; - } else { - return null; - } - if (cat.equalsIgnoreCase("null")) { - return theData.getChildByPath(String.valueOf(itemId)); - } else { - return theData.getChildByPath(cat + "/" + itemId); - } - } - - public boolean noCancelMouse(int itemId) { - if (noCancelMouseCache.containsKey(itemId)) { - return noCancelMouseCache.get(itemId); - } - - MapleData item = getItemData(itemId); - if (item == null) { - noCancelMouseCache.put(itemId, false); - return false; - } - - boolean blockMouse = MapleDataTool.getIntConvert("info/noCancelMouse", item, 0) == 1; - noCancelMouseCache.put(itemId, blockMouse); - return blockMouse; - } - - private MapleData getItemData(int itemId) { - MapleData ret = null; - String idStr = "0" + String.valueOf(itemId); - MapleDataDirectoryEntry root = itemData.getRoot(); - for (MapleDataDirectoryEntry topDir : root.getSubdirectories()) { - for (MapleDataFileEntry iFile : topDir.getFiles()) { - if (iFile.getName().equals(idStr.substring(0, 4) + ".img")) { - ret = itemData.getData(topDir.getName() + "/" + iFile.getName()); - if (ret == null) { - return null; - } - ret = ret.getChildByPath(idStr); - return ret; - } else if (iFile.getName().equals(idStr.substring(1) + ".img")) { - return itemData.getData(topDir.getName() + "/" + iFile.getName()); - } - } - } - root = equipData.getRoot(); - for (MapleDataDirectoryEntry topDir : root.getSubdirectories()) { - for (MapleDataFileEntry iFile : topDir.getFiles()) { - if (iFile.getName().equals(idStr + ".img")) { - return equipData.getData(topDir.getName() + "/" + iFile.getName()); - } - } - } - return ret; - } - - public List getItemIdsInRange(int minId, int maxId, boolean ignoreCashItem) { - List list = new ArrayList<>(); - - if(ignoreCashItem) { - for(int i = minId; i <= maxId; i++) { - if(getItemData(i) != null && !isCash(i)) { - list.add(i); - } - } - } - else { - for(int i = minId; i <= maxId; i++) { - if(getItemData(i) != null) { - list.add(i); - } - } - } - - - return list; - } - - public short getSlotMax(int itemId) { - Short slotMax = slotMaxCache.get(itemId); - if (slotMax != null) { - return slotMax; - } - short ret = 0; - MapleData item = getItemData(itemId); - if (item != null) { - MapleData smEntry = item.getChildByPath("info/slotMax"); - if (smEntry == null) { - ret = 100; - } else { - ret = (short) MapleDataTool.getInt(smEntry); - } - } - - slotMaxCache.put(itemId, ret); - return ret; - } - - public int getMeso(int itemId) { - if (getMesoCache.containsKey(itemId)) { - return getMesoCache.get(itemId); - } - MapleData item = getItemData(itemId); - if (item == null) { - return -1; - } - int pEntry; - MapleData pData = item.getChildByPath("info/meso"); - if (pData == null) { - return -1; - } - pEntry = MapleDataTool.getInt(pData); - getMesoCache.put(itemId, pEntry); - return pEntry; - } - - public int getWholePrice(int itemId) { - if (wholePriceCache.containsKey(itemId)) { - return wholePriceCache.get(itemId); - } - MapleData item = getItemData(itemId); - if (item == null) { - return -1; - } - int pEntry; - MapleData pData = item.getChildByPath("info/price"); - if (pData == null) { - return -1; - } - pEntry = MapleDataTool.getInt(pData); - wholePriceCache.put(itemId, pEntry); - return pEntry; - } - - public double getPrice(int itemId) { - if (priceCache.containsKey(itemId)) { - return priceCache.get(itemId); - } - MapleData item = getItemData(itemId); - if (item == null) { - return -1; - } - double pEntry; - MapleData pData = item.getChildByPath("info/unitPrice"); - if (pData != null) { - try { - pEntry = MapleDataTool.getDouble(pData); - } catch (Exception e) { - pEntry = MapleDataTool.getInt(pData); - } - } else { - pData = item.getChildByPath("info/price"); - if (pData == null) { - return -1; - } - try { - pEntry = MapleDataTool.getInt(pData); - } catch(Exception e) { - priceCache.put(itemId, 0.0); - return 0; - } - } - priceCache.put(itemId, pEntry); - return pEntry; - } - - protected String getEquipmentSlot(int itemId) { - if (equipmentSlotCache.containsKey(itemId)) { - return equipmentSlotCache.get(itemId); - } - - String ret = ""; - - MapleData item = getItemData(itemId); - - if (item == null) { - return null; - } - - MapleData info = item.getChildByPath("info"); - - if (info == null) { - return null; - } - - ret = MapleDataTool.getString("islot", info, ""); - - equipmentSlotCache.put(itemId, ret); - - return ret; - } - - public Map getEquipStats(int itemId) { - if (equipStatsCache.containsKey(itemId)) { - return equipStatsCache.get(itemId); - } - Map ret = new LinkedHashMap<>(); - MapleData item = getItemData(itemId); - if (item == null) { - return null; - } - MapleData info = item.getChildByPath("info"); - if (info == null) { - return null; - } - for (MapleData data : info.getChildren()) { - if (data.getName().startsWith("inc")) { - ret.put(data.getName().substring(3), MapleDataTool.getIntConvert(data)); - } - /*else if (data.getName().startsWith("req")) - ret.put(data.getName(), MapleDataTool.getInt(data.getName(), info, 0));*/ - } - ret.put("reqJob", MapleDataTool.getInt("reqJob", info, 0)); - ret.put("reqLevel", MapleDataTool.getInt("reqLevel", info, 0)); - ret.put("reqDEX", MapleDataTool.getInt("reqDEX", info, 0)); - ret.put("reqSTR", MapleDataTool.getInt("reqSTR", info, 0)); - ret.put("reqINT", MapleDataTool.getInt("reqINT", info, 0)); - ret.put("reqLUK", MapleDataTool.getInt("reqLUK", info, 0)); - ret.put("reqPOP", MapleDataTool.getInt("reqPOP", info, 0)); - ret.put("cash", MapleDataTool.getInt("cash", info, 0)); - ret.put("tuc", MapleDataTool.getInt("tuc", info, 0)); - ret.put("cursed", MapleDataTool.getInt("cursed", info, 0)); - ret.put("success", MapleDataTool.getInt("success", info, 0)); - ret.put("fs", MapleDataTool.getInt("fs", info, 0)); - equipStatsCache.put(itemId, ret); - return ret; - } - - public List getScrollReqs(int itemId) { - List ret = new ArrayList<>(); - MapleData data = getItemData(itemId); - data = data.getChildByPath("req"); - if (data == null) { - return ret; - } - for (MapleData req : data.getChildren()) { - ret.add(MapleDataTool.getInt(req)); - } - return ret; - } - - public String getName(int itemId) { - if (nameCache.containsKey(itemId)) { - return nameCache.get(itemId); - } - MapleData strings = getStringData(itemId); - if (strings == null) { - return null; - } - String ret = MapleDataTool.getString("name", strings, null); - nameCache.put(itemId, ret); - return ret; - } - - public String getMsg(int itemId) { - if (msgCache.containsKey(itemId)) { - return msgCache.get(itemId); - } - MapleData strings = getStringData(itemId); - if (strings == null) { - return null; - } - String ret = MapleDataTool.getString("msg", strings, null); - msgCache.put(itemId, ret); - return ret; - } - - public boolean isDropRestricted(int itemId) { - if (dropRestrictionCache.containsKey(itemId)) { - return dropRestrictionCache.get(itemId); - } - MapleData data = getItemData(itemId); - boolean bRestricted = MapleDataTool.getIntConvert("info/tradeBlock", data, 0) == 1; - if (!bRestricted) { - bRestricted = MapleDataTool.getIntConvert("info/accountSharable", data, 0) == 1; - } - if (!bRestricted) { - bRestricted = MapleDataTool.getIntConvert("info/quest", data, 0) == 1; - } - dropRestrictionCache.put(itemId, bRestricted); - return bRestricted; - } - - public boolean isPickupRestricted(int itemId) { - if (pickupRestrictionCache.containsKey(itemId)) { - return pickupRestrictionCache.get(itemId); - } - MapleData data = getItemData(itemId); - boolean bRestricted = MapleDataTool.getIntConvert("info/only", data, 0) == 1; - pickupRestrictionCache.put(itemId, bRestricted); - return bRestricted; - } - - public Map getSkillStats(int itemId, double playerJob) { - Map ret = new LinkedHashMap<>(); - MapleData item = getItemData(itemId); - if (item == null) { - return null; - } - MapleData info = item.getChildByPath("info"); - if (info == null) { - return null; - } - for (MapleData data : info.getChildren()) { - if (data.getName().startsWith("inc")) { - ret.put(data.getName().substring(3), MapleDataTool.getIntConvert(data)); - } - } - ret.put("masterLevel", MapleDataTool.getInt("masterLevel", info, 0)); - ret.put("reqSkillLevel", MapleDataTool.getInt("reqSkillLevel", info, 0)); - ret.put("success", MapleDataTool.getInt("success", info, 0)); - MapleData skill = info.getChildByPath("skill"); - int curskill; - for (int i = 0; i < skill.getChildren().size(); i++) { - curskill = MapleDataTool.getInt(Integer.toString(i), skill, 0); - if (curskill == 0) { - break; - } - if (curskill / 10000 == playerJob) { - ret.put("skillid", curskill); - break; - } - } - if (ret.get("skillid") == null) { - ret.put("skillid", 0); - } - return ret; - } - - public List petsCanConsume(int itemId) { - List ret = new ArrayList<>(); - MapleData data = getItemData(itemId); - int curPetId; - for (int i = 0; i < data.getChildren().size(); i++) { - curPetId = MapleDataTool.getInt("spec/" + Integer.toString(i), data, 0); - if (curPetId == 0) { - break; - } - ret.add(Integer.valueOf(curPetId)); - } - return ret; - } - - public boolean isQuestItem(int itemId) { - if (isQuestItemCache.containsKey(itemId)) { - return isQuestItemCache.get(itemId); - } - MapleData data = getItemData(itemId); - boolean questItem = MapleDataTool.getIntConvert("info/quest", data, 0) == 1; - isQuestItemCache.put(itemId, questItem); - return questItem; - } - - public int getQuestIdFromItem(int itemId) { - MapleData data = getItemData(itemId); - int questItem = MapleDataTool.getIntConvert("info/quest", data, 0); - return questItem; - } - - private void loadCardIdData() { - PreparedStatement ps = null; - ResultSet rs = null; - Connection con = null; - try { - con = DatabaseConnection.getConnection(); - ps = con.prepareStatement("SELECT cardid, mobid FROM monstercarddata"); - rs = ps.executeQuery(); - while (rs.next()) { - monsterBookID.put(rs.getInt(1), rs.getInt(2)); - } - rs.close(); - ps.close(); - con.close(); - } catch (SQLException e) { - e.printStackTrace(); - } finally { - try { - if (rs != null && !rs.isClosed()) { - rs.close(); - } - if (ps != null && !ps.isClosed()) { - ps.close(); - } - if (con != null && !con.isClosed()) { - con.close(); - } - } catch (SQLException e) { - e.printStackTrace(); - } - } - } - - public int getCardMobId(int id) { - return monsterBookID.get(id); - } - - public boolean isUntradeableOnEquip(int itemId) { - if (onEquipUntradableCache.containsKey(itemId)) { - return onEquipUntradableCache.get(itemId); - } - boolean untradableOnEquip = MapleDataTool.getIntConvert("info/equipTradeBlock", getItemData(itemId), 0) > 0; - onEquipUntradableCache.put(itemId, untradableOnEquip); - return untradableOnEquip; - } - - public boolean isKarmaAble(int itemId) { - if (karmaCache.containsKey(itemId)) { - return karmaCache.get(itemId); - } - boolean bRestricted = MapleDataTool.getIntConvert("info/tradeAvailable", getItemData(itemId), 0) > 0; - karmaCache.put(itemId, bRestricted); - return bRestricted; - } - - public int getStateChangeItem(int itemId) { - if (triggerItemCache.containsKey(itemId)) { - return triggerItemCache.get(itemId); - } else { - int triggerItem = MapleDataTool.getIntConvert("info/stateChangeItem", getItemData(itemId), 0); - triggerItemCache.put(itemId, triggerItem); - return triggerItem; - } - } - - public int getExpById(int itemId) { - if (expCache.containsKey(itemId)) { - return expCache.get(itemId); - } else { - int exp = MapleDataTool.getIntConvert("spec/exp", getItemData(itemId), 0); - expCache.put(itemId, exp); - return exp; - } - } - - public int getMaxLevelById(int itemId) { - if (levelCache.containsKey(itemId)) { - return levelCache.get(itemId); - } else { - int level = MapleDataTool.getIntConvert("info/maxLevel", getItemData(itemId), 256); - levelCache.put(itemId, level); - return level; - } - } - - public boolean isConsumeOnPickup(int itemId) { - if (consumeOnPickupCache.containsKey(itemId)) { - return consumeOnPickupCache.get(itemId); - } - MapleData data = getItemData(itemId); - boolean consume = MapleDataTool.getIntConvert("spec/consumeOnPickup", data, 0) == 1 || MapleDataTool.getIntConvert("specEx/consumeOnPickup", data, 0) == 1; - consumeOnPickupCache.put(itemId, consume); - return consume; - } - - public boolean isCash(int itemId) { - return itemId / 1000000 == 5 || getEquipStats(itemId).get("cash") == 1; - } - - public ArrayList> getItemDataByName(String name) - { - ArrayList> ret = new ArrayList<>(); - for (Pair itemPair : MapleItemInformationProvider.getInstance().getAllItems()) { - if (itemPair.getRight().toLowerCase().contains(name.toLowerCase())) { - ret.add(itemPair); - } - } - return ret; - } -} diff --git a/tools/MapleQuestItemFetcher/src/tools/Pair.java b/tools/MapleQuestItemFetcher/src/tools/Pair.java deleted file mode 100644 index b127e71110..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/Pair.java +++ /dev/null @@ -1,121 +0,0 @@ -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 ~ 2010 Patrick Huy -Matthias Butz -Jan Christian Meyer - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License version 3 -as published by the Free Software Foundation. You may not use, modify -or distribute this program under any other version of the -GNU Affero General Public License. - -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 . - */ -package tools; - -/** - * Represents a pair of values. - * - * @author Frz - * @since Revision 333 - * @version 1.0 - * - * @param The type of the left value. - * @param The type of the right value. - */ -public class Pair { - - public E left; - public F right; - - /** - * Class constructor - pairs two objects together. - * - * @param left The left object. - * @param right The right object. - */ - public Pair(E left, F right) { - this.left = left; - this.right = right; - } - - /** - * Gets the left value. - * - * @return The left value. - */ - public E getLeft() { - return left; - } - - /** - * Gets the right value. - * - * @return The right value. - */ - public F getRight() { - return right; - } - - /** - * Turns the pair into a string. - * - * @return Each value of the pair as a string joined with a colon. - */ - @Override - public String toString() { - return left.toString() + ":" + right.toString(); - } - - /** - * Gets the hash code of this pair. - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((left == null) ? 0 : left.hashCode()); - result = prime * result + ((right == null) ? 0 : right.hashCode()); - return result; - } - - /** - * Checks to see if two pairs are equal. - */ - @SuppressWarnings("unchecked") - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Pair other = (Pair) obj; - if (left == null) { - if (other.left != null) { - return false; - } - } else if (!left.equals(other.left)) { - return false; - } - if (right == null) { - if (other.right != null) { - return false; - } - } else if (!right.equals(other.right)) { - return false; - } - return true; - } -} \ No newline at end of file diff --git a/tools/MapleQuestItemFetcher/src/tools/StringUtil.java b/tools/MapleQuestItemFetcher/src/tools/StringUtil.java deleted file mode 100644 index b471e4aef2..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/StringUtil.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools; - -public class StringUtil { - /** - * Gets a string padded from the left to length by - * padchar. - * - * @param in The input string to be padded. - * @param padchar The character to pad with. - * @param length The length to pad to. - * @return The padded string. - */ - public static String getLeftPaddedStr(String in, char padchar, int length) { - StringBuilder builder = new StringBuilder(length); - for (int x = in.length(); x < length; x++) { - builder.append(padchar); - } - builder.append(in); - return builder.toString(); - } - - /** - * Gets a string padded from the right to length by - * padchar. - * - * @param in The input string to be padded. - * @param padchar The character to pad with. - * @param length The length to pad to. - * @return The padded string. - */ - public static String getRightPaddedStr(String in, char padchar, int length) { - StringBuilder builder = new StringBuilder(in); - for (int x = in.length(); x < length; x++) { - builder.append(padchar); - } - return builder.toString(); - } - - /** - * Joins an array of strings starting from string start with - * a space. - * - * @param arr The array of strings to join. - * @param start Starting from which string. - * @return The joined strings. - */ - public static String joinStringFrom(String arr[], int start) { - return joinStringFrom(arr, start, " "); - } - - /** - * Joins an array of strings starting from string start with - * sep as a seperator. - * - * @param arr The array of strings to join. - * @param start Starting from which string. - * @return The joined strings. - */ - public static String joinStringFrom(String arr[], int start, String sep) { - StringBuilder builder = new StringBuilder(); - for (int i = start; i < arr.length; i++) { - builder.append(arr[i]); - if (i != arr.length - 1) { - builder.append(sep); - } - } - return builder.toString(); - } - - /** - * Makes an enum name human readable (fixes spaces, capitalization, etc) - * - * @param enumName The name of the enum to neaten up. - * @return The human-readable enum name. - */ - public static String makeEnumHumanReadable(String enumName) { - StringBuilder builder = new StringBuilder(enumName.length() + 1); - String[] words = enumName.split("_"); - for (String word : words) { - if (word.length() <= 2) { - builder.append(word); // assume that it's an abbrevation - } else { - builder.append(word.charAt(0)); - builder.append(word.substring(1).toLowerCase()); - } - builder.append(' '); - } - return builder.substring(0, enumName.length()); - } - - /** - * Counts the number of chr's in str. - * - * @param str The string to check for instances of chr. - * @param chr The character to check for. - * @return The number of times chr occurs in str. - */ - public static int countCharacters(String str, char chr) { - int ret = 0; - for (int i = 0; i < str.length(); i++) { - if (str.charAt(i) == chr) { - ret++; - } - } - return ret; - } -} \ No newline at end of file diff --git a/tools/MapleQuestItemFetcher/src/tools/data/input/ByteArrayByteStream.java b/tools/MapleQuestItemFetcher/src/tools/data/input/ByteArrayByteStream.java deleted file mode 100644 index eac7de21ea..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/data/input/ByteArrayByteStream.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import tools.HexTool; - -public class ByteArrayByteStream implements SeekableInputStreamBytestream { - private int pos = 0; - private long bytesRead = 0; - private byte[] arr; - - public ByteArrayByteStream(byte[] arr) { - this.arr = arr; - } - - @Override - public long getPosition() { - return pos; - } - - @Override - public void seek(long offset) throws IOException { - pos = (int) offset; - } - - @Override - public long getBytesRead() { - return bytesRead; - } - - @Override - public int readByte() { - bytesRead++; - return ((int) arr[pos++]) & 0xFF; - } - - @Override - public String toString() { - String nows = "kevintjuh93 pwns";//I lol'd - if (arr.length - pos > 0) { - byte[] now = new byte[arr.length - pos]; - System.arraycopy(arr, pos, now, 0, arr.length - pos); - nows = HexTool.toString(now); - } - return "All: " + HexTool.toString(arr) + "\nNow: " + nows; - } - - @Override - public long available() { - return arr.length - pos; - } -} diff --git a/tools/MapleQuestItemFetcher/src/tools/data/input/ByteInputStream.java b/tools/MapleQuestItemFetcher/src/tools/data/input/ByteInputStream.java deleted file mode 100644 index 107f71843e..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/data/input/ByteInputStream.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -/** - * Represents an abstract stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public interface ByteInputStream { - int readByte(); - long getBytesRead(); - long available(); -} diff --git a/tools/MapleQuestItemFetcher/src/tools/data/input/GenericLittleEndianAccessor.java b/tools/MapleQuestItemFetcher/src/tools/data/input/GenericLittleEndianAccessor.java deleted file mode 100644 index d08a9b8374..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/data/input/GenericLittleEndianAccessor.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.awt.Point; -import java.io.ByteArrayOutputStream; - -/** - * Provides a generic interface to a Little Endian stream of bytes. - * - * @version 1.0 - * @author Frz - * @since Revision 323 - */ -public class GenericLittleEndianAccessor implements LittleEndianAccessor { - private ByteInputStream bs; - - /** - * Class constructor - Wraps the accessor around a stream of bytes. - * - * @param bs The byte stream to wrap the accessor around. - */ - public GenericLittleEndianAccessor(ByteInputStream bs) { - this.bs = bs; - } - - /** - * Read a single byte from the stream. - * - * @return The byte read. - * @see tools.data.input.ByteInputStream#readByte - */ - @Override - public byte readByte() { - return (byte) bs.readByte(); - } - - /** - * Reads an integer from the stream. - * - * @return The integer read. - */ - @Override - public int readInt() { - return bs.readByte() + (bs.readByte() << 8) + (bs.readByte() << 16) + (bs.readByte() << 24); - } - - /** - * Reads a short integer from the stream. - * - * @return The short read. - */ - @Override - public short readShort() { - return (short) (bs.readByte() + (bs.readByte() << 8)); - } - - /** - * Reads a single character from the stream. - * - * @return The character read. - */ - @Override - public char readChar() { - return (char) readShort(); - } - - /** - * Reads a long integer from the stream. - * - * @return The long integer read. - */ - @Override - public long readLong() { - long byte1 = bs.readByte(); - long byte2 = bs.readByte(); - long byte3 = bs.readByte(); - long byte4 = bs.readByte(); - long byte5 = bs.readByte(); - long byte6 = bs.readByte(); - long byte7 = bs.readByte(); - long byte8 = bs.readByte(); - return (byte8 << 56) + (byte7 << 48) + (byte6 << 40) + (byte5 << 32) + (byte4 << 24) + (byte3 << 16) + (byte2 << 8) + byte1; - } - - /** - * Reads a floating point integer from the stream. - * - * @return The float-type integer read. - */ - @Override - public float readFloat() { - return Float.intBitsToFloat(readInt()); - } - - /** - * Reads a double-precision integer from the stream. - * - * @return The double-type integer read. - */ - @Override - public double readDouble() { - return Double.longBitsToDouble(readLong()); - } - - /** - * Reads an ASCII string from the stream with length n. - * - * @param n Number of characters to read. - * @return The string read. - */ - public final String readAsciiString(int n) { - char ret[] = new char[n]; - for (int x = 0; x < n; x++) { - ret[x] = (char) readByte(); - } - return String.valueOf(ret); - } - - /** - * Reads a null-terminated string from the stream. - * - * @return The string read. - */ - public final String readNullTerminatedAsciiString() { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte b; - while (true) { - b = readByte(); - if (b == 0) { - break; - } - baos.write(b); - } - byte[] buf = baos.toByteArray(); - char[] chrBuf = new char[buf.length]; - for (int x = 0; x < buf.length; x++) { - chrBuf[x] = (char) buf[x]; - } - return String.valueOf(chrBuf); - } - - /** - * Gets the number of bytes read from the stream so far. - * - * @return A long integer representing the number of bytes read. - * @see tools.data.input.ByteInputStream#getBytesRead() - */ - public long getBytesRead() { - return bs.getBytesRead(); - } - - /** - * Reads a MapleStory convention lengthed ASCII string. - * This consists of a short integer telling the length of the string, - * then the string itself. - * - * @return The string read. - */ - @Override - public String readMapleAsciiString() { - return readAsciiString(readShort()); - } - - /** - * Reads num bytes off the stream. - * - * @param num The number of bytes to read. - * @return An array of bytes with the length of num - */ - @Override - public byte[] read(int num) { - byte[] ret = new byte[num]; - for (int x = 0; x < num; x++) { - ret[x] = readByte(); - } - return ret; - } - - /** - * Reads a MapleStory Position information. - * This consists of 2 short integer. - * - * @return The Position read. - */ - @Override - public final Point readPos() { - final int x = readShort(); - final int y = readShort(); - return new Point(x, y); - } - - /** - * Skips the current position of the stream num bytes ahead. - * - * @param num Number of bytes to skip. - */ - @Override - public void skip(int num) { - for (int x = 0; x < num; x++) { - readByte(); - } - } - - /** - * @see tools.data.input.ByteInputStream#available - */ - @Override - public long available() { - return bs.available(); - } - - /** - * @see java.lang.Object#toString - */ - @Override - public String toString() { - return bs.toString(); - } -} \ No newline at end of file diff --git a/tools/MapleQuestItemFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java b/tools/MapleQuestItemFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java deleted file mode 100644 index fdd147d796..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; - -/** - * Provides an abstract accessor to a generic Little Endian byte stream. This - * accessor is seekable. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - * @see tools.data.input.GenericLittleEndianAccessor - */ -public class GenericSeekableLittleEndianAccessor extends GenericLittleEndianAccessor implements SeekableLittleEndianAccessor { - private SeekableInputStreamBytestream bs; - - /** - * Class constructor - * Provide a seekable input stream to wrap this object around. - * - * @param bs The byte stream to wrap this around. - */ - public GenericSeekableLittleEndianAccessor(SeekableInputStreamBytestream bs) { - super(bs); - this.bs = bs; - } - - /** - * Seek the pointer to offset - * - * @param offset The offset to seek to. - * @see tools.data.input.SeekableInputStreamBytestream#seek - */ - @Override - public void seek(long offset) { - try { - bs.seek(offset); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("Seek failed " + e); - } - } - - /** - * Get the current position of the pointer. - * - * @return The current position of the pointer as a long integer. - * @see tools.data.input.SeekableInputStreamBytestream#getPosition - */ - @Override - public long getPosition() { - try { - return bs.getPosition(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("getPosition failed" + e); - return -1; - } - } - - /** - * Skip num number of bytes in the stream. - * - * @param num The number of bytes to skip. - */ - @Override - public void skip(int num) { - seek(getPosition() + num); - } -} diff --git a/tools/MapleQuestItemFetcher/src/tools/data/input/InputStreamByteStream.java b/tools/MapleQuestItemFetcher/src/tools/data/input/InputStreamByteStream.java deleted file mode 100644 index 70aef3489f..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/data/input/InputStreamByteStream.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Provides an abstract wrapper to a stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class InputStreamByteStream implements ByteInputStream { - private InputStream is; - private long read = 0; - - /** - * Class constructor. - * Provide an input stream to wrap this around. - * - * @param is The input stream to wrap this object around. - */ - public InputStreamByteStream(InputStream is) { - this.is = is; - } - - /** - * Reads the next byte from the stream. - * - * @return Then next byte in the stream. - */ - @Override - public int readByte() { - int temp; - try { - temp = is.read(); - if (temp == -1) { - throw new RuntimeException("EOF"); - } - read++; - return temp; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - /** - * Gets the number of bytes read from the stream. - * - * @return The number of bytes read as a long integer. - */ - @Override - public long getBytesRead() { - return read; - } - - /** - * Returns the number of bytes left in the stream. - * - * @return The number of bytes available for reading as a long integer. - */ - @Override - public long available() { - try { - return is.available(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("ERROR" + e); - return 0; - } - } -} diff --git a/tools/MapleQuestItemFetcher/src/tools/data/input/LittleEndianAccessor.java b/tools/MapleQuestItemFetcher/src/tools/data/input/LittleEndianAccessor.java deleted file mode 100644 index f991dbf537..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/data/input/LittleEndianAccessor.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.awt.Point; - -/** - * @author Frz - */ -public interface LittleEndianAccessor { - byte readByte(); - char readChar(); - short readShort(); - int readInt(); - Point readPos(); - long readLong(); - void skip(int num); - byte[] read(int num); - float readFloat(); - double readDouble(); - String readAsciiString(int n); - String readNullTerminatedAsciiString(); - String readMapleAsciiString(); - long getBytesRead(); - long available(); -} diff --git a/tools/MapleQuestItemFetcher/src/tools/data/input/RandomAccessByteStream.java b/tools/MapleQuestItemFetcher/src/tools/data/input/RandomAccessByteStream.java deleted file mode 100644 index c0004be17f..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/data/input/RandomAccessByteStream.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import java.io.RandomAccessFile; - -/** - * Provides an abstract layer to a byte stream. This layer can be accessed - * randomly. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class RandomAccessByteStream implements SeekableInputStreamBytestream { - private RandomAccessFile raf; - private long read = 0; - - public RandomAccessByteStream(RandomAccessFile raf) { - super(); - this.raf = raf; - } - - @Override - public int readByte() { - int temp; - try { - temp = raf.read(); - if (temp == -1) { - throw new RuntimeException("EOF"); - } - read++; - return temp; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public void seek(long offset) throws IOException { - raf.seek(offset); - } - - @Override - public long getPosition() throws IOException { - return raf.getFilePointer(); - } - - @Override - public long getBytesRead() { - return read; - } - - @Override - public long available() { - try { - return raf.length() - raf.getFilePointer(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("ERROR " + e); - return 0; - } - } -} diff --git a/tools/MapleQuestItemFetcher/src/tools/data/input/SeekableInputStreamBytestream.java b/tools/MapleQuestItemFetcher/src/tools/data/input/SeekableInputStreamBytestream.java deleted file mode 100644 index f4922dc876..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/data/input/SeekableInputStreamBytestream.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; - -/** - * Provides an abstract interface to a stream of bytes. This stream can be - * seeked. - * - * @author Frz - * @version 1.0 - * @since 299 - */ -public interface SeekableInputStreamBytestream extends ByteInputStream { - /** - * Seeks the stream by the specified offset. - * - * @param offset - * Number of bytes to seek. - * @throws IOException - */ - void seek(long offset) throws IOException; - - /** - * Gets the current position of the stream. - * - * @return The stream position as a long integer. - * @throws IOException - */ - long getPosition() throws IOException; -} diff --git a/tools/MapleQuestItemFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java b/tools/MapleQuestItemFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java deleted file mode 100644 index 16b2317f7a..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -public interface SeekableLittleEndianAccessor extends LittleEndianAccessor { - void seek(long offset); - long getPosition(); -} diff --git a/tools/MapleQuestItemFetcher/src/tools/data/output/BAOSByteOutputStream.java b/tools/MapleQuestItemFetcher/src/tools/data/output/BAOSByteOutputStream.java deleted file mode 100644 index 80cbc9301e..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/data/output/BAOSByteOutputStream.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.io.ByteArrayOutputStream; - -/** - * Uses a byte array to output a stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 352 - */ -class BAOSByteOutputStream implements ByteOutputStream { - private ByteArrayOutputStream baos; - - /** - * Class constructor - Wraps the stream around a Java BAOS. - * - * @param baos The ByteArrayOutputStream to wrap this around. - */ - BAOSByteOutputStream(ByteArrayOutputStream baos) { - super(); - this.baos = baos; - } - - /** - * Writes a byte to the stream. - * - * @param b The byte to write to the stream. - * @see tools.data.output.ByteOutputStream#writeByte(byte) - */ - @Override - public void writeByte(byte b) { - baos.write(b); - } -} diff --git a/tools/MapleQuestItemFetcher/src/tools/data/output/ByteOutputStream.java b/tools/MapleQuestItemFetcher/src/tools/data/output/ByteOutputStream.java deleted file mode 100644 index 0df7ca7753..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/data/output/ByteOutputStream.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -/** - * Provides an interface to an output stream of bytes. - * - * @author Frz - * @since Revision 323 - * @version 1.0 - */ -interface ByteOutputStream { - /** - * Writes a byte to the stream. - * - * @param b The byte to write. - */ - void writeByte(byte b); -} diff --git a/tools/MapleQuestItemFetcher/src/tools/data/output/GenericLittleEndianWriter.java b/tools/MapleQuestItemFetcher/src/tools/data/output/GenericLittleEndianWriter.java deleted file mode 100644 index e804fd8000..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/data/output/GenericLittleEndianWriter.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.awt.Point; -import java.nio.charset.Charset; - -/** - * Provides a generic writer of a little-endian sequence of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class GenericLittleEndianWriter implements LittleEndianWriter { - private static Charset ASCII = Charset.forName("US-ASCII"); - private ByteOutputStream bos; - - /** - * Class constructor - Protected to prevent instantiation with no arguments. - */ - protected GenericLittleEndianWriter() { - // Blah! - } - - /** - * Sets the byte-output stream for this instance of the object. - * - * @param bos The new output stream to set. - */ - void setByteOutputStream(ByteOutputStream bos) { - this.bos = bos; - } - - /** - * Write an array of bytes to the stream. - * - * @param b The bytes to write. - */ - @Override - public void write(byte[] b) { - for (int x = 0; x < b.length; x++) { - bos.writeByte(b[x]); - } - } - - /** - * Write a byte to the stream. - * - * @param b The byte to write. - */ - @Override - public void write(byte b) { - bos.writeByte(b); - } - - /** - * Write a byte in integer form to the stream. - * - * @param b The byte as an Integer to write. - */ - @Override - public void write(int b) { - bos.writeByte((byte) b); - } - - @Override - public void skip(int b) { - write(new byte[b]); - } - - /** - * Write a short integer to the stream. - * - * @param i The short integer to write. - */ - @Override - public void writeShort(int i) { - bos.writeByte((byte) (i & 0xFF)); - bos.writeByte((byte) ((i >>> 8) & 0xFF)); - } - - /** - * Writes an integer to the stream. - * - * @param i The integer to write. - */ - @Override - public void writeInt(int i) { - bos.writeByte((byte) (i & 0xFF)); - bos.writeByte((byte) ((i >>> 8) & 0xFF)); - bos.writeByte((byte) ((i >>> 16) & 0xFF)); - bos.writeByte((byte) ((i >>> 24) & 0xFF)); - } - - /** - * Writes an ASCII string the the stream. - * - * @param s The ASCII string to write. - */ - @Override - public void writeAsciiString(String s) { - write(s.getBytes(ASCII)); - } - - /** - * Writes a maple-convention ASCII string to the stream. - * - * @param s The ASCII string to use maple-convention to write. - */ - @Override - public void writeMapleAsciiString(String s) { - writeShort((short) s.length()); - writeAsciiString(s); - } - - /** - * Writes a null-terminated ASCII string to the stream. - * - * @param s The ASCII string to write. - */ - @Override - public void writeNullTerminatedAsciiString(String s) { - writeAsciiString(s); - write(0); - } - - /** - * Write a long integer to the stream. - * @param l The long integer to write. - */ - @Override - public void writeLong(long l) { - bos.writeByte((byte) (l & 0xFF)); - bos.writeByte((byte) ((l >>> 8) & 0xFF)); - bos.writeByte((byte) ((l >>> 16) & 0xFF)); - bos.writeByte((byte) ((l >>> 24) & 0xFF)); - bos.writeByte((byte) ((l >>> 32) & 0xFF)); - bos.writeByte((byte) ((l >>> 40) & 0xFF)); - bos.writeByte((byte) ((l >>> 48) & 0xFF)); - bos.writeByte((byte) ((l >>> 56) & 0xFF)); - } - - /** - * Writes a 2D 4 byte position information - * - * @param s The Point position to write. - */ - @Override - public void writePos(Point s) { - writeShort(s.x); - writeShort(s.y); - } - - /** - * Writes a boolean true ? 1 : 0 - * - * @param b The boolean to write. - */ - @Override - public void writeBool(final boolean b) { - write(b ? 1 : 0); - } -} diff --git a/tools/MapleQuestItemFetcher/src/tools/data/output/LittleEndianWriter.java b/tools/MapleQuestItemFetcher/src/tools/data/output/LittleEndianWriter.java deleted file mode 100644 index f17bd7c72e..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/data/output/LittleEndianWriter.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package tools.data.output; - -import java.awt.Point; - -/** - * Provides an interface to a writer class that writes a little-endian sequence - * of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public interface LittleEndianWriter { - - /** - * Write an array of bytes to the sequence. - * - * @param b The bytes to write. - */ - public void write(byte b[]); - - /** - * Write a byte to the sequence. - * - * @param b The byte to write. - */ - public void write(byte b); - - /** - * Write a byte in integer form to the sequence. - * - * @param b The byte as an Integer to write. - */ - public void write(int b); - - public void skip(int b); - - /** - * Writes an integer to the sequence. - * - * @param i The integer to write. - */ - public void writeInt(int i); - - /** - * Write a short integer to the sequence. - * - * @param s The short integer to write. - */ - public void writeShort(int s); - - /** - * Write a long integer to the sequence. - * - * @param l The long integer to write. - */ - public void writeLong(long l); - - /** - * Writes an ASCII string the the sequence. - * - * @param s The ASCII string to write. - */ - void writeAsciiString(String s); - - /** - * Writes a null-terminated ASCII string to the sequence. - * - * @param s The ASCII string to write. - */ - void writeNullTerminatedAsciiString(String s); - - /** - * Writes a maple-convention ASCII string to the sequence. - * - * @param s The ASCII string to use maple-convention to write. - */ - void writeMapleAsciiString(String s); - - /** - * Writes a 2D 4 byte position information - * - * @param s The Point position to write. - */ - void writePos(Point s); - - /** - * Writes a boolean true ? 1 : 0 - * - * @param b The boolean to write. - */ - void writeBool(final boolean b); -} diff --git a/tools/MapleQuestItemFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java b/tools/MapleQuestItemFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java deleted file mode 100644 index b02365ec62..0000000000 --- a/tools/MapleQuestItemFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.io.ByteArrayOutputStream; -import tools.HexTool; - -/** - * Writes a maplestory-packet little-endian stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 352 - */ -public class MaplePacketLittleEndianWriter extends GenericLittleEndianWriter { - private ByteArrayOutputStream baos; - - /** - * Constructor - initializes this stream with a default size. - */ - public MaplePacketLittleEndianWriter() { - this(32); - } - - /** - * Constructor - initializes this stream with size size. - * - * @param size The size of the underlying stream. - */ - public MaplePacketLittleEndianWriter(int size) { - this.baos = new ByteArrayOutputStream(size); - setByteOutputStream(new BAOSByteOutputStream(baos)); - } - - /** - * Gets a MaplePacket instance representing this - * sequence of bytes. - * - * @return A MaplePacket with the bytes in this stream. - */ - public byte[] getPacket() { - return baos.toByteArray(); - } - - /** - * Changes this packet into a human-readable hexadecimal stream of bytes. - * - * @return This packet as hex digits. - */ - @Override - public String toString() { - return HexTool.toString(baos.toByteArray()); - } -} From 798ccecb2f6840b3fef728c5baf578f0d94ecaac Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 12:08:40 +0200 Subject: [PATCH 27/36] Move MapleQuestMesoFetcher to main module --- .../tools/mapletools/QuestMesoFetcher.java | 263 +++++++++++++++ .../MapleQuestMesoFetcher/lib/QuestReport.txt | 42 --- .../MapleQuestMesoFetcher.java | 308 ------------------ 3 files changed, 263 insertions(+), 350 deletions(-) create mode 100644 src/main/java/tools/mapletools/QuestMesoFetcher.java delete mode 100644 tools/MapleQuestMesoFetcher/lib/QuestReport.txt delete mode 100644 tools/MapleQuestMesoFetcher/src/maplequestmesofetcher/MapleQuestMesoFetcher.java diff --git a/src/main/java/tools/mapletools/QuestMesoFetcher.java b/src/main/java/tools/mapletools/QuestMesoFetcher.java new file mode 100644 index 0000000000..4bf1a8da95 --- /dev/null +++ b/src/main/java/tools/mapletools/QuestMesoFetcher.java @@ -0,0 +1,263 @@ +package tools.mapletools; + +import provider.wz.WZFiles; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.*; + +/** + * @author RonanLana + *

+ * This application parses the Quest.wz file inputted and generates a report showing + * all cases where a quest takes a meso fee to complete a quest, but it doesn't + * properly checks the player for the needed amount before completing it. + *

+ * Running it should generate a report file under "output" folder with the search results. + */ +public class QuestMesoFetcher { + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("quest_meso_report.txt"); + private static final boolean PRINT_FEES = true; // print missing values as additional info report + private static final int INITIAL_STRING_LENGTH = 50; + + private static final Map checkedMesoQuests = new HashMap<>(); + private static final Map appliedMesoQuests = new HashMap<>(); + private static final Set checkedEndscriptQuests = new HashSet<>(); + + private static PrintWriter printWriter = null; + private static BufferedReader bufferedReader = null; + private static byte status = 0; + private static int questId = -1; + private static int isCompleteState = 0; + private static int currentMeso = 0; + + private static String getName(String token) { + int i, j; + char[] dest; + String d; + + i = token.lastIndexOf("name"); + i = token.indexOf("\"", i) + 1; //lower bound of the string + j = token.indexOf("\"", i); //upper bound + + dest = new char[INITIAL_STRING_LENGTH]; + token.getChars(i, j, dest, 0); + + d = new String(dest); + return (d.trim()); + } + + private static String getValue(String token) { + int i, j; + char[] dest; + String d; + + i = token.lastIndexOf("value"); + i = token.indexOf("\"", i) + 1; //lower bound of the string + j = token.indexOf("\"", i); //upper bound + + dest = new char[INITIAL_STRING_LENGTH]; + token.getChars(i, j, dest, 0); + + d = new String(dest); + return (d.trim()); + } + + private static void forwardCursor(int st) { + String line = null; + + try { + while (status >= st && (line = bufferedReader.readLine()) != null) { + simpleToken(line); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void simpleToken(String token) { + if (token.contains("/imgdir")) { + status -= 1; + } else if (token.contains("imgdir")) { + status += 1; + } + } + + private static void translateTokenAct(String token) { + String d; + + if (token.contains("/imgdir")) { + status -= 1; + } else if (token.contains("imgdir")) { + if (status == 1) { //getting QuestId + d = getName(token); + questId = Integer.parseInt(d); + } else if (status == 2) { //start/complete + d = getName(token); + isCompleteState = Integer.parseInt(d); + } else if (status == 3) { + forwardCursor(status); + } + + status += 1; + } else { + if (token.contains("money")) { + if (isCompleteState != 0) { + d = getValue(token); + + currentMeso = -1 * Integer.parseInt(d); + + if (currentMeso > 0) { + appliedMesoQuests.put(questId, currentMeso); + } + } + } + } + } + + private static void translateTokenCheck(String token) { + String d; + + if (token.contains("/imgdir")) { + status -= 1; + } else if (token.contains("imgdir")) { + if (status == 1) { //getting QuestId + d = getName(token); + questId = Integer.parseInt(d); + } else if (status == 2) { //start/complete + d = getName(token); + isCompleteState = Integer.parseInt(d); + } else if (status == 3) { + forwardCursor(status); + } + + status += 1; + } else { + if (token.contains("endmeso")) { + d = getValue(token); + currentMeso = Integer.parseInt(d); + + checkedMesoQuests.put(questId, currentMeso); + } else if (token.contains("endscript")) { + checkedEndscriptQuests.add(questId); + } + } + } + + private static void readQuestMesoData() throws IOException { + String line; + + InputStreamReader fileReader = new InputStreamReader(new FileInputStream(WZFiles.QUEST.getFilePath() + "/Act.img.xml"), StandardCharsets.UTF_8); + bufferedReader = new BufferedReader(fileReader); + + while ((line = bufferedReader.readLine()) != null) { + translateTokenAct(line); + } + + bufferedReader.close(); + fileReader.close(); + + fileReader = new InputStreamReader(new FileInputStream(WZFiles.QUEST.getFilePath() + "/Check.img.xml"), StandardCharsets.UTF_8); + bufferedReader = new BufferedReader(fileReader); + + while ((line = bufferedReader.readLine()) != null) { + translateTokenCheck(line); + } + + bufferedReader.close(); + fileReader.close(); + } + + private static void printReportFileHeader() { + printWriter.println(" # Report File autogenerated from the MapleQuestMesoFetcher feature by Ronan Lana."); + printWriter.println(" # Generated data takes into account several data info from the server-side WZ.xmls."); + printWriter.println(); + } + + private static void printReportFileResults(Map target, Map base, boolean testingCheck) { + List result = new ArrayList<>(); + List error = new ArrayList<>(); + + Map questFee = new HashMap<>(); + + for (Map.Entry e : base.entrySet()) { + Integer v = target.get(e.getKey()); + + if (v == null) { + if (testingCheck || !checkedEndscriptQuests.contains(e.getKey())) { + result.add(e.getKey()); + questFee.put(e.getKey(), e.getValue()); + } + } else if (v.intValue() != e.getValue().intValue()) { + error.add(e.getKey()); + } + } + + if (!result.isEmpty() || !error.isEmpty()) { + printWriter.println("MISMATCH INFORMATION ON '" + (testingCheck ? "check" : "act") + "':"); + if (!result.isEmpty()) { + result.sort((o1, o2) -> o1 - o2); + + printWriter.println("# MISSING"); + + if (!PRINT_FEES) { + for (Integer i : result) { + printWriter.println(i); + } + } else { + for (Integer i : result) { + printWriter.println(i + " " + questFee.get(i)); + } + } + + printWriter.println(); + } + + if (!error.isEmpty() && testingCheck) { + error.sort((o1, o2) -> o1 - o2); + + printWriter.println("# WRONG VALUE"); + + for (Integer i : error) { + printWriter.println(i); + } + + printWriter.println(); + } + + printWriter.println("\r\n"); + } + } + + private static void reportQuestMesoData() { + // This will reference one line at a time + + try { + System.out.println("Reading WZs..."); + readQuestMesoData(); + + System.out.println("Reporting results..."); + // report missing meso checks on quest completes + printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); + + printReportFileHeader(); + + printReportFileResults(checkedMesoQuests, appliedMesoQuests, true); + printReportFileResults(appliedMesoQuests, checkedMesoQuests, false); + + printWriter.close(); + System.out.println("Done!"); + } catch (FileNotFoundException ex) { + System.out.println("Unable to open quest file."); + } catch (IOException ex) { + System.out.println("Error reading quest file."); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + reportQuestMesoData(); + } +} + diff --git a/tools/MapleQuestMesoFetcher/lib/QuestReport.txt b/tools/MapleQuestMesoFetcher/lib/QuestReport.txt deleted file mode 100644 index a72a1d58cd..0000000000 --- a/tools/MapleQuestMesoFetcher/lib/QuestReport.txt +++ /dev/null @@ -1,42 +0,0 @@ - # Report File autogenerated from the MapleQuestMesoFetcher feature by Ronan Lana. - # Generated data takes into account several data info from the server-side WZ.xmls. - -MISMATCH INFORMATION ON 'check': -# MISSING -2215 2000 -3046 10000 -3048 20000 -3069 10000 -3079 300000 -3095 10000 -3305 10000 -3306 10000 -3377 20000 -3612 1000 -3613 1000 -3614 1000 -3623 5000 -5009 50 -5010 50 -5011 50 -5012 50 -6000 1000000 -8078 1000000 -8079 5000000 -8207 2500 -9310 1000 -9311 2500 -9340 1000 -9341 2500 -20504 10000000 -20511 25000000 -20512 15000000 -20532 50000000 -20534 100000000 -21605 20000000 -21606 10000000 -21611 80000000 -21617 100000000 - - - diff --git a/tools/MapleQuestMesoFetcher/src/maplequestmesofetcher/MapleQuestMesoFetcher.java b/tools/MapleQuestMesoFetcher/src/maplequestmesofetcher/MapleQuestMesoFetcher.java deleted file mode 100644 index 28b039024f..0000000000 --- a/tools/MapleQuestMesoFetcher/src/maplequestmesofetcher/MapleQuestMesoFetcher.java +++ /dev/null @@ -1,308 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package maplequestmesofetcher; - -import java.io.*; -import java.sql.Connection; -import java.util.*; -import java.util.Map.Entry; - -/** - * - * @author RonanLana - - This application parses the Quest.wz file inputted and generates a report showing - all cases where a quest takes a meso fee to complete a quest, but it doesn't - properly checks the player for the needed amount before completing it. - - Running it should generate a report file under "lib" folder with the search results. - - */ -public class MapleQuestMesoFetcher { - static boolean printFees = true; // print missing values as additional info report - - static String actName = "../../wz/Quest.wz/Act.img.xml"; - static String checkName = "../../wz/Quest.wz/Check.img.xml"; - static String directoryName = "../.."; - static String newFile = "lib/QuestReport.txt"; - - static Connection con = null; - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static int initialLength = 200; - static int initialStringLength = 50; - - static byte status = 0; - static int questId = -1; - static int isCompleteState = 0; - - static int currentMeso = 0; - - static Map checkedMesoQuests = new HashMap<>(); - static Map appliedMesoQuests = new HashMap<>(); - static Set checkedEndscriptQuests = new HashSet<>(); - - private static String getName(String token) { - int i, j; - char[] dest; - String d; - - i = token.lastIndexOf("name"); - i = token.indexOf("\"", i) + 1; //lower bound of the string - j = token.indexOf("\"", i); //upper bound - - dest = new char[initialStringLength]; - token.getChars(i, j, dest, 0); - - d = new String(dest); - return(d.trim()); - } - - private static String getValue(String token) { - int i, j; - char[] dest; - String d; - - i = token.lastIndexOf("value"); - i = token.indexOf("\"", i) + 1; //lower bound of the string - j = token.indexOf("\"", i); //upper bound - - dest = new char[initialStringLength]; - token.getChars(i, j, dest, 0); - - d = new String(dest); - return(d.trim()); - } - - private static void forwardCursor(int st) { - String line = null; - - try { - while(status >= st && (line = bufferedReader.readLine()) != null) { - simpleToken(line); - } - } - catch(Exception e) { - e.printStackTrace(); - } - } - - private static void simpleToken(String token) { - if(token.contains("/imgdir")) { - status -= 1; - } - else if(token.contains("imgdir")) { - status += 1; - } - } - - private static void translateTokenAct(String token) { - String d; - - if(token.contains("/imgdir")) { - status -= 1; - } - else if(token.contains("imgdir")) { - if(status == 1) { //getting QuestId - d = getName(token); - questId = Integer.parseInt(d); - } - else if(status == 2) { //start/complete - d = getName(token); - isCompleteState = Integer.parseInt(d); - } - else if(status == 3) { - forwardCursor(status); - } - - status += 1; - } - else { - if(token.contains("money")) { - if(isCompleteState != 0) { - d = getValue(token); - - currentMeso = -1 * Integer.valueOf(d); - - if(currentMeso > 0) { - appliedMesoQuests.put(questId, currentMeso); - } - } - } - } - } - - private static void translateTokenCheck(String token) { - String d; - - if(token.contains("/imgdir")) { - status -= 1; - } - else if(token.contains("imgdir")) { - if(status == 1) { //getting QuestId - d = getName(token); - questId = Integer.parseInt(d); - } - else if(status == 2) { //start/complete - d = getName(token); - isCompleteState = Integer.parseInt(d); - } - else if(status == 3) { - forwardCursor(status); - } - - status += 1; - } - else { - if(token.contains("endmeso")) { - d = getValue(token); - currentMeso = Integer.valueOf(d); - - checkedMesoQuests.put(questId, currentMeso); - } else if(token.contains("endscript")) { - checkedEndscriptQuests.add(questId); - } - } - } - - private static void readQuestMesoData() throws IOException { - String line; - - fileReader = new InputStreamReader(new FileInputStream(actName), "UTF-8"); - bufferedReader = new BufferedReader(fileReader); - - while((line = bufferedReader.readLine()) != null) { - translateTokenAct(line); - } - - bufferedReader.close(); - fileReader.close(); - - fileReader = new InputStreamReader(new FileInputStream(checkName), "UTF-8"); - bufferedReader = new BufferedReader(fileReader); - - while((line = bufferedReader.readLine()) != null) { - translateTokenCheck(line); - } - - bufferedReader.close(); - fileReader.close(); - } - - private static void printReportFileHeader() { - printWriter.println(" # Report File autogenerated from the MapleQuestMesoFetcher feature by Ronan Lana."); - printWriter.println(" # Generated data takes into account several data info from the server-side WZ.xmls."); - printWriter.println(); - } - - private static void printReportFileResults(Map target, Map base, boolean testingCheck) { - List result = new ArrayList<>(); - List error = new ArrayList<>(); - - Map questFee = new HashMap<>(); - - for(Entry e : base.entrySet()) { - Integer v = target.get(e.getKey()); - - if(v == null) { - if(testingCheck || !checkedEndscriptQuests.contains(e.getKey())) { - result.add(e.getKey()); - questFee.put(e.getKey(), e.getValue()); - } - } else if(v.intValue() != e.getValue().intValue()) { - error.add(e.getKey()); - } - } - - if(!result.isEmpty() || !error.isEmpty()) { - printWriter.println("MISMATCH INFORMATION ON '" + (testingCheck ? "check" : "act") + "':"); - if(!result.isEmpty()) { - Collections.sort(result, (o1, o2) -> o1 - o2); - - printWriter.println("# MISSING"); - - if(!printFees) { - for(Integer i : result) { - printWriter.println(i); - } - } else { - for(Integer i : result) { - printWriter.println(i + " " + questFee.get(i)); - } - } - - printWriter.println(); - } - - if(!error.isEmpty() && testingCheck) { - Collections.sort(error, (o1, o2) -> o1 - o2); - - printWriter.println("# WRONG VALUE"); - - for(Integer i : error) { - printWriter.println(i); - } - - printWriter.println(); - } - - printWriter.println("\r\n"); - } - } - - private static void ReportQuestMesoData() { - // This will reference one line at a time - - try { - System.out.println("Reading WZs..."); - readQuestMesoData(); - - System.out.println("Reporting results..."); - // report missing meso checks on quest completes - printWriter = new PrintWriter(newFile, "UTF-8"); - - printReportFileHeader(); - - printReportFileResults(checkedMesoQuests, appliedMesoQuests, true); - printReportFileResults(appliedMesoQuests, checkedMesoQuests, false); - - printWriter.close(); - System.out.println("Done!"); - } - - catch(FileNotFoundException ex) { - System.out.println("Unable to open quest file."); - } - catch(IOException ex) { - System.out.println("Error reading quest file."); - } - - catch(Exception e) { - e.printStackTrace(); - } - } - - public static void main(String[] args) { - ReportQuestMesoData(); - } - -} From d09b2371573af894647b3c8e54baf174f981a8c6 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 13:52:33 +0200 Subject: [PATCH 28/36] Move MapleDojoUpdate to main module, use existing wz files --- .../java/tools/mapletools/DojoUpdate.java | 165 ++-- .../lib/original/925020100.img.xml | 859 ----------------- .../lib/original/925020101.img.xml | 25 - .../lib/original/925020102.img.xml | 25 - .../lib/original/925020103.img.xml | 25 - .../lib/original/925020104.img.xml | 25 - .../lib/original/925020105.img.xml | 25 - .../lib/original/925020106.img.xml | 25 - .../lib/original/925020107.img.xml | 25 - .../lib/original/925020108.img.xml | 25 - .../lib/original/925020109.img.xml | 25 - .../lib/original/925020200.img.xml | 859 ----------------- .../lib/original/925020201.img.xml | 25 - .../lib/original/925020202.img.xml | 25 - .../lib/original/925020203.img.xml | 25 - .../lib/original/925020204.img.xml | 25 - .../lib/original/925020205.img.xml | 25 - .../lib/original/925020206.img.xml | 25 - .../lib/original/925020207.img.xml | 25 - .../lib/original/925020208.img.xml | 25 - .../lib/original/925020209.img.xml | 25 - .../lib/original/925020300.img.xml | 859 ----------------- .../lib/original/925020301.img.xml | 25 - .../lib/original/925020302.img.xml | 25 - .../lib/original/925020303.img.xml | 25 - .../lib/original/925020304.img.xml | 25 - .../lib/original/925020305.img.xml | 25 - .../lib/original/925020306.img.xml | 25 - .../lib/original/925020307.img.xml | 25 - .../lib/original/925020308.img.xml | 25 - .../lib/original/925020309.img.xml | 25 - .../lib/original/925020400.img.xml | 859 ----------------- .../lib/original/925020401.img.xml | 25 - .../lib/original/925020402.img.xml | 25 - .../lib/original/925020403.img.xml | 25 - .../lib/original/925020404.img.xml | 25 - .../lib/original/925020405.img.xml | 25 - .../lib/original/925020406.img.xml | 25 - .../lib/original/925020407.img.xml | 25 - .../lib/original/925020408.img.xml | 25 - .../lib/original/925020409.img.xml | 25 - .../lib/original/925020500.img.xml | 859 ----------------- .../lib/original/925020501.img.xml | 25 - .../lib/original/925020502.img.xml | 25 - .../lib/original/925020503.img.xml | 25 - .../lib/original/925020504.img.xml | 25 - .../lib/original/925020505.img.xml | 25 - .../lib/original/925020506.img.xml | 25 - .../lib/original/925020507.img.xml | 25 - .../lib/original/925020508.img.xml | 25 - .../lib/original/925020509.img.xml | 25 - .../lib/original/925020600.img.xml | 802 ---------------- .../lib/original/925020601.img.xml | 24 - .../lib/original/925020602.img.xml | 24 - .../lib/original/925020603.img.xml | 24 - .../lib/original/925020604.img.xml | 24 - .../lib/original/925020605.img.xml | 24 - .../lib/original/925020606.img.xml | 24 - .../lib/original/925020607.img.xml | 24 - .../lib/original/925020608.img.xml | 24 - .../lib/original/925020609.img.xml | 24 - .../lib/original/925020610.img.xml | 859 ----------------- .../lib/original/925020700.img.xml | 859 ----------------- .../lib/original/925020701.img.xml | 25 - .../lib/original/925020702.img.xml | 25 - .../lib/original/925020703.img.xml | 25 - .../lib/original/925020704.img.xml | 25 - .../lib/original/925020705.img.xml | 25 - .../lib/original/925020706.img.xml | 25 - .../lib/original/925020707.img.xml | 25 - .../lib/original/925020708.img.xml | 25 - .../lib/original/925020709.img.xml | 25 - .../lib/original/925020800.img.xml | 859 ----------------- .../lib/original/925020801.img.xml | 25 - .../lib/original/925020802.img.xml | 25 - .../lib/original/925020803.img.xml | 25 - .../lib/original/925020804.img.xml | 25 - .../lib/original/925020805.img.xml | 25 - .../lib/original/925020806.img.xml | 25 - .../lib/original/925020807.img.xml | 25 - .../lib/original/925020808.img.xml | 25 - .../lib/original/925020809.img.xml | 25 - .../lib/original/925020900.img.xml | 859 ----------------- .../lib/original/925020901.img.xml | 25 - .../lib/original/925020902.img.xml | 25 - .../lib/original/925020903.img.xml | 25 - .../lib/original/925020904.img.xml | 25 - .../lib/original/925020905.img.xml | 25 - .../lib/original/925020906.img.xml | 25 - .../lib/original/925020907.img.xml | 25 - .../lib/original/925020908.img.xml | 25 - .../lib/original/925020909.img.xml | 25 - .../lib/original/925021000.img.xml | 859 ----------------- .../lib/original/925021001.img.xml | 25 - .../lib/original/925021002.img.xml | 25 - .../lib/original/925021003.img.xml | 25 - .../lib/original/925021004.img.xml | 25 - .../lib/original/925021005.img.xml | 25 - .../lib/original/925021006.img.xml | 25 - .../lib/original/925021007.img.xml | 25 - .../lib/original/925021008.img.xml | 25 - .../lib/original/925021009.img.xml | 25 - .../lib/original/925021100.img.xml | 859 ----------------- .../lib/original/925021101.img.xml | 25 - .../lib/original/925021102.img.xml | 25 - .../lib/original/925021103.img.xml | 25 - .../lib/original/925021104.img.xml | 25 - .../lib/original/925021105.img.xml | 25 - .../lib/original/925021106.img.xml | 25 - .../lib/original/925021107.img.xml | 25 - .../lib/original/925021108.img.xml | 25 - .../lib/original/925021109.img.xml | 25 - .../lib/original/925021200.img.xml | 802 ---------------- .../lib/original/925021201.img.xml | 24 - .../lib/original/925021202.img.xml | 24 - .../lib/original/925021203.img.xml | 24 - .../lib/original/925021204.img.xml | 24 - .../lib/original/925021205.img.xml | 24 - .../lib/original/925021206.img.xml | 24 - .../lib/original/925021207.img.xml | 24 - .../lib/original/925021208.img.xml | 24 - .../lib/original/925021209.img.xml | 24 - .../lib/original/925021300.img.xml | 859 ----------------- .../lib/original/925021301.img.xml | 25 - .../lib/original/925021302.img.xml | 25 - .../lib/original/925021303.img.xml | 25 - .../lib/original/925021304.img.xml | 25 - .../lib/original/925021305.img.xml | 25 - .../lib/original/925021306.img.xml | 25 - .../lib/original/925021307.img.xml | 25 - .../lib/original/925021308.img.xml | 25 - .../lib/original/925021309.img.xml | 25 - .../lib/original/925021400.img.xml | 859 ----------------- .../lib/original/925021401.img.xml | 25 - .../lib/original/925021402.img.xml | 25 - .../lib/original/925021403.img.xml | 25 - .../lib/original/925021404.img.xml | 25 - .../lib/original/925021405.img.xml | 25 - .../lib/original/925021406.img.xml | 25 - .../lib/original/925021407.img.xml | 25 - .../lib/original/925021408.img.xml | 25 - .../lib/original/925021409.img.xml | 25 - .../lib/original/925021500.img.xml | 859 ----------------- .../lib/original/925021501.img.xml | 25 - .../lib/original/925021502.img.xml | 25 - .../lib/original/925021503.img.xml | 25 - .../lib/original/925021504.img.xml | 25 - .../lib/original/925021505.img.xml | 25 - .../lib/original/925021506.img.xml | 25 - .../lib/original/925021507.img.xml | 25 - .../lib/original/925021508.img.xml | 25 - .../lib/original/925021509.img.xml | 25 - .../lib/original/925021600.img.xml | 859 ----------------- .../lib/original/925021601.img.xml | 25 - .../lib/original/925021602.img.xml | 25 - .../lib/original/925021603.img.xml | 25 - .../lib/original/925021604.img.xml | 25 - .../lib/original/925021605.img.xml | 25 - .../lib/original/925021606.img.xml | 25 - .../lib/original/925021607.img.xml | 25 - .../lib/original/925021608.img.xml | 25 - .../lib/original/925021609.img.xml | 25 - .../lib/original/925021700.img.xml | 859 ----------------- .../lib/original/925021701.img.xml | 25 - .../lib/original/925021702.img.xml | 25 - .../lib/original/925021703.img.xml | 25 - .../lib/original/925021704.img.xml | 25 - .../lib/original/925021705.img.xml | 25 - .../lib/original/925021706.img.xml | 25 - .../lib/original/925021707.img.xml | 25 - .../lib/original/925021708.img.xml | 25 - .../lib/original/925021709.img.xml | 25 - .../lib/original/925021800.img.xml | 802 ---------------- .../lib/original/925021801.img.xml | 24 - .../lib/original/925021802.img.xml | 24 - .../lib/original/925021803.img.xml | 24 - .../lib/original/925021804.img.xml | 24 - .../lib/original/925021805.img.xml | 24 - .../lib/original/925021806.img.xml | 24 - .../lib/original/925021807.img.xml | 24 - .../lib/original/925021808.img.xml | 24 - .../lib/original/925021809.img.xml | 24 - .../lib/original/925021900.img.xml | 859 ----------------- .../lib/original/925021901.img.xml | 25 - .../lib/original/925021902.img.xml | 25 - .../lib/original/925021903.img.xml | 25 - .../lib/original/925021904.img.xml | 25 - .../lib/original/925021905.img.xml | 25 - .../lib/original/925021906.img.xml | 25 - .../lib/original/925021907.img.xml | 25 - .../lib/original/925021908.img.xml | 25 - .../lib/original/925021909.img.xml | 25 - .../lib/original/925022000.img.xml | 859 ----------------- .../lib/original/925022001.img.xml | 25 - .../lib/original/925022002.img.xml | 25 - .../lib/original/925022003.img.xml | 25 - .../lib/original/925022004.img.xml | 25 - .../lib/original/925022005.img.xml | 25 - .../lib/original/925022006.img.xml | 25 - .../lib/original/925022007.img.xml | 25 - .../lib/original/925022008.img.xml | 25 - .../lib/original/925022009.img.xml | 25 - .../lib/original/925022100.img.xml | 859 ----------------- .../lib/original/925022101.img.xml | 25 - .../lib/original/925022102.img.xml | 25 - .../lib/original/925022103.img.xml | 25 - .../lib/original/925022104.img.xml | 25 - .../lib/original/925022105.img.xml | 25 - .../lib/original/925022106.img.xml | 25 - .../lib/original/925022107.img.xml | 25 - .../lib/original/925022108.img.xml | 25 - .../lib/original/925022109.img.xml | 25 - .../lib/original/925022200.img.xml | 859 ----------------- .../lib/original/925022201.img.xml | 25 - .../lib/original/925022202.img.xml | 25 - .../lib/original/925022203.img.xml | 25 - .../lib/original/925022204.img.xml | 25 - .../lib/original/925022205.img.xml | 25 - .../lib/original/925022206.img.xml | 25 - .../lib/original/925022207.img.xml | 25 - .../lib/original/925022208.img.xml | 25 - .../lib/original/925022209.img.xml | 25 - .../lib/original/925022300.img.xml | 859 ----------------- .../lib/original/925022301.img.xml | 25 - .../lib/original/925022302.img.xml | 25 - .../lib/original/925022303.img.xml | 25 - .../lib/original/925022304.img.xml | 25 - .../lib/original/925022305.img.xml | 25 - .../lib/original/925022306.img.xml | 25 - .../lib/original/925022307.img.xml | 25 - .../lib/original/925022308.img.xml | 25 - .../lib/original/925022309.img.xml | 25 - .../lib/original/925022400.img.xml | 802 ---------------- .../lib/original/925022401.img.xml | 24 - .../lib/original/925022402.img.xml | 24 - .../lib/original/925022403.img.xml | 24 - .../lib/original/925022404.img.xml | 24 - .../lib/original/925022405.img.xml | 24 - .../lib/original/925022406.img.xml | 24 - .../lib/original/925022407.img.xml | 24 - .../lib/original/925022408.img.xml | 24 - .../lib/original/925022409.img.xml | 24 - .../lib/original/925022500.img.xml | 859 ----------------- .../lib/original/925022501.img.xml | 25 - .../lib/original/925022502.img.xml | 25 - .../lib/original/925022503.img.xml | 25 - .../lib/original/925022504.img.xml | 25 - .../lib/original/925022505.img.xml | 25 - .../lib/original/925022506.img.xml | 25 - .../lib/original/925022507.img.xml | 25 - .../lib/original/925022508.img.xml | 25 - .../lib/original/925022509.img.xml | 25 - .../lib/original/925022600.img.xml | 859 ----------------- .../lib/original/925022601.img.xml | 25 - .../lib/original/925022602.img.xml | 25 - .../lib/original/925022603.img.xml | 25 - .../lib/original/925022604.img.xml | 25 - .../lib/original/925022605.img.xml | 25 - .../lib/original/925022606.img.xml | 25 - .../lib/original/925022607.img.xml | 25 - .../lib/original/925022608.img.xml | 25 - .../lib/original/925022609.img.xml | 25 - .../lib/original/925022700.img.xml | 859 ----------------- .../lib/original/925022701.img.xml | 25 - .../lib/original/925022702.img.xml | 25 - .../lib/original/925022703.img.xml | 25 - .../lib/original/925022704.img.xml | 25 - .../lib/original/925022705.img.xml | 25 - .../lib/original/925022706.img.xml | 25 - .../lib/original/925022707.img.xml | 25 - .../lib/original/925022708.img.xml | 25 - .../lib/original/925022709.img.xml | 25 - .../lib/original/925022800.img.xml | 859 ----------------- .../lib/original/925022801.img.xml | 25 - .../lib/original/925022802.img.xml | 25 - .../lib/original/925022803.img.xml | 25 - .../lib/original/925022804.img.xml | 25 - .../lib/original/925022805.img.xml | 25 - .../lib/original/925022806.img.xml | 25 - .../lib/original/925022807.img.xml | 25 - .../lib/original/925022808.img.xml | 25 - .../lib/original/925022809.img.xml | 25 - .../lib/original/925022900.img.xml | 859 ----------------- .../lib/original/925022901.img.xml | 25 - .../lib/original/925022902.img.xml | 25 - .../lib/original/925022903.img.xml | 25 - .../lib/original/925022904.img.xml | 25 - .../lib/original/925022905.img.xml | 25 - .../lib/original/925022906.img.xml | 25 - .../lib/original/925022907.img.xml | 25 - .../lib/original/925022908.img.xml | 25 - .../lib/original/925022909.img.xml | 25 - .../lib/original/925023000.img.xml | 790 ---------------- .../lib/original/925023001.img.xml | 24 - .../lib/original/925023002.img.xml | 24 - .../lib/original/925023003.img.xml | 24 - .../lib/original/925023004.img.xml | 24 - .../lib/original/925023005.img.xml | 24 - .../lib/original/925023006.img.xml | 24 - .../lib/original/925023007.img.xml | 24 - .../lib/original/925023008.img.xml | 24 - .../lib/original/925023009.img.xml | 24 - .../lib/original/925023100.img.xml | 859 ----------------- .../lib/original/925023101.img.xml | 25 - .../lib/original/925023102.img.xml | 25 - .../lib/original/925023103.img.xml | 25 - .../lib/original/925023104.img.xml | 25 - .../lib/original/925023105.img.xml | 25 - .../lib/original/925023106.img.xml | 25 - .../lib/original/925023107.img.xml | 25 - .../lib/original/925023108.img.xml | 25 - .../lib/original/925023109.img.xml | 25 - .../lib/original/925023200.img.xml | 859 ----------------- .../lib/original/925023201.img.xml | 25 - .../lib/original/925023202.img.xml | 25 - .../lib/original/925023203.img.xml | 25 - .../lib/original/925023204.img.xml | 25 - .../lib/original/925023205.img.xml | 25 - .../lib/original/925023206.img.xml | 25 - .../lib/original/925023207.img.xml | 25 - .../lib/original/925023208.img.xml | 25 - .../lib/original/925023209.img.xml | 25 - .../lib/original/925023300.img.xml | 859 ----------------- .../lib/original/925023301.img.xml | 25 - .../lib/original/925023302.img.xml | 25 - .../lib/original/925023303.img.xml | 25 - .../lib/original/925023304.img.xml | 25 - .../lib/original/925023305.img.xml | 25 - .../lib/original/925023306.img.xml | 25 - .../lib/original/925023307.img.xml | 25 - .../lib/original/925023308.img.xml | 25 - .../lib/original/925023309.img.xml | 25 - .../lib/original/925023400.img.xml | 859 ----------------- .../lib/original/925023401.img.xml | 25 - .../lib/original/925023402.img.xml | 25 - .../lib/original/925023403.img.xml | 25 - .../lib/original/925023404.img.xml | 25 - .../lib/original/925023405.img.xml | 25 - .../lib/original/925023406.img.xml | 25 - .../lib/original/925023407.img.xml | 25 - .../lib/original/925023408.img.xml | 25 - .../lib/original/925023409.img.xml | 25 - .../lib/original/925023500.img.xml | 859 ----------------- .../lib/original/925023501.img.xml | 25 - .../lib/original/925023502.img.xml | 25 - .../lib/original/925023503.img.xml | 25 - .../lib/original/925023504.img.xml | 25 - .../lib/original/925023505.img.xml | 25 - .../lib/original/925023506.img.xml | 25 - .../lib/original/925023507.img.xml | 25 - .../lib/original/925023508.img.xml | 25 - .../lib/original/925023509.img.xml | 25 - .../lib/original/925023600.img.xml | 802 ---------------- .../lib/original/925023601.img.xml | 24 - .../lib/original/925023602.img.xml | 24 - .../lib/original/925023603.img.xml | 24 - .../lib/original/925023604.img.xml | 24 - .../lib/original/925023605.img.xml | 24 - .../lib/original/925023606.img.xml | 24 - .../lib/original/925023607.img.xml | 24 - .../lib/original/925023608.img.xml | 24 - .../lib/original/925023609.img.xml | 24 - .../lib/original/925023700.img.xml | 859 ----------------- .../lib/original/925023701.img.xml | 25 - .../lib/original/925023702.img.xml | 25 - .../lib/original/925023703.img.xml | 25 - .../lib/original/925023704.img.xml | 25 - .../lib/original/925023705.img.xml | 25 - .../lib/original/925023706.img.xml | 25 - .../lib/original/925023707.img.xml | 25 - .../lib/original/925023708.img.xml | 25 - .../lib/original/925023709.img.xml | 25 - .../lib/original/925023800.img.xml | 895 ------------------ .../lib/original/925023801.img.xml | 25 - .../lib/original/925023802.img.xml | 25 - .../lib/original/925023803.img.xml | 25 - .../lib/original/925023804.img.xml | 25 - .../lib/original/925023805.img.xml | 25 - .../lib/original/925023806.img.xml | 25 - .../lib/original/925023807.img.xml | 25 - .../lib/original/925023808.img.xml | 25 - .../lib/original/925023809.img.xml | 25 - .../lib/original/925030100.img.xml | 25 - .../lib/original/925030101.img.xml | 25 - .../lib/original/925030102.img.xml | 25 - .../lib/original/925030103.img.xml | 25 - .../lib/original/925030104.img.xml | 25 - .../lib/original/925030200.img.xml | 25 - .../lib/original/925030201.img.xml | 25 - .../lib/original/925030202.img.xml | 25 - .../lib/original/925030203.img.xml | 25 - .../lib/original/925030204.img.xml | 25 - .../lib/original/925030300.img.xml | 25 - .../lib/original/925030301.img.xml | 25 - .../lib/original/925030302.img.xml | 25 - .../lib/original/925030303.img.xml | 25 - .../lib/original/925030304.img.xml | 25 - .../lib/original/925030400.img.xml | 25 - .../lib/original/925030401.img.xml | 25 - .../lib/original/925030402.img.xml | 25 - .../lib/original/925030403.img.xml | 25 - .../lib/original/925030404.img.xml | 25 - .../lib/original/925030500.img.xml | 25 - .../lib/original/925030501.img.xml | 25 - .../lib/original/925030502.img.xml | 25 - .../lib/original/925030503.img.xml | 25 - .../lib/original/925030504.img.xml | 25 - .../lib/original/925030600.img.xml | 24 - .../lib/original/925030601.img.xml | 24 - .../lib/original/925030602.img.xml | 24 - .../lib/original/925030603.img.xml | 24 - .../lib/original/925030604.img.xml | 24 - .../lib/original/925030700.img.xml | 25 - .../lib/original/925030701.img.xml | 25 - .../lib/original/925030702.img.xml | 25 - .../lib/original/925030703.img.xml | 25 - .../lib/original/925030704.img.xml | 25 - .../lib/original/925030800.img.xml | 25 - .../lib/original/925030801.img.xml | 25 - .../lib/original/925030802.img.xml | 25 - .../lib/original/925030803.img.xml | 25 - .../lib/original/925030804.img.xml | 25 - .../lib/original/925030900.img.xml | 25 - .../lib/original/925030901.img.xml | 25 - .../lib/original/925030902.img.xml | 25 - .../lib/original/925030903.img.xml | 25 - .../lib/original/925030904.img.xml | 25 - .../lib/original/925031000.img.xml | 25 - .../lib/original/925031001.img.xml | 25 - .../lib/original/925031002.img.xml | 25 - .../lib/original/925031003.img.xml | 25 - .../lib/original/925031004.img.xml | 25 - .../lib/original/925031100.img.xml | 25 - .../lib/original/925031101.img.xml | 25 - .../lib/original/925031102.img.xml | 25 - .../lib/original/925031103.img.xml | 25 - .../lib/original/925031104.img.xml | 25 - .../lib/original/925031200.img.xml | 24 - .../lib/original/925031201.img.xml | 24 - .../lib/original/925031202.img.xml | 24 - .../lib/original/925031203.img.xml | 24 - .../lib/original/925031204.img.xml | 24 - .../lib/original/925031300.img.xml | 25 - .../lib/original/925031301.img.xml | 25 - .../lib/original/925031302.img.xml | 25 - .../lib/original/925031303.img.xml | 25 - .../lib/original/925031304.img.xml | 25 - .../lib/original/925031400.img.xml | 25 - .../lib/original/925031401.img.xml | 25 - .../lib/original/925031402.img.xml | 25 - .../lib/original/925031403.img.xml | 25 - .../lib/original/925031404.img.xml | 25 - .../lib/original/925031500.img.xml | 25 - .../lib/original/925031501.img.xml | 25 - .../lib/original/925031502.img.xml | 25 - .../lib/original/925031503.img.xml | 25 - .../lib/original/925031504.img.xml | 25 - .../lib/original/925031600.img.xml | 25 - .../lib/original/925031601.img.xml | 25 - .../lib/original/925031602.img.xml | 25 - .../lib/original/925031603.img.xml | 25 - .../lib/original/925031604.img.xml | 25 - .../lib/original/925031700.img.xml | 25 - .../lib/original/925031701.img.xml | 25 - .../lib/original/925031702.img.xml | 25 - .../lib/original/925031703.img.xml | 25 - .../lib/original/925031704.img.xml | 25 - .../lib/original/925031800.img.xml | 24 - .../lib/original/925031801.img.xml | 24 - .../lib/original/925031802.img.xml | 24 - .../lib/original/925031803.img.xml | 24 - .../lib/original/925031804.img.xml | 24 - .../lib/original/925031900.img.xml | 25 - .../lib/original/925031901.img.xml | 25 - .../lib/original/925031902.img.xml | 25 - .../lib/original/925031903.img.xml | 25 - .../lib/original/925031904.img.xml | 25 - .../lib/original/925032000.img.xml | 25 - .../lib/original/925032001.img.xml | 25 - .../lib/original/925032002.img.xml | 25 - .../lib/original/925032003.img.xml | 25 - .../lib/original/925032004.img.xml | 25 - .../lib/original/925032100.img.xml | 25 - .../lib/original/925032101.img.xml | 25 - .../lib/original/925032102.img.xml | 25 - .../lib/original/925032103.img.xml | 25 - .../lib/original/925032104.img.xml | 25 - .../lib/original/925032200.img.xml | 25 - .../lib/original/925032201.img.xml | 25 - .../lib/original/925032202.img.xml | 25 - .../lib/original/925032203.img.xml | 25 - .../lib/original/925032204.img.xml | 25 - .../lib/original/925032300.img.xml | 25 - .../lib/original/925032301.img.xml | 25 - .../lib/original/925032302.img.xml | 25 - .../lib/original/925032303.img.xml | 25 - .../lib/original/925032304.img.xml | 25 - .../lib/original/925032400.img.xml | 24 - .../lib/original/925032401.img.xml | 24 - .../lib/original/925032402.img.xml | 24 - .../lib/original/925032403.img.xml | 24 - .../lib/original/925032404.img.xml | 24 - .../lib/original/925032500.img.xml | 25 - .../lib/original/925032501.img.xml | 25 - .../lib/original/925032502.img.xml | 25 - .../lib/original/925032503.img.xml | 25 - .../lib/original/925032504.img.xml | 25 - .../lib/original/925032600.img.xml | 25 - .../lib/original/925032601.img.xml | 25 - .../lib/original/925032602.img.xml | 25 - .../lib/original/925032603.img.xml | 25 - .../lib/original/925032604.img.xml | 25 - .../lib/original/925032700.img.xml | 25 - .../lib/original/925032701.img.xml | 25 - .../lib/original/925032702.img.xml | 25 - .../lib/original/925032703.img.xml | 25 - .../lib/original/925032704.img.xml | 25 - .../lib/original/925032800.img.xml | 25 - .../lib/original/925032801.img.xml | 25 - .../lib/original/925032802.img.xml | 25 - .../lib/original/925032803.img.xml | 25 - .../lib/original/925032804.img.xml | 25 - .../lib/original/925032900.img.xml | 25 - .../lib/original/925032901.img.xml | 25 - .../lib/original/925032902.img.xml | 25 - .../lib/original/925032903.img.xml | 25 - .../lib/original/925032904.img.xml | 25 - .../lib/original/925033000.img.xml | 24 - .../lib/original/925033001.img.xml | 24 - .../lib/original/925033002.img.xml | 24 - .../lib/original/925033003.img.xml | 24 - .../lib/original/925033004.img.xml | 24 - .../lib/original/925033100.img.xml | 25 - .../lib/original/925033101.img.xml | 25 - .../lib/original/925033102.img.xml | 25 - .../lib/original/925033103.img.xml | 25 - .../lib/original/925033104.img.xml | 25 - .../lib/original/925033200.img.xml | 25 - .../lib/original/925033201.img.xml | 25 - .../lib/original/925033202.img.xml | 25 - .../lib/original/925033203.img.xml | 25 - .../lib/original/925033204.img.xml | 25 - .../lib/original/925033300.img.xml | 25 - .../lib/original/925033301.img.xml | 25 - .../lib/original/925033302.img.xml | 25 - .../lib/original/925033303.img.xml | 25 - .../lib/original/925033304.img.xml | 25 - .../lib/original/925033400.img.xml | 25 - .../lib/original/925033401.img.xml | 25 - .../lib/original/925033402.img.xml | 25 - .../lib/original/925033403.img.xml | 25 - .../lib/original/925033404.img.xml | 25 - .../lib/original/925033500.img.xml | 25 - .../lib/original/925033501.img.xml | 25 - .../lib/original/925033502.img.xml | 25 - .../lib/original/925033503.img.xml | 25 - .../lib/original/925033504.img.xml | 25 - .../lib/original/925033600.img.xml | 24 - .../lib/original/925033601.img.xml | 24 - .../lib/original/925033602.img.xml | 24 - .../lib/original/925033603.img.xml | 24 - .../lib/original/925033604.img.xml | 24 - .../lib/original/925033700.img.xml | 25 - .../lib/original/925033701.img.xml | 25 - .../lib/original/925033702.img.xml | 25 - .../lib/original/925033703.img.xml | 25 - .../lib/original/925033704.img.xml | 25 - .../lib/original/925033800.img.xml | 25 - .../lib/original/925033801.img.xml | 25 - .../lib/original/925033802.img.xml | 25 - .../lib/original/925033803.img.xml | 25 - .../lib/original/925033804.img.xml | 25 - 572 files changed, 68 insertions(+), 46496 deletions(-) rename tools/MapleDojoUpdater/src/mapledojoupdate/MapleDojoUpdate.java => src/main/java/tools/mapletools/DojoUpdate.java (53%) delete mode 100644 tools/MapleDojoUpdater/lib/original/925020100.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020101.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020102.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020103.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020104.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020105.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020106.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020107.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020108.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020109.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020200.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020201.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020202.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020203.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020204.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020205.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020206.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020207.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020208.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020209.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020300.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020301.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020302.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020303.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020304.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020305.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020306.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020307.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020308.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020309.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020400.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020401.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020402.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020403.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020404.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020405.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020406.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020407.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020408.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020409.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020500.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020501.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020502.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020503.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020504.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020505.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020506.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020507.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020508.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020509.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020600.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020601.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020602.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020603.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020604.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020605.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020606.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020607.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020608.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020609.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020610.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020700.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020701.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020702.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020703.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020704.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020705.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020706.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020707.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020708.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020709.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020800.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020801.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020802.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020803.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020804.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020805.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020806.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020807.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020808.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020809.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020900.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020901.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020902.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020903.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020904.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020905.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020906.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020907.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020908.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925020909.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021000.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021001.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021002.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021003.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021004.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021005.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021006.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021007.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021008.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021009.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021100.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021101.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021102.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021103.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021104.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021105.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021106.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021107.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021108.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021109.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021200.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021201.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021202.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021203.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021204.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021205.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021206.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021207.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021208.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021209.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021300.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021301.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021302.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021303.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021304.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021305.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021306.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021307.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021308.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021309.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021400.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021401.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021402.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021403.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021404.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021405.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021406.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021407.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021408.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021409.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021500.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021501.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021502.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021503.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021504.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021505.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021506.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021507.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021508.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021509.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021600.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021601.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021602.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021603.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021604.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021605.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021606.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021607.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021608.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021609.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021700.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021701.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021702.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021703.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021704.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021705.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021706.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021707.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021708.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021709.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021800.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021801.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021802.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021803.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021804.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021805.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021806.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021807.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021808.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021809.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021900.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021901.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021902.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021903.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021904.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021905.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021906.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021907.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021908.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925021909.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022000.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022001.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022002.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022003.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022004.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022005.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022006.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022007.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022008.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022009.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022100.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022101.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022102.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022103.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022104.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022105.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022106.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022107.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022108.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022109.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022200.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022201.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022202.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022203.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022204.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022205.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022206.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022207.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022208.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022209.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022300.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022301.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022302.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022303.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022304.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022305.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022306.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022307.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022308.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022309.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022400.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022401.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022402.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022403.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022404.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022405.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022406.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022407.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022408.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022409.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022500.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022501.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022502.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022503.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022504.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022505.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022506.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022507.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022508.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022509.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022600.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022601.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022602.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022603.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022604.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022605.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022606.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022607.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022608.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022609.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022700.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022701.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022702.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022703.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022704.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022705.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022706.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022707.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022708.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022709.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022800.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022801.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022802.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022803.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022804.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022805.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022806.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022807.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022808.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022809.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022900.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022901.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022902.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022903.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022904.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022905.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022906.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022907.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022908.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925022909.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023000.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023001.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023002.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023003.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023004.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023005.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023006.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023007.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023008.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023009.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023100.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023101.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023102.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023103.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023104.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023105.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023106.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023107.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023108.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023109.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023200.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023201.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023202.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023203.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023204.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023205.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023206.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023207.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023208.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023209.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023300.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023301.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023302.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023303.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023304.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023305.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023306.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023307.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023308.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023309.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023400.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023401.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023402.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023403.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023404.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023405.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023406.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023407.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023408.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023409.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023500.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023501.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023502.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023503.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023504.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023505.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023506.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023507.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023508.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023509.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023600.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023601.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023602.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023603.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023604.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023605.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023606.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023607.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023608.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023609.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023700.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023701.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023702.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023703.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023704.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023705.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023706.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023707.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023708.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023709.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023800.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023801.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023802.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023803.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023804.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023805.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023806.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023807.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023808.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925023809.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030100.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030101.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030102.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030103.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030104.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030200.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030201.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030202.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030203.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030204.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030300.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030301.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030302.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030303.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030304.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030400.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030401.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030402.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030403.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030404.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030500.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030501.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030502.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030503.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030504.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030600.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030601.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030602.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030603.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030604.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030700.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030701.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030702.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030703.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030704.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030800.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030801.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030802.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030803.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030804.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030900.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030901.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030902.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030903.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925030904.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031000.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031001.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031002.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031003.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031004.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031100.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031101.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031102.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031103.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031104.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031200.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031201.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031202.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031203.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031204.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031300.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031301.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031302.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031303.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031304.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031400.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031401.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031402.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031403.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031404.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031500.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031501.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031502.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031503.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031504.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031600.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031601.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031602.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031603.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031604.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031700.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031701.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031702.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031703.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031704.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031800.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031801.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031802.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031803.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031804.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031900.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031901.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031902.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031903.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925031904.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032000.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032001.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032002.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032003.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032004.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032100.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032101.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032102.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032103.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032104.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032200.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032201.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032202.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032203.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032204.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032300.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032301.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032302.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032303.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032304.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032400.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032401.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032402.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032403.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032404.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032500.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032501.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032502.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032503.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032504.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032600.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032601.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032602.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032603.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032604.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032700.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032701.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032702.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032703.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032704.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032800.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032801.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032802.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032803.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032804.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032900.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032901.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032902.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032903.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925032904.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033000.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033001.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033002.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033003.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033004.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033100.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033101.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033102.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033103.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033104.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033200.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033201.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033202.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033203.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033204.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033300.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033301.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033302.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033303.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033304.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033400.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033401.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033402.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033403.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033404.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033500.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033501.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033502.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033503.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033504.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033600.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033601.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033602.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033603.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033604.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033700.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033701.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033702.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033703.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033704.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033800.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033801.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033802.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033803.img.xml delete mode 100644 tools/MapleDojoUpdater/lib/original/925033804.img.xml diff --git a/tools/MapleDojoUpdater/src/mapledojoupdate/MapleDojoUpdate.java b/src/main/java/tools/mapletools/DojoUpdate.java similarity index 53% rename from tools/MapleDojoUpdater/src/mapledojoupdate/MapleDojoUpdate.java rename to src/main/java/tools/mapletools/DojoUpdate.java index f39284f75c..dbacb0ac18 100644 --- a/tools/MapleDojoUpdater/src/mapledojoupdate/MapleDojoUpdate.java +++ b/src/main/java/tools/mapletools/DojoUpdate.java @@ -1,70 +1,42 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. +import provider.wz.WZFiles; - 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 . -*/ -package mapledojoupdate; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.sql.Connection; +import java.io.*; +import java.nio.charset.StandardCharsets; /** - * * @author RonanLana - - This application parses the Character.wz folder inputted and adds/updates the "info/level" - node on every known equipment id. This addition enables client-side view of the equipment - level attribute on every equipment in the game, given proper item visibility, be it from - own equipments or from other players. - - Estimated parse time: 10 seconds - + *

+ * This application parses the Character.wz folder inputted and adds/updates the "info/level" + * node on every known equipment id. This addition enables client-side view of the equipment + * level attribute on every equipment in the game, given proper item visibility, be it from + * own equipments or from other players. + *

+ * Estimated parse time: 10 seconds */ -public class MapleDojoUpdate { +public class DojoUpdate { + private static final File INPUT_DIRECTORY = new File(WZFiles.MAP.getFile(), "/Map/Map9"); + private static final File OUTPUT_DIRECTORY = ToolConstants.getOutputFile("dojo-maps"); + private static final int DOJO_MIN_MAP_ID = 925_020_100; + private static final int DOJO_MAX_MAP_ID = 925_033_804; + private static final int INITIAL_STRING_LENGTH = 250; + + private static PrintWriter printWriter = null; + private static BufferedReader bufferedReader = null; + private static boolean isDojoMapid; + private static byte status; - static String dojoDirectory = "lib/original/"; - static String outputDirectory = "lib/updated/"; - - static Connection con = null; - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static int initialStringLength = 250; - static boolean isDojoMapid; - - static byte status; - private static String getName(String token) { int i, j; char[] dest; String d; - + i = token.lastIndexOf("name"); i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; try { token.getChars(i, j, dest, 0); } catch (StringIndexOutOfBoundsException e) { @@ -75,59 +47,56 @@ public class MapleDojoUpdate { e.printStackTrace(); try { Thread.sleep(100000000); - } catch (Exception ex) {} + } catch (Exception ex) { + } } - + d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static void forwardCursor(int st) { String line = null; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { simpleToken(line); printWriter.println(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static void simpleToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; } } - + private static void translateToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; printWriter.println(token); - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { printWriter.println(token); status += 1; - + if (status == 2) { String d = getName(token); - if(!d.contentEquals("info")) { + if (!d.contentEquals("info")) { forwardCursor(status); } } else if (status > 2) { forwardCursor(status); } - } - else { + } else { if (status == 2 && isDojoMapid) { String item = getName(token); - + if (item.contentEquals("onFirstUserEnter")) { printWriter.println(" "); } else if (item.contentEquals("onUserEnter")) { @@ -140,24 +109,27 @@ public class MapleDojoUpdate { } } } - + private static int getMapId(String fileName) { return Integer.parseInt(fileName.substring(0, 9)); } - + private static void parseDojoData(File file, String curPath) throws IOException { - printWriter = new PrintWriter(outputDirectory + curPath + file.getName(), "UTF-8"); - - fileReader = new InputStreamReader(new FileInputStream(file), "UTF-8"); + int mapId = getMapId(file.getName()); + isDojoMapid = isDojoMapId(mapId); + if (!isDojoMapid) { + return; + } + + printWriter = new PrintWriter(OUTPUT_DIRECTORY.getPath() + "/" + curPath + file.getName(), StandardCharsets.UTF_8); + + InputStreamReader fileReader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - + status = 0; - - int mapid = getMapId(file.getName()); - isDojoMapid = mapid >= 925020100 && mapid < 925040000; - + String line; - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { translateToken(line); } @@ -167,35 +139,35 @@ public class MapleDojoUpdate { printFileFooter(); printWriter.close(); } - + + private static boolean isDojoMapId(int mapId) { + return mapId >= DOJO_MIN_MAP_ID && mapId <= DOJO_MAX_MAP_ID; + } + private static void printFileFooter() { printWriter.println(""); } - + private static void parseDirectoryDojoData(String curPath) { - File folder = new File(outputDirectory + curPath); + File folder = new File(OUTPUT_DIRECTORY, curPath); if (!folder.exists()) { folder.mkdir(); } - + System.out.println("Parsing directory '" + curPath + "'"); - folder = new File(dojoDirectory + curPath); + folder = new File(INPUT_DIRECTORY, curPath); for (File file : folder.listFiles()) { if (file.isFile()) { try { parseDojoData(file, curPath); - } - catch(FileNotFoundException ex) { + } catch (FileNotFoundException ex) { System.out.println("Unable to open dojo file " + file.getAbsolutePath() + "."); - } - catch(IOException ex) { + } catch (IOException ex) { System.out.println("Error reading dojo file " + file.getAbsolutePath() + "."); - } - - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } else { @@ -203,9 +175,8 @@ public class MapleDojoUpdate { } } } - + public static void main(String[] args) { parseDirectoryDojoData(""); } - } diff --git a/tools/MapleDojoUpdater/lib/original/925020100.img.xml b/tools/MapleDojoUpdater/lib/original/925020100.img.xml deleted file mode 100644 index cbd16a8ea9..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020100.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020101.img.xml b/tools/MapleDojoUpdater/lib/original/925020101.img.xml deleted file mode 100644 index 8d6894ffed..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020101.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020102.img.xml b/tools/MapleDojoUpdater/lib/original/925020102.img.xml deleted file mode 100644 index e1d925d80c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020102.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020103.img.xml b/tools/MapleDojoUpdater/lib/original/925020103.img.xml deleted file mode 100644 index c0849b354f..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020103.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020104.img.xml b/tools/MapleDojoUpdater/lib/original/925020104.img.xml deleted file mode 100644 index da915e9836..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020104.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020105.img.xml b/tools/MapleDojoUpdater/lib/original/925020105.img.xml deleted file mode 100644 index 6c8bfcab96..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020105.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020106.img.xml b/tools/MapleDojoUpdater/lib/original/925020106.img.xml deleted file mode 100644 index b9cdbaf6f5..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020106.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020107.img.xml b/tools/MapleDojoUpdater/lib/original/925020107.img.xml deleted file mode 100644 index 19c46c3e1c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020107.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020108.img.xml b/tools/MapleDojoUpdater/lib/original/925020108.img.xml deleted file mode 100644 index b6334e920a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020108.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020109.img.xml b/tools/MapleDojoUpdater/lib/original/925020109.img.xml deleted file mode 100644 index 9cc66dba11..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020109.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020200.img.xml b/tools/MapleDojoUpdater/lib/original/925020200.img.xml deleted file mode 100644 index b3a21fc6d9..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020200.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020201.img.xml b/tools/MapleDojoUpdater/lib/original/925020201.img.xml deleted file mode 100644 index a2b4af0bc0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020201.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020202.img.xml b/tools/MapleDojoUpdater/lib/original/925020202.img.xml deleted file mode 100644 index 5f522bd609..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020202.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020203.img.xml b/tools/MapleDojoUpdater/lib/original/925020203.img.xml deleted file mode 100644 index 5020200bc9..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020203.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020204.img.xml b/tools/MapleDojoUpdater/lib/original/925020204.img.xml deleted file mode 100644 index ca8c788a54..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020204.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020205.img.xml b/tools/MapleDojoUpdater/lib/original/925020205.img.xml deleted file mode 100644 index 457905c799..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020205.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020206.img.xml b/tools/MapleDojoUpdater/lib/original/925020206.img.xml deleted file mode 100644 index a200d5f82e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020206.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020207.img.xml b/tools/MapleDojoUpdater/lib/original/925020207.img.xml deleted file mode 100644 index d9b5ede9fa..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020207.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020208.img.xml b/tools/MapleDojoUpdater/lib/original/925020208.img.xml deleted file mode 100644 index 6c61e7bfd2..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020208.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020209.img.xml b/tools/MapleDojoUpdater/lib/original/925020209.img.xml deleted file mode 100644 index 9044b0ef79..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020209.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020300.img.xml b/tools/MapleDojoUpdater/lib/original/925020300.img.xml deleted file mode 100644 index 73812f7ba6..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020300.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020301.img.xml b/tools/MapleDojoUpdater/lib/original/925020301.img.xml deleted file mode 100644 index aff4ff8085..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020301.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020302.img.xml b/tools/MapleDojoUpdater/lib/original/925020302.img.xml deleted file mode 100644 index 8b211b84d2..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020302.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020303.img.xml b/tools/MapleDojoUpdater/lib/original/925020303.img.xml deleted file mode 100644 index 7a12195a6a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020303.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020304.img.xml b/tools/MapleDojoUpdater/lib/original/925020304.img.xml deleted file mode 100644 index 0e3b7373d4..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020304.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020305.img.xml b/tools/MapleDojoUpdater/lib/original/925020305.img.xml deleted file mode 100644 index 72acf45257..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020305.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020306.img.xml b/tools/MapleDojoUpdater/lib/original/925020306.img.xml deleted file mode 100644 index 3bed9fa3c7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020306.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020307.img.xml b/tools/MapleDojoUpdater/lib/original/925020307.img.xml deleted file mode 100644 index cca5c6626a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020307.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020308.img.xml b/tools/MapleDojoUpdater/lib/original/925020308.img.xml deleted file mode 100644 index d687ea0dbb..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020308.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020309.img.xml b/tools/MapleDojoUpdater/lib/original/925020309.img.xml deleted file mode 100644 index 0fd8e04011..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020309.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020400.img.xml b/tools/MapleDojoUpdater/lib/original/925020400.img.xml deleted file mode 100644 index da44015b98..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020400.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020401.img.xml b/tools/MapleDojoUpdater/lib/original/925020401.img.xml deleted file mode 100644 index ef512862fb..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020401.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020402.img.xml b/tools/MapleDojoUpdater/lib/original/925020402.img.xml deleted file mode 100644 index 63a9cf00b8..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020402.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020403.img.xml b/tools/MapleDojoUpdater/lib/original/925020403.img.xml deleted file mode 100644 index 1fe79c29f0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020403.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020404.img.xml b/tools/MapleDojoUpdater/lib/original/925020404.img.xml deleted file mode 100644 index 050bc6f5b0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020404.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020405.img.xml b/tools/MapleDojoUpdater/lib/original/925020405.img.xml deleted file mode 100644 index c7e157a906..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020405.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020406.img.xml b/tools/MapleDojoUpdater/lib/original/925020406.img.xml deleted file mode 100644 index 14cf5c3894..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020406.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020407.img.xml b/tools/MapleDojoUpdater/lib/original/925020407.img.xml deleted file mode 100644 index 256758398d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020407.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020408.img.xml b/tools/MapleDojoUpdater/lib/original/925020408.img.xml deleted file mode 100644 index 99096b73aa..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020408.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020409.img.xml b/tools/MapleDojoUpdater/lib/original/925020409.img.xml deleted file mode 100644 index 561b889486..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020409.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020500.img.xml b/tools/MapleDojoUpdater/lib/original/925020500.img.xml deleted file mode 100644 index 62460fb0af..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020500.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020501.img.xml b/tools/MapleDojoUpdater/lib/original/925020501.img.xml deleted file mode 100644 index de5b7f5745..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020501.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020502.img.xml b/tools/MapleDojoUpdater/lib/original/925020502.img.xml deleted file mode 100644 index 1619129475..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020502.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020503.img.xml b/tools/MapleDojoUpdater/lib/original/925020503.img.xml deleted file mode 100644 index ffad793b2e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020503.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020504.img.xml b/tools/MapleDojoUpdater/lib/original/925020504.img.xml deleted file mode 100644 index 15d5d3c321..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020504.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020505.img.xml b/tools/MapleDojoUpdater/lib/original/925020505.img.xml deleted file mode 100644 index db2422220d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020505.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020506.img.xml b/tools/MapleDojoUpdater/lib/original/925020506.img.xml deleted file mode 100644 index f658bddf42..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020506.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020507.img.xml b/tools/MapleDojoUpdater/lib/original/925020507.img.xml deleted file mode 100644 index ed3e3afdf9..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020507.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020508.img.xml b/tools/MapleDojoUpdater/lib/original/925020508.img.xml deleted file mode 100644 index accc1a1e56..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020508.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020509.img.xml b/tools/MapleDojoUpdater/lib/original/925020509.img.xml deleted file mode 100644 index d00ea87bc5..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020509.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020600.img.xml b/tools/MapleDojoUpdater/lib/original/925020600.img.xml deleted file mode 100644 index 4166dbcacc..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020600.img.xml +++ /dev/null @@ -1,802 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020601.img.xml b/tools/MapleDojoUpdater/lib/original/925020601.img.xml deleted file mode 100644 index 767b838819..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020601.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020602.img.xml b/tools/MapleDojoUpdater/lib/original/925020602.img.xml deleted file mode 100644 index 551b9d6d78..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020602.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020603.img.xml b/tools/MapleDojoUpdater/lib/original/925020603.img.xml deleted file mode 100644 index 214fdbb7ce..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020603.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020604.img.xml b/tools/MapleDojoUpdater/lib/original/925020604.img.xml deleted file mode 100644 index 775d84bdbe..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020604.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020605.img.xml b/tools/MapleDojoUpdater/lib/original/925020605.img.xml deleted file mode 100644 index b8e0b01705..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020605.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020606.img.xml b/tools/MapleDojoUpdater/lib/original/925020606.img.xml deleted file mode 100644 index f2dcddfbdc..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020606.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020607.img.xml b/tools/MapleDojoUpdater/lib/original/925020607.img.xml deleted file mode 100644 index feab9454a7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020607.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020608.img.xml b/tools/MapleDojoUpdater/lib/original/925020608.img.xml deleted file mode 100644 index 0070406e22..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020608.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020609.img.xml b/tools/MapleDojoUpdater/lib/original/925020609.img.xml deleted file mode 100644 index 827b77e7c3..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020609.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020610.img.xml b/tools/MapleDojoUpdater/lib/original/925020610.img.xml deleted file mode 100644 index 9d332ab993..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020610.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020700.img.xml b/tools/MapleDojoUpdater/lib/original/925020700.img.xml deleted file mode 100644 index 1ed5c116e6..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020700.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020701.img.xml b/tools/MapleDojoUpdater/lib/original/925020701.img.xml deleted file mode 100644 index b8be525bc0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020701.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020702.img.xml b/tools/MapleDojoUpdater/lib/original/925020702.img.xml deleted file mode 100644 index 1136614527..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020702.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020703.img.xml b/tools/MapleDojoUpdater/lib/original/925020703.img.xml deleted file mode 100644 index 2ff643a0c8..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020703.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020704.img.xml b/tools/MapleDojoUpdater/lib/original/925020704.img.xml deleted file mode 100644 index c38f4e1375..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020704.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020705.img.xml b/tools/MapleDojoUpdater/lib/original/925020705.img.xml deleted file mode 100644 index 7a7f962831..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020705.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020706.img.xml b/tools/MapleDojoUpdater/lib/original/925020706.img.xml deleted file mode 100644 index e0e7b5ba02..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020706.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020707.img.xml b/tools/MapleDojoUpdater/lib/original/925020707.img.xml deleted file mode 100644 index 47772772dc..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020707.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020708.img.xml b/tools/MapleDojoUpdater/lib/original/925020708.img.xml deleted file mode 100644 index fc1ca2a9b1..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020708.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020709.img.xml b/tools/MapleDojoUpdater/lib/original/925020709.img.xml deleted file mode 100644 index 7e96849fac..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020709.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020800.img.xml b/tools/MapleDojoUpdater/lib/original/925020800.img.xml deleted file mode 100644 index 1a6a7f948e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020800.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020801.img.xml b/tools/MapleDojoUpdater/lib/original/925020801.img.xml deleted file mode 100644 index ad0dd2c2a4..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020801.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020802.img.xml b/tools/MapleDojoUpdater/lib/original/925020802.img.xml deleted file mode 100644 index cd7c0d9009..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020802.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020803.img.xml b/tools/MapleDojoUpdater/lib/original/925020803.img.xml deleted file mode 100644 index d16acd2fc3..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020803.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020804.img.xml b/tools/MapleDojoUpdater/lib/original/925020804.img.xml deleted file mode 100644 index fff93023b5..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020804.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020805.img.xml b/tools/MapleDojoUpdater/lib/original/925020805.img.xml deleted file mode 100644 index 30f0310b26..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020805.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020806.img.xml b/tools/MapleDojoUpdater/lib/original/925020806.img.xml deleted file mode 100644 index 801c6b0990..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020806.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020807.img.xml b/tools/MapleDojoUpdater/lib/original/925020807.img.xml deleted file mode 100644 index d03843e138..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020807.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020808.img.xml b/tools/MapleDojoUpdater/lib/original/925020808.img.xml deleted file mode 100644 index 53f9b50f6e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020808.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020809.img.xml b/tools/MapleDojoUpdater/lib/original/925020809.img.xml deleted file mode 100644 index 094899507d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020809.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020900.img.xml b/tools/MapleDojoUpdater/lib/original/925020900.img.xml deleted file mode 100644 index 0951bf6e1e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020900.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020901.img.xml b/tools/MapleDojoUpdater/lib/original/925020901.img.xml deleted file mode 100644 index ced72fb962..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020901.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020902.img.xml b/tools/MapleDojoUpdater/lib/original/925020902.img.xml deleted file mode 100644 index 244d845986..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020902.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020903.img.xml b/tools/MapleDojoUpdater/lib/original/925020903.img.xml deleted file mode 100644 index 28ead26f1a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020903.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020904.img.xml b/tools/MapleDojoUpdater/lib/original/925020904.img.xml deleted file mode 100644 index d8df9c0df0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020904.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020905.img.xml b/tools/MapleDojoUpdater/lib/original/925020905.img.xml deleted file mode 100644 index 95398b3600..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020905.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020906.img.xml b/tools/MapleDojoUpdater/lib/original/925020906.img.xml deleted file mode 100644 index 9fcab57b69..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020906.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020907.img.xml b/tools/MapleDojoUpdater/lib/original/925020907.img.xml deleted file mode 100644 index e7c4969a21..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020907.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020908.img.xml b/tools/MapleDojoUpdater/lib/original/925020908.img.xml deleted file mode 100644 index e3ea753a7e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020908.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925020909.img.xml b/tools/MapleDojoUpdater/lib/original/925020909.img.xml deleted file mode 100644 index 923e68df8e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925020909.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021000.img.xml b/tools/MapleDojoUpdater/lib/original/925021000.img.xml deleted file mode 100644 index 02b7deafce..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021000.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021001.img.xml b/tools/MapleDojoUpdater/lib/original/925021001.img.xml deleted file mode 100644 index 792655b8cb..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021001.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021002.img.xml b/tools/MapleDojoUpdater/lib/original/925021002.img.xml deleted file mode 100644 index f24fe49fb0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021002.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021003.img.xml b/tools/MapleDojoUpdater/lib/original/925021003.img.xml deleted file mode 100644 index 884c8669ce..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021003.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021004.img.xml b/tools/MapleDojoUpdater/lib/original/925021004.img.xml deleted file mode 100644 index 7a46c87855..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021004.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021005.img.xml b/tools/MapleDojoUpdater/lib/original/925021005.img.xml deleted file mode 100644 index bc79a3f6e5..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021005.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021006.img.xml b/tools/MapleDojoUpdater/lib/original/925021006.img.xml deleted file mode 100644 index 28e0095bb5..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021006.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021007.img.xml b/tools/MapleDojoUpdater/lib/original/925021007.img.xml deleted file mode 100644 index 90e95fdd2e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021007.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021008.img.xml b/tools/MapleDojoUpdater/lib/original/925021008.img.xml deleted file mode 100644 index e288da594b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021008.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021009.img.xml b/tools/MapleDojoUpdater/lib/original/925021009.img.xml deleted file mode 100644 index 745ae04ab3..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021009.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021100.img.xml b/tools/MapleDojoUpdater/lib/original/925021100.img.xml deleted file mode 100644 index be2694f195..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021100.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021101.img.xml b/tools/MapleDojoUpdater/lib/original/925021101.img.xml deleted file mode 100644 index e2661e07b7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021101.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021102.img.xml b/tools/MapleDojoUpdater/lib/original/925021102.img.xml deleted file mode 100644 index 244039febc..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021102.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021103.img.xml b/tools/MapleDojoUpdater/lib/original/925021103.img.xml deleted file mode 100644 index c297fb31b9..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021103.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021104.img.xml b/tools/MapleDojoUpdater/lib/original/925021104.img.xml deleted file mode 100644 index 788fc158c1..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021104.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021105.img.xml b/tools/MapleDojoUpdater/lib/original/925021105.img.xml deleted file mode 100644 index 4b427c682b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021105.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021106.img.xml b/tools/MapleDojoUpdater/lib/original/925021106.img.xml deleted file mode 100644 index 046f59e126..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021106.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021107.img.xml b/tools/MapleDojoUpdater/lib/original/925021107.img.xml deleted file mode 100644 index c5dca3a91b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021107.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021108.img.xml b/tools/MapleDojoUpdater/lib/original/925021108.img.xml deleted file mode 100644 index 71278c7bf6..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021108.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021109.img.xml b/tools/MapleDojoUpdater/lib/original/925021109.img.xml deleted file mode 100644 index 91ec688356..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021109.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021200.img.xml b/tools/MapleDojoUpdater/lib/original/925021200.img.xml deleted file mode 100644 index 620a73ee9f..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021200.img.xml +++ /dev/null @@ -1,802 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021201.img.xml b/tools/MapleDojoUpdater/lib/original/925021201.img.xml deleted file mode 100644 index 555122d3a3..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021201.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021202.img.xml b/tools/MapleDojoUpdater/lib/original/925021202.img.xml deleted file mode 100644 index 85aa37f622..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021202.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021203.img.xml b/tools/MapleDojoUpdater/lib/original/925021203.img.xml deleted file mode 100644 index a941a9a47a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021203.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021204.img.xml b/tools/MapleDojoUpdater/lib/original/925021204.img.xml deleted file mode 100644 index 68567612f2..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021204.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021205.img.xml b/tools/MapleDojoUpdater/lib/original/925021205.img.xml deleted file mode 100644 index b6fb8f2d48..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021205.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021206.img.xml b/tools/MapleDojoUpdater/lib/original/925021206.img.xml deleted file mode 100644 index 9490747a28..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021206.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021207.img.xml b/tools/MapleDojoUpdater/lib/original/925021207.img.xml deleted file mode 100644 index f66e8184ac..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021207.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021208.img.xml b/tools/MapleDojoUpdater/lib/original/925021208.img.xml deleted file mode 100644 index 07f6d3ce8d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021208.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021209.img.xml b/tools/MapleDojoUpdater/lib/original/925021209.img.xml deleted file mode 100644 index a0f5c4fafe..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021209.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021300.img.xml b/tools/MapleDojoUpdater/lib/original/925021300.img.xml deleted file mode 100644 index 7d5b37244e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021300.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021301.img.xml b/tools/MapleDojoUpdater/lib/original/925021301.img.xml deleted file mode 100644 index 04244b3fd6..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021301.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021302.img.xml b/tools/MapleDojoUpdater/lib/original/925021302.img.xml deleted file mode 100644 index 027e649f33..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021302.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021303.img.xml b/tools/MapleDojoUpdater/lib/original/925021303.img.xml deleted file mode 100644 index 8f453dbd3c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021303.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021304.img.xml b/tools/MapleDojoUpdater/lib/original/925021304.img.xml deleted file mode 100644 index 0ee0490d52..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021304.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021305.img.xml b/tools/MapleDojoUpdater/lib/original/925021305.img.xml deleted file mode 100644 index eb827a7edd..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021305.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021306.img.xml b/tools/MapleDojoUpdater/lib/original/925021306.img.xml deleted file mode 100644 index df3e764487..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021306.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021307.img.xml b/tools/MapleDojoUpdater/lib/original/925021307.img.xml deleted file mode 100644 index 37d3803dfe..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021307.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021308.img.xml b/tools/MapleDojoUpdater/lib/original/925021308.img.xml deleted file mode 100644 index 87fed334ed..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021308.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021309.img.xml b/tools/MapleDojoUpdater/lib/original/925021309.img.xml deleted file mode 100644 index 4da811eef1..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021309.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021400.img.xml b/tools/MapleDojoUpdater/lib/original/925021400.img.xml deleted file mode 100644 index 90918d9cb3..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021400.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021401.img.xml b/tools/MapleDojoUpdater/lib/original/925021401.img.xml deleted file mode 100644 index 0c35202f91..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021401.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021402.img.xml b/tools/MapleDojoUpdater/lib/original/925021402.img.xml deleted file mode 100644 index 677bd7faa6..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021402.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021403.img.xml b/tools/MapleDojoUpdater/lib/original/925021403.img.xml deleted file mode 100644 index 480076949d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021403.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021404.img.xml b/tools/MapleDojoUpdater/lib/original/925021404.img.xml deleted file mode 100644 index 40a9fde33b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021404.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021405.img.xml b/tools/MapleDojoUpdater/lib/original/925021405.img.xml deleted file mode 100644 index be2055d7d2..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021405.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021406.img.xml b/tools/MapleDojoUpdater/lib/original/925021406.img.xml deleted file mode 100644 index c7f9012f00..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021406.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021407.img.xml b/tools/MapleDojoUpdater/lib/original/925021407.img.xml deleted file mode 100644 index d6d506c50d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021407.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021408.img.xml b/tools/MapleDojoUpdater/lib/original/925021408.img.xml deleted file mode 100644 index 545723d084..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021408.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021409.img.xml b/tools/MapleDojoUpdater/lib/original/925021409.img.xml deleted file mode 100644 index c1be4529fb..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021409.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021500.img.xml b/tools/MapleDojoUpdater/lib/original/925021500.img.xml deleted file mode 100644 index 8c206dbe01..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021500.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021501.img.xml b/tools/MapleDojoUpdater/lib/original/925021501.img.xml deleted file mode 100644 index ec546ef901..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021501.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021502.img.xml b/tools/MapleDojoUpdater/lib/original/925021502.img.xml deleted file mode 100644 index 18d27c38c8..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021502.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021503.img.xml b/tools/MapleDojoUpdater/lib/original/925021503.img.xml deleted file mode 100644 index c7e619dd45..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021503.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021504.img.xml b/tools/MapleDojoUpdater/lib/original/925021504.img.xml deleted file mode 100644 index ac66e4a7e0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021504.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021505.img.xml b/tools/MapleDojoUpdater/lib/original/925021505.img.xml deleted file mode 100644 index 16291efc62..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021505.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021506.img.xml b/tools/MapleDojoUpdater/lib/original/925021506.img.xml deleted file mode 100644 index 82fa304e3a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021506.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021507.img.xml b/tools/MapleDojoUpdater/lib/original/925021507.img.xml deleted file mode 100644 index ed941306a9..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021507.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021508.img.xml b/tools/MapleDojoUpdater/lib/original/925021508.img.xml deleted file mode 100644 index be9d7d747a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021508.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021509.img.xml b/tools/MapleDojoUpdater/lib/original/925021509.img.xml deleted file mode 100644 index 492699aabd..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021509.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021600.img.xml b/tools/MapleDojoUpdater/lib/original/925021600.img.xml deleted file mode 100644 index ba6b2e67e7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021600.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021601.img.xml b/tools/MapleDojoUpdater/lib/original/925021601.img.xml deleted file mode 100644 index a163a44fc9..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021601.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021602.img.xml b/tools/MapleDojoUpdater/lib/original/925021602.img.xml deleted file mode 100644 index 6cf51cc010..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021602.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021603.img.xml b/tools/MapleDojoUpdater/lib/original/925021603.img.xml deleted file mode 100644 index ab98b61e2f..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021603.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021604.img.xml b/tools/MapleDojoUpdater/lib/original/925021604.img.xml deleted file mode 100644 index db6be2c73e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021604.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021605.img.xml b/tools/MapleDojoUpdater/lib/original/925021605.img.xml deleted file mode 100644 index 6d4995de8b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021605.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021606.img.xml b/tools/MapleDojoUpdater/lib/original/925021606.img.xml deleted file mode 100644 index a793454192..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021606.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021607.img.xml b/tools/MapleDojoUpdater/lib/original/925021607.img.xml deleted file mode 100644 index ba28907072..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021607.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021608.img.xml b/tools/MapleDojoUpdater/lib/original/925021608.img.xml deleted file mode 100644 index 82e47e3922..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021608.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021609.img.xml b/tools/MapleDojoUpdater/lib/original/925021609.img.xml deleted file mode 100644 index b25183bf53..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021609.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021700.img.xml b/tools/MapleDojoUpdater/lib/original/925021700.img.xml deleted file mode 100644 index 83f76a9b57..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021700.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021701.img.xml b/tools/MapleDojoUpdater/lib/original/925021701.img.xml deleted file mode 100644 index 4480725f2e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021701.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021702.img.xml b/tools/MapleDojoUpdater/lib/original/925021702.img.xml deleted file mode 100644 index 92c9c9ebce..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021702.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021703.img.xml b/tools/MapleDojoUpdater/lib/original/925021703.img.xml deleted file mode 100644 index 8fdd4f53e7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021703.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021704.img.xml b/tools/MapleDojoUpdater/lib/original/925021704.img.xml deleted file mode 100644 index 8199240a66..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021704.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021705.img.xml b/tools/MapleDojoUpdater/lib/original/925021705.img.xml deleted file mode 100644 index d8188c0eb7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021705.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021706.img.xml b/tools/MapleDojoUpdater/lib/original/925021706.img.xml deleted file mode 100644 index 0efdb4efc8..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021706.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021707.img.xml b/tools/MapleDojoUpdater/lib/original/925021707.img.xml deleted file mode 100644 index 9d275ffc03..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021707.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021708.img.xml b/tools/MapleDojoUpdater/lib/original/925021708.img.xml deleted file mode 100644 index 5fe20bf284..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021708.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021709.img.xml b/tools/MapleDojoUpdater/lib/original/925021709.img.xml deleted file mode 100644 index eb15ef4443..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021709.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021800.img.xml b/tools/MapleDojoUpdater/lib/original/925021800.img.xml deleted file mode 100644 index aa54aa8364..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021800.img.xml +++ /dev/null @@ -1,802 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021801.img.xml b/tools/MapleDojoUpdater/lib/original/925021801.img.xml deleted file mode 100644 index fdaa07d9ca..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021801.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021802.img.xml b/tools/MapleDojoUpdater/lib/original/925021802.img.xml deleted file mode 100644 index 19ec2fa47b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021802.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021803.img.xml b/tools/MapleDojoUpdater/lib/original/925021803.img.xml deleted file mode 100644 index f69a95aacd..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021803.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021804.img.xml b/tools/MapleDojoUpdater/lib/original/925021804.img.xml deleted file mode 100644 index 33984795e3..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021804.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021805.img.xml b/tools/MapleDojoUpdater/lib/original/925021805.img.xml deleted file mode 100644 index 7e6ce5d24f..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021805.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021806.img.xml b/tools/MapleDojoUpdater/lib/original/925021806.img.xml deleted file mode 100644 index 8b8fbadf84..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021806.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021807.img.xml b/tools/MapleDojoUpdater/lib/original/925021807.img.xml deleted file mode 100644 index d4ae1ba5fc..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021807.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021808.img.xml b/tools/MapleDojoUpdater/lib/original/925021808.img.xml deleted file mode 100644 index 36c9813e96..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021808.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021809.img.xml b/tools/MapleDojoUpdater/lib/original/925021809.img.xml deleted file mode 100644 index e13ee1c980..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021809.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021900.img.xml b/tools/MapleDojoUpdater/lib/original/925021900.img.xml deleted file mode 100644 index 5c8cae3404..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021900.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021901.img.xml b/tools/MapleDojoUpdater/lib/original/925021901.img.xml deleted file mode 100644 index c9ab12abd6..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021901.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021902.img.xml b/tools/MapleDojoUpdater/lib/original/925021902.img.xml deleted file mode 100644 index c5e78b8107..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021902.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021903.img.xml b/tools/MapleDojoUpdater/lib/original/925021903.img.xml deleted file mode 100644 index 8a90c7e19c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021903.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021904.img.xml b/tools/MapleDojoUpdater/lib/original/925021904.img.xml deleted file mode 100644 index 3b3206ed08..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021904.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021905.img.xml b/tools/MapleDojoUpdater/lib/original/925021905.img.xml deleted file mode 100644 index e7eceeefd4..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021905.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021906.img.xml b/tools/MapleDojoUpdater/lib/original/925021906.img.xml deleted file mode 100644 index b3046c1d4c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021906.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021907.img.xml b/tools/MapleDojoUpdater/lib/original/925021907.img.xml deleted file mode 100644 index 0b91bef33b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021907.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021908.img.xml b/tools/MapleDojoUpdater/lib/original/925021908.img.xml deleted file mode 100644 index 23f1a81d98..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021908.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925021909.img.xml b/tools/MapleDojoUpdater/lib/original/925021909.img.xml deleted file mode 100644 index 3b0fbc881d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925021909.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022000.img.xml b/tools/MapleDojoUpdater/lib/original/925022000.img.xml deleted file mode 100644 index b375c56b29..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022000.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022001.img.xml b/tools/MapleDojoUpdater/lib/original/925022001.img.xml deleted file mode 100644 index c0d3afa1a7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022001.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022002.img.xml b/tools/MapleDojoUpdater/lib/original/925022002.img.xml deleted file mode 100644 index e113df1a4f..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022002.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022003.img.xml b/tools/MapleDojoUpdater/lib/original/925022003.img.xml deleted file mode 100644 index b48f230e21..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022003.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022004.img.xml b/tools/MapleDojoUpdater/lib/original/925022004.img.xml deleted file mode 100644 index a97f45907c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022004.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022005.img.xml b/tools/MapleDojoUpdater/lib/original/925022005.img.xml deleted file mode 100644 index 1444a87503..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022005.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022006.img.xml b/tools/MapleDojoUpdater/lib/original/925022006.img.xml deleted file mode 100644 index 88edd1da6e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022006.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022007.img.xml b/tools/MapleDojoUpdater/lib/original/925022007.img.xml deleted file mode 100644 index 0da3c2fbb0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022007.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022008.img.xml b/tools/MapleDojoUpdater/lib/original/925022008.img.xml deleted file mode 100644 index c375c8dd9e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022008.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022009.img.xml b/tools/MapleDojoUpdater/lib/original/925022009.img.xml deleted file mode 100644 index c227a63e55..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022009.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022100.img.xml b/tools/MapleDojoUpdater/lib/original/925022100.img.xml deleted file mode 100644 index 8a92183c58..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022100.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022101.img.xml b/tools/MapleDojoUpdater/lib/original/925022101.img.xml deleted file mode 100644 index ea6a3a34c7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022101.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022102.img.xml b/tools/MapleDojoUpdater/lib/original/925022102.img.xml deleted file mode 100644 index 2ba501597e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022102.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022103.img.xml b/tools/MapleDojoUpdater/lib/original/925022103.img.xml deleted file mode 100644 index f37f147f0d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022103.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022104.img.xml b/tools/MapleDojoUpdater/lib/original/925022104.img.xml deleted file mode 100644 index 05f77e1f4a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022104.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022105.img.xml b/tools/MapleDojoUpdater/lib/original/925022105.img.xml deleted file mode 100644 index bbfb05b3eb..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022105.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022106.img.xml b/tools/MapleDojoUpdater/lib/original/925022106.img.xml deleted file mode 100644 index 3ea5b1666d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022106.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022107.img.xml b/tools/MapleDojoUpdater/lib/original/925022107.img.xml deleted file mode 100644 index 62ccd1ac20..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022107.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022108.img.xml b/tools/MapleDojoUpdater/lib/original/925022108.img.xml deleted file mode 100644 index e55ca0b470..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022108.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022109.img.xml b/tools/MapleDojoUpdater/lib/original/925022109.img.xml deleted file mode 100644 index e04a32f1a9..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022109.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022200.img.xml b/tools/MapleDojoUpdater/lib/original/925022200.img.xml deleted file mode 100644 index 2219dd24af..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022200.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022201.img.xml b/tools/MapleDojoUpdater/lib/original/925022201.img.xml deleted file mode 100644 index 87cd47d6d3..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022201.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022202.img.xml b/tools/MapleDojoUpdater/lib/original/925022202.img.xml deleted file mode 100644 index d77646e1db..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022202.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022203.img.xml b/tools/MapleDojoUpdater/lib/original/925022203.img.xml deleted file mode 100644 index ab0e6ad4cf..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022203.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022204.img.xml b/tools/MapleDojoUpdater/lib/original/925022204.img.xml deleted file mode 100644 index 09df1a0448..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022204.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022205.img.xml b/tools/MapleDojoUpdater/lib/original/925022205.img.xml deleted file mode 100644 index b0b10e5f3d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022205.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022206.img.xml b/tools/MapleDojoUpdater/lib/original/925022206.img.xml deleted file mode 100644 index 4f07f566d1..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022206.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022207.img.xml b/tools/MapleDojoUpdater/lib/original/925022207.img.xml deleted file mode 100644 index af88d04a24..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022207.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022208.img.xml b/tools/MapleDojoUpdater/lib/original/925022208.img.xml deleted file mode 100644 index 759d6cdc51..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022208.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022209.img.xml b/tools/MapleDojoUpdater/lib/original/925022209.img.xml deleted file mode 100644 index f996ca9a0a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022209.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022300.img.xml b/tools/MapleDojoUpdater/lib/original/925022300.img.xml deleted file mode 100644 index 3a49a88146..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022300.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022301.img.xml b/tools/MapleDojoUpdater/lib/original/925022301.img.xml deleted file mode 100644 index 4fef6ef16d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022301.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022302.img.xml b/tools/MapleDojoUpdater/lib/original/925022302.img.xml deleted file mode 100644 index fc7e7cafd5..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022302.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022303.img.xml b/tools/MapleDojoUpdater/lib/original/925022303.img.xml deleted file mode 100644 index 893e652ac2..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022303.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022304.img.xml b/tools/MapleDojoUpdater/lib/original/925022304.img.xml deleted file mode 100644 index 6569adf0c7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022304.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022305.img.xml b/tools/MapleDojoUpdater/lib/original/925022305.img.xml deleted file mode 100644 index 6363caf052..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022305.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022306.img.xml b/tools/MapleDojoUpdater/lib/original/925022306.img.xml deleted file mode 100644 index ef204bfcb1..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022306.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022307.img.xml b/tools/MapleDojoUpdater/lib/original/925022307.img.xml deleted file mode 100644 index d116eeb408..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022307.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022308.img.xml b/tools/MapleDojoUpdater/lib/original/925022308.img.xml deleted file mode 100644 index 158ab2d26b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022308.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022309.img.xml b/tools/MapleDojoUpdater/lib/original/925022309.img.xml deleted file mode 100644 index b4232f4eb2..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022309.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022400.img.xml b/tools/MapleDojoUpdater/lib/original/925022400.img.xml deleted file mode 100644 index a6cac1a0f1..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022400.img.xml +++ /dev/null @@ -1,802 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022401.img.xml b/tools/MapleDojoUpdater/lib/original/925022401.img.xml deleted file mode 100644 index de6bf95757..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022401.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022402.img.xml b/tools/MapleDojoUpdater/lib/original/925022402.img.xml deleted file mode 100644 index bbadf199c9..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022402.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022403.img.xml b/tools/MapleDojoUpdater/lib/original/925022403.img.xml deleted file mode 100644 index f1b7b5a63c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022403.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022404.img.xml b/tools/MapleDojoUpdater/lib/original/925022404.img.xml deleted file mode 100644 index 2d86fa6459..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022404.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022405.img.xml b/tools/MapleDojoUpdater/lib/original/925022405.img.xml deleted file mode 100644 index 2a71e8101e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022405.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022406.img.xml b/tools/MapleDojoUpdater/lib/original/925022406.img.xml deleted file mode 100644 index fd2b9101ff..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022406.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022407.img.xml b/tools/MapleDojoUpdater/lib/original/925022407.img.xml deleted file mode 100644 index 98b736dfb5..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022407.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022408.img.xml b/tools/MapleDojoUpdater/lib/original/925022408.img.xml deleted file mode 100644 index 5a98f6618a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022408.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022409.img.xml b/tools/MapleDojoUpdater/lib/original/925022409.img.xml deleted file mode 100644 index 83e58cd94e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022409.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022500.img.xml b/tools/MapleDojoUpdater/lib/original/925022500.img.xml deleted file mode 100644 index 9a793c53a9..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022500.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022501.img.xml b/tools/MapleDojoUpdater/lib/original/925022501.img.xml deleted file mode 100644 index 4fb8bea79e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022501.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022502.img.xml b/tools/MapleDojoUpdater/lib/original/925022502.img.xml deleted file mode 100644 index df28339c55..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022502.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022503.img.xml b/tools/MapleDojoUpdater/lib/original/925022503.img.xml deleted file mode 100644 index 00e826eb7b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022503.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022504.img.xml b/tools/MapleDojoUpdater/lib/original/925022504.img.xml deleted file mode 100644 index ed111e62a0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022504.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022505.img.xml b/tools/MapleDojoUpdater/lib/original/925022505.img.xml deleted file mode 100644 index 61a9311326..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022505.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022506.img.xml b/tools/MapleDojoUpdater/lib/original/925022506.img.xml deleted file mode 100644 index 08d4939330..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022506.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022507.img.xml b/tools/MapleDojoUpdater/lib/original/925022507.img.xml deleted file mode 100644 index 25288f2f39..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022507.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022508.img.xml b/tools/MapleDojoUpdater/lib/original/925022508.img.xml deleted file mode 100644 index 81a81003d3..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022508.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022509.img.xml b/tools/MapleDojoUpdater/lib/original/925022509.img.xml deleted file mode 100644 index 07b5c41122..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022509.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022600.img.xml b/tools/MapleDojoUpdater/lib/original/925022600.img.xml deleted file mode 100644 index ae4b4bf996..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022600.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022601.img.xml b/tools/MapleDojoUpdater/lib/original/925022601.img.xml deleted file mode 100644 index 20b56420ce..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022601.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022602.img.xml b/tools/MapleDojoUpdater/lib/original/925022602.img.xml deleted file mode 100644 index f9f01fd5e9..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022602.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022603.img.xml b/tools/MapleDojoUpdater/lib/original/925022603.img.xml deleted file mode 100644 index 2a198e76ab..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022603.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022604.img.xml b/tools/MapleDojoUpdater/lib/original/925022604.img.xml deleted file mode 100644 index 30f3a6802d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022604.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022605.img.xml b/tools/MapleDojoUpdater/lib/original/925022605.img.xml deleted file mode 100644 index 5711ad466a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022605.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022606.img.xml b/tools/MapleDojoUpdater/lib/original/925022606.img.xml deleted file mode 100644 index 12cc8c7516..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022606.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022607.img.xml b/tools/MapleDojoUpdater/lib/original/925022607.img.xml deleted file mode 100644 index 6191277e29..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022607.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022608.img.xml b/tools/MapleDojoUpdater/lib/original/925022608.img.xml deleted file mode 100644 index 31b1b91d71..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022608.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022609.img.xml b/tools/MapleDojoUpdater/lib/original/925022609.img.xml deleted file mode 100644 index 92e34f4ffc..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022609.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022700.img.xml b/tools/MapleDojoUpdater/lib/original/925022700.img.xml deleted file mode 100644 index d826986006..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022700.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022701.img.xml b/tools/MapleDojoUpdater/lib/original/925022701.img.xml deleted file mode 100644 index 71c8ae2870..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022701.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022702.img.xml b/tools/MapleDojoUpdater/lib/original/925022702.img.xml deleted file mode 100644 index fafdc6b28e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022702.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022703.img.xml b/tools/MapleDojoUpdater/lib/original/925022703.img.xml deleted file mode 100644 index 09b6b3a1ec..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022703.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022704.img.xml b/tools/MapleDojoUpdater/lib/original/925022704.img.xml deleted file mode 100644 index 140e2713bb..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022704.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022705.img.xml b/tools/MapleDojoUpdater/lib/original/925022705.img.xml deleted file mode 100644 index 00d7a10398..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022705.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022706.img.xml b/tools/MapleDojoUpdater/lib/original/925022706.img.xml deleted file mode 100644 index 7114f8ee4e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022706.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022707.img.xml b/tools/MapleDojoUpdater/lib/original/925022707.img.xml deleted file mode 100644 index 99d2673abc..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022707.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022708.img.xml b/tools/MapleDojoUpdater/lib/original/925022708.img.xml deleted file mode 100644 index 260c44c76e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022708.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022709.img.xml b/tools/MapleDojoUpdater/lib/original/925022709.img.xml deleted file mode 100644 index 537890efa5..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022709.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022800.img.xml b/tools/MapleDojoUpdater/lib/original/925022800.img.xml deleted file mode 100644 index 3bd791a09d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022800.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022801.img.xml b/tools/MapleDojoUpdater/lib/original/925022801.img.xml deleted file mode 100644 index b4d2f38608..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022801.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022802.img.xml b/tools/MapleDojoUpdater/lib/original/925022802.img.xml deleted file mode 100644 index 6d27e0572d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022802.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022803.img.xml b/tools/MapleDojoUpdater/lib/original/925022803.img.xml deleted file mode 100644 index b703c5b48b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022803.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022804.img.xml b/tools/MapleDojoUpdater/lib/original/925022804.img.xml deleted file mode 100644 index 37e30253e3..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022804.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022805.img.xml b/tools/MapleDojoUpdater/lib/original/925022805.img.xml deleted file mode 100644 index 8d3e0647da..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022805.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022806.img.xml b/tools/MapleDojoUpdater/lib/original/925022806.img.xml deleted file mode 100644 index a8898c7377..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022806.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022807.img.xml b/tools/MapleDojoUpdater/lib/original/925022807.img.xml deleted file mode 100644 index 0696ebb4f4..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022807.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022808.img.xml b/tools/MapleDojoUpdater/lib/original/925022808.img.xml deleted file mode 100644 index 075fc1786e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022808.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022809.img.xml b/tools/MapleDojoUpdater/lib/original/925022809.img.xml deleted file mode 100644 index 7ab5d60d2f..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022809.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022900.img.xml b/tools/MapleDojoUpdater/lib/original/925022900.img.xml deleted file mode 100644 index 5c4637d150..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022900.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022901.img.xml b/tools/MapleDojoUpdater/lib/original/925022901.img.xml deleted file mode 100644 index dabe868282..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022901.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022902.img.xml b/tools/MapleDojoUpdater/lib/original/925022902.img.xml deleted file mode 100644 index 01ea972ab1..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022902.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022903.img.xml b/tools/MapleDojoUpdater/lib/original/925022903.img.xml deleted file mode 100644 index 94f11fba07..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022903.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022904.img.xml b/tools/MapleDojoUpdater/lib/original/925022904.img.xml deleted file mode 100644 index 0b5f29f7c1..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022904.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022905.img.xml b/tools/MapleDojoUpdater/lib/original/925022905.img.xml deleted file mode 100644 index c3d2836717..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022905.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022906.img.xml b/tools/MapleDojoUpdater/lib/original/925022906.img.xml deleted file mode 100644 index 619db598ad..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022906.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022907.img.xml b/tools/MapleDojoUpdater/lib/original/925022907.img.xml deleted file mode 100644 index 2e0bce0b25..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022907.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022908.img.xml b/tools/MapleDojoUpdater/lib/original/925022908.img.xml deleted file mode 100644 index 2dedde0569..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022908.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925022909.img.xml b/tools/MapleDojoUpdater/lib/original/925022909.img.xml deleted file mode 100644 index b9ad262b22..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925022909.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023000.img.xml b/tools/MapleDojoUpdater/lib/original/925023000.img.xml deleted file mode 100644 index 27dde1c791..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023000.img.xml +++ /dev/null @@ -1,790 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023001.img.xml b/tools/MapleDojoUpdater/lib/original/925023001.img.xml deleted file mode 100644 index 8005eb38c4..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023001.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023002.img.xml b/tools/MapleDojoUpdater/lib/original/925023002.img.xml deleted file mode 100644 index 268386409c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023002.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023003.img.xml b/tools/MapleDojoUpdater/lib/original/925023003.img.xml deleted file mode 100644 index 17f332e291..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023003.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023004.img.xml b/tools/MapleDojoUpdater/lib/original/925023004.img.xml deleted file mode 100644 index 769da9a3bf..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023004.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023005.img.xml b/tools/MapleDojoUpdater/lib/original/925023005.img.xml deleted file mode 100644 index 37be7da61d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023005.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023006.img.xml b/tools/MapleDojoUpdater/lib/original/925023006.img.xml deleted file mode 100644 index f1628504f6..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023006.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023007.img.xml b/tools/MapleDojoUpdater/lib/original/925023007.img.xml deleted file mode 100644 index 57f7191bd3..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023007.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023008.img.xml b/tools/MapleDojoUpdater/lib/original/925023008.img.xml deleted file mode 100644 index 3f46ec03c6..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023008.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023009.img.xml b/tools/MapleDojoUpdater/lib/original/925023009.img.xml deleted file mode 100644 index 115971634b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023009.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023100.img.xml b/tools/MapleDojoUpdater/lib/original/925023100.img.xml deleted file mode 100644 index 32dc5a9c96..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023100.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023101.img.xml b/tools/MapleDojoUpdater/lib/original/925023101.img.xml deleted file mode 100644 index ee35828ea8..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023101.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023102.img.xml b/tools/MapleDojoUpdater/lib/original/925023102.img.xml deleted file mode 100644 index 4490c406c9..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023102.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023103.img.xml b/tools/MapleDojoUpdater/lib/original/925023103.img.xml deleted file mode 100644 index f0fe50fbcc..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023103.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023104.img.xml b/tools/MapleDojoUpdater/lib/original/925023104.img.xml deleted file mode 100644 index e191f15309..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023104.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023105.img.xml b/tools/MapleDojoUpdater/lib/original/925023105.img.xml deleted file mode 100644 index 002d8b1d74..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023105.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023106.img.xml b/tools/MapleDojoUpdater/lib/original/925023106.img.xml deleted file mode 100644 index 17aca1eda0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023106.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023107.img.xml b/tools/MapleDojoUpdater/lib/original/925023107.img.xml deleted file mode 100644 index fd58fc86a2..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023107.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023108.img.xml b/tools/MapleDojoUpdater/lib/original/925023108.img.xml deleted file mode 100644 index f8b78f4079..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023108.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023109.img.xml b/tools/MapleDojoUpdater/lib/original/925023109.img.xml deleted file mode 100644 index 83102de0cd..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023109.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023200.img.xml b/tools/MapleDojoUpdater/lib/original/925023200.img.xml deleted file mode 100644 index a408ce2677..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023200.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023201.img.xml b/tools/MapleDojoUpdater/lib/original/925023201.img.xml deleted file mode 100644 index 6444e25243..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023201.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023202.img.xml b/tools/MapleDojoUpdater/lib/original/925023202.img.xml deleted file mode 100644 index 2cc62638de..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023202.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023203.img.xml b/tools/MapleDojoUpdater/lib/original/925023203.img.xml deleted file mode 100644 index 5fe12f3457..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023203.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023204.img.xml b/tools/MapleDojoUpdater/lib/original/925023204.img.xml deleted file mode 100644 index f4af76f7e1..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023204.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023205.img.xml b/tools/MapleDojoUpdater/lib/original/925023205.img.xml deleted file mode 100644 index 91616c8e30..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023205.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023206.img.xml b/tools/MapleDojoUpdater/lib/original/925023206.img.xml deleted file mode 100644 index aabce465c7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023206.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023207.img.xml b/tools/MapleDojoUpdater/lib/original/925023207.img.xml deleted file mode 100644 index 79f01b110b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023207.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023208.img.xml b/tools/MapleDojoUpdater/lib/original/925023208.img.xml deleted file mode 100644 index ebd92cbd9b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023208.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023209.img.xml b/tools/MapleDojoUpdater/lib/original/925023209.img.xml deleted file mode 100644 index b25a114566..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023209.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023300.img.xml b/tools/MapleDojoUpdater/lib/original/925023300.img.xml deleted file mode 100644 index 84c982e062..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023300.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023301.img.xml b/tools/MapleDojoUpdater/lib/original/925023301.img.xml deleted file mode 100644 index 3c30165eeb..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023301.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023302.img.xml b/tools/MapleDojoUpdater/lib/original/925023302.img.xml deleted file mode 100644 index 38912bebbc..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023302.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023303.img.xml b/tools/MapleDojoUpdater/lib/original/925023303.img.xml deleted file mode 100644 index b4932c5676..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023303.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023304.img.xml b/tools/MapleDojoUpdater/lib/original/925023304.img.xml deleted file mode 100644 index 3b7ffc0a97..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023304.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023305.img.xml b/tools/MapleDojoUpdater/lib/original/925023305.img.xml deleted file mode 100644 index 5265fc2949..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023305.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023306.img.xml b/tools/MapleDojoUpdater/lib/original/925023306.img.xml deleted file mode 100644 index 7a3945ef59..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023306.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023307.img.xml b/tools/MapleDojoUpdater/lib/original/925023307.img.xml deleted file mode 100644 index 9989cdb3cb..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023307.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023308.img.xml b/tools/MapleDojoUpdater/lib/original/925023308.img.xml deleted file mode 100644 index d554e1cd3e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023308.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023309.img.xml b/tools/MapleDojoUpdater/lib/original/925023309.img.xml deleted file mode 100644 index e208c391d7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023309.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023400.img.xml b/tools/MapleDojoUpdater/lib/original/925023400.img.xml deleted file mode 100644 index 9c91a0077d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023400.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023401.img.xml b/tools/MapleDojoUpdater/lib/original/925023401.img.xml deleted file mode 100644 index 1d9126d160..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023401.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023402.img.xml b/tools/MapleDojoUpdater/lib/original/925023402.img.xml deleted file mode 100644 index c4ed0d1937..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023402.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023403.img.xml b/tools/MapleDojoUpdater/lib/original/925023403.img.xml deleted file mode 100644 index e735bad923..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023403.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023404.img.xml b/tools/MapleDojoUpdater/lib/original/925023404.img.xml deleted file mode 100644 index 05501a5fce..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023404.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023405.img.xml b/tools/MapleDojoUpdater/lib/original/925023405.img.xml deleted file mode 100644 index db7c2c10ca..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023405.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023406.img.xml b/tools/MapleDojoUpdater/lib/original/925023406.img.xml deleted file mode 100644 index 69a7e60872..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023406.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023407.img.xml b/tools/MapleDojoUpdater/lib/original/925023407.img.xml deleted file mode 100644 index f277636961..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023407.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023408.img.xml b/tools/MapleDojoUpdater/lib/original/925023408.img.xml deleted file mode 100644 index fb458f0772..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023408.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023409.img.xml b/tools/MapleDojoUpdater/lib/original/925023409.img.xml deleted file mode 100644 index f21a0f4e72..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023409.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023500.img.xml b/tools/MapleDojoUpdater/lib/original/925023500.img.xml deleted file mode 100644 index 7d0b6138e4..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023500.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023501.img.xml b/tools/MapleDojoUpdater/lib/original/925023501.img.xml deleted file mode 100644 index 0d7b9adaef..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023501.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023502.img.xml b/tools/MapleDojoUpdater/lib/original/925023502.img.xml deleted file mode 100644 index ae1c387dcf..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023502.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023503.img.xml b/tools/MapleDojoUpdater/lib/original/925023503.img.xml deleted file mode 100644 index d68a6ec9a4..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023503.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023504.img.xml b/tools/MapleDojoUpdater/lib/original/925023504.img.xml deleted file mode 100644 index ca90024e6c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023504.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023505.img.xml b/tools/MapleDojoUpdater/lib/original/925023505.img.xml deleted file mode 100644 index 1cf8769551..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023505.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023506.img.xml b/tools/MapleDojoUpdater/lib/original/925023506.img.xml deleted file mode 100644 index 4ce067f75f..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023506.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023507.img.xml b/tools/MapleDojoUpdater/lib/original/925023507.img.xml deleted file mode 100644 index 8b7634e30e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023507.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023508.img.xml b/tools/MapleDojoUpdater/lib/original/925023508.img.xml deleted file mode 100644 index 984a89ea71..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023508.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023509.img.xml b/tools/MapleDojoUpdater/lib/original/925023509.img.xml deleted file mode 100644 index 73edbdf191..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023509.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023600.img.xml b/tools/MapleDojoUpdater/lib/original/925023600.img.xml deleted file mode 100644 index 978cda9735..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023600.img.xml +++ /dev/null @@ -1,802 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023601.img.xml b/tools/MapleDojoUpdater/lib/original/925023601.img.xml deleted file mode 100644 index 8cc9baa516..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023601.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023602.img.xml b/tools/MapleDojoUpdater/lib/original/925023602.img.xml deleted file mode 100644 index 7fad2575a4..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023602.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023603.img.xml b/tools/MapleDojoUpdater/lib/original/925023603.img.xml deleted file mode 100644 index 09173cb3f6..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023603.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023604.img.xml b/tools/MapleDojoUpdater/lib/original/925023604.img.xml deleted file mode 100644 index 1526e59981..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023604.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023605.img.xml b/tools/MapleDojoUpdater/lib/original/925023605.img.xml deleted file mode 100644 index 72be66d401..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023605.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023606.img.xml b/tools/MapleDojoUpdater/lib/original/925023606.img.xml deleted file mode 100644 index 0b0ab0c4b1..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023606.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023607.img.xml b/tools/MapleDojoUpdater/lib/original/925023607.img.xml deleted file mode 100644 index 3ebef744e7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023607.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023608.img.xml b/tools/MapleDojoUpdater/lib/original/925023608.img.xml deleted file mode 100644 index 77653db188..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023608.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023609.img.xml b/tools/MapleDojoUpdater/lib/original/925023609.img.xml deleted file mode 100644 index 8f4f8b3057..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023609.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023700.img.xml b/tools/MapleDojoUpdater/lib/original/925023700.img.xml deleted file mode 100644 index 03317bc270..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023700.img.xml +++ /dev/null @@ -1,859 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023701.img.xml b/tools/MapleDojoUpdater/lib/original/925023701.img.xml deleted file mode 100644 index 11779a970c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023701.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023702.img.xml b/tools/MapleDojoUpdater/lib/original/925023702.img.xml deleted file mode 100644 index 14de3d6d63..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023702.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023703.img.xml b/tools/MapleDojoUpdater/lib/original/925023703.img.xml deleted file mode 100644 index eb2e9adc50..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023703.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023704.img.xml b/tools/MapleDojoUpdater/lib/original/925023704.img.xml deleted file mode 100644 index b081eb1cda..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023704.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023705.img.xml b/tools/MapleDojoUpdater/lib/original/925023705.img.xml deleted file mode 100644 index c2ff197f15..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023705.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023706.img.xml b/tools/MapleDojoUpdater/lib/original/925023706.img.xml deleted file mode 100644 index 1478a4ba9d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023706.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023707.img.xml b/tools/MapleDojoUpdater/lib/original/925023707.img.xml deleted file mode 100644 index 77f2cfc4a3..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023707.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023708.img.xml b/tools/MapleDojoUpdater/lib/original/925023708.img.xml deleted file mode 100644 index c6cdc7cee8..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023708.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023709.img.xml b/tools/MapleDojoUpdater/lib/original/925023709.img.xml deleted file mode 100644 index 66061e23ef..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023709.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023800.img.xml b/tools/MapleDojoUpdater/lib/original/925023800.img.xml deleted file mode 100644 index bfb96047c6..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023800.img.xml +++ /dev/null @@ -1,895 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023801.img.xml b/tools/MapleDojoUpdater/lib/original/925023801.img.xml deleted file mode 100644 index 44603a3b4a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023801.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023802.img.xml b/tools/MapleDojoUpdater/lib/original/925023802.img.xml deleted file mode 100644 index 01ac8ee963..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023802.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023803.img.xml b/tools/MapleDojoUpdater/lib/original/925023803.img.xml deleted file mode 100644 index e597eb21d4..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023803.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023804.img.xml b/tools/MapleDojoUpdater/lib/original/925023804.img.xml deleted file mode 100644 index 86707f96e5..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023804.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023805.img.xml b/tools/MapleDojoUpdater/lib/original/925023805.img.xml deleted file mode 100644 index 0ecc3b8963..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023805.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023806.img.xml b/tools/MapleDojoUpdater/lib/original/925023806.img.xml deleted file mode 100644 index fed0c72605..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023806.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023807.img.xml b/tools/MapleDojoUpdater/lib/original/925023807.img.xml deleted file mode 100644 index 315103caea..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023807.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023808.img.xml b/tools/MapleDojoUpdater/lib/original/925023808.img.xml deleted file mode 100644 index 2520015afc..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023808.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925023809.img.xml b/tools/MapleDojoUpdater/lib/original/925023809.img.xml deleted file mode 100644 index 2adedf5c27..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925023809.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030100.img.xml b/tools/MapleDojoUpdater/lib/original/925030100.img.xml deleted file mode 100644 index f5f5a05334..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030100.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030101.img.xml b/tools/MapleDojoUpdater/lib/original/925030101.img.xml deleted file mode 100644 index 0a9def7a4b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030101.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030102.img.xml b/tools/MapleDojoUpdater/lib/original/925030102.img.xml deleted file mode 100644 index f8ea8ec984..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030102.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030103.img.xml b/tools/MapleDojoUpdater/lib/original/925030103.img.xml deleted file mode 100644 index 5a5bb900dc..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030103.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030104.img.xml b/tools/MapleDojoUpdater/lib/original/925030104.img.xml deleted file mode 100644 index 1e15b38c2d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030104.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030200.img.xml b/tools/MapleDojoUpdater/lib/original/925030200.img.xml deleted file mode 100644 index 46f4c4a2f8..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030200.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030201.img.xml b/tools/MapleDojoUpdater/lib/original/925030201.img.xml deleted file mode 100644 index 32c7e19e74..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030201.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030202.img.xml b/tools/MapleDojoUpdater/lib/original/925030202.img.xml deleted file mode 100644 index 4c46120a4f..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030202.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030203.img.xml b/tools/MapleDojoUpdater/lib/original/925030203.img.xml deleted file mode 100644 index e0fbd01626..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030203.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030204.img.xml b/tools/MapleDojoUpdater/lib/original/925030204.img.xml deleted file mode 100644 index 1ca94f085f..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030204.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030300.img.xml b/tools/MapleDojoUpdater/lib/original/925030300.img.xml deleted file mode 100644 index 77ceca7bdc..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030300.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030301.img.xml b/tools/MapleDojoUpdater/lib/original/925030301.img.xml deleted file mode 100644 index d6429d20f9..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030301.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030302.img.xml b/tools/MapleDojoUpdater/lib/original/925030302.img.xml deleted file mode 100644 index 66b28bc3f0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030302.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030303.img.xml b/tools/MapleDojoUpdater/lib/original/925030303.img.xml deleted file mode 100644 index ee5e9da54f..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030303.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030304.img.xml b/tools/MapleDojoUpdater/lib/original/925030304.img.xml deleted file mode 100644 index 5e16866232..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030304.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030400.img.xml b/tools/MapleDojoUpdater/lib/original/925030400.img.xml deleted file mode 100644 index e2a2c906cb..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030400.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030401.img.xml b/tools/MapleDojoUpdater/lib/original/925030401.img.xml deleted file mode 100644 index 61c1b30b9b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030401.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030402.img.xml b/tools/MapleDojoUpdater/lib/original/925030402.img.xml deleted file mode 100644 index 99a09432dc..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030402.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030403.img.xml b/tools/MapleDojoUpdater/lib/original/925030403.img.xml deleted file mode 100644 index 01f9f15f78..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030403.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030404.img.xml b/tools/MapleDojoUpdater/lib/original/925030404.img.xml deleted file mode 100644 index cdc27d7ecd..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030404.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030500.img.xml b/tools/MapleDojoUpdater/lib/original/925030500.img.xml deleted file mode 100644 index 72faf5a6c0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030500.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030501.img.xml b/tools/MapleDojoUpdater/lib/original/925030501.img.xml deleted file mode 100644 index 39b732b03a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030501.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030502.img.xml b/tools/MapleDojoUpdater/lib/original/925030502.img.xml deleted file mode 100644 index ab41c7316c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030502.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030503.img.xml b/tools/MapleDojoUpdater/lib/original/925030503.img.xml deleted file mode 100644 index eae816ad7d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030503.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030504.img.xml b/tools/MapleDojoUpdater/lib/original/925030504.img.xml deleted file mode 100644 index 9f9c8c2366..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030504.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030600.img.xml b/tools/MapleDojoUpdater/lib/original/925030600.img.xml deleted file mode 100644 index d9a3e92b37..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030600.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030601.img.xml b/tools/MapleDojoUpdater/lib/original/925030601.img.xml deleted file mode 100644 index c0c9b1810c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030601.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030602.img.xml b/tools/MapleDojoUpdater/lib/original/925030602.img.xml deleted file mode 100644 index 2c9b1aef29..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030602.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030603.img.xml b/tools/MapleDojoUpdater/lib/original/925030603.img.xml deleted file mode 100644 index dbca1c77a1..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030603.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030604.img.xml b/tools/MapleDojoUpdater/lib/original/925030604.img.xml deleted file mode 100644 index e20d56ec3c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030604.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030700.img.xml b/tools/MapleDojoUpdater/lib/original/925030700.img.xml deleted file mode 100644 index c6bb530fa3..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030700.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030701.img.xml b/tools/MapleDojoUpdater/lib/original/925030701.img.xml deleted file mode 100644 index 87f2c03109..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030701.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030702.img.xml b/tools/MapleDojoUpdater/lib/original/925030702.img.xml deleted file mode 100644 index 19ae358514..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030702.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030703.img.xml b/tools/MapleDojoUpdater/lib/original/925030703.img.xml deleted file mode 100644 index 7f584361fb..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030703.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030704.img.xml b/tools/MapleDojoUpdater/lib/original/925030704.img.xml deleted file mode 100644 index 6c39bf8d7d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030704.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030800.img.xml b/tools/MapleDojoUpdater/lib/original/925030800.img.xml deleted file mode 100644 index a6d1197bcb..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030800.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030801.img.xml b/tools/MapleDojoUpdater/lib/original/925030801.img.xml deleted file mode 100644 index 7a2b1e4c56..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030801.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030802.img.xml b/tools/MapleDojoUpdater/lib/original/925030802.img.xml deleted file mode 100644 index 595e2b383a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030802.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030803.img.xml b/tools/MapleDojoUpdater/lib/original/925030803.img.xml deleted file mode 100644 index ad53f8f698..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030803.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030804.img.xml b/tools/MapleDojoUpdater/lib/original/925030804.img.xml deleted file mode 100644 index 7b02d52478..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030804.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030900.img.xml b/tools/MapleDojoUpdater/lib/original/925030900.img.xml deleted file mode 100644 index 2eb7d23be8..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030900.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030901.img.xml b/tools/MapleDojoUpdater/lib/original/925030901.img.xml deleted file mode 100644 index 3f25b08381..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030901.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030902.img.xml b/tools/MapleDojoUpdater/lib/original/925030902.img.xml deleted file mode 100644 index a7ab92ae6b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030902.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030903.img.xml b/tools/MapleDojoUpdater/lib/original/925030903.img.xml deleted file mode 100644 index 2e448488c7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030903.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925030904.img.xml b/tools/MapleDojoUpdater/lib/original/925030904.img.xml deleted file mode 100644 index 8473c2e664..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925030904.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031000.img.xml b/tools/MapleDojoUpdater/lib/original/925031000.img.xml deleted file mode 100644 index 20c07f675f..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031000.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031001.img.xml b/tools/MapleDojoUpdater/lib/original/925031001.img.xml deleted file mode 100644 index cb042f92a7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031001.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031002.img.xml b/tools/MapleDojoUpdater/lib/original/925031002.img.xml deleted file mode 100644 index 36da252413..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031002.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031003.img.xml b/tools/MapleDojoUpdater/lib/original/925031003.img.xml deleted file mode 100644 index 487359bcc7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031003.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031004.img.xml b/tools/MapleDojoUpdater/lib/original/925031004.img.xml deleted file mode 100644 index 1b904490b5..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031004.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031100.img.xml b/tools/MapleDojoUpdater/lib/original/925031100.img.xml deleted file mode 100644 index 6c886d418b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031100.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031101.img.xml b/tools/MapleDojoUpdater/lib/original/925031101.img.xml deleted file mode 100644 index 7d8286c9ec..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031101.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031102.img.xml b/tools/MapleDojoUpdater/lib/original/925031102.img.xml deleted file mode 100644 index 92dc8c1883..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031102.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031103.img.xml b/tools/MapleDojoUpdater/lib/original/925031103.img.xml deleted file mode 100644 index c122742705..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031103.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031104.img.xml b/tools/MapleDojoUpdater/lib/original/925031104.img.xml deleted file mode 100644 index 360c8c518a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031104.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031200.img.xml b/tools/MapleDojoUpdater/lib/original/925031200.img.xml deleted file mode 100644 index a50a49a714..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031200.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031201.img.xml b/tools/MapleDojoUpdater/lib/original/925031201.img.xml deleted file mode 100644 index bcf320de4e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031201.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031202.img.xml b/tools/MapleDojoUpdater/lib/original/925031202.img.xml deleted file mode 100644 index 12b9da9228..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031202.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031203.img.xml b/tools/MapleDojoUpdater/lib/original/925031203.img.xml deleted file mode 100644 index 46b4516b7d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031203.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031204.img.xml b/tools/MapleDojoUpdater/lib/original/925031204.img.xml deleted file mode 100644 index 692a39480e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031204.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031300.img.xml b/tools/MapleDojoUpdater/lib/original/925031300.img.xml deleted file mode 100644 index b130517214..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031300.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031301.img.xml b/tools/MapleDojoUpdater/lib/original/925031301.img.xml deleted file mode 100644 index 98b73b1679..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031301.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031302.img.xml b/tools/MapleDojoUpdater/lib/original/925031302.img.xml deleted file mode 100644 index 5c71059134..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031302.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031303.img.xml b/tools/MapleDojoUpdater/lib/original/925031303.img.xml deleted file mode 100644 index 905bb90c70..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031303.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031304.img.xml b/tools/MapleDojoUpdater/lib/original/925031304.img.xml deleted file mode 100644 index a11945f974..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031304.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031400.img.xml b/tools/MapleDojoUpdater/lib/original/925031400.img.xml deleted file mode 100644 index 8fc55654a2..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031400.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031401.img.xml b/tools/MapleDojoUpdater/lib/original/925031401.img.xml deleted file mode 100644 index 14678b8c66..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031401.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031402.img.xml b/tools/MapleDojoUpdater/lib/original/925031402.img.xml deleted file mode 100644 index b049b2fc40..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031402.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031403.img.xml b/tools/MapleDojoUpdater/lib/original/925031403.img.xml deleted file mode 100644 index 436e44d37a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031403.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031404.img.xml b/tools/MapleDojoUpdater/lib/original/925031404.img.xml deleted file mode 100644 index f05fb74892..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031404.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031500.img.xml b/tools/MapleDojoUpdater/lib/original/925031500.img.xml deleted file mode 100644 index 0aee563fd7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031500.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031501.img.xml b/tools/MapleDojoUpdater/lib/original/925031501.img.xml deleted file mode 100644 index f2ffa8be15..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031501.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031502.img.xml b/tools/MapleDojoUpdater/lib/original/925031502.img.xml deleted file mode 100644 index 835af6208d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031502.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031503.img.xml b/tools/MapleDojoUpdater/lib/original/925031503.img.xml deleted file mode 100644 index ee99723cd4..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031503.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031504.img.xml b/tools/MapleDojoUpdater/lib/original/925031504.img.xml deleted file mode 100644 index 0f224149ff..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031504.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031600.img.xml b/tools/MapleDojoUpdater/lib/original/925031600.img.xml deleted file mode 100644 index 4bc99aef9f..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031600.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031601.img.xml b/tools/MapleDojoUpdater/lib/original/925031601.img.xml deleted file mode 100644 index 07ffe60165..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031601.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031602.img.xml b/tools/MapleDojoUpdater/lib/original/925031602.img.xml deleted file mode 100644 index d0838ade40..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031602.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031603.img.xml b/tools/MapleDojoUpdater/lib/original/925031603.img.xml deleted file mode 100644 index be1d2afa8f..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031603.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031604.img.xml b/tools/MapleDojoUpdater/lib/original/925031604.img.xml deleted file mode 100644 index 268e25184d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031604.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031700.img.xml b/tools/MapleDojoUpdater/lib/original/925031700.img.xml deleted file mode 100644 index e8d73f5be6..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031700.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031701.img.xml b/tools/MapleDojoUpdater/lib/original/925031701.img.xml deleted file mode 100644 index 5f25e4f879..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031701.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031702.img.xml b/tools/MapleDojoUpdater/lib/original/925031702.img.xml deleted file mode 100644 index aec5feb0b7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031702.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031703.img.xml b/tools/MapleDojoUpdater/lib/original/925031703.img.xml deleted file mode 100644 index 6fbb1df751..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031703.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031704.img.xml b/tools/MapleDojoUpdater/lib/original/925031704.img.xml deleted file mode 100644 index 1ad5830379..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031704.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031800.img.xml b/tools/MapleDojoUpdater/lib/original/925031800.img.xml deleted file mode 100644 index 7bbde00a59..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031800.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031801.img.xml b/tools/MapleDojoUpdater/lib/original/925031801.img.xml deleted file mode 100644 index ce2dc7ddf0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031801.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031802.img.xml b/tools/MapleDojoUpdater/lib/original/925031802.img.xml deleted file mode 100644 index 55bdc3ab48..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031802.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031803.img.xml b/tools/MapleDojoUpdater/lib/original/925031803.img.xml deleted file mode 100644 index d0fcdd6850..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031803.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031804.img.xml b/tools/MapleDojoUpdater/lib/original/925031804.img.xml deleted file mode 100644 index 13fe62246c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031804.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031900.img.xml b/tools/MapleDojoUpdater/lib/original/925031900.img.xml deleted file mode 100644 index b11f64a9e3..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031900.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031901.img.xml b/tools/MapleDojoUpdater/lib/original/925031901.img.xml deleted file mode 100644 index 1c866100ab..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031901.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031902.img.xml b/tools/MapleDojoUpdater/lib/original/925031902.img.xml deleted file mode 100644 index 5044085788..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031902.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031903.img.xml b/tools/MapleDojoUpdater/lib/original/925031903.img.xml deleted file mode 100644 index 27291ef22d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031903.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925031904.img.xml b/tools/MapleDojoUpdater/lib/original/925031904.img.xml deleted file mode 100644 index f5eaa2b56c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925031904.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032000.img.xml b/tools/MapleDojoUpdater/lib/original/925032000.img.xml deleted file mode 100644 index c9440c6be0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032000.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032001.img.xml b/tools/MapleDojoUpdater/lib/original/925032001.img.xml deleted file mode 100644 index 042994369d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032001.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032002.img.xml b/tools/MapleDojoUpdater/lib/original/925032002.img.xml deleted file mode 100644 index 0af9db0f06..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032002.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032003.img.xml b/tools/MapleDojoUpdater/lib/original/925032003.img.xml deleted file mode 100644 index 7c78d00e8f..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032003.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032004.img.xml b/tools/MapleDojoUpdater/lib/original/925032004.img.xml deleted file mode 100644 index 95e02607ae..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032004.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032100.img.xml b/tools/MapleDojoUpdater/lib/original/925032100.img.xml deleted file mode 100644 index 26c0785c12..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032100.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032101.img.xml b/tools/MapleDojoUpdater/lib/original/925032101.img.xml deleted file mode 100644 index cd4163d701..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032101.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032102.img.xml b/tools/MapleDojoUpdater/lib/original/925032102.img.xml deleted file mode 100644 index e32b758e57..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032102.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032103.img.xml b/tools/MapleDojoUpdater/lib/original/925032103.img.xml deleted file mode 100644 index df9a92198b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032103.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032104.img.xml b/tools/MapleDojoUpdater/lib/original/925032104.img.xml deleted file mode 100644 index bfac0aa7a9..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032104.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032200.img.xml b/tools/MapleDojoUpdater/lib/original/925032200.img.xml deleted file mode 100644 index cac9b99145..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032200.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032201.img.xml b/tools/MapleDojoUpdater/lib/original/925032201.img.xml deleted file mode 100644 index 218bc22626..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032201.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032202.img.xml b/tools/MapleDojoUpdater/lib/original/925032202.img.xml deleted file mode 100644 index 8ca189d9a9..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032202.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032203.img.xml b/tools/MapleDojoUpdater/lib/original/925032203.img.xml deleted file mode 100644 index f076674071..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032203.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032204.img.xml b/tools/MapleDojoUpdater/lib/original/925032204.img.xml deleted file mode 100644 index 4599d1d52a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032204.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032300.img.xml b/tools/MapleDojoUpdater/lib/original/925032300.img.xml deleted file mode 100644 index 2d8d61722e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032300.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032301.img.xml b/tools/MapleDojoUpdater/lib/original/925032301.img.xml deleted file mode 100644 index 2f6e3efe38..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032301.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032302.img.xml b/tools/MapleDojoUpdater/lib/original/925032302.img.xml deleted file mode 100644 index 63ab856026..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032302.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032303.img.xml b/tools/MapleDojoUpdater/lib/original/925032303.img.xml deleted file mode 100644 index 12921f2079..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032303.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032304.img.xml b/tools/MapleDojoUpdater/lib/original/925032304.img.xml deleted file mode 100644 index 802be5f3a2..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032304.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032400.img.xml b/tools/MapleDojoUpdater/lib/original/925032400.img.xml deleted file mode 100644 index 4556af034c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032400.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032401.img.xml b/tools/MapleDojoUpdater/lib/original/925032401.img.xml deleted file mode 100644 index 941590b6b3..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032401.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032402.img.xml b/tools/MapleDojoUpdater/lib/original/925032402.img.xml deleted file mode 100644 index 0179dac569..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032402.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032403.img.xml b/tools/MapleDojoUpdater/lib/original/925032403.img.xml deleted file mode 100644 index 54ec3d8de5..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032403.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032404.img.xml b/tools/MapleDojoUpdater/lib/original/925032404.img.xml deleted file mode 100644 index f898459a5c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032404.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032500.img.xml b/tools/MapleDojoUpdater/lib/original/925032500.img.xml deleted file mode 100644 index d579bdfc60..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032500.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032501.img.xml b/tools/MapleDojoUpdater/lib/original/925032501.img.xml deleted file mode 100644 index 11ddf97742..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032501.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032502.img.xml b/tools/MapleDojoUpdater/lib/original/925032502.img.xml deleted file mode 100644 index c986cdef9a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032502.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032503.img.xml b/tools/MapleDojoUpdater/lib/original/925032503.img.xml deleted file mode 100644 index 5cdb6bce4d..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032503.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032504.img.xml b/tools/MapleDojoUpdater/lib/original/925032504.img.xml deleted file mode 100644 index fcbcbe29ee..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032504.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032600.img.xml b/tools/MapleDojoUpdater/lib/original/925032600.img.xml deleted file mode 100644 index 36b8234db2..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032600.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032601.img.xml b/tools/MapleDojoUpdater/lib/original/925032601.img.xml deleted file mode 100644 index 54726a7028..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032601.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032602.img.xml b/tools/MapleDojoUpdater/lib/original/925032602.img.xml deleted file mode 100644 index 28e7b78ddd..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032602.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032603.img.xml b/tools/MapleDojoUpdater/lib/original/925032603.img.xml deleted file mode 100644 index 073e0ba90f..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032603.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032604.img.xml b/tools/MapleDojoUpdater/lib/original/925032604.img.xml deleted file mode 100644 index 53a8fa3cbe..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032604.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032700.img.xml b/tools/MapleDojoUpdater/lib/original/925032700.img.xml deleted file mode 100644 index d908583f95..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032700.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032701.img.xml b/tools/MapleDojoUpdater/lib/original/925032701.img.xml deleted file mode 100644 index 8a13d847f1..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032701.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032702.img.xml b/tools/MapleDojoUpdater/lib/original/925032702.img.xml deleted file mode 100644 index f0c1709bf5..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032702.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032703.img.xml b/tools/MapleDojoUpdater/lib/original/925032703.img.xml deleted file mode 100644 index 92e0c38715..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032703.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032704.img.xml b/tools/MapleDojoUpdater/lib/original/925032704.img.xml deleted file mode 100644 index 95008edd39..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032704.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032800.img.xml b/tools/MapleDojoUpdater/lib/original/925032800.img.xml deleted file mode 100644 index 92734be1f2..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032800.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032801.img.xml b/tools/MapleDojoUpdater/lib/original/925032801.img.xml deleted file mode 100644 index fde366868c..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032801.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032802.img.xml b/tools/MapleDojoUpdater/lib/original/925032802.img.xml deleted file mode 100644 index 804065b452..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032802.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032803.img.xml b/tools/MapleDojoUpdater/lib/original/925032803.img.xml deleted file mode 100644 index 1a2ce4a0cd..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032803.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032804.img.xml b/tools/MapleDojoUpdater/lib/original/925032804.img.xml deleted file mode 100644 index 8567882741..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032804.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032900.img.xml b/tools/MapleDojoUpdater/lib/original/925032900.img.xml deleted file mode 100644 index 8b7cd84ed5..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032900.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032901.img.xml b/tools/MapleDojoUpdater/lib/original/925032901.img.xml deleted file mode 100644 index 064a497e39..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032901.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032902.img.xml b/tools/MapleDojoUpdater/lib/original/925032902.img.xml deleted file mode 100644 index 3c64cddec1..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032902.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032903.img.xml b/tools/MapleDojoUpdater/lib/original/925032903.img.xml deleted file mode 100644 index 22e89e0388..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032903.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925032904.img.xml b/tools/MapleDojoUpdater/lib/original/925032904.img.xml deleted file mode 100644 index 48170c47a7..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925032904.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033000.img.xml b/tools/MapleDojoUpdater/lib/original/925033000.img.xml deleted file mode 100644 index bdeb6e49ab..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033000.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033001.img.xml b/tools/MapleDojoUpdater/lib/original/925033001.img.xml deleted file mode 100644 index 5e30dfb368..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033001.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033002.img.xml b/tools/MapleDojoUpdater/lib/original/925033002.img.xml deleted file mode 100644 index 44d5330f23..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033002.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033003.img.xml b/tools/MapleDojoUpdater/lib/original/925033003.img.xml deleted file mode 100644 index 44b3f4231f..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033003.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033004.img.xml b/tools/MapleDojoUpdater/lib/original/925033004.img.xml deleted file mode 100644 index 2ee62c3373..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033004.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033100.img.xml b/tools/MapleDojoUpdater/lib/original/925033100.img.xml deleted file mode 100644 index 7784f4a980..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033100.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033101.img.xml b/tools/MapleDojoUpdater/lib/original/925033101.img.xml deleted file mode 100644 index e7c1d85934..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033101.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033102.img.xml b/tools/MapleDojoUpdater/lib/original/925033102.img.xml deleted file mode 100644 index 527cebb948..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033102.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033103.img.xml b/tools/MapleDojoUpdater/lib/original/925033103.img.xml deleted file mode 100644 index 7154b1178a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033103.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033104.img.xml b/tools/MapleDojoUpdater/lib/original/925033104.img.xml deleted file mode 100644 index 8d430f44b9..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033104.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033200.img.xml b/tools/MapleDojoUpdater/lib/original/925033200.img.xml deleted file mode 100644 index 819685f998..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033200.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033201.img.xml b/tools/MapleDojoUpdater/lib/original/925033201.img.xml deleted file mode 100644 index b3e172f928..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033201.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033202.img.xml b/tools/MapleDojoUpdater/lib/original/925033202.img.xml deleted file mode 100644 index 308c981820..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033202.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033203.img.xml b/tools/MapleDojoUpdater/lib/original/925033203.img.xml deleted file mode 100644 index c5e98b9011..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033203.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033204.img.xml b/tools/MapleDojoUpdater/lib/original/925033204.img.xml deleted file mode 100644 index 31269bbcb0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033204.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033300.img.xml b/tools/MapleDojoUpdater/lib/original/925033300.img.xml deleted file mode 100644 index c94789361f..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033300.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033301.img.xml b/tools/MapleDojoUpdater/lib/original/925033301.img.xml deleted file mode 100644 index 849294171e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033301.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033302.img.xml b/tools/MapleDojoUpdater/lib/original/925033302.img.xml deleted file mode 100644 index e7bc284984..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033302.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033303.img.xml b/tools/MapleDojoUpdater/lib/original/925033303.img.xml deleted file mode 100644 index f819fe7d11..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033303.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033304.img.xml b/tools/MapleDojoUpdater/lib/original/925033304.img.xml deleted file mode 100644 index 30f1eb4af4..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033304.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033400.img.xml b/tools/MapleDojoUpdater/lib/original/925033400.img.xml deleted file mode 100644 index b69a9dbfaa..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033400.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033401.img.xml b/tools/MapleDojoUpdater/lib/original/925033401.img.xml deleted file mode 100644 index 5da6591e6b..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033401.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033402.img.xml b/tools/MapleDojoUpdater/lib/original/925033402.img.xml deleted file mode 100644 index 1a423ec7ad..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033402.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033403.img.xml b/tools/MapleDojoUpdater/lib/original/925033403.img.xml deleted file mode 100644 index dbe14206a3..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033403.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033404.img.xml b/tools/MapleDojoUpdater/lib/original/925033404.img.xml deleted file mode 100644 index 22bfa12d07..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033404.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033500.img.xml b/tools/MapleDojoUpdater/lib/original/925033500.img.xml deleted file mode 100644 index ff3699c1f1..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033500.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033501.img.xml b/tools/MapleDojoUpdater/lib/original/925033501.img.xml deleted file mode 100644 index fbbf963e93..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033501.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033502.img.xml b/tools/MapleDojoUpdater/lib/original/925033502.img.xml deleted file mode 100644 index 5aa4b12d9e..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033502.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033503.img.xml b/tools/MapleDojoUpdater/lib/original/925033503.img.xml deleted file mode 100644 index cde6f48a54..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033503.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033504.img.xml b/tools/MapleDojoUpdater/lib/original/925033504.img.xml deleted file mode 100644 index 35e39d22df..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033504.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033600.img.xml b/tools/MapleDojoUpdater/lib/original/925033600.img.xml deleted file mode 100644 index 462050f4e0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033600.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033601.img.xml b/tools/MapleDojoUpdater/lib/original/925033601.img.xml deleted file mode 100644 index 3c64fbcf09..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033601.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033602.img.xml b/tools/MapleDojoUpdater/lib/original/925033602.img.xml deleted file mode 100644 index e550ba81c0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033602.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033603.img.xml b/tools/MapleDojoUpdater/lib/original/925033603.img.xml deleted file mode 100644 index d760e40f6a..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033603.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033604.img.xml b/tools/MapleDojoUpdater/lib/original/925033604.img.xml deleted file mode 100644 index 7b4477af30..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033604.img.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033700.img.xml b/tools/MapleDojoUpdater/lib/original/925033700.img.xml deleted file mode 100644 index 5c8f0c2271..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033700.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033701.img.xml b/tools/MapleDojoUpdater/lib/original/925033701.img.xml deleted file mode 100644 index 9a2aa8cec4..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033701.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033702.img.xml b/tools/MapleDojoUpdater/lib/original/925033702.img.xml deleted file mode 100644 index 7c8a687dd0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033702.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033703.img.xml b/tools/MapleDojoUpdater/lib/original/925033703.img.xml deleted file mode 100644 index 964bc7ec93..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033703.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033704.img.xml b/tools/MapleDojoUpdater/lib/original/925033704.img.xml deleted file mode 100644 index 83787280d0..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033704.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033800.img.xml b/tools/MapleDojoUpdater/lib/original/925033800.img.xml deleted file mode 100644 index 65ccc412e4..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033800.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033801.img.xml b/tools/MapleDojoUpdater/lib/original/925033801.img.xml deleted file mode 100644 index 2e3b4729ec..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033801.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033802.img.xml b/tools/MapleDojoUpdater/lib/original/925033802.img.xml deleted file mode 100644 index fe1eea8b02..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033802.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033803.img.xml b/tools/MapleDojoUpdater/lib/original/925033803.img.xml deleted file mode 100644 index 4e4c522783..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033803.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tools/MapleDojoUpdater/lib/original/925033804.img.xml b/tools/MapleDojoUpdater/lib/original/925033804.img.xml deleted file mode 100644 index 0165fa09f2..0000000000 --- a/tools/MapleDojoUpdater/lib/original/925033804.img.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - From 3e1b0dc4e36bd9bddc4aad5456d70098dc254fb0 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 14:05:18 +0200 Subject: [PATCH 29/36] Move MapleEquipmentOmnileveler to main module, use existing wz files --- .../mapletools/EquipmentOmniLeveller.java | 323 ++++++++---------- 1 file changed, 137 insertions(+), 186 deletions(-) rename tools/MapleEquipmentOmnileveler/src/mapleequipmentomnileveler/MapleEquipmentOmnileveler.java => src/main/java/tools/mapletools/EquipmentOmniLeveller.java (65%) diff --git a/tools/MapleEquipmentOmnileveler/src/mapleequipmentomnileveler/MapleEquipmentOmnileveler.java b/src/main/java/tools/mapletools/EquipmentOmniLeveller.java similarity index 65% rename from tools/MapleEquipmentOmnileveler/src/mapleequipmentomnileveler/MapleEquipmentOmnileveler.java rename to src/main/java/tools/mapletools/EquipmentOmniLeveller.java index 6e0731f40d..b10caeb260 100644 --- a/tools/MapleEquipmentOmnileveler/src/mapleequipmentomnileveler/MapleEquipmentOmnileveler.java +++ b/src/main/java/tools/mapletools/EquipmentOmniLeveller.java @@ -1,82 +1,51 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. +import provider.wz.WZFiles; - 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 . -*/ -package mapleequipmentomnileveler; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.sql.Connection; +import java.io.*; +import java.nio.charset.StandardCharsets; /** - * * @author RonanLana - - This application parses the Character.wz folder inputted and adds/updates the "info/level" - node on every known equipment id. This addition enables client-side view of the equipment - level attribute on every equipment in the game, given proper item visibility, be it from - own equipments or from other players. - - Estimated parse time: 7 minutes - + *

+ * This application parses the Character.wz folder inputted and adds/updates the "info/level" + * node on every known equipment id. This addition enables client-side view of the equipment + * level attribute on every equipment in the game, given proper item visibility, be it from + * own equipments or from other players. + *

+ * Estimated parse time: 7 minutes */ -public class MapleEquipmentOmnileveler { +public class EquipmentOmniLeveller { + private static final File INPUT_DIRECTORY = WZFiles.CHARACTER.getFile(); + private static final File OUTPUT_DIRECTORY = ToolConstants.getOutputFile("equips-with-levels"); + private static final int INITIAL_STRING_LENGTH = 250; + private static final int FIXED_EXP = 10000; + private static final int MAX_EQP_LEVEL = 30; + + private static PrintWriter printWriter = null; + private static InputStreamReader fileReader = null; + private static BufferedReader bufferedReader = null; + + private static int infoTagState = -1; + private static int infoTagExpState = -1; + private static boolean infoTagLevel; + private static boolean infoTagLevelExp; + private static boolean infoTagLevelInfo; + private static int parsedLevels = 0; + private static byte status; + private static boolean upgradeable; + private static boolean cash; - static String equipDirectory = "lib/original/"; - static String outputDirectory = "lib/updated/"; - - static Connection con = null; - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static int initialStringLength = 250; - - static int fixedExp = 10000; - static int maxEqpLevel = 30; - - static int infoTagState = -1, infoTagExpState = -1; - - static boolean infoTagLevel; - static boolean infoTagLevelExp; - static boolean infoTagLevelInfo; - - static int parsedLevels = 0; - - static byte status; - static boolean upgradeable; - static boolean cash; - private static String getName(String token) { int i, j; char[] dest; String d; - + i = token.lastIndexOf("name"); i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; try { token.getChars(i, j, dest, 0); } catch (StringIndexOutOfBoundsException e) { @@ -87,14 +56,15 @@ public class MapleEquipmentOmnileveler { e.printStackTrace(); try { Thread.sleep(100000000); - } catch (Exception ex) {} + } catch (Exception ex) { + } } - + d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static String getValue(String token) { int i, j; char[] dest; @@ -104,153 +74,147 @@ public class MapleEquipmentOmnileveler { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static void forwardCursor(int st) { String line = null; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { simpleToken(line); printWriter.println(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static void translateLevelCursor(int st) { String line = null; - + try { infoTagLevelInfo = false; while (status >= st && (line = bufferedReader.readLine()) != null) { translateLevelToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static void translateInfoTag(int st) { infoTagLevel = false; String line = null; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { // skipping directory & canvas definition + while (status >= st && (line = bufferedReader.readLine()) != null) { // skipping directory & canvas definition translateInfoToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } - + if (!upgradeable || cash) { throw new RuntimeException(); } } private static void simpleToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; } } - + private static void printUpdatedLevelExp() { - printWriter.println(" "); + printWriter.println(" "); } - + private static void printDefaultLevel(int level) { printWriter.println(" "); printUpdatedLevelExp(); printWriter.println(" "); } - + private static void printDefaultLevelInfoTag() { printWriter.println(" "); - for (int i = 1; i <= maxEqpLevel; i++) printDefaultLevel(i); + for (int i = 1; i <= MAX_EQP_LEVEL; i++) { + printDefaultLevel(i); + } printWriter.println(" "); } - + private static void printDefaultLevelTag() { printWriter.println(" "); printDefaultLevelInfoTag(); printWriter.println(" "); } - + private static void processLevelInfoTag(int st) { String line; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { translateLevelExpToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static void processLevelInfoSet(int st) { - parsedLevels = (1 << maxEqpLevel) - 1; - + parsedLevels = (1 << MAX_EQP_LEVEL) - 1; + String line; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { translateLevelInfoSetToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static void translateLevelToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { if (status == 3) { if (!infoTagLevelInfo) { printDefaultLevelInfoTag(); } } printWriter.println(token); - + status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { printWriter.println(token); status += 1; - + if (status == 4) { String d = getName(token); - if(d.contentEquals("info")) { + if (d.contentEquals("info")) { infoTagLevelInfo = true; processLevelInfoSet(status); } else { forwardCursor(status); } } - } - else { + } else { printWriter.println(token); } } - + private static void translateLevelInfoSetToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - + if (status == 3) { if (parsedLevels != 0) { - for (int i = 0; i < maxEqpLevel; i++) { + for (int i = 0; i < MAX_EQP_LEVEL; i++) { if ((parsedLevels >> i) % 2 != 0) { int level = i + 1; printDefaultLevel(level); @@ -258,47 +222,43 @@ public class MapleEquipmentOmnileveler { } } } - + printWriter.println(token); - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { printWriter.println(token); status += 1; - + if (status == 5) { int level = Integer.parseInt(getName(token)) - 1; parsedLevels ^= (1 << level); - + infoTagLevelExp = false; infoTagExpState = status; // status: 5 - processLevelInfoTag(status); + processLevelInfoTag(status); infoTagExpState = -1; } - } - else { + } else { printWriter.println(token); } } - + private static void translateLevelExpToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - + if (status < infoTagExpState) { if (!infoTagLevelExp) { printUpdatedLevelExp(); } } - + printWriter.println(token); - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { printWriter.println(token); status += 1; - + forwardCursor(status); - } - else { + } else { String name = getName(token); if (name.contentEquals("exp")) { infoTagLevelExp = true; @@ -308,23 +268,22 @@ public class MapleEquipmentOmnileveler { } } } - + private static void translateInfoToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - + if (status < infoTagState) { if (!infoTagLevel) { printDefaultLevelTag(); } } - + printWriter.println(token); - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; printWriter.println(token); - + String d = getName(token); if (d.contentEquals("level")) { infoTagLevel = true; @@ -332,17 +291,16 @@ public class MapleEquipmentOmnileveler { } else { forwardCursor(status); } - } - else { + } else { String name = getName(token); - - switch(name) { + + switch (name) { case "cash": if (!getValue(token).contentEquals("0")) { cash = true; } break; - + case "tuc": case "incPAD": case "incMAD": @@ -363,25 +321,24 @@ public class MapleEquipmentOmnileveler { } break; } - + printWriter.println(token); } } - + private static boolean translateToken(String token) { boolean accessInfoTag = false; - - if(token.contains("/imgdir")) { + + if (token.contains("/imgdir")) { status -= 1; printWriter.println(token); - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { printWriter.println(token); status += 1; - + if (status == 2) { String d = getName(token); - if(!d.contentEquals("info")) { + if (!d.contentEquals("info")) { forwardCursor(status); } else { accessInfoTag = true; @@ -389,22 +346,21 @@ public class MapleEquipmentOmnileveler { } else if (status > 2) { forwardCursor(status); } - } - else { + } else { printWriter.println(token); } - + return accessInfoTag; } - + private static void copyCashItemData(File file, String curPath) throws IOException { - printWriter = new PrintWriter(outputDirectory + curPath + file.getName(), "UTF-8"); - - fileReader = new InputStreamReader(new FileInputStream(file), "UTF-8"); + printWriter = new PrintWriter(new File(OUTPUT_DIRECTORY, curPath + file.getName()), StandardCharsets.UTF_8); + + fileReader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - + String line; - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { printWriter.println(line); } @@ -413,70 +369,66 @@ public class MapleEquipmentOmnileveler { printWriter.close(); } - + private static void parseEquipData(File file, String curPath) throws IOException { - printWriter = new PrintWriter(outputDirectory + curPath + file.getName(), "UTF-8"); - - fileReader = new InputStreamReader(new FileInputStream(file), "UTF-8"); + printWriter = new PrintWriter(new File(OUTPUT_DIRECTORY, curPath + file.getName()), StandardCharsets.UTF_8); + + fileReader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - + try { status = 0; upgradeable = false; cash = false; - + String line; - while((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null) { if (translateToken(line)) { infoTagState = status; // status: 2 translateInfoTag(status); infoTagState = -1; } } - + bufferedReader.close(); fileReader.close(); - + printFileFooter(); printWriter.close(); } catch (RuntimeException e) { bufferedReader.close(); fileReader.close(); - + printWriter.close(); - + copyCashItemData(file, curPath); } } - + private static void printFileFooter() { printWriter.println(""); } - + private static void parseDirectoryEquipData(String curPath) { - File folder = new File(outputDirectory + curPath); + File folder = new File(OUTPUT_DIRECTORY, curPath); if (!folder.exists()) { folder.mkdir(); } - + System.out.println("Parsing directory '" + curPath + "'"); - folder = new File(equipDirectory + curPath); + folder = new File(INPUT_DIRECTORY, curPath); for (File file : folder.listFiles()) { if (file.isFile()) { try { parseEquipData(file, curPath); - } - catch(FileNotFoundException ex) { + } catch (FileNotFoundException ex) { System.out.println("Unable to open equip file " + file.getAbsolutePath() + "."); - } - catch(IOException ex) { + } catch (IOException ex) { System.out.println("Error reading equip file " + file.getAbsolutePath() + "."); - } - - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } else { @@ -484,9 +436,8 @@ public class MapleEquipmentOmnileveler { } } } - + public static void main(String[] args) { parseDirectoryEquipData(""); } - } From 9563755f2627a31ff898beb6d0a6ec0db78e911c Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 14:17:42 +0200 Subject: [PATCH 30/36] Move MapleSkillbookChanceFetcher to main module --- .../mapletools/SkillbookChanceFetcher.java | 109 ++- .../lib/skillbook_drop_data.sql | 619 ------------------ .../src/life/Element.java | 46 -- .../src/life/ElementalEffectiveness.java | 41 -- .../src/life/MapleLifeFactory.java | 240 ------- .../src/life/MapleMonsterStats.java | 330 ---------- .../src/provider/MapleCanvas.java | 30 - .../src/provider/MapleData.java | 34 - .../src/provider/MapleDataDirectoryEntry.java | 34 - .../src/provider/MapleDataEntity.java | 31 - .../src/provider/MapleDataEntry.java | 33 - .../src/provider/MapleDataFileEntry.java | 30 - .../src/provider/MapleDataProvider.java | 27 - .../provider/MapleDataProviderFactory.java | 55 -- .../src/provider/MapleDataTool.java | 145 ---- .../provider/wz/FileStoredPngMapleCanvas.java | 70 -- .../src/provider/wz/ImgMapleSound.java | 39 -- .../src/provider/wz/ListWZFile.java | 86 --- .../src/provider/wz/MapleDataType.java | 26 - .../src/provider/wz/PNGMapleCanvas.java | 151 ----- .../src/provider/wz/WZDirectoryEntry.java | 68 -- .../src/provider/wz/WZEntry.java | 61 -- .../src/provider/wz/WZFile.java | 154 ----- .../src/provider/wz/WZFileEntry.java | 42 -- .../src/provider/wz/WZIMGEntry.java | 118 ---- .../src/provider/wz/WZIMGFile.java | 227 ------- .../src/provider/wz/WZTool.java | 188 ------ .../src/provider/wz/XMLDomMapleData.java | 219 ------- .../src/provider/wz/XMLWZFile.java | 85 --- .../src/tools/DatabaseConnection.java | 51 -- .../src/tools/HexTool.java | 79 --- .../src/tools/Pair.java | 121 ---- .../tools/data/input/ByteArrayByteStream.java | 72 -- .../src/tools/data/input/ByteInputStream.java | 35 - .../input/GenericLittleEndianAccessor.java | 239 ------- .../GenericSeekableLittleEndianAccessor.java | 91 --- .../data/input/InputStreamByteStream.java | 93 --- .../data/input/LittleEndianAccessor.java | 45 -- .../data/input/RandomAccessByteStream.java | 84 --- .../input/SeekableInputStreamBytestream.java | 51 -- .../input/SeekableLittleEndianAccessor.java | 27 - .../data/output/BAOSByteOutputStream.java | 56 -- .../tools/data/output/ByteOutputStream.java | 38 -- .../output/GenericLittleEndianWriter.java | 183 ------ .../tools/data/output/LittleEndianWriter.java | 114 ---- .../output/MaplePacketLittleEndianWriter.java | 73 --- 46 files changed, 44 insertions(+), 4746 deletions(-) rename tools/MapleSkillbookChanceFetcher/src/mapleskillbookchancefetcher/MapleSkillbookChanceFetcher.java => src/main/java/tools/mapletools/SkillbookChanceFetcher.java (62%) delete mode 100644 tools/MapleSkillbookChanceFetcher/lib/skillbook_drop_data.sql delete mode 100644 tools/MapleSkillbookChanceFetcher/src/life/Element.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/life/ElementalEffectiveness.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/life/MapleLifeFactory.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/life/MapleMonsterStats.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/MapleCanvas.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/MapleData.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/MapleDataDirectoryEntry.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/MapleDataEntity.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/MapleDataEntry.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/MapleDataFileEntry.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/MapleDataProvider.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/MapleDataProviderFactory.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/MapleDataTool.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/wz/FileStoredPngMapleCanvas.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/wz/ImgMapleSound.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/wz/ListWZFile.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/wz/MapleDataType.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/wz/PNGMapleCanvas.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/wz/WZDirectoryEntry.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/wz/WZEntry.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/wz/WZFile.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/wz/WZFileEntry.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/wz/WZIMGEntry.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/wz/WZIMGFile.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/wz/WZTool.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/wz/XMLDomMapleData.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/provider/wz/XMLWZFile.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/tools/DatabaseConnection.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/tools/HexTool.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/tools/Pair.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/tools/data/input/ByteArrayByteStream.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/tools/data/input/ByteInputStream.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/tools/data/input/GenericLittleEndianAccessor.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/tools/data/input/InputStreamByteStream.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/tools/data/input/LittleEndianAccessor.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/tools/data/input/RandomAccessByteStream.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/tools/data/input/SeekableInputStreamBytestream.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/tools/data/output/BAOSByteOutputStream.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/tools/data/output/ByteOutputStream.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/tools/data/output/GenericLittleEndianWriter.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/tools/data/output/LittleEndianWriter.java delete mode 100644 tools/MapleSkillbookChanceFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java diff --git a/tools/MapleSkillbookChanceFetcher/src/mapleskillbookchancefetcher/MapleSkillbookChanceFetcher.java b/src/main/java/tools/mapletools/SkillbookChanceFetcher.java similarity index 62% rename from tools/MapleSkillbookChanceFetcher/src/mapleskillbookchancefetcher/MapleSkillbookChanceFetcher.java rename to src/main/java/tools/mapletools/SkillbookChanceFetcher.java index d8e6edfdc5..5d03f0aa84 100644 --- a/tools/MapleSkillbookChanceFetcher/src/mapleskillbookchancefetcher/MapleSkillbookChanceFetcher.java +++ b/src/main/java/tools/mapletools/SkillbookChanceFetcher.java @@ -1,94 +1,74 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package mapleskillbookchancefetcher; - -import life.MapleLifeFactory; -import life.MapleMonsterStats; -import tools.DatabaseConnection; +import server.life.MapleMonsterStats; import tools.Pair; +import java.io.File; import java.io.IOException; import java.io.PrintWriter; +import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; -import java.util.*; -import java.util.Map.Entry; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** - * * @author RonanLana - * + *

* This application traces missing meso drop data on the underlying DB (that must be * defined on the DatabaseConnection file of this project) and generates a * SQL file that proposes missing drop entries for the drop_data table. - * + *

* The meso range is calculated accordingly with the target mob stats, such as level * and if it's a boss or not, similarly as how it has been done for the actual meso * drops. - * */ -public class MapleSkillbookChanceFetcher { +public class SkillbookChanceFetcher { + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("skillbook_drop_data.sql"); + private static final Map, Integer> skillbookChances = new HashMap<>(); private static PrintWriter printWriter; - private static String newFile = "lib/skillbook_drop_data.sql"; - private static Map mobStats; - private static Map, Integer> skillbookChances = new HashMap<>(); - - private static List, Integer>> sortedSkillbookChances() { - List, Integer>> skillbookChancesList = new ArrayList<>(skillbookChances.entrySet()); - - Collections.sort(skillbookChancesList, (o1, o2) -> { + + private static List, Integer>> sortedSkillbookChances() { + List, Integer>> skillbookChancesList = new ArrayList<>(skillbookChances.entrySet()); + + skillbookChancesList.sort((o1, o2) -> { if (o1.getKey().getLeft().equals(o2.getKey().getLeft())) { return o1.getKey().getRight() < o2.getKey().getRight() ? -1 : (o1.getKey().getRight().equals(o2.getKey().getRight()) ? 0 : 1); } return (o1.getKey().getLeft() < o2.getKey().getLeft()) ? -1 : 1; }); - + return skillbookChancesList; } - + private static boolean isLegendSkillUpgradeBook(int itemid) { int itemidBranch = itemid / 10000; return (itemidBranch == 228 && itemid >= 2280013 || itemidBranch == 229 && itemid >= 2290126); // drop rate of Legends are higher } - + private static void fetchSkillbookDropChances() { - Connection con = DatabaseConnection.getConnection(); - + Connection con = SimpleDatabaseConnection.getConnection(); + try { PreparedStatement ps = con.prepareStatement("SELECT dropperid, itemid FROM drop_data WHERE itemid >= 2280000 AND itemid < 2300000"); ResultSet rs = ps.executeQuery(); - - while(rs.next()) { + + while (rs.next()) { int mobid = rs.getInt("dropperid"); int itemid = rs.getInt("itemid"); - + int expectedChance = 250; - + if (mobStats.get(mobid) != null) { int level = mobStats.get(mobid).getLevel(); expectedChance *= Math.max(2, (level - 80) / 15); - + if (mobStats.get(mobid).isBoss()) { expectedChance *= 20; } else { @@ -97,53 +77,52 @@ public class MapleSkillbookChanceFetcher { } else { expectedChance = 1287; } - + if (isLegendSkillUpgradeBook(itemid)) { // drop rate of Legends seems to be higher than explorers, in retrospect from values in DB expectedChance *= 3; } - + skillbookChances.put(new Pair<>(mobid, itemid), expectedChance); } - + rs.close(); ps.close(); con.close(); - } catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static void printSkillbookChanceUpdateSqlHeader() { printWriter.println(" # SQL File autogenerated from the MapleSkillbookChanceFetcher feature by Ronan Lana."); printWriter.println(" # Generated data takes into account mob stats such as level and boss for the chance rates."); printWriter.println(); - + printWriter.println(" REPLACE INTO drop_data (`dropperid`, `itemid`, `minimum_quantity`, `maximum_quantity`, `questid`, `chance`) VALUES"); } - + private static void generateSkillbookChanceUpdateFile() { try { - printWriter = new PrintWriter(newFile, "UTF-8"); - + printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); + printSkillbookChanceUpdateSqlHeader(); - - List, Integer>> skillbookChancesList = sortedSkillbookChances(); - for (Entry, Integer> e : skillbookChancesList) { + + List, Integer>> skillbookChancesList = sortedSkillbookChances(); + for (Map.Entry, Integer> e : skillbookChancesList) { printWriter.println("(" + e.getKey().getLeft() + ", " + e.getKey().getRight() + ", 1, 1, 0, " + e.getValue() + "),"); } - + printWriter.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } - + public static void main(String[] args) { // load mob stats from WZ - mobStats = MapleLifeFactory.getAllMonsterStats(); - + mobStats = MonsterStatFetcher.getAllMonsterStats(); + fetchSkillbookDropChances(); generateSkillbookChanceUpdateFile(); } - } diff --git a/tools/MapleSkillbookChanceFetcher/lib/skillbook_drop_data.sql b/tools/MapleSkillbookChanceFetcher/lib/skillbook_drop_data.sql deleted file mode 100644 index 01a6890faf..0000000000 --- a/tools/MapleSkillbookChanceFetcher/lib/skillbook_drop_data.sql +++ /dev/null @@ -1,619 +0,0 @@ - # SQL File autogenerated from the MapleSkillbookChanceFetcher feature by Ronan Lana. - # Generated data takes into account mob stats such as level and boss for the chance rates. - - REPLACE INTO drop_data (`dropperid`, `itemid`, `minimum_quantity`, `maximum_quantity`, `questid`, `chance`) VALUES -(851000, 2290132, 1, 1, 0, 3861), -(7090000, 2290087, 1, 1, 0, 10000), -(8090000, 2290045, 1, 1, 0, 10000), -(8140103, 2290044, 1, 1, 0, 500), -(8140511, 2290009, 1, 1, 0, 500), -(8140511, 2290050, 1, 1, 0, 500), -(8140511, 2290083, 1, 1, 0, 500), -(8140511, 2290134, 1, 1, 0, 1500), -(8140512, 2290013, 1, 1, 0, 500), -(8140512, 2290067, 1, 1, 0, 500), -(8140512, 2290082, 1, 1, 0, 500), -(8140512, 2290097, 1, 1, 0, 500), -(8140512, 2290116, 1, 1, 0, 500), -(8140512, 2290131, 1, 1, 0, 1500), -(8140600, 2290132, 1, 1, 0, 1500), -(8140700, 2290106, 1, 1, 0, 500), -(8140700, 2290126, 1, 1, 0, 1500), -(8140701, 2290122, 1, 1, 0, 500), -(8140702, 2290112, 1, 1, 0, 500), -(8140703, 2290088, 1, 1, 0, 500), -(8140703, 2290099, 1, 1, 0, 500), -(8141000, 2290082, 1, 1, 0, 500), -(8141000, 2290097, 1, 1, 0, 500), -(8141100, 2280005, 1, 1, 0, 500), -(8141300, 2290098, 1, 1, 0, 500), -(8142100, 2290032, 1, 1, 0, 500), -(8142100, 2290082, 1, 1, 0, 500), -(8142100, 2290114, 1, 1, 0, 500), -(8143000, 2280004, 1, 1, 0, 500), -(8150000, 2280013, 1, 1, 0, 30000), -(8150000, 2290070, 1, 1, 0, 10000), -(8150000, 2290091, 1, 1, 0, 10000), -(8150100, 2290042, 1, 1, 0, 500), -(8150100, 2290053, 1, 1, 0, 500), -(8150100, 2290073, 1, 1, 0, 500), -(8150100, 2290102, 1, 1, 0, 500), -(8150100, 2290118, 1, 1, 0, 500), -(8150101, 2290017, 1, 1, 0, 500), -(8150101, 2290021, 1, 1, 0, 500), -(8150101, 2290035, 1, 1, 0, 500), -(8150101, 2290042, 1, 1, 0, 500), -(8150101, 2290052, 1, 1, 0, 500), -(8150101, 2290102, 1, 1, 0, 500), -(8150200, 2290024, 1, 1, 0, 500), -(8150200, 2290100, 1, 1, 0, 500), -(8150200, 2290135, 1, 1, 0, 1500), -(8150201, 2290004, 1, 1, 0, 500), -(8150201, 2290006, 1, 1, 0, 500), -(8150201, 2290024, 1, 1, 0, 500), -(8150201, 2290036, 1, 1, 0, 500), -(8150201, 2290056, 1, 1, 0, 500), -(8150201, 2290072, 1, 1, 0, 500), -(8150201, 2290078, 1, 1, 0, 500), -(8150201, 2290117, 1, 1, 0, 500), -(8150300, 2290003, 1, 1, 0, 500), -(8150300, 2290033, 1, 1, 0, 500), -(8150300, 2290111, 1, 1, 0, 500), -(8150300, 2290120, 1, 1, 0, 500), -(8150300, 2290127, 1, 1, 0, 1500), -(8150301, 2290023, 1, 1, 0, 500), -(8150301, 2290029, 1, 1, 0, 500), -(8150301, 2290101, 1, 1, 0, 500), -(8150301, 2290107, 1, 1, 0, 500), -(8150302, 2290010, 1, 1, 0, 500), -(8150302, 2290019, 1, 1, 0, 500), -(8150302, 2290026, 1, 1, 0, 500), -(8150302, 2290076, 1, 1, 0, 500), -(8150302, 2290085, 1, 1, 0, 500), -(8150302, 2290096, 1, 1, 0, 500), -(8150302, 2290113, 1, 1, 0, 500), -(8150302, 2290119, 1, 1, 0, 500), -(8150302, 2290128, 1, 1, 0, 1500), -(8160000, 2290017, 1, 1, 0, 500), -(8160000, 2290045, 1, 1, 0, 500), -(8160000, 2290065, 1, 1, 0, 500), -(8160000, 2290067, 1, 1, 0, 500), -(8160000, 2290081, 1, 1, 0, 500), -(8170000, 2290012, 1, 1, 0, 500), -(8170000, 2290086, 1, 1, 0, 500), -(8170000, 2290087, 1, 1, 0, 500), -(8170000, 2290134, 1, 1, 0, 1500), -(8180000, 2290002, 1, 1, 0, 10000), -(8180000, 2290003, 1, 1, 0, 10000), -(8180000, 2290014, 1, 1, 0, 10000), -(8180000, 2290015, 1, 1, 0, 10000), -(8180000, 2290030, 1, 1, 0, 10000), -(8180000, 2290035, 1, 1, 0, 10000), -(8180000, 2290036, 1, 1, 0, 10000), -(8180000, 2290063, 1, 1, 0, 10000), -(8180000, 2290080, 1, 1, 0, 10000), -(8180000, 2290098, 1, 1, 0, 10000), -(8180000, 2290101, 1, 1, 0, 10000), -(8180000, 2290117, 1, 1, 0, 10000), -(8180000, 2290130, 1, 1, 0, 30000), -(8180001, 2290018, 1, 1, 0, 10000), -(8180001, 2290019, 1, 1, 0, 10000), -(8180001, 2290032, 1, 1, 0, 10000), -(8180001, 2290042, 1, 1, 0, 10000), -(8180001, 2290058, 1, 1, 0, 10000), -(8180001, 2290059, 1, 1, 0, 10000), -(8180001, 2290068, 1, 1, 0, 10000), -(8180001, 2290069, 1, 1, 0, 10000), -(8180001, 2290072, 1, 1, 0, 10000), -(8180001, 2290092, 1, 1, 0, 10000), -(8180001, 2290099, 1, 1, 0, 10000), -(8180001, 2290100, 1, 1, 0, 10000), -(8180001, 2290102, 1, 1, 0, 10000), -(8180001, 2290119, 1, 1, 0, 10000), -(8180001, 2290128, 1, 1, 0, 30000), -(8190000, 2280016, 1, 1, 0, 1500), -(8190000, 2290030, 1, 1, 0, 500), -(8190000, 2290044, 1, 1, 0, 500), -(8190000, 2290054, 1, 1, 0, 500), -(8190000, 2290066, 1, 1, 0, 500), -(8190000, 2290075, 1, 1, 0, 500), -(8190000, 2290092, 1, 1, 0, 500), -(8190000, 2290103, 1, 1, 0, 500), -(8190002, 2290000, 1, 1, 0, 500), -(8190002, 2290008, 1, 1, 0, 500), -(8190002, 2290018, 1, 1, 0, 500), -(8190002, 2290038, 1, 1, 0, 500), -(8190002, 2290060, 1, 1, 0, 500), -(8190002, 2290080, 1, 1, 0, 500), -(8190002, 2290124, 1, 1, 0, 500), -(8190003, 2280013, 1, 1, 0, 1500), -(8190003, 2290007, 1, 1, 0, 500), -(8190003, 2290012, 1, 1, 0, 500), -(8190003, 2290014, 1, 1, 0, 500), -(8190003, 2290033, 1, 1, 0, 500), -(8190003, 2290045, 1, 1, 0, 500), -(8190003, 2290050, 1, 1, 0, 500), -(8190003, 2290055, 1, 1, 0, 500), -(8190003, 2290062, 1, 1, 0, 500), -(8190003, 2290063, 1, 1, 0, 500), -(8190003, 2290070, 1, 1, 0, 500), -(8190003, 2290086, 1, 1, 0, 500), -(8190003, 2290108, 1, 1, 0, 500), -(8190003, 2290133, 1, 1, 0, 1500), -(8190004, 2290002, 1, 1, 0, 500), -(8190004, 2290009, 1, 1, 0, 500), -(8190004, 2290021, 1, 1, 0, 500), -(8190004, 2290034, 1, 1, 0, 500), -(8190004, 2290041, 1, 1, 0, 500), -(8190004, 2290052, 1, 1, 0, 500), -(8190004, 2290053, 1, 1, 0, 500), -(8190004, 2290058, 1, 1, 0, 500), -(8190004, 2290068, 1, 1, 0, 500), -(8190004, 2290071, 1, 1, 0, 500), -(8190004, 2290073, 1, 1, 0, 500), -(8190004, 2290090, 1, 1, 0, 500), -(8190004, 2290112, 1, 1, 0, 500), -(8190004, 2290121, 1, 1, 0, 500), -(8190004, 2290130, 1, 1, 0, 1500), -(8190005, 2290000, 1, 1, 0, 500), -(8190005, 2290008, 1, 1, 0, 500), -(8190005, 2290018, 1, 1, 0, 500), -(8190005, 2290038, 1, 1, 0, 500), -(8190005, 2290060, 1, 1, 0, 500), -(8190005, 2290080, 1, 1, 0, 500), -(8190005, 2290124, 1, 1, 0, 500), -(8200000, 2290005, 1, 1, 0, 500), -(8200000, 2290011, 1, 1, 0, 500), -(8200000, 2290114, 1, 1, 0, 500), -(8200001, 2280015, 1, 1, 0, 1500), -(8200001, 2290050, 1, 1, 0, 500), -(8200001, 2290059, 1, 1, 0, 500), -(8200001, 2290065, 1, 1, 0, 500), -(8200001, 2290129, 1, 1, 0, 1500), -(8200002, 2290062, 1, 1, 0, 500), -(8200002, 2290066, 1, 1, 0, 500), -(8200002, 2290070, 1, 1, 0, 500), -(8200002, 2290131, 1, 1, 0, 1500), -(8200002, 2290139, 1, 1, 0, 1500), -(8200003, 2290012, 1, 1, 0, 500), -(8200003, 2290056, 1, 1, 0, 500), -(8200003, 2290071, 1, 1, 0, 500), -(8200003, 2290101, 1, 1, 0, 500), -(8200003, 2290136, 1, 1, 0, 1500), -(8200004, 2280016, 1, 1, 0, 1500), -(8200004, 2290069, 1, 1, 0, 500), -(8200004, 2290072, 1, 1, 0, 500), -(8200004, 2290073, 1, 1, 0, 500), -(8200004, 2290127, 1, 1, 0, 1500), -(8200004, 2290134, 1, 1, 0, 1500), -(8200005, 2280014, 1, 1, 0, 1500), -(8200005, 2290078, 1, 1, 0, 500), -(8200005, 2290079, 1, 1, 0, 500), -(8200005, 2290095, 1, 1, 0, 500), -(8200006, 2290003, 1, 1, 0, 500), -(8200006, 2290064, 1, 1, 0, 500), -(8200006, 2290076, 1, 1, 0, 500), -(8200006, 2290077, 1, 1, 0, 500), -(8200006, 2290129, 1, 1, 0, 1500), -(8200006, 2290138, 1, 1, 0, 1500), -(8200007, 2290006, 1, 1, 0, 500), -(8200007, 2290007, 1, 1, 0, 500), -(8200007, 2290011, 1, 1, 0, 500), -(8200007, 2290016, 1, 1, 0, 500), -(8200007, 2290125, 1, 1, 0, 500), -(8200007, 2290136, 1, 1, 0, 1500), -(8200008, 2290006, 1, 1, 0, 500), -(8200008, 2290051, 1, 1, 0, 500), -(8200008, 2290121, 1, 1, 0, 500), -(8200008, 2290122, 1, 1, 0, 500), -(8200008, 2290133, 1, 1, 0, 1500), -(8200009, 2290013, 1, 1, 0, 500), -(8200009, 2290016, 1, 1, 0, 500), -(8200009, 2290031, 1, 1, 0, 500), -(8200009, 2290039, 1, 1, 0, 500), -(8200010, 2290026, 1, 1, 0, 500), -(8200010, 2290059, 1, 1, 0, 500), -(8200010, 2290088, 1, 1, 0, 500), -(8200010, 2290089, 1, 1, 0, 500), -(8200010, 2290127, 1, 1, 0, 1500), -(8200011, 2290001, 1, 1, 0, 750), -(8200011, 2290040, 1, 1, 0, 750), -(8200011, 2290046, 1, 1, 0, 750), -(8200011, 2290048, 1, 1, 0, 750), -(8200011, 2290049, 1, 1, 0, 750), -(8200011, 2290114, 1, 1, 0, 750), -(8200011, 2290137, 1, 1, 0, 2250), -(8200012, 2290041, 1, 1, 0, 750), -(8200012, 2290092, 1, 1, 0, 750), -(8200012, 2290093, 1, 1, 0, 750), -(8200012, 2290115, 1, 1, 0, 750), -(8200012, 2290137, 1, 1, 0, 2250), -(8200012, 2290139, 1, 1, 0, 2250), -(8220002, 2290020, 1, 1, 0, 10000), -(8220002, 2290081, 1, 1, 0, 10000), -(8220002, 2290085, 1, 1, 0, 10000), -(8220002, 2290133, 1, 1, 0, 30000), -(8220003, 2290006, 1, 1, 0, 10000), -(8220003, 2290030, 1, 1, 0, 10000), -(8220003, 2290031, 1, 1, 0, 10000), -(8220003, 2290032, 1, 1, 0, 10000), -(8220003, 2290033, 1, 1, 0, 10000), -(8220003, 2290060, 1, 1, 0, 10000), -(8220003, 2290061, 1, 1, 0, 10000), -(8220003, 2290076, 1, 1, 0, 10000), -(8220003, 2290077, 1, 1, 0, 10000), -(8220003, 2290104, 1, 1, 0, 10000), -(8220003, 2290105, 1, 1, 0, 10000), -(8220003, 2290117, 1, 1, 0, 10000), -(8220003, 2290118, 1, 1, 0, 10000), -(8220004, 2290018, 1, 1, 0, 10000), -(8220004, 2290019, 1, 1, 0, 10000), -(8220004, 2290024, 1, 1, 0, 10000), -(8220004, 2290025, 1, 1, 0, 10000), -(8220004, 2290058, 1, 1, 0, 10000), -(8220004, 2290059, 1, 1, 0, 10000), -(8220004, 2290076, 1, 1, 0, 10000), -(8220004, 2290077, 1, 1, 0, 10000), -(8220004, 2290106, 1, 1, 0, 10000), -(8220004, 2290127, 1, 1, 0, 30000), -(8220004, 2290134, 1, 1, 0, 30000), -(8220005, 2290002, 1, 1, 0, 15000), -(8220005, 2290003, 1, 1, 0, 15000), -(8220005, 2290036, 1, 1, 0, 15000), -(8220005, 2290037, 1, 1, 0, 15000), -(8220005, 2290055, 1, 1, 0, 15000), -(8220005, 2290080, 1, 1, 0, 15000), -(8220005, 2290099, 1, 1, 0, 15000), -(8220005, 2290131, 1, 1, 0, 45000), -(8220005, 2290136, 1, 1, 0, 45000), -(8220006, 2290012, 1, 1, 0, 20000), -(8220006, 2290013, 1, 1, 0, 20000), -(8220006, 2290042, 1, 1, 0, 20000), -(8220006, 2290043, 1, 1, 0, 20000), -(8220006, 2290060, 1, 1, 0, 20000), -(8220006, 2290061, 1, 1, 0, 20000), -(8220006, 2290090, 1, 1, 0, 20000), -(8220006, 2290119, 1, 1, 0, 20000), -(8220006, 2290120, 1, 1, 0, 20000), -(8220006, 2290135, 1, 1, 0, 60000), -(8220006, 2290138, 1, 1, 0, 60000), -(8220007, 2290035, 1, 1, 0, 10000), -(8220007, 2290091, 1, 1, 0, 10000), -(8220007, 2290108, 1, 1, 0, 10000), -(8220009, 2290031, 1, 1, 0, 10000), -(8220009, 2290129, 1, 1, 0, 30000), -(8220015, 2280004, 1, 1, 0, 10000), -(8220015, 2280005, 1, 1, 0, 10000), -(8220015, 2280006, 1, 1, 0, 10000), -(8500002, 2280007, 1, 1, 0, 15000), -(8500002, 2280008, 1, 1, 0, 15000), -(8500002, 2280009, 1, 1, 0, 15000), -(8500002, 2280010, 1, 1, 0, 15000), -(8500002, 2290006, 1, 1, 0, 15000), -(8500002, 2290010, 1, 1, 0, 15000), -(8500002, 2290011, 1, 1, 0, 15000), -(8500002, 2290013, 1, 1, 0, 15000), -(8500002, 2290028, 1, 1, 0, 15000), -(8500002, 2290037, 1, 1, 0, 15000), -(8500002, 2290043, 1, 1, 0, 15000), -(8500002, 2290051, 1, 1, 0, 15000), -(8500002, 2290056, 1, 1, 0, 15000), -(8500002, 2290061, 1, 1, 0, 15000), -(8500002, 2290066, 1, 1, 0, 15000), -(8500002, 2290071, 1, 1, 0, 15000), -(8500002, 2290078, 1, 1, 0, 15000), -(8500002, 2290089, 1, 1, 0, 15000), -(8500002, 2290091, 1, 1, 0, 15000), -(8500002, 2290104, 1, 1, 0, 15000), -(8500002, 2290107, 1, 1, 0, 15000), -(8500002, 2290121, 1, 1, 0, 15000), -(8500002, 2290123, 1, 1, 0, 15000), -(8500002, 2290126, 1, 1, 0, 45000), -(8500002, 2290129, 1, 1, 0, 45000), -(8510000, 2280007, 1, 1, 0, 10000), -(8510000, 2280008, 1, 1, 0, 10000), -(8510000, 2280009, 1, 1, 0, 10000), -(8510000, 2280010, 1, 1, 0, 10000), -(8510000, 2290000, 1, 1, 0, 10000), -(8510000, 2290001, 1, 1, 0, 10000), -(8510000, 2290004, 1, 1, 0, 10000), -(8510000, 2290005, 1, 1, 0, 10000), -(8510000, 2290024, 1, 1, 0, 10000), -(8510000, 2290025, 1, 1, 0, 10000), -(8510000, 2290026, 1, 1, 0, 10000), -(8510000, 2290027, 1, 1, 0, 10000), -(8510000, 2290052, 1, 1, 0, 10000), -(8510000, 2290053, 1, 1, 0, 10000), -(8510000, 2290054, 1, 1, 0, 10000), -(8510000, 2290055, 1, 1, 0, 10000), -(8510000, 2290076, 1, 1, 0, 10000), -(8510000, 2290077, 1, 1, 0, 10000), -(8510000, 2290082, 1, 1, 0, 10000), -(8510000, 2290083, 1, 1, 0, 10000), -(8510000, 2290097, 1, 1, 0, 10000), -(8510000, 2290099, 1, 1, 0, 10000), -(8510000, 2290106, 1, 1, 0, 10000), -(8510000, 2290108, 1, 1, 0, 10000), -(8510000, 2290112, 1, 1, 0, 10000), -(8510000, 2290114, 1, 1, 0, 10000), -(8510000, 2290122, 1, 1, 0, 10000), -(8510000, 2290124, 1, 1, 0, 10000), -(8510000, 2290132, 1, 1, 0, 30000), -(8520000, 2280007, 1, 1, 0, 10000), -(8520000, 2280008, 1, 1, 0, 10000), -(8520000, 2280009, 1, 1, 0, 10000), -(8520000, 2280010, 1, 1, 0, 10000), -(8520000, 2290000, 1, 1, 0, 10000), -(8520000, 2290001, 1, 1, 0, 10000), -(8520000, 2290004, 1, 1, 0, 10000), -(8520000, 2290005, 1, 1, 0, 10000), -(8520000, 2290024, 1, 1, 0, 10000), -(8520000, 2290025, 1, 1, 0, 10000), -(8520000, 2290026, 1, 1, 0, 10000), -(8520000, 2290027, 1, 1, 0, 10000), -(8520000, 2290052, 1, 1, 0, 10000), -(8520000, 2290053, 1, 1, 0, 10000), -(8520000, 2290054, 1, 1, 0, 10000), -(8520000, 2290055, 1, 1, 0, 10000), -(8520000, 2290076, 1, 1, 0, 10000), -(8520000, 2290077, 1, 1, 0, 10000), -(8520000, 2290082, 1, 1, 0, 10000), -(8520000, 2290083, 1, 1, 0, 10000), -(8520000, 2290097, 1, 1, 0, 10000), -(8520000, 2290099, 1, 1, 0, 10000), -(8520000, 2290106, 1, 1, 0, 10000), -(8520000, 2290108, 1, 1, 0, 10000), -(8520000, 2290112, 1, 1, 0, 10000), -(8520000, 2290114, 1, 1, 0, 10000), -(8520000, 2290122, 1, 1, 0, 10000), -(8520000, 2290124, 1, 1, 0, 10000), -(8520000, 2290132, 1, 1, 0, 30000), -(8800002, 2280007, 1, 1, 0, 20000), -(8800002, 2280008, 1, 1, 0, 20000), -(8800002, 2280009, 1, 1, 0, 20000), -(8800002, 2280010, 1, 1, 0, 20000), -(8800002, 2280013, 1, 1, 0, 60000), -(8800002, 2280014, 1, 1, 0, 60000), -(8800002, 2280015, 1, 1, 0, 60000), -(8800002, 2280016, 1, 1, 0, 60000), -(8800002, 2290006, 1, 1, 0, 20000), -(8800002, 2290007, 1, 1, 0, 20000), -(8800002, 2290016, 1, 1, 0, 20000), -(8800002, 2290020, 1, 1, 0, 20000), -(8800002, 2290022, 1, 1, 0, 20000), -(8800002, 2290024, 1, 1, 0, 20000), -(8800002, 2290028, 1, 1, 0, 20000), -(8800002, 2290029, 1, 1, 0, 20000), -(8800002, 2290040, 1, 1, 0, 20000), -(8800002, 2290046, 1, 1, 0, 20000), -(8800002, 2290048, 1, 1, 0, 20000), -(8800002, 2290056, 1, 1, 0, 20000), -(8800002, 2290057, 1, 1, 0, 20000), -(8800002, 2290058, 1, 1, 0, 20000), -(8800002, 2290064, 1, 1, 0, 20000), -(8800002, 2290067, 1, 1, 0, 20000), -(8800002, 2290074, 1, 1, 0, 20000), -(8800002, 2290079, 1, 1, 0, 20000), -(8800002, 2290084, 1, 1, 0, 20000), -(8800002, 2290094, 1, 1, 0, 20000), -(8800002, 2290110, 1, 1, 0, 20000), -(8800002, 2290115, 1, 1, 0, 20000), -(8810018, 2290017, 1, 1, 0, 25000), -(8810018, 2290021, 1, 1, 0, 25000), -(8810018, 2290023, 1, 1, 0, 25000), -(8810018, 2290041, 1, 1, 0, 25000), -(8810018, 2290047, 1, 1, 0, 25000), -(8810018, 2290049, 1, 1, 0, 25000), -(8810018, 2290065, 1, 1, 0, 25000), -(8810018, 2290075, 1, 1, 0, 25000), -(8810018, 2290085, 1, 1, 0, 25000), -(8810018, 2290095, 1, 1, 0, 25000), -(8810018, 2290096, 1, 1, 0, 25000), -(8810018, 2290111, 1, 1, 0, 25000), -(8810018, 2290116, 1, 1, 0, 25000), -(8810018, 2290125, 1, 1, 0, 25000), -(8810018, 2290133, 1, 1, 0, 75000), -(8810018, 2290137, 1, 1, 0, 75000), -(8810018, 2290139, 1, 1, 0, 75000), -(8820000, 2290010, 1, 1, 0, 30000), -(8820000, 2290022, 1, 1, 0, 30000), -(8820000, 2290040, 1, 1, 0, 30000), -(8820000, 2290046, 1, 1, 0, 30000), -(8820000, 2290048, 1, 1, 0, 30000), -(8820000, 2290052, 1, 1, 0, 30000), -(8820000, 2290084, 1, 1, 0, 30000), -(8820000, 2290090, 1, 1, 0, 30000), -(8820000, 2290106, 1, 1, 0, 30000), -(8820000, 2290119, 1, 1, 0, 30000), -(8820001, 2290010, 1, 1, 0, 30000), -(8820001, 2290022, 1, 1, 0, 30000), -(8820001, 2290040, 1, 1, 0, 30000), -(8820001, 2290046, 1, 1, 0, 30000), -(8820001, 2290048, 1, 1, 0, 30000), -(8820001, 2290052, 1, 1, 0, 30000), -(8820001, 2290084, 1, 1, 0, 30000), -(8820001, 2290090, 1, 1, 0, 30000), -(8820001, 2290106, 1, 1, 0, 30000), -(8820001, 2290119, 1, 1, 0, 30000), -(9300028, 2280015, 1, 1, 0, 30000), -(9300028, 2290026, 1, 1, 0, 10000), -(9300028, 2290064, 1, 1, 0, 10000), -(9300028, 2290075, 1, 1, 0, 10000), -(9300028, 2290093, 1, 1, 0, 10000), -(9300028, 2290111, 1, 1, 0, 10000), -(9300094, 2280004, 1, 1, 0, 10000), -(9300094, 2280005, 1, 1, 0, 10000), -(9300094, 2280006, 1, 1, 0, 10000), -(9300095, 2280004, 1, 1, 0, 500), -(9300095, 2280005, 1, 1, 0, 500), -(9300095, 2280006, 1, 1, 0, 500), -(9303016, 2290006, 1, 1, 0, 500), -(9303016, 2290030, 1, 1, 0, 500), -(9303016, 2290032, 1, 1, 0, 500), -(9303016, 2290060, 1, 1, 0, 500), -(9303016, 2290076, 1, 1, 0, 500), -(9303016, 2290104, 1, 1, 0, 500), -(9303016, 2290117, 1, 1, 0, 500), -(9400014, 2290053, 1, 1, 0, 10000), -(9400014, 2290087, 1, 1, 0, 10000), -(9400014, 2290112, 1, 1, 0, 10000), -(9400014, 2290122, 1, 1, 0, 10000), -(9400120, 2290045, 1, 1, 0, 10000), -(9400121, 2280014, 1, 1, 0, 45000), -(9400121, 2290081, 1, 1, 0, 15000), -(9400121, 2290087, 1, 1, 0, 15000), -(9400121, 2290101, 1, 1, 0, 15000), -(9400121, 2290103, 1, 1, 0, 15000), -(9400122, 2290007, 1, 1, 0, 10000), -(9400122, 2290062, 1, 1, 0, 10000), -(9400122, 2290116, 1, 1, 0, 10000), -(9400300, 2290045, 1, 1, 0, 30000), -(9400300, 2290055, 1, 1, 0, 30000), -(9400300, 2290063, 1, 1, 0, 30000), -(9400300, 2290079, 1, 1, 0, 30000), -(9400300, 2290081, 1, 1, 0, 30000), -(9400300, 2290096, 1, 1, 0, 30000), -(9400514, 2290023, 1, 1, 0, 10000), -(9400514, 2290057, 1, 1, 0, 10000), -(9400514, 2290088, 1, 1, 0, 10000), -(9400514, 2290095, 1, 1, 0, 10000), -(9400514, 2290115, 1, 1, 0, 10000), -(9400514, 2290139, 1, 1, 0, 30000), -(9400549, 2290001, 1, 1, 0, 10000), -(9400549, 2290020, 1, 1, 0, 10000), -(9400549, 2290045, 1, 1, 0, 10000), -(9400549, 2290057, 1, 1, 0, 10000), -(9400549, 2290086, 1, 1, 0, 10000), -(9400575, 2290009, 1, 1, 0, 10000), -(9400575, 2290051, 1, 1, 0, 10000), -(9400575, 2290081, 1, 1, 0, 10000), -(9400575, 2290087, 1, 1, 0, 10000), -(9400575, 2290107, 1, 1, 0, 10000), -(9400575, 2290123, 1, 1, 0, 10000), -(9400580, 2290004, 1, 1, 0, 500), -(9400580, 2290024, 1, 1, 0, 500), -(9400580, 2290083, 1, 1, 0, 500), -(9400580, 2290087, 1, 1, 0, 500), -(9400580, 2290103, 1, 1, 0, 500), -(9400580, 2290121, 1, 1, 0, 500), -(9400582, 2290005, 1, 1, 0, 500), -(9400582, 2290010, 1, 1, 0, 500), -(9400582, 2290029, 1, 1, 0, 500), -(9400582, 2290047, 1, 1, 0, 500), -(9400582, 2290049, 1, 1, 0, 500), -(9400582, 2290074, 1, 1, 0, 500), -(9400582, 2290079, 1, 1, 0, 500), -(9400582, 2290081, 1, 1, 0, 500), -(9400582, 2290135, 1, 1, 0, 1500), -(9400590, 2290088, 1, 1, 0, 15000), -(9400590, 2290125, 1, 1, 0, 15000), -(9400590, 2290135, 1, 1, 0, 45000), -(9400591, 2290039, 1, 1, 0, 15000), -(9400591, 2290074, 1, 1, 0, 15000), -(9400591, 2290113, 1, 1, 0, 15000), -(9400592, 2290047, 1, 1, 0, 15000), -(9400592, 2290123, 1, 1, 0, 15000), -(9400592, 2290131, 1, 1, 0, 45000), -(9400593, 2290069, 1, 1, 0, 15000), -(9400593, 2290093, 1, 1, 0, 15000), -(9400593, 2290138, 1, 1, 0, 45000), -(9420513, 2290039, 1, 1, 0, 10000), -(9420513, 2290100, 1, 1, 0, 10000), -(9420513, 2290108, 1, 1, 0, 10000), -(9420513, 2290118, 1, 1, 0, 10000), -(9420513, 2290138, 1, 1, 0, 30000), -(9420514, 2290099, 1, 1, 0, 1287), -(9420517, 2290000, 1, 1, 0, 1287), -(9420517, 2290008, 1, 1, 0, 1287), -(9420517, 2290018, 1, 1, 0, 1287), -(9420517, 2290038, 1, 1, 0, 1287), -(9420517, 2290060, 1, 1, 0, 1287), -(9420517, 2290080, 1, 1, 0, 1287), -(9420517, 2290103, 1, 1, 0, 1287), -(9420518, 2290123, 1, 1, 0, 1287), -(9420519, 2290113, 1, 1, 0, 1287), -(9420522, 2290000, 1, 1, 0, 1287), -(9420522, 2290001, 1, 1, 0, 1287), -(9420522, 2290011, 1, 1, 0, 1287), -(9420522, 2290025, 1, 1, 0, 1287), -(9420522, 2290028, 1, 1, 0, 1287), -(9420522, 2290037, 1, 1, 0, 1287), -(9420522, 2290043, 1, 1, 0, 1287), -(9420522, 2290066, 1, 1, 0, 1287), -(9420522, 2290082, 1, 1, 0, 1287), -(9420522, 2290083, 1, 1, 0, 1287), -(9420522, 2290089, 1, 1, 0, 1287), -(9420522, 2290091, 1, 1, 0, 1287), -(9420522, 2290107, 1, 1, 0, 1287), -(9420540, 2280006, 1, 1, 0, 500), -(9420540, 2290119, 1, 1, 0, 500), -(9420540, 2290120, 1, 1, 0, 500), -(9420544, 2280007, 1, 1, 0, 20000), -(9420544, 2280008, 1, 1, 0, 20000), -(9420544, 2280009, 1, 1, 0, 20000), -(9420544, 2280010, 1, 1, 0, 20000), -(9420544, 2290002, 1, 1, 0, 20000), -(9420544, 2290015, 1, 1, 0, 20000), -(9420544, 2290022, 1, 1, 0, 20000), -(9420544, 2290027, 1, 1, 0, 20000), -(9420544, 2290034, 1, 1, 0, 20000), -(9420544, 2290052, 1, 1, 0, 20000), -(9420544, 2290054, 1, 1, 0, 20000), -(9420544, 2290089, 1, 1, 0, 20000), -(9420544, 2290094, 1, 1, 0, 20000), -(9420544, 2290098, 1, 1, 0, 20000), -(9420544, 2290105, 1, 1, 0, 20000), -(9420544, 2290110, 1, 1, 0, 20000), -(9420544, 2290119, 1, 1, 0, 20000), -(9420549, 2280007, 1, 1, 0, 20000), -(9420549, 2280008, 1, 1, 0, 20000), -(9420549, 2280009, 1, 1, 0, 20000), -(9420549, 2280010, 1, 1, 0, 20000), -(9420549, 2290002, 1, 1, 0, 20000), -(9420549, 2290015, 1, 1, 0, 20000), -(9420549, 2290022, 1, 1, 0, 20000), -(9420549, 2290027, 1, 1, 0, 20000), -(9420549, 2290034, 1, 1, 0, 20000), -(9420549, 2290052, 1, 1, 0, 20000), -(9420549, 2290054, 1, 1, 0, 20000), -(9420549, 2290089, 1, 1, 0, 20000), -(9420549, 2290094, 1, 1, 0, 20000), -(9420549, 2290098, 1, 1, 0, 20000), -(9420549, 2290105, 1, 1, 0, 20000), -(9420549, 2290110, 1, 1, 0, 20000), -(9420549, 2290119, 1, 1, 0, 20000), -(9500166, 2290044, 1, 1, 0, 500), -(9500173, 2290018, 1, 1, 0, 10000), -(9500173, 2290019, 1, 1, 0, 10000), -(9500173, 2290032, 1, 1, 0, 10000), -(9500173, 2290042, 1, 1, 0, 10000), -(9500173, 2290058, 1, 1, 0, 10000), -(9500173, 2290068, 1, 1, 0, 10000), -(9500173, 2290072, 1, 1, 0, 10000), -(9500173, 2290092, 1, 1, 0, 10000), -(9500173, 2290099, 1, 1, 0, 10000), -(9500173, 2290102, 1, 1, 0, 10000), -(9500173, 2290119, 1, 1, 0, 10000), -(9500173, 2290128, 1, 1, 0, 30000), -(9500174, 2290002, 1, 1, 0, 10000), -(9500174, 2290014, 1, 1, 0, 10000), -(9500174, 2290030, 1, 1, 0, 10000), -(9500174, 2290080, 1, 1, 0, 10000), -(9500174, 2290130, 1, 1, 0, 30000), -(9500180, 2290010, 1, 1, 0, 10000), -(9500180, 2290028, 1, 1, 0, 10000), -(9500180, 2290126, 1, 1, 0, 30000), -(9500181, 2290010, 1, 1, 0, 10000), -(9500181, 2290028, 1, 1, 0, 10000), -(9500181, 2290126, 1, 1, 0, 30000), -(9500331, 2290010, 1, 1, 0, 10000), -(9500331, 2290028, 1, 1, 0, 10000), -(9500331, 2290126, 1, 1, 0, 30000), -(9500332, 2290132, 1, 1, 0, 30000), -(9500333, 2290006, 1, 1, 0, 10000), -(9500333, 2290030, 1, 1, 0, 10000), -(9500333, 2290032, 1, 1, 0, 10000), -(9500333, 2290060, 1, 1, 0, 10000), -(9500333, 2290076, 1, 1, 0, 10000), -(9500333, 2290104, 1, 1, 0, 10000), -(9500333, 2290117, 1, 1, 0, 10000), diff --git a/tools/MapleSkillbookChanceFetcher/src/life/Element.java b/tools/MapleSkillbookChanceFetcher/src/life/Element.java deleted file mode 100644 index 5520ba3501..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/life/Element.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package life; - -public enum Element { - NEUTRAL, FIRE, ICE, LIGHTING, POISON, HOLY, DARK; - - public static Element getFromChar(char c) { - switch (Character.toUpperCase(c)) { - case 'F': - return FIRE; - case 'I': - return ICE; - case 'L': - return LIGHTING; - case 'S': - return POISON; - case 'H': - return HOLY; - case 'D': - return DARK; - case 'P': - return NEUTRAL; - } - throw new IllegalArgumentException("unknown elemnt char " + c); - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/life/ElementalEffectiveness.java b/tools/MapleSkillbookChanceFetcher/src/life/ElementalEffectiveness.java deleted file mode 100644 index f8d23ef5c7..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/life/ElementalEffectiveness.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package life; - -public enum ElementalEffectiveness { - NORMAL, IMMUNE, STRONG, WEAK, NEUTRAL; - - public static ElementalEffectiveness getByNumber(int num) { - switch (num) { - case 1: - return IMMUNE; - case 2: - return STRONG; - case 3: - return WEAK; - case 4: - return NEUTRAL; - default: - throw new IllegalArgumentException("Unkown effectiveness: " + num); - } - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/life/MapleLifeFactory.java b/tools/MapleSkillbookChanceFetcher/src/life/MapleLifeFactory.java deleted file mode 100644 index 23ccd67e43..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/life/MapleLifeFactory.java +++ /dev/null @@ -1,240 +0,0 @@ -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 Patrick Huy -Matthias Butz -Jan Christian Meyer - -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 version 3 as published by -the Free Software Foundation. You may not use, modify or distribute -this program under any other version of the GNU Affero General Public -License. - -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 . - */ -package life; - -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataFileEntry; -import provider.MapleDataProvider; -import provider.MapleDataProviderFactory; -import provider.MapleDataTool; -import provider.wz.MapleDataType; -import tools.Pair; - -public class MapleLifeFactory { - private static String wzPath = "../../wz"; - private static MapleDataProvider data = MapleDataProviderFactory.getDataProvider(new File(wzPath + "/Mob.wz")); - private final static MapleDataProvider stringDataWZ = MapleDataProviderFactory.getDataProvider(new File(wzPath + "/String.wz")); - private static MapleData mobStringData = stringDataWZ.getData("Mob.img"); - private static MapleData npcStringData = stringDataWZ.getData("Npc.img"); - private static Map monsterStats = new HashMap<>(); - - private static int getMonsterId(String fileName) { - return Integer.parseInt(fileName.substring(0, 7)); - } - - public static Map getAllMonsterStats() { - MapleDataDirectoryEntry root = data.getRoot(); - - System.out.print("Parsing mob stats... "); - for (MapleDataFileEntry mFile : root.getFiles()) { - try { - String fileName = mFile.getName(); - - //System.out.println("Parsing '" + fileName + "'"); - MapleData monsterData = data.getData(fileName); - if (monsterData == null) { - continue; - } - - Integer mid = getMonsterId(fileName); - - MapleData monsterInfoData = monsterData.getChildByPath("info"); - MapleMonsterStats stats = new MapleMonsterStats(); - stats.setHp(MapleDataTool.getIntConvert("maxHP", monsterInfoData)); - stats.setFriendly(MapleDataTool.getIntConvert("damagedByMob", monsterInfoData, 0) == 1); - stats.setPADamage(MapleDataTool.getIntConvert("PADamage", monsterInfoData)); - stats.setPDDamage(MapleDataTool.getIntConvert("PDDamage", monsterInfoData)); - stats.setMADamage(MapleDataTool.getIntConvert("MADamage", monsterInfoData)); - stats.setMDDamage(MapleDataTool.getIntConvert("MDDamage", monsterInfoData)); - stats.setMp(MapleDataTool.getIntConvert("maxMP", monsterInfoData, 0)); - stats.setExp(MapleDataTool.getIntConvert("exp", monsterInfoData, 0)); - stats.setLevel(MapleDataTool.getIntConvert("level", monsterInfoData)); - stats.setRemoveAfter(MapleDataTool.getIntConvert("removeAfter", monsterInfoData, 0)); - stats.setBoss(MapleDataTool.getIntConvert("boss", monsterInfoData, 0) > 0); - stats.setExplosiveReward(MapleDataTool.getIntConvert("explosiveReward", monsterInfoData, 0) > 0); - stats.setFfaLoot(MapleDataTool.getIntConvert("publicReward", monsterInfoData, 0) > 0); - stats.setUndead(MapleDataTool.getIntConvert("undead", monsterInfoData, 0) > 0); - stats.setName(MapleDataTool.getString(mid + "/name", mobStringData, "MISSINGNO")); - stats.setBuffToGive(MapleDataTool.getIntConvert("buff", monsterInfoData, -1)); - stats.setCP(MapleDataTool.getIntConvert("getCP", monsterInfoData, 0)); - stats.setRemoveOnMiss(MapleDataTool.getIntConvert("removeOnMiss", monsterInfoData, 0) > 0); - - MapleData special = monsterInfoData.getChildByPath("coolDamage"); - if (special != null) { - int coolDmg = MapleDataTool.getIntConvert("coolDamage", monsterInfoData); - int coolProb = MapleDataTool.getIntConvert("coolDamageProb", monsterInfoData, 0); - stats.setCool(new Pair<>(coolDmg, coolProb)); - } - special = monsterInfoData.getChildByPath("loseItem"); - if (special != null) { - for (MapleData liData : special.getChildren()) { - stats.addLoseItem(new loseItem(MapleDataTool.getInt(liData.getChildByPath("id")), (byte) MapleDataTool.getInt(liData.getChildByPath("prop")), (byte) MapleDataTool.getInt(liData.getChildByPath("x")))); - } - } - special = monsterInfoData.getChildByPath("selfDestruction"); - if (special != null) { - stats.setSelfDestruction(new selfDestruction((byte) MapleDataTool.getInt(special.getChildByPath("action")), MapleDataTool.getIntConvert("removeAfter", special, -1), MapleDataTool.getIntConvert("hp", special, -1))); - } - MapleData firstAttackData = monsterInfoData.getChildByPath("firstAttack"); - int firstAttack = 0; - if (firstAttackData != null) { - if (firstAttackData.getType() == MapleDataType.FLOAT) { - firstAttack = Math.round(MapleDataTool.getFloat(firstAttackData)); - } else { - firstAttack = MapleDataTool.getInt(firstAttackData); - } - } - stats.setFirstAttack(firstAttack > 0); - stats.setDropPeriod(MapleDataTool.getIntConvert("dropItemPeriod", monsterInfoData, 0) * 10000); - - stats.setTagColor(MapleDataTool.getIntConvert("hpTagColor", monsterInfoData, 0)); - stats.setTagBgColor(MapleDataTool.getIntConvert("hpTagBgcolor", monsterInfoData, 0)); - - for (MapleData idata : monsterData) { - if (!idata.getName().equals("info")) { - int delay = 0; - for (MapleData pic : idata.getChildren()) { - delay += MapleDataTool.getIntConvert("delay", pic, 0); - } - stats.setAnimationTime(idata.getName(), delay); - } - } - MapleData reviveInfo = monsterInfoData.getChildByPath("revive"); - if (reviveInfo != null) { - List revives = new LinkedList<>(); - for (MapleData data_ : reviveInfo) { - revives.add(MapleDataTool.getInt(data_)); - } - stats.setRevives(revives); - } - decodeElementalString(stats, MapleDataTool.getString("elemAttr", monsterInfoData, "")); - MapleData monsterSkillData = monsterInfoData.getChildByPath("skill"); - if (monsterSkillData != null) { - int i = 0; - List> skills = new ArrayList<>(); - while (monsterSkillData.getChildByPath(Integer.toString(i)) != null) { - skills.add(new Pair<>(Integer.valueOf(MapleDataTool.getInt(i + "/skill", monsterSkillData, 0)), Integer.valueOf(MapleDataTool.getInt(i + "/level", monsterSkillData, 0)))); - i++; - } - stats.setSkills(skills); - } - MapleData banishData = monsterInfoData.getChildByPath("ban"); - if (banishData != null) { - stats.setBanishInfo(new BanishInfo(MapleDataTool.getString("banMsg", banishData), MapleDataTool.getInt("banMap/0/field", banishData, -1), MapleDataTool.getString("banMap/0/portal", banishData, "sp"))); - } - - monsterStats.put(mid, stats); - } catch(NullPointerException npe) { - //System.out.println("[SEVERE] " + mFile.getName() + " failed to load. Issue: " + npe.getMessage() + "\n\n"); - } - } - - System.out.println("done!"); - return monsterStats; - } - - private static void decodeElementalString(MapleMonsterStats stats, String elemAttr) { - for (int i = 0; i < elemAttr.length(); i += 2) { - stats.setEffectiveness(Element.getFromChar(elemAttr.charAt(i)), ElementalEffectiveness.getByNumber(Integer.valueOf(String.valueOf(elemAttr.charAt(i + 1))))); - } - } - - public static class BanishInfo { - - private int map; - private String portal, msg; - - public BanishInfo(String msg, int map, String portal) { - this.msg = msg; - this.map = map; - this.portal = portal; - } - - public int getMap() { - return map; - } - - public String getPortal() { - return portal; - } - - public String getMsg() { - return msg; - } - } - - public static class loseItem { - - private int id; - private byte chance, x; - - private loseItem(int id, byte chance, byte x) { - this.id = id; - this.chance = chance; - this.x = x; - } - - public int getId() { - return id; - } - - public byte getChance() { - return chance; - } - - public byte getX() { - return x; - } - } - - public static class selfDestruction { - - private byte action; - private int removeAfter; - private int hp; - - private selfDestruction(byte action, int removeAfter, int hp) { - this.action = action; - this.removeAfter = removeAfter; - this.hp = hp; - } - - public int getHp() { - return hp; - } - - public byte getAction() { - return action; - } - - public int removeAfter() { - return removeAfter; - } - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/life/MapleMonsterStats.java b/tools/MapleSkillbookChanceFetcher/src/life/MapleMonsterStats.java deleted file mode 100644 index ce2cacf6b3..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/life/MapleMonsterStats.java +++ /dev/null @@ -1,330 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package life; - -import life.MapleLifeFactory.BanishInfo; -import life.MapleLifeFactory.loseItem; -import life.MapleLifeFactory.selfDestruction; -import tools.Pair; - -import java.util.*; - -/** - * @author Frz - */ -public class MapleMonsterStats { - private boolean changeable; - private int exp, hp, mp, level, PADamage, PDDamage, MADamage, MDDamage, dropPeriod, cp, buffToGive, removeAfter; - private boolean boss, undead, ffaLoot, isExplosiveReward, firstAttack, removeOnMiss; - private String name; - private Map animationTimes = new HashMap(); - private Map resistance = new HashMap(); - private List revives = Collections.emptyList(); - private byte tagColor, tagBgColor; - private List> skills = new ArrayList>(); - private Pair cool = null; - private BanishInfo banish = null; - private List loseItem = null; - private selfDestruction selfDestruction = null; - private boolean friendly; - - public void setChange(boolean change) { - this.changeable = change; - } - - public boolean isChangeable() { - return changeable; - } - - public int getExp() { - return exp; - } - - public void setExp(int exp) { - this.exp = exp; - } - - public int getHp() { - return hp; - } - - public void setHp(int hp) { - this.hp = hp; - } - - public int getMp() { - return mp; - } - - public void setMp(int mp) { - this.mp = mp; - } - - public int getLevel() { - return level; - } - - public void setLevel(int level) { - this.level = level; - } - - public int removeAfter() { - return removeAfter; - } - - public void setRemoveAfter(int removeAfter) { - this.removeAfter = removeAfter; - } - - public int getDropPeriod() { - return dropPeriod; - } - - public void setDropPeriod(int dropPeriod) { - this.dropPeriod = dropPeriod; - } - - public void setBoss(boolean boss) { - this.boss = boss; - } - - public boolean isBoss() { - return boss; - } - - public void setFfaLoot(boolean ffaLoot) { - this.ffaLoot = ffaLoot; - } - - public boolean isFfaLoot() { - return ffaLoot; - } - - public void setAnimationTime(String name, int delay) { - animationTimes.put(name, delay); - } - - public int getAnimationTime(String name) { - Integer ret = animationTimes.get(name); - if (ret == null) { - return 500; - } - return ret.intValue(); - } - - public boolean isMobile() { - return animationTimes.containsKey("move") || animationTimes.containsKey("fly"); - } - - public List getRevives() { - return revives; - } - - public void setRevives(List revives) { - this.revives = revives; - } - - public void setUndead(boolean undead) { - this.undead = undead; - } - - public boolean getUndead() { - return undead; - } - - public void setEffectiveness(Element e, ElementalEffectiveness ee) { - resistance.put(e, ee); - } - - public ElementalEffectiveness getEffectiveness(Element e) { - ElementalEffectiveness elementalEffectiveness = resistance.get(e); - if (elementalEffectiveness == null) { - return ElementalEffectiveness.NORMAL; - } else { - return elementalEffectiveness; - } - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public byte getTagColor() { - return tagColor; - } - - public void setTagColor(int tagColor) { - this.tagColor = (byte) tagColor; - } - - public byte getTagBgColor() { - return tagBgColor; - } - - public void setTagBgColor(int tagBgColor) { - this.tagBgColor = (byte) tagBgColor; - } - - public void setSkills(List> skills) { - this.skills.addAll(skills); - } - - public List> getSkills() { - return Collections.unmodifiableList(this.skills); - } - - public int getNoSkills() { - return this.skills.size(); - } - - public boolean hasSkill(int skillId, int level) { - for (Pair skill : skills) { - if (skill.getLeft() == skillId && skill.getRight() == level) { - return true; - } - } - return false; - } - - public void setFirstAttack(boolean firstAttack) { - this.firstAttack = firstAttack; - } - - public boolean isFirstAttack() { - return firstAttack; - } - - public void setBuffToGive(int buff) { - this.buffToGive = buff; - } - - public int getBuffToGive() { - return buffToGive; - } - - void removeEffectiveness(Element e) { - resistance.remove(e); - } - - public BanishInfo getBanishInfo() { - return banish; - } - - public void setBanishInfo(BanishInfo banish) { - this.banish = banish; - } - - public int getPADamage() { - return PADamage; - } - - public void setPADamage(int PADamage) { - this.PADamage = PADamage; - } - - public int getCP() { - return cp; - } - - public void setCP(int cp) { - this.cp = cp; - } - - public List loseItem() { - return loseItem; - } - - public void addLoseItem(loseItem li) { - if (loseItem == null) { - loseItem = new LinkedList(); - } - loseItem.add(li); - } - - public selfDestruction selfDestruction() { - return selfDestruction; - } - - public void setSelfDestruction(selfDestruction sd) { - this.selfDestruction = sd; - } - - public void setExplosiveReward(boolean isExplosiveReward) { - this.isExplosiveReward = isExplosiveReward; - } - - public boolean isExplosiveReward() { - return isExplosiveReward; - } - - public void setRemoveOnMiss(boolean removeOnMiss) { - this.removeOnMiss = removeOnMiss; - } - - public boolean removeOnMiss() { - return removeOnMiss; - } - - public void setCool(Pair cool) { - this.cool = cool; - } - - public Pair getCool() { - return cool; - } - - public int getPDDamage() { - return PDDamage; - } - - public int getMADamage() { - return MADamage; - } - - public int getMDDamage() { - return MDDamage; - } - - public boolean isFriendly() { - return friendly; - } - - public void setFriendly(boolean value) { - this.friendly = value; - } - - public void setPDDamage(int PDDamage) { - this.PDDamage = PDDamage; - } - - public void setMADamage(int MADamage) { - this.MADamage = MADamage; - } - - public void setMDDamage(int MDDamage) { - this.MDDamage = MDDamage; - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/MapleCanvas.java b/tools/MapleSkillbookChanceFetcher/src/provider/MapleCanvas.java deleted file mode 100644 index 10ab682196..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/MapleCanvas.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.awt.image.BufferedImage; - -public interface MapleCanvas { - int getHeight(); - int getWidth(); - BufferedImage getImage(); -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/MapleData.java b/tools/MapleSkillbookChanceFetcher/src/provider/MapleData.java deleted file mode 100644 index 4d90a93804..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/MapleData.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.util.List; -import provider.wz.MapleDataType; - -public interface MapleData extends MapleDataEntity, Iterable { - @Override - public String getName(); - public MapleDataType getType(); - public List getChildren(); - public MapleData getChildByPath(String path); - public Object getData(); -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataDirectoryEntry.java b/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataDirectoryEntry.java deleted file mode 100644 index cb043e0c94..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataDirectoryEntry.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.util.List; - -/** - * - * @author Matze - */ -public interface MapleDataDirectoryEntry extends MapleDataEntry { - public List getSubdirectories(); - public List getFiles(); - public MapleDataEntry getEntry(String name); -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataEntity.java b/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataEntity.java deleted file mode 100644 index 03ff77649c..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataEntity.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataEntity { - public String getName(); - public MapleDataEntity getParent(); -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataEntry.java b/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataEntry.java deleted file mode 100644 index 62db6d0abe..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataEntry.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataEntry extends MapleDataEntity { - public String getName(); - public int getSize(); - public int getChecksum(); - public int getOffset(); -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataFileEntry.java b/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataFileEntry.java deleted file mode 100644 index 902130a612..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataFileEntry.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataFileEntry extends MapleDataEntry { - public void setOffset(int offset); -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataProvider.java b/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataProvider.java deleted file mode 100644 index 5237b7ac37..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataProvider.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -public interface MapleDataProvider { - MapleData getData(String path); - MapleDataDirectoryEntry getRoot(); -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataProviderFactory.java b/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataProviderFactory.java deleted file mode 100644 index 14753d4406..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataProviderFactory.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.io.File; -import java.io.IOException; -import provider.wz.WZFile; -import provider.wz.XMLWZFile; - -public class MapleDataProviderFactory { - private final static String wzPath = System.getProperty("wzpath"); - - private static MapleDataProvider getWZ(File in, boolean provideImages) { - if (in.getName().toLowerCase().endsWith("wz") && !in.isDirectory()) { - try { - return new WZFile(in, provideImages); - } catch (IOException e) { - throw new RuntimeException("Loading WZ File failed", e); - } - } else { - return new XMLWZFile(in); - } - } - - public static MapleDataProvider getDataProvider(File in) { - return getWZ(in, false); - } - - public static MapleDataProvider getImageProvidingDataProvider(File in) { - return getWZ(in, true); - } - - public static File fileInWZPath(String filename) { - return new File(wzPath, filename); - } -} \ No newline at end of file diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataTool.java b/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataTool.java deleted file mode 100644 index 25f4c7f817..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/MapleDataTool.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.awt.Point; -import java.awt.image.BufferedImage; -import provider.wz.MapleDataType; - -public class MapleDataTool { - public static String getString(MapleData data) { - return ((String) data.getData()); - } - - public static String getString(MapleData data, String def) { - if (data == null || data.getData() == null) { - return def; - } else { - return ((String) data.getData()); - } - } - - public static String getString(String path, MapleData data) { - return getString(data.getChildByPath(path)); - } - - public static String getString(String path, MapleData data, String def) { - return getString(data.getChildByPath(path), def); - } - - public static double getDouble(MapleData data) { - return ((Double) data.getData()).doubleValue(); - } - - public static float getFloat(MapleData data) { - return ((Float) data.getData()).floatValue(); - } - - public static int getInt(MapleData data) { - if (data == null || data.getData() == null) { - return 0;// DEF? - } - return ((Integer) data.getData()).intValue(); - } - - public static int getInt(String path, MapleData data) { - return getInt(data.getChildByPath(path)); - } - - public static int getIntConvert(MapleData data) { - if (data.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(data)); - } else { - return getInt(data); - } - } - - public static int getIntConvert(String path, MapleData data) { - MapleData d = data.getChildByPath(path); - if (d.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(d)); - } else { - return getInt(d); - } - } - - public static int getInt(MapleData data, int def) { - if (data == null || data.getData() == null) { - return def; - } else if (data.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(data)); - } else { - return ((Integer) data.getData()).intValue(); - } - } - - public static int getInt(String path, MapleData data, int def) { - return getInt(data.getChildByPath(path), def); - } - - public static int getIntConvert(String path, MapleData data, int def) { - MapleData d = data.getChildByPath(path); - if (d == null) { - return def; - } - if (d.getType() == MapleDataType.STRING) { - try { - return Integer.parseInt(getString(d)); - } catch (NumberFormatException nfe) { - nfe.printStackTrace(); - return def; - } - } else { - return getInt(d, def); - } - } - - public static BufferedImage getImage(MapleData data) { - return ((MapleCanvas) data.getData()).getImage(); - } - - public static Point getPoint(MapleData data) { - return ((Point) data.getData()); - } - - public static Point getPoint(String path, MapleData data) { - return getPoint(data.getChildByPath(path)); - } - - public static Point getPoint(String path, MapleData data, Point def) { - final MapleData pointData = data.getChildByPath(path); - if (pointData == null) { - return def; - } - return getPoint(pointData); - } - - public static String getFullDataPath(MapleData data) { - String path = ""; - MapleDataEntity myData = data; - while (myData != null) { - path = myData.getName() + "/" + path; - myData = myData.getParent(); - } - return path.substring(0, path.length() - 1); - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/wz/FileStoredPngMapleCanvas.java b/tools/MapleSkillbookChanceFetcher/src/provider/wz/FileStoredPngMapleCanvas.java deleted file mode 100644 index 21736c2c16..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/wz/FileStoredPngMapleCanvas.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import javax.imageio.ImageIO; -import provider.MapleCanvas; - -public class FileStoredPngMapleCanvas implements MapleCanvas { - private File file; - private int width; - private int height; - private BufferedImage image; - - public FileStoredPngMapleCanvas(int width, int height, File fileIn) { - this.width = width; - this.height = height; - this.file = fileIn; - } - - @Override - public int getHeight() { - return height; - } - - @Override - public int getWidth() { - return width; - } - - @Override - public BufferedImage getImage() { - loadImageIfNecessary(); - return image; - } - - private void loadImageIfNecessary() { - if (image == null) { - try { - image = ImageIO.read(file); - // replace the dimensions loaded from the wz by the REAL dimensions from the image - should be equal tho - width = image.getWidth(); - height = image.getHeight(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/wz/ImgMapleSound.java b/tools/MapleSkillbookChanceFetcher/src/provider/wz/ImgMapleSound.java deleted file mode 100644 index 8add2ccb36..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/wz/ImgMapleSound.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -public class ImgMapleSound { - private int dataLength, offset; - - public ImgMapleSound(int dataLength, int offset) { - this.dataLength = dataLength; - this.offset = offset; - } - - public int getDataLength() { - return dataLength; - } - - public int getOffset() { - return offset; - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/wz/ListWZFile.java b/tools/MapleSkillbookChanceFetcher/src/provider/wz/ListWZFile.java deleted file mode 100644 index 1672a08c59..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/wz/ListWZFile.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import provider.MapleDataProviderFactory; -import tools.data.input.GenericLittleEndianAccessor; -import tools.data.input.InputStreamByteStream; -import tools.data.input.LittleEndianAccessor; - -public class ListWZFile { - private LittleEndianAccessor lea; - private List entries = new ArrayList(); - private static Collection modernImgs = new HashSet(); - - public static byte[] xorBytes(byte[] a, byte[] b) { - byte[] wusched = new byte[a.length]; - for (int i = 0; i < a.length; i++) { - wusched[i] = (byte) (a[i] ^ b[i]); - } - return wusched; - } - - public ListWZFile(File listwz) throws FileNotFoundException { - lea = new GenericLittleEndianAccessor(new InputStreamByteStream(new BufferedInputStream(new FileInputStream(listwz)))); - while (lea.available() > 0) { - int l = lea.readInt() * 2; - byte[] chunk = new byte[l]; - for (int i = 0; i < chunk.length; i++) { - chunk[i] = lea.readByte(); - } - lea.readChar(); - final String value = String.valueOf(WZTool.readListString(chunk)); - entries.add(value); - } - entries = Collections.unmodifiableList(entries); - } - - public List getEntries() { - return entries; - } - - public static void init() { - final String listWz = System.getProperty("listwz"); - if (listWz != null) { - ListWZFile listwz; - try { - listwz = new ListWZFile(MapleDataProviderFactory.fileInWZPath("List.wz")); - modernImgs = new HashSet(listwz.getEntries()); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - } - - public static boolean isModernImgFile(String path) { - return modernImgs.contains(path); - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/wz/MapleDataType.java b/tools/MapleSkillbookChanceFetcher/src/provider/wz/MapleDataType.java deleted file mode 100644 index e074d57d14..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/wz/MapleDataType.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -public enum MapleDataType { - NONE, IMG_0x00, SHORT, INT, FLOAT, DOUBLE, STRING, EXTENDED, PROPERTY, CANVAS, VECTOR, CONVEX, SOUND, UOL, UNKNOWN_TYPE, UNKNOWN_EXTENDED_TYPE; -} \ No newline at end of file diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/wz/PNGMapleCanvas.java b/tools/MapleSkillbookChanceFetcher/src/provider/wz/PNGMapleCanvas.java deleted file mode 100644 index 97c2303804..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/wz/PNGMapleCanvas.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.Point; -import java.awt.image.BufferedImage; -import java.awt.image.DataBuffer; -import java.awt.image.DataBufferByte; -import java.awt.image.PixelInterleavedSampleModel; -import java.awt.image.Raster; -import java.awt.image.SampleModel; -import java.awt.image.WritableRaster; -import java.util.zip.DataFormatException; -import java.util.zip.Inflater; -import provider.MapleCanvas; - -public class PNGMapleCanvas implements MapleCanvas { - private static final int[] ZAHLEN = new int[]{2, 1, 0, 3}; - private int height; - private int width; - private int dataLength; - private int format; - private byte[] data; - - public PNGMapleCanvas(int width, int height, int dataLength, int format, byte[] data) { - super(); - this.height = height; - this.width = width; - this.dataLength = dataLength; - this.format = format; - this.data = data; - } - - public int getHeight() { - return height; - } - - public int getWidth() { - return width; - } - - public int getFormat() { - return format; - } - - private byte[] getData() { - return data; - } - - @Override - public BufferedImage getImage() { - int sizeUncompressed = 0; - int size8888 = 0; - int maxWriteBuf = 2; - int maxHeight = 3; - byte[] writeBuf = new byte[maxWriteBuf]; - @SuppressWarnings ("unused") - byte[] rowPointers = new byte[maxHeight]; - switch (getFormat()) { - case 1: - case 513: - sizeUncompressed = getHeight() * getWidth() * 4; - break; - case 2: - sizeUncompressed = getHeight() * getWidth() * 8; - break; - case 517: - sizeUncompressed = getHeight() * getWidth() / 128; - break; - } - size8888 = getHeight() * getWidth() * 8; - if (size8888 > maxWriteBuf) { - maxWriteBuf = size8888; - writeBuf = new byte[maxWriteBuf]; - } - if (getHeight() > maxHeight) { - maxHeight = getHeight(); - rowPointers = new byte[maxHeight]; - } - Inflater dec = new Inflater(); - dec.setInput(getData(), 0, dataLength); - int declen = 0; - byte[] uc = new byte[sizeUncompressed]; - try { - declen = dec.inflate(uc); - } catch (DataFormatException ex) { - throw new RuntimeException("zlib fucks", ex); - } - dec.end(); - if (getFormat() == 1) { - for (int i = 0; i < sizeUncompressed; i++) { - byte low = (byte) (uc[i] & 0x0F); - byte high = (byte) (uc[i] & 0xF0); - writeBuf[(i << 1)] = (byte) (((low << 4) | low) & 0xFF); - writeBuf[(i << 1) + 1] = (byte) (high | ((high >>> 4) & 0xF)); - } - } else if (getFormat() == 2) { - writeBuf = uc; - } else if (getFormat() == 513) { - for (int i = 0; i < declen; i += 2) { - byte bBits = (byte) ((uc[i] & 0x1F) << 3); - byte gBits = (byte) (((uc[i + 1] & 0x07) << 5) | ((uc[i] & 0xE0) >> 3)); - byte rBits = (byte) (uc[i + 1] & 0xF8); - writeBuf[(i << 1)] = (byte) (bBits | (bBits >> 5)); - writeBuf[(i << 1) + 1] = (byte) (gBits | (gBits >> 6)); - writeBuf[(i << 1) + 2] = (byte) (rBits | (rBits >> 5)); - writeBuf[(i << 1) + 3] = (byte) 0xFF; - } - } else if (getFormat() == 517) { - byte b = 0x00; - int pixelIndex = 0; - for (int i = 0; i < declen; i++) { - for (int j = 0; j < 8; j++) { - b = (byte) (((uc[i] & (0x01 << (7 - j))) >> (7 - j)) * 255); - for (int k = 0; k < 16; k++) { - pixelIndex = (i << 9) + (j << 6) + k * 2; - writeBuf[pixelIndex] = b; - writeBuf[pixelIndex + 1] = b; - writeBuf[pixelIndex + 2] = b; - writeBuf[pixelIndex + 3] = (byte) 0xFF; - } - } - } - } - DataBufferByte imgData = new DataBufferByte(writeBuf, sizeUncompressed); - SampleModel sm = new PixelInterleavedSampleModel(DataBuffer.TYPE_BYTE, getWidth(), getHeight(), 4, getWidth() * 4, ZAHLEN); - WritableRaster imgRaster = Raster.createWritableRaster(sm, imgData, new Point(0, 0)); - BufferedImage aa = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); - aa.setData(imgRaster); - return aa; - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZDirectoryEntry.java b/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZDirectoryEntry.java deleted file mode 100644 index d24b8cb2b9..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZDirectoryEntry.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataEntity; -import provider.MapleDataEntry; -import provider.MapleDataFileEntry; - -public class WZDirectoryEntry extends WZEntry implements MapleDataDirectoryEntry { - private List subdirs = new ArrayList(); - private List files = new ArrayList(); - private Map entries = new HashMap(); - - public WZDirectoryEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(name, size, checksum, parent); - } - - public WZDirectoryEntry() { - super(null, 0, 0, null); - } - - public void addDirectory(MapleDataDirectoryEntry dir) { - subdirs.add(dir); - entries.put(dir.getName(), dir); - } - - public void addFile(MapleDataFileEntry fileEntry) { - files.add(fileEntry); - entries.put(fileEntry.getName(), fileEntry); - } - - public List getSubdirectories() { - return Collections.unmodifiableList(subdirs); - } - - public List getFiles() { - return Collections.unmodifiableList(files); - } - - public MapleDataEntry getEntry(String name) { - return entries.get(name); - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZEntry.java b/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZEntry.java deleted file mode 100644 index 1e921b2082..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZEntry.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import provider.MapleDataEntity; -import provider.MapleDataEntry; - -public class WZEntry implements MapleDataEntry { - private String name; - private int size; - private int checksum; - private int offset; - private MapleDataEntity parent; - - public WZEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(); - this.name = name; - this.size = size; - this.checksum = checksum; - this.parent = parent; - } - - public String getName() { - return name; - } - - public int getSize() { - return size; - } - - public int getChecksum() { - return checksum; - } - - public int getOffset() { - return offset; - } - - public MapleDataEntity getParent() { - return parent; - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZFile.java b/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZFile.java deleted file mode 100644 index c6c0abf537..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZFile.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.RandomAccessFile; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataFileEntry; -import provider.MapleDataProvider; -import tools.data.input.GenericLittleEndianAccessor; -import tools.data.input.GenericSeekableLittleEndianAccessor; -import tools.data.input.InputStreamByteStream; -import tools.data.input.LittleEndianAccessor; -import tools.data.input.RandomAccessByteStream; -import tools.data.input.SeekableLittleEndianAccessor; - -public class WZFile implements MapleDataProvider { - static { - ListWZFile.init(); - } - private File wzfile; - private LittleEndianAccessor lea; - private SeekableLittleEndianAccessor slea; - private int headerSize; - private WZDirectoryEntry root; - private boolean provideImages; - private int cOffset; - - public WZFile(File wzfile, boolean provideImages) throws IOException { - this.wzfile = wzfile; - lea = new GenericLittleEndianAccessor(new InputStreamByteStream(new BufferedInputStream(new FileInputStream(wzfile)))); - RandomAccessFile raf = new RandomAccessFile(wzfile, "r"); - slea = new GenericSeekableLittleEndianAccessor(new RandomAccessByteStream(raf)); - root = new WZDirectoryEntry(wzfile.getName(), 0, 0, null); - this.provideImages = provideImages; - load(); - } - - private void load() throws IOException { - lea.readAsciiString(4); - lea.readInt(); - lea.readInt(); - headerSize = lea.readInt(); - lea.readNullTerminatedAsciiString(); - lea.readShort(); - parseDirectory(root); - cOffset = (int) lea.getBytesRead(); - getOffsets(root); - } - - private void getOffsets(MapleDataDirectoryEntry dir) { - for (MapleDataFileEntry file : dir.getFiles()) { - file.setOffset(cOffset); - cOffset += file.getSize(); - } - for (MapleDataDirectoryEntry sdir : dir.getSubdirectories()) { - getOffsets(sdir); - } - } - - private void parseDirectory(WZDirectoryEntry dir) { - int entries = WZTool.readValue(lea); - for (int i = 0; i < entries; i++) { - byte marker = lea.readByte(); - String name = null; - int size, checksum; - switch (marker) { - case 0x02: - name = WZTool.readDecodedStringAtOffsetAndReset(slea, lea.readInt() + this.headerSize + 1); - size = WZTool.readValue(lea); - checksum = WZTool.readValue(lea); - lea.readInt(); //dummy int - dir.addFile(new WZFileEntry(name, size, checksum, dir)); - break; - case 0x03: - case 0x04: - name = WZTool.readDecodedString(lea); - size = WZTool.readValue(lea); - checksum = WZTool.readValue(lea); - lea.readInt(); //dummy int - if (marker == 3) { - dir.addDirectory(new WZDirectoryEntry(name, size, checksum, dir)); - } else { - dir.addFile(new WZFileEntry(name, size, checksum, dir)); - } - break; - default: - } - } - for (MapleDataDirectoryEntry idir : dir.getSubdirectories()) { - parseDirectory((WZDirectoryEntry) idir); - } - } - - public WZIMGFile getImgFile(String path) throws IOException { - String segments[] = path.split("/"); - WZDirectoryEntry dir = root; - for (int x = 0; x < segments.length - 1; x++) { - dir = (WZDirectoryEntry) dir.getEntry(segments[x]); - if (dir == null) { - return null; - } - } - WZFileEntry entry = (WZFileEntry) dir.getEntry(segments[segments.length - 1]); - if (entry == null) { - return null; - } - String fullPath = wzfile.getName().substring(0, wzfile.getName().length() - 3).toLowerCase() + "/" + path; - return new WZIMGFile(this.wzfile, entry, provideImages, ListWZFile.isModernImgFile(fullPath)); - } - - @Override - public synchronized MapleData getData(String path) { - try { - WZIMGFile imgFile = getImgFile(path); - if (imgFile == null) { - return null; - } - MapleData ret = imgFile.getRoot(); - return ret; - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - @Override - public MapleDataDirectoryEntry getRoot() { - return root; - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZFileEntry.java b/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZFileEntry.java deleted file mode 100644 index 792371d9cf..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZFileEntry.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import provider.MapleDataEntity; -import provider.MapleDataFileEntry; - -public class WZFileEntry extends WZEntry implements MapleDataFileEntry { - private int offset; - - public WZFileEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(name, size, checksum, parent); - } - - @Override - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZIMGEntry.java b/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZIMGEntry.java deleted file mode 100644 index 385d785183..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZIMGEntry.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import provider.MapleData; -import provider.MapleDataEntity; - -public class WZIMGEntry implements MapleData { - private String name; - private MapleDataType type; - private List children = new ArrayList(10); - private Object data; - private MapleDataEntity parent; - - public WZIMGEntry(MapleDataEntity parent) { - this.parent = parent; - } - - @Override - public String getName() { - return name; - } - - @Override - public MapleDataType getType() { - return type; - } - - @Override - public List getChildren() { - return Collections.unmodifiableList(children); - } - - @Override - public MapleData getChildByPath(String path) { - String segments[] = path.split("/"); - if (segments[0].equals("..")) { - return ((MapleData) getParent()).getChildByPath(path.substring(path.indexOf("/") + 1)); - } - MapleData ret = this; - for (int x = 0; x < segments.length; x++) { - boolean foundChild = false; - for (MapleData child : ret.getChildren()) { - if (child.getName().equals(segments[x])) { - ret = child; - foundChild = true; - break; - } - } - if (!foundChild) { - return null; - } - } - return ret; - } - - @Override - public Object getData() { - return data; - } - - public void setName(String name) { - this.name = name; - } - - public void setType(MapleDataType type) { - this.type = type; - } - - public void setData(Object data) { - this.data = data; - } - - public void addChild(WZIMGEntry entry) { - children.add(entry); - } - - @Override - public Iterator iterator() { - return getChildren().iterator(); - } - - @Override - public String toString() { - return getName() + ":" + getData(); - } - - public MapleDataEntity getParent() { - return parent; - } - - public void finish() { - ((ArrayList) children).trimToSize(); - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZIMGFile.java b/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZIMGFile.java deleted file mode 100644 index bec06c78bd..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZIMGFile.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.Point; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.io.RandomAccessFile; -import tools.data.input.GenericSeekableLittleEndianAccessor; -import tools.data.input.RandomAccessByteStream; -import tools.data.input.SeekableLittleEndianAccessor; - -public class WZIMGFile { - private WZFileEntry file; - private WZIMGEntry root; - private boolean provideImages; - @SuppressWarnings ("unused") - private boolean modernImg; - - public WZIMGFile(File wzfile, WZFileEntry file, boolean provideImages, boolean modernImg) throws IOException { - RandomAccessFile raf = new RandomAccessFile(wzfile, "r"); - SeekableLittleEndianAccessor slea = new GenericSeekableLittleEndianAccessor(new RandomAccessByteStream(raf)); - slea.seek(file.getOffset()); - this.file = file; - this.provideImages = provideImages; - root = new WZIMGEntry(file.getParent()); - root.setName(file.getName()); - root.setType(MapleDataType.EXTENDED); - this.modernImg = modernImg; - parseExtended(root, slea, 0); - root.finish(); - raf.close(); - } - - protected void dumpImg(OutputStream out, SeekableLittleEndianAccessor slea) throws IOException { - DataOutputStream os = new DataOutputStream(out); - long oldPos = slea.getPosition(); - slea.seek(file.getOffset()); - for (int x = 0; x < file.getSize(); x++) { - os.write(slea.readByte()); - } - slea.seek(oldPos); - } - - public WZIMGEntry getRoot() { - return root; - } - - private void parse(WZIMGEntry entry, SeekableLittleEndianAccessor slea) { - byte marker = slea.readByte(); - switch (marker) { - case 0: { - String name = WZTool.readDecodedString(slea); - entry.setName(name); - break; - } - case 1: { - String name = WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt()); - entry.setName(name); - break; - } - default: - System.out.println("Unknown Image identifier: " + marker + " at offset " + (slea.getPosition() - file.getOffset())); - } - marker = slea.readByte(); - switch (marker) { - case 0: - entry.setType(MapleDataType.IMG_0x00); - break; - case 2: - case 11: //??? no idea, since 0.49 - entry.setType(MapleDataType.SHORT); - entry.setData(Short.valueOf(slea.readShort())); - break; - case 3: - entry.setType(MapleDataType.INT); - entry.setData(Integer.valueOf(WZTool.readValue(slea))); - break; - case 4: - entry.setType(MapleDataType.FLOAT); - entry.setData(Float.valueOf(WZTool.readFloatValue(slea))); - break; - case 5: - entry.setType(MapleDataType.DOUBLE); - entry.setData(Double.valueOf(slea.readDouble())); - break; - case 8: - entry.setType(MapleDataType.STRING); - byte iMarker = slea.readByte(); - if (iMarker == 0) { - entry.setData(WZTool.readDecodedString(slea)); - } else if (iMarker == 1) { - entry.setData(WZTool.readDecodedStringAtOffsetAndReset(slea, slea.readInt() + file.getOffset())); - } else { - System.out.println("Unknown String type " + iMarker); - } - break; - case 9: - entry.setType(MapleDataType.EXTENDED); - long endOfExtendedBlock = slea.readInt(); - endOfExtendedBlock += slea.getPosition(); - parseExtended(entry, slea, endOfExtendedBlock); - break; - default: - System.out.println("Unknown Image type " + marker); - } - } - - private void parseExtended(WZIMGEntry entry, SeekableLittleEndianAccessor slea, long endOfExtendedBlock) { - byte marker = slea.readByte(); - String type; - switch (marker) { - case 0x73: - type = WZTool.readDecodedString(slea); - break; - case 0x1B: - type = WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt()); - break; - default: - throw new RuntimeException("Unknown extended image identifier: " + marker + " at offset " + - (slea.getPosition() - file.getOffset())); - } - if (type.equals("Property")) { - entry.setType(MapleDataType.PROPERTY); - slea.readByte(); - slea.readByte(); - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry cEntry = new WZIMGEntry(entry); - parse(cEntry, slea); - cEntry.finish(); - entry.addChild(cEntry); - } - } else if (type.equals("Canvas")) { - entry.setType(MapleDataType.CANVAS); - slea.readByte(); - marker = slea.readByte(); - if (marker == 0) { - // do nothing - } else if (marker == 1) { - slea.readByte(); - slea.readByte(); - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry child = new WZIMGEntry(entry); - parse(child, slea); - child.finish(); - entry.addChild(child); - } - } else { - System.out.println("Canvas marker != 1 (" + marker + ")"); - } - int width = WZTool.readValue(slea); - int height = WZTool.readValue(slea); - int format = WZTool.readValue(slea); - int format2 = slea.readByte(); - slea.readInt(); - int dataLength = slea.readInt() - 1; - slea.readByte(); - if (provideImages) { - byte[] pngdata = slea.read(dataLength); - entry.setData(new PNGMapleCanvas(width, height, dataLength, format + format2, pngdata)); - } else { - entry.setData(new PNGMapleCanvas(width, height, dataLength, format + format2, null)); - slea.skip(dataLength); - } - } else if (type.equals("Shape2D#Vector2D")) { - entry.setType(MapleDataType.VECTOR); - int x = WZTool.readValue(slea); - int y = WZTool.readValue(slea); - entry.setData(new Point(x, y)); - } else if (type.equals("Shape2D#Convex2D")) { - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry cEntry = new WZIMGEntry(entry); - parseExtended(cEntry, slea, 0); - cEntry.finish(); - entry.addChild(cEntry); - } - } else if (type.equals("Sound_DX8")) { - entry.setType(MapleDataType.SOUND); - slea.readByte(); - int dataLength = WZTool.readValue(slea); - WZTool.readValue(slea); // no clue what this is - int offset = (int) slea.getPosition(); - entry.setData(new ImgMapleSound(dataLength, offset - file.getOffset())); - slea.seek(endOfExtendedBlock); - } else if (type.equals("UOL")) { - entry.setType(MapleDataType.UOL); - slea.readByte(); - byte uolmarker = slea.readByte(); - switch (uolmarker) { - case 0: - entry.setData(WZTool.readDecodedString(slea)); - break; - case 1: - entry.setData(WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt())); - break; - default: - System.out.println("Unknown UOL marker: " + uolmarker + " " + entry.getName()); - } - } else { - throw new RuntimeException("Unhandled extended type: " + type); - } - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZTool.java b/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZTool.java deleted file mode 100644 index 7f5452cd03..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/wz/WZTool.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import tools.data.input.LittleEndianAccessor; -import tools.data.input.SeekableLittleEndianAccessor; - -import javax.crypto.BadPaddingException; -import javax.crypto.Cipher; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.NoSuchPaddingException; -import javax.crypto.spec.SecretKeySpec; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; - -/* - * Ported Code, see WZFile.java for more info - */ -public class WZTool { - private static byte[] encKey; - - static { - byte[] iv = new byte[]{(byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b,}; - byte[] key = new byte[]{(byte) 0x13, 0x00, 0x00, 0x00, - (byte) 0x08, 0x00, 0x00, 0x00, - (byte) 0x06, 0x00, 0x00, 0x00, - (byte) 0xB4, 0x00, 0x00, 0x00, - (byte) 0x1B, 0x00, 0x00, 0x00, - (byte) 0x0F, 0x00, 0x00, 0x00, - (byte) 0x33, 0x00, 0x00, 0x00, - (byte) 0x52, 0x00, 0x00, 0x00 - }; - Cipher cipher = null; - SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); - try { - cipher = Cipher.getInstance("AES"); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (NoSuchPaddingException e) { - e.printStackTrace(); - } - try { - cipher.init(Cipher.ENCRYPT_MODE, skeySpec); - } catch (InvalidKeyException e) { - e.printStackTrace(); - } - encKey = new byte[0xFFFF]; - for (int i = 0; i < (0xFFFF / 16); i++) { - try { - iv = cipher.doFinal(iv); - } catch (IllegalBlockSizeException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } - System.arraycopy(iv, 0, encKey, (i * 16), 16); - } - try { - iv = cipher.doFinal(iv); - } catch (IllegalBlockSizeException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } - System.arraycopy(iv, 0, encKey, 65520, 15); - } - - public static byte[] readListString(byte[] str) { - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ encKey[i]); - } - return str; - } - - public static String readDecodedString(LittleEndianAccessor llea) { - int strLength; - byte b = llea.readByte(); - if (b == 0x00) { - return ""; - } - if (b >= 0) { - if (b == 0x7F) { - strLength = llea.readInt(); - } else { - strLength = b; - } - if (strLength < 0) { - return ""; - } - byte str[] = new byte[strLength * 2]; - for (int i = 0; i < strLength * 2; i++) { - str[i] = llea.readByte(); - } - return DecryptUnicodeStr(str); - } else { - if (b == -128) { - strLength = llea.readInt(); - } else { - strLength = -b; - } - if (strLength < 0) { - return ""; - } - byte str[] = new byte[strLength]; - for (int i = 0; i < strLength; i++) { - str[i] = llea.readByte(); - } - return DecryptAsciiStr(str); - } - } - - public static String DecryptAsciiStr(byte[] str) { - byte xorByte = (byte) 0xAA; - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ xorByte ^ encKey[i]); - xorByte++; - } - return new String(str); - } - - public static String DecryptUnicodeStr(byte[] str) { - int xorByte = 0xAAAA; - char[] charRet = new char[str.length / 2]; - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ encKey[i]); - } - for (int i = 0; i < (str.length / 2); i++) { - char toXor = (char) ((str[i] << 8) | str[i + 1]); - charRet[i] = (char) (toXor ^ xorByte); - xorByte++; - } - return String.valueOf(charRet); - } - - public static String readDecodedStringAtOffset(SeekableLittleEndianAccessor slea, int offset) { - slea.seek(offset); - return readDecodedString(slea); - } - - public static String readDecodedStringAtOffsetAndReset(SeekableLittleEndianAccessor slea, int offset) { - long pos = 0; - pos = slea.getPosition(); - slea.seek(offset); - String ret = readDecodedString(slea); - slea.seek(pos); - return ret; - } - - public static int readValue(LittleEndianAccessor lea) { - byte b = lea.readByte(); - if (b == -128) { - return lea.readInt(); - } else { - return b; - } - } - - public static float readFloatValue(LittleEndianAccessor lea) { - byte b = lea.readByte(); - if (b == -128) { - return lea.readFloat(); - } else { - return 0; - } - } -} \ No newline at end of file diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/wz/XMLDomMapleData.java b/tools/MapleSkillbookChanceFetcher/src/provider/wz/XMLDomMapleData.java deleted file mode 100644 index 151a04c2fd..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/wz/XMLDomMapleData.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package provider.wz; - -import java.awt.Point; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.text.NumberFormat; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import provider.MapleData; -import provider.MapleDataEntity; -import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -public class XMLDomMapleData implements MapleData { - private Node node; - private File imageDataDir; - private NumberFormat nf; - - public XMLDomMapleData(FileInputStream fis, File imageDataDir) { - try { - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - Document document = documentBuilder.parse(fis); - this.node = document.getFirstChild(); - } catch (ParserConfigurationException e) { - throw new RuntimeException(e); - } catch (SAXException e) { - throw new RuntimeException(e); - } catch (IOException e) { - throw new RuntimeException(e); - } - this.imageDataDir = imageDataDir; - this.nf = NumberFormat.getInstance(Locale.FRANCE); - } - - private XMLDomMapleData(Node node) { - this.node = node; - this.nf = NumberFormat.getInstance(Locale.FRANCE); - } - - @Override - public MapleData getChildByPath(String path) { - String segments[] = path.split("/"); - if (segments[0].equals("..")) { - return ((MapleData) getParent()).getChildByPath(path.substring(path.indexOf("/") + 1)); - } - - Node myNode = node; - for (int x = 0; x < segments.length; x++) { - NodeList childNodes = myNode.getChildNodes(); - boolean foundChild = false; - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if (childNode.getNodeType() == Node.ELEMENT_NODE && childNode.getAttributes().getNamedItem("name").getNodeValue().equals(segments[x])) { - myNode = childNode; - foundChild = true; - break; - } - } - if (!foundChild) { - return null; - } - } - XMLDomMapleData ret = new XMLDomMapleData(myNode); - ret.imageDataDir = new File(imageDataDir, getName() + "/" + path).getParentFile(); - return ret; - } - - @Override - public List getChildren() { - List ret = new ArrayList(); - NodeList childNodes = node.getChildNodes(); - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if (childNode.getNodeType() == Node.ELEMENT_NODE) { - XMLDomMapleData child = new XMLDomMapleData(childNode); - child.imageDataDir = new File(imageDataDir, getName()); - ret.add(child); - } - } - return ret; - } - - @Override - public Object getData() { - NamedNodeMap attributes = node.getAttributes(); - MapleDataType type = getType(); - switch (type) { - case DOUBLE: - case FLOAT: - case INT: - case SHORT: { - String value = attributes.getNamedItem("value").getNodeValue(); - Number nval; - - try { - nval = nf.parse(value); - } - catch(java.text.ParseException pe) { - pe.printStackTrace(); - nval = 0.0f; - } - - switch (type) { - case DOUBLE: - return nval.doubleValue(); - case FLOAT: - return nval.floatValue(); - case INT: - return nval.intValue(); - case SHORT: - return nval.shortValue(); - default: - return null; - } - } - case STRING: - case UOL: { - String value = attributes.getNamedItem("value").getNodeValue(); - return value; - } - case VECTOR: { - String x = attributes.getNamedItem("x").getNodeValue(); - String y = attributes.getNamedItem("y").getNodeValue(); - return new Point(Integer.parseInt(x), Integer.parseInt(y)); - } - case CANVAS: { - String width = attributes.getNamedItem("width").getNodeValue(); - String height = attributes.getNamedItem("height").getNodeValue(); - return new FileStoredPngMapleCanvas(Integer.parseInt(width), Integer.parseInt(height), new File( - imageDataDir, getName() + ".png")); - } - default: - return null; - } - } - - @Override - public MapleDataType getType() { - String nodeName = node.getNodeName(); - if (nodeName.equals("imgdir")) { - return MapleDataType.PROPERTY; - } else if (nodeName.equals("canvas")) { - return MapleDataType.CANVAS; - } else if (nodeName.equals("convex")) { - return MapleDataType.CONVEX; - } else if (nodeName.equals("sound")) { - return MapleDataType.SOUND; - } else if (nodeName.equals("uol")) { - return MapleDataType.UOL; - } else if (nodeName.equals("double")) { - return MapleDataType.DOUBLE; - } else if (nodeName.equals("float")) { - return MapleDataType.FLOAT; - } else if (nodeName.equals("int")) { - return MapleDataType.INT; - } else if (nodeName.equals("short")) { - return MapleDataType.SHORT; - } else if (nodeName.equals("string")) { - return MapleDataType.STRING; - } else if (nodeName.equals("vector")) { - return MapleDataType.VECTOR; - } else if (nodeName.equals("null")) { - return MapleDataType.IMG_0x00; - } - return null; - } - - @Override - public MapleDataEntity getParent() { - Node parentNode = node.getParentNode(); - if (parentNode.getNodeType() == Node.DOCUMENT_NODE) { - return null; - } - XMLDomMapleData parentData = new XMLDomMapleData(parentNode); - parentData.imageDataDir = imageDataDir.getParentFile(); - return parentData; - } - - @Override - public String getName() { - return node.getAttributes().getNamedItem("name").getNodeValue(); - } - - @Override - public Iterator iterator() { - return getChildren().iterator(); - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/provider/wz/XMLWZFile.java b/tools/MapleSkillbookChanceFetcher/src/provider/wz/XMLWZFile.java deleted file mode 100644 index 2a7694fdc9..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/provider/wz/XMLWZFile.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataProvider; - -public class XMLWZFile implements MapleDataProvider { - private File root; - private WZDirectoryEntry rootForNavigation; - - public XMLWZFile(File fileIn) { - root = fileIn; - rootForNavigation = new WZDirectoryEntry(fileIn.getName(), 0, 0, null); - fillMapleDataEntitys(root, rootForNavigation); - } - - private void fillMapleDataEntitys(File lroot, WZDirectoryEntry wzdir) { - for (File file : lroot.listFiles()) { - String fileName = file.getName(); - if (file.isDirectory() && !fileName.endsWith(".img")) { - WZDirectoryEntry newDir = new WZDirectoryEntry(fileName, 0, 0, wzdir); - wzdir.addDirectory(newDir); - fillMapleDataEntitys(file, newDir); - } else if (fileName.endsWith(".xml")) { - wzdir.addFile(new WZFileEntry(fileName.substring(0, fileName.length() - 4), 0, 0, wzdir)); - } - } - } - - @Override - public MapleData getData(String path) { - File dataFile = new File(root, path + ".xml"); - File imageDataDir = new File(root, path); - if (!dataFile.exists()) { - return null;//bitches - } - FileInputStream fis; - try { - fis = new FileInputStream(dataFile); - } catch (FileNotFoundException e) { - throw new RuntimeException("Datafile " + path + " does not exist in " + root.getAbsolutePath()); - } - final XMLDomMapleData domMapleData; - try { - domMapleData = new XMLDomMapleData(fis, imageDataDir.getParentFile()); - } finally { - try { - fis.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - return domMapleData; - } - - @Override - public MapleDataDirectoryEntry getRoot() { - return rootForNavigation; - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/tools/DatabaseConnection.java b/tools/MapleSkillbookChanceFetcher/src/tools/DatabaseConnection.java deleted file mode 100644 index b887280343..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/tools/DatabaseConnection.java +++ /dev/null @@ -1,51 +0,0 @@ -package tools; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; - -/** - * @author Frz (Big Daddy) - * @author The Real Spookster - some modifications to this beautiful code - */ -public class DatabaseConnection { - private static String DB_URL = "jdbc:mysql://localhost:3306/cosmic"; - private static String DB_USER = "cosmic_server"; - private static String DB_PASS = "snailshell"; - - public static final int RETURN_GENERATED_KEYS = 1; - - private static ThreadLocal con = new ThreadLocalConnection(); - - public static Connection getConnection() { - Connection c = con.get(); - try { - c.getMetaData(); - } catch (SQLException e) { // connection is dead, therefore discard old object 5ever - con.remove(); - c = con.get(); - } - return c; - } - - private static class ThreadLocalConnection extends ThreadLocal { - - @Override - protected Connection initialValue() { - try { - Class.forName("com.mysql.jdbc.Driver"); // touch the mysql driver - } catch (ClassNotFoundException e) { - System.out.println("[SEVERE] SQL Driver Not Found. Consider death by clams."); - e.printStackTrace(); - return null; - } - try { - return DriverManager.getConnection(DB_URL, DB_USER, DB_PASS); - } catch (SQLException e) { - System.out.println("[SEVERE] Unable to make database connection."); - e.printStackTrace(); - return null; - } - } - } -} \ No newline at end of file diff --git a/tools/MapleSkillbookChanceFetcher/src/tools/HexTool.java b/tools/MapleSkillbookChanceFetcher/src/tools/HexTool.java deleted file mode 100644 index 8cc0c8aa84..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/tools/HexTool.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools; - -import java.io.ByteArrayOutputStream; - -public class HexTool { - private static final char[] HEX = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; - - private static String toString(byte byteValue) { - int tmp = byteValue << 8; - char[] retstr = new char[]{HEX[(tmp >> 12) & 0x0F], HEX[(tmp >> 8) & 0x0F]}; - return String.valueOf(retstr); - } - - public static String toString(byte[] bytes) { - StringBuilder hexed = new StringBuilder(); - for (int i = 0; i < bytes.length; i++) { - hexed.append(toString(bytes[i])); - hexed.append(' '); - } - return hexed.substring(0, hexed.length() - 1); - } - - public static byte[] getByteArrayFromHexString(String hex) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - int nexti = 0; - int nextb = 0; - boolean highoc = true; - outer: - for (;;) { - int number = -1; - while (number == -1) { - if (nexti == hex.length()) { - break outer; - } - char chr = hex.charAt(nexti); - if (chr >= '0' && chr <= '9') { - number = chr - '0'; - } else if (chr >= 'a' && chr <= 'f') { - number = chr - 'a' + 10; - } else if (chr >= 'A' && chr <= 'F') { - number = chr - 'A' + 10; - } else { - number = -1; - } - nexti++; - } - if (highoc) { - nextb = number << 4; - highoc = false; - } else { - nextb |= number; - highoc = true; - baos.write(nextb); - } - } - return baos.toByteArray(); - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/tools/Pair.java b/tools/MapleSkillbookChanceFetcher/src/tools/Pair.java deleted file mode 100644 index b127e71110..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/tools/Pair.java +++ /dev/null @@ -1,121 +0,0 @@ -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 ~ 2010 Patrick Huy -Matthias Butz -Jan Christian Meyer - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License version 3 -as published by the Free Software Foundation. You may not use, modify -or distribute this program under any other version of the -GNU Affero General Public License. - -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 . - */ -package tools; - -/** - * Represents a pair of values. - * - * @author Frz - * @since Revision 333 - * @version 1.0 - * - * @param The type of the left value. - * @param The type of the right value. - */ -public class Pair { - - public E left; - public F right; - - /** - * Class constructor - pairs two objects together. - * - * @param left The left object. - * @param right The right object. - */ - public Pair(E left, F right) { - this.left = left; - this.right = right; - } - - /** - * Gets the left value. - * - * @return The left value. - */ - public E getLeft() { - return left; - } - - /** - * Gets the right value. - * - * @return The right value. - */ - public F getRight() { - return right; - } - - /** - * Turns the pair into a string. - * - * @return Each value of the pair as a string joined with a colon. - */ - @Override - public String toString() { - return left.toString() + ":" + right.toString(); - } - - /** - * Gets the hash code of this pair. - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((left == null) ? 0 : left.hashCode()); - result = prime * result + ((right == null) ? 0 : right.hashCode()); - return result; - } - - /** - * Checks to see if two pairs are equal. - */ - @SuppressWarnings("unchecked") - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Pair other = (Pair) obj; - if (left == null) { - if (other.left != null) { - return false; - } - } else if (!left.equals(other.left)) { - return false; - } - if (right == null) { - if (other.right != null) { - return false; - } - } else if (!right.equals(other.right)) { - return false; - } - return true; - } -} \ No newline at end of file diff --git a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/ByteArrayByteStream.java b/tools/MapleSkillbookChanceFetcher/src/tools/data/input/ByteArrayByteStream.java deleted file mode 100644 index eac7de21ea..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/ByteArrayByteStream.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import tools.HexTool; - -public class ByteArrayByteStream implements SeekableInputStreamBytestream { - private int pos = 0; - private long bytesRead = 0; - private byte[] arr; - - public ByteArrayByteStream(byte[] arr) { - this.arr = arr; - } - - @Override - public long getPosition() { - return pos; - } - - @Override - public void seek(long offset) throws IOException { - pos = (int) offset; - } - - @Override - public long getBytesRead() { - return bytesRead; - } - - @Override - public int readByte() { - bytesRead++; - return ((int) arr[pos++]) & 0xFF; - } - - @Override - public String toString() { - String nows = "kevintjuh93 pwns";//I lol'd - if (arr.length - pos > 0) { - byte[] now = new byte[arr.length - pos]; - System.arraycopy(arr, pos, now, 0, arr.length - pos); - nows = HexTool.toString(now); - } - return "All: " + HexTool.toString(arr) + "\nNow: " + nows; - } - - @Override - public long available() { - return arr.length - pos; - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/ByteInputStream.java b/tools/MapleSkillbookChanceFetcher/src/tools/data/input/ByteInputStream.java deleted file mode 100644 index 107f71843e..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/ByteInputStream.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -/** - * Represents an abstract stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public interface ByteInputStream { - int readByte(); - long getBytesRead(); - long available(); -} diff --git a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/GenericLittleEndianAccessor.java b/tools/MapleSkillbookChanceFetcher/src/tools/data/input/GenericLittleEndianAccessor.java deleted file mode 100644 index d08a9b8374..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/GenericLittleEndianAccessor.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.awt.Point; -import java.io.ByteArrayOutputStream; - -/** - * Provides a generic interface to a Little Endian stream of bytes. - * - * @version 1.0 - * @author Frz - * @since Revision 323 - */ -public class GenericLittleEndianAccessor implements LittleEndianAccessor { - private ByteInputStream bs; - - /** - * Class constructor - Wraps the accessor around a stream of bytes. - * - * @param bs The byte stream to wrap the accessor around. - */ - public GenericLittleEndianAccessor(ByteInputStream bs) { - this.bs = bs; - } - - /** - * Read a single byte from the stream. - * - * @return The byte read. - * @see tools.data.input.ByteInputStream#readByte - */ - @Override - public byte readByte() { - return (byte) bs.readByte(); - } - - /** - * Reads an integer from the stream. - * - * @return The integer read. - */ - @Override - public int readInt() { - return bs.readByte() + (bs.readByte() << 8) + (bs.readByte() << 16) + (bs.readByte() << 24); - } - - /** - * Reads a short integer from the stream. - * - * @return The short read. - */ - @Override - public short readShort() { - return (short) (bs.readByte() + (bs.readByte() << 8)); - } - - /** - * Reads a single character from the stream. - * - * @return The character read. - */ - @Override - public char readChar() { - return (char) readShort(); - } - - /** - * Reads a long integer from the stream. - * - * @return The long integer read. - */ - @Override - public long readLong() { - long byte1 = bs.readByte(); - long byte2 = bs.readByte(); - long byte3 = bs.readByte(); - long byte4 = bs.readByte(); - long byte5 = bs.readByte(); - long byte6 = bs.readByte(); - long byte7 = bs.readByte(); - long byte8 = bs.readByte(); - return (byte8 << 56) + (byte7 << 48) + (byte6 << 40) + (byte5 << 32) + (byte4 << 24) + (byte3 << 16) + (byte2 << 8) + byte1; - } - - /** - * Reads a floating point integer from the stream. - * - * @return The float-type integer read. - */ - @Override - public float readFloat() { - return Float.intBitsToFloat(readInt()); - } - - /** - * Reads a double-precision integer from the stream. - * - * @return The double-type integer read. - */ - @Override - public double readDouble() { - return Double.longBitsToDouble(readLong()); - } - - /** - * Reads an ASCII string from the stream with length n. - * - * @param n Number of characters to read. - * @return The string read. - */ - public final String readAsciiString(int n) { - char ret[] = new char[n]; - for (int x = 0; x < n; x++) { - ret[x] = (char) readByte(); - } - return String.valueOf(ret); - } - - /** - * Reads a null-terminated string from the stream. - * - * @return The string read. - */ - public final String readNullTerminatedAsciiString() { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte b; - while (true) { - b = readByte(); - if (b == 0) { - break; - } - baos.write(b); - } - byte[] buf = baos.toByteArray(); - char[] chrBuf = new char[buf.length]; - for (int x = 0; x < buf.length; x++) { - chrBuf[x] = (char) buf[x]; - } - return String.valueOf(chrBuf); - } - - /** - * Gets the number of bytes read from the stream so far. - * - * @return A long integer representing the number of bytes read. - * @see tools.data.input.ByteInputStream#getBytesRead() - */ - public long getBytesRead() { - return bs.getBytesRead(); - } - - /** - * Reads a MapleStory convention lengthed ASCII string. - * This consists of a short integer telling the length of the string, - * then the string itself. - * - * @return The string read. - */ - @Override - public String readMapleAsciiString() { - return readAsciiString(readShort()); - } - - /** - * Reads num bytes off the stream. - * - * @param num The number of bytes to read. - * @return An array of bytes with the length of num - */ - @Override - public byte[] read(int num) { - byte[] ret = new byte[num]; - for (int x = 0; x < num; x++) { - ret[x] = readByte(); - } - return ret; - } - - /** - * Reads a MapleStory Position information. - * This consists of 2 short integer. - * - * @return The Position read. - */ - @Override - public final Point readPos() { - final int x = readShort(); - final int y = readShort(); - return new Point(x, y); - } - - /** - * Skips the current position of the stream num bytes ahead. - * - * @param num Number of bytes to skip. - */ - @Override - public void skip(int num) { - for (int x = 0; x < num; x++) { - readByte(); - } - } - - /** - * @see tools.data.input.ByteInputStream#available - */ - @Override - public long available() { - return bs.available(); - } - - /** - * @see java.lang.Object#toString - */ - @Override - public String toString() { - return bs.toString(); - } -} \ No newline at end of file diff --git a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java b/tools/MapleSkillbookChanceFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java deleted file mode 100644 index fdd147d796..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; - -/** - * Provides an abstract accessor to a generic Little Endian byte stream. This - * accessor is seekable. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - * @see tools.data.input.GenericLittleEndianAccessor - */ -public class GenericSeekableLittleEndianAccessor extends GenericLittleEndianAccessor implements SeekableLittleEndianAccessor { - private SeekableInputStreamBytestream bs; - - /** - * Class constructor - * Provide a seekable input stream to wrap this object around. - * - * @param bs The byte stream to wrap this around. - */ - public GenericSeekableLittleEndianAccessor(SeekableInputStreamBytestream bs) { - super(bs); - this.bs = bs; - } - - /** - * Seek the pointer to offset - * - * @param offset The offset to seek to. - * @see tools.data.input.SeekableInputStreamBytestream#seek - */ - @Override - public void seek(long offset) { - try { - bs.seek(offset); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("Seek failed " + e); - } - } - - /** - * Get the current position of the pointer. - * - * @return The current position of the pointer as a long integer. - * @see tools.data.input.SeekableInputStreamBytestream#getPosition - */ - @Override - public long getPosition() { - try { - return bs.getPosition(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("getPosition failed" + e); - return -1; - } - } - - /** - * Skip num number of bytes in the stream. - * - * @param num The number of bytes to skip. - */ - @Override - public void skip(int num) { - seek(getPosition() + num); - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/InputStreamByteStream.java b/tools/MapleSkillbookChanceFetcher/src/tools/data/input/InputStreamByteStream.java deleted file mode 100644 index 70aef3489f..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/InputStreamByteStream.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Provides an abstract wrapper to a stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class InputStreamByteStream implements ByteInputStream { - private InputStream is; - private long read = 0; - - /** - * Class constructor. - * Provide an input stream to wrap this around. - * - * @param is The input stream to wrap this object around. - */ - public InputStreamByteStream(InputStream is) { - this.is = is; - } - - /** - * Reads the next byte from the stream. - * - * @return Then next byte in the stream. - */ - @Override - public int readByte() { - int temp; - try { - temp = is.read(); - if (temp == -1) { - throw new RuntimeException("EOF"); - } - read++; - return temp; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - /** - * Gets the number of bytes read from the stream. - * - * @return The number of bytes read as a long integer. - */ - @Override - public long getBytesRead() { - return read; - } - - /** - * Returns the number of bytes left in the stream. - * - * @return The number of bytes available for reading as a long integer. - */ - @Override - public long available() { - try { - return is.available(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("ERROR" + e); - return 0; - } - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/LittleEndianAccessor.java b/tools/MapleSkillbookChanceFetcher/src/tools/data/input/LittleEndianAccessor.java deleted file mode 100644 index f991dbf537..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/LittleEndianAccessor.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.awt.Point; - -/** - * @author Frz - */ -public interface LittleEndianAccessor { - byte readByte(); - char readChar(); - short readShort(); - int readInt(); - Point readPos(); - long readLong(); - void skip(int num); - byte[] read(int num); - float readFloat(); - double readDouble(); - String readAsciiString(int n); - String readNullTerminatedAsciiString(); - String readMapleAsciiString(); - long getBytesRead(); - long available(); -} diff --git a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/RandomAccessByteStream.java b/tools/MapleSkillbookChanceFetcher/src/tools/data/input/RandomAccessByteStream.java deleted file mode 100644 index c0004be17f..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/RandomAccessByteStream.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import java.io.RandomAccessFile; - -/** - * Provides an abstract layer to a byte stream. This layer can be accessed - * randomly. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class RandomAccessByteStream implements SeekableInputStreamBytestream { - private RandomAccessFile raf; - private long read = 0; - - public RandomAccessByteStream(RandomAccessFile raf) { - super(); - this.raf = raf; - } - - @Override - public int readByte() { - int temp; - try { - temp = raf.read(); - if (temp == -1) { - throw new RuntimeException("EOF"); - } - read++; - return temp; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public void seek(long offset) throws IOException { - raf.seek(offset); - } - - @Override - public long getPosition() throws IOException { - return raf.getFilePointer(); - } - - @Override - public long getBytesRead() { - return read; - } - - @Override - public long available() { - try { - return raf.length() - raf.getFilePointer(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("ERROR " + e); - return 0; - } - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/SeekableInputStreamBytestream.java b/tools/MapleSkillbookChanceFetcher/src/tools/data/input/SeekableInputStreamBytestream.java deleted file mode 100644 index f4922dc876..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/SeekableInputStreamBytestream.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; - -/** - * Provides an abstract interface to a stream of bytes. This stream can be - * seeked. - * - * @author Frz - * @version 1.0 - * @since 299 - */ -public interface SeekableInputStreamBytestream extends ByteInputStream { - /** - * Seeks the stream by the specified offset. - * - * @param offset - * Number of bytes to seek. - * @throws IOException - */ - void seek(long offset) throws IOException; - - /** - * Gets the current position of the stream. - * - * @return The stream position as a long integer. - * @throws IOException - */ - long getPosition() throws IOException; -} diff --git a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java b/tools/MapleSkillbookChanceFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java deleted file mode 100644 index 16b2317f7a..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -public interface SeekableLittleEndianAccessor extends LittleEndianAccessor { - void seek(long offset); - long getPosition(); -} diff --git a/tools/MapleSkillbookChanceFetcher/src/tools/data/output/BAOSByteOutputStream.java b/tools/MapleSkillbookChanceFetcher/src/tools/data/output/BAOSByteOutputStream.java deleted file mode 100644 index 80cbc9301e..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/tools/data/output/BAOSByteOutputStream.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.io.ByteArrayOutputStream; - -/** - * Uses a byte array to output a stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 352 - */ -class BAOSByteOutputStream implements ByteOutputStream { - private ByteArrayOutputStream baos; - - /** - * Class constructor - Wraps the stream around a Java BAOS. - * - * @param baos The ByteArrayOutputStream to wrap this around. - */ - BAOSByteOutputStream(ByteArrayOutputStream baos) { - super(); - this.baos = baos; - } - - /** - * Writes a byte to the stream. - * - * @param b The byte to write to the stream. - * @see tools.data.output.ByteOutputStream#writeByte(byte) - */ - @Override - public void writeByte(byte b) { - baos.write(b); - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/tools/data/output/ByteOutputStream.java b/tools/MapleSkillbookChanceFetcher/src/tools/data/output/ByteOutputStream.java deleted file mode 100644 index 0df7ca7753..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/tools/data/output/ByteOutputStream.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -/** - * Provides an interface to an output stream of bytes. - * - * @author Frz - * @since Revision 323 - * @version 1.0 - */ -interface ByteOutputStream { - /** - * Writes a byte to the stream. - * - * @param b The byte to write. - */ - void writeByte(byte b); -} diff --git a/tools/MapleSkillbookChanceFetcher/src/tools/data/output/GenericLittleEndianWriter.java b/tools/MapleSkillbookChanceFetcher/src/tools/data/output/GenericLittleEndianWriter.java deleted file mode 100644 index e804fd8000..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/tools/data/output/GenericLittleEndianWriter.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.awt.Point; -import java.nio.charset.Charset; - -/** - * Provides a generic writer of a little-endian sequence of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class GenericLittleEndianWriter implements LittleEndianWriter { - private static Charset ASCII = Charset.forName("US-ASCII"); - private ByteOutputStream bos; - - /** - * Class constructor - Protected to prevent instantiation with no arguments. - */ - protected GenericLittleEndianWriter() { - // Blah! - } - - /** - * Sets the byte-output stream for this instance of the object. - * - * @param bos The new output stream to set. - */ - void setByteOutputStream(ByteOutputStream bos) { - this.bos = bos; - } - - /** - * Write an array of bytes to the stream. - * - * @param b The bytes to write. - */ - @Override - public void write(byte[] b) { - for (int x = 0; x < b.length; x++) { - bos.writeByte(b[x]); - } - } - - /** - * Write a byte to the stream. - * - * @param b The byte to write. - */ - @Override - public void write(byte b) { - bos.writeByte(b); - } - - /** - * Write a byte in integer form to the stream. - * - * @param b The byte as an Integer to write. - */ - @Override - public void write(int b) { - bos.writeByte((byte) b); - } - - @Override - public void skip(int b) { - write(new byte[b]); - } - - /** - * Write a short integer to the stream. - * - * @param i The short integer to write. - */ - @Override - public void writeShort(int i) { - bos.writeByte((byte) (i & 0xFF)); - bos.writeByte((byte) ((i >>> 8) & 0xFF)); - } - - /** - * Writes an integer to the stream. - * - * @param i The integer to write. - */ - @Override - public void writeInt(int i) { - bos.writeByte((byte) (i & 0xFF)); - bos.writeByte((byte) ((i >>> 8) & 0xFF)); - bos.writeByte((byte) ((i >>> 16) & 0xFF)); - bos.writeByte((byte) ((i >>> 24) & 0xFF)); - } - - /** - * Writes an ASCII string the the stream. - * - * @param s The ASCII string to write. - */ - @Override - public void writeAsciiString(String s) { - write(s.getBytes(ASCII)); - } - - /** - * Writes a maple-convention ASCII string to the stream. - * - * @param s The ASCII string to use maple-convention to write. - */ - @Override - public void writeMapleAsciiString(String s) { - writeShort((short) s.length()); - writeAsciiString(s); - } - - /** - * Writes a null-terminated ASCII string to the stream. - * - * @param s The ASCII string to write. - */ - @Override - public void writeNullTerminatedAsciiString(String s) { - writeAsciiString(s); - write(0); - } - - /** - * Write a long integer to the stream. - * @param l The long integer to write. - */ - @Override - public void writeLong(long l) { - bos.writeByte((byte) (l & 0xFF)); - bos.writeByte((byte) ((l >>> 8) & 0xFF)); - bos.writeByte((byte) ((l >>> 16) & 0xFF)); - bos.writeByte((byte) ((l >>> 24) & 0xFF)); - bos.writeByte((byte) ((l >>> 32) & 0xFF)); - bos.writeByte((byte) ((l >>> 40) & 0xFF)); - bos.writeByte((byte) ((l >>> 48) & 0xFF)); - bos.writeByte((byte) ((l >>> 56) & 0xFF)); - } - - /** - * Writes a 2D 4 byte position information - * - * @param s The Point position to write. - */ - @Override - public void writePos(Point s) { - writeShort(s.x); - writeShort(s.y); - } - - /** - * Writes a boolean true ? 1 : 0 - * - * @param b The boolean to write. - */ - @Override - public void writeBool(final boolean b) { - write(b ? 1 : 0); - } -} diff --git a/tools/MapleSkillbookChanceFetcher/src/tools/data/output/LittleEndianWriter.java b/tools/MapleSkillbookChanceFetcher/src/tools/data/output/LittleEndianWriter.java deleted file mode 100644 index f17bd7c72e..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/tools/data/output/LittleEndianWriter.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package tools.data.output; - -import java.awt.Point; - -/** - * Provides an interface to a writer class that writes a little-endian sequence - * of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public interface LittleEndianWriter { - - /** - * Write an array of bytes to the sequence. - * - * @param b The bytes to write. - */ - public void write(byte b[]); - - /** - * Write a byte to the sequence. - * - * @param b The byte to write. - */ - public void write(byte b); - - /** - * Write a byte in integer form to the sequence. - * - * @param b The byte as an Integer to write. - */ - public void write(int b); - - public void skip(int b); - - /** - * Writes an integer to the sequence. - * - * @param i The integer to write. - */ - public void writeInt(int i); - - /** - * Write a short integer to the sequence. - * - * @param s The short integer to write. - */ - public void writeShort(int s); - - /** - * Write a long integer to the sequence. - * - * @param l The long integer to write. - */ - public void writeLong(long l); - - /** - * Writes an ASCII string the the sequence. - * - * @param s The ASCII string to write. - */ - void writeAsciiString(String s); - - /** - * Writes a null-terminated ASCII string to the sequence. - * - * @param s The ASCII string to write. - */ - void writeNullTerminatedAsciiString(String s); - - /** - * Writes a maple-convention ASCII string to the sequence. - * - * @param s The ASCII string to use maple-convention to write. - */ - void writeMapleAsciiString(String s); - - /** - * Writes a 2D 4 byte position information - * - * @param s The Point position to write. - */ - void writePos(Point s); - - /** - * Writes a boolean true ? 1 : 0 - * - * @param b The boolean to write. - */ - void writeBool(final boolean b); -} diff --git a/tools/MapleSkillbookChanceFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java b/tools/MapleSkillbookChanceFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java deleted file mode 100644 index b02365ec62..0000000000 --- a/tools/MapleSkillbookChanceFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.io.ByteArrayOutputStream; -import tools.HexTool; - -/** - * Writes a maplestory-packet little-endian stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 352 - */ -public class MaplePacketLittleEndianWriter extends GenericLittleEndianWriter { - private ByteArrayOutputStream baos; - - /** - * Constructor - initializes this stream with a default size. - */ - public MaplePacketLittleEndianWriter() { - this(32); - } - - /** - * Constructor - initializes this stream with size size. - * - * @param size The size of the underlying stream. - */ - public MaplePacketLittleEndianWriter(int size) { - this.baos = new ByteArrayOutputStream(size); - setByteOutputStream(new BAOSByteOutputStream(baos)); - } - - /** - * Gets a MaplePacket instance representing this - * sequence of bytes. - * - * @return A MaplePacket with the bytes in this stream. - */ - public byte[] getPacket() { - return baos.toByteArray(); - } - - /** - * Changes this packet into a human-readable hexadecimal stream of bytes. - * - * @return This packet as hex digits. - */ - @Override - public String toString() { - return HexTool.toString(baos.toByteArray()); - } -} From 91b2901f0526f0d561e987b4a57ccb13875c8e00 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 14:29:25 +0200 Subject: [PATCH 31/36] Move MapleSkillbookStackUpdate to main module --- .../mapletools/SkillbookStackUpdate.java | 157 +++++++++++++++ .../MapleSkillbookStackUpdate.java | 187 ------------------ 2 files changed, 157 insertions(+), 187 deletions(-) create mode 100644 src/main/java/tools/mapletools/SkillbookStackUpdate.java delete mode 100644 tools/MapleSkillbookStackUpdate/src/mapleskillbookstackupdate/MapleSkillbookStackUpdate.java diff --git a/src/main/java/tools/mapletools/SkillbookStackUpdate.java b/src/main/java/tools/mapletools/SkillbookStackUpdate.java new file mode 100644 index 0000000000..c25609be87 --- /dev/null +++ b/src/main/java/tools/mapletools/SkillbookStackUpdate.java @@ -0,0 +1,157 @@ +package tools.mapletools; + +import provider.wz.WZFiles; + +import java.io.*; +import java.nio.charset.StandardCharsets; + +/** + * @author RonanLana + *

+ * This application parses skillbook XMLs, filling up stack amount of those + * items to 100 (eliminating limitations on held skillbooks, now using + * default stack quantity expected from USE items). + *

+ * Estimated parse time: 10 seconds + */ +public class SkillbookStackUpdate { + private static final File INPUT_DIRECTORY = new File(WZFiles.ITEM.getFile(), "Consume"); + private static final File OUTPUT_DIRECTORY = ToolConstants.getOutputFile("skillbook-update"); + private static final int INITIAL_STRING_LENGTH = 50; + + private static PrintWriter printWriter = null; + private static BufferedReader bufferedReader = null; + private static int status = 0; + + private static boolean isSkillMasteryBook(int itemid) { + return itemid >= 2280000 && itemid < 2300000; + } + + private static String getName(String token) { + int i, j; + char[] dest; + String d; + + i = token.lastIndexOf("name"); + i = token.indexOf("\"", i) + 1; //lower bound of the string + j = token.indexOf("\"", i); //upper bound + + if (j < i) { + return "0"; //node value containing 'name' in it's scope, cheap fix since we don't deal with strings anyway + } + + dest = new char[INITIAL_STRING_LENGTH]; + token.getChars(i, j, dest, 0); + + d = new String(dest); + return (d.trim()); + } + + private static String getValue(String token) { + int i, j; + char[] dest; + String d; + + i = token.lastIndexOf("value"); + i = token.indexOf("\"", i) + 1; //lower bound of the string + j = token.indexOf("\"", i); //upper bound + + dest = new char[INITIAL_STRING_LENGTH]; + token.getChars(i, j, dest, 0); + + d = new String(dest); + return (d.trim()); + } + + private static void forwardCursor(int st) { + String line = null; + + try { + while (status >= st && (line = bufferedReader.readLine()) != null) { + simpleToken(line); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void simpleToken(String token) { + if (token.contains("/imgdir")) { + status -= 1; + } else if (token.contains("imgdir")) { + status += 1; + } + printWriter.println(token); + } + + private static void translateItemToken(String token) { + if (token.contains("/imgdir")) { + status -= 1; + } else if (token.contains("imgdir")) { + status += 1; + + if (status == 2) { //itemid + int itemid = Integer.parseInt(getName(token)); + + if (!isSkillMasteryBook(itemid)) { + printWriter.println(token); + forwardCursor(status); + return; + } + } + } else { + if (status == 3) { + if (getName(token).contentEquals("slotMax")) { + printWriter.println(" "); + return; + } + } + } + + printWriter.println(token); + } + + private static void parseItemFile(File file, File outputFile) { + setupDirectories(outputFile); + // This will reference one line at a time + String line = null; + + try { + printWriter = new PrintWriter(outputFile); + InputStreamReader fileReader = new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8); + bufferedReader = new BufferedReader(fileReader); + + while ((line = bufferedReader.readLine()) != null) { + translateItemToken(line); + } + + bufferedReader.close(); + fileReader.close(); + printWriter.close(); + } catch (IOException ex) { + System.out.println("Error reading file '" + file.getName() + "'"); + ex.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void setupDirectories(File file) { + if (!file.getParentFile().exists()) { + file.getParentFile().mkdirs(); + } + } + + private static void parseItemDirectory(File inputDirectory, File outputDirectory) { + for (File f : inputDirectory.listFiles()) { + parseItemFile(f, new File(outputDirectory, f.getName())); + } + } + + public static void main(String[] args) { + System.out.println("Reading item files..."); + parseItemDirectory(INPUT_DIRECTORY, OUTPUT_DIRECTORY); + System.out.println("Done!"); + } + +} diff --git a/tools/MapleSkillbookStackUpdate/src/mapleskillbookstackupdate/MapleSkillbookStackUpdate.java b/tools/MapleSkillbookStackUpdate/src/mapleskillbookstackupdate/MapleSkillbookStackUpdate.java deleted file mode 100644 index 4fa230f86e..0000000000 --- a/tools/MapleSkillbookStackUpdate/src/mapleskillbookstackupdate/MapleSkillbookStackUpdate.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package mapleskillbookstackupdate; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.PrintWriter; -import java.sql.Connection; - -/** - * - * @author RonanLana - * - * This application parses skillbook XMLs, filling up stack amount of those - * items to 100 (eliminating limitations on held skillbooks, now using - * default stack quantity expected from USE items). - * - * Estimated parse time: 10 seconds - */ -public class MapleSkillbookStackUpdate { - - static String wzPath = "../../wz"; - static String outputWzPath = "lib"; - - - static Connection con = null; - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - - static int initialLength = 200; - static int initialStringLength = 50; - static boolean displayExtraInfo = true; // display items with zero quantity over the quest act WZ - - static int status = 0; - - private static boolean isSkillMasteryBook(int itemid) { - return itemid >= 2280000 && itemid < 2300000; - } - - private static String getName(String token) { - int i, j; - char[] dest; - String d; - - i = token.lastIndexOf("name"); - i = token.indexOf("\"", i) + 1; //lower bound of the string - j = token.indexOf("\"", i); //upper bound - - if(j < i) return "0"; //node value containing 'name' in it's scope, cheap fix since we don't deal with strings anyway - - dest = new char[initialStringLength]; - token.getChars(i, j, dest, 0); - - d = new String(dest); - return(d.trim()); - } - - private static String getValue(String token) { - int i, j; - char[] dest; - String d; - - i = token.lastIndexOf("value"); - i = token.indexOf("\"", i) + 1; //lower bound of the string - j = token.indexOf("\"", i); //upper bound - - dest = new char[initialStringLength]; - token.getChars(i, j, dest, 0); - - d = new String(dest); - return(d.trim()); - } - - private static void forwardCursor(int st) { - String line = null; - - try { - while(status >= st && (line = bufferedReader.readLine()) != null) { - simpleToken(line); - } - } - catch(Exception e) { - e.printStackTrace(); - } - } - - private static void simpleToken(String token) { - if(token.contains("/imgdir")) { - status -= 1; - } - else if(token.contains("imgdir")) { - status += 1; - } - printWriter.println(token); - } - - private static void translateItemToken(String token) { - if(token.contains("/imgdir")) { - status -= 1; - } - else if(token.contains("imgdir")) { - status += 1; - - if(status == 2) { //itemid - int itemid = Integer.valueOf(getName(token)); - - if (!isSkillMasteryBook(itemid)) { - printWriter.println(token); - forwardCursor(status); - return; - } - } - } else { - if(status == 3) { - if (getName(token).contentEquals("slotMax")) { - printWriter.println(" "); - return; - } - } - } - - printWriter.println(token); - } - - private static void parseItemFile(File file, String outputName) { - // This will reference one line at a time - String line = null; - - try { - printWriter = new PrintWriter(outputName); - fileReader = new InputStreamReader(new FileInputStream(file), "UTF-8"); - bufferedReader = new BufferedReader(fileReader); - - while((line = bufferedReader.readLine()) != null) { - translateItemToken(line); - } - - bufferedReader.close(); - fileReader.close(); - printWriter.close(); - } - catch(IOException ex) { - System.out.println("Error reading file '" + file.getName() + "'"); - } - - catch(Exception e) { - e.printStackTrace(); - } - } - - private static void parseItemDirectory(String wzPath, String outputPath) { - File wzDir = new File(wzPath); - - for (File f : wzDir.listFiles()) { - parseItemFile(f, outputPath + f.getName()); - } - - } - - public static void main(String[] args) { - System.out.println("Reading item files..."); - parseItemDirectory(wzPath + "/Item.wz/Consume/", outputWzPath + "/"); - System.out.println("Done!"); - } - -} From 93f067379c523e758938d21f0ad8761fe0d87316 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 14:38:43 +0200 Subject: [PATCH 32/36] Move MapleSkillMakerFetcher to main module --- .../java/tools/mapletools/MakerItemEntry.java | 6 +- .../tools/mapletools/SkillMakerFetcher.java | 319 +- .../MapleSkillMakerFetcher/lib/MakerData.sql | 2866 ----------------- .../MapleItemInformationProvider.java | 201 -- .../src/provider/MapleCanvas.java | 30 - .../src/provider/MapleData.java | 34 - .../src/provider/MapleDataDirectoryEntry.java | 34 - .../src/provider/MapleDataEntity.java | 31 - .../src/provider/MapleDataEntry.java | 33 - .../src/provider/MapleDataFileEntry.java | 30 - .../src/provider/MapleDataProvider.java | 27 - .../provider/MapleDataProviderFactory.java | 55 - .../src/provider/MapleDataTool.java | 145 - .../provider/wz/FileStoredPngMapleCanvas.java | 70 - .../src/provider/wz/ImgMapleSound.java | 39 - .../src/provider/wz/ListWZFile.java | 86 - .../src/provider/wz/MapleDataType.java | 26 - .../src/provider/wz/PNGMapleCanvas.java | 151 - .../src/provider/wz/WZDirectoryEntry.java | 68 - .../src/provider/wz/WZEntry.java | 61 - .../src/provider/wz/WZFile.java | 154 - .../src/provider/wz/WZFileEntry.java | 42 - .../src/provider/wz/WZIMGEntry.java | 118 - .../src/provider/wz/WZIMGFile.java | 227 -- .../src/provider/wz/WZTool.java | 188 -- .../src/provider/wz/XMLDomMapleData.java | 219 -- .../src/provider/wz/XMLWZFile.java | 85 - .../src/tools/HexTool.java | 79 - .../tools/data/input/ByteArrayByteStream.java | 72 - .../src/tools/data/input/ByteInputStream.java | 35 - .../input/GenericLittleEndianAccessor.java | 239 -- .../GenericSeekableLittleEndianAccessor.java | 91 - .../data/input/InputStreamByteStream.java | 93 - .../data/input/LittleEndianAccessor.java | 45 - .../data/input/RandomAccessByteStream.java | 84 - .../input/SeekableInputStreamBytestream.java | 51 - .../input/SeekableLittleEndianAccessor.java | 27 - 37 files changed, 133 insertions(+), 6028 deletions(-) rename tools/MapleSkillMakerFetcher/src/mapleskillmakerfetcher/MapleMakerItemEntry.java => src/main/java/tools/mapletools/MakerItemEntry.java (85%) rename tools/MapleSkillMakerFetcher/src/mapleskillmakerfetcher/MapleSkillMakerFetcher.java => src/main/java/tools/mapletools/SkillMakerFetcher.java (51%) delete mode 100644 tools/MapleSkillMakerFetcher/lib/MakerData.sql delete mode 100644 tools/MapleSkillMakerFetcher/src/mapleskillmakerfetcher/MapleItemInformationProvider.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/MapleCanvas.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/MapleData.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/MapleDataDirectoryEntry.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/MapleDataEntity.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/MapleDataEntry.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/MapleDataFileEntry.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/MapleDataProvider.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/MapleDataProviderFactory.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/MapleDataTool.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/wz/FileStoredPngMapleCanvas.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/wz/ImgMapleSound.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/wz/ListWZFile.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/wz/MapleDataType.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/wz/PNGMapleCanvas.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/wz/WZDirectoryEntry.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/wz/WZEntry.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/wz/WZFile.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/wz/WZFileEntry.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/wz/WZIMGEntry.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/wz/WZIMGFile.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/wz/WZTool.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/wz/XMLDomMapleData.java delete mode 100644 tools/MapleSkillMakerFetcher/src/provider/wz/XMLWZFile.java delete mode 100644 tools/MapleSkillMakerFetcher/src/tools/HexTool.java delete mode 100644 tools/MapleSkillMakerFetcher/src/tools/data/input/ByteArrayByteStream.java delete mode 100644 tools/MapleSkillMakerFetcher/src/tools/data/input/ByteInputStream.java delete mode 100644 tools/MapleSkillMakerFetcher/src/tools/data/input/GenericLittleEndianAccessor.java delete mode 100644 tools/MapleSkillMakerFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java delete mode 100644 tools/MapleSkillMakerFetcher/src/tools/data/input/InputStreamByteStream.java delete mode 100644 tools/MapleSkillMakerFetcher/src/tools/data/input/LittleEndianAccessor.java delete mode 100644 tools/MapleSkillMakerFetcher/src/tools/data/input/RandomAccessByteStream.java delete mode 100644 tools/MapleSkillMakerFetcher/src/tools/data/input/SeekableInputStreamBytestream.java delete mode 100644 tools/MapleSkillMakerFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java diff --git a/tools/MapleSkillMakerFetcher/src/mapleskillmakerfetcher/MapleMakerItemEntry.java b/src/main/java/tools/mapletools/MakerItemEntry.java similarity index 85% rename from tools/MapleSkillMakerFetcher/src/mapleskillmakerfetcher/MapleMakerItemEntry.java rename to src/main/java/tools/mapletools/MakerItemEntry.java index ae3df80725..c021bfb918 100644 --- a/tools/MapleSkillMakerFetcher/src/mapleskillmakerfetcher/MapleMakerItemEntry.java +++ b/src/main/java/tools/mapletools/MakerItemEntry.java @@ -17,7 +17,7 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ -package mapleskillmakerfetcher; +package tools.mapletools; import java.util.List; @@ -25,7 +25,7 @@ import java.util.List; * * @author RonanLana */ -public class MapleMakerItemEntry { +public class MakerItemEntry { public int id = -1; public int itemid = -1; public int reqLevel = -1; @@ -43,7 +43,7 @@ public class MapleMakerItemEntry { public List recipeList = null; public List randomList = null; - public MapleMakerItemEntry(int id, int itemid, int reqLevel, int reqMakerLevel, int reqItem, int reqMeso, int reqEquip, int catalyst, int quantity, int tuc, int recipeCount, int recipeItem, List recipeList, List randomList) { + MakerItemEntry(int id, int itemid, int reqLevel, int reqMakerLevel, int reqItem, int reqMeso, int reqEquip, int catalyst, int quantity, int tuc, int recipeCount, int recipeItem, List recipeList, List randomList) { this.id = id; this.itemid = itemid; this.reqLevel = reqLevel; diff --git a/tools/MapleSkillMakerFetcher/src/mapleskillmakerfetcher/MapleSkillMakerFetcher.java b/src/main/java/tools/mapletools/SkillMakerFetcher.java similarity index 51% rename from tools/MapleSkillMakerFetcher/src/mapleskillmakerfetcher/MapleSkillMakerFetcher.java rename to src/main/java/tools/mapletools/SkillMakerFetcher.java index a2dc506673..4c5a5a63eb 100644 --- a/tools/MapleSkillMakerFetcher/src/mapleskillmakerfetcher/MapleSkillMakerFetcher.java +++ b/src/main/java/tools/mapletools/SkillMakerFetcher.java @@ -1,78 +1,55 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package mapleskillmakerfetcher; +import provider.wz.WZFiles; +import server.MapleItemInformationProvider; +import tools.DatabaseConnection; +import java.io.*; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.io.*; - /** * @author RonanLana - * + *

* The objective of this program is to uncover all maker data from the * ItemMaker.wz.xml files and generate a SQL file with every data info * for the Maker DB tables. - * */ -public class MapleSkillMakerFetcher { - static String host = "jdbc:mysql://localhost:3306/cosmic"; - static String driver = "com.mysql.jdbc.Driver"; - static String username = "cosmic_server"; - static String password = "snailshell"; +public class SkillMakerFetcher { + private static final File INPUT_FILE = new File(WZFiles.ETC.getFile(), "ItemMake.img.xml"); + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("maker-data.sql"); + private static final int INITIAL_STRING_LENGTH = 50; - static String fileName = "../../wz/Etc.wz/ItemMake.img.xml"; - static String newFile = "lib/MakerData.sql"; + private static PrintWriter printWriter = null; + private static BufferedReader bufferedReader = null; + private static byte status = 0; + private static byte state = 0; - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - static byte status = 0; - static byte state = 0; - - static int initialStringLength = 50; - // maker data fields - static int id = -1; - static int itemid = -1; - static int reqLevel = -1; - static int reqMakerLevel = -1; - static int reqItem = -1; - static int reqMeso = -1; - static int reqEquip = -1; - static int catalyst = -1; - static int quantity = -1; - static int tuc = -1; - - static int recipePos = -1; - static int recipeProb = -1; - static int recipeCount = -1; - static int recipeItem = -1; - + private static int id = -1; + private static int itemid = -1; + private static int reqLevel = -1; + private static int reqMakerLevel = -1; + private static int reqItem = -1; + private static int reqMeso = -1; + private static int reqEquip = -1; + private static int catalyst = -1; + private static int quantity = -1; + private static int tuc = -1; + + private static int recipePos = -1; + private static int recipeProb = -1; + private static int recipeCount = -1; + private static int recipeItem = -1; + static List recipeList = null; static List randomList = null; - static List makerList = new ArrayList<>(100); - + static List makerList = new ArrayList<>(100); + private static void resetMakerDataFields() { reqLevel = 0; reqMakerLevel = 0; @@ -82,16 +59,16 @@ public class MapleSkillMakerFetcher { catalyst = 0; quantity = 0; tuc = 0; - + recipePos = 0; recipeProb = 0; recipeCount = 0; recipeItem = 0; - + recipeList = null; randomList = null; } - + private static String getName(String token) { int i, j; char[] dest; @@ -101,16 +78,16 @@ public class MapleSkillMakerFetcher { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); String s = d.trim(); s.replaceFirst("^0+(?!$)", ""); - - return(s); + + return (s); } - + private static String getValue(String token) { int i, j; char[] dest; @@ -120,157 +97,125 @@ public class MapleSkillMakerFetcher { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); String s = d.trim(); s.replaceFirst("^0+(?!$)", ""); - - return(s); + + return (s); } private static int[] generateRecipeItem() { - int pair[] = new int[2]; + int[] pair = new int[2]; pair[0] = recipeItem; pair[1] = recipeCount; - + return pair; } - + private static int[] generateRandomItem() { - int tuple[] = new int[3]; + int[] tuple = new int[3]; tuple[0] = recipeItem; tuple[1] = recipeCount; tuple[2] = recipeProb; - + return tuple; } - + private static void simpleToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; } } - + private static void forwardCursor(int st) { String line = null; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { simpleToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static void translateToken(String token) { String d; - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - - if(status == 2) { //close item maker data + + if (status == 2) { //close item maker data generateUpdatedItemFee(); // for equipments, this will try to update reqMeso to be conformant with the client. - makerList.add(new MapleMakerItemEntry(id, itemid, reqLevel, reqMakerLevel, reqItem, reqMeso, reqEquip, catalyst, quantity, tuc, recipeCount, recipeItem, recipeList, randomList)); + makerList.add(new MakerItemEntry(id, itemid, reqLevel, reqMakerLevel, reqItem, reqMeso, reqEquip, catalyst, quantity, tuc, recipeCount, recipeItem, recipeList, randomList)); resetMakerDataFields(); - } else if(status == 4) { //close recipe/random item - if(state == 0) recipeList.add(generateRecipeItem()); - else if(state == 1) randomList.add(generateRandomItem()); + } else if (status == 4) { //close recipe/random item + if (state == 0) { + recipeList.add(generateRecipeItem()); + } else if (state == 1) { + randomList.add(generateRandomItem()); + } } - } - else if(token.contains("imgdir")) { - if(status == 1) { //getting id + } else if (token.contains("imgdir")) { + if (status == 1) { //getting id d = getName(token); id = Integer.parseInt(d); System.out.println("Parsing maker id " + id); - } - else if(status == 2) { //getting target item id + } else if (status == 2) { //getting target item id d = getName(token); itemid = Integer.parseInt(d); - } - else if(status == 3) { + } else if (status == 3) { d = getName(token); - - switch(d) { - case "recipe": + + switch (d) { + case "recipe" -> { recipeList = new LinkedList<>(); state = 0; - break; - - case "randomReward": + } + case "randomReward" -> { randomList = new LinkedList<>(); state = 1; - break; - - default: - forwardCursor(3); // unused content, read until end of block - break; + } + default -> forwardCursor(3); // unused content, read until end of block } - } - else if(status == 4) { // inside recipe/random + } else if (status == 4) { // inside recipe/random d = getName(token); recipePos = Integer.parseInt(d); } - + status += 1; } else { - if(status == 3) { + if (status == 3) { d = getName(token); - - switch(d) { - case "itemNum": - quantity = Integer.valueOf(getValue(token)); - break; - - case "meso": - reqMeso = Integer.valueOf(getValue(token)); - break; - - case "reqItem": - reqItem = Integer.valueOf(getValue(token)); - break; - - case "reqLevel": - reqLevel = Integer.valueOf(getValue(token)); - break; - - case "reqSkillLevel": - reqMakerLevel = Integer.valueOf(getValue(token)); - break; - - case "tuc": - tuc = Integer.valueOf(getValue(token)); - break; - - case "catalyst": - catalyst = Integer.valueOf(getValue(token)); - break; - - case "reqEquip": - reqEquip = Integer.valueOf(getValue(token)); - break; - - default: + + switch (d) { + case "itemNum" -> quantity = Integer.parseInt(getValue(token)); + case "meso" -> reqMeso = Integer.parseInt(getValue(token)); + case "reqItem" -> reqItem = Integer.parseInt(getValue(token)); + case "reqLevel" -> reqLevel = Integer.parseInt(getValue(token)); + case "reqSkillLevel" -> reqMakerLevel = Integer.parseInt(getValue(token)); + case "tuc" -> tuc = Integer.parseInt(getValue(token)); + case "catalyst" -> catalyst = Integer.parseInt(getValue(token)); + case "reqEquip" -> reqEquip = Integer.parseInt(getValue(token)); + default -> { System.out.println("Unhandled case: '" + d + "'"); state = 2; - break; + } } - } - else if(status == 5) { // inside recipe/random item + } else if (status == 5) { // inside recipe/random item d = getName(token); - if(d.equals("item")) { + if (d.equals("item")) { recipeItem = Integer.parseInt(getValue(token)); } else { - if(state == 0) { + if (state == 0) { recipeCount = Integer.parseInt(getValue(token)); } else { - if(d.equals("itemNum")) { + if (d.equals("itemNum")) { recipeCount = Integer.parseInt(getValue(token)); } else { recipeProb = Integer.parseInt(getValue(token)); @@ -280,17 +225,17 @@ public class MapleSkillMakerFetcher { } } } - + private static void generateUpdatedItemFee() { MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); float adjPrice = reqMeso; - - if(itemid < 2000000) { + + if (itemid < 2000000) { Map stats = ii.getEquipStats(itemid); - if(stats != null) { + if (stats != null) { int val = itemid / 100000; - - if(val == 13 || val == 14) { // is weapon-type + + if (val == 13 || val == 14) { // is weapon-type adjPrice /= 10; adjPrice += reqMeso; @@ -314,82 +259,78 @@ public class MapleSkillMakerFetcher { reqMeso = 1000 * (int) Math.ceil(adjPrice); } } - + private static void WriteMakerTableFile() { printWriter.println(" # SQL File autogenerated from the MapleSkillMakerFetcher feature by Ronan Lana."); printWriter.println(" # Generated data is conformant with the ItemMake.img.xml file used to compile this."); printWriter.println(); - + StringBuilder sb_create = new StringBuilder("INSERT IGNORE INTO `makercreatedata` (`id`, `itemid`, `req_level`, `req_maker_level`, `req_meso`, `req_item`, `req_equip`, `catalyst`, `quantity`, `tuc`) VALUES\r\n"); StringBuilder sb_recipe = new StringBuilder("INSERT IGNORE INTO `makerrecipedata` (`itemid`, `req_item`, `count`) VALUES\r\n"); StringBuilder sb_reward = new StringBuilder("INSERT IGNORE INTO `makerrewarddata` (`itemid`, `rewardid`, `quantity`, `prob`) VALUES\r\n"); - - for(MapleMakerItemEntry it : makerList) { + + for (MakerItemEntry it : makerList) { sb_create.append(" (" + it.id + ", " + it.itemid + ", " + it.reqLevel + ", " + it.reqMakerLevel + ", " + it.reqMeso + ", " + it.reqItem + ", " + it.reqEquip + ", " + it.catalyst + ", " + it.quantity + ", " + it.tuc + "),\r\n"); - - if(it.recipeList != null) { - for(int[] rit : it.recipeList) { - sb_recipe.append(" (" + it.itemid + ", " + rit[0] + ", " + rit[1] + "),\r\n"); + + if (it.recipeList != null) { + for (int[] rit : it.recipeList) { + sb_recipe.append(" (" + it.itemid + ", " + rit[0] + ", " + rit[1] + "),\r\n"); } } - - if(it.randomList != null) { - for(int[] rit : it.randomList) { + + if (it.randomList != null) { + for (int[] rit : it.randomList) { sb_reward.append(" (" + it.itemid + ", " + rit[0] + ", " + rit[1] + ", " + rit[2] + "),\r\n"); } } } - + sb_create.setLength(sb_create.length() - 3); sb_create.append(";\r\n"); - + sb_recipe.setLength(sb_recipe.length() - 3); sb_recipe.append(";\r\n"); - + sb_reward.setLength(sb_reward.length() - 3); sb_reward.append(";"); - + printWriter.println(sb_create); printWriter.println(sb_recipe); printWriter.println(sb_reward); } - private static void WriteMakerTableData() { + private static void writeMakerTableData() { // This will reference one line at a time String line = null; try { - printWriter = new PrintWriter(newFile, "UTF-8"); - fileReader = new InputStreamReader(new FileInputStream(fileName), "UTF-8"); + printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); + InputStreamReader fileReader = new InputStreamReader(new FileInputStream(INPUT_FILE), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); resetMakerDataFields(); - - while((line = bufferedReader.readLine()) != null) { + + while ((line = bufferedReader.readLine()) != null) { translateToken(line); } - + WriteMakerTableFile(); printWriter.close(); bufferedReader.close(); fileReader.close(); - } - - catch(FileNotFoundException ex) { - System.out.println("Unable to open file '" + fileName + "'"); - } - catch(IOException ex) { - System.out.println("Error reading file '" + fileName + "'"); - } - - catch(Exception e) { + } catch (FileNotFoundException ex) { + System.out.println("Unable to open file '" + INPUT_FILE + "'"); + } catch (IOException ex) { + System.out.println("Error reading file '" + INPUT_FILE + "'"); + } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { - WriteMakerTableData(); + DatabaseConnection.initializeConnectionPool(); // Using MapleItemInformationProvider which loads som unrelated things from the db + writeMakerTableData(); } - } + diff --git a/tools/MapleSkillMakerFetcher/lib/MakerData.sql b/tools/MapleSkillMakerFetcher/lib/MakerData.sql deleted file mode 100644 index 72806f71b6..0000000000 --- a/tools/MapleSkillMakerFetcher/lib/MakerData.sql +++ /dev/null @@ -1,2866 +0,0 @@ - # SQL File autogenerated from the MapleSkillMakerFetcher feature by Ronan Lana. - # Generated data is conformant with the ItemMake.img.xml file used to compile this. - -INSERT IGNORE INTO `makercreatedata` (`id`, `itemid`, `req_level`, `req_maker_level`, `req_meso`, `req_item`, `req_equip`, `catalyst`, `quantity`, `tuc`) VALUES - (0, 4250000, 45, 1, 110000, 0, 0, 0, 1, 0), - (0, 4250100, 45, 1, 110000, 0, 0, 0, 1, 0), - (0, 4250200, 45, 1, 110000, 0, 0, 0, 1, 0), - (0, 4250300, 45, 1, 110000, 0, 0, 0, 1, 0), - (0, 4250400, 45, 1, 110000, 0, 0, 0, 1, 0), - (0, 4250500, 45, 1, 110000, 0, 0, 0, 1, 0), - (0, 4250600, 45, 1, 110000, 0, 0, 0, 1, 0), - (0, 4250700, 45, 1, 110000, 0, 0, 0, 1, 0), - (0, 4250800, 45, 1, 110000, 0, 0, 0, 1, 0), - (0, 4250900, 45, 1, 110000, 0, 0, 0, 1, 0), - (0, 4251000, 45, 1, 110000, 0, 0, 0, 1, 0), - (0, 4251100, 45, 1, 110000, 0, 0, 0, 1, 0), - (0, 4251300, 75, 2, 165000, 0, 0, 0, 1, 0), - (0, 4251400, 75, 2, 165000, 0, 0, 0, 1, 0), - (0, 4250001, 45, 1, 330000, 0, 0, 0, 1, 0), - (0, 4250101, 45, 1, 330000, 0, 0, 0, 1, 0), - (0, 4250201, 45, 1, 330000, 0, 0, 0, 1, 0), - (0, 4250301, 45, 1, 330000, 0, 0, 0, 1, 0), - (0, 4250401, 45, 1, 330000, 0, 0, 0, 1, 0), - (0, 4250501, 45, 1, 330000, 0, 0, 0, 1, 0), - (0, 4250601, 45, 1, 330000, 0, 0, 0, 1, 0), - (0, 4250701, 45, 1, 330000, 0, 0, 0, 1, 0), - (0, 4250801, 45, 1, 330000, 0, 0, 0, 1, 0), - (0, 4250901, 45, 1, 330000, 0, 0, 0, 1, 0), - (0, 4251001, 45, 1, 330000, 0, 0, 0, 1, 0), - (0, 4251101, 45, 1, 330000, 0, 0, 0, 1, 0), - (0, 4251301, 75, 2, 495000, 0, 0, 0, 1, 0), - (0, 4251401, 75, 2, 495000, 0, 0, 0, 1, 0), - (0, 4250002, 45, 2, 550000, 0, 0, 0, 1, 0), - (0, 4250102, 45, 2, 550000, 0, 0, 0, 1, 0), - (0, 4250202, 45, 2, 550000, 0, 0, 0, 1, 0), - (0, 4250302, 45, 2, 550000, 0, 0, 0, 1, 0), - (0, 4250402, 45, 2, 550000, 0, 0, 0, 1, 0), - (0, 4250502, 45, 2, 550000, 0, 0, 0, 1, 0), - (0, 4250602, 45, 2, 550000, 0, 0, 0, 1, 0), - (0, 4250702, 45, 2, 550000, 0, 0, 0, 1, 0), - (0, 4250802, 45, 2, 550000, 0, 0, 0, 1, 0), - (0, 4250902, 45, 2, 550000, 0, 0, 0, 1, 0), - (0, 4251002, 45, 2, 550000, 0, 0, 0, 1, 0), - (0, 4251102, 45, 2, 550000, 0, 0, 0, 1, 0), - (0, 4251302, 75, 3, 825000, 0, 0, 0, 1, 0), - (0, 4251402, 75, 3, 825000, 0, 0, 0, 1, 0), - (0, 4001174, 45, 1, 0, 4031966, 0, 0, 1, 0), - (0, 4001175, 50, 1, 0, 4031967, 0, 0, 1, 0), - (0, 4001176, 55, 1, 0, 4031968, 0, 0, 10, 0), - (0, 4001177, 60, 1, 0, 4031969, 0, 0, 100, 0), - (0, 4001178, 65, 1, 0, 4031970, 0, 0, 5, 0), - (0, 4001179, 70, 1, 0, 4031971, 0, 0, 7, 0), - (0, 4001180, 75, 2, 0, 4031972, 0, 0, 1, 0), - (0, 4001181, 80, 2, 0, 4031973, 0, 0, 1, 0), - (0, 4001182, 85, 2, 0, 4031974, 0, 0, 6, 0), - (0, 4001183, 90, 2, 0, 4031975, 0, 0, 30, 0), - (0, 4001184, 95, 2, 0, 4031976, 0, 0, 2, 0), - (0, 4001185, 100, 2, 0, 4031977, 0, 0, 1, 0), - (0, 4031980, 105, 2, 0, 4031979, 0, 0, 1, 0), - (0, 4001186, 105, 3, 0, 4031978, 0, 0, 1, 0), - (0, 4032334, 150, 1, 0, 0, 0, 0, 1, 0), - (0, 4032312, 70, 1, 0, 0, 0, 0, 1, 0), - (0, 2041058, 50, 1, 55000, 0, 1122013, 0, 1, 0), - (0, 2040727, 50, 1, 55000, 0, 1122013, 0, 1, 0), - (0, 4260007, 105, 3, 2200000, 4001126, 0, 0, 5, 0), - (0, 4260008, 105, 3, 5500000, 4001126, 0, 0, 10, 0), - (1, 1002028, 45, 1, 55000, 0, 0, 4130018, 1, 1), - (1, 1002085, 45, 1, 50000, 0, 0, 4130018, 1, 1), - (1, 1002086, 45, 1, 41000, 0, 0, 4130018, 1, 1), - (1, 1002022, 50, 1, 60000, 0, 0, 4130018, 1, 1), - (1, 1002100, 50, 1, 60000, 0, 0, 4130018, 1, 1), - (1, 1002101, 50, 1, 60000, 0, 0, 4130018, 1, 1), - (1, 1002029, 55, 1, 82000, 0, 0, 4130018, 1, 1), - (1, 1002084, 55, 1, 82000, 0, 0, 4130018, 1, 1), - (1, 1002030, 65, 1, 93000, 0, 0, 4130018, 1, 1), - (1, 1002094, 65, 1, 93000, 0, 0, 4130018, 1, 1), - (1, 1002095, 65, 1, 93000, 0, 0, 4130018, 1, 1), - (1, 1002338, 75, 2, 146000, 0, 0, 4130018, 1, 2), - (1, 1002339, 75, 2, 146000, 0, 0, 4130018, 1, 2), - (1, 1002340, 75, 2, 146000, 0, 0, 4130018, 1, 2), - (1, 1002528, 85, 2, 161000, 0, 0, 4130018, 1, 2), - (1, 1002529, 85, 2, 161000, 0, 0, 4130018, 1, 2), - (1, 1002530, 85, 2, 161000, 0, 0, 4130018, 1, 2), - (1, 1002531, 85, 2, 161000, 0, 0, 4130018, 1, 2), - (1, 1002532, 85, 2, 161000, 0, 0, 4130018, 1, 2), - (1, 1002377, 95, 2, 184000, 0, 0, 4130018, 1, 2), - (1, 1002378, 95, 2, 184000, 0, 0, 4130018, 1, 2), - (1, 1002379, 95, 2, 184000, 0, 0, 4130018, 1, 2), - (1, 1002551, 105, 3, 308000, 0, 0, 4130018, 1, 3), - (1, 1002790, 115, 3, 352000, 0, 0, 4130018, 1, 3), - (1, 1002776, 115, 3, 352000, 0, 0, 4130018, 1, 3), - (1, 1040087, 45, 1, 41000, 0, 0, 4130019, 1, 1), - (1, 1040088, 45, 1, 41000, 0, 0, 4130019, 1, 1), - (1, 1040089, 45, 1, 41000, 0, 0, 4130019, 1, 1), - (1, 1041087, 45, 1, 41000, 0, 0, 4130019, 1, 1), - (1, 1041088, 45, 1, 41000, 0, 0, 4130019, 1, 1), - (1, 1041089, 45, 1, 41000, 0, 0, 4130019, 1, 1), - (1, 1040090, 55, 1, 50000, 0, 0, 4130019, 1, 1), - (1, 1040091, 55, 1, 50000, 0, 0, 4130019, 1, 1), - (1, 1040092, 55, 1, 50000, 0, 0, 4130019, 1, 1), - (1, 1040093, 55, 1, 50000, 0, 0, 4130019, 1, 1), - (1, 1041091, 55, 1, 50000, 0, 0, 4130019, 1, 1), - (1, 1041092, 55, 1, 50000, 0, 0, 4130019, 1, 1), - (1, 1041093, 55, 1, 50000, 0, 0, 4130019, 1, 1), - (1, 1040102, 65, 1, 55000, 0, 0, 4130019, 1, 1), - (1, 1040103, 65, 1, 55000, 0, 0, 4130019, 1, 1), - (1, 1040104, 65, 1, 55000, 0, 0, 4130019, 1, 1), - (1, 1041097, 65, 1, 55000, 0, 0, 4130019, 1, 1), - (1, 1041098, 65, 1, 55000, 0, 0, 4130019, 1, 1), - (1, 1041099, 65, 1, 55000, 0, 0, 4130019, 1, 1), - (1, 1040111, 85, 2, 123000, 0, 0, 4130019, 1, 2), - (1, 1040112, 85, 2, 123000, 0, 0, 4130019, 1, 2), - (1, 1040113, 85, 2, 123000, 0, 0, 4130019, 1, 2), - (1, 1041119, 85, 2, 146000, 0, 0, 4130019, 1, 2), - (1, 1041120, 85, 2, 146000, 0, 0, 4130019, 1, 2), - (1, 1041121, 85, 2, 146000, 0, 0, 4130019, 1, 2), - (1, 1040120, 95, 2, 153000, 0, 0, 4130019, 1, 2), - (1, 1040121, 95, 2, 153000, 0, 0, 4130019, 1, 2), - (1, 1040122, 95, 2, 153000, 0, 0, 4130019, 1, 2), - (1, 1041122, 95, 2, 153000, 0, 0, 4130019, 1, 2), - (1, 1041123, 95, 2, 153000, 0, 0, 4130019, 1, 2), - (1, 1041124, 95, 2, 153000, 0, 0, 4130019, 1, 2), - (1, 1060076, 45, 1, 33000, 0, 0, 4130020, 1, 1), - (1, 1060077, 45, 1, 33000, 0, 0, 4130020, 1, 1), - (1, 1060078, 45, 1, 33000, 0, 0, 4130020, 1, 1), - (1, 1061086, 45, 1, 33000, 0, 0, 4130020, 1, 1), - (1, 1061087, 45, 1, 33000, 0, 0, 4130020, 1, 1), - (1, 1061088, 45, 1, 33000, 0, 0, 4130020, 1, 1), - (1, 1060079, 55, 1, 41000, 0, 0, 4130020, 1, 1), - (1, 1060080, 55, 1, 41000, 0, 0, 4130020, 1, 1), - (1, 1060081, 55, 1, 41000, 0, 0, 4130020, 1, 1), - (1, 1060082, 55, 1, 41000, 0, 0, 4130020, 1, 1), - (1, 1061090, 55, 1, 41000, 0, 0, 4130020, 1, 1), - (1, 1061091, 55, 1, 41000, 0, 0, 4130020, 1, 1), - (1, 1061092, 55, 1, 41000, 0, 0, 4130020, 1, 1), - (1, 1060090, 65, 1, 50000, 0, 0, 4130020, 1, 1), - (1, 1060091, 65, 1, 50000, 0, 0, 4130020, 1, 1), - (1, 1060092, 65, 1, 50000, 0, 0, 4130020, 1, 1), - (1, 1061096, 65, 1, 50000, 0, 0, 4130020, 1, 1), - (1, 1061097, 65, 1, 50000, 0, 0, 4130020, 1, 1), - (1, 1061098, 65, 1, 50000, 0, 0, 4130020, 1, 1), - (1, 1060100, 85, 2, 107000, 0, 0, 4130020, 1, 2), - (1, 1060101, 85, 2, 107000, 0, 0, 4130020, 1, 2), - (1, 1060102, 85, 2, 107000, 0, 0, 4130020, 1, 2), - (1, 1061118, 85, 2, 130000, 0, 0, 4130020, 1, 2), - (1, 1061119, 85, 2, 130000, 0, 0, 4130020, 1, 2), - (1, 1061120, 85, 2, 130000, 0, 0, 4130020, 1, 2), - (1, 1060109, 95, 2, 138000, 0, 0, 4130020, 1, 2), - (1, 1060110, 95, 2, 138000, 0, 0, 4130020, 1, 2), - (1, 1060111, 95, 2, 138000, 0, 0, 4130020, 1, 2), - (1, 1061121, 95, 2, 138000, 0, 0, 4130020, 1, 2), - (1, 1061122, 95, 2, 138000, 0, 0, 4130020, 1, 2), - (1, 1061123, 95, 2, 138000, 0, 0, 4130020, 1, 2), - (1, 1050080, 75, 2, 138000, 0, 0, 4130021, 1, 2), - (1, 1050081, 75, 2, 138000, 0, 0, 4130021, 1, 2), - (1, 1050082, 75, 2, 138000, 0, 0, 4130021, 1, 2), - (1, 1050083, 75, 2, 138000, 0, 0, 4130021, 1, 2), - (1, 1051077, 75, 2, 138000, 0, 0, 4130021, 1, 2), - (1, 1051078, 75, 2, 138000, 0, 0, 4130021, 1, 2), - (1, 1051079, 75, 2, 138000, 0, 0, 4130021, 1, 2), - (1, 1051080, 75, 2, 138000, 0, 0, 4130021, 1, 2), - (1, 1052075, 105, 3, 352000, 0, 0, 4130021, 1, 3), - (1, 1052160, 115, 3, 418000, 0, 0, 4130021, 1, 3), - (1, 1052155, 115, 3, 418000, 0, 0, 4130021, 1, 3), - (1, 1072132, 45, 1, 30000, 0, 0, 4130001, 1, 1), - (1, 1072133, 45, 1, 30000, 0, 0, 4130001, 1, 1), - (1, 1072134, 45, 1, 30000, 0, 0, 4130001, 1, 1), - (1, 1072135, 45, 1, 30000, 0, 0, 4130001, 1, 1), - (1, 1072147, 55, 1, 39000, 0, 0, 4130001, 1, 1), - (1, 1072148, 55, 1, 39000, 0, 0, 4130001, 1, 1), - (1, 1072149, 55, 1, 39000, 0, 0, 4130001, 1, 1), - (1, 1072154, 65, 1, 47000, 0, 0, 4130001, 1, 1), - (1, 1072155, 65, 1, 47000, 0, 0, 4130001, 1, 1), - (1, 1072156, 65, 1, 47000, 0, 0, 4130001, 1, 1), - (1, 1072210, 75, 2, 84000, 0, 0, 4130001, 1, 2), - (1, 1072211, 75, 2, 84000, 0, 0, 4130001, 1, 2), - (1, 1072212, 75, 2, 84000, 0, 0, 4130001, 1, 2), - (1, 1072196, 85, 2, 115000, 0, 0, 4130001, 1, 2), - (1, 1072197, 85, 2, 115000, 0, 0, 4130001, 1, 2), - (1, 1072198, 85, 2, 115000, 0, 0, 4130001, 1, 2), - (1, 1072220, 95, 2, 138000, 0, 0, 4130001, 1, 2), - (1, 1072221, 95, 2, 138000, 0, 0, 4130001, 1, 2), - (1, 1072222, 95, 2, 138000, 0, 0, 4130001, 1, 2), - (1, 1072273, 105, 3, 231000, 0, 0, 4130001, 1, 3), - (1, 1072361, 115, 3, 264000, 0, 0, 4130001, 1, 3), - (1, 1072355, 115, 3, 264000, 0, 0, 4130001, 1, 3), - (1, 1082009, 45, 1, 50000, 0, 0, 4130000, 1, 1), - (1, 1082010, 45, 1, 55000, 0, 0, 4130000, 1, 1), - (1, 1082011, 45, 1, 60000, 0, 0, 4130000, 1, 1), - (1, 1082059, 55, 1, 66000, 0, 0, 4130000, 1, 1), - (1, 1082060, 55, 1, 71000, 0, 0, 4130000, 1, 1), - (1, 1082061, 55, 1, 77000, 0, 0, 4130000, 1, 1), - (1, 1082103, 65, 1, 82000, 0, 0, 4130000, 1, 1), - (1, 1082104, 65, 1, 88000, 0, 0, 4130000, 1, 1), - (1, 1082105, 65, 1, 93000, 0, 0, 4130000, 1, 1), - (1, 1082114, 75, 2, 161000, 0, 0, 4130000, 1, 2), - (1, 1082115, 75, 2, 165000, 0, 0, 4130000, 1, 2), - (1, 1082116, 75, 2, 168000, 0, 0, 4130000, 1, 2), - (1, 1082117, 75, 2, 168000, 0, 0, 4130000, 1, 2), - (1, 1082128, 85, 2, 184000, 0, 0, 4130000, 1, 2), - (1, 1082129, 85, 2, 188000, 0, 0, 4130000, 1, 2), - (1, 1082130, 85, 2, 191000, 0, 0, 4130000, 1, 2), - (1, 1082139, 95, 2, 207000, 0, 0, 4130000, 1, 2), - (1, 1082140, 95, 2, 210000, 0, 0, 4130000, 1, 2), - (1, 1082141, 95, 2, 214000, 0, 0, 4130000, 1, 2), - (1, 1082168, 105, 3, 330000, 0, 0, 4130000, 1, 3), - (1, 1082239, 115, 3, 363000, 0, 0, 4130000, 1, 3), - (1, 1082234, 115, 3, 363000, 0, 0, 4130000, 1, 3), - (1, 1092004, 45, 1, 82000, 0, 0, 4130022, 1, 1), - (1, 1092009, 55, 1, 99000, 0, 0, 4130022, 1, 1), - (1, 1092010, 55, 1, 104000, 0, 0, 4130022, 1, 1), - (1, 1092011, 55, 1, 104000, 0, 0, 4130022, 1, 1), - (1, 1092015, 65, 1, 110000, 0, 0, 4130022, 1, 1), - (1, 1092016, 65, 1, 115000, 0, 0, 4130022, 1, 1), - (1, 1092017, 65, 1, 115000, 0, 0, 4130022, 1, 1), - (1, 1092023, 75, 2, 168000, 0, 0, 4130022, 1, 2), - (1, 1092024, 75, 2, 176000, 0, 0, 4130022, 1, 2), - (1, 1092025, 75, 2, 176000, 0, 0, 4130022, 1, 2), - (1, 1092026, 85, 2, 184000, 0, 0, 4130022, 1, 2), - (1, 1092027, 85, 2, 191000, 0, 0, 4130022, 1, 2), - (1, 1092028, 85, 2, 191000, 0, 0, 4130022, 1, 2), - (1, 1092036, 95, 2, 199000, 0, 0, 4130022, 1, 2), - (1, 1092037, 95, 2, 207000, 0, 0, 4130022, 1, 2), - (1, 1092038, 95, 2, 214000, 0, 0, 4130022, 1, 2), - (1, 1092060, 105, 3, 231000, 0, 0, 4130022, 1, 3), - (1, 1092058, 115, 3, 385000, 0, 0, 4130022, 1, 3), - (1, 1302010, 45, 1, 66000, 0, 0, 4130002, 1, 1), - (1, 1312008, 45, 1, 77000, 0, 0, 4130003, 1, 1), - (1, 1322017, 45, 1, 77000, 0, 0, 4130004, 1, 1), - (1, 1402003, 45, 1, 110000, 0, 0, 4130005, 1, 1), - (1, 1412003, 45, 1, 77000, 0, 0, 4130006, 1, 1), - (1, 1422005, 45, 1, 82000, 0, 0, 4130007, 1, 1), - (1, 1432004, 45, 1, 82000, 0, 0, 4130008, 1, 1), - (1, 1442005, 45, 1, 82000, 0, 0, 4130009, 1, 1), - (1, 1302011, 55, 1, 82000, 0, 0, 4130002, 1, 1), - (1, 1312009, 55, 1, 104000, 0, 0, 4130003, 1, 1), - (1, 1322018, 55, 1, 104000, 0, 0, 4130004, 1, 1), - (1, 1402011, 55, 1, 126000, 0, 0, 4130005, 1, 1), - (1, 1412007, 55, 1, 104000, 0, 0, 4130006, 1, 1), - (1, 1422009, 55, 1, 104000, 0, 0, 4130007, 1, 1), - (1, 1432006, 55, 1, 104000, 0, 0, 4130008, 1, 1), - (1, 1442010, 55, 1, 137000, 0, 0, 4130009, 1, 1), - (1, 1302012, 65, 1, 137000, 0, 0, 4130002, 1, 1), - (1, 1312010, 65, 1, 165000, 0, 0, 4130003, 1, 1), - (1, 1322019, 65, 1, 137000, 0, 0, 4130004, 1, 1), - (1, 1402012, 65, 1, 143000, 0, 0, 4130005, 1, 1), - (1, 1412008, 65, 1, 137000, 0, 0, 4130006, 1, 1), - (1, 1422010, 65, 1, 137000, 0, 0, 4130007, 1, 1), - (1, 1432007, 65, 1, 137000, 0, 0, 4130008, 1, 1), - (1, 1442008, 65, 1, 165000, 0, 0, 4130009, 1, 1), - (1, 1322020, 70, 1, 165000, 0, 0, 4130004, 1, 1), - (1, 1302018, 75, 2, 231000, 0, 0, 4130002, 1, 2), - (1, 1312011, 75, 2, 269000, 0, 0, 4130003, 1, 2), - (1, 1322028, 75, 2, 269000, 0, 0, 4130004, 1, 2), - (1, 1402004, 75, 2, 231000, 0, 0, 4130005, 1, 2), - (1, 1402015, 75, 2, 231000, 0, 0, 4130005, 1, 2), - (1, 1412009, 75, 2, 238000, 0, 0, 4130006, 1, 2), - (1, 1422012, 75, 2, 238000, 0, 0, 4130007, 1, 2), - (1, 1432010, 75, 2, 238000, 0, 0, 4130008, 1, 2), - (1, 1442019, 75, 2, 269000, 0, 0, 4130009, 1, 2), - (1, 1302023, 85, 2, 269000, 0, 0, 4130002, 1, 2), - (1, 1312015, 85, 2, 308000, 0, 0, 4130003, 1, 2), - (1, 1322029, 85, 2, 308000, 0, 0, 4130004, 1, 2), - (1, 1402005, 85, 2, 308000, 0, 0, 4130005, 1, 2), - (1, 1402016, 85, 2, 308000, 0, 0, 4130005, 1, 2), - (1, 1412010, 85, 2, 284000, 0, 0, 4130006, 1, 2), - (1, 1422013, 85, 2, 284000, 0, 0, 4130007, 1, 2), - (1, 1432011, 85, 2, 284000, 0, 0, 4130008, 1, 2), - (1, 1442020, 85, 2, 346000, 0, 0, 4130009, 1, 2), - (1, 1302056, 95, 2, 369000, 0, 0, 4130002, 1, 2), - (1, 1312030, 95, 2, 361000, 0, 0, 4130003, 1, 2), - (1, 1322045, 95, 2, 361000, 0, 0, 4130004, 1, 2), - (1, 1402035, 95, 2, 361000, 0, 0, 4130005, 1, 2), - (1, 1412021, 95, 2, 377000, 0, 0, 4130006, 1, 2), - (1, 1422027, 95, 2, 346000, 0, 0, 4130007, 1, 2), - (1, 1432030, 95, 2, 377000, 0, 0, 4130008, 1, 2), - (1, 1442044, 95, 2, 361000, 0, 0, 4130009, 1, 2), - (1, 1302059, 105, 3, 605000, 0, 0, 4130002, 1, 3), - (1, 1312031, 105, 3, 583000, 0, 0, 4130003, 1, 3), - (1, 1322052, 105, 3, 528000, 0, 0, 4130004, 1, 3), - (1, 1402036, 105, 3, 605000, 0, 0, 4130005, 1, 3), - (1, 1412026, 105, 3, 572000, 0, 0, 4130006, 1, 3), - (1, 1422028, 105, 3, 561000, 0, 0, 4130007, 1, 3), - (1, 1432038, 105, 3, 583000, 0, 0, 4130008, 1, 3), - (1, 1442045, 105, 3, 627000, 0, 0, 4130009, 1, 3), - (1, 1302086, 115, 3, 748000, 0, 0, 4130002, 1, 3), - (1, 1312038, 115, 3, 638000, 0, 0, 4130003, 1, 3), - (1, 1322061, 115, 3, 539000, 0, 0, 4130004, 1, 3), - (1, 1402047, 115, 3, 715000, 0, 0, 4130005, 1, 3), - (1, 1412034, 115, 3, 715000, 0, 0, 4130006, 1, 3), - (1, 1422038, 115, 3, 616000, 0, 0, 4130007, 1, 3), - (1, 1432049, 115, 3, 627000, 0, 0, 4130008, 1, 3), - (1, 1442067, 115, 3, 682000, 0, 0, 4130009, 1, 3), - (1, 1302081, 115, 3, 748000, 0, 0, 4130002, 1, 3), - (1, 1312037, 115, 3, 638000, 0, 0, 4130003, 1, 3), - (1, 1322060, 115, 3, 539000, 0, 0, 4130004, 1, 3), - (1, 1402046, 115, 3, 715000, 0, 0, 4130005, 1, 3), - (1, 1412033, 115, 3, 715000, 0, 0, 4130006, 1, 3), - (1, 1422037, 115, 3, 616000, 0, 0, 4130007, 1, 3), - (1, 1432047, 115, 3, 627000, 0, 0, 4130008, 1, 3), - (1, 1442063, 115, 3, 682000, 0, 0, 4130009, 1, 3), - (2, 1002215, 45, 1, 22000, 0, 0, 4130018, 1, 1), - (2, 1002216, 45, 1, 22000, 0, 0, 4130018, 1, 1), - (2, 1002217, 45, 1, 22000, 0, 0, 4130018, 1, 1), - (2, 1002218, 45, 1, 22000, 0, 0, 4130018, 1, 1), - (2, 1002242, 55, 1, 28000, 0, 0, 4130018, 1, 1), - (2, 1002243, 55, 1, 28000, 0, 0, 4130018, 1, 1), - (2, 1002244, 55, 1, 28000, 0, 0, 4130018, 1, 1), - (2, 1002245, 55, 1, 28000, 0, 0, 4130018, 1, 1), - (2, 1002246, 55, 1, 28000, 0, 0, 4130018, 1, 1), - (2, 1002252, 65, 1, 44000, 0, 0, 4130018, 1, 1), - (2, 1002253, 65, 1, 44000, 0, 0, 4130018, 1, 1), - (2, 1002254, 65, 1, 44000, 0, 0, 4130018, 1, 1), - (2, 1002271, 75, 2, 73000, 0, 0, 4130018, 1, 2), - (2, 1002272, 75, 2, 73000, 0, 0, 4130018, 1, 2), - (2, 1002273, 75, 2, 73000, 0, 0, 4130018, 1, 2), - (2, 1002274, 75, 2, 73000, 0, 0, 4130018, 1, 2), - (2, 1002363, 85, 2, 84000, 0, 0, 4130018, 1, 2), - (2, 1002364, 85, 2, 84000, 0, 0, 4130018, 1, 2), - (2, 1002365, 85, 2, 84000, 0, 0, 4130018, 1, 2), - (2, 1002366, 85, 2, 84000, 0, 0, 4130018, 1, 2), - (2, 1002398, 95, 2, 96000, 0, 0, 4130018, 1, 2), - (2, 1002399, 95, 2, 96000, 0, 0, 4130018, 1, 2), - (2, 1002400, 95, 2, 96000, 0, 0, 4130018, 1, 2), - (2, 1002401, 95, 2, 96000, 0, 0, 4130018, 1, 2), - (2, 1002773, 105, 3, 165000, 0, 0, 4130018, 1, 3), - (2, 1002791, 115, 3, 187000, 0, 0, 4130018, 1, 3), - (2, 1002777, 115, 3, 187000, 0, 0, 4130018, 1, 3), - (2, 1050045, 43, 1, 50000, 0, 0, 4130021, 1, 1), - (2, 1050046, 43, 1, 50000, 0, 0, 4130021, 1, 1), - (2, 1050047, 43, 1, 50000, 0, 0, 4130021, 1, 1), - (2, 1050048, 43, 1, 50000, 0, 0, 4130021, 1, 1), - (2, 1050049, 43, 1, 50000, 0, 0, 4130021, 1, 1), - (2, 1051030, 43, 1, 50000, 0, 0, 4130021, 1, 1), - (2, 1051031, 43, 1, 50000, 0, 0, 4130021, 1, 1), - (2, 1051032, 43, 1, 50000, 0, 0, 4130021, 1, 1), - (2, 1051033, 43, 1, 50000, 0, 0, 4130021, 1, 1), - (2, 1051034, 43, 1, 50000, 0, 0, 4130021, 1, 1), - (2, 1050053, 53, 1, 55000, 0, 0, 4130021, 1, 1), - (2, 1050054, 53, 1, 55000, 0, 0, 4130021, 1, 1), - (2, 1050055, 53, 1, 55000, 0, 0, 4130021, 1, 1), - (2, 1050056, 53, 1, 55000, 0, 0, 4130021, 1, 1), - (2, 1051044, 53, 1, 55000, 0, 0, 4130021, 1, 1), - (2, 1051045, 53, 1, 55000, 0, 0, 4130021, 1, 1), - (2, 1051046, 53, 1, 55000, 0, 0, 4130021, 1, 1), - (2, 1051047, 53, 1, 55000, 0, 0, 4130021, 1, 1), - (2, 1050067, 63, 1, 66000, 0, 0, 4130021, 1, 1), - (2, 1050068, 63, 1, 66000, 0, 0, 4130021, 1, 1), - (2, 1050069, 63, 1, 66000, 0, 0, 4130021, 1, 1), - (2, 1050070, 63, 1, 66000, 0, 0, 4130021, 1, 1), - (2, 1051052, 63, 1, 66000, 0, 0, 4130021, 1, 1), - (2, 1051053, 63, 1, 66000, 0, 0, 4130021, 1, 1), - (2, 1051054, 63, 1, 66000, 0, 0, 4130021, 1, 1), - (2, 1051055, 63, 1, 66000, 0, 0, 4130021, 1, 1), - (2, 1050072, 73, 2, 123000, 0, 0, 4130021, 1, 2), - (2, 1050073, 73, 2, 123000, 0, 0, 4130021, 1, 2), - (2, 1050074, 73, 2, 123000, 0, 0, 4130021, 1, 2), - (2, 1051056, 73, 2, 123000, 0, 0, 4130021, 1, 2), - (2, 1051057, 73, 2, 123000, 0, 0, 4130021, 1, 2), - (2, 1051058, 73, 2, 123000, 0, 0, 4130021, 1, 2), - (2, 1050092, 83, 2, 153000, 0, 0, 4130021, 1, 2), - (2, 1050093, 83, 2, 153000, 0, 0, 4130021, 1, 2), - (2, 1050094, 83, 2, 153000, 0, 0, 4130021, 1, 2), - (2, 1050095, 83, 2, 153000, 0, 0, 4130021, 1, 2), - (2, 1051094, 83, 2, 153000, 0, 0, 4130021, 1, 2), - (2, 1051095, 83, 2, 153000, 0, 0, 4130021, 1, 2), - (2, 1051096, 83, 2, 153000, 0, 0, 4130021, 1, 2), - (2, 1051097, 83, 2, 153000, 0, 0, 4130021, 1, 2), - (2, 1050102, 93, 2, 184000, 0, 0, 4130021, 1, 2), - (2, 1050103, 93, 2, 184000, 0, 0, 4130021, 1, 2), - (2, 1050104, 93, 2, 184000, 0, 0, 4130021, 1, 2), - (2, 1050105, 93, 2, 184000, 0, 0, 4130021, 1, 2), - (2, 1051101, 93, 2, 184000, 0, 0, 4130021, 1, 2), - (2, 1051102, 93, 2, 184000, 0, 0, 4130021, 1, 2), - (2, 1051103, 93, 2, 184000, 0, 0, 4130021, 1, 2), - (2, 1051104, 93, 2, 184000, 0, 0, 4130021, 1, 2), - (2, 1052076, 103, 3, 319000, 0, 0, 4130021, 1, 3), - (2, 1052161, 115, 3, 374000, 0, 0, 4130021, 1, 3), - (2, 1052156, 115, 3, 374000, 0, 0, 4130021, 1, 3), - (2, 1072140, 45, 1, 30000, 0, 0, 4130001, 1, 1), - (2, 1072141, 45, 1, 30000, 0, 0, 4130001, 1, 1), - (2, 1072142, 45, 1, 30000, 0, 0, 4130001, 1, 1), - (2, 1072143, 45, 1, 30000, 0, 0, 4130001, 1, 1), - (2, 1072136, 55, 1, 33000, 0, 0, 4130001, 1, 1), - (2, 1072137, 55, 1, 33000, 0, 0, 4130001, 1, 1), - (2, 1072138, 55, 1, 33000, 0, 0, 4130001, 1, 1), - (2, 1072139, 55, 1, 33000, 0, 0, 4130001, 1, 1), - (2, 1072157, 65, 1, 44000, 0, 0, 4130001, 1, 1), - (2, 1072158, 65, 1, 44000, 0, 0, 4130001, 1, 1), - (2, 1072159, 65, 1, 44000, 0, 0, 4130001, 1, 1), - (2, 1072160, 65, 1, 44000, 0, 0, 4130001, 1, 1), - (2, 1072177, 75, 2, 77000, 0, 0, 4130001, 1, 2), - (2, 1072178, 75, 2, 77000, 0, 0, 4130001, 1, 2), - (2, 1072179, 75, 2, 77000, 0, 0, 4130001, 1, 2), - (2, 1072206, 85, 2, 92000, 0, 0, 4130001, 1, 2), - (2, 1072207, 85, 2, 92000, 0, 0, 4130001, 1, 2), - (2, 1072208, 85, 2, 92000, 0, 0, 4130001, 1, 2), - (2, 1072209, 85, 2, 92000, 0, 0, 4130001, 1, 2), - (2, 1072223, 95, 2, 107000, 0, 0, 4130001, 1, 2), - (2, 1072224, 95, 2, 107000, 0, 0, 4130001, 1, 2), - (2, 1072225, 95, 2, 107000, 0, 0, 4130001, 1, 2), - (2, 1072226, 95, 2, 107000, 0, 0, 4130001, 1, 2), - (2, 1072268, 105, 3, 198000, 0, 0, 4130001, 1, 3), - (2, 1072362, 115, 3, 242000, 0, 0, 4130001, 1, 3), - (2, 1072356, 115, 3, 242000, 0, 0, 4130001, 1, 3), - (2, 1082080, 45, 1, 55000, 0, 0, 4130000, 1, 1), - (2, 1082081, 45, 1, 44000, 0, 0, 4130000, 1, 1), - (2, 1082082, 45, 1, 50000, 0, 0, 4130000, 1, 1), - (2, 1082086, 55, 1, 58000, 0, 0, 4130000, 1, 1), - (2, 1082087, 55, 1, 63000, 0, 0, 4130000, 1, 1), - (2, 1082088, 55, 1, 69000, 0, 0, 4130000, 1, 1), - (2, 1082098, 65, 1, 77000, 0, 0, 4130000, 1, 1), - (2, 1082099, 65, 1, 80000, 0, 0, 4130000, 1, 1), - (2, 1082100, 65, 1, 82000, 0, 0, 4130000, 1, 1), - (2, 1082121, 75, 2, 153000, 0, 0, 4130000, 1, 2), - (2, 1082122, 75, 2, 157000, 0, 0, 4130000, 1, 2), - (2, 1082123, 75, 2, 161000, 0, 0, 4130000, 1, 2), - (2, 1082131, 85, 2, 176000, 0, 0, 4130000, 1, 2), - (2, 1082132, 85, 2, 180000, 0, 0, 4130000, 1, 2), - (2, 1082133, 85, 2, 180000, 0, 0, 4130000, 1, 2), - (2, 1082134, 85, 2, 184000, 0, 0, 4130000, 1, 2), - (2, 1082151, 95, 2, 199000, 0, 0, 4130000, 1, 2), - (2, 1082152, 95, 2, 203000, 0, 0, 4130000, 1, 2), - (2, 1082153, 95, 2, 203000, 0, 0, 4130000, 1, 2), - (2, 1082154, 95, 2, 207000, 0, 0, 4130000, 1, 2), - (2, 1082164, 105, 3, 330000, 0, 0, 4130000, 1, 3), - (2, 1082240, 115, 3, 363000, 0, 0, 4130000, 1, 3), - (2, 1082235, 115, 3, 363000, 0, 0, 4130000, 1, 3), - (2, 1092057, 115, 3, 385000, 0, 0, 4130022, 1, 3), - (2, 1372007, 43, 1, 110000, 0, 0, 4130010, 1, 1), - (2, 1382006, 50, 1, 82000, 0, 0, 4130011, 1, 1), - (2, 1372014, 53, 1, 126000, 0, 0, 4130010, 1, 1), - (2, 1382007, 60, 1, 110000, 0, 0, 4130011, 1, 1), - (2, 1372015, 63, 1, 143000, 0, 0, 4130010, 1, 1), - (2, 1382010, 70, 1, 137000, 0, 0, 4130011, 1, 1), - (2, 1372016, 73, 2, 223000, 0, 0, 4130010, 1, 2), - (2, 1382008, 80, 2, 238000, 0, 0, 4130011, 1, 2), - (2, 1372009, 83, 2, 250000, 0, 0, 4130010, 1, 2), - (2, 1382035, 90, 2, 292000, 0, 0, 4130011, 1, 2), - (2, 1372010, 93, 2, 277000, 0, 0, 4130010, 1, 2), - (2, 1372032, 103, 3, 506000, 0, 0, 4130010, 1, 3), - (2, 1382036, 105, 3, 517000, 0, 0, 4130011, 1, 3), - (2, 1372045, 115, 3, 561000, 0, 0, 4130010, 1, 3), - (2, 1382059, 115, 3, 572000, 0, 0, 4130011, 1, 3), - (2, 1372044, 115, 3, 561000, 0, 0, 4130010, 1, 3), - (2, 1382057, 115, 3, 572000, 0, 0, 4130011, 1, 3), - (4, 1002211, 45, 1, 22000, 0, 0, 4130018, 1, 1), - (4, 1002212, 45, 1, 22000, 0, 0, 4130018, 1, 1), - (4, 1002213, 45, 1, 22000, 0, 0, 4130018, 1, 1), - (4, 1002214, 45, 1, 22000, 0, 0, 4130018, 1, 1), - (4, 1002267, 55, 1, 30000, 0, 0, 4130018, 1, 1), - (4, 1002268, 55, 1, 30000, 0, 0, 4130018, 1, 1), - (4, 1002269, 55, 1, 30000, 0, 0, 4130018, 1, 1), - (4, 1002270, 55, 1, 30000, 0, 0, 4130018, 1, 1), - (4, 1002286, 65, 1, 47000, 0, 0, 4130018, 1, 1), - (4, 1002287, 65, 1, 47000, 0, 0, 4130018, 1, 1), - (4, 1002288, 65, 1, 47000, 0, 0, 4130018, 1, 1), - (4, 1002289, 65, 1, 47000, 0, 0, 4130018, 1, 1), - (4, 1002275, 75, 2, 77000, 0, 0, 4130018, 1, 2), - (4, 1002276, 75, 2, 77000, 0, 0, 4130018, 1, 2), - (4, 1002277, 75, 2, 77000, 0, 0, 4130018, 1, 2), - (4, 1002278, 75, 2, 77000, 0, 0, 4130018, 1, 2), - (4, 1002402, 85, 2, 88000, 0, 0, 4130018, 1, 2), - (4, 1002403, 85, 2, 88000, 0, 0, 4130018, 1, 2), - (4, 1002404, 85, 2, 88000, 0, 0, 4130018, 1, 2), - (4, 1002405, 85, 2, 88000, 0, 0, 4130018, 1, 2), - (4, 1002406, 95, 2, 100000, 0, 0, 4130018, 1, 2), - (4, 1002407, 95, 2, 100000, 0, 0, 4130018, 1, 2), - (4, 1002408, 95, 2, 100000, 0, 0, 4130018, 1, 2), - (4, 1002547, 105, 3, 165000, 0, 0, 4130018, 1, 3), - (4, 1002792, 115, 3, 187000, 0, 0, 4130018, 1, 3), - (4, 1002778, 115, 3, 187000, 0, 0, 4130018, 1, 3), - (4, 1050051, 45, 1, 52000, 0, 0, 4130021, 1, 1), - (4, 1050052, 45, 1, 52000, 0, 0, 4130021, 1, 1), - (4, 1051037, 45, 1, 52000, 0, 0, 4130021, 1, 1), - (4, 1051038, 45, 1, 52000, 0, 0, 4130021, 1, 1), - (4, 1051039, 45, 1, 52000, 0, 0, 4130021, 1, 1), - (4, 1050058, 55, 1, 58000, 0, 0, 4130021, 1, 1), - (4, 1050059, 55, 1, 58000, 0, 0, 4130021, 1, 1), - (4, 1050060, 55, 1, 58000, 0, 0, 4130021, 1, 1), - (4, 1051041, 55, 1, 58000, 0, 0, 4130021, 1, 1), - (4, 1051042, 55, 1, 58000, 0, 0, 4130021, 1, 1), - (4, 1051043, 55, 1, 58000, 0, 0, 4130021, 1, 1), - (4, 1050061, 65, 1, 63000, 0, 0, 4130021, 1, 1), - (4, 1050062, 65, 1, 63000, 0, 0, 4130021, 1, 1), - (4, 1050063, 65, 1, 63000, 0, 0, 4130021, 1, 1), - (4, 1050064, 65, 1, 63000, 0, 0, 4130021, 1, 1), - (4, 1051062, 65, 1, 63000, 0, 0, 4130021, 1, 1), - (4, 1051063, 65, 1, 63000, 0, 0, 4130021, 1, 1), - (4, 1051064, 65, 1, 63000, 0, 0, 4130021, 1, 1), - (4, 1051065, 65, 1, 63000, 0, 0, 4130021, 1, 1), - (4, 1050075, 75, 2, 107000, 0, 0, 4130021, 1, 2), - (4, 1050076, 75, 2, 107000, 0, 0, 4130021, 1, 2), - (4, 1050077, 75, 2, 107000, 0, 0, 4130021, 1, 2), - (4, 1050078, 75, 2, 107000, 0, 0, 4130021, 1, 2), - (4, 1051066, 75, 2, 107000, 0, 0, 4130021, 1, 2), - (4, 1051067, 75, 2, 107000, 0, 0, 4130021, 1, 2), - (4, 1051068, 75, 2, 107000, 0, 0, 4130021, 1, 2), - (4, 1051069, 75, 2, 107000, 0, 0, 4130021, 1, 2), - (4, 1050088, 85, 2, 153000, 0, 0, 4130021, 1, 2), - (4, 1050089, 85, 2, 153000, 0, 0, 4130021, 1, 2), - (4, 1050090, 85, 2, 153000, 0, 0, 4130021, 1, 2), - (4, 1050091, 85, 2, 153000, 0, 0, 4130021, 1, 2), - (4, 1051082, 85, 2, 153000, 0, 0, 4130021, 1, 2), - (4, 1051083, 85, 2, 153000, 0, 0, 4130021, 1, 2), - (4, 1051084, 85, 2, 153000, 0, 0, 4130021, 1, 2), - (4, 1051085, 85, 2, 153000, 0, 0, 4130021, 1, 2), - (4, 1050106, 95, 2, 184000, 0, 0, 4130021, 1, 2), - (4, 1050107, 95, 2, 184000, 0, 0, 4130021, 1, 2), - (4, 1050108, 95, 2, 184000, 0, 0, 4130021, 1, 2), - (4, 1051105, 95, 2, 184000, 0, 0, 4130021, 1, 2), - (4, 1051106, 95, 2, 184000, 0, 0, 4130021, 1, 2), - (4, 1051107, 95, 2, 184000, 0, 0, 4130021, 1, 2), - (4, 1052071, 105, 3, 330000, 0, 0, 4130021, 1, 3), - (4, 1052162, 115, 3, 396000, 0, 0, 4130021, 1, 3), - (4, 1052157, 115, 3, 396000, 0, 0, 4130021, 1, 3), - (4, 1072122, 45, 1, 28000, 0, 0, 4130001, 1, 1), - (4, 1072123, 45, 1, 28000, 0, 0, 4130001, 1, 1), - (4, 1072124, 45, 1, 28000, 0, 0, 4130001, 1, 1), - (4, 1072125, 45, 1, 28000, 0, 0, 4130001, 1, 1), - (4, 1072144, 55, 1, 36000, 0, 0, 4130001, 1, 1), - (4, 1072145, 55, 1, 36000, 0, 0, 4130001, 1, 1), - (4, 1072146, 55, 1, 36000, 0, 0, 4130001, 1, 1), - (4, 1072164, 65, 1, 50000, 0, 0, 4130001, 1, 1), - (4, 1072165, 65, 1, 50000, 0, 0, 4130001, 1, 1), - (4, 1072166, 65, 1, 50000, 0, 0, 4130001, 1, 1), - (4, 1072167, 65, 1, 50000, 0, 0, 4130001, 1, 1), - (4, 1072182, 75, 2, 84000, 0, 0, 4130001, 1, 2), - (4, 1072183, 75, 2, 84000, 0, 0, 4130001, 1, 2), - (4, 1072184, 75, 2, 84000, 0, 0, 4130001, 1, 2), - (4, 1072185, 75, 2, 84000, 0, 0, 4130001, 1, 2), - (4, 1072203, 85, 2, 107000, 0, 0, 4130001, 1, 2), - (4, 1072204, 85, 2, 107000, 0, 0, 4130001, 1, 2), - (4, 1072205, 85, 2, 107000, 0, 0, 4130001, 1, 2), - (4, 1072227, 95, 2, 130000, 0, 0, 4130001, 1, 2), - (4, 1072228, 95, 2, 130000, 0, 0, 4130001, 1, 2), - (4, 1072229, 95, 2, 130000, 0, 0, 4130001, 1, 2), - (4, 1072269, 105, 3, 198000, 0, 0, 4130001, 1, 3), - (4, 1072363, 115, 3, 220000, 0, 0, 4130001, 1, 3), - (4, 1072357, 115, 3, 220000, 0, 0, 4130001, 1, 3), - (4, 1082083, 45, 1, 58000, 0, 0, 4130000, 1, 1), - (4, 1082084, 45, 1, 47000, 0, 0, 4130000, 1, 1), - (4, 1082085, 45, 1, 52000, 0, 0, 4130000, 1, 1), - (4, 1082089, 55, 1, 60000, 0, 0, 4130000, 1, 1), - (4, 1082090, 55, 1, 66000, 0, 0, 4130000, 1, 1), - (4, 1082091, 55, 1, 71000, 0, 0, 4130000, 1, 1), - (4, 1082106, 65, 1, 77000, 0, 0, 4130000, 1, 1), - (4, 1082107, 65, 1, 82000, 0, 0, 4130000, 1, 1), - (4, 1082108, 65, 1, 88000, 0, 0, 4130000, 1, 1), - (4, 1082109, 75, 2, 153000, 0, 0, 4130000, 1, 2), - (4, 1082110, 75, 2, 157000, 0, 0, 4130000, 1, 2), - (4, 1082111, 75, 2, 157000, 0, 0, 4130000, 1, 2), - (4, 1082112, 75, 2, 161000, 0, 0, 4130000, 1, 2), - (4, 1082125, 85, 2, 176000, 0, 0, 4130000, 1, 2), - (4, 1082126, 85, 2, 180000, 0, 0, 4130000, 1, 2), - (4, 1082127, 85, 2, 184000, 0, 0, 4130000, 1, 2), - (4, 1082158, 95, 2, 199000, 0, 0, 4130000, 1, 2), - (4, 1082159, 95, 2, 203000, 0, 0, 4130000, 1, 2), - (4, 1082160, 95, 2, 207000, 0, 0, 4130000, 1, 2), - (4, 1082163, 105, 3, 330000, 0, 0, 4130000, 1, 3), - (4, 1082241, 115, 3, 363000, 0, 0, 4130000, 1, 3), - (4, 1082236, 115, 3, 363000, 0, 0, 4130000, 1, 3), - (4, 1452008, 45, 1, 110000, 0, 0, 4130012, 1, 1), - (4, 1462007, 45, 1, 93000, 0, 0, 4130013, 1, 1), - (4, 1452004, 55, 1, 137000, 0, 0, 4130012, 1, 1), - (4, 1462008, 55, 1, 132000, 0, 0, 4130013, 1, 1), - (4, 1452009, 65, 1, 165000, 0, 0, 4130012, 1, 1), - (4, 1452010, 65, 1, 165000, 0, 0, 4130012, 1, 1), - (4, 1452011, 65, 1, 165000, 0, 0, 4130012, 1, 1), - (4, 1462009, 65, 1, 165000, 0, 0, 4130013, 1, 1), - (4, 1452012, 75, 2, 269000, 0, 0, 4130012, 1, 2), - (4, 1452013, 75, 2, 269000, 0, 0, 4130012, 1, 2), - (4, 1452014, 75, 2, 269000, 0, 0, 4130012, 1, 2), - (4, 1452015, 75, 2, 269000, 0, 0, 4130012, 1, 2), - (4, 1462010, 75, 2, 269000, 0, 0, 4130013, 1, 2), - (4, 1462011, 75, 2, 269000, 0, 0, 4130013, 1, 2), - (4, 1462012, 75, 2, 269000, 0, 0, 4130013, 1, 2), - (4, 1462013, 75, 2, 269000, 0, 0, 4130013, 1, 2), - (4, 1452017, 85, 2, 308000, 0, 0, 4130012, 1, 2), - (4, 1462018, 85, 2, 308000, 0, 0, 4130013, 1, 2), - (4, 1452019, 95, 2, 346000, 0, 0, 4130012, 1, 2), - (4, 1452020, 95, 2, 346000, 0, 0, 4130012, 1, 2), - (4, 1452021, 95, 2, 346000, 0, 0, 4130012, 1, 2), - (4, 1462015, 95, 2, 346000, 0, 0, 4130013, 1, 2), - (4, 1462016, 95, 2, 346000, 0, 0, 4130013, 1, 2), - (4, 1462017, 95, 2, 346000, 0, 0, 4130013, 1, 2), - (4, 1452044, 105, 3, 550000, 0, 0, 4130012, 1, 3), - (4, 1462039, 105, 3, 550000, 0, 0, 4130013, 1, 3), - (4, 1452059, 115, 3, 605000, 0, 0, 4130012, 1, 3), - (4, 1462051, 115, 3, 605000, 0, 0, 4130013, 1, 3), - (4, 1452057, 115, 3, 605000, 0, 0, 4130012, 1, 3), - (4, 1462050, 115, 3, 605000, 0, 0, 4130013, 1, 3), - (8, 1002207, 45, 1, 22000, 0, 0, 4130018, 1, 1), - (8, 1002208, 45, 1, 22000, 0, 0, 4130018, 1, 1), - (8, 1002209, 45, 1, 22000, 0, 0, 4130018, 1, 1), - (8, 1002210, 45, 1, 22000, 0, 0, 4130018, 1, 1), - (8, 1002247, 55, 1, 30000, 0, 0, 4130018, 1, 1), - (8, 1002248, 55, 1, 30000, 0, 0, 4130018, 1, 1), - (8, 1002249, 55, 1, 30000, 0, 0, 4130018, 1, 1), - (8, 1002281, 65, 1, 47000, 0, 0, 4130018, 1, 1), - (8, 1002282, 65, 1, 47000, 0, 0, 4130018, 1, 1), - (8, 1002283, 65, 1, 47000, 0, 0, 4130018, 1, 1), - (8, 1002284, 65, 1, 47000, 0, 0, 4130018, 1, 1), - (8, 1002285, 65, 1, 47000, 0, 0, 4130018, 1, 1), - (8, 1002327, 75, 2, 77000, 0, 0, 4130018, 1, 2), - (8, 1002328, 75, 2, 77000, 0, 0, 4130018, 1, 2), - (8, 1002329, 75, 2, 77000, 0, 0, 4130018, 1, 2), - (8, 1002330, 75, 2, 77000, 0, 0, 4130018, 1, 2), - (8, 1002323, 85, 2, 88000, 0, 0, 4130018, 1, 2), - (8, 1002324, 85, 2, 88000, 0, 0, 4130018, 1, 2), - (8, 1002325, 85, 2, 88000, 0, 0, 4130018, 1, 2), - (8, 1002326, 85, 2, 88000, 0, 0, 4130018, 1, 2), - (8, 1002380, 95, 2, 100000, 0, 0, 4130018, 1, 2), - (8, 1002381, 95, 2, 100000, 0, 0, 4130018, 1, 2), - (8, 1002382, 95, 2, 100000, 0, 0, 4130018, 1, 2), - (8, 1002383, 95, 2, 100000, 0, 0, 4130018, 1, 2), - (8, 1002550, 105, 3, 165000, 0, 0, 4130018, 1, 3), - (8, 1002793, 115, 3, 209000, 0, 0, 4130018, 1, 3), - (8, 1002779, 115, 3, 209000, 0, 0, 4130018, 1, 3), - (8, 1040094, 45, 1, 41000, 0, 0, 4130019, 1, 1), - (8, 1040095, 45, 1, 41000, 0, 0, 4130019, 1, 1), - (8, 1040096, 45, 1, 41000, 0, 0, 4130019, 1, 1), - (8, 1040097, 45, 1, 41000, 0, 0, 4130019, 1, 1), - (8, 1041077, 45, 1, 41000, 0, 0, 4130019, 1, 1), - (8, 1041078, 45, 1, 41000, 0, 0, 4130019, 1, 1), - (8, 1041079, 45, 1, 41000, 0, 0, 4130019, 1, 1), - (8, 1041080, 45, 1, 41000, 0, 0, 4130019, 1, 1), - (8, 1040098, 55, 1, 50000, 0, 0, 4130019, 1, 1), - (8, 1040099, 55, 1, 50000, 0, 0, 4130019, 1, 1), - (8, 1040100, 55, 1, 50000, 0, 0, 4130019, 1, 1), - (8, 1041094, 55, 1, 50000, 0, 0, 4130019, 1, 1), - (8, 1041095, 55, 1, 50000, 0, 0, 4130019, 1, 1), - (8, 1041096, 55, 1, 50000, 0, 0, 4130019, 1, 1), - (8, 1040105, 65, 1, 55000, 0, 0, 4130019, 1, 1), - (8, 1040106, 65, 1, 55000, 0, 0, 4130019, 1, 1), - (8, 1040107, 65, 1, 55000, 0, 0, 4130019, 1, 1), - (8, 1041100, 65, 1, 55000, 0, 0, 4130019, 1, 1), - (8, 1041101, 65, 1, 55000, 0, 0, 4130019, 1, 1), - (8, 1041102, 65, 1, 55000, 0, 0, 4130019, 1, 1), - (8, 1041103, 65, 1, 55000, 0, 0, 4130019, 1, 1), - (8, 1040108, 75, 2, 107000, 0, 0, 4130019, 1, 2), - (8, 1040109, 75, 2, 107000, 0, 0, 4130019, 1, 2), - (8, 1040110, 75, 2, 107000, 0, 0, 4130019, 1, 2), - (8, 1041105, 75, 2, 107000, 0, 0, 4130019, 1, 2), - (8, 1041106, 75, 2, 107000, 0, 0, 4130019, 1, 2), - (8, 1041107, 75, 2, 107000, 0, 0, 4130019, 1, 2), - (8, 1040115, 85, 2, 138000, 0, 0, 4130019, 1, 2), - (8, 1040116, 85, 2, 138000, 0, 0, 4130019, 1, 2), - (8, 1040117, 85, 2, 138000, 0, 0, 4130019, 1, 2), - (8, 1040118, 85, 2, 138000, 0, 0, 4130019, 1, 2), - (8, 1041115, 85, 2, 138000, 0, 0, 4130019, 1, 2), - (8, 1041116, 85, 2, 138000, 0, 0, 4130019, 1, 2), - (8, 1041117, 85, 2, 138000, 0, 0, 4130019, 1, 2), - (8, 1041118, 85, 2, 138000, 0, 0, 4130019, 1, 2), - (8, 1060083, 45, 1, 33000, 0, 0, 4130020, 1, 1), - (8, 1060084, 45, 1, 33000, 0, 0, 4130020, 1, 1), - (8, 1060085, 45, 1, 33000, 0, 0, 4130020, 1, 1), - (8, 1060086, 45, 1, 33000, 0, 0, 4130020, 1, 1), - (8, 1061076, 45, 1, 33000, 0, 0, 4130020, 1, 1), - (8, 1061077, 45, 1, 33000, 0, 0, 4130020, 1, 1), - (8, 1061078, 45, 1, 33000, 0, 0, 4130020, 1, 1), - (8, 1061079, 45, 1, 33000, 0, 0, 4130020, 1, 1), - (8, 1060087, 55, 1, 41000, 0, 0, 4130020, 1, 1), - (8, 1060088, 55, 1, 41000, 0, 0, 4130020, 1, 1), - (8, 1060089, 55, 1, 41000, 0, 0, 4130020, 1, 1), - (8, 1061093, 55, 1, 41000, 0, 0, 4130020, 1, 1), - (8, 1061094, 55, 1, 41000, 0, 0, 4130020, 1, 1), - (8, 1061095, 55, 1, 41000, 0, 0, 4130020, 1, 1), - (8, 1060093, 65, 1, 50000, 0, 0, 4130020, 1, 1), - (8, 1060094, 65, 1, 50000, 0, 0, 4130020, 1, 1), - (8, 1060095, 65, 1, 50000, 0, 0, 4130020, 1, 1), - (8, 1061099, 65, 1, 50000, 0, 0, 4130020, 1, 1), - (8, 1061100, 65, 1, 50000, 0, 0, 4130020, 1, 1), - (8, 1061101, 65, 1, 50000, 0, 0, 4130020, 1, 1), - (8, 1061102, 65, 1, 50000, 0, 0, 4130020, 1, 1), - (8, 1060097, 75, 2, 92000, 0, 0, 4130020, 1, 2), - (8, 1060098, 75, 2, 92000, 0, 0, 4130020, 1, 2), - (8, 1060099, 75, 2, 92000, 0, 0, 4130020, 1, 2), - (8, 1061104, 75, 2, 92000, 0, 0, 4130020, 1, 2), - (8, 1061105, 75, 2, 92000, 0, 0, 4130020, 1, 2), - (8, 1061106, 75, 2, 92000, 0, 0, 4130020, 1, 2), - (8, 1060104, 85, 2, 123000, 0, 0, 4130020, 1, 2), - (8, 1060105, 85, 2, 123000, 0, 0, 4130020, 1, 2), - (8, 1060106, 85, 2, 123000, 0, 0, 4130020, 1, 2), - (8, 1060107, 85, 2, 123000, 0, 0, 4130020, 1, 2), - (8, 1061114, 85, 2, 123000, 0, 0, 4130020, 1, 2), - (8, 1061115, 85, 2, 123000, 0, 0, 4130020, 1, 2), - (8, 1061116, 85, 2, 123000, 0, 0, 4130020, 1, 2), - (8, 1061117, 85, 2, 123000, 0, 0, 4130020, 1, 2), - (8, 1050096, 95, 2, 184000, 0, 0, 4130021, 1, 2), - (8, 1050097, 95, 2, 184000, 0, 0, 4130021, 1, 2), - (8, 1050098, 95, 2, 184000, 0, 0, 4130021, 1, 2), - (8, 1050099, 95, 2, 184000, 0, 0, 4130021, 1, 2), - (8, 1051090, 95, 2, 184000, 0, 0, 4130021, 1, 2), - (8, 1051091, 95, 2, 184000, 0, 0, 4130021, 1, 2), - (8, 1051092, 95, 2, 184000, 0, 0, 4130021, 1, 2), - (8, 1051093, 95, 2, 184000, 0, 0, 4130021, 1, 2), - (8, 1052072, 105, 3, 330000, 0, 0, 4130021, 1, 3), - (8, 1052163, 115, 3, 396000, 0, 0, 4130021, 1, 3), - (8, 1052158, 115, 3, 396000, 0, 0, 4130021, 1, 3), - (8, 1072128, 45, 1, 28000, 0, 0, 4130001, 1, 1), - (8, 1072129, 45, 1, 28000, 0, 0, 4130001, 1, 1), - (8, 1072130, 45, 1, 28000, 0, 0, 4130001, 1, 1), - (8, 1072131, 45, 1, 28000, 0, 0, 4130001, 1, 1), - (8, 1072150, 55, 1, 36000, 0, 0, 4130001, 1, 1), - (8, 1072151, 55, 1, 36000, 0, 0, 4130001, 1, 1), - (8, 1072152, 55, 1, 39000, 0, 0, 4130001, 1, 1), - (8, 1072161, 65, 1, 50000, 0, 0, 4130001, 1, 1), - (8, 1072162, 65, 1, 50000, 0, 0, 4130001, 1, 1), - (8, 1072163, 65, 1, 50000, 0, 0, 4130001, 1, 1), - (8, 1072172, 75, 2, 84000, 0, 0, 4130001, 1, 2), - (8, 1072173, 75, 2, 84000, 0, 0, 4130001, 1, 2), - (8, 1072174, 75, 2, 84000, 0, 0, 4130001, 1, 2), - (8, 1072192, 85, 2, 107000, 0, 0, 4130001, 1, 2), - (8, 1072193, 85, 2, 107000, 0, 0, 4130001, 1, 2), - (8, 1072194, 85, 2, 107000, 0, 0, 4130001, 1, 2), - (8, 1072195, 85, 2, 107000, 0, 0, 4130001, 1, 2), - (8, 1072213, 95, 2, 130000, 0, 0, 4130001, 1, 2), - (8, 1072214, 95, 2, 130000, 0, 0, 4130001, 1, 2), - (8, 1072215, 95, 2, 130000, 0, 0, 4130001, 1, 2), - (8, 1072216, 95, 2, 130000, 0, 0, 4130001, 1, 2), - (8, 1072272, 105, 3, 215000, 0, 0, 4130001, 1, 3), - (8, 1072364, 115, 3, 248000, 0, 0, 4130001, 1, 3), - (8, 1072358, 115, 3, 248000, 0, 0, 4130001, 1, 3), - (8, 1082065, 45, 1, 47000, 0, 0, 4130000, 1, 1), - (8, 1082066, 45, 1, 52000, 0, 0, 4130000, 1, 1), - (8, 1082067, 45, 1, 50000, 0, 0, 4130000, 1, 1), - (8, 1082092, 55, 1, 60000, 0, 0, 4130000, 1, 1), - (8, 1082093, 55, 1, 66000, 0, 0, 4130000, 1, 1), - (8, 1082094, 55, 1, 71000, 0, 0, 4130000, 1, 1), - (8, 1082095, 65, 1, 82000, 0, 0, 4130000, 1, 1), - (8, 1082096, 65, 1, 88000, 0, 0, 4130000, 1, 1), - (8, 1082097, 65, 1, 93000, 0, 0, 4130000, 1, 1), - (8, 1082118, 75, 2, 153000, 0, 0, 4130000, 1, 2), - (8, 1082119, 75, 2, 157000, 0, 0, 4130000, 1, 2), - (8, 1082120, 75, 2, 161000, 0, 0, 4130000, 1, 2), - (8, 1082142, 85, 2, 165000, 0, 0, 4130000, 1, 2), - (8, 1082143, 85, 2, 165000, 0, 0, 4130000, 1, 2), - (8, 1082144, 85, 2, 165000, 0, 0, 4130000, 1, 2), - (8, 1082135, 95, 2, 199000, 0, 0, 4130000, 1, 2), - (8, 1082136, 95, 2, 203000, 0, 0, 4130000, 1, 2), - (8, 1082137, 95, 2, 203000, 0, 0, 4130000, 1, 2), - (8, 1082138, 95, 2, 207000, 0, 0, 4130000, 1, 2), - (8, 1082167, 105, 3, 330000, 0, 0, 4130000, 1, 3), - (8, 1082242, 115, 3, 363000, 0, 0, 4130000, 1, 3), - (8, 1082237, 115, 3, 363000, 0, 0, 4130000, 1, 3), - (8, 1092059, 115, 3, 385000, 0, 0, 4130022, 1, 3), - (8, 1332003, 45, 1, 121000, 0, 0, 4130014, 1, 1), - (8, 1472018, 45, 1, 55000, 0, 0, 4130015, 1, 1), - (8, 1472019, 45, 1, 57000, 0, 0, 4130015, 1, 1), - (8, 1472020, 45, 1, 57000, 0, 0, 4130015, 1, 1), - (8, 1472021, 45, 1, 60000, 0, 0, 4130015, 1, 1), - (8, 1332016, 45, 1, 121000, 0, 0, 4130014, 1, 1), - (8, 1332015, 55, 1, 137000, 0, 0, 4130014, 1, 1), - (8, 1472022, 55, 1, 137000, 0, 0, 4130015, 1, 1), - (8, 1472023, 55, 1, 140000, 0, 0, 4130015, 1, 1), - (8, 1472024, 55, 1, 140000, 0, 0, 4130015, 1, 1), - (8, 1472025, 55, 1, 143000, 0, 0, 4130015, 1, 1), - (8, 1332017, 55, 1, 137000, 0, 0, 4130014, 1, 1), - (8, 1332018, 65, 1, 154000, 0, 0, 4130014, 1, 1), - (8, 1472026, 65, 1, 165000, 0, 0, 4130015, 1, 1), - (8, 1472027, 65, 1, 167000, 0, 0, 4130015, 1, 1), - (8, 1472028, 65, 1, 167000, 0, 0, 4130015, 1, 1), - (8, 1472029, 65, 1, 170000, 0, 0, 4130015, 1, 1), - (8, 1332019, 65, 1, 154000, 0, 0, 4130014, 1, 1), - (8, 1472031, 75, 2, 308000, 0, 0, 4130015, 1, 2), - (8, 1332022, 75, 2, 238000, 0, 0, 4130014, 1, 2), - (8, 1332023, 75, 2, 238000, 0, 0, 4130014, 1, 2), - (8, 1332027, 85, 2, 261000, 0, 0, 4130014, 1, 2), - (8, 1472033, 85, 2, 346000, 0, 0, 4130015, 1, 2), - (8, 1332026, 85, 2, 261000, 0, 0, 4130014, 1, 2), - (8, 1332052, 95, 2, 308000, 0, 0, 4130014, 1, 2), - (8, 1472053, 95, 2, 392000, 0, 0, 4130015, 1, 2), - (8, 1332051, 95, 2, 308000, 0, 0, 4130014, 1, 2), - (8, 1332050, 105, 3, 495000, 0, 0, 4130014, 1, 3), - (8, 1472051, 105, 3, 627000, 0, 0, 4130015, 1, 3), - (8, 1472052, 105, 3, 627000, 0, 0, 4130015, 1, 3), - (8, 1332049, 105, 3, 495000, 0, 0, 4130014, 1, 3), - (8, 1332075, 115, 3, 550000, 0, 0, 4130014, 1, 3), - (8, 1332076, 115, 3, 550000, 0, 0, 4130014, 1, 3), - (8, 1472071, 115, 3, 693000, 0, 0, 4130015, 1, 3), - (8, 1332073, 115, 3, 550000, 0, 0, 4130014, 1, 3), - (8, 1332074, 115, 3, 561000, 0, 0, 4130014, 1, 3), - (8, 1472068, 115, 3, 693000, 0, 0, 4130015, 1, 3), - (16, 1002631, 45, 1, 22000, 0, 0, 4130018, 1, 1), - (16, 1002634, 55, 1, 30000, 0, 0, 4130018, 1, 1), - (16, 1002637, 65, 1, 47000, 0, 0, 4130018, 1, 1), - (16, 1002640, 75, 2, 77000, 0, 0, 4130018, 1, 2), - (16, 1002643, 85, 2, 88000, 0, 0, 4130018, 1, 2), - (16, 1002646, 95, 2, 100000, 0, 0, 4130018, 1, 2), - (16, 1002649, 105, 3, 165000, 0, 0, 4130018, 1, 3), - (16, 1002794, 115, 3, 187000, 0, 0, 4130018, 1, 3), - (16, 1002780, 115, 3, 187000, 0, 0, 4130018, 1, 3), - (16, 1052116, 45, 1, 52000, 0, 0, 4130021, 1, 1), - (16, 1052119, 55, 1, 55000, 0, 0, 4130021, 1, 1), - (16, 1052122, 65, 1, 63000, 0, 0, 4130021, 1, 1), - (16, 1052125, 75, 2, 138000, 0, 0, 4130021, 1, 2), - (16, 1052128, 85, 2, 153000, 0, 0, 4130021, 1, 2), - (16, 1052131, 95, 2, 184000, 0, 0, 4130021, 1, 2), - (16, 1052134, 105, 3, 330000, 0, 0, 4130021, 1, 3), - (16, 1052164, 115, 3, 396000, 0, 0, 4130021, 1, 3), - (16, 1052159, 115, 3, 396000, 0, 0, 4130021, 1, 3), - (16, 1072303, 45, 1, 28000, 0, 0, 4130001, 1, 1), - (16, 1072306, 55, 1, 36000, 0, 0, 4130001, 1, 1), - (16, 1072309, 65, 1, 50000, 0, 0, 4130001, 1, 1), - (16, 1072312, 75, 2, 84000, 0, 0, 4130001, 1, 2), - (16, 1072315, 85, 2, 107000, 0, 0, 4130001, 1, 2), - (16, 1072318, 95, 2, 130000, 0, 0, 4130001, 1, 2), - (16, 1072321, 105, 3, 198000, 0, 0, 4130001, 1, 3), - (16, 1072365, 115, 3, 220000, 0, 0, 4130001, 1, 3), - (16, 1072359, 115, 3, 220000, 0, 0, 4130001, 1, 3), - (16, 1082198, 45, 1, 47000, 0, 0, 4130000, 1, 1), - (16, 1082201, 55, 1, 60000, 0, 0, 4130000, 1, 1), - (16, 1082204, 65, 1, 82000, 0, 0, 4130000, 1, 1), - (16, 1082207, 75, 2, 153000, 0, 0, 4130000, 1, 2), - (16, 1082210, 85, 2, 176000, 0, 0, 4130000, 1, 2), - (16, 1082213, 95, 2, 203000, 0, 0, 4130000, 1, 2), - (16, 1082216, 105, 3, 330000, 0, 0, 4130000, 1, 3), - (16, 1082243, 115, 3, 369000, 0, 0, 4130000, 1, 3), - (16, 1082238, 115, 3, 369000, 0, 0, 4130000, 1, 3), - (16, 1482007, 45, 1, 71000, 0, 0, 4130016, 1, 1), - (16, 1492007, 45, 1, 77000, 0, 0, 4130017, 1, 1), - (16, 1482008, 55, 1, 132000, 0, 0, 4130016, 1, 1), - (16, 1492008, 55, 1, 137000, 0, 0, 4130017, 1, 1), - (16, 1482009, 65, 1, 165000, 0, 0, 4130016, 1, 1), - (16, 1492009, 65, 1, 170000, 0, 0, 4130017, 1, 1), - (16, 1482010, 75, 2, 269000, 0, 0, 4130016, 1, 2), - (16, 1492010, 75, 2, 269000, 0, 0, 4130017, 1, 2), - (16, 1482011, 85, 2, 300000, 0, 0, 4130016, 1, 2), - (16, 1492011, 85, 2, 308000, 0, 0, 4130017, 1, 2), - (16, 1482012, 95, 2, 338000, 0, 0, 4130016, 1, 2), - (16, 1492012, 95, 2, 346000, 0, 0, 4130017, 1, 2), - (16, 1482013, 105, 3, 561000, 0, 0, 4130016, 1, 3), - (16, 1492013, 105, 3, 572000, 0, 0, 4130017, 1, 3), - (16, 1482024, 115, 3, 616000, 0, 0, 4130016, 1, 3), - (16, 1492025, 115, 3, 627000, 0, 0, 4130017, 1, 3), - (16, 1482023, 115, 3, 616000, 0, 0, 4130016, 1, 3), - (16, 1492023, 115, 3, 627000, 0, 0, 4130017, 1, 3); - -INSERT IGNORE INTO `makerrecipedata` (`itemid`, `req_item`, `count`) VALUES - (4250000, 4021007, 1), - (4250100, 4021005, 1), - (4250200, 4021000, 1), - (4250300, 4021004, 1), - (4250400, 4021001, 1), - (4250500, 4021002, 1), - (4250600, 4021006, 1), - (4250700, 4021003, 1), - (4250800, 4005000, 1), - (4250900, 4005001, 1), - (4251000, 4005003, 1), - (4251100, 4005002, 1), - (4251300, 4021008, 1), - (4251400, 4005004, 1), - (4250001, 4250000, 10), - (4250101, 4250100, 10), - (4250201, 4250200, 10), - (4250301, 4250300, 10), - (4250401, 4250400, 10), - (4250501, 4250500, 10), - (4250601, 4250600, 10), - (4250701, 4250700, 10), - (4250801, 4250800, 10), - (4250901, 4250900, 10), - (4251001, 4251000, 10), - (4251101, 4251100, 10), - (4251301, 4251300, 10), - (4251401, 4251400, 10), - (4250002, 4250001, 10), - (4250102, 4250101, 10), - (4250202, 4250201, 10), - (4250302, 4250301, 10), - (4250402, 4250401, 10), - (4250502, 4250501, 10), - (4250602, 4250601, 10), - (4250702, 4250701, 10), - (4250802, 4250801, 10), - (4250902, 4250901, 10), - (4251002, 4251001, 10), - (4251102, 4251101, 10), - (4251302, 4251301, 10), - (4251402, 4251401, 10), - (4001174, 4031966, 1), - (4001174, 4000155, 10), - (4001174, 4000278, 5), - (4001174, 4000277, 5), - (4001175, 4031967, 1), - (4001175, 4000048, 20), - (4001175, 4000030, 3), - (4001176, 4031968, 1), - (4001176, 4000360, 30), - (4001176, 4003001, 20), - (4001176, 4011001, 5), - (4001177, 4031969, 1), - (4001177, 4007001, 10), - (4001177, 4000052, 100), - (4001178, 4031970, 1), - (4001178, 4007002, 1), - (4001178, 4000295, 25), - (4001178, 4000286, 25), - (4001179, 4031971, 1), - (4001179, 4000364, 70), - (4001179, 4000122, 7), - (4001179, 4003000, 7), - (4001180, 4031972, 1), - (4001180, 4007000, 1), - (4001180, 4000229, 30), - (4001180, 4000074, 10), - (4001181, 4031973, 1), - (4001181, 4007006, 1), - (4001181, 4000238, 30), - (4001181, 4003005, 20), - (4001182, 4031974, 1), - (4001182, 4007001, 6), - (4001182, 4000239, 12), - (4001182, 4000240, 1), - (4001182, 4003004, 36), - (4001183, 4031975, 1), - (4001183, 4007001, 3), - (4001183, 4000285, 30), - (4001183, 4000232, 30), - (4001184, 4031976, 1), - (4001184, 4000182, 30), - (4001184, 4011001, 10), - (4001184, 4003001, 10), - (4001185, 4031977, 1), - (4001185, 4000134, 30), - (4001185, 4000081, 5), - (4001185, 4003005, 20), - (4031980, 4031979, 1), - (4031980, 4011006, 6), - (4031980, 4011001, 2), - (4031980, 4011008, 1), - (4001186, 4031978, 1), - (4001186, 4003005, 30), - (4001186, 4005001, 1), - (4001186, 4021007, 10), - (4001186, 4021009, 1), - (4032334, 4032335, 1), - (4032334, 4000268, 500), - (4032334, 4000181, 500), - (4032334, 4000274, 500), - (4032312, 4005004, 1), - (4032312, 4020007, 3), - (4032312, 4020000, 3), - (2041058, 4000048, 100), - (2041058, 4000299, 10), - (2040727, 4000159, 50), - (2040727, 4000299, 10), - (4260007, 4260006, 100), - (4260007, 4001126, 5), - (4260008, 4260007, 50), - (4260008, 4001126, 5), - (1002028, 4007001, 5), - (1002028, 4260000, 5), - (1002085, 4007002, 5), - (1002085, 4260000, 5), - (1002086, 4007000, 5), - (1002086, 4260000, 5), - (1002022, 4007001, 5), - (1002022, 4260000, 5), - (1002100, 4007000, 5), - (1002100, 4260000, 5), - (1002101, 4007003, 5), - (1002101, 4260000, 5), - (1002029, 4007006, 6), - (1002029, 4260001, 6), - (1002084, 4007002, 6), - (1002084, 4260001, 6), - (1002030, 4007001, 7), - (1002030, 4260002, 7), - (1002094, 4007000, 7), - (1002094, 4260002, 7), - (1002095, 4007002, 7), - (1002095, 4260002, 7), - (1002338, 4007006, 8), - (1002338, 4260003, 8), - (1002339, 4007002, 8), - (1002339, 4260003, 8), - (1002340, 4007007, 8), - (1002340, 4260003, 8), - (1002528, 4007003, 9), - (1002528, 4260004, 9), - (1002529, 4007002, 9), - (1002529, 4260004, 9), - (1002530, 4007006, 9), - (1002530, 4260004, 9), - (1002531, 4007001, 9), - (1002531, 4260004, 9), - (1002532, 4007007, 9), - (1002532, 4260004, 9), - (1002377, 4007003, 10), - (1002377, 4260005, 10), - (1002378, 4007002, 10), - (1002378, 4260005, 10), - (1002379, 4007007, 10), - (1002379, 4260005, 10), - (1002551, 4007002, 11), - (1002551, 4260006, 11), - (1002551, 4000244, 5), - (1002551, 4000245, 5), - (1002790, 4007001, 12), - (1002790, 4260007, 8), - (1002790, 4260008, 4), - (1002790, 4020009, 15), - (1002776, 4007001, 12), - (1002776, 4260007, 2), - (1002776, 4260008, 10), - (1002776, 4021010, 1), - (1040087, 4007002, 5), - (1040087, 4260000, 5), - (1040088, 4007004, 5), - (1040088, 4260000, 5), - (1040089, 4007007, 5), - (1040089, 4260000, 5), - (1041087, 4007006, 5), - (1041087, 4260000, 5), - (1041088, 4007001, 5), - (1041088, 4260000, 5), - (1041089, 4007007, 5), - (1041089, 4260000, 5), - (1040090, 4007003, 6), - (1040090, 4260001, 6), - (1040091, 4007006, 6), - (1040091, 4260001, 6), - (1040092, 4007002, 6), - (1040092, 4260001, 6), - (1040093, 4007007, 6), - (1040093, 4260001, 6), - (1041091, 4007003, 6), - (1041091, 4260001, 6), - (1041092, 4007006, 6), - (1041092, 4260001, 6), - (1041093, 4007002, 6), - (1041093, 4260001, 6), - (1040102, 4007000, 7), - (1040102, 4260002, 7), - (1040103, 4007002, 7), - (1040103, 4260002, 7), - (1040104, 4007005, 7), - (1040104, 4260002, 7), - (1041097, 4007002, 7), - (1041097, 4260002, 7), - (1041098, 4007005, 7), - (1041098, 4260002, 7), - (1041099, 4007006, 7), - (1041099, 4260002, 7), - (1040111, 4007003, 9), - (1040111, 4260004, 9), - (1040112, 4007002, 9), - (1040112, 4260004, 9), - (1040113, 4007007, 9), - (1040113, 4260004, 9), - (1041119, 4007003, 9), - (1041119, 4260004, 9), - (1041120, 4007005, 9), - (1041120, 4260004, 9), - (1041121, 4007007, 9), - (1041121, 4260004, 9), - (1040120, 4007003, 10), - (1040120, 4260005, 10), - (1040121, 4007002, 10), - (1040121, 4260005, 10), - (1040122, 4007007, 10), - (1040122, 4260005, 10), - (1041122, 4007003, 10), - (1041122, 4260005, 10), - (1041123, 4007005, 10), - (1041123, 4260005, 10), - (1041124, 4007007, 10), - (1041124, 4260005, 10), - (1060076, 4007002, 5), - (1060076, 4260000, 5), - (1060077, 4007004, 5), - (1060077, 4260000, 5), - (1060078, 4007007, 5), - (1060078, 4260000, 5), - (1061086, 4007006, 5), - (1061086, 4260000, 5), - (1061087, 4007001, 5), - (1061087, 4260000, 5), - (1061088, 4007007, 5), - (1061088, 4260000, 5), - (1060079, 4007003, 6), - (1060079, 4260001, 6), - (1060080, 4007006, 6), - (1060080, 4260001, 6), - (1060081, 4007002, 6), - (1060081, 4260001, 6), - (1060082, 4007007, 6), - (1060082, 4260001, 6), - (1061090, 4007003, 6), - (1061090, 4260001, 6), - (1061091, 4007006, 6), - (1061091, 4260001, 6), - (1061092, 4007002, 6), - (1061092, 4260001, 6), - (1060090, 4007000, 7), - (1060090, 4260002, 7), - (1060091, 4007002, 7), - (1060091, 4260002, 7), - (1060092, 4007005, 7), - (1060092, 4260002, 7), - (1061096, 4007002, 7), - (1061096, 4260002, 7), - (1061097, 4007005, 7), - (1061097, 4260002, 7), - (1061098, 4007006, 7), - (1061098, 4260002, 7), - (1060100, 4007003, 9), - (1060100, 4260004, 9), - (1060101, 4007002, 9), - (1060101, 4260004, 9), - (1060102, 4007007, 9), - (1060102, 4260004, 9), - (1061118, 4007003, 9), - (1061118, 4260004, 9), - (1061119, 4007005, 9), - (1061119, 4260004, 9), - (1061120, 4007006, 9), - (1061120, 4260004, 9), - (1060109, 4007003, 10), - (1060109, 4260005, 10), - (1060110, 4007002, 10), - (1060110, 4260005, 10), - (1060111, 4007007, 10), - (1060111, 4260005, 10), - (1061121, 4007003, 10), - (1061121, 4260005, 10), - (1061122, 4007005, 10), - (1061122, 4260005, 10), - (1061123, 4007007, 10), - (1061123, 4260005, 10), - (1050080, 4007003, 8), - (1050080, 4260003, 16), - (1050081, 4007006, 8), - (1050081, 4260003, 16), - (1050082, 4007002, 8), - (1050082, 4260003, 16), - (1050083, 4007007, 8), - (1050083, 4260003, 16), - (1051077, 4007004, 8), - (1051077, 4260003, 16), - (1051078, 4007006, 8), - (1051078, 4260003, 16), - (1051079, 4007002, 8), - (1051079, 4260003, 16), - (1051080, 4007007, 8), - (1051080, 4260003, 16), - (1052075, 4007002, 11), - (1052075, 4260006, 22), - (1052075, 4000244, 5), - (1052075, 4000245, 5), - (1052160, 4007005, 12), - (1052160, 4260007, 16), - (1052160, 4260008, 8), - (1052160, 4020009, 15), - (1052155, 4007005, 12), - (1052155, 4260007, 4), - (1052155, 4260008, 20), - (1052155, 4021010, 1), - (1072132, 4007003, 5), - (1072132, 4260000, 5), - (1072133, 4007002, 5), - (1072133, 4260000, 5), - (1072134, 4007005, 5), - (1072134, 4260000, 5), - (1072135, 4007004, 5), - (1072135, 4260000, 5), - (1072147, 4007002, 6), - (1072147, 4260001, 6), - (1072148, 4007005, 6), - (1072148, 4260001, 6), - (1072149, 4007006, 6), - (1072149, 4260001, 6), - (1072154, 4007002, 7), - (1072154, 4260002, 7), - (1072155, 4007005, 7), - (1072155, 4260002, 7), - (1072156, 4007007, 7), - (1072156, 4260002, 7), - (1072210, 4007006, 8), - (1072210, 4260003, 8), - (1072211, 4007002, 8), - (1072211, 4260003, 8), - (1072212, 4007007, 8), - (1072212, 4260003, 8), - (1072196, 4007003, 9), - (1072196, 4260004, 9), - (1072197, 4007005, 9), - (1072197, 4260004, 9), - (1072198, 4007007, 9), - (1072198, 4260004, 9), - (1072220, 4007003, 10), - (1072220, 4260005, 10), - (1072221, 4007002, 10), - (1072221, 4260005, 10), - (1072222, 4007007, 10), - (1072222, 4260005, 10), - (1072273, 4007002, 11), - (1072273, 4260006, 11), - (1072273, 4000244, 5), - (1072273, 4000245, 5), - (1072361, 4007007, 12), - (1072361, 4260007, 8), - (1072361, 4260008, 4), - (1072361, 4020009, 15), - (1072355, 4007007, 12), - (1072355, 4260007, 2), - (1072355, 4260008, 10), - (1072355, 4021010, 1), - (1082009, 4007001, 5), - (1082009, 4260000, 5), - (1082010, 4007007, 5), - (1082010, 4260000, 5), - (1082011, 4007004, 5), - (1082011, 4260000, 5), - (1082059, 4007000, 6), - (1082059, 4260001, 6), - (1082060, 4007002, 6), - (1082060, 4260001, 6), - (1082061, 4007007, 6), - (1082061, 4260001, 6), - (1082103, 4007000, 7), - (1082103, 4260002, 7), - (1082104, 4007002, 7), - (1082104, 4260002, 7), - (1082105, 4007007, 7), - (1082105, 4260002, 7), - (1082114, 4007002, 8), - (1082114, 4260003, 8), - (1082115, 4007003, 8), - (1082115, 4260003, 8), - (1082116, 4007006, 8), - (1082116, 4260003, 8), - (1082117, 4007007, 8), - (1082117, 4260003, 8), - (1082128, 4007003, 9), - (1082128, 4260004, 9), - (1082129, 4007005, 9), - (1082129, 4260004, 9), - (1082130, 4007007, 9), - (1082130, 4260004, 9), - (1082139, 4007003, 10), - (1082139, 4260005, 10), - (1082140, 4007002, 10), - (1082140, 4260005, 10), - (1082141, 4007007, 10), - (1082141, 4260005, 10), - (1082168, 4007002, 11), - (1082168, 4260006, 11), - (1082168, 4000244, 5), - (1082168, 4000245, 5), - (1082239, 4007007, 12), - (1082239, 4260007, 8), - (1082239, 4260008, 4), - (1082239, 4020009, 15), - (1082234, 4007007, 12), - (1082234, 4260007, 2), - (1082234, 4260008, 10), - (1082234, 4021010, 1), - (1092004, 4007001, 5), - (1092004, 4260000, 5), - (1092009, 4007000, 6), - (1092009, 4260001, 6), - (1092010, 4007001, 6), - (1092010, 4260001, 6), - (1092011, 4007004, 6), - (1092011, 4260001, 6), - (1092015, 4007001, 7), - (1092015, 4260002, 7), - (1092016, 4007001, 7), - (1092016, 4260002, 7), - (1092017, 4007004, 7), - (1092017, 4260002, 7), - (1092023, 4007001, 8), - (1092023, 4260003, 8), - (1092024, 4007001, 8), - (1092024, 4260003, 8), - (1092025, 4007004, 8), - (1092025, 4260003, 8), - (1092026, 4007000, 9), - (1092026, 4260004, 9), - (1092027, 4007001, 9), - (1092027, 4260004, 9), - (1092028, 4007004, 9), - (1092028, 4260004, 9), - (1092036, 4007003, 10), - (1092036, 4260005, 10), - (1092037, 4007005, 10), - (1092037, 4260005, 10), - (1092038, 4007002, 10), - (1092038, 4260005, 10), - (1092060, 4007001, 11), - (1092060, 4260006, 11), - (1092060, 4000244, 5), - (1092060, 4000245, 5), - (1092058, 4007002, 12), - (1092058, 4260007, 2), - (1092058, 4260008, 10), - (1092058, 4021010, 1), - (1302010, 4011000, 1), - (1302010, 4260000, 20), - (1312008, 4011000, 1), - (1312008, 4260000, 20), - (1322017, 4011000, 1), - (1322017, 4260000, 20), - (1402003, 4011000, 1), - (1402003, 4260000, 20), - (1412003, 4011000, 1), - (1412003, 4260000, 20), - (1422005, 4011000, 1), - (1422005, 4260000, 20), - (1432004, 4011000, 1), - (1432004, 4260000, 20), - (1442005, 4011000, 1), - (1442005, 4260000, 20), - (1302011, 4011001, 2), - (1302011, 4260001, 22), - (1312009, 4011001, 2), - (1312009, 4260001, 22), - (1322018, 4011001, 2), - (1322018, 4260001, 22), - (1402011, 4011001, 2), - (1402011, 4260001, 22), - (1412007, 4011001, 2), - (1412007, 4260001, 22), - (1422009, 4011001, 2), - (1422009, 4260001, 22), - (1432006, 4011001, 2), - (1432006, 4260001, 22), - (1442010, 4011001, 2), - (1442010, 4260001, 22), - (1302012, 4011001, 3), - (1302012, 4260002, 24), - (1312010, 4011001, 3), - (1312010, 4260002, 24), - (1322019, 4011001, 3), - (1322019, 4260002, 24), - (1402012, 4011001, 3), - (1402012, 4260002, 24), - (1412008, 4011001, 3), - (1412008, 4260002, 24), - (1422010, 4011001, 3), - (1422010, 4260002, 24), - (1432007, 4011001, 3), - (1432007, 4260002, 24), - (1442008, 4011001, 3), - (1442008, 4260002, 24), - (1322020, 4011001, 3), - (1322020, 4260002, 24), - (1302018, 4011002, 3), - (1302018, 4260003, 26), - (1312011, 4011002, 3), - (1312011, 4260003, 26), - (1322028, 4011002, 3), - (1322028, 4260003, 26), - (1402004, 4011002, 3), - (1402004, 4260003, 26), - (1402015, 4011002, 3), - (1402015, 4260003, 26), - (1412009, 4011002, 3), - (1412009, 4260003, 26), - (1422012, 4011002, 3), - (1422012, 4260003, 26), - (1432010, 4011002, 3), - (1432010, 4260003, 26), - (1442019, 4011002, 3), - (1442019, 4260003, 26), - (1302023, 4011002, 4), - (1302023, 4260004, 28), - (1312015, 4011002, 4), - (1312015, 4260004, 28), - (1322029, 4011002, 4), - (1322029, 4260004, 28), - (1402005, 4011002, 4), - (1402005, 4260004, 28), - (1402016, 4011002, 4), - (1402016, 4260004, 28), - (1412010, 4011002, 4), - (1412010, 4260004, 28), - (1422013, 4011002, 4), - (1422013, 4260004, 28), - (1432011, 4011002, 4), - (1432011, 4260004, 28), - (1442020, 4011002, 4), - (1442020, 4260004, 28), - (1302056, 4011003, 4), - (1302056, 4260005, 30), - (1312030, 4011003, 4), - (1312030, 4260005, 30), - (1322045, 4011003, 4), - (1322045, 4260005, 30), - (1402035, 4011003, 4), - (1402035, 4260005, 30), - (1412021, 4011003, 4), - (1412021, 4260005, 30), - (1422027, 4011003, 4), - (1422027, 4260005, 30), - (1432030, 4011003, 4), - (1432030, 4260005, 30), - (1442044, 4011003, 4), - (1442044, 4260005, 30), - (1302059, 4011003, 5), - (1302059, 4260006, 32), - (1302059, 4000244, 20), - (1302059, 4000245, 20), - (1312031, 4011003, 5), - (1312031, 4260006, 32), - (1312031, 4000244, 20), - (1312031, 4000245, 20), - (1322052, 4011003, 5), - (1322052, 4260006, 32), - (1322052, 4000244, 20), - (1322052, 4000245, 20), - (1402036, 4011003, 5), - (1402036, 4260006, 32), - (1402036, 4000244, 20), - (1402036, 4000245, 20), - (1412026, 4011003, 5), - (1412026, 4260006, 32), - (1412026, 4000244, 20), - (1412026, 4000245, 20), - (1422028, 4011003, 5), - (1422028, 4260006, 32), - (1422028, 4000244, 20), - (1422028, 4000245, 20), - (1432038, 4011003, 5), - (1432038, 4260006, 32), - (1432038, 4000244, 20), - (1432038, 4000245, 20), - (1442045, 4011003, 5), - (1442045, 4260006, 32), - (1442045, 4000244, 20), - (1442045, 4000245, 20), - (1302086, 4011005, 5), - (1302086, 4260007, 20), - (1302086, 4260008, 14), - (1302086, 4020009, 45), - (1312038, 4011005, 5), - (1312038, 4260007, 20), - (1312038, 4260008, 14), - (1312038, 4020009, 45), - (1322061, 4011005, 5), - (1322061, 4260007, 20), - (1322061, 4260008, 14), - (1322061, 4020009, 45), - (1402047, 4011005, 5), - (1402047, 4260007, 20), - (1402047, 4260008, 14), - (1402047, 4020009, 45), - (1412034, 4011005, 5), - (1412034, 4260007, 20), - (1412034, 4260008, 14), - (1412034, 4020009, 45), - (1422038, 4011005, 5), - (1422038, 4260007, 20), - (1422038, 4260008, 14), - (1422038, 4020009, 45), - (1432049, 4011005, 5), - (1432049, 4260007, 20), - (1432049, 4260008, 14), - (1432049, 4020009, 45), - (1442067, 4011005, 5), - (1442067, 4260007, 20), - (1442067, 4260008, 14), - (1442067, 4020009, 45), - (1302081, 4011005, 5), - (1302081, 4260007, 14), - (1302081, 4260008, 20), - (1302081, 4021010, 3), - (1312037, 4011005, 5), - (1312037, 4260007, 14), - (1312037, 4260008, 20), - (1312037, 4021010, 3), - (1322060, 4011005, 5), - (1322060, 4260007, 14), - (1322060, 4260008, 20), - (1322060, 4021010, 3), - (1402046, 4011005, 5), - (1402046, 4260007, 14), - (1402046, 4260008, 20), - (1402046, 4021010, 3), - (1412033, 4011005, 5), - (1412033, 4260007, 14), - (1412033, 4260008, 20), - (1412033, 4021010, 3), - (1422037, 4011005, 5), - (1422037, 4260007, 14), - (1422037, 4260008, 20), - (1422037, 4021010, 3), - (1432047, 4011005, 5), - (1432047, 4260007, 14), - (1432047, 4260008, 20), - (1432047, 4021010, 3), - (1442063, 4011005, 5), - (1442063, 4260007, 14), - (1442063, 4260008, 20), - (1442063, 4021010, 3), - (1002215, 4007006, 5), - (1002215, 4260000, 5), - (1002216, 4007002, 5), - (1002216, 4260000, 5), - (1002217, 4007004, 5), - (1002217, 4260000, 5), - (1002218, 4007007, 5), - (1002218, 4260000, 5), - (1002242, 4007006, 6), - (1002242, 4260001, 6), - (1002243, 4007002, 6), - (1002243, 4260001, 6), - (1002244, 4007003, 6), - (1002244, 4260001, 6), - (1002245, 4007001, 6), - (1002245, 4260001, 6), - (1002246, 4007007, 6), - (1002246, 4260001, 6), - (1002252, 4007006, 7), - (1002252, 4260002, 7), - (1002253, 4007002, 7), - (1002253, 4260002, 7), - (1002254, 4007007, 7), - (1002254, 4260002, 7), - (1002271, 4007003, 8), - (1002271, 4260003, 8), - (1002272, 4007002, 8), - (1002272, 4260003, 8), - (1002273, 4007005, 8), - (1002273, 4260003, 8), - (1002274, 4007007, 8), - (1002274, 4260003, 8), - (1002363, 4007003, 9), - (1002363, 4260004, 9), - (1002364, 4007002, 9), - (1002364, 4260004, 9), - (1002365, 4007006, 9), - (1002365, 4260004, 9), - (1002366, 4007007, 9), - (1002366, 4260004, 9), - (1002398, 4007003, 10), - (1002398, 4260005, 10), - (1002399, 4007002, 10), - (1002399, 4260005, 10), - (1002400, 4007006, 10), - (1002400, 4260005, 10), - (1002401, 4007007, 10), - (1002401, 4260005, 10), - (1002773, 4007004, 11), - (1002773, 4260006, 11), - (1002773, 4000244, 5), - (1002773, 4000245, 5), - (1002791, 4007002, 12), - (1002791, 4260007, 8), - (1002791, 4260008, 4), - (1002791, 4020009, 15), - (1002777, 4007002, 12), - (1002777, 4260007, 2), - (1002777, 4260008, 10), - (1002777, 4021010, 1), - (1050045, 4007002, 5), - (1050045, 4260000, 10), - (1050046, 4007006, 5), - (1050046, 4260000, 10), - (1050047, 4007004, 5), - (1050047, 4260000, 10), - (1050048, 4007001, 5), - (1050048, 4260000, 10), - (1050049, 4007007, 5), - (1050049, 4260000, 10), - (1051030, 4007007, 5), - (1051030, 4260000, 10), - (1051031, 4007001, 5), - (1051031, 4260000, 10), - (1051032, 4007002, 5), - (1051032, 4260000, 10), - (1051033, 4007006, 5), - (1051033, 4260000, 10), - (1051034, 4007004, 5), - (1051034, 4260000, 10), - (1050053, 4007002, 6), - (1050053, 4260001, 12), - (1050054, 4007006, 6), - (1050054, 4260001, 12), - (1050055, 4007001, 6), - (1050055, 4260001, 12), - (1050056, 4007007, 6), - (1050056, 4260001, 12), - (1051044, 4007002, 6), - (1051044, 4260001, 12), - (1051045, 4007006, 6), - (1051045, 4260001, 12), - (1051046, 4007001, 6), - (1051046, 4260001, 12), - (1051047, 4007007, 6), - (1051047, 4260001, 12), - (1050067, 4007002, 7), - (1050067, 4260002, 14), - (1050068, 4007006, 7), - (1050068, 4260002, 14), - (1050069, 4007000, 7), - (1050069, 4260002, 14), - (1050070, 4007007, 7), - (1050070, 4260002, 14), - (1051052, 4007002, 7), - (1051052, 4260002, 14), - (1051053, 4007006, 7), - (1051053, 4260002, 14), - (1051054, 4007000, 7), - (1051054, 4260002, 14), - (1051055, 4007007, 7), - (1051055, 4260002, 14), - (1050072, 4007003, 8), - (1050072, 4260003, 16), - (1050073, 4007002, 8), - (1050073, 4260003, 16), - (1050074, 4007007, 8), - (1050074, 4260003, 16), - (1051056, 4007003, 8), - (1051056, 4260003, 16), - (1051057, 4007005, 8), - (1051057, 4260003, 16), - (1051058, 4007007, 8), - (1051058, 4260003, 16), - (1050092, 4007003, 9), - (1050092, 4260004, 18), - (1050093, 4007002, 9), - (1050093, 4260004, 18), - (1050094, 4007006, 9), - (1050094, 4260004, 18), - (1050095, 4007007, 9), - (1050095, 4260004, 18), - (1051094, 4007003, 9), - (1051094, 4260004, 18), - (1051095, 4007002, 9), - (1051095, 4260004, 18), - (1051096, 4007006, 9), - (1051096, 4260004, 18), - (1051097, 4007007, 9), - (1051097, 4260004, 18), - (1050102, 4007003, 10), - (1050102, 4260005, 20), - (1050103, 4007002, 10), - (1050103, 4260005, 20), - (1050104, 4007006, 10), - (1050104, 4260005, 20), - (1050105, 4007007, 10), - (1050105, 4260005, 20), - (1051101, 4007003, 10), - (1051101, 4260005, 20), - (1051102, 4007002, 10), - (1051102, 4260005, 20), - (1051103, 4007006, 10), - (1051103, 4260005, 20), - (1051104, 4007007, 10), - (1051104, 4260005, 20), - (1052076, 4007007, 11), - (1052076, 4260006, 22), - (1052076, 4000244, 5), - (1052076, 4000245, 5), - (1052161, 4007002, 12), - (1052161, 4260007, 16), - (1052161, 4260008, 8), - (1052161, 4020009, 15), - (1052156, 4007002, 12), - (1052156, 4260007, 4), - (1052156, 4260008, 20), - (1052156, 4021010, 1), - (1072140, 4007001, 2), - (1072140, 4007006, 3), - (1072140, 4260000, 5), - (1072141, 4007002, 5), - (1072141, 4260000, 5), - (1072142, 4007005, 5), - (1072142, 4260000, 5), - (1072143, 4007003, 5), - (1072143, 4260000, 5), - (1072136, 4007001, 3), - (1072136, 4007006, 3), - (1072136, 4260001, 6), - (1072137, 4007003, 6), - (1072137, 4260001, 6), - (1072138, 4007004, 6), - (1072138, 4260001, 6), - (1072139, 4007002, 6), - (1072139, 4260001, 6), - (1072157, 4007002, 7), - (1072157, 4260002, 7), - (1072158, 4007006, 7), - (1072158, 4260002, 7), - (1072159, 4007000, 7), - (1072159, 4260002, 7), - (1072160, 4007004, 7), - (1072160, 4260002, 7), - (1072177, 4007003, 8), - (1072177, 4260003, 8), - (1072178, 4007005, 8), - (1072178, 4260003, 8), - (1072179, 4007007, 8), - (1072179, 4260003, 8), - (1072206, 4007002, 9), - (1072206, 4260004, 9), - (1072207, 4007003, 9), - (1072207, 4260004, 9), - (1072208, 4007006, 9), - (1072208, 4260004, 9), - (1072209, 4007007, 9), - (1072209, 4260004, 9), - (1072223, 4007003, 10), - (1072223, 4260005, 10), - (1072224, 4007002, 10), - (1072224, 4260005, 10), - (1072225, 4007006, 10), - (1072225, 4260005, 10), - (1072226, 4007007, 10), - (1072226, 4260005, 10), - (1072268, 4007002, 11), - (1072268, 4260006, 11), - (1072268, 4000244, 5), - (1072268, 4000245, 5), - (1072362, 4007004, 12), - (1072362, 4260007, 8), - (1072362, 4260008, 4), - (1072362, 4020009, 15), - (1072356, 4007004, 12), - (1072356, 4260007, 2), - (1072356, 4260008, 10), - (1072356, 4021010, 1), - (1082080, 4007007, 5), - (1082080, 4260000, 5), - (1082081, 4007006, 5), - (1082081, 4260000, 5), - (1082082, 4007002, 5), - (1082082, 4260000, 5), - (1082086, 4007001, 6), - (1082086, 4260001, 6), - (1082087, 4007004, 6), - (1082087, 4260001, 6), - (1082088, 4007007, 6), - (1082088, 4260001, 6), - (1082098, 4007000, 7), - (1082098, 4260002, 7), - (1082099, 4007002, 7), - (1082099, 4260002, 7), - (1082100, 4007007, 7), - (1082100, 4260002, 7), - (1082121, 4007003, 8), - (1082121, 4260003, 8), - (1082122, 4007002, 8), - (1082122, 4260003, 8), - (1082123, 4007007, 8), - (1082123, 4260003, 8), - (1082131, 4007002, 9), - (1082131, 4260004, 9), - (1082132, 4007003, 9), - (1082132, 4260004, 9), - (1082133, 4007006, 9), - (1082133, 4260004, 9), - (1082134, 4007007, 9), - (1082134, 4260004, 9), - (1082151, 4007003, 10), - (1082151, 4260005, 10), - (1082152, 4007002, 10), - (1082152, 4260005, 10), - (1082153, 4007006, 10), - (1082153, 4260005, 10), - (1082154, 4007005, 10), - (1082154, 4260005, 10), - (1082164, 4007002, 11), - (1082164, 4260006, 11), - (1082164, 4000244, 5), - (1082164, 4000245, 5), - (1082240, 4007002, 12), - (1082240, 4260007, 8), - (1082240, 4260008, 4), - (1082240, 4020009, 15), - (1082235, 4007002, 12), - (1082235, 4260007, 2), - (1082235, 4260008, 10), - (1082235, 4021010, 1), - (1092057, 4007004, 12), - (1092057, 4260007, 2), - (1092057, 4260008, 10), - (1092057, 4021010, 1), - (1372007, 4011000, 1), - (1372007, 4260000, 20), - (1382006, 4011000, 1), - (1382006, 4260000, 20), - (1372014, 4011001, 2), - (1372014, 4260001, 22), - (1382007, 4011001, 2), - (1382007, 4260001, 22), - (1372015, 4011001, 3), - (1372015, 4260002, 24), - (1382010, 4011001, 3), - (1382010, 4260002, 24), - (1372016, 4011002, 3), - (1372016, 4260003, 26), - (1382008, 4011002, 3), - (1382008, 4260004, 26), - (1372009, 4011002, 4), - (1372009, 4260004, 28), - (1382035, 4011002, 4), - (1382035, 4260004, 28), - (1372010, 4011003, 4), - (1372010, 4260005, 30), - (1372032, 4011003, 5), - (1372032, 4260006, 32), - (1372032, 4000244, 20), - (1372032, 4000245, 20), - (1382036, 4011003, 5), - (1382036, 4260006, 32), - (1382036, 4000244, 20), - (1382036, 4000245, 20), - (1372045, 4011005, 5), - (1372045, 4260007, 20), - (1372045, 4260008, 14), - (1372045, 4020009, 45), - (1382059, 4011005, 5), - (1382059, 4260007, 20), - (1382059, 4260008, 14), - (1382059, 4020009, 45), - (1372044, 4011005, 5), - (1372044, 4260007, 14), - (1372044, 4260008, 20), - (1372044, 4021010, 3), - (1382057, 4011005, 5), - (1382057, 4260007, 14), - (1382057, 4260008, 20), - (1382057, 4021010, 3), - (1002211, 4007002, 5), - (1002211, 4260000, 5), - (1002212, 4007006, 5), - (1002212, 4260000, 5), - (1002213, 4007003, 5), - (1002213, 4260000, 5), - (1002214, 4007007, 5), - (1002214, 4260000, 5), - (1002267, 4007006, 6), - (1002267, 4260001, 6), - (1002268, 4007000, 6), - (1002268, 4260001, 6), - (1002269, 4007001, 6), - (1002269, 4260001, 6), - (1002270, 4007007, 6), - (1002270, 4260001, 6), - (1002286, 4007002, 7), - (1002286, 4260002, 7), - (1002287, 4007001, 4), - (1002287, 4007004, 3), - (1002287, 4260002, 7), - (1002288, 4007003, 7), - (1002288, 4260002, 7), - (1002289, 4007007, 7), - (1002289, 4260002, 7), - (1002275, 4007002, 8), - (1002275, 4260003, 8), - (1002276, 4007006, 8), - (1002276, 4260003, 8), - (1002277, 4007003, 8), - (1002277, 4260003, 8), - (1002278, 4007007, 8), - (1002278, 4260003, 8), - (1002402, 4007006, 9), - (1002402, 4260004, 9), - (1002403, 4007002, 9), - (1002403, 4260004, 9), - (1002404, 4007003, 9), - (1002404, 4260004, 9), - (1002405, 4007007, 9), - (1002405, 4260004, 9), - (1002406, 4007006, 10), - (1002406, 4260005, 10), - (1002407, 4007002, 10), - (1002407, 4260005, 10), - (1002408, 4007003, 10), - (1002408, 4260005, 10), - (1002547, 4007006, 11), - (1002547, 4260006, 11), - (1002547, 4000244, 5), - (1002547, 4000245, 5), - (1002792, 4007005, 12), - (1002792, 4260007, 8), - (1002792, 4260008, 4), - (1002792, 4020009, 15), - (1002778, 4007005, 12), - (1002778, 4260007, 2), - (1002778, 4260008, 10), - (1002778, 4021010, 1), - (1050051, 4007006, 5), - (1050051, 4260000, 10), - (1050052, 4007002, 5), - (1050052, 4260000, 10), - (1051037, 4007002, 5), - (1051037, 4260000, 10), - (1051038, 4007003, 5), - (1051038, 4260000, 10), - (1051039, 4007006, 5), - (1051039, 4260000, 10), - (1050058, 4007005, 6), - (1050058, 4260001, 12), - (1050059, 4007002, 6), - (1050059, 4260001, 12), - (1050060, 4007006, 6), - (1050060, 4260001, 12), - (1051041, 4007006, 6), - (1051041, 4260001, 12), - (1051042, 4007002, 6), - (1051042, 4260001, 12), - (1051043, 4007004, 6), - (1051043, 4260001, 12), - (1050061, 4007002, 7), - (1050061, 4260002, 14), - (1050062, 4007001, 4), - (1050062, 4007004, 3), - (1050062, 4260002, 14), - (1050063, 4007003, 7), - (1050063, 4260002, 14), - (1050064, 4007007, 7), - (1050064, 4260002, 14), - (1051062, 4007002, 7), - (1051062, 4260002, 14), - (1051063, 4007001, 4), - (1051063, 4007004, 3), - (1051063, 4260002, 14), - (1051064, 4007003, 7), - (1051064, 4260002, 14), - (1051065, 4007007, 7), - (1051065, 4260002, 14), - (1050075, 4007006, 8), - (1050075, 4260003, 16), - (1050076, 4007002, 8), - (1050076, 4260003, 16), - (1050077, 4007003, 8), - (1050077, 4260003, 16), - (1050078, 4007007, 8), - (1050078, 4260003, 16), - (1051066, 4007006, 8), - (1051066, 4260003, 16), - (1051067, 4007002, 8), - (1051067, 4260003, 16), - (1051068, 4007003, 8), - (1051068, 4260003, 16), - (1051069, 4007007, 8), - (1051069, 4260003, 16), - (1050088, 4007006, 9), - (1050088, 4260004, 18), - (1050089, 4007002, 9), - (1050089, 4260004, 18), - (1050090, 4007003, 9), - (1050090, 4260004, 18), - (1050091, 4007007, 9), - (1050091, 4260004, 18), - (1051082, 4007006, 9), - (1051082, 4260004, 18), - (1051083, 4007002, 9), - (1051083, 4260004, 18), - (1051084, 4007003, 9), - (1051084, 4260004, 18), - (1051085, 4007007, 9), - (1051085, 4260004, 18), - (1050106, 4007003, 10), - (1050106, 4260005, 20), - (1050107, 4007002, 10), - (1050107, 4260005, 20), - (1050108, 4007006, 10), - (1050108, 4260005, 20), - (1051105, 4007003, 10), - (1051105, 4260005, 20), - (1051106, 4007002, 10), - (1051106, 4260005, 20), - (1051107, 4007006, 10), - (1051107, 4260005, 20), - (1052071, 4007006, 11), - (1052071, 4260006, 22), - (1052071, 4000244, 5), - (1052071, 4000245, 5), - (1052162, 4007005, 12), - (1052162, 4260007, 16), - (1052162, 4260008, 8), - (1052162, 4020009, 15), - (1052157, 4007005, 12), - (1052157, 4260007, 4), - (1052157, 4260008, 20), - (1052157, 4021010, 1), - (1072122, 4007000, 5), - (1072122, 4260000, 5), - (1072123, 4007003, 5), - (1072123, 4260000, 5), - (1072124, 4007002, 5), - (1072124, 4260000, 5), - (1072125, 4007005, 5), - (1072125, 4260000, 5), - (1072144, 4007006, 6), - (1072144, 4260001, 6), - (1072145, 4007002, 6), - (1072145, 4260001, 6), - (1072146, 4007003, 6), - (1072146, 4260001, 6), - (1072164, 4007002, 7), - (1072164, 4260002, 7), - (1072165, 4007001, 4), - (1072165, 4007004, 3), - (1072165, 4260002, 7), - (1072166, 4007003, 7), - (1072166, 4260002, 7), - (1072167, 4007007, 7), - (1072167, 4260002, 7), - (1072182, 4007002, 8), - (1072182, 4260003, 8), - (1072183, 4007006, 8), - (1072183, 4260003, 8), - (1072184, 4007003, 8), - (1072184, 4260003, 8), - (1072185, 4007007, 8), - (1072185, 4260003, 8), - (1072203, 4007006, 9), - (1072203, 4260004, 9), - (1072204, 4007003, 9), - (1072204, 4260004, 9), - (1072205, 4007007, 9), - (1072205, 4260004, 9), - (1072227, 4007006, 10), - (1072227, 4260005, 10), - (1072228, 4007002, 10), - (1072228, 4260005, 10), - (1072229, 4007003, 10), - (1072229, 4260005, 10), - (1072269, 4007006, 11), - (1072269, 4260006, 11), - (1072269, 4000244, 5), - (1072269, 4000245, 5), - (1072363, 4007004, 12), - (1072363, 4260007, 8), - (1072363, 4260008, 4), - (1072363, 4020009, 15), - (1072357, 4007005, 12), - (1072357, 4260007, 2), - (1072357, 4260008, 10), - (1072357, 4021010, 1), - (1082083, 4007007, 5), - (1082083, 4260000, 5), - (1082084, 4007002, 5), - (1082084, 4260000, 5), - (1082085, 4007006, 5), - (1082085, 4260000, 5), - (1082089, 4007004, 6), - (1082089, 4260001, 6), - (1082090, 4007006, 6), - (1082090, 4260001, 6), - (1082091, 4007007, 6), - (1082091, 4260001, 6), - (1082106, 4007002, 7), - (1082106, 4260002, 7), - (1082107, 4007004, 7), - (1082107, 4260002, 7), - (1082108, 4007007, 7), - (1082108, 4260002, 7), - (1082109, 4007006, 8), - (1082109, 4260003, 8), - (1082110, 4007002, 8), - (1082110, 4260003, 8), - (1082111, 4007003, 8), - (1082111, 4260003, 8), - (1082112, 4007007, 8), - (1082112, 4260003, 8), - (1082125, 4007006, 9), - (1082125, 4260004, 9), - (1082126, 4007003, 9), - (1082126, 4260004, 9), - (1082127, 4007007, 9), - (1082127, 4260004, 9), - (1082158, 4007006, 10), - (1082158, 4260005, 10), - (1082159, 4007002, 10), - (1082159, 4260005, 10), - (1082160, 4007003, 10), - (1082160, 4260005, 10), - (1082163, 4007006, 11), - (1082163, 4260006, 11), - (1082163, 4000244, 5), - (1082163, 4000245, 5), - (1082241, 4007001, 12), - (1082241, 4260007, 8), - (1082241, 4260008, 4), - (1082241, 4020009, 15), - (1082236, 4007001, 12), - (1082236, 4260007, 2), - (1082236, 4260008, 10), - (1082236, 4021010, 1), - (1452008, 4011000, 1), - (1452008, 4260000, 20), - (1462007, 4011000, 1), - (1462007, 4260000, 20), - (1452004, 4011001, 2), - (1452004, 4260001, 22), - (1462008, 4011001, 2), - (1462008, 4260001, 22), - (1452009, 4007006, 7), - (1452009, 4011001, 3), - (1452009, 4260002, 24), - (1452010, 4007002, 7), - (1452010, 4011001, 3), - (1452010, 4260002, 24), - (1452011, 4007004, 7), - (1452011, 4011001, 3), - (1452011, 4260002, 24), - (1462009, 4011001, 3), - (1462009, 4260002, 24), - (1452012, 4007002, 8), - (1452012, 4011002, 3), - (1452012, 4260003, 26), - (1452013, 4007006, 8), - (1452013, 4011002, 3), - (1452013, 4260003, 26), - (1452014, 4007004, 8), - (1452014, 4011002, 3), - (1452014, 4260003, 26), - (1452015, 4007007, 8), - (1452015, 4011002, 3), - (1452015, 4260003, 26), - (1462010, 4007002, 8), - (1462010, 4011002, 3), - (1462010, 4260003, 26), - (1462011, 4007006, 8), - (1462011, 4011002, 3), - (1462011, 4260003, 26), - (1462012, 4007004, 8), - (1462012, 4011002, 3), - (1462012, 4260003, 26), - (1462013, 4007007, 8), - (1462013, 4011002, 3), - (1462013, 4260003, 26), - (1452017, 4011002, 4), - (1452017, 4260004, 28), - (1462018, 4011002, 4), - (1462018, 4260004, 28), - (1452019, 4007001, 10), - (1452019, 4011003, 4), - (1452019, 4260005, 30), - (1452020, 4007004, 10), - (1452020, 4011003, 4), - (1452020, 4260005, 30), - (1452021, 4007007, 10), - (1452021, 4011003, 4), - (1452021, 4260005, 30), - (1462015, 4007001, 10), - (1462015, 4011003, 4), - (1462015, 4260005, 30), - (1462016, 4007004, 10), - (1462016, 4011003, 4), - (1462016, 4260005, 30), - (1462017, 4007007, 10), - (1462017, 4011003, 4), - (1462017, 4260005, 30), - (1452044, 4011003, 5), - (1452044, 4260006, 32), - (1452044, 4000244, 20), - (1452044, 4000245, 20), - (1462039, 4011003, 5), - (1462039, 4260006, 32), - (1462039, 4000244, 20), - (1462039, 4000245, 20), - (1452059, 4011005, 5), - (1452059, 4260007, 20), - (1452059, 4260008, 14), - (1452059, 4020009, 45), - (1462051, 4011005, 5), - (1462051, 4260007, 20), - (1462051, 4260008, 14), - (1462051, 4020009, 45), - (1452057, 4011005, 5), - (1452057, 4260007, 14), - (1452057, 4260008, 20), - (1452057, 4021010, 3), - (1462050, 4011005, 5), - (1462050, 4260007, 14), - (1462050, 4260008, 20), - (1462050, 4021010, 3), - (1002207, 4007006, 5), - (1002207, 4260000, 5), - (1002208, 4007002, 5), - (1002208, 4260000, 5), - (1002209, 4007003, 5), - (1002209, 4260000, 5), - (1002210, 4007004, 5), - (1002210, 4260000, 5), - (1002247, 4007000, 6), - (1002247, 4260001, 6), - (1002248, 4007001, 6), - (1002248, 4260001, 6), - (1002249, 4007007, 6), - (1002249, 4260001, 6), - (1002281, 4007000, 7), - (1002281, 4260002, 7), - (1002282, 4007002, 7), - (1002282, 4260002, 7), - (1002283, 4007005, 7), - (1002283, 4260002, 7), - (1002284, 4007001, 7), - (1002284, 4260002, 7), - (1002285, 4007006, 7), - (1002285, 4260002, 7), - (1002327, 4007000, 8), - (1002327, 4260003, 8), - (1002328, 4007003, 8), - (1002328, 4260003, 8), - (1002329, 4007006, 8), - (1002329, 4260003, 8), - (1002330, 4007007, 8), - (1002330, 4260003, 8), - (1002323, 4007003, 9), - (1002323, 4260004, 9), - (1002324, 4007000, 9), - (1002324, 4260004, 9), - (1002325, 4007005, 9), - (1002325, 4260004, 9), - (1002326, 4007006, 9), - (1002326, 4260004, 9), - (1002380, 4007003, 10), - (1002380, 4260005, 10), - (1002381, 4007002, 10), - (1002381, 4260005, 10), - (1002382, 4007006, 10), - (1002382, 4260005, 10), - (1002383, 4007007, 10), - (1002383, 4260005, 10), - (1002550, 4007007, 11), - (1002550, 4260006, 11), - (1002550, 4000244, 5), - (1002550, 4000245, 5), - (1002793, 4007005, 12), - (1002793, 4260007, 8), - (1002793, 4260008, 4), - (1002793, 4020009, 15), - (1002779, 4007005, 12), - (1002779, 4260007, 2), - (1002779, 4260008, 10), - (1002779, 4021010, 1), - (1040094, 4007006, 5), - (1040094, 4260000, 5), - (1040095, 4007002, 5), - (1040095, 4260000, 5), - (1040096, 4007004, 5), - (1040096, 4260000, 5), - (1040097, 4007003, 5), - (1040097, 4260000, 5), - (1041077, 4007005, 5), - (1041077, 4260000, 5), - (1041078, 4007002, 5), - (1041078, 4260000, 5), - (1041079, 4007004, 5), - (1041079, 4260000, 5), - (1041080, 4007006, 5), - (1041080, 4260000, 5), - (1040098, 4007001, 6), - (1040098, 4260001, 6), - (1040099, 4007004, 6), - (1040099, 4260001, 6), - (1040100, 4007007, 6), - (1040100, 4260001, 6), - (1041094, 4007001, 6), - (1041094, 4260001, 6), - (1041095, 4007006, 6), - (1041095, 4260001, 6), - (1041096, 4007007, 6), - (1041096, 4260001, 6), - (1040105, 4007000, 7), - (1040105, 4260002, 7), - (1040106, 4007002, 7), - (1040106, 4260002, 7), - (1040107, 4007007, 7), - (1040107, 4260002, 7), - (1041100, 4007005, 7), - (1041100, 4260002, 7), - (1041101, 4007002, 7), - (1041101, 4260002, 7), - (1041102, 4007006, 7), - (1041102, 4260002, 7), - (1041103, 4007006, 7), - (1041103, 4260002, 7), - (1040108, 4007003, 8), - (1040108, 4260003, 8), - (1040109, 4007006, 8), - (1040109, 4260003, 8), - (1040110, 4007007, 8), - (1040110, 4260003, 8), - (1041105, 4007003, 8), - (1041105, 4260003, 8), - (1041106, 4007006, 8), - (1041106, 4260003, 8), - (1041107, 4007007, 8), - (1041107, 4260003, 8), - (1040115, 4007003, 9), - (1040115, 4260004, 9), - (1040116, 4007000, 9), - (1040116, 4260004, 9), - (1040117, 4007005, 9), - (1040117, 4260004, 9), - (1040118, 4007006, 9), - (1040118, 4260004, 9), - (1041115, 4007003, 9), - (1041115, 4260004, 9), - (1041116, 4007000, 9), - (1041116, 4260004, 9), - (1041117, 4007005, 9), - (1041117, 4260004, 9), - (1041118, 4007006, 9), - (1041118, 4260004, 9), - (1060083, 4007006, 5), - (1060083, 4260000, 5), - (1060084, 4007002, 5), - (1060084, 4260000, 5), - (1060085, 4007004, 5), - (1060085, 4260000, 5), - (1060086, 4007003, 5), - (1060086, 4260000, 5), - (1061076, 4007005, 5), - (1061076, 4260000, 5), - (1061077, 4007002, 5), - (1061077, 4260000, 5), - (1061078, 4007004, 5), - (1061078, 4260000, 5), - (1061079, 4007006, 5), - (1061079, 4260000, 5), - (1060087, 4007001, 6), - (1060087, 4260001, 6), - (1060088, 4007004, 6), - (1060088, 4260001, 6), - (1060089, 4007007, 6), - (1060089, 4260001, 6), - (1061093, 4007001, 6), - (1061093, 4260001, 6), - (1061094, 4007006, 6), - (1061094, 4260001, 6), - (1061095, 4007007, 6), - (1061095, 4260001, 6), - (1060093, 4007000, 7), - (1060093, 4260002, 7), - (1060094, 4007002, 7), - (1060094, 4260002, 7), - (1060095, 4007007, 7), - (1060095, 4260002, 7), - (1061099, 4007005, 7), - (1061099, 4260002, 7), - (1061100, 4007002, 7), - (1061100, 4260002, 7), - (1061101, 4007006, 7), - (1061101, 4260002, 7), - (1061102, 4007006, 7), - (1061102, 4260002, 7), - (1060097, 4007003, 8), - (1060097, 4260003, 8), - (1060098, 4007006, 8), - (1060098, 4260003, 8), - (1060099, 4007007, 8), - (1060099, 4260003, 8), - (1061104, 4007003, 8), - (1061104, 4260003, 8), - (1061105, 4007006, 8), - (1061105, 4260003, 8), - (1061106, 4007007, 8), - (1061106, 4260003, 8), - (1060104, 4007003, 9), - (1060104, 4260004, 9), - (1060105, 4007000, 9), - (1060105, 4260004, 9), - (1060106, 4007005, 9), - (1060106, 4260004, 9), - (1060107, 4007006, 9), - (1060107, 4260004, 9), - (1061114, 4007003, 9), - (1061114, 4260004, 9), - (1061115, 4007000, 9), - (1061115, 4260004, 9), - (1061116, 4007005, 9), - (1061116, 4260004, 9), - (1061117, 4007006, 9), - (1061117, 4260004, 9), - (1050096, 4007003, 10), - (1050096, 4260005, 20), - (1050097, 4007002, 10), - (1050097, 4260005, 20), - (1050098, 4007006, 10), - (1050098, 4260005, 20), - (1050099, 4007007, 10), - (1050099, 4260005, 20), - (1051090, 4007003, 10), - (1051090, 4260005, 20), - (1051091, 4007002, 10), - (1051091, 4260005, 20), - (1051092, 4007006, 10), - (1051092, 4260005, 20), - (1051093, 4007007, 10), - (1051093, 4260005, 20), - (1052072, 4007007, 11), - (1052072, 4260006, 22), - (1052072, 4000244, 5), - (1052072, 4000245, 5), - (1052163, 4007005, 12), - (1052163, 4260007, 16), - (1052163, 4260008, 8), - (1052163, 4020009, 15), - (1052158, 4007005, 12), - (1052158, 4260007, 4), - (1052158, 4260008, 20), - (1052158, 4021010, 1), - (1072128, 4007002, 5), - (1072128, 4260000, 5), - (1072129, 4007003, 5), - (1072129, 4260000, 5), - (1072130, 4007006, 5), - (1072130, 4260000, 5), - (1072131, 4007005, 5), - (1072131, 4260000, 5), - (1072150, 4007006, 6), - (1072150, 4260001, 6), - (1072151, 4007004, 6), - (1072151, 4260001, 6), - (1072152, 4007007, 6), - (1072152, 4260001, 6), - (1072161, 4007005, 7), - (1072161, 4260002, 7), - (1072162, 4007002, 7), - (1072162, 4260002, 7), - (1072163, 4007006, 7), - (1072163, 4260002, 7), - (1072172, 4007003, 8), - (1072172, 4260003, 8), - (1072173, 4007006, 8), - (1072173, 4260003, 8), - (1072174, 4007007, 8), - (1072174, 4260003, 8), - (1072192, 4007003, 9), - (1072192, 4260004, 9), - (1072193, 4007000, 9), - (1072193, 4260004, 9), - (1072194, 4007005, 9), - (1072194, 4260004, 9), - (1072195, 4007006, 9), - (1072195, 4260004, 9), - (1072213, 4007003, 10), - (1072213, 4260005, 10), - (1072214, 4007002, 10), - (1072214, 4260005, 10), - (1072215, 4007006, 10), - (1072215, 4260005, 10), - (1072216, 4007007, 10), - (1072216, 4260005, 10), - (1072272, 4007007, 11), - (1072272, 4260006, 11), - (1072272, 4000244, 5), - (1072272, 4000245, 5), - (1072364, 4007005, 12), - (1072364, 4260007, 8), - (1072364, 4260008, 4), - (1072364, 4020009, 15), - (1072358, 4007005, 12), - (1072358, 4260007, 2), - (1072358, 4260008, 10), - (1072358, 4021010, 1), - (1082065, 4007002, 5), - (1082065, 4260000, 5), - (1082066, 4007004, 5), - (1082066, 4260000, 5), - (1082067, 4007006, 5), - (1082067, 4260000, 5), - (1082092, 4007000, 6), - (1082092, 4260001, 6), - (1082093, 4007001, 6), - (1082093, 4260001, 6), - (1082094, 4007004, 6), - (1082094, 4260001, 6), - (1082095, 4007000, 7), - (1082095, 4260002, 7), - (1082096, 4007001, 7), - (1082096, 4260002, 7), - (1082097, 4007004, 7), - (1082097, 4260002, 7), - (1082118, 4007003, 8), - (1082118, 4260003, 8), - (1082119, 4007005, 8), - (1082119, 4260003, 8), - (1082120, 4007006, 8), - (1082120, 4260003, 8), - (1082142, 4007003, 9), - (1082142, 4260004, 9), - (1082143, 4007005, 9), - (1082143, 4260004, 9), - (1082144, 4007007, 9), - (1082144, 4260004, 9), - (1082135, 4007002, 10), - (1082135, 4260005, 10), - (1082136, 4007003, 10), - (1082136, 4260005, 10), - (1082137, 4007006, 10), - (1082137, 4260005, 10), - (1082138, 4007007, 10), - (1082138, 4260005, 10), - (1082167, 4007007, 11), - (1082167, 4260006, 11), - (1082167, 4000244, 5), - (1082167, 4000245, 5), - (1082242, 4007005, 12), - (1082242, 4260007, 8), - (1082242, 4260008, 4), - (1082242, 4020009, 15), - (1082237, 4007005, 12), - (1082237, 4260007, 2), - (1082237, 4260008, 10), - (1082237, 4021010, 1), - (1092059, 4007000, 12), - (1092059, 4260007, 2), - (1092059, 4260008, 10), - (1092059, 4021010, 1), - (1332003, 4011000, 1), - (1332003, 4260000, 20), - (1472018, 4007001, 5), - (1472018, 4011000, 1), - (1472018, 4260000, 20), - (1472019, 4007006, 5), - (1472019, 4011000, 1), - (1472019, 4260000, 20), - (1472020, 4007002, 5), - (1472020, 4011000, 1), - (1472020, 4260000, 20), - (1472021, 4007007, 5), - (1472021, 4011000, 1), - (1472021, 4260000, 20), - (1332016, 4011000, 1), - (1332016, 4260000, 20), - (1332015, 4011001, 2), - (1332015, 4260001, 22), - (1472022, 4007000, 6), - (1472022, 4011001, 2), - (1472022, 4260001, 22), - (1472023, 4007006, 6), - (1472023, 4011001, 2), - (1472023, 4260001, 22), - (1472024, 4007002, 6), - (1472024, 4011001, 2), - (1472024, 4260001, 22), - (1472025, 4007007, 6), - (1472025, 4011001, 2), - (1472025, 4260001, 22), - (1332017, 4011001, 2), - (1332017, 4260001, 22), - (1332018, 4011001, 3), - (1332018, 4260002, 24), - (1472026, 4007004, 7), - (1472026, 4011001, 3), - (1472026, 4260002, 24), - (1472027, 4007003, 7), - (1472027, 4011001, 3), - (1472027, 4260002, 24), - (1472028, 4007002, 7), - (1472028, 4011001, 3), - (1472028, 4260002, 24), - (1472029, 4007007, 7), - (1472029, 4011001, 3), - (1472029, 4260002, 24), - (1332019, 4011001, 3), - (1332019, 4260002, 24), - (1472031, 4011002, 3), - (1472031, 4260003, 26), - (1332022, 4011002, 3), - (1332022, 4260003, 26), - (1332023, 4011002, 3), - (1332023, 4260003, 26), - (1332027, 4011002, 4), - (1332027, 4260004, 28), - (1472033, 4011002, 4), - (1472033, 4260004, 28), - (1332026, 4011002, 4), - (1332026, 4260004, 28), - (1332052, 4011003, 4), - (1332052, 4260005, 30), - (1472053, 4011003, 4), - (1472053, 4260005, 30), - (1332051, 4011003, 4), - (1332051, 4260005, 30), - (1332050, 4011003, 5), - (1332050, 4260006, 32), - (1332050, 4000244, 20), - (1332050, 4000245, 20), - (1472051, 4007003, 11), - (1472051, 4011003, 5), - (1472051, 4260006, 32), - (1472051, 4000244, 20), - (1472051, 4000245, 20), - (1472052, 4007005, 11), - (1472052, 4011003, 5), - (1472052, 4260006, 32), - (1472052, 4000244, 20), - (1472052, 4000245, 20), - (1332049, 4011003, 5), - (1332049, 4260006, 32), - (1332049, 4000244, 20), - (1332049, 4000245, 20), - (1332075, 4011005, 5), - (1332075, 4260007, 20), - (1332075, 4260008, 14), - (1332075, 4020009, 45), - (1332076, 4011005, 5), - (1332076, 4260007, 20), - (1332076, 4260008, 14), - (1332076, 4020009, 45), - (1472071, 4011005, 5), - (1472071, 4260007, 20), - (1472071, 4260008, 14), - (1472071, 4020009, 45), - (1332073, 4011005, 5), - (1332073, 4260007, 14), - (1332073, 4260008, 20), - (1332073, 4021010, 3), - (1332074, 4011005, 5), - (1332074, 4260007, 14), - (1332074, 4260008, 20), - (1332074, 4021010, 3), - (1472068, 4011005, 5), - (1472068, 4260007, 14), - (1472068, 4260008, 20), - (1472068, 4021010, 3), - (1002631, 4007000, 5), - (1002631, 4260000, 5), - (1002634, 4007005, 6), - (1002634, 4260001, 6), - (1002637, 4007007, 7), - (1002637, 4260002, 7), - (1002640, 4007002, 8), - (1002640, 4260003, 8), - (1002643, 4007006, 9), - (1002643, 4260004, 9), - (1002646, 4007007, 10), - (1002646, 4260005, 10), - (1002649, 4007007, 11), - (1002649, 4260006, 11), - (1002649, 4000244, 5), - (1002649, 4000245, 5), - (1002794, 4007006, 12), - (1002794, 4260007, 8), - (1002794, 4260008, 4), - (1002794, 4020009, 15), - (1002780, 4007006, 12), - (1002780, 4260007, 2), - (1002780, 4260008, 10), - (1002780, 4021010, 1), - (1052116, 4007003, 5), - (1052116, 4260000, 10), - (1052119, 4007007, 6), - (1052119, 4260001, 12), - (1052122, 4007006, 7), - (1052122, 4260002, 14), - (1052125, 4007001, 8), - (1052125, 4260003, 16), - (1052128, 4007001, 9), - (1052128, 4260004, 18), - (1052131, 4007006, 10), - (1052131, 4260005, 20), - (1052134, 4007007, 11), - (1052134, 4260006, 22), - (1052134, 4000244, 5), - (1052134, 4000245, 5), - (1052164, 4007006, 12), - (1052164, 4260007, 16), - (1052164, 4260008, 8), - (1052164, 4020009, 15), - (1052159, 4007006, 12), - (1052159, 4260007, 4), - (1052159, 4260008, 20), - (1052159, 4021010, 1), - (1072303, 4007000, 5), - (1072303, 4260000, 5), - (1072306, 4007007, 6), - (1072306, 4260001, 6), - (1072309, 4007007, 7), - (1072309, 4260002, 7), - (1072312, 4007002, 8), - (1072312, 4260003, 8), - (1072315, 4007007, 9), - (1072315, 4260004, 9), - (1072318, 4007007, 10), - (1072318, 4260005, 10), - (1072321, 4007007, 11), - (1072321, 4260006, 11), - (1072321, 4000244, 5), - (1072321, 4000245, 5), - (1072365, 4007006, 12), - (1072365, 4260007, 8), - (1072365, 4260008, 4), - (1072365, 4020009, 15), - (1072359, 4007006, 12), - (1072359, 4260007, 2), - (1072359, 4260008, 10), - (1072359, 4021010, 1), - (1082198, 4007000, 5), - (1082198, 4260000, 5), - (1082201, 4007007, 6), - (1082201, 4260001, 6), - (1082204, 4007007, 7), - (1082204, 4260002, 7), - (1082207, 4007002, 8), - (1082207, 4260003, 8), - (1082210, 4007006, 9), - (1082210, 4260004, 9), - (1082213, 4007007, 10), - (1082213, 4260005, 10), - (1082216, 4007007, 11), - (1082216, 4260006, 11), - (1082216, 4000244, 5), - (1082216, 4000245, 5), - (1082243, 4007006, 12), - (1082243, 4260007, 8), - (1082243, 4260008, 4), - (1082243, 4020009, 15), - (1082238, 4007006, 12), - (1082238, 4260007, 2), - (1082238, 4260008, 10), - (1082238, 4021010, 1), - (1482007, 4011000, 1), - (1482007, 4260000, 20), - (1492007, 4011000, 1), - (1492007, 4260000, 20), - (1482008, 4011001, 2), - (1482008, 4260001, 22), - (1492008, 4011001, 2), - (1492008, 4260001, 22), - (1482009, 4011001, 3), - (1482009, 4260002, 24), - (1492009, 4011001, 3), - (1492009, 4260002, 24), - (1482010, 4011002, 3), - (1482010, 4260003, 26), - (1492010, 4011002, 3), - (1492010, 4260003, 26), - (1482011, 4011002, 4), - (1482011, 4260004, 28), - (1492011, 4011002, 4), - (1492011, 4260004, 28), - (1482012, 4011003, 4), - (1482012, 4260005, 30), - (1492012, 4011003, 4), - (1492012, 4260005, 30), - (1482013, 4011003, 5), - (1482013, 4260006, 32), - (1482013, 4000244, 20), - (1482013, 4000245, 20), - (1492013, 4011003, 5), - (1492013, 4260006, 32), - (1492013, 4000244, 20), - (1492013, 4000245, 20), - (1482024, 4011005, 5), - (1482024, 4260007, 20), - (1482024, 4260008, 14), - (1482024, 4020009, 45), - (1492025, 4011005, 5), - (1492025, 4260007, 20), - (1492025, 4260008, 14), - (1492025, 4020009, 45), - (1482023, 4011005, 5), - (1482023, 4260007, 14), - (1482023, 4260008, 20), - (1482023, 4021010, 3), - (1492023, 4011005, 5), - (1492023, 4260007, 14), - (1492023, 4260008, 20), - (1492023, 4021010, 3); - -INSERT IGNORE INTO `makerrewarddata` (`itemid`, `rewardid`, `quantity`, `prob`) VALUES - (4250000, 4250000, 1, 14), - (4250000, 4250001, 1, 5), - (4250000, 4250002, 1, 1), - (4250100, 4250100, 1, 14), - (4250100, 4250101, 1, 5), - (4250100, 4250102, 1, 1), - (4250200, 4250200, 1, 14), - (4250200, 4250201, 1, 5), - (4250200, 4250202, 1, 1), - (4250300, 4250300, 1, 14), - (4250300, 4250301, 1, 5), - (4250300, 4250302, 1, 1), - (4250400, 4250400, 1, 14), - (4250400, 4250401, 1, 5), - (4250400, 4250402, 1, 1), - (4250500, 4250500, 1, 14), - (4250500, 4250501, 1, 5), - (4250500, 4250502, 1, 1), - (4250600, 4250600, 1, 14), - (4250600, 4250601, 1, 5), - (4250600, 4250602, 1, 1), - (4250700, 4250700, 1, 14), - (4250700, 4250701, 1, 5), - (4250700, 4250702, 1, 1), - (4250800, 4250800, 1, 75), - (4250800, 4250801, 1, 24), - (4250800, 4250802, 1, 1), - (4250900, 4250900, 1, 75), - (4250900, 4250901, 1, 24), - (4250900, 4250902, 1, 1), - (4251000, 4251000, 1, 75), - (4251000, 4251001, 1, 24), - (4251000, 4251002, 1, 1), - (4251100, 4251100, 1, 75), - (4251100, 4251101, 1, 24), - (4251100, 4251102, 1, 1), - (4251300, 4251300, 1, 27), - (4251300, 4251301, 1, 12), - (4251300, 4251302, 1, 1), - (4251400, 4251400, 1, 27), - (4251400, 4251401, 1, 12), - (4251400, 4251402, 1, 1), - (4250001, 4250001, 1, 3), - (4250001, 4250000, 9, 2), - (4250101, 4250101, 1, 3), - (4250101, 4250100, 9, 2), - (4250201, 4250201, 1, 3), - (4250201, 4250200, 9, 2), - (4250301, 4250301, 1, 3), - (4250301, 4250300, 9, 2), - (4250401, 4250401, 1, 3), - (4250401, 4250400, 9, 2), - (4250501, 4250501, 1, 3), - (4250501, 4250500, 9, 2), - (4250601, 4250601, 1, 3), - (4250601, 4250600, 9, 2), - (4250701, 4250701, 1, 3), - (4250701, 4250700, 9, 2), - (4250801, 4250801, 1, 3), - (4250801, 4250800, 9, 2), - (4250901, 4250901, 1, 3), - (4250901, 4250900, 9, 2), - (4251001, 4251001, 1, 3), - (4251001, 4251000, 9, 2), - (4251101, 4251101, 1, 3), - (4251101, 4251100, 9, 2), - (4251301, 4251301, 1, 1), - (4251301, 4251300, 9, 1), - (4251401, 4251401, 1, 1), - (4251401, 4251400, 9, 1), - (4250002, 4250002, 1, 3), - (4250002, 4250001, 9, 7), - (4250102, 4250102, 1, 3), - (4250102, 4250101, 9, 7), - (4250202, 4250202, 1, 3), - (4250202, 4250201, 9, 7), - (4250302, 4250302, 1, 3), - (4250302, 4250301, 9, 7), - (4250402, 4250402, 1, 3), - (4250402, 4250401, 9, 7), - (4250502, 4250502, 1, 3), - (4250502, 4250501, 9, 7), - (4250602, 4250602, 1, 3), - (4250602, 4250601, 9, 7), - (4250702, 4250702, 1, 3), - (4250702, 4250701, 9, 7), - (4250802, 4250802, 1, 3), - (4250802, 4250801, 9, 7), - (4250902, 4250902, 1, 3), - (4250902, 4250901, 9, 7), - (4251002, 4251002, 1, 3), - (4251002, 4251001, 9, 7), - (4251102, 4251102, 1, 3), - (4251102, 4251101, 9, 7), - (4251302, 4251302, 1, 1), - (4251302, 4251301, 9, 4), - (4251402, 4251402, 1, 1), - (4251402, 4251401, 9, 4); diff --git a/tools/MapleSkillMakerFetcher/src/mapleskillmakerfetcher/MapleItemInformationProvider.java b/tools/MapleSkillMakerFetcher/src/mapleskillmakerfetcher/MapleItemInformationProvider.java deleted file mode 100644 index da2278abd5..0000000000 --- a/tools/MapleSkillMakerFetcher/src/mapleskillmakerfetcher/MapleItemInformationProvider.java +++ /dev/null @@ -1,201 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package mapleskillmakerfetcher; - -import java.io.File; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; - -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataFileEntry; -import provider.MapleDataProvider; -import provider.MapleDataProviderFactory; -import provider.MapleDataTool; -/** - * - * @author Ronan - * - */ -public class MapleItemInformationProvider { - private final static String wzPath = "../../wz"; - - private static MapleItemInformationProvider instance = null; - protected MapleDataProvider itemData; - protected MapleDataProvider equipData; - protected MapleDataProvider stringData; - protected MapleData eqpStringData; - - protected Map> equipStatsCache = new HashMap<>(); - protected Map nameCache = new HashMap<>(); - - private MapleItemInformationProvider() { - itemData = MapleDataProviderFactory.getDataProvider(new File(wzPath + "/Item.wz")); - equipData = MapleDataProviderFactory.getDataProvider(new File(wzPath + "/Character.wz")); - stringData = MapleDataProviderFactory.getDataProvider(new File(wzPath + "/String.wz")); - eqpStringData = stringData.getData("Eqp.img"); - } - - public static MapleItemInformationProvider getInstance() { - if (instance == null) { - instance = new MapleItemInformationProvider(); - } - return instance; - } - - private MapleData getItemData(int itemId) { - MapleData ret = null; - String idStr = "0" + String.valueOf(itemId); - MapleDataDirectoryEntry root = itemData.getRoot(); - for (MapleDataDirectoryEntry topDir : root.getSubdirectories()) { - for (MapleDataFileEntry iFile : topDir.getFiles()) { - if (iFile.getName().equals(idStr.substring(0, 4) + ".img")) { - ret = itemData.getData(topDir.getName() + "/" + iFile.getName()); - if (ret == null) { - return null; - } - ret = ret.getChildByPath(idStr); - return ret; - } else if (iFile.getName().equals(idStr.substring(1) + ".img")) { - return itemData.getData(topDir.getName() + "/" + iFile.getName()); - } - } - } - root = equipData.getRoot(); - for (MapleDataDirectoryEntry topDir : root.getSubdirectories()) { - for (MapleDataFileEntry iFile : topDir.getFiles()) { - if (iFile.getName().equals(idStr + ".img")) { - return equipData.getData(topDir.getName() + "/" + iFile.getName()); - } - } - } - return ret; - } - - public Map getEquipStats(int itemId) { - if (equipStatsCache.containsKey(itemId)) { - return equipStatsCache.get(itemId); - } - Map ret = new LinkedHashMap<>(); - MapleData item = getItemData(itemId); - if (item == null) { - return null; - } - MapleData info = item.getChildByPath("info"); - if (info == null) { - return null; - } - for (MapleData data : info.getChildren()) { - if (data.getName().startsWith("inc")) { - ret.put(data.getName().substring(3), MapleDataTool.getIntConvert(data)); - } - /*else if (data.getName().startsWith("req")) - ret.put(data.getName(), MapleDataTool.getInt(data.getName(), info, 0));*/ - } - ret.put("reqJob", MapleDataTool.getInt("reqJob", info, 0)); - ret.put("reqLevel", MapleDataTool.getInt("reqLevel", info, 0)); - ret.put("reqDEX", MapleDataTool.getInt("reqDEX", info, 0)); - ret.put("reqSTR", MapleDataTool.getInt("reqSTR", info, 0)); - ret.put("reqINT", MapleDataTool.getInt("reqINT", info, 0)); - ret.put("reqLUK", MapleDataTool.getInt("reqLUK", info, 0)); - ret.put("reqPOP", MapleDataTool.getInt("reqPOP", info, 0)); - ret.put("cash", MapleDataTool.getInt("cash", info, 0)); - ret.put("tuc", MapleDataTool.getInt("tuc", info, 0)); - ret.put("cursed", MapleDataTool.getInt("cursed", info, 0)); - ret.put("success", MapleDataTool.getInt("success", info, 0)); - ret.put("fs", MapleDataTool.getInt("fs", info, 0)); - equipStatsCache.put(itemId, ret); - return ret; - } - - private MapleData getStringData(int itemId) { - String cat = "null"; - MapleData theData; - if ((itemId >= 1010000 && itemId < 1040000) || (itemId >= 1122000 && itemId < 1123000) || (itemId >= 1132000 && itemId < 1133000) || (itemId >= 1142000 && itemId < 1143000)) { - theData = eqpStringData; - cat = "Eqp/Accessory"; - } else if (itemId >= 1000000 && itemId < 1010000) { - theData = eqpStringData; - cat = "Eqp/Cap"; - } else if (itemId >= 1102000 && itemId < 1103000) { - theData = eqpStringData; - cat = "Eqp/Cape"; - } else if (itemId >= 1040000 && itemId < 1050000) { - theData = eqpStringData; - cat = "Eqp/Coat"; - } else if (itemId >= 20000 && itemId < 22000) { - theData = eqpStringData; - cat = "Eqp/Face"; - } else if (itemId >= 1080000 && itemId < 1090000) { - theData = eqpStringData; - cat = "Eqp/Glove"; - } else if (itemId >= 30000 && itemId < 35000) { - theData = eqpStringData; - cat = "Eqp/Hair"; - } else if (itemId >= 1050000 && itemId < 1060000) { - theData = eqpStringData; - cat = "Eqp/Longcoat"; - } else if (itemId >= 1060000 && itemId < 1070000) { - theData = eqpStringData; - cat = "Eqp/Pants"; - } else if (itemId >= 1802000 && itemId < 1842000) { - theData = eqpStringData; - cat = "Eqp/PetEquip"; - } else if (itemId >= 1112000 && itemId < 1120000) { - theData = eqpStringData; - cat = "Eqp/Ring"; - } else if (itemId >= 1092000 && itemId < 1100000) { - theData = eqpStringData; - cat = "Eqp/Shield"; - } else if (itemId >= 1070000 && itemId < 1080000) { - theData = eqpStringData; - cat = "Eqp/Shoes"; - } else if (itemId >= 1900000 && itemId < 2000000) { - theData = eqpStringData; - cat = "Eqp/Taming"; - } else if (itemId >= 1300000 && itemId < 1800000) { - theData = eqpStringData; - cat = "Eqp/Weapon"; - } else { - return null; - } - if (cat.equalsIgnoreCase("null")) { - return theData.getChildByPath(String.valueOf(itemId)); - } else { - return theData.getChildByPath(cat + "/" + itemId); - } - } - - public String getName(int itemId) { - if (nameCache.containsKey(itemId)) { - return nameCache.get(itemId); - } - MapleData strings = getStringData(itemId); - if (strings == null) { - return null; - } - String ret = MapleDataTool.getString("name", strings, null); - nameCache.put(itemId, ret); - return ret; - } -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/MapleCanvas.java b/tools/MapleSkillMakerFetcher/src/provider/MapleCanvas.java deleted file mode 100644 index 10ab682196..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/MapleCanvas.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.awt.image.BufferedImage; - -public interface MapleCanvas { - int getHeight(); - int getWidth(); - BufferedImage getImage(); -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/MapleData.java b/tools/MapleSkillMakerFetcher/src/provider/MapleData.java deleted file mode 100644 index 4d90a93804..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/MapleData.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.util.List; -import provider.wz.MapleDataType; - -public interface MapleData extends MapleDataEntity, Iterable { - @Override - public String getName(); - public MapleDataType getType(); - public List getChildren(); - public MapleData getChildByPath(String path); - public Object getData(); -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/MapleDataDirectoryEntry.java b/tools/MapleSkillMakerFetcher/src/provider/MapleDataDirectoryEntry.java deleted file mode 100644 index cb043e0c94..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/MapleDataDirectoryEntry.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.util.List; - -/** - * - * @author Matze - */ -public interface MapleDataDirectoryEntry extends MapleDataEntry { - public List getSubdirectories(); - public List getFiles(); - public MapleDataEntry getEntry(String name); -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/MapleDataEntity.java b/tools/MapleSkillMakerFetcher/src/provider/MapleDataEntity.java deleted file mode 100644 index 03ff77649c..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/MapleDataEntity.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataEntity { - public String getName(); - public MapleDataEntity getParent(); -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/MapleDataEntry.java b/tools/MapleSkillMakerFetcher/src/provider/MapleDataEntry.java deleted file mode 100644 index 62db6d0abe..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/MapleDataEntry.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataEntry extends MapleDataEntity { - public String getName(); - public int getSize(); - public int getChecksum(); - public int getOffset(); -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/MapleDataFileEntry.java b/tools/MapleSkillMakerFetcher/src/provider/MapleDataFileEntry.java deleted file mode 100644 index 902130a612..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/MapleDataFileEntry.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataFileEntry extends MapleDataEntry { - public void setOffset(int offset); -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/MapleDataProvider.java b/tools/MapleSkillMakerFetcher/src/provider/MapleDataProvider.java deleted file mode 100644 index 5237b7ac37..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/MapleDataProvider.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -public interface MapleDataProvider { - MapleData getData(String path); - MapleDataDirectoryEntry getRoot(); -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/MapleDataProviderFactory.java b/tools/MapleSkillMakerFetcher/src/provider/MapleDataProviderFactory.java deleted file mode 100644 index 5a397d8512..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/MapleDataProviderFactory.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.io.File; -import java.io.IOException; -import provider.wz.WZFile; -import provider.wz.XMLWZFile; - -public class MapleDataProviderFactory { - private final static String wzPath = "../../wz"; - - private static MapleDataProvider getWZ(File in, boolean provideImages) { - if (in.getName().toLowerCase().endsWith("wz") && !in.isDirectory()) { - try { - return new WZFile(in, provideImages); - } catch (IOException e) { - throw new RuntimeException("Loading WZ File failed", e); - } - } else { - return new XMLWZFile(in); - } - } - - public static MapleDataProvider getDataProvider(File in) { - return getWZ(in, false); - } - - public static MapleDataProvider getImageProvidingDataProvider(File in) { - return getWZ(in, true); - } - - public static File fileInWZPath(String filename) { - return new File(wzPath, filename); - } -} \ No newline at end of file diff --git a/tools/MapleSkillMakerFetcher/src/provider/MapleDataTool.java b/tools/MapleSkillMakerFetcher/src/provider/MapleDataTool.java deleted file mode 100644 index 25f4c7f817..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/MapleDataTool.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.awt.Point; -import java.awt.image.BufferedImage; -import provider.wz.MapleDataType; - -public class MapleDataTool { - public static String getString(MapleData data) { - return ((String) data.getData()); - } - - public static String getString(MapleData data, String def) { - if (data == null || data.getData() == null) { - return def; - } else { - return ((String) data.getData()); - } - } - - public static String getString(String path, MapleData data) { - return getString(data.getChildByPath(path)); - } - - public static String getString(String path, MapleData data, String def) { - return getString(data.getChildByPath(path), def); - } - - public static double getDouble(MapleData data) { - return ((Double) data.getData()).doubleValue(); - } - - public static float getFloat(MapleData data) { - return ((Float) data.getData()).floatValue(); - } - - public static int getInt(MapleData data) { - if (data == null || data.getData() == null) { - return 0;// DEF? - } - return ((Integer) data.getData()).intValue(); - } - - public static int getInt(String path, MapleData data) { - return getInt(data.getChildByPath(path)); - } - - public static int getIntConvert(MapleData data) { - if (data.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(data)); - } else { - return getInt(data); - } - } - - public static int getIntConvert(String path, MapleData data) { - MapleData d = data.getChildByPath(path); - if (d.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(d)); - } else { - return getInt(d); - } - } - - public static int getInt(MapleData data, int def) { - if (data == null || data.getData() == null) { - return def; - } else if (data.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(data)); - } else { - return ((Integer) data.getData()).intValue(); - } - } - - public static int getInt(String path, MapleData data, int def) { - return getInt(data.getChildByPath(path), def); - } - - public static int getIntConvert(String path, MapleData data, int def) { - MapleData d = data.getChildByPath(path); - if (d == null) { - return def; - } - if (d.getType() == MapleDataType.STRING) { - try { - return Integer.parseInt(getString(d)); - } catch (NumberFormatException nfe) { - nfe.printStackTrace(); - return def; - } - } else { - return getInt(d, def); - } - } - - public static BufferedImage getImage(MapleData data) { - return ((MapleCanvas) data.getData()).getImage(); - } - - public static Point getPoint(MapleData data) { - return ((Point) data.getData()); - } - - public static Point getPoint(String path, MapleData data) { - return getPoint(data.getChildByPath(path)); - } - - public static Point getPoint(String path, MapleData data, Point def) { - final MapleData pointData = data.getChildByPath(path); - if (pointData == null) { - return def; - } - return getPoint(pointData); - } - - public static String getFullDataPath(MapleData data) { - String path = ""; - MapleDataEntity myData = data; - while (myData != null) { - path = myData.getName() + "/" + path; - myData = myData.getParent(); - } - return path.substring(0, path.length() - 1); - } -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/wz/FileStoredPngMapleCanvas.java b/tools/MapleSkillMakerFetcher/src/provider/wz/FileStoredPngMapleCanvas.java deleted file mode 100644 index 21736c2c16..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/wz/FileStoredPngMapleCanvas.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import javax.imageio.ImageIO; -import provider.MapleCanvas; - -public class FileStoredPngMapleCanvas implements MapleCanvas { - private File file; - private int width; - private int height; - private BufferedImage image; - - public FileStoredPngMapleCanvas(int width, int height, File fileIn) { - this.width = width; - this.height = height; - this.file = fileIn; - } - - @Override - public int getHeight() { - return height; - } - - @Override - public int getWidth() { - return width; - } - - @Override - public BufferedImage getImage() { - loadImageIfNecessary(); - return image; - } - - private void loadImageIfNecessary() { - if (image == null) { - try { - image = ImageIO.read(file); - // replace the dimensions loaded from the wz by the REAL dimensions from the image - should be equal tho - width = image.getWidth(); - height = image.getHeight(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/wz/ImgMapleSound.java b/tools/MapleSkillMakerFetcher/src/provider/wz/ImgMapleSound.java deleted file mode 100644 index 8add2ccb36..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/wz/ImgMapleSound.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -public class ImgMapleSound { - private int dataLength, offset; - - public ImgMapleSound(int dataLength, int offset) { - this.dataLength = dataLength; - this.offset = offset; - } - - public int getDataLength() { - return dataLength; - } - - public int getOffset() { - return offset; - } -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/wz/ListWZFile.java b/tools/MapleSkillMakerFetcher/src/provider/wz/ListWZFile.java deleted file mode 100644 index 1672a08c59..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/wz/ListWZFile.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import provider.MapleDataProviderFactory; -import tools.data.input.GenericLittleEndianAccessor; -import tools.data.input.InputStreamByteStream; -import tools.data.input.LittleEndianAccessor; - -public class ListWZFile { - private LittleEndianAccessor lea; - private List entries = new ArrayList(); - private static Collection modernImgs = new HashSet(); - - public static byte[] xorBytes(byte[] a, byte[] b) { - byte[] wusched = new byte[a.length]; - for (int i = 0; i < a.length; i++) { - wusched[i] = (byte) (a[i] ^ b[i]); - } - return wusched; - } - - public ListWZFile(File listwz) throws FileNotFoundException { - lea = new GenericLittleEndianAccessor(new InputStreamByteStream(new BufferedInputStream(new FileInputStream(listwz)))); - while (lea.available() > 0) { - int l = lea.readInt() * 2; - byte[] chunk = new byte[l]; - for (int i = 0; i < chunk.length; i++) { - chunk[i] = lea.readByte(); - } - lea.readChar(); - final String value = String.valueOf(WZTool.readListString(chunk)); - entries.add(value); - } - entries = Collections.unmodifiableList(entries); - } - - public List getEntries() { - return entries; - } - - public static void init() { - final String listWz = System.getProperty("listwz"); - if (listWz != null) { - ListWZFile listwz; - try { - listwz = new ListWZFile(MapleDataProviderFactory.fileInWZPath("List.wz")); - modernImgs = new HashSet(listwz.getEntries()); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - } - - public static boolean isModernImgFile(String path) { - return modernImgs.contains(path); - } -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/wz/MapleDataType.java b/tools/MapleSkillMakerFetcher/src/provider/wz/MapleDataType.java deleted file mode 100644 index e074d57d14..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/wz/MapleDataType.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -public enum MapleDataType { - NONE, IMG_0x00, SHORT, INT, FLOAT, DOUBLE, STRING, EXTENDED, PROPERTY, CANVAS, VECTOR, CONVEX, SOUND, UOL, UNKNOWN_TYPE, UNKNOWN_EXTENDED_TYPE; -} \ No newline at end of file diff --git a/tools/MapleSkillMakerFetcher/src/provider/wz/PNGMapleCanvas.java b/tools/MapleSkillMakerFetcher/src/provider/wz/PNGMapleCanvas.java deleted file mode 100644 index 97c2303804..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/wz/PNGMapleCanvas.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.Point; -import java.awt.image.BufferedImage; -import java.awt.image.DataBuffer; -import java.awt.image.DataBufferByte; -import java.awt.image.PixelInterleavedSampleModel; -import java.awt.image.Raster; -import java.awt.image.SampleModel; -import java.awt.image.WritableRaster; -import java.util.zip.DataFormatException; -import java.util.zip.Inflater; -import provider.MapleCanvas; - -public class PNGMapleCanvas implements MapleCanvas { - private static final int[] ZAHLEN = new int[]{2, 1, 0, 3}; - private int height; - private int width; - private int dataLength; - private int format; - private byte[] data; - - public PNGMapleCanvas(int width, int height, int dataLength, int format, byte[] data) { - super(); - this.height = height; - this.width = width; - this.dataLength = dataLength; - this.format = format; - this.data = data; - } - - public int getHeight() { - return height; - } - - public int getWidth() { - return width; - } - - public int getFormat() { - return format; - } - - private byte[] getData() { - return data; - } - - @Override - public BufferedImage getImage() { - int sizeUncompressed = 0; - int size8888 = 0; - int maxWriteBuf = 2; - int maxHeight = 3; - byte[] writeBuf = new byte[maxWriteBuf]; - @SuppressWarnings ("unused") - byte[] rowPointers = new byte[maxHeight]; - switch (getFormat()) { - case 1: - case 513: - sizeUncompressed = getHeight() * getWidth() * 4; - break; - case 2: - sizeUncompressed = getHeight() * getWidth() * 8; - break; - case 517: - sizeUncompressed = getHeight() * getWidth() / 128; - break; - } - size8888 = getHeight() * getWidth() * 8; - if (size8888 > maxWriteBuf) { - maxWriteBuf = size8888; - writeBuf = new byte[maxWriteBuf]; - } - if (getHeight() > maxHeight) { - maxHeight = getHeight(); - rowPointers = new byte[maxHeight]; - } - Inflater dec = new Inflater(); - dec.setInput(getData(), 0, dataLength); - int declen = 0; - byte[] uc = new byte[sizeUncompressed]; - try { - declen = dec.inflate(uc); - } catch (DataFormatException ex) { - throw new RuntimeException("zlib fucks", ex); - } - dec.end(); - if (getFormat() == 1) { - for (int i = 0; i < sizeUncompressed; i++) { - byte low = (byte) (uc[i] & 0x0F); - byte high = (byte) (uc[i] & 0xF0); - writeBuf[(i << 1)] = (byte) (((low << 4) | low) & 0xFF); - writeBuf[(i << 1) + 1] = (byte) (high | ((high >>> 4) & 0xF)); - } - } else if (getFormat() == 2) { - writeBuf = uc; - } else if (getFormat() == 513) { - for (int i = 0; i < declen; i += 2) { - byte bBits = (byte) ((uc[i] & 0x1F) << 3); - byte gBits = (byte) (((uc[i + 1] & 0x07) << 5) | ((uc[i] & 0xE0) >> 3)); - byte rBits = (byte) (uc[i + 1] & 0xF8); - writeBuf[(i << 1)] = (byte) (bBits | (bBits >> 5)); - writeBuf[(i << 1) + 1] = (byte) (gBits | (gBits >> 6)); - writeBuf[(i << 1) + 2] = (byte) (rBits | (rBits >> 5)); - writeBuf[(i << 1) + 3] = (byte) 0xFF; - } - } else if (getFormat() == 517) { - byte b = 0x00; - int pixelIndex = 0; - for (int i = 0; i < declen; i++) { - for (int j = 0; j < 8; j++) { - b = (byte) (((uc[i] & (0x01 << (7 - j))) >> (7 - j)) * 255); - for (int k = 0; k < 16; k++) { - pixelIndex = (i << 9) + (j << 6) + k * 2; - writeBuf[pixelIndex] = b; - writeBuf[pixelIndex + 1] = b; - writeBuf[pixelIndex + 2] = b; - writeBuf[pixelIndex + 3] = (byte) 0xFF; - } - } - } - } - DataBufferByte imgData = new DataBufferByte(writeBuf, sizeUncompressed); - SampleModel sm = new PixelInterleavedSampleModel(DataBuffer.TYPE_BYTE, getWidth(), getHeight(), 4, getWidth() * 4, ZAHLEN); - WritableRaster imgRaster = Raster.createWritableRaster(sm, imgData, new Point(0, 0)); - BufferedImage aa = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); - aa.setData(imgRaster); - return aa; - } -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/wz/WZDirectoryEntry.java b/tools/MapleSkillMakerFetcher/src/provider/wz/WZDirectoryEntry.java deleted file mode 100644 index d24b8cb2b9..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/wz/WZDirectoryEntry.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataEntity; -import provider.MapleDataEntry; -import provider.MapleDataFileEntry; - -public class WZDirectoryEntry extends WZEntry implements MapleDataDirectoryEntry { - private List subdirs = new ArrayList(); - private List files = new ArrayList(); - private Map entries = new HashMap(); - - public WZDirectoryEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(name, size, checksum, parent); - } - - public WZDirectoryEntry() { - super(null, 0, 0, null); - } - - public void addDirectory(MapleDataDirectoryEntry dir) { - subdirs.add(dir); - entries.put(dir.getName(), dir); - } - - public void addFile(MapleDataFileEntry fileEntry) { - files.add(fileEntry); - entries.put(fileEntry.getName(), fileEntry); - } - - public List getSubdirectories() { - return Collections.unmodifiableList(subdirs); - } - - public List getFiles() { - return Collections.unmodifiableList(files); - } - - public MapleDataEntry getEntry(String name) { - return entries.get(name); - } -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/wz/WZEntry.java b/tools/MapleSkillMakerFetcher/src/provider/wz/WZEntry.java deleted file mode 100644 index 1e921b2082..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/wz/WZEntry.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import provider.MapleDataEntity; -import provider.MapleDataEntry; - -public class WZEntry implements MapleDataEntry { - private String name; - private int size; - private int checksum; - private int offset; - private MapleDataEntity parent; - - public WZEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(); - this.name = name; - this.size = size; - this.checksum = checksum; - this.parent = parent; - } - - public String getName() { - return name; - } - - public int getSize() { - return size; - } - - public int getChecksum() { - return checksum; - } - - public int getOffset() { - return offset; - } - - public MapleDataEntity getParent() { - return parent; - } -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/wz/WZFile.java b/tools/MapleSkillMakerFetcher/src/provider/wz/WZFile.java deleted file mode 100644 index c6c0abf537..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/wz/WZFile.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.RandomAccessFile; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataFileEntry; -import provider.MapleDataProvider; -import tools.data.input.GenericLittleEndianAccessor; -import tools.data.input.GenericSeekableLittleEndianAccessor; -import tools.data.input.InputStreamByteStream; -import tools.data.input.LittleEndianAccessor; -import tools.data.input.RandomAccessByteStream; -import tools.data.input.SeekableLittleEndianAccessor; - -public class WZFile implements MapleDataProvider { - static { - ListWZFile.init(); - } - private File wzfile; - private LittleEndianAccessor lea; - private SeekableLittleEndianAccessor slea; - private int headerSize; - private WZDirectoryEntry root; - private boolean provideImages; - private int cOffset; - - public WZFile(File wzfile, boolean provideImages) throws IOException { - this.wzfile = wzfile; - lea = new GenericLittleEndianAccessor(new InputStreamByteStream(new BufferedInputStream(new FileInputStream(wzfile)))); - RandomAccessFile raf = new RandomAccessFile(wzfile, "r"); - slea = new GenericSeekableLittleEndianAccessor(new RandomAccessByteStream(raf)); - root = new WZDirectoryEntry(wzfile.getName(), 0, 0, null); - this.provideImages = provideImages; - load(); - } - - private void load() throws IOException { - lea.readAsciiString(4); - lea.readInt(); - lea.readInt(); - headerSize = lea.readInt(); - lea.readNullTerminatedAsciiString(); - lea.readShort(); - parseDirectory(root); - cOffset = (int) lea.getBytesRead(); - getOffsets(root); - } - - private void getOffsets(MapleDataDirectoryEntry dir) { - for (MapleDataFileEntry file : dir.getFiles()) { - file.setOffset(cOffset); - cOffset += file.getSize(); - } - for (MapleDataDirectoryEntry sdir : dir.getSubdirectories()) { - getOffsets(sdir); - } - } - - private void parseDirectory(WZDirectoryEntry dir) { - int entries = WZTool.readValue(lea); - for (int i = 0; i < entries; i++) { - byte marker = lea.readByte(); - String name = null; - int size, checksum; - switch (marker) { - case 0x02: - name = WZTool.readDecodedStringAtOffsetAndReset(slea, lea.readInt() + this.headerSize + 1); - size = WZTool.readValue(lea); - checksum = WZTool.readValue(lea); - lea.readInt(); //dummy int - dir.addFile(new WZFileEntry(name, size, checksum, dir)); - break; - case 0x03: - case 0x04: - name = WZTool.readDecodedString(lea); - size = WZTool.readValue(lea); - checksum = WZTool.readValue(lea); - lea.readInt(); //dummy int - if (marker == 3) { - dir.addDirectory(new WZDirectoryEntry(name, size, checksum, dir)); - } else { - dir.addFile(new WZFileEntry(name, size, checksum, dir)); - } - break; - default: - } - } - for (MapleDataDirectoryEntry idir : dir.getSubdirectories()) { - parseDirectory((WZDirectoryEntry) idir); - } - } - - public WZIMGFile getImgFile(String path) throws IOException { - String segments[] = path.split("/"); - WZDirectoryEntry dir = root; - for (int x = 0; x < segments.length - 1; x++) { - dir = (WZDirectoryEntry) dir.getEntry(segments[x]); - if (dir == null) { - return null; - } - } - WZFileEntry entry = (WZFileEntry) dir.getEntry(segments[segments.length - 1]); - if (entry == null) { - return null; - } - String fullPath = wzfile.getName().substring(0, wzfile.getName().length() - 3).toLowerCase() + "/" + path; - return new WZIMGFile(this.wzfile, entry, provideImages, ListWZFile.isModernImgFile(fullPath)); - } - - @Override - public synchronized MapleData getData(String path) { - try { - WZIMGFile imgFile = getImgFile(path); - if (imgFile == null) { - return null; - } - MapleData ret = imgFile.getRoot(); - return ret; - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - @Override - public MapleDataDirectoryEntry getRoot() { - return root; - } -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/wz/WZFileEntry.java b/tools/MapleSkillMakerFetcher/src/provider/wz/WZFileEntry.java deleted file mode 100644 index 792371d9cf..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/wz/WZFileEntry.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import provider.MapleDataEntity; -import provider.MapleDataFileEntry; - -public class WZFileEntry extends WZEntry implements MapleDataFileEntry { - private int offset; - - public WZFileEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(name, size, checksum, parent); - } - - @Override - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/wz/WZIMGEntry.java b/tools/MapleSkillMakerFetcher/src/provider/wz/WZIMGEntry.java deleted file mode 100644 index 385d785183..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/wz/WZIMGEntry.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import provider.MapleData; -import provider.MapleDataEntity; - -public class WZIMGEntry implements MapleData { - private String name; - private MapleDataType type; - private List children = new ArrayList(10); - private Object data; - private MapleDataEntity parent; - - public WZIMGEntry(MapleDataEntity parent) { - this.parent = parent; - } - - @Override - public String getName() { - return name; - } - - @Override - public MapleDataType getType() { - return type; - } - - @Override - public List getChildren() { - return Collections.unmodifiableList(children); - } - - @Override - public MapleData getChildByPath(String path) { - String segments[] = path.split("/"); - if (segments[0].equals("..")) { - return ((MapleData) getParent()).getChildByPath(path.substring(path.indexOf("/") + 1)); - } - MapleData ret = this; - for (int x = 0; x < segments.length; x++) { - boolean foundChild = false; - for (MapleData child : ret.getChildren()) { - if (child.getName().equals(segments[x])) { - ret = child; - foundChild = true; - break; - } - } - if (!foundChild) { - return null; - } - } - return ret; - } - - @Override - public Object getData() { - return data; - } - - public void setName(String name) { - this.name = name; - } - - public void setType(MapleDataType type) { - this.type = type; - } - - public void setData(Object data) { - this.data = data; - } - - public void addChild(WZIMGEntry entry) { - children.add(entry); - } - - @Override - public Iterator iterator() { - return getChildren().iterator(); - } - - @Override - public String toString() { - return getName() + ":" + getData(); - } - - public MapleDataEntity getParent() { - return parent; - } - - public void finish() { - ((ArrayList) children).trimToSize(); - } -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/wz/WZIMGFile.java b/tools/MapleSkillMakerFetcher/src/provider/wz/WZIMGFile.java deleted file mode 100644 index bec06c78bd..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/wz/WZIMGFile.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.Point; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.io.RandomAccessFile; -import tools.data.input.GenericSeekableLittleEndianAccessor; -import tools.data.input.RandomAccessByteStream; -import tools.data.input.SeekableLittleEndianAccessor; - -public class WZIMGFile { - private WZFileEntry file; - private WZIMGEntry root; - private boolean provideImages; - @SuppressWarnings ("unused") - private boolean modernImg; - - public WZIMGFile(File wzfile, WZFileEntry file, boolean provideImages, boolean modernImg) throws IOException { - RandomAccessFile raf = new RandomAccessFile(wzfile, "r"); - SeekableLittleEndianAccessor slea = new GenericSeekableLittleEndianAccessor(new RandomAccessByteStream(raf)); - slea.seek(file.getOffset()); - this.file = file; - this.provideImages = provideImages; - root = new WZIMGEntry(file.getParent()); - root.setName(file.getName()); - root.setType(MapleDataType.EXTENDED); - this.modernImg = modernImg; - parseExtended(root, slea, 0); - root.finish(); - raf.close(); - } - - protected void dumpImg(OutputStream out, SeekableLittleEndianAccessor slea) throws IOException { - DataOutputStream os = new DataOutputStream(out); - long oldPos = slea.getPosition(); - slea.seek(file.getOffset()); - for (int x = 0; x < file.getSize(); x++) { - os.write(slea.readByte()); - } - slea.seek(oldPos); - } - - public WZIMGEntry getRoot() { - return root; - } - - private void parse(WZIMGEntry entry, SeekableLittleEndianAccessor slea) { - byte marker = slea.readByte(); - switch (marker) { - case 0: { - String name = WZTool.readDecodedString(slea); - entry.setName(name); - break; - } - case 1: { - String name = WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt()); - entry.setName(name); - break; - } - default: - System.out.println("Unknown Image identifier: " + marker + " at offset " + (slea.getPosition() - file.getOffset())); - } - marker = slea.readByte(); - switch (marker) { - case 0: - entry.setType(MapleDataType.IMG_0x00); - break; - case 2: - case 11: //??? no idea, since 0.49 - entry.setType(MapleDataType.SHORT); - entry.setData(Short.valueOf(slea.readShort())); - break; - case 3: - entry.setType(MapleDataType.INT); - entry.setData(Integer.valueOf(WZTool.readValue(slea))); - break; - case 4: - entry.setType(MapleDataType.FLOAT); - entry.setData(Float.valueOf(WZTool.readFloatValue(slea))); - break; - case 5: - entry.setType(MapleDataType.DOUBLE); - entry.setData(Double.valueOf(slea.readDouble())); - break; - case 8: - entry.setType(MapleDataType.STRING); - byte iMarker = slea.readByte(); - if (iMarker == 0) { - entry.setData(WZTool.readDecodedString(slea)); - } else if (iMarker == 1) { - entry.setData(WZTool.readDecodedStringAtOffsetAndReset(slea, slea.readInt() + file.getOffset())); - } else { - System.out.println("Unknown String type " + iMarker); - } - break; - case 9: - entry.setType(MapleDataType.EXTENDED); - long endOfExtendedBlock = slea.readInt(); - endOfExtendedBlock += slea.getPosition(); - parseExtended(entry, slea, endOfExtendedBlock); - break; - default: - System.out.println("Unknown Image type " + marker); - } - } - - private void parseExtended(WZIMGEntry entry, SeekableLittleEndianAccessor slea, long endOfExtendedBlock) { - byte marker = slea.readByte(); - String type; - switch (marker) { - case 0x73: - type = WZTool.readDecodedString(slea); - break; - case 0x1B: - type = WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt()); - break; - default: - throw new RuntimeException("Unknown extended image identifier: " + marker + " at offset " + - (slea.getPosition() - file.getOffset())); - } - if (type.equals("Property")) { - entry.setType(MapleDataType.PROPERTY); - slea.readByte(); - slea.readByte(); - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry cEntry = new WZIMGEntry(entry); - parse(cEntry, slea); - cEntry.finish(); - entry.addChild(cEntry); - } - } else if (type.equals("Canvas")) { - entry.setType(MapleDataType.CANVAS); - slea.readByte(); - marker = slea.readByte(); - if (marker == 0) { - // do nothing - } else if (marker == 1) { - slea.readByte(); - slea.readByte(); - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry child = new WZIMGEntry(entry); - parse(child, slea); - child.finish(); - entry.addChild(child); - } - } else { - System.out.println("Canvas marker != 1 (" + marker + ")"); - } - int width = WZTool.readValue(slea); - int height = WZTool.readValue(slea); - int format = WZTool.readValue(slea); - int format2 = slea.readByte(); - slea.readInt(); - int dataLength = slea.readInt() - 1; - slea.readByte(); - if (provideImages) { - byte[] pngdata = slea.read(dataLength); - entry.setData(new PNGMapleCanvas(width, height, dataLength, format + format2, pngdata)); - } else { - entry.setData(new PNGMapleCanvas(width, height, dataLength, format + format2, null)); - slea.skip(dataLength); - } - } else if (type.equals("Shape2D#Vector2D")) { - entry.setType(MapleDataType.VECTOR); - int x = WZTool.readValue(slea); - int y = WZTool.readValue(slea); - entry.setData(new Point(x, y)); - } else if (type.equals("Shape2D#Convex2D")) { - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry cEntry = new WZIMGEntry(entry); - parseExtended(cEntry, slea, 0); - cEntry.finish(); - entry.addChild(cEntry); - } - } else if (type.equals("Sound_DX8")) { - entry.setType(MapleDataType.SOUND); - slea.readByte(); - int dataLength = WZTool.readValue(slea); - WZTool.readValue(slea); // no clue what this is - int offset = (int) slea.getPosition(); - entry.setData(new ImgMapleSound(dataLength, offset - file.getOffset())); - slea.seek(endOfExtendedBlock); - } else if (type.equals("UOL")) { - entry.setType(MapleDataType.UOL); - slea.readByte(); - byte uolmarker = slea.readByte(); - switch (uolmarker) { - case 0: - entry.setData(WZTool.readDecodedString(slea)); - break; - case 1: - entry.setData(WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt())); - break; - default: - System.out.println("Unknown UOL marker: " + uolmarker + " " + entry.getName()); - } - } else { - throw new RuntimeException("Unhandled extended type: " + type); - } - } -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/wz/WZTool.java b/tools/MapleSkillMakerFetcher/src/provider/wz/WZTool.java deleted file mode 100644 index 7f5452cd03..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/wz/WZTool.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import tools.data.input.LittleEndianAccessor; -import tools.data.input.SeekableLittleEndianAccessor; - -import javax.crypto.BadPaddingException; -import javax.crypto.Cipher; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.NoSuchPaddingException; -import javax.crypto.spec.SecretKeySpec; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; - -/* - * Ported Code, see WZFile.java for more info - */ -public class WZTool { - private static byte[] encKey; - - static { - byte[] iv = new byte[]{(byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b,}; - byte[] key = new byte[]{(byte) 0x13, 0x00, 0x00, 0x00, - (byte) 0x08, 0x00, 0x00, 0x00, - (byte) 0x06, 0x00, 0x00, 0x00, - (byte) 0xB4, 0x00, 0x00, 0x00, - (byte) 0x1B, 0x00, 0x00, 0x00, - (byte) 0x0F, 0x00, 0x00, 0x00, - (byte) 0x33, 0x00, 0x00, 0x00, - (byte) 0x52, 0x00, 0x00, 0x00 - }; - Cipher cipher = null; - SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); - try { - cipher = Cipher.getInstance("AES"); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (NoSuchPaddingException e) { - e.printStackTrace(); - } - try { - cipher.init(Cipher.ENCRYPT_MODE, skeySpec); - } catch (InvalidKeyException e) { - e.printStackTrace(); - } - encKey = new byte[0xFFFF]; - for (int i = 0; i < (0xFFFF / 16); i++) { - try { - iv = cipher.doFinal(iv); - } catch (IllegalBlockSizeException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } - System.arraycopy(iv, 0, encKey, (i * 16), 16); - } - try { - iv = cipher.doFinal(iv); - } catch (IllegalBlockSizeException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } - System.arraycopy(iv, 0, encKey, 65520, 15); - } - - public static byte[] readListString(byte[] str) { - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ encKey[i]); - } - return str; - } - - public static String readDecodedString(LittleEndianAccessor llea) { - int strLength; - byte b = llea.readByte(); - if (b == 0x00) { - return ""; - } - if (b >= 0) { - if (b == 0x7F) { - strLength = llea.readInt(); - } else { - strLength = b; - } - if (strLength < 0) { - return ""; - } - byte str[] = new byte[strLength * 2]; - for (int i = 0; i < strLength * 2; i++) { - str[i] = llea.readByte(); - } - return DecryptUnicodeStr(str); - } else { - if (b == -128) { - strLength = llea.readInt(); - } else { - strLength = -b; - } - if (strLength < 0) { - return ""; - } - byte str[] = new byte[strLength]; - for (int i = 0; i < strLength; i++) { - str[i] = llea.readByte(); - } - return DecryptAsciiStr(str); - } - } - - public static String DecryptAsciiStr(byte[] str) { - byte xorByte = (byte) 0xAA; - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ xorByte ^ encKey[i]); - xorByte++; - } - return new String(str); - } - - public static String DecryptUnicodeStr(byte[] str) { - int xorByte = 0xAAAA; - char[] charRet = new char[str.length / 2]; - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ encKey[i]); - } - for (int i = 0; i < (str.length / 2); i++) { - char toXor = (char) ((str[i] << 8) | str[i + 1]); - charRet[i] = (char) (toXor ^ xorByte); - xorByte++; - } - return String.valueOf(charRet); - } - - public static String readDecodedStringAtOffset(SeekableLittleEndianAccessor slea, int offset) { - slea.seek(offset); - return readDecodedString(slea); - } - - public static String readDecodedStringAtOffsetAndReset(SeekableLittleEndianAccessor slea, int offset) { - long pos = 0; - pos = slea.getPosition(); - slea.seek(offset); - String ret = readDecodedString(slea); - slea.seek(pos); - return ret; - } - - public static int readValue(LittleEndianAccessor lea) { - byte b = lea.readByte(); - if (b == -128) { - return lea.readInt(); - } else { - return b; - } - } - - public static float readFloatValue(LittleEndianAccessor lea) { - byte b = lea.readByte(); - if (b == -128) { - return lea.readFloat(); - } else { - return 0; - } - } -} \ No newline at end of file diff --git a/tools/MapleSkillMakerFetcher/src/provider/wz/XMLDomMapleData.java b/tools/MapleSkillMakerFetcher/src/provider/wz/XMLDomMapleData.java deleted file mode 100644 index 151a04c2fd..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/wz/XMLDomMapleData.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package provider.wz; - -import java.awt.Point; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.text.NumberFormat; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import provider.MapleData; -import provider.MapleDataEntity; -import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -public class XMLDomMapleData implements MapleData { - private Node node; - private File imageDataDir; - private NumberFormat nf; - - public XMLDomMapleData(FileInputStream fis, File imageDataDir) { - try { - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - Document document = documentBuilder.parse(fis); - this.node = document.getFirstChild(); - } catch (ParserConfigurationException e) { - throw new RuntimeException(e); - } catch (SAXException e) { - throw new RuntimeException(e); - } catch (IOException e) { - throw new RuntimeException(e); - } - this.imageDataDir = imageDataDir; - this.nf = NumberFormat.getInstance(Locale.FRANCE); - } - - private XMLDomMapleData(Node node) { - this.node = node; - this.nf = NumberFormat.getInstance(Locale.FRANCE); - } - - @Override - public MapleData getChildByPath(String path) { - String segments[] = path.split("/"); - if (segments[0].equals("..")) { - return ((MapleData) getParent()).getChildByPath(path.substring(path.indexOf("/") + 1)); - } - - Node myNode = node; - for (int x = 0; x < segments.length; x++) { - NodeList childNodes = myNode.getChildNodes(); - boolean foundChild = false; - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if (childNode.getNodeType() == Node.ELEMENT_NODE && childNode.getAttributes().getNamedItem("name").getNodeValue().equals(segments[x])) { - myNode = childNode; - foundChild = true; - break; - } - } - if (!foundChild) { - return null; - } - } - XMLDomMapleData ret = new XMLDomMapleData(myNode); - ret.imageDataDir = new File(imageDataDir, getName() + "/" + path).getParentFile(); - return ret; - } - - @Override - public List getChildren() { - List ret = new ArrayList(); - NodeList childNodes = node.getChildNodes(); - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if (childNode.getNodeType() == Node.ELEMENT_NODE) { - XMLDomMapleData child = new XMLDomMapleData(childNode); - child.imageDataDir = new File(imageDataDir, getName()); - ret.add(child); - } - } - return ret; - } - - @Override - public Object getData() { - NamedNodeMap attributes = node.getAttributes(); - MapleDataType type = getType(); - switch (type) { - case DOUBLE: - case FLOAT: - case INT: - case SHORT: { - String value = attributes.getNamedItem("value").getNodeValue(); - Number nval; - - try { - nval = nf.parse(value); - } - catch(java.text.ParseException pe) { - pe.printStackTrace(); - nval = 0.0f; - } - - switch (type) { - case DOUBLE: - return nval.doubleValue(); - case FLOAT: - return nval.floatValue(); - case INT: - return nval.intValue(); - case SHORT: - return nval.shortValue(); - default: - return null; - } - } - case STRING: - case UOL: { - String value = attributes.getNamedItem("value").getNodeValue(); - return value; - } - case VECTOR: { - String x = attributes.getNamedItem("x").getNodeValue(); - String y = attributes.getNamedItem("y").getNodeValue(); - return new Point(Integer.parseInt(x), Integer.parseInt(y)); - } - case CANVAS: { - String width = attributes.getNamedItem("width").getNodeValue(); - String height = attributes.getNamedItem("height").getNodeValue(); - return new FileStoredPngMapleCanvas(Integer.parseInt(width), Integer.parseInt(height), new File( - imageDataDir, getName() + ".png")); - } - default: - return null; - } - } - - @Override - public MapleDataType getType() { - String nodeName = node.getNodeName(); - if (nodeName.equals("imgdir")) { - return MapleDataType.PROPERTY; - } else if (nodeName.equals("canvas")) { - return MapleDataType.CANVAS; - } else if (nodeName.equals("convex")) { - return MapleDataType.CONVEX; - } else if (nodeName.equals("sound")) { - return MapleDataType.SOUND; - } else if (nodeName.equals("uol")) { - return MapleDataType.UOL; - } else if (nodeName.equals("double")) { - return MapleDataType.DOUBLE; - } else if (nodeName.equals("float")) { - return MapleDataType.FLOAT; - } else if (nodeName.equals("int")) { - return MapleDataType.INT; - } else if (nodeName.equals("short")) { - return MapleDataType.SHORT; - } else if (nodeName.equals("string")) { - return MapleDataType.STRING; - } else if (nodeName.equals("vector")) { - return MapleDataType.VECTOR; - } else if (nodeName.equals("null")) { - return MapleDataType.IMG_0x00; - } - return null; - } - - @Override - public MapleDataEntity getParent() { - Node parentNode = node.getParentNode(); - if (parentNode.getNodeType() == Node.DOCUMENT_NODE) { - return null; - } - XMLDomMapleData parentData = new XMLDomMapleData(parentNode); - parentData.imageDataDir = imageDataDir.getParentFile(); - return parentData; - } - - @Override - public String getName() { - return node.getAttributes().getNamedItem("name").getNodeValue(); - } - - @Override - public Iterator iterator() { - return getChildren().iterator(); - } -} diff --git a/tools/MapleSkillMakerFetcher/src/provider/wz/XMLWZFile.java b/tools/MapleSkillMakerFetcher/src/provider/wz/XMLWZFile.java deleted file mode 100644 index 2a7694fdc9..0000000000 --- a/tools/MapleSkillMakerFetcher/src/provider/wz/XMLWZFile.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataProvider; - -public class XMLWZFile implements MapleDataProvider { - private File root; - private WZDirectoryEntry rootForNavigation; - - public XMLWZFile(File fileIn) { - root = fileIn; - rootForNavigation = new WZDirectoryEntry(fileIn.getName(), 0, 0, null); - fillMapleDataEntitys(root, rootForNavigation); - } - - private void fillMapleDataEntitys(File lroot, WZDirectoryEntry wzdir) { - for (File file : lroot.listFiles()) { - String fileName = file.getName(); - if (file.isDirectory() && !fileName.endsWith(".img")) { - WZDirectoryEntry newDir = new WZDirectoryEntry(fileName, 0, 0, wzdir); - wzdir.addDirectory(newDir); - fillMapleDataEntitys(file, newDir); - } else if (fileName.endsWith(".xml")) { - wzdir.addFile(new WZFileEntry(fileName.substring(0, fileName.length() - 4), 0, 0, wzdir)); - } - } - } - - @Override - public MapleData getData(String path) { - File dataFile = new File(root, path + ".xml"); - File imageDataDir = new File(root, path); - if (!dataFile.exists()) { - return null;//bitches - } - FileInputStream fis; - try { - fis = new FileInputStream(dataFile); - } catch (FileNotFoundException e) { - throw new RuntimeException("Datafile " + path + " does not exist in " + root.getAbsolutePath()); - } - final XMLDomMapleData domMapleData; - try { - domMapleData = new XMLDomMapleData(fis, imageDataDir.getParentFile()); - } finally { - try { - fis.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - return domMapleData; - } - - @Override - public MapleDataDirectoryEntry getRoot() { - return rootForNavigation; - } -} diff --git a/tools/MapleSkillMakerFetcher/src/tools/HexTool.java b/tools/MapleSkillMakerFetcher/src/tools/HexTool.java deleted file mode 100644 index 8cc0c8aa84..0000000000 --- a/tools/MapleSkillMakerFetcher/src/tools/HexTool.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools; - -import java.io.ByteArrayOutputStream; - -public class HexTool { - private static final char[] HEX = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; - - private static String toString(byte byteValue) { - int tmp = byteValue << 8; - char[] retstr = new char[]{HEX[(tmp >> 12) & 0x0F], HEX[(tmp >> 8) & 0x0F]}; - return String.valueOf(retstr); - } - - public static String toString(byte[] bytes) { - StringBuilder hexed = new StringBuilder(); - for (int i = 0; i < bytes.length; i++) { - hexed.append(toString(bytes[i])); - hexed.append(' '); - } - return hexed.substring(0, hexed.length() - 1); - } - - public static byte[] getByteArrayFromHexString(String hex) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - int nexti = 0; - int nextb = 0; - boolean highoc = true; - outer: - for (;;) { - int number = -1; - while (number == -1) { - if (nexti == hex.length()) { - break outer; - } - char chr = hex.charAt(nexti); - if (chr >= '0' && chr <= '9') { - number = chr - '0'; - } else if (chr >= 'a' && chr <= 'f') { - number = chr - 'a' + 10; - } else if (chr >= 'A' && chr <= 'F') { - number = chr - 'A' + 10; - } else { - number = -1; - } - nexti++; - } - if (highoc) { - nextb = number << 4; - highoc = false; - } else { - nextb |= number; - highoc = true; - baos.write(nextb); - } - } - return baos.toByteArray(); - } -} diff --git a/tools/MapleSkillMakerFetcher/src/tools/data/input/ByteArrayByteStream.java b/tools/MapleSkillMakerFetcher/src/tools/data/input/ByteArrayByteStream.java deleted file mode 100644 index eac7de21ea..0000000000 --- a/tools/MapleSkillMakerFetcher/src/tools/data/input/ByteArrayByteStream.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import tools.HexTool; - -public class ByteArrayByteStream implements SeekableInputStreamBytestream { - private int pos = 0; - private long bytesRead = 0; - private byte[] arr; - - public ByteArrayByteStream(byte[] arr) { - this.arr = arr; - } - - @Override - public long getPosition() { - return pos; - } - - @Override - public void seek(long offset) throws IOException { - pos = (int) offset; - } - - @Override - public long getBytesRead() { - return bytesRead; - } - - @Override - public int readByte() { - bytesRead++; - return ((int) arr[pos++]) & 0xFF; - } - - @Override - public String toString() { - String nows = "kevintjuh93 pwns";//I lol'd - if (arr.length - pos > 0) { - byte[] now = new byte[arr.length - pos]; - System.arraycopy(arr, pos, now, 0, arr.length - pos); - nows = HexTool.toString(now); - } - return "All: " + HexTool.toString(arr) + "\nNow: " + nows; - } - - @Override - public long available() { - return arr.length - pos; - } -} diff --git a/tools/MapleSkillMakerFetcher/src/tools/data/input/ByteInputStream.java b/tools/MapleSkillMakerFetcher/src/tools/data/input/ByteInputStream.java deleted file mode 100644 index 107f71843e..0000000000 --- a/tools/MapleSkillMakerFetcher/src/tools/data/input/ByteInputStream.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -/** - * Represents an abstract stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public interface ByteInputStream { - int readByte(); - long getBytesRead(); - long available(); -} diff --git a/tools/MapleSkillMakerFetcher/src/tools/data/input/GenericLittleEndianAccessor.java b/tools/MapleSkillMakerFetcher/src/tools/data/input/GenericLittleEndianAccessor.java deleted file mode 100644 index d08a9b8374..0000000000 --- a/tools/MapleSkillMakerFetcher/src/tools/data/input/GenericLittleEndianAccessor.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.awt.Point; -import java.io.ByteArrayOutputStream; - -/** - * Provides a generic interface to a Little Endian stream of bytes. - * - * @version 1.0 - * @author Frz - * @since Revision 323 - */ -public class GenericLittleEndianAccessor implements LittleEndianAccessor { - private ByteInputStream bs; - - /** - * Class constructor - Wraps the accessor around a stream of bytes. - * - * @param bs The byte stream to wrap the accessor around. - */ - public GenericLittleEndianAccessor(ByteInputStream bs) { - this.bs = bs; - } - - /** - * Read a single byte from the stream. - * - * @return The byte read. - * @see tools.data.input.ByteInputStream#readByte - */ - @Override - public byte readByte() { - return (byte) bs.readByte(); - } - - /** - * Reads an integer from the stream. - * - * @return The integer read. - */ - @Override - public int readInt() { - return bs.readByte() + (bs.readByte() << 8) + (bs.readByte() << 16) + (bs.readByte() << 24); - } - - /** - * Reads a short integer from the stream. - * - * @return The short read. - */ - @Override - public short readShort() { - return (short) (bs.readByte() + (bs.readByte() << 8)); - } - - /** - * Reads a single character from the stream. - * - * @return The character read. - */ - @Override - public char readChar() { - return (char) readShort(); - } - - /** - * Reads a long integer from the stream. - * - * @return The long integer read. - */ - @Override - public long readLong() { - long byte1 = bs.readByte(); - long byte2 = bs.readByte(); - long byte3 = bs.readByte(); - long byte4 = bs.readByte(); - long byte5 = bs.readByte(); - long byte6 = bs.readByte(); - long byte7 = bs.readByte(); - long byte8 = bs.readByte(); - return (byte8 << 56) + (byte7 << 48) + (byte6 << 40) + (byte5 << 32) + (byte4 << 24) + (byte3 << 16) + (byte2 << 8) + byte1; - } - - /** - * Reads a floating point integer from the stream. - * - * @return The float-type integer read. - */ - @Override - public float readFloat() { - return Float.intBitsToFloat(readInt()); - } - - /** - * Reads a double-precision integer from the stream. - * - * @return The double-type integer read. - */ - @Override - public double readDouble() { - return Double.longBitsToDouble(readLong()); - } - - /** - * Reads an ASCII string from the stream with length n. - * - * @param n Number of characters to read. - * @return The string read. - */ - public final String readAsciiString(int n) { - char ret[] = new char[n]; - for (int x = 0; x < n; x++) { - ret[x] = (char) readByte(); - } - return String.valueOf(ret); - } - - /** - * Reads a null-terminated string from the stream. - * - * @return The string read. - */ - public final String readNullTerminatedAsciiString() { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte b; - while (true) { - b = readByte(); - if (b == 0) { - break; - } - baos.write(b); - } - byte[] buf = baos.toByteArray(); - char[] chrBuf = new char[buf.length]; - for (int x = 0; x < buf.length; x++) { - chrBuf[x] = (char) buf[x]; - } - return String.valueOf(chrBuf); - } - - /** - * Gets the number of bytes read from the stream so far. - * - * @return A long integer representing the number of bytes read. - * @see tools.data.input.ByteInputStream#getBytesRead() - */ - public long getBytesRead() { - return bs.getBytesRead(); - } - - /** - * Reads a MapleStory convention lengthed ASCII string. - * This consists of a short integer telling the length of the string, - * then the string itself. - * - * @return The string read. - */ - @Override - public String readMapleAsciiString() { - return readAsciiString(readShort()); - } - - /** - * Reads num bytes off the stream. - * - * @param num The number of bytes to read. - * @return An array of bytes with the length of num - */ - @Override - public byte[] read(int num) { - byte[] ret = new byte[num]; - for (int x = 0; x < num; x++) { - ret[x] = readByte(); - } - return ret; - } - - /** - * Reads a MapleStory Position information. - * This consists of 2 short integer. - * - * @return The Position read. - */ - @Override - public final Point readPos() { - final int x = readShort(); - final int y = readShort(); - return new Point(x, y); - } - - /** - * Skips the current position of the stream num bytes ahead. - * - * @param num Number of bytes to skip. - */ - @Override - public void skip(int num) { - for (int x = 0; x < num; x++) { - readByte(); - } - } - - /** - * @see tools.data.input.ByteInputStream#available - */ - @Override - public long available() { - return bs.available(); - } - - /** - * @see java.lang.Object#toString - */ - @Override - public String toString() { - return bs.toString(); - } -} \ No newline at end of file diff --git a/tools/MapleSkillMakerFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java b/tools/MapleSkillMakerFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java deleted file mode 100644 index fdd147d796..0000000000 --- a/tools/MapleSkillMakerFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; - -/** - * Provides an abstract accessor to a generic Little Endian byte stream. This - * accessor is seekable. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - * @see tools.data.input.GenericLittleEndianAccessor - */ -public class GenericSeekableLittleEndianAccessor extends GenericLittleEndianAccessor implements SeekableLittleEndianAccessor { - private SeekableInputStreamBytestream bs; - - /** - * Class constructor - * Provide a seekable input stream to wrap this object around. - * - * @param bs The byte stream to wrap this around. - */ - public GenericSeekableLittleEndianAccessor(SeekableInputStreamBytestream bs) { - super(bs); - this.bs = bs; - } - - /** - * Seek the pointer to offset - * - * @param offset The offset to seek to. - * @see tools.data.input.SeekableInputStreamBytestream#seek - */ - @Override - public void seek(long offset) { - try { - bs.seek(offset); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("Seek failed " + e); - } - } - - /** - * Get the current position of the pointer. - * - * @return The current position of the pointer as a long integer. - * @see tools.data.input.SeekableInputStreamBytestream#getPosition - */ - @Override - public long getPosition() { - try { - return bs.getPosition(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("getPosition failed" + e); - return -1; - } - } - - /** - * Skip num number of bytes in the stream. - * - * @param num The number of bytes to skip. - */ - @Override - public void skip(int num) { - seek(getPosition() + num); - } -} diff --git a/tools/MapleSkillMakerFetcher/src/tools/data/input/InputStreamByteStream.java b/tools/MapleSkillMakerFetcher/src/tools/data/input/InputStreamByteStream.java deleted file mode 100644 index 70aef3489f..0000000000 --- a/tools/MapleSkillMakerFetcher/src/tools/data/input/InputStreamByteStream.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Provides an abstract wrapper to a stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class InputStreamByteStream implements ByteInputStream { - private InputStream is; - private long read = 0; - - /** - * Class constructor. - * Provide an input stream to wrap this around. - * - * @param is The input stream to wrap this object around. - */ - public InputStreamByteStream(InputStream is) { - this.is = is; - } - - /** - * Reads the next byte from the stream. - * - * @return Then next byte in the stream. - */ - @Override - public int readByte() { - int temp; - try { - temp = is.read(); - if (temp == -1) { - throw new RuntimeException("EOF"); - } - read++; - return temp; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - /** - * Gets the number of bytes read from the stream. - * - * @return The number of bytes read as a long integer. - */ - @Override - public long getBytesRead() { - return read; - } - - /** - * Returns the number of bytes left in the stream. - * - * @return The number of bytes available for reading as a long integer. - */ - @Override - public long available() { - try { - return is.available(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("ERROR" + e); - return 0; - } - } -} diff --git a/tools/MapleSkillMakerFetcher/src/tools/data/input/LittleEndianAccessor.java b/tools/MapleSkillMakerFetcher/src/tools/data/input/LittleEndianAccessor.java deleted file mode 100644 index f991dbf537..0000000000 --- a/tools/MapleSkillMakerFetcher/src/tools/data/input/LittleEndianAccessor.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.awt.Point; - -/** - * @author Frz - */ -public interface LittleEndianAccessor { - byte readByte(); - char readChar(); - short readShort(); - int readInt(); - Point readPos(); - long readLong(); - void skip(int num); - byte[] read(int num); - float readFloat(); - double readDouble(); - String readAsciiString(int n); - String readNullTerminatedAsciiString(); - String readMapleAsciiString(); - long getBytesRead(); - long available(); -} diff --git a/tools/MapleSkillMakerFetcher/src/tools/data/input/RandomAccessByteStream.java b/tools/MapleSkillMakerFetcher/src/tools/data/input/RandomAccessByteStream.java deleted file mode 100644 index c0004be17f..0000000000 --- a/tools/MapleSkillMakerFetcher/src/tools/data/input/RandomAccessByteStream.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import java.io.RandomAccessFile; - -/** - * Provides an abstract layer to a byte stream. This layer can be accessed - * randomly. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class RandomAccessByteStream implements SeekableInputStreamBytestream { - private RandomAccessFile raf; - private long read = 0; - - public RandomAccessByteStream(RandomAccessFile raf) { - super(); - this.raf = raf; - } - - @Override - public int readByte() { - int temp; - try { - temp = raf.read(); - if (temp == -1) { - throw new RuntimeException("EOF"); - } - read++; - return temp; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public void seek(long offset) throws IOException { - raf.seek(offset); - } - - @Override - public long getPosition() throws IOException { - return raf.getFilePointer(); - } - - @Override - public long getBytesRead() { - return read; - } - - @Override - public long available() { - try { - return raf.length() - raf.getFilePointer(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("ERROR " + e); - return 0; - } - } -} diff --git a/tools/MapleSkillMakerFetcher/src/tools/data/input/SeekableInputStreamBytestream.java b/tools/MapleSkillMakerFetcher/src/tools/data/input/SeekableInputStreamBytestream.java deleted file mode 100644 index f4922dc876..0000000000 --- a/tools/MapleSkillMakerFetcher/src/tools/data/input/SeekableInputStreamBytestream.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; - -/** - * Provides an abstract interface to a stream of bytes. This stream can be - * seeked. - * - * @author Frz - * @version 1.0 - * @since 299 - */ -public interface SeekableInputStreamBytestream extends ByteInputStream { - /** - * Seeks the stream by the specified offset. - * - * @param offset - * Number of bytes to seek. - * @throws IOException - */ - void seek(long offset) throws IOException; - - /** - * Gets the current position of the stream. - * - * @return The stream position as a long integer. - * @throws IOException - */ - long getPosition() throws IOException; -} diff --git a/tools/MapleSkillMakerFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java b/tools/MapleSkillMakerFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java deleted file mode 100644 index 16b2317f7a..0000000000 --- a/tools/MapleSkillMakerFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -public interface SeekableLittleEndianAccessor extends LittleEndianAccessor { - void seek(long offset); - long getPosition(); -} From c437a0808479244eae614b8ed9222bc78b8f6f8b Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 14:44:15 +0200 Subject: [PATCH 33/36] Move MapleSkillMakerReagentIndexer to main module --- .../mapletools/SkillMakerReagentIndexer.java | 156 +++++++----------- .../lib/MakerReagentData.sql | 56 ------- .../mapleskillmakerreagentindexer/Pair.java | 121 -------------- 3 files changed, 61 insertions(+), 272 deletions(-) rename tools/MapleSkillMakerReagentIndexer/src/mapleskillmakerreagentindexer/MapleSkillMakerReagentIndexer.java => src/main/java/tools/mapletools/SkillMakerReagentIndexer.java (52%) delete mode 100644 tools/MapleSkillMakerReagentIndexer/lib/MakerReagentData.sql delete mode 100644 tools/MapleSkillMakerReagentIndexer/src/mapleskillmakerreagentindexer/Pair.java diff --git a/tools/MapleSkillMakerReagentIndexer/src/mapleskillmakerreagentindexer/MapleSkillMakerReagentIndexer.java b/src/main/java/tools/mapletools/SkillMakerReagentIndexer.java similarity index 52% rename from tools/MapleSkillMakerReagentIndexer/src/mapleskillmakerreagentindexer/MapleSkillMakerReagentIndexer.java rename to src/main/java/tools/mapletools/SkillMakerReagentIndexer.java index 520c17fe28..798bebb3e7 100644 --- a/tools/MapleSkillMakerReagentIndexer/src/mapleskillmakerreagentindexer/MapleSkillMakerReagentIndexer.java +++ b/src/main/java/tools/mapletools/SkillMakerReagentIndexer.java @@ -1,57 +1,31 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana +package tools.mapletools; - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package mapleskillmakerreagentindexer; +import provider.wz.WZFiles; +import tools.Pair; import java.io.*; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.Collections; import java.util.List; /** - * * @author RonanLana - * + *

* The main objective of this program is to index relevant reagent data * from the Item.wz folder and generate a SQL table with them, to be used * by the server source. - * */ -public class MapleSkillMakerReagentIndexer { - static String host = "jdbc:mysql://localhost:3306/cosmic"; - static String driver = "com.mysql.jdbc.Driver"; - static String username = "cosmic_server"; - static String password = "snailshell"; +public class SkillMakerReagentIndexer { + private static final File INPUT_FILE = new File(WZFiles.ITEM.getFile(), "Etc/0425.img.xml"); + private static final File OUTPUT_FILE = ToolConstants.getOutputFile("maker-reagent-data.sql"); + private static final int INITIAL_STRING_LENGTH = 50; + private static final List>> reagentList = new ArrayList<>(); - static String fileName = "../../wz/Item.wz/Etc/0425.img.xml"; - static String newFile = "lib/MakerReagentData.sql"; + private static PrintWriter printWriter = null; + private static BufferedReader bufferedReader = null; + private static byte status = 0; + private static int id = -1; - static PrintWriter printWriter = null; - static InputStreamReader fileReader = null; - static BufferedReader bufferedReader = null; - static byte status = 0; - - static int id = -1; - static List>> reagentList = new ArrayList<>(); - - static int initialStringLength = 50; - private static String getName(String token) { int i, j; char[] dest; @@ -61,13 +35,13 @@ public class MapleSkillMakerReagentIndexer { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } - + private static String getValue(String token) { int i, j; char[] dest; @@ -77,140 +51,132 @@ public class MapleSkillMakerReagentIndexer { i = token.indexOf("\"", i) + 1; //lower bound of the string j = token.indexOf("\"", i); //upper bound - dest = new char[initialStringLength]; + dest = new char[INITIAL_STRING_LENGTH]; token.getChars(i, j, dest, 0); d = new String(dest); - return(d.trim()); + return (d.trim()); } private static void simpleToken(String token) { - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { + } else if (token.contains("imgdir")) { status += 1; } } - + private static void forwardCursor(int st) { String line = null; try { - while(status >= st && (line = bufferedReader.readLine()) != null) { + while (status >= st && (line = bufferedReader.readLine()) != null) { simpleToken(line); } - } - catch(Exception e) { + } catch (Exception e) { e.printStackTrace(); } } - + private static void translateToken(String token) { String d; - if(token.contains("/imgdir")) { + if (token.contains("/imgdir")) { status -= 1; - } - else if(token.contains("imgdir")) { - if(status == 1) { //getting id + } else if (token.contains("imgdir")) { + if (status == 1) { //getting id d = getName(token); id = Integer.parseInt(d); System.out.println("Parsing maker reagent id " + id); - } else if(status == 2) { + } else if (status == 2) { d = getName(token); - if(!d.equals("info")) { + if (!d.equals("info")) { System.out.println("not info"); forwardCursor(status); } } - + status += 1; } else { - if(status == 3) { - if(token.contains("int")) { + if (status == 3) { + if (token.contains("int")) { d = getName(token); - - if(d.contains("inc") || d.contains("rand")) { + + if (d.contains("inc") || d.contains("rand")) { Integer v = Integer.valueOf(getValue(token)); Pair reagBuff = new Pair<>(d, v); - + Pair> reagItem = new Pair<>(id, reagBuff); reagentList.add(reagItem); } } else { - if(token.contains("canvas")) { + if (token.contains("canvas")) { forwardCursor(status + 1); } } } } } - + private static void SortReagentList() { - Collections.sort(reagentList, (p1, p2) -> p1.getLeft().compareTo(p2.getLeft())); + reagentList.sort((p1, p2) -> p1.getLeft().compareTo(p2.getLeft())); } - + private static void WriteMakerReagentTableFile() { printWriter.println(" # SQL File autogenerated from the MapleSkillMakerReagentIndexer feature by Ronan Lana."); printWriter.println(" # Generated data is conformant with the Item.wz folder used to compile this."); printWriter.println(); - + printWriter.println("CREATE TABLE IF NOT EXISTS `makerreagentdata` ("); printWriter.println(" `itemid` int(11) NOT NULL,"); printWriter.println(" `stat` varchar(20) NOT NULL,"); printWriter.println(" `value` smallint(6) NOT NULL,"); printWriter.println(" PRIMARY KEY (`itemid`)"); - printWriter.println(") ENGINE=MyISAM DEFAULT CHARSET=latin1;"); + printWriter.println(");"); printWriter.println(); - + StringBuilder sb = new StringBuilder("INSERT IGNORE INTO `makerreagentdata` (`itemid`, `stat`, `value`) VALUES\r\n"); - - for(Pair> it : reagentList) { + + for (Pair> it : reagentList) { sb.append(" (" + it.left + ", \"" + it.right.left + "\", " + it.right.right + "),\r\n"); } - + sb.setLength(sb.length() - 3); sb.append(";"); - + printWriter.println(sb); } - private static void WriteMakerReagentTableData() { + private static void writeMakerReagentTableData() { // This will reference one line at a time String line = null; try { - fileReader = new InputStreamReader(new FileInputStream(fileName), "UTF-8"); + InputStreamReader fileReader = new InputStreamReader(new FileInputStream(INPUT_FILE), StandardCharsets.UTF_8); bufferedReader = new BufferedReader(fileReader); - - while((line = bufferedReader.readLine()) != null) { + + while ((line = bufferedReader.readLine()) != null) { translateToken(line); } - + bufferedReader.close(); fileReader.close(); - + SortReagentList(); - - printWriter = new PrintWriter(newFile, "UTF-8"); + + printWriter = new PrintWriter(OUTPUT_FILE, StandardCharsets.UTF_8); WriteMakerReagentTableFile(); printWriter.close(); - } - - catch(FileNotFoundException ex) { - System.out.println("Unable to open file '" + fileName + "'"); - } - catch(IOException ex) { - System.out.println("Error reading file '" + fileName + "'"); - } - - catch(Exception e) { + } catch (FileNotFoundException ex) { + System.out.println("Unable to open file '" + OUTPUT_FILE + "'"); + } catch (IOException ex) { + System.out.println("Error reading file '" + OUTPUT_FILE + "'"); + } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { - WriteMakerReagentTableData(); + writeMakerReagentTableData(); } } diff --git a/tools/MapleSkillMakerReagentIndexer/lib/MakerReagentData.sql b/tools/MapleSkillMakerReagentIndexer/lib/MakerReagentData.sql deleted file mode 100644 index 02c536569c..0000000000 --- a/tools/MapleSkillMakerReagentIndexer/lib/MakerReagentData.sql +++ /dev/null @@ -1,56 +0,0 @@ - # SQL File autogenerated from the MapleSkillMakerReagentIndexer feature by Ronan Lana. - # Generated data is conformant with the Item.wz folder used to compile this. - -CREATE TABLE IF NOT EXISTS `makerreagentdata` ( - `itemid` int(11) NOT NULL, - `stat` varchar(20) NOT NULL, - `value` smallint(6) NOT NULL, - PRIMARY KEY (`itemid`) -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - -INSERT IGNORE INTO `makerreagentdata` (`itemid`, `stat`, `value`) VALUES - (4250000, "incPAD", 1), - (4250001, "incPAD", 2), - (4250002, "incPAD", 3), - (4250100, "incMAD", 1), - (4250101, "incMAD", 2), - (4250102, "incMAD", 3), - (4250200, "incACC", 2), - (4250201, "incACC", 3), - (4250202, "incACC", 5), - (4250300, "incEVA", 2), - (4250301, "incEVA", 3), - (4250302, "incEVA", 5), - (4250400, "incSpeed", 2), - (4250401, "incSpeed", 3), - (4250402, "incSpeed", 5), - (4250500, "incJump", 1), - (4250501, "incJump", 2), - (4250502, "incJump", 3), - (4250600, "incMaxHP", 10), - (4250601, "incMaxHP", 20), - (4250602, "incMaxHP", 30), - (4250700, "incMaxMP", 10), - (4250701, "incMaxMP", 20), - (4250702, "incMaxMP", 30), - (4250800, "incSTR", 2), - (4250801, "incSTR", 3), - (4250802, "incSTR", 5), - (4250900, "incINT", 2), - (4250901, "incINT", 3), - (4250902, "incINT", 5), - (4251000, "incLUK", 2), - (4251001, "incLUK", 3), - (4251002, "incLUK", 5), - (4251100, "incDEX", 2), - (4251101, "incDEX", 3), - (4251102, "incDEX", 5), - (4251200, "incReqLevel", -1), - (4251201, "incReqLevel", -2), - (4251202, "incReqLevel", -3), - (4251300, "randOption", 1), - (4251301, "randOption", 2), - (4251302, "randOption", 3), - (4251400, "randStat", 2), - (4251401, "randStat", 3), - (4251402, "randStat", 5); diff --git a/tools/MapleSkillMakerReagentIndexer/src/mapleskillmakerreagentindexer/Pair.java b/tools/MapleSkillMakerReagentIndexer/src/mapleskillmakerreagentindexer/Pair.java deleted file mode 100644 index 895735268b..0000000000 --- a/tools/MapleSkillMakerReagentIndexer/src/mapleskillmakerreagentindexer/Pair.java +++ /dev/null @@ -1,121 +0,0 @@ -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 ~ 2010 Patrick Huy -Matthias Butz -Jan Christian Meyer - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License version 3 -as published by the Free Software Foundation. You may not use, modify -or distribute this program under any other version of the -GNU Affero General Public License. - -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 . - */ -package mapleskillmakerreagentindexer; - -/** - * Represents a pair of values. - * - * @author Frz - * @since Revision 333 - * @version 1.0 - * - * @param The type of the left value. - * @param The type of the right value. - */ -public class Pair { - - public E left; - public F right; - - /** - * Class constructor - pairs two objects together. - * - * @param left The left object. - * @param right The right object. - */ - public Pair(E left, F right) { - this.left = left; - this.right = right; - } - - /** - * Gets the left value. - * - * @return The left value. - */ - public E getLeft() { - return left; - } - - /** - * Gets the right value. - * - * @return The right value. - */ - public F getRight() { - return right; - } - - /** - * Turns the pair into a string. - * - * @return Each value of the pair as a string joined with a colon. - */ - @Override - public String toString() { - return left.toString() + ":" + right.toString(); - } - - /** - * Gets the hash code of this pair. - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((left == null) ? 0 : left.hashCode()); - result = prime * result + ((right == null) ? 0 : right.hashCode()); - return result; - } - - /** - * Checks to see if two pairs are equal. - */ - @SuppressWarnings("unchecked") - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Pair other = (Pair) obj; - if (left == null) { - if (other.left != null) { - return false; - } - } else if (!left.equals(other.left)) { - return false; - } - if (right == null) { - if (other.right != null) { - return false; - } - } else if (!right.equals(other.right)) { - return false; - } - return true; - } -} \ No newline at end of file From 04c4fac58dcba85b27095beacba348f016e8180f Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 14:45:52 +0200 Subject: [PATCH 34/36] Remove DropSpider tool It was meant to crawl hidden-street.net, but it doesn't work --- .../client/inventory/MapleInventoryType.java | 73 ---- .../src/constants/CharsetConstants.java | 48 --- .../src/constants/ItemConstants.java | 234 ------------ .../src/dropspider/DataTool.java | 129 ------- .../src/dropspider/DropEntry.java | 177 --------- .../src/dropspider/Errors.java | 19 - .../src/dropspider/Main.java | 339 ------------------ .../src/provider/MapleCanvas.java | 30 -- .../src/provider/MapleData.java | 34 -- .../src/provider/MapleDataDirectoryEntry.java | 34 -- .../src/provider/MapleDataEntity.java | 31 -- .../src/provider/MapleDataEntry.java | 33 -- .../src/provider/MapleDataFileEntry.java | 30 -- .../src/provider/MapleDataProvider.java | 27 -- .../provider/MapleDataProviderFactory.java | 55 --- .../src/provider/MapleDataTool.java | 145 -------- .../provider/wz/FileStoredPngMapleCanvas.java | 70 ---- .../src/provider/wz/ImgMapleSound.java | 39 -- .../src/provider/wz/ListWZFile.java | 86 ----- .../src/provider/wz/MapleDataType.java | 26 -- .../src/provider/wz/PNGMapleCanvas.java | 151 -------- .../src/provider/wz/WZDirectoryEntry.java | 68 ---- .../src/provider/wz/WZEntry.java | 61 ---- .../src/provider/wz/WZFile.java | 154 -------- .../src/provider/wz/WZFileEntry.java | 42 --- .../src/provider/wz/WZIMGEntry.java | 118 ------ .../src/provider/wz/WZIMGFile.java | 227 ------------ .../src/provider/wz/WZTool.java | 188 ---------- .../src/provider/wz/XMLDomMapleData.java | 225 ------------ .../src/provider/wz/XMLWZFile.java | 85 ----- .../server/MapleItemInformationProvider.java | 147 -------- .../SpiderDropFetcher/src/tools/HexTool.java | 87 ----- tools/SpiderDropFetcher/src/tools/Pair.java | 123 ------- .../tools/data/input/ByteArrayByteStream.java | 72 ---- .../src/tools/data/input/ByteInputStream.java | 35 -- .../input/GenericLittleEndianAccessor.java | 239 ------------ .../GenericSeekableLittleEndianAccessor.java | 91 ----- .../data/input/InputStreamByteStream.java | 93 ----- .../data/input/LittleEndianAccessor.java | 45 --- .../data/input/RandomAccessByteStream.java | 84 ----- .../input/SeekableInputStreamBytestream.java | 51 --- .../input/SeekableLittleEndianAccessor.java | 27 -- .../data/output/BAOSByteOutputStream.java | 56 --- .../tools/data/output/ByteOutputStream.java | 38 -- .../output/GenericLittleEndianWriter.java | 184 ---------- .../tools/data/output/LittleEndianWriter.java | 114 ------ .../output/MaplePacketLittleEndianWriter.java | 73 ---- tools/spider.bat | 5 - 48 files changed, 4542 deletions(-) delete mode 100644 tools/SpiderDropFetcher/src/client/inventory/MapleInventoryType.java delete mode 100644 tools/SpiderDropFetcher/src/constants/CharsetConstants.java delete mode 100644 tools/SpiderDropFetcher/src/constants/ItemConstants.java delete mode 100644 tools/SpiderDropFetcher/src/dropspider/DataTool.java delete mode 100644 tools/SpiderDropFetcher/src/dropspider/DropEntry.java delete mode 100644 tools/SpiderDropFetcher/src/dropspider/Errors.java delete mode 100644 tools/SpiderDropFetcher/src/dropspider/Main.java delete mode 100644 tools/SpiderDropFetcher/src/provider/MapleCanvas.java delete mode 100644 tools/SpiderDropFetcher/src/provider/MapleData.java delete mode 100644 tools/SpiderDropFetcher/src/provider/MapleDataDirectoryEntry.java delete mode 100644 tools/SpiderDropFetcher/src/provider/MapleDataEntity.java delete mode 100644 tools/SpiderDropFetcher/src/provider/MapleDataEntry.java delete mode 100644 tools/SpiderDropFetcher/src/provider/MapleDataFileEntry.java delete mode 100644 tools/SpiderDropFetcher/src/provider/MapleDataProvider.java delete mode 100644 tools/SpiderDropFetcher/src/provider/MapleDataProviderFactory.java delete mode 100644 tools/SpiderDropFetcher/src/provider/MapleDataTool.java delete mode 100644 tools/SpiderDropFetcher/src/provider/wz/FileStoredPngMapleCanvas.java delete mode 100644 tools/SpiderDropFetcher/src/provider/wz/ImgMapleSound.java delete mode 100644 tools/SpiderDropFetcher/src/provider/wz/ListWZFile.java delete mode 100644 tools/SpiderDropFetcher/src/provider/wz/MapleDataType.java delete mode 100644 tools/SpiderDropFetcher/src/provider/wz/PNGMapleCanvas.java delete mode 100644 tools/SpiderDropFetcher/src/provider/wz/WZDirectoryEntry.java delete mode 100644 tools/SpiderDropFetcher/src/provider/wz/WZEntry.java delete mode 100644 tools/SpiderDropFetcher/src/provider/wz/WZFile.java delete mode 100644 tools/SpiderDropFetcher/src/provider/wz/WZFileEntry.java delete mode 100644 tools/SpiderDropFetcher/src/provider/wz/WZIMGEntry.java delete mode 100644 tools/SpiderDropFetcher/src/provider/wz/WZIMGFile.java delete mode 100644 tools/SpiderDropFetcher/src/provider/wz/WZTool.java delete mode 100644 tools/SpiderDropFetcher/src/provider/wz/XMLDomMapleData.java delete mode 100644 tools/SpiderDropFetcher/src/provider/wz/XMLWZFile.java delete mode 100644 tools/SpiderDropFetcher/src/server/MapleItemInformationProvider.java delete mode 100644 tools/SpiderDropFetcher/src/tools/HexTool.java delete mode 100644 tools/SpiderDropFetcher/src/tools/Pair.java delete mode 100644 tools/SpiderDropFetcher/src/tools/data/input/ByteArrayByteStream.java delete mode 100644 tools/SpiderDropFetcher/src/tools/data/input/ByteInputStream.java delete mode 100644 tools/SpiderDropFetcher/src/tools/data/input/GenericLittleEndianAccessor.java delete mode 100644 tools/SpiderDropFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java delete mode 100644 tools/SpiderDropFetcher/src/tools/data/input/InputStreamByteStream.java delete mode 100644 tools/SpiderDropFetcher/src/tools/data/input/LittleEndianAccessor.java delete mode 100644 tools/SpiderDropFetcher/src/tools/data/input/RandomAccessByteStream.java delete mode 100644 tools/SpiderDropFetcher/src/tools/data/input/SeekableInputStreamBytestream.java delete mode 100644 tools/SpiderDropFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java delete mode 100644 tools/SpiderDropFetcher/src/tools/data/output/BAOSByteOutputStream.java delete mode 100644 tools/SpiderDropFetcher/src/tools/data/output/ByteOutputStream.java delete mode 100644 tools/SpiderDropFetcher/src/tools/data/output/GenericLittleEndianWriter.java delete mode 100644 tools/SpiderDropFetcher/src/tools/data/output/LittleEndianWriter.java delete mode 100644 tools/SpiderDropFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java delete mode 100644 tools/spider.bat diff --git a/tools/SpiderDropFetcher/src/client/inventory/MapleInventoryType.java b/tools/SpiderDropFetcher/src/client/inventory/MapleInventoryType.java deleted file mode 100644 index 778262f463..0000000000 --- a/tools/SpiderDropFetcher/src/client/inventory/MapleInventoryType.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package client.inventory; - -/** - * @author Matze - */ -public enum MapleInventoryType { - UNDEFINED(0), - EQUIP(1), - USE(2), - SETUP(3), - ETC(4), - CASH(5), - CANHOLD(6), //Proof-guard for inserting after removal checks - EQUIPPED(-1); //Seems nexon screwed something when removing an item T_T - final byte type; - - private MapleInventoryType(int type) { - this.type = (byte) type; - } - - public byte getType() { - return type; - } - - public short getBitfieldEncoding() { - return (short) (2 << type); - } - - public static MapleInventoryType getByType(byte type) { - for (MapleInventoryType l : MapleInventoryType.values()) { - if (l.getType() == type) { - return l; - } - } - return null; - } - - public static MapleInventoryType getByWZName(String name) { - if (name.equals("Install")) { - return SETUP; - } else if (name.equals("Consume")) { - return USE; - } else if (name.equals("Etc")) { - return ETC; - } else if (name.equals("Cash")) { - return CASH; - } else if (name.equals("Pet")) { - return CASH; - } - return UNDEFINED; - } -} diff --git a/tools/SpiderDropFetcher/src/constants/CharsetConstants.java b/tools/SpiderDropFetcher/src/constants/CharsetConstants.java deleted file mode 100644 index a9a3cd6973..0000000000 --- a/tools/SpiderDropFetcher/src/constants/CharsetConstants.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ - -package constants; - -/* - * Courtesy of GabrielSin (gabrielsin@playellin.net) - * Ellin - * MapleStory Server - * CharsetConstants - */ - -public class CharsetConstants { - - public static MapleLanguageType MAPLE_TYPE = MapleLanguageType.LANGUAGE_PT_BR; - - public enum MapleLanguageType { - LANGUAGE_PT_BR(1, "ISO-8859-1"), - LANGUAGE_US(2, "US-ASCII"); - final byte type; - final String ascii; - - private MapleLanguageType(int type, String ascii) { - this.type = (byte) type; - this.ascii = ascii; - } - - public String getAscii() { - return ascii; - } - - public byte getType() { - return type; - } - - public static MapleLanguageType getByType(byte type) { - for (MapleLanguageType l : MapleLanguageType.values()) { - if (l.getType() == type) { - return l; - } - } - return LANGUAGE_PT_BR; - } - } -} \ No newline at end of file diff --git a/tools/SpiderDropFetcher/src/constants/ItemConstants.java b/tools/SpiderDropFetcher/src/constants/ItemConstants.java deleted file mode 100644 index 860c392f34..0000000000 --- a/tools/SpiderDropFetcher/src/constants/ItemConstants.java +++ /dev/null @@ -1,234 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package constants; - -import client.inventory.MapleInventoryType; -import java.util.HashSet; -import java.util.Set; -import java.util.HashMap; -import java.util.Map; - -/** - * - * @author Jay Estrella - * @author Ronan - */ -public final class ItemConstants { - protected static Map inventoryTypeCache = new HashMap<>(); - - public final static int LOCK = 0x01; - public final static int SPIKES = 0x02; - public final static int KARMA_USE = 0x02; - public final static int COLD = 0x04; - public final static int UNTRADEABLE = 0x08; - public final static int KARMA_EQP = 0x10; - public final static int KARMA_UNTRADEABLE = 0x20; // let 0x20 until it's proven something uses this - public final static int SANDBOX = 0x40; // let 0x40 until it's proven something uses this - public final static int PET_COME = 0x80; - public final static int ACCOUNT_SHARING = 0x100; - - public final static boolean EXPIRING_ITEMS = true; - public final static Set permanentItemids = new HashSet<>(); - - static { - int[] pi = {5000060, 5000100, 5000101, 5000102}; // i ain't going to open one gigantic itemid cache just for 4 perma itemids, no way! - for(int i : pi) { - permanentItemids.add(i); - } - } - - public static int getFlagByInt(int type) { - if (type == 128) { - return PET_COME; - } else if (type == 256) { - return ACCOUNT_SHARING; - } - return 0; - } - - public static boolean isThrowingStar(int itemId) { - return itemId / 10000 == 207; - } - - public static boolean isBullet(int itemId) { - return itemId / 10000 == 233; - } - - public static boolean isPotion(int itemId) { - return itemId / 1000 == 2000; - } - - public static boolean isFood(int itemId) { - int useType = itemId / 1000; - return useType == 2022 || useType == 2010 || useType == 2020; - } - - public static boolean isConsumable(int itemId) { - return isPotion(itemId) || isFood(itemId); - } - - public static boolean isRechargeable(int itemId) { - return isThrowingStar(itemId) || isBullet(itemId); - } - - public static boolean isArrowForCrossBow(int itemId) { - return itemId / 1000 == 2061; - } - - public static boolean isArrowForBow(int itemId) { - return itemId / 1000 == 2060; - } - - public static boolean isArrow(int itemId) { - return isArrowForBow(itemId) || isArrowForCrossBow(itemId); - } - - public static boolean isPet(int itemId) { - return itemId / 1000 == 5000; - } - - public static boolean isExpirablePet(int itemId) { - return itemId == 5000054; - } - - public static boolean isPermanentItem(int itemId) { - return permanentItemids.contains(itemId); - } - - public static boolean isNewYearCardEtc(int itemId) { - return itemId / 10000 == 430; - } - - public static boolean isNewYearCardUse(int itemId) { - return itemId / 10000 == 216; - } - - public static boolean isAccessory(int itemId) { - return itemId >= 1110000 && itemId < 1140000; - } - - public static boolean isTaming(int itemId) { - int itemType = itemId / 1000; - return itemType == 1902 || itemType == 1912; - } - - public static boolean isTownScroll(int itemId) { - return itemId >= 2030000 && itemId < 2030100; - } - - public static boolean isAntibanishScroll(int itemId) { - return itemId == 2030100; - } - - public static boolean isCleanSlate(int scrollId) { - return scrollId > 2048999 && scrollId < 2049004; - } - - public static boolean isFlagModifier(int scrollId, byte flag) { - if(scrollId == 2041058 && ((flag & ItemConstants.COLD) == ItemConstants.COLD)) return true; - if(scrollId == 2040727 && ((flag & ItemConstants.SPIKES) == ItemConstants.SPIKES)) return true; - return false; - } - - public static boolean isChaosScroll(int scrollId) { - return scrollId >= 2049100 && scrollId <= 2049103; - } - - public static boolean isRateCoupon(int itemId) { - int itemType = itemId / 1000; - return itemType == 5211 || itemType == 5360; - } - - public static boolean isExpCoupon(int couponId) { - return couponId / 1000 == 5211; - } - - public static boolean isPartyItem(int itemId) { - return itemId >= 2022430 && itemId <= 2022433; - } - - public static boolean isPartyAllcure(int itemId) { - return itemId == 2022433; - } - - public static boolean isHiredMerchant(int itemId) { - return itemId / 10000 == 503; - } - - public static boolean isPlayerShop(int itemId) { - return itemId / 10000 == 514; - } - - public static MapleInventoryType getInventoryType(final int itemId) { - if (inventoryTypeCache.containsKey(itemId)) { - return inventoryTypeCache.get(itemId); - } - - MapleInventoryType ret = MapleInventoryType.UNDEFINED; - - final byte type = (byte) (itemId / 1000000); - if (type >= 1 && type <= 5) { - ret = MapleInventoryType.getByType(type); - } - - inventoryTypeCache.put(itemId, ret); - return ret; - } - - public static boolean isMakerReagent(int itemId) { - return itemId / 10000 == 425; - } - - public static boolean isOverall(int itemId) { - return itemId / 10000 == 105; - } - - public static boolean isCashStore(int itemId) { - int itemType = itemId / 10000; - return itemType == 503 || itemType == 514; - } - - public static boolean isMapleLife(int itemId) { - int itemType = itemId / 10000; - return itemType == 543 && itemId != 5430000; - } - - public static boolean isWeapon(int itemId) { - return itemId >= 1302000 && itemId < 1492024; - } - - public static boolean isEquipment(int itemId) { - return itemId < 2000000 && itemId != 0; - } - - public static boolean isMedal(int itemId) { - return itemId >= 1140000 && itemId < 1143000; - } - - public static boolean isWeddingRing(int itemId) { - return itemId >= 1112803 && itemId <= 1112809; - } - - public static boolean isWeddingToken(int itemId) { - return itemId >= 4031357 && itemId <= 4031364; - } -} diff --git a/tools/SpiderDropFetcher/src/dropspider/DataTool.java b/tools/SpiderDropFetcher/src/dropspider/DataTool.java deleted file mode 100644 index e0c4d3b144..0000000000 --- a/tools/SpiderDropFetcher/src/dropspider/DataTool.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package dropspider; - -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataFileEntry; -import provider.MapleDataProvider; -import provider.MapleDataProviderFactory; -import provider.MapleDataTool; -import server.MapleItemInformationProvider; -import tools.Pair; - -/** - * - * @author Simon (DropSpider) - */ -public class DataTool { - private static Map hardcodedMobs = new HashMap<>(); - - private static ArrayList> npc_list = null; - private static LinkedList> mob_pairs = null; - private static MapleDataProvider data = MapleDataProviderFactory.getDataProvider(MapleDataProviderFactory.fileInWZPath("Mob.wz")); - private static HashSet bosses = null; - - public static void setHardcodedMobNames() { - hardcodedMobs.put("Red Slime [2]", 7120103); - hardcodedMobs.put("Gold Slime", 7120105); - hardcodedMobs.put("Nibelung [3]", 8220015); - } - - public static void addMonsterIdsFromHardcodedName(List monster_ids, String monster_name) { - Integer id = hardcodedMobs.get(monster_name); - if(id != null) { - monster_ids.add(id); - } - } - - public static ArrayList monsterIdsFromName(String name) { - MapleData data = null; - MapleDataProvider dataProvider = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/" + "String.wz")); - ArrayList ret = new ArrayList<>(); - data = dataProvider.getData("Mob.img"); - if (mob_pairs == null) { - mob_pairs = new LinkedList<>(); - for (MapleData mobIdData : data.getChildren()) { - int mobIdFromData = Integer.parseInt(mobIdData.getName()); - String mobNameFromData = MapleDataTool.getString(mobIdData.getChildByPath("name"), "NO-NAME"); - mob_pairs.add(new Pair<>(mobIdFromData, mobNameFromData)); - } - } - for (Pair mobPair : mob_pairs) { - if (mobPair.getRight().toLowerCase().equals(name.toLowerCase())) { - ret.add(mobPair.getLeft()); - } - } - return ret; - } - - private static void populateBossList() { - bosses = new HashSet<>(); - MapleDataDirectoryEntry mob_data = data.getRoot(); - for (MapleDataFileEntry mdfe : mob_data.getFiles()) { - MapleData boss_candidate = data.getData(mdfe.getName()); - MapleData monsterInfoData = boss_candidate.getChildByPath("info"); - int mid = Integer.valueOf(boss_candidate.getName().replaceAll("[^0-9]", "")); - boolean boss = MapleDataTool.getIntConvert("boss", monsterInfoData, 0) > 0 || mid == 8810018 || mid == 9410066; - if (boss) { - bosses.add(mid); - } - } - } - - public static boolean isBoss(int mid) { - if (bosses == null) { - populateBossList(); - } - return bosses.contains(mid); - } - - public static ArrayList itemIdsFromName(String name) { - - ArrayList ret = new ArrayList<>(); - for (Pair itemPair : MapleItemInformationProvider.getInstance().getAllItems()) { - String item_name = itemPair.getRight().toLowerCase().replaceAll("\\"", ""); - item_name = item_name.replaceAll("'", ""); - item_name = item_name.replaceAll("\\'", ""); - - name = name.toLowerCase().replaceAll("\\"", ""); - name = name.replaceAll("'", ""); - name = name.replaceAll("\\'", ""); - - if (item_name.equals(name)) { - ret.add(itemPair.getLeft()); - return ret; - } - } - return ret; - } - - public static ArrayList npcIdsFromName(String name) { - MapleDataProvider dataProvider = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/" + "String.wz")); - ArrayList ret = new ArrayList<>(); - if (npc_list == null) { - ArrayList> searchList = new ArrayList<>(); - for (MapleData searchData : dataProvider.getData("Npc.img").getChildren()) { - int searchFromData = Integer.parseInt(searchData.getName()); - String infoFromData = MapleDataTool.getString(searchData.getChildByPath("name"), "NO-NAME"); - searchList.add(new Pair<>(searchFromData, infoFromData)); - } - npc_list = searchList; - } - for (Pair searched : npc_list) { - if (searched.getRight().toLowerCase().contains(name.toLowerCase())) { - ret.add(searched.getLeft()); - } - } - return ret; - } -} diff --git a/tools/SpiderDropFetcher/src/dropspider/DropEntry.java b/tools/SpiderDropFetcher/src/dropspider/DropEntry.java deleted file mode 100644 index 3fc865166d..0000000000 --- a/tools/SpiderDropFetcher/src/dropspider/DropEntry.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package dropspider; - -import client.inventory.MapleInventoryType; -import constants.ItemConstants; - -/** - * - * @author Simon (DropSpider) - */ -public class DropEntry { - private int version; - private int item_id; - private int monster_id; - private int chance; - private int mindrop; - private int maxdrop; - - public DropEntry(int item_id, int monster_id, int version) { - this.item_id = item_id; - this.monster_id = monster_id; - mindrop = 1; - maxdrop = 1; - chance = calculateChance(item_id); - this.version = version; - } - - private int calculateChance(int item_id) { - MapleInventoryType mit = ItemConstants.getInventoryType(item_id); - boolean boss = DataTool.isBoss(monster_id); - int number = (item_id / 1000) % 1000; - switch (mit) { - case EQUIP: - if (boss) { - return 40000; - } - return 700; - case USE: - if (boss) { - mindrop = 1; - maxdrop = 4; - } - switch (number) { - case 0: // normal potions - mindrop = 1; - if (version > 98) { - maxdrop = 5; - } - return 40000; - case 1: // watermelons, pills, speed potions, etc - case 2: // same thing - return 10000; - case 3: // advanced potions from crafting (should not drop) - case 4: // same thing - case 11: // poison mushroom - case 28: // cool items - case 30: // return scrolls - case 46: // gallant scrolls - return 0; - case 10: // strange potions like apples, eggs - case 12: // drakes blood, sap of ancient tree (rare use) - case 20: // salad, fried chicken, dews - case 22: // air bubbles and stuff. ALSO nependeath honey but oh well - case 50: // antidotes and stuff - return 3000; - case 290: // mastery books - if(boss) - return 40000; - else - return 1000; - case 40: // Scrolls - case 41: // Scrolls - case 43: // Scrolls - case 44: // Scrolls - case 48: // pet scrolls - if(boss) - return 10000; - else - return 750; - case 100: // summon bags - case 101: // summon bags - case 102: // summon bags - case 109: // summon bags - case 120: // pet food - case 211: // cliffs special potion - case 240: // rings - case 270: // pheromone, additional weird stuff - case 310: // teleport rock - case 320: // weird drops - case 390: // weird - case 430: // Scripted items - case 440: // jukebox - case 460: // magnifying glass - case 470: // golden hammer - case 490: // crystanol - case 500: // sp reset - return 0; - case 47: // tablets from dragon rider - return 220000; - case 49: // clean slats, potential scroll, ees - case 70: // throwing stars - case 210: // rare monster piece drops - case 330: // bullets - if(boss) - return 2500; - else - return 400; - case 60: // bow arrows - case 61: // crossbow arrows - mindrop = 10; - maxdrop = 50; - return 10000; - case 213: // boss transfrom - return 100000; - case 280: // skill books - if(boss) - return 20000; - else - return 1000; - case 381: // monster book things - case 382: - case 383: - case 384: - case 385: - case 386: - case 387: - case 388: - return 20000; - case 510: // recipes - case 511: - case 512: - return 10000; - default: - return 0; - - } - case ETC: - switch (number) { - case 0: // monster pieces - return 200000; - case 4: // crystal ores - case 130: // simulators - case 131: // manuals - return 3000; - case 30: // game pieces - return 10000; - case 32: // misc items - return 10000; - default: - return 7000; - } - default: - return 7000; - } - } - - public String getQuerySegment() { - StringBuilder sb = new StringBuilder(); - sb.append("("); - sb.append(monster_id); - sb.append(", "); - sb.append(item_id); - sb.append(", "); - sb.append(mindrop);//min - sb.append(", "); - sb.append(maxdrop);//max - sb.append(", "); - sb.append(0);//quest - sb.append(", "); - sb.append(chance); - sb.append(")"); - return sb.toString(); - } -} \ No newline at end of file diff --git a/tools/SpiderDropFetcher/src/dropspider/Errors.java b/tools/SpiderDropFetcher/src/dropspider/Errors.java deleted file mode 100644 index a54b8543ab..0000000000 --- a/tools/SpiderDropFetcher/src/dropspider/Errors.java +++ /dev/null @@ -1,19 +0,0 @@ -package dropspider; - -import java.util.LinkedList; - -public class Errors { - - public String mobName; - public LinkedList wrong = new LinkedList<>(); - - public String createErrorLog() { - StringBuilder sb = new StringBuilder(); - - for (String w : wrong) { - sb.append(mobName).append(" : ").append(w).append("\r\n"); - } - - return sb.toString(); - } -} diff --git a/tools/SpiderDropFetcher/src/dropspider/Main.java b/tools/SpiderDropFetcher/src/dropspider/Main.java deleted file mode 100644 index c5711c9fd4..0000000000 --- a/tools/SpiderDropFetcher/src/dropspider/Main.java +++ /dev/null @@ -1,339 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package dropspider; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.PrintWriter; -import java.net.Authenticator; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Scanner; -import javax.net.ssl.HttpsURLConnection; - -/** - * - * @author Simon (DropSpider) - */ - -//NOTE: this tool is currently unsupported since HS started using HTTPS. Missing proper SSL certificates to access Hidden-Street's website. -public class Main { - - private static ArrayList drop_entries = new ArrayList<>(); - private static HashMap problems = new HashMap<>(); -// private static final String TEST_STRING = " Ligator Skin, The Magic Rock, Witch Grass Leaves "; - private static final String BASE_URL = "https://bbb.hidden-street.net"; - private static final int VERSION = 83; - private static String[] pages = {"1-10", "11-20", "21-30", "31-40", "41-50", "51-60", "61-70", "71-80", "81-90", "91-100"}; - private static String[] additionalPages88 = {"101-150", "151-200"}; - private static String[] additionalPagesBB = {"101-120,", "121-140", "141-160", "161-180", "181-200"}; - - public static void main(String[] args) { - System.setProperty("wzpath", "../../wz"); - - //DataTool.setHardcodedMobNames(); - //parsePage("https://bbb.hidden-street.net/monster/nibelung-3"); - - crawlProgram(); - - dumpQuery(); - dumpErrors(); - } - - private static void crawlProgram() { - //parseMonsterSection(TEST_STRING); - for (String s : pages) { - crawlPage("https://bbb.hidden-street.net/monster/" + s); - } - if (VERSION > 92) { // big bang - for (String s : additionalPagesBB) { - crawlPage("https://bbb.hidden-street.net/monster/" + s); - } - crawlPage("https://bbb.hidden-street.net/monster/101-120?page=1"); //page 1's bugged - } else { - for (String s : additionalPages88) { - crawlPage("https://bbb.hidden-street.net/monster/" + s); - } - } - } - - private static void crawlPage(String url) { //recursive method - try { - URL page = new URL(url); - //Authenticator.setDefault( new MyAuthenticator()); // todo keystore/truststore pass - HttpsURLConnection http = (HttpsURLConnection)page.openConnection(); - http.setAllowUserInteraction(true); - http.setRequestMethod("GET"); - http.connect(); - - InputStream is = http.getInputStream(); - Scanner s = new Scanner(is); - String temp_data = ""; - while (s.hasNext()) { - temp_data += s.nextLine() + "\n"; - } - s.close(); - is.close(); - while (temp_data.contains("class=\"monster\">")) { - String monster_section = getStringBetween(temp_data, "class=\"monster\">", ""); - parseMonsterSection(monster_section); - temp_data = trimUntil(temp_data, ""); - } - if (temp_data.contains("Go to next page")) { - String next_url_segment = getStringBetween(temp_data, "

  • ")) { - String monster_section = getStringBetween(temp_data, "class=\"monster\">", ""); - parseMonsterSection(monster_section); - temp_data = trimUntil(temp_data, ""); - } - if (temp_data.contains("Go to next page")) { - String next_url_segment = getStringBetween(temp_data, "
  • ", ""), monster_name); - - //parse useable drop - parseItemSection(getStringBetween(html_data, "Useable drop:", ""), monster_name); - - //parse ore drop - parseItemSection(getStringBetween(html_data, "Ore drop:", ""), monster_name); - - //parse equips - parseItemSection(getStringBetween(html_data, "Common equipment:", ""), monster_name); - parseItemSection(getStringBetween(html_data, "Warrior equipment:", ""), monster_name); - parseItemSection(getStringBetween(html_data, "Magician equipment:", ""), monster_name); - parseItemSection(getStringBetween(html_data, "Bowman equipment:", ""), monster_name); - parseItemSection(getStringBetween(html_data, "Thief equipment:", ""), monster_name); - parseItemSection(getStringBetween(html_data, "Pirate equipment:", ""), monster_name); - - //System.out.println(monster_name); - } - - private static void parseItemSection(String html_data, String monster_name) { - String temp_data = html_data; - while (temp_data.contains(""); - String item_name = getStringBetween(s1, "", ""); - temp_data = trimUntil(temp_data, ""); - - boolean gender_equip = false; - if (item_name.contains("(M)") || item_name.contains("(F)")) { - item_name = item_name.replaceAll("(\\(M\\))|(\\(F\\))", ""); - gender_equip = true; - } - item_name = item_name.replaceAll("Throwing-Star", "Throwing-Stars").trim(); - item_name = item_name.replaceAll("for Magic Attack", "for Magic Att.").trim(); - item_name = item_name.replaceAll("\\(50%\\)", "").trim(); - item_name = item_name.replaceAll("\\(70%\\)", "").trim(); - item_name = item_name.replaceAll("\\'s", "").trim(); - - - monster_name = monster_name.replaceAll("Horntail\\'s Head B", "Horntail"); - // Process scrolls, nexon doesn't have the % on most of the scrolls. So we need to remove it - // Unfortunately they do for some, so we have to handle that too. - boolean scroll = false; - int scrollType = 0; - - if(item_name.contains("100%")) { - scroll = true; - item_name = item_name.replaceAll("100%", "").trim(); - item_name = item_name.replaceAll("\\(\\)", "").trim(); // Hidden Street has a few scroll %'s with ()s around them.. sigh - } else if(item_name.contains("60%")) { - scroll = true; - scrollType = 1; - item_name = item_name.replaceAll("60%", "").trim(); - item_name = item_name.replaceAll("\\(\\)", "").trim(); - } else if(item_name.contains("10%")) { - scroll = true; - scrollType = 2; - item_name = item_name.replaceAll("10%", "").trim(); - item_name = item_name.replaceAll("\\(\\)", "").trim(); - //f(item_name.contains(" ()")) item_name = item_name.substring(0, item_name.lastIndexOf(" (")); - } else if(item_name.contains("70%")) { - scroll = true; - scrollType = 4; - item_name = item_name.replaceAll("70%", "").trim(); - item_name = item_name.replaceAll("\\(\\)", "").trim(); - } else if(item_name.contains("30%")) { - scroll = true; - scrollType = 5; - item_name = item_name.replaceAll("30%", "").trim(); - item_name = item_name.replaceAll("\\(\\)", "").trim(); - } - - -// System.out.println("Item name: " + item_name); - - //drop entry - ArrayList monster_ids = DataTool.monsterIdsFromName(monster_name); - //DataTool.addMonsterIdsFromHardcodedName(monster_ids, monster_name); - - ArrayList item_ids = DataTool.itemIdsFromName(item_name); - - if(scroll && item_ids.isEmpty()) { - // Try adding on the % again. Ty nexon... - if(scrollType == 0) item_name += " 100%"; - if(scrollType == 1) item_name += " 60%"; - if(scrollType == 2) item_name += " 10%"; - if(scrollType == 4) item_name += " 70%"; - if(scrollType == 5) item_name += " 30%"; - - item_ids = DataTool.itemIdsFromName(item_name); - } - - if (!monster_ids.isEmpty() && !item_ids.isEmpty()) { - int item_id = item_ids.get(0); - if(scroll) { - item_id += scrollType; - } - int item_id_2 = -1; - for (Integer mob_id : monster_ids) { - System.out.println("Monster ID: " + mob_id + ", Item ID: " + item_id); - drop_entries.add(new DropEntry(item_id, mob_id, VERSION)); - if (gender_equip && item_ids.size() > 1) { - item_id_2 = item_ids.get(1); - drop_entries.add(new DropEntry(item_id_2, mob_id, VERSION)); - - } - } - } else { - System.out.println("Error parsing item " + item_name + " dropped by " + monster_name + "."); - - if (!monster_ids.isEmpty()) { - if (!problems.containsKey(monster_name)) { - Errors e = new Errors(); - e.mobName = monster_name; - - problems.put(monster_name, e); - } - - problems.get(monster_name).wrong.add(item_name); - } - //System.out.println("Monster ids size: " + monster_ids.size() + ", Item IDs size: " + item_ids.size()); - } - - } - } - - /** - * Returns the string lying between the two specified strings. - * - * @param line The string to parse - * @param start The first string - * @param end The last string - * @return The string between the two specified strings - */ - public static String getStringBetween(String line, String start, String end) { - int start_offset = line.indexOf(start) + start.length(); - return line.substring(start_offset, line.substring(start_offset).indexOf(end) + start_offset); - } - - public static String trimUntil(String line, String until) { - int until_pos = line.indexOf(until); - if (until_pos == -1) { - return null; - } else { - return line.substring(until_pos + until.length()); - } - } - - public static void dumpErrors() { - String file = "errors.txt"; - try { - File f = new File(file); - BufferedWriter bw = new BufferedWriter(new FileWriter(f)); - PrintWriter pw = new PrintWriter(bw); - - for (Errors err : problems.values()) { - pw.write(err.createErrorLog()); - } - - pw.flush(); - - pw.close(); - bw.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static void dumpQuery() { - String filename = "drops.sql"; - try { - File output = new File(filename); - BufferedWriter bw = new BufferedWriter(new FileWriter(output)); - PrintWriter pw = new PrintWriter(bw); - StringBuilder sb = new StringBuilder(); - pw.write("TRUNCATE TABLE `drop_data`;\r\n"); - pw.write("INSERT INTO `drop_data` (`dropperid`, `itemid`, `minimum_quantity`, `maximum_quantity`, `questid`, `chance`) VALUES "); - for (Iterator i = drop_entries.iterator(); i.hasNext();) { - DropEntry de = i.next(); - pw.write(de.getQuerySegment()); - if (i.hasNext()) { - pw.write(", \r\n"); - } - } - pw.write(sb.toString()); - pw.close(); - bw.close(); - } catch (IOException ioe) { - ioe.printStackTrace(); - System.out.println("Error writing to file: " + ioe.getLocalizedMessage()); - } - } -} diff --git a/tools/SpiderDropFetcher/src/provider/MapleCanvas.java b/tools/SpiderDropFetcher/src/provider/MapleCanvas.java deleted file mode 100644 index 10ab682196..0000000000 --- a/tools/SpiderDropFetcher/src/provider/MapleCanvas.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.awt.image.BufferedImage; - -public interface MapleCanvas { - int getHeight(); - int getWidth(); - BufferedImage getImage(); -} diff --git a/tools/SpiderDropFetcher/src/provider/MapleData.java b/tools/SpiderDropFetcher/src/provider/MapleData.java deleted file mode 100644 index 4d90a93804..0000000000 --- a/tools/SpiderDropFetcher/src/provider/MapleData.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.util.List; -import provider.wz.MapleDataType; - -public interface MapleData extends MapleDataEntity, Iterable { - @Override - public String getName(); - public MapleDataType getType(); - public List getChildren(); - public MapleData getChildByPath(String path); - public Object getData(); -} diff --git a/tools/SpiderDropFetcher/src/provider/MapleDataDirectoryEntry.java b/tools/SpiderDropFetcher/src/provider/MapleDataDirectoryEntry.java deleted file mode 100644 index cb043e0c94..0000000000 --- a/tools/SpiderDropFetcher/src/provider/MapleDataDirectoryEntry.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.util.List; - -/** - * - * @author Matze - */ -public interface MapleDataDirectoryEntry extends MapleDataEntry { - public List getSubdirectories(); - public List getFiles(); - public MapleDataEntry getEntry(String name); -} diff --git a/tools/SpiderDropFetcher/src/provider/MapleDataEntity.java b/tools/SpiderDropFetcher/src/provider/MapleDataEntity.java deleted file mode 100644 index 03ff77649c..0000000000 --- a/tools/SpiderDropFetcher/src/provider/MapleDataEntity.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataEntity { - public String getName(); - public MapleDataEntity getParent(); -} diff --git a/tools/SpiderDropFetcher/src/provider/MapleDataEntry.java b/tools/SpiderDropFetcher/src/provider/MapleDataEntry.java deleted file mode 100644 index 62db6d0abe..0000000000 --- a/tools/SpiderDropFetcher/src/provider/MapleDataEntry.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataEntry extends MapleDataEntity { - public String getName(); - public int getSize(); - public int getChecksum(); - public int getOffset(); -} diff --git a/tools/SpiderDropFetcher/src/provider/MapleDataFileEntry.java b/tools/SpiderDropFetcher/src/provider/MapleDataFileEntry.java deleted file mode 100644 index 902130a612..0000000000 --- a/tools/SpiderDropFetcher/src/provider/MapleDataFileEntry.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -/** - * - * @author Matze - */ -public interface MapleDataFileEntry extends MapleDataEntry { - public void setOffset(int offset); -} diff --git a/tools/SpiderDropFetcher/src/provider/MapleDataProvider.java b/tools/SpiderDropFetcher/src/provider/MapleDataProvider.java deleted file mode 100644 index 5237b7ac37..0000000000 --- a/tools/SpiderDropFetcher/src/provider/MapleDataProvider.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -public interface MapleDataProvider { - MapleData getData(String path); - MapleDataDirectoryEntry getRoot(); -} diff --git a/tools/SpiderDropFetcher/src/provider/MapleDataProviderFactory.java b/tools/SpiderDropFetcher/src/provider/MapleDataProviderFactory.java deleted file mode 100644 index 14753d4406..0000000000 --- a/tools/SpiderDropFetcher/src/provider/MapleDataProviderFactory.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.io.File; -import java.io.IOException; -import provider.wz.WZFile; -import provider.wz.XMLWZFile; - -public class MapleDataProviderFactory { - private final static String wzPath = System.getProperty("wzpath"); - - private static MapleDataProvider getWZ(File in, boolean provideImages) { - if (in.getName().toLowerCase().endsWith("wz") && !in.isDirectory()) { - try { - return new WZFile(in, provideImages); - } catch (IOException e) { - throw new RuntimeException("Loading WZ File failed", e); - } - } else { - return new XMLWZFile(in); - } - } - - public static MapleDataProvider getDataProvider(File in) { - return getWZ(in, false); - } - - public static MapleDataProvider getImageProvidingDataProvider(File in) { - return getWZ(in, true); - } - - public static File fileInWZPath(String filename) { - return new File(wzPath, filename); - } -} \ No newline at end of file diff --git a/tools/SpiderDropFetcher/src/provider/MapleDataTool.java b/tools/SpiderDropFetcher/src/provider/MapleDataTool.java deleted file mode 100644 index 25f4c7f817..0000000000 --- a/tools/SpiderDropFetcher/src/provider/MapleDataTool.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider; - -import java.awt.Point; -import java.awt.image.BufferedImage; -import provider.wz.MapleDataType; - -public class MapleDataTool { - public static String getString(MapleData data) { - return ((String) data.getData()); - } - - public static String getString(MapleData data, String def) { - if (data == null || data.getData() == null) { - return def; - } else { - return ((String) data.getData()); - } - } - - public static String getString(String path, MapleData data) { - return getString(data.getChildByPath(path)); - } - - public static String getString(String path, MapleData data, String def) { - return getString(data.getChildByPath(path), def); - } - - public static double getDouble(MapleData data) { - return ((Double) data.getData()).doubleValue(); - } - - public static float getFloat(MapleData data) { - return ((Float) data.getData()).floatValue(); - } - - public static int getInt(MapleData data) { - if (data == null || data.getData() == null) { - return 0;// DEF? - } - return ((Integer) data.getData()).intValue(); - } - - public static int getInt(String path, MapleData data) { - return getInt(data.getChildByPath(path)); - } - - public static int getIntConvert(MapleData data) { - if (data.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(data)); - } else { - return getInt(data); - } - } - - public static int getIntConvert(String path, MapleData data) { - MapleData d = data.getChildByPath(path); - if (d.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(d)); - } else { - return getInt(d); - } - } - - public static int getInt(MapleData data, int def) { - if (data == null || data.getData() == null) { - return def; - } else if (data.getType() == MapleDataType.STRING) { - return Integer.parseInt(getString(data)); - } else { - return ((Integer) data.getData()).intValue(); - } - } - - public static int getInt(String path, MapleData data, int def) { - return getInt(data.getChildByPath(path), def); - } - - public static int getIntConvert(String path, MapleData data, int def) { - MapleData d = data.getChildByPath(path); - if (d == null) { - return def; - } - if (d.getType() == MapleDataType.STRING) { - try { - return Integer.parseInt(getString(d)); - } catch (NumberFormatException nfe) { - nfe.printStackTrace(); - return def; - } - } else { - return getInt(d, def); - } - } - - public static BufferedImage getImage(MapleData data) { - return ((MapleCanvas) data.getData()).getImage(); - } - - public static Point getPoint(MapleData data) { - return ((Point) data.getData()); - } - - public static Point getPoint(String path, MapleData data) { - return getPoint(data.getChildByPath(path)); - } - - public static Point getPoint(String path, MapleData data, Point def) { - final MapleData pointData = data.getChildByPath(path); - if (pointData == null) { - return def; - } - return getPoint(pointData); - } - - public static String getFullDataPath(MapleData data) { - String path = ""; - MapleDataEntity myData = data; - while (myData != null) { - path = myData.getName() + "/" + path; - myData = myData.getParent(); - } - return path.substring(0, path.length() - 1); - } -} diff --git a/tools/SpiderDropFetcher/src/provider/wz/FileStoredPngMapleCanvas.java b/tools/SpiderDropFetcher/src/provider/wz/FileStoredPngMapleCanvas.java deleted file mode 100644 index 21736c2c16..0000000000 --- a/tools/SpiderDropFetcher/src/provider/wz/FileStoredPngMapleCanvas.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import javax.imageio.ImageIO; -import provider.MapleCanvas; - -public class FileStoredPngMapleCanvas implements MapleCanvas { - private File file; - private int width; - private int height; - private BufferedImage image; - - public FileStoredPngMapleCanvas(int width, int height, File fileIn) { - this.width = width; - this.height = height; - this.file = fileIn; - } - - @Override - public int getHeight() { - return height; - } - - @Override - public int getWidth() { - return width; - } - - @Override - public BufferedImage getImage() { - loadImageIfNecessary(); - return image; - } - - private void loadImageIfNecessary() { - if (image == null) { - try { - image = ImageIO.read(file); - // replace the dimensions loaded from the wz by the REAL dimensions from the image - should be equal tho - width = image.getWidth(); - height = image.getHeight(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } -} diff --git a/tools/SpiderDropFetcher/src/provider/wz/ImgMapleSound.java b/tools/SpiderDropFetcher/src/provider/wz/ImgMapleSound.java deleted file mode 100644 index 8add2ccb36..0000000000 --- a/tools/SpiderDropFetcher/src/provider/wz/ImgMapleSound.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -public class ImgMapleSound { - private int dataLength, offset; - - public ImgMapleSound(int dataLength, int offset) { - this.dataLength = dataLength; - this.offset = offset; - } - - public int getDataLength() { - return dataLength; - } - - public int getOffset() { - return offset; - } -} diff --git a/tools/SpiderDropFetcher/src/provider/wz/ListWZFile.java b/tools/SpiderDropFetcher/src/provider/wz/ListWZFile.java deleted file mode 100644 index 1672a08c59..0000000000 --- a/tools/SpiderDropFetcher/src/provider/wz/ListWZFile.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import provider.MapleDataProviderFactory; -import tools.data.input.GenericLittleEndianAccessor; -import tools.data.input.InputStreamByteStream; -import tools.data.input.LittleEndianAccessor; - -public class ListWZFile { - private LittleEndianAccessor lea; - private List entries = new ArrayList(); - private static Collection modernImgs = new HashSet(); - - public static byte[] xorBytes(byte[] a, byte[] b) { - byte[] wusched = new byte[a.length]; - for (int i = 0; i < a.length; i++) { - wusched[i] = (byte) (a[i] ^ b[i]); - } - return wusched; - } - - public ListWZFile(File listwz) throws FileNotFoundException { - lea = new GenericLittleEndianAccessor(new InputStreamByteStream(new BufferedInputStream(new FileInputStream(listwz)))); - while (lea.available() > 0) { - int l = lea.readInt() * 2; - byte[] chunk = new byte[l]; - for (int i = 0; i < chunk.length; i++) { - chunk[i] = lea.readByte(); - } - lea.readChar(); - final String value = String.valueOf(WZTool.readListString(chunk)); - entries.add(value); - } - entries = Collections.unmodifiableList(entries); - } - - public List getEntries() { - return entries; - } - - public static void init() { - final String listWz = System.getProperty("listwz"); - if (listWz != null) { - ListWZFile listwz; - try { - listwz = new ListWZFile(MapleDataProviderFactory.fileInWZPath("List.wz")); - modernImgs = new HashSet(listwz.getEntries()); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - } - - public static boolean isModernImgFile(String path) { - return modernImgs.contains(path); - } -} diff --git a/tools/SpiderDropFetcher/src/provider/wz/MapleDataType.java b/tools/SpiderDropFetcher/src/provider/wz/MapleDataType.java deleted file mode 100644 index e074d57d14..0000000000 --- a/tools/SpiderDropFetcher/src/provider/wz/MapleDataType.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -public enum MapleDataType { - NONE, IMG_0x00, SHORT, INT, FLOAT, DOUBLE, STRING, EXTENDED, PROPERTY, CANVAS, VECTOR, CONVEX, SOUND, UOL, UNKNOWN_TYPE, UNKNOWN_EXTENDED_TYPE; -} \ No newline at end of file diff --git a/tools/SpiderDropFetcher/src/provider/wz/PNGMapleCanvas.java b/tools/SpiderDropFetcher/src/provider/wz/PNGMapleCanvas.java deleted file mode 100644 index 97c2303804..0000000000 --- a/tools/SpiderDropFetcher/src/provider/wz/PNGMapleCanvas.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.Point; -import java.awt.image.BufferedImage; -import java.awt.image.DataBuffer; -import java.awt.image.DataBufferByte; -import java.awt.image.PixelInterleavedSampleModel; -import java.awt.image.Raster; -import java.awt.image.SampleModel; -import java.awt.image.WritableRaster; -import java.util.zip.DataFormatException; -import java.util.zip.Inflater; -import provider.MapleCanvas; - -public class PNGMapleCanvas implements MapleCanvas { - private static final int[] ZAHLEN = new int[]{2, 1, 0, 3}; - private int height; - private int width; - private int dataLength; - private int format; - private byte[] data; - - public PNGMapleCanvas(int width, int height, int dataLength, int format, byte[] data) { - super(); - this.height = height; - this.width = width; - this.dataLength = dataLength; - this.format = format; - this.data = data; - } - - public int getHeight() { - return height; - } - - public int getWidth() { - return width; - } - - public int getFormat() { - return format; - } - - private byte[] getData() { - return data; - } - - @Override - public BufferedImage getImage() { - int sizeUncompressed = 0; - int size8888 = 0; - int maxWriteBuf = 2; - int maxHeight = 3; - byte[] writeBuf = new byte[maxWriteBuf]; - @SuppressWarnings ("unused") - byte[] rowPointers = new byte[maxHeight]; - switch (getFormat()) { - case 1: - case 513: - sizeUncompressed = getHeight() * getWidth() * 4; - break; - case 2: - sizeUncompressed = getHeight() * getWidth() * 8; - break; - case 517: - sizeUncompressed = getHeight() * getWidth() / 128; - break; - } - size8888 = getHeight() * getWidth() * 8; - if (size8888 > maxWriteBuf) { - maxWriteBuf = size8888; - writeBuf = new byte[maxWriteBuf]; - } - if (getHeight() > maxHeight) { - maxHeight = getHeight(); - rowPointers = new byte[maxHeight]; - } - Inflater dec = new Inflater(); - dec.setInput(getData(), 0, dataLength); - int declen = 0; - byte[] uc = new byte[sizeUncompressed]; - try { - declen = dec.inflate(uc); - } catch (DataFormatException ex) { - throw new RuntimeException("zlib fucks", ex); - } - dec.end(); - if (getFormat() == 1) { - for (int i = 0; i < sizeUncompressed; i++) { - byte low = (byte) (uc[i] & 0x0F); - byte high = (byte) (uc[i] & 0xF0); - writeBuf[(i << 1)] = (byte) (((low << 4) | low) & 0xFF); - writeBuf[(i << 1) + 1] = (byte) (high | ((high >>> 4) & 0xF)); - } - } else if (getFormat() == 2) { - writeBuf = uc; - } else if (getFormat() == 513) { - for (int i = 0; i < declen; i += 2) { - byte bBits = (byte) ((uc[i] & 0x1F) << 3); - byte gBits = (byte) (((uc[i + 1] & 0x07) << 5) | ((uc[i] & 0xE0) >> 3)); - byte rBits = (byte) (uc[i + 1] & 0xF8); - writeBuf[(i << 1)] = (byte) (bBits | (bBits >> 5)); - writeBuf[(i << 1) + 1] = (byte) (gBits | (gBits >> 6)); - writeBuf[(i << 1) + 2] = (byte) (rBits | (rBits >> 5)); - writeBuf[(i << 1) + 3] = (byte) 0xFF; - } - } else if (getFormat() == 517) { - byte b = 0x00; - int pixelIndex = 0; - for (int i = 0; i < declen; i++) { - for (int j = 0; j < 8; j++) { - b = (byte) (((uc[i] & (0x01 << (7 - j))) >> (7 - j)) * 255); - for (int k = 0; k < 16; k++) { - pixelIndex = (i << 9) + (j << 6) + k * 2; - writeBuf[pixelIndex] = b; - writeBuf[pixelIndex + 1] = b; - writeBuf[pixelIndex + 2] = b; - writeBuf[pixelIndex + 3] = (byte) 0xFF; - } - } - } - } - DataBufferByte imgData = new DataBufferByte(writeBuf, sizeUncompressed); - SampleModel sm = new PixelInterleavedSampleModel(DataBuffer.TYPE_BYTE, getWidth(), getHeight(), 4, getWidth() * 4, ZAHLEN); - WritableRaster imgRaster = Raster.createWritableRaster(sm, imgData, new Point(0, 0)); - BufferedImage aa = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); - aa.setData(imgRaster); - return aa; - } -} diff --git a/tools/SpiderDropFetcher/src/provider/wz/WZDirectoryEntry.java b/tools/SpiderDropFetcher/src/provider/wz/WZDirectoryEntry.java deleted file mode 100644 index d24b8cb2b9..0000000000 --- a/tools/SpiderDropFetcher/src/provider/wz/WZDirectoryEntry.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataEntity; -import provider.MapleDataEntry; -import provider.MapleDataFileEntry; - -public class WZDirectoryEntry extends WZEntry implements MapleDataDirectoryEntry { - private List subdirs = new ArrayList(); - private List files = new ArrayList(); - private Map entries = new HashMap(); - - public WZDirectoryEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(name, size, checksum, parent); - } - - public WZDirectoryEntry() { - super(null, 0, 0, null); - } - - public void addDirectory(MapleDataDirectoryEntry dir) { - subdirs.add(dir); - entries.put(dir.getName(), dir); - } - - public void addFile(MapleDataFileEntry fileEntry) { - files.add(fileEntry); - entries.put(fileEntry.getName(), fileEntry); - } - - public List getSubdirectories() { - return Collections.unmodifiableList(subdirs); - } - - public List getFiles() { - return Collections.unmodifiableList(files); - } - - public MapleDataEntry getEntry(String name) { - return entries.get(name); - } -} diff --git a/tools/SpiderDropFetcher/src/provider/wz/WZEntry.java b/tools/SpiderDropFetcher/src/provider/wz/WZEntry.java deleted file mode 100644 index 1e921b2082..0000000000 --- a/tools/SpiderDropFetcher/src/provider/wz/WZEntry.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import provider.MapleDataEntity; -import provider.MapleDataEntry; - -public class WZEntry implements MapleDataEntry { - private String name; - private int size; - private int checksum; - private int offset; - private MapleDataEntity parent; - - public WZEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(); - this.name = name; - this.size = size; - this.checksum = checksum; - this.parent = parent; - } - - public String getName() { - return name; - } - - public int getSize() { - return size; - } - - public int getChecksum() { - return checksum; - } - - public int getOffset() { - return offset; - } - - public MapleDataEntity getParent() { - return parent; - } -} diff --git a/tools/SpiderDropFetcher/src/provider/wz/WZFile.java b/tools/SpiderDropFetcher/src/provider/wz/WZFile.java deleted file mode 100644 index c6c0abf537..0000000000 --- a/tools/SpiderDropFetcher/src/provider/wz/WZFile.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.RandomAccessFile; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataFileEntry; -import provider.MapleDataProvider; -import tools.data.input.GenericLittleEndianAccessor; -import tools.data.input.GenericSeekableLittleEndianAccessor; -import tools.data.input.InputStreamByteStream; -import tools.data.input.LittleEndianAccessor; -import tools.data.input.RandomAccessByteStream; -import tools.data.input.SeekableLittleEndianAccessor; - -public class WZFile implements MapleDataProvider { - static { - ListWZFile.init(); - } - private File wzfile; - private LittleEndianAccessor lea; - private SeekableLittleEndianAccessor slea; - private int headerSize; - private WZDirectoryEntry root; - private boolean provideImages; - private int cOffset; - - public WZFile(File wzfile, boolean provideImages) throws IOException { - this.wzfile = wzfile; - lea = new GenericLittleEndianAccessor(new InputStreamByteStream(new BufferedInputStream(new FileInputStream(wzfile)))); - RandomAccessFile raf = new RandomAccessFile(wzfile, "r"); - slea = new GenericSeekableLittleEndianAccessor(new RandomAccessByteStream(raf)); - root = new WZDirectoryEntry(wzfile.getName(), 0, 0, null); - this.provideImages = provideImages; - load(); - } - - private void load() throws IOException { - lea.readAsciiString(4); - lea.readInt(); - lea.readInt(); - headerSize = lea.readInt(); - lea.readNullTerminatedAsciiString(); - lea.readShort(); - parseDirectory(root); - cOffset = (int) lea.getBytesRead(); - getOffsets(root); - } - - private void getOffsets(MapleDataDirectoryEntry dir) { - for (MapleDataFileEntry file : dir.getFiles()) { - file.setOffset(cOffset); - cOffset += file.getSize(); - } - for (MapleDataDirectoryEntry sdir : dir.getSubdirectories()) { - getOffsets(sdir); - } - } - - private void parseDirectory(WZDirectoryEntry dir) { - int entries = WZTool.readValue(lea); - for (int i = 0; i < entries; i++) { - byte marker = lea.readByte(); - String name = null; - int size, checksum; - switch (marker) { - case 0x02: - name = WZTool.readDecodedStringAtOffsetAndReset(slea, lea.readInt() + this.headerSize + 1); - size = WZTool.readValue(lea); - checksum = WZTool.readValue(lea); - lea.readInt(); //dummy int - dir.addFile(new WZFileEntry(name, size, checksum, dir)); - break; - case 0x03: - case 0x04: - name = WZTool.readDecodedString(lea); - size = WZTool.readValue(lea); - checksum = WZTool.readValue(lea); - lea.readInt(); //dummy int - if (marker == 3) { - dir.addDirectory(new WZDirectoryEntry(name, size, checksum, dir)); - } else { - dir.addFile(new WZFileEntry(name, size, checksum, dir)); - } - break; - default: - } - } - for (MapleDataDirectoryEntry idir : dir.getSubdirectories()) { - parseDirectory((WZDirectoryEntry) idir); - } - } - - public WZIMGFile getImgFile(String path) throws IOException { - String segments[] = path.split("/"); - WZDirectoryEntry dir = root; - for (int x = 0; x < segments.length - 1; x++) { - dir = (WZDirectoryEntry) dir.getEntry(segments[x]); - if (dir == null) { - return null; - } - } - WZFileEntry entry = (WZFileEntry) dir.getEntry(segments[segments.length - 1]); - if (entry == null) { - return null; - } - String fullPath = wzfile.getName().substring(0, wzfile.getName().length() - 3).toLowerCase() + "/" + path; - return new WZIMGFile(this.wzfile, entry, provideImages, ListWZFile.isModernImgFile(fullPath)); - } - - @Override - public synchronized MapleData getData(String path) { - try { - WZIMGFile imgFile = getImgFile(path); - if (imgFile == null) { - return null; - } - MapleData ret = imgFile.getRoot(); - return ret; - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - @Override - public MapleDataDirectoryEntry getRoot() { - return root; - } -} diff --git a/tools/SpiderDropFetcher/src/provider/wz/WZFileEntry.java b/tools/SpiderDropFetcher/src/provider/wz/WZFileEntry.java deleted file mode 100644 index 792371d9cf..0000000000 --- a/tools/SpiderDropFetcher/src/provider/wz/WZFileEntry.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import provider.MapleDataEntity; -import provider.MapleDataFileEntry; - -public class WZFileEntry extends WZEntry implements MapleDataFileEntry { - private int offset; - - public WZFileEntry(String name, int size, int checksum, MapleDataEntity parent) { - super(name, size, checksum, parent); - } - - @Override - public int getOffset() { - return offset; - } - - public void setOffset(int offset) { - this.offset = offset; - } -} diff --git a/tools/SpiderDropFetcher/src/provider/wz/WZIMGEntry.java b/tools/SpiderDropFetcher/src/provider/wz/WZIMGEntry.java deleted file mode 100644 index 385d785183..0000000000 --- a/tools/SpiderDropFetcher/src/provider/wz/WZIMGEntry.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import provider.MapleData; -import provider.MapleDataEntity; - -public class WZIMGEntry implements MapleData { - private String name; - private MapleDataType type; - private List children = new ArrayList(10); - private Object data; - private MapleDataEntity parent; - - public WZIMGEntry(MapleDataEntity parent) { - this.parent = parent; - } - - @Override - public String getName() { - return name; - } - - @Override - public MapleDataType getType() { - return type; - } - - @Override - public List getChildren() { - return Collections.unmodifiableList(children); - } - - @Override - public MapleData getChildByPath(String path) { - String segments[] = path.split("/"); - if (segments[0].equals("..")) { - return ((MapleData) getParent()).getChildByPath(path.substring(path.indexOf("/") + 1)); - } - MapleData ret = this; - for (int x = 0; x < segments.length; x++) { - boolean foundChild = false; - for (MapleData child : ret.getChildren()) { - if (child.getName().equals(segments[x])) { - ret = child; - foundChild = true; - break; - } - } - if (!foundChild) { - return null; - } - } - return ret; - } - - @Override - public Object getData() { - return data; - } - - public void setName(String name) { - this.name = name; - } - - public void setType(MapleDataType type) { - this.type = type; - } - - public void setData(Object data) { - this.data = data; - } - - public void addChild(WZIMGEntry entry) { - children.add(entry); - } - - @Override - public Iterator iterator() { - return getChildren().iterator(); - } - - @Override - public String toString() { - return getName() + ":" + getData(); - } - - public MapleDataEntity getParent() { - return parent; - } - - public void finish() { - ((ArrayList) children).trimToSize(); - } -} diff --git a/tools/SpiderDropFetcher/src/provider/wz/WZIMGFile.java b/tools/SpiderDropFetcher/src/provider/wz/WZIMGFile.java deleted file mode 100644 index bec06c78bd..0000000000 --- a/tools/SpiderDropFetcher/src/provider/wz/WZIMGFile.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.awt.Point; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.io.RandomAccessFile; -import tools.data.input.GenericSeekableLittleEndianAccessor; -import tools.data.input.RandomAccessByteStream; -import tools.data.input.SeekableLittleEndianAccessor; - -public class WZIMGFile { - private WZFileEntry file; - private WZIMGEntry root; - private boolean provideImages; - @SuppressWarnings ("unused") - private boolean modernImg; - - public WZIMGFile(File wzfile, WZFileEntry file, boolean provideImages, boolean modernImg) throws IOException { - RandomAccessFile raf = new RandomAccessFile(wzfile, "r"); - SeekableLittleEndianAccessor slea = new GenericSeekableLittleEndianAccessor(new RandomAccessByteStream(raf)); - slea.seek(file.getOffset()); - this.file = file; - this.provideImages = provideImages; - root = new WZIMGEntry(file.getParent()); - root.setName(file.getName()); - root.setType(MapleDataType.EXTENDED); - this.modernImg = modernImg; - parseExtended(root, slea, 0); - root.finish(); - raf.close(); - } - - protected void dumpImg(OutputStream out, SeekableLittleEndianAccessor slea) throws IOException { - DataOutputStream os = new DataOutputStream(out); - long oldPos = slea.getPosition(); - slea.seek(file.getOffset()); - for (int x = 0; x < file.getSize(); x++) { - os.write(slea.readByte()); - } - slea.seek(oldPos); - } - - public WZIMGEntry getRoot() { - return root; - } - - private void parse(WZIMGEntry entry, SeekableLittleEndianAccessor slea) { - byte marker = slea.readByte(); - switch (marker) { - case 0: { - String name = WZTool.readDecodedString(slea); - entry.setName(name); - break; - } - case 1: { - String name = WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt()); - entry.setName(name); - break; - } - default: - System.out.println("Unknown Image identifier: " + marker + " at offset " + (slea.getPosition() - file.getOffset())); - } - marker = slea.readByte(); - switch (marker) { - case 0: - entry.setType(MapleDataType.IMG_0x00); - break; - case 2: - case 11: //??? no idea, since 0.49 - entry.setType(MapleDataType.SHORT); - entry.setData(Short.valueOf(slea.readShort())); - break; - case 3: - entry.setType(MapleDataType.INT); - entry.setData(Integer.valueOf(WZTool.readValue(slea))); - break; - case 4: - entry.setType(MapleDataType.FLOAT); - entry.setData(Float.valueOf(WZTool.readFloatValue(slea))); - break; - case 5: - entry.setType(MapleDataType.DOUBLE); - entry.setData(Double.valueOf(slea.readDouble())); - break; - case 8: - entry.setType(MapleDataType.STRING); - byte iMarker = slea.readByte(); - if (iMarker == 0) { - entry.setData(WZTool.readDecodedString(slea)); - } else if (iMarker == 1) { - entry.setData(WZTool.readDecodedStringAtOffsetAndReset(slea, slea.readInt() + file.getOffset())); - } else { - System.out.println("Unknown String type " + iMarker); - } - break; - case 9: - entry.setType(MapleDataType.EXTENDED); - long endOfExtendedBlock = slea.readInt(); - endOfExtendedBlock += slea.getPosition(); - parseExtended(entry, slea, endOfExtendedBlock); - break; - default: - System.out.println("Unknown Image type " + marker); - } - } - - private void parseExtended(WZIMGEntry entry, SeekableLittleEndianAccessor slea, long endOfExtendedBlock) { - byte marker = slea.readByte(); - String type; - switch (marker) { - case 0x73: - type = WZTool.readDecodedString(slea); - break; - case 0x1B: - type = WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt()); - break; - default: - throw new RuntimeException("Unknown extended image identifier: " + marker + " at offset " + - (slea.getPosition() - file.getOffset())); - } - if (type.equals("Property")) { - entry.setType(MapleDataType.PROPERTY); - slea.readByte(); - slea.readByte(); - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry cEntry = new WZIMGEntry(entry); - parse(cEntry, slea); - cEntry.finish(); - entry.addChild(cEntry); - } - } else if (type.equals("Canvas")) { - entry.setType(MapleDataType.CANVAS); - slea.readByte(); - marker = slea.readByte(); - if (marker == 0) { - // do nothing - } else if (marker == 1) { - slea.readByte(); - slea.readByte(); - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry child = new WZIMGEntry(entry); - parse(child, slea); - child.finish(); - entry.addChild(child); - } - } else { - System.out.println("Canvas marker != 1 (" + marker + ")"); - } - int width = WZTool.readValue(slea); - int height = WZTool.readValue(slea); - int format = WZTool.readValue(slea); - int format2 = slea.readByte(); - slea.readInt(); - int dataLength = slea.readInt() - 1; - slea.readByte(); - if (provideImages) { - byte[] pngdata = slea.read(dataLength); - entry.setData(new PNGMapleCanvas(width, height, dataLength, format + format2, pngdata)); - } else { - entry.setData(new PNGMapleCanvas(width, height, dataLength, format + format2, null)); - slea.skip(dataLength); - } - } else if (type.equals("Shape2D#Vector2D")) { - entry.setType(MapleDataType.VECTOR); - int x = WZTool.readValue(slea); - int y = WZTool.readValue(slea); - entry.setData(new Point(x, y)); - } else if (type.equals("Shape2D#Convex2D")) { - int children = WZTool.readValue(slea); - for (int i = 0; i < children; i++) { - WZIMGEntry cEntry = new WZIMGEntry(entry); - parseExtended(cEntry, slea, 0); - cEntry.finish(); - entry.addChild(cEntry); - } - } else if (type.equals("Sound_DX8")) { - entry.setType(MapleDataType.SOUND); - slea.readByte(); - int dataLength = WZTool.readValue(slea); - WZTool.readValue(slea); // no clue what this is - int offset = (int) slea.getPosition(); - entry.setData(new ImgMapleSound(dataLength, offset - file.getOffset())); - slea.seek(endOfExtendedBlock); - } else if (type.equals("UOL")) { - entry.setType(MapleDataType.UOL); - slea.readByte(); - byte uolmarker = slea.readByte(); - switch (uolmarker) { - case 0: - entry.setData(WZTool.readDecodedString(slea)); - break; - case 1: - entry.setData(WZTool.readDecodedStringAtOffsetAndReset(slea, file.getOffset() + slea.readInt())); - break; - default: - System.out.println("Unknown UOL marker: " + uolmarker + " " + entry.getName()); - } - } else { - throw new RuntimeException("Unhandled extended type: " + type); - } - } -} diff --git a/tools/SpiderDropFetcher/src/provider/wz/WZTool.java b/tools/SpiderDropFetcher/src/provider/wz/WZTool.java deleted file mode 100644 index 7f5452cd03..0000000000 --- a/tools/SpiderDropFetcher/src/provider/wz/WZTool.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import tools.data.input.LittleEndianAccessor; -import tools.data.input.SeekableLittleEndianAccessor; - -import javax.crypto.BadPaddingException; -import javax.crypto.Cipher; -import javax.crypto.IllegalBlockSizeException; -import javax.crypto.NoSuchPaddingException; -import javax.crypto.spec.SecretKeySpec; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; - -/* - * Ported Code, see WZFile.java for more info - */ -public class WZTool { - private static byte[] encKey; - - static { - byte[] iv = new byte[]{(byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b, - (byte) 0x4d, (byte) 0x23, (byte) 0xc7, (byte) 0x2b,}; - byte[] key = new byte[]{(byte) 0x13, 0x00, 0x00, 0x00, - (byte) 0x08, 0x00, 0x00, 0x00, - (byte) 0x06, 0x00, 0x00, 0x00, - (byte) 0xB4, 0x00, 0x00, 0x00, - (byte) 0x1B, 0x00, 0x00, 0x00, - (byte) 0x0F, 0x00, 0x00, 0x00, - (byte) 0x33, 0x00, 0x00, 0x00, - (byte) 0x52, 0x00, 0x00, 0x00 - }; - Cipher cipher = null; - SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); - try { - cipher = Cipher.getInstance("AES"); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } catch (NoSuchPaddingException e) { - e.printStackTrace(); - } - try { - cipher.init(Cipher.ENCRYPT_MODE, skeySpec); - } catch (InvalidKeyException e) { - e.printStackTrace(); - } - encKey = new byte[0xFFFF]; - for (int i = 0; i < (0xFFFF / 16); i++) { - try { - iv = cipher.doFinal(iv); - } catch (IllegalBlockSizeException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } - System.arraycopy(iv, 0, encKey, (i * 16), 16); - } - try { - iv = cipher.doFinal(iv); - } catch (IllegalBlockSizeException e) { - e.printStackTrace(); - } catch (BadPaddingException e) { - e.printStackTrace(); - } - System.arraycopy(iv, 0, encKey, 65520, 15); - } - - public static byte[] readListString(byte[] str) { - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ encKey[i]); - } - return str; - } - - public static String readDecodedString(LittleEndianAccessor llea) { - int strLength; - byte b = llea.readByte(); - if (b == 0x00) { - return ""; - } - if (b >= 0) { - if (b == 0x7F) { - strLength = llea.readInt(); - } else { - strLength = b; - } - if (strLength < 0) { - return ""; - } - byte str[] = new byte[strLength * 2]; - for (int i = 0; i < strLength * 2; i++) { - str[i] = llea.readByte(); - } - return DecryptUnicodeStr(str); - } else { - if (b == -128) { - strLength = llea.readInt(); - } else { - strLength = -b; - } - if (strLength < 0) { - return ""; - } - byte str[] = new byte[strLength]; - for (int i = 0; i < strLength; i++) { - str[i] = llea.readByte(); - } - return DecryptAsciiStr(str); - } - } - - public static String DecryptAsciiStr(byte[] str) { - byte xorByte = (byte) 0xAA; - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ xorByte ^ encKey[i]); - xorByte++; - } - return new String(str); - } - - public static String DecryptUnicodeStr(byte[] str) { - int xorByte = 0xAAAA; - char[] charRet = new char[str.length / 2]; - for (int i = 0; i < str.length; i++) { - str[i] = (byte) (str[i] ^ encKey[i]); - } - for (int i = 0; i < (str.length / 2); i++) { - char toXor = (char) ((str[i] << 8) | str[i + 1]); - charRet[i] = (char) (toXor ^ xorByte); - xorByte++; - } - return String.valueOf(charRet); - } - - public static String readDecodedStringAtOffset(SeekableLittleEndianAccessor slea, int offset) { - slea.seek(offset); - return readDecodedString(slea); - } - - public static String readDecodedStringAtOffsetAndReset(SeekableLittleEndianAccessor slea, int offset) { - long pos = 0; - pos = slea.getPosition(); - slea.seek(offset); - String ret = readDecodedString(slea); - slea.seek(pos); - return ret; - } - - public static int readValue(LittleEndianAccessor lea) { - byte b = lea.readByte(); - if (b == -128) { - return lea.readInt(); - } else { - return b; - } - } - - public static float readFloatValue(LittleEndianAccessor lea) { - byte b = lea.readByte(); - if (b == -128) { - return lea.readFloat(); - } else { - return 0; - } - } -} \ No newline at end of file diff --git a/tools/SpiderDropFetcher/src/provider/wz/XMLDomMapleData.java b/tools/SpiderDropFetcher/src/provider/wz/XMLDomMapleData.java deleted file mode 100644 index f8756a8696..0000000000 --- a/tools/SpiderDropFetcher/src/provider/wz/XMLDomMapleData.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package provider.wz; - -import java.awt.Point; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import provider.MapleData; -import provider.MapleDataEntity; -import org.w3c.dom.Document; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -public class XMLDomMapleData implements MapleData { - private Node node; - private File imageDataDir; - private final static NumberFormat nfParser = NumberFormat.getInstance(Locale.FRANCE); - - public XMLDomMapleData(FileInputStream fis, File imageDataDir) { - try { - DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); - DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); - Document document = documentBuilder.parse(fis); - this.node = document.getFirstChild(); - } catch (ParserConfigurationException e) { - throw new RuntimeException(e); - } catch (SAXException e) { - throw new RuntimeException(e); - } catch (IOException e) { - throw new RuntimeException(e); - } - this.imageDataDir = imageDataDir; - } - - private XMLDomMapleData(Node node) { - this.node = node; - } - - @Override - public synchronized MapleData getChildByPath(String path) { // the whole XML reading system seems susceptible to give nulls on strenuous read scenarios - String segments[] = path.split("/"); - if (segments[0].equals("..")) { - return ((MapleData) getParent()).getChildByPath(path.substring(path.indexOf("/") + 1)); - } - - Node myNode; - myNode = node; - for (String s : segments) { - NodeList childNodes = myNode.getChildNodes(); - boolean foundChild = false; - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if (childNode.getNodeType() == Node.ELEMENT_NODE && childNode.getAttributes().getNamedItem("name").getNodeValue().equals(s)) { - myNode = childNode; - foundChild = true; - break; - } - } - if (!foundChild) { - return null; - } - } - - XMLDomMapleData ret = new XMLDomMapleData(myNode); - ret.imageDataDir = new File(imageDataDir, getName() + "/" + path).getParentFile(); - return ret; - } - - @Override - public synchronized List getChildren() { - List ret = new ArrayList<>(); - - NodeList childNodes = node.getChildNodes(); - for (int i = 0; i < childNodes.getLength(); i++) { - Node childNode = childNodes.item(i); - if (childNode.getNodeType() == Node.ELEMENT_NODE) { - XMLDomMapleData child = new XMLDomMapleData(childNode); - child.imageDataDir = new File(imageDataDir, getName()); - ret.add(child); - } - } - - return ret; - } - - public synchronized static Number parseNumber(String value) { - try { - return nfParser.parse(value); - } catch(Exception e) { - e.printStackTrace(); - return 0.0f; - } - } - - @Override - public synchronized Object getData() { - NamedNodeMap attributes = node.getAttributes(); - MapleDataType type = getType(); - switch (type) { - case DOUBLE: - case FLOAT: - case INT: - case SHORT: { - String value = attributes.getNamedItem("value").getNodeValue(); - Number nval = parseNumber(value); - - switch (type) { - case DOUBLE: - return nval.doubleValue(); - case FLOAT: - return nval.floatValue(); - case INT: - return nval.intValue(); - case SHORT: - return nval.shortValue(); - default: - return null; - } - } - case STRING: - case UOL: { - String value = attributes.getNamedItem("value").getNodeValue(); - return value; - } - case VECTOR: { - String x = attributes.getNamedItem("x").getNodeValue(); - String y = attributes.getNamedItem("y").getNodeValue(); - return new Point(Integer.parseInt(x), Integer.parseInt(y)); - } - case CANVAS: { - String width = attributes.getNamedItem("width").getNodeValue(); - String height = attributes.getNamedItem("height").getNodeValue(); - return new FileStoredPngMapleCanvas(Integer.parseInt(width), Integer.parseInt(height), new File( - imageDataDir, getName() + ".png")); - } - default: - return null; - } - } - - @Override - public synchronized MapleDataType getType() { - String nodeName = node.getNodeName(); - - switch (nodeName) { - case "imgdir": - return MapleDataType.PROPERTY; - case "canvas": - return MapleDataType.CANVAS; - case "convex": - return MapleDataType.CONVEX; - case "sound": - return MapleDataType.SOUND; - case "uol": - return MapleDataType.UOL; - case "double": - return MapleDataType.DOUBLE; - case "float": - return MapleDataType.FLOAT; - case "int": - return MapleDataType.INT; - case "short": - return MapleDataType.SHORT; - case "string": - return MapleDataType.STRING; - case "vector": - return MapleDataType.VECTOR; - case "null": - return MapleDataType.IMG_0x00; - } - return null; - } - - @Override - public synchronized MapleDataEntity getParent() { - Node parentNode; - parentNode = node.getParentNode(); - if (parentNode.getNodeType() == Node.DOCUMENT_NODE) { - return null; - } - XMLDomMapleData parentData = new XMLDomMapleData(parentNode); - parentData.imageDataDir = imageDataDir.getParentFile(); - return parentData; - } - - @Override - public synchronized String getName() { - return node.getAttributes().getNamedItem("name").getNodeValue(); - } - - @Override - public synchronized Iterator iterator() { - return getChildren().iterator(); - } -} diff --git a/tools/SpiderDropFetcher/src/provider/wz/XMLWZFile.java b/tools/SpiderDropFetcher/src/provider/wz/XMLWZFile.java deleted file mode 100644 index 2a7694fdc9..0000000000 --- a/tools/SpiderDropFetcher/src/provider/wz/XMLWZFile.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package provider.wz; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import provider.MapleData; -import provider.MapleDataDirectoryEntry; -import provider.MapleDataProvider; - -public class XMLWZFile implements MapleDataProvider { - private File root; - private WZDirectoryEntry rootForNavigation; - - public XMLWZFile(File fileIn) { - root = fileIn; - rootForNavigation = new WZDirectoryEntry(fileIn.getName(), 0, 0, null); - fillMapleDataEntitys(root, rootForNavigation); - } - - private void fillMapleDataEntitys(File lroot, WZDirectoryEntry wzdir) { - for (File file : lroot.listFiles()) { - String fileName = file.getName(); - if (file.isDirectory() && !fileName.endsWith(".img")) { - WZDirectoryEntry newDir = new WZDirectoryEntry(fileName, 0, 0, wzdir); - wzdir.addDirectory(newDir); - fillMapleDataEntitys(file, newDir); - } else if (fileName.endsWith(".xml")) { - wzdir.addFile(new WZFileEntry(fileName.substring(0, fileName.length() - 4), 0, 0, wzdir)); - } - } - } - - @Override - public MapleData getData(String path) { - File dataFile = new File(root, path + ".xml"); - File imageDataDir = new File(root, path); - if (!dataFile.exists()) { - return null;//bitches - } - FileInputStream fis; - try { - fis = new FileInputStream(dataFile); - } catch (FileNotFoundException e) { - throw new RuntimeException("Datafile " + path + " does not exist in " + root.getAbsolutePath()); - } - final XMLDomMapleData domMapleData; - try { - domMapleData = new XMLDomMapleData(fis, imageDataDir.getParentFile()); - } finally { - try { - fis.close(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - return domMapleData; - } - - @Override - public MapleDataDirectoryEntry getRoot() { - return rootForNavigation; - } -} diff --git a/tools/SpiderDropFetcher/src/server/MapleItemInformationProvider.java b/tools/SpiderDropFetcher/src/server/MapleItemInformationProvider.java deleted file mode 100644 index b215841610..0000000000 --- a/tools/SpiderDropFetcher/src/server/MapleItemInformationProvider.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package server; - -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import provider.MapleData; -import provider.MapleDataProvider; -import provider.MapleDataProviderFactory; -import provider.MapleDataTool; -import tools.Pair; - -/** - * - * @author Matze - * - */ -public class MapleItemInformationProvider { - private final static MapleItemInformationProvider instance = new MapleItemInformationProvider(); - - public static MapleItemInformationProvider getInstance() { - return instance; - } - - protected MapleDataProvider itemData; - protected MapleDataProvider equipData; - protected MapleDataProvider stringData; - protected MapleDataProvider etcData; - protected MapleData cashStringData; - protected MapleData consumeStringData; - protected MapleData eqpStringData; - protected MapleData etcStringData; - protected MapleData insStringData; - protected MapleData petStringData; - protected Map isQuestItemCache = new HashMap<>(); - protected Map isPartyQuestItemCache = new HashMap<>(); - protected List> itemNameCache = new ArrayList<>(); - - private MapleItemInformationProvider() { - itemData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Item.wz")); - equipData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Character.wz")); - stringData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/String.wz")); - etcData = MapleDataProviderFactory.getDataProvider(new File(System.getProperty("wzpath") + "/Etc.wz")); - cashStringData = stringData.getData("Cash.img"); - consumeStringData = stringData.getData("Consume.img"); - eqpStringData = stringData.getData("Eqp.img"); - etcStringData = stringData.getData("Etc.img"); - insStringData = stringData.getData("Ins.img"); - petStringData = stringData.getData("Pet.img"); - - isQuestItemCache.put(0, false); - isPartyQuestItemCache.put(0, false); - } - -// public MapleInventoryType getInventoryType(int itemId) { -// if (inventoryTypeCache.containsKey(itemId)) { -// return inventoryTypeCache.get(itemId); -// } -// MapleInventoryType ret; -// String idStr = "0" + String.valueOf(itemId); -// MapleDataDirectoryEntry root = itemData.getRoot(); -// for (MapleDataDirectoryEntry topDir : root.getSubdirectories()) { -// for (MapleDataFileEntry iFile : topDir.getFiles()) { -// if (iFile.getName().equals(idStr.substring(0, 4) + ".img")) { -// ret = MapleInventoryType.getByWZName(topDir.getName()); -// inventoryTypeCache.put(itemId, ret); -// return ret; -// } else if (iFile.getName().equals(idStr.substring(1) + ".img")) { -// ret = MapleInventoryType.getByWZName(topDir.getName()); -// inventoryTypeCache.put(itemId, ret); -// return ret; -// } -// } -// } -// root = equipData.getRoot(); -// for (MapleDataDirectoryEntry topDir : root.getSubdirectories()) { -// for (MapleDataFileEntry iFile : topDir.getFiles()) { -// if (iFile.getName().equals(idStr + ".img")) { -// ret = MapleInventoryType.EQUIP; -// inventoryTypeCache.put(itemId, ret); -// return ret; -// } -// } -// } -// ret = MapleInventoryType.UNDEFINED; -// inventoryTypeCache.put(itemId, ret); -// return ret; -// } - - public List> getAllItems() { - if (!itemNameCache.isEmpty()) { - return itemNameCache; - } - List> itemPairs = new ArrayList<>(); - MapleData itemsData; - itemsData = stringData.getData("Cash.img"); - for (MapleData itemFolder : itemsData.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - itemsData = stringData.getData("Consume.img"); - for (MapleData itemFolder : itemsData.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - itemsData = stringData.getData("Eqp.img").getChildByPath("Eqp"); - for (MapleData eqpType : itemsData.getChildren()) { - for (MapleData itemFolder : eqpType.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - } - itemsData = stringData.getData("Etc.img").getChildByPath("Etc"); - for (MapleData itemFolder : itemsData.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - itemsData = stringData.getData("Ins.img"); - for (MapleData itemFolder : itemsData.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - itemsData = stringData.getData("Pet.img"); - for (MapleData itemFolder : itemsData.getChildren()) { - itemPairs.add(new Pair<>(Integer.parseInt(itemFolder.getName()), MapleDataTool.getString("name", itemFolder, "NO-NAME"))); - } - return itemPairs; - } -} diff --git a/tools/SpiderDropFetcher/src/tools/HexTool.java b/tools/SpiderDropFetcher/src/tools/HexTool.java deleted file mode 100644 index 428baf3115..0000000000 --- a/tools/SpiderDropFetcher/src/tools/HexTool.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools; - -import java.io.ByteArrayOutputStream; - -public class HexTool { - private static final char[] HEX = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; - - private static String toString(byte byteValue) { - int tmp = byteValue << 8; - char[] retstr = new char[]{HEX[(tmp >> 12) & 0x0F], HEX[(tmp >> 8) & 0x0F]}; - return String.valueOf(retstr); - } - - public static String toString(byte[] bytes) { - StringBuilder hexed = new StringBuilder(); - for (int i = 0; i < bytes.length; i++) { - hexed.append(toString(bytes[i])); - hexed.append(' '); - } - return hexed.substring(0, hexed.length() - 1); - } - - public static String toCompressedString(byte[] bytes) { - StringBuilder hexed = new StringBuilder(); - for (int i = 0; i < bytes.length; i++) { - hexed.append(toString(bytes[i])); - } - return hexed.substring(0, hexed.length()); - } - - public static byte[] getByteArrayFromHexString(String hex) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - int nexti = 0; - int nextb = 0; - boolean highoc = true; - outer: - for (;;) { - int number = -1; - while (number == -1) { - if (nexti == hex.length()) { - break outer; - } - char chr = hex.charAt(nexti); - if (chr >= '0' && chr <= '9') { - number = chr - '0'; - } else if (chr >= 'a' && chr <= 'f') { - number = chr - 'a' + 10; - } else if (chr >= 'A' && chr <= 'F') { - number = chr - 'A' + 10; - } else { - number = -1; - } - nexti++; - } - if (highoc) { - nextb = number << 4; - highoc = false; - } else { - nextb |= number; - highoc = true; - baos.write(nextb); - } - } - return baos.toByteArray(); - } -} diff --git a/tools/SpiderDropFetcher/src/tools/Pair.java b/tools/SpiderDropFetcher/src/tools/Pair.java deleted file mode 100644 index e784f3d397..0000000000 --- a/tools/SpiderDropFetcher/src/tools/Pair.java +++ /dev/null @@ -1,123 +0,0 @@ -package tools; - -/* -This file is part of the OdinMS Maple Story Server -Copyright (C) 2008 ~ 2010 Patrick Huy -Matthias Butz -Jan Christian Meyer - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License version 3 -as published by the Free Software Foundation. You may not use, modify -or distribute this program under any other version of the -GNU Affero General Public License. - -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 . - */ - - -/** - * Represents a pair of values. - * - * @author Frz - * @since Revision 333 - * @version 1.0 - * - * @param The type of the left value. - * @param The type of the right value. - */ -public class Pair { - - public E left; - public F right; - - /** - * Class constructor - pairs two objects together. - * - * @param left The left object. - * @param right The right object. - */ - public Pair(E left, F right) { - this.left = left; - this.right = right; - } - - /** - * Gets the left value. - * - * @return The left value. - */ - public E getLeft() { - return left; - } - - /** - * Gets the right value. - * - * @return The right value. - */ - public F getRight() { - return right; - } - - /** - * Turns the pair into a string. - * - * @return Each value of the pair as a string joined with a colon. - */ - @Override - public String toString() { - return left.toString() + ":" + right.toString(); - } - - /** - * Gets the hash code of this pair. - */ - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((left == null) ? 0 : left.hashCode()); - result = prime * result + ((right == null) ? 0 : right.hashCode()); - return result; - } - - /** - * Checks to see if two pairs are equal. - */ - @SuppressWarnings("unchecked") - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - final Pair other = (Pair) obj; - if (left == null) { - if (other.left != null) { - return false; - } - } else if (!left.equals(other.left)) { - return false; - } - if (right == null) { - if (other.right != null) { - return false; - } - } else if (!right.equals(other.right)) { - return false; - } - return true; - } -} \ No newline at end of file diff --git a/tools/SpiderDropFetcher/src/tools/data/input/ByteArrayByteStream.java b/tools/SpiderDropFetcher/src/tools/data/input/ByteArrayByteStream.java deleted file mode 100644 index eac7de21ea..0000000000 --- a/tools/SpiderDropFetcher/src/tools/data/input/ByteArrayByteStream.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import tools.HexTool; - -public class ByteArrayByteStream implements SeekableInputStreamBytestream { - private int pos = 0; - private long bytesRead = 0; - private byte[] arr; - - public ByteArrayByteStream(byte[] arr) { - this.arr = arr; - } - - @Override - public long getPosition() { - return pos; - } - - @Override - public void seek(long offset) throws IOException { - pos = (int) offset; - } - - @Override - public long getBytesRead() { - return bytesRead; - } - - @Override - public int readByte() { - bytesRead++; - return ((int) arr[pos++]) & 0xFF; - } - - @Override - public String toString() { - String nows = "kevintjuh93 pwns";//I lol'd - if (arr.length - pos > 0) { - byte[] now = new byte[arr.length - pos]; - System.arraycopy(arr, pos, now, 0, arr.length - pos); - nows = HexTool.toString(now); - } - return "All: " + HexTool.toString(arr) + "\nNow: " + nows; - } - - @Override - public long available() { - return arr.length - pos; - } -} diff --git a/tools/SpiderDropFetcher/src/tools/data/input/ByteInputStream.java b/tools/SpiderDropFetcher/src/tools/data/input/ByteInputStream.java deleted file mode 100644 index 107f71843e..0000000000 --- a/tools/SpiderDropFetcher/src/tools/data/input/ByteInputStream.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -/** - * Represents an abstract stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public interface ByteInputStream { - int readByte(); - long getBytesRead(); - long available(); -} diff --git a/tools/SpiderDropFetcher/src/tools/data/input/GenericLittleEndianAccessor.java b/tools/SpiderDropFetcher/src/tools/data/input/GenericLittleEndianAccessor.java deleted file mode 100644 index d08a9b8374..0000000000 --- a/tools/SpiderDropFetcher/src/tools/data/input/GenericLittleEndianAccessor.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.awt.Point; -import java.io.ByteArrayOutputStream; - -/** - * Provides a generic interface to a Little Endian stream of bytes. - * - * @version 1.0 - * @author Frz - * @since Revision 323 - */ -public class GenericLittleEndianAccessor implements LittleEndianAccessor { - private ByteInputStream bs; - - /** - * Class constructor - Wraps the accessor around a stream of bytes. - * - * @param bs The byte stream to wrap the accessor around. - */ - public GenericLittleEndianAccessor(ByteInputStream bs) { - this.bs = bs; - } - - /** - * Read a single byte from the stream. - * - * @return The byte read. - * @see tools.data.input.ByteInputStream#readByte - */ - @Override - public byte readByte() { - return (byte) bs.readByte(); - } - - /** - * Reads an integer from the stream. - * - * @return The integer read. - */ - @Override - public int readInt() { - return bs.readByte() + (bs.readByte() << 8) + (bs.readByte() << 16) + (bs.readByte() << 24); - } - - /** - * Reads a short integer from the stream. - * - * @return The short read. - */ - @Override - public short readShort() { - return (short) (bs.readByte() + (bs.readByte() << 8)); - } - - /** - * Reads a single character from the stream. - * - * @return The character read. - */ - @Override - public char readChar() { - return (char) readShort(); - } - - /** - * Reads a long integer from the stream. - * - * @return The long integer read. - */ - @Override - public long readLong() { - long byte1 = bs.readByte(); - long byte2 = bs.readByte(); - long byte3 = bs.readByte(); - long byte4 = bs.readByte(); - long byte5 = bs.readByte(); - long byte6 = bs.readByte(); - long byte7 = bs.readByte(); - long byte8 = bs.readByte(); - return (byte8 << 56) + (byte7 << 48) + (byte6 << 40) + (byte5 << 32) + (byte4 << 24) + (byte3 << 16) + (byte2 << 8) + byte1; - } - - /** - * Reads a floating point integer from the stream. - * - * @return The float-type integer read. - */ - @Override - public float readFloat() { - return Float.intBitsToFloat(readInt()); - } - - /** - * Reads a double-precision integer from the stream. - * - * @return The double-type integer read. - */ - @Override - public double readDouble() { - return Double.longBitsToDouble(readLong()); - } - - /** - * Reads an ASCII string from the stream with length n. - * - * @param n Number of characters to read. - * @return The string read. - */ - public final String readAsciiString(int n) { - char ret[] = new char[n]; - for (int x = 0; x < n; x++) { - ret[x] = (char) readByte(); - } - return String.valueOf(ret); - } - - /** - * Reads a null-terminated string from the stream. - * - * @return The string read. - */ - public final String readNullTerminatedAsciiString() { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - byte b; - while (true) { - b = readByte(); - if (b == 0) { - break; - } - baos.write(b); - } - byte[] buf = baos.toByteArray(); - char[] chrBuf = new char[buf.length]; - for (int x = 0; x < buf.length; x++) { - chrBuf[x] = (char) buf[x]; - } - return String.valueOf(chrBuf); - } - - /** - * Gets the number of bytes read from the stream so far. - * - * @return A long integer representing the number of bytes read. - * @see tools.data.input.ByteInputStream#getBytesRead() - */ - public long getBytesRead() { - return bs.getBytesRead(); - } - - /** - * Reads a MapleStory convention lengthed ASCII string. - * This consists of a short integer telling the length of the string, - * then the string itself. - * - * @return The string read. - */ - @Override - public String readMapleAsciiString() { - return readAsciiString(readShort()); - } - - /** - * Reads num bytes off the stream. - * - * @param num The number of bytes to read. - * @return An array of bytes with the length of num - */ - @Override - public byte[] read(int num) { - byte[] ret = new byte[num]; - for (int x = 0; x < num; x++) { - ret[x] = readByte(); - } - return ret; - } - - /** - * Reads a MapleStory Position information. - * This consists of 2 short integer. - * - * @return The Position read. - */ - @Override - public final Point readPos() { - final int x = readShort(); - final int y = readShort(); - return new Point(x, y); - } - - /** - * Skips the current position of the stream num bytes ahead. - * - * @param num Number of bytes to skip. - */ - @Override - public void skip(int num) { - for (int x = 0; x < num; x++) { - readByte(); - } - } - - /** - * @see tools.data.input.ByteInputStream#available - */ - @Override - public long available() { - return bs.available(); - } - - /** - * @see java.lang.Object#toString - */ - @Override - public String toString() { - return bs.toString(); - } -} \ No newline at end of file diff --git a/tools/SpiderDropFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java b/tools/SpiderDropFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java deleted file mode 100644 index fdd147d796..0000000000 --- a/tools/SpiderDropFetcher/src/tools/data/input/GenericSeekableLittleEndianAccessor.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; - -/** - * Provides an abstract accessor to a generic Little Endian byte stream. This - * accessor is seekable. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - * @see tools.data.input.GenericLittleEndianAccessor - */ -public class GenericSeekableLittleEndianAccessor extends GenericLittleEndianAccessor implements SeekableLittleEndianAccessor { - private SeekableInputStreamBytestream bs; - - /** - * Class constructor - * Provide a seekable input stream to wrap this object around. - * - * @param bs The byte stream to wrap this around. - */ - public GenericSeekableLittleEndianAccessor(SeekableInputStreamBytestream bs) { - super(bs); - this.bs = bs; - } - - /** - * Seek the pointer to offset - * - * @param offset The offset to seek to. - * @see tools.data.input.SeekableInputStreamBytestream#seek - */ - @Override - public void seek(long offset) { - try { - bs.seek(offset); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("Seek failed " + e); - } - } - - /** - * Get the current position of the pointer. - * - * @return The current position of the pointer as a long integer. - * @see tools.data.input.SeekableInputStreamBytestream#getPosition - */ - @Override - public long getPosition() { - try { - return bs.getPosition(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("getPosition failed" + e); - return -1; - } - } - - /** - * Skip num number of bytes in the stream. - * - * @param num The number of bytes to skip. - */ - @Override - public void skip(int num) { - seek(getPosition() + num); - } -} diff --git a/tools/SpiderDropFetcher/src/tools/data/input/InputStreamByteStream.java b/tools/SpiderDropFetcher/src/tools/data/input/InputStreamByteStream.java deleted file mode 100644 index 70aef3489f..0000000000 --- a/tools/SpiderDropFetcher/src/tools/data/input/InputStreamByteStream.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Provides an abstract wrapper to a stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class InputStreamByteStream implements ByteInputStream { - private InputStream is; - private long read = 0; - - /** - * Class constructor. - * Provide an input stream to wrap this around. - * - * @param is The input stream to wrap this object around. - */ - public InputStreamByteStream(InputStream is) { - this.is = is; - } - - /** - * Reads the next byte from the stream. - * - * @return Then next byte in the stream. - */ - @Override - public int readByte() { - int temp; - try { - temp = is.read(); - if (temp == -1) { - throw new RuntimeException("EOF"); - } - read++; - return temp; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - /** - * Gets the number of bytes read from the stream. - * - * @return The number of bytes read as a long integer. - */ - @Override - public long getBytesRead() { - return read; - } - - /** - * Returns the number of bytes left in the stream. - * - * @return The number of bytes available for reading as a long integer. - */ - @Override - public long available() { - try { - return is.available(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("ERROR" + e); - return 0; - } - } -} diff --git a/tools/SpiderDropFetcher/src/tools/data/input/LittleEndianAccessor.java b/tools/SpiderDropFetcher/src/tools/data/input/LittleEndianAccessor.java deleted file mode 100644 index f991dbf537..0000000000 --- a/tools/SpiderDropFetcher/src/tools/data/input/LittleEndianAccessor.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.awt.Point; - -/** - * @author Frz - */ -public interface LittleEndianAccessor { - byte readByte(); - char readChar(); - short readShort(); - int readInt(); - Point readPos(); - long readLong(); - void skip(int num); - byte[] read(int num); - float readFloat(); - double readDouble(); - String readAsciiString(int n); - String readNullTerminatedAsciiString(); - String readMapleAsciiString(); - long getBytesRead(); - long available(); -} diff --git a/tools/SpiderDropFetcher/src/tools/data/input/RandomAccessByteStream.java b/tools/SpiderDropFetcher/src/tools/data/input/RandomAccessByteStream.java deleted file mode 100644 index c0004be17f..0000000000 --- a/tools/SpiderDropFetcher/src/tools/data/input/RandomAccessByteStream.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; -import java.io.RandomAccessFile; - -/** - * Provides an abstract layer to a byte stream. This layer can be accessed - * randomly. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class RandomAccessByteStream implements SeekableInputStreamBytestream { - private RandomAccessFile raf; - private long read = 0; - - public RandomAccessByteStream(RandomAccessFile raf) { - super(); - this.raf = raf; - } - - @Override - public int readByte() { - int temp; - try { - temp = raf.read(); - if (temp == -1) { - throw new RuntimeException("EOF"); - } - read++; - return temp; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - @Override - public void seek(long offset) throws IOException { - raf.seek(offset); - } - - @Override - public long getPosition() throws IOException { - return raf.getFilePointer(); - } - - @Override - public long getBytesRead() { - return read; - } - - @Override - public long available() { - try { - return raf.length() - raf.getFilePointer(); - } catch (IOException e) { - e.printStackTrace(); - System.out.println("ERROR " + e); - return 0; - } - } -} diff --git a/tools/SpiderDropFetcher/src/tools/data/input/SeekableInputStreamBytestream.java b/tools/SpiderDropFetcher/src/tools/data/input/SeekableInputStreamBytestream.java deleted file mode 100644 index f4922dc876..0000000000 --- a/tools/SpiderDropFetcher/src/tools/data/input/SeekableInputStreamBytestream.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -import java.io.IOException; - -/** - * Provides an abstract interface to a stream of bytes. This stream can be - * seeked. - * - * @author Frz - * @version 1.0 - * @since 299 - */ -public interface SeekableInputStreamBytestream extends ByteInputStream { - /** - * Seeks the stream by the specified offset. - * - * @param offset - * Number of bytes to seek. - * @throws IOException - */ - void seek(long offset) throws IOException; - - /** - * Gets the current position of the stream. - * - * @return The stream position as a long integer. - * @throws IOException - */ - long getPosition() throws IOException; -} diff --git a/tools/SpiderDropFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java b/tools/SpiderDropFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java deleted file mode 100644 index 16b2317f7a..0000000000 --- a/tools/SpiderDropFetcher/src/tools/data/input/SeekableLittleEndianAccessor.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.input; - -public interface SeekableLittleEndianAccessor extends LittleEndianAccessor { - void seek(long offset); - long getPosition(); -} diff --git a/tools/SpiderDropFetcher/src/tools/data/output/BAOSByteOutputStream.java b/tools/SpiderDropFetcher/src/tools/data/output/BAOSByteOutputStream.java deleted file mode 100644 index 80cbc9301e..0000000000 --- a/tools/SpiderDropFetcher/src/tools/data/output/BAOSByteOutputStream.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.io.ByteArrayOutputStream; - -/** - * Uses a byte array to output a stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 352 - */ -class BAOSByteOutputStream implements ByteOutputStream { - private ByteArrayOutputStream baos; - - /** - * Class constructor - Wraps the stream around a Java BAOS. - * - * @param baos The ByteArrayOutputStream to wrap this around. - */ - BAOSByteOutputStream(ByteArrayOutputStream baos) { - super(); - this.baos = baos; - } - - /** - * Writes a byte to the stream. - * - * @param b The byte to write to the stream. - * @see tools.data.output.ByteOutputStream#writeByte(byte) - */ - @Override - public void writeByte(byte b) { - baos.write(b); - } -} diff --git a/tools/SpiderDropFetcher/src/tools/data/output/ByteOutputStream.java b/tools/SpiderDropFetcher/src/tools/data/output/ByteOutputStream.java deleted file mode 100644 index 0df7ca7753..0000000000 --- a/tools/SpiderDropFetcher/src/tools/data/output/ByteOutputStream.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -/** - * Provides an interface to an output stream of bytes. - * - * @author Frz - * @since Revision 323 - * @version 1.0 - */ -interface ByteOutputStream { - /** - * Writes a byte to the stream. - * - * @param b The byte to write. - */ - void writeByte(byte b); -} diff --git a/tools/SpiderDropFetcher/src/tools/data/output/GenericLittleEndianWriter.java b/tools/SpiderDropFetcher/src/tools/data/output/GenericLittleEndianWriter.java deleted file mode 100644 index 91779e4d57..0000000000 --- a/tools/SpiderDropFetcher/src/tools/data/output/GenericLittleEndianWriter.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.awt.Point; -import java.nio.charset.Charset; -import constants.CharsetConstants.MapleLanguageType; - -/** - * Provides a generic writer of a little-endian sequence of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public class GenericLittleEndianWriter implements LittleEndianWriter { - private static Charset ASCII = Charset.forName(MapleLanguageType.LANGUAGE_US.getAscii()); - private ByteOutputStream bos; - - /** - * Class constructor - Protected to prevent instantiation with no arguments. - */ - protected GenericLittleEndianWriter() { - // Blah! - } - - /** - * Sets the byte-output stream for this instance of the object. - * - * @param bos The new output stream to set. - */ - void setByteOutputStream(ByteOutputStream bos) { - this.bos = bos; - } - - /** - * Write an array of bytes to the stream. - * - * @param b The bytes to write. - */ - @Override - public void write(byte[] b) { - for (int x = 0; x < b.length; x++) { - bos.writeByte(b[x]); - } - } - - /** - * Write a byte to the stream. - * - * @param b The byte to write. - */ - @Override - public void write(byte b) { - bos.writeByte(b); - } - - /** - * Write a byte in integer form to the stream. - * - * @param b The byte as an Integer to write. - */ - @Override - public void write(int b) { - bos.writeByte((byte) b); - } - - @Override - public void skip(int b) { - write(new byte[b]); - } - - /** - * Write a short integer to the stream. - * - * @param i The short integer to write. - */ - @Override - public void writeShort(int i) { - bos.writeByte((byte) (i & 0xFF)); - bos.writeByte((byte) ((i >>> 8) & 0xFF)); - } - - /** - * Writes an integer to the stream. - * - * @param i The integer to write. - */ - @Override - public void writeInt(int i) { - bos.writeByte((byte) (i & 0xFF)); - bos.writeByte((byte) ((i >>> 8) & 0xFF)); - bos.writeByte((byte) ((i >>> 16) & 0xFF)); - bos.writeByte((byte) ((i >>> 24) & 0xFF)); - } - - /** - * Writes an ASCII string the the stream. - * - * @param s The ASCII string to write. - */ - @Override - public void writeAsciiString(String s) { - write(s.getBytes(ASCII)); - } - - /** - * Writes a maple-convention ASCII string to the stream. - * - * @param s The ASCII string to use maple-convention to write. - */ - @Override - public void writeMapleAsciiString(String s) { - writeShort((short) s.length()); - writeAsciiString(s); - } - - /** - * Writes a null-terminated ASCII string to the stream. - * - * @param s The ASCII string to write. - */ - @Override - public void writeNullTerminatedAsciiString(String s) { - writeAsciiString(s); - write(0); - } - - /** - * Write a long integer to the stream. - * @param l The long integer to write. - */ - @Override - public void writeLong(long l) { - bos.writeByte((byte) (l & 0xFF)); - bos.writeByte((byte) ((l >>> 8) & 0xFF)); - bos.writeByte((byte) ((l >>> 16) & 0xFF)); - bos.writeByte((byte) ((l >>> 24) & 0xFF)); - bos.writeByte((byte) ((l >>> 32) & 0xFF)); - bos.writeByte((byte) ((l >>> 40) & 0xFF)); - bos.writeByte((byte) ((l >>> 48) & 0xFF)); - bos.writeByte((byte) ((l >>> 56) & 0xFF)); - } - - /** - * Writes a 2D 4 byte position information - * - * @param s The Point position to write. - */ - @Override - public void writePos(Point s) { - writeShort(s.x); - writeShort(s.y); - } - - /** - * Writes a boolean true ? 1 : 0 - * - * @param b The boolean to write. - */ - @Override - public void writeBool(final boolean b) { - write(b ? 1 : 0); - } -} diff --git a/tools/SpiderDropFetcher/src/tools/data/output/LittleEndianWriter.java b/tools/SpiderDropFetcher/src/tools/data/output/LittleEndianWriter.java deleted file mode 100644 index f17bd7c72e..0000000000 --- a/tools/SpiderDropFetcher/src/tools/data/output/LittleEndianWriter.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . - */ -package tools.data.output; - -import java.awt.Point; - -/** - * Provides an interface to a writer class that writes a little-endian sequence - * of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 323 - */ -public interface LittleEndianWriter { - - /** - * Write an array of bytes to the sequence. - * - * @param b The bytes to write. - */ - public void write(byte b[]); - - /** - * Write a byte to the sequence. - * - * @param b The byte to write. - */ - public void write(byte b); - - /** - * Write a byte in integer form to the sequence. - * - * @param b The byte as an Integer to write. - */ - public void write(int b); - - public void skip(int b); - - /** - * Writes an integer to the sequence. - * - * @param i The integer to write. - */ - public void writeInt(int i); - - /** - * Write a short integer to the sequence. - * - * @param s The short integer to write. - */ - public void writeShort(int s); - - /** - * Write a long integer to the sequence. - * - * @param l The long integer to write. - */ - public void writeLong(long l); - - /** - * Writes an ASCII string the the sequence. - * - * @param s The ASCII string to write. - */ - void writeAsciiString(String s); - - /** - * Writes a null-terminated ASCII string to the sequence. - * - * @param s The ASCII string to write. - */ - void writeNullTerminatedAsciiString(String s); - - /** - * Writes a maple-convention ASCII string to the sequence. - * - * @param s The ASCII string to use maple-convention to write. - */ - void writeMapleAsciiString(String s); - - /** - * Writes a 2D 4 byte position information - * - * @param s The Point position to write. - */ - void writePos(Point s); - - /** - * Writes a boolean true ? 1 : 0 - * - * @param b The boolean to write. - */ - void writeBool(final boolean b); -} diff --git a/tools/SpiderDropFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java b/tools/SpiderDropFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java deleted file mode 100644 index b02365ec62..0000000000 --- a/tools/SpiderDropFetcher/src/tools/data/output/MaplePacketLittleEndianWriter.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian Meyer - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ -package tools.data.output; - -import java.io.ByteArrayOutputStream; -import tools.HexTool; - -/** - * Writes a maplestory-packet little-endian stream of bytes. - * - * @author Frz - * @version 1.0 - * @since Revision 352 - */ -public class MaplePacketLittleEndianWriter extends GenericLittleEndianWriter { - private ByteArrayOutputStream baos; - - /** - * Constructor - initializes this stream with a default size. - */ - public MaplePacketLittleEndianWriter() { - this(32); - } - - /** - * Constructor - initializes this stream with size size. - * - * @param size The size of the underlying stream. - */ - public MaplePacketLittleEndianWriter(int size) { - this.baos = new ByteArrayOutputStream(size); - setByteOutputStream(new BAOSByteOutputStream(baos)); - } - - /** - * Gets a MaplePacket instance representing this - * sequence of bytes. - * - * @return A MaplePacket with the bytes in this stream. - */ - public byte[] getPacket() { - return baos.toByteArray(); - } - - /** - * Changes this packet into a human-readable hexadecimal stream of bytes. - * - * @return This packet as hex digits. - */ - @Override - public String toString() { - return HexTool.toString(baos.toByteArray()); - } -} diff --git a/tools/spider.bat b/tools/spider.bat deleted file mode 100644 index 755525fd7b..0000000000 --- a/tools/spider.bat +++ /dev/null @@ -1,5 +0,0 @@ -@echo off -@title Drop Spider -set CLASSPATH=.;dist\* -java -server -Dwzpath=wz\ dropspider.Main -pause \ No newline at end of file From e3b22363d73e88508411e67e2e7c4c234ae5cf15 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 14:47:30 +0200 Subject: [PATCH 35/36] Remove undocumented tools written in C I see no point in keeping them if all they do is cause confusion --- tools/ScriptQuestReleaseTracker/hashset.c | 238 -------- tools/ScriptQuestReleaseTracker/pcre3.dll | Bin 140288 -> 0 bytes tools/ScriptQuestReleaseTracker/quest_diff.c | 85 --- tools/ScriptQuestReleaseTracker/quest_diff.h | 28 - tools/ScriptQuestReleaseTracker/quest_list.c | 85 --- tools/ScriptQuestReleaseTracker/quest_list.h | 43 -- .../script_tracker.c | 159 ------ tools/ScriptQuestReleaseTracker/strmap.c | 515 ------------------ tools/ScriptQuestReleaseTracker/strmap.h | 356 ------------ tools/ScriptStaticMethodTracker/method_list.c | 85 --- tools/ScriptStaticMethodTracker/method_list.h | 43 -- .../method_tracker.c | 349 ------------ tools/ScriptStaticMethodTracker/pcre3.dll | Bin 140288 -> 0 bytes tools/ScriptStaticMethodTracker/script_path.c | 72 --- tools/ScriptStaticMethodTracker/script_path.h | 34 -- 15 files changed, 2092 deletions(-) delete mode 100644 tools/ScriptQuestReleaseTracker/hashset.c delete mode 100644 tools/ScriptQuestReleaseTracker/pcre3.dll delete mode 100644 tools/ScriptQuestReleaseTracker/quest_diff.c delete mode 100644 tools/ScriptQuestReleaseTracker/quest_diff.h delete mode 100644 tools/ScriptQuestReleaseTracker/quest_list.c delete mode 100644 tools/ScriptQuestReleaseTracker/quest_list.h delete mode 100644 tools/ScriptQuestReleaseTracker/script_tracker.c delete mode 100644 tools/ScriptQuestReleaseTracker/strmap.c delete mode 100644 tools/ScriptQuestReleaseTracker/strmap.h delete mode 100644 tools/ScriptStaticMethodTracker/method_list.c delete mode 100644 tools/ScriptStaticMethodTracker/method_list.h delete mode 100644 tools/ScriptStaticMethodTracker/method_tracker.c delete mode 100644 tools/ScriptStaticMethodTracker/pcre3.dll delete mode 100644 tools/ScriptStaticMethodTracker/script_path.c delete mode 100644 tools/ScriptStaticMethodTracker/script_path.h diff --git a/tools/ScriptQuestReleaseTracker/hashset.c b/tools/ScriptQuestReleaseTracker/hashset.c deleted file mode 100644 index 71300f69f2..0000000000 --- a/tools/ScriptQuestReleaseTracker/hashset.c +++ /dev/null @@ -1,238 +0,0 @@ -#include -#include -#include - -//NOTE: should the HASH_MAXITEM or HASH_NUMBUCK value be too small, program will crash by SIG_SEGV -#define HASH_MAXITEM 4000 -#define HASH_NUMBUCK 1340 -#define HASH_HIVALUE 2147483647 //32-BIT integer - -#define HASH_REHTHRE 3.5 -#define HASH_REHRATE 5 - -typedef struct { - int list[HASH_MAXITEM]; - int first; - - unsigned int count; -} HastSetIndex; - -typedef struct { - HastSetIndex **table; - int *list; - - unsigned int threshold; - unsigned int length; - unsigned int count; -} HashSet; - -void hashset_create_table(HashSet *hs) { - hs->table = (HastSetIndex **)malloc(hs->length * sizeof(HastSetIndex *)); - hs->threshold = (unsigned int)(HASH_REHTHRE * hs->length); - - unsigned int i; - for(i = 0; i < hs->length; i++) { - hs->table[i] = (HastSetIndex *)malloc(sizeof(HastSetIndex)); - hs->table[i]->count = 0; - hs->table[i]->first = HASH_HIVALUE; - } -} - -HashSet* hashset_create() { - HashSet *hs = (HashSet *)malloc(sizeof(HashSet)); - hs->count = 0; - hs->length = HASH_NUMBUCK; - hs->list = NULL; - - hashset_create_table(hs); - return(hs); -} - -void hashset_destroy(HashSet *hs) { - if(hs->list != NULL) { - free(hs->list); - } - - unsigned int i; - for(i = 0; i < hs->length; i++) - free(hs->table[i]); - - free(hs->table); - free(hs); -} - -unsigned int hashset_maptable(HashSet *hs, int item) { - return(item % hs->length); -} - -unsigned int hashset_slot(HashSet *hs, int item, unsigned int *bucket) { - *bucket = hashset_maptable(hs, item); - - unsigned int i; - for(i = 0; i < hs->table[*bucket]->count; i++) { - if(hs->table[*bucket]->list[i] == item) - return(i); - } - - return(-1); -} - -short hashset_contains(HashSet *hs, int item, unsigned int *bucket) { - return(hashset_slot(hs, item, bucket) != -1); -} - -short hashset_insertinto(HashSet *hs, int item) { - unsigned int bucket; - - if(!hashset_contains(hs, item, &bucket)) { - if(hs->table[bucket]->first > item) - hs->table[bucket]->first = item; - - hs->table[bucket]->list[hs->table[bucket]->count] = item; - - (hs->count)++; - (hs->table[bucket]->count)++; - if(hs->table[bucket]->count > hs->threshold) return(1); - } - - return(0); -} - -void hashset_rehash(HashSet *hs) { - int *temp = (int *)malloc(hs->count * sizeof(int)); - unsigned int temp_cursor = 0, i, j; - - for(i = 0; i < hs->length; i++) { - for(j = 0; j < hs->table[i]->count; j++) { - temp[temp_cursor] = hs->table[i]->list[j]; - temp_cursor++; - } - } - - for(i = 0; i < hs->length; i++) - free(hs->table[i]); - free(hs->table); - - hs->count = 0; - hs->length *= HASH_REHRATE; - hashset_create_table(hs); - - for(i = 0; i < temp_cursor; i++) - hashset_insertinto(hs, temp[i]); - - free(temp); -} - -void hashset_insert(HashSet *hs, int item) { - if(hashset_insertinto(hs, item)) { - hashset_rehash(hs); - } -} - -int hashset_recalc_first(HashSet *hs, int bucket) { - int i, val = HASH_HIVALUE; - for(i = 0; i < hs->table[bucket]->count; i++) { - if(val > hs->table[bucket]->list[i]) - val = hs->table[bucket]->list[i]; - } - - return(val); -} - -void hashset_remove(HashSet *hs, int item) { - unsigned int bucket; - unsigned int slot = hashset_slot(hs, item, &bucket); - - if(slot != -1) { - (hs->count)--; - (hs->table[bucket]->count)--; - hs->table[bucket]->list[slot] = hs->table[bucket]->list[hs->table[bucket]->count]; - - if(item == hs->table[bucket]->first) - hs->table[bucket]->first = hashset_recalc_first(hs, bucket); - } -} - -short hashset_is_empty(HashSet *hs) { - return(hs->count == 0); -} - -void hashset_make_empty(HashSet *hs) { - unsigned int i; - for(i = 0; i < hs->length; i++) { - hs->table[i]->first = HASH_HIVALUE; - hs->table[i]->count = 0; - } - - hs->count = 0; -} - -int hashset_remove_first(HashSet *hs) { - int i, take = HASH_HIVALUE; - for(i = 0; i < hs->length; i++) { - if(take > hs->table[i]->first) - take = hs->table[i]->first; - } - - hashset_remove(hs, take); - return(take); -} - -void hashset_merge(HashSet *hs1, HashSet *hs2) { - //add values from hs2 to hs1 - - unsigned int i, j; - for(i = 0; i < hs2->length; i++) { - for(j = 0; j < hs2->table[i]->count; j++) { - hashset_insert(hs1, hs2->table[i]->list[j]); - } - } -} - -void hashset_dump(HashSet *hs) { - printf("HASHSET v1.0 -- count: %d, buckets: %d, threshold: %d\n", hs->count, hs->length, hs->threshold); - - unsigned int i, j; - for(i = 0; i < hs->length; i++) { - printf("\n%d -> ", i); - for(j = 0; j < hs->table[i]->count; j++) { - printf("%d ", hs->table[i]->list[j]); - } - printf("$"); - } - printf("\n"); -} - -int* hashset_list(HashSet *hs) { - int *list = hs->list; - if(list != NULL) { - free(list); - } - - list = (int *)malloc(hs->count * sizeof(int)); - - unsigned int i, j, k = 0; - for(i = 0; i < hs->length; i++) { - for(j = 0; j < hs->table[i]->count; j++) { - list[k] = hs->table[i]->list[j]; - k++; - } - } - - return list; -} - -/* - HASHSET: - - HashSet* hashset_create(); - void hashset_destroy(HashSet *hs); - short hashset_contains(HashSet *hs, int item, unsigned int *bucket); - void hashset_insert(HashSet *hs, int item); - void hashset_remove(HashSet *hs, int item); - short hashset_is_empty(HashSet *hs); - void hashset_make_empty(HashSet *hs); - int hashset_remove_first(HashSet *hs); - void hashset_merge(HashSet *hs1, HashSet *hs2); - void hashset_dump(HashSet *hs); -*/ diff --git a/tools/ScriptQuestReleaseTracker/pcre3.dll b/tools/ScriptQuestReleaseTracker/pcre3.dll deleted file mode 100644 index b5fd2a63785922c9898e7d25d9c50ef47524ba13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140288 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 diff --git a/tools/ScriptQuestReleaseTracker/quest_diff.c b/tools/ScriptQuestReleaseTracker/quest_diff.c deleted file mode 100644 index 6e842924ea..0000000000 --- a/tools/ScriptQuestReleaseTracker/quest_diff.c +++ /dev/null @@ -1,85 +0,0 @@ -#include - -// string hash version by chqrlie - https://stackoverflow.com/questions/20462826/hash-function-for-strings-in-c -unsigned int strhash(const char *word) { - unsigned int hash = 0, c; - - size_t i = 0; - for (i = 0; word[i] != '\0'; i++) { - c = (unsigned char)word[i]; - hash = (hash << 3) + (hash >> (sizeof(hash) * CHAR_BIT - 3)) + c; - } - return hash % UINT_MAX; -} - -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ - -#include "strmap.h" -#include "hashset.c" - -void performQuestDiff(ScriptedQuestList *quests_then, ScriptedQuestList *quests_curr) { - char buf[100], bufhash[100]; - HashSet *script_quests = hashset_create(); - - // bookkeep quest-script hash - StrMap *sm = sm_new(2000); - - // insert ongoing scripts - resetScriptedQuestCursor(quests_curr); - while(true) { - ScriptedQuest *method = readScriptedQuest(quests_curr); - if (method == NULL) { - break; - } - - int hash_quest = strhash(method->name); - sprintf(bufhash, "%d", hash_quest); - - sm_put(sm, bufhash, method->name); - hashset_insert(script_quests, hash_quest); - } - - // remove initial scripts - resetScriptedQuestCursor(quests_then); - while(true) { - ScriptedQuest *method = readScriptedQuest(quests_then); - if (method == NULL) { - break; - } - - int hash_quest = strhash(method->name); - hashset_remove(script_quests, hash_quest); - } - - int *list = hashset_list(script_quests); - int i; - for (i = 0; i < script_quests->count; i++) { - int hash_quest = list[i]; - sprintf(bufhash, "%d", hash_quest); - - // dump ongoing script releases - sm_get(sm, bufhash, buf, sizeof(buf)); - printf("%s\n", buf); - } - - sm_delete(sm); - hashset_destroy(script_quests); -} diff --git a/tools/ScriptQuestReleaseTracker/quest_diff.h b/tools/ScriptQuestReleaseTracker/quest_diff.h deleted file mode 100644 index 9911d581cc..0000000000 --- a/tools/ScriptQuestReleaseTracker/quest_diff.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ - -#ifndef QUEST_DIFF_H_ -#define QUEST_DIFF_H_ - -void performQuestDiff(ScriptedQuestList *quests_then, ScriptedQuestList *quests_curr); - -#include "quest_diff.c" - -#endif /* QUEST_DIFF_H_ */ diff --git a/tools/ScriptQuestReleaseTracker/quest_list.c b/tools/ScriptQuestReleaseTracker/quest_list.c deleted file mode 100644 index 758bc64ab5..0000000000 --- a/tools/ScriptQuestReleaseTracker/quest_list.c +++ /dev/null @@ -1,85 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ - -ScriptedQuest* createScriptedQuest(const char *name) { - ScriptedQuest* method = (ScriptedQuest *)malloc(sizeof(ScriptedQuest)); - method->name = (char *)malloc((strlen(name) + 1) * sizeof(char)); - strcpy(method->name, name); - return method; -} - -void freeScriptedQuest(ScriptedQuest *method) { - free(method->name); - free(method); -} - -ScriptedQuestList createScriptedQuestList() { - ScriptedQuestList list; - list.size = 0; - - ScriptedQuestListItem *item = (ScriptedQuestListItem *)malloc(sizeof(ScriptedQuestListItem)); - item->prox = NULL; - - list.last = item; - list.first = list.last; - - return list; -} - -void insertScriptedQuest(ScriptedQuestList *list, ScriptedQuest *method) { - ScriptedQuestListItem *item = (ScriptedQuestListItem *)malloc(sizeof(ScriptedQuestListItem)); - item->prox = NULL; - - list->last->method = method; - list->last->prox = item; - - list->last = item; - list->size++; -} - -void freeScriptedQuestList(ScriptedQuestList *list) { - ScriptedQuestListItem *aux = list->first; - - list->first = list->last; - list->size = 0; - - while (aux->prox != NULL) { - ScriptedQuestListItem *aux2 = aux; - aux = aux->prox; - - freeScriptedQuest(aux2->method); - free(aux2); - } - free(aux); -} - -void resetScriptedQuestCursor(ScriptedQuestList *list) { - list->cursor = list->first; -} - -ScriptedQuest* readScriptedQuest(ScriptedQuestList *list) { - ScriptedQuestListItem *aux = list->cursor; - if (aux->prox == NULL) { - return NULL; - } - - list->cursor = aux->prox; - return aux->method; -} diff --git a/tools/ScriptQuestReleaseTracker/quest_list.h b/tools/ScriptQuestReleaseTracker/quest_list.h deleted file mode 100644 index 4d6b91ef3b..0000000000 --- a/tools/ScriptQuestReleaseTracker/quest_list.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ - -#ifndef QUEST_LIST_H_ -#define QUEST_LIST_H_ - -typedef struct { - char *name; -} ScriptedQuest; - -typedef struct ScriptedQuestListItem { - ScriptedQuest *method; - struct ScriptedQuestListItem *prox; -} ScriptedQuestListItem; - -typedef struct { - ScriptedQuestListItem *first; - ScriptedQuestListItem *last; - ScriptedQuestListItem *cursor; - - int size; -} ScriptedQuestList; - -#include "quest_list.c" - -#endif /* QUEST_LIST_H_ */ diff --git a/tools/ScriptQuestReleaseTracker/script_tracker.c b/tools/ScriptQuestReleaseTracker/script_tracker.c deleted file mode 100644 index 4a1bb71fe0..0000000000 --- a/tools/ScriptQuestReleaseTracker/script_tracker.c +++ /dev/null @@ -1,159 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ - -#include -#include -#include -#include -#include - -#include "strmap.c" -#include "quest_list.h" -#include "quest_diff.h" - -ScriptedQuestList getBestSubstringsFromStringList(char *aStrRegex, ScriptedQuestList *lines, int lines_size) { - ScriptedQuestList ret = createScriptedQuestList(); - - // ------------ an adaptation from Mitch Richling's https://www.mitchr.me/SS/exampleCode/AUPG/pcre_example.c.html ----------- - - int subStrVec[30]; - int subStrVecLength = 30; - const char *pcreErrorStr; - int pcreErrorOffset; - - pcre *reCompiled = pcre_compile(aStrRegex, 0, &pcreErrorStr, &pcreErrorOffset, NULL); - if(reCompiled == NULL) { - printf("ERROR: Could not compile '%s': %s\n", aStrRegex, pcreErrorStr); - return ret; - } - - pcre_extra *pcreExtra = pcre_study(reCompiled, 0, &pcreErrorStr); - if(pcreErrorStr != NULL) { - printf("ERROR: Could not study '%s': %s\n", aStrRegex, pcreErrorStr); - return ret; - } - - int i; - for (i = 0; i < lines_size; i++) { - ScriptedQuestList list = lines[i]; - - resetScriptedQuestCursor(&list); - while(true) { - ScriptedQuest *method = readScriptedQuest(&list); - if (method == NULL) { - break; - } - - char *str = method->name; - int st = 0, en = strlen(str); - while(st < en) { - int pcreExecRet = pcre_exec(reCompiled, pcreExtra, str, en, st, 0, subStrVec, subStrVecLength); - if(pcreExecRet < 0) { - switch(pcreExecRet) { - //case PCRE_ERROR_NOMATCH : printf("String did not match the pattern\n"); break; - case PCRE_ERROR_NULL : printf("Something was null\n"); break; - case PCRE_ERROR_BADOPTION : printf("A bad option was passed\n"); break; - case PCRE_ERROR_BADMAGIC : printf("Magic number bad (compiled re corrupt?)\n"); break; - case PCRE_ERROR_UNKNOWN_NODE : printf("Something kooky in the compiled re\n"); break; - case PCRE_ERROR_NOMEMORY : printf("Ran out of memory\n"); break; - //default : printf("Unknown error\n"); break; - } - - break; - } else { - if(pcreExecRet == 0) { - printf("But too many substrings were found to fit in subStrVec!\n"); - // Set rc to the max number of substring matches possible. - pcreExecRet = 30 / 3; - } - - const char *psubStrMatchStr; - pcre_get_substring(str, subStrVec, pcreExecRet, 1, &(psubStrMatchStr)); - - insertScriptedQuest(&ret, createScriptedQuest(psubStrMatchStr)); - pcre_free_substring(psubStrMatchStr); - - st = subStrVec[1]; - } - } - } - } - - pcre_free(reCompiled); - - if(pcreExtra != NULL) { - pcre_free(pcreExtra); - } - - return ret; -} - -char *getContentFromFile(FILE *f) { - fseek(f, 0, SEEK_END); // implemented by user529758 @ StackOverflow - long fsize = ftell(f); - fseek(f, 0, SEEK_SET); /* same as rewind(f); */ - - char *string = malloc(fsize + 1); - fread(string, 1, fsize, f); - - string[fsize] = 0; - return string; -} - -ScriptedQuestList readQuestXml(char *file_path) { - ScriptedQuestList *file_content = (ScriptedQuestList *)malloc(sizeof(ScriptedQuestList)); - file_content[0] = createScriptedQuestList(); - - FILE *f = fopen(file_path, "r+t"); - char *content = getContentFromFile(f); - - char *tok = strtok(content, "\n"); - int i = 0; - while (tok != NULL) { - insertScriptedQuest(&(file_content[0]), createScriptedQuest(tok)); - tok = strtok(NULL, "\n"); - i++; - } - - free(content); - fclose(f); - - ScriptedQuestList ret = getBestSubstringsFromStringList("script\" value=\"(.+)\"", file_content, 1); - - freeScriptedQuestList(&file_content[0]); - free(file_content); - - return ret; -} - -void trackScriptQuestReleases() { - ScriptedQuestList quests_then = readQuestXml("Check2.img.xml"); - ScriptedQuestList quests_curr = readQuestXml("Check.img.xml"); - - performQuestDiff(&quests_then, &quests_curr); - - freeScriptedQuestList(&quests_curr); - freeScriptedQuestList(&quests_then); -} - -int main() { - trackScriptQuestReleases(); - return 0; -} diff --git a/tools/ScriptQuestReleaseTracker/strmap.c b/tools/ScriptQuestReleaseTracker/strmap.c deleted file mode 100644 index 6111209abe..0000000000 --- a/tools/ScriptQuestReleaseTracker/strmap.c +++ /dev/null @@ -1,515 +0,0 @@ -/* - * strmap version 2.0.1 - * - * ANSI C hash table for strings. - * - * Version history: - * 1.0.0 - initial release - * 2.0.0 - changed function prefix from strmap to sm to ensure - * ANSI C compatibility - * 2.0.1 - improved documentation - * - * strmap.c - * - * Copyright (c) 2009, 2011, 2013 Per Ola Kristensson. - * - * Per Ola Kristensson - * Inference Group, Department of Physics - * University of Cambridge - * Cavendish Laboratory - * JJ Thomson Avenue - * CB3 0HE Cambridge - * United Kingdom - * - * strmap is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * strmap 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with strmap. If not, see . - */ -#include "strmap.h" - -typedef struct Pair Pair; - -typedef struct Bucket Bucket; - -struct Pair { - char *key; - char *value; -}; - -struct Bucket { - unsigned int count; - Pair *pairs; -}; - -struct StrMap { - unsigned int count; - Bucket *buckets; -}; - -static Pair * get_pair(Bucket *bucket, const char *key); -static unsigned long hash(const char *str); - -StrMap * sm_new(unsigned int capacity) -{ - StrMap *map; - - map = malloc(sizeof(StrMap)); - if (map == NULL) { - return NULL; - } - map->count = capacity; - map->buckets = malloc(map->count * sizeof(Bucket)); - if (map->buckets == NULL) { - free(map); - return NULL; - } - memset(map->buckets, 0, map->count * sizeof(Bucket)); - return map; -} - -void sm_delete(StrMap *map) -{ - unsigned int i, j, n, m; - Bucket *bucket; - Pair *pair; - - if (map == NULL) { - return; - } - n = map->count; - bucket = map->buckets; - i = 0; - while (i < n) { - m = bucket->count; - pair = bucket->pairs; - j = 0; - while(j < m) { - free(pair->key); - free(pair->value); - pair++; - j++; - } - free(bucket->pairs); - bucket++; - i++; - } - free(map->buckets); - free(map); -} - -int sm_get(const StrMap *map, const char *key, char *out_buf, unsigned int n_out_buf) -{ - unsigned int index; - Bucket *bucket; - Pair *pair; - - if (map == NULL) { - return 0; - } - if (key == NULL) { - return 0; - } - index = hash(key) % map->count; - bucket = &(map->buckets[index]); - pair = get_pair(bucket, key); - if (pair == NULL) { - return 0; - } - if (out_buf == NULL && n_out_buf == 0) { - return strlen(pair->value) + 1; - } - if (out_buf == NULL) { - return 0; - } - if (strlen(pair->value) >= n_out_buf) { - return 0; - } - strcpy(out_buf, pair->value); - return 1; -} - -int sm_exists(const StrMap *map, const char *key) -{ - unsigned int index; - Bucket *bucket; - Pair *pair; - - if (map == NULL) { - return 0; - } - if (key == NULL) { - return 0; - } - index = hash(key) % map->count; - bucket = &(map->buckets[index]); - pair = get_pair(bucket, key); - if (pair == NULL) { - return 0; - } - return 1; -} - -int sm_put(StrMap *map, const char *key, const char *value) -{ - unsigned int key_len, value_len, index; - Bucket *bucket; - Pair *tmp_pairs, *pair; - char *tmp_value; - char *new_key, *new_value; - - if (map == NULL) { - return 0; - } - if (key == NULL || value == NULL) { - return 0; - } - key_len = strlen(key); - value_len = strlen(value); - /* Get a pointer to the bucket the key string hashes to */ - index = hash(key) % map->count; - bucket = &(map->buckets[index]); - /* Check if we can handle insertion by simply replacing - * an existing value in a key-value pair in the bucket. - */ - if ((pair = get_pair(bucket, key)) != NULL) { - /* The bucket contains a pair that matches the provided key, - * change the value for that pair to the new value. - */ - if (strlen(pair->value) < value_len) { - /* If the new value is larger than the old value, re-allocate - * space for the new larger value. - */ - tmp_value = realloc(pair->value, (value_len + 1) * sizeof(char)); - if (tmp_value == NULL) { - return 0; - } - pair->value = tmp_value; - } - /* Copy the new value into the pair that matches the key */ - strcpy(pair->value, value); - return 1; - } - /* Allocate space for a new key and value */ - new_key = malloc((key_len + 1) * sizeof(char)); - if (new_key == NULL) { - return 0; - } - new_value = malloc((value_len + 1) * sizeof(char)); - if (new_value == NULL) { - free(new_key); - return 0; - } - /* Create a key-value pair */ - if (bucket->count == 0) { - /* The bucket is empty, lazily allocate space for a single - * key-value pair. - */ - bucket->pairs = malloc(sizeof(Pair)); - if (bucket->pairs == NULL) { - free(new_key); - free(new_value); - return 0; - } - bucket->count = 1; - } - else { - /* The bucket wasn't empty but no pair existed that matches the provided - * key, so create a new key-value pair. - */ - tmp_pairs = realloc(bucket->pairs, (bucket->count + 1) * sizeof(Pair)); - if (tmp_pairs == NULL) { - free(new_key); - free(new_value); - return 0; - } - bucket->pairs = tmp_pairs; - bucket->count++; - } - /* Get the last pair in the chain for the bucket */ - pair = &(bucket->pairs[bucket->count - 1]); - pair->key = new_key; - pair->value = new_value; - /* Copy the key and its value into the key-value pair */ - strcpy(pair->key, key); - strcpy(pair->value, value); - return 1; -} - -int sm_get_count(const StrMap *map) -{ - unsigned int i, j, n, m; - unsigned int count; - Bucket *bucket; - Pair *pair; - - if (map == NULL) { - return 0; - } - bucket = map->buckets; - n = map->count; - i = 0; - count = 0; - while (i < n) { - pair = bucket->pairs; - m = bucket->count; - j = 0; - while (j < m) { - count++; - pair++; - j++; - } - bucket++; - i++; - } - return count; -} - -int sm_enum(const StrMap *map, sm_enum_func enum_func, const void *obj) -{ - unsigned int i, j, n, m; - Bucket *bucket; - Pair *pair; - - if (map == NULL) { - return 0; - } - if (enum_func == NULL) { - return 0; - } - bucket = map->buckets; - n = map->count; - i = 0; - while (i < n) { - pair = bucket->pairs; - m = bucket->count; - j = 0; - while (j < m) { - enum_func(pair->key, pair->value, obj); - pair++; - j++; - } - bucket++; - i++; - } - return 1; -} - -/* - * Returns a pair from the bucket that matches the provided key, - * or null if no such pair exist. - */ -static Pair * get_pair(Bucket *bucket, const char *key) -{ - unsigned int i, n; - Pair *pair; - - n = bucket->count; - if (n == 0) { - return NULL; - } - pair = bucket->pairs; - i = 0; - while (i < n) { - if (pair->key != NULL && pair->value != NULL) { - if (strcmp(pair->key, key) == 0) { - return pair; - } - } - pair++; - i++; - } - return NULL; -} - -/* - * Returns a hash code for the provided string. - */ -static unsigned long hash(const char *str) -{ - unsigned long hash = 5381; - int c; - - while (c = *str++) { - hash = ((hash << 5) + hash) + c; - } - return hash; -} - -/* - - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. - -*/ \ No newline at end of file diff --git a/tools/ScriptQuestReleaseTracker/strmap.h b/tools/ScriptQuestReleaseTracker/strmap.h deleted file mode 100644 index 66118af39e..0000000000 --- a/tools/ScriptQuestReleaseTracker/strmap.h +++ /dev/null @@ -1,356 +0,0 @@ -/* - * strmap version 2.0.1 - * - * ANSI C hash table for strings. - * - * Version history: - * 1.0.0 - initial release - * 2.0.0 - changed function prefix from strmap to sm to ensure - * ANSI C compatibility - * 2.0.1 - improved documentation - * - * strmap.h - * - * Copyright (c) 2009, 2011, 2013 Per Ola Kristensson. - * - * Per Ola Kristensson - * Inference Group, Department of Physics - * University of Cambridge - * Cavendish Laboratory - * JJ Thomson Avenue - * CB3 0HE Cambridge - * United Kingdom - * - * strmap is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * strmap 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 Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with strmap. If not, see . - */ -#ifndef _STRMAP_H_ -#define _STRMAP_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif - -#include -#include - -typedef struct StrMap StrMap; - -/* - * This callback function is called once per key-value when iterating over - * all keys associated to values. - * - * Parameters: - * - * key: A pointer to a null-terminated C string. The string must not - * be modified. - * - * value: A pointer to a null-terminated C string. The string must - * not be modified. - * - * obj: A pointer to a client-specific object. This parameter may be - * null. - * - * Return value: None. - */ -typedef void(*sm_enum_func)(const char *key, const char *value, const void *obj); - -/* - * Creates a string map. - * - * Parameters: - * - * capacity: The number of top-level slots this string map - * should allocate. This parameter must be > 0. - * - * Return value: A pointer to a string map object, - * or null if a new string map could not be allocated. - */ -StrMap * sm_new(unsigned int capacity); - -/* - * Releases all memory held by a string map object. - * - * Parameters: - * - * map: A pointer to a string map. This parameter cannot be null. - * If the supplied string map has been previously released, the - * behaviour of this function is undefined. - * - * Return value: None. - */ -void sm_delete(StrMap *map); - -/* - * Returns the value associated with the supplied key. - * - * Parameters: - * - * map: A pointer to a string map. This parameter cannot be null. - * - * key: A pointer to a null-terminated C string. This parameter cannot - * be null. - * - * out_buf: A pointer to an output buffer which will contain the value, - * if it exists and fits into the buffer. - * - * n_out_buf: The size of the output buffer in bytes. - * - * Return value: If out_buf is set to null and n_out_buf is set to 0 the return - * value will be the number of bytes required to store the value (if it exists) - * and its null-terminator. For all other parameter configurations the return value - * is 1 if an associated value was found and completely copied into the output buffer, - * 0 otherwise. - */ -int sm_get(const StrMap *map, const char *key, char *out_buf, unsigned int n_out_buf); - -/* - * Queries the existence of a key. - * - * Parameters: - * - * map: A pointer to a string map. This parameter cannot be null. - * - * key: A pointer to a null-terminated C string. This parameter cannot - * be null. - * - * Return value: 1 if the key exists, 0 otherwise. - */ -int sm_exists(const StrMap *map, const char *key); - -/* - * Associates a value with the supplied key. If the key is already - * associated with a value, the previous value is replaced. - * - * Parameters: - * - * map: A pointer to a string map. This parameter cannot be null. - * - * key: A pointer to a null-terminated C string. This parameter - * cannot be null. The string must have a string length > 0. The - * string will be copied. - * - * value: A pointer to a null-terminated C string. This parameter - * cannot be null. The string must have a string length > 0. The - * string will be copied. - * - * Return value: 1 if the association succeeded, 0 otherwise. - */ -int sm_put(StrMap *map, const char *key, const char *value); - -/* - * Returns the number of associations between keys and values. - * - * Parameters: - * - * map: A pointer to a string map. This parameter cannot be null. - * - * Return value: The number of associations between keys and values. - */ -int sm_get_count(const StrMap *map); - -/* - * An enumerator over all associations between keys and values. - * - * Parameters: - * - * map: A pointer to a string map. This parameter cannot be null. - * - * enum_func: A pointer to a callback function that will be - * called from this procedure once for every key associated - * with a value. This parameter cannot be null. - * - * obj: A pointer to a client-specific object. This parameter will be - * passed back to the client's callback function. This parameter can - * be null. - * - * Return value: 1 if enumeration completed, 0 otherwise. - */ -int sm_enum(const StrMap *map, sm_enum_func enum_func, const void *obj); - -#ifdef __cplusplus -} -#endif - -#endif - -/* - - GNU LESSER GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - - This version of the GNU Lesser General Public License incorporates -the terms and conditions of version 3 of the GNU General Public -License, supplemented by the additional permissions listed below. - - 0. Additional Definitions. - - As used herein, "this License" refers to version 3 of the GNU Lesser -General Public License, and the "GNU GPL" refers to version 3 of the GNU -General Public License. - - "The Library" refers to a covered work governed by this License, -other than an Application or a Combined Work as defined below. - - An "Application" is any work that makes use of an interface provided -by the Library, but which is not otherwise based on the Library. -Defining a subclass of a class defined by the Library is deemed a mode -of using an interface provided by the Library. - - A "Combined Work" is a work produced by combining or linking an -Application with the Library. The particular version of the Library -with which the Combined Work was made is also called the "Linked -Version". - - The "Minimal Corresponding Source" for a Combined Work means the -Corresponding Source for the Combined Work, excluding any source code -for portions of the Combined Work that, considered in isolation, are -based on the Application, and not on the Linked Version. - - The "Corresponding Application Code" for a Combined Work means the -object code and/or source code for the Application, including any data -and utility programs needed for reproducing the Combined Work from the -Application, but excluding the System Libraries of the Combined Work. - - 1. Exception to Section 3 of the GNU GPL. - - You may convey a covered work under sections 3 and 4 of this License -without being bound by section 3 of the GNU GPL. - - 2. Conveying Modified Versions. - - If you modify a copy of the Library, and, in your modifications, a -facility refers to a function or data to be supplied by an Application -that uses the facility (other than as an argument passed when the -facility is invoked), then you may convey a copy of the modified -version: - - a) under this License, provided that you make a good faith effort to - ensure that, in the event an Application does not supply the - function or data, the facility still operates, and performs - whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of - this License applicable to that copy. - - 3. Object Code Incorporating Material from Library Header Files. - - The object code form of an Application may incorporate material from -a header file that is part of the Library. You may convey such object -code under terms of your choice, provided that, if the incorporated -material is not limited to numerical parameters, data structure -layouts and accessors, or small macros, inline functions and templates -(ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the - Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license - document. - - 4. Combined Works. - - You may convey a Combined Work under terms of your choice that, -taken together, effectively do not restrict modification of the -portions of the Library contained in the Combined Work and reverse -engineering for debugging such modifications, if you also do each of -the following: - - a) Give prominent notice with each copy of the Combined Work that - the Library is used in it and that the Library and its use are - covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license - document. - - c) For a Combined Work that displays copyright notices during - execution, include the copyright notice for the Library among - these notices, as well as a reference directing the user to the - copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this - License, and the Corresponding Application Code in a form - suitable for, and under terms that permit, the user to - recombine or relink the Application with a modified version of - the Linked Version to produce a modified Combined Work, in the - manner specified by section 6 of the GNU GPL for conveying - Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (a) uses at run time - a copy of the Library already present on the user's computer - system, and (b) will operate properly with a modified version - of the Library that is interface-compatible with the Linked - Version. - - e) Provide Installation Information, but only if you would otherwise - be required to provide such information under section 6 of the - GNU GPL, and only to the extent that such information is - necessary to install and execute a modified version of the - Combined Work produced by recombining or relinking the - Application with a modified version of the Linked Version. (If - you use option 4d0, the Installation Information must accompany - the Minimal Corresponding Source and Corresponding Application - Code. If you use option 4d1, you must provide the Installation - Information in the manner specified by section 6 of the GNU GPL - for conveying Corresponding Source.) - - 5. Combined Libraries. - - You may place library facilities that are a work based on the -Library side by side in a single library together with other library -facilities that are not Applications and are not covered by this -License, and convey such a combined library under terms of your -choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based - on the Library, uncombined with any other library facilities, - conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it - is a work based on the Library, and explaining where to find the - accompanying uncombined form of the same work. - - 6. Revised Versions of the GNU Lesser General Public License. - - The Free Software Foundation may publish revised and/or new versions -of the GNU Lesser General Public License from time to time. Such new -versions will be similar in spirit to the present version, but may -differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the -Library as you received it specifies that a certain numbered version -of the GNU Lesser General Public License "or any later version" -applies to it, you have the option of following the terms and -conditions either of that published version or of any later version -published by the Free Software Foundation. If the Library as you -received it does not specify a version number of the GNU Lesser -General Public License, you may choose any version of the GNU Lesser -General Public License ever published by the Free Software Foundation. - - If the Library as you received it specifies that a proxy can decide -whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is -permanent authorization for you to choose that version for the -Library. - -*/ \ No newline at end of file diff --git a/tools/ScriptStaticMethodTracker/method_list.c b/tools/ScriptStaticMethodTracker/method_list.c deleted file mode 100644 index 4fd6a87372..0000000000 --- a/tools/ScriptStaticMethodTracker/method_list.c +++ /dev/null @@ -1,85 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ - -JavaMethod* createJavaMethod(const char *name) { - JavaMethod* method = (JavaMethod *)malloc(sizeof(JavaMethod)); - method->name = (char *)malloc((strlen(name) + 1) * sizeof(char)); - strcpy(method->name, name); - return method; -} - -void freeJavaMethod(JavaMethod *method) { - free(method->name); - free(method); -} - -JavaMethodList createJavaMethodList() { - JavaMethodList list; - list.size = 0; - - JavaMethodListItem *item = (JavaMethodListItem *)malloc(sizeof(JavaMethodListItem)); - item->prox = NULL; - - list.last = item; - list.first = list.last; - - return list; -} - -void insertJavaMethod(JavaMethodList *list, JavaMethod *method) { - JavaMethodListItem *item = (JavaMethodListItem *)malloc(sizeof(JavaMethodListItem)); - item->prox = NULL; - - list->last->method = method; - list->last->prox = item; - - list->last = item; - list->size++; -} - -void freeJavaMethodList(JavaMethodList *list) { - JavaMethodListItem *aux = list->first; - - list->first = list->last; - list->size = 0; - - while (aux->prox != NULL) { - JavaMethodListItem *aux2 = aux; - aux = aux->prox; - - freeJavaMethod(aux2->method); - free(aux2); - } - free(aux); -} - -void resetJavaMethodCursor(JavaMethodList *list) { - list->cursor = list->first; -} - -JavaMethod* readJavaMethod(JavaMethodList *list) { - JavaMethodListItem *aux = list->cursor; - if (aux->prox == NULL) { - return NULL; - } - - list->cursor = aux->prox; - return aux->method; -} diff --git a/tools/ScriptStaticMethodTracker/method_list.h b/tools/ScriptStaticMethodTracker/method_list.h deleted file mode 100644 index ae4fabed1d..0000000000 --- a/tools/ScriptStaticMethodTracker/method_list.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ - -#ifndef METHOD_LIST_H_ -#define METHOD_LIST_H_ - -typedef struct { - char *name; -} JavaMethod; - -typedef struct JavaMethodListItem { - JavaMethod *method; - struct JavaMethodListItem *prox; -} JavaMethodListItem; - -typedef struct { - JavaMethodListItem *first; - JavaMethodListItem *last; - JavaMethodListItem *cursor; - - int size; -} JavaMethodList; - -#include "method_list.c" - -#endif /* METHOD_LIST_H_ */ diff --git a/tools/ScriptStaticMethodTracker/method_tracker.c b/tools/ScriptStaticMethodTracker/method_tracker.c deleted file mode 100644 index 5a23d0f23e..0000000000 --- a/tools/ScriptStaticMethodTracker/method_tracker.c +++ /dev/null @@ -1,349 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ - -#include -#include -#include -#include -#include - -#include "method_list.h" -#include "script_path.h" - -JavaMethodList getBestSubstringsFromStringList(char *aStrRegex, JavaMethodList *lines, int lines_size) { - JavaMethodList ret = createJavaMethodList(); - - // ------------ an adaptation from Mitch Richling's https://www.mitchr.me/SS/exampleCode/AUPG/pcre_example.c.html ----------- - - int subStrVec[30]; - int subStrVecLength = 30; - const char *pcreErrorStr; - int pcreErrorOffset; - - pcre *reCompiled = pcre_compile(aStrRegex, 0, &pcreErrorStr, &pcreErrorOffset, NULL); - if(reCompiled == NULL) { - printf("ERROR: Could not compile '%s': %s\n", aStrRegex, pcreErrorStr); - return ret; - } - - pcre_extra *pcreExtra = pcre_study(reCompiled, 0, &pcreErrorStr); - if(pcreErrorStr != NULL) { - printf("ERROR: Could not study '%s': %s\n", aStrRegex, pcreErrorStr); - return ret; - } - - int i; - for (i = 0; i < lines_size; i++) { - JavaMethodList list = lines[i]; - - resetJavaMethodCursor(&list); - while(true) { - JavaMethod *method = readJavaMethod(&list); - if (method == NULL) { - break; - } - - char *str = method->name; - int st = 0, en = strlen(str); - while (st < en) { - int pcreExecRet = pcre_exec(reCompiled, pcreExtra, str, en, st, 0, subStrVec, subStrVecLength); - if(pcreExecRet < 0) { - switch(pcreExecRet) { - //case PCRE_ERROR_NOMATCH : printf("String did not match the pattern\n"); break; - case PCRE_ERROR_NULL : printf("Something was null\n"); break; - case PCRE_ERROR_BADOPTION : printf("A bad option was passed\n"); break; - case PCRE_ERROR_BADMAGIC : printf("Magic number bad (compiled re corrupt?)\n"); break; - case PCRE_ERROR_UNKNOWN_NODE : printf("Something kooky in the compiled re\n"); break; - case PCRE_ERROR_NOMEMORY : printf("Ran out of memory\n"); break; - //default : printf("Unknown error\n"); break; - } - - break; // no more matches found - } else { - if(pcreExecRet == 0) { - printf("But too many substrings were found to fit in subStrVec!\n"); - // Set rc to the max number of substring matches possible. - pcreExecRet = 30 / 3; - } - - const char *psubStrMatchStr; - pcre_get_substring(str, subStrVec, pcreExecRet, 0, &(psubStrMatchStr)); - - insertJavaMethod(&ret, createJavaMethod(psubStrMatchStr)); - pcre_free_substring(psubStrMatchStr); - - st = subStrVec[1]; - } - } - } - } - - pcre_free(reCompiled); - - if(pcreExtra != NULL) { - pcre_free(pcreExtra); - } - - return ret; -} - -char* extractStaticMethodName(const char *method_line) { - char *aStrRegex = "([A-Za-z0-9])+(\\s)*\\("; - - int lines_size = 1; - JavaMethodList *lines = (JavaMethodList *)malloc(lines_size * sizeof(JavaMethodList)); - - int i; - for (i = 0; i < lines_size; i++) { - lines[i] = createJavaMethodList(); - insertJavaMethod(&(lines[i]), createJavaMethod(method_line)); - } - - JavaMethodList subs = getBestSubstringsFromStringList(aStrRegex, lines, lines_size); - - char *ret; - if (subs.size > 0) { - resetJavaMethodCursor(&subs); - JavaMethod *method = readJavaMethod(&subs); - - char *method_scoop = method->name; - int i; - for (i = 0; i < strlen(method_scoop) - 1; i++) { - char ch = method_scoop[i]; - if (ch == '(' || ch == ' ' || ch == '\t') { - break; - } - } - method->name[i] = 0; - - ret = (char *)malloc((strlen(method->name) + 1) * sizeof(char)); - strcpy(ret, method->name); - } else { - ret = NULL; - } - - freeJavaMethodList(&subs); - - for (i = 0; i < lines_size; i++) { - freeJavaMethodList(&(lines[i])); - } - - free(lines); - - return ret; -} - -JavaMethodList getStaticJavaMethodNames(char *aStrRegex, JavaMethodList *lines, int lines_size) { - JavaMethodList subs = getBestSubstringsFromStringList(aStrRegex, lines, lines_size); - JavaMethodList ret = createJavaMethodList(); - - resetJavaMethodCursor(&subs); - while (true) { - JavaMethod *method = readJavaMethod(&subs); - if (method == NULL) { - break; - } - - char *method_name = extractStaticMethodName(method->name); - if (method_name != NULL) { - insertJavaMethod(&ret, createJavaMethod(method_name)); - free(method_name); - } - } - - freeJavaMethodList(&subs); - - return ret; -} - -bool isIgnoreMethod(char *method_name) { - const char * ignoreMethods[] = {"getInstance", "toString", NULL}; - - int i = 0; - while(true) { - const char *ign = ignoreMethods[i]; - if (ign == NULL) { - break; - } - - if (!strcmp(method_name, ign)) { - return true; - } - - i++; - } - - return false; -} - -JavaMethodList trackerFindSourceStaticMethods(JavaMethodList *lines, int lines_size) { - char *aStrRegex = "(public static\\s).*([A-Za-z0-9])+(\\s)*\\(.*\\{"; - JavaMethodList ret = createJavaMethodList(); - - JavaMethodList list = getStaticJavaMethodNames(aStrRegex, lines, lines_size); - resetJavaMethodCursor(&list); - while(true) { - JavaMethod *method = readJavaMethod(&list); - if (method == NULL) { - break; - } - - if (isIgnoreMethod(method->name)) { - continue; - } - - insertJavaMethod(&ret, createJavaMethod(method->name)); - } - - freeJavaMethodList(&list); - - return ret; -} - -char *getContentFromFile(FILE *f) { - fseek(f, 0, SEEK_END); // implemented by user529758 @ StackOverflow - long fsize = ftell(f); - fseek(f, 0, SEEK_SET); /* same as rewind(f); */ - - char *string = malloc(fsize + 1); - fread(string, 1, fsize, f); - - string[fsize] = 0; - return string; -} - -bool locateMethodCall(const char *method_name, char *file_path) { - FILE *f = fopen(file_path, "r+t"); - - char aStrRegex[1000]; - strcpy(aStrRegex, method_name); - strcat(aStrRegex, "(\\s)*\\("); - - JavaMethodList *file_content = (JavaMethodList *)malloc(sizeof(JavaMethodList)); - file_content[0] = createJavaMethodList(); - - char *content = getContentFromFile(f); - - JavaMethod *method = createJavaMethod(content); - insertJavaMethod(&(file_content[0]), method); - free(content); - - JavaMethodList list = getBestSubstringsFromStringList(aStrRegex, file_content, 1); - bool found = (list.size > 0); - - freeJavaMethodList(&(file_content[0])); - free(file_content); - fclose(f); - - return found; -} - -void locateMethodCalls(const char *method_name, char **file_paths, int file_paths_size) { - int i; - for (i = 0; i < file_paths_size; i++) { - char *path = file_paths[i]; - if (locateMethodCall(method_name, path)) { - printf(" %s : \'%s\'\n", path, method_name); - } - } -} - -int trackerLocateScriptsStaticCalls(JavaMethodList method_names) { - ScriptFiles *files = createScriptFiles("../../scripts"); - if (files == NULL) { - printf("ERROR: Could not initialize script files.\n"); - return -1; - } - - resetJavaMethodCursor(&method_names); - while (true) { - JavaMethod *method = readJavaMethod(&method_names); - if (method == NULL) { - break; - } - - locateMethodCalls(method->name, files->file_paths, files->file_paths_size); - } - - freeScriptFiles(files); - return 0; -} - -typedef struct { - JavaMethodList *file_content; - int size; -} SourceFilesContent; - -SourceFilesContent* readSourceFileContents() { - ScriptFiles *srcFilePaths = createScriptFiles("../../src"); - - SourceFilesContent *files = (SourceFilesContent *)malloc(sizeof(SourceFilesContent)); - files->file_content = (JavaMethodList *)malloc(srcFilePaths->file_paths_size * sizeof(JavaMethodList)); - files->size = srcFilePaths->file_paths_size; - - //int max_len = 0; - int i; - for (i = 0; i < srcFilePaths->file_paths_size; i++) { - files->file_content[i] = createJavaMethodList(); - - FILE *f = fopen(srcFilePaths->file_paths[i], "r+t"); - char *content = getContentFromFile(f); - - //int this_len = strlen(content); - //if (max_len < this_len) max_len = this_len; - - fclose(f); - - insertJavaMethod(&(files->file_content[i]), createJavaMethod(content)); - } - - freeScriptFiles(srcFilePaths); - - return files; -} - -void freeSourceFileContents(SourceFilesContent *files) { - int i; - for (i = 0; i < files->size; i++) { - freeJavaMethodList(&(files->file_content[i])); - } - - free(files->file_content); - free(files); -} - -int main() { - printf("Loading source files...\n"); - SourceFilesContent *src_contents = readSourceFileContents(); - - int lines_size = src_contents->size; - JavaMethodList *lines = src_contents->file_content; - - printf("Tracking static methods on source...\n"); - JavaMethodList method_names = trackerFindSourceStaticMethods(lines, lines_size); - printf("Finding static methods calls on scripts...\n"); - trackerLocateScriptsStaticCalls(method_names); - printf("Track complete!\n"); - - freeSourceFileContents(src_contents); - freeJavaMethodList(&method_names); - - return 0; -} diff --git a/tools/ScriptStaticMethodTracker/pcre3.dll b/tools/ScriptStaticMethodTracker/pcre3.dll deleted file mode 100644 index b5fd2a63785922c9898e7d25d9c50ef47524ba13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140288 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 diff --git a/tools/ScriptStaticMethodTracker/script_path.c b/tools/ScriptStaticMethodTracker/script_path.c deleted file mode 100644 index aab9ddd1b8..0000000000 --- a/tools/ScriptStaticMethodTracker/script_path.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ - -#include -#include -#include -#include -#include - -void fetchScriptFilesFromDirectory(ScriptFiles *files, char *root_dir) { - struct dirent *de; - struct stat info; - DIR *dir = opendir(root_dir); - if (dir != NULL) { - de = readdir(dir); // skip . - de = readdir(dir); // skip .. - - while ((de = readdir(dir)) != NULL) { - char file_path[SCRIPT_FILES_MAX_PATH_SIZE]; - strcpy(file_path, root_dir); - strcat(file_path, "/"); - strcat(file_path, de->d_name); - - stat(file_path, &info); - if (S_ISREG(info.st_mode)) { - files->file_paths[files->file_paths_size] = (char *)malloc(SCRIPT_FILES_MAX_PATH_SIZE * sizeof(char)); - strcpy(files->file_paths[files->file_paths_size], file_path); - files->file_paths_size++; - } else { - fetchScriptFilesFromDirectory(files, file_path); - } - } - } -} - -ScriptFiles* createScriptFiles(char *root_dir) { - ScriptFiles *files = (ScriptFiles *)malloc(sizeof(ScriptFiles)); - - files->file_paths = (char **)malloc(SCRIPT_FILES_MAX_COUNT * sizeof(char *)); - files->file_paths_size = 0; - - fetchScriptFilesFromDirectory(files, root_dir); - - return files; -} - -void freeScriptFiles(ScriptFiles *files) { - int i; - for (i = 0; i < files->file_paths_size; i++) { - free(files->file_paths[i]); - } - - free(files->file_paths); - free(files); -} diff --git a/tools/ScriptStaticMethodTracker/script_path.h b/tools/ScriptStaticMethodTracker/script_path.h deleted file mode 100644 index cd2452a517..0000000000 --- a/tools/ScriptStaticMethodTracker/script_path.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - This file is part of the HeavenMS MapleStory Server - Copyleft (L) 2016 - 2019 RonanLana - - 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 version 3 as published by - the Free Software Foundation. You may not use, modify or distribute - this program under any other version of the GNU Affero General Public - License. - - 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 . -*/ - -#ifndef SCRIPT_PATH_H_ -#define SCRIPT_PATH_H_ - -#define SCRIPT_FILES_MAX_COUNT 70000 -#define SCRIPT_FILES_MAX_PATH_SIZE 40000 - -typedef struct { - char **file_paths; - int file_paths_size; -} ScriptFiles; - -#include "script_path.c" - -#endif /* SCRIPT_PATH_H_ */ From 849d5c63cb6b616e3007c26a6d9f9553984084c2 Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 11 Jul 2021 14:50:29 +0200 Subject: [PATCH 36/36] Clean up remaining tools stuff --- .gitignore | 129 ----------------------------------------- tools/launch_debug.bat | 5 -- 2 files changed, 134 deletions(-) delete mode 100644 tools/launch_debug.bat diff --git a/.gitignore b/.gitignore index 937743c99f..96502955e0 100644 --- a/.gitignore +++ b/.gitignore @@ -4,138 +4,9 @@ /target # build files - /build/ /dist/ /nbproject/ -/tools/MapleBossHpBarFetcher/build/ -/tools/MapleBossHpBarFetcher/dist/ -/tools/MapleBossHpBarFetcher/nbproject/ - -/tools/MapleCashCosmeticsChecker/build/ -/tools/MapleCashCosmeticsChecker/dist/ -/tools/MapleCashCosmeticsChecker/nbproject/ - -/tools/MapleCashCosmeticsFetcher/build/ -/tools/MapleCashCosmeticsFetcher/dist/ -/tools/MapleCashCosmeticsFetcher/nbproject/ - -/tools/MapleCashDropFetcher/build/ -/tools/MapleCashDropFetcher/dist/ -/tools/MapleCashDropFetcher/nbproject/ - -/tools/MapleCashVegaChecker/build/ -/tools/MapleCashVegaChecker/dist/ -/tools/MapleCashVegaChecker/nbproject/ - -/tools/MapleCodeCouponGenerator/build/ -/tools/MapleCodeCouponGenerator/dist/ -/tools/MapleCodeCouponGenerator/nbproject/ - -/tools/MapleCouponInstaller/build/ -/tools/MapleCouponInstaller/dist/ -/tools/MapleCouponInstaller/nbproject/ - -/tools/MapleDojoUpdater/build/ -/tools/MapleDojoUpdater/dist/ -/tools/MapleDojoUpdater/nbproject/ - -/tools/MapleEmptyItemWzChecker/build/ -/tools/MapleEmptyItemWzChecker/dist/ -/tools/MapleEmptyItemWzChecker/nbproject/ - -/tools/MapleEquipmentOmnileveler/build/ -/tools/MapleEquipmentOmnileveler/dist/ -/tools/MapleEquipmentOmnileveler/nbproject/ - -/tools/MapleEventMethodFiller/build/ -/tools/MapleEventMethodFiller/dist/ -/tools/MapleEventMethodFiller/nbproject/ - -/tools/MapleGachaponItemidRetriever/build/ -/tools/MapleGachaponItemidRetriever/dist/ -/tools/MapleGachaponItemidRetriever/nbproject/ - -/tools/MapleIdRetriever/build/ -/tools/MapleIdRetriever/dist/ -/tools/MapleIdRetriever/nbproject/ - -/tools/MapleInvalidItemIdFetcher/build/ -/tools/MapleInvalidItemIdFetcher/dist/ -/tools/MapleInvalidItemIdFetcher/nbproject/ - -/tools/MapleInvalidItemWithNoNameFetcher/build/ -/tools/MapleInvalidItemWithNoNameFetcher/dist/ -/tools/MapleInvalidItemWithNoNameFetcher/nbproject/ - -/tools/MapleMapFieldLimitChecker/build/ -/tools/MapleMapFieldLimitChecker/dist/ -/tools/MapleMapFieldLimitChecker/nbproject/ - -/tools/MapleMapInfoRetriever/build/ -/tools/MapleMapInfoRetriever/dist/ -/tools/MapleMapInfoRetriever/nbproject/ - -/tools/MapleMapLootLimitChecker/build/ -/tools/MapleMapLootLimitChecker/dist/ -/tools/MapleMapLootLimitChecker/nbproject/ - -/tools/MapleMesoFetcher/build/ -/tools/MapleMesoFetcher/dist/ -/tools/MapleMesoFetcher/nbproject/ - -/tools/MapleMobBookIndexer/build/ -/tools/MapleMobBookIndexer/dist/ -/tools/MapleMobBookIndexer/nbproject/ - -/tools/MapleMobBookUpdate/build/ -/tools/MapleMobBookUpdate/dist/ -/tools/MapleMobBookUpdate/nbproject/ - -/tools/MapleQuestItemCountFetcher/build/ -/tools/MapleQuestItemCountFetcher/dist/ -/tools/MapleQuestItemCountFetcher/nbproject/ - -/tools/MapleQuestItemFetcher/build/ -/tools/MapleQuestItemFetcher/dist/ -/tools/MapleQuestItemFetcher/nbproject/ - -/tools/MapleQuestlineFetcher/build/ -/tools/MapleQuestlineFetcher/dist/ -/tools/MapleQuestlineFetcher/nbproject/ - -/tools/MapleQuestMesoFetcher/build/ -/tools/MapleQuestMesoFetcher/dist/ -/tools/MapleQuestMesoFetcher/nbproject/ - -/tools/MapleReactorDropFetcher/build/ -/tools/MapleReactorDropFetcher/dist/ -/tools/MapleReactorDropFetcher/nbproject/ - -/tools/MapleSkillbookChanceFetcher/build/ -/tools/MapleSkillbookChanceFetcher/dist/ -/tools/MapleSkillbookChanceFetcher/nbproject/ - -/tools/MapleSkillbookStackUpdate/build/ -/tools/MapleSkillbookStackUpdate/dist/ -/tools/MapleSkillbookStackUpdate/nbproject/ - -/tools/MapleSkillMakerFetcher/build/ -/tools/MapleSkillMakerFetcher/dist/ -/tools/MapleSkillMakerFetcher/nbproject/ - -/tools/MapleSkillMakerReagentIndexer/build/ -/tools/MapleSkillMakerReagentIndexer/dist/ -/tools/MapleSkillMakerReagentIndexer/nbproject/ - -/tools/MapleWorldmapChecker/build/ -/tools/MapleWorldmapChecker/dist/ -/tools/MapleWorldmapChecker/nbproject/ - -/tools/SpiderDropFetcher/build/ -/tools/SpiderDropFetcher/dist/ -/tools/SpiderDropFetcher/nbproject/ - /out *.onetoc2 diff --git a/tools/launch_debug.bat b/tools/launch_debug.bat deleted file mode 100644 index 394cf2e3dd..0000000000 --- a/tools/launch_debug.bat +++ /dev/null @@ -1,5 +0,0 @@ -@echo off -@title HeavenMS001 -set CLASSPATH=.;dist\* -java -Xmx2048m -Dwzpath=wz\ -Xrunjdwp:transport=dt_socket,address=9000,server=y,suspend=n net.server.Server -pause