diff --git a/.gitignore b/.gitignore index ca3fa8b8e6..c2de03689d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,15 +2,16 @@ .idea/ # Netbeans project files -/nbproject/ -/tools/MapleCouponInstaller/nbproject/ -/tools/MapleIdRetriever/nbproject/ -/tools/MobBookIndexer/nbproject/ -/tools/MobBookUpdate/nbproject/ +nbproject/ +tools/MapleCouponInstaller/nbproject/ +tools/MapleIdRetriever/nbproject/ +tools/MobBookIndexer/nbproject/ +tools/MobBookUpdate/nbproject/ # build files -/build/ -/tools/MapleCouponInstaller/build/ -/tools/MapleIdRetriever/build/ -/tools/MobBookIndexer/build/ -/tools/MobBookUpdate/build/ +build/ +tools/MapleCouponInstaller/build/ +tools/MapleIdRetriever/build/ +tools/MobBookIndexer/build/ +tools/MobBookUpdate/build/ +dist/ \ No newline at end of file diff --git a/README.md b/README.md index d1f32ddfde..1e32cde573 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,8 @@ Client files & general tools: https://drive.google.com/drive/folders/0BzDsHSr-0V --- ### Donation -If you liked what you have seen on the project, donate a little something as a helping hand for my contributions towards Maple development. Paypal: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3K8KVTWRLFBQ4 +If you liked what you have seen on the project, donate a little something as a helping hand for my contributions towards Maple development. +Paypal: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3K8KVTWRLFBQ4 --- ### Preparing the ambient diff --git a/build/built-jar.properties b/build/built-jar.properties index 61c2adeeb4..5e42a873ed 100644 --- a/build/built-jar.properties +++ b/build/built-jar.properties @@ -1,4 +1,4 @@ -#Tue, 26 Sep 2017 00:15:28 -0300 +#Fri, 29 Sep 2017 17:49:16 -0300 C\:\\Nexon\\MapleSolaxia\\MapleSolaxiaV2= diff --git a/build/classes/client/MapleCharacter$1.class b/build/classes/client/MapleCharacter$1.class index b5f0cbb40d..b26efa68c3 100644 Binary files a/build/classes/client/MapleCharacter$1.class and b/build/classes/client/MapleCharacter$1.class differ diff --git a/build/classes/client/MapleCharacter$10.class b/build/classes/client/MapleCharacter$10.class index 11c1d8ea58..db098ae8c2 100644 Binary files a/build/classes/client/MapleCharacter$10.class and b/build/classes/client/MapleCharacter$10.class differ diff --git a/build/classes/client/MapleCharacter$11.class b/build/classes/client/MapleCharacter$11.class index 712368a6e7..4f3667e5fe 100644 Binary files a/build/classes/client/MapleCharacter$11.class and b/build/classes/client/MapleCharacter$11.class differ diff --git a/build/classes/client/MapleCharacter$12.class b/build/classes/client/MapleCharacter$12.class index 6a62838746..f9ba251f0f 100644 Binary files a/build/classes/client/MapleCharacter$12.class and b/build/classes/client/MapleCharacter$12.class differ diff --git a/build/classes/client/MapleCharacter$13.class b/build/classes/client/MapleCharacter$13.class index d3f52fd50a..9d404e4ebe 100644 Binary files a/build/classes/client/MapleCharacter$13.class and b/build/classes/client/MapleCharacter$13.class differ diff --git a/build/classes/client/MapleCharacter$14.class b/build/classes/client/MapleCharacter$14.class index 255c64f4c7..be350f1f1e 100644 Binary files a/build/classes/client/MapleCharacter$14.class and b/build/classes/client/MapleCharacter$14.class differ diff --git a/build/classes/client/MapleCharacter$15.class b/build/classes/client/MapleCharacter$15.class index fa7d606867..257f322e92 100644 Binary files a/build/classes/client/MapleCharacter$15.class and b/build/classes/client/MapleCharacter$15.class differ diff --git a/build/classes/client/MapleCharacter$16.class b/build/classes/client/MapleCharacter$16.class index 1ab3d761bd..006fafebcd 100644 Binary files a/build/classes/client/MapleCharacter$16.class and b/build/classes/client/MapleCharacter$16.class differ diff --git a/build/classes/client/MapleCharacter$17.class b/build/classes/client/MapleCharacter$17.class index a4e3b6e033..aaef8453a4 100644 Binary files a/build/classes/client/MapleCharacter$17.class and b/build/classes/client/MapleCharacter$17.class differ diff --git a/build/classes/client/MapleCharacter$18.class b/build/classes/client/MapleCharacter$18.class index b6e98f3a01..f87b4848e5 100644 Binary files a/build/classes/client/MapleCharacter$18.class and b/build/classes/client/MapleCharacter$18.class differ diff --git a/build/classes/client/MapleCharacter$19.class b/build/classes/client/MapleCharacter$19.class index 167759f2c9..6f769f5371 100644 Binary files a/build/classes/client/MapleCharacter$19.class and b/build/classes/client/MapleCharacter$19.class differ diff --git a/build/classes/client/MapleCharacter$2.class b/build/classes/client/MapleCharacter$2.class index 7d0d438976..4429e2e258 100644 Binary files a/build/classes/client/MapleCharacter$2.class and b/build/classes/client/MapleCharacter$2.class differ diff --git a/build/classes/client/MapleCharacter$3.class b/build/classes/client/MapleCharacter$3.class index b9976a554b..c3c5666d8f 100644 Binary files a/build/classes/client/MapleCharacter$3.class and b/build/classes/client/MapleCharacter$3.class differ diff --git a/build/classes/client/MapleCharacter$4.class b/build/classes/client/MapleCharacter$4.class index d8d087337a..d3992c0b8c 100644 Binary files a/build/classes/client/MapleCharacter$4.class and b/build/classes/client/MapleCharacter$4.class differ diff --git a/build/classes/client/MapleCharacter$5.class b/build/classes/client/MapleCharacter$5.class index 331dd5a972..7f59b82959 100644 Binary files a/build/classes/client/MapleCharacter$5.class and b/build/classes/client/MapleCharacter$5.class differ diff --git a/build/classes/client/MapleCharacter$6.class b/build/classes/client/MapleCharacter$6.class index 1e9ab4f0d0..c94e935a6a 100644 Binary files a/build/classes/client/MapleCharacter$6.class and b/build/classes/client/MapleCharacter$6.class differ diff --git a/build/classes/client/MapleCharacter$7.class b/build/classes/client/MapleCharacter$7.class index d5e521f67d..df470b6237 100644 Binary files a/build/classes/client/MapleCharacter$7.class and b/build/classes/client/MapleCharacter$7.class differ diff --git a/build/classes/client/MapleCharacter$8.class b/build/classes/client/MapleCharacter$8.class index 64197dcb4e..77092d280b 100644 Binary files a/build/classes/client/MapleCharacter$8.class and b/build/classes/client/MapleCharacter$8.class differ diff --git a/build/classes/client/MapleCharacter$9.class b/build/classes/client/MapleCharacter$9.class index 675644a5d1..2ebee46129 100644 Binary files a/build/classes/client/MapleCharacter$9.class and b/build/classes/client/MapleCharacter$9.class differ diff --git a/build/classes/client/MapleCharacter$FameStatus.class b/build/classes/client/MapleCharacter$FameStatus.class index 6c5ff192ab..260e6e461a 100644 Binary files a/build/classes/client/MapleCharacter$FameStatus.class and b/build/classes/client/MapleCharacter$FameStatus.class differ diff --git a/build/classes/client/MapleCharacter$MapleBuffStatValueHolder.class b/build/classes/client/MapleCharacter$MapleBuffStatValueHolder.class index 9afef49517..0c296f4973 100644 Binary files a/build/classes/client/MapleCharacter$MapleBuffStatValueHolder.class and b/build/classes/client/MapleCharacter$MapleBuffStatValueHolder.class differ diff --git a/build/classes/client/MapleCharacter$MapleCoolDownValueHolder.class b/build/classes/client/MapleCharacter$MapleCoolDownValueHolder.class index 5ad57c5686..3d4a4254ef 100644 Binary files a/build/classes/client/MapleCharacter$MapleCoolDownValueHolder.class and b/build/classes/client/MapleCharacter$MapleCoolDownValueHolder.class differ diff --git a/build/classes/client/MapleCharacter$SkillEntry.class b/build/classes/client/MapleCharacter$SkillEntry.class index bcc52c1fc7..a3fa9642f0 100644 Binary files a/build/classes/client/MapleCharacter$SkillEntry.class and b/build/classes/client/MapleCharacter$SkillEntry.class differ diff --git a/build/classes/client/MapleCharacter.class b/build/classes/client/MapleCharacter.class index bc92c84f44..acdcd0f204 100644 Binary files a/build/classes/client/MapleCharacter.class and b/build/classes/client/MapleCharacter.class differ diff --git a/build/classes/client/MapleClient$1.class b/build/classes/client/MapleClient$1.class index fac348602c..306f6e2420 100644 Binary files a/build/classes/client/MapleClient$1.class and b/build/classes/client/MapleClient$1.class differ diff --git a/build/classes/client/MapleClient$CharNameAndId.class b/build/classes/client/MapleClient$CharNameAndId.class index 870feccf36..65e75ff13b 100644 Binary files a/build/classes/client/MapleClient$CharNameAndId.class and b/build/classes/client/MapleClient$CharNameAndId.class differ diff --git a/build/classes/client/MapleClient.class b/build/classes/client/MapleClient.class index 02b85613d6..f6d0077b02 100644 Binary files a/build/classes/client/MapleClient.class and b/build/classes/client/MapleClient.class differ diff --git a/build/classes/client/command/Commands$1.class b/build/classes/client/command/Commands$1.class index 351ebdf676..1a4a52db6c 100644 Binary files a/build/classes/client/command/Commands$1.class and b/build/classes/client/command/Commands$1.class differ diff --git a/build/classes/client/command/Commands.class b/build/classes/client/command/Commands.class index f30be0f8bd..2aa0dfe49e 100644 Binary files a/build/classes/client/command/Commands.class and b/build/classes/client/command/Commands.class differ diff --git a/build/classes/client/inventory/MapleInventory.class b/build/classes/client/inventory/MapleInventory.class index 5298513a86..ff65d92e67 100644 Binary files a/build/classes/client/inventory/MapleInventory.class and b/build/classes/client/inventory/MapleInventory.class differ diff --git a/build/classes/constants/GameConstants$1.class b/build/classes/constants/GameConstants$1.class index 8b1f2f9423..40631c6839 100644 Binary files a/build/classes/constants/GameConstants$1.class and b/build/classes/constants/GameConstants$1.class differ diff --git a/build/classes/constants/GameConstants.class b/build/classes/constants/GameConstants.class index 826f1a2748..a9b18c893c 100644 Binary files a/build/classes/constants/GameConstants.class and b/build/classes/constants/GameConstants.class differ diff --git a/build/classes/constants/ServerConstants.class b/build/classes/constants/ServerConstants.class index 0f084b32ab..ee42fd9fed 100644 Binary files a/build/classes/constants/ServerConstants.class and b/build/classes/constants/ServerConstants.class differ diff --git a/build/classes/net/PacketProcessor.class b/build/classes/net/PacketProcessor.class index 46a4fd0c17..d120086d80 100644 Binary files a/build/classes/net/PacketProcessor.class and b/build/classes/net/PacketProcessor.class differ diff --git a/build/classes/net/RecvOpcode.class b/build/classes/net/RecvOpcode.class index 359d312767..bf0e90f140 100644 Binary files a/build/classes/net/RecvOpcode.class and b/build/classes/net/RecvOpcode.class differ diff --git a/build/classes/net/server/Server$1.class b/build/classes/net/server/Server$1.class index 03815bf333..1eb28d35d5 100644 Binary files a/build/classes/net/server/Server$1.class and b/build/classes/net/server/Server$1.class differ diff --git a/build/classes/net/server/Server.class b/build/classes/net/server/Server.class index 22d554a6ab..737e589587 100644 Binary files a/build/classes/net/server/Server.class and b/build/classes/net/server/Server.class differ diff --git a/build/classes/net/server/channel/Channel.class b/build/classes/net/server/channel/Channel.class index 73cb2c2c83..62b5466fb1 100644 Binary files a/build/classes/net/server/channel/Channel.class and b/build/classes/net/server/channel/Channel.class differ diff --git a/build/classes/net/server/channel/handlers/FredrickHandler.class b/build/classes/net/server/channel/handlers/FredrickHandler.class index 73b7ec0f82..43f2b6c529 100644 Binary files a/build/classes/net/server/channel/handlers/FredrickHandler.class and b/build/classes/net/server/channel/handlers/FredrickHandler.class differ diff --git a/build/classes/net/server/channel/handlers/HiredMerchantRequest.class b/build/classes/net/server/channel/handlers/HiredMerchantRequest.class index d2fb39fd73..b07f3437cd 100644 Binary files a/build/classes/net/server/channel/handlers/HiredMerchantRequest.class and b/build/classes/net/server/channel/handlers/HiredMerchantRequest.class differ diff --git a/build/classes/net/server/channel/handlers/NPCAnimation.class b/build/classes/net/server/channel/handlers/NPCAnimation.class deleted file mode 100644 index 41ca82048f..0000000000 Binary files a/build/classes/net/server/channel/handlers/NPCAnimation.class and /dev/null differ diff --git a/build/classes/net/server/channel/handlers/PlayerInteractionHandler$Action.class b/build/classes/net/server/channel/handlers/PlayerInteractionHandler$Action.class index 463158ce7a..651f198286 100644 Binary files a/build/classes/net/server/channel/handlers/PlayerInteractionHandler$Action.class and b/build/classes/net/server/channel/handlers/PlayerInteractionHandler$Action.class differ diff --git a/build/classes/net/server/channel/handlers/PlayerInteractionHandler.class b/build/classes/net/server/channel/handlers/PlayerInteractionHandler.class index 92dd331d9e..cf9e1443fd 100644 Binary files a/build/classes/net/server/channel/handlers/PlayerInteractionHandler.class and b/build/classes/net/server/channel/handlers/PlayerInteractionHandler.class differ diff --git a/build/classes/net/server/channel/handlers/PlayerLoggedinHandler.class b/build/classes/net/server/channel/handlers/PlayerLoggedinHandler.class index 6081003ad5..a66fe6e5f2 100644 Binary files a/build/classes/net/server/channel/handlers/PlayerLoggedinHandler.class and b/build/classes/net/server/channel/handlers/PlayerLoggedinHandler.class differ diff --git a/build/classes/net/server/channel/handlers/RemoteStoreHandler.class b/build/classes/net/server/channel/handlers/RemoteStoreHandler.class index 5e0c2610c0..71f4d42d59 100644 Binary files a/build/classes/net/server/channel/handlers/RemoteStoreHandler.class and b/build/classes/net/server/channel/handlers/RemoteStoreHandler.class differ diff --git a/build/classes/net/server/channel/handlers/UseCashItemHandler$1.class b/build/classes/net/server/channel/handlers/UseCashItemHandler$1.class index e9bb1ecd5a..dd32ed840d 100644 Binary files a/build/classes/net/server/channel/handlers/UseCashItemHandler$1.class and b/build/classes/net/server/channel/handlers/UseCashItemHandler$1.class differ diff --git a/build/classes/net/server/channel/handlers/UseCashItemHandler.class b/build/classes/net/server/channel/handlers/UseCashItemHandler.class index a491e54cb8..b56eb8f79c 100644 Binary files a/build/classes/net/server/channel/handlers/UseCashItemHandler.class and b/build/classes/net/server/channel/handlers/UseCashItemHandler.class differ diff --git a/build/classes/net/server/channel/handlers/UseSummonBag.class b/build/classes/net/server/channel/handlers/UseSummonBag.class deleted file mode 100644 index 0fced9f3d8..0000000000 Binary files a/build/classes/net/server/channel/handlers/UseSummonBag.class and /dev/null differ diff --git a/build/classes/net/server/world/World$1.class b/build/classes/net/server/world/World$1.class index d522d36d64..994daaa622 100644 Binary files a/build/classes/net/server/world/World$1.class and b/build/classes/net/server/world/World$1.class differ diff --git a/build/classes/net/server/world/World.class b/build/classes/net/server/world/World.class index 22bd854aed..1c43e8c721 100644 Binary files a/build/classes/net/server/world/World.class and b/build/classes/net/server/world/World.class differ diff --git a/build/classes/server/MapleInventoryManipulator.class b/build/classes/server/MapleInventoryManipulator.class index 53c6d95c1f..37b279bc50 100644 Binary files a/build/classes/server/MapleInventoryManipulator.class and b/build/classes/server/MapleInventoryManipulator.class differ diff --git a/build/classes/server/MapleItemInformationProvider$1.class b/build/classes/server/MapleItemInformationProvider$1.class index d0fbe4a32f..7d3a14d0fb 100644 Binary files a/build/classes/server/MapleItemInformationProvider$1.class and b/build/classes/server/MapleItemInformationProvider$1.class differ diff --git a/build/classes/server/MapleItemInformationProvider$RewardItem.class b/build/classes/server/MapleItemInformationProvider$RewardItem.class index b9223961de..c36cd1ad94 100644 Binary files a/build/classes/server/MapleItemInformationProvider$RewardItem.class and b/build/classes/server/MapleItemInformationProvider$RewardItem.class differ diff --git a/build/classes/server/MapleItemInformationProvider$scriptedItem.class b/build/classes/server/MapleItemInformationProvider$scriptedItem.class index d5ca87bc14..b84ff88cc6 100644 Binary files a/build/classes/server/MapleItemInformationProvider$scriptedItem.class and b/build/classes/server/MapleItemInformationProvider$scriptedItem.class differ diff --git a/build/classes/server/MapleItemInformationProvider.class b/build/classes/server/MapleItemInformationProvider.class index cff13cffe9..2cee15cbb8 100644 Binary files a/build/classes/server/MapleItemInformationProvider.class and b/build/classes/server/MapleItemInformationProvider.class differ diff --git a/build/classes/server/MaplePlayerShop.class b/build/classes/server/MaplePlayerShop.class index 3e8d7ef58f..fa5eb45d6e 100644 Binary files a/build/classes/server/MaplePlayerShop.class and b/build/classes/server/MaplePlayerShop.class differ diff --git a/build/classes/server/maps/HiredMerchant$SoldItem.class b/build/classes/server/maps/HiredMerchant$SoldItem.class deleted file mode 100644 index 0f41d3e8e1..0000000000 Binary files a/build/classes/server/maps/HiredMerchant$SoldItem.class and /dev/null differ diff --git a/build/classes/server/maps/HiredMerchant.class b/build/classes/server/maps/HiredMerchant.class deleted file mode 100644 index 177d1481fb..0000000000 Binary files a/build/classes/server/maps/HiredMerchant.class and /dev/null differ diff --git a/build/classes/tools/MaplePacketCreator$1.class b/build/classes/tools/MaplePacketCreator$1.class index bf10881eaf..a421a4f622 100644 Binary files a/build/classes/tools/MaplePacketCreator$1.class and b/build/classes/tools/MaplePacketCreator$1.class differ diff --git a/build/classes/tools/MaplePacketCreator$2.class b/build/classes/tools/MaplePacketCreator$2.class index 92a5a20459..766057277e 100644 Binary files a/build/classes/tools/MaplePacketCreator$2.class and b/build/classes/tools/MaplePacketCreator$2.class differ diff --git a/build/classes/tools/MaplePacketCreator.class b/build/classes/tools/MaplePacketCreator.class index f9657fa238..80cc3a333b 100644 Binary files a/build/classes/tools/MaplePacketCreator.class and b/build/classes/tools/MaplePacketCreator.class differ diff --git a/dist/MapleSolaxia.jar b/dist/MapleSolaxia.jar index b0954fde12..5fccb629ef 100644 Binary files a/dist/MapleSolaxia.jar and b/dist/MapleSolaxia.jar differ diff --git a/docs/feature_list.txt b/docs/feature_list.txt index b4d5d2856e..dbd5d0f9b2 100644 --- a/docs/feature_list.txt +++ b/docs/feature_list.txt @@ -60,6 +60,7 @@ Server potentials: * Mastery book announcer displays droppers of needed books of a player, by reading underlying DB. * Every skill/mastery book is now droppable by mobs. * Inventory auto-gather and auto-sorting feature. +* Enhanced auto-pot system: pet uses as many potions as necessary to reach the desired threshold. * Enhanced buff system: smartly checks for the best available buff effects to be active on the player. * Enhanced AP auto-assigner: exactly matches AP with the needed for the player's current level, surplus assigned to the primary attribute. * Added Boss HP Bar for dozens of bosses (needs provided custom wz). @@ -67,8 +68,9 @@ Server potentials: * Custom jail system (needs provided custom wz). * Delete Character 100% (requires ENABLE_PIC activated). * Boats, elevator and other travelling mechanics fully working. -* Eanbled Hired Merchant can be used anywhere but FM Entrance. +* Enabled Hired Merchant being able to be used anywhere but FM Entrance and other few places. * Vega's spell. +* Owl of Minerva. * Pet item ignore. * Autosaver (periodically saves on DB current state of every player in-game). diff --git a/docs/mychanges_ptbr.txt b/docs/mychanges_ptbr.txt index 453e227721..f096866b4f 100644 --- a/docs/mychanges_ptbr.txt +++ b/docs/mychanges_ptbr.txt @@ -551,6 +551,11 @@ Consertado GPQ n Adicionado Water of Life. Consertado bug com sistema novo de buffs ao entrar no cash shop e em outros cenários onde não se detectava o melhor buff corretamente. -25 Setembro 2017, -Adicionado proteção de acesso concorrente a ações de Hired Merchant. -Corrigido alguns problemas com Hired Merchant não retornando a quantidade correta de itens. \ No newline at end of file +25 - 27 Setembro 2017, +Adicionado proteção de acesso concorrente a ações de Hired Merchant e Player Shop. +Corrigido alguns problemas com Hired Merchant não retornando a quantidade correta de itens. +Adicionado Owl of Minerva. +Corrigido um bug no sistema de checagem de slots. + +28 Setembro 2017, +Adidionado wish tickets à AmoriaPQ. \ No newline at end of file diff --git a/docs/todo.txt b/docs/todo.txt index d20aa1c50b..ae81dec973 100644 --- a/docs/todo.txt +++ b/docs/todo.txt @@ -21,7 +21,6 @@ ToDo / Missing features list: --------------------------- ** Basic PQs ** -- Amoria Party Quest --------------------------- diff --git a/docs/wedding/9201002.js b/docs/wedding/9201002.js new file mode 100644 index 0000000000..3c7a46166d --- /dev/null +++ b/docs/wedding/9201002.js @@ -0,0 +1,206 @@ +/** +--------------------------------------------------------------------------------------------------- +* NPC Name: High Priest John - ID: 9201002.js +* @author Vcoc +* @author Ronan +--------------------------------------------------------------------------------------------------- + **/ +importPackage(Packages.client); +importPackage(Packages.server); +importPackage(Packages.tools); + +var status; +var minLevel = 10; +var maxLevel = 200; +var mySelection = -1; +var rings = Array(1112001, 1112002, 1112003, 1112005, 1112006); + +function start() { + status = -1; + action(1, 0, 0); +} + +function action(mode, type, selection) { + if (mode == 1) { + status++; + } else { + if (type == 1 && mode == 0) + cm.sendOk("..."); + cm.dispose(); + return; + } + + if (cm.getPlayer().getMapId() == 680000000) { + if (status == 0) { + cm.sendSimple("Olá #h #,\r\n#bO que você gostaria de fazer hoje?#b\r\n#L0#Eu quero me casar!#l\r\n#L1#Eu quero ver meus amigos no casamento!#l\r\n#L2#Quero trocar um Bilhete Premium de casamento por 5 convites!#l\r\n#L3#Eu quero comprar um Bilhete de Casamento!#l\r\n#L4#Gostaria de obter uma licença de casamento.#l"); + } else if (status == 1) { + if (selection == 0) { + if (cm.getParty() == null) { // no party + cm.sendOk("Para se casar e necessario estar em grupo com a parceira(o)!"); + cm.dispose(); + } else if (!cm.isLeader()) { // not party leader + cm.sendOk("Por favor, fale ao seu parceiro(a) para falar comigo."); + cm.dispose(); + } else { + var party = cm.getParty().getMembers(); + var mapId = cm.getPlayer().getMapId(); + var levelValid = 0; + var genderRight = 0; + var alreadyMarried = 0; + for (var i = 0; i < party.size(); i++) { + var pPlayer = party.get(i); + if (pPlayer.getLevel() >= minLevel && pPlayer.getLevel() <= maxLevel) + levelValid += 1; + if (pPlayer.getGender() == 0) { + genderRight += 1; + } else if (pPlayer.getGender() == 1) { + genderRight += 2; + } + if (pPlayer.isMarried() == 1) { + alreadyMarried += 1; + } + } + if (party.size() == 2) { + if (party.get(0).getGender() == 0) { // leader. + if (levelValid == 2 || cm.partyMembersInMap() == 2) { + if (genderRight == 3) { + if (alreadyMarried == 0) { + if (cm.haveItem(4031374, 1) && cm.haveItem(5251003, 1)) { + // Kick it into action. Slate says nothing here, just warps you in. + var em = cm.getEventManager("CathedralWedding"); + if (em == null) { + cm.sendOk("Indisponivel!"); + } else { + // Begin the Wedding o.O + em.startInstance(cm.getParty(), cm.getPlayer().getMap()); + party = cm.getPlayer().getEventInstance().getPlayers(); + var hname = party.get(0).getName(); + var wname = party.get(1).getName(); + var StringLine = "[" + hname + " & " + wname + "] Irão se casar na Catedral, no canal (" + cm.getC().getChannel() + ")."; + cm.worldMessage(5, StringLine); + var eim = cm.getChar().getEventInstance(); + eim.setProperty("husband", party.get(0).getName()); + eim.setProperty("wife", party.get(1).getName()); + } + } else + cm.sendOk("Você não tem os itens necessários, desculpe!"); + } else + cm.sendOk("Você já está casado."); + } else + cm.sendOk("O nosso servidor não suporta este tipo de casamento!"); + } else + cm.sendOk("Vocês precisam estar no mesmo mapa e ser pelo menos no nível ["+minLevel+" ~ "+maxLevel+"]"); + } else + cm.sendOk("Por favor faça o teu marido lider do grupo."); + } else + cm.sendOk("Somentos marido e mulher no grupo!"); + cm.dispose(); + } + } else if (selection == 1) { + if (cm.haveItem(5251100, 1)) { + cm.sendGetText("Por favor, insira o nome de um dos membros do casamento ."); + } else { + cm.sendOk("Parece que o casal que você quer assistir não te deu um convite ainda."); + cm.dispose(); + } + } else if (selection == 2) { + if (cm.haveItem(5251003, 1)) { + cm.gainItem(5251003, -1); + cm.gainItem(5251100,5); + } else { + cm.sendOk("Você não tem o Bilhete de Casamento Premium."); + } + cm.dispose(); + } else if (selection == 3) { + cm.sendOk("Você pode comprar um Bilhete de Casamento com a Ria! Localizada no Mercado Livre."); + + cm.dispose(); + } else if (selection == 4) { + if (cm.getPlayer().getMarriageQuestLevel() == 50) { + cm.sendNext("Por favor, vá visitar a Mom eo Dad em sua casa. Eles vivem em algum lugar Henesys Hunting Ground II."); + cm.getPlayer().addMarriageQuestLevel(); + } else if (cm.getPlayer().getMarriageQuestLevel() == 53) { + if (cm.haveItem(4031373, 1)) { + cm.sendNext("Pronto, aqui sua permissão!"); + cm.removeAll(4031373); + cm.gainItem(4031374, 1); + cm.getPlayer().setMarriageQuestLevel(100); + } else { + cm.sendNext("Você não tem a benção de Mom e Dad!"); + } + } else { + cm.sendNext("Eu não sei o que você está falando."); + } + cm.dispose(); + } + } else if (status == 2) { + var chr = cm.getCharByName(cm.getText()); + if (chr != null) { + if (chr.getMapId() == 680000200) { + var eim = chrr.getEventInstance(); + eim.registerPlayer(cm.getPlayer()); + } else { + cm.sendOk("O casamento que você gostaria de participar não foi iniciado."); + } + } else + cm.sendOk("Jogador não encontrado."); + cm.dispose(); + } + } else if (cm.getPlayer().getMapId() == 680000210) { + var eim = cm.getPlayer().getEventInstance(); + + var husbandName = eim.getProperty("husband"); + var wifeName = eim.getProperty("wife"); + + var husband = cm.getCharByName(husbandName); + var wife = cm.getCharByName(wifeName); + + var id = cm.getPlayer().getId(); + + var hclicked = eim.getProperty("hclicked"); + var wclicked = eim.getProperty("hclicked"); + + var otherChar = husband == cm.getPlayer() ? wife : husband; + + if (husband != null && wife != null) { + if (status == 0) { + if (id != husband.getId() && id != husband.getId()) { + cm.sendOk("Você não está se casando!"); + cm.dispose(); + } else if (cm.getPlayer().isMarried() > 0) { + cm.sendOk("Você já foi casado."); + cm.dispose(); + } else if (hclicked == 1 && husbandName.equals(cm.getPlayer().getName())) { + cm.sendOk("Você já aceitou casar-se com sua esposa, pergunte à sua esposa a aceitar agora"); + cm.dispose(); + } else if (wclicked == 1 && wifeName.equals(cm.getPlayer().getName())) { + cm.sendOk("Você já aceitou casar-se com o seu marido , pergunte ao seu marido a aceitar agora"); + cm.dispose(); + } else { + cm.sendYesNo("Você deseja se casar com seu parceiro?\r\n\r\nIsso será uma decisão final."); + } + } else if (status == 1) { + if (husband == cm.getPlayer()) + eim.setProperty("hclicked", 1); + else if (wife == cm.getPlayer()) + eim.setProperty("wclicked", 1); + else { + cm.sendOk("Como assim?"); + cm.dispose(); + } + + if (eim.getProperty("hclicked") == 1 && eim.getProperty("hclicked") == 1) { + if (!cm.createMarriage(otherChar.getName())) { + cm.sendOk("O sistema não pode encontrar o seu parceiro."); + cm.dispose(); + return; + } + cm.worldMessage(5, "Parabéns a "+husbandName+" e "+wifeName+". São recém-casados, você pode enchê-los de spam agora!"); + cm.removeAll(4031374); + MapleInventoryManipulator.removeById(otherChar.getClient(), MapleInventoryType.USE, 4031374, otherChar.getItemQuantity(4031374, false), false, false); + cm.dispose(); + } + } + } + } +} \ No newline at end of file diff --git a/docs/wedding/9201008.js b/docs/wedding/9201008.js new file mode 100644 index 0000000000..c88985f6a5 --- /dev/null +++ b/docs/wedding/9201008.js @@ -0,0 +1,25 @@ +var status = 0; + +function start() { + status = -1; + action(1, 0, 0); +} + +function action(mode, type, selection) { + if (mode == -1) { + cm.dispose(); + }else if (mode == 0){ + cm.dispose(); + return; + } else { + if (mode == 1) + status++; + else + status--; + if (status == 0) { + cm.sendOk("Wow Vickii! You look so beautiful today. Are you ready to move on to the next part of this surprise?\r\n I will be giving you a tour for our chapel."); + cm.getPlayer().startWedding(); + + } + } +} \ No newline at end of file diff --git a/handbook/Quest.txt b/handbook/Quest.txt new file mode 100644 index 0000000000..2e4979391c --- /dev/null +++ b/handbook/Quest.txt @@ -0,0 +1,2817 @@ +Borrowing Sera's Mirror - 1000 +Suspicious Offer?! - 10000 +Co-op with Special Agent O - 10001 +Number of Special Agent Badges - 10002 +Agent W's Watermelon Investigation - 10005 +Agent C's Intelligence Activity - 10007 +Information on Master M - 10008 +Bringing a Mirror to Heena - 1001 +Special Order: Find Master M's Orders! - 10010 +Special Order: Find Master M's Orders! - 10011 +Special Order: Find Master M's Orders! - 10012 +Today's Mission! - 10014 +Obtain the Special Agent Badge! - 10015 +??????? ????! - 10016 +??????????? ????! - 10017 +Earn 50 points on the Speed Quiz! - 10018 +Invade the Watermelon Field! - 10019 +Help Agent E! - 10020 +You are a True Special Agent! - 10021 +Long and Dangerous Road of an Agent - 10023 +What Sen wants to eat - 1003 +??? ?? ?? ?? I - 10030 +??? ?? ?? ?? II - 10031 +??? ?? ?? ?? I - 10032 +??? ?? ?? ?? II - 10033 +???? ??? ?? - 10034 +The Great Maple Book Drive - 10035 +?? ??? ???? - 10036 +????? ?? - 10037 +Surprise Event : Special Alphabets - 10039 +Returning to Nina - 1004 +??? ?? - 10043 +???? ??? - 10046 +? ?? ??? - 10048 +Letter for Lucas - 1005 +???? ?? - 10050 +????? ?? - 10051 +??? 2000?? ??? - 10052 +??? ??? - 10053 +??? ??? - 10054 +???? ??? - 10055 +????? ??? ??? - 10056 +Gaga's Favorite Song - 10059 +Lucas' Reply - 1006 +????? ??? ?? - 10060 +????? ??1 - 10062 +???? ???1 - 10063 +????? ??? - 10064 +???? ??? - 10065 +??? ?? - 10066 +????? ??2 - 10067 +??? ??? - 10068 +?? T? ????? - 10069 +Bigg's Collection of Items - 1007 +??? ??- ??? ?? - 10070 +??? ?? - 10071 +???? ??? - 10072 +?? ?? ?? - 10073 +?? ?? - 10074 +???? ??? - 10075 +????? ??? - 10076 +????? ??? - 10077 +??? ??? - 10078 +??? ??? - 10079 +Pio's Collecting Recycled Goods - 1008 +??? ?? - 10080 +????? ????! - 10081 +?????? ?? ??? - 10082 +????? ?? - 10083 +??? ?? - 10084 +???? ?? - 10085 +?? ?? ?? - 10086 +??? ?? - 10087 +????? ?? - 10088 +??? ?? - 10089 +Rain's Maple Quiz 1 - 1009 +??? ?? ??? ?? - 10090 +??? ?? - 10091 +??? ?? - 10092 +???? ?? ?? ?? - 10093 +????? ?? - 10094 +????? ?? - 10095 +??? ?? - 10096 +??? ?? - 10097 +???? ?? - 10098 +??? ?? - 10099 +Rain's Maple Quiz 2 - 1010 +??? ?? - 10100 +???? ?? - 10101 +?? ???? ?? - 10102 +??? ?? - 10103 +Book of Cygnus Vol. 1 - 10104 +Book of Cygnus Vol. 2 - 10105 +Book of Cygnus Vol. 3 - 10106 +???? ?? ?? - 10107 +?? ??? ?? ??? - 10108 +???? ?? - 10109 +Rain's Maple Quiz 3 - 1011 +????? ?? - 10110 +??? ?? ?? ?? I - 10111 +??? ?? ?? ?? II - 10112 +??? ?? ?? ?? I - 10113 +??? ?? ?? ?? II - 10114 +Rain's Maple Quiz 4 - 1012 +Rain's Maple Quiz 5 - 1013 +Rain's Maple Quiz 6 - 1014 +Rain's Maple Quiz 7 - 1015 +Mai's Training - 1016 +Mai's Final Training - 1017 +Todd's How-to-Hunt - 1018 +Sam's Suggestion - 1019 +Pio and the Recycling - 1020 +Richie Gold is Here - 10200 +Pendant of the Spirit - 10205 +Remnants of Black Mage - 10206 +Remnants of Black Mage - 10207 +Remnants of Black Mage - 10208 +Remnants of Black Mage - 10209 +Roger's Apple - 1021 +Gaga's Analysis - 10210 +Gaga's Analysis - 10211 +Gaga's Analysis - 10212 +Gaga's Analysis - 10213 +Cassandra's Analysis - 10214 +Gaga's Analysis - 10215 +Gaga's Analysis - 10216 +Gaga's Analysis - 10217 +??? ????? ?? - 10218 +????? ??? ???? - 10219 +Lucas' Cute Daughter - 1022 +??? ?? - 10220 +???? ???!???? ?? ?! - 10222 +Starlight Festival - 10224 +Here little Piggy... - 1023 +Gold Richie's Compass - 10230 +Golden Pig's Egg - 10231 +Love Counseling ?! - 1024 +????? ???? - 10240 +????? ???? - 10241 +??? ????1 - 10242 +??? ????2 - 10243 +??? ????3 - 10244 +??? ????1 - 10245 +??? ????2 - 10246 +??? ????3 - 10247 +??? ????1 - 10248 +??? ????2 - 10249 +Maria's Nutritious Juice - 1025 +??? ????3 - 10250 +??? ????1 - 10251 +??? ????2 - 10252 +??? ????3 - 10253 +?? ???? ????1 - 10254 +?? ???? ????2 - 10255 +?? ???? ????3 - 10256 +Delivering Nutritious Juice to Shanks - 1026 +??? ?? ???1 - 10260 +??? ?? ???2 - 10261 +??? ?? ???3 - 10262 +??? ?? ???4 - 10263 +???? ??? ?? - 10264 +???? ??? ?? - 10265 +???? ??? ?? - 10266 +???? ??? ?? - 10267 +??? ?? ??1 - 10268 +Mai's Request - 1027 +??? ?? ??2 - 10270 +??? ?? ??3 - 10271 +??? ?? ??4 - 10272 +??? ??? ??? - 10273 +??? 6?? ???? - 10274 +??? 6?? ????! - 10275 +??? 6?? ????!! - 10276 +??? 6?? ????!!! - 10277 +??? 6?? ??? - 10278 +??? 6?? ???! - 10279 +To Lith Harbor! - 1028 +??? 6?? ???!! - 10280 +??? 6?? ???!!! - 10281 +?? ???? ??? : ???? - 10282 +?? ???? ??? : ???? - 10283 +?? ???? ??? : ?? - 10284 +You are a True Maple Lover ? - 10285 +Cassandra's Gift - 10286 +???? ?? ??? - 10287 +Sam's Advice - 1029 +Maria's Map Reading - 1030 +Making the Witch's Secure Broomstick - 10300 +Making the Witch's Solid Broomstick - 10301 +Making the Witch's Sturdy Broomstick - 10302 +The Witch's Treasure Chest - 10303 +Heena and Sera - 1031 +A Petrified Mouse - 10311 +Gaga's Glasses - 10312 +Cassandra's Crystal Ball - 10313 +A Shiny Watch - 10314 +A Nice Cleat - 10315 +Quest Completion Book - 10316 +A Pretty Hair-Tie - 10317 +An Old Shoe - 10318 +Artifact Hunt 1000 points acquired! - 10319 +Nina's Brother Sen - 1032 +Artifact Hunt 2500 points acquired! - 10320 +Artifact Hunt 4000 points acquired! - 10321 +Artifact Hunt Participation Prize - 10322 +Vaughn Lee's Cleat - 10324 +Stan's Cleat - 10325 +Louie's Cleat - 10326 +Corba's Watch - 10327 +8 Mystical Treasures - 10328 +Start the Artifact Hunt - 10329 +What Sen Wants - 1033 +Challenge! Honorable Mesoranger - 10330 +Special Order! Find Agent E! - 10331 +Special Order! Find Agent S! - 10332 +Special Order! Find Agent O! - 10333 +Tasty Mushroom Candy - 1034 +The Return! - 10340 +Aran's Revival - 10341 +Vague Aran Memories - 10342 +Cassandra's Album - 10343 +Dim Aran Memories - 10344 +Signs of the Revival - 10345 +Faint Aran Memories - 10346 +The Wolf In Waiting - 10347 +Cloudy Aran Memories - 10348 +Preparing for the Arrival - 10349 +Todd's Hunting Method - 1035 +Lingering Aran Memories - 10350 +The Hero's Memory - 10351 +Flickering Aran Memories - 10352 +The Truth About Memory Fragments - 10353 +To Whom Should Cassandra's Album Go? - 10354 +Delivering Cassandra's Album - 10355 +Delivering Cassandra's Album - 10356 +Robin the Walking Encyclopedia - 1036 +Aran Welcome Celebration - 10360 +Help Hunt the Snails - 1037 +Find the Master of Combos - 10370 +Maria's Letter - 1038 +Aran's Return - 10380 +Lilin's Present 3 - 10381 +Helping Out Yoona - 1039 +Teo's Nostaligic Reminiscing I - 10390 +Teo's Nostalgic Reminscing II - 10391 +Teo's Nostalgic Reminscing I - 10392 +Teo's Nostalgic Reminscing II - 10393 +Perfect Pitch - Level Up Event - 10394 +??? ??? - 10395 +??? ??? - 10396 +??? ??? - 10397 +??? ??? - 10398 +Chief's Introduction - 1040 +The 2010 Winter King / Winter Queen Event! - 10400 +The True Winter King / Winter Queen Event of 2010! - 10401 +2009 Pink Flower Floatie! - 10405 +Mai's First Training - 1041 +Hunter's Luck - Week 1 - 10410 +Hunter's Luck - Week 2 - 10411 +Hunter's Luck - Week 3 - 10412 +Hunter's Luck - Week 4 - 10413 +Hunter's Luck - Week 5 - 10414 +Winter Bingo - 10415 +Winter Bingo - 10417 +Winter Bingo - 10418 +Winter Bingo - 10419 +Mai's Second Training - 1042 +Winter Bingo - 10420 +?? ??? ???? - 10425 +?????? ????. - 10426 +Mai's Third Training - 1043 +???? ?? ?? - 10430 +??? ?? ???? - 10431 +??? ??? ???? - 10432 +??? ??? ???? - 10433 +??? ??? ???? - 10434 +??? ??? ???? - 10435 +??? ??? ???? - 10436 +??? ??? ???? - 10437 +??? ?? ???? - 10438 +??? ??? ???? - 10439 +Mai's Last Training - 1044 +??? ??? ???? - 10440 +??? ??? ???? - 10441 +??? ??? ???? - 10442 +??? ??? ???? - 10443 +??? ??? ???? - 10444 +??? ???? - 10445 +Bari's Test - 1045 +???? ??:???? ?? - 10450 +???? ??:???? ?? - 10451 +???? ??:???? ?? - 10452 +???? ??:???? ?? - 10453 +???? ??:???? ?? - 10454 +???? ??:???? ?? - 10455 +???? ??:???? ?? - 10456 +???? ??:???? ?? - 10457 +????? ??? - 10458 +????? ??? - 10459 +Biggs's Story on Victoria Island. - 1046 +Designated Monster Effect - 1047 +?? ???? - 10470 +Job Recommendation - 1048 +Becoming a Warrior - 1049 +Becoming a Magician - 1050 +Becoming a Bowman - 1051 +Becoming a Thief - 1052 +Becoming a Pirate - 1053 +Cygnus Knights - 1054 +??? ??? ?? - 1115 +??? ??? ?? - 1116 +??? ??? ?? - 1117 +??? ??? ?? - 1118 +???? ??? ?? - 1119 +??? ??? ?? - 1120 +??? ??? ?? - 1121 +?? ??? ?? - 1122 +???? ??? ?? - 1123 +???? ??? ?? - 1124 +Moon Bunny's Rice Cake - 1200 +First Time Together - 1201 +The Crack of Dimension - 1202 +Remnants of Goddess - 1203 +Lord Pirate - 1204 +Romeo and Juliet - 1205 +Forest of Poison Haze - 1206 +Ariant Hunting Competition - 1300 +Monster Carnival - 1301 +The 2nd Monster Carnival - 1302 +Honorable Mesoranger - 19000 +Maple Nut - 19001 +The 2nd Honorable Mesoranger - 19002 +Top 10 in Artifact Hunt - 19005 +Mystical Artifact Discoverer - 19006 +Combo Maniac - 19007 +Combo Master - 19008 +Combo King - 19009 +?? ??? - 19010 +Fixing Blackbull's House - 2000 +Greetings from the Young Empress. - 20000 +Neinheart the Tactician - 20001 +Kiku the Training Instructor - 20002 +Kiku's First Training Session - 20003 +Kiku's Second Training Session - 20004 +Kiku's Third Training Session - 20005 +Kiku's Fourth Training Session - 20006 +Kiku's Last Training Session - 20007 +The Path of a Knight - 20008 +Building a New House For "Blackbull" - 2001 +Welcome to Ereve - 20010 +I'll Show You How to Hunt - 20011 +How Well Do You Know Your Skills? - 20012 +A Box with Goodies Inside - 20013 +The Empress is Waiting - 20014 +Greetings From the Young Empress - 20015 +Do You Know the Black Mage? - 20016 +The First Knight Training - 20017 +The Second Knight Training - 20018 +The Last Knight Training - 20019 +Maya of Henesys - 2002 +5 Different Paths of Cygnus Knights - 20020 +Finding Sophia - 2003 +Making a Sparkling Rock - 2004 +Arcon's Blood? - 2005 +Getting Arcon's Blood - 2006 +Making Sparkling Rock - 2007 +Delivering the Weird Medicine - 2008 +Pia and the Blue Mushroom - 2009 +Jane and the Wild Boar - 2010 +Time to Choose - 20100 +Path of a Dawn Warrior - 20101 +Path of a Blaze Wizard - 20102 +Path of a Wind Archer - 20103 +Path of a Night Walker - 20104 +Path of a Thunder Breaker - 20105 +Jane's First Challenge - 2011 +Jane's Second Challenge - 2012 +Jane's Final Challenge - 2013 +Alex's Request - 2014 +Talking to Stan - 2015 +Mother's Gold Watch - 2016 +Arwen and the Glass Shoe - 2017 +Luke the Security Guy - 2018 +A Clue to the Secret Book - 2019 +Hungry Ronnie - 2020 +The End of Knight-in-Training - 20200 +Knighthood Exam: Dawn Warrior - 20201 +Knighthood Exam: Blaze Wizard - 20202 +Knighthood Exam: Wind Archer - 20203 +Knighthood Exam: Night Walker - 20204 +Knighthood Exam: Thunder Breaker - 20205 +Secret to Unagi Special - 2021 +Cold Milk - 2022 +Returned Secret Book - 2023 +Collecting 100 Cursed Dolls - 2024 +Collecting 200 Cursed Dolls - 2025 +Collecting 400 Cursed Dolls - 2026 +Collecting 600 Cursed Dolls - 2027 +Collecting 1000 Cursed Dolls - 2028 +Don Hwang's Request - 2029 +Shumi's Request - 2030 +The Lost Treasure - 20300 +The Master of Disguise - 20301 +The Master of Disguise - 20302 +The Master of Disguise - 20303 +The Master of Disguise - 20304 +The Master of Disguise - 20305 +Ereve Investigation Permit - 20306 +Ereve Investigation Permit - 20307 +Ereve Investigation Permit - 20308 +Ereve Investigation Permit - 20309 +Andre's Request - 2031 +Ereve Investigation Permit - 20310 +Shinsoo's Teardrop - 20311 +Shinsoo's Teardrop - 20312 +Shinsoo's Teardrop - 20313 +Shinsoo's Teardrop - 20314 +Shinsoo's Teardrop - 20315 +Dr. Faymus's Request - 2032 +Chris's Request - 2033 +Cutthroat Manny's Request - 2034 +Luke the Security Man's Wish to Travel - 2035 +First Material for Building a New House - 2036 +Second Material for Building a New House - 2037 +Third Material for Building a New House - 2038 +Last Material for Building a New House - 2039 +Maya's First Collection - 2040 +Chasing the Knight's Target - 20400 +Hunting the Zombies - 20401 +Black Scale - 20402 +Dragon Outcasts - 20403 +The Stolen Egg - 20404 +The Cave of the Black Witch - 20405 +The Knight That Disappeared - 20406 +The Curse of the Black Witch - 20407 +Chief Knight of the Empress - 20408 +Maya's Second Collection - 2041 +Maya's Third Collection - 2042 +Maya's Last Collection - 2043 +Looking for the Red Cape - 2044 +What Pia has Borrowed - 2045 +Pia's Present For a Friend - 2046 +Hero's Gladius - 2047 +Rewakening the Gladius - 2048 +"Mar" the Fairy and the Water of Life - 2049 +Sabitrama and the Diet Medicine - 2050 +??? ?? - 20500 +????? ??? - 20501 +????? ? - 20502 +???? ??? - 20503 +?? ??? - 20504 +??? ??? - 20505 +????? ??????! - 20506 +??? ?? - 20507 +????? ?? - 20508 +???? ??? - 20509 +Sabitrama's Anti-Aging Medicine - 2051 +???? ?? - 20510 +??? ??? - 20511 +????? ????? ???! - 20512 +John's Pink Flower Basket - 2052 +Knight's Dignity - 20520 +Mounts for Knights - 20521 +Raising Mimiana - 20522 +Riding Mimiana - 20523 +Supplements for Mimiana - 20524 +Making a Saddle - 20525 +Re-raising Mimiana - 20526 +A Knight's Pride - 20527 +Raising Mimio - 20528 +John's Present - 2053 +Kiridu's Calling - 20531 +The Mount in Danger - 20532 +The Birth of Shinjo - 20533 +The Rebirth of Shinjo - 20534 +John's Last Present - 2054 +Shumi's Lost Coin - 2055 +Shumi's Lost Bundle of Money - 2056 +Shumi's Lost Bundle of Money - 2057 +Special Taste of Florina Beach - 2058 +Special Taste of Florina Beach II - 2059 +Special Taste of Florina Beach III - 2060 +Training Never Ends - 20600 +A New Skill for Dawn Warriors - 20601 +A New Skill for Blaze Wizards - 20602 +A New Skill for Wind Archer - 20603 +A New Skill for Night Walkers - 20604 +A New Skill for Thunder Breaker - 20605 +Special Taste of Florina Beach - 2061 +Training Still Never Ends - 20610 +Another New Skill for Dawn Warriors - 20611 +Another New Skill for Blaze Wizards - 20612 +Another New Skill for Wind Archers - 20613 +Another New Skill for Night Walker - 20614 +Another New Skill for Thunder Breakers - 20615 +Mrs. Ming Ming's First Worry - 2062 +Mrs. Ming Ming's Second Worry - 2063 +Estelle's Request - 2064 +Searching for Fossils - 2065 +Delivering a Box of Fossil - 2066 +Research on Plant Fossils - 2067 +Research on Animal Fossils - 2068 +Transporting Drake's Skull - 2069 +Progress on Fossil Research - 2070 +Are You Sure You Can Leave? - 20700 +1st Acclimation Training - 20701 +2nd Acclimation Training - 20702 +3rd Acclimation Training - 20703 +A Mission in Henesys - 20704 +A Cynical Orange Mushroom - 20705 +A Black Shadow in the Pig Farm - 20706 +Revolt of the Pigs - 20707 +Mission in Henesys Complete - 20708 +Mission in Kerning City - 20709 +Stranger's Request - 2071 +Hidden Inside the Trash Can - 20710 +Fake Doll - 20711 +I Shall Pick 'Em All! - 20712 +A Deal With Mr. Pickall - 20713 +Mission in Kerning City Complete - 20714 +Mission in Ellinia - 20715 +Maybe it's Arwen! - 20716 +The Plants are Suspicious! - 20717 +Maybe it's Grendel! - 20718 +Mission in Ellinia Complete - 20719 +Stranger's Identity - 2072 +Before the Mission in Perion Begins - 20720 +Mission in Perion - 20721 +Wooden Mask - 20722 +Stone Mask - 20723 +Mission in Perion Complete - 20724 +Mission in Sleepywood - 20725 +Information From Those Who Remember - 20726 +Sabitrama's Information - 20727 +Chrishrama's Information - 20728 +Mysterious Statue's Information - 20729 +Camila's Gem - 2073 +Find the Puppeteer! - 20730 +Find the Maple History Book - 2074 +Find the Maple History Book 2 - 2075 +Estelle's Special Sauce - 2076 +The Path of a Warrior - 2077 +The Path of a Bowman - 2078 +The Path of a Thief - 2079 +The Path of a Magician - 2080 +A Lesson on Job Advancement - 2081 +The Stump Horror Story - 2082 +Icarus's Hang Glider - 2083 +Icarus and the Balloon - 2084 +In search of Wing the Fairy - 2085 +The Ingredients for the Flying Pill - 2086 +Delivering the Flying Pill - 2087 +The Reason Behind the Mushroom Studies - 2088 +I Need Help on My Homework! - 2089 +I'm Bored 1 - 2090 +I'm Bored 2 - 2091 +I Need to Find My Daughter 1 - 2092 +I Need to Find My Daughter 2 - 2093 +Taking Out the Alligators 1 - 2094 +Taking Out the Alligators 2 - 2095 +A Spell that Seals Up a Critical Danger I - 2096 +A Spell that Seals Up a Critical Danger II - 2097 +Camila's Lost Letter - 2099 +Two Ways to Get to Korean Folk Town - 2100 +Find the Missing Kid 1 - 21000 +Find the Missing Kid 2 - 21001 +Korean Folk Town : Through the Sky - 2101 +The Return of the Hero - 21010 +The Missing Weapon - 21011 +Abilities Lost - 21012 +A Gift for the Hero - 21013 +Lilin's Account - 21014 +Basic Fitness Training 1 - 21015 +Basic Fitness Training 2 - 21016 +Basic Fitness Training 3 - 21017 +Basic Fitness Test - 21018 +Korean Folk Town : Through the Ocean - 2102 +Nella's Dream - 2103 +Fanzy's Red Furball - 2104 +DANGER! <1-G. Mushroom> - 2105 +DANGER! <2-H. Mushroom> - 2106 +DANGER! <3-Z. Mushroom> - 2107 +POLLUTED! <1-Evil Eye> - 2108 +POLLUTED! <2-Curse Eye> - 2109 +POLLUTED! <3-Jr. Boogie> - 2110 +The Five Heroes - 21100 +The Polearm-Wielding Hero - 21101 +DANGER! <1-G. Mushroom> - 2111 +DANGER! <2-H. Mushroom> - 2112 +DANGER! <3-Z. Mushroom> - 2113 +POLLUTED! <1-Evil Eye> - 2114 +POLLUTED! <2-Curse Eye> - 2115 +Planting Trees - 2116 +Shawn the Excavator's Request - 2117 +Eliminate Monsters from the Site - 2118 +Notice from the Excavation Team - 2119 +The Messenger of the Fairy Forest 1 - 2120 +In Search of Its Rightful Owner - 21200 +The Mirror of Desire - 21201 +In Search of the Ultimate Weapon - 21202 +The Messenger of the Fairy Forest 2 - 2121 +Manji and the Secret Group - 2122 +A Special Assignment - 2123 +A Supply from the Sand Crew - 2124 +A Special Assignment! - 2125 +A Supply from the Sand Crew! - 2126 +To the Desert... - 2127 +Beginner Warrior's First Training Session - 2128 +Beginner Warrior's Second Training Session - 2129 +Beginner Warrior's Third Training Session - 2130 +A Weapon Never Leaves Its Owner - 21300 +Catch that Thief! - 21301 +Making Red Jade - 21302 +Friendship with Yeti - 21303 +Beginner Warrior's Last Training Session - 2131 +Beginner Magician's First Training Session - 2132 +Beginner Magician's Second Training Session - 2133 +Beginner Magician's Third Training Session - 2134 +Beginner Magician's Last Training Session - 2135 +Beginner Bowman's First Training Session - 2136 +Beginner Bowman's Second Training Session - 2137 +Beginner Bowman's Third Training Session - 2138 +Beginner Bowman's Last Training Session - 2139 +Beginner Thief's First Training Session - 2140 +Weapon Starts a Fight? with His Owner? - 21400 +Taming the Polearm - 21401 +Beginner Thief's Second Training Session - 2141 +Beginner Thief's Third Training Session - 2142 +Beginner Thief's Last Training Session - 2143 +Truth of the Rumor - 2144 +Stump Research - 2145 +Monstrous Tree Stumpy - 2146 +???? ?? ??? - 2147 +Truth of the Rumor-Blackbull - 2148 +Truth of the Rumor-Manji - 2149 +Truth of the Rumor-Ayan - 2150 +Weapon Acknowledges Its Owner - 21500 +Truth of the Rumor- Dances with Balrog - 2151 +Truth of the Rumor-Betty - 2152 +The Old Snail - 2153 +Hero of the Story - 2154 +Snail Hunt - 2155 +A rainbow snail shell that makes wishes come true!? - 2156 +Sacrifice to King Clang - 2157 +Helping Riel - 2158 +Helping Roel - 2159 +Helping Rael - 2160 +Pucci's Request - 21600 +Formula for Your Wolf Pup - 21601 +Kenta's Wolf Pup Formula - 21602 +Ryko the Wolf Pup - 21603 +Wolf Mount - 21604 +The Missing Wolf - 21605 +The Missing Saddle - 21606 +The Adolescent Wolf - 21607 +Nanuke's Advice - 21608 +Kenta's Adolescent Wolf Vitamins - 21609 +A brave Warrior to defeat King Clang appears! - 2161 +Scadur's Advice - 21610 +Rebellious Wolf - 21611 +A Visit from the Wolf Herd - 21612 +The Wolves' Test - 21613 +A Wolf's Heart - 21614 +Gathering Ingredients for the Wolf's Life Water - 21615 +The Chief Wolf's Rage - 21616 +Reacquiring the Life Water Ingredients - 21617 +The Wolf's Evolution - 21618 +The Half-written Letter - 2162 +Athena Pierce's Smile - 2163 +Athena Pierce's Gift - 2164 +The Prince's Request - 2165 +Shining Stone - 2166 +Sea Firefly1 - 2167 +Sea Firefly2 - 2168 +The Large Pearl - 2169 +Information for Dr. Kim - 2170 +New Beginnings - 21700 +Train or Die! 1 - 21701 +Train or Die! 2 - 21702 +Train or Die! 3 - 21703 +Baby Steps - 21704 +To Victoria Island - 21705 +An Information Dealer's Work - 21706 +Teo's Information - 21707 +Your First Informant Assignment - 21708 +Check Out the Orange Mushroom - 21709 +Can you please give Baine a helping hand? - 2171 +A Monster War? - 21710 +Enter the Cynical Orange Mushrooms! - 21711 +First Assignment, Completed! - 21712 +Your Second Informant Assignment - 21713 +Green Mushrooms - 21714 +Tree Witness - 21715 +Second Assignment, Completed! - 21716 +Rowen's Request 1 - 21717 +Rowen's Request 2 - 21718 +The Puppeteer's Invitation - 21719 +What is it that Bart saw? - 2172 +The Puppeteer's Warning - 21720 +Your Third Informant Assignment - 21721 +Ghost Stumps - 21722 +Find the Puppet - 21723 +Third Assignment, Completed! - 21724 +10 Boogies's Request - 21725 +Your Fourth Informant Assignment - 21726 +Zombie Mushrooms - 21727 +The Puppeteer's Cave - 21728 +4th Assignment Completed - 21729 +The Truth Behind the Black Shadow - 2173 +The Cave's Password - 21730 +Eliminate the Puppeteer! - 21731 +The Black Wings' Conspiracy - 21732 +Gathering Some Strange Information - 21733 +Traces of the Puppeteer - 21734 +The Seal Stone of Victoria Island - 21735 +Orbis - 21736 +The Giant Nependeaths Appear - 21737 +Sealed Garden - 21738 +To the Sealed Garden - 21739 +Report to Muirhat - 2174 +The Stolen Seal Stone of Orbis - 21740 +Investigating Mu Lung - 21741 +The Black Scroll - 21742 +The Special Ink - 21743 +The Shadow Knight's Letter - 21744 +How to Meet Mu Gong - 21745 +Mu Gong's Test - 21746 +Catch the Shadow Knight! - 21747 +The Stolen Seal Stone of Mu Lung - 21748 +Back to the Past - 21749 +Disciples of the Black Magician - 2175 +She Remembers Me - 21750 +Seal Stone of Ellin Forest - 21751 +Find the Key - 21752 +The Lost Seal Stone of Ellin Forest - 21753 +Info on Another Seal Stone - 21754 +Decoding the Letter - 21755 +A Letter to the Queen - 21756 +Neinheart the Strategist - 21757 +Neinheart's Thanks - 21758 +Cleaning The Nautilus 1 - 2176 +Suspicious John - 21766 +Secrets of the Wooden Box - 21767 +Cleaning The Nautilus 2 - 2177 +Cleaning The Nautilus 3 - 2178 +Protect The Nautilus' Emergency Food Supply - 2179 +Find Fresh Milk - 2180 +Porchay's Letter - 2181 +Ingredients to Get for the Banquet - 2182 +A Banquet for the Whalians - 2183 +Black Bark's Worry - 2184 +Dress for Kyrin - 2185 +Help Me Find My Glasses - 2186 +A Hole in The Nautilus - 2187 +Unidentified Strangers - 2190 +How to become a Brawler - 2191 +How to Become a Gunslinger - 2192 +The Beginner Pirate's First Training Session - 2193 +The Beginner Pirate's Second Training Session - 2194 +Beginner Pirate's Third Training Session - 2195 +Beginner Pirate's Fourth Training Session - 2196 +Tienk, the Monster Book Salesman - 2197 +Eliminate the Stone Golems - 2198 +Eliminate the Dark Stone Golems - 2199 +Eliminate the Mixed Golems - 2200 +Eliminate the Skeletons - 2201 +Eliminate the Drakes - 2202 +Eliminate the Tauromacis - 2203 +Strange Dish 1 - 2204 +Strange Dish 2 - 2205 +Strange Dish 3 - 2206 +Lazy Little Calico - 2207 +Bartol's Requests - 2208 +Bring a Lemon for Shulynch - 2209 +Take the Gold Pouch to Muirhat - 2210 +Deliver the Tattered Map to Black Bark - 2211 +The Path of Pirate - 2212 +JM's Request - 2213 +The Run-down Huts in the Swamp - 2214 +Find the Crumpled Piece of Paper Again - 2215 +Information from Mr. Pickall - 2216 +Information from Shumi - 2217 +Information from Nella - 2218 +Information from Jake - 2219 +Gathering Information Completed - 2220 +Conclusion - 2221 +The Forest of Evil - 2222 +The Name He Calls - 2223 +Rage, Resentment, and Revenge - 2224 +The Cause and Effect - 2225 +Arwen's Apology - 2226 +Defeat Faust - 2227 +Reef's Gratitude - 2228 +A Way to Fight Off Sleep - 2229 +A Mysterious Small Egg - 2230 +Captain Al, Who Are You? - 2231 +Find a Junior! - 2232 +Raise the Rep! - 2233 +Enjoy the Entitlement! - 2234 +Manji's Request - 2235 +How to Shoo Away the Evil - 2236 +The Owner of the Mysterious Note - 2237 +Who is the Owner of the Mysterious Note? - 2238 +Balrog and the Seal - 2239 +A Letter to the Master - 2240 +A Request to His Apprentice - 2241 +Stay Away From Strangers - 2242 +This is something you can make with Balrog Skin. - 2243 +Tristan's Successor - 2244 +To Tristan's Tomb - 2245 +Horny Mushroom Caps Research - 2246 +Raging Horny Mushrooms - 2247 +Understanding the Horny Mushroom Signals - 2248 +Zombie Mushroom Signal 1 - 2249 +Zombie Mushroom Signal 2 - 2250 +Zombie Mushroom Signal 3 - 2251 +Studying the Mushroom Signals 1 (Repeatable) - 2252 +Studying the Mushroom Signals 2 (Repeatable) - 2253 +Karcasa of the Desert - 2254 +Karcasa's Memory - 2255 +Karcasa's Memory 2 - 2256 +Karcasa Relents - 2257 +Meerkats Listen During the Day - 2258 +Scorpions Can't Listen at Night - 2259 +To the Mushroom Castle! - 2260 +Camel's Training Session 1 (Repeatable) - 2261 +Camel's Training Session 2 (Repeatable) - 2262 +Camel's Training Session 3 (Repeatable) - 2263 +Mr. Lim and the Subway - 2264 +My dream is to... - 2270 +Lana's Decision - 2271 +Convince Robby Fray - 2272 +The Secret Recipe - 2273 +Reception Party Preparation, Done! - 2274 +Tina's Proposition - 2275 +Makeup Artist, Booked! - 2276 +Marshall's Refusal - 2277 +Legendary Scissors - 2278 +Hair Stylist, Booked! - 2279 +Costume Preparation - 2280 +Costume Preparation, Done! - 2281 +Rose Scent - 2282 +Freesia Scent - 2283 +Lavender Scent - 2284 +Music Preparation - 2285 +Request for a New Song - 2286 +Composition Fee - 2287 +Say "NO" to Plagiarism - 2288 +The New Song - 2289 +Debut Preparations Completed - 2290 +Admission to the VIP Zone - 2291 +Blake's Dream - 2292 +The Last Song - 2293 +Endangered Mushking Empire - 2300 +Endangered Mushking Empire - 2301 +Endangered Mushking Empire - 2302 +Endangered Mushking Empire - 2303 +Endangered Mushking Empire - 2304 +Endangered Mushking Empire - 2305 +Endangered Mushking Empire - 2306 +Endangered Mushking Empire - 2307 +Endangered Mushking Empire - 2308 +Endangered Mushking Empire - 2309 +Endangered Mushking Empire - 2310 +The Test - 2312 +The Story Behind the Case - 2313 +Exploring Mushroom Forest (1) - 2314 +Exploring Mushroom Forest (2) - 2315 +Exploring Mushroom Forest (3) - 2316 +Killer Mushroom Spores (1) - 2317 +Killer Mushroom Spores (2) - 2318 +Killer Mushroom Spores (3) - 2319 +Friendship with Bruce - 2320 +Over the Castle Walls (1) - 2321 +Over the Castle Walls (2) - 2322 +Over the Castle Walls (3) - 2323 +Over the Castle Walls (4) - 2324 +James's Whereabouts (1) - 2325 +James's Whereabouts (2) - 2326 +James's Whereabouts (3) - 2327 +Sending Provisions (1) - 2328 +Sending Provisions (2) - 2329 +Stop the Wedding - 2330 +The Seal of the Empire - 2331 +Where's Violetta? - 2332 +The Story of Betrayal - 2333 +The Identity of the Princess - 2334 +Eliminating the Rest - 2335 +Truth Revealed - 2336 +King Pepe's Scroll - 2337 +Killer Mushroom Spores, Again - 2338 +The Recovered Royal Seal - 2342 +Training Center for Beginner Warriors - 2400 +Training Center for Beginner Magicians - 2401 +Training Center for Beginner Thieves - 2402 +Training Center for Beginner Bowmen - 2403 +Training Center for Beginner Pirates - 2404 +The Lost Letter of Commendation - 2405 +The Lost Letter of Commendation - 2406 +The Lost Letter of Commendation - 2407 +The Lost Letter of Commendation - 2408 +The Lost Letter of Commendation - 2409 +Regaining Confidence - 2410 +Regaining Confidence - 2411 +Regaining Confidence - 2412 +Regaining Confidence - 2413 +Regaining Confidence - 2414 +Using Power Strike - 2415 +Using Magic Claw - 2416 +Using Arrow Blow - 2417 +Using Double Stab - 2418 +Using Flash Fist - 2419 +Using Lucky Seven - 2420 +Using Double Shot - 2421 +Stump's Weakness - 2422 +Slime's Weakness - 2423 +Slime's Weakness - 2424 +Stump's Weakness - 2425 +Pig's Weakness - 2426 +Team Training is Fun! (Party) - 2427 +Team Training is Fun! (Party) - 2428 +Team Training is Fun! (Party) - 2429 +Team Training is Fun! (Party) - 2430 +Team Training is Fun! (Party) - 2431 +Maplemas Surprise Party! - 28000 +In Preparation for the Party - 28001 +A Secret Note - 28002 +Alcaster's Reply - 28003 +Save the Snowman! - 28004 +Amoria : Red Dahlia - Pirate - 28102 +Amoria : Cupid's Courier - Pirate - 28103 +Amoria : Cupid's Courier - Pirate - 28104 +Cleaning Up The Streets - 28105 +Cleaning Up The Streets - 28106 +Discovering Secrets - 28107 +Demise of a Madman - 28108 +MV's Treasure - 28109 +A Headache for Treasure Hunters - 28110 +Cool as Ice - 28114 +Urban Warrior - 28115 +Urban Warrior - 28116 +4 Candles - 28117 +4 Year Anniversary Cake - 28118 +Preparing for Cody's 4 Year Anniversary Party! - 28120 +Preparing for Cody's 4 Year Anniversary Party! - 28121 +Preparing for Cody's 4 Year Anniversary Party! - 28122 +Cleaning Up The Streets - Continued - 28124 +Cleaning Up The Streets - Continued - 28125 +In Search of the Miwok Artifact - 28128 +The Legendary Tribal Ring: Circle of Ancient Thought - 28129 +The Legendary Tribal Ring: Circle of Ancient Strength - 28130 +Soft and Cozy Chief's Chair - 28131 +The Wandering Alchemist Eurek's New Skill - 28136 +Spirit Week Event - September 29th - 28137 +Spirit Week Event - October 6th - 28138 +Spirit Week Event - October 13th - 28139 +Spirit Week Event - October 20th - 28140 +Spirit Week Event - Cassandra's Candle - 28141 +Spirit Week Event - Cassandra's Candle - 28142 +Spirit Week Event - Cassandra's Candle - 28143 +Spirit Week Event - Cassandra's Candle - 28144 +Spirit Week Event - September 24th - 28145 +Spirit Week Event - October 1st - 28146 +Spirit Week Event - October 8th - 28147 +Spirit Week Event - October 15th - 28148 +Spirit Week Event - Cassandra's Candle - 28149 +Spirit Week Event - Cassandra's Candle - 28150 +Spirit Week Event - Cassandra's Candle - 28151 +Spirit Week Event - Cassandra's Candle - 28152 +Spirit Week Event - October 27th - 28153 +Spirit Week Event - Cassandra's Candle - 28154 +Spirit Week Event - October 22nd - 28155 +Spirit Week Event - Cassandra's Candle - 28156 +Spirit Week Event - September 28th - 28157 +Spirit Week Event - October 5th - 28158 +Spirit Week Event - October 12th - 28159 +Spirit Week Event - October 19th - 28160 +Spirit Week Event - October 26th - 28161 +Meeting the Training Instructor - 28162 +Advanced Training-1 - 28163 +Advanced Training-2 - 28164 +Reporting the Training Results - 28165 +Meeting Ervine - 28166 +Inspecting the Water Pipe - 28167 +Sticky Slimes! - 28168 +Visiting Henesys - 28169 +What Does Chief Stan Like? - 28170 +The Reason Why Chief Stan is Livid - 28171 +Searching for Clues - 28172 +Heading Over to The Nautilus! - 28173 +Investigation in Progress - 28174 +A Special Wine - 28175 +Solving the Mystery - 28176 +Catching the Suspect - 28177 +Who Changed Him? - 28178 +Dances with Andras! - 28179 +The First Encounter with Lucci - 28180 +Rigorous Training-1 - 28181 +Rigorous Training-2 - 28182 +Rigorous Training-3 - 28183 +Rigorous Training-4 - 28184 +Reporting the Training Results to Grendel the Really Old - 28185 +The Journey of the Nautilus - 28186 +Show Kyrin What You've Got! - 28187 +Finding Chief Stan in Henesys - 28188 +Ingredients for the Cold Medicine - 28189 +Delivering the Cold Medicine - 28190 +The Coughing Dark Lord - 28191 +Virus Sample Research - 28192 +Virus is Spreading Via the Water? - 28193 +Find the Clues! - 28194 +To Perion! - 28195 +The Demon Behind It All - 28196 +Returning to Ellinia - 28197 +Marbas the Demon! - 28198 +First Encounter with Ervine - 28199 +Even More Challenging Training-1 - 28200 +Even More Challenging Training-2 - 28201 +Reporting the Training Results to Dark Lord - 28202 +Meeting Jay - 28203 +Find the Lost Book - 28204 +Searching for the Lost Book - 28205 +Returning the Book to Jay - 28206 +Meeting Kyrin of The Nautilus - 28207 +Kyrin's Request - 28208 +Baine Likes... - 28209 +Commotion on the Ship, No More! - 28210 +Next Stop, Ellinia - 28211 +The Clue to Ellinia's Burglary Case - 28212 +This Feather, For Some Reason, Seems To Be Related to Perion... - 28213 +The Secret of the Golden Feather - 28214 +A Burglar Demon - 28215 +Returning to Kerning City - 28216 +The Demon Likes... - 28217 +Shumi, the Coin Mania - 28218 +Catch Valefor! - 28219 +Encounter with Hill, the Antique Collector - 28220 +Show Me What You're Made Of-1 - 28221 +Show Me What You're Made Of-2 - 28222 +Reporting the Training Results to Athena Pierce - 28223 +Delivering the Antique - 28224 +Antique Search - 28225 +Back to Hill - 28226 +The Cost of Delivery - 28227 +The Legend Has It That... - 28228 +The Fairies Like... - 28229 +Solomon's Bow - 28230 +Restoring the Memory of the Ancient Bow - 28231 +Another Storyteller - 28232 +Putting the Legend to a Test - 28233 +Revival of the Demon - 28234 +So the Demons Like Noise? - 28235 +Catching the Demon - 28236 +The Legendary Revival - 28237 +The Final Battle with Amdusias - 28238 +Finding Muirhat - 28239 +Rigorous Training!-1 - 28240 +Rigorous Training!-2 - 28241 +Reporting the Training Results to Kyrin - 28242 +The Mystery of the Green Portion - 28243 +Grendel the Really Tipsy - 28244 +You Can't Teach an Old Dog New Tricks - 28245 +The Mystery of the Red Portion - 28246 +Something's Lacking - 28247 +Calming the Soul with Music - 28248 +To Kerning City - 28249 +The Mystery of the White Portion - 28250 +The Completed Treasure Map - 28251 +Searching for the Treasures - 28252 +Where Are the Treasures? - 28253 +There Are No Treasures?! - 28254 +Searching for the Demon - 28255 +Treasure, and Crocell the Demon - 28256 +Who Broke the Seal of Andras? - 28257 +Who Broke the Seal of Valefor? - 28258 +Who Broke the Seal of Amdusias? - 28259 +Who Broke the Seal of Crocell? - 28260 +Who Broke the Seal of Marbas? - 28261 +Revealed Identity - 28262 +The Rememberer's Training-1 - 28263 +The Rememberer's Training-2 - 28264 +The Rememberer's Training-3 - 28265 +Secret of Astaroth - 28266 +[Collect] I Need an Umbrella! - 28267 +[Hunt] The Pigs Are Ruining the Produce! - 28268 +[Hunt] The Terrorizing Red Ribbon Pigs - 28269 +[Hunt] Pigs at the Corner - 28270 +[Hunt] That Red Isn't For Everyone! - 28271 +[Hunt] Intimidating Octopuses - 28272 +[Collect] Eww, It's Slimy! - 28273 +[Hunt] Why Are Dark Stumps So Dark? - 28274 +[Hunt] You Were Bitten by a Green Mushroom? - 28275 +[Hunt] Drowsiness from the Orange Mushrooms? - 28276 +[Hunt] Camouflaging Slimes - 28277 +[Hunt] Destructively Strong Pigs - 28278 +[Collect] Red Ribbons Around the Pig's Neck - 28279 +[Hunt] Sweep the Snails! - 28280 +[Collect] Preparations for the Traditional Ceremony - 28281 +How to Avoid the Stink - 28282 +For the peace of Victoria Island... - 28283 +Cassandra's Trick or Treat - 28284 +Cassandra's Trick or Treat - 28285 +Cassandra's Trick or Treat - 28286 +Witch Malady's Secret Mission - 28287 +Stinky Seasoned Cursed Frog Eggs and Mushrooms - 28288 +Dreamy Bloody Mushroom Wine - 28289 +The Highlight of a Witch Party! Slimy Canape - 28290 +Really Zingy Kabab - 28291 +Stinky Swamp Wrap - 28292 +Chew on it if you can! Rough Leather Steak - 28293 +Witch's Special Stew - 28294 +Witch's Dark Token - 28295 +Butler: "The Trap" - 28296 +Butler: "The Trap" - 28297 +Butler: "The Trap" - 28298 +Olivia: "Help Me" - 28302 +Olivia: "Find My Daddy" - 28303 +Olivia: "Bring My Daddy" - 28304 +Joe: "Clear the Way" - 28305 +Father: "Dirty House" - 28306 +Steward: "I'm a Butler, Not a Maid!" - 28307 +Jonas: "Jonas' Presence" 1 - 28308 +Olivia: "Help Me" - 28309 +Olivia: "Find My Daddy" - 28310 +Olivia: "Bring My Daddy" - 28311 +Joe: "Clear the Way" - 28312 +Father: "Dirty House" - 28313 +Steward: "I'm a Butler, Not a Maid!" - 28314 +Jonas: "Jonas' Presence" 2 - 28315 +Olivia: "Help Me" - 28316 +Olivia: "Find My Daddy" - 28317 +Olivia: "Bring My Daddy" - 28318 +Joe: "Clear the Way" - 28319 +Father: "Dirty House" - 28320 +Steward: "I'm a Butler, Not a Maid!" - 28321 +Jonas: "Jonas' Presence" 3 - 28322 +Dirty Treasure Map - 28325 +Yellow Turkey Egg Hunt - 28326 +Green Turkey Egg Hunt - 28327 +Blue Turkey Egg Hunt - 28328 +The Object of Professor Foxwit's Interest - 28329 +Festival of Lights - Building the Altar - 28331 +New Year's Presents from Cassandra - 28333 +Lilin's Present 1 - 28335 +Lilin's Present 2 - 28336 +Cupid's Lost Arrows - 28337 +Mardi Gras Throws - 28338 +Mardi Gras Green Masks - 28339 +Mardi Gras Purple Masks - 28340 +Mardi Gras Red Masks - 28341 +Hunter's Luck - Week 6 - 28344 +Title Challenge - PQ Mania - 29000 +Title Challenge - Quest Specialist - 29001 +Title Challenge - Celebrity! - 29002 +Title Challenge - Diligent Explorer - 29003 +One Who's Touched the Sky - 29004 +Beginner Explorer - 29005 +El Nath Mts. Explorer - 29006 +Ludus Lake Explorer - 29007 +Undersea Explorer - 29008 +Mu Lung Explorer - 29009 +Nihal Desert Explorer - 29010 +Minar Forest Explorer - 29011 +Ossyria Explorer - 29012 +Maple Explorer - 29013 +Sleepywood Explorer - 29014 +Victoria Explorer - 29015 +Title - Spirit Diviner - 29016 +Title - Soul Conjurer - 29017 +Title - Soul Guardian - 29018 +Title - Saint Exorcist - 29019 +Title - Dynamic Hair - 29020 +Title Challenge - Ultimate Warrior - 29300 +Title Challenge - Ultimate Magician - 29301 +Title Challenge - Ultimate Archer - 29302 +Title Challenge - Ultimate Thief - 29303 +Title Challenge - Ultimate Pirate - 29304 +Title Challenge - Veteran Hunter - 29400 +Title Challenge - Maple Idol Star - 29500 +Title Challenge - Horned Tail Slayer - 29501 +Title Challenge - Pink Bean Slayer - 29502 +Title Challenge - Donation King - 29503 +The Carnivalian of Absolute Victory - 29505 +The Gifted Carnivalian - 29506 +Wonderful Pet Owner - 29507 +Outstanding Citizen - 29508 +Persevering Challenger - 29509 +Endless Journey Medal - 29510 +Monster Expert - 29512 +Beginner Adventurer - 29900 +Junior Adventurer - 29901 +Veteran Adventurer - 29902 +Master Adventurer - 29903 +Noblesse - 29904 +Noblesse - 29905 +Knight-in-Training - 29906 +Official Knight - 29907 +Advanced Knight - 29908 +Chief Knight - 29909 +Gallant Warrior - 29910 +Wiseman - 29911 +Lord Sniper - 29912 +Legendary Thief - 29913 +King Pirate - 29914 +Mu Lung Dojo Vanquisher - 29915 +Henesys Donor Medal - 29916 +Ellinia Donor Medal - 29917 +Perion Donor Medal - 29918 +Kerning City Donor Medal - 29919 +Sleepywood Donor Medal - 29920 +Nautilus Donor Medal - 29921 +Veteran Hunter - 29922 +Legendary Hunter - 29923 +The Revived Aran - 29924 +Aran and Memory - 29925 +Aran in Agony - 29926 +Aran of Hope - 29927 +Aran the Hero - 29928 +2010 Winter King - 29929 +2010 Winter Queen - 29930 +Honorary Subway Worker - 29931 +Protector of Pharaoh - 29932 +Lith Harbor Donor - 29933 +Missing Staff Sergeant Charlie - 3000 +Missing Sergeant Bravo - 3001 +Missing Corporal Easy - 3002 +Returning to Master Sergeant Fox - 3003 +The Descendent of the Author of the Book of Ancient - 3004 +Hella's Missing - 3005 +Where's Hella? - 3006 +One Clue - 3007 +Looking For the Old Lady - 3008 +Spiruna's Black Crystal - 3009 +The Cracked Black Crystal - 3010 +To Restore the Crystal - 3011 +A Word from the Assistant - 3012 +To Acquire the Fairy Dust - 3013 +Acquiring the Fairy Dust - 3014 +The Truth Comes Out... - 3015 +Hella is Found! - 3016 +The Small Grave That's Hidden - 3017 +An Old Ring - 3018 +The Secrets Behind the Ring? - 3019 +Collecting Wolf Skin - 3020 +Looking for the Wiseman in Perion - 3021 +Dances with Balrog and His Recovery - 3022 +Looking for the Wiseman in Ellinia - 3023 +Grendel the Really Old and His Recovery - 3024 +Looking for the Wiseman in Henesys - 3025 +Athena Pierce and Her Recovery - 3026 +Looking for the Wiseman in Kerning City - 3027 +Dark Lord and His Recovery - 3028 +All the Map Pieces in One Place - 3029 +Restoring the Map - 3030 +Acquiring the Memory Powder - 3031 +The Map is in One Piece - 3032 +The Secrets Behind the Statue - 3033 +The Book of Ancient is Back! - 3034 +Alcaster and the Dark Crystal - 3035 +Traces of Nick - 3036 +Nick's Ring - 3037 +Collecting Huckle's Magic Ingredients - 3038 +A Request from Staff Sergeant Charlie - 3039 +A Request from Sergeant Bravo - 3040 +A Request from Corporal Easy - 3041 +Delivering a Mysterious Item - 3042 +Helping Kriel Out - 3043 +The Nependeath Juice - 3044 +Ericsson Loves Cats - 3045 +A Present for Nero - 3046 +Ericsson's Reward - 3047 +Elma's Nependeath Juice - 3048 +Estelle and the Syrup - 3049 +Alfonse's Smile - 3050 +Lisa's Letter of Recommendation - 3051 +Acquiring Materials for the Fur Coat - 3052 +Moppie the Lone Dawg - 3053 +Fairy's Horn Flute - 3054 +Fairy's Horn Flute II - 3055 +Lisa's Special Medicine - 3056 +Lisa's Special Medicine II - 3057 +Lisa's Special Medicine III - 3058 +A Request from Moppie - 3059 +Food-Hunting for Moppie - 3060 +Food-Hunting for Moppie II - 3061 +Food-Hunting for Moppie III - 3062 +Nero's Necklace - 3063 +Protect Nero! - 3064 +Hughes's Hobby - 3065 +Hughes's Weird Invention - 3066 +A Healthy Snack for the Huskies - 3067 +Hughes's Research Material - 3068 +The Lost Sap of Nependeath - 3069 +Shammos's Request - 3070 +The Secrets Behind the Contract of Darkness - 3071 +The Bottled-up Letter - 3072 +Robinson's ID - 3073 +Sending Relief - 3074 +Carta the Sea Witch - 3075 +Carta's Demand - 3076 +Carta's Fortune-Telling - 3077 +The Blocked Path of the Ocean - 3078 +The Lost Nependeath Juice - 3079 +Kenta's Research 1 - 3080 +Kenta's Research 2 - 3081 +Kenta's Research 3 - 3082 +Kenta's Advice - 3083 +Nanuke's Ingredients - 3084 +Muse is Cooking - 3085 +Spiruna's Prophecy - 3086 +Lightening Up Orbis - 3087 +Pixies' Cloud Pieces - 3088 +The Sprayer Elma Borrowed 1 - 3089 +The Sprayer Elma Borrowed 2 - 3090 +The Ocean View : Kriel's Offer - 3091 +Aqua Road Photo Album - 3092 +Snow Crystal 1 - 3093 +Snow Crystal 2 - 3094 +The Lost Photo Album - 3095 +Kenta's Advice - 3096 +Spiruna's concern - 3097 +The legend of Papa Pixie - 3098 +The record of Goddess Minerva - 3099 +Delivering Food to Spiruna - 3100 +Hughes's New Experiement - 3101 +Master Sergeant Fox's Secret - 3102 +Alcaster's Cape - 3103 +Finding Horn Flute - 3104 +Huge Creature of the Snowfield - 3105 +Snowman Legend - 3106 +Snowman's Rage - 3107 +Snowman's Rage-Found a clue - 3108 +Holding Back the Snowman - 3109 +Restoring the Spirit of the Snow Sculpture - 3110 +Eliza's Rage - 3111 +Eliza's Garden - 3112 +Talk with Eliza - 3113 +Eliza's Eternal Sleep - 3114 +A Strange Development - 3115 +Cleaning up Eos Tower - 3200 +Cleaning Up the Inner Parts of Eos Tower - 3201 +Cleaning Up the Outer Parts of Eos Tower - 3202 +Eos Tower Threatened! - 3203 +Peace at Eos Tower - 3204 +The Lost Guard - 3205 +Nemi's Lunchbox Delivery - 3206 +Nemi's First Ingredient - 3207 +Nemi's Second Ingredient - 3208 +Nemi's Dilemma - 3209 +Just Another Day at Work - 3210 +Roly-Poly 1 - 3211 +Roly-Poly 2 - 3212 +Roly-Poly 3 - 3213 +Roly-Poly 4 - 3214 +Roly-Poly 5 - 3215 +Roly-Poly 6 - 3216 +Roly-Poly 7 - 3217 +Roly-Poly 8 - 3218 +Roly-Poly 9 - 3219 +Roly-Poly 10 - 3220 +The Drumming Bunny - 3221 +Eliminating the Drumming Bunny - 3222 +Roly-Poly 6's Tool - 3223 +Helping Fix Eos Tower - 3224 +Fixing Eos Tower - 3225 +The Girl Who Lost Her Memory - 3226 +The Man in the Black Suit - 3227 +The Recovered Memory - 3228 +Toy Soldier's Walnut - 3229 +Dollhouse - 3230 +The Broken Clocktower - 3231 +Grandpa Clock's Crisis - 3232 +Delivering the #t4031094# - 3233 +The Clocktower Headache - 3234 +The Clock Workers' Batteries - 3235 +Assembling a Toy - 3236 +Rocky's Parts - 3237 +Mac the Mechanic's Maintenance Manual - 3238 +The Missing Mechanical Parts - 3239 +Scroll of Life - 3240 +Cleaning Up Helios Tower - 3241 +The Messenger of the Toy Palace 1 - 3242 +The Messenger of the Toy Palace 2 - 3243 +Disgruntled Roly-Poly Worker - 3244 +Spider's Out at Eos Tower - 3245 +A Mysterious Letter - 3246 +Rightful Donation Culture - 3247 +Operation Strategy 1 : Collect All the Eggs - 3248 +Operation Strategy 2 : Defeat the Monsters - 3249 +Operation Strategy 3: A Cute Baby Bird - 3250 +A Deal with the Broker - 3300 +Test from the Head of Zenumist Society - 3301 +Zenumist Cape - 3302 +Test from the Head of Alcadno Society - 3303 +Alcadno Cape - 3304 +Re-acquiring Zenumist Cape - 3305 +Re-acquiring Alcadno Cape - 3306 +Helping Out Bedin - 3307 +Getting in the Way of Alcadno - 3308 +An Incident, and the Missing Alchemist - 3309 +Carson's Experiment - 3310 +Clue - 3311 +Russellon's Items for Experiment - 3312 +Destroy the Roid - 3313 +Life Alchemy, and the Missing Alchemist - 3314 +Maed's Experiment - 3315 +Han the Broker's Info - 3316 +Dr. De Lang's Friend - 3317 +Parwen the Ghost - 3318 +Parwen's Lab - 3319 +What Parwen Knows - 3320 +Dr. De Lang, the Missing Alchemist - 3321 +Phyllia's Pendant - 3322 +Phyllia's Concern - 3323 +Ericsson's Ingredients - 3324 +A Sip of the Moon - 3325 +Keeny's Secret - 3326 +Ericsson's Ingredients for Medicine 2 - 3327 +A Sip of the Sun - 3328 +Keeny's Research on Roid - 3329 +Keeny's Research on Neo Huroid! - 3330 +Keeny's Research on D.Roid!! - 3331 +Keeny's Pal Humanoid A - 3332 +A Present for Keeny - 3333 +Humanoid A - 3334 +A Rose from the Snowfield - 3335 +Acquiring the Seed for the Snowfield Rose - 3336 +The Importance of Life Alchemy - 3337 +The Problems with Life Alchemy - 3338 +Dr. De Lang's Underground Study - 3339 +The Key to the Secret Book - 3340 +Dr. De Lang's Secret Notes - 3341 +The Truth About Dr. De Lang - 3342 +The Hidden Words - 3343 +The Secrets of Magatia - 3344 +The Black Magician's Magic Pentagram - 3345 +The Brutal Truth - 3346 +For Zenumist - 3347 +For Alcadno - 3348 +For Phyllia - 3349 +Re-acquiring Dr. De Lang's Notes - 3350 +Re-acquiring Dr. De Lang's Notes - 3351 +Re-acquiring Dr. De Lang's Notes - 3352 +What De Lang Wants - 3353 +De Lang's Potion - 3354 +The Memories of Humanoid A - 3355 +Who is De Lang? - 3356 +De Lang and Humanoid A - 3357 +Parwen's Pass - 3358 +Searching for the Master Key - 3359 +Verifying the Password - 3360 +Zenumist and the Ostracized Research - 3361 +Alcadno and the Ostracized Research - 3362 +Studying Frankenroid 1 - 3363 +Studying Frankenroid 2 - 3364 +Yulete's Request - 3365 +Making the Reagent - 3366 +Organizing the Lab Report - 3367 +Eliminating Obstacles - 3368 +Romeo's Present - 3369 +Romeo's Flowers - 3370 +Juliet's Feelings - 3371 +Sirin's Tailoring Methods - 3372 +Juliet's Response - 3373 +Writing Romeo's Letter - 3374 +Romeo's Love Letter - 3375 +Juliet is Impressed - 3376 +Han the Broker's Recipe - 3377 +Juliet's Lunchbox - 3378 +Romeo Proposes - 3379 +Allegro, the Master of the Rings - 3380 +The Unidentified Group - 3381 +Yulete's Reward - 3382 +Moren's Upset - 3383 +Gordon's Magic Iron - 3384 +Gordon's Warm Heart - 3385 +Chief Stan's Letter - 3400 +Dr. Kim's Comments : Blueprint for New Robot - 3401 +Dr. Kim's Comments : A Meeting with Chury - 3402 +Dr. Kim's Comments : A Meeting with Hoony - 3403 +Dr. Kim's Comments : A Meeting with Gunny - 3404 +An Important Robotic Part - 3405 +Delivering the Robotic Parts - 3406 +Retrieving the Robotic Parts - 3407 +Eliminating Aliens - 3408 +Where is Dogon's HQ? - 3409 +Hoony's Toothache - 3410 +Chief Gray's Sign - 3411 +Eliminating Grays - 3412 +Eliminating Chief Gray - 3413 +The History of Zeta Leticulan - 3414 +The Alarm Clock - 3415 +Assembling the Alarm Clock - 3416 +A Sleeping Monster - 3417 +The Completion of the Alarm Clock - 3418 +Trading with Alien Gray - 3419 +The Effort to Make-up - 3420 +Collecting Meteorite Samples - 3421 +Fuel for MT-09 - 3422 +The New Control Program - 3423 +Porter the Undependable - 3424 +Porter's Mistake - 3425 +The Brilliant Assistant - 3426 +Porter's Secret Letter - 3427 +Where is the Dropship? - 3428 +The Pilot's Whereabouts... - 3429 +Collecting 100 Mateon Tentacles - 3430 +Collecting 200 Mateon Tentacles - 3431 +Collecting 300 Mateon Tentacles - 3432 +Collecting 400 Mateon Tentacles - 3433 +Collecting 500 Mateon Tentacles - 3434 +Eliminating Mateon - 3435 +Eliminating Plateon - 3436 +Eliminating Plateon and Mecateon - 3437 +The Ore of Dark Crystal - 3438 +Where's the Power of Origin? - 3439 +Terminating the Dark Force. - 3440 +Help Kevin the Soldier's Vacation Plans - 3441 +A Chat with Nara the Tour Guide - 3442 +Recovering VIP Ticket to Florina Beach - 3443 +The Binding - 3444 +Free Spirit - 3445 +The Soul Collector - 3446 +Destroying the Power of Evil - 3447 +Mason the Collector - 3448 +Mason the Collector ? - 3449 +The Lost Piece of the VIP Ticket - 3450 +The Lost Piece of the VIP Ticket - 3451 +Blocktopus is an Alien? - 3452 +Zeno, the Formidable Enemy - 3453 +Wave Translator - 3454 +The Endangered Lives of Grays - 3455 +The Endangered Lives of Grays - 3456 +The Battle Against Zeno - 3457 +Revolutionary Defensive Wall Construction Plan - 3458 +Path to the Past - 3500 +The One Who Walks Down Memory Lane1 - 3501 +The One Who Walks Down Memory Lane2 - 3502 +The One Who Walks Down Memory Lane3 - 3503 +The One Who Walks Down Memory Lane4 - 3504 +The One Who Walks Down Memory Lane5 - 3505 +Lost Memory - 3506 +Memory Keeper - 3507 +The One Who Walks Down the Road of Regrets1 - 3508 +The One Who Walks Down the Road of Regrets2 - 3509 +The One Who Walks Down the Road of Regrets3 - 3510 +The One Who Walks Down the Road of Regrets4 - 3511 +The One Who Walks Down the Road of Regrets5 - 3512 +Frozen Emotions - 3513 +The Sorcerer Who Sells Emotions - 3514 +The One Who Walks Through the Road to Oblivion1 - 3515 +The One Who Walks Through the Road to Oblivion2 - 3516 +The One Who Walks Through the Road to Oblivion3 - 3517 +The One Who Walks Through the Road to Oblivion4 - 3518 +The One Who Walks Through the Road to Oblivion5 - 3519 +The Goddess' Blessing - 3520 +Force Field - 3521 +Beyond the Ruins - 3522 +In Search for the Lost Memory - 3523 +In Search for the Lost Memory - 3524 +In Search for the Lost Memory - 3525 +In Search for the Lost Memory - 3526 +In Search for the Lost Memory - 3527 +Breaking the Force Field - 3528 +In Search for the Lost Memory - 3529 +The One Who Walks Through the Road to Oblivion1 - 3530 +The One Who Walks Through the Road to Oblivion2 - 3531 +The One Who Walks Through the Road to Oblivion3 - 3532 +The One Who Walks Through the Road to Oblivion4 - 3533 +There's no reason to believe that yet, but we should check just in case. Go visit #b#p2140003##k and ask what happened to the Goddess' promise. He is the Record Keeper of everything, so he is the only one who would be able to tell you. - 3534 +The Goddess' Blessing - 3535 +Force Field - 3536 +Breaking the Force Field - 3537 +Beyond the Ruins - 3538 +Searching for Lost Memories - 3539 +Tae Gong's Love For His Wife - 3600 +The Brothers' Stack of Rice 1 - 3601 +The Brothers' Stack of Rice 2 - 3602 +The Brothers' Stack of Rice 3 - 3603 +The Brothers' Stack of Rice 4 - 3604 +Brotherly Love - 3605 +The Lost Seed - 3606 +Opening Nolbu's Gourd - 3607 +Opening Hongbu's Gourd - 3608 +The Seed That Swallow Lost - 3609 +Preparing to Eliminate Goblins - 3610 +Eliminate Goblins - 3611 +Chil Sung's Roasted Pork - 3612 +Chil Nam's Buckwheat Paste - 3613 +Kong Ji's Rice Wine - 3614 +Retrieving the Storybook : Hongbu and Nolbu - 3615 +Retrieving the Storybook : Kong Ji and Pat Ji - 3616 +Retrieving the Storybook : Brotherly Love - 3617 +Retrieving the Storybook : The Goblin Tale - 3618 +Pot with a Hole - 3619 +Extracting Artemesia - 3620 +The Wooden Hoe That Snapped - 3621 +Tiger-Hunting - 3622 +Grandma Yeon's Pot - 3623 +The Storybook on Brotherly Love - 3624 +The Storybook on Kong Ji and Pat Ji - 3625 +The Storybook on Hongbu and Nolbu (Hongbu) - 3626 +The Storybook on Hongbu and Nolbu (Nolbu) - 3627 +The Storybook on the Goblin Story - 3628 +The Kids That Became the Sun and the Moon - 3629 +Retrieving the Storybook : The Kids That Became the Sun and the Moon - 3630 +The Storybook on The Kids That Became the Sun and the Moon storybook - 3631 +Mr. Shim's Request - 3632 +Retrieving the Storybook : Shim Chung - 3633 +The Storybook on Shim Chung - 3634 +The Fox Hunt - 3635 +The Story of Axes - 3636 +Judging the Axe - 3637 +Retrieving the Storybook : The Story of Axes - 3639 +The Storybook on the Story of Axes - 3640 +Young Man Possessed by a Fox - 3641 +Chil Sung's Request - 3642 +Fox's Threat - 3643 +What the Blue King Goblin Wants - 3644 +What the Yellow King Goblin Wants - 3645 +What the Green King Goblin Wants - 3646 +Retrieve a Soul - 3647 +Secret Love Affair with Seal Meat - 3648 +Ito's Request - 3700 +Kumo's Request - 3701 +Yaku's Request - 3702 +Pam's Request - 3703 +Recipe for the Medicine - 3704 +Hero's Mark - 3705 +Dragon Squad's Mission - 3706 + The Last Hour of Horntail - 3707 +Red Tree - 3708 +Getting Advice from Grendel the Really Old 1 - 3709 +Getting Advice from Grendel the Really Old 2 - 3710 +Wyvern's Sudden Attack - 3711 +Recovering the Black Spirit - 3712 +A New Force Emerging - 3713 +The Remnants of Horned Tail... - 3714 +The Suspicious Wanderer - 3715 +The Wanderer's Whereabouts 1 - 3716 +The Wanderer's Whereabouts 2 - 3717 +Andy the Time Traveler - 3718 +Nex the Time Guard - 3719 +The First Clue - 3720 +Dangerous Slimes - 3721 +The Crying Girl's Sketchbook - 3722 +The Boy and the Girl - 3723 +Nex the Time Guard - 3724 +The Hidden Truth about the Past - 3725 +Policeman in Danger - 3726 +The Shelter Key - 3727 +Temporary Relief - 3728 +Nex the Time Guard - 3730 +Identity of the Missile - 3731 +Rambunctious Robots - 3732 +Survivor Search - 3733 +The Dangerous Android - 3734 +The Wreckage of the Missile - 3735 +Nex the Time Guard - 3736 +Central Robot Aufheben - 3737 +Disturbing the Army of Robots - 3738 +Isabella's Search - 3739 +What Was That I Saw? - 3740 +Nex the Time Guard - 3742 +The New and Improved, Oberon - 3743 +Defeat the Mavericks - 3744 +Nex the Time Guard - 3748 +Nibelung's Song - 3749 +No Gong's Teaching 1 - 3800 +No Gong's Teaching2 - 3801 +No Gong's Teaching3 - 3802 +The Lost Document - 3803 +Eliminating the Spirited Cats - 3804 +Eliminating the Spirited Monkeys - 3805 +Collecting Peach Seeds - 3806 +Intruder - The Herb Farm 1 - 3807 +Intruder - The Herb Farm 2 - 3808 +The Legendary Being's Scroll 1 - 3809 +The Legendary Being's Scroll 2 - 3810 +The Legendary Being's Scroll 3 - 3811 +Eliminating the Pirates - 3812 +The Outlaw in the Sea - 3813 +Pirate's Map - 3814 +Finding the Ingredients for Tae Sang - 3815 +Making the Body & Physics Medicine 1 - 3816 +Making Body & Physics Medicine2 - 3817 +Making Mind & Heart Medicine1 - 3818 +Making Mind & Heart Medicine2 - 3819 +Making Mastery Medicine - 3820 +Tae Soo Protecting the Peach Tree - 3821 +Do Gong's Swallow - 3822 +Swallow's Memory - 3823 +Tell Do Gong I Said Hi - 3824 +Swallow's Medicine - 3825 +Swallow Isn't Alone - 3826 +Tae Sang's Request - 3827 +An Evidence of Slaying the Captain - 3828 +Captain Lord Pirate - 3829 +Mr. Do's Book on Herbal Medicine - 3830 +No Gong's Test - 3831 +Do Gong's Test - 3832 +Gathering Up the Lacking Ingredients - 3833 +Eliminating the Escaped Pot - 3834 +Tae Soo's Account - 3835 +No Gong's Student - 3836 +Do Gong's Spell - 3837 +Defeat Tae Roon - 3838 +Tae Soo's Reward - 3839 +Weakening King Sage Cat - 3840 +Master Goblin's Call - 3841 +Do Gong's in Trouble - 3842 +Master Goblin's Questions - 3843 +Eliminating King Sage Cat - 3844 +The Rumor in the Sea of Fog - 3845 +Learning the Culture of Ariant - 3900 +Tigun the Guard at the Palace - 3901 +Queen's Make-up Kit - 3902 +Queen's Tea 1 - 3903 +Queen's Tea 2 - 3904 +Queen's Tea 3 - 3905 +Jiyur's Sister - 3906 +A Letter From the Sister - 3907 +A Present for His Sister - 3908 +Dancer's Ringing - 3909 +Sword Dance - 3910 +Making the Fancy Sword - 3911 +Deliver the Fancy Sword - 3912 +Schegerazade's Fear - 3913 +Borrowing the Book from Wiz - 3914 +Schegerazade's Storybook - 3915 +Schegerazade the Storyteller - 3916 +The Little Prince that Loves Roses - 3917 +The Little Prince that Loves the Stars - 3918 +Recovering the Book The Little Prince 1 - 3919 +Recovering the Book The Little Prince 2 - 3920 +A Request from a Member of the Sand Bandits?! 1 - 3921 +A Request from a Member of the Sand Bandits?! 2 - 3922 +A Request from a Member of the Sand Bandits?! 3 - 3923 +Sirin Speaks - 3924 +True or False - 3925 +Screwing the Red Scorpions - 3926 +The Existence of the Secret Organization - 3927 +The Man with a Bow - 3928 +Sejan's Test - 3929 +Sejan's Sand Bandits - 3930 +The Man with the Iron Hammer - 3931 +Ardin's Test - 3932 +Ardin's Sand Bandits - 3933 +The Lady with the Dagger - 3934 +Eleska's Test - 3935 +Eleska's Sand Bandits - 3936 +The True Identity of Sand Bandits - 3937 +First Mission - 3938 +Tigun's Hair - 3939 +Mission Complete! - 3940 +Stealing Queen's Order of Silk - 3941 +Byron's Recommendation Letter - 3942 +Byron's Recommendation Letter! - 3943 +Byron's Recommendation Letter!! - 3944 +Byron's Recommendation Letter!!! - 3945 +A Proper Reward for a Good Deed - 3946 +Byron's Recommendation! - 3947 +Sejan's Good Habit - 3948 +Jiyur's Palace Entry Pass - 3949 +Dealing with Tigun - 3950 +The Tree Cutter's Test - 3951 +The Bounty Hunt - 3952 +Convince Muhamad - 3953 +Defeat Deo - 3954 +In Search of the Long Lost Pyramid - 3955 +??? ???? 1 - 4000 +??? ???? 2 - 4001 +???? ??? - 4002 +??? ??? ?? - 4003 +? ?? ?? - 4004 +??? ??? ???? - 4005 +??? ???? - 4006 +??? ?? - 4007 +???? ?? - 4008 +??? ? - 4009 +??? ?? - 4010 +???? ???? - 4011 +???? ??? 1 - 4012 +???? ??? 2 - 4013 +??? ?? - 4014 +???? ?? - 4100 +?? ???? ?? - 4101 +??? ?? - 4102 +???? - 4103 +???? ??? ?? - 4104 +?? ???? ??? ?? - 4105 +???? ???? ??? - 4106 +??? ?? ??? ???? 1 - 4107 +??? ?? ??? ???? 2 - 4108 +???? ?? - 4109 +??? ?? - 4200 +??? ?? - 4201 +??? ?? ??? ???? - 4202 +??? ??? ?? - 4203 +??? ?? ??? ??? - 4204 +??? ???? ???? - 4205 +??? ?? - 4206 +??? ???? ???? - 4207 +?? ?? ?? ??? I - 4208 +?? ?? ?? ??? I I - 4209 +?? ????? ?? ??? - 4210 +????? ??? ????1 - 4211 +????? ??? ????2 - 4212 +????? ??? ????3 - 4213 +????? ??? ????4 - 4214 +????? ??? ????5 - 4215 +????? ??? ???? - 4216 +???? ? ?? ?? - 4217 +???? ? ?? ?? - 4218 +Kino Konoko's Concern - 4300 +Kino Konoko vs Fire Raccoon - 4301 +Hanako's Foxtail Muffler 1 - 4302 +Hanako's Foxtail Muffler 2 - 4303 +Hanako's Foxtail Coat - 4304 +Eliminating Dark Cloud Fox - 4305 +The Lantern at Mushroom Shrine - 4306 +Eliminating Ghosts - 4307 +Water Goblin's Cucumber - 4308 +Eliminating Blue Mushmom - 4309 +Rooney's Breaking News - 4437 +News Special Report - 4477 +Disappeared Santa Encyclopedia - 4478 +Santa Grandmother Finding - 4479 +Common Sense Of Santa - 4480 +Socks Creation Recipes - 4481 +Socks Actual Creation Action - 4482 +Socks Hanging - 4483 +Cliff's Request - 4484 +Torr's Whereabouts - 4485 +Santa Cat's request - 4486 +Delivery of Rina cleaning device - 4487 +Warm Milk Delivery - 4488 +Delivery the word Thank - 4489 +Bicho's snowman - 4490 +Clear the Rubbish - 4503 +Stop'em! - 4504 +Stop the Speeder! - 4505 +Technical Assignment - 4506 +Angie's Beloved Costume 1 - 4507 +Angie's Beloved Costume 2 - 4508 +Angie's Beloved Costume 3 - 4509 +The secret of the past - 4510 +Making the path to the sea - 4511 +The great secret reveals - 4512 +Fight for the future - 4513 +The Lost White Essence - 4522 +Return of Capt. Latanica - 4523 +A Bright and Sunny Day - 4541 +Too Hot! - 4542 +I am Bored! - 4543 +All taken away! - 4544 +Poor Blondie - 4545 +Running out of Wigs! - 4546 +Tires are missing! - 4547 +Oly Oly is back! - 4548 +Hunger calls - 4549 +I need Vitamin C - 4550 +My Lovely Scarf - 4551 +My Scarfs are Stolen! - 4552 +Gift for Dear Daddy - 4553 +Daddy's Birthday Party - 4554 +Unexpected Guest - 4555 +Grand Finale - 4556 +Lam wants to see the world - 4557 +Off to the City - 4558 +Gift for Brother - 4559 +Merry-go-round in Kampung - 4560 +Off to the Fantasy Theme Park - 4576 +Pet Instructor Test - 4646 +The Secret Method - 4647 +Robo Upgrade! - 4659 +Educating Smart Pets (Pet Summon) - 4660 +Educating Smart Pets (Speech by Itself) - 4661 +Naomi's Invitation 1 - 4675 +Naomi's Invitation 2 - 4676 +Welcome to New Leaf City Quiz 1 - 4900 +Welcome to New Leaf City Quiz 2 - 4901 +Welcome to New Leaf City Quiz 3 - 4902 +Welcome to New Leaf City Quiz 4 - 4903 +Welcome to New Leaf City Quiz 5 - 4904 +Welcome to New Leaf City Quiz 6 - 4905 +Welcome to New Leaf City Quiz 7 - 4906 +Welcome to New Leaf City Quiz 8 - 4907 +Welcome to New Leaf City Quiz 9 - 4908 +Welcome to New Leaf City Quiz 10 - 4909 +Welcome to New Leaf City Quiz 11 - 4910 +Welcome to New Leaf City Quiz 12 - 4911 +Urban Jungle - 4912 +Subani's Legacy - Discovery - 4913 +Subani's Legacy - Transgression - 4914 +Subani's Legacy - Deliverance - 4915 +Lost! - 4916 +ReVersal - 4917 +Featherweights - 4918 +Cleaning Up The Streets - 4919 +Urban Warrior - 4920 +Urban Jungle - Continued - 4921 +Cleaning Up The Streets - Continued - 4922 +Welcome to New Leaf City Quiz - END - 4923 +Brand Materia - 4924 +Brand Materia Continued - 4925 +Interstellar Relics - 4926 +Ancient Artifacts - 4927 +Jay's Curiosity - 4928 +Gwin's Thanks - 4929 +The Rememberer's Passion Part 1 - 4930 +The Rememberer's Passion Part 2 - 4931 +Grendel The Really Old's Glorious Days - 4932 +Cody's Confession - 4933 +Manji's Approval - 4934 +Blackbull's Mistake - 4935 +Bruce's Research - 4936 +Dances with Balrog's Barbarism Part 1 - 4937 +Dances with Balrog's Barbarism Part 2 - 4938 +Winston's Scheme Part 1 - 4939 +Winston's Scheme Part 2 - 4940 +A Word to the Wise - 4941 +The Past in the Present - 4942 +A Cold Hearth - 4943 +Eat This! - 4944 +Special Delivery - 4945 +Family Jewels - 4946 +A Lost Girl - 4947 +A Father's Love - 4948 +The M-Files - 4949 +File Under Incomplete - 4950 +The File Thickens Part 1 - 4951 +The Infernal Toy Machine - 4952 +In Her Likeness - 4953 +Reparations - 4954 +Psycho Jack - 4955 +Sophilia Doll - 4956 +Nightmare - 4957 +Halloween : Entering the house - 4958 +The File Thickens Part 2 - 4959 +Eat This! - 4960 +Smores No More - 4962 +Dinner Fixins' - 4963 +Game On! - 4964 +Game On! - 4965 +Game On! - 4966 +Game On! <7-Eleven> - 4967 +Game On! - 4968 +Game On! - 4969 +Game On! 2 - 4970 +Game On! 3 - 4971 +Game On! 4 - 4972 +Game On! 5 - 4973 +Game On! 2 - 4974 +Game On! 3 - 4975 +Game On! 4 - 4976 +Game On! 5 - 4977 +Game On! <7-Eleven> 2 - 4978 +Game On! <7-Eleven> 3 - 4979 +Game On! <7-Eleven> 4 - 4980 +Game On! <7-Eleven> 5 - 4981 +Game On! 2 - 4982 +Game On! 3 - 4983 +Game On! 4 - 4984 +Game On! 5 - 4985 +Game On! 2 - 4986 +Game On! 3 - 4987 +Game On! 4 - 4988 +Game On! 5 - 4989 +Game On! 2 - 4990 +Game On! 3 - 4991 +Game On! 4 - 4992 +Game On! 5 - 4993 +Little Suzy's X-Mas Dilemma - 4994 +The Spirit of Maplemas - 4995 +A Versal Tradition - 4996 +A Very Merry Maplemas - 4997 +Happy Versalmas to You - 4998 +Elpam's Gift - 4999 +Giant Swowman's Purple box - 5009 +Giant Snowman's Blue Box - 5010 +Giant Snowman's Red Box - 5011 +Giant Snowman's White Box - 5012 +Easter : Mad Bunny's Easter(Red) - 5069 +The Wandering Alchemist Eurek's New Skill - 6000 +Monster Riding - 6002 +Pheromone Perfume - 6003 +Lost Saddle - 6004 +Lost Perfume - 6005 +Silver Mane - 6006 +Dragon's Perfume Bottle - 6007 +Dragon Rider - 6008 +Dragon Rider - 6009 +Dragon Rider - 6010 +Dragon Rider - 6011 +Kyrin's Teaching - 6012 +Dragon Rider - 6013 +Ramain's Amazing Skills - 6014 +Keol's Order #1 - 6015 +Keol's Order #2 - 6016 +Keol's Order #3 - 6017 +Keol's Order #4 - 6018 +Keol's Order #5 - 6019 +Keol's Order #6 - 6020 +Keol's Order #7 - 6021 +Keol's Order #8 - 6022 +Keol's Order #9 - 6023 +Keol's Order #10 - 6024 +Keol's Order #11 - 6025 +Keol's Order #12 - 6026 +Keol's Special Order - 6027 +Abdullah VIII's Statement - 6028 +Meren's New Discovery - 6029 +Carson's Fundamentals of Alchemy - 6030 +Hughes the Fuse's Basic Theory of Science - 6031 +Meren's Class on the Actual Practice - 6032 +Meren's Second Round of Teaching - 6033 +What Meren Dropped - 6034 +The Owner of the Note - 6035 +A Surprise Outcome - 6036 +The Book of Invisible Ink - 6100 +The Ancient Book - 6101 +The Bowman's Ultimate Skill - 6102 +Shammos's Advice - 6103 +New Guess - 6104 +The One Who Remembers... - 6105 + Insignificant Being - 6106 +Spiritual Stone of Darkness - 6107 +Junior Balrog in a Different World - 6108 +Manji's Test - 6110 +The Dragon's Guardian - 6120 +Bahamut's Power 1 - 6121 +Bahamut's Power 2 - 6122 +Bahamut's Power 3 - 6123 +Bahamut's Completion - 6124 +Black Book - 6130 +Method of Contradiction - 6131 +Cold Flame - 6132 +Caron's Note - 6133 +Resurrection - 6134 +Return of the Dark Lord - 6140 + The Night Warrior - 6141 +The Great Warrior, Sayram - 6150 +Griffey's Necklace - 6151 +Singing Shield - 6152 +Sayram's Skill - 6153 +Robeira's Book - 6160 +A Magician's Story - 6161 + Another Crazy Genius?! - 6162 +Shammos! - 6163 +Grendel the Really Old's Apology - 6164 +Robeira's Intentions - 6165 +Robeira and Shammos - 6166 +Meteo Shower - 6167 +Blizzard - 6168 +Genesis - 6169 +A Shield's True Power - 6180 +The Plot to Kidnap Tylus! - 6190 +Spiruna's advice - 6191 +Protecting Tylus - 6192 +A Peculiar Request - 6200 +Shawn's fear - 6201 +Arec and Shadower - 6202 +Black Clouds... - 6210 + Building a Ventilation Fan - 6211 +Porter's Durable Battery - 6212 +The End of Attributes...? - 6220 + Inverse Attributes - 6221 +Theory on Inverse Attributes of Summoned Beings (Familiars) - 6222 + The Summoned Being's Structure - 6223 +Huckle's Spirit Pouch - 6224 + Switching Attributes - 6225 +Key to a Different World - 6226 +Maple marble - 6230 +Three winds - 6231 +Flame Bird - 6240 +Phoenix - 6241 +Frostprey - 6242 +Frostprey - 6243 +The Bowman's Inner Eye - 6250 +The Bowman's Inner Eye - 6251 +The Book of Ice - 6260 +A Mysterious Sentence - 6261 +The Snow Mountain's Ice Stone - 6262 + The Ultimate Icepick - 6263 +A Book of Fire - 6270 + A Mysterious Sentence - 6271 + Lava of the Abandoned Mine - 6272 +The Lava Mug - 6273 + The Holy Knight's Sword - 6280 +Whereabouts of the Grail - 6281 +The Forgotten Healing Power - 6290 +Magic of the Spirit - 6291 +Black Spirit's Healing Power1 - 6292 +Black Spirit's Healing Power2 - 6293 +The Forgotten Blessing Power - 6294 + Contract of the Spirit - 6295 +The Black Spirit's Blessing Power 1 - 6296 +The Black Spirit's Blessing Power 2 - 6297 +Carta's sin - 6300 + A Piece of Will - 6301 +Carta's Worn Bracelet - 6302 +Making a Mithril Bracelet - 6303 +Regained Will Power - 6304 +End of Attributes - 6310 +Inverse Attributes - 6311 +Theory on Inverse Attributes of Summoned Beings (Familiars) - 6312 + The Summoned Being's Structure - 6313 +Huckle's Spirit Pouch - 6314 +Switching Attributes - 6315 +Key to a Different World - 6316 + Maple Warrior Skill Book - 6320 +Maple Warrior Skill Book - 6321 +Maple Warrior Skill Book - 6322 + Maple Warrior Skill Book - 6323 +Maple Warrior Skill Book - 6324 +Maple Warrior Skill Book - 6325 +How to Improve Your Strength - 6330 +Presence of Mind - 6340 +Body of Steel - 6350 +The Study of Space-Time Transformation - 6360 +Papulatus' Key - 6361 +Papulatus in the Past - 6362 +A New Revelation - 6363 +How to Improve Your Strength - 6370 +Observe the Spirit Vikings - 6380 +Observe the Gigantic Spirit Vikings - 6390 +Jonathan's Court - 6400 +Mission Free the Monsters - 6410 +The Bowman's Road - 6700 +An Arrangement from the Goddess. - 6800 +Tylus' introduction letter - 6900 +Harmonia's first story - 6901 +Harmonia's second truth - 6902 +Harmonia's third story - 6903 + Hero's Quality - 6904 +Tatamo's Suggestion - 6905 +Robeira's introduction letter - 6910 +Gritto's first story - 6911 + Gritto's Second Story - 6912 +Gritto's Third Story - 6913 +A Hero's Quality - 6914 +Tatamo's Suggestion - 6915 + Rene's Introduction Letter - 6920 +Legor's First Story - 6921 +Legor's Second Truth - 6922 +Legor's Third Story - 6923 +Hero's Quality - 6924 +Tatamo's Suggestion - 6925 +Arec's Letter of Introduction - 6930 +Helin's First Story - 6931 + Helin's Second Truth - 6932 +Hellin's Third Story - 6933 + Hero's Quality - 6934 +Tatamo's Suggestion - 6935 +Pedro's Introduction - 6940 +Samuel's Revelation of the First Truth - 6941 +Samuel's Revelation of the Second Truth - 6942 +Samuel's Revelation of the Third Truth - 6943 +Attributes of a Hero - 6944 +Tatamo's Suggestion - 6945 +Protect Ludibrium - 7100 +The Replacement Time Energy - 7101 +The Time Sphere - 7102 +Papulatus - 7103 +A Piece of Crack - 7104 +The Lost Piece of Crack - 7105 +The Lost Medal - 7106 +The Lost Piece of Crack - 7107 +Papulatus's counterattack - 7109 +Moira's Whereabouts - 7300 +Secret Medicine for Transformation - 7301 + Badge of a Squad Member - 7302 +Making the Secret Medicine for Transformation - 7303 +New Life - 8000 +Grako's Request - 8002 +Grako's Request 2 - 8003 +Mariwaka's Request - 8004 +Mariwaka's Purse - 8005 +The Scarred Kitty - 8007 +Sakura's Request - 8008 +Learning to Speak the Kitty Language - 8009 +Dealing with Boss Kitty - 8010 +Sakura, the Kitty, and the Orange Marble - 8012 +Upgrading Zakum Armor - 8013 +Sakura's Crying - 8018 +I should talk to the Boss Kitty in kitty language. - 8019 +Yoona's Quiz on Shopping : Start - 8020 +Yoona's Quiz on Shopping 1 - 8021 +Yoona's Quiz on Shopping 2 - 8022 +Yoona's Quiz on Shopping 3 - 8023 +Yoona's Quiz on Shopping 4 - 8024 +Yoona's Quiz on Shopping 5 - 8025 +Read the Newspaper! - 8027 +Veggies are Awesome - 8028 +Actor Training - 8029 +Movie Star - 8030 +Protect Lucas's Farm - 8031 +War of Pang Pang - 8032 +Youthful Mariwaka - 8033 +Maya's Concerns 1 - 8034 +Maya's Concerns 2 - 8035 +Maya's Concerns 3 - 8036 +Lionel's Necklace 1 - 8037 +Lionel's Necklace 2 - 8038 +Lionel's Necklace 3 - 8039 +Lionel's Journey - 8040 +Monster Rumor Mill - 8041 +Fox So Foxy - 8042 +Lycanthrope - 8043 +Tsuri & the Gourmet Dish - 8047 +Arwen and Ellinia - 8048 +Sakura and the Seal - 8049 +Today's Schedule - 8050 +An Unknown Love - 8051 +Umi's Spiced Veggies - 8052 +Traveling Around Maple 1 - 8053 +Traveling Around Maple 2 - 8054 +Traveling Around Maple 3 - 8055 +Traveling Around Maple 4 - 8056 +Traveling Around Maple 5 - 8057 +Traveling Around Maple 6 - 8058 +Traveling Around Maple 7 - 8059 +Sakura and the Teddy Bear - 8060 +Doll in the Dark 1 - 8061 +Doll in the Dark 2 - 8062 +Soul in the Dark - 8064 +The Ghost Whereabout - 8065 +A Puppet - 8066 +The Man of Convention - 8067 +Ray of Light - 8068 +Tsuri's Special Seafood 1 - 8069 +Tsuri's Special Seafood 2 - 8070 +An Old Code - 8072 +2nd Code - 8073 +The Meaning of the Code - 8074 +Sabitrama's Life Work - 8075 +The Committee Challenges - 8076 +The Father of Modern Science - 8077 +Open Sesami - 8078 +Umi Needs Money - 8079 +Lazy Alien Grey - 8080 +The Arrogant Alien Gray - 8081 +Good Luck - 8082 +Porter's Challenge - 8083 +Sophia's Snack - 8084 +Todd's How-to-Hunt - 8142 +Pet's Evolution1 - 8184 +Pet's Evolution2 - 8185 +Pet's Re-Evolution - 8189 +Valentine's Day : Heart Chocolate - 8206 +Valentine's Day : Chocolate Basket - 8207 +Ancient Artifacts - 8213 +Summer Break: Cody's BBQ - Start - 8218 +Finding Jack - 8219 +Translated Communique - 8220 +The Mark of Heroism - 8221 +The Brewing Storm - 8222 +Storming the Castle - 8223 +The Fallen Woods - 8224 +The Right Path - 8225 +The Fallen Warriors - 8226 +Lost in Translation 1 - 8227 +Lost in Translation 2 - 8228 +Lost in Translation 3 - 8229 +Stemming the Tide - 8230 +Fool's Gold - 8231 +Fool's Gold. - 8232 +Rags to Riches - 8233 +Rags to Riches. - 8234 +One Step A-Head - 8235 +One Step A-Head. - 8236 +Catch a Bigfoot by the Toe - 8237 +Catch a Bigfoot by the Toe. - 8238 +Bounty Master - 8239 +Attendance Check - 8245 +Attendance Check - 8246 +Donate Your Notebook - 8247 +Maple 7th Day Market opens tomorrow! - 8248 +Maple 7th Day Market - 8249 +Helping the daughter of the poultry farm owner, Lazy Daisy - 8251 +Hatch the egg - 8254 +Lost Spirits - 8255 +Lost Spirits. - 8256 +Dinner Fixins' - 8257 +Game On! - 8258 +Game On! - 8259 +Game On! - 8260 +Game On! <7-Eleven> - 8261 +Game On! - 8262 +Game On! - 8263 +Game On! 2 - 8264 +Game On! 3 - 8265 +Game On! 4 - 8266 +Game On! 5 - 8267 +Game On! 2 - 8268 +Game On! 3 - 8269 +Game On! 4 - 8270 +Game On! 5 - 8271 +Game On! <7-Eleven> 2 - 8272 +Game On! <7-Eleven> 3 - 8273 +Game On! <7-Eleven> 4 - 8274 +Game On! <7-Eleven> 5 - 8275 +Game On! 2 - 8276 +Game On! 3 - 8277 +Game On! 4 - 8278 +Game On! 5 - 8279 +Game On! 2 - 8280 +Game On! 3 - 8281 +Game On! 4 - 8282 +Game On! 5 - 8283 +Game On! 2 - 8284 +Game On! 3 - 8285 +Game On! 4 - 8286 +Game On! 5 - 8287 +Little Suzy's X-Mas Dilemma - 8289 +The Spirit of Maplemas - 8290 +A Versal Tradition - 8291 +A Very Merry Maplemas - 8292 +Happy Versalmas to You - 8293 +Festival of Lights - Building the Altar - 8295 +A secret that Mr. Moneybags knows. - 8297 +In search of the Mind of Maple - 8298 +Chief Stan's Piece of Mind of Maple - 8299 +Find the Ghost-scaring Chinese Firecrackers - 8569 +Finding the Ghost - 8570 +2006 Easter : Easter Basket - 8700 +2006 Easter : Mad Bunny's Easter(Yellow) - 8701 +2006 Easter : Mad Bunny's Easter(Green) - 8713 +Anniversary : Birthday Present (Red) - 8800 +Anniversary : Cody's Quest - 8801 +Anniversary : Birthday Present (Blue) - 8802 +Independence Day : Cody's Barbecue Party - 8804 +Independence Day : Alien Invasion - 8805 +Nanuke and the Chair - 8806 +Thanksgiving : Turkey Yellow Egg hunt - 8821 +Thanksgiving : Turkey Green Egg hunt - 8822 +Thanksgiving : Pumpkin Pie - 8823 +Festival of Lights - Building the Altar - 8829 +Festival of Lights - Blessing the Festival - 8830 +Graham Cracked - 8832 +New Year's Wishes 1 - 8833 +New Year's Wishes 2 - 8834 +Festival of Lights - Blessing the Festival reward - 8843 +Amoria : The Sakura Garden 1 - 8848 +Amoria : The Sakura Garden 2 - Finishing Touches - 8849 +Amoria : Cupid's Courier - Beginner - 8850 +Amoria : Cupid's Courier - Warrior - 8851 +Amoria : Cupid's Courier - Magician - 8852 +Amoria : Cupid's Courier - Bowman - 8853 +Amoria : Cupid's Courier - Thief - 8854 +Amoria : Cupid's Courier - Beginner - 8855 +Amoria : Cupid's Courier - Warrior - 8856 +Amoria : Cupid's Courier - Magician - 8857 +Amoria : Cupid's Courier - Bowman - 8858 +Amoria : Cupid's Courier - Thief - 8859 +Amoria : Beauty or Beast! - 8860 +Amoria : Marriage - 8862 +Amoria : Red Dahlia - Warrior - 8863 +Amoria : Red Dahlia - Magician - 8864 +Amoria : Red Dahlia - Bowman - 8865 +Amoria : Red Dahlia - Thief - 8866 +Amoria : Circle of Trust 1 (The Unmarried Couple) - 8867 +Amoria : Circle of Trust 2 (A Bond is Forged) - 8868 +Spot On : An Interesting Chore - 8869 +Spot On : Go See Mr. Spot - 8870 +Circle of Trust - Repaired Ring - 8871 +Easter : Easter Basket - 8873 +Easter : Mad Bunny's Easter(Yellow) - 8874 +Easter : Mad Bunny's Easter(Green) - 8875 +2nd Anniversary : Birthday Present (Red) - 8879 +2nd Anniversary : Birthday Present (Blue) - 8880 +2nd Anniversary : Cody's Quest - 8881 +About the Amorian Challenge! - 8882 +Summer Break: Cody's BBQ - Start - 8885 +Summer Break: Cody's BBQ. - 8886 +Summer Break: Cody's BBQ.. - 8887 +Summer Break: Cody's BBQ... - 8888 +Deciphering the Scroll of Secrets - 9004 +Teo's reminiscence - 9011 +??? ?? ?? ?? - 9012 +Beat the Heat - 1st Stage - 9051 +Beat the Heat - 2nd Stage - 9052 +Beat the Heat - 3rd Stage - 9053 +Beat the Heat -1st Stage - 9054 +Beat the Heat - 2nd Stage - 9055 +Beat the Heat - 3rd Stage - 9056 +Beat the Heat -1st Stage - 9057 +Beat the Heat - 2nd Stage - 9058 +Beat the Heat - 3rd Stage - 9059 +????? : MapleStory - 9100 +Back to School Event : MapleStory - 9101 +????? : Wizet - 9110 +Back to School Event : Wizet - 9111 +????? : Nexon - 9120 +Back to School Event : Nexon - 9121 +????? : ??? ???? - 9130 +?? ?? ??? - 9140 +?? ??? ??? - 9141 +???? ?? - 9142 +??? ???? ???? ?? - 9143 +?? ??(??) ??? - 9150 +?? ???? ??? - 9151 +???? ??? - 9152 +??? ???? ???? ??? - 9153 +?? ??? ??? - 9154 +?? ??? ? ?? ??? - 9155 +??? ???? ???? ?? - 9156 +?? ?? 1. ??? ?? ?? - 9160 +?? ?? 2. ?? ?? ?? ?? - 9161 +?? ?? 3. ??? ?? - 9162 +?? ?? 4. ????? ?? - 9163 +?? ?? 5. ?? ?? - 9164 +?? ?? 6. ??? ?? ??? - 9165 +?? ?? 7. ?? ?? ?? - 9166 +?? ?? 8. ???? - 9167 +?? ?? 9. ??? ? - 9168 +?? ?? 10. ??? - 9169 +??? ?? - 9170 +??? ?? - 9171 +??? ? ?? - 9172 +??? ??? - 9173 +??? ?? - 9180 +???? ?? ???.. - 9181 +??? ? ?? - 9182 +??? ??? - 9183 +??? ?? - 9190 +??? ?? - 9191 +??? ? ?? - 9192 +??? ??? - 9193 +??? ???? - 9210 +?? ?! ?? ??! - 9220 +?? ?! ?? ??!! - 9230 +?? ?! ?? ??!!! - 9240 +Torr's Horn - 9260 +?? ?? - 9261 +???? ?? ?? - 9262 +??? ?? ?? - 9263 +???? ? ?? ?? - 9264 +??? ??? ?? ?? - 9265 +????? : HappyNewYear - 9270 +??? ?? : ??? ???? - 9280 +??? ?? : ?? ???? - 9281 +??? ?? : ?? - 9282 +??? ?? : ???? - 9283 +??? ?? : 4? ?? - 9284 +??? ???? - 9290 +??? ?? - 9291 +?? ???? ??? - 9292 +'???? ???'?? ????? - 9300 +'???'?? ????? - 9301 +'???'?? ????? - 9302 +'????'?? ????? - 9303 +???? ?? - 9304 +??? ???? ???? - 9305 +'???'?? ????? - 9306 +Valentine's Day : Heart Chocolate - 9310 +Valentine's Day : Chocolate Basket - 9311 +??? ??? ??? - 9320 +?? ?? - 9321 +??? ?? - 9322 +?????? 1000? ?? ?? - 9323 +?? ?? ?? - 9324 +???? ??? ??? - 9325 +????? ??? - 9330 +????? ?????? - 9331 +???? ??? - 9332 +??????? ?????? - 9333 +?????:???? - 9340 +?????:????? - 9341 +??? ??? - 9350 +??? ???! - 9351 +??? ???!! - 9352 +??? ? ??? - 9360 +???? ?? - 9370 +?? ?? ?? - 9371 +???? ?? ?? ???... - 9372 +???? ???? - 9380 +????? ??? ?? - 9381 +???? ??? ?? - 9382 +???? ??? ???? - 9383 +???? ??? ???? - 9384 +???? ???? - 9385 +MapleStory 3rd Anniversary Bonanza - 9386 +Jane's Permission - 9387 +Jane's Errands - 9388 +Party with Jane - 9389 +The Lost Maple Hat - 9390 +????? ???? ??? - 9391 +??? ???? ??? - 9392 +????? ?? ??? ?? - 9393 +??? ?? - 9394 +???? ?? ?? - 9395 +????? ???? - 9396 +????? ??? - 9397 +The Secrets Behind the Mundane Statue - 9398 +The Mysterious Monster Crystal Statue - 9399 +Maple GM's Congrats on the 3 year Anniversary - 9400 +???? ??? ?? - 9401 +???? ??? ?? - 9402 +???? ??? ?? - 9403 +???? ??? ?? - 9404 +???? ???? ?? - 9405 +???? ???? ?? - 9406 +???? ???? ?? - 9407 +???? ???? ?? - 9408 +???? ???? ?? - 9409 +???? ??? ?? - 9410 +???? ??? ?? - 9411 +Hughes Needs the Eraser - 9412 +A Revenge on Gray the Alien - 9413 +An Immovable Sword - 9414 +Hectagon Crystal Necklace and the Seal Cushion - 9415 +??? ?? ??? ?? - 9416 +??? ??-?? ????? - 9421 +??? ??-?? - 9422 +??? ??? ???? ? - 9423 +??? ??? ?? ?? - 9424 +??? ??? ??? ?? ??? 1 - 9425 +??? ??? ??? ?? ??? 2 - 9426 +??? ??? ?? ??? - 9427 +??? ??? ??? ?? - 9428 +??? ??? ??? ?? - 9429 +??? ??? ?? - 9430 +??? ??? ??-?? - 9431 +??? ??? ?? - 9432 +?? ?? ???? ?? 1?? - 9440 +?? ?? ???? ?? 2?? - 9441 +?? ?? ???? ?? 1?? - 9442 +?? ?? ???? ?? 2?? - 9443 +?? ?? ???? ?? 1?? - 9444 +?? ?? ???? ?? 2?? - 9445 +??? ?? ?? ?? 1 - 9450 +??? ?? ?? ?? 2 - 9451 +?? ??? ?? ???! - 9470 +?? ??? ?? ???!! - 9471 +??? ??? - 9472 +??? ??? - 9473 +????? ?? ?? - 9474 +????? ?? ?? - 9475 +??? ??? ?? - 9476 +??? ??? ?? - 9477 +??? ???? - 9490 +??? ?? - 9491 +??? ??(??) - 9492 +??? ?? - 9493 +?????? ??? ?? - 9494 +??? ?? ??? ? ?? - 9495 +???? ??? ?? ?? - 9496 +?? ???? ?? ?? - 9497 +?? ???? ?? - 9498 +???? ???? - 9499 +??? ?? ???! - 9503 +??? ?? ???!! - 9504 +??? ? ?? 1 - 9505 +??? ? ?? 2 - 9506 +??? ? ?? 3 - 9507 +??? ? ?? 4 - 9508 +??? ? ?? 5 - 9509 +??? ???? - 9510 +???? ???? - 9511 +???? ??? ?? - 9512 +??? ??? ?? - 9513 +??? ??? ??? ?? - 9514 +??? ?? ????! - 9520 +??? ?? ????!! - 9521 +?? ? ???! - 9522 +?? ? ???!! - 9523 +?? ?? ???! - 9524 +?? ?? ???!! - 9525 +??? ????! - 9526 +??? ?? ??!! - 9527 +??? ????!!! - 9528 +???? (11? 23?) - 9600 +???? (11? 24?) - 9601 +???? (11? 25?) - 9602 +???? (11? 26?) - 9603 +???? (11? 27?) - 9604 +???? (11? 28?) - 9605 +???? (11? 29?) - 9606 +???? (11? 30?) - 9607 +???? (12? 1?) - 9608 +???? (12? 2?) - 9609 +???? (12? 3?) - 9610 +???? (12? 4?) - 9611 +???? (12? 5?) - 9612 +???? (12? 6?) - 9613 +???? (12? 7?) - 9614 +???? (12? 8?) - 9615 +???? (12? 9?) - 9616 +???? (12? 10?) - 9617 +???? (12? 11?) - 9618 +???? (12? 12?) - 9619 +???? (12? 13?) - 9620 +???? (12? 14?) - 9621 +???? (12? 15?) - 9622 +???? (12? 16?) - 9623 +???? (12? 17?) - 9624 +???? - 9625 +??? ?? ?? ?? I - 9630 +??? ?? ?? ?? II - 9631 +??? ?? ?? ?? I - 9632 +??? ?? ?? ?? II - 9633 +??? ?? ?? ?? I - 9635 +??? ?? ?? ?? II - 9636 +??? ?? ?? ?? I - 9637 +??? ?? ?? ?? II - 9638 +?? ???? ???? - 9640 +?? ????? ??? - 9641 +????? ????? - 9642 +??? ??? ?? ????? - 9650 +??? ??? ?? ????? - 9651 +???? ????? - 9652 +?? ??? ?:??? ? - 9660 +???? ?:??? ?? - 9661 +???? ??:??? ?? - 9662 +??? ??? ??? ?:??? ?? - 9663 +????? ??:?? ??? - 9664 +Cody's Valentine - 9670 +??? ??? - 9671 +??? ?? - 9672 +????? ?? - 9680 +???? ??? 3? 5? - 9682 +???? ??? 3? 12? - 9683 +???? ??? 3? 19? - 9684 +???? ??? 3? 26? - 9685 +???? 2? 13? - 9690 +???? 2? 14? - 9691 +???? 2? 15? - 9692 +???? 2? 16? - 9693 +???? 2? 17? - 9694 +???? 2? 18? - 9695 +???? 2? 19? - 9696 +???? 2? 20? - 9697 +???? 2? 21? - 9698 +???? 2? 22? - 9699 +???? 2? 23? - 9700 +???? 2? 24? - 9701 +???? 2? 25? - 9702 +???? 2? 26? - 9703 +????? ???! - 9704 +????? ???? - 9705 +????? ???? - 9706 +????? ??? - 9710 +???? ????? - 9711 +????? ????? - 9712 +???? ????? - 9713 +???? ????? - 9714 +???? ??? 3? 6? - 9720 +???? ??? 3? 13? - 9721 +???? ??? 3? 20? - 9722 +???? ??? 3? 27? - 9723 +???? ??? 3? 1? - 9724 +???? ??? 3? 8? - 9725 +???? ??? 3? 15? - 9726 +???? ??? 3? 22? - 9727 +???? ??? 3? 29? - 9728 +To Fool a Liar - 9730 +To Fool a Liar - 9731 +To Fool a Liar - 9732 +Help out Gordon! - 9733 +Help out Gordon!! - 9734 +Help out Gordon!!! - 9735 +????? ??? - 9740 +????? ?? ??? - 9741 +????? ??? ?? ??? - 9742 +??? ?? - 9743 +???? ?? - 9744 +??? ?? ?? ??? - 9745 +??? ?? ?? ???! - 9746 +??? ?? ?? ???!! - 9747 +??? ?? - 9748 +4?? ?? ??? ??? - 9800 +?? ?? ??? - 9801 +?? ?? ??? - 9802 +???? ??? - 9803 +???? ??? - 9804 +???? ??? - 9805 +??? ??? ??? - 9806 +??? ??? ??? - 9807 +??? ??? ??? - 9808 +????? ??? - 9809 +???? ??? 4? 27? - 9810 +???? ??? 4? 29? - 9811 +???? ??? 5? 4? - 9812 +???? ??? 5? 6? - 9813 +???? ??? 5? 11? - 9814 +???? ??? 5? 13? - 9815 +???? ??? 5? 18? - 9816 +???? ??? 5? 20? - 9817 +???? ??? ??? ?? - 9818 +???? ??? ? - 9819 +????? ???? ?? - 9820 +????? ?? ??? ?? - 9821 +??? ?? - 9822 +???? ?? ?? - 9823 +????? ???? - 9824 +????? ??? - 9825 +????? ??? ??! - 9830 +????? ??? ??! - 9831 +????? ??? ??! - 9832 +????? ??? ??! - 9833 +????? ???? ??! - 9834 +????? ???? ??! - 9835 +????? ???? ??! - 9836 +????? ???? ??! - 9837 +????? ???? ??! - 9838 +????? ??? ??! - 9839 +Dr. Winston's Research - 9840 +Violent Monkeys - 9841 +Icarus's Mushroom Bites - 9842 +Garden of Three Shades - 9843 +Regulate the Star Pixies - 9844 +The Wailing White Fang - 9845 +The Clocktower - 9846 +Guard the Omega Sector - 9847 +A Small Pond - 9848 +No Gong's Test - 9849 +Do Gong's Test - 9850 +Snake Pit in the Swamp - 9851 +???? ??? - 9852 +Cassandra's Magic - 9860 +??? ??? ?? ? - 9861 +?? ?? ? ??? ?? - 9862 +??? ??? ?? ? - 9863 +?? ?? ? ??? ?? - 9864 +??? ?? - 9865 +??? ?? ?? - 9866 +??? ?? - 9867 +????? ??? - 9868 +??? ??? ?? - 9869 +???? 1500? ???? - 9870 +??? ?? - 9871 +???? ?? ??? - 9872 +??? ?? ?? ???? - 9873 +Growing a Sprout - 9875 +Magatia, the City of Alchemy - 9878 +??? ?? - 9879 +???? : ?? - 9880 +???? : ??? - 9881 +???? : ??? - 9882 +???? : ?? - 9883 +???? : ??? - 9884 +???? : ???? - 9885 +????? ?? - 9887 +??? ??? - 9889 +????? ?? - 9890 +????? ?? - 9891 +????? ?? - 9892 +????? ?? - 9893 +??? ??? - 9900 +???? ???? - 9901 +?? ???? - 9902 +??? ???? - 9903 +??? ???? - 9904 +??? ???? - 9905 +?? ???? - 9906 +???? ???? - 9907 +??? ???? - 9908 +???? ???? - 9909 +????? ?? - 9920 +??? ?? ?? - 9921 +???? ?? - 9922 +Collect Pumpkin Pieces - 9923 +???? ??? ??? ??! - 9924 +???? ??? ??? ??!! - 9925 +???? ??? ??? ??!!! - 9926 +?????? ?? - 9927 +??? ?? - 9928 +???? ??? - 9929 +??? ?? - 9930 +????? ??? - 9931 +????? ??? - 9932 +?? ?? - 9933 +???? ?? - 9934 +????? ?? - 9935 +??? ?? - 9936 +?? ??? ?? ???? - 9937 +??? ???? ?? - 9938 +?? ??? ? ?? - 9939 +??? ? - 9940 +??? ?? - 9941 +???? - 9942 +??? ?? - 9943 +??? ?? - 9944 +???? - 9945 +???? ??? - 9946 +??? ???????. - 9947 +?? ??? ??? - 9950 +...Pirates!? - 9951 +?? ???? ?? - 9952 +???? ???? - 9953 +????? ??? - 9954 +???? ???? - 9955 +????? ???? - 9960 +?? ???? - 9961 +??? ??? ??? - 9962 +??? ??? ?? - 9963 +??? ?? - 9965 +???? ???? - 9970 +????? ?????? - 9975 +Tienk's Monster Card - 9980 +4 Year Anniversary Level Up event - 9981 +5?? ?? - 9982 +5?? ?? ??? - 9983 +Putting the Maple Leaf in my mouth... - 9984 +Making Maple Syrup - 9985 +Cassandra's Latest Information - 9986 +Materials for the Mysterious Fabric - 9987 +Francois' Latest Work - 9988 +Gaga's Maple Leaf - 9990 +??? ?? - 9991 +Vanished Mysterious Fabric - 9992 +Repairing the Maple Cape - 9994 +Alcaster's Advice - 9996 +???MS-07 - 9997 +?????? - 9999 \ No newline at end of file diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml index d11e7eb3df..6bd1c4fef3 100644 --- a/nbproject/private/private.xml +++ b/nbproject/private/private.xml @@ -3,29 +3,28 @@ - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/PlayerLoggedinHandler.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/TakeDamageHandler.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/command/Commands.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/maps/HiredMerchant.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/MapleStatEffect.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/inventory/Item.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/scripts/npc/9030000.js - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/maps/MapleMapObject.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/constants/ExpTable.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/RecvOpcode.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/tools/data/input/GenericLittleEndianAccessor.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/maps/MapleHiredMerchant.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/PacketProcessor.java file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/constants/ServerConstants.java file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/world/World.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/worker/HiredMerchantWorker.java file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/FredrickHandler.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/OwlWarpHandler.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/RemoteStoreHandler.java file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/PlayerInteractionHandler.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/inventory/MapleInventory.java file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/tools/MaplePacketCreator.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/HiredMerchantRequest.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/AutoAssignHandler.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/inventory/ItemFactory.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/Server.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/scripting/npc/NPCConversationManager.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/UseCashItemHandler.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/UseOwlOfMinervaHandler.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/MapleTrade.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/MapleInventoryManipulator.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/MapleMiniGame.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/MaplePlayerShop.java file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/MapleCharacter.java - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/maps/MapleMap.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/MapleClient.java file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/Channel.java + file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/tools/data/input/LittleEndianAccessor.java diff --git a/scripts/map/onUserEnter/100000006.js b/scripts/map/onUserEnter/100000006.js new file mode 100644 index 0000000000..0c7e9cb355 --- /dev/null +++ b/scripts/map/onUserEnter/100000006.js @@ -0,0 +1,16 @@ +importPackage(Packages.server.life); + +function start(ms){ + + if(ms.getQuestStatus(2175) == 1){ + var mobId = 9300156; + var player = ms.getPlayer(); + var map = player.getMap(); + + if(map.getMonsterById(mobId) != null){ + return; + } + + map.spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(mobId), new java.awt.Point(-1027, 216)); + } +} \ No newline at end of file diff --git a/scripts/map/onUserEnter/677000001.js b/scripts/map/onUserEnter/677000001.js new file mode 100644 index 0000000000..0c5832a3e6 --- /dev/null +++ b/scripts/map/onUserEnter/677000001.js @@ -0,0 +1,15 @@ +importPackage(Packages.server.life); + +function start(ms) { + + var mobId = 9400612; + var player = ms.getPlayer(); + var map = player.getMap(); + + if(map.getMonsterById(mobId) != null){ + return; + } + + map.spawnMonsterOnGroundBelow(MapleLifeFactory.getMonster(mobId), new java.awt.Point(461, 61)); + player.message("Marbas has appeared!"); +} \ No newline at end of file diff --git a/scripts/npc/1092007.js b/scripts/npc/1092007.js index 46ba006425..b2b9ec63b9 100644 --- a/scripts/npc/1092007.js +++ b/scripts/npc/1092007.js @@ -1,31 +1,51 @@ -/* - This file is part of the OdinMS Maple Story Server - Copyright (C) 2008 Patrick Huy - Matthias Butz - Jan Christian 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 . -*/ - /* NPC: Muirhat - Nautilus' Port -Created By: Cyndicate, shortened by Moogra -Function: No specific function, useless text. +Created By: Kevin +Function: When on the quest, he warps player to Black Magician's Disciple */ +var status; + function start() { - cm.sendOk("The Black Magician and his followers. Kyrin and the Crew of Nautilus. \n They'll be chasing one another until one of them doesn't exist, that's for sure."); - cm.dispose(); + + status = -1; + action(1, 0, 0); +} + +function action(mode, type, selection){ + if (mode == -1){ + cm.dispose(); + } + else{ + if (mode == 0 && status == 0){ + cm.dispose(); + return; + } + + if (mode == 1) + status++; + else + status--; + + if (status == 0){ + if (cm.getQuestStatus(2175) == 1){ + if (cm.getPlayer().canHold(2030019)){ + cm.sendOk("Please take this #b#t2030019##k, it will make your life a lot easier. #i2030019#"); + cm.gainItem(2030019, 1); + } + else{ + cm.sendOk("No free inventory spot available. Please make room in your USE inventory first."); + cm.dipose(); + } + } + else{ + cm.sendOk("The Black Magician and his followers. Kyrin and the Crew of Nautilus. \n They'll be chasing one another until one of them doesn't exist, that's for sure."); + cm.dispose(); + } + } + else if (status == 1){ + cm.warp(100000006); + cm.dispose(); + } + } } \ No newline at end of file diff --git a/scripts/npc/1094002.js b/scripts/npc/1094002.js index fffe880c6f..e924dc8ca5 100644 --- a/scripts/npc/1094002.js +++ b/scripts/npc/1094002.js @@ -19,14 +19,13 @@ along with this program. If not, see . */ /* - Author: XxOsirisxX (BubblesDev 0.75) + Author: Kevin (DietStory v1.02) NPC: Bush - Abel Glasses Quest */ var rolled = 0; function start(mode, type, selection){ - //cm.sendGetText("Do you want to obtain a glasses?"); if(!cm.isQuestStarted(2186)) { cm.sendOk("Just a pile of boxes, nothing special..."); cm.dispose(); @@ -46,6 +45,5 @@ function action(mode, type, selection) { } else cm.sendOk("You #balready have#k the glasses that was here!"); - //cm.saveSquadMembers(cm.getText()); cm.dispose(); } \ No newline at end of file diff --git a/scripts/npc/1094003.js b/scripts/npc/1094003.js index 0709c55b98..e924dc8ca5 100644 --- a/scripts/npc/1094003.js +++ b/scripts/npc/1094003.js @@ -19,17 +19,31 @@ along with this program. If not, see . */ /* - Author: XxOsirisxX (BubblesDev 0.75) + Author: Kevin (DietStory v1.02) NPC: Bush - Abel Glasses Quest */ +var rolled = 0; + function start(mode, type, selection){ - cm.sendGetText("Do you want to obtain a glasses?"); + if(!cm.isQuestStarted(2186)) { + cm.sendOk("Just a pile of boxes, nothing special..."); + cm.dispose(); + return; + } + + cm.sendNext("Do you want to obtain a glasses?"); } function action(mode, type, selection) { - if(!(cm.haveItem(4031853) || cm.haveItem(4031854) || cm.haveItem(4031855))) - cm.gainItem(4031854, 1); - cm.saveSquadMembers(cm.getText()); + if(!(cm.haveItem(4031853) || cm.haveItem(4031854) || cm.haveItem(4031855))) { + rolled = Math.floor(Math.random() * 3); + + if(rolled == 0) cm.gainItem(4031853, 1); + else if(rolled == 1) cm.gainItem(4031854, 1); + else cm.gainItem(4031855, 1); + } + else cm.sendOk("You #balready have#k the glasses that was here!"); + cm.dispose(); } \ No newline at end of file diff --git a/scripts/npc/1094004.js b/scripts/npc/1094004.js index 0709c55b98..e924dc8ca5 100644 --- a/scripts/npc/1094004.js +++ b/scripts/npc/1094004.js @@ -19,17 +19,31 @@ along with this program. If not, see . */ /* - Author: XxOsirisxX (BubblesDev 0.75) + Author: Kevin (DietStory v1.02) NPC: Bush - Abel Glasses Quest */ +var rolled = 0; + function start(mode, type, selection){ - cm.sendGetText("Do you want to obtain a glasses?"); + if(!cm.isQuestStarted(2186)) { + cm.sendOk("Just a pile of boxes, nothing special..."); + cm.dispose(); + return; + } + + cm.sendNext("Do you want to obtain a glasses?"); } function action(mode, type, selection) { - if(!(cm.haveItem(4031853) || cm.haveItem(4031854) || cm.haveItem(4031855))) - cm.gainItem(4031854, 1); - cm.saveSquadMembers(cm.getText()); + if(!(cm.haveItem(4031853) || cm.haveItem(4031854) || cm.haveItem(4031855))) { + rolled = Math.floor(Math.random() * 3); + + if(rolled == 0) cm.gainItem(4031853, 1); + else if(rolled == 1) cm.gainItem(4031854, 1); + else cm.gainItem(4031855, 1); + } + else cm.sendOk("You #balready have#k the glasses that was here!"); + cm.dispose(); } \ No newline at end of file diff --git a/scripts/npc/1094005.js b/scripts/npc/1094005.js index 0709c55b98..e924dc8ca5 100644 --- a/scripts/npc/1094005.js +++ b/scripts/npc/1094005.js @@ -19,17 +19,31 @@ along with this program. If not, see . */ /* - Author: XxOsirisxX (BubblesDev 0.75) + Author: Kevin (DietStory v1.02) NPC: Bush - Abel Glasses Quest */ +var rolled = 0; + function start(mode, type, selection){ - cm.sendGetText("Do you want to obtain a glasses?"); + if(!cm.isQuestStarted(2186)) { + cm.sendOk("Just a pile of boxes, nothing special..."); + cm.dispose(); + return; + } + + cm.sendNext("Do you want to obtain a glasses?"); } function action(mode, type, selection) { - if(!(cm.haveItem(4031853) || cm.haveItem(4031854) || cm.haveItem(4031855))) - cm.gainItem(4031854, 1); - cm.saveSquadMembers(cm.getText()); + if(!(cm.haveItem(4031853) || cm.haveItem(4031854) || cm.haveItem(4031855))) { + rolled = Math.floor(Math.random() * 3); + + if(rolled == 0) cm.gainItem(4031853, 1); + else if(rolled == 1) cm.gainItem(4031854, 1); + else cm.gainItem(4031855, 1); + } + else cm.sendOk("You #balready have#k the glasses that was here!"); + cm.dispose(); } \ No newline at end of file diff --git a/scripts/npc/1094006.js b/scripts/npc/1094006.js index 0709c55b98..e924dc8ca5 100644 --- a/scripts/npc/1094006.js +++ b/scripts/npc/1094006.js @@ -19,17 +19,31 @@ along with this program. If not, see . */ /* - Author: XxOsirisxX (BubblesDev 0.75) + Author: Kevin (DietStory v1.02) NPC: Bush - Abel Glasses Quest */ +var rolled = 0; + function start(mode, type, selection){ - cm.sendGetText("Do you want to obtain a glasses?"); + if(!cm.isQuestStarted(2186)) { + cm.sendOk("Just a pile of boxes, nothing special..."); + cm.dispose(); + return; + } + + cm.sendNext("Do you want to obtain a glasses?"); } function action(mode, type, selection) { - if(!(cm.haveItem(4031853) || cm.haveItem(4031854) || cm.haveItem(4031855))) - cm.gainItem(4031854, 1); - cm.saveSquadMembers(cm.getText()); + if(!(cm.haveItem(4031853) || cm.haveItem(4031854) || cm.haveItem(4031855))) { + rolled = Math.floor(Math.random() * 3); + + if(rolled == 0) cm.gainItem(4031853, 1); + else if(rolled == 1) cm.gainItem(4031854, 1); + else cm.gainItem(4031855, 1); + } + else cm.sendOk("You #balready have#k the glasses that was here!"); + cm.dispose(); } \ No newline at end of file diff --git a/scripts/npc/9201002.js b/scripts/npc/9201002.js index 82ce780301..2ebeae654a 100644 --- a/scripts/npc/9201002.js +++ b/scripts/npc/9201002.js @@ -19,7 +19,34 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ +/* NPC Base + Map Name (Map ID) + Extra NPC info. + */ + +var status; + function start() { - cm.warp(109030001, 0); - cm.dispose(); + status = -1; + action(1, 0, 0); +} + +function action(mode, type, selection) { + if (mode == -1) { + cm.dispose(); + } else { + if (mode == 0 && type > 0) { + cm.dispose(); + return; + } + if (mode == 1) + status++; + else + status--; + + if(status == 0) { + cm.sendOk("Wedding is currently closed."); + cm.dispose(); + } + } } \ No newline at end of file diff --git a/scripts/npc/9201008.js b/scripts/npc/9201008.js new file mode 100644 index 0000000000..2ebeae654a --- /dev/null +++ b/scripts/npc/9201008.js @@ -0,0 +1,52 @@ +/* + This file is part of the OdinMS Maple Story Server + Copyright (C) 2008 Patrick Huy + Matthias Butz + Jan Christian Meyer + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation version 3 as published by + the Free Software Foundation. You may not use, modify or distribute + this program under any other version of the GNU Affero General Public + License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ +/* NPC Base + Map Name (Map ID) + Extra NPC info. + */ + +var status; + +function start() { + status = -1; + action(1, 0, 0); +} + +function action(mode, type, selection) { + if (mode == -1) { + cm.dispose(); + } else { + if (mode == 0 && type > 0) { + cm.dispose(); + return; + } + if (mode == 1) + status++; + else + status--; + + if(status == 0) { + cm.sendOk("Wedding is currently closed."); + cm.dispose(); + } + } +} \ No newline at end of file diff --git a/scripts/npc/9201012.js b/scripts/npc/9201012.js new file mode 100644 index 0000000000..2ebeae654a --- /dev/null +++ b/scripts/npc/9201012.js @@ -0,0 +1,52 @@ +/* + This file is part of the OdinMS Maple Story Server + Copyright (C) 2008 Patrick Huy + Matthias Butz + Jan Christian Meyer + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation version 3 as published by + the Free Software Foundation. You may not use, modify or distribute + this program under any other version of the GNU Affero General Public + License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ +/* NPC Base + Map Name (Map ID) + Extra NPC info. + */ + +var status; + +function start() { + status = -1; + action(1, 0, 0); +} + +function action(mode, type, selection) { + if (mode == -1) { + cm.dispose(); + } else { + if (mode == 0 && type > 0) { + cm.dispose(); + return; + } + if (mode == 1) + status++; + else + status--; + + if(status == 0) { + cm.sendOk("Wedding is currently closed."); + cm.dispose(); + } + } +} \ No newline at end of file diff --git a/scripts/npc/9201042.js b/scripts/npc/9201042.js index 0b7d73002a..e2c8d7d993 100644 --- a/scripts/npc/9201042.js +++ b/scripts/npc/9201042.js @@ -19,7 +19,91 @@ You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ +/* Mr. Sandman + Amoria - Amoria (680000000) + AmoriaPQ Extras (get wish tickets in AmoriaPQ bonus stage) + + Yellow Wish Ticket - Lv1 ~ 49 + Green Wish Ticket - Lv50 ~ 119 + Blue Wish Ticket - Lv120+ + */ + +var wishPrizes = [2000000, 2010004, 2020011, 2000004, 2000006, 2022015, 2000005, 1082174, 1002579, 1032039, 1002578, 1002580, 1002577, 1102078]; +var wishPrizesQty = [10, 10, 5, 5, 5, 5, 10, 1, 1, 1, 1, 1, 1, 1]; +var wishPrizesCst = [10, 15, 20, 30, 30, 50, 100, 400, 450, 500, 500, 530, 550, 600]; + +var slctTicket; +var amntTicket; + +var sel; +var advance = true; + +var status; + +function getTierTicket(level) { + if(level < 50) { + return 4031543; + } else if(level < 120) { + return 4031544; + } else { + return 4031545; + } +} + function start() { - cm.getPlayer().getStorage().sendStorage(cm.getClient(), 9201042); - cm.dispose(); + slctTicket = getTierTicket(cm.getPlayer().getLevel()); + amntTicket = cm.getItemQuantity(slctTicket); + + status = -1; + action(1, 0, 0); +} + +function action(mode, type, selection) { + if (mode == -1) { + cm.dispose(); + } else { + if (mode == 0 && type > 0) { + cm.dispose(); + return; + } + if (mode == 1 && advance) + status++; + else + status--; + + advance = true; + + if(status == 0) { + cm.sendNext("Hi there, how is it going? Since you're passing by Amoria, have you heard about the event my brother Amos is hosting? It is the #bAmorian Challenge#k, an event for everyone above level 40.\r\n\r\nThere, you may find the #i4031543# #i4031544# #i4031545# #bWish Tickets#k that can be brought here to redeem prizes."); + } else if(status == 1) { + var listStr = ""; + for(var i = 0; i < wishPrizes.length; i++) { + listStr += "#b#L" + i + "#" + wishPrizesQty[i] + " #z" + wishPrizes[i] + "##k"; + listStr += " - " + wishPrizesCst[i] + " wish tickets"; + listStr += "#l\r\n"; + } + + cm.sendSimple("You currently have #b" + amntTicket + " #i" + slctTicket + "# #t" + slctTicket + "##k.\r\n\r\nPurchase a prize:\r\n\r\n" + listStr); + } else if(status == 2) { + sel = selection; + + if(amntTicket < wishPrizesCst[selection]) { + cm.sendPrev("You will need #b" + wishPrizesCst[selection] + " #t" + slctTicket + "##k to purchase that! If you want this, come back another time when you have all the tickets at hand."); + advance = false; + } else { + cm.sendYesNo("You have selected #b" + wishPrizesQty[selection] + " #z" + wishPrizes[selection] + "##k, that will require #b" + wishPrizesCst[selection] + " #t" + slctTicket + "##k. Will you purchase it?"); + } + } else { + if(cm.canHold(wishPrizes[sel], wishPrizesQty[sel])) { + cm.gainItem(wishPrizes[sel], wishPrizesQty[sel]); + cm.gainItem(slctTicket, -wishPrizesCst[sel]); + + cm.sendOk("There you go, have a good day!"); + } else { + cm.sendOk("Please have a slot available on your inventory before claiming the item."); + } + + cm.dispose(); + } + } } \ No newline at end of file diff --git a/scripts/npc/9201129.js b/scripts/npc/9201129.js new file mode 100644 index 0000000000..9503c827ef --- /dev/null +++ b/scripts/npc/9201129.js @@ -0,0 +1,61 @@ +/* + Demon's Doorway + Marbas the Demon! Quest + Victoria Road: The Tree That Grew III +*/ + +var status; + +function start(){ + status = -1; + action(1, 0, 0); +} + +function action(mode, type, selection){ + if (mode == -1){ + cm.dispose(); + } + else{ + if (mode == 0 && status ==0){ + cm.dispose(); + return; + } + + if (mode == 1) + status++; + else + status--; + + if (status == 0){ + cm.sendNext("#r\t[Requirements to Enter]\r\n\r\n\t\t1.#k Job must be Magician or Blaze Wizard.\r\n\t\t#r2.#k Must be under level 40.\r\n\t\t#r3.#k Must have #b#t4032495##k."); + } + else if (status == 1){ + var jobId = cm.getJobId(); + + if ((jobId >= 200 && jobId <= 232) || (jobId >= 1100 && jobId <= 1112)){ + if (cm.getLevel() < 40){ + if (cm.hasItem(4032495)){ + cm.sendYesNo("#kAll conditions have been satisfied. Do you wish to enter?"); + } + else{ + cm.sendOk("\t\tYou do not have #b#t4032495# #i4032495#"); + cm.dispose(); + } + } + else{ + cm.sendOk("\tYour #blevel#k is too high."); + cm.dispose(); + } + } + else{ + cm.sendOk("\tThis is not for you! #rBegone#k you fool!"); + cm.dispose(); + } + } + else if (status == 2){ + cm.warp(677000000, 2); + + cm.dispose(); + } + } +} \ No newline at end of file diff --git a/scripts/npc/commands.js b/scripts/npc/commands.js index 7b5376f36d..99b71c9502 100644 --- a/scripts/npc/commands.js +++ b/scripts/npc/commands.js @@ -99,6 +99,7 @@ function writeSolaxiaCommandsLv3() { //GM comm_cursor = comm_lv3; desc_cursor = desc_lv3; + addCommand("fly", ""); addCommand("spawn", ""); addCommand("mutemap", ""); addCommand("checkdmg", ""); diff --git a/scripts/portal/gotocastle.js b/scripts/portal/gotocastle.js index b7f081efd5..e645218d0b 100644 --- a/scripts/portal/gotocastle.js +++ b/scripts/portal/gotocastle.js @@ -1,5 +1,8 @@ function enter(pi) { if (pi.isQuestActive(2324)) { + var player = pi.getPlayer(); + player.gainExp(3300 * player.getExpRate()); + pi.forceCompleteQuest(2324); pi.removeAll(2430015); pi.playerMessage(5, "Quest complete."); diff --git a/scripts/portal/obstacle.js b/scripts/portal/obstacle.js new file mode 100644 index 0000000000..133c27ce8e --- /dev/null +++ b/scripts/portal/obstacle.js @@ -0,0 +1,18 @@ +/* + Author: Kevin + Map: Mushroom Castle - Deep Inside Mushroom Forest (106020300) + Right Portal + */ + + function enter(pi){ + if (pi.isQuestCompleted(2316)){ + if (pi.hasItem(2430014)){ + pi.gainItem(2430014, -1 * pi.getPlayer().getItemQuantity(2430014, false)); + } + + pi.warp(106020400, 2); + return true; + } + + return false; + } \ No newline at end of file diff --git a/scripts/quest/2251.js b/scripts/quest/2251.js new file mode 100644 index 0000000000..37272f856b --- /dev/null +++ b/scripts/quest/2251.js @@ -0,0 +1,21 @@ +/* + Author: Kevin + Quest: Zombie Mushroom Signal 3 (2251) + NPC: The Rememberer (1061011) + Item: Recording Charm (4032399) +*/ + +function end(mode, type, selection) { + + if(!qm.haveItem(4032399, 20)) { + qm.sendOk("Please bring me 20 #b#t4032399##k... #i4032399#"); + } + else { + qm.gainItem(4032399, -20); + qm.sendOk("Oh, you brought 20 #b#t4032399##k! Thank you."); + qm.gainExp(8000 * qm.getPlayer().getExpRate()); + qm.forceCompleteQuest(); + } + + qm.dispose(); +} \ No newline at end of file diff --git a/sql/db_drops.sql b/sql/db_drops.sql index e9cb6eec55..a7cced0499 100644 --- a/sql/db_drops.sql +++ b/sql/db_drops.sql @@ -19773,8 +19773,13 @@ USE `maplesolaxia`; (9400300, 2290045, 1, 1, 0, 10000), (9400121, 2290081, 1, 1, 0, 10000), (9400014, 2290087, 1, 1, 0, 10000), -(9400120, 2290109, 1, 1, 0, 10000); - +(9400120, 2290109, 1, 1, 0, 10000), +(3210100, 4001000, 1, 1, 2017, 20000), +(4300013, 4000538, 1, 1, 2288, 400000), +(2130100, 4001367, 1, 1, 28257, 10000), +(1110100, 4001369, 1, 1, 28259, 10000), +(1210101, 4001370, 1, 1, 28260, 10000), +(1110101, 4001371, 1, 1, 28261, 10000); # (dropperid, itemid, minqty, maxqty, questid, chance) # delete item drops from other mobs named Freezer @@ -21078,6 +21083,29 @@ USE `maplesolaxia`; (9102001, 2020002, 2, -1), (2002018, 4161014, 1, 3099); + # adding wish tickets on APQ boxes + INSERT INTO `reactordrops` (`reactorid`, `itemid`, `chance`, `questid`) VALUES + (6702003, 4031543, 1, -1), + (6702003, 4031544, 2, -1), + (6702004, 4031544, 1, -1), + (6702004, 4031545, 2, -1), + (6702005, 4031543, 2, -1), + (6702005, 4031545, 1, -1), + (6702006, 4031543, 1, -1), + (6702006, 4031544, 2, -1), + (6702007, 4031544, 1, -1), + (6702007, 4031545, 2, -1), + (6702008, 4031543, 2, -1), + (6702008, 4031545, 1, -1), + (6702009, 4031543, 1, -1), + (6702009, 4031544, 2, -1), + (6702010, 4031544, 1, -1), + (6702010, 4031545, 2, -1), + (6702011, 4031543, 1, -1), + (6702011, 4031545, 2, -1), + (6702012, 4031543, 2, -1), + (6702012, 4031544, 1, -1); + # updates info for all cards on monster book DROP TABLE `monstercarddata`; CREATE TABLE IF NOT EXISTS `monstercarddata` ( diff --git a/sql/db_shopupdate.sql b/sql/db_shopupdate.sql index a616b7b8f0..834413118c 100644 --- a/sql/db_shopupdate.sql +++ b/sql/db_shopupdate.sql @@ -222,4 +222,65 @@ INSERT INTO `shopitems` ( `shopid`, `itemid`, `price`, `position`) VALUES (1337, 2043712, 1, 81), (1337, 2340000, 1, 82), (1337, 2040807, 1, 83), -(1337, 2210032, 1, 84); \ No newline at end of file +(1337, 2210032, 1, 84); + +# Thanks to DietStory dev team +INSERT INTO `shopitems` ( `shopid`, `itemid`, `price`, `position`) VALUES + (1200001, 3010001, 1000, 0, 1), + (1200001, 1092003, 2000, 0, 2), + (1200001, 1072063, 10000, 0, 3), + (1200001, 1072062, 10000, 0, 4), + (1200001, 1072017, 10000, 0, 5). + (1200001, 1072049, 5000, 0, 6), + (1200001, 1072048, 5000, 0, 7), + (1200001, 1072008, 5000, 0, 8), + (1200001, 1072005, 50, 0, 9), + (1200001, 1072038, 50, 0, 10), + (1200001, 1072037, 50, 0, 11), + (1200001, 1072001, 50, 0, 12), + (1200001, 1062001, 4800, 0, 13), + (1200001, 1062000, 4800, 0, 14), + (1200001, 1060004, 2800, 0, 15), + (1200001, 1060007, 1000, 0, 16), + (1200001, 1041012, 3000, 0, 17), + (1200001, 1041004, 3000, 0, 18), + (1200001, 1040014, 3000, 0, 19), + (1200001, 1040013, 3000, 0, 20), + (1200001, 1002001, 3000, 0, 21), + (1200001, 1002019, 2000, 0, 22), + (1200001, 1002134, 800, 0, 23), + (1200001, 1002133, 800, 0, 24), + (1200001, 1002132, 800, 0, 25), + (1200001, 1002069, 450, 0, 26), + (1200001, 1002068, 450, 0, 27), + (1200001, 1002067, 450, 0, 28), + (1200001, 1002066, 450, 0, 29), + (1200001, 1002014, 1000, 0, 30), + (1200001, 1002008, 500, 0, 31), + (1200001, 1332007, 1000, 0, 32), + (1200001, 1312000, 3000, 0, 33), + (1200001, 1302007, 3000, 0, 34), + (1200001, 1322005, 50, 0, 35), + (1200001, 1312004, 50, 0, 36), + (1200001, 1302000, 50, 0, 37), + (1203590, 2330000, 600, 0, 104), + (1203590, 2070000, 500, 0, 108), + (1203590, 2061000, 1, 0, 120), + (1203590, 2060000, 1, 0, 124), + (1203590, 2030000, 400, 0, 132), + (1203590, 2020028, 3000, 0, 136), + (1203590, 2010004, 310, 0, 140), + (1203590, 2010003, 100, 0, 144), + (1203590, 2010001, 106, 0, 148), + (1203590, 2010002, 50, 0, 152), + (1203590, 2010000, 30, 0, 156), + (1203590, 2002005, 500, 0, 160), + (1203590, 2002004, 500, 0, 164), + (1203590, 2002002, 500, 0, 168), + (1203590, 2002001, 400, 0, 172), + (1203590, 2002000, 500, 0, 176), + (1203590, 2000006, 620, 0, 180), + (1203590, 2000003, 200, 0, 184), + (1203590, 2000002, 320, 0, 188), + (1203590, 2000001, 160, 0, 192), + (1203590, 2000000, 50, 0, 196); \ No newline at end of file diff --git a/src/client/MapleCharacter.java b/src/client/MapleCharacter.java index 8578d06424..ec7b35e8bb 100644 --- a/src/client/MapleCharacter.java +++ b/src/client/MapleCharacter.java @@ -84,7 +84,7 @@ import server.events.gm.MapleOla; import server.life.MapleMonster; import server.life.MobSkill; import server.maps.AbstractAnimatedMapleMapObject; -import server.maps.HiredMerchant; +import server.maps.MapleHiredMerchant; import server.maps.MapleDoor; import server.maps.MapleDragon; import server.maps.MapleMap; @@ -152,6 +152,7 @@ import server.maps.MapleMapItem; public class MapleCharacter extends AbstractAnimatedMapleMapObject { private static NumberFormat nf = new DecimalFormat("#,###,###,###"); + private static MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); private static final String LEVEL_200 = "[Congrats] %s has reached Level 200! Congratulate %s on such an amazing achievement!"; private static final String[] BLOCKED_NAMES = {"admin", "owner", "moderator", "intern", "donor", "administrator", "help", "helper", "alert", "notice", "maplestory", "Solaxia", "fuck", "wizet", "fucking", "negro", "fuk", "fuc", "penis", "pussy", "asshole", "gay", "nigger", "homo", "suck", "cum", "shit", "shitty", "condom", "security", "official", "rape", "nigga", "sex", "tit", "boner", "orgy", "clit", "asshole", "fatass", "bitch", "support", "gamemaster", "cock", "gaay", "gm", @@ -190,6 +191,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { private int warpToId; private int expRate = 1, mesoRate = 1, dropRate = 1, expCoupon = 1, mesoCoupon = 1, dropCoupon = 1; private int omokwins, omokties, omoklosses, matchcardwins, matchcardties, matchcardlosses; + private int owlSearch; private int married; private long lastfametime, lastUsedCashItem, lastHealed, lastMesoDrop = -1, jailExpiration = -1; private transient int localmaxhp, localmaxmp, localstr, localdex, localluk, localint_, magic, watk; @@ -208,7 +210,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { private int merchantmeso; private BuddyList buddylist; private EventInstanceManager eventInstance = null; - private HiredMerchant hiredMerchant = null; + private MapleHiredMerchant hiredMerchant = null; private MapleClient client; private MapleGuildCharacter mgc = null; private MaplePartyCharacter mpc = null; @@ -427,6 +429,14 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { public void setNpcCooldown(long d) { npcCd = d; } + + public void setOwlSearch(int id) { + owlSearch = id; + } + + public int getOwlSearch() { + return owlSearch; + } public void addCooldown(int skillId, long startTime, long length) { effLock.lock(); @@ -699,7 +709,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { int maxbasedamage; Item weapon_item = getInventory(MapleInventoryType.EQUIPPED).getItem((short) -11); if (weapon_item != null) { - MapleWeaponType weapon = MapleItemInformationProvider.getInstance().getWeaponType(weapon_item.getItemId()); + MapleWeaponType weapon = ii.getWeaponType(weapon_item.getItemId()); int mainstat, secondarystat; if (getJob().isA(MapleJob.THIEF) && weapon == MapleWeaponType.DAGGER_OTHER) { weapon = MapleWeaponType.DAGGER_THIEVES; @@ -787,7 +797,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { String medal = ""; final Item medalItem = getInventory(MapleInventoryType.EQUIPPED).getItem((short) -49); if (medalItem != null) { - medal = "<" + MapleItemInformationProvider.getInstance().getName(medalItem.getItemId()) + "> "; + medal = "<" + ii.getName(medalItem.getItemId()) + "> "; } return medal; } @@ -1342,7 +1352,6 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { private static boolean useItem(final MapleClient c, final int id) { if (id / 1000000 == 2) { - MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); if (ii.isConsumeOnPickup(id)) { if (ItemConstants.isPartyItem(id)) { List pchr = c.getPlayer().getPartyMembersOnSameMap(); @@ -1396,7 +1405,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { final byte[] pickupPacket = MaplePacketCreator.removeItemFromMap(mapitem.getObjectId(), (isPet) ? 5 : 2, this.getId(), isPet, petIndex); boolean hasSpaceInventory = true; - if (mapitem.getItemId() == 4031865 || mapitem.getItemId() == 4031866 || mapitem.getMeso() > 0 || MapleItemInformationProvider.getInstance().isConsumeOnPickup(mapitem.getItemId()) || (hasSpaceInventory = MapleInventoryManipulator.checkSpace(client, mapitem.getItemId(), mapitem.getItem().getQuantity(), mapitem.getItem().getOwner()))) { + if (mapitem.getItemId() == 4031865 || mapitem.getItemId() == 4031866 || mapitem.getMeso() > 0 || ii.isConsumeOnPickup(mapitem.getItemId()) || (hasSpaceInventory = MapleInventoryManipulator.checkSpace(client, mapitem.getItemId(), mapitem.getItem().getQuantity(), mapitem.getItem().getOwner()))) { if ((this.getMapId() > 209000000 && this.getMapId() < 209000016) || (this.getMapId() >= 990000500 && this.getMapId() <= 990000502)) {//happyville trees and guild PQ if (!mapitem.isPlayerDrop() || mapitem.getDropper().getObjectId() == client.getPlayer().getObjectId()) { if(mapitem.getMeso() > 0) { @@ -1460,7 +1469,6 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { this.gainMeso(mapitem.getMeso(), true, true, false); } } else if (mapitem.getItem().getItemId() / 10000 == 243) { - MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); MapleItemInformationProvider.scriptedItem info = ii.getScriptedItemInfo(mapitem.getItem().getItemId()); if (info.runOnPickup()) { ItemScriptManager ism = ItemScriptManager.getInstance(); @@ -1504,7 +1512,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { } public int countItem(int itemid) { - return inventory[MapleItemInformationProvider.getInstance().getInventoryType(itemid).ordinal()].countById(itemid); + return inventory[ii.getInventoryType(itemid).ordinal()].countById(itemid); } public boolean canHold(int itemid) { @@ -1512,12 +1520,14 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { } public boolean canHold(int itemid, int quantity) { - if(haveItem(itemid)) { - if(getItemQuantity(itemid, false) + quantity <= MapleItemInformationProvider.getInstance().getSlotMax(client, itemid)) + int hold = getCleanItemQuantity(itemid, false); + + if(hold > 0) { + if(hold + quantity <= ii.getSlotMax(client, itemid)) return true; } - return getInventory(MapleItemInformationProvider.getInstance().getInventoryType(itemid)).getNextFreeSlot() > -1; + return getInventory(ii.getInventoryType(itemid)).getNextFreeSlot() > -1; } public void decreaseBattleshipHp(int decrease) { @@ -2824,7 +2834,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { } public void cancelEffect(int itemId) { - cancelEffect(MapleItemInformationProvider.getInstance().getItemEffect(itemId), false, -1); + cancelEffect(ii.getItemEffect(itemId), false, -1); } public void cancelEffect(MapleStatEffect effect, boolean overwrite, long startTime) { @@ -3534,7 +3544,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { return hair; } - public HiredMerchant getHiredMerchant() { + public MapleHiredMerchant getHiredMerchant() { return hiredMerchant; } @@ -3640,12 +3650,20 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { } public int getItemQuantity(int itemid, boolean checkEquipped) { - int possesed = inventory[MapleItemInformationProvider.getInstance().getInventoryType(itemid).ordinal()].countById(itemid); + int possesed = inventory[ii.getInventoryType(itemid).ordinal()].countById(itemid); if (checkEquipped) { possesed += inventory[MapleInventoryType.EQUIPPED.ordinal()].countById(itemid); } return possesed; } + + public int getCleanItemQuantity(int itemid, boolean checkEquipped) { + int possesed = inventory[ii.getInventoryType(itemid).ordinal()].countCleanById(itemid); + if (checkEquipped) { + possesed += inventory[MapleInventoryType.EQUIPPED.ordinal()].countCleanById(itemid); + } + return possesed; + } public MapleJob getJob() { return job; @@ -3967,6 +3985,9 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { if(mps == null) return; if (mps.isOwner(this)) { + mps.setOpen(false); + client.getWorldServer().unregisterPlayerShop(mps); + for (MaplePlayerShopItem mpsi : mps.getItems()) { if (mpsi.getBundles() >= 2) { Item iItem = mpsi.getItem().copy(); @@ -3976,8 +3997,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { MapleInventoryManipulator.addFromDrop(this.getClient(), mpsi.getItem(), true); } } - this.getMap().broadcastMessage(MaplePacketCreator.removeCharBox(this)); - mps.removeVisitors(); + mps.closeShop(); } else { mps.removeVisitor(this); } @@ -3998,7 +4018,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { } public void closeHiredMerchant(boolean closeMerchant) { - HiredMerchant merchant = this.getHiredMerchant(); + MapleHiredMerchant merchant = this.getHiredMerchant(); if(merchant == null) return; if(closeMerchant) { @@ -4488,8 +4508,12 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { return getItemQuantity(itemid, false) > 0; } + public boolean haveCleanItem(int itemid) { + return getCleanItemQuantity(itemid, false) > 0; + } + public boolean hasEmptySlot(int itemId) { - return getInventory(MapleItemInformationProvider.getInstance().getInventoryType(itemId)).getNextFreeSlot() > -1; + return getInventory(ii.getInventoryType(itemId)).getNextFreeSlot() > -1; } public boolean hasEmptySlot(byte invType) { @@ -4983,7 +5007,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { private void commitBuffCoupon(int couponid) { if(!isLoggedin() || getCashShop().isOpened()) return; - MapleStatEffect mse = MapleItemInformationProvider.getInstance().getItemEffect(couponid); + MapleStatEffect mse = ii.getItemEffect(couponid); mse.applyTo(this); } @@ -5536,7 +5560,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { } if (possesed > 0) { message("You have used a safety charm, so your EXP points have not been decreased."); - MapleInventoryManipulator.removeById(client, MapleItemInformationProvider.getInstance().getInventoryType(charmID[i]), charmID[i], 1, true, false); + MapleInventoryManipulator.removeById(client, ii.getInventoryType(charmID[i]), charmID[i], 1, true, false); } else if (mapid > 925020000 && mapid < 925030000) { this.dojoStage = 0; } else if (mapid > 980000100 && mapid < 980000700) { @@ -5686,7 +5710,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { if (job.isA(MapleJob.THIEF) || job.isA(MapleJob.BOWMAN) || job.isA(MapleJob.PIRATE) || job.isA(MapleJob.NIGHTWALKER1) || job.isA(MapleJob.WINDARCHER1)) { Item weapon_item = getInventory(MapleInventoryType.EQUIPPED).getItem((short) -11); if (weapon_item != null) { - MapleWeaponType weapon = MapleItemInformationProvider.getInstance().getWeaponType(weapon_item.getItemId()); + MapleWeaponType weapon = ii.getWeaponType(weapon_item.getItemId()); boolean bow = weapon == MapleWeaponType.BOW; boolean crossbow = weapon == MapleWeaponType.CROSSBOW; boolean claw = weapon == MapleWeaponType.CLAW; @@ -5700,7 +5724,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { if ((claw && ItemConstants.isThrowingStar(item.getItemId())) || (gun && ItemConstants.isBullet(item.getItemId())) || (bow && ItemConstants.isArrowForBow(item.getItemId())) || (crossbow && ItemConstants.isArrowForCrossBow(item.getItemId()))) { if (item.getQuantity() > 0) { // Finally there! - watk += MapleItemInformationProvider.getInstance().getWatkForProjectile(item.getItemId()); + watk += ii.getWatkForProjectile(item.getItemId()); break; } } @@ -6543,7 +6567,6 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { try { newAmount = (int)Math.min((long)merchantmeso + add, Integer.MAX_VALUE); - System.out.println("adding" + add + " now" + newAmount); Connection con = DatabaseConnection.getConnection(); try (PreparedStatement ps = con.prepareStatement("UPDATE characters SET MerchantMesos = ? WHERE id = ?", Statement.RETURN_GENERATED_KEYS)) { @@ -6576,7 +6599,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { merchantmeso = set; } - public void setHiredMerchant(HiredMerchant merchant) { + public void setHiredMerchant(MapleHiredMerchant merchant) { this.hiredMerchant = merchant; } @@ -6822,7 +6845,6 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { public int sellAllItemsFromName(byte invTypeId, String name) { //player decides from which inventory items should be sold. - MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); MapleInventoryType type = MapleInventoryType.getByType(invTypeId); Item it = getInventory(type).findByName(name); @@ -7539,10 +7561,9 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { public void increaseEquipExp(int expGain) { if(expGain < 0) expGain = Integer.MAX_VALUE; - MapleItemInformationProvider mii = MapleItemInformationProvider.getInstance(); for (Item item : getInventory(MapleInventoryType.EQUIPPED).list()) { Equip nEquip = (Equip) item; - String itemName = mii.getName(nEquip.getItemId()); + String itemName = ii.getName(nEquip.getItemId()); if (itemName == null) { continue; } @@ -7554,12 +7575,11 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject { } public void showAllEquipFeatures() { - MapleItemInformationProvider mii = MapleItemInformationProvider.getInstance(); String showMsg = ""; for (Item item : getInventory(MapleInventoryType.EQUIPPED).list()) { Equip nEquip = (Equip) item; - String itemName = mii.getName(nEquip.getItemId()); + String itemName = ii.getName(nEquip.getItemId()); if (itemName == null) { continue; } diff --git a/src/client/MapleClient.java b/src/client/MapleClient.java index be571003a5..160995bfe5 100644 --- a/src/client/MapleClient.java +++ b/src/client/MapleClient.java @@ -68,8 +68,6 @@ import scripting.npc.NPCConversationManager; import scripting.npc.NPCScriptManager; import scripting.quest.QuestActionManager; import scripting.quest.QuestScriptManager; -import server.MapleMiniGame; -import server.MaplePlayerShop; import server.life.MapleMonster; import server.MapleTrade; import server.TimerManager; @@ -1298,7 +1296,7 @@ public class MapleClient { MapleTrade.cancelTrade(getPlayer()); } - HiredMerchant merchant = player.getHiredMerchant(); + MapleHiredMerchant merchant = player.getHiredMerchant(); if (merchant != null) { if (merchant.isOwner(getPlayer())) { merchant.setOpen(true); diff --git a/src/client/command/Commands.java b/src/client/command/Commands.java index b61d27fd98..145d4b1b23 100644 --- a/src/client/command/Commands.java +++ b/src/client/command/Commands.java @@ -1413,7 +1413,31 @@ public class Commands { MapleCharacter player = c.getPlayer(); MapleCharacter victim; - switch(sub[0]) { + switch(sub[0]) { + case "fly": + if (sub.length < 2) { + player.yellowMessage("Syntax: !fly "); + break; + } + + Integer accid = c.getAccID(); + + String sendStr = ""; + if(sub[1].equalsIgnoreCase("on")) { + sendStr += "GM Fly feature enabled. With fly active, GM's cannot attack."; + if(!srv.canFly(accid)) sendStr += " Re-login to take effect."; + + srv.changeFly(c.getAccID(), true); + } else { + player.dropMessage(6, "GM Fly feature disabled. GM's can now attack."); + if(srv.canFly(accid)) sendStr += " Re-login to take effect."; + + srv.changeFly(c.getAccID(), false); + } + + player.dropMessage(6, sendStr); + break; + case "spawn": if (sub.length < 2) { player.yellowMessage("Syntax: !spawn "); @@ -1592,12 +1616,12 @@ public class Commands { Server.getInstance().broadcastGMMessage(MaplePacketCreator.serverNotice(5, message_)); break; - case "ignored": + case "ignored": for (String ign : MapleLogger.ignored){ player.yellowMessage(ign + " is being ignored."); } break; - + case "pos": float xpos = player.getPosition().x; float ypos = player.getPosition().y; @@ -2552,6 +2576,14 @@ public class Commands { player.dropMessage(5, "Quest Cache for quest " + sub[1] + " cleared."); break; + case "fred": + c.announce(MaplePacketCreator.fredrickMessage(Byte.valueOf(sub[1]))); + break; + + case "owl": + c.announce(MaplePacketCreator.getOwlMessage(Integer.valueOf(sub[1]))); + break; + default: return false; } diff --git a/src/client/inventory/MapleInventory.java b/src/client/inventory/MapleInventory.java index b527f8dc20..e334b76157 100644 --- a/src/client/inventory/MapleInventory.java +++ b/src/client/inventory/MapleInventory.java @@ -128,6 +128,16 @@ public class MapleInventory implements Iterable { return qty; } + public int countCleanById(int itemId) { + int qty = 0; + for (Item item : list()) { + if (item.getItemId() == itemId && item.getOwner().equals("")) { + qty += item.getQuantity(); + } + } + return qty; + } + public int freeSlotCountById(int itemId, int required) { List itemList = listById(itemId); int openSlot = 0; @@ -297,6 +307,7 @@ public class MapleInventory implements Iterable { public boolean isFull(int margin) { lock.lock(); try { + //System.out.print("(" + inventory.size() + " " + margin + " <> " + slotLimit + ")"); return inventory.size() + margin >= slotLimit; } finally { lock.unlock(); @@ -306,6 +317,7 @@ public class MapleInventory implements Iterable { public boolean isFullAfterSomeItems(int margin, int used) { lock.lock(); try { + //System.out.print("(" + inventory.size() + " " + margin + " <> " + slotLimit + " -" + used + ")"); return inventory.size() + margin >= slotLimit - used; } finally { lock.unlock(); @@ -445,8 +457,12 @@ public class MapleInventory implements Iterable { int usedSlots = typesSlotsUsed.get(itemType); Long itemId = it.getKey() >> 32L; + + //System.out.print("inserting " + itemId.intValue() + " with type " + itemType + " qty " + it.getValue() + " owner '" + rcvOwners.get(it.getKey()) + "' current usedSlots:"); + //for(Integer i : typesSlotsUsed) System.out.print(" " + i); int result = MapleInventoryManipulator.checkSpaceProgressively(c, itemId.intValue(), it.getValue(), rcvOwners.get(it.getKey()), usedSlots); boolean hasSpace = ((result % 2) != 0); + //System.out.print(" -> hasSpace: " + hasSpace + " RESULT : " + result + "\n"); if(!hasSpace) return false; typesSlotsUsed.set(itemType, (result >> 1)); diff --git a/src/constants/GameConstants.java b/src/constants/GameConstants.java index 40a63710f3..d2d7974c96 100644 --- a/src/constants/GameConstants.java +++ b/src/constants/GameConstants.java @@ -2,11 +2,17 @@ package constants; import client.MapleJob; import constants.skills.Aran; +import server.maps.MapleMap; +import server.maps.FieldLimit; /* * @author kevintjuh93 + * @author Ronan */ public class GameConstants { + //public static final int[] OWL_DATA = {2000014, 2000015, 2000016}; + public static final int[] OWL_DATA = new int[]{1082002, 2070005, 2070006, 1022047, 1102041, 2044705, 2340000, 2040017, 1092030, 2040804}; + // Ronan's rates upgrade system private static final int[] DROP_RATE_GAIN = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; private static final int[] MESO_RATE_GAIN = {1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105}; @@ -137,6 +143,23 @@ public class GameConstants { return skill >= 9001000 && skill <= 9101008 || skill >= 8001000 && skill <= 8001001; } + public static boolean isFreeMarketRoom(int mapid) { + return mapid > 910000000 && mapid < 910000023; + } + + public static boolean isMerchantLocked(MapleMap map) { + if(FieldLimit.CANNOTMIGRATE.check(map.getFieldLimit())) { // maps that cannot access cash shop cannot access merchants too (except FM rooms). + return true; + } + + switch(map.getId()) { + case 910000000: + return true; + } + + return false; + } + public static boolean isBossRush(int mapid) { return mapid >= 970030100 && mapid <= 970042711; } diff --git a/src/constants/ServerConstants.java b/src/constants/ServerConstants.java index 3c64e28177..4f000c96d7 100644 --- a/src/constants/ServerConstants.java +++ b/src/constants/ServerConstants.java @@ -43,13 +43,13 @@ public class ServerConstants { public static final boolean USE_ITEM_SORT = true; public static final boolean USE_ITEM_SORT_BY_NAME = false; //Item sorting based on name rather than id. public static final boolean USE_PARTY_SEARCH = false; - public static final boolean USE_MERCHANT_ANYWHERE = true; //Enables player shops and hired merchants outside FM rooms (except FM entrance). public static final boolean USE_AUTOBAN = false; //Commands the server to detect infractors automatically. public static final boolean USE_AUTOSAVE = true; //Enables server autosaving feature (saves characters to DB each 1 hour). public static final boolean USE_SERVER_AUTOASSIGNER = true; //Server-builtin autoassigner, uses algorithm based on distributing AP accordingly with required secondary stat on equipments. public static final boolean USE_REFRESH_RANK_MOVE = true; public static final boolean USE_ENFORCE_UNMERCHABLE_PET = true; //Forces players to not sell pets via merchants. (since non-named pets gets dirty name and other possible DB-related issues) public static final boolean USE_ENFORCE_MDOOR_POSITION = true; //Forces mystic door to be spawned near spawnpoints. (since things bugs out other way, and this helps players to locate the door faster) + public static final boolean USE_ERASE_PERMIT_ON_OPENSHOP = true;//Forces "shop permit" item to be consumed when player deploy his/her player shop. public static final boolean USE_ERASE_UNTRADEABLE_DROP = true; //Forces flagged untradeable items to disappear when dropped. public static final boolean USE_ERASE_PET_ON_EXPIRATION = false;//Forces pets to be removed from inventory when expire time comes, rather than converting it to a doll. public static final boolean USE_BUFF_MOST_SIGNIFICANT = true; //When applying buffs, the player will stick with the highest stat boost among the listed, rather than overwriting stats. diff --git a/src/net/PacketProcessor.java b/src/net/PacketProcessor.java index 1bdb882c8d..d3eab38f7b 100644 --- a/src/net/PacketProcessor.java +++ b/src/net/PacketProcessor.java @@ -147,7 +147,7 @@ public final class PacketProcessor { registerHandler(RecvOpcode.USE_ITEM, new UseItemHandler()); registerHandler(RecvOpcode.USE_RETURN_SCROLL, new UseItemHandler()); registerHandler(RecvOpcode.USE_UPGRADE_SCROLL, new ScrollHandler()); - registerHandler(RecvOpcode.USE_SUMMON_BAG, new UseSummonBag()); + registerHandler(RecvOpcode.USE_SUMMON_BAG, new UseSummonBagHandler()); registerHandler(RecvOpcode.FACE_EXPRESSION, new FaceExpressionHandler()); registerHandler(RecvOpcode.HEAL_OVER_TIME, new HealOvertimeHandler()); registerHandler(RecvOpcode.ITEM_PICKUP, new ItemPickupHandler()); @@ -182,7 +182,7 @@ public final class PacketProcessor { registerHandler(RecvOpcode.BBS_OPERATION, new BBSOperationHandler()); registerHandler(RecvOpcode.SKILL_EFFECT, new SkillEffectHandler()); registerHandler(RecvOpcode.MESSENGER, new MessengerHandler()); - registerHandler(RecvOpcode.NPC_ACTION, new NPCAnimation()); + registerHandler(RecvOpcode.NPC_ACTION, new NPCAnimationHandler()); registerHandler(RecvOpcode.CHECK_CASH, new TouchingCashShopHandler()); registerHandler(RecvOpcode.CASHSHOP_OPERATION, new CashOperationHandler()); registerHandler(RecvOpcode.COUPON_CODE, new CouponCodeHandler()); @@ -205,6 +205,8 @@ public final class PacketProcessor { registerHandler(RecvOpcode.SPOUSE_CHAT, new SpouseChatHandler()); registerHandler(RecvOpcode.PET_AUTO_POT, new PetAutoPotHandler()); registerHandler(RecvOpcode.PET_EXCLUDE_ITEMS, new PetExcludeItemsHandler()); + registerHandler(RecvOpcode.OWL_ACTION, new UseOwlOfMinervaHandler()); + registerHandler(RecvOpcode.OWL_WARP, new OwlWarpHandler()); registerHandler(RecvOpcode.TOUCH_MONSTER_ATTACK, new TouchMonsterDamageHandler()); registerHandler(RecvOpcode.TROCK_ADD_MAP, new TrockAddMapHandler()); registerHandler(RecvOpcode.HIRED_MERCHANT_REQUEST, new HiredMerchantRequest()); diff --git a/src/net/RecvOpcode.java b/src/net/RecvOpcode.java index 46aadc06e0..5f5a2dbc7a 100644 --- a/src/net/RecvOpcode.java +++ b/src/net/RecvOpcode.java @@ -76,7 +76,9 @@ public enum RecvOpcode { HIRED_MERCHANT_REQUEST(0x3F), FREDRICK_ACTION(0x40), DUEY_ACTION(0x41), - ADMIN_SHOP(0x44),//oh lol + OWL_ACTION(0x42), //sends most searched info to client + OWL_WARP(0x43), //handles player warp to store + ADMIN_SHOP(0x44), ITEM_SORT(0x45), ITEM_SORT2(0x46), ITEM_MOVE(0x47), @@ -87,7 +89,7 @@ public enum RecvOpcode { USE_MOUNT_FOOD(0x4D), SCRIPTED_ITEM(0x4E), USE_CASH_ITEM(0x4F), - + //USE_OWL_ITEM(0x50), ... no idea USE_CATCH_ITEM(0x51), USE_SKILL_BOOK(0x52), USE_TELEPORT_ROCK(0x54), diff --git a/src/net/server/Server.java b/src/net/server/Server.java index 3005d29030..4dedeb53d0 100644 --- a/src/net/server/Server.java +++ b/src/net/server/Server.java @@ -71,6 +71,7 @@ import java.util.Calendar; import server.quest.MapleQuest; public class Server implements Runnable { + private static final Set activeFly = new HashSet<>(); private static final Map couponRates = new LinkedHashMap<>(); private static final List activeCoupons = new LinkedList<>(); @@ -699,6 +700,18 @@ public class Server implements Runnable { return false; } + public void changeFly(Integer accountid, boolean canFly) { + if(canFly) { + activeFly.add(accountid); + } else { + activeFly.remove(accountid); + } + } + + public boolean canFly(Integer accountid) { + return activeFly.contains(accountid); + } + public World getWorld(int id) { return worlds.get(id); } diff --git a/src/net/server/channel/Channel.java b/src/net/server/channel/Channel.java index 00fc7cd1f8..1c13eb0cf3 100644 --- a/src/net/server/channel/Channel.java +++ b/src/net/server/channel/Channel.java @@ -57,7 +57,7 @@ import server.TimerManager; import server.events.gm.MapleEvent; import server.expeditions.MapleExpedition; import server.expeditions.MapleExpeditionType; -import server.maps.HiredMerchant; +import server.maps.MapleHiredMerchant; import server.maps.MapleMap; import server.maps.MapleMapFactory; import tools.MaplePacketCreator; @@ -73,7 +73,7 @@ public final class Channel { private String ip, serverMessage; private MapleMapFactory mapFactory; private EventScriptManager eventSM; - private Map hiredMerchants = new HashMap<>(); + private Map hiredMerchants = new HashMap<>(); private final Map storedVars = new HashMap<>(); private ReentrantReadWriteLock merchant_lock = new ReentrantReadWriteLock(true); private ReadLock merchRlock = merchant_lock.readLock(); @@ -152,7 +152,7 @@ public final class Channel { public void closeAllMerchants() { merchWlock.lock(); try { - final Iterator hmit = hiredMerchants.values().iterator(); + final Iterator hmit = hiredMerchants.values().iterator(); while (hmit.hasNext()) { hmit.next().forceClose(); hmit.remove(); @@ -246,7 +246,7 @@ public final class Channel { } } - public Map getHiredMerchants() { + public Map getHiredMerchants() { merchRlock.lock(); try { return Collections.unmodifiableMap(hiredMerchants); @@ -255,7 +255,7 @@ public final class Channel { } } - public void addHiredMerchant(int chrid, HiredMerchant hm) { + public void addHiredMerchant(int chrid, MapleHiredMerchant hm) { merchWlock.lock(); try { hiredMerchants.put(chrid, hm); diff --git a/src/net/server/channel/handlers/FredrickHandler.java b/src/net/server/channel/handlers/FredrickHandler.java index 0af9a78353..cbc983c36b 100644 --- a/src/net/server/channel/handlers/FredrickHandler.java +++ b/src/net/server/channel/handlers/FredrickHandler.java @@ -75,7 +75,7 @@ public class FredrickHandler extends AbstractMaplePacketHandler { Item item = items.get(i).getLeft(); MapleInventoryManipulator.addFromDrop(c, item, false); String itemName = MapleItemInformationProvider.getInstance().getName(item.getItemId()); - FilePrinter.printError(FilePrinter.FREDRICK + chr.getName() + ".txt", chr.getName() + " gained " + item.getQuantity() + " " + itemName + " (" + item.getItemId() + ")\r\n"); + FilePrinter.print(FilePrinter.FREDRICK + chr.getName() + ".txt", chr.getName() + " gained " + item.getQuantity() + " " + itemName + " (" + item.getItemId() + ")\r\n"); } c.announce(MaplePacketCreator.fredrickMessage((byte) 0x1E)); @@ -97,12 +97,7 @@ public class FredrickHandler extends AbstractMaplePacketHandler { if (chr.getMeso() + chr.getMerchantMeso() < 0) { return false; } - - if (!MapleInventory.checkSpots(chr, items)) { - return false; - } - - return true; + return MapleInventory.checkSpotsAndOwnership(chr, items); } private static boolean deleteItems(MapleCharacter chr) { diff --git a/src/net/server/channel/handlers/HiredMerchantRequest.java b/src/net/server/channel/handlers/HiredMerchantRequest.java index 58b21a7c56..368d829aa1 100644 --- a/src/net/server/channel/handlers/HiredMerchantRequest.java +++ b/src/net/server/channel/handlers/HiredMerchantRequest.java @@ -26,7 +26,7 @@ import client.MapleCharacter; import java.sql.SQLException; import java.util.Arrays; import client.MapleClient; -import constants.ServerConstants; +import constants.GameConstants; import net.AbstractMaplePacketHandler; import server.maps.MapleMapObjectType; import tools.MaplePacketCreator; @@ -39,7 +39,7 @@ import tools.data.input.SeekableLittleEndianAccessor; public final class HiredMerchantRequest extends AbstractMaplePacketHandler { public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { MapleCharacter chr = c.getPlayer(); - if (chr.getMap().getMapObjectsInRange(chr.getPosition(), 23000, Arrays.asList(MapleMapObjectType.HIRED_MERCHANT)).isEmpty() && ((ServerConstants.USE_MERCHANT_ANYWHERE && chr.getMapId() != 910000000) || (chr.getMapId() > 910000000 && chr.getMapId() < 910000023))) { + if (chr.getMap().getMapObjectsInRange(chr.getPosition(), 23000, Arrays.asList(MapleMapObjectType.HIRED_MERCHANT)).isEmpty() && (GameConstants.isFreeMarketRoom(chr.getMapId()))) { if (!chr.hasMerchant()) { try { if (ItemFactory.MERCHANT.loadItems(chr.getId(), false).isEmpty() && chr.getMerchantMeso() == 0) { diff --git a/src/net/server/channel/handlers/NPCAnimation.java b/src/net/server/channel/handlers/NPCAnimationHandler.java similarity index 96% rename from src/net/server/channel/handlers/NPCAnimation.java rename to src/net/server/channel/handlers/NPCAnimationHandler.java index 04e4003a3f..30d569709c 100644 --- a/src/net/server/channel/handlers/NPCAnimation.java +++ b/src/net/server/channel/handlers/NPCAnimationHandler.java @@ -27,7 +27,7 @@ import net.SendOpcode; import tools.data.input.SeekableLittleEndianAccessor; import tools.data.output.MaplePacketLittleEndianWriter; -public final class NPCAnimation extends AbstractMaplePacketHandler { +public final class NPCAnimationHandler extends AbstractMaplePacketHandler { public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); int length = (int) slea.available(); diff --git a/src/net/server/channel/handlers/OwlWarpHandler.java b/src/net/server/channel/handlers/OwlWarpHandler.java new file mode 100644 index 0000000000..3687fe5c58 --- /dev/null +++ b/src/net/server/channel/handlers/OwlWarpHandler.java @@ -0,0 +1,106 @@ +/* + This file is part of the OdinMS Maple Story Server + Copyright (C) 2008 Patrick Huy + Matthias Butz + Jan Christian Meyer + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation version 3 as published by + the Free Software Foundation. You may not use, modify or distribute + this program under any other version of the GNU Affero General Public + License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ +package net.server.channel.handlers; + +import constants.GameConstants; +import client.MapleClient; +import net.AbstractMaplePacketHandler; +import server.MaplePlayerShop; +import server.maps.MapleHiredMerchant; +import tools.MaplePacketCreator; +import tools.data.input.SeekableLittleEndianAccessor; + +/* + * @author Ronan + */ +public final class OwlWarpHandler extends AbstractMaplePacketHandler { + + @Override + public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { + int ownerid = slea.readInt(); + int mapid = slea.readInt(); + + MapleHiredMerchant hm = c.getWorldServer().getHiredMerchant(ownerid); // if both hired merchant and player shop is on the same map + MaplePlayerShop ps; + if(hm == null || hm.getMapId() != mapid || !hm.hasItem(c.getPlayer().getOwlSearch())) { + ps = c.getWorldServer().getPlayerShop(ownerid); + if(ps == null || ps.getMapId() != mapid || !ps.hasItem(c.getPlayer().getOwlSearch())) { + if(hm == null && ps == null) c.announce(MaplePacketCreator.getOwlMessage(1)); + else c.announce(MaplePacketCreator.getOwlMessage(3)); + return; + } + + if(ps.isOpen()) { + if(GameConstants.isFreeMarketRoom(mapid)) { + if(ps.getChannel() == c.getChannel()) { + c.getPlayer().changeMap(mapid); + + if(ps.isOpen()) { //change map has a delay, must double check + if(!ps.visitShop(c.getPlayer())) { + if(!ps.isBanned(c.getPlayer().getName())) c.announce(MaplePacketCreator.getOwlMessage(2)); + else c.announce(MaplePacketCreator.getOwlMessage(17)); + } + } else { + //c.announce(MaplePacketCreator.serverNotice(1, "That merchant has either been closed or is under maintenance.")); + c.announce(MaplePacketCreator.getOwlMessage(18)); + } + } else { + c.announce(MaplePacketCreator.serverNotice(1, "That shop is currently located in another channel. Current location: Channel " + hm.getChannel() + ", '" + hm.getMap().getMapName() + "'.")); + } + } else { + c.announce(MaplePacketCreator.serverNotice(1, "That shop is currently located outside of the FM area. Current location: Channel " + hm.getChannel() + ", '" + hm.getMap().getMapName() + "'.")); + } + } else { + //c.announce(MaplePacketCreator.serverNotice(1, "That merchant has either been closed or is under maintenance.")); + c.announce(MaplePacketCreator.getOwlMessage(18)); + } + } else { + if(hm.isOpen()) { + if(GameConstants.isFreeMarketRoom(mapid)) { + if(hm.getChannel() == c.getChannel()) { + c.getPlayer().changeMap(mapid); + + if(hm.isOpen()) { //change map has a delay, must double check + if(hm.addVisitor(c.getPlayer())) { + c.announce(MaplePacketCreator.getHiredMerchant(c.getPlayer(), hm, false)); + c.getPlayer().setHiredMerchant(hm); + } else { + //c.announce(MaplePacketCreator.serverNotice(1, hm.getOwner() + "'s merchant is full. Wait awhile before trying again.")); + c.announce(MaplePacketCreator.getOwlMessage(2)); + } + } else { + //c.announce(MaplePacketCreator.serverNotice(1, "That merchant has either been closed or is under maintenance.")); + c.announce(MaplePacketCreator.getOwlMessage(18)); + } + } else { + c.announce(MaplePacketCreator.serverNotice(1, "That merchant is currently located in another channel. Current location: Channel " + hm.getChannel() + ", '" + hm.getMap().getMapName() + "'.")); + } + } else { + c.announce(MaplePacketCreator.serverNotice(1, "That merchant is currently located outside of the FM area. Current location: Channel " + hm.getChannel() + ", '" + hm.getMap().getMapName() + "'.")); + } + } else { + //c.announce(MaplePacketCreator.serverNotice(1, "That merchant has either been closed or is under maintenance.")); + c.announce(MaplePacketCreator.getOwlMessage(18)); + } + } + } +} \ No newline at end of file diff --git a/src/net/server/channel/handlers/PlayerInteractionHandler.java b/src/net/server/channel/handlers/PlayerInteractionHandler.java index 20a91415a6..d448b3e52f 100644 --- a/src/net/server/channel/handlers/PlayerInteractionHandler.java +++ b/src/net/server/channel/handlers/PlayerInteractionHandler.java @@ -33,20 +33,19 @@ import constants.ServerConstants; import java.util.Arrays; import net.AbstractMaplePacketHandler; -import net.server.Server; import server.MapleInventoryManipulator; import server.MapleItemInformationProvider; import server.MapleMiniGame; import server.MaplePlayerShop; import server.MaplePlayerShopItem; import server.MapleTrade; +import constants.GameConstants; import server.maps.FieldLimit; -import server.maps.HiredMerchant; +import server.maps.MapleHiredMerchant; import server.maps.MapleMapObject; import server.maps.MapleMapObjectType; import tools.FilePrinter; import tools.MaplePacketCreator; -import tools.Pair; import tools.data.input.SeekableLittleEndianAccessor; /** @@ -114,6 +113,7 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler { public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { byte mode = slea.readByte(); MapleCharacter chr = c.getPlayer(); + if (mode == Action.CREATE.getCode()) { byte createType = slea.readByte(); if (createType == 3) {// trade @@ -164,15 +164,16 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler { return; } - if (chr.getMapId() > 910000000 && chr.getMapId() < 910000023 || itemId > 5030000 && itemId < 5030012 || itemId > 5140000 && itemId < 5140006) { + if (GameConstants.isFreeMarketRoom(chr.getMapId()) || itemId > 5030000 && itemId < 5030012 || itemId > 5140000 && itemId < 5140006) { if (createType == 4) { MaplePlayerShop shop = new MaplePlayerShop(c.getPlayer(), desc); chr.setPlayerShop(shop); chr.getMap().addMapObject(shop); shop.sendShop(c); - c.announce(MaplePacketCreator.getPlayerShopRemoveVisitor(1)); + c.getWorldServer().registerPlayerShop(shop); + //c.announce(MaplePacketCreator.getPlayerShopRemoveVisitor(1)); } else { - HiredMerchant merchant = new HiredMerchant(chr, itemId, desc); + MapleHiredMerchant merchant = new MapleHiredMerchant(chr, itemId, desc); chr.setHiredMerchant(merchant); c.getWorldServer().registerHiredMerchant(merchant); chr.getClient().getChannelServer().addHiredMerchant(chr.getId(), merchant); @@ -201,15 +202,7 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler { MapleMapObject ob = chr.getMap().getMapObject(oid); if (ob instanceof MaplePlayerShop) { MaplePlayerShop shop = (MaplePlayerShop) ob; - if (shop.isBanned(chr.getName())) { - chr.dropMessage(1, "You have been banned from this store."); - return; - } - if (shop.hasFreeSlot() && !shop.isVisitor(c.getPlayer())) { - shop.addVisitor(c.getPlayer()); - chr.setPlayerShop(shop); - shop.sendShop(c); - } + shop.visitShop(chr); } else if (ob instanceof MapleMiniGame) { MapleMiniGame game = (MapleMiniGame) ob; if (game.hasFreeSlot() && !game.isVisitor(c.getPlayer())) { @@ -226,14 +219,15 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler { } else { chr.getClient().announce(MaplePacketCreator.getMiniGameFull()); } - } else if (ob instanceof HiredMerchant && chr.getHiredMerchant() == null) { - HiredMerchant merchant = (HiredMerchant) ob; + } else if (ob instanceof MapleHiredMerchant && chr.getHiredMerchant() == null) { + MapleHiredMerchant merchant = (MapleHiredMerchant) ob; if (merchant.isOwner(c.getPlayer())) { merchant.setOpen(false); - merchant.removeAllVisitors(""); + merchant.removeAllVisitors(); + c.announce(MaplePacketCreator.getHiredMerchant(chr, merchant, false)); } else if (!merchant.isOpen()) { - chr.dropMessage(1, "This shop is in maintenance, please come by later."); + c.announce(MaplePacketCreator.hiredMerchantMaintenanceMessage()); return; } else if (merchant.getFreeSlotThreadsafe() == -1) { chr.dropMessage(1, "This shop has reached it's maximum capacity, please come by later."); @@ -246,7 +240,7 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler { } } } else if (mode == Action.CHAT.getCode()) { // chat lol - HiredMerchant merchant = chr.getHiredMerchant(); + MapleHiredMerchant merchant = chr.getHiredMerchant(); if (chr.getTrade() != null) { chr.getTrade().chat(slea.readMapleAsciiString()); } else if (chr.getPlayerShop() != null) { //mini game @@ -272,10 +266,18 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler { } } else if (mode == Action.OPEN.getCode()) { MaplePlayerShop shop = chr.getPlayerShop(); - HiredMerchant merchant = chr.getHiredMerchant(); + MapleHiredMerchant merchant = chr.getHiredMerchant(); if (shop != null && shop.isOwner(c.getPlayer())) { slea.readByte();//01 + + if(ServerConstants.USE_ERASE_PERMIT_ON_OPENSHOP) { + try { + MapleInventoryManipulator.removeById(c, MapleInventoryType.CASH, 5140000, 1, true, false); + } catch(RuntimeException re) {} // fella does not have a player shop permit... + } + chr.getMap().broadcastMessage(MaplePacketCreator.addCharBox(c.getPlayer(), 4)); + shop.setOpen(true); } else if (merchant != null && merchant.isOwner(c.getPlayer())) { chr.setHasMerchant(true); merchant.setOpen(true); @@ -430,7 +432,7 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler { sellItem.setQuantity(perBundle); MaplePlayerShopItem item = new MaplePlayerShopItem(sellItem, bundles, price); MaplePlayerShop shop = chr.getPlayerShop(); - HiredMerchant merchant = chr.getHiredMerchant(); + MapleHiredMerchant merchant = chr.getHiredMerchant(); if (shop != null && shop.isOwner(c.getPlayer())) { if (ivItem != null && ivItem.getQuantity() >= bundles * perBundle) { shop.addItem(item); @@ -476,7 +478,7 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler { c.announce(MaplePacketCreator.updateHiredMerchant(chr.getHiredMerchant(), chr)); }*/ } else if (mode == Action.MERCHANT_ORGANIZE.getCode()) { - HiredMerchant merchant = chr.getHiredMerchant(); + MapleHiredMerchant merchant = chr.getHiredMerchant(); if (!merchant.isOwner(chr)) return; if (chr.getMerchantMeso() > 0) { @@ -513,19 +515,16 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler { return; } MaplePlayerShop shop = chr.getPlayerShop(); - HiredMerchant merchant = chr.getHiredMerchant(); - if (merchant != null && merchant.getOwner().equals(chr.getName())) { - return; - } + MapleHiredMerchant merchant = chr.getHiredMerchant(); if (shop != null && shop.isVisitor(c.getPlayer())) { shop.buy(c, item, quantity); shop.broadcast(MaplePacketCreator.getPlayerShopItemUpdate(shop)); - } else if (merchant != null) { + } else if (merchant != null && !merchant.isOwner(chr)) { merchant.buy(c, item, quantity); merchant.broadcastToVisitorsThreadsafe(MaplePacketCreator.updateHiredMerchant(merchant, c.getPlayer())); } } else if (mode == Action.TAKE_ITEM_BACK.getCode()) { - HiredMerchant merchant = chr.getHiredMerchant(); + MapleHiredMerchant merchant = chr.getHiredMerchant(); if (merchant != null && merchant.isOwner(c.getPlayer())) { int slot = slea.readShort(); MaplePlayerShopItem item = merchant.getItems().get(slot); @@ -542,7 +541,7 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler { c.announce(MaplePacketCreator.updateHiredMerchant(merchant, c.getPlayer())); } } else if (mode == Action.CLOSE_MERCHANT.getCode()) { - HiredMerchant merchant = chr.getHiredMerchant(); + MapleHiredMerchant merchant = chr.getHiredMerchant(); if (merchant != null && merchant.isOwner(c.getPlayer())) { c.announce(MaplePacketCreator.hiredMerchantOwnerLeave()); c.announce(MaplePacketCreator.leaveHiredMerchant(0x00, 0x03)); @@ -550,18 +549,23 @@ public final class PlayerInteractionHandler extends AbstractMaplePacketHandler { chr.setHasMerchant(false); } } else if (mode == Action.MAINTENANCE_OFF.getCode()) { - HiredMerchant merchant = chr.getHiredMerchant(); - if (merchant.getItems().isEmpty() && merchant.isOwner(c.getPlayer())) { - merchant.closeShop(c, false); - chr.setHasMerchant(false); - } - if (merchant != null && merchant.isOwner(c.getPlayer())) { - merchant.clearMessages(); - merchant.setOpen(true); + MapleHiredMerchant merchant = chr.getHiredMerchant(); + if(merchant != null) { + if (merchant.getItems().isEmpty() && merchant.isOwner(c.getPlayer())) { + merchant.closeShop(c, false); + chr.setHasMerchant(false); + } + if (merchant.isOwner(c.getPlayer())) { + merchant.clearMessages(); + merchant.setOpen(true); + } } + chr.setHiredMerchant(null); c.announce(MaplePacketCreator.enableActions()); } else if (mode == Action.BAN_PLAYER.getCode()) { + slea.skip(1); + if (chr.getPlayerShop() != null && chr.getPlayerShop().isOwner(c.getPlayer())) { chr.getPlayerShop().banPlayer(slea.readMapleAsciiString()); } diff --git a/src/net/server/channel/handlers/PlayerLoggedinHandler.java b/src/net/server/channel/handlers/PlayerLoggedinHandler.java index 6bdddcd606..6573b99da1 100644 --- a/src/net/server/channel/handlers/PlayerLoggedinHandler.java +++ b/src/net/server/channel/handlers/PlayerLoggedinHandler.java @@ -278,7 +278,7 @@ public final class PlayerLoggedinHandler extends AbstractMaplePacketHandler { } */ if (player.isGM()){ - Server.getInstance().broadcastGMMessage(MaplePacketCreator.earnTitleMessage("GM " + player.getName() + " has logged in")); + Server.getInstance().broadcastGMMessage(MaplePacketCreator.earnTitleMessage((player.gmLevel() < 6 ? "GM " : "Admin ") + player.getName() + " has logged in")); } } diff --git a/src/net/server/channel/handlers/RemoteStoreHandler.java b/src/net/server/channel/handlers/RemoteStoreHandler.java index 06ec2f31f9..0f6aaa8877 100644 --- a/src/net/server/channel/handlers/RemoteStoreHandler.java +++ b/src/net/server/channel/handlers/RemoteStoreHandler.java @@ -25,9 +25,7 @@ package net.server.channel.handlers; import client.MapleCharacter; import client.MapleClient; import net.AbstractMaplePacketHandler; -import net.server.channel.Channel; -import net.server.Server; -import server.maps.HiredMerchant; +import server.maps.MapleHiredMerchant; import tools.MaplePacketCreator; import tools.data.input.SeekableLittleEndianAccessor; @@ -38,30 +36,27 @@ import tools.data.input.SeekableLittleEndianAccessor; public class RemoteStoreHandler extends AbstractMaplePacketHandler { public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { MapleCharacter chr = c.getPlayer(); - HiredMerchant hm = getMerchant(c); + MapleHiredMerchant hm = getMerchant(c); if (chr.hasMerchant() && hm != null) { if (hm.getChannel() == chr.getClient().getChannel()) { hm.setOpen(false); - hm.removeAllVisitors(""); + hm.removeAllVisitors(); chr.setHiredMerchant(hm); + chr.announce(MaplePacketCreator.getHiredMerchant(chr, hm, false)); } else { c.announce(MaplePacketCreator.remoteChannelChange((byte) (hm.getChannel() - 1))); } return; } else { - chr.dropMessage(1, "You don't have a Merchant open"); + chr.dropMessage(1, "You don't have a Merchant open."); } c.announce(MaplePacketCreator.enableActions()); } - public HiredMerchant getMerchant(MapleClient c) { + private MapleHiredMerchant getMerchant(MapleClient c) { if (c.getPlayer().hasMerchant()) { - for (Channel cserv : Server.getInstance().getChannelsFromWorld(c.getWorld())) { - if (cserv.getHiredMerchants().get(c.getPlayer().getId()) != null) { - return cserv.getHiredMerchants().get(c.getPlayer().getId()); - } - } + return c.getWorldServer().getHiredMerchant(c.getPlayer().getId()); } return null; } diff --git a/src/net/server/channel/handlers/UseCashItemHandler.java b/src/net/server/channel/handlers/UseCashItemHandler.java index f14cf9f789..6ae08f56fa 100644 --- a/src/net/server/channel/handlers/UseCashItemHandler.java +++ b/src/net/server/channel/handlers/UseCashItemHandler.java @@ -45,9 +45,11 @@ import net.server.Server; import scripting.npc.NPCScriptManager; import server.MapleInventoryManipulator; import server.MapleItemInformationProvider; +import server.MaplePlayerShopItem; import server.MapleShop; import server.MapleShopFactory; import server.TimerManager; +import server.maps.AbstractMapleMapObject; import server.maps.MapleMap; import server.maps.MapleTVEffect; import tools.MaplePacketCreator; @@ -436,6 +438,16 @@ public final class UseCashItemHandler extends AbstractMaplePacketHandler { player.gainMeso(ii.getMeso(itemId), true, false, true); remove(c, itemId); c.announce(MaplePacketCreator.enableActions()); + } else if (itemType == 523) { + int itemid = slea.readInt(); + + player.setOwlSearch(itemid); + List> hmsAvailable = c.getWorldServer().getAvailableItemBundles(itemid); + if(!hmsAvailable.isEmpty()) remove(c, itemId); + + c.announce(MaplePacketCreator.owlOfMinerva(c, itemid, hmsAvailable)); + c.announce(MaplePacketCreator.enableActions()); + } else if (itemType == 524) { for (byte i = 0; i < 3; i++) { MaplePet pet = player.getPet(i); diff --git a/src/net/server/channel/handlers/UseOwlOfMinervaHandler.java b/src/net/server/channel/handlers/UseOwlOfMinervaHandler.java new file mode 100644 index 0000000000..530c89139f --- /dev/null +++ b/src/net/server/channel/handlers/UseOwlOfMinervaHandler.java @@ -0,0 +1,35 @@ +/* + This file is part of the OdinMS Maple Story Server + Copyright (C) 2008 Patrick Huy + Matthias Butz + Jan Christian Meyer + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation version 3 as published by + the Free Software Foundation. You may not use, modify or distribute + this program under any other version of the GNU Affero General Public + License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ +package net.server.channel.handlers; + +import client.MapleClient; +import net.AbstractMaplePacketHandler; +import tools.data.input.SeekableLittleEndianAccessor; +import tools.MaplePacketCreator; + +public final class UseOwlOfMinervaHandler extends AbstractMaplePacketHandler { + + @Override + public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { + c.announce(MaplePacketCreator.getOwlOpen()); + } +} \ No newline at end of file diff --git a/src/net/server/channel/handlers/UseSummonBag.java b/src/net/server/channel/handlers/UseSummonBagHandler.java similarity index 97% rename from src/net/server/channel/handlers/UseSummonBag.java rename to src/net/server/channel/handlers/UseSummonBagHandler.java index de9d5ec737..4e4e2866af 100644 --- a/src/net/server/channel/handlers/UseSummonBag.java +++ b/src/net/server/channel/handlers/UseSummonBagHandler.java @@ -36,7 +36,7 @@ import tools.data.input.SeekableLittleEndianAccessor; * * @author AngelSL */ -public final class UseSummonBag extends AbstractMaplePacketHandler { +public final class UseSummonBagHandler extends AbstractMaplePacketHandler { @Override public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) { diff --git a/src/net/server/worker/RankingWorker.java b/src/net/server/worker/RankingWorker.java index 10eed76d7c..74cc4b39dc 100644 --- a/src/net/server/worker/RankingWorker.java +++ b/src/net/server/worker/RankingWorker.java @@ -46,7 +46,7 @@ public class RankingWorker implements Runnable { } private void updateRanking(int job, int world) throws SQLException { - String sqlCharSelect = "SELECT c.id, " + (job != -1 ? "c.jobRank, c.jobRankMove" : "c.rank, c.rankMove") + ", a.lastlogin AS lastlogin, a.loggedin FROM characters AS c LEFT JOIN accounts AS a ON c.accountid = a.id WHERE c.world = ? "; + String sqlCharSelect = "SELECT c.id, " + (job != -1 ? "c.jobRank, c.jobRankMove" : "c.rank, c.rankMove") + ", a.lastlogin AS lastlogin, a.loggedin FROM characters AS c LEFT JOIN accounts AS a ON c.accountid = a.id WHERE c.gm < 2 AND c.world = ? "; if (job != -1) { sqlCharSelect += "AND c.job DIV 100 = ? "; } diff --git a/src/net/server/world/World.java b/src/net/server/world/World.java index 17683c65a1..43eb976665 100644 --- a/src/net/server/world/World.java +++ b/src/net/server/world/World.java @@ -34,6 +34,7 @@ import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.LinkedList; import java.util.List; import java.util.HashMap; @@ -45,7 +46,8 @@ import java.util.HashSet; import java.util.concurrent.ScheduledFuture; import server.TimerManager; -import server.maps.HiredMerchant; +import server.maps.MapleHiredMerchant; +import server.MaplePlayerShop; import net.server.worker.CharacterAutosaverWorker; import net.server.worker.MountTirednessWorker; import net.server.worker.PetFullnessWorker; @@ -56,8 +58,11 @@ import net.server.channel.CharacterIdChannelPair; import net.server.guild.MapleGuild; import net.server.guild.MapleGuildCharacter; import net.server.guild.MapleGuildSummary; +import server.MaplePlayerShopItem; +import server.maps.AbstractMapleMapObject; import tools.DatabaseConnection; import tools.MaplePacketCreator; +import tools.Pair; /** * @@ -85,9 +90,11 @@ public class World { private ScheduledFuture mountsSchedule; private long mountUpdate; - private Map activeMerchants = new LinkedHashMap<>(); + private Map> activeMerchants = new LinkedHashMap<>(); private long merchantUpdate; + private Map activePlayerShops = new LinkedHashMap<>(); + private ScheduledFuture charactersSchedule; public World(int world, int flag, String eventmsg, int exprate, int droprate, int mesorate, int bossdroprate) { @@ -778,47 +785,96 @@ public class World { } } - public void registerHiredMerchant(HiredMerchant hm) { + public void registerPlayerShop(MaplePlayerShop ps) { + synchronized(activePlayerShops) { + activePlayerShops.put(ps.getOwner().getId(), ps); + } + } + + public void unregisterPlayerShop(MaplePlayerShop ps) { + synchronized(activePlayerShops) { + activePlayerShops.remove(ps.getOwner().getId()); + } + } + + public List getActivePlayerShops() { + List psList = new ArrayList<>(); + synchronized(activePlayerShops) { + for(MaplePlayerShop mps : activePlayerShops.values()) { + psList.add(mps); + } + + return psList; + } + } + + public MaplePlayerShop getPlayerShop(int ownerid) { + synchronized(activePlayerShops) { + return activePlayerShops.get(ownerid); + } + } + + public void registerHiredMerchant(MapleHiredMerchant hm) { synchronized(activeMerchants) { byte initProc; if(System.currentTimeMillis() - merchantUpdate > 5 * 60 * 1000) initProc = 1; else initProc = 0; - activeMerchants.put(hm, initProc); + activeMerchants.put(hm.getOwnerId(), new Pair<>(hm, initProc)); } } - public void unregisterHiredMerchant(HiredMerchant hm) { + public void unregisterHiredMerchant(MapleHiredMerchant hm) { synchronized(activeMerchants) { - activeMerchants.remove(hm); + activeMerchants.remove(hm.getOwnerId()); } } public void runHiredMerchantSchedule() { - Map deployedMerchants; + Map> deployedMerchants; synchronized(activeMerchants) { merchantUpdate = System.currentTimeMillis(); - deployedMerchants = Collections.unmodifiableMap(activeMerchants); - } + deployedMerchants = new LinkedHashMap<>(activeMerchants); - for(Map.Entry dm: deployedMerchants.entrySet()) { - byte timeOn = dm.getValue(); - - if(timeOn <= 144) { // 1440 minutes == 24hrs - synchronized(activeMerchants) { - activeMerchants.put(dm.getKey(), (byte)(timeOn + 1)); - } - } else { - HiredMerchant hm = dm.getKey(); - hm.forceClose(); - this.getChannel(hm.getChannel()).removeHiredMerchant(hm.getOwnerId()); + for(Map.Entry> dm: deployedMerchants.entrySet()) { + byte timeOn = dm.getValue().getRight(); + MapleHiredMerchant hm = dm.getValue().getLeft(); - synchronized(activeMerchants) { + if(timeOn <= 144) { // 1440 minutes == 24hrs + activeMerchants.put(hm.getOwnerId(), new Pair<>(dm.getValue().getLeft(), (byte)(timeOn + 1))); + } else { + hm.forceClose(); + this.getChannel(hm.getChannel()).removeHiredMerchant(hm.getOwnerId()); + activeMerchants.remove(dm.getKey()); } } } } + + public List getActiveMerchants() { + List hmList = new ArrayList<>(); + synchronized(activeMerchants) { + for(Pair hmp : activeMerchants.values()) { + MapleHiredMerchant hm = hmp.getLeft(); + if(hm.isOpen()) { + hmList.add(hm); + } + } + + return hmList; + } + } + + public MapleHiredMerchant getHiredMerchant(int ownerid) { + synchronized(activeMerchants) { + if(activeMerchants.containsKey(ownerid)) { + return activeMerchants.get(ownerid).getLeft(); + } + + return null; + } + } public void setServerMessage(String msg) { for (Channel ch : channels) { @@ -832,6 +888,36 @@ public class World { } } + public List> getAvailableItemBundles(int itemid) { + List> hmsAvailable = new ArrayList<>(); + + for (MapleHiredMerchant hm : getActiveMerchants()) { + List itemBundles = hm.sendAvailableBundles(itemid); + + for(MaplePlayerShopItem mpsi : itemBundles) { + hmsAvailable.add(new Pair<>(mpsi, (AbstractMapleMapObject) hm)); + } + } + + for (MaplePlayerShop ps : getActivePlayerShops()) { + List itemBundles = ps.sendAvailableBundles(itemid); + + for(MaplePlayerShopItem mpsi : itemBundles) { + hmsAvailable.add(new Pair<>(mpsi, (AbstractMapleMapObject) ps)); + } + } + + Collections.sort(hmsAvailable, new Comparator>() { + @Override + public int compare(Pair p1, Pair p2) { + return p1.getLeft().getPrice() - p2.getLeft().getPrice(); + } + }); + + hmsAvailable.subList(0, Math.min(hmsAvailable.size(), 200)); //truncates the list to have up to 200 elements + return hmsAvailable; + } + public final void shutdown() { for (Channel ch : getChannels()) { ch.shutdown(); diff --git a/src/server/MapleInventoryManipulator.java b/src/server/MapleInventoryManipulator.java index 27fa978d16..a5d13dfe19 100644 --- a/src/server/MapleInventoryManipulator.java +++ b/src/server/MapleInventoryManipulator.java @@ -267,6 +267,7 @@ public class MapleInventoryManipulator { public static int checkSpaceProgressively(MapleClient c, int itemid, int quantity, String owner, int usedSlots) { // return value --> bit0: if has space for this one; // value after: new slots filled; + // assumption: equipments always have slotMax == 1. int returnValue; @@ -302,9 +303,11 @@ public class MapleInventoryManipulator { returnValue = ((numSlotsNeeded + usedSlots) << 1); returnValue += (numSlotsNeeded == 0 || !c.getPlayer().getInventory(type).isFullAfterSomeItems(numSlotsNeeded - 1, usedSlots)) ? 1 : 0; + //System.out.print(" needed " + numSlotsNeeded + " used " + usedSlots + " rval " + returnValue); } else { - returnValue = ((1 + usedSlots) << 1); + returnValue = ((quantity + usedSlots) << 1); returnValue += (!c.getPlayer().getInventory(type).isFullAfterSomeItems(0, usedSlots)) ? 1 : 0; + //System.out.print(" eqpneeded " + 1 + " used " + usedSlots + " rval " + returnValue); } return returnValue; diff --git a/src/server/MapleItemInformationProvider.java b/src/server/MapleItemInformationProvider.java index d93f683f8a..7b91c3cb43 100644 --- a/src/server/MapleItemInformationProvider.java +++ b/src/server/MapleItemInformationProvider.java @@ -916,20 +916,13 @@ public class MapleItemInformationProvider { } nEquip.setLevel((byte) (nEquip.getLevel() + 1)); } - } - - if (ServerConstants.USE_PERFECT_SCROLLING == false && !ItemConstants.isCleanSlate(scrollId)) { - if (!assertGM && !usingWhiteScroll) { + } else { + if (ServerConstants.USE_PERFECT_SCROLLING == false && !usingWhiteScroll && !ItemConstants.isCleanSlate(scrollId) && !assertGM) { nEquip.setUpgradeSlots((byte) (nEquip.getUpgradeSlots() - 1)); } - //nEquip.setLevel((byte) (nEquip.getLevel() + 1)); - } - } else { - if (!usingWhiteScroll && !ItemConstants.isCleanSlate(scrollId) && !assertGM) { - nEquip.setUpgradeSlots((byte) (nEquip.getUpgradeSlots() - 1)); - } - if (Randomizer.nextInt(101) < stats.get("cursed")) { - return null; + if (Randomizer.nextInt(101) < stats.get("cursed")) { + return null; + } } } } diff --git a/src/server/MaplePlayerShop.java b/src/server/MaplePlayerShop.java index ecb2b0984b..985a25f305 100644 --- a/src/server/MaplePlayerShop.java +++ b/src/server/MaplePlayerShop.java @@ -26,25 +26,33 @@ import client.MapleClient; import client.inventory.Item; import java.util.ArrayList; import java.util.Collections; +import java.util.LinkedList; import java.util.List; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import net.SendOpcode; import server.maps.AbstractMapleMapObject; import server.maps.MapleMapObjectType; import tools.MaplePacketCreator; +import tools.Pair; import tools.data.output.MaplePacketLittleEndianWriter; /** * * @author Matze + * @author Ronan (concurrency protection) */ public class MaplePlayerShop extends AbstractMapleMapObject { + private AtomicBoolean open = new AtomicBoolean(false); private MapleCharacter owner; private MapleCharacter[] visitors = new MapleCharacter[3]; private List items = new ArrayList<>(); - private MapleCharacter[] slot = {null, null, null}; private String description; private int boughtnumber = 0; private List bannedList = new ArrayList<>(); + private List> chatLog = new LinkedList<>(); + private Map chatSlot = new LinkedHashMap<>(); public MaplePlayerShop(MapleCharacter owner, String description) { this.setPosition(owner.getPosition()); @@ -52,96 +60,145 @@ public class MaplePlayerShop extends AbstractMapleMapObject { this.description = description; } + public int getChannel() { + return owner.getClient().getChannel(); + } + + public int getMapId() { + return owner.getMapId(); + } + + public boolean isOpen() { + return open.get(); + } + + public void setOpen(boolean openShop) { + open.set(openShop); + } + public boolean hasFreeSlot() { - return visitors[0] == null || visitors[1] == null || visitors[2] == null; + synchronized (visitors) { + return visitors[0] == null || visitors[1] == null || visitors[2] == null; + } } public boolean isOwner(MapleCharacter c) { return owner.equals(c); } - public void addVisitor(MapleCharacter visitor) { - for (int i = 0; i < 3; i++) { - if (visitors[i] == null) { - visitors[i] = visitor; - if (this.getSlot(0) == null) { - this.setSlot(visitor, 0); - this.broadcast(MaplePacketCreator.getPlayerShopNewVisitor(visitor, 1)); - } else if (this.getSlot(1) == null) { - this.setSlot(visitor, 1); - this.broadcast(MaplePacketCreator.getPlayerShopNewVisitor(visitor, 2)); - } else if (this.getSlot(2) == null) { - this.setSlot(visitor, 2); - this.broadcast(MaplePacketCreator.getPlayerShopNewVisitor(visitor, 3)); - visitor.getMap().broadcastMessage(MaplePacketCreator.addCharBox(this.getOwner(), 1)); + private void addVisitor(MapleCharacter visitor) { + synchronized (visitors) { + for (int i = 0; i < 3; i++) { + if (visitors[i] == null) { + visitors[i] = visitor; + visitor.setSlot(i); + this.broadcast(MaplePacketCreator.getPlayerShopNewVisitor(visitor, i + 1)); + + if(i == 2) visitor.getMap().broadcastMessage(MaplePacketCreator.addCharBox(this.getOwner(), 1)); + break; } - break; } } } - public void removeVisitor(MapleCharacter visitor) { + public void forceRemoveVisitor(MapleCharacter visitor) { if (visitor == owner) { owner.getMap().removeMapObject(this); owner.setPlayerShop(null); } for (int i = 0; i < 3; i++) { if (visitors[i] != null && visitors[i].getId() == visitor.getId()) { - int slot_ = visitor.getSlot(); visitors[i] = null; - this.setSlot(null, i); visitor.setSlot(-1); - this.broadcast(MaplePacketCreator.getPlayerShopRemoveVisitor(slot_ + 1)); + this.broadcast(MaplePacketCreator.getPlayerShopRemoveVisitor(i + 1)); return; } } } + + public void removeVisitor(MapleCharacter visitor) { + if (visitor == owner) { + owner.getMap().removeMapObject(this); + owner.setPlayerShop(null); + } else { + synchronized (visitors) { + for (int i = 0; i < 3; i++) { + if (visitors[i] != null && visitors[i].getId() == visitor.getId()) { + visitor.setSlot(-1); //absolutely cant remove player slot for late players without dc'ing them... heh + + for(int j = i; j < 2; j++) { + if(visitors[j] != null) owner.announce(MaplePacketCreator.getPlayerShopRemoveVisitor(j + 1)); + visitors[j] = visitors[j + 1]; + if(visitors[j] != null) visitors[j].setSlot(j); + } + visitors[2] = null; + for(int j = i; j < 2; j++) { + if(visitors[j] != null) owner.announce(MaplePacketCreator.getPlayerShopNewVisitor(visitors[j], j + 1)); + } + + this.broadcastRestoreToVisitors(); + return; + } + } + } + + if(this.getOwner().getPlayerShop() != null) visitor.getMap().broadcastMessage(MaplePacketCreator.addCharBox(this.getOwner(), 4)); + } + } public boolean isVisitor(MapleCharacter visitor) { - return visitors[0] == visitor || visitors[1] == visitor || visitors[2] == visitor; + synchronized (visitors) { + return visitors[0] == visitor || visitors[1] == visitor || visitors[2] == visitor; + } } public void addItem(MaplePlayerShopItem item) { - items.add(item); + synchronized (items) { + items.add(item); + } } public void removeItem(int item) { - items.remove(item); + synchronized (items) { + items.remove(item); + } } /** - * no warnings for now o.op + * no warnings for now o.o * @param c * @param item * @param quantity */ public void buy(MapleClient c, int item, short quantity) { - if (isVisitor(c.getPlayer())) { - MaplePlayerShopItem pItem = items.get(item); - Item newItem = pItem.getItem().copy(); - newItem.setQuantity(newItem.getQuantity()); - if (quantity < 1 || pItem.getBundles() < 1 || newItem.getQuantity() > pItem.getBundles() || !pItem.isExist()) { - return; - } else if (newItem.getType() == 1 && newItem.getQuantity() > 1) { - return; - } - synchronized (c.getPlayer()) { - if (c.getPlayer().getMeso() >= (long) pItem.getPrice() * quantity) { - if (MapleInventoryManipulator.addFromDrop(c, newItem, false)) { - c.getPlayer().gainMeso(-pItem.getPrice() * quantity, true); - owner.gainMeso(pItem.getPrice() * quantity, true); - pItem.setBundles((short) (pItem.getBundles() - quantity)); - if (pItem.getBundles() < 1) { - pItem.setDoesExist(false); - if (++boughtnumber == items.size()) { - owner.setPlayerShop(null); - owner.getMap().broadcastMessage(MaplePacketCreator.removeCharBox(owner)); - this.removeVisitors(); - owner.dropMessage(1, "Your items are sold out, and therefore your shop is closed."); + synchronized (items) { + if (isVisitor(c.getPlayer())) { + MaplePlayerShopItem pItem = items.get(item); + Item newItem = pItem.getItem().copy(); + newItem.setQuantity(newItem.getQuantity()); + if (quantity < 1 || pItem.getBundles() < 1 || newItem.getQuantity() > pItem.getBundles() || !pItem.isExist()) { + return; + } else if (newItem.getType() == 1 && newItem.getQuantity() > 1) { + return; + } + synchronized (c.getPlayer()) { + if (c.getPlayer().getMeso() >= (long) pItem.getPrice() * quantity) { + if (MapleInventoryManipulator.addFromDrop(c, newItem, false)) { + c.getPlayer().gainMeso(-pItem.getPrice() * quantity, true); + owner.gainMeso(pItem.getPrice() * quantity, true); + pItem.setBundles((short) (pItem.getBundles() - quantity)); + if (pItem.getBundles() < 1) { + pItem.setDoesExist(false); + if (++boughtnumber == items.size()) { + owner.setPlayerShop(null); + this.setOpen(false); + this.closeShop(); + owner.dropMessage(1, "Your items are sold out, and therefore your shop is closed."); + } } + } else { + c.getPlayer().dropMessage(1, "Your inventory is full. Please clean a slot before buying this item."); } - } else { - c.getPlayer().dropMessage(1, "Your inventory is full. Please clean a slot before buying this item."); } } } @@ -149,26 +206,51 @@ public class MaplePlayerShop extends AbstractMapleMapObject { } public void broadcastToVisitors(final byte[] packet) { - for (int i = 0; i < 3; i++) { - if (visitors[i] != null) { - visitors[i].getClient().announce(packet); + synchronized (visitors) { + for (int i = 0; i < 3; i++) { + if (visitors[i] != null) { + visitors[i].getClient().announce(packet); + } } } } + + public void broadcastRestoreToVisitors() { + synchronized (visitors) { + for (int i = 0; i < 3; i++) { + if (visitors[i] != null) { + visitors[i].getClient().announce(MaplePacketCreator.getPlayerShopRemoveVisitor(i + 1)); + } + } + + for (int i = 0; i < 3; i++) { + if (visitors[i] != null) { + visitors[i].getClient().announce(MaplePacketCreator.getPlayerShop(this, false)); + } + } + + recoverChatLog(); + } + } public void removeVisitors() { - try { - for (int i = 0; i < 3; i++) { - if (visitors[i] != null) { - visitors[i].getClient().announce(MaplePacketCreator.shopErrorMessage(10, 1)); - removeVisitor(visitors[i]); + List visitorList = new ArrayList<>(3); + synchronized (visitors) { + try { + for (int i = 0; i < 3; i++) { + if (visitors[i] != null) { + visitors[i].getClient().announce(MaplePacketCreator.shopErrorMessage(10, 1)); + visitorList.add(visitors[i]); + } } + } catch (Exception e) { + e.printStackTrace(); } - } catch (Exception e) { - e.printStackTrace(); } + + for(MapleCharacter mc : visitorList) forceRemoveVisitor(mc); if (owner != null) { - removeVisitor(getOwner()); + forceRemoveVisitor(getOwner()); } } @@ -188,23 +270,61 @@ public class MaplePlayerShop extends AbstractMapleMapObject { broadcastToVisitors(packet); } - public void chat(MapleClient c, String chat) { + private byte getVisitorSlot(MapleCharacter chr) { byte s = 0; for (MapleCharacter mc : getVisitors()) { s++; if (mc != null) { - if (mc.getName().equalsIgnoreCase(c.getPlayer().getName())) { + if (mc.getName().equalsIgnoreCase(chr.getName())) { break; } } else if (s == 3) { s = 0; } } + + return s; + } + + public void chat(MapleClient c, String chat) { + byte s = getVisitorSlot(c.getPlayer()); + + synchronized(chatLog) { + chatLog.add(new Pair<>(c.getPlayer(), chat)); + if(chatLog.size() > 25) chatLog.remove(0); + chatSlot.put(c.getPlayer().getId(), s); + } + broadcast(MaplePacketCreator.getPlayerShopChat(c.getPlayer(), chat, s)); } + + private void recoverChatLog() { + synchronized(chatLog) { + for(Pair it : chatLog) { + MapleCharacter chr = it.getLeft(); + Byte pos = chatSlot.get(chr.getId()); + + broadcastToVisitors(MaplePacketCreator.getPlayerShopChat(chr, it.getRight(), pos)); + } + } + } + + private void clearChatLog() { + synchronized(chatLog) { + chatLog.clear(); + } + } + + public void closeShop() { + owner.getMap().broadcastMessage(MaplePacketCreator.removeCharBox(owner)); + clearChatLog(); + removeVisitors(); + } public void sendShop(MapleClient c) { - c.announce(MaplePacketCreator.getPlayerShop(c, this, isOwner(c.getPlayer()))); + synchronized(visitors) { + c.announce(MaplePacketCreator.getPlayerShop(this, isOwner(c.getPlayer()))); + } } public MapleCharacter getOwner() { @@ -212,22 +332,28 @@ public class MaplePlayerShop extends AbstractMapleMapObject { } public MapleCharacter[] getVisitors() { - return visitors; - } - - public MapleCharacter getSlot(int s) { - return slot[s]; - } - - private void setSlot(MapleCharacter person, int s) { - slot[s] = person; - if (person != null) { - person.setSlot(s); + synchronized(visitors) { + MapleCharacter[] copy = new MapleCharacter[3]; + for(int i = 0; i < visitors.length; i++) copy[i] = visitors[i]; + + return copy; } } public List getItems() { - return Collections.unmodifiableList(items); + synchronized (items) { + return Collections.unmodifiableList(items); + } + } + + public boolean hasItem(int itemid) { + for(MaplePlayerShopItem mpsi : getItems()) { + if(mpsi.getItem().getItemId() == itemid && mpsi.isExist() && mpsi.getBundles() > 0) { + return true; + } + } + + return false; } public String getDescription() { @@ -242,18 +368,64 @@ public class MaplePlayerShop extends AbstractMapleMapObject { if (!bannedList.contains(name)) { bannedList.add(name); } - for (int i = 0; i < 3; i++) { - if (visitors[i] != null && visitors[i].getName().equals(name)) { - visitors[i].getClient().announce(MaplePacketCreator.shopErrorMessage(5, 1)); - removeVisitor(visitors[i]); - return; //I'm guessing this was the intended action + + MapleCharacter target = null; + synchronized(visitors) { + for (int i = 0; i < 3; i++) { + if (visitors[i] != null && visitors[i].getName().equals(name)) { + target = visitors[i]; + break; + } } } + + if(target != null) { + target.getClient().announce(MaplePacketCreator.shopErrorMessage(5, 1)); + removeVisitor(target); + } } public boolean isBanned(String name) { return bannedList.contains(name); } + + public synchronized boolean visitShop(MapleCharacter chr) { + if(!open.get()) { + chr.dropMessage(1, "This store is not yet open."); + return false; + } + + if (this.isBanned(chr.getName())) { + chr.dropMessage(1, "You have been banned from this store."); + return false; + } + + if (this.hasFreeSlot() && !this.isVisitor(chr)) { + this.addVisitor(chr); + chr.setPlayerShop(this); + this.sendShop(chr.getClient()); + + return true; + } + + return false; + } + + public List sendAvailableBundles(int itemid) { + List list = new LinkedList<>(); + List all = new ArrayList<>(); + + synchronized (items) { + for(MaplePlayerShopItem mpsi : items) all.add(mpsi); + } + + for(MaplePlayerShopItem mpsi : all) { + if(mpsi.getItem().getItemId() == itemid && mpsi.getBundles() > 0 && mpsi.isExist()) { + list.add(mpsi); + } + } + return list; + } @Override public void sendDestroyData(MapleClient client) { diff --git a/src/server/maps/HiredMerchant.java b/src/server/maps/MapleHiredMerchant.java similarity index 90% rename from src/server/maps/HiredMerchant.java rename to src/server/maps/MapleHiredMerchant.java index 4761df7a3c..96a7692cd6 100644 --- a/src/server/maps/HiredMerchant.java +++ b/src/server/maps/MapleHiredMerchant.java @@ -35,6 +35,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import net.server.Server; import server.MapleInventoryManipulator; import server.MapleItemInformationProvider; @@ -46,8 +47,9 @@ import tools.Pair; /** * * @author XoticStory + * @author Ronan (concurrency protection) */ -public class HiredMerchant extends AbstractMapleMapObject { +public class MapleHiredMerchant extends AbstractMapleMapObject { private int ownerId, itemId, mesos = 0; private int channel, world; @@ -58,10 +60,10 @@ public class HiredMerchant extends AbstractMapleMapObject { private final List items = new LinkedList<>(); private List> messages = new LinkedList<>(); private List sold = new LinkedList<>(); - private boolean open; + private AtomicBoolean open = new AtomicBoolean(); private MapleMap map; - public HiredMerchant(final MapleCharacter owner, int itemId, String desc) { + public MapleHiredMerchant(final MapleCharacter owner, int itemId, String desc) { this.setPosition(owner.getPosition()); this.start = System.currentTimeMillis(); this.ownerId = owner.getId(); @@ -87,13 +89,17 @@ public class HiredMerchant extends AbstractMapleMapObject { } } - public void addVisitor(MapleCharacter visitor) { + public boolean addVisitor(MapleCharacter visitor) { synchronized(visitors) { int i = this.getFreeSlot(); if (i > -1) { visitors[i] = visitor; broadcastToVisitors(MaplePacketCreator.hiredMerchantVisitorAdd(visitor, i + 1)); + + return true; } + + return false; } } @@ -105,9 +111,7 @@ public class HiredMerchant extends AbstractMapleMapObject { } if (visitors[slot] != null && visitors[slot].getId() == visitor.getId()) { visitors[slot] = null; - if (slot != -1) { - broadcastToVisitors(MaplePacketCreator.hiredMerchantVisitorLeave(slot + 1)); - } + broadcastToVisitors(MaplePacketCreator.hiredMerchantVisitorLeave(slot + 1)); } } } @@ -127,15 +131,15 @@ public class HiredMerchant extends AbstractMapleMapObject { return -1; //Actually 0 because of the +1's. } - public void removeAllVisitors(String message) { + public void removeAllVisitors() { synchronized(visitors) { for (int i = 0; i < 3; i++) { if (visitors[i] != null) { visitors[i].setHiredMerchant(null); + visitors[i].getClient().announce(MaplePacketCreator.leaveHiredMerchant(i + 1, 0x11)); - if (message.length() > 0) { - visitors[i].dropMessage(1, message); - } + visitors[i].getClient().announce(MaplePacketCreator.hiredMerchantMaintenanceMessage()); + visitors[i] = null; } } @@ -163,7 +167,7 @@ public class HiredMerchant extends AbstractMapleMapObject { } int price = (int)Math.min((long)pItem.getPrice() * quantity, Integer.MAX_VALUE); if (c.getPlayer().getMeso() >= price) { - if (MapleInventoryManipulator.addFromDrop(c, newItem, true)) { + if (MapleInventoryManipulator.addFromDrop(c, newItem, false)) { c.getPlayer().gainMeso(-price, false); synchronized (sold) { @@ -322,6 +326,16 @@ public class HiredMerchant extends AbstractMapleMapObject { return Collections.unmodifiableList(items); } } + + public boolean hasItem(int itemid) { + for(MaplePlayerShopItem mpsi : getItems()) { + if(mpsi.getItem().getItemId() == itemid && mpsi.isExist() && mpsi.getBundles() > 0) { + return true; + } + } + + return false; + } public void addItem(MaplePlayerShopItem item) { synchronized (items) { @@ -367,11 +381,11 @@ public class HiredMerchant extends AbstractMapleMapObject { } public boolean isOpen() { - return open; + return open.get(); } public void setOpen(boolean set) { - this.open = set; + open.getAndSet(set); } public int getItemId() { @@ -389,7 +403,25 @@ public class HiredMerchant extends AbstractMapleMapObject { synchronized (messages) { messages.add(new Pair<>(message, slot)); } - broadcastToVisitors(MaplePacketCreator.hiredMerchantChat(message, slot)); + broadcastToVisitorsThreadsafe(MaplePacketCreator.hiredMerchantChat(message, slot)); + } + + public List sendAvailableBundles(int itemid) { + List list = new LinkedList<>(); + List all = new ArrayList<>(); + + if(!open.get()) return list; + + synchronized (items) { + for(MaplePlayerShopItem mpsi : items) all.add(mpsi); + } + + for(MaplePlayerShopItem mpsi : all) { + if(mpsi.getItem().getItemId() == itemid && mpsi.getBundles() > 0 && mpsi.isExist()) { + list.add(mpsi); + } + } + return list; } public void saveItems(boolean shutdown) throws SQLException { @@ -490,6 +522,10 @@ public class HiredMerchant extends AbstractMapleMapObject { public int getMapId() { return map.getId(); } + + public MapleMap getMap() { + return map; + } public List getSold() { synchronized (sold) { diff --git a/src/tools/MaplePacketCreator.java b/src/tools/MaplePacketCreator.java index 528b9955e4..ce5fee095c 100644 --- a/src/tools/MaplePacketCreator.java +++ b/src/tools/MaplePacketCreator.java @@ -62,7 +62,7 @@ import server.events.gm.MapleSnowball; import server.life.MapleMonster; import server.life.MapleNPC; import server.life.MobSkill; -import server.maps.HiredMerchant; +import server.maps.MapleHiredMerchant; import server.maps.MapleDoor; import server.maps.MapleDoorObject; import server.maps.MapleDragon; @@ -106,6 +106,7 @@ import constants.ServerConstants; import constants.skills.Buccaneer; import constants.skills.Corsair; import constants.skills.ThunderBreaker; +import server.maps.AbstractMapleMapObject; /** * @@ -686,7 +687,7 @@ public class MaplePacketCreator { mplew.writeBool(c.getGMLevel() > 0); - mplew.write(0); // Admin Byte. 0x80,0x40,0x20.. Rubbish. + mplew.write((c.getGMLevel() > 0 && Server.getInstance().canFly(c.getAccID())) ? 0x80 : 0); // Admin Byte. 0x80,0x40,0x20.. Rubbish. mplew.write(0); // Country Code. mplew.writeMapleAsciiString(c.getAccountName()); @@ -1856,11 +1857,13 @@ public class MaplePacketCreator { mplew.writeInt(chr.getMount().getExp()); mplew.writeInt(chr.getMount().getTiredness()); } - if (chr.getPlayerShop() != null && chr.getPlayerShop().isOwner(chr)) { - if (chr.getPlayerShop().hasFreeSlot()) { - addAnnounceBox(mplew, chr.getPlayerShop(), chr.getPlayerShop().getVisitors().length); + + MaplePlayerShop mps = chr.getPlayerShop(); + if (mps != null && mps.isOwner(chr)) { + if (mps.hasFreeSlot()) { + addAnnounceBox(mplew, mps, mps.getVisitors().length); } else { - addAnnounceBox(mplew, chr.getPlayerShop(), 1); + addAnnounceBox(mplew, mps, 1); } } else if (chr.getMiniGame() != null && chr.getMiniGame().isOwner(chr)) { if (chr.getMiniGame().hasFreeSlot()) { @@ -2728,8 +2731,8 @@ public class MaplePacketCreator { final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(4); mplew.writeShort(SendOpcode.PLAYER_INTERACTION.getValue()); mplew.write(PlayerInteractionHandler.Action.EXIT.getCode()); - if (slot > 0) { - mplew.write(slot); + if (slot != 0) { + mplew.writeShort(slot); } return mplew.getPacket(); } @@ -2794,7 +2797,7 @@ public class MaplePacketCreator { * @param owner * @return */ - public static byte[] getPlayerShop(MapleClient c, MaplePlayerShop shop, boolean owner) { + public static byte[] getPlayerShop(MaplePlayerShop shop, boolean owner) { final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.writeShort(SendOpcode.PLAYER_INTERACTION.getValue()); mplew.write(PlayerInteractionHandler.Action.ROOM.getCode()); @@ -2804,9 +2807,16 @@ public class MaplePacketCreator { mplew.write(0); addCharLook(mplew, shop.getOwner(), false); mplew.writeMapleAsciiString(shop.getOwner().getName()); - mplew.write(1); - addCharLook(mplew, shop.getOwner(), false); - mplew.writeMapleAsciiString(shop.getOwner().getName()); + + MapleCharacter visitors[] = shop.getVisitors(); + for(int i = 0; i < 3; i++) { + if(visitors[i] != null) { + mplew.write(i + 1); + addCharLook(mplew, visitors[i], false); + mplew.writeMapleAsciiString(visitors[i].getName()); + } + } + mplew.write(0xFF); mplew.writeMapleAsciiString(shop.getDescription()); List items = shop.getItems(); @@ -4943,38 +4953,84 @@ public class MaplePacketCreator { return mplew.getPacket(); } - public static byte[] owlOfMinerva(MapleClient c, int itemid, List hms, List items) { //Thanks moongra, you save me some time :) + // 0: Success + // 1: The room is already closed. + // 2: You can't enter the room due to full capacity. + // 3: Other requests are being fulfilled this minute. + // 4: You can't do it while you're dead. + // 7: You are not allowed to trade other items at this point. + // 17: You may not enter this store. + // 18: The owner of the store is currently undergoing store maintenance. Please try again in a bit. + // 23: This can only be used inside the Free Market. + // default: This character is unable to do it. + public static byte[] getOwlMessage(int msg) { + MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(3); + + mplew.writeShort(SendOpcode.SHOP_LINK_RESULT.getValue()); + mplew.write(msg); // depending on the byte sent, a different message is sent. + + return mplew.getPacket(); + } + + public static byte[] owlOfMinerva(MapleClient c, int itemid, List> hmsAvailable) { + byte itemType = MapleItemInformationProvider.getInstance().getInventoryType(itemid).getType(); + final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.writeShort(SendOpcode.SHOP_SCANNER_RESULT.getValue()); // header. mplew.write(6); mplew.writeInt(0); mplew.writeInt(itemid); - mplew.writeInt(hms.size()); - for (HiredMerchant hm : hms) { - for (MaplePlayerShopItem item : items) { - mplew.writeMapleAsciiString(hm.getOwner()); - mplew.writeInt(hm.getMapId()); - mplew.writeMapleAsciiString(hm.getDescription()); - mplew.writeInt(item.getItem().getQuantity()); - mplew.writeInt(item.getBundles()); - mplew.writeInt(item.getPrice()); - mplew.writeInt(hm.getOwnerId()); - mplew.write(hm.getFreeSlotThreadsafe() == -1 ? 1 : 0); - MapleCharacter chr = c.getChannelServer().getPlayerStorage().getCharacterById(hm.getOwnerId()); - if ((chr != null) && (c.getChannel() == hm.getChannel())) { - mplew.write(1); - } else { - mplew.write(2); - } - - if (item.getItem().getItemId() / 1000000 == 1) { - addItemInfo(mplew, item.getItem(), true); - } + mplew.writeInt(hmsAvailable.size()); + for (Pair hme : hmsAvailable) { + MaplePlayerShopItem item = hme.getLeft(); + AbstractMapleMapObject mo = hme.getRight(); + + if(mo instanceof MaplePlayerShop) { + MaplePlayerShop ps = (MaplePlayerShop) mo; + MapleCharacter owner = ps.getOwner(); + + mplew.writeMapleAsciiString(owner.getName()); + mplew.writeInt(owner.getMapId()); + mplew.writeMapleAsciiString(ps.getDescription()); + mplew.writeInt(item.getBundles()); + mplew.writeInt(item.getItem().getQuantity()); + mplew.writeInt(item.getPrice()); + mplew.writeInt(owner.getId()); + mplew.write(owner.getClient().getChannel() - 1); + } else { + MapleHiredMerchant hm = (MapleHiredMerchant) mo; + + mplew.writeMapleAsciiString(hm.getOwner()); + mplew.writeInt(hm.getMapId()); + mplew.writeMapleAsciiString(hm.getDescription()); + mplew.writeInt(item.getBundles()); + mplew.writeInt(item.getItem().getQuantity()); + mplew.writeInt(item.getPrice()); + mplew.writeInt(hm.getOwnerId()); + mplew.write(hm.getChannel() - 1); + } + + mplew.write(itemType); + if (itemType == MapleInventoryType.EQUIP.getType()) { + addItemInfo(mplew, item.getItem(), true); } } return mplew.getPacket(); } + public static byte[] getOwlOpen() { + MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); + + mplew.writeShort(SendOpcode.SHOP_SCANNER_RESULT.getValue()); + mplew.write(7); + mplew.write(GameConstants.OWL_DATA.length); + for (int i : GameConstants.OWL_DATA) { + mplew.writeInt(i); + } + + return mplew.getPacket(); + } + public static byte[] retrieveFirstMessage() { final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.writeShort(SendOpcode.ENTRUSTED_SHOP_CHECK_RESULT.getValue()); // header. @@ -4998,7 +5054,7 @@ public class MaplePacketCreator { * 0x12 = FKING POPUP LOL */ - public static byte[] getHiredMerchant(MapleCharacter chr, HiredMerchant hm, boolean firstTime) {//Thanks Dustin + public static byte[] getHiredMerchant(MapleCharacter chr, MapleHiredMerchant hm, boolean firstTime) {//Thanks Dustin final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.writeShort(SendOpcode.PLAYER_INTERACTION.getValue()); mplew.write(PlayerInteractionHandler.Action.ROOM.getCode()); @@ -5007,11 +5063,13 @@ public class MaplePacketCreator { mplew.writeShort(hm.getVisitorSlotThreadsafe(chr) + 1); mplew.writeInt(hm.getItemId()); mplew.writeMapleAsciiString("Hired Merchant"); + + MapleCharacter visitors[] = hm.getVisitors(); for (int i = 0; i < 3; i++) { - if (hm.getVisitors()[i] != null) { + if (visitors[i] != null) { mplew.write(i + 1); - addCharLook(mplew, hm.getVisitors()[i], false); - mplew.writeMapleAsciiString(hm.getVisitors()[i].getName()); + addCharLook(mplew, visitors[i], false); + mplew.writeMapleAsciiString(visitors[i].getName()); } } mplew.write(-1); @@ -5057,7 +5115,7 @@ public class MaplePacketCreator { return mplew.getPacket(); } - public static byte[] updateHiredMerchant(HiredMerchant hm, MapleCharacter chr) { + public static byte[] updateHiredMerchant(MapleHiredMerchant hm, MapleCharacter chr) { final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.writeShort(SendOpcode.PLAYER_INTERACTION.getValue()); mplew.write(PlayerInteractionHandler.Action.UPDATE_MERCHANT.getCode()); @@ -5100,6 +5158,15 @@ public class MaplePacketCreator { return mplew.getPacket(); } + public static byte[] hiredMerchantMaintenanceMessage() { + MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(5); + mplew.writeShort(SendOpcode.PLAYER_INTERACTION.getValue()); + mplew.write(PlayerInteractionHandler.Action.ROOM.getCode()); + mplew.write(0x00); + mplew.write(0x12); + return mplew.getPacket(); + } + public static byte[] leaveHiredMerchant(int slot, int status2) { final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.writeShort(SendOpcode.PLAYER_INTERACTION.getValue()); @@ -5119,7 +5186,7 @@ public class MaplePacketCreator { return mplew.getPacket(); } - public static byte[] spawnHiredMerchant(HiredMerchant hm) { + public static byte[] spawnHiredMerchant(MapleHiredMerchant hm) { final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); mplew.writeShort(SendOpcode.SPAWN_HIRED_MERCHANT.getValue()); mplew.writeInt(hm.getOwnerId()); diff --git a/tools/MapleIdRetriever/build/built-jar.properties b/tools/MapleIdRetriever/build/built-jar.properties index f7282e5599..400ffdb418 100644 --- a/tools/MapleIdRetriever/build/built-jar.properties +++ b/tools/MapleIdRetriever/build/built-jar.properties @@ -1,4 +1,4 @@ -#Tue, 22 Aug 2017 21:30:04 -0300 +#Thu, 28 Sep 2017 21:15:19 -0300 C\:\\Nexon\\MapleSolaxia\\MapleSolaxiaV2\\tools\\MapleIdRetriever= diff --git a/tools/MapleIdRetriever/build/classes/mapleidretriever/MapleIdRetriever.class b/tools/MapleIdRetriever/build/classes/mapleidretriever/MapleIdRetriever.class index 8a204beabc..dc1f25100a 100644 Binary files a/tools/MapleIdRetriever/build/classes/mapleidretriever/MapleIdRetriever.class and b/tools/MapleIdRetriever/build/classes/mapleidretriever/MapleIdRetriever.class differ diff --git a/tools/MapleIdRetriever/dist/MapleIdRetriever.jar b/tools/MapleIdRetriever/dist/MapleIdRetriever.jar index caa900c4bd..298c2b49f7 100644 Binary files a/tools/MapleIdRetriever/dist/MapleIdRetriever.jar and b/tools/MapleIdRetriever/dist/MapleIdRetriever.jar differ diff --git a/tools/MapleIdRetriever/lib/fetch.txt b/tools/MapleIdRetriever/lib/fetch.txt index 7407ca14cb..598b0863a2 100644 --- a/tools/MapleIdRetriever/lib/fetch.txt +++ b/tools/MapleIdRetriever/lib/fetch.txt @@ -1,14 +1,14 @@ -Orihalcon Platine (M) -Helios - -Green Neli Shoes -Kage - -Green Pris (M) -Golden Raven - -Brown Pireta Hat -Dragon's Tail - -Red Martier -White Fangz +Red Potion +Lemon +W. Ramen +Elixir +Mana Elixir +Mushroom Miso Ramen +Power Elixir +Lunar Gloves +LeFay Jester +Eclipse Earrings +Herculean Crown +Lockewood Hat +Pickpocket Pilfer +Eclipse Cloak \ No newline at end of file diff --git a/tools/MapleIdRetriever/lib/result.txt b/tools/MapleIdRetriever/lib/result.txt index dc604699b3..e69de29bb2 100644 --- a/tools/MapleIdRetriever/lib/result.txt +++ b/tools/MapleIdRetriever/lib/result.txt @@ -1,14 +0,0 @@ - -1412009 1412016 1412020 1412025 - -1072207 -1382008 1382024 1382029 1382034 - - -1462012 - -1002327 -1332023 1332037 1332042 1332047 - -1082210 -1482011 diff --git a/tools/MapleIdRetriever/nbproject/private/private.xml b/tools/MapleIdRetriever/nbproject/private/private.xml index bb8342ed61..6807a2ba19 100644 --- a/tools/MapleIdRetriever/nbproject/private/private.xml +++ b/tools/MapleIdRetriever/nbproject/private/private.xml @@ -2,8 +2,6 @@ - - file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/tools/MapleIdRetriever/src/mapleidretriever/MapleIdRetriever.java - + diff --git a/tools/MapleIdRetriever/src/mapleidretriever/MapleIdRetriever.java b/tools/MapleIdRetriever/src/mapleidretriever/MapleIdRetriever.java index 46a4085f6e..3674b7b5a6 100644 --- a/tools/MapleIdRetriever/src/mapleidretriever/MapleIdRetriever.java +++ b/tools/MapleIdRetriever/src/mapleidretriever/MapleIdRetriever.java @@ -30,7 +30,7 @@ import java.util.ArrayList; * */ public class MapleIdRetriever { - private final static boolean INSTALL_SQLTABLE = false; + private final static boolean INSTALL_SQLTABLE = true; static String host = "jdbc:mysql://localhost:3306/maplesolaxia"; static String driver = "com.mysql.jdbc.Driver"; diff --git a/wz/Map.wz/Map/Map1/100000003.img.xml b/wz/Map.wz/Map/Map1/100000003.img.xml index d57d29ada1..813bcd6540 100644 --- a/wz/Map.wz/Map/Map1/100000003.img.xml +++ b/wz/Map.wz/Map/Map1/100000003.img.xml @@ -13,6 +13,7 @@ + diff --git a/wz/Map.wz/Map/Map1/100000006.img.xml b/wz/Map.wz/Map/Map1/100000006.img.xml index 0c7fc25406..8d53a0e500 100644 --- a/wz/Map.wz/Map/Map1/100000006.img.xml +++ b/wz/Map.wz/Map/Map1/100000006.img.xml @@ -13,7 +13,7 @@ - + diff --git a/wz/Quest.wz/Act.img.xml b/wz/Quest.wz/Act.img.xml index baabb01dbc..3c850a09bc 100644 --- a/wz/Quest.wz/Act.img.xml +++ b/wz/Quest.wz/Act.img.xml @@ -11081,6 +11081,7 @@ + diff --git a/wz/Quest.wz/Check.img.xml b/wz/Quest.wz/Check.img.xml index 878404440d..8d70d78244 100644 --- a/wz/Quest.wz/Check.img.xml +++ b/wz/Quest.wz/Check.img.xml @@ -21342,7 +21342,7 @@ - +