diff --git a/build/built-jar.properties b/build/built-jar.properties
index d23193731c..72aaf90820 100644
--- a/build/built-jar.properties
+++ b/build/built-jar.properties
@@ -1,4 +1,4 @@
-#Fri, 25 Aug 2017 21:04:38 -0300
+#Thu, 31 Aug 2017 23:23:01 -0300
C\:\\Nexon\\MapleSolaxia\\MapleSolaxiaV2=
diff --git a/build/classes/client/MapleCharacter$10.class b/build/classes/client/MapleCharacter$10.class
index f7082ba194..1f72045106 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 e4ee8e711f..f7db7fd1f9 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 7e9fbb3794..6da39fc720 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 956fd12bba..8dcdd3e354 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 ad82781108..3b9fb71763 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 7f5f81c0f0..8e27113940 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 21cb4c82f1..30f08d6431 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 09839ca873..113e5b63ca 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 e52764fab7..1f459ab0dd 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 7ecb6bcef2..7172ee0179 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 e99370990d..0b61d2af12 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$20.class b/build/classes/client/MapleCharacter$20.class
index d310e88ce9..efe7c95afe 100644
Binary files a/build/classes/client/MapleCharacter$20.class and b/build/classes/client/MapleCharacter$20.class differ
diff --git a/build/classes/client/MapleCharacter$3.class b/build/classes/client/MapleCharacter$3.class
index e49457b31e..c33ce7dd9c 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 f9a70399d5..5874ea4bf0 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 3b38991e0b..44d59f7a6b 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 2d7bc3be6f..3a6b0f060c 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 74bd24bd09..e499dda24a 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 9d6199559e..65bcf75823 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 64f8ea30bc..27e0887bc9 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 254ec4376a..b855e8c20e 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 03df75415f..28f5277d18 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 32e16f0b18..84d493934e 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 f29567dca5..bc54efe368 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 1e6e32cb05..2f156e061e 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 03d0bf1476..fac348602c 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 32e714b0e5..870feccf36 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 f840cd254f..10c630b0b3 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 136a5f5c02..46f609a1d2 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 8052c50f91..8645f9e894 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/Equip.class b/build/classes/client/inventory/Equip.class
index 605095da37..3ae9caefc8 100644
Binary files a/build/classes/client/inventory/Equip.class and b/build/classes/client/inventory/Equip.class differ
diff --git a/build/classes/client/inventory/ItemFactory.class b/build/classes/client/inventory/ItemFactory.class
index c94d34c576..cefff5b7c7 100644
Binary files a/build/classes/client/inventory/ItemFactory.class and b/build/classes/client/inventory/ItemFactory.class differ
diff --git a/build/classes/client/inventory/MapleInventory.class b/build/classes/client/inventory/MapleInventory.class
index 066db5de3d..391b267557 100644
Binary files a/build/classes/client/inventory/MapleInventory.class and b/build/classes/client/inventory/MapleInventory.class differ
diff --git a/build/classes/client/inventory/MaplePet.class b/build/classes/client/inventory/MaplePet.class
index f12ed9aaf2..f6baec8743 100644
Binary files a/build/classes/client/inventory/MaplePet.class and b/build/classes/client/inventory/MaplePet.class differ
diff --git a/build/classes/constants/ServerConstants.class b/build/classes/constants/ServerConstants.class
index 0c66bb6638..36592436d6 100644
Binary files a/build/classes/constants/ServerConstants.class and b/build/classes/constants/ServerConstants.class differ
diff --git a/build/classes/net/MapleServerHandler.class b/build/classes/net/MapleServerHandler.class
index 071e4b98f9..930d7fcb63 100644
Binary files a/build/classes/net/MapleServerHandler.class and b/build/classes/net/MapleServerHandler.class differ
diff --git a/build/classes/net/server/Server.class b/build/classes/net/server/Server.class
index 9616deba4e..0491b05c71 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$1.class b/build/classes/net/server/channel/Channel$1.class
index d43b1c3626..03fdf711b1 100644
Binary files a/build/classes/net/server/channel/Channel$1.class and b/build/classes/net/server/channel/Channel$1.class differ
diff --git a/build/classes/net/server/channel/Channel.class b/build/classes/net/server/channel/Channel.class
index 9fa72803f6..73cb2c2c83 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/AbstractDealDamageHandler.class b/build/classes/net/server/channel/handlers/AbstractDealDamageHandler.class
index 03b6d98814..07ffae0055 100644
Binary files a/build/classes/net/server/channel/handlers/AbstractDealDamageHandler.class and b/build/classes/net/server/channel/handlers/AbstractDealDamageHandler.class differ
diff --git a/build/classes/net/server/channel/handlers/AutoAssignHandler$1.class b/build/classes/net/server/channel/handlers/AutoAssignHandler$1.class
index b153eae337..bbfc3e7a76 100644
Binary files a/build/classes/net/server/channel/handlers/AutoAssignHandler$1.class and b/build/classes/net/server/channel/handlers/AutoAssignHandler$1.class differ
diff --git a/build/classes/net/server/channel/handlers/AutoAssignHandler.class b/build/classes/net/server/channel/handlers/AutoAssignHandler.class
index a59a194050..817b6673c6 100644
Binary files a/build/classes/net/server/channel/handlers/AutoAssignHandler.class and b/build/classes/net/server/channel/handlers/AutoAssignHandler.class differ
diff --git a/build/classes/net/server/channel/handlers/ChangeMapHandler.class b/build/classes/net/server/channel/handlers/ChangeMapHandler.class
index db7df0b6a9..eca25ae2b8 100644
Binary files a/build/classes/net/server/channel/handlers/ChangeMapHandler.class and b/build/classes/net/server/channel/handlers/ChangeMapHandler.class differ
diff --git a/build/classes/net/server/channel/handlers/CloseRangeDamageHandler.class b/build/classes/net/server/channel/handlers/CloseRangeDamageHandler.class
index c0da010cbb..194eb2c5a6 100644
Binary files a/build/classes/net/server/channel/handlers/CloseRangeDamageHandler.class and b/build/classes/net/server/channel/handlers/CloseRangeDamageHandler.class differ
diff --git a/build/classes/net/server/channel/handlers/EnterCashShopHandler.class b/build/classes/net/server/channel/handlers/EnterCashShopHandler.class
index 70c7566155..c096c4905e 100644
Binary files a/build/classes/net/server/channel/handlers/EnterCashShopHandler.class and b/build/classes/net/server/channel/handlers/EnterCashShopHandler.class differ
diff --git a/build/classes/net/server/channel/handlers/GeneralChatHandler.class b/build/classes/net/server/channel/handlers/GeneralChatHandler.class
index 74486d2eea..cb29dcdd83 100644
Binary files a/build/classes/net/server/channel/handlers/GeneralChatHandler.class and b/build/classes/net/server/channel/handlers/GeneralChatHandler.class differ
diff --git a/build/classes/net/server/channel/handlers/ItemMoveHandler.class b/build/classes/net/server/channel/handlers/ItemMoveHandler.class
index f9972a7cd4..29199b745e 100644
Binary files a/build/classes/net/server/channel/handlers/ItemMoveHandler.class and b/build/classes/net/server/channel/handlers/ItemMoveHandler.class differ
diff --git a/build/classes/net/server/channel/handlers/MagicDamageHandler.class b/build/classes/net/server/channel/handlers/MagicDamageHandler.class
index 3877e97ac3..d0e9eff264 100644
Binary files a/build/classes/net/server/channel/handlers/MagicDamageHandler.class and b/build/classes/net/server/channel/handlers/MagicDamageHandler.class differ
diff --git a/build/classes/net/server/channel/handlers/PetCommandHandler.class b/build/classes/net/server/channel/handlers/PetCommandHandler.class
index 808392b7fd..af5bb179fa 100644
Binary files a/build/classes/net/server/channel/handlers/PetCommandHandler.class and b/build/classes/net/server/channel/handlers/PetCommandHandler.class differ
diff --git a/build/classes/net/server/channel/handlers/PlayerLoggedinHandler.class b/build/classes/net/server/channel/handlers/PlayerLoggedinHandler.class
index a2dda463c3..f4e25d5593 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/RangedAttackHandler.class b/build/classes/net/server/channel/handlers/RangedAttackHandler.class
index d7ab7779c0..cfbf816f4f 100644
Binary files a/build/classes/net/server/channel/handlers/RangedAttackHandler.class and b/build/classes/net/server/channel/handlers/RangedAttackHandler.class differ
diff --git a/build/classes/net/server/channel/handlers/TakeDamageHandler.class b/build/classes/net/server/channel/handlers/TakeDamageHandler.class
index 075d9bae59..fd41b4180f 100644
Binary files a/build/classes/net/server/channel/handlers/TakeDamageHandler.class and b/build/classes/net/server/channel/handlers/TakeDamageHandler.class differ
diff --git a/build/classes/net/server/channel/handlers/UseItemHandler.class b/build/classes/net/server/channel/handlers/UseItemHandler.class
index ce4121609c..89dd3b48d3 100644
Binary files a/build/classes/net/server/channel/handlers/UseItemHandler.class and b/build/classes/net/server/channel/handlers/UseItemHandler.class differ
diff --git a/build/classes/scripting/AbstractPlayerInteraction.class b/build/classes/scripting/AbstractPlayerInteraction.class
index ed758b4655..4d8d8d1ff9 100644
Binary files a/build/classes/scripting/AbstractPlayerInteraction.class and b/build/classes/scripting/AbstractPlayerInteraction.class differ
diff --git a/build/classes/server/MapleStatEffect$CancelEffectAction.class b/build/classes/server/MapleStatEffect$CancelEffectAction.class
index 0218f09b8b..88f23b4acb 100644
Binary files a/build/classes/server/MapleStatEffect$CancelEffectAction.class and b/build/classes/server/MapleStatEffect$CancelEffectAction.class differ
diff --git a/build/classes/server/MapleStatEffect.class b/build/classes/server/MapleStatEffect.class
index 91f7e090ff..34f6ab4552 100644
Binary files a/build/classes/server/MapleStatEffect.class and b/build/classes/server/MapleStatEffect.class differ
diff --git a/build/classes/server/MapleTrade.class b/build/classes/server/MapleTrade.class
index 87c6ef45f8..0320b3d30b 100644
Binary files a/build/classes/server/MapleTrade.class and b/build/classes/server/MapleTrade.class differ
diff --git a/build/classes/server/maps/MapleMap$1.class b/build/classes/server/maps/MapleMap$1.class
index 99fbbef1fe..f744ca4848 100644
Binary files a/build/classes/server/maps/MapleMap$1.class and b/build/classes/server/maps/MapleMap$1.class differ
diff --git a/build/classes/server/maps/MapleMap$10.class b/build/classes/server/maps/MapleMap$10.class
index f64ae9e97f..fa0dc0b39b 100644
Binary files a/build/classes/server/maps/MapleMap$10.class and b/build/classes/server/maps/MapleMap$10.class differ
diff --git a/build/classes/server/maps/MapleMap$11.class b/build/classes/server/maps/MapleMap$11.class
index 40be89cfd8..52f3cc4d87 100644
Binary files a/build/classes/server/maps/MapleMap$11.class and b/build/classes/server/maps/MapleMap$11.class differ
diff --git a/build/classes/server/maps/MapleMap$12.class b/build/classes/server/maps/MapleMap$12.class
index d50ae39779..34c84139a7 100644
Binary files a/build/classes/server/maps/MapleMap$12.class and b/build/classes/server/maps/MapleMap$12.class differ
diff --git a/build/classes/server/maps/MapleMap$13.class b/build/classes/server/maps/MapleMap$13.class
index 6d16aa16ad..31a626b3a1 100644
Binary files a/build/classes/server/maps/MapleMap$13.class and b/build/classes/server/maps/MapleMap$13.class differ
diff --git a/build/classes/server/maps/MapleMap$14.class b/build/classes/server/maps/MapleMap$14.class
index c83b5ec594..2a4e93ce66 100644
Binary files a/build/classes/server/maps/MapleMap$14.class and b/build/classes/server/maps/MapleMap$14.class differ
diff --git a/build/classes/server/maps/MapleMap$15.class b/build/classes/server/maps/MapleMap$15.class
index a8c5da30ea..c0b42b4513 100644
Binary files a/build/classes/server/maps/MapleMap$15.class and b/build/classes/server/maps/MapleMap$15.class differ
diff --git a/build/classes/server/maps/MapleMap$16.class b/build/classes/server/maps/MapleMap$16.class
index b1c7556c67..95ffa66d21 100644
Binary files a/build/classes/server/maps/MapleMap$16.class and b/build/classes/server/maps/MapleMap$16.class differ
diff --git a/build/classes/server/maps/MapleMap$17.class b/build/classes/server/maps/MapleMap$17.class
index a1ec45f6db..89303edbef 100644
Binary files a/build/classes/server/maps/MapleMap$17.class and b/build/classes/server/maps/MapleMap$17.class differ
diff --git a/build/classes/server/maps/MapleMap$18.class b/build/classes/server/maps/MapleMap$18.class
index 3f7f3d8977..24e7f16bdf 100644
Binary files a/build/classes/server/maps/MapleMap$18.class and b/build/classes/server/maps/MapleMap$18.class differ
diff --git a/build/classes/server/maps/MapleMap$19.class b/build/classes/server/maps/MapleMap$19.class
index 5cdb09a35d..f9087b066d 100644
Binary files a/build/classes/server/maps/MapleMap$19.class and b/build/classes/server/maps/MapleMap$19.class differ
diff --git a/build/classes/server/maps/MapleMap$2.class b/build/classes/server/maps/MapleMap$2.class
index 02bff450c5..8b6cb5c237 100644
Binary files a/build/classes/server/maps/MapleMap$2.class and b/build/classes/server/maps/MapleMap$2.class differ
diff --git a/build/classes/server/maps/MapleMap$20.class b/build/classes/server/maps/MapleMap$20.class
index ec3e1aa759..399551d681 100644
Binary files a/build/classes/server/maps/MapleMap$20.class and b/build/classes/server/maps/MapleMap$20.class differ
diff --git a/build/classes/server/maps/MapleMap$21.class b/build/classes/server/maps/MapleMap$21.class
index 12e0dbcfb1..f686530a0e 100644
Binary files a/build/classes/server/maps/MapleMap$21.class and b/build/classes/server/maps/MapleMap$21.class differ
diff --git a/build/classes/server/maps/MapleMap$22.class b/build/classes/server/maps/MapleMap$22.class
index 944856d5e5..8b57ee06eb 100644
Binary files a/build/classes/server/maps/MapleMap$22.class and b/build/classes/server/maps/MapleMap$22.class differ
diff --git a/build/classes/server/maps/MapleMap$23.class b/build/classes/server/maps/MapleMap$23.class
index d7c623e376..7581f2cb27 100644
Binary files a/build/classes/server/maps/MapleMap$23.class and b/build/classes/server/maps/MapleMap$23.class differ
diff --git a/build/classes/server/maps/MapleMap$24.class b/build/classes/server/maps/MapleMap$24.class
index c6e7cf5114..990ee14b71 100644
Binary files a/build/classes/server/maps/MapleMap$24.class and b/build/classes/server/maps/MapleMap$24.class differ
diff --git a/build/classes/server/maps/MapleMap$25.class b/build/classes/server/maps/MapleMap$25.class
index bc85539ba5..2a7e051ea2 100644
Binary files a/build/classes/server/maps/MapleMap$25.class and b/build/classes/server/maps/MapleMap$25.class differ
diff --git a/build/classes/server/maps/MapleMap$26.class b/build/classes/server/maps/MapleMap$26.class
index 241c16a95e..e10462b544 100644
Binary files a/build/classes/server/maps/MapleMap$26.class and b/build/classes/server/maps/MapleMap$26.class differ
diff --git a/build/classes/server/maps/MapleMap$27.class b/build/classes/server/maps/MapleMap$27.class
index c821ff4e41..7b4f02a22e 100644
Binary files a/build/classes/server/maps/MapleMap$27.class and b/build/classes/server/maps/MapleMap$27.class differ
diff --git a/build/classes/server/maps/MapleMap$28.class b/build/classes/server/maps/MapleMap$28.class
index 5c5366f058..cfc9174bb9 100644
Binary files a/build/classes/server/maps/MapleMap$28.class and b/build/classes/server/maps/MapleMap$28.class differ
diff --git a/build/classes/server/maps/MapleMap$29$1.class b/build/classes/server/maps/MapleMap$29$1.class
index e766e2cbb3..edb56f40c9 100644
Binary files a/build/classes/server/maps/MapleMap$29$1.class and b/build/classes/server/maps/MapleMap$29$1.class differ
diff --git a/build/classes/server/maps/MapleMap$29.class b/build/classes/server/maps/MapleMap$29.class
index dbdf8425c7..44aece4c53 100644
Binary files a/build/classes/server/maps/MapleMap$29.class and b/build/classes/server/maps/MapleMap$29.class differ
diff --git a/build/classes/server/maps/MapleMap$3.class b/build/classes/server/maps/MapleMap$3.class
index b75af0bd03..ea2e01dab3 100644
Binary files a/build/classes/server/maps/MapleMap$3.class and b/build/classes/server/maps/MapleMap$3.class differ
diff --git a/build/classes/server/maps/MapleMap$30.class b/build/classes/server/maps/MapleMap$30.class
index 15fc3ba638..031346f6ad 100644
Binary files a/build/classes/server/maps/MapleMap$30.class and b/build/classes/server/maps/MapleMap$30.class differ
diff --git a/build/classes/server/maps/MapleMap$4.class b/build/classes/server/maps/MapleMap$4.class
index 79e7c02890..506e2d5dc3 100644
Binary files a/build/classes/server/maps/MapleMap$4.class and b/build/classes/server/maps/MapleMap$4.class differ
diff --git a/build/classes/server/maps/MapleMap$5.class b/build/classes/server/maps/MapleMap$5.class
index 0422437ebc..54d63c2453 100644
Binary files a/build/classes/server/maps/MapleMap$5.class and b/build/classes/server/maps/MapleMap$5.class differ
diff --git a/build/classes/server/maps/MapleMap$6.class b/build/classes/server/maps/MapleMap$6.class
index 084b4527bf..ce8de6daab 100644
Binary files a/build/classes/server/maps/MapleMap$6.class and b/build/classes/server/maps/MapleMap$6.class differ
diff --git a/build/classes/server/maps/MapleMap$7.class b/build/classes/server/maps/MapleMap$7.class
index 7eaeecc36b..4d01d4f772 100644
Binary files a/build/classes/server/maps/MapleMap$7.class and b/build/classes/server/maps/MapleMap$7.class differ
diff --git a/build/classes/server/maps/MapleMap$8.class b/build/classes/server/maps/MapleMap$8.class
index 049106adb9..2db7bbba6a 100644
Binary files a/build/classes/server/maps/MapleMap$8.class and b/build/classes/server/maps/MapleMap$8.class differ
diff --git a/build/classes/server/maps/MapleMap$9.class b/build/classes/server/maps/MapleMap$9.class
index 8104d0dc07..a94955b547 100644
Binary files a/build/classes/server/maps/MapleMap$9.class and b/build/classes/server/maps/MapleMap$9.class differ
diff --git a/build/classes/server/maps/MapleMap$ActivateItemReactor$1.class b/build/classes/server/maps/MapleMap$ActivateItemReactor$1.class
index ccba4e8fd6..c2b4f5b053 100644
Binary files a/build/classes/server/maps/MapleMap$ActivateItemReactor$1.class and b/build/classes/server/maps/MapleMap$ActivateItemReactor$1.class differ
diff --git a/build/classes/server/maps/MapleMap$ActivateItemReactor.class b/build/classes/server/maps/MapleMap$ActivateItemReactor.class
index 3d42c445a6..18bb7c5ed0 100644
Binary files a/build/classes/server/maps/MapleMap$ActivateItemReactor.class and b/build/classes/server/maps/MapleMap$ActivateItemReactor.class differ
diff --git a/build/classes/server/maps/MapleMap$ExpireMapItemJob.class b/build/classes/server/maps/MapleMap$ExpireMapItemJob.class
index 82ea60a696..3e9a9b8c8e 100644
Binary files a/build/classes/server/maps/MapleMap$ExpireMapItemJob.class and b/build/classes/server/maps/MapleMap$ExpireMapItemJob.class differ
diff --git a/build/classes/server/maps/MapleMap.class b/build/classes/server/maps/MapleMap.class
index cad0c6c51e..0cc25f24d6 100644
Binary files a/build/classes/server/maps/MapleMap.class and b/build/classes/server/maps/MapleMap.class differ
diff --git a/build/classes/server/maps/MapleMapItem.class b/build/classes/server/maps/MapleMapItem.class
index e427e6ccc2..1ecec59840 100644
Binary files a/build/classes/server/maps/MapleMapItem.class and b/build/classes/server/maps/MapleMapItem.class differ
diff --git a/build/classes/tools/MaplePacketCreator.class b/build/classes/tools/MaplePacketCreator.class
index 86bcbb35c2..dece253035 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 bfdf48261b..d4a0fed51c 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 9ca9083159..754e553488 100644
--- a/docs/feature_list.txt
+++ b/docs/feature_list.txt
@@ -55,12 +55,12 @@ Server potentials:
* Gain fame by quests.
* Every monsterbook card is now droppable by overworld mobs.
* Monsterbook displays drop data info conformant with the underlying DB (needs custom wz). See more on the MobBookUpdate feature.
-* Mastery book announcer displaying droppers of needed books of a player, read underlying DB.
+* 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 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).
-* If multiple bosses on the same area, client will prioritize Boss HP bar of the target of the player.
+* If multiple bosses are on the same area, client will prioritize Boss HP bar of the target of the player.
* Custom jail system (needs provided custom wz).
* Delete Character 100% (requires ENABLE_PIC activated).
* Boats, elevator and other travelling mechanics fully working.
diff --git a/docs/mcpq/2042002.js b/docs/mcpq/2042002.js
new file mode 100644
index 0000000000..d83cdad8fc
--- /dev/null
+++ b/docs/mcpq/2042002.js
@@ -0,0 +1,315 @@
+var DISABLED = false;
+
+var SavedLocationType = Packages.server.maps.SavedLocationType;
+
+var MonsterCarnival = Packages.server.partyquest.mcpq.MonsterCarnival;
+var MCTracker = Packages.server.partyquest.mcpq.MCTracker;
+var MCParty = Packages.server.partyquest.mcpq.MCParty;
+var MCField = Packages.server.partyquest.mcpq.MCField;
+
+var status = -1;
+var store = false;
+var ctx = -1;
+var storeInfo;
+var purchaseId;
+var purchaseCost;
+
+var coinId = 4001129;
+var coinIcon = "#i" + coinId + "#";
+var infoMaps = [220000000, 200000000, 103000000, 540000000]; // ludi, orbis, kerning, singapore
+var gradeS = 600
+var gradeA = 500
+var gradeB = 400
+var gradeC = 300
+var gradeD = 200
+var gradeE = 100
+
+var expRewards = [[150000, 100000], // S Winner/Loser
+ [100000, 70000], // A Winner/Loser
+ [75000, 43250], // B Winner/Loser
+ [50000, 25000], // C Winner/Loser
+ [25000, 12500], // D Winner/Loser
+ [12500, 6250], // E Winner/Loser
+ [5000, 2500] // F Winner/Loser
+ ];
+
+// Exchange stores
+var warrior = [[1302004, 7], [1402006, 7], [1302009, 10], [1402007, 10],
+ [1302010, 20], [1402003, 20], [1312006, 7], [1412004, 7],
+ [1312007, 10], [1412005, 10], [1312018, 20], [1412003, 20],
+ [1322015, 7], [1422008, 7], [1322016, 10], [1422007, 10],
+ [1322017, 20], [1422005, 20], [1432003, 7], [1442003, 7],
+ [1432005, 10], [1442009, 10], [1442005, 20], [1432004, 20]];
+
+var magician = [[1372001, 7], [1382018, 7], [1372012, 10], [1382019, 10],
+ [1382001, 20], [1372007, 20]];
+
+var archer = [[1452006, 7], [1452007, 10], [1452008, 20], [1462005, 7],
+ [1462006, 10], [1462007, 20]];
+
+var thief = [[1472013, 7], [1472017, 10], [1472021, 20], [1332014, 7],
+ [1332011, 10], [1332031, 10], [1332016, 20], [1332034, 20]];
+
+var pirate = [[1482005, 7], [1482006, 10], [1482007, 20], [1492005, 7],
+ [1492006, 10], [1492007, 20]];
+
+var necklace = [[1122007, 50], [2041211, 40]];
+
+var infoText = "You wish to know about the Monster Carnival? Very well. The Monster Carnival is a place of trilling battles and exciting competiton against people just as strong and motivated as yourself. You must summon monsters and defeat the monsters summoned by the opposing party. That's the essence of the Monster Carnival. Once you enter the Carnival Field, the task is to earn CP by hunter monsters from the opposing party and use those CP's to distract the opposing party from hunting monsters. There are three ways to distract the other party; Summon a Monster, Skill or Protector. Please remember this though, it's never a good idea to save up CP just for the sake of it. The CP's you've used will also help determine the winner and the loser of the carnival.";
+var no = "You do not have enough Maple Coins for this item. Come back to me when you acquire more!";
+
+function getGrade(cp) {
+ if (cp >= gradeS) {
+ return 0;
+ } else if (cp >= gradeA) {
+ return 1;
+ } else if (cp >= gradeB) {
+ return 2;
+ } else if (cp >= gradeC) {
+ return 3;
+ } else if (cp >= gradeD) {
+ return 4;
+ } else if (cp >= gradeE) {
+ return 5;
+ } else {
+ return 6;
+ }
+}
+
+function isTownMap(map) {
+ for (var i = 0; i < infoMaps.length; i++) {
+ if (infoMaps[i] == map) {
+ return true;
+ }
+ }
+ return false;
+}
+
+function isExitMap(map) {
+ return map == 980000010;
+}
+
+function isWinnerMap(map) {
+ return (map >= 980000000 && map <= 980000700 && map % 10 == 3);
+}
+
+function isLoserMap(map) {
+ return (map >= 980000000 && map <= 980000700 && map % 10 == 4);
+}
+
+var CONTEXT_NONE = -1;
+var CONTEXT_TOWN = 0;
+var CONTEXT_EXIT = 1;
+var CONTEXT_WIN = 2;
+var CONTEXT_LOSE = 3;
+
+function start() {
+ if (DISABLED) {
+ cm.sendOk("CPQ is temporarily unavailable.");
+ cm.dispose();
+ return;
+ }
+ m = cm.getMapId();
+ if (isTownMap(m)) {
+ ctx = CONTEXT_TOWN;
+ } else if (isExitMap(m)) {
+ ctx = CONTEXT_EXIT;
+ } else if (isWinnerMap(m)) {
+ ctx = CONTEXT_WIN;
+ } else if (isLoserMap(m)) {
+ ctx = CONTEXT_LOSE;
+ } else {
+ ctx = CONTEXT_NONE;
+ }
+
+ action(1, 0, 0);
+}
+
+function doLoserMap(mode, type, selection) {
+ if (cm.getPlayer().getMCPQParty() == null) {
+ cm.warp(MonsterCarnival.MAP_LOBBY);
+ cm.dispose();
+ return;
+ }
+
+ if (mode == -1) {
+ cm.dispose();
+ } else {
+ if (mode == 1) status++;
+ else status--;
+
+ if (status == 0) {
+ cm.sendNext("Unfortunately, you did not manage to win this round. Better luck next time!");
+ } else if (status == 1) {
+ var points = cm.getPlayer().getMCPQParty().getTotalCP();
+ var grade = getGrade(points);
+ var letterGrade = "ABCDF"[grade];
+ var expReward = expRewards[grade][1];
+
+ cm.sendNext("Your grade is: #b" + letterGrade + "\r\n\r\n#kEXP Reward: " + expReward);
+ cm.gainExp(expReward);
+ } else if (status == 2) {
+ cm.warp(MonsterCarnival.MAP_LOBBY);
+ cm.dispose();
+ }
+ }
+}
+
+function doWinnerMap(mode, type, selection) {
+ if (cm.getPlayer().getMCPQParty() == null) {
+ cm.warp(MonsterCarnival.MAP_LOBBY);
+ cm.dispose();
+ return;
+ }
+
+ if (mode == -1) {
+ cm.dispose();
+ } else {
+ if (mode == 1) status++;
+ else status--;
+
+ if (status == 0) {
+ cm.sendNext("Congratulations! You managed to defeat the enemy team!");
+ } else if (status == 1) {
+ var points = cm.getPlayer().getMCPQParty().getTotalCP();
+ var grade = getGrade(points);
+ var letterGrade = "ABCDF"[grade];
+ var expReward = expRewards[grade][0];
+
+ cm.sendNext("Your grade is: #b" + letterGrade + "\r\n\r\n#kEXP Reward: " + expReward);
+ cm.gainExp(expReward);
+ } else if (status == 2) {
+ cm.warp(MonsterCarnival.MAP_LOBBY);
+ cm.dispose();
+ }
+ }
+}
+
+function doTown(mode, type, selection) {
+ if (mode == -1) {
+ cm.sendOk("Be sure to vote for the server every 24 hours!");
+ cm.dispose();
+ } else {
+ if (mode == 1) status++;
+ else status--;
+
+ if (status == 0) {
+ cm.sendSimple("What would you like to do? If you have never participated in the Monster Carnival, you'll need to know a thing or two about it before joining.\r\n\r\n#b#L0#Go to the Monster Carnival Field#l\r\n#L1#Learn about the Monster Carnival#l\r\n#L2#Trade Maple Coin#l");
+ } else if (status == 1) {
+ if (selection == 0) {
+ if (cm.getChar().getLevel() < MonsterCarnival.MIN_LEVEL || cm.getChar().getLevel() > MonsterCarnival.MAX_LEVEL) {
+ cm.sendOk("You must be between level " + MonsterCarnival.MIN_LEVEL + " and level " + MonsterCarnival.MAX_LEVEL + " to enter.");
+ cm.dispose();
+ return;
+ }
+ cm.getChar().saveLocation(SavedLocationType.MONSTER_CARNIVAL);
+ cm.warp(MonsterCarnival.MAP_LOBBY, 4);
+ cm.dispose();
+ return;
+ } else if (selection == 1) {
+ cm.sendPrev(infoText);
+ cm.dispose();
+ return;
+ } else if (selection == 2) {
+ store = true;
+ cm.sendSimple("Select a category:\r\n" +
+ "#L101##bTrade Maple Coins for Warrior Weapons\r\n" +
+ "#L102#Trade Maple Coins for Magician Weapons\r\n" +
+ "#L103#Trade Maple Coins for Bowman Weapons\r\n" +
+ "#L104#Trade Maple Coins for Thief Weapons\r\n" +
+ "#L105#Trade Maple Coins for Pirate Weapons\r\n" +
+ "#L106#Trade Maple Coins for a Necklace");
+ }
+ } else if (status == 2) {
+ if (store) {
+ switch (selection) {
+ case 101:
+ storeInfo = warrior;
+ break;
+ case 102:
+ storeInfo = magician;
+ break;
+ case 103:
+ storeInfo = archer;
+ break;
+ case 104:
+ storeInfo = thief;
+ break;
+ case 105:
+ storeInfo = pirate;
+ break;
+ case 106:
+ storeInfo = necklace;
+ break;
+ default:
+ storeInfo = [];
+ }
+ if (storeInfo.length == 0) {
+ cm.sendOk("That store doesn't exist.");
+ cm.dispose();
+ return;
+ }
+ var storeText = "";
+ for (var i = 0; i < storeInfo.length; ++i) {
+ var wepId = storeInfo[i][0];
+ var cost = storeInfo[i][1];
+ storeText += "#L" + i + "##v" + wepId + "# - #z" + wepId + "# - " + cost + " " + coinIcon + "#l\r\n";
+ }
+ cm.sendSimple(storeText);
+ } else {
+ MCTracker.log("[MCPQ_Info] CONTEXT_TOWN: Invalid status 2");
+ }
+ } else if (status == 3) {
+ if (store) {
+ purchaseId = storeInfo[selection][0];
+ purchaseCost = storeInfo[selection][1];
+
+ if (cm.haveItem(coinId, purchaseCost)) {
+ cm.sendYesNo("Are you sure you want to purchase #i" + purchaseId + "#? You will have #r#e" + (cm.itemQuantity(coinId) - purchaseCost) + " " + coinIcon + "##k#n remaining.");
+ } else {
+ cm.sendOk("You don't have enough " + coinIcon + ".");
+ cm.dispose();
+ }
+ } else {
+ MCTracker.log("[MCPQ_Info] CONTEXT_TOWN: Invalid status 3");
+ }
+ } else if (status == 4) {
+ if (store) {
+ if (cm.haveItem(coinId, purchaseCost)) {
+ cm.gainItem(coinId, -purchaseCost);
+ cm.gainItem(purchaseId);
+ cm.sendOk("Congratulations! Enjoy your new item.");
+ cm.dispose();
+ }
+ } else {
+ MCTracker.log("[MCPQ_Info] CONTEXT_TOWN: Invalid status 4");
+ }
+ }
+ }
+}
+
+function doExit() {
+ cm.warp(MonsterCarnival.MAP_LOBBY);
+ cm.sendOk("Hope you had fun in the Carnival PQ!");
+ cm.dispose();
+}
+
+function action(mode, type, selection) {
+ switch (ctx) {
+ case CONTEXT_TOWN:
+ doTown(mode, type, selection);
+ break;
+ case CONTEXT_EXIT:
+ doExit();
+ break;
+ case CONTEXT_LOSE:
+ doLoserMap(mode, type, selection);
+ break;
+ case CONTEXT_WIN:
+ doWinnerMap(mode, type, selection);
+ break;
+ default:
+ MCTracker.log("[MCPQ_INFO] Invalid context (value: " + ctx + ")");
+ cm.dispose();
+ }
+}
\ No newline at end of file
diff --git a/docs/mychanges_ptbr.txt b/docs/mychanges_ptbr.txt
index 854b90cc17..79df8aa1cd 100644
--- a/docs/mychanges_ptbr.txt
+++ b/docs/mychanges_ptbr.txt
@@ -481,4 +481,23 @@ Consertado pets n
Acesso à DB usando HikariCP (melhor ganho em desempenho e código mais enxuto).
Resolvido bugs com hatch egg e evolvePet.
Adicionado energy bar e skills funcionais no Dojo.
-Consertado cash pet food retirando stats de mount em Character Info.
\ No newline at end of file
+Consertado cash pet food retirando stats de mount em Character Info.
+
+26 Agosto 2017,
+Consertado bug no sistema de exp de pets.
+Refatorado sistema de trades, agora verificando por slots disponíveis similarmente ao sistema usado pelas rewards de quests.
+
+27 Agosto 2017,
+Hero's Will retira a maioria dos diseases. Tonico retira slow além de weakness.
+Consertado comando itemvac coletando quest itens e itens de outros jogadores.
+Novo comando: cake. Chama cake boss com valor customizável de HP.
+
+28 Agosto 2017,
+Parties agora podem sair do Dojo sem precisar esperar o timeout expirar.
+Ao entrar no Dojo, jogadores tem energy points resetados pra zero.
+Adicionado informação de NX ganho ao coletar cupons.
+Pets em outros slots agora equipam devidamente.
+
+31 Agosto 2017,
+Refatorado autoassigner para focar nos stats primários a partir da avaliação do valor base do stat secundário com o 1º e 2º equips mais forte, ao invés de somente o 1º.
+Corrigido bug de acesso concorrente no sistema de rate cupons.
\ No newline at end of file
diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml
index efe765aa62..3b088cb429 100644
--- a/nbproject/private/private.xml
+++ b/nbproject/private/private.xml
@@ -3,9 +3,7 @@
- file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/constants/GameConstants.java
- file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/constants/ServerConstants.java
- file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/MapleCharacter.java
+ file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/wz/Etc.wz/Commodity.img.xml
diff --git a/scripts/npc/1012105.js b/scripts/npc/1012105.js
index 470478530e..c6e43d2c99 100644
--- a/scripts/npc/1012105.js
+++ b/scripts/npc/1012105.js
@@ -22,29 +22,47 @@
/* Ms. Tan
Henesys Skin Change.
*/
-var status = 0;
+var status;
var skin = Array(0, 1, 2, 3, 4);
var price = 1000000;
function start() {
- cm.sendSimple("Well, hello! Welcome to the Henesys Skin-Care! Would you like to have a firm, tight, healthy looking skin like mine? With a #b#t5153000##k, you can let us take care of the rest and have the kind of skin you've always wanted~!\r\n#L1#I would like to buy a #b#t5153000##k for " + price + " mesos, please!#l\r\n\#L2#I already have a Coupon!#l");
+ status = -1;
+ action(1, 0, 0);
}
function action(mode, type, selection) {
- if (mode < 1)
- cm.dispose();
- else {
- status++;
- if (status == 1)
- cm.sendStyle("With our specialized machine, you can see yourself after the treatment in advance. What kind of skin-treatment would you like to do? Choose the style of your liking.", skin);
- else {
- if (cm.haveItem(5153000)){
- cm.gainItem(5153000, -1);
- cm.setSkin(selection);
- cm.sendOk("Enjoy your new and improved skin!");
- } else
- cm.sendOk("Um... you don't have the skin-care coupon you need to receive the treatment. Sorry, but I am afraid we can't do it for you...");
- cm.dispose();
+ if (mode == -1) {
+ cm.dispose();
+ } else {
+ if (mode == 0 && type > 0) {
+ cm.dispose();
+ return;
+ }
+
+ if (mode == 1)
+ status++;
+ else
+ status--;
+
+
+ if (status == 0) {
+ cm.sendSimple("Well, hello! Welcome to the Henesys Skin-Care! Would you like to have a firm, tight, healthy looking skin like mine? With a #b#t5153000##k, you can let us take care of the rest and have the kind of skin you've always wanted~!\r\n#L1#I already have a Coupon!#l");
+ }
+ else if (status == 1) {
+ if (cm.haveItem(5153000)){
+ cm.sendStyle("With our specialized machine, you can see yourself after the treatment in advance. What kind of skin-treatment would you like to do? Choose the style of your liking.", skin);
+ } else {
+ cm.sendOk("Um... you don't have the skin-care coupon you need to receive the treatment. Sorry, but I am afraid we can't do it for you...");
+ cm.dispose();
+ return;
+ }
+ }
+ else {
+ cm.gainItem(5153000, -1);
+ cm.setSkin(selection);
+ cm.sendOk("Enjoy your new and improved skin!");
+ cm.dispose();
+ }
}
- }
}
diff --git a/scripts/npc/1012115.js b/scripts/npc/1012115.js
new file mode 100644
index 0000000000..820d711761
--- /dev/null
+++ b/scripts/npc/1012115.js
@@ -0,0 +1,13 @@
+function start() {
+ var status = cm.getQuestStatus(20706);
+
+ if (status == 0) {
+ cm.sendNext("It looks like there's nothing suspicious in the area.");
+ } else if (status == 1) {
+ cm.forceCompleteQuest(20706);
+ cm.sendNext("You have spotted the shadow! Better report to #p1103001#.");
+ } else if (status == 2) {
+ cm.sendNext("The shadow has already been spotted. Better report to #p1103001#.");
+ }
+ cm.dispose();
+}
\ No newline at end of file
diff --git a/scripts/npc/1012116.js b/scripts/npc/1012116.js
new file mode 100644
index 0000000000..7beb08a73f
--- /dev/null
+++ b/scripts/npc/1012116.js
@@ -0,0 +1,4 @@
+function start() {
+ cm.sendNext("It looks like there's nothing suspecious in the area.");
+ cm.dispose();
+}
\ No newline at end of file
diff --git a/scripts/npc/1012117.js b/scripts/npc/1012117.js
new file mode 100644
index 0000000000..0112b3eb55
--- /dev/null
+++ b/scripts/npc/1012117.js
@@ -0,0 +1,81 @@
+/*
+ This file is part of the OdinMS Maple Story Server
+ Copyright (C) 2008 Patrick Huy
+ Matthias Butz
+ Jan Christian Meyer
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation version 3 as published by
+ the Free Software Foundation. You may not use, modify or distribute
+ this program under any other version of the GNU Affero General Public
+ License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public 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 Name: Big Headward
+ Map(s): Victoria Road : Henesys Hair Salon (100000104)
+ Description: Random haircut
+*/
+
+var status = 0;
+var mhair = Array(30040, 30050, 30100, 30130, 30180, 30220, 30260, 30330, 30350, 30580);
+var fhair = Array(31020, 31160, 31180, 31220, 31290, 31330, 31420, 31440, 31480, 31590);
+var hairnew = Array();
+
+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.sendSimple("If you use this regular coupon, your hair may transform into a random new look...do you still want to do it using #b#t5150040##k, I will do it anyways for you. But don't forget, it will be random!\r\n\#L2#OK! (Uses #i5150040# #t5150040#)#l");
+ } else if (status == 1) {
+ cm.sendYesNo("If you use the EXP coupon your hair will change RANDOMLY with a chance to obtain a new experimental style that even you didn't think was possible. Are you going to use #b#t5150040##k and really change your hairstyle?");
+ }
+ else if (status == 2) {
+ if (cm.haveItem(5150040) == true){
+ hairnew = Array();
+ if (cm.getPlayer().getGender() == 0) {
+ for(var i = 0; i < mhair.length; i++) {
+ hairnew.push(mhair[i] + parseInt(cm.getPlayer().getHair() % 10));
+ }
+ }
+ else {
+ for(var i = 0; i < fhair.length; i++) {
+ hairnew.push(fhair[i] + parseInt(cm.getPlayer().getHair() % 10));
+ }
+ }
+
+ cm.gainItem(5150040, -1);
+ cm.setHair(hairnew[Math.floor(Math.random() * hairnew.length)]);
+ cm.sendOk("Enjoy your new and improved hairstyle!");
+ } else {
+ cm.sendOk("Hmmm...it looks like you don't have our designated coupon...I'm afraid I can't give you a haircut without it. I'm sorry...");
+ }
+
+ cm.dispose();
+ }
+ }
+}
diff --git a/scripts/npc/1052012.js b/scripts/npc/1052012.js
new file mode 100644
index 0000000000..42aea467bb
--- /dev/null
+++ b/scripts/npc/1052012.js
@@ -0,0 +1,61 @@
+/*
+ This file is part of the OdinMS Maple Story Server
+ Copyright (C) 2008 Patrick Huy
+ Matthias Butz
+ Jan Christian Meyer
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation version 3 as published by
+ the Free Software Foundation. You may not use, modify or distribute
+ this program under any other version of the GNU Affero General Public
+ License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU Affero General Public 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 ID: 1052012
+ NPC NAME: Mong from Kong
+ @author Ronan
+*/
+
+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.sendYesNo("So, are you going to use the Internet Cafe? There is a fee to use the spaces there, that is #b5,000 mesos#k. Are you going to enter the Cafe?");
+ } else if(status == 1) {
+ if(cm.getMeso() < 5000) {
+ cm.sendOk("Oh, you don't have the money, right? Sorry, I can't let you in.");
+ } else {
+ cm.warp(193000000);
+ }
+
+ cm.dispose();
+ }
+ }
+}
\ No newline at end of file
diff --git a/scripts/npc/1052013.js b/scripts/npc/1052013.js
new file mode 100644
index 0000000000..a85cd12dc4
--- /dev/null
+++ b/scripts/npc/1052013.js
@@ -0,0 +1,32 @@
+/*
+ This file is part of the OdinMS Maple Story Server
+ Copyright (C) 2008 Patrick Huy
+ Matthias Butz
+ Jan Christian Meyer
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation version 3 as published by
+ the Free Software Foundation. You may not use, modify or distribute
+ this program under any other version of the GNU Affero General Public
+ License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU Affero General Public 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 ID: 1052013
+ NPC NAME: Computer
+ @author Vcoc
+*/
+
+function start() {
+ cm.sendOk("MapleStory.exe stopped working... Please, restart the game.");
+ cm.dispose();
+}
\ No newline at end of file
diff --git a/scripts/npc/1052014.js b/scripts/npc/1052014.js
new file mode 100644
index 0000000000..2477256bc6
--- /dev/null
+++ b/scripts/npc/1052014.js
@@ -0,0 +1,32 @@
+/*
+ This file is part of the OdinMS Maple Story Server
+ Copyright (C) 2008 Patrick Huy
+ Matthias Butz
+ Jan Christian Meyer
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation version 3 as published by
+ the Free Software Foundation. You may not use, modify or distribute
+ this program under any other version of the GNU Affero General Public
+ License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU Affero General Public 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 ID: 1052014
+ NPC NAME: Vending Machine
+ @author Vcoc
+*/
+
+function start() {
+ cm.sendOk("At the moment, the machine is empty...");
+ cm.dispose();
+}
\ No newline at end of file
diff --git a/scripts/npc/1052015.js b/scripts/npc/1052015.js
new file mode 100644
index 0000000000..97c641b192
--- /dev/null
+++ b/scripts/npc/1052015.js
@@ -0,0 +1,32 @@
+/*
+ This file is part of the OdinMS Maple Story Server
+ Copyright (C) 2008 Patrick Huy
+ Matthias Butz
+ Jan Christian Meyer
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as
+ published by the Free Software Foundation version 3 as published by
+ the Free Software Foundation. You may not use, modify or distribute
+ this program under any other version of the GNU Affero General Public
+ License.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ See the GNU Affero General Public 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 ID: 1052015
+ NPC NAME: Billy
+ @author Vcoc
+*/
+
+function start() {
+ cm.sendOk("Do you keep seeing blue screen? Ahhh... then restart the computer.");
+ cm.dispose();
+}
\ No newline at end of file
diff --git a/scripts/npc/2091005.js b/scripts/npc/2091005.js
index 5cba2151d1..f9bc8f97eb 100644
--- a/scripts/npc/2091005.js
+++ b/scripts/npc/2091005.js
@@ -97,11 +97,13 @@ function action(mode, type, selection) {
if(avDojo < 0) {
if(avDojo == -1) cm.sendOk("All Dojo's are being used already. Wait for awhile before trying again.");
- else cm.sendOk("Your party is already using the dojo. Wait for them to finish to enter.");
+ else cm.sendOk("Either your party is already using the Dojo or your party's allotted time on the Dojo has not expired yet. Wait for them to finish to enter.");
}
else {
cm.getClient().getChannelServer().getMapFactory().getMap(925020010 + avDojo).resetMapObjects();
cm.getClient().getChannelServer().resetDojo(925020010 + avDojo);
+
+ cm.resetDojoEnergy();
cm.warp(925020010 + avDojo, 0);
}
@@ -119,13 +121,15 @@ function action(mode, type, selection) {
if(avDojo < 0) {
if(avDojo == -1) cm.sendOk("All Dojo's are being used already. Wait for awhile before trying again.");
- else cm.sendOk("Your party is already using the dojo. Wait for them to finish to enter.");
+ else cm.sendOk("Either your party is already using the Dojo or your party's allotted time on the Dojo has not expired yet. Wait for them to finish to enter.");
cm.getPlayer().setDojoStage(dojoWarp);
}
else {
var warpDojoMap = ((mode == 1) ? 925020000 + (dojoWarp + 1) * 100 + avDojo : 925020100 + avDojo);
cm.getClient().getChannelServer().resetDojoMap(warpDojoMap);
cm.getClient().getChannelServer().resetDojo(warpDojoMap);
+
+ cm.resetDojoEnergy();
cm.warp(warpDojoMap, 0);
}
@@ -136,11 +140,13 @@ function action(mode, type, selection) {
if(avDojo < 0) {
if(avDojo == -1) cm.sendOk("All Dojo's are being used already. Wait for awhile before trying again.");
- else cm.sendOk("Your party is already using the dojo. Wait for them to finish to enter.");
+ else cm.sendOk("Either your party is already using the Dojo or your party's allotted time on the Dojo has not expired yet. Wait for them to finish to enter.");
}
else {
cm.getClient().getChannelServer().resetDojoMap(925020100 + avDojo);
cm.getClient().getChannelServer().resetDojo(925020100 + avDojo);
+
+ cm.resetDojoEnergy();
cm.warp(925020100 + avDojo, 0);
}
@@ -174,11 +180,13 @@ function action(mode, type, selection) {
if(avDojo < 0) {
if(avDojo == -1) cm.sendOk("All Dojo's are being used already. Wait for awhile before trying again.");
- else cm.sendOk("Your party is already using the dojo. Wait for them to finish to enter.");
+ else cm.sendOk("Either your party is already using the Dojo or your party's allotted time on the Dojo has not expired yet. Wait for them to finish to enter.");
}
else {
cm.getClient().getChannelServer().resetDojoMap(925030100 + avDojo);
cm.getClient().getChannelServer().resetDojo(925030100 + avDojo);
+
+ cm.resetPartyDojoEnergy();
cm.warpParty(925030100 + avDojo);
}
@@ -209,7 +217,7 @@ function action(mode, type, selection) {
var belt = belts[selection];
var level = belt_level[selection];
var points = belt_points[selection];
- if (cm.getPlayer().getDojoPoints() > points) {
+ if (cm.getPlayer().getDojoPoints() >= points) {
if (cm.getPlayer().getLevel() > level) {
cm.gainItem(belt, 1);
cm.sendNext("There is the #i" + belt + "# #b#t" + belt + "##k. You have proven your valor to ascend on the Dojo ranks. Well done!");
@@ -350,8 +358,12 @@ function action(mode, type, selection) {
if (mode == 0) {
cm.sendNext("Stop changing your mind! Soon, you'll be crying, begging me to go back.");
} else if (mode == 1) {
+ var dojoMapId = cm.getPlayer().getMap().getId();
+
cm.warp(925020002, 0);
cm.getPlayer().message("Can you make up your mind please?");
+
+ cm.getClient().getChannelServer().freeDojoSectionIfEmpty(dojoMapId);
}
cm.dispose();
}
diff --git a/scripts/npc/commands.js b/scripts/npc/commands.js
index 62b088995f..94a2f8c437 100644
--- a/scripts/npc/commands.js
+++ b/scripts/npc/commands.js
@@ -42,6 +42,7 @@ function writeSolaxiaCommandsLv6() { //Admin
comm_cursor = comm_lv6;
desc_cursor = desc_lv6;
+ addCommand("setgmlevel", "");
addCommand("warpworld", "");
addCommand("saveall", "");
addCommand("dcall", "");
@@ -90,9 +91,8 @@ function writeSolaxiaCommandsLv4() { //SuperGM
addCommand("pinkbean", "");
addCommand("pap", "");
addCommand("pianus", "");
+ addCommand("cake", "");
addCommand("playernpc", "");
- addCommand("face", "");
- addCommand("hair", "");
}
function writeSolaxiaCommandsLv3() { //GM
@@ -143,6 +143,8 @@ function writeSolaxiaCommandsLv3() { //GM
addCommand("killmap", "");
addCommand("night", "");
addCommand("npc", "");
+ addCommand("face", "");
+ addCommand("hair", "");
}
function writeSolaxiaCommandsLv2() { //JrGM
diff --git a/scripts/portal/dojang_next.js b/scripts/portal/dojang_next.js
index 47ab1df13a..0d710235d9 100644
--- a/scripts/portal/dojang_next.js
+++ b/scripts/portal/dojang_next.js
@@ -23,28 +23,36 @@
* @Author Moogra, Ronan
*/
function enter(pi) {
- var gate = pi.getPlayer().getMap().getReactorByName("door");
+ var currwarp = Date.now();
- if ((gate != null && gate.getState() == 1) || pi.getMap().countMonsters() == 0) {
- if (Math.floor(pi.getPlayer().getMapId() / 100) % 100 < 38) {
- pi.getPlayer().message("You received " + pi.getPlayer().addDojoPointsByMap() + " training points. Your total training points score is now " + pi.getPlayer().getDojoPoints() + ".");
-
- if(((Math.floor((pi.getPlayer().getMap().getId() + 100) / 100)) % 100) % 6 == 0) {
- if(Math.floor(pi.getPlayer().getMapId() / 10000) == 92503) {
- pi.warpParty(pi.getPlayer().getMap().getId() + 100, 925030100, 925033804);
+ if(currwarp - pi.getPlayer().getNpcCooldown() < 3000) return false; // this script can be ran twice when passing the dojo portal... strange.
+ pi.getPlayer().setNpcCooldown(currwarp);
+
+ var gate = pi.getPlayer().getMap().getReactorByName("door");
+ if(gate != null) {
+ if (gate.getState() == 1 || pi.getMap().countMonsters() == 0) {
+ if (Math.floor(pi.getPlayer().getMapId() / 100) % 100 < 38) {
+ pi.getPlayer().message("You received " + pi.getPlayer().addDojoPointsByMap() + " training points. Your total training points score is now " + pi.getPlayer().getDojoPoints() + ".");
+
+ if(((Math.floor((pi.getPlayer().getMap().getId() + 100) / 100)) % 100) % 6 == 0) {
+ if(Math.floor(pi.getPlayer().getMapId() / 10000) == 92503) {
+ pi.warpParty(pi.getPlayer().getMap().getId() + 100, 925030100, 925033804);
+ } else {
+ pi.warp(pi.getPlayer().getMap().getId() + 100, 0);
+ }
} else {
pi.warp(pi.getPlayer().getMap().getId() + 100, 0);
}
} else {
- pi.warp(pi.getPlayer().getMap().getId() + 100, 0);
+ pi.warp(925020003, 0);
+ pi.getPlayer().gainExp(2000 * pi.getPlayer().getDojoPoints(), true, true, true);
}
+ return true;
} else {
- pi.warp(925020003, 0);
- pi.getPlayer().gainExp(2000 * pi.getPlayer().getDojoPoints(), true, true, true);
+ pi.getPlayer().message("The door is not open yet.");
+ return false;
}
- return true;
} else {
- pi.getPlayer().message("The door is not open yet.");
return false;
}
}
diff --git a/sql/db_database.sql b/sql/db_database.sql
index 736d9fbc3b..ac40336741 100644
--- a/sql/db_database.sql
+++ b/sql/db_database.sql
@@ -20759,32 +20759,32 @@ INSERT INTO `shopitems` (`shopitemid`, `shopid`, `itemid`, `price`, `pitch`, `po
(20065, 9270057, 2022015, 12000, 0, 1),
(20066, 9270057, 2061000, 1, 0, 2),
(20067, 9270057, 2060000, 1, 0, 3),
-(20068, 9270057, 2030000, 400, 0, 4),
-(20069, 9270057, 2050003, 500, 0, 5),
-(20070, 9270057, 2050002, 300, 0, 6),
-(20071, 9270057, 2050001, 200, 0, 7),
-(20072, 9270057, 2050000, 200, 0, 8),
-(20073, 9270057, 2020028, 3000, 0, 9),
-(20074, 9270057, 2010004, 310, 0, 10),
-(20075, 9270057, 2010003, 100, 0, 11),
-(20076, 9270057, 2010001, 106, 0, 12),
-(20077, 9270057, 2010002, 50, 0, 13),
-(20078, 9270057, 2010000, 30, 0, 14),
-(20079, 9270057, 2001002, 4000, 0, 15),
-(20080, 9270057, 2001001, 2300, 0, 16),
-(20081, 9270057, 2001000, 3200, 0, 17),
-(20082, 9270057, 2022000, 1650, 0, 18),
-(20083, 9270057, 2022003, 1100, 0, 19),
-(20084, 9270057, 2002005, 500, 0, 20),
-(20085, 9270057, 2002004, 500, 0, 21),
-(20086, 9270057, 2002002, 500, 0, 22),
-(20087, 9270057, 2002001, 400, 0, 23),
-(20088, 9270057, 2002000, 500, 0, 24),
-(20089, 9270057, 2000006, 620, 0, 25),
-(20090, 9270057, 2000003, 200, 0, 26),
-(20091, 9270057, 2000002, 320, 0, 27),
-(20092, 9270057, 2000001, 160, 0, 28),
-(20093, 9270057, 2000000, 50, 0, 29),
+(20068, 9270057, 2030000, 400, 0, 5),
+(20069, 9270057, 2050003, 500, 0, 6),
+(20070, 9270057, 2050002, 300, 0, 7),
+(20071, 9270057, 2050001, 200, 0, 8),
+(20072, 9270057, 2050000, 200, 0, 9),
+(20073, 9270057, 2020028, 3000, 0, 10),
+(20074, 9270057, 2010004, 310, 0, 11),
+(20075, 9270057, 2010003, 100, 0, 12),
+(20076, 9270057, 2010001, 106, 0, 13),
+(20077, 9270057, 2010002, 50, 0, 14),
+(20078, 9270057, 2010000, 30, 0, 15),
+(20079, 9270057, 2001002, 4000, 0, 16),
+(20080, 9270057, 2001001, 2300, 0, 17),
+(20081, 9270057, 2001000, 3200, 0, 18),
+(20082, 9270057, 2022000, 1650, 0, 19),
+(20083, 9270057, 2022003, 1100, 0, 20),
+(20084, 9270057, 2002005, 500, 0, 21),
+(20085, 9270057, 2002004, 500, 0, 22),
+(20086, 9270057, 2002002, 500, 0, 23),
+(20087, 9270057, 2002001, 400, 0, 24),
+(20088, 9270057, 2002000, 500, 0, 25),
+(20089, 9270057, 2000006, 620, 0, 26),
+(20090, 9270057, 2000003, 200, 0, 27),
+(20091, 9270057, 2000002, 320, 0, 28),
+(20092, 9270057, 2000001, 160, 0, 29),
+(20093, 9270057, 2000000, 50, 0, 30),
(20094, 9270055, 1492006, 160000, 0, 1),
(20095, 9270055, 1492005, 100000, 0, 2),
(20096, 9270055, 1492004, 50000, 0, 3),
@@ -20923,29 +20923,29 @@ INSERT INTO `shopitems` (`shopitemid`, `shopid`, `itemid`, `price`, `pitch`, `po
(20229, 9270056, 1002004, 160000, 0, 444),
(20230, 9270065, 2061000, 1, 0, 1),
(20231, 9270065, 2060000, 1, 0, 2),
-(20232, 9270065, 2030000, 400, 0, 3),
-(20233, 9270065, 2050003, 500, 0, 4),
-(20234, 9270065, 2050002, 300, 0, 5),
-(20235, 9270065, 2050001, 200, 0, 6),
-(20236, 9270065, 2050000, 200, 0, 7),
-(20237, 9270065, 2022215, 6800, 0, 8),
-(20238, 9270065, 2022214, 3200, 0, 9),
-(20239, 9270065, 2022213, 6800, 0, 10),
-(20240, 9270065, 2022212, 3200, 0, 11),
-(20241, 9270065, 2022211, 6400, 0, 12),
-(20242, 9270065, 2022210, 3200, 0, 13),
-(20243, 9270065, 2022209, 1600, 0, 14),
-(20244, 9270065, 2022208, 1000, 0, 15),
-(20245, 9270065, 2022207, 2600, 0, 16),
-(20246, 9270065, 2022206, 2200, 0, 17),
-(20247, 9270065, 2022205, 1800, 0, 18),
-(20248, 9270065, 2022204, 1200, 0, 19),
-(20249, 9270065, 2022203, 800, 0, 20),
-(20250, 9270065, 2022480, 12000, 0, 21),
-(20251, 9270065, 2022479, 3800, 0, 22),
-(20252, 9270065, 2022478, 3200, 0, 23),
-(20253, 9270065, 2022477, 9200, 0, 24),
-(20254, 9270065, 2022476, 4200, 0, 25);
+(20232, 9270065, 2030000, 400, 0, 4),
+(20233, 9270065, 2050003, 500, 0, 5),
+(20234, 9270065, 2050002, 300, 0, 6),
+(20235, 9270065, 2050001, 200, 0, 7),
+(20236, 9270065, 2050000, 200, 0, 8),
+(20237, 9270065, 2022215, 6800, 0, 9),
+(20238, 9270065, 2022214, 3200, 0, 10),
+(20239, 9270065, 2022213, 6800, 0, 11),
+(20240, 9270065, 2022212, 3200, 0, 12),
+(20241, 9270065, 2022211, 6400, 0, 13),
+(20242, 9270065, 2022210, 3200, 0, 14),
+(20243, 9270065, 2022209, 1600, 0, 15),
+(20244, 9270065, 2022208, 1000, 0, 16),
+(20245, 9270065, 2022207, 2600, 0, 17),
+(20246, 9270065, 2022206, 2200, 0, 18),
+(20247, 9270065, 2022205, 1800, 0, 19),
+(20248, 9270065, 2022204, 1200, 0, 20),
+(20249, 9270065, 2022203, 800, 0, 21),
+(20250, 9270065, 2022480, 12000, 0, 22),
+(20251, 9270065, 2022479, 3800, 0, 23),
+(20252, 9270065, 2022478, 3200, 0, 24),
+(20253, 9270065, 2022477, 9200, 0, 25),
+(20254, 9270065, 2022476, 4200, 0, 26);
CREATE TABLE IF NOT EXISTS `shops` (
`shopid` int(10) unsigned NOT NULL AUTO_INCREMENT,
diff --git a/sql/db_shopupdate.sql b/sql/db_shopupdate.sql
index 4ec4b74f93..56d2cf0273 100644
--- a/sql/db_shopupdate.sql
+++ b/sql/db_shopupdate.sql
@@ -120,6 +120,7 @@ INSERT IGNORE INTO `shopitems` (`shopid`, `itemid`, `price`, `pitch`, `position`
(1021100, 2030100, 450, 0, 142),
(1031100, 2030100, 450, 0, 146),
(1051002, 2030100, 450, 0, 142),
+(1052116, 2030100, 450, 0, 118),
(1061001, 2030100, 450, 0, 126),
(1061002, 2030100, 450, 0, 130),
(1091002, 2030100, 450, 0, 130),
@@ -141,4 +142,7 @@ INSERT IGNORE INTO `shopitems` (`shopid`, `itemid`, `price`, `pitch`, `position`
(9201060, 2030100, 450, 0, 114),
(9270021, 2030100, 450, 0, 118),
(9270022, 2030100, 450, 0, 114),
-(1338, 2030100, 450, 0, 114);
\ No newline at end of file
+(1338, 2030100, 450, 0, 114),
+(9270057, 2030100, 450, 0, 4),
+(9270065, 2030100, 450, 0, 3),
+(9270022, 2030100, 450, 0, 118);
\ No newline at end of file
diff --git a/src/client/MapleCharacter.java b/src/client/MapleCharacter.java
index 8245fe9b82..45f7505c62 100644
--- a/src/client/MapleCharacter.java
+++ b/src/client/MapleCharacter.java
@@ -1528,7 +1528,11 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
this.getMap().pickItemDrop(pickupPacket, mapitem);
} else if(mapitem.getItemId() == 4031865 || mapitem.getItemId() == 4031866) {
// Add NX to account, show effect and make item disappear
- this.getCashShop().gainCash(1, mapitem.getItemId() == 4031865 ? 100 : 250);
+ int nxGain = mapitem.getItemId() == 4031865 ? 100 : 250;
+ this.getCashShop().gainCash(1, nxGain);
+
+ showHint("You have earned #e#b" + nxGain + " NX#k#n. (" + this.getCashShop().getCash(1) + " NX)");
+
this.getMap().pickItemDrop(pickupPacket, mapitem);
} else if (MapleInventoryManipulator.addFromDrop(client, mapitem.getItem(), true)) {
this.getMap().pickItemDrop(pickupPacket, mapitem);
@@ -1597,7 +1601,10 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
}
} else if(mapitem.getItemId() == 4031865 || mapitem.getItemId() == 4031866) {
// Add NX to account, show effect and make item disappear
- this.getCashShop().gainCash(1, mapitem.getItemId() == 4031865 ? 100 : 250);
+ int nxGain = mapitem.getItemId() == 4031865 ? 100 : 250;
+ this.getCashShop().gainCash(1, nxGain);
+
+ showHint("You have earned #e#b" + nxGain + " NX#k#n. (" + this.getCashShop().getCash(1) + " NX)");
} else if (useItem(client, mapitem.getItem().getItemId())) {
if (mapitem.getItem().getItemId() / 10000 == 238) {
this.getMonsterBook().addCard(client, mapitem.getItem().getItemId());
@@ -2166,6 +2173,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
dispelDebuff(MapleDisease.POISON);
dispelDebuff(MapleDisease.SEAL);
dispelDebuff(MapleDisease.WEAKEN);
+ dispelDebuff(MapleDisease.SLOW);
}
public void cancelAllDebuffs() {
@@ -3225,8 +3233,12 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
}
public boolean isPartyMember(MapleCharacter chr) {
+ return isPartyMember(chr.getId());
+ }
+
+ public boolean isPartyMember(int cid) {
for(MapleCharacter mpcu: getPartyMembers()) {
- if(mpcu.getId() == chr.getId()) {
+ if(mpcu.getId() == cid) {
return true;
}
}
@@ -3238,6 +3250,11 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
return playerShop;
}
+ public void setGMLevel(int level) {
+ this.gmLevel = Math.min(level, 6);
+ this.gmLevel = Math.max(level, 0);
+ }
+
public void closePlayerInteractions() {
closeNpcShop();
closeTrade();
@@ -3430,9 +3447,9 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
//---- /\ /\ /\ /\ /\ /\ /\ NOT TESTED /\ /\ /\ /\ /\ /\ /\ /\ /\ ----
public boolean needQuestItem(int questid, int itemid) {
- if (questid <= 0) {
- return true; //For non quest items :3
- }
+ if (questid <= 0) return true; //For non quest items :3
+ if (this.getQuestStatus(questid) != 1) return false;
+
MapleQuest quest = MapleQuest.getInstance(questid);
return getInventory(ItemConstants.getInventoryType(itemid)).countById(itemid) < quest.getItemAmountNeeded(itemid);
}
@@ -4119,8 +4136,19 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
}
private void setCouponRates() {
- setActiveCoupons();
- activateCouponsEffects();
+ List couponEffects;
+
+ chrLock.lock();
+ try {
+ setActiveCoupons();
+ couponEffects = activateCouponsEffects();
+ } finally {
+ chrLock.unlock();
+ }
+
+ for(Integer couponId: couponEffects) {
+ commitBuffCoupon(couponId);
+ }
}
private void revertCouponRates() {
@@ -4167,13 +4195,16 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
this.mesoCoupon = 1;
}
- private void activateCouponsEffects() {
+ private List activateCouponsEffects() {
+ List toCommitEffect = new LinkedList<>();
+
if(ServerConstants.USE_STACK_COUPON_RATES) {
for(Entry coupon: activeCoupons.entrySet()) {
int couponId = coupon.getKey();
int couponQty = coupon.getValue();
- commitBuffCoupon(couponId);
+ toCommitEffect.add(couponId);
+
if(ItemConstants.isExpCoupon(couponId)) setExpCouponRate(couponId, couponQty);
else setDropCouponRate(couponId, couponQty);
}
@@ -4198,8 +4229,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
}
}
- if(maxExpCouponId > -1) commitBuffCoupon(maxExpCouponId);
- if(maxDropCouponId > -1) commitBuffCoupon(maxDropCouponId);
+ if(maxExpCouponId > -1) toCommitEffect.add(maxExpCouponId);
+ if(maxDropCouponId > -1) toCommitEffect.add(maxDropCouponId);
this.expCoupon = maxExpRate;
this.dropCoupon = maxDropRate;
@@ -4209,30 +4240,27 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
this.expRate *= this.expCoupon;
this.dropRate *= this.dropCoupon;
this.mesoRate *= this.mesoCoupon;
+
+ return toCommitEffect;
}
private void setActiveCoupons() {
- chrLock.lock();
- try {
- activeCoupons.clear();
- activeCouponRates.clear();
+ activeCoupons.clear();
+ activeCouponRates.clear();
- Map coupons = Server.getInstance().getCouponRates();
- List active = Server.getInstance().getActiveCoupons();
+ Map coupons = Server.getInstance().getCouponRates();
+ List active = Server.getInstance().getActiveCoupons();
- for(Item it: this.getInventory(MapleInventoryType.CASH).list()) {
- if(ItemConstants.isRateCoupon(it.getItemId()) && active.contains(it.getItemId())) {
- Integer count = activeCoupons.get(it.getItemId());
+ for(Item it: this.getInventory(MapleInventoryType.CASH).list()) {
+ if(ItemConstants.isRateCoupon(it.getItemId()) && active.contains(it.getItemId())) {
+ Integer count = activeCoupons.get(it.getItemId());
- if(count != null) activeCoupons.put(it.getItemId(), count + 1);
- else {
- activeCoupons.put(it.getItemId(), 1);
- activeCouponRates.put(it.getItemId(), coupons.get(it.getItemId()));
- }
+ if(count != null) activeCoupons.put(it.getItemId(), count + 1);
+ else {
+ activeCoupons.put(it.getItemId(), 1);
+ activeCouponRates.put(it.getItemId(), coupons.get(it.getItemId()));
}
}
- } finally {
- chrLock.unlock();
}
}
@@ -4261,7 +4289,12 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
}
public Set getActiveCoupons() {
- return Collections.unmodifiableSet(activeCoupons.keySet());
+ chrLock.lock();
+ try {
+ return Collections.unmodifiableSet(activeCoupons.keySet());
+ } finally {
+ chrLock.unlock();
+ }
}
public static MapleCharacter loadCharFromDB(int charid, MapleClient client, boolean channelserver) throws SQLException {
@@ -5006,7 +5039,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
}, buffInterval, buffInterval);
}
} else if (effect.isRecovery()) {
- int healInterval = (ServerConstants.USE_ULTRA_RECOVERY) ? 2500 : 5000;
+ int healInterval = (ServerConstants.USE_ULTRA_RECOVERY) ? 2000 : 5000;
final byte heal = (byte) effect.getX();
chrLock.lock();
@@ -6198,10 +6231,14 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
public void timeoutFromDojo() {
if(map.isDojoMap()) {
- client.getPlayer().changeMap(client.getChannelServer().getMapFactory().getMap(925020000));
+ client.getPlayer().changeMap(client.getChannelServer().getMapFactory().getMap(925020002));
}
}
-
+
+ public void showHint(String msg) {
+ client.announceHint(msg);
+ }
+
public void showNote() {
try {
Connection con = DatabaseConnection.getConnection();
diff --git a/src/client/MapleClient.java b/src/client/MapleClient.java
index 7794531aec..1069d5e784 100644
--- a/src/client/MapleClient.java
+++ b/src/client/MapleClient.java
@@ -60,6 +60,7 @@ import net.server.world.World;
import org.apache.mina.core.session.IoSession;
import client.inventory.MapleInventoryType;
+import constants.GameConstants;
import constants.ServerConstants;
import scripting.AbstractPlayerInteraction;
import scripting.event.EventManager;
@@ -798,7 +799,12 @@ public class MapleClient {
player.getEventInstance().playerDisconnected(player);
}
if (player.getMap() != null) {
+ int mapId = player.getMapId();
player.getMap().removePlayer(player);
+
+ if(GameConstants.isDojo(mapId)) {
+ this.getChannelServer().freeDojoSectionIfEmpty(mapId);
+ }
}
} catch (final Throwable t) {
@@ -1031,6 +1037,10 @@ public class MapleClient {
public int getGMLevel() {
return gmlevel;
}
+
+ public void setGMLevel(int level) {
+ gmlevel = level;
+ }
public void setScriptEngine(String name, ScriptEngine e) {
engines.put(name, e);
@@ -1263,11 +1273,15 @@ public class MapleClient {
player.setTargetHpBarTime(timeNow);
}
}
-
+
public synchronized void announce(final byte[] packet) {//MINA CORE IS A FUCKING BITCH AND I HATE IT <3
session.write(packet);
}
+ public void announceHint(String msg) {
+ announce(MaplePacketCreator.sendHint(msg, 500, 10));
+ announce(MaplePacketCreator.enableActions());
+ }
public void changeChannel(int channel) {
Server server = Server.getInstance();
diff --git a/src/client/command/Commands.java b/src/client/command/Commands.java
index fce1a57df8..b9bd487993 100644
--- a/src/client/command/Commands.java
+++ b/src/client/command/Commands.java
@@ -100,6 +100,7 @@ import client.inventory.MapleInventoryType;
import client.inventory.MaplePet;
import constants.GameConstants;
import constants.ItemConstants;
+import constants.ServerConstants;
import java.util.ArrayList;
import server.life.SpawnPoint;
import server.maps.FieldLimit;
@@ -698,7 +699,7 @@ public class Commands {
case "goto":
if (sub.length < 2){
- player.yellowMessage("Syntax: @goto