diff --git a/README.txt b/README.txt
index 546a5ac889..3ffda913f7 100644
--- a/README.txt
+++ b/README.txt
@@ -6,7 +6,7 @@ Credits are to be given too to Nexon(Duh!), the original MapleSolaxia staff and
Regarding distributability and usage of the code presented here: like it was before, this MapleStory server is open-source. By that, it is meant that anyone is free to install, use, modify and redistribute the contents, as long as there is no kind of commercial trading involved and the credits to the original creators are maintained within the codes.
-This is a NetBeans 8.0.2 Project, that must be built and run under JDK/JRE 7 in order to run properly. This means that it's easier to install the project via opening the server project folder inside NetBeans' IDE. Once installed, build this project on your machine and run the server using the "launch.bat" application.
+This is a NetBeans 8.0.2 Project, that MUST be built and run under JDK/JRE 7 in order to run properly. This means that it's easier to install the project via opening the server project folder inside NetBeans' IDE. Once installed, build this project on your machine and run the server using the "launch.bat" application.
In this project, many gameplay-wise issues generated from either the original WZ files and the server sources have been partially or completely solved. Considering the use of the provided edited WZ's and server-side wz.xml files should be of the greatest importance when dealing with this instance of private server, in order to perceive it at it's full potential. My opinion, though! Refer to "README_wzchanges.txt" for more information on what have been changed from Nexon's v83 WZ files.
diff --git a/build/built-jar.properties b/build/built-jar.properties
index 012cb85e32..689813ebc9 100644
--- a/build/built-jar.properties
+++ b/build/built-jar.properties
@@ -1,4 +1,4 @@
-#Thu, 03 Aug 2017 23:09:50 -0300
+#Sat, 05 Aug 2017 19:11:00 -0300
C\:\\Nexon\\MapleSolaxia\\MapleSolaxiaV2=
diff --git a/build/classes/client/MapleCharacter$1.class b/build/classes/client/MapleCharacter$1.class
index b5b2426667..2311442164 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 6c2a085eba..9b7a894adb 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 af607a7c46..3f9e7d9232 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 c313f32d5a..c4b23428aa 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 975a14b350..3fce9478df 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 d6561bafa6..8e056a79aa 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 efa4c97a5b..ec174e4dde 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 ac068a98d2..04706d3dac 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 c4eef43afe..5a3f33b882 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 846e797ca0..71efd409b3 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 196ca5c309..c490aa03f2 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 c3e3c2bf03..f42b1dcc60 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 56589a900b..b863df73a1 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 d96db286d5..328df5d9dc 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 aaf7128a21..38444603a6 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 777e117413..f202f61729 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 acb0834439..2cffab5245 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 4f72d84731..de56774164 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 43ab177661..d1e984f74a 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 5719399944..83520f4307 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$CancelCooldownAction.class b/build/classes/client/MapleCharacter$CancelCooldownAction.class
index b924e7599a..3f22e0e7fb 100644
Binary files a/build/classes/client/MapleCharacter$CancelCooldownAction.class and b/build/classes/client/MapleCharacter$CancelCooldownAction.class differ
diff --git a/build/classes/client/MapleCharacter$FameStatus.class b/build/classes/client/MapleCharacter$FameStatus.class
index 612db1ebef..0bc4699a53 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 7035a5065d..ff3e2327b1 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 66022be946..103dda5c50 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 8f63655b39..9f2d016036 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 358e0f1564..21a199c7b5 100644
Binary files a/build/classes/client/MapleCharacter.class and b/build/classes/client/MapleCharacter.class differ
diff --git a/build/classes/client/command/Commands.class b/build/classes/client/command/Commands.class
index 8af227dc25..2cfcb196df 100644
Binary files a/build/classes/client/command/Commands.class and b/build/classes/client/command/Commands.class differ
diff --git a/build/classes/constants/ServerConstants.class b/build/classes/constants/ServerConstants.class
index d0277361a1..a5e74c19e3 100644
Binary files a/build/classes/constants/ServerConstants.class and b/build/classes/constants/ServerConstants.class differ
diff --git a/build/classes/net/server/Server.class b/build/classes/net/server/Server.class
index f4e83e57a1..0acbebce41 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/handlers/AbstractDealDamageHandler$1.class b/build/classes/net/server/channel/handlers/AbstractDealDamageHandler$1.class
index 4da0908c12..6e1f1bc2ca 100644
Binary files a/build/classes/net/server/channel/handlers/AbstractDealDamageHandler$1.class and b/build/classes/net/server/channel/handlers/AbstractDealDamageHandler$1.class differ
diff --git a/build/classes/net/server/channel/handlers/AbstractDealDamageHandler$2.class b/build/classes/net/server/channel/handlers/AbstractDealDamageHandler$2.class
index fe5b3afb5f..7ea576542b 100644
Binary files a/build/classes/net/server/channel/handlers/AbstractDealDamageHandler$2.class and b/build/classes/net/server/channel/handlers/AbstractDealDamageHandler$2.class differ
diff --git a/build/classes/net/server/channel/handlers/AbstractDealDamageHandler.class b/build/classes/net/server/channel/handlers/AbstractDealDamageHandler.class
index 5fd62f795c..03b6d98814 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/KeymapChangeHandler.class b/build/classes/net/server/channel/handlers/KeymapChangeHandler.class
index 19bb404775..237c464934 100644
Binary files a/build/classes/net/server/channel/handlers/KeymapChangeHandler.class and b/build/classes/net/server/channel/handlers/KeymapChangeHandler.class differ
diff --git a/build/classes/net/server/channel/handlers/MoveLifeHandler.class b/build/classes/net/server/channel/handlers/MoveLifeHandler.class
index d20610c800..a8326a0d68 100644
Binary files a/build/classes/net/server/channel/handlers/MoveLifeHandler.class and b/build/classes/net/server/channel/handlers/MoveLifeHandler.class differ
diff --git a/build/classes/net/server/channel/handlers/TakeDamageHandler.class b/build/classes/net/server/channel/handlers/TakeDamageHandler.class
index da559bf06e..e592c02b39 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 b3b7c87e68..c51bd63006 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/server/MapleStatEffect$CancelEffectAction.class b/build/classes/server/MapleStatEffect$CancelEffectAction.class
index 210ab0012c..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 a61eea1b9e..0880bf148c 100644
Binary files a/build/classes/server/MapleStatEffect.class and b/build/classes/server/MapleStatEffect.class differ
diff --git a/build/classes/server/life/MobSkill.class b/build/classes/server/life/MobSkill.class
index bde36d2429..c232c5fae9 100644
Binary files a/build/classes/server/life/MobSkill.class and b/build/classes/server/life/MobSkill.class differ
diff --git a/build/classes/server/maps/MapleMap$1.class b/build/classes/server/maps/MapleMap$1.class
index 8897dab3a6..790c202a54 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 aaaf948484..60ba263411 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 3a5a79f04f..d50e123b01 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 13c0392d25..6d91dd729f 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 865db71b2c..ca722ac9e9 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 7358ab1aab..130bb46c92 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 d2e720f800..a4cc98fbfc 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 c6aaaf83f8..c2dbb9755e 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 cf83f27c84..ce3d3d1587 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 563fda4ecd..09e257d2e5 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 23afc5f1f2..c8ee8ba288 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 cba9f21143..5bb740faf3 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 2cc51da1d4..b3385e5422 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 d781a1a22f..e69699d16d 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 109ce04921..61e649fc47 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 4757210001..d96e081877 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 506c881cf8..bbb55c0287 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 f412de4a0c..61a0792e9e 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 507fe89538..9777ac7a17 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 49cc508eaa..5b5a1c1ad3 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$1.class b/build/classes/server/maps/MapleMap$28$1.class
deleted file mode 100644
index 227b5892ca..0000000000
Binary files a/build/classes/server/maps/MapleMap$28$1.class and /dev/null differ
diff --git a/build/classes/server/maps/MapleMap$28.class b/build/classes/server/maps/MapleMap$28.class
index afab86635b..7ba63d122b 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
new file mode 100644
index 0000000000..b976c6228c
Binary files /dev/null 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 e9dd9d30ec..093774fb98 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 d33ddf0d7e..0fb597c1aa 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
new file mode 100644
index 0000000000..645b620af4
Binary files /dev/null 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 4fb84fb9e9..cb43f2a66b 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 486d71a222..a3b06275e1 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 8f50a93546..5c3e39d96b 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 e8d472bbb2..3b66fae7d9 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 f6e5018df0..d6977e4d1e 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 5f691c4a1d..2c842f36bb 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 ba2913c473..a837e30d43 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 1c4342ac47..a4c975b9ee 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 d65fa13a57..f5765c1a95 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 1ee0a529a3..2c0aeaeb64 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/MapleMapFactory.class b/build/classes/server/maps/MapleMapFactory.class
index 91392b79c4..72d97a9e7c 100644
Binary files a/build/classes/server/maps/MapleMapFactory.class and b/build/classes/server/maps/MapleMapFactory.class differ
diff --git a/dist/MapleSolaxia.jar b/dist/MapleSolaxia.jar
index 562c363851..056569bb71 100644
Binary files a/dist/MapleSolaxia.jar and b/dist/MapleSolaxia.jar differ
diff --git a/README_wzchanges.txt b/docs/README_wzchanges.txt
similarity index 100%
rename from README_wzchanges.txt
rename to docs/README_wzchanges.txt
diff --git a/feature_list.txt b/docs/feature_list.txt
similarity index 96%
rename from feature_list.txt
rename to docs/feature_list.txt
index 2ac1466b52..b3572f5334 100644
--- a/feature_list.txt
+++ b/docs/feature_list.txt
@@ -26,10 +26,11 @@ Quests:
Player Social Network:
* Guild and Alliance system fully functional.
-Cash:
+Cash & Items:
* EXP/DROP/Cosmetic Coupons 100%.
* EXP/DROP coupons now appears as a buff effect when on active time.
* Great deal of cash items functional.
+* New scroll: antibanish. Used only in cases where bosses send a player back to town.
PQ potentials:
* Lobby system - Multiple PQ instances on same channel.
diff --git a/mychanges_ptbr.txt b/docs/mychanges_ptbr.txt
similarity index 98%
rename from mychanges_ptbr.txt
rename to docs/mychanges_ptbr.txt
index eeb0904e4f..ca21bd266d 100644
--- a/mychanges_ptbr.txt
+++ b/docs/mychanges_ptbr.txt
@@ -427,4 +427,10 @@ Consertado quests n
03 Agosto 2017,
Quests agora retiram itens antes de entregar recompensas.
-Após a primeira inicialização, PQs inicializarão mais rápido, uma vez que há um sistema preparador de EIMs ativo.
\ No newline at end of file
+Após a primeira inicialização, PQs inicializarão mais rápido, uma vez que há um sistema preparador de EIMs ativo.
+
+04 - 05 Agosto 2017,
+Novo scroll: antibanish. Retorna ao local de onde foi banido pela ultima vez.
+Resolvido alguns problemas de concorrência com MapleMapFactory.
+Removidos drops inexistentes da DB.
+Resolvido problema com GMs de level alto recebendo bloqueio MWLB.
\ No newline at end of file
diff --git a/todo.txt b/docs/todo.txt
similarity index 100%
rename from todo.txt
rename to docs/todo.txt
diff --git a/handbook/Use.txt b/handbook/Use.txt
index e3176ce1b4..714aa06303 100644
--- a/handbook/Use.txt
+++ b/handbook/Use.txt
@@ -1,4 +1,4 @@
-2000000 - Red Potion - A potion made out of red herbs.\nRecovers 50 HP.
+2000000 - Red Potion - A potion made out of red herbs.\nRecovers 50 HP.
2000001 - Orange Potion - A concentrated potion made out of red herbs.\nRecovers 150 HP.
2000002 - White Potion - A highly-concentrated potion made out of red herbs.\nRecovers 300 HP.
2000003 - Blue Potion - A potion made out of blue herbs.\nRecovers 100 MP.
@@ -381,6 +381,7 @@
2030016 - Phyllia's Warp Powder - Warp powder made by fairy Phyllia. Teleports you to Magatia when used inside the Nihal desert region.
2030019 - Nautilus Return Scroll - This scroll enables you to return to the Pirate village, Nautilus. This is a one use item and will disappear after use.
2030020 - Return to New Leaf City Scroll - Use this scroll to venture back to New Leaf City whenever you want!
+2030100 - Return Scroll - Banished Area - Returns you to the map where you were last banished. Requires immediate use and not have changed maps.
2031000 - Masked Man's Invitation - An invitation from the Masked Man to the Halloween Party at the Haunted Mansion. Double-click to move straight to the mansion.
2031001 - Studio Invitation - An invitation to the studio for the event "For Guild Only".
2040000 - Scroll for Helmet for DEF - Improves the helmet's weapon def.\nSuccess rate:100%, weapon def. +1
diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml
index 6f49190395..6d3dbbc18f 100644
--- a/nbproject/private/private.xml
+++ b/nbproject/private/private.xml
@@ -3,16 +3,15 @@
- file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/maps/MapleMapFactory.java
- file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/scripting/event/EventScriptManager.java
+ file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/TimerManager.java
file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/client/command/Commands.java
- file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/scripting/event/EventInstanceManager.java
+ file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/maps/MapMonitor.java
+ file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/server/maps/MapleMapItem.java
file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/constants/ServerConstants.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/net/server/RankingWorker.java
- file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/scripting/event/EventManager.java
+ file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/handlers/AbstractDealDamageHandler.java
file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/net/server/channel/Channel.java
- file:/C:/Nexon/MapleSolaxia/MapleSolaxiaV2/src/scripting/reactor/ReactorActionManager.java
diff --git a/scripts/event/HorntailPQ.js b/scripts/event/HorntailPQ.js
index b9db133635..3300ceb620 100644
--- a/scripts/event/HorntailPQ.js
+++ b/scripts/event/HorntailPQ.js
@@ -7,7 +7,7 @@ var isPq = true;
var minPlayers = 6, maxPlayers = 6;
var minLevel = 120, maxLevel = 255;
var entryMap = 240050100;
-var exitMap = 240050500;
+var exitMap = 240050000;
var recruitMap = 240050000;
var clearMap = 240050400;
diff --git a/sql/db_database.sql b/sql/db_database.sql
index 2c08aad984..3bd4345473 100644
--- a/sql/db_database.sql
+++ b/sql/db_database.sql
@@ -1,4 +1,4 @@
-#YOU MUST EXECUTE NEXT SQL: 'db_drops.sql'
+#EXECUTE THIS FIRST, THEN NEXT SQL: 'db_drops.sql'
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
@@ -21180,8 +21180,8 @@ INSERT INTO `shopitems` ( `shopid`, `itemid`, `price`, `position`) VALUES
( 57, 3992038, 500, 115),
-- missing CBD shop data
-(9270027, 2022213, 6800, 0, 104),
-(9270027, 2022212, 3200, 0, 108);
+(9270027, 2022213, 6800, 104),
+(9270027, 2022212, 3200, 108);
CREATE TABLE IF NOT EXISTS `skillmacros` (
`id` int(11) NOT NULL AUTO_INCREMENT,
diff --git a/sql/db_drops.sql b/sql/db_drops.sql
index 4355a482cb..1cfedf0dc8 100644
--- a/sql/db_drops.sql
+++ b/sql/db_drops.sql
@@ -1,4 +1,7 @@
- #THIS SQL MUST BE USED AFTER 'db_database.sql'
+#THIS SQL MUST BE USED AFTER 'db_database.sql'
+#NEXT SQL 'db_shopupdate.sql' IS OPTIONAL
+
+USE `maplesolaxia`;
INSERT IGNORE INTO temp_data (`dropperid`, `itemid`, `minimum_quantity`, `maximum_quantity`, `questid`, `chance`) VALUES
#-- copy+paste inside here as many drop data as possible from the spider (drop generator) files --
@@ -20050,4 +20053,49 @@
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
- INSERT INTO `monstercarddata` (`cardid`, `mobid`) (SELECT itemid, min(dropperid) FROM drop_data where itemid>=2380000 and itemid<2390000 group by itemid);
\ No newline at end of file
+ INSERT INTO `monstercarddata` (`cardid`, `mobid`) (SELECT itemid, min(dropperid) FROM drop_data where itemid>=2380000 and itemid<2390000 group by itemid);
+
+ # delete all unused content on drop data
+ DELETE FROM `drop_data` WHERE itemid=400000;
+ DELETE FROM `drop_data` WHERE itemid=400001;
+ DELETE FROM `drop_data` WHERE itemid=400002;
+ DELETE FROM `drop_data` WHERE itemid=400003;
+ DELETE FROM `drop_data` WHERE itemid=400004;
+ DELETE FROM `drop_data` WHERE itemid=400005;
+ DELETE FROM `drop_data` WHERE itemid=400006;
+ DELETE FROM `drop_data` WHERE itemid=400009;
+ DELETE FROM `drop_data` WHERE itemid=400010;
+ DELETE FROM `drop_data` WHERE itemid=400011;
+ DELETE FROM `drop_data` WHERE itemid=401000;
+ DELETE FROM `drop_data` WHERE itemid=404000;
+ DELETE FROM `drop_data` WHERE itemid=1002926;
+ DELETE FROM `drop_data` WHERE itemid=1002927;
+ DELETE FROM `drop_data` WHERE itemid=1027090;
+ DELETE FROM `drop_data` WHERE itemid=1302096;
+ DELETE FROM `drop_data` WHERE itemid=2002205;
+ DELETE FROM `drop_data` WHERE itemid=2040033;
+ DELETE FROM `drop_data` WHERE itemid=2040536;
+ DELETE FROM `drop_data` WHERE itemid=2040827;
+ DELETE FROM `drop_data` WHERE itemid=2040913;
+ DELETE FROM `drop_data` WHERE itemid=2040935;
+ DELETE FROM `drop_data` WHERE itemid=2043109;
+ DELETE FROM `drop_data` WHERE itemid=2043309;
+ DELETE FROM `drop_data` WHERE itemid=2043709;
+ DELETE FROM `drop_data` WHERE itemid=2044009;
+ DELETE FROM `drop_data` WHERE itemid=2044209;
+ DELETE FROM `drop_data` WHERE itemid=2044309;
+ DELETE FROM `drop_data` WHERE itemid=2044609;
+ DELETE FROM `drop_data` WHERE itemid=2049212;
+ DELETE FROM `drop_data` WHERE itemid=2049214;
+ DELETE FROM `drop_data` WHERE itemid=4000306;
+ DELETE FROM `drop_data` WHERE itemid=4000343;
+ DELETE FROM `drop_data` WHERE itemid=4000420;
+ DELETE FROM `drop_data` WHERE itemid=4000429;
+ DELETE FROM `drop_data` WHERE itemid=4000430;
+ DELETE FROM `drop_data` WHERE itemid=4000431;
+ DELETE FROM `drop_data` WHERE itemid=4000432;
+ DELETE FROM `drop_data` WHERE itemid=4000433;
+ DELETE FROM `drop_data` WHERE itemid=4000434;
+ DELETE FROM `drop_data` WHERE itemid=4000435;
+ DELETE FROM `drop_data` WHERE itemid=4032192;
+ DELETE FROM `drop_data` WHERE itemid=8143000;
\ No newline at end of file
diff --git a/sql/db_shopupdate.sql b/sql/db_shopupdate.sql
index 081779f836..83f9cde4a5 100644
--- a/sql/db_shopupdate.sql
+++ b/sql/db_shopupdate.sql
@@ -1,4 +1,9 @@
-UPDATE shopitems SET itemid=1812005, price=1000 WHERE shopitemid=18;
+#THIS SQL IS OPTIONAL, TO BE USED AFTER 'db_drops.sql'
+#THIS REQUIRES PROVIDED WZ FILES
+
+USE `maplesolaxia`;
+
+UPDATE shopitems SET itemid=1812005, price=1000 WHERE shopitemid=18;
UPDATE shopitems SET itemid=1812004, price=1000 WHERE shopitemid=19;
UPDATE shopitems SET itemid=2120000, price=100 WHERE shopitemid=20;
UPDATE shopitems SET itemid=1812000, price=1000 WHERE shopitemid=21;
@@ -102,3 +107,33 @@ INSERT IGNORE INTO `shopitems` (`shopid`, `itemid`, `price`, `pitch`, `position`
(9110002, 3010008, 1000000, 0, 92),
(9110002, 3010007, 1000000, 0, 96),
(9110002, 3011000, 4200000, 0, 100);
+
+# adding antibanish scrolls
+INSERT IGNORE INTO `shopitems` (`shopid`, `itemid`, `price`, `pitch`, `position`) VALUES
+(1001100, 2030100, 450, 0, 130),
+(1011100, 2030100, 450, 0, 142),
+(1021100, 2030100, 450, 0, 142),
+(1031100, 2030100, 450, 0, 146),
+(1051002, 2030100, 450, 0, 142),
+(1061001, 2030100, 450, 0, 126),
+(1061002, 2030100, 450, 0, 130),
+(1091002, 2030100, 450, 0, 130),
+(1100002, 2030100, 450, 0, 138),
+(2012005, 2030100, 450, 0, 126),
+(2022001, 2030100, 450, 0, 126),
+(2030009, 2030100, 450, 0, 126),
+(2040051, 2030100, 450, 0, 102),
+(2041006, 2030100, 450, 0, 134),
+(2051000, 2030100, 450, 0, 134),
+(2060004, 2030100, 450, 0, 134),
+(2070001, 2030100, 450, 0, 134),
+(2080001, 2030100, 450, 0, 134),
+(2090003, 2030100, 450, 0, 126),
+(2093002, 2030100, 450, 0, 126),
+(2100004, 2030100, 450, 0, 130),
+(2110001, 2030100, 450, 0, 130),
+(2130000, 2030100, 450, 0, 126),
+(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
diff --git a/sql/readme.txt b/sql/readme.txt
index 4296c9324b..0500e8c7d2 100644
--- a/sql/readme.txt
+++ b/sql/readme.txt
@@ -3,4 +3,4 @@
These SQL files must be executed IN ORDER to set up the database:
- db_database.sql
- db_drops.sql
- - db_shopupdate.sql (optional)
\ No newline at end of file
+ - db_shopupdate.sql (optional & require provided WZs)
\ No newline at end of file
diff --git a/src/client/MapleCharacter.java b/src/client/MapleCharacter.java
index c233f8fef7..bfc470f7d0 100644
--- a/src/client/MapleCharacter.java
+++ b/src/client/MapleCharacter.java
@@ -294,6 +294,9 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
private short extraRecInterval;
private int targetHpBarHash = 0;
private long targetHpBarTime = 0;
+ private int banishMap = -1;
+ private int banishSp = -1;
+ private long banishTime = 0;
private MapleCharacter() {
useCS = false;
@@ -1192,10 +1195,42 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
if (getEventInstance() != null) getEventInstance().changedMap(this, map);
}
+ public boolean canRecoverLastBanish() {
+ return System.currentTimeMillis() - this.banishTime < 5 * 60 * 1000;
+ }
+
+ public Pair getLastBanishData() {
+ return new Pair<>(this.banishMap, this.banishSp);
+ }
+
+ private void clearBanishPlayerData() {
+ this.banishMap = -1;
+ this.banishSp = -1;
+ this.banishTime = 0;
+ }
+
+ private void setBanishPlayerData(int banishMap, int banishSp, long banishTime) {
+ this.banishMap = banishMap;
+ this.banishSp = banishSp;
+ this.banishTime = banishTime;
+ }
+
public void changeMapBanish(int mapid, String portal, String msg) {
+ if(ServerConstants.USE_SPIKES_AVOID_BANISH) {
+ for(Item it: this.getInventory(MapleInventoryType.EQUIPPED).list()) {
+ if((it.getFlag() & ItemConstants.SPIKES) == ItemConstants.SPIKES) return;
+ }
+ }
+
+ int banMap = this.getMapId();
+ int banSp = this.getMap().findClosestPlayerSpawnpoint(this.getPosition()).getId();
+ long banTime = System.currentTimeMillis();
+
dropMessage(5, msg);
MapleMap map_ = client.getChannelServer().getMapFactory().getMap(mapid);
changeMap(map_, map_.getPortal(portal));
+
+ setBanishPlayerData(banMap, banSp, banTime);
}
public void changeMap(int map) {
@@ -1298,6 +1333,7 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
private void changeMapInternal(final MapleMap to, final Point pos, final byte[] warpPacket) {
if(!canWarpMap) return;
+ this.clearBanishPlayerData();
this.closePlayerInteractions();
this.resetPlayerAggro();
@@ -1468,19 +1504,13 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
if (!mapitem.isPlayerDrop() || mapitem.getDropper().getObjectId() == client.getPlayer().getObjectId()) {
if(mapitem.getMeso() > 0) {
this.gainMeso(mapitem.getMeso(), true, true, false);
- this.getMap().broadcastMessage(pickupPacket, mapitem.getPosition());
- this.getMap().removeMapObject(ob);
- mapitem.setPickedUp(true);
+ 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);
- this.getMap().broadcastMessage(pickupPacket, mapitem.getPosition());
- this.getMap().removeMapObject(ob);
- mapitem.setPickedUp(true);
+ this.getMap().pickItemDrop(pickupPacket, mapitem);
} else if (MapleInventoryManipulator.addFromDrop(client, mapitem.getItem(), true)) {
- this.getMap().broadcastMessage(pickupPacket, mapitem.getPosition());
- this.getMap().removeMapObject(ob);
- mapitem.setPickedUp(true);
+ this.getMap().pickItemDrop(pickupPacket, mapitem);
} else {
client.announce(MaplePacketCreator.enableActions());
return;
@@ -1558,9 +1588,8 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
client.announce(MaplePacketCreator.enableActions());
return;
}
- mapitem.setPickedUp(true);
- this.getMap().broadcastMessage(pickupPacket, mapitem.getPosition());
- this.getMap().removeMapObject(ob);
+
+ this.getMap().pickItemDrop(pickupPacket, mapitem);
}
} else if(!hasSpaceInventory) {
client.announce(MaplePacketCreator.getInventoryFull());
@@ -5473,13 +5502,13 @@ public class MapleCharacter extends AbstractAnimatedMapleMapObject {
}
psf.close();
ps = con.prepareStatement("UPDATE accounts SET gm = ? WHERE id = ?");
- ps.setInt(1, gmLevel);
+ ps.setInt(1, gmLevel > 1 ? 1 : 0);
ps.setInt(2, client.getAccID());
ps.executeUpdate();
ps.close();
con.commit();
- con.setAutoCommit(true);
+ con.setAutoCommit(true);
if (cashshop != null) {
cashshop.save(con);
diff --git a/src/client/command/Commands.java b/src/client/command/Commands.java
index 097df28cb1..4ffc0b0cfc 100644
--- a/src/client/command/Commands.java
+++ b/src/client/command/Commands.java
@@ -1961,9 +1961,8 @@ public class Commands {
} else {
MapleInventoryManipulator.addFromDrop(c, mapItem.getItem(), true);
}
- mapItem.setPickedUp(true);
- player.getMap().removeMapObject(item);
- player.getMap().broadcastMessage(MaplePacketCreator.removeItemFromMap(mapItem.getObjectId(), 2, player.getId()), mapItem.getPosition());
+
+ player.getMap().pickItemDrop(MaplePacketCreator.removeItemFromMap(mapItem.getObjectId(), 2, player.getId()), mapItem);
}
break;
diff --git a/src/constants/ServerConstants.java b/src/constants/ServerConstants.java
index 11e17b7ca2..b56a45443f 100644
--- a/src/constants/ServerConstants.java
+++ b/src/constants/ServerConstants.java
@@ -31,7 +31,7 @@ public class ServerConstants {
public static boolean SHUTDOWNHOOK;
//Gameplay Configuration
- public static final boolean USE_CUSTOM_KEYSET = true;
+ public static final boolean USE_CUSTOM_KEYSET = true; //Enables auto-setup of the MapleSolaxiaV2's custom keybindings when creating characters.
public static final boolean USE_MAXRANGE_ECHO_OF_HERO = true;
public static final boolean USE_MAXRANGE = true; //Will send and receive packets from all events of a map, rather than those of only view range.
public static final boolean USE_DEBUG = false; //Will enable some text prints on the client, oriented for debugging purposes.
@@ -56,7 +56,10 @@ public class ServerConstants {
public static final long BLOCK_NPC_RACE_CONDT = (long)(0.5 * 1000); //Time the player client must wait before reopening a conversation with an NPC.
public static final long PET_LOOT_UPON_ATTACK = (long)(0.7 * 1000); //Time the pet must wait before trying to pick items up.
- public static final int ITEM_EXPIRE_TIME = 3 * 60 * 1000; //Time before items start disappearing. Recommended to be set up to 3 minutes.
+ //Dangling Items Configuration
+ public static final int ITEM_EXPIRE_TIME = 3 * 60 * 1000; //Time before items start disappearing. Recommended to be set up to 3 minutes.
+ public static final int ITEM_MONITOR_TIME = 5 * 60 * 1000; //Interval between item monitoring task on maps, which checks for dangling item objects on the map item history.
+ public static final int ITEM_LIMIT_ON_MAP = 777; //Max number of items allowed on a map.
//Some Gameplay Enhancing Configuration
public static final boolean USE_PERFECT_SCROLLING = true; //Scrolls doesn't use slots upon failure.
@@ -70,6 +73,7 @@ public class ServerConstants {
public static final boolean USE_STACK_COUPON_RATES = true; //Multiple coupons effects builds up together.
public static final boolean USE_EQUIPMNT_LVLUP_SLOTS = true;//Equips can upgrade slots at level up.
public static final boolean USE_EQUIPMNT_LVLUP_POWER = true;//Enable more powerful stats upgrades at equip level up.
+ public static final boolean USE_SPIKES_AVOID_BANISH = true; //Shoes equipped with spikes blocks mobs from banishing wearer.
public static final boolean USE_CHAIR_EXTRAHEAL = true; //Enable map chairs to futher recover player`s HP and MP.
public static final int MAX_EQUIPMNT_LVLUP_STAT_GAIN = 10000; //Max stat upgrade an equipment can have on a levelup.
public static final int MAX_EQUIPMNT_STAT = 32767; //Max stat on an equipment by leveling up.
diff --git a/src/net/server/Server.java b/src/net/server/Server.java
index b3ac9633d2..edded76abf 100644
--- a/src/net/server/Server.java
+++ b/src/net/server/Server.java
@@ -278,7 +278,7 @@ public class Server implements Runnable {
System.out.println("Skills loaded in " + ((System.currentTimeMillis() - timeToTake) / 1000.0) + " seconds");
timeToTake = System.currentTimeMillis();
- MapleItemInformationProvider.getInstance().getAllItems();
+ //MapleItemInformationProvider.getInstance().getAllItems(); //unused, rofl
CashItemFactory.getSpecialCashItems();
System.out.println("Items loaded in " + ((System.currentTimeMillis() - timeToTake) / 1000.0) + " seconds");
diff --git a/src/net/server/channel/handlers/AbstractDealDamageHandler.java b/src/net/server/channel/handlers/AbstractDealDamageHandler.java
index d79aaac837..2c8728b6ed 100644
--- a/src/net/server/channel/handlers/AbstractDealDamageHandler.java
+++ b/src/net/server/channel/handlers/AbstractDealDamageHandler.java
@@ -216,9 +216,7 @@ public abstract class AbstractDealDamageHandler extends AbstractMaplePacketHandl
TimerManager.getInstance().schedule(new Runnable() {
@Override
public void run() {
- map.removeMapObject(mapitem);
- map.broadcastMessage(MaplePacketCreator.removeItemFromMap(mapitem.getObjectId(), 4, 0), mapitem.getPosition());
- mapitem.setPickedUp(true);
+ map.pickItemDrop(MaplePacketCreator.removeItemFromMap(mapitem.getObjectId(), 4, 0), mapitem);
}
}, delay);
delay += 100;
diff --git a/src/net/server/channel/handlers/KeymapChangeHandler.java b/src/net/server/channel/handlers/KeymapChangeHandler.java
index 70f17a67ad..6a36491e02 100644
--- a/src/net/server/channel/handlers/KeymapChangeHandler.java
+++ b/src/net/server/channel/handlers/KeymapChangeHandler.java
@@ -45,14 +45,16 @@ public final class KeymapChangeHandler extends AbstractMaplePacketHandler {
int action = slea.readInt();
Skill skill = SkillFactory.getSkill(action);
- boolean isBanndedSkill = false;
+ boolean isBanndedSkill;
if (skill != null) {
isBanndedSkill = GameConstants.bannedBindSkills(skill.getId());
if (isBanndedSkill || (!c.getPlayer().isGM() && GameConstants.isGMSkills(skill.getId())) || (!GameConstants.isInJobTree(skill.getId(), c.getPlayer().getJob().getId()) && !c.getPlayer().isGM())) { //for those skills are are "technically" in the beginner tab, like bamboo rain in Dojo or skills you find in PYPQ
- AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit keymapping.");
- FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to use skill " + skill.getId() + "\r\n");
- c.disconnect(true, false);
- return;
+ //AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit keymapping.");
+ //FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to use skill " + skill.getId() + "\r\n");
+ //c.disconnect(true, false);
+ //return;
+
+ continue; // fk that
}
/* if (c.getPlayer().getSkillLevel(skill) < 1) { HOW WOULD A SKILL EVEN BE AVAILABLE TO KEYBINDING
continue; IF THERE IS NOT EVEN A SINGLE POINT USED INTO IT??
diff --git a/src/net/server/channel/handlers/MoveLifeHandler.java b/src/net/server/channel/handlers/MoveLifeHandler.java
index bfaad89a3f..e608251057 100644
--- a/src/net/server/channel/handlers/MoveLifeHandler.java
+++ b/src/net/server/channel/handlers/MoveLifeHandler.java
@@ -21,8 +21,10 @@
*/
package net.server.channel.handlers;
+import client.MapleCharacter;
import client.MapleClient;
import java.awt.Point;
+import java.util.ArrayList;
import java.util.List;
import server.life.MapleMonster;
import server.life.MobSkill;
@@ -38,6 +40,8 @@ import tools.data.input.SeekableLittleEndianAccessor;
public final class MoveLifeHandler extends AbstractMovementPacketHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
+ List banishPlayers = new ArrayList<>();
+
int objectid = slea.readInt();
short moveid = slea.readShort();
MapleMapObject mmo = c.getPlayer().getMap().getMapObject(objectid);
@@ -66,7 +70,7 @@ public final class MoveLifeHandler extends AbstractMovementPacketHandler {
if ((skill_1 >= 100 && skill_1 <= 200) && monster.hasSkill(skill_1, skill_2)) {
MobSkill skillData = MobSkillFactory.getMobSkill(skill_1, skill_2);
if (skillData != null && monster.canUseSkill(skillData)) {
- skillData.applyEffect(c.getPlayer(), monster, true);
+ skillData.applyEffect(c.getPlayer(), monster, true, banishPlayers);
}
}
slea.readByte();
@@ -99,5 +103,9 @@ public final class MoveLifeHandler extends AbstractMovementPacketHandler {
updatePosition(res, monster, -1);
c.getPlayer().getMap().moveMonster(monster, monster.getPosition());
}
+
+ for (MapleCharacter chr : banishPlayers) {
+ chr.changeMapBanish(monster.getBanish().getMap(), monster.getBanish().getPortal(), monster.getBanish().getMsg());
+ }
}
}
diff --git a/src/net/server/channel/handlers/TakeDamageHandler.java b/src/net/server/channel/handlers/TakeDamageHandler.java
index 5af0077034..33049d7141 100644
--- a/src/net/server/channel/handlers/TakeDamageHandler.java
+++ b/src/net/server/channel/handlers/TakeDamageHandler.java
@@ -36,6 +36,7 @@ import constants.skills.Corsair;
import java.awt.Point;
import java.util.Collections;
+import java.util.ArrayList;
import java.util.List;
import net.AbstractMaplePacketHandler;
@@ -58,6 +59,8 @@ public final class TakeDamageHandler extends AbstractMaplePacketHandler {
@Override
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
+ List banishPlayers = new ArrayList<>();
+
MapleCharacter player = c.getPlayer();
slea.readInt();
byte damagefrom = slea.readByte();
@@ -125,28 +128,27 @@ public final class TakeDamageHandler extends AbstractMaplePacketHandler {
mpattack += attackInfo.getMpBurn();
MobSkill skill = MobSkillFactory.getMobSkill(attackInfo.getDiseaseSkill(), attackInfo.getDiseaseLevel());
if (skill != null && damage > 0) {
- skill.applyEffect(player, attacker, false);
- }
- if (attacker != null) {
- attacker.setMp(attacker.getMp() - attackInfo.getMpCon());
- if (player.getBuffedValue(MapleBuffStat.MANA_REFLECTION) != null && damage > 0 && !attacker.isBoss()) {
- int jobid = player.getJob().getId();
- if (jobid == 212 || jobid == 222 || jobid == 232) {
- int id = jobid * 10000 + 1002;
- Skill manaReflectSkill = SkillFactory.getSkill(id);
- if (player.isBuffFrom(MapleBuffStat.MANA_REFLECTION, manaReflectSkill) && player.getSkillLevel(manaReflectSkill) > 0 && manaReflectSkill.getEffect(player.getSkillLevel(manaReflectSkill)).makeChanceResult()) {
- int bouncedamage = (damage * manaReflectSkill.getEffect(player.getSkillLevel(manaReflectSkill)).getX() / 100);
- if (bouncedamage > attacker.getMaxHp() / 5) {
- bouncedamage = attacker.getMaxHp() / 5;
- }
- map.damageMonster(player, attacker, bouncedamage);
- map.broadcastMessage(player, MaplePacketCreator.damageMonster(oid, bouncedamage), true);
- player.getClient().announce(MaplePacketCreator.showOwnBuffEffect(id, 5));
- map.broadcastMessage(player, MaplePacketCreator.showBuffeffect(player.getId(), id, 5), false);
- }
- }
- }
+ skill.applyEffect(player, attacker, false, banishPlayers);
}
+
+ attacker.setMp(attacker.getMp() - attackInfo.getMpCon());
+ if (player.getBuffedValue(MapleBuffStat.MANA_REFLECTION) != null && damage > 0 && !attacker.isBoss()) {
+ int jobid = player.getJob().getId();
+ if (jobid == 212 || jobid == 222 || jobid == 232) {
+ int id = jobid * 10000 + 1002;
+ Skill manaReflectSkill = SkillFactory.getSkill(id);
+ if (player.isBuffFrom(MapleBuffStat.MANA_REFLECTION, manaReflectSkill) && player.getSkillLevel(manaReflectSkill) > 0 && manaReflectSkill.getEffect(player.getSkillLevel(manaReflectSkill)).makeChanceResult()) {
+ int bouncedamage = (damage * manaReflectSkill.getEffect(player.getSkillLevel(manaReflectSkill)).getX() / 100);
+ if (bouncedamage > attacker.getMaxHp() / 5) {
+ bouncedamage = attacker.getMaxHp() / 5;
+ }
+ map.damageMonster(player, attacker, bouncedamage);
+ map.broadcastMessage(player, MaplePacketCreator.damageMonster(oid, bouncedamage), true);
+ player.getClient().announce(MaplePacketCreator.showOwnBuffEffect(id, 5));
+ map.broadcastMessage(player, MaplePacketCreator.showBuffeffect(player.getId(), id, 5), false);
+ }
+ }
+ }
}
}
if (damage == -1) {
@@ -234,5 +236,9 @@ public final class TakeDamageHandler extends AbstractMaplePacketHandler {
player.setDojoEnergy(player.isGM() ? 300 : player.getDojoEnergy() < 300 ? player.getDojoEnergy() + 1 : 0); //Fking gm's
player.getClient().announce(MaplePacketCreator.getEnergy("energy", player.getDojoEnergy()));
}
+
+ for (MapleCharacter chr : banishPlayers) { // chill, if this list ever gets non-empty an attacker does exist, trust me :)
+ chr.changeMapBanish(attacker.getBanish().getMap(), attacker.getBanish().getPortal(), attacker.getBanish().getMsg());
+ }
}
}
diff --git a/src/net/server/channel/handlers/UseItemHandler.java b/src/net/server/channel/handlers/UseItemHandler.java
index 3716d55cb0..d6b18271ab 100644
--- a/src/net/server/channel/handlers/UseItemHandler.java
+++ b/src/net/server/channel/handlers/UseItemHandler.java
@@ -66,12 +66,21 @@ public final class UseItemHandler extends AbstractMaplePacketHandler {
remove(c, slot);
return;
}
- if (isTownScroll(itemId)) {
+ else if (isTownScroll(itemId)) {
if (ii.getItemEffect(toUse.getItemId()).applyTo(c.getPlayer())) {
remove(c, slot);
}
return;
}
+ else if (isAntibanishScroll(itemId)) {
+ if (ii.getItemEffect(toUse.getItemId()).applyTo(c.getPlayer())) {
+ remove(c, slot);
+ } else {
+ c.getPlayer().dropMessage(5, "You cannot recover from a banish state at the moment.");
+ }
+ return;
+ }
+
remove(c, slot);
ii.getItemEffect(toUse.getItemId()).applyTo(c.getPlayer());
@@ -84,7 +93,11 @@ public final class UseItemHandler extends AbstractMaplePacketHandler {
c.announce(MaplePacketCreator.enableActions());
}
- private boolean isTownScroll(int itemId) {
+ private static boolean isTownScroll(int itemId) {
return itemId >= 2030000 && itemId < 2030021;
}
+
+ private static boolean isAntibanishScroll(int itemId) {
+ return itemId == 2030100;
+ }
}
diff --git a/src/server/MapleStatEffect.java b/src/server/MapleStatEffect.java
index aa81e95223..b0f75e03eb 100644
--- a/src/server/MapleStatEffect.java
+++ b/src/server/MapleStatEffect.java
@@ -796,16 +796,30 @@ public class MapleStatEffect {
if (moveTo != -1) {
if (moveTo != applyto.getMapId()) {
MapleMap target;
+ MaplePortal pt;
+
if (moveTo == 999999999) {
- target = applyto.getMap().getReturnMap();
+ if(sourceid != 2030100) {
+ target = applyto.getMap().getReturnMap();
+ pt = target.getRandomPlayerSpawnpoint();
+ } else {
+ if(!applyto.canRecoverLastBanish()) return false;
+
+ Pair lastBanishInfo = applyto.getLastBanishData();
+ target = applyto.getWarpMap(lastBanishInfo.getLeft());
+ pt = target.getPortal(lastBanishInfo.getRight());
+ }
} else {
target = applyto.getClient().getWorldServer().getChannel(applyto.getClient().getChannel()).getMapFactory().getMap(moveTo);
int targetid = target.getId() / 10000000;
if (targetid != 60 && applyto.getMapId() / 10000000 != 61 && targetid != applyto.getMapId() / 10000000 && targetid != 21 && targetid != 20 && targetid != 12 && (applyto.getMapId() / 10000000 != 10 && applyto.getMapId() / 10000000 != 12)) {
return false;
}
+
+ pt = target.getRandomPlayerSpawnpoint();
}
- applyto.changeMap(target, target.getRandomPlayerSpawnpoint());
+
+ applyto.changeMap(target, pt);
} else {
return false;
}
diff --git a/src/server/life/MobSkill.java b/src/server/life/MobSkill.java
index 30174112c5..80159c4c02 100644
--- a/src/server/life/MobSkill.java
+++ b/src/server/life/MobSkill.java
@@ -102,7 +102,7 @@ public class MobSkill {
this.limit = limit;
}
- public void applyEffect(MapleCharacter player, MapleMonster monster, boolean skill) {
+ public void applyEffect(MapleCharacter player, MapleMonster monster, boolean skill, List banishPlayers) {
MapleDisease disease = null;
Map stats = new ArrayMap();
List reflection = new LinkedList();
@@ -174,10 +174,10 @@ public class MobSkill {
case 129: // Banish
if (lt != null && rb != null && skill) {
for (MapleCharacter chr : getPlayersInRange(monster, player)) {
- chr.changeMapBanish(monster.getBanish().getMap(), monster.getBanish().getPortal(), monster.getBanish().getMsg());
+ banishPlayers.add(chr);
}
} else {
- player.changeMapBanish(monster.getBanish().getMap(), monster.getBanish().getPortal(), monster.getBanish().getMsg());
+ banishPlayers.add(player);
}
break;
case 131: // Mist
diff --git a/src/server/maps/MapleMap.java b/src/server/maps/MapleMap.java
index f45d3fa214..caec79423a 100644
--- a/src/server/maps/MapleMap.java
+++ b/src/server/maps/MapleMap.java
@@ -54,6 +54,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
+import java.lang.ref.WeakReference;
import net.server.Server;
import net.server.channel.Channel;
import scripting.map.MapScriptManager;
@@ -90,10 +91,12 @@ public class MapleMap {
private Collection monsterSpawn = Collections.synchronizedList(new LinkedList());
private Collection allMonsterSpawn = Collections.synchronizedList(new LinkedList());
private AtomicInteger spawnedMonstersOnMap = new AtomicInteger(0);
+ private AtomicInteger droppedItemCount = new AtomicInteger(0);
private Collection characters = new LinkedHashSet<>();
private Map portals = new HashMap<>();
private Map backgroundTypes = new HashMap<>();
private Map environment = new LinkedHashMap<>();
+ private LinkedList> registeredDrops = new LinkedList<>();
private List areas = new ArrayList<>();
private MapleFootholdTree footholds = null;
private int mapid;
@@ -123,6 +126,8 @@ public class MapleMap {
private int fieldLimit = 0;
private int mobCapacity = -1;
private ScheduledFuture> mapMonitor = null;
+ private ScheduledFuture> itemMonitor = null;
+ private short itemMonitorTimeout;
private Pair timeMob = null;
private short mobInterval = 5000;
private boolean allowSummons = true; // All maps should have this true at the beginning
@@ -556,6 +561,98 @@ public class MapleMap {
}
}
+ private void stopItemMonitor() {
+ chrWLock.lock();
+ try {
+ itemMonitor.cancel(false);
+ itemMonitor = null;
+ } finally {
+ chrWLock.unlock();
+ }
+ }
+
+ private void cleanItemMonitor() {
+ objectWLock.lock();
+ try {
+ registeredDrops.removeAll(Collections.singleton(null));
+ } finally {
+ objectWLock.unlock();
+ }
+ }
+
+ private void startItemMonitor() {
+ chrWLock.lock();
+ try {
+ itemMonitor = TimerManager.getInstance().register(new Runnable() {
+ @Override
+ public void run() {
+ if (getCharacters().isEmpty()) {
+ if(itemMonitorTimeout == 0) {
+ stopItemMonitor();
+ return;
+ } else {
+ itemMonitorTimeout--;
+ }
+ } else {
+ itemMonitorTimeout = 1;
+ }
+
+ if(!registeredDrops.isEmpty()) cleanItemMonitor();
+ }
+ }, ServerConstants.ITEM_MONITOR_TIME, ServerConstants.ITEM_MONITOR_TIME);
+
+ itemMonitorTimeout = 1;
+ } finally {
+ chrWLock.unlock();
+ }
+ }
+
+ private boolean hasItemMonitor() {
+ chrRLock.lock();
+ try {
+ return itemMonitor != null;
+ } finally {
+ chrRLock.unlock();
+ }
+ }
+
+ private void registerItemDrop(MapleMapItem mdrop) {
+ if(droppedItemCount.get() >= ServerConstants.ITEM_LIMIT_ON_MAP) {
+ MapleMapObject mapobj;
+
+ objectWLock.lock();
+ try {
+ mapobj = registeredDrops.remove(0).get();
+ while(mapobj == null) {
+ mapobj = registeredDrops.remove(0).get();
+ }
+ } finally {
+ objectWLock.unlock();
+ }
+
+ makeDisappearItemFromMap(mapobj);
+ }
+
+ if(!everlast) TimerManager.getInstance().schedule(new ExpireMapItemJob(mdrop), ServerConstants.ITEM_EXPIRE_TIME);
+
+ objectWLock.lock();
+ try {
+ registeredDrops.add(new WeakReference<>((MapleMapObject) mdrop));
+ } finally {
+ objectWLock.unlock();
+ }
+
+ droppedItemCount.incrementAndGet();
+ }
+
+ public void pickItemDrop(byte[] pickupPacket, MapleMapItem mdrop) {
+ broadcastMessage(pickupPacket, mdrop.getPosition());
+
+ this.removeMapObject(mdrop);
+ mdrop.setPickedUp(true);
+ droppedItemCount.decrementAndGet();
+ }
+
private void spawnDrop(final Item idrop, final Point dropPos, final MapleMonster mob, final MapleCharacter chr, final byte droptype, final short questid) {
final MapleMapItem mdrop = new MapleMapItem(idrop, dropPos, mob, chr, droptype, false, questid);
mdrop.setDropTime(System.currentTimeMillis());
@@ -568,7 +665,7 @@ public class MapleMap {
}
}, null);
- TimerManager.getInstance().schedule(new ExpireMapItemJob(mdrop), ServerConstants.ITEM_EXPIRE_TIME);
+ registerItemDrop(mdrop);
activateItemReactors(mdrop, chr.getClient());
}
@@ -584,7 +681,7 @@ public class MapleMap {
}
}, null);
- TimerManager.getInstance().schedule(new ExpireMapItemJob(mdrop), ServerConstants.ITEM_EXPIRE_TIME);
+ registerItemDrop(mdrop);
}
public final void disappearingItemDrop(final MapleMapObject dropper, final MapleCharacter owner, final Item item, final Point pos) {
@@ -1569,21 +1666,19 @@ public class MapleMap {
public final void spawnItemDrop(final MapleMapObject dropper, final MapleCharacter owner, final Item item, Point pos, final byte dropType, final boolean playerDrop) {
final Point droppos = calcDropPos(pos, pos);
- final MapleMapItem drop = new MapleMapItem(item, droppos, dropper, owner, dropType, playerDrop);
- drop.setDropTime(System.currentTimeMillis());
+ final MapleMapItem mdrop = new MapleMapItem(item, droppos, dropper, owner, dropType, playerDrop);
+ mdrop.setDropTime(System.currentTimeMillis());
- spawnAndAddRangedMapObject(drop, new DelayedPacketCreation() {
+ spawnAndAddRangedMapObject(mdrop, new DelayedPacketCreation() {
@Override
public void sendPackets(MapleClient c) {
- c.announce(MaplePacketCreator.dropItemFromMapObject(drop, dropper.getPosition(), droppos, (byte) 1));
+ c.announce(MaplePacketCreator.dropItemFromMapObject(mdrop, dropper.getPosition(), droppos, (byte) 1));
}
}, null);
- broadcastMessage(MaplePacketCreator.dropItemFromMapObject(drop, dropper.getPosition(), droppos, (byte) 0));
+ broadcastMessage(MaplePacketCreator.dropItemFromMapObject(mdrop, dropper.getPosition(), droppos, (byte) 0));
- if (!everlast) {
- TimerManager.getInstance().schedule(new ExpireMapItemJob(drop), ServerConstants.ITEM_EXPIRE_TIME);
- activateItemReactors(drop, owner.getClient());
- }
+ registerItemDrop(mdrop);
+ activateItemReactors(mdrop, owner.getClient());
}
public final void spawnItemDropList(List list, final MapleMapObject dropper, final MapleCharacter owner, Point pos) {
@@ -1677,8 +1772,12 @@ public class MapleMap {
chrWLock.unlock();
}
chr.setMapId(mapid);
- if (onFirstUserEnter.length() != 0 && !chr.hasEntered(onFirstUserEnter, mapid) && MapScriptManager.getInstance().scriptExists(onFirstUserEnter, true)) {
- if (countPlayers() <= 1) {
+
+ itemMonitorTimeout = 1;
+ if (getCharacters().size() <= 1) {
+ if(!hasItemMonitor()) startItemMonitor();
+
+ if (onFirstUserEnter.length() != 0 && !chr.hasEntered(onFirstUserEnter, mapid) && MapScriptManager.getInstance().scriptExists(onFirstUserEnter, true)) {
chr.enteredScript(onFirstUserEnter, mapid);
MapScriptManager.getInstance().getMapScript(chr.getClient(), onFirstUserEnter, true);
}
@@ -2289,10 +2388,11 @@ public class MapleMap {
public void movePlayer(MapleCharacter player, Point newPosition) {
player.setPosition(newPosition);
Collection visibleObjects = player.getVisibleMapObjects();
- MapleMapObject[] visibleObjectsNow = visibleObjects.toArray(new MapleMapObject[visibleObjects.size()]);
objectRLock.lock();
try {
+ MapleMapObject[] visibleObjectsNow = visibleObjects.toArray(new MapleMapObject[visibleObjects.size()]);
+
for (MapleMapObject mo : visibleObjectsNow) {
if (mo != null) {
if (mapobjects.get(mo.getObjectId()) == mo) {
@@ -2453,11 +2553,9 @@ public class MapleMap {
if (mapitem.isPickedUp()) {
return;
}
- MapleMap.this.broadcastMessage(MaplePacketCreator.removeItemFromMap(mapitem.getObjectId(), 0, 0), mapitem.getPosition());
- mapitem.setPickedUp(true);
+ MapleMap.this.pickItemDrop(MaplePacketCreator.removeItemFromMap(mapitem.getObjectId(), 0, 0), mapitem);
} finally {
mapitem.unlockItem();
- MapleMap.this.removeMapObject(mapitem);
}
}
}
diff --git a/src/server/maps/MapleMapFactory.java b/src/server/maps/MapleMapFactory.java
index b95c1a30ff..c4f737f03b 100644
--- a/src/server/maps/MapleMapFactory.java
+++ b/src/server/maps/MapleMapFactory.java
@@ -25,10 +25,15 @@ import java.awt.Point;
import java.awt.Rectangle;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
+import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Collection;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
import provider.MapleData;
import provider.MapleDataProvider;
import provider.MapleDataTool;
@@ -46,6 +51,8 @@ public class MapleMapFactory {
private MapleData nameData;
private EventInstanceManager event;
private Map maps = new HashMap<>();
+ private ReadLock mapsRLock;
+ private WriteLock mapsWLock;
private int channel, world;
public MapleMapFactory(EventInstanceManager eim, MapleDataProvider source, MapleDataProvider stringSource, int world, int channel) {
@@ -54,14 +61,32 @@ public class MapleMapFactory {
this.world = world;
this.channel = channel;
this.event = eim;
+
+ ReentrantReadWriteLock rrwl = new ReentrantReadWriteLock();
+ this.mapsRLock = rrwl.readLock();
+ this.mapsWLock = rrwl.writeLock();
}
public MapleMap getMap(int mapid) {
Integer omapid = Integer.valueOf(mapid);
- MapleMap map = maps.get(omapid);
+ MapleMap map;
+
+ mapsRLock.lock();
+ try {
+ map = maps.get(omapid);
+ } finally {
+ mapsRLock.unlock();
+ }
+
if (map == null) {
synchronized (this) {
- map = maps.get(omapid);
+ mapsRLock.lock();
+ try {
+ map = maps.get(omapid);
+ } finally {
+ mapsRLock.unlock();
+ }
+
if (map != null) {
return map;
}
@@ -224,14 +249,24 @@ public class MapleMapFactory {
}
map.setBackgroundTypes(backTypes);
- maps.put(omapid, map);
+ mapsWLock.lock();
+ try {
+ maps.put(omapid, map);
+ } finally {
+ mapsWLock.unlock();
+ }
}
}
return map;
}
public boolean isMapLoaded(int mapId) {
- return maps.containsKey(mapId);
+ mapsRLock.lock();
+ try {
+ return maps.containsKey(mapId);
+ } finally {
+ mapsRLock.unlock();
+ }
}
private AbstractLoadedMapleLife loadLife(MapleData life, String id, String type) {
@@ -318,11 +353,25 @@ public class MapleMapFactory {
}
public Map getMaps() {
- return maps;
+ mapsRLock.lock();
+ try {
+ return Collections.unmodifiableMap(maps);
+ } finally {
+ mapsRLock.unlock();
+ }
}
public void dispose() {
- for(MapleMap map: maps.values()) map.setEventInstance(null);
+ Collection mapValues;
+
+ mapsRLock.lock();
+ try {
+ mapValues = maps.values();
+ } finally {
+ mapsRLock.unlock();
+ }
+
+ for(MapleMap map: mapValues) map.setEventInstance(null);
this.event = null;
}
}
diff --git a/src/server/maps/MapleMapItem.java b/src/server/maps/MapleMapItem.java
index c6698a8764..e84bbb20e2 100644
--- a/src/server/maps/MapleMapItem.java
+++ b/src/server/maps/MapleMapItem.java
@@ -112,7 +112,7 @@ public class MapleMapItem extends AbstractMapleMapObject {
}
public void setDropTime(long time) {
- this.dropTime = time;
+ this.dropTime = time;
}
public byte getDropType() {
diff --git a/tools/MapleIdRetriever/build/built-jar.properties b/tools/MapleIdRetriever/build/built-jar.properties
index db62d79b3b..8a828d751e 100644
--- a/tools/MapleIdRetriever/build/built-jar.properties
+++ b/tools/MapleIdRetriever/build/built-jar.properties
@@ -1,4 +1,4 @@
-#Wed, 07 Jun 2017 16:23:20 -0300
+#Sat, 05 Aug 2017 17:48:47 -0300
-C\:\\Nexon\\MapleSolaxia\\MapleSolaxiaV2\\MapleIdRetriever=
+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 47dff62a31..6cdbbb069f 100644
Binary files a/tools/MapleIdRetriever/dist/MapleIdRetriever.jar and b/tools/MapleIdRetriever/dist/MapleIdRetriever.jar differ
diff --git a/tools/MapleIdRetriever/handbook/Use.txt b/tools/MapleIdRetriever/handbook/Use.txt
index e3176ce1b4..714aa06303 100644
--- a/tools/MapleIdRetriever/handbook/Use.txt
+++ b/tools/MapleIdRetriever/handbook/Use.txt
@@ -1,4 +1,4 @@
-2000000 - Red Potion - A potion made out of red herbs.\nRecovers 50 HP.
+2000000 - Red Potion - A potion made out of red herbs.\nRecovers 50 HP.
2000001 - Orange Potion - A concentrated potion made out of red herbs.\nRecovers 150 HP.
2000002 - White Potion - A highly-concentrated potion made out of red herbs.\nRecovers 300 HP.
2000003 - Blue Potion - A potion made out of blue herbs.\nRecovers 100 MP.
@@ -381,6 +381,7 @@
2030016 - Phyllia's Warp Powder - Warp powder made by fairy Phyllia. Teleports you to Magatia when used inside the Nihal desert region.
2030019 - Nautilus Return Scroll - This scroll enables you to return to the Pirate village, Nautilus. This is a one use item and will disappear after use.
2030020 - Return to New Leaf City Scroll - Use this scroll to venture back to New Leaf City whenever you want!
+2030100 - Return Scroll - Banished Area - Returns you to the map where you were last banished. Requires immediate use and not have changed maps.
2031000 - Masked Man's Invitation - An invitation from the Masked Man to the Halloween Party at the Haunted Mansion. Double-click to move straight to the mansion.
2031001 - Studio Invitation - An invitation to the studio for the event "For Guild Only".
2040000 - Scroll for Helmet for DEF - Improves the helmet's weapon def.\nSuccess rate:100%, weapon def. +1
diff --git a/tools/MapleIdRetriever/src/mapleidretriever/MapleIdRetriever.java b/tools/MapleIdRetriever/src/mapleidretriever/MapleIdRetriever.java
index e4b56564ba..3674b7b5a6 100644
--- a/tools/MapleIdRetriever/src/mapleidretriever/MapleIdRetriever.java
+++ b/tools/MapleIdRetriever/src/mapleidretriever/MapleIdRetriever.java
@@ -25,12 +25,12 @@ import java.util.ArrayList;
* IMPORTANT: this will fail for fetching MAP ID (you shouldn't be using this program for these, just checking them up in the
* handbook is enough anyway).
*
- * Set whether you are first installing the handbook on the SQL Server (true) or just fetching whatever is on your "fetch.txt"
- * file (false) on the INSTALL_SQLTABLE property and build the project. With all done, run the Java executable.
+ * Set whether you are first installing the handbook on the SQL Server (TRUE) or just fetching whatever is on your "fetch.txt"
+ * file (FALSE) on the INSTALL_SQLTABLE property and build the project. With all done, run the Java executable.
*
*/
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/launch_debug.bat b/tools/launch_debug.bat
similarity index 100%
rename from launch_debug.bat
rename to tools/launch_debug.bat
diff --git a/wz/Item.wz/Consume/0203.img.xml b/wz/Item.wz/Consume/0203.img.xml
index b4c4cfa19d..94d4dce668 100644
--- a/wz/Item.wz/Consume/0203.img.xml
+++ b/wz/Item.wz/Consume/0203.img.xml
@@ -210,7 +210,7 @@
-
+
-
+
@@ -380,4 +380,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/wz/String.wz/Consume.img.xml b/wz/String.wz/Consume.img.xml
index df84fbb380..efab690604 100644
--- a/wz/String.wz/Consume.img.xml
+++ b/wz/String.wz/Consume.img.xml
@@ -1531,9 +1531,9 @@
-
-
-
+
+
+
@@ -9184,4 +9184,8 @@
+
+
+
+