commit 94e1922569873fe75e09c8de8ca56481e3cc3e53 Author: 雪风 <1213457484@qq.com> Date: Mon Mar 3 14:50:01 2025 +0800 111 diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/libraries/lib.xml b/.idea/libraries/lib.xml new file mode 100644 index 0000000..6569f26 --- /dev/null +++ b/.idea/libraries/lib.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..53f706d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..64a71e4 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/A079.iml b/A079.iml new file mode 100644 index 0000000..fb8e866 --- /dev/null +++ b/A079.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/US_export_policy.jar b/lib/US_export_policy.jar new file mode 100644 index 0000000..7173213 Binary files /dev/null and b/lib/US_export_policy.jar differ diff --git a/lib/beansbinding-1.2.1.jar b/lib/beansbinding-1.2.1.jar new file mode 100644 index 0000000..7f26dc3 Binary files /dev/null and b/lib/beansbinding-1.2.1.jar differ diff --git a/lib/beautyeye_lnf.jar b/lib/beautyeye_lnf.jar new file mode 100644 index 0000000..e4f8193 Binary files /dev/null and b/lib/beautyeye_lnf.jar differ diff --git a/lib/classfinal-fatjar.jar b/lib/classfinal-fatjar.jar new file mode 100644 index 0000000..56b97a7 Binary files /dev/null and b/lib/classfinal-fatjar.jar differ diff --git a/lib/druid-1.0.27.jar b/lib/druid-1.0.27.jar new file mode 100644 index 0000000..71c4981 Binary files /dev/null and b/lib/druid-1.0.27.jar differ diff --git a/lib/fastjson-1.2.74.jar b/lib/fastjson-1.2.74.jar new file mode 100644 index 0000000..f6048b2 Binary files /dev/null and b/lib/fastjson-1.2.74.jar differ diff --git a/lib/hutool-all-5.8.26.jar b/lib/hutool-all-5.8.26.jar new file mode 100644 index 0000000..d8502bb Binary files /dev/null and b/lib/hutool-all-5.8.26.jar differ diff --git a/lib/local_policy.jar b/lib/local_policy.jar new file mode 100644 index 0000000..c34d036 Binary files /dev/null and b/lib/local_policy.jar differ diff --git a/lib/mysql-connector-java-bin.jar b/lib/mysql-connector-java-bin.jar new file mode 100644 index 0000000..af5847e Binary files /dev/null and b/lib/mysql-connector-java-bin.jar differ diff --git a/lib/netty-all-4.1.14.Final.jar b/lib/netty-all-4.1.14.Final.jar new file mode 100644 index 0000000..44019f0 Binary files /dev/null and b/lib/netty-all-4.1.14.Final.jar differ diff --git a/out/production/A079/MXDJR/BuildPack.class b/out/production/A079/MXDJR/BuildPack.class new file mode 100644 index 0000000..0aa0362 Binary files /dev/null and b/out/production/A079/MXDJR/BuildPack.class differ diff --git a/out/production/A079/MXDJR/ConfigObj.class b/out/production/A079/MXDJR/ConfigObj.class new file mode 100644 index 0000000..ba39845 Binary files /dev/null and b/out/production/A079/MXDJR/ConfigObj.class differ diff --git a/out/production/A079/MXDJR/ConfigRead.class b/out/production/A079/MXDJR/ConfigRead.class new file mode 100644 index 0000000..97cfd28 Binary files /dev/null and b/out/production/A079/MXDJR/ConfigRead.class differ diff --git a/out/production/A079/MXDJR/FriendMessageEventPack.class b/out/production/A079/MXDJR/FriendMessageEventPack.class new file mode 100644 index 0000000..757d207 Binary files /dev/null and b/out/production/A079/MXDJR/FriendMessageEventPack.class differ diff --git a/out/production/A079/MXDJR/GroupMessageEventPack.class b/out/production/A079/MXDJR/GroupMessageEventPack.class new file mode 100644 index 0000000..8839cd9 Binary files /dev/null and b/out/production/A079/MXDJR/GroupMessageEventPack.class differ diff --git a/out/production/A079/MXDJR/MXDJR.class b/out/production/A079/MXDJR/MXDJR.class new file mode 100644 index 0000000..b5e2478 Binary files /dev/null and b/out/production/A079/MXDJR/MXDJR.class differ diff --git a/out/production/A079/MXDJR/PackBase.class b/out/production/A079/MXDJR/PackBase.class new file mode 100644 index 0000000..89ce0e0 Binary files /dev/null and b/out/production/A079/MXDJR/PackBase.class differ diff --git a/out/production/A079/MXDJR/RobotSocket$1.class b/out/production/A079/MXDJR/RobotSocket$1.class new file mode 100644 index 0000000..8762e3f Binary files /dev/null and b/out/production/A079/MXDJR/RobotSocket$1.class differ diff --git a/out/production/A079/MXDJR/RobotSocket$2.class b/out/production/A079/MXDJR/RobotSocket$2.class new file mode 100644 index 0000000..122e992 Binary files /dev/null and b/out/production/A079/MXDJR/RobotSocket$2.class differ diff --git a/out/production/A079/MXDJR/RobotSocket$3.class b/out/production/A079/MXDJR/RobotSocket$3.class new file mode 100644 index 0000000..98113ff Binary files /dev/null and b/out/production/A079/MXDJR/RobotSocket$3.class differ diff --git a/out/production/A079/MXDJR/RobotSocket$4.class b/out/production/A079/MXDJR/RobotSocket$4.class new file mode 100644 index 0000000..4dd4f09 Binary files /dev/null and b/out/production/A079/MXDJR/RobotSocket$4.class differ diff --git a/out/production/A079/MXDJR/RobotSocket$5.class b/out/production/A079/MXDJR/RobotSocket$5.class new file mode 100644 index 0000000..46b1719 Binary files /dev/null and b/out/production/A079/MXDJR/RobotSocket$5.class differ diff --git a/out/production/A079/MXDJR/RobotSocket$6$1.class b/out/production/A079/MXDJR/RobotSocket$6$1.class new file mode 100644 index 0000000..f37196b Binary files /dev/null and b/out/production/A079/MXDJR/RobotSocket$6$1.class differ diff --git a/out/production/A079/MXDJR/RobotSocket$6.class b/out/production/A079/MXDJR/RobotSocket$6.class new file mode 100644 index 0000000..c44c039 Binary files /dev/null and b/out/production/A079/MXDJR/RobotSocket$6.class differ diff --git a/out/production/A079/MXDJR/RobotSocket.class b/out/production/A079/MXDJR/RobotSocket.class new file mode 100644 index 0000000..6bcbbbf Binary files /dev/null and b/out/production/A079/MXDJR/RobotSocket.class differ diff --git a/out/production/A079/MXDJR/RobotTask.class b/out/production/A079/MXDJR/RobotTask.class new file mode 100644 index 0000000..048cbdf Binary files /dev/null and b/out/production/A079/MXDJR/RobotTask.class differ diff --git a/out/production/A079/MXDJR/SendFriendImagePack.class b/out/production/A079/MXDJR/SendFriendImagePack.class new file mode 100644 index 0000000..e645808 Binary files /dev/null and b/out/production/A079/MXDJR/SendFriendImagePack.class differ diff --git a/out/production/A079/MXDJR/SendFriendMessagePack.class b/out/production/A079/MXDJR/SendFriendMessagePack.class new file mode 100644 index 0000000..2ad4135 Binary files /dev/null and b/out/production/A079/MXDJR/SendFriendMessagePack.class differ diff --git a/out/production/A079/MXDJR/SendGroupImagePack.class b/out/production/A079/MXDJR/SendGroupImagePack.class new file mode 100644 index 0000000..d071e46 Binary files /dev/null and b/out/production/A079/MXDJR/SendGroupImagePack.class differ diff --git a/out/production/A079/MXDJR/SendGroupMessagePack.class b/out/production/A079/MXDJR/SendGroupMessagePack.class new file mode 100644 index 0000000..e93a1a3 Binary files /dev/null and b/out/production/A079/MXDJR/SendGroupMessagePack.class differ diff --git a/out/production/A079/MXDJR/SendGroupPrivateImagePack.class b/out/production/A079/MXDJR/SendGroupPrivateImagePack.class new file mode 100644 index 0000000..8b0df62 Binary files /dev/null and b/out/production/A079/MXDJR/SendGroupPrivateImagePack.class differ diff --git a/out/production/A079/MXDJR/SendGroupPrivateMessagePack.class b/out/production/A079/MXDJR/SendGroupPrivateMessagePack.class new file mode 100644 index 0000000..d6a515e Binary files /dev/null and b/out/production/A079/MXDJR/SendGroupPrivateMessagePack.class differ diff --git a/out/production/A079/MXDJR/ServerMain.class b/out/production/A079/MXDJR/ServerMain.class new file mode 100644 index 0000000..29fc6a7 Binary files /dev/null and b/out/production/A079/MXDJR/ServerMain.class differ diff --git a/out/production/A079/MXDJR/StartPack.class b/out/production/A079/MXDJR/StartPack.class new file mode 100644 index 0000000..fb75a0f Binary files /dev/null and b/out/production/A079/MXDJR/StartPack.class differ diff --git a/out/production/A079/MXDJR/TempMessageEventPack.class b/out/production/A079/MXDJR/TempMessageEventPack.class new file mode 100644 index 0000000..6c61671 Binary files /dev/null and b/out/production/A079/MXDJR/TempMessageEventPack.class differ diff --git a/out/production/A079/client/BuddyEntry.class b/out/production/A079/client/BuddyEntry.class new file mode 100644 index 0000000..b0790cb Binary files /dev/null and b/out/production/A079/client/BuddyEntry.class differ diff --git a/out/production/A079/client/BuddyList$BuddyAddResult.class b/out/production/A079/client/BuddyList$BuddyAddResult.class new file mode 100644 index 0000000..9cbebf3 Binary files /dev/null and b/out/production/A079/client/BuddyList$BuddyAddResult.class differ diff --git a/out/production/A079/client/BuddyList$BuddyOperation.class b/out/production/A079/client/BuddyList$BuddyOperation.class new file mode 100644 index 0000000..5550696 Binary files /dev/null and b/out/production/A079/client/BuddyList$BuddyOperation.class differ diff --git a/out/production/A079/client/BuddyList.class b/out/production/A079/client/BuddyList.class new file mode 100644 index 0000000..fddac39 Binary files /dev/null and b/out/production/A079/client/BuddyList.class differ diff --git a/out/production/A079/client/ISkill.class b/out/production/A079/client/ISkill.class new file mode 100644 index 0000000..f28c814 Binary files /dev/null and b/out/production/A079/client/ISkill.class differ diff --git a/out/production/A079/client/ItemVac.class b/out/production/A079/client/ItemVac.class new file mode 100644 index 0000000..617a47c Binary files /dev/null and b/out/production/A079/client/ItemVac.class differ diff --git a/out/production/A079/client/LoginCrypto.class b/out/production/A079/client/LoginCrypto.class new file mode 100644 index 0000000..ca7a4b7 Binary files /dev/null and b/out/production/A079/client/LoginCrypto.class differ diff --git a/out/production/A079/client/LoginCryptoLegacy.class b/out/production/A079/client/LoginCryptoLegacy.class new file mode 100644 index 0000000..34f6966 Binary files /dev/null and b/out/production/A079/client/LoginCryptoLegacy.class differ diff --git a/out/production/A079/client/MapleBeans$BeansType.class b/out/production/A079/client/MapleBeans$BeansType.class new file mode 100644 index 0000000..3f6f725 Binary files /dev/null and b/out/production/A079/client/MapleBeans$BeansType.class differ diff --git a/out/production/A079/client/MapleBeans.class b/out/production/A079/client/MapleBeans.class new file mode 100644 index 0000000..9c13320 Binary files /dev/null and b/out/production/A079/client/MapleBeans.class differ diff --git a/out/production/A079/client/MapleBuffStat.class b/out/production/A079/client/MapleBuffStat.class new file mode 100644 index 0000000..1535e0c Binary files /dev/null and b/out/production/A079/client/MapleBuffStat.class differ diff --git a/out/production/A079/client/MapleBuffStatValueHolder.class b/out/production/A079/client/MapleBuffStatValueHolder.class new file mode 100644 index 0000000..224d8d3 Binary files /dev/null and b/out/production/A079/client/MapleBuffStatValueHolder.class differ diff --git a/out/production/A079/client/MapleCharacter$1.class b/out/production/A079/client/MapleCharacter$1.class new file mode 100644 index 0000000..1afa75b Binary files /dev/null and b/out/production/A079/client/MapleCharacter$1.class differ diff --git a/out/production/A079/client/MapleCharacter$2.class b/out/production/A079/client/MapleCharacter$2.class new file mode 100644 index 0000000..02dbd62 Binary files /dev/null and b/out/production/A079/client/MapleCharacter$2.class differ diff --git a/out/production/A079/client/MapleCharacter$3.class b/out/production/A079/client/MapleCharacter$3.class new file mode 100644 index 0000000..8bef3b6 Binary files /dev/null and b/out/production/A079/client/MapleCharacter$3.class differ diff --git a/out/production/A079/client/MapleCharacter$4.class b/out/production/A079/client/MapleCharacter$4.class new file mode 100644 index 0000000..94e14fc Binary files /dev/null and b/out/production/A079/client/MapleCharacter$4.class differ diff --git a/out/production/A079/client/MapleCharacter$5.class b/out/production/A079/client/MapleCharacter$5.class new file mode 100644 index 0000000..75be01e Binary files /dev/null and b/out/production/A079/client/MapleCharacter$5.class differ diff --git a/out/production/A079/client/MapleCharacter$6.class b/out/production/A079/client/MapleCharacter$6.class new file mode 100644 index 0000000..5086d93 Binary files /dev/null and b/out/production/A079/client/MapleCharacter$6.class differ diff --git a/out/production/A079/client/MapleCharacter$7.class b/out/production/A079/client/MapleCharacter$7.class new file mode 100644 index 0000000..386a1b1 Binary files /dev/null and b/out/production/A079/client/MapleCharacter$7.class differ diff --git a/out/production/A079/client/MapleCharacter$8.class b/out/production/A079/client/MapleCharacter$8.class new file mode 100644 index 0000000..07031cb Binary files /dev/null and b/out/production/A079/client/MapleCharacter$8.class differ diff --git a/out/production/A079/client/MapleCharacter$FameStatus.class b/out/production/A079/client/MapleCharacter$FameStatus.class new file mode 100644 index 0000000..b07492c Binary files /dev/null and b/out/production/A079/client/MapleCharacter$FameStatus.class differ diff --git a/out/production/A079/client/MapleCharacter.class b/out/production/A079/client/MapleCharacter.class new file mode 100644 index 0000000..eca3e58 Binary files /dev/null and b/out/production/A079/client/MapleCharacter.class differ diff --git a/out/production/A079/client/MapleCharacterUtil.class b/out/production/A079/client/MapleCharacterUtil.class new file mode 100644 index 0000000..0680d45 Binary files /dev/null and b/out/production/A079/client/MapleCharacterUtil.class differ diff --git a/out/production/A079/client/MapleClient$1.class b/out/production/A079/client/MapleClient$1.class new file mode 100644 index 0000000..fac8121 Binary files /dev/null and b/out/production/A079/client/MapleClient$1.class differ diff --git a/out/production/A079/client/MapleClient$2.class b/out/production/A079/client/MapleClient$2.class new file mode 100644 index 0000000..2a46496 Binary files /dev/null and b/out/production/A079/client/MapleClient$2.class differ diff --git a/out/production/A079/client/MapleClient$CharNameAndId.class b/out/production/A079/client/MapleClient$CharNameAndId.class new file mode 100644 index 0000000..d3dcb59 Binary files /dev/null and b/out/production/A079/client/MapleClient$CharNameAndId.class differ diff --git a/out/production/A079/client/MapleClient.class b/out/production/A079/client/MapleClient.class new file mode 100644 index 0000000..2b05f45 Binary files /dev/null and b/out/production/A079/client/MapleClient.class differ diff --git a/out/production/A079/client/MapleCoolDownValueHolder.class b/out/production/A079/client/MapleCoolDownValueHolder.class new file mode 100644 index 0000000..deca71d Binary files /dev/null and b/out/production/A079/client/MapleCoolDownValueHolder.class differ diff --git a/out/production/A079/client/MapleDisease$1.class b/out/production/A079/client/MapleDisease$1.class new file mode 100644 index 0000000..d36b78f Binary files /dev/null and b/out/production/A079/client/MapleDisease$1.class differ diff --git a/out/production/A079/client/MapleDisease.class b/out/production/A079/client/MapleDisease.class new file mode 100644 index 0000000..7b3646e Binary files /dev/null and b/out/production/A079/client/MapleDisease.class differ diff --git a/out/production/A079/client/MapleDiseaseValueHolder.class b/out/production/A079/client/MapleDiseaseValueHolder.class new file mode 100644 index 0000000..06ce175 Binary files /dev/null and b/out/production/A079/client/MapleDiseaseValueHolder.class differ diff --git a/out/production/A079/client/MapleEquipOnlyId$1.class b/out/production/A079/client/MapleEquipOnlyId$1.class new file mode 100644 index 0000000..49b8edd Binary files /dev/null and b/out/production/A079/client/MapleEquipOnlyId$1.class differ diff --git a/out/production/A079/client/MapleEquipOnlyId$SingletonHolder.class b/out/production/A079/client/MapleEquipOnlyId$SingletonHolder.class new file mode 100644 index 0000000..a61a867 Binary files /dev/null and b/out/production/A079/client/MapleEquipOnlyId$SingletonHolder.class differ diff --git a/out/production/A079/client/MapleEquipOnlyId.class b/out/production/A079/client/MapleEquipOnlyId.class new file mode 100644 index 0000000..519d856 Binary files /dev/null and b/out/production/A079/client/MapleEquipOnlyId.class differ diff --git a/out/production/A079/client/MapleJob.class b/out/production/A079/client/MapleJob.class new file mode 100644 index 0000000..671062a Binary files /dev/null and b/out/production/A079/client/MapleJob.class differ diff --git a/out/production/A079/client/MapleKeyLayout.class b/out/production/A079/client/MapleKeyLayout.class new file mode 100644 index 0000000..45e1dee Binary files /dev/null and b/out/production/A079/client/MapleKeyLayout.class differ diff --git a/out/production/A079/client/MapleLieDetector$1.class b/out/production/A079/client/MapleLieDetector$1.class new file mode 100644 index 0000000..c1df14a Binary files /dev/null and b/out/production/A079/client/MapleLieDetector$1.class differ diff --git a/out/production/A079/client/MapleLieDetector.class b/out/production/A079/client/MapleLieDetector.class new file mode 100644 index 0000000..1720cf8 Binary files /dev/null and b/out/production/A079/client/MapleLieDetector.class differ diff --git a/out/production/A079/client/MapleQuestStatus.class b/out/production/A079/client/MapleQuestStatus.class new file mode 100644 index 0000000..b117d39 Binary files /dev/null and b/out/production/A079/client/MapleQuestStatus.class differ diff --git a/out/production/A079/client/MapleStat$Temp.class b/out/production/A079/client/MapleStat$Temp.class new file mode 100644 index 0000000..205f4cc Binary files /dev/null and b/out/production/A079/client/MapleStat$Temp.class differ diff --git a/out/production/A079/client/MapleStat.class b/out/production/A079/client/MapleStat.class new file mode 100644 index 0000000..68c6661 Binary files /dev/null and b/out/production/A079/client/MapleStat.class differ diff --git a/out/production/A079/client/MobVac.class b/out/production/A079/client/MobVac.class new file mode 100644 index 0000000..8a0e9af Binary files /dev/null and b/out/production/A079/client/MobVac.class differ diff --git a/out/production/A079/client/MonsterBook.class b/out/production/A079/client/MonsterBook.class new file mode 100644 index 0000000..fa88a42 Binary files /dev/null and b/out/production/A079/client/MonsterBook.class differ diff --git a/out/production/A079/client/PlayerRandomStream.class b/out/production/A079/client/PlayerRandomStream.class new file mode 100644 index 0000000..9719d56 Binary files /dev/null and b/out/production/A079/client/PlayerRandomStream.class differ diff --git a/out/production/A079/client/PlayerStats$1.class b/out/production/A079/client/PlayerStats$1.class new file mode 100644 index 0000000..7fc98d4 Binary files /dev/null and b/out/production/A079/client/PlayerStats$1.class differ diff --git a/out/production/A079/client/PlayerStats.class b/out/production/A079/client/PlayerStats.class new file mode 100644 index 0000000..3b7cb7c Binary files /dev/null and b/out/production/A079/client/PlayerStats.class differ diff --git a/out/production/A079/client/RockPaperScissors.class b/out/production/A079/client/RockPaperScissors.class new file mode 100644 index 0000000..b5f7660 Binary files /dev/null and b/out/production/A079/client/RockPaperScissors.class differ diff --git a/out/production/A079/client/Skill.class b/out/production/A079/client/Skill.class new file mode 100644 index 0000000..81a37d0 Binary files /dev/null and b/out/production/A079/client/Skill.class differ diff --git a/out/production/A079/client/SkillEntry.class b/out/production/A079/client/SkillEntry.class new file mode 100644 index 0000000..2875b73 Binary files /dev/null and b/out/production/A079/client/SkillEntry.class differ diff --git a/out/production/A079/client/SkillFactory.class b/out/production/A079/client/SkillFactory.class new file mode 100644 index 0000000..a0a4ff3 Binary files /dev/null and b/out/production/A079/client/SkillFactory.class differ diff --git a/out/production/A079/client/SkillMacro.class b/out/production/A079/client/SkillMacro.class new file mode 100644 index 0000000..4ce5817 Binary files /dev/null and b/out/production/A079/client/SkillMacro.class differ diff --git a/out/production/A079/client/SummonSkillEntry.class b/out/production/A079/client/SummonSkillEntry.class new file mode 100644 index 0000000..db90b11 Binary files /dev/null and b/out/production/A079/client/SummonSkillEntry.class differ diff --git a/out/production/A079/client/anticheat/CheatTracker$1.class b/out/production/A079/client/anticheat/CheatTracker$1.class new file mode 100644 index 0000000..11709ee Binary files /dev/null and b/out/production/A079/client/anticheat/CheatTracker$1.class differ diff --git a/out/production/A079/client/anticheat/CheatTracker$InvalidationTask.class b/out/production/A079/client/anticheat/CheatTracker$InvalidationTask.class new file mode 100644 index 0000000..45cdb3d Binary files /dev/null and b/out/production/A079/client/anticheat/CheatTracker$InvalidationTask.class differ diff --git a/out/production/A079/client/anticheat/CheatTracker.class b/out/production/A079/client/anticheat/CheatTracker.class new file mode 100644 index 0000000..30736a4 Binary files /dev/null and b/out/production/A079/client/anticheat/CheatTracker.class differ diff --git a/out/production/A079/client/anticheat/CheatingOffense.class b/out/production/A079/client/anticheat/CheatingOffense.class new file mode 100644 index 0000000..06736a8 Binary files /dev/null and b/out/production/A079/client/anticheat/CheatingOffense.class differ diff --git a/out/production/A079/client/anticheat/CheatingOffenseEntry.class b/out/production/A079/client/anticheat/CheatingOffenseEntry.class new file mode 100644 index 0000000..942657d Binary files /dev/null and b/out/production/A079/client/anticheat/CheatingOffenseEntry.class differ diff --git a/out/production/A079/client/anticheat/CheatingOffensePersister$PersistingTask.class b/out/production/A079/client/anticheat/CheatingOffensePersister$PersistingTask.class new file mode 100644 index 0000000..82e5cc7 Binary files /dev/null and b/out/production/A079/client/anticheat/CheatingOffensePersister$PersistingTask.class differ diff --git a/out/production/A079/client/anticheat/CheatingOffensePersister.class b/out/production/A079/client/anticheat/CheatingOffensePersister.class new file mode 100644 index 0000000..1a620d8 Binary files /dev/null and b/out/production/A079/client/anticheat/CheatingOffensePersister.class differ diff --git a/out/production/A079/client/inventory/Equip.class b/out/production/A079/client/inventory/Equip.class new file mode 100644 index 0000000..992b4b8 Binary files /dev/null and b/out/production/A079/client/inventory/Equip.class differ diff --git a/out/production/A079/client/inventory/EquipAdditions$RingSet.class b/out/production/A079/client/inventory/EquipAdditions$RingSet.class new file mode 100644 index 0000000..25acaa5 Binary files /dev/null and b/out/production/A079/client/inventory/EquipAdditions$RingSet.class differ diff --git a/out/production/A079/client/inventory/EquipAdditions.class b/out/production/A079/client/inventory/EquipAdditions.class new file mode 100644 index 0000000..0091bcd Binary files /dev/null and b/out/production/A079/client/inventory/EquipAdditions.class differ diff --git a/out/production/A079/client/inventory/IEquip$ScrollResult.class b/out/production/A079/client/inventory/IEquip$ScrollResult.class new file mode 100644 index 0000000..5e987cc Binary files /dev/null and b/out/production/A079/client/inventory/IEquip$ScrollResult.class differ diff --git a/out/production/A079/client/inventory/IEquip.class b/out/production/A079/client/inventory/IEquip.class new file mode 100644 index 0000000..f322ef0 Binary files /dev/null and b/out/production/A079/client/inventory/IEquip.class differ diff --git a/out/production/A079/client/inventory/IItem.class b/out/production/A079/client/inventory/IItem.class new file mode 100644 index 0000000..08bbbf3 Binary files /dev/null and b/out/production/A079/client/inventory/IItem.class differ diff --git a/out/production/A079/client/inventory/InventoryException.class b/out/production/A079/client/inventory/InventoryException.class new file mode 100644 index 0000000..e26dc01 Binary files /dev/null and b/out/production/A079/client/inventory/InventoryException.class differ diff --git a/out/production/A079/client/inventory/Item.class b/out/production/A079/client/inventory/Item.class new file mode 100644 index 0000000..9e4f116 Binary files /dev/null and b/out/production/A079/client/inventory/Item.class differ diff --git a/out/production/A079/client/inventory/ItemFlag.class b/out/production/A079/client/inventory/ItemFlag.class new file mode 100644 index 0000000..e01b777 Binary files /dev/null and b/out/production/A079/client/inventory/ItemFlag.class differ diff --git a/out/production/A079/client/inventory/ItemFlag2.class b/out/production/A079/client/inventory/ItemFlag2.class new file mode 100644 index 0000000..d58b0b6 Binary files /dev/null and b/out/production/A079/client/inventory/ItemFlag2.class differ diff --git a/out/production/A079/client/inventory/ItemLoader.class b/out/production/A079/client/inventory/ItemLoader.class new file mode 100644 index 0000000..776755a Binary files /dev/null and b/out/production/A079/client/inventory/ItemLoader.class differ diff --git a/out/production/A079/client/inventory/MapleInventory.class b/out/production/A079/client/inventory/MapleInventory.class new file mode 100644 index 0000000..a66a788 Binary files /dev/null and b/out/production/A079/client/inventory/MapleInventory.class differ diff --git a/out/production/A079/client/inventory/MapleInventoryIdentifier.class b/out/production/A079/client/inventory/MapleInventoryIdentifier.class new file mode 100644 index 0000000..88741bb Binary files /dev/null and b/out/production/A079/client/inventory/MapleInventoryIdentifier.class differ diff --git a/out/production/A079/client/inventory/MapleInventoryType.class b/out/production/A079/client/inventory/MapleInventoryType.class new file mode 100644 index 0000000..3a9e472 Binary files /dev/null and b/out/production/A079/client/inventory/MapleInventoryType.class differ diff --git a/out/production/A079/client/inventory/MapleMount$1.class b/out/production/A079/client/inventory/MapleMount$1.class new file mode 100644 index 0000000..08f2369 Binary files /dev/null and b/out/production/A079/client/inventory/MapleMount$1.class differ diff --git a/out/production/A079/client/inventory/MapleMount.class b/out/production/A079/client/inventory/MapleMount.class new file mode 100644 index 0000000..12f6029 Binary files /dev/null and b/out/production/A079/client/inventory/MapleMount.class differ diff --git a/out/production/A079/client/inventory/MaplePet$PetFlag.class b/out/production/A079/client/inventory/MaplePet$PetFlag.class new file mode 100644 index 0000000..174a675 Binary files /dev/null and b/out/production/A079/client/inventory/MaplePet$PetFlag.class differ diff --git a/out/production/A079/client/inventory/MaplePet.class b/out/production/A079/client/inventory/MaplePet.class new file mode 100644 index 0000000..73adbab Binary files /dev/null and b/out/production/A079/client/inventory/MaplePet.class differ diff --git a/out/production/A079/client/inventory/MapleRing$RingComparator.class b/out/production/A079/client/inventory/MapleRing$RingComparator.class new file mode 100644 index 0000000..008d1f2 Binary files /dev/null and b/out/production/A079/client/inventory/MapleRing$RingComparator.class differ diff --git a/out/production/A079/client/inventory/MapleRing.class b/out/production/A079/client/inventory/MapleRing.class new file mode 100644 index 0000000..7018a32 Binary files /dev/null and b/out/production/A079/client/inventory/MapleRing.class differ diff --git a/out/production/A079/client/inventory/MapleWeaponType.class b/out/production/A079/client/inventory/MapleWeaponType.class new file mode 100644 index 0000000..e2329bf Binary files /dev/null and b/out/production/A079/client/inventory/MapleWeaponType.class differ diff --git a/out/production/A079/client/inventory/ModifyInventory$Types.class b/out/production/A079/client/inventory/ModifyInventory$Types.class new file mode 100644 index 0000000..dac5367 Binary files /dev/null and b/out/production/A079/client/inventory/ModifyInventory$Types.class differ diff --git a/out/production/A079/client/inventory/ModifyInventory.class b/out/production/A079/client/inventory/ModifyInventory.class new file mode 100644 index 0000000..9d871b0 Binary files /dev/null and b/out/production/A079/client/inventory/ModifyInventory.class differ diff --git a/out/production/A079/client/inventory/OnlyID$run.class b/out/production/A079/client/inventory/OnlyID$run.class new file mode 100644 index 0000000..e0a515c Binary files /dev/null and b/out/production/A079/client/inventory/OnlyID$run.class differ diff --git a/out/production/A079/client/inventory/OnlyID.class b/out/production/A079/client/inventory/OnlyID.class new file mode 100644 index 0000000..bf6347e Binary files /dev/null and b/out/production/A079/client/inventory/OnlyID.class differ diff --git a/out/production/A079/client/inventory/PetCommand.class b/out/production/A079/client/inventory/PetCommand.class new file mode 100644 index 0000000..19b7b4b Binary files /dev/null and b/out/production/A079/client/inventory/PetCommand.class differ diff --git a/out/production/A079/client/inventory/PetDataFactory.class b/out/production/A079/client/inventory/PetDataFactory.class new file mode 100644 index 0000000..54f571d Binary files /dev/null and b/out/production/A079/client/inventory/PetDataFactory.class differ diff --git a/out/production/A079/client/messages/CommandProcessor$1.class b/out/production/A079/client/messages/CommandProcessor$1.class new file mode 100644 index 0000000..741d59a Binary files /dev/null and b/out/production/A079/client/messages/CommandProcessor$1.class differ diff --git a/out/production/A079/client/messages/CommandProcessor.class b/out/production/A079/client/messages/CommandProcessor.class new file mode 100644 index 0000000..b16bff4 Binary files /dev/null and b/out/production/A079/client/messages/CommandProcessor.class differ diff --git a/out/production/A079/client/messages/CommandProcessorUtil.class b/out/production/A079/client/messages/CommandProcessorUtil.class new file mode 100644 index 0000000..359718d Binary files /dev/null and b/out/production/A079/client/messages/CommandProcessorUtil.class differ diff --git a/out/production/A079/client/messages/ConsoleCommandProcessor.class b/out/production/A079/client/messages/ConsoleCommandProcessor.class new file mode 100644 index 0000000..93d9614 Binary files /dev/null and b/out/production/A079/client/messages/ConsoleCommandProcessor.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$CashEveryone.class b/out/production/A079/client/messages/commands/AdminCommand$CashEveryone.class new file mode 100644 index 0000000..f548604 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$CashEveryone.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$CashMap.class b/out/production/A079/client/messages/commands/AdminCommand$CashMap.class new file mode 100644 index 0000000..a5ab778 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$CashMap.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$CloneMe.class b/out/production/A079/client/messages/commands/AdminCommand$CloneMe.class new file mode 100644 index 0000000..42c4663 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$CloneMe.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$DCAll.class b/out/production/A079/client/messages/commands/AdminCommand$DCAll.class new file mode 100644 index 0000000..f666d57 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$DCAll.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$DestroyPNPC.class b/out/production/A079/client/messages/commands/AdminCommand$DestroyPNPC.class new file mode 100644 index 0000000..1501ecd Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$DestroyPNPC.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$Disease.class b/out/production/A079/client/messages/commands/AdminCommand$Disease.class new file mode 100644 index 0000000..531f92c Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$Disease.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$DisposeClones.class b/out/production/A079/client/messages/commands/AdminCommand$DisposeClones.class new file mode 100644 index 0000000..4ddd00c Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$DisposeClones.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$Drop.class b/out/production/A079/client/messages/commands/AdminCommand$Drop.class new file mode 100644 index 0000000..a097dfd Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$Drop.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$Fame.class b/out/production/A079/client/messages/commands/AdminCommand$Fame.class new file mode 100644 index 0000000..be0613b Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$Fame.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$GC.class b/out/production/A079/client/messages/commands/AdminCommand$GC.class new file mode 100644 index 0000000..4a70b6a Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$GC.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$GainCash.class b/out/production/A079/client/messages/commands/AdminCommand$GainCash.class new file mode 100644 index 0000000..84f2b22 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$GainCash.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$GainMaplePoint.class b/out/production/A079/client/messages/commands/AdminCommand$GainMaplePoint.class new file mode 100644 index 0000000..2b46347 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$GainMaplePoint.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$GainPoint.class b/out/production/A079/client/messages/commands/AdminCommand$GainPoint.class new file mode 100644 index 0000000..3161bb7 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$GainPoint.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$GainVP.class b/out/production/A079/client/messages/commands/AdminCommand$GainVP.class new file mode 100644 index 0000000..de323b5 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$GainVP.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$GodMode.class b/out/production/A079/client/messages/commands/AdminCommand$GodMode.class new file mode 100644 index 0000000..df6c303 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$GodMode.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$HitMonsterByOID.class b/out/production/A079/client/messages/commands/AdminCommand$HitMonsterByOID.class new file mode 100644 index 0000000..ceddeb0 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$HitMonsterByOID.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$Item.class b/out/production/A079/client/messages/commands/AdminCommand$Item.class new file mode 100644 index 0000000..8816366 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$Item.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$KillMap.class b/out/production/A079/client/messages/commands/AdminCommand$KillMap.class new file mode 100644 index 0000000..e705534 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$KillMap.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$KillMonsterByOID.class b/out/production/A079/client/messages/commands/AdminCommand$KillMonsterByOID.class new file mode 100644 index 0000000..5ffd8e3 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$KillMonsterByOID.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$LOLCastle.class b/out/production/A079/client/messages/commands/AdminCommand$LOLCastle.class new file mode 100644 index 0000000..4ae2bc6 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$LOLCastle.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$LockItem.class b/out/production/A079/client/messages/commands/AdminCommand$LockItem.class new file mode 100644 index 0000000..6f2463e Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$LockItem.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$MakeOfflineP.class b/out/production/A079/client/messages/commands/AdminCommand$MakeOfflineP.class new file mode 100644 index 0000000..8cea3bc Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$MakeOfflineP.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$MakePNPC.class b/out/production/A079/client/messages/commands/AdminCommand$MakePNPC.class new file mode 100644 index 0000000..23a2879 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$MakePNPC.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$MesoEveryone.class b/out/production/A079/client/messages/commands/AdminCommand$MesoEveryone.class new file mode 100644 index 0000000..6141de1 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$MesoEveryone.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$MesoMap.class b/out/production/A079/client/messages/commands/AdminCommand$MesoMap.class new file mode 100644 index 0000000..49d726b Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$MesoMap.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$MobVac.class b/out/production/A079/client/messages/commands/AdminCommand$MobVac.class new file mode 100644 index 0000000..887563e Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$MobVac.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$Monitor.class b/out/production/A079/client/messages/commands/AdminCommand$Monitor.class new file mode 100644 index 0000000..059abcf Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$Monitor.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$NPC.class b/out/production/A079/client/messages/commands/AdminCommand$NPC.class new file mode 100644 index 0000000..acdb7f2 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$NPC.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$PNPC.class b/out/production/A079/client/messages/commands/AdminCommand$PNPC.class new file mode 100644 index 0000000..0450ed4 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$PNPC.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$Packet.class b/out/production/A079/client/messages/commands/AdminCommand$Packet.class new file mode 100644 index 0000000..41474da Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$Packet.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$PermWeather.class b/out/production/A079/client/messages/commands/AdminCommand$PermWeather.class new file mode 100644 index 0000000..754a02f Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$PermWeather.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$ProDrop.class b/out/production/A079/client/messages/commands/AdminCommand$ProDrop.class new file mode 100644 index 0000000..642eba0 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$ProDrop.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$ReloadGashapon.class b/out/production/A079/client/messages/commands/AdminCommand$ReloadGashapon.class new file mode 100644 index 0000000..ca68339 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$ReloadGashapon.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$ReloadMap.class b/out/production/A079/client/messages/commands/AdminCommand$ReloadMap.class new file mode 100644 index 0000000..4e8290b Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$ReloadMap.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$ResetMap.class b/out/production/A079/client/messages/commands/AdminCommand$ResetMap.class new file mode 100644 index 0000000..4b0db91 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$ResetMap.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$ResetMobs.class b/out/production/A079/client/messages/commands/AdminCommand$ResetMobs.class new file mode 100644 index 0000000..c06711e Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$ResetMobs.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$Respawn.class b/out/production/A079/client/messages/commands/AdminCommand$Respawn.class new file mode 100644 index 0000000..456e664 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$Respawn.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$SavePlayerShops.class b/out/production/A079/client/messages/commands/AdminCommand$SavePlayerShops.class new file mode 100644 index 0000000..8b6151e Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$SavePlayerShops.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$SendAllNote.class b/out/production/A079/client/messages/commands/AdminCommand$SendAllNote.class new file mode 100644 index 0000000..fecf533 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$SendAllNote.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$ShowTrace.class b/out/production/A079/client/messages/commands/AdminCommand$ShowTrace.class new file mode 100644 index 0000000..e2c21dc Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$ShowTrace.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$Spawn.class b/out/production/A079/client/messages/commands/AdminCommand$Spawn.class new file mode 100644 index 0000000..3635453 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$Spawn.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$StartProfiling.class b/out/production/A079/client/messages/commands/AdminCommand$StartProfiling.class new file mode 100644 index 0000000..d8349d0 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$StartProfiling.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$StopProfiling.class b/out/production/A079/client/messages/commands/AdminCommand$StopProfiling.class new file mode 100644 index 0000000..73363ae Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$StopProfiling.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$Threads.class b/out/production/A079/client/messages/commands/AdminCommand$Threads.class new file mode 100644 index 0000000..ee32cf1 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$Threads.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$ToggleMegaphone.class b/out/production/A079/client/messages/commands/AdminCommand$ToggleMegaphone.class new file mode 100644 index 0000000..5eeb6c6 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$ToggleMegaphone.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$ToggleOffense.class b/out/production/A079/client/messages/commands/AdminCommand$ToggleOffense.class new file mode 100644 index 0000000..2bd36eb Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$ToggleOffense.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$WarpAllHere.class b/out/production/A079/client/messages/commands/AdminCommand$WarpAllHere.class new file mode 100644 index 0000000..4a2e844 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$WarpAllHere.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$WarpPlayersTo.class b/out/production/A079/client/messages/commands/AdminCommand$WarpPlayersTo.class new file mode 100644 index 0000000..37e6f2d Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$WarpPlayersTo.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$autoban.class b/out/production/A079/client/messages/commands/AdminCommand$autoban.class new file mode 100644 index 0000000..eb1c59c Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$autoban.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$giveMeso.class b/out/production/A079/client/messages/commands/AdminCommand$giveMeso.class new file mode 100644 index 0000000..831f76b Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$giveMeso.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$maxmeso.class b/out/production/A079/client/messages/commands/AdminCommand$maxmeso.class new file mode 100644 index 0000000..ba7d35a Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$maxmeso.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$mesos.class b/out/production/A079/client/messages/commands/AdminCommand$mesos.class new file mode 100644 index 0000000..5da21e4 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$mesos.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$serverMsg.class b/out/production/A079/client/messages/commands/AdminCommand$serverMsg.class new file mode 100644 index 0000000..7949741 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$serverMsg.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$toggleDrop.class b/out/production/A079/client/messages/commands/AdminCommand$toggleDrop.class new file mode 100644 index 0000000..1fff93b Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$toggleDrop.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$丢.class b/out/production/A079/client/messages/commands/AdminCommand$丢.class new file mode 100644 index 0000000..ec7d61e Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$丢.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$临时npc.class b/out/production/A079/client/messages/commands/AdminCommand$临时npc.class new file mode 100644 index 0000000..e470d55 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$临时npc.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$开启自动活动.class b/out/production/A079/client/messages/commands/AdminCommand$开启自动活动.class new file mode 100644 index 0000000..228e728 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$开启自动活动.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$无敌.class b/out/production/A079/client/messages/commands/AdminCommand$无敌.class new file mode 100644 index 0000000..b847f97 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$无敌.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$最近传送点.class b/out/production/A079/client/messages/commands/AdminCommand$最近传送点.class new file mode 100644 index 0000000..c3dceac Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$最近传送点.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$永久npc.class b/out/production/A079/client/messages/commands/AdminCommand$永久npc.class new file mode 100644 index 0000000..046fae2 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$永久npc.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$活动开始$1.class b/out/production/A079/client/messages/commands/AdminCommand$活动开始$1.class new file mode 100644 index 0000000..94f6f9b Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$活动开始$1.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$活动开始.class b/out/production/A079/client/messages/commands/AdminCommand$活动开始.class new file mode 100644 index 0000000..b29b511 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$活动开始.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$测谎所有人.class b/out/production/A079/client/messages/commands/AdminCommand$测谎所有人.class new file mode 100644 index 0000000..b87fb7c Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$测谎所有人.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$清理内存.class b/out/production/A079/client/messages/commands/AdminCommand$清理内存.class new file mode 100644 index 0000000..47d35a2 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$清理内存.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$给FB积分.class b/out/production/A079/client/messages/commands/AdminCommand$给FB积分.class new file mode 100644 index 0000000..2f7ea86 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$给FB积分.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$给地图人点数.class b/out/production/A079/client/messages/commands/AdminCommand$给地图人点数.class new file mode 100644 index 0000000..aef044c Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$给地图人点数.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$给地图人红利.class b/out/production/A079/client/messages/commands/AdminCommand$给地图人红利.class new file mode 100644 index 0000000..bcd9fe2 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$给地图人红利.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$给地图人金币.class b/out/production/A079/client/messages/commands/AdminCommand$给地图人金币.class new file mode 100644 index 0000000..9871253 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$给地图人金币.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$给所有人点数.class b/out/production/A079/client/messages/commands/AdminCommand$给所有人点数.class new file mode 100644 index 0000000..a326bca Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$给所有人点数.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$给所有人道具.class b/out/production/A079/client/messages/commands/AdminCommand$给所有人道具.class new file mode 100644 index 0000000..a873419 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$给所有人道具.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$给抵用.class b/out/production/A079/client/messages/commands/AdminCommand$给抵用.class new file mode 100644 index 0000000..bb30437 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$给抵用.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$给推广积分.class b/out/production/A079/client/messages/commands/AdminCommand$给推广积分.class new file mode 100644 index 0000000..ff21943 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$给推广积分.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$给点数.class b/out/production/A079/client/messages/commands/AdminCommand$给点数.class new file mode 100644 index 0000000..1c0f817 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$给点数.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand$选择活动.class b/out/production/A079/client/messages/commands/AdminCommand$选择活动.class new file mode 100644 index 0000000..4d3abf4 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand$选择活动.class differ diff --git a/out/production/A079/client/messages/commands/AdminCommand.class b/out/production/A079/client/messages/commands/AdminCommand.class new file mode 100644 index 0000000..7834f11 Binary files /dev/null and b/out/production/A079/client/messages/commands/AdminCommand.class differ diff --git a/out/production/A079/client/messages/commands/CommandExecute$ReturnValue.class b/out/production/A079/client/messages/commands/CommandExecute$ReturnValue.class new file mode 100644 index 0000000..cb3a465 Binary files /dev/null and b/out/production/A079/client/messages/commands/CommandExecute$ReturnValue.class differ diff --git a/out/production/A079/client/messages/commands/CommandExecute$TradeExecute.class b/out/production/A079/client/messages/commands/CommandExecute$TradeExecute.class new file mode 100644 index 0000000..e6ce7f7 Binary files /dev/null and b/out/production/A079/client/messages/commands/CommandExecute$TradeExecute.class differ diff --git a/out/production/A079/client/messages/commands/CommandExecute.class b/out/production/A079/client/messages/commands/CommandExecute.class new file mode 100644 index 0000000..87b85af Binary files /dev/null and b/out/production/A079/client/messages/commands/CommandExecute.class differ diff --git a/out/production/A079/client/messages/commands/CommandObject.class b/out/production/A079/client/messages/commands/CommandObject.class new file mode 100644 index 0000000..c2d8fa8 Binary files /dev/null and b/out/production/A079/client/messages/commands/CommandObject.class differ diff --git a/out/production/A079/client/messages/commands/ConsoleCommand.class b/out/production/A079/client/messages/commands/ConsoleCommand.class new file mode 100644 index 0000000..dbd6125 Binary files /dev/null and b/out/production/A079/client/messages/commands/ConsoleCommand.class differ diff --git a/out/production/A079/client/messages/commands/ConsoleCommandExecute.class b/out/production/A079/client/messages/commands/ConsoleCommandExecute.class new file mode 100644 index 0000000..38f3906 Binary files /dev/null and b/out/production/A079/client/messages/commands/ConsoleCommandExecute.class differ diff --git a/out/production/A079/client/messages/commands/ConsoleCommandObject.class b/out/production/A079/client/messages/commands/ConsoleCommandObject.class new file mode 100644 index 0000000..500c580 Binary files /dev/null and b/out/production/A079/client/messages/commands/ConsoleCommandObject.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$AP.class b/out/production/A079/client/messages/commands/GMCommand$AP.class new file mode 100644 index 0000000..d81a7a3 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$AP.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$CancelBuffs.class b/out/production/A079/client/messages/commands/GMCommand$CancelBuffs.class new file mode 100644 index 0000000..fbfe55f Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$CancelBuffs.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$ClearSkills.class b/out/production/A079/client/messages/commands/GMCommand$ClearSkills.class new file mode 100644 index 0000000..313e342 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$ClearSkills.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$Clock.class b/out/production/A079/client/messages/commands/GMCommand$Clock.class new file mode 100644 index 0000000..9467a96 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$Clock.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$CompleteQuest.class b/out/production/A079/client/messages/commands/GMCommand$CompleteQuest.class new file mode 100644 index 0000000..c98d20c Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$CompleteQuest.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$DestroyReactor.class b/out/production/A079/client/messages/commands/GMCommand$DestroyReactor.class new file mode 100644 index 0000000..d03a64a Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$DestroyReactor.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$DropRate.class b/out/production/A079/client/messages/commands/GMCommand$DropRate.class new file mode 100644 index 0000000..f4b38af Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$DropRate.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$ExpRate.class b/out/production/A079/client/messages/commands/GMCommand$ExpRate.class new file mode 100644 index 0000000..bda46ed Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$ExpRate.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$FCompleteOther.class b/out/production/A079/client/messages/commands/GMCommand$FCompleteOther.class new file mode 100644 index 0000000..5d8cd31 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$FCompleteOther.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$FCompleteQuest.class b/out/production/A079/client/messages/commands/GMCommand$FCompleteQuest.class new file mode 100644 index 0000000..d854c9f Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$FCompleteQuest.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$FStartOther.class b/out/production/A079/client/messages/commands/GMCommand$FStartOther.class new file mode 100644 index 0000000..9b83051 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$FStartOther.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$FStartQuest.class b/out/production/A079/client/messages/commands/GMCommand$FStartQuest.class new file mode 100644 index 0000000..9a9eb70 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$FStartQuest.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$FakeRelog.class b/out/production/A079/client/messages/commands/GMCommand$FakeRelog.class new file mode 100644 index 0000000..4cfce90 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$FakeRelog.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$GiveSP.class b/out/production/A079/client/messages/commands/GMCommand$GiveSP.class new file mode 100644 index 0000000..844da9f Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$GiveSP.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$GiveSkill.class b/out/production/A079/client/messages/commands/GMCommand$GiveSkill.class new file mode 100644 index 0000000..e37c62c Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$GiveSkill.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$GoTo.class b/out/production/A079/client/messages/commands/GMCommand$GoTo.class new file mode 100644 index 0000000..3681b86 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$GoTo.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$HReactor.class b/out/production/A079/client/messages/commands/GMCommand$HReactor.class new file mode 100644 index 0000000..140ec13 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$HReactor.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$Kill.class b/out/production/A079/client/messages/commands/GMCommand$Kill.class new file mode 100644 index 0000000..86572c0 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$Kill.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$KillAll.class b/out/production/A079/client/messages/commands/GMCommand$KillAll.class new file mode 100644 index 0000000..c9e667e Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$KillAll.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$KillID.class b/out/production/A079/client/messages/commands/GMCommand$KillID.class new file mode 100644 index 0000000..e97ed2b Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$KillID.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$KillMonster.class b/out/production/A079/client/messages/commands/GMCommand$KillMonster.class new file mode 100644 index 0000000..460067c Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$KillMonster.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$Killalldrops.class b/out/production/A079/client/messages/commands/GMCommand$Killalldrops.class new file mode 100644 index 0000000..780eac0 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$Killalldrops.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$Letter.class b/out/production/A079/client/messages/commands/GMCommand$Letter.class new file mode 100644 index 0000000..af57bba Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$Letter.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$LevelUp.class b/out/production/A079/client/messages/commands/GMCommand$LevelUp.class new file mode 100644 index 0000000..36af9f7 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$LevelUp.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$LookNPCs.class b/out/production/A079/client/messages/commands/GMCommand$LookNPCs.class new file mode 100644 index 0000000..9ea3371 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$LookNPCs.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$LookPortals.class b/out/production/A079/client/messages/commands/GMCommand$LookPortals.class new file mode 100644 index 0000000..dabf99a Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$LookPortals.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$LookReactors.class b/out/production/A079/client/messages/commands/GMCommand$LookReactors.class new file mode 100644 index 0000000..aa7624e Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$LookReactors.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$LowHP.class b/out/production/A079/client/messages/commands/GMCommand$LowHP.class new file mode 100644 index 0000000..93dd15a Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$LowHP.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$Marry.class b/out/production/A079/client/messages/commands/GMCommand$Marry.class new file mode 100644 index 0000000..a3697fb Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$Marry.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$MaxSkills.class b/out/production/A079/client/messages/commands/GMCommand$MaxSkills.class new file mode 100644 index 0000000..51ab4e5 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$MaxSkills.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$MesoRate.class b/out/production/A079/client/messages/commands/GMCommand$MesoRate.class new file mode 100644 index 0000000..15e0056 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$MesoRate.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$MobDrop.class b/out/production/A079/client/messages/commands/GMCommand$MobDrop.class new file mode 100644 index 0000000..655da22 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$MobDrop.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$MyPos.class b/out/production/A079/client/messages/commands/GMCommand$MyPos.class new file mode 100644 index 0000000..2dddcca Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$MyPos.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$NearestPortal.class b/out/production/A079/client/messages/commands/GMCommand$NearestPortal.class new file mode 100644 index 0000000..323e0cf Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$NearestPortal.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$Notice.class b/out/production/A079/client/messages/commands/GMCommand$Notice.class new file mode 100644 index 0000000..892903e Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$Notice.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$NpcNotice.class b/out/production/A079/client/messages/commands/GMCommand$NpcNotice.class new file mode 100644 index 0000000..171fa71 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$NpcNotice.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$ReloadCS.class b/out/production/A079/client/messages/commands/GMCommand$ReloadCS.class new file mode 100644 index 0000000..9595ec6 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$ReloadCS.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$ReloadDrops.class b/out/production/A079/client/messages/commands/GMCommand$ReloadDrops.class new file mode 100644 index 0000000..6d5dae5 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$ReloadDrops.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$ReloadEvents.class b/out/production/A079/client/messages/commands/GMCommand$ReloadEvents.class new file mode 100644 index 0000000..557248b Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$ReloadEvents.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$ReloadFishing.class b/out/production/A079/client/messages/commands/GMCommand$ReloadFishing.class new file mode 100644 index 0000000..20edc07 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$ReloadFishing.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$ReloadLife.class b/out/production/A079/client/messages/commands/GMCommand$ReloadLife.class new file mode 100644 index 0000000..493b101 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$ReloadLife.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$ReloadOX.class b/out/production/A079/client/messages/commands/GMCommand$ReloadOX.class new file mode 100644 index 0000000..6455a8d Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$ReloadOX.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$ReloadOps.class b/out/production/A079/client/messages/commands/GMCommand$ReloadOps.class new file mode 100644 index 0000000..331489e Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$ReloadOps.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$ReloadPortals.class b/out/production/A079/client/messages/commands/GMCommand$ReloadPortals.class new file mode 100644 index 0000000..2311b55 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$ReloadPortals.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$ReloadQuests.class b/out/production/A079/client/messages/commands/GMCommand$ReloadQuests.class new file mode 100644 index 0000000..ef95fc2 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$ReloadQuests.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$ReloadShops.class b/out/production/A079/client/messages/commands/GMCommand$ReloadShops.class new file mode 100644 index 0000000..b29efb0 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$ReloadShops.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$Reloadall.class b/out/production/A079/client/messages/commands/GMCommand$Reloadall.class new file mode 100644 index 0000000..900f7e4 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$Reloadall.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$RemoveDrops.class b/out/production/A079/client/messages/commands/GMCommand$RemoveDrops.class new file mode 100644 index 0000000..0f33a2d Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$RemoveDrops.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$RemoveItem.class b/out/production/A079/client/messages/commands/GMCommand$RemoveItem.class new file mode 100644 index 0000000..2a12917 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$RemoveItem.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$RemoveItemOff.class b/out/production/A079/client/messages/commands/GMCommand$RemoveItemOff.class new file mode 100644 index 0000000..a59c01a Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$RemoveItemOff.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$RemoveNPCs.class b/out/production/A079/client/messages/commands/GMCommand$RemoveNPCs.class new file mode 100644 index 0000000..ceca024 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$RemoveNPCs.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$ResetQuest.class b/out/production/A079/client/messages/commands/GMCommand$ResetQuest.class new file mode 100644 index 0000000..1cd4624 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$ResetQuest.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$ResetReactors.class b/out/production/A079/client/messages/commands/GMCommand$ResetReactors.class new file mode 100644 index 0000000..9b2debb Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$ResetReactors.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$SP.class b/out/production/A079/client/messages/commands/GMCommand$SP.class new file mode 100644 index 0000000..555c856 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$SP.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$SaveAll.class b/out/production/A079/client/messages/commands/GMCommand$SaveAll.class new file mode 100644 index 0000000..1d34abd Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$SaveAll.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$Say.class b/out/production/A079/client/messages/commands/GMCommand$Say.class new file mode 100644 index 0000000..196e67e Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$Say.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$SetReactor.class b/out/production/A079/client/messages/commands/GMCommand$SetReactor.class new file mode 100644 index 0000000..da5de1c Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$SetReactor.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$Shop.class b/out/production/A079/client/messages/commands/GMCommand$Shop.class new file mode 100644 index 0000000..5b266b1 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$Shop.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$Shutdown.class b/out/production/A079/client/messages/commands/GMCommand$Shutdown.class new file mode 100644 index 0000000..661c0c1 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$Shutdown.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$ShutdownTime$1.class b/out/production/A079/client/messages/commands/GMCommand$ShutdownTime$1.class new file mode 100644 index 0000000..e828bdd Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$ShutdownTime$1.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$ShutdownTime.class b/out/production/A079/client/messages/commands/GMCommand$ShutdownTime.class new file mode 100644 index 0000000..dbb3c32 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$ShutdownTime.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$Skill.class b/out/production/A079/client/messages/commands/GMCommand$Skill.class new file mode 100644 index 0000000..78ee47e Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$Skill.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$Song.class b/out/production/A079/client/messages/commands/GMCommand$Song.class new file mode 100644 index 0000000..a0ef997 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$Song.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$SpawnDebug.class b/out/production/A079/client/messages/commands/GMCommand$SpawnDebug.class new file mode 100644 index 0000000..8501c1e Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$SpawnDebug.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$SpawnReactor.class b/out/production/A079/client/messages/commands/GMCommand$SpawnReactor.class new file mode 100644 index 0000000..08948bf Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$SpawnReactor.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$Speak.class b/out/production/A079/client/messages/commands/GMCommand$Speak.class new file mode 100644 index 0000000..4e5f129 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$Speak.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$SpeakChannel.class b/out/production/A079/client/messages/commands/GMCommand$SpeakChannel.class new file mode 100644 index 0000000..50ca62d Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$SpeakChannel.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$SpeakMap.class b/out/production/A079/client/messages/commands/GMCommand$SpeakMap.class new file mode 100644 index 0000000..7f8b93a Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$SpeakMap.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$SpeakMega.class b/out/production/A079/client/messages/commands/GMCommand$SpeakMega.class new file mode 100644 index 0000000..e9bc94b Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$SpeakMega.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$SpeakWorld.class b/out/production/A079/client/messages/commands/GMCommand$SpeakWorld.class new file mode 100644 index 0000000..be133e4 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$SpeakWorld.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$StartQuest.class b/out/production/A079/client/messages/commands/GMCommand$StartQuest.class new file mode 100644 index 0000000..a8472fb Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$StartQuest.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$TempBan.class b/out/production/A079/client/messages/commands/GMCommand$TempBan.class new file mode 100644 index 0000000..3466d16 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$TempBan.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$UnbanIP.class b/out/production/A079/client/messages/commands/GMCommand$UnbanIP.class new file mode 100644 index 0000000..1567412 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$UnbanIP.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$UnlockInv.class b/out/production/A079/client/messages/commands/GMCommand$UnlockInv.class new file mode 100644 index 0000000..e5e3b88 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$UnlockInv.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$UpdateMap.class b/out/production/A079/client/messages/commands/GMCommand$UpdateMap.class new file mode 100644 index 0000000..40c4257 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$UpdateMap.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$Y.class b/out/production/A079/client/messages/commands/GMCommand$Y.class new file mode 100644 index 0000000..b66dd39 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$Y.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$Yellow.class b/out/production/A079/client/messages/commands/GMCommand$Yellow.class new file mode 100644 index 0000000..a9f97b6 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$Yellow.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$autoreg.class b/out/production/A079/client/messages/commands/GMCommand$autoreg.class new file mode 100644 index 0000000..1ad3214 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$autoreg.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$cleardrops.class b/out/production/A079/client/messages/commands/GMCommand$cleardrops.class new file mode 100644 index 0000000..39a2469 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$cleardrops.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$copyAll.class b/out/production/A079/client/messages/commands/GMCommand$copyAll.class new file mode 100644 index 0000000..429e3eb Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$copyAll.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$copyInv.class b/out/production/A079/client/messages/commands/GMCommand$copyInv.class new file mode 100644 index 0000000..ca9ddcd Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$copyInv.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$discounied.class b/out/production/A079/client/messages/commands/GMCommand$discounied.class new file mode 100644 index 0000000..9b019de Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$discounied.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$fh.class b/out/production/A079/client/messages/commands/GMCommand$fh.class new file mode 100644 index 0000000..28356c2 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$fh.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$log.class b/out/production/A079/client/messages/commands/GMCommand$log.class new file mode 100644 index 0000000..a1347f9 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$log.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$logindoor.class b/out/production/A079/client/messages/commands/GMCommand$logindoor.class new file mode 100644 index 0000000..59be71a Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$logindoor.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$nmgb.class b/out/production/A079/client/messages/commands/GMCommand$nmgb.class new file mode 100644 index 0000000..ffc4425 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$nmgb.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$opennpc.class b/out/production/A079/client/messages/commands/GMCommand$opennpc.class new file mode 100644 index 0000000..57f9776 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$opennpc.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$pvp.class b/out/production/A079/client/messages/commands/GMCommand$pvp.class new file mode 100644 index 0000000..1e001ef Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$pvp.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$setRate.class b/out/production/A079/client/messages/commands/GMCommand$setRate.class new file mode 100644 index 0000000..c7e6f36 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$setRate.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$spmap.class b/out/production/A079/client/messages/commands/GMCommand$spmap.class new file mode 100644 index 0000000..3655a97 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$spmap.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$丟弃物品讯息.class b/out/production/A079/client/messages/commands/GMCommand$丟弃物品讯息.class new file mode 100644 index 0000000..c9739cf Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$丟弃物品讯息.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$人数灌水百分比.class b/out/production/A079/client/messages/commands/GMCommand$人数灌水百分比.class new file mode 100644 index 0000000..4b84257 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$人数灌水百分比.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$修改人气商品.class b/out/production/A079/client/messages/commands/GMCommand$修改人气商品.class new file mode 100644 index 0000000..8127a4c Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$修改人气商品.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$公告.class b/out/production/A079/client/messages/commands/GMCommand$公告.class new file mode 100644 index 0000000..b129ad5 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$公告.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$关鍵时刻$1.class b/out/production/A079/client/messages/commands/GMCommand$关鍵时刻$1.class new file mode 100644 index 0000000..cdd56dc Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$关鍵时刻$1.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$关鍵时刻.class b/out/production/A079/client/messages/commands/GMCommand$关鍵时刻.class new file mode 100644 index 0000000..dcc89cf Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$关鍵时刻.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$关闭服务器.class b/out/production/A079/client/messages/commands/GMCommand$关闭服务器.class new file mode 100644 index 0000000..7804b7b Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$关闭服务器.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$关闭服务器时间.class b/out/production/A079/client/messages/commands/GMCommand$关闭服务器时间.class new file mode 100644 index 0000000..c340af9 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$关闭服务器时间.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$关闭蘑菇活动.class b/out/production/A079/client/messages/commands/GMCommand$关闭蘑菇活动.class new file mode 100644 index 0000000..ab932fb Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$关闭蘑菇活动.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$分享奖励.class b/out/production/A079/client/messages/commands/GMCommand$分享奖励.class new file mode 100644 index 0000000..cce02b2 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$分享奖励.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$刷新地图.class b/out/production/A079/client/messages/commands/GMCommand$刷新地图.class new file mode 100644 index 0000000..6ccc4d8 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$刷新地图.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$刷新地图1.class b/out/production/A079/client/messages/commands/GMCommand$刷新地图1.class new file mode 100644 index 0000000..26388cb Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$刷新地图1.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$加入公会.class b/out/production/A079/client/messages/commands/GMCommand$加入公会.class new file mode 100644 index 0000000..d0ce068 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$加入公会.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$匿名广播.class b/out/production/A079/client/messages/commands/GMCommand$匿名广播.class new file mode 100644 index 0000000..071b91d Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$匿名广播.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$升级.class b/out/production/A079/client/messages/commands/GMCommand$升级.class new file mode 100644 index 0000000..160b6bb Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$升级.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$召唤怪物.class b/out/production/A079/client/messages/commands/GMCommand$召唤怪物.class new file mode 100644 index 0000000..78645cd Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$召唤怪物.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$启动蘑菇活动.class b/out/production/A079/client/messages/commands/GMCommand$启动蘑菇活动.class new file mode 100644 index 0000000..aa499e1 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$启动蘑菇活动.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$商城打折.class b/out/production/A079/client/messages/commands/GMCommand$商城打折.class new file mode 100644 index 0000000..da1ac70 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$商城打折.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$处理洗道具.class b/out/production/A079/client/messages/commands/GMCommand$处理洗道具.class new file mode 100644 index 0000000..172b98b Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$处理洗道具.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$复活.class b/out/production/A079/client/messages/commands/GMCommand$复活.class new file mode 100644 index 0000000..20f0547 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$复活.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$头頂公告.class b/out/production/A079/client/messages/commands/GMCommand$头頂公告.class new file mode 100644 index 0000000..bd51d74 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$头頂公告.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$定时测谎.class b/out/production/A079/client/messages/commands/GMCommand$定时测谎.class new file mode 100644 index 0000000..bfeaca1 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$定时测谎.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$封包输出.class b/out/production/A079/client/messages/commands/GMCommand$封包输出.class new file mode 100644 index 0000000..f1dfb3c Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$封包输出.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$掉宝倍率.class b/out/production/A079/client/messages/commands/GMCommand$掉宝倍率.class new file mode 100644 index 0000000..b0c9bba Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$掉宝倍率.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$推文.class b/out/production/A079/client/messages/commands/GMCommand$推文.class new file mode 100644 index 0000000..562de82 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$推文.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$改名字.class b/out/production/A079/client/messages/commands/GMCommand$改名字.class new file mode 100644 index 0000000..7b97212 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$改名字.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$文件封包.class b/out/production/A079/client/messages/commands/GMCommand$文件封包.class new file mode 100644 index 0000000..e69220f Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$文件封包.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$无延迟讯息.class b/out/production/A079/client/messages/commands/GMCommand$无延迟讯息.class new file mode 100644 index 0000000..b74cfac Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$无延迟讯息.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$查看当前地图信息.class b/out/production/A079/client/messages/commands/GMCommand$查看当前地图信息.class new file mode 100644 index 0000000..1f3405b Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$查看当前地图信息.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$查询洗道具.class b/out/production/A079/client/messages/commands/GMCommand$查询洗道具.class new file mode 100644 index 0000000..3be132b Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$查询洗道具.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$测谎玩家.class b/out/production/A079/client/messages/commands/GMCommand$测谎玩家.class new file mode 100644 index 0000000..f20e892 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$测谎玩家.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$添加aclog.class b/out/production/A079/client/messages/commands/GMCommand$添加aclog.class new file mode 100644 index 0000000..1f65f25 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$添加aclog.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$添加危险账号.class b/out/production/A079/client/messages/commands/GMCommand$添加危险账号.class new file mode 100644 index 0000000..df7a49e Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$添加危险账号.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$添加角色危险IP.class b/out/production/A079/client/messages/commands/GMCommand$添加角色危险IP.class new file mode 100644 index 0000000..577686a Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$添加角色危险IP.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$清怪.class b/out/production/A079/client/messages/commands/GMCommand$清怪.class new file mode 100644 index 0000000..a9025a8 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$清怪.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$清除地面道具.class b/out/production/A079/client/messages/commands/GMCommand$清除地面道具.class new file mode 100644 index 0000000..0c8b39d Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$清除地面道具.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$爆率.class b/out/production/A079/client/messages/commands/GMCommand$爆率.class new file mode 100644 index 0000000..dfe0ada Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$爆率.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$禁止使用玩家商店.class b/out/production/A079/client/messages/commands/GMCommand$禁止使用玩家商店.class new file mode 100644 index 0000000..b909887 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$禁止使用玩家商店.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$禁止使用精灵商店.class b/out/production/A079/client/messages/commands/GMCommand$禁止使用精灵商店.class new file mode 100644 index 0000000..c88a7d2 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$禁止使用精灵商店.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$禁止玩家使用.class b/out/production/A079/client/messages/commands/GMCommand$禁止玩家使用.class new file mode 100644 index 0000000..20f1b33 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$禁止玩家使用.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$离婚.class b/out/production/A079/client/messages/commands/GMCommand$离婚.class new file mode 100644 index 0000000..3f6b017 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$离婚.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$经验倍率.class b/out/production/A079/client/messages/commands/GMCommand$经验倍率.class new file mode 100644 index 0000000..6a84abe Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$经验倍率.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$补领红利.class b/out/production/A079/client/messages/commands/GMCommand$补领红利.class new file mode 100644 index 0000000..a0bef29 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$补领红利.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$补领赞助.class b/out/production/A079/client/messages/commands/GMCommand$补领赞助.class new file mode 100644 index 0000000..6e0eec0 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$补领赞助.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$角色封包输出.class b/out/production/A079/client/messages/commands/GMCommand$角色封包输出.class new file mode 100644 index 0000000..6135b41 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$角色封包输出.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$重置少林脚本.class b/out/production/A079/client/messages/commands/GMCommand$重置少林脚本.class new file mode 100644 index 0000000..4ff2048 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$重置少林脚本.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$重载捉鬼任务.class b/out/production/A079/client/messages/commands/GMCommand$重载捉鬼任务.class new file mode 100644 index 0000000..c7b2cc4 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$重载捉鬼任务.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$金币倍率.class b/out/production/A079/client/messages/commands/GMCommand$金币倍率.class new file mode 100644 index 0000000..1c205e8 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$金币倍率.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$金币总量.class b/out/production/A079/client/messages/commands/GMCommand$金币总量.class new file mode 100644 index 0000000..fde2a22 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$金币总量.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$频道掉线测试.class b/out/production/A079/client/messages/commands/GMCommand$频道掉线测试.class new file mode 100644 index 0000000..36a3a58 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$频道掉线测试.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$高级检索.class b/out/production/A079/client/messages/commands/GMCommand$高级检索.class new file mode 100644 index 0000000..8daf309 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$高级检索.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand$龙王地图重制.class b/out/production/A079/client/messages/commands/GMCommand$龙王地图重制.class new file mode 100644 index 0000000..b52d346 Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand$龙王地图重制.class differ diff --git a/out/production/A079/client/messages/commands/GMCommand.class b/out/production/A079/client/messages/commands/GMCommand.class new file mode 100644 index 0000000..773454b Binary files /dev/null and b/out/production/A079/client/messages/commands/GMCommand.class differ diff --git a/out/production/A079/client/messages/commands/GodCommand$BanCommand.class b/out/production/A079/client/messages/commands/GodCommand$BanCommand.class new file mode 100644 index 0000000..1f2e22e Binary files /dev/null and b/out/production/A079/client/messages/commands/GodCommand$BanCommand.class differ diff --git a/out/production/A079/client/messages/commands/GodCommand$Buff.class b/out/production/A079/client/messages/commands/GodCommand$Buff.class new file mode 100644 index 0000000..a6db84e Binary files /dev/null and b/out/production/A079/client/messages/commands/GodCommand$Buff.class differ diff --git a/out/production/A079/client/messages/commands/GodCommand$Dex.class b/out/production/A079/client/messages/commands/GodCommand$Dex.class new file mode 100644 index 0000000..9a54c1e Binary files /dev/null and b/out/production/A079/client/messages/commands/GodCommand$Dex.class differ diff --git a/out/production/A079/client/messages/commands/GodCommand$HP.class b/out/production/A079/client/messages/commands/GodCommand$HP.class new file mode 100644 index 0000000..f0ac4e7 Binary files /dev/null and b/out/production/A079/client/messages/commands/GodCommand$HP.class differ diff --git a/out/production/A079/client/messages/commands/GodCommand$Int.class b/out/production/A079/client/messages/commands/GodCommand$Int.class new file mode 100644 index 0000000..179c210 Binary files /dev/null and b/out/production/A079/client/messages/commands/GodCommand$Int.class differ diff --git a/out/production/A079/client/messages/commands/GodCommand$Job.class b/out/production/A079/client/messages/commands/GodCommand$Job.class new file mode 100644 index 0000000..8e15cd3 Binary files /dev/null and b/out/production/A079/client/messages/commands/GodCommand$Job.class differ diff --git a/out/production/A079/client/messages/commands/GodCommand$Level.class b/out/production/A079/client/messages/commands/GodCommand$Level.class new file mode 100644 index 0000000..9cfc959 Binary files /dev/null and b/out/production/A079/client/messages/commands/GodCommand$Level.class differ diff --git a/out/production/A079/client/messages/commands/GodCommand$Luk.class b/out/production/A079/client/messages/commands/GodCommand$Luk.class new file mode 100644 index 0000000..7717786 Binary files /dev/null and b/out/production/A079/client/messages/commands/GodCommand$Luk.class differ diff --git a/out/production/A079/client/messages/commands/GodCommand$MP.class b/out/production/A079/client/messages/commands/GodCommand$MP.class new file mode 100644 index 0000000..1749c25 Binary files /dev/null and b/out/production/A079/client/messages/commands/GodCommand$MP.class differ diff --git a/out/production/A079/client/messages/commands/GodCommand$Maxstats.class b/out/production/A079/client/messages/commands/GodCommand$Maxstats.class new file mode 100644 index 0000000..53f7008 Binary files /dev/null and b/out/production/A079/client/messages/commands/GodCommand$Maxstats.class differ diff --git a/out/production/A079/client/messages/commands/GodCommand$MinStats.class b/out/production/A079/client/messages/commands/GodCommand$MinStats.class new file mode 100644 index 0000000..596ce04 Binary files /dev/null and b/out/production/A079/client/messages/commands/GodCommand$MinStats.class differ diff --git a/out/production/A079/client/messages/commands/GodCommand$Str.class b/out/production/A079/client/messages/commands/GodCommand$Str.class new file mode 100644 index 0000000..9f248aa Binary files /dev/null and b/out/production/A079/client/messages/commands/GodCommand$Str.class differ diff --git a/out/production/A079/client/messages/commands/GodCommand$face.class b/out/production/A079/client/messages/commands/GodCommand$face.class new file mode 100644 index 0000000..c6dc00b Binary files /dev/null and b/out/production/A079/client/messages/commands/GodCommand$face.class differ diff --git a/out/production/A079/client/messages/commands/GodCommand$hair.class b/out/production/A079/client/messages/commands/GodCommand$hair.class new file mode 100644 index 0000000..116f37a Binary files /dev/null and b/out/production/A079/client/messages/commands/GodCommand$hair.class differ diff --git a/out/production/A079/client/messages/commands/GodCommand$无敌.class b/out/production/A079/client/messages/commands/GodCommand$无敌.class new file mode 100644 index 0000000..9349e77 Binary files /dev/null and b/out/production/A079/client/messages/commands/GodCommand$无敌.class differ diff --git a/out/production/A079/client/messages/commands/GodCommand.class b/out/production/A079/client/messages/commands/GodCommand.class new file mode 100644 index 0000000..d1d6923 Binary files /dev/null and b/out/production/A079/client/messages/commands/GodCommand.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$CC.class b/out/production/A079/client/messages/commands/InternCommand$CC.class new file mode 100644 index 0000000..56f73e2 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$CC.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$ChangeChannel.class b/out/production/A079/client/messages/commands/InternCommand$ChangeChannel.class new file mode 100644 index 0000000..674237a Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$ChangeChannel.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$CharInfo.class b/out/production/A079/client/messages/commands/InternCommand$CharInfo.class new file mode 100644 index 0000000..e8a5197 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$CharInfo.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$Cheaters.class b/out/production/A079/client/messages/commands/InternCommand$Cheaters.class new file mode 100644 index 0000000..c04908a Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$Cheaters.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$CheckGash.class b/out/production/A079/client/messages/commands/InternCommand$CheckGash.class new file mode 100644 index 0000000..c6002a6 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$CheckGash.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$Connected.class b/out/production/A079/client/messages/commands/InternCommand$Connected.class new file mode 100644 index 0000000..ce897e1 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$Connected.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$Debug.class b/out/production/A079/client/messages/commands/InternCommand$Debug.class new file mode 100644 index 0000000..ca452d2 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$Debug.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$HellBan.class b/out/production/A079/client/messages/commands/InternCommand$HellBan.class new file mode 100644 index 0000000..c2a2006 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$HellBan.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$ItemCheck.class b/out/production/A079/client/messages/commands/InternCommand$ItemCheck.class new file mode 100644 index 0000000..9868cd0 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$ItemCheck.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$Map.class b/out/production/A079/client/messages/commands/InternCommand$Map.class new file mode 100644 index 0000000..6bfcd39 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$Map.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$Mute.class b/out/production/A079/client/messages/commands/InternCommand$Mute.class new file mode 100644 index 0000000..20d2789 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$Mute.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$MuteMap.class b/out/production/A079/client/messages/commands/InternCommand$MuteMap.class new file mode 100644 index 0000000..241dbd9 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$MuteMap.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$PlayerStats.class b/out/production/A079/client/messages/commands/InternCommand$PlayerStats.class new file mode 100644 index 0000000..38c7647 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$PlayerStats.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$WarpMap.class b/out/production/A079/client/messages/commands/InternCommand$WarpMap.class new file mode 100644 index 0000000..6333e47 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$WarpMap.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$closemap.class b/out/production/A079/client/messages/commands/InternCommand$closemap.class new file mode 100644 index 0000000..ae32b4c Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$closemap.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$openmap.class b/out/production/A079/client/messages/commands/InternCommand$openmap.class new file mode 100644 index 0000000..19f1421 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$openmap.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$spy.class b/out/production/A079/client/messages/commands/InternCommand$spy.class new file mode 100644 index 0000000..87df9a2 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$spy.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$spyid.class b/out/production/A079/client/messages/commands/InternCommand$spyid.class new file mode 100644 index 0000000..4a42db1 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$spyid.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$whoishere.class b/out/production/A079/client/messages/commands/InternCommand$whoishere.class new file mode 100644 index 0000000..15b8b61 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$whoishere.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$发勋章.class b/out/production/A079/client/messages/commands/InternCommand$发勋章.class new file mode 100644 index 0000000..ef2b82d Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$发勋章.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$查看玩家状态.class b/out/production/A079/client/messages/commands/InternCommand$查看玩家状态.class new file mode 100644 index 0000000..3760556 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$查看玩家状态.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$生死活动.class b/out/production/A079/client/messages/commands/InternCommand$生死活动.class new file mode 100644 index 0000000..3a5b464 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$生死活动.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand$角色讯息.class b/out/production/A079/client/messages/commands/InternCommand$角色讯息.class new file mode 100644 index 0000000..fa41d6b Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand$角色讯息.class differ diff --git a/out/production/A079/client/messages/commands/InternCommand.class b/out/production/A079/client/messages/commands/InternCommand.class new file mode 100644 index 0000000..a922655 Binary files /dev/null and b/out/production/A079/client/messages/commands/InternCommand.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$1.class b/out/production/A079/client/messages/commands/PlayerCommand$1.class new file mode 100644 index 0000000..b5f58f3 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$1.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$CGM.class b/out/production/A079/client/messages/commands/PlayerCommand$CGM.class new file mode 100644 index 0000000..421a290 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$CGM.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$DistributeStatCommands.class b/out/production/A079/client/messages/commands/PlayerCommand$DistributeStatCommands.class new file mode 100644 index 0000000..e3b2822 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$DistributeStatCommands.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$DropCash.class b/out/production/A079/client/messages/commands/PlayerCommand$DropCash.class new file mode 100644 index 0000000..f6068fe Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$DropCash.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$Gashponmega.class b/out/production/A079/client/messages/commands/PlayerCommand$Gashponmega.class new file mode 100644 index 0000000..8972d80 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$Gashponmega.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$Mapdrop.class b/out/production/A079/client/messages/commands/PlayerCommand$Mapdrop.class new file mode 100644 index 0000000..2b63ccb Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$Mapdrop.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$Mobdrop.class b/out/production/A079/client/messages/commands/PlayerCommand$Mobdrop.class new file mode 100644 index 0000000..f99b6d2 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$Mobdrop.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$OpenNPCCommand.class b/out/production/A079/client/messages/commands/PlayerCommand$OpenNPCCommand.class new file mode 100644 index 0000000..49515f6 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$OpenNPCCommand.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$TSmega.class b/out/production/A079/client/messages/commands/PlayerCommand$TSmega.class new file mode 100644 index 0000000..17a1028 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$TSmega.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$ea.class b/out/production/A079/client/messages/commands/PlayerCommand$ea.class new file mode 100644 index 0000000..6340fda Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$ea.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$event.class b/out/production/A079/client/messages/commands/PlayerCommand$event.class new file mode 100644 index 0000000..5489bdc Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$event.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$expfix.class b/out/production/A079/client/messages/commands/PlayerCommand$expfix.class new file mode 100644 index 0000000..6b1f2eb Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$expfix.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$help.class b/out/production/A079/client/messages/commands/PlayerCommand$help.class new file mode 100644 index 0000000..030c357 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$help.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$jcds.class b/out/production/A079/client/messages/commands/PlayerCommand$jcds.class new file mode 100644 index 0000000..0e3bad5 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$jcds.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$jk_hm.class b/out/production/A079/client/messages/commands/PlayerCommand$jk_hm.class new file mode 100644 index 0000000..3dc005f Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$jk_hm.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$jkzd.class b/out/production/A079/client/messages/commands/PlayerCommand$jkzd.class new file mode 100644 index 0000000..dd30ba9 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$jkzd.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$mob.class b/out/production/A079/client/messages/commands/PlayerCommand$mob.class new file mode 100644 index 0000000..e1543e5 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$mob.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$丟弃点装.class b/out/production/A079/client/messages/commands/PlayerCommand$丟弃点装.class new file mode 100644 index 0000000..f2d92a4 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$丟弃点装.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$丟装.class b/out/production/A079/client/messages/commands/PlayerCommand$丟装.class new file mode 100644 index 0000000..34582f3 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$丟装.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$全局爆率.class b/out/production/A079/client/messages/commands/PlayerCommand$全局爆率.class new file mode 100644 index 0000000..ddbbb3b Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$全局爆率.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$刷钱模式.class b/out/production/A079/client/messages/commands/PlayerCommand$刷钱模式.class new file mode 100644 index 0000000..d964aaa Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$刷钱模式.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$副本拉人$1.class b/out/production/A079/client/messages/commands/PlayerCommand$副本拉人$1.class new file mode 100644 index 0000000..8f3acd7 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$副本拉人$1.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$副本拉人.class b/out/production/A079/client/messages/commands/PlayerCommand$副本拉人.class new file mode 100644 index 0000000..68b4675 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$副本拉人.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$力量.class b/out/production/A079/client/messages/commands/PlayerCommand$力量.class new file mode 100644 index 0000000..8497bc3 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$力量.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$在线点数.class b/out/production/A079/client/messages/commands/PlayerCommand$在线点数.class new file mode 100644 index 0000000..a46389a Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$在线点数.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$帮助.class b/out/production/A079/client/messages/commands/PlayerCommand$帮助.class new file mode 100644 index 0000000..31278b0 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$帮助.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$怪物.class b/out/production/A079/client/messages/commands/PlayerCommand$怪物.class new file mode 100644 index 0000000..e7506a6 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$怪物.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$敏捷.class b/out/production/A079/client/messages/commands/PlayerCommand$敏捷.class new file mode 100644 index 0000000..90f17d1 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$敏捷.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$智力.class b/out/production/A079/client/messages/commands/PlayerCommand$智力.class new file mode 100644 index 0000000..53dd82f Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$智力.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$查看.class b/out/production/A079/client/messages/commands/PlayerCommand$查看.class new file mode 100644 index 0000000..b968a63 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$查看.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$清除道具.class b/out/production/A079/client/messages/commands/PlayerCommand$清除道具.class new file mode 100644 index 0000000..798103c Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$清除道具.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$爆率.class b/out/production/A079/client/messages/commands/PlayerCommand$爆率.class new file mode 100644 index 0000000..35a3ba4 Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$爆率.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$解卡.class b/out/production/A079/client/messages/commands/PlayerCommand$解卡.class new file mode 100644 index 0000000..d10d0ba Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$解卡.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$解卡组队.class b/out/production/A079/client/messages/commands/PlayerCommand$解卡组队.class new file mode 100644 index 0000000..bf13a9b Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$解卡组队.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand$运气.class b/out/production/A079/client/messages/commands/PlayerCommand$运气.class new file mode 100644 index 0000000..286d8fa Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand$运气.class differ diff --git a/out/production/A079/client/messages/commands/PlayerCommand.class b/out/production/A079/client/messages/commands/PlayerCommand.class new file mode 100644 index 0000000..b333f9c Binary files /dev/null and b/out/production/A079/client/messages/commands/PlayerCommand.class differ diff --git a/out/production/A079/client/messages/commands/PracticerCommand$Ban.class b/out/production/A079/client/messages/commands/PracticerCommand$Ban.class new file mode 100644 index 0000000..00cd7af Binary files /dev/null and b/out/production/A079/client/messages/commands/PracticerCommand$Ban.class differ diff --git a/out/production/A079/client/messages/commands/PracticerCommand$Warp.class b/out/production/A079/client/messages/commands/PracticerCommand$Warp.class new file mode 100644 index 0000000..3398295 Binary files /dev/null and b/out/production/A079/client/messages/commands/PracticerCommand$Warp.class differ diff --git a/out/production/A079/client/messages/commands/PracticerCommand$WarpHere.class b/out/production/A079/client/messages/commands/PracticerCommand$WarpHere.class new file mode 100644 index 0000000..b3f3824 Binary files /dev/null and b/out/production/A079/client/messages/commands/PracticerCommand$WarpHere.class differ diff --git a/out/production/A079/client/messages/commands/PracticerCommand$register.class b/out/production/A079/client/messages/commands/PracticerCommand$register.class new file mode 100644 index 0000000..03bdb62 Binary files /dev/null and b/out/production/A079/client/messages/commands/PracticerCommand$register.class differ diff --git a/out/production/A079/client/messages/commands/PracticerCommand$注册.class b/out/production/A079/client/messages/commands/PracticerCommand$注册.class new file mode 100644 index 0000000..4bf111e Binary files /dev/null and b/out/production/A079/client/messages/commands/PracticerCommand$注册.class differ diff --git a/out/production/A079/client/messages/commands/PracticerCommand$线上玩家.class b/out/production/A079/client/messages/commands/PracticerCommand$线上玩家.class new file mode 100644 index 0000000..52d6baa Binary files /dev/null and b/out/production/A079/client/messages/commands/PracticerCommand$线上玩家.class differ diff --git a/out/production/A079/client/messages/commands/PracticerCommand.class b/out/production/A079/client/messages/commands/PracticerCommand.class new file mode 100644 index 0000000..a73343a Binary files /dev/null and b/out/production/A079/client/messages/commands/PracticerCommand.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$Ban.class b/out/production/A079/client/messages/commands/SkilledCommand$Ban.class new file mode 100644 index 0000000..532f728 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$Ban.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$BanID.class b/out/production/A079/client/messages/commands/SkilledCommand$BanID.class new file mode 100644 index 0000000..cb46a00 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$BanID.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$BanStatus.class b/out/production/A079/client/messages/commands/SkilledCommand$BanStatus.class new file mode 100644 index 0000000..f06ad1a Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$BanStatus.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$CnGM.class b/out/production/A079/client/messages/commands/SkilledCommand$CnGM.class new file mode 100644 index 0000000..1cb98cb Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$CnGM.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$DC.class b/out/production/A079/client/messages/commands/SkilledCommand$DC.class new file mode 100644 index 0000000..069c981 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$DC.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$DCID.class b/out/production/A079/client/messages/commands/SkilledCommand$DCID.class new file mode 100644 index 0000000..b35677b Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$DCID.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$FakeReport.class b/out/production/A079/client/messages/commands/SkilledCommand$FakeReport.class new file mode 100644 index 0000000..53f4c43 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$FakeReport.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$Heal.class b/out/production/A079/client/messages/commands/SkilledCommand$Heal.class new file mode 100644 index 0000000..2b9dea6 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$Heal.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$HealMap.class b/out/production/A079/client/messages/commands/SkilledCommand$HealMap.class new file mode 100644 index 0000000..ac51d8c Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$HealMap.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$Hide.class b/out/production/A079/client/messages/commands/SkilledCommand$Hide.class new file mode 100644 index 0000000..367c654 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$Hide.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$UnBan.class b/out/production/A079/client/messages/commands/SkilledCommand$UnBan.class new file mode 100644 index 0000000..2ea3c42 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$UnBan.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$UnHellBan.class b/out/production/A079/client/messages/commands/SkilledCommand$UnHellBan.class new file mode 100644 index 0000000..4b8a61d Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$UnHellBan.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$UnHide.class b/out/production/A079/client/messages/commands/SkilledCommand$UnHide.class new file mode 100644 index 0000000..d402095 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$UnHide.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$WarpID.class b/out/production/A079/client/messages/commands/SkilledCommand$WarpID.class new file mode 100644 index 0000000..4ceb158 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$WarpID.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$WarpT.class b/out/production/A079/client/messages/commands/SkilledCommand$WarpT.class new file mode 100644 index 0000000..6ba4786 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$WarpT.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$WhereAmI.class b/out/production/A079/client/messages/commands/SkilledCommand$WhereAmI.class new file mode 100644 index 0000000..75bb4c6 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$WhereAmI.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$Whoshere.class b/out/production/A079/client/messages/commands/SkilledCommand$Whoshere.class new file mode 100644 index 0000000..66220a6 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$Whoshere.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$banMac.class b/out/production/A079/client/messages/commands/SkilledCommand$banMac.class new file mode 100644 index 0000000..65eea1d Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$banMac.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$online.class b/out/production/A079/client/messages/commands/SkilledCommand$online.class new file mode 100644 index 0000000..ceda618 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$online.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$onlineGM.class b/out/production/A079/client/messages/commands/SkilledCommand$onlineGM.class new file mode 100644 index 0000000..2e6b979 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$onlineGM.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$个人公告.class b/out/production/A079/client/messages/commands/SkilledCommand$个人公告.class new file mode 100644 index 0000000..aa92aee Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$个人公告.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$全频道地图人数.class b/out/production/A079/client/messages/commands/SkilledCommand$全频道地图人数.class new file mode 100644 index 0000000..40ff145 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$全频道地图人数.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$公会聊天.class b/out/production/A079/client/messages/commands/SkilledCommand$公会聊天.class new file mode 100644 index 0000000..f5a7ad4 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$公会聊天.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$卡登处理.class b/out/production/A079/client/messages/commands/SkilledCommand$卡登处理.class new file mode 100644 index 0000000..cce58f4 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$卡登处理.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$吸怪自动传送.class b/out/production/A079/client/messages/commands/SkilledCommand$吸怪自动传送.class new file mode 100644 index 0000000..dfe05da Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$吸怪自动传送.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$吸怪讯息.class b/out/production/A079/client/messages/commands/SkilledCommand$吸怪讯息.class new file mode 100644 index 0000000..a5059ab Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$吸怪讯息.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$商城DC.class b/out/production/A079/client/messages/commands/SkilledCommand$商城DC.class new file mode 100644 index 0000000..0a25699 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$商城DC.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$商城DC2.class b/out/production/A079/client/messages/commands/SkilledCommand$商城DC2.class new file mode 100644 index 0000000..c1379ba Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$商城DC2.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$好友聊天.class b/out/production/A079/client/messages/commands/SkilledCommand$好友聊天.class new file mode 100644 index 0000000..8365542 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$好友聊天.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$特殊DC.class b/out/production/A079/client/messages/commands/SkilledCommand$特殊DC.class new file mode 100644 index 0000000..fb40e1f Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$特殊DC.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$特殊商城DC.class b/out/production/A079/client/messages/commands/SkilledCommand$特殊商城DC.class new file mode 100644 index 0000000..4064673 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$特殊商城DC.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$特殊商城DC2.class b/out/production/A079/client/messages/commands/SkilledCommand$特殊商城DC2.class new file mode 100644 index 0000000..ffe380a Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$特殊商城DC2.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$特殊频道DC.class b/out/production/A079/client/messages/commands/SkilledCommand$特殊频道DC.class new file mode 100644 index 0000000..bd1a987 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$特殊频道DC.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$玩家密语.class b/out/production/A079/client/messages/commands/SkilledCommand$玩家密语.class new file mode 100644 index 0000000..16765f8 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$玩家密语.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$玩家私聊.class b/out/production/A079/client/messages/commands/SkilledCommand$玩家私聊.class new file mode 100644 index 0000000..e81d56e Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$玩家私聊.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$精灵商人讯息.class b/out/production/A079/client/messages/commands/SkilledCommand$精灵商人讯息.class new file mode 100644 index 0000000..c78f276 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$精灵商人讯息.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$联盟聊天.class b/out/production/A079/client/messages/commands/SkilledCommand$联盟聊天.class new file mode 100644 index 0000000..51c56eb Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$联盟聊天.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$队伍聊天.class b/out/production/A079/client/messages/commands/SkilledCommand$队伍聊天.class new file mode 100644 index 0000000..57ccff8 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$队伍聊天.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$频道DC.class b/out/production/A079/client/messages/commands/SkilledCommand$频道DC.class new file mode 100644 index 0000000..f362c66 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$频道DC.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand$黑单.class b/out/production/A079/client/messages/commands/SkilledCommand$黑单.class new file mode 100644 index 0000000..c51b213 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand$黑单.class differ diff --git a/out/production/A079/client/messages/commands/SkilledCommand.class b/out/production/A079/client/messages/commands/SkilledCommand.class new file mode 100644 index 0000000..ced2126 Binary files /dev/null and b/out/production/A079/client/messages/commands/SkilledCommand.class differ diff --git a/out/production/A079/client/messages/commands/vip/Vip1Command.class b/out/production/A079/client/messages/commands/vip/Vip1Command.class new file mode 100644 index 0000000..0095d3e Binary files /dev/null and b/out/production/A079/client/messages/commands/vip/Vip1Command.class differ diff --git a/out/production/A079/client/messages/commands/vip/Vip2Command.class b/out/production/A079/client/messages/commands/vip/Vip2Command.class new file mode 100644 index 0000000..0a99912 Binary files /dev/null and b/out/production/A079/client/messages/commands/vip/Vip2Command.class differ diff --git a/out/production/A079/client/messages/commands/vip/Vip3Command.class b/out/production/A079/client/messages/commands/vip/Vip3Command.class new file mode 100644 index 0000000..3819baf Binary files /dev/null and b/out/production/A079/client/messages/commands/vip/Vip3Command.class differ diff --git a/out/production/A079/client/messages/commands/vip/Vip4Command.class b/out/production/A079/client/messages/commands/vip/Vip4Command.class new file mode 100644 index 0000000..da00ca2 Binary files /dev/null and b/out/production/A079/client/messages/commands/vip/Vip4Command.class differ diff --git a/out/production/A079/client/messages/commands/vip/Vip5Command.class b/out/production/A079/client/messages/commands/vip/Vip5Command.class new file mode 100644 index 0000000..630fb66 Binary files /dev/null and b/out/production/A079/client/messages/commands/vip/Vip5Command.class differ diff --git a/out/production/A079/client/status/MonsterStatus$1.class b/out/production/A079/client/status/MonsterStatus$1.class new file mode 100644 index 0000000..06401e4 Binary files /dev/null and b/out/production/A079/client/status/MonsterStatus$1.class differ diff --git a/out/production/A079/client/status/MonsterStatus.class b/out/production/A079/client/status/MonsterStatus.class new file mode 100644 index 0000000..41b7254 Binary files /dev/null and b/out/production/A079/client/status/MonsterStatus.class differ diff --git a/out/production/A079/client/status/MonsterStatusEffect$1.class b/out/production/A079/client/status/MonsterStatusEffect$1.class new file mode 100644 index 0000000..c161327 Binary files /dev/null and b/out/production/A079/client/status/MonsterStatusEffect$1.class differ diff --git a/out/production/A079/client/status/MonsterStatusEffect$2.class b/out/production/A079/client/status/MonsterStatusEffect$2.class new file mode 100644 index 0000000..7857f75 Binary files /dev/null and b/out/production/A079/client/status/MonsterStatusEffect$2.class differ diff --git a/out/production/A079/client/status/MonsterStatusEffect.class b/out/production/A079/client/status/MonsterStatusEffect.class new file mode 100644 index 0000000..e8856d3 Binary files /dev/null and b/out/production/A079/client/status/MonsterStatusEffect.class differ diff --git a/out/production/A079/constants/AuthServerNamecpu.class b/out/production/A079/constants/AuthServerNamecpu.class new file mode 100644 index 0000000..2f78df4 Binary files /dev/null and b/out/production/A079/constants/AuthServerNamecpu.class differ diff --git a/out/production/A079/constants/Balloon.class b/out/production/A079/constants/Balloon.class new file mode 100644 index 0000000..1f49d19 Binary files /dev/null and b/out/production/A079/constants/Balloon.class differ diff --git a/out/production/A079/constants/BeansConstants.class b/out/production/A079/constants/BeansConstants.class new file mode 100644 index 0000000..b3eaba6 Binary files /dev/null and b/out/production/A079/constants/BeansConstants.class differ diff --git a/out/production/A079/constants/GameConstants$1.class b/out/production/A079/constants/GameConstants$1.class new file mode 100644 index 0000000..04a5f19 Binary files /dev/null and b/out/production/A079/constants/GameConstants$1.class differ diff --git a/out/production/A079/constants/GameConstants.class b/out/production/A079/constants/GameConstants.class new file mode 100644 index 0000000..79c4bbf Binary files /dev/null and b/out/production/A079/constants/GameConstants.class differ diff --git a/out/production/A079/constants/ItemConstants$伤害字型.class b/out/production/A079/constants/ItemConstants$伤害字型.class new file mode 100644 index 0000000..d22e8de Binary files /dev/null and b/out/production/A079/constants/ItemConstants$伤害字型.class differ diff --git a/out/production/A079/constants/ItemConstants$卷轴.class b/out/production/A079/constants/ItemConstants$卷轴.class new file mode 100644 index 0000000..5dc1032 Binary files /dev/null and b/out/production/A079/constants/ItemConstants$卷轴.class differ diff --git a/out/production/A079/constants/ItemConstants$套装.class b/out/production/A079/constants/ItemConstants$套装.class new file mode 100644 index 0000000..e6f89d5 Binary files /dev/null and b/out/production/A079/constants/ItemConstants$套装.class differ diff --git a/out/production/A079/constants/ItemConstants$类型.class b/out/production/A079/constants/ItemConstants$类型.class new file mode 100644 index 0000000..5d5173c Binary files /dev/null and b/out/production/A079/constants/ItemConstants$类型.class differ diff --git a/out/production/A079/constants/ItemConstants.class b/out/production/A079/constants/ItemConstants.class new file mode 100644 index 0000000..7b6c7d4 Binary files /dev/null and b/out/production/A079/constants/ItemConstants.class differ diff --git a/out/production/A079/constants/JobConstants$LoginJob.class b/out/production/A079/constants/JobConstants$LoginJob.class new file mode 100644 index 0000000..17f471b Binary files /dev/null and b/out/production/A079/constants/JobConstants$LoginJob.class differ diff --git a/out/production/A079/constants/JobConstants.class b/out/production/A079/constants/JobConstants.class new file mode 100644 index 0000000..4147ef1 Binary files /dev/null and b/out/production/A079/constants/JobConstants.class differ diff --git a/out/production/A079/constants/MapConstants.class b/out/production/A079/constants/MapConstants.class new file mode 100644 index 0000000..8992b9e Binary files /dev/null and b/out/production/A079/constants/MapConstants.class differ diff --git a/out/production/A079/constants/MoonlightRevamp.class b/out/production/A079/constants/MoonlightRevamp.class new file mode 100644 index 0000000..e2e82f6 Binary files /dev/null and b/out/production/A079/constants/MoonlightRevamp.class differ diff --git a/out/production/A079/constants/OtherSettings.class b/out/production/A079/constants/OtherSettings.class new file mode 100644 index 0000000..7ab9583 Binary files /dev/null and b/out/production/A079/constants/OtherSettings.class differ diff --git a/out/production/A079/constants/PiPiConfig$1.class b/out/production/A079/constants/PiPiConfig$1.class new file mode 100644 index 0000000..0efa008 Binary files /dev/null and b/out/production/A079/constants/PiPiConfig$1.class differ diff --git a/out/production/A079/constants/PiPiConfig.class b/out/production/A079/constants/PiPiConfig.class new file mode 100644 index 0000000..a2eea2e Binary files /dev/null and b/out/production/A079/constants/PiPiConfig.class differ diff --git a/out/production/A079/constants/ScriptType.class b/out/production/A079/constants/ScriptType.class new file mode 100644 index 0000000..61132e1 Binary files /dev/null and b/out/production/A079/constants/ScriptType.class differ diff --git a/out/production/A079/constants/ServerConfig.class b/out/production/A079/constants/ServerConfig.class new file mode 100644 index 0000000..4ec8bb2 Binary files /dev/null and b/out/production/A079/constants/ServerConfig.class differ diff --git a/out/production/A079/constants/ServerConstants$CommandType.class b/out/production/A079/constants/ServerConstants$CommandType.class new file mode 100644 index 0000000..613a99d Binary files /dev/null and b/out/production/A079/constants/ServerConstants$CommandType.class differ diff --git a/out/production/A079/constants/ServerConstants$MapleType.class b/out/production/A079/constants/ServerConstants$MapleType.class new file mode 100644 index 0000000..db98ed1 Binary files /dev/null and b/out/production/A079/constants/ServerConstants$MapleType.class differ diff --git a/out/production/A079/constants/ServerConstants$PlayerGMRank.class b/out/production/A079/constants/ServerConstants$PlayerGMRank.class new file mode 100644 index 0000000..e172dbe Binary files /dev/null and b/out/production/A079/constants/ServerConstants$PlayerGMRank.class differ diff --git a/out/production/A079/constants/ServerConstants.class b/out/production/A079/constants/ServerConstants.class new file mode 100644 index 0000000..3217baa Binary files /dev/null and b/out/production/A079/constants/ServerConstants.class differ diff --git a/out/production/A079/constants/SkillConstants.class b/out/production/A079/constants/SkillConstants.class new file mode 100644 index 0000000..76ab2c6 Binary files /dev/null and b/out/production/A079/constants/SkillConstants.class differ diff --git a/out/production/A079/constants/SkillType$GM.class b/out/production/A079/constants/SkillType$GM.class new file mode 100644 index 0000000..095acd8 Binary files /dev/null and b/out/production/A079/constants/SkillType$GM.class differ diff --git a/out/production/A079/constants/SkillType$主教.class b/out/production/A079/constants/SkillType$主教.class new file mode 100644 index 0000000..e24fc80 Binary files /dev/null and b/out/production/A079/constants/SkillType$主教.class differ diff --git a/out/production/A079/constants/SkillType$传说.class b/out/production/A079/constants/SkillType$传说.class new file mode 100644 index 0000000..0130ccf Binary files /dev/null and b/out/production/A079/constants/SkillType$传说.class differ diff --git a/out/production/A079/constants/SkillType$侠客.class b/out/production/A079/constants/SkillType$侠客.class new file mode 100644 index 0000000..17be531 Binary files /dev/null and b/out/production/A079/constants/SkillType$侠客.class differ diff --git a/out/production/A079/constants/SkillType$侠盗.class b/out/production/A079/constants/SkillType$侠盗.class new file mode 100644 index 0000000..8b345c9 Binary files /dev/null and b/out/production/A079/constants/SkillType$侠盗.class differ diff --git a/out/production/A079/constants/SkillType$冒险之技.class b/out/production/A079/constants/SkillType$冒险之技.class new file mode 100644 index 0000000..50f50c1 Binary files /dev/null and b/out/production/A079/constants/SkillType$冒险之技.class differ diff --git a/out/production/A079/constants/SkillType$冰毒巫师.class b/out/production/A079/constants/SkillType$冰毒巫师.class new file mode 100644 index 0000000..5379e1e Binary files /dev/null and b/out/production/A079/constants/SkillType$冰毒巫师.class differ diff --git a/out/production/A079/constants/SkillType$冰雷法师.class b/out/production/A079/constants/SkillType$冰雷法师.class new file mode 100644 index 0000000..7b4bbf4 Binary files /dev/null and b/out/production/A079/constants/SkillType$冰雷法师.class differ diff --git a/out/production/A079/constants/SkillType$冰雷魔导士.class b/out/production/A079/constants/SkillType$冰雷魔导士.class new file mode 100644 index 0000000..78b61fb Binary files /dev/null and b/out/production/A079/constants/SkillType$冰雷魔导士.class differ diff --git a/out/production/A079/constants/SkillType$冲锋队长.class b/out/production/A079/constants/SkillType$冲锋队长.class new file mode 100644 index 0000000..d585438 Binary files /dev/null and b/out/production/A079/constants/SkillType$冲锋队长.class differ diff --git a/out/production/A079/constants/SkillType$准骑士.class b/out/production/A079/constants/SkillType$准骑士.class new file mode 100644 index 0000000..83a3db6 Binary files /dev/null and b/out/production/A079/constants/SkillType$准骑士.class differ diff --git a/out/production/A079/constants/SkillType$刺客.class b/out/production/A079/constants/SkillType$刺客.class new file mode 100644 index 0000000..ebaa7d5 Binary files /dev/null and b/out/production/A079/constants/SkillType$刺客.class differ diff --git a/out/production/A079/constants/SkillType$剑客.class b/out/production/A079/constants/SkillType$剑客.class new file mode 100644 index 0000000..dea07f3 Binary files /dev/null and b/out/production/A079/constants/SkillType$剑客.class differ diff --git a/out/production/A079/constants/SkillType$勇士.class b/out/production/A079/constants/SkillType$勇士.class new file mode 100644 index 0000000..6445a27 Binary files /dev/null and b/out/production/A079/constants/SkillType$勇士.class differ diff --git a/out/production/A079/constants/SkillType$圣骑士.class b/out/production/A079/constants/SkillType$圣骑士.class new file mode 100644 index 0000000..9335c68 Binary files /dev/null and b/out/production/A079/constants/SkillType$圣骑士.class differ diff --git a/out/production/A079/constants/SkillType$夜使者.class b/out/production/A079/constants/SkillType$夜使者.class new file mode 100644 index 0000000..27c54a4 Binary files /dev/null and b/out/production/A079/constants/SkillType$夜使者.class differ diff --git a/out/production/A079/constants/SkillType$夜行者1.class b/out/production/A079/constants/SkillType$夜行者1.class new file mode 100644 index 0000000..0da3c67 Binary files /dev/null and b/out/production/A079/constants/SkillType$夜行者1.class differ diff --git a/out/production/A079/constants/SkillType$夜行者2.class b/out/production/A079/constants/SkillType$夜行者2.class new file mode 100644 index 0000000..ff0edb3 Binary files /dev/null and b/out/production/A079/constants/SkillType$夜行者2.class differ diff --git a/out/production/A079/constants/SkillType$夜行者3.class b/out/production/A079/constants/SkillType$夜行者3.class new file mode 100644 index 0000000..8157a3b Binary files /dev/null and b/out/production/A079/constants/SkillType$夜行者3.class differ diff --git a/out/production/A079/constants/SkillType$大副.class b/out/production/A079/constants/SkillType$大副.class new file mode 100644 index 0000000..39a2f72 Binary files /dev/null and b/out/production/A079/constants/SkillType$大副.class differ diff --git a/out/production/A079/constants/SkillType$奇袭者1.class b/out/production/A079/constants/SkillType$奇袭者1.class new file mode 100644 index 0000000..98ff178 Binary files /dev/null and b/out/production/A079/constants/SkillType$奇袭者1.class differ diff --git a/out/production/A079/constants/SkillType$奇袭者2.class b/out/production/A079/constants/SkillType$奇袭者2.class new file mode 100644 index 0000000..ffd0d17 Binary files /dev/null and b/out/production/A079/constants/SkillType$奇袭者2.class differ diff --git a/out/production/A079/constants/SkillType$奇袭者3.class b/out/production/A079/constants/SkillType$奇袭者3.class new file mode 100644 index 0000000..212a0b0 Binary files /dev/null and b/out/production/A079/constants/SkillType$奇袭者3.class differ diff --git a/out/production/A079/constants/SkillType$弓箭手.class b/out/production/A079/constants/SkillType$弓箭手.class new file mode 100644 index 0000000..be71d18 Binary files /dev/null and b/out/production/A079/constants/SkillType$弓箭手.class differ diff --git a/out/production/A079/constants/SkillType$弩弓手.class b/out/production/A079/constants/SkillType$弩弓手.class new file mode 100644 index 0000000..4c50aed Binary files /dev/null and b/out/production/A079/constants/SkillType$弩弓手.class differ diff --git a/out/production/A079/constants/SkillType$战士.class b/out/production/A079/constants/SkillType$战士.class new file mode 100644 index 0000000..ecc2fa2 Binary files /dev/null and b/out/production/A079/constants/SkillType$战士.class differ diff --git a/out/production/A079/constants/SkillType$战神1.class b/out/production/A079/constants/SkillType$战神1.class new file mode 100644 index 0000000..e4afa3f Binary files /dev/null and b/out/production/A079/constants/SkillType$战神1.class differ diff --git a/out/production/A079/constants/SkillType$战神2.class b/out/production/A079/constants/SkillType$战神2.class new file mode 100644 index 0000000..205e608 Binary files /dev/null and b/out/production/A079/constants/SkillType$战神2.class differ diff --git a/out/production/A079/constants/SkillType$战神3.class b/out/production/A079/constants/SkillType$战神3.class new file mode 100644 index 0000000..dd654a4 Binary files /dev/null and b/out/production/A079/constants/SkillType$战神3.class differ diff --git a/out/production/A079/constants/SkillType$战神4.class b/out/production/A079/constants/SkillType$战神4.class new file mode 100644 index 0000000..94f5417 Binary files /dev/null and b/out/production/A079/constants/SkillType$战神4.class differ diff --git a/out/production/A079/constants/SkillType$拳手.class b/out/production/A079/constants/SkillType$拳手.class new file mode 100644 index 0000000..81473f9 Binary files /dev/null and b/out/production/A079/constants/SkillType$拳手.class differ diff --git a/out/production/A079/constants/SkillType$斗士.class b/out/production/A079/constants/SkillType$斗士.class new file mode 100644 index 0000000..4127ccb Binary files /dev/null and b/out/production/A079/constants/SkillType$斗士.class differ diff --git a/out/production/A079/constants/SkillType$无影人.class b/out/production/A079/constants/SkillType$无影人.class new file mode 100644 index 0000000..3416a91 Binary files /dev/null and b/out/production/A079/constants/SkillType$无影人.class differ diff --git a/out/production/A079/constants/SkillType$枪战士.class b/out/production/A079/constants/SkillType$枪战士.class new file mode 100644 index 0000000..916255d Binary files /dev/null and b/out/production/A079/constants/SkillType$枪战士.class differ diff --git a/out/production/A079/constants/SkillType$海盜.class b/out/production/A079/constants/SkillType$海盜.class new file mode 100644 index 0000000..54e0c9e Binary files /dev/null and b/out/production/A079/constants/SkillType$海盜.class differ diff --git a/out/production/A079/constants/SkillType$游侠.class b/out/production/A079/constants/SkillType$游侠.class new file mode 100644 index 0000000..dc7c377 Binary files /dev/null and b/out/production/A079/constants/SkillType$游侠.class differ diff --git a/out/production/A079/constants/SkillType$游俠.class b/out/production/A079/constants/SkillType$游俠.class new file mode 100644 index 0000000..f4ccdd7 Binary files /dev/null and b/out/production/A079/constants/SkillType$游俠.class differ diff --git a/out/production/A079/constants/SkillType$火枪手.class b/out/production/A079/constants/SkillType$火枪手.class new file mode 100644 index 0000000..a682703 Binary files /dev/null and b/out/production/A079/constants/SkillType$火枪手.class differ diff --git a/out/production/A079/constants/SkillType$火毒巫师.class b/out/production/A079/constants/SkillType$火毒巫师.class new file mode 100644 index 0000000..04d7323 Binary files /dev/null and b/out/production/A079/constants/SkillType$火毒巫师.class differ diff --git a/out/production/A079/constants/SkillType$火毒法师.class b/out/production/A079/constants/SkillType$火毒法师.class new file mode 100644 index 0000000..8c44cca Binary files /dev/null and b/out/production/A079/constants/SkillType$火毒法师.class differ diff --git a/out/production/A079/constants/SkillType$火毒魔导士.class b/out/production/A079/constants/SkillType$火毒魔导士.class new file mode 100644 index 0000000..220f981 Binary files /dev/null and b/out/production/A079/constants/SkillType$火毒魔导士.class differ diff --git a/out/production/A079/constants/SkillType$炎术士1.class b/out/production/A079/constants/SkillType$炎术士1.class new file mode 100644 index 0000000..5782585 Binary files /dev/null and b/out/production/A079/constants/SkillType$炎术士1.class differ diff --git a/out/production/A079/constants/SkillType$炎术士2.class b/out/production/A079/constants/SkillType$炎术士2.class new file mode 100644 index 0000000..975725d Binary files /dev/null and b/out/production/A079/constants/SkillType$炎术士2.class differ diff --git a/out/production/A079/constants/SkillType$炎术士3.class b/out/production/A079/constants/SkillType$炎术士3.class new file mode 100644 index 0000000..8372e15 Binary files /dev/null and b/out/production/A079/constants/SkillType$炎术士3.class differ diff --git a/out/production/A079/constants/SkillType$牧师.class b/out/production/A079/constants/SkillType$牧师.class new file mode 100644 index 0000000..874aced Binary files /dev/null and b/out/production/A079/constants/SkillType$牧师.class differ diff --git a/out/production/A079/constants/SkillType$独行客.class b/out/production/A079/constants/SkillType$独行客.class new file mode 100644 index 0000000..afce90e Binary files /dev/null and b/out/production/A079/constants/SkillType$独行客.class differ diff --git a/out/production/A079/constants/SkillType$猎人.class b/out/production/A079/constants/SkillType$猎人.class new file mode 100644 index 0000000..b6d4b41 Binary files /dev/null and b/out/production/A079/constants/SkillType$猎人.class differ diff --git a/out/production/A079/constants/SkillType$盜贼.class b/out/production/A079/constants/SkillType$盜贼.class new file mode 100644 index 0000000..d5e9ab9 Binary files /dev/null and b/out/production/A079/constants/SkillType$盜贼.class differ diff --git a/out/production/A079/constants/SkillType$神射手.class b/out/production/A079/constants/SkillType$神射手.class new file mode 100644 index 0000000..da6fac3 Binary files /dev/null and b/out/production/A079/constants/SkillType$神射手.class differ diff --git a/out/production/A079/constants/SkillType$祭师.class b/out/production/A079/constants/SkillType$祭师.class new file mode 100644 index 0000000..f349154 Binary files /dev/null and b/out/production/A079/constants/SkillType$祭师.class differ diff --git a/out/production/A079/constants/SkillType$管理者.class b/out/production/A079/constants/SkillType$管理者.class new file mode 100644 index 0000000..eb79eca Binary files /dev/null and b/out/production/A079/constants/SkillType$管理者.class differ diff --git a/out/production/A079/constants/SkillType$箭神.class b/out/production/A079/constants/SkillType$箭神.class new file mode 100644 index 0000000..d7ec096 Binary files /dev/null and b/out/production/A079/constants/SkillType$箭神.class differ diff --git a/out/production/A079/constants/SkillType$船长.class b/out/production/A079/constants/SkillType$船长.class new file mode 100644 index 0000000..f05df45 Binary files /dev/null and b/out/production/A079/constants/SkillType$船长.class differ diff --git a/out/production/A079/constants/SkillType$英雄.class b/out/production/A079/constants/SkillType$英雄.class new file mode 100644 index 0000000..e6f0795 Binary files /dev/null and b/out/production/A079/constants/SkillType$英雄.class differ diff --git a/out/production/A079/constants/SkillType$贵族.class b/out/production/A079/constants/SkillType$贵族.class new file mode 100644 index 0000000..a64cd61 Binary files /dev/null and b/out/production/A079/constants/SkillType$贵族.class differ diff --git a/out/production/A079/constants/SkillType$风灵使者1.class b/out/production/A079/constants/SkillType$风灵使者1.class new file mode 100644 index 0000000..199c3d9 Binary files /dev/null and b/out/production/A079/constants/SkillType$风灵使者1.class differ diff --git a/out/production/A079/constants/SkillType$风灵使者2.class b/out/production/A079/constants/SkillType$风灵使者2.class new file mode 100644 index 0000000..d22bc4b Binary files /dev/null and b/out/production/A079/constants/SkillType$风灵使者2.class differ diff --git a/out/production/A079/constants/SkillType$风灵使者3.class b/out/production/A079/constants/SkillType$风灵使者3.class new file mode 100644 index 0000000..5835cb1 Binary files /dev/null and b/out/production/A079/constants/SkillType$风灵使者3.class differ diff --git a/out/production/A079/constants/SkillType$骑士.class b/out/production/A079/constants/SkillType$骑士.class new file mode 100644 index 0000000..19b5b7b Binary files /dev/null and b/out/production/A079/constants/SkillType$骑士.class differ diff --git a/out/production/A079/constants/SkillType$魂骑士1.class b/out/production/A079/constants/SkillType$魂骑士1.class new file mode 100644 index 0000000..5512741 Binary files /dev/null and b/out/production/A079/constants/SkillType$魂骑士1.class differ diff --git a/out/production/A079/constants/SkillType$魂骑士2.class b/out/production/A079/constants/SkillType$魂骑士2.class new file mode 100644 index 0000000..c8b4de6 Binary files /dev/null and b/out/production/A079/constants/SkillType$魂骑士2.class differ diff --git a/out/production/A079/constants/SkillType$魂骑士3.class b/out/production/A079/constants/SkillType$魂骑士3.class new file mode 100644 index 0000000..b8f0a64 Binary files /dev/null and b/out/production/A079/constants/SkillType$魂骑士3.class differ diff --git a/out/production/A079/constants/SkillType$魔法师.class b/out/production/A079/constants/SkillType$魔法师.class new file mode 100644 index 0000000..d8d2570 Binary files /dev/null and b/out/production/A079/constants/SkillType$魔法师.class differ diff --git a/out/production/A079/constants/SkillType$黑骑士.class b/out/production/A079/constants/SkillType$黑骑士.class new file mode 100644 index 0000000..e0cfc3d Binary files /dev/null and b/out/production/A079/constants/SkillType$黑骑士.class differ diff --git a/out/production/A079/constants/SkillType$龙骑士.class b/out/production/A079/constants/SkillType$龙骑士.class new file mode 100644 index 0000000..994e5ea Binary files /dev/null and b/out/production/A079/constants/SkillType$龙骑士.class differ diff --git a/out/production/A079/constants/SkillType.class b/out/production/A079/constants/SkillType.class new file mode 100644 index 0000000..8f66746 Binary files /dev/null and b/out/production/A079/constants/SkillType.class differ diff --git a/out/production/A079/constants/WorldConstants$Option.class b/out/production/A079/constants/WorldConstants$Option.class new file mode 100644 index 0000000..3bbb365 Binary files /dev/null and b/out/production/A079/constants/WorldConstants$Option.class differ diff --git a/out/production/A079/constants/WorldConstants$TespiaWorldOption.class b/out/production/A079/constants/WorldConstants$TespiaWorldOption.class new file mode 100644 index 0000000..e1c18c0 Binary files /dev/null and b/out/production/A079/constants/WorldConstants$TespiaWorldOption.class differ diff --git a/out/production/A079/constants/WorldConstants$WorldOption.class b/out/production/A079/constants/WorldConstants$WorldOption.class new file mode 100644 index 0000000..8440c7d Binary files /dev/null and b/out/production/A079/constants/WorldConstants$WorldOption.class differ diff --git a/out/production/A079/constants/WorldConstants.class b/out/production/A079/constants/WorldConstants.class new file mode 100644 index 0000000..3ac2a8c Binary files /dev/null and b/out/production/A079/constants/WorldConstants.class differ diff --git a/out/production/A079/constants/tz_model.class b/out/production/A079/constants/tz_model.class new file mode 100644 index 0000000..01ea2d5 Binary files /dev/null and b/out/production/A079/constants/tz_model.class differ diff --git a/out/production/A079/constants/tzjc.class b/out/production/A079/constants/tzjc.class new file mode 100644 index 0000000..5d0b020 Binary files /dev/null and b/out/production/A079/constants/tzjc.class differ diff --git a/out/production/A079/database/DBConPool$1.class b/out/production/A079/database/DBConPool$1.class new file mode 100644 index 0000000..154efa3 Binary files /dev/null and b/out/production/A079/database/DBConPool$1.class differ diff --git a/out/production/A079/database/DBConPool$InstanceHolder.class b/out/production/A079/database/DBConPool$InstanceHolder.class new file mode 100644 index 0000000..4ea17c5 Binary files /dev/null and b/out/production/A079/database/DBConPool$InstanceHolder.class differ diff --git a/out/production/A079/database/DBConPool.class b/out/production/A079/database/DBConPool.class new file mode 100644 index 0000000..1c6f7f2 Binary files /dev/null and b/out/production/A079/database/DBConPool.class differ diff --git a/out/production/A079/database/DatabaseException.class b/out/production/A079/database/DatabaseException.class new file mode 100644 index 0000000..ab35bb0 Binary files /dev/null and b/out/production/A079/database/DatabaseException.class differ diff --git a/out/production/A079/database/DatabaseScriptAPI.class b/out/production/A079/database/DatabaseScriptAPI.class new file mode 100644 index 0000000..114842e Binary files /dev/null and b/out/production/A079/database/DatabaseScriptAPI.class differ diff --git a/out/production/A079/folder-alias.json b/out/production/A079/folder-alias.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/out/production/A079/folder-alias.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/out/production/A079/gui/Icon.png b/out/production/A079/gui/Icon.png new file mode 100644 index 0000000..a0057f2 Binary files /dev/null and b/out/production/A079/gui/Icon.png differ diff --git a/out/production/A079/gui/Start$1.class b/out/production/A079/gui/Start$1.class new file mode 100644 index 0000000..b269faf Binary files /dev/null and b/out/production/A079/gui/Start$1.class differ diff --git a/out/production/A079/gui/Start$2.class b/out/production/A079/gui/Start$2.class new file mode 100644 index 0000000..6f1bd2f Binary files /dev/null and b/out/production/A079/gui/Start$2.class differ diff --git a/out/production/A079/gui/Start$3.class b/out/production/A079/gui/Start$3.class new file mode 100644 index 0000000..b77721d Binary files /dev/null and b/out/production/A079/gui/Start$3.class differ diff --git a/out/production/A079/gui/Start$4.class b/out/production/A079/gui/Start$4.class new file mode 100644 index 0000000..f854541 Binary files /dev/null and b/out/production/A079/gui/Start$4.class differ diff --git a/out/production/A079/gui/Start$5.class b/out/production/A079/gui/Start$5.class new file mode 100644 index 0000000..5e4851b Binary files /dev/null and b/out/production/A079/gui/Start$5.class differ diff --git a/out/production/A079/gui/Start$6.class b/out/production/A079/gui/Start$6.class new file mode 100644 index 0000000..51d7403 Binary files /dev/null and b/out/production/A079/gui/Start$6.class differ diff --git a/out/production/A079/gui/Start.class b/out/production/A079/gui/Start.class new file mode 100644 index 0000000..adef0f4 Binary files /dev/null and b/out/production/A079/gui/Start.class differ diff --git a/out/production/A079/gui/jyhss$jyhwpss.class b/out/production/A079/gui/jyhss$jyhwpss.class new file mode 100644 index 0000000..561a457 Binary files /dev/null and b/out/production/A079/gui/jyhss$jyhwpss.class differ diff --git a/out/production/A079/gui/jyhss.class b/out/production/A079/gui/jyhss.class new file mode 100644 index 0000000..74eb4d6 Binary files /dev/null and b/out/production/A079/gui/jyhss.class differ diff --git a/out/production/A079/gui/ppStream$1.class b/out/production/A079/gui/ppStream$1.class new file mode 100644 index 0000000..90bdeae Binary files /dev/null and b/out/production/A079/gui/ppStream$1.class differ diff --git a/out/production/A079/gui/ppStream.class b/out/production/A079/gui/ppStream.class new file mode 100644 index 0000000..643dfa0 Binary files /dev/null and b/out/production/A079/gui/ppStream.class differ diff --git a/out/production/A079/gui/ppms$1.class b/out/production/A079/gui/ppms$1.class new file mode 100644 index 0000000..af1c4ad Binary files /dev/null and b/out/production/A079/gui/ppms$1.class differ diff --git a/out/production/A079/gui/ppms$10.class b/out/production/A079/gui/ppms$10.class new file mode 100644 index 0000000..46b822c Binary files /dev/null and b/out/production/A079/gui/ppms$10.class differ diff --git a/out/production/A079/gui/ppms$100.class b/out/production/A079/gui/ppms$100.class new file mode 100644 index 0000000..688b36b Binary files /dev/null and b/out/production/A079/gui/ppms$100.class differ diff --git a/out/production/A079/gui/ppms$101.class b/out/production/A079/gui/ppms$101.class new file mode 100644 index 0000000..7540b3e Binary files /dev/null and b/out/production/A079/gui/ppms$101.class differ diff --git a/out/production/A079/gui/ppms$102.class b/out/production/A079/gui/ppms$102.class new file mode 100644 index 0000000..5664dde Binary files /dev/null and b/out/production/A079/gui/ppms$102.class differ diff --git a/out/production/A079/gui/ppms$103.class b/out/production/A079/gui/ppms$103.class new file mode 100644 index 0000000..1491f68 Binary files /dev/null and b/out/production/A079/gui/ppms$103.class differ diff --git a/out/production/A079/gui/ppms$104.class b/out/production/A079/gui/ppms$104.class new file mode 100644 index 0000000..28803e6 Binary files /dev/null and b/out/production/A079/gui/ppms$104.class differ diff --git a/out/production/A079/gui/ppms$105.class b/out/production/A079/gui/ppms$105.class new file mode 100644 index 0000000..f45fb98 Binary files /dev/null and b/out/production/A079/gui/ppms$105.class differ diff --git a/out/production/A079/gui/ppms$106.class b/out/production/A079/gui/ppms$106.class new file mode 100644 index 0000000..e49c0c3 Binary files /dev/null and b/out/production/A079/gui/ppms$106.class differ diff --git a/out/production/A079/gui/ppms$107.class b/out/production/A079/gui/ppms$107.class new file mode 100644 index 0000000..cdaaf00 Binary files /dev/null and b/out/production/A079/gui/ppms$107.class differ diff --git a/out/production/A079/gui/ppms$108.class b/out/production/A079/gui/ppms$108.class new file mode 100644 index 0000000..1db6de3 Binary files /dev/null and b/out/production/A079/gui/ppms$108.class differ diff --git a/out/production/A079/gui/ppms$109.class b/out/production/A079/gui/ppms$109.class new file mode 100644 index 0000000..9c9c7fe Binary files /dev/null and b/out/production/A079/gui/ppms$109.class differ diff --git a/out/production/A079/gui/ppms$11.class b/out/production/A079/gui/ppms$11.class new file mode 100644 index 0000000..e1dc448 Binary files /dev/null and b/out/production/A079/gui/ppms$11.class differ diff --git a/out/production/A079/gui/ppms$110.class b/out/production/A079/gui/ppms$110.class new file mode 100644 index 0000000..28f92ff Binary files /dev/null and b/out/production/A079/gui/ppms$110.class differ diff --git a/out/production/A079/gui/ppms$111.class b/out/production/A079/gui/ppms$111.class new file mode 100644 index 0000000..18d8938 Binary files /dev/null and b/out/production/A079/gui/ppms$111.class differ diff --git a/out/production/A079/gui/ppms$112.class b/out/production/A079/gui/ppms$112.class new file mode 100644 index 0000000..b5abe97 Binary files /dev/null and b/out/production/A079/gui/ppms$112.class differ diff --git a/out/production/A079/gui/ppms$113.class b/out/production/A079/gui/ppms$113.class new file mode 100644 index 0000000..946176e Binary files /dev/null and b/out/production/A079/gui/ppms$113.class differ diff --git a/out/production/A079/gui/ppms$114.class b/out/production/A079/gui/ppms$114.class new file mode 100644 index 0000000..736c523 Binary files /dev/null and b/out/production/A079/gui/ppms$114.class differ diff --git a/out/production/A079/gui/ppms$115.class b/out/production/A079/gui/ppms$115.class new file mode 100644 index 0000000..1894695 Binary files /dev/null and b/out/production/A079/gui/ppms$115.class differ diff --git a/out/production/A079/gui/ppms$116.class b/out/production/A079/gui/ppms$116.class new file mode 100644 index 0000000..895e317 Binary files /dev/null and b/out/production/A079/gui/ppms$116.class differ diff --git a/out/production/A079/gui/ppms$117.class b/out/production/A079/gui/ppms$117.class new file mode 100644 index 0000000..90332e0 Binary files /dev/null and b/out/production/A079/gui/ppms$117.class differ diff --git a/out/production/A079/gui/ppms$118.class b/out/production/A079/gui/ppms$118.class new file mode 100644 index 0000000..806ff82 Binary files /dev/null and b/out/production/A079/gui/ppms$118.class differ diff --git a/out/production/A079/gui/ppms$119.class b/out/production/A079/gui/ppms$119.class new file mode 100644 index 0000000..295f522 Binary files /dev/null and b/out/production/A079/gui/ppms$119.class differ diff --git a/out/production/A079/gui/ppms$12.class b/out/production/A079/gui/ppms$12.class new file mode 100644 index 0000000..e2fccfe Binary files /dev/null and b/out/production/A079/gui/ppms$12.class differ diff --git a/out/production/A079/gui/ppms$120.class b/out/production/A079/gui/ppms$120.class new file mode 100644 index 0000000..f9ee631 Binary files /dev/null and b/out/production/A079/gui/ppms$120.class differ diff --git a/out/production/A079/gui/ppms$121.class b/out/production/A079/gui/ppms$121.class new file mode 100644 index 0000000..864bdc5 Binary files /dev/null and b/out/production/A079/gui/ppms$121.class differ diff --git a/out/production/A079/gui/ppms$122.class b/out/production/A079/gui/ppms$122.class new file mode 100644 index 0000000..896bedb Binary files /dev/null and b/out/production/A079/gui/ppms$122.class differ diff --git a/out/production/A079/gui/ppms$123.class b/out/production/A079/gui/ppms$123.class new file mode 100644 index 0000000..1560fe9 Binary files /dev/null and b/out/production/A079/gui/ppms$123.class differ diff --git a/out/production/A079/gui/ppms$124.class b/out/production/A079/gui/ppms$124.class new file mode 100644 index 0000000..12bc9b5 Binary files /dev/null and b/out/production/A079/gui/ppms$124.class differ diff --git a/out/production/A079/gui/ppms$125.class b/out/production/A079/gui/ppms$125.class new file mode 100644 index 0000000..9c47d80 Binary files /dev/null and b/out/production/A079/gui/ppms$125.class differ diff --git a/out/production/A079/gui/ppms$126.class b/out/production/A079/gui/ppms$126.class new file mode 100644 index 0000000..6d2b144 Binary files /dev/null and b/out/production/A079/gui/ppms$126.class differ diff --git a/out/production/A079/gui/ppms$127.class b/out/production/A079/gui/ppms$127.class new file mode 100644 index 0000000..3d4ef0e Binary files /dev/null and b/out/production/A079/gui/ppms$127.class differ diff --git a/out/production/A079/gui/ppms$128.class b/out/production/A079/gui/ppms$128.class new file mode 100644 index 0000000..7369bff Binary files /dev/null and b/out/production/A079/gui/ppms$128.class differ diff --git a/out/production/A079/gui/ppms$129.class b/out/production/A079/gui/ppms$129.class new file mode 100644 index 0000000..261b473 Binary files /dev/null and b/out/production/A079/gui/ppms$129.class differ diff --git a/out/production/A079/gui/ppms$13.class b/out/production/A079/gui/ppms$13.class new file mode 100644 index 0000000..777f547 Binary files /dev/null and b/out/production/A079/gui/ppms$13.class differ diff --git a/out/production/A079/gui/ppms$130.class b/out/production/A079/gui/ppms$130.class new file mode 100644 index 0000000..736934e Binary files /dev/null and b/out/production/A079/gui/ppms$130.class differ diff --git a/out/production/A079/gui/ppms$131.class b/out/production/A079/gui/ppms$131.class new file mode 100644 index 0000000..81cea26 Binary files /dev/null and b/out/production/A079/gui/ppms$131.class differ diff --git a/out/production/A079/gui/ppms$132.class b/out/production/A079/gui/ppms$132.class new file mode 100644 index 0000000..e2c5dfc Binary files /dev/null and b/out/production/A079/gui/ppms$132.class differ diff --git a/out/production/A079/gui/ppms$133.class b/out/production/A079/gui/ppms$133.class new file mode 100644 index 0000000..015b0db Binary files /dev/null and b/out/production/A079/gui/ppms$133.class differ diff --git a/out/production/A079/gui/ppms$134.class b/out/production/A079/gui/ppms$134.class new file mode 100644 index 0000000..a5eb22d Binary files /dev/null and b/out/production/A079/gui/ppms$134.class differ diff --git a/out/production/A079/gui/ppms$135.class b/out/production/A079/gui/ppms$135.class new file mode 100644 index 0000000..1c2ef2e Binary files /dev/null and b/out/production/A079/gui/ppms$135.class differ diff --git a/out/production/A079/gui/ppms$136.class b/out/production/A079/gui/ppms$136.class new file mode 100644 index 0000000..a4bb1ce Binary files /dev/null and b/out/production/A079/gui/ppms$136.class differ diff --git a/out/production/A079/gui/ppms$137.class b/out/production/A079/gui/ppms$137.class new file mode 100644 index 0000000..b598bc4 Binary files /dev/null and b/out/production/A079/gui/ppms$137.class differ diff --git a/out/production/A079/gui/ppms$138.class b/out/production/A079/gui/ppms$138.class new file mode 100644 index 0000000..d9e9328 Binary files /dev/null and b/out/production/A079/gui/ppms$138.class differ diff --git a/out/production/A079/gui/ppms$139.class b/out/production/A079/gui/ppms$139.class new file mode 100644 index 0000000..f4a5311 Binary files /dev/null and b/out/production/A079/gui/ppms$139.class differ diff --git a/out/production/A079/gui/ppms$14.class b/out/production/A079/gui/ppms$14.class new file mode 100644 index 0000000..0b8e405 Binary files /dev/null and b/out/production/A079/gui/ppms$14.class differ diff --git a/out/production/A079/gui/ppms$140.class b/out/production/A079/gui/ppms$140.class new file mode 100644 index 0000000..9d7b18a Binary files /dev/null and b/out/production/A079/gui/ppms$140.class differ diff --git a/out/production/A079/gui/ppms$141.class b/out/production/A079/gui/ppms$141.class new file mode 100644 index 0000000..9cb77cf Binary files /dev/null and b/out/production/A079/gui/ppms$141.class differ diff --git a/out/production/A079/gui/ppms$142.class b/out/production/A079/gui/ppms$142.class new file mode 100644 index 0000000..4ecec99 Binary files /dev/null and b/out/production/A079/gui/ppms$142.class differ diff --git a/out/production/A079/gui/ppms$143.class b/out/production/A079/gui/ppms$143.class new file mode 100644 index 0000000..b924768 Binary files /dev/null and b/out/production/A079/gui/ppms$143.class differ diff --git a/out/production/A079/gui/ppms$144.class b/out/production/A079/gui/ppms$144.class new file mode 100644 index 0000000..ca707da Binary files /dev/null and b/out/production/A079/gui/ppms$144.class differ diff --git a/out/production/A079/gui/ppms$145.class b/out/production/A079/gui/ppms$145.class new file mode 100644 index 0000000..6ed538d Binary files /dev/null and b/out/production/A079/gui/ppms$145.class differ diff --git a/out/production/A079/gui/ppms$146.class b/out/production/A079/gui/ppms$146.class new file mode 100644 index 0000000..0d73c71 Binary files /dev/null and b/out/production/A079/gui/ppms$146.class differ diff --git a/out/production/A079/gui/ppms$147.class b/out/production/A079/gui/ppms$147.class new file mode 100644 index 0000000..5bf2d92 Binary files /dev/null and b/out/production/A079/gui/ppms$147.class differ diff --git a/out/production/A079/gui/ppms$148.class b/out/production/A079/gui/ppms$148.class new file mode 100644 index 0000000..c414340 Binary files /dev/null and b/out/production/A079/gui/ppms$148.class differ diff --git a/out/production/A079/gui/ppms$149.class b/out/production/A079/gui/ppms$149.class new file mode 100644 index 0000000..130b1b7 Binary files /dev/null and b/out/production/A079/gui/ppms$149.class differ diff --git a/out/production/A079/gui/ppms$15.class b/out/production/A079/gui/ppms$15.class new file mode 100644 index 0000000..16d1e41 Binary files /dev/null and b/out/production/A079/gui/ppms$15.class differ diff --git a/out/production/A079/gui/ppms$150.class b/out/production/A079/gui/ppms$150.class new file mode 100644 index 0000000..d065240 Binary files /dev/null and b/out/production/A079/gui/ppms$150.class differ diff --git a/out/production/A079/gui/ppms$151.class b/out/production/A079/gui/ppms$151.class new file mode 100644 index 0000000..e79c1cf Binary files /dev/null and b/out/production/A079/gui/ppms$151.class differ diff --git a/out/production/A079/gui/ppms$152.class b/out/production/A079/gui/ppms$152.class new file mode 100644 index 0000000..9bcfe75 Binary files /dev/null and b/out/production/A079/gui/ppms$152.class differ diff --git a/out/production/A079/gui/ppms$153.class b/out/production/A079/gui/ppms$153.class new file mode 100644 index 0000000..634de24 Binary files /dev/null and b/out/production/A079/gui/ppms$153.class differ diff --git a/out/production/A079/gui/ppms$154.class b/out/production/A079/gui/ppms$154.class new file mode 100644 index 0000000..9990a4d Binary files /dev/null and b/out/production/A079/gui/ppms$154.class differ diff --git a/out/production/A079/gui/ppms$155.class b/out/production/A079/gui/ppms$155.class new file mode 100644 index 0000000..dd59325 Binary files /dev/null and b/out/production/A079/gui/ppms$155.class differ diff --git a/out/production/A079/gui/ppms$156.class b/out/production/A079/gui/ppms$156.class new file mode 100644 index 0000000..1562b32 Binary files /dev/null and b/out/production/A079/gui/ppms$156.class differ diff --git a/out/production/A079/gui/ppms$157.class b/out/production/A079/gui/ppms$157.class new file mode 100644 index 0000000..fe2be2d Binary files /dev/null and b/out/production/A079/gui/ppms$157.class differ diff --git a/out/production/A079/gui/ppms$158.class b/out/production/A079/gui/ppms$158.class new file mode 100644 index 0000000..5c727cb Binary files /dev/null and b/out/production/A079/gui/ppms$158.class differ diff --git a/out/production/A079/gui/ppms$159.class b/out/production/A079/gui/ppms$159.class new file mode 100644 index 0000000..e065da9 Binary files /dev/null and b/out/production/A079/gui/ppms$159.class differ diff --git a/out/production/A079/gui/ppms$16.class b/out/production/A079/gui/ppms$16.class new file mode 100644 index 0000000..763e05d Binary files /dev/null and b/out/production/A079/gui/ppms$16.class differ diff --git a/out/production/A079/gui/ppms$160.class b/out/production/A079/gui/ppms$160.class new file mode 100644 index 0000000..cbad47c Binary files /dev/null and b/out/production/A079/gui/ppms$160.class differ diff --git a/out/production/A079/gui/ppms$161.class b/out/production/A079/gui/ppms$161.class new file mode 100644 index 0000000..993a8f0 Binary files /dev/null and b/out/production/A079/gui/ppms$161.class differ diff --git a/out/production/A079/gui/ppms$162.class b/out/production/A079/gui/ppms$162.class new file mode 100644 index 0000000..a466f12 Binary files /dev/null and b/out/production/A079/gui/ppms$162.class differ diff --git a/out/production/A079/gui/ppms$163.class b/out/production/A079/gui/ppms$163.class new file mode 100644 index 0000000..11ae1c2 Binary files /dev/null and b/out/production/A079/gui/ppms$163.class differ diff --git a/out/production/A079/gui/ppms$164.class b/out/production/A079/gui/ppms$164.class new file mode 100644 index 0000000..17c800f Binary files /dev/null and b/out/production/A079/gui/ppms$164.class differ diff --git a/out/production/A079/gui/ppms$165.class b/out/production/A079/gui/ppms$165.class new file mode 100644 index 0000000..302d011 Binary files /dev/null and b/out/production/A079/gui/ppms$165.class differ diff --git a/out/production/A079/gui/ppms$166.class b/out/production/A079/gui/ppms$166.class new file mode 100644 index 0000000..bc6cf6b Binary files /dev/null and b/out/production/A079/gui/ppms$166.class differ diff --git a/out/production/A079/gui/ppms$167.class b/out/production/A079/gui/ppms$167.class new file mode 100644 index 0000000..14a1048 Binary files /dev/null and b/out/production/A079/gui/ppms$167.class differ diff --git a/out/production/A079/gui/ppms$168.class b/out/production/A079/gui/ppms$168.class new file mode 100644 index 0000000..835252b Binary files /dev/null and b/out/production/A079/gui/ppms$168.class differ diff --git a/out/production/A079/gui/ppms$169.class b/out/production/A079/gui/ppms$169.class new file mode 100644 index 0000000..401f153 Binary files /dev/null and b/out/production/A079/gui/ppms$169.class differ diff --git a/out/production/A079/gui/ppms$17.class b/out/production/A079/gui/ppms$17.class new file mode 100644 index 0000000..d77e074 Binary files /dev/null and b/out/production/A079/gui/ppms$17.class differ diff --git a/out/production/A079/gui/ppms$170.class b/out/production/A079/gui/ppms$170.class new file mode 100644 index 0000000..62e129b Binary files /dev/null and b/out/production/A079/gui/ppms$170.class differ diff --git a/out/production/A079/gui/ppms$171.class b/out/production/A079/gui/ppms$171.class new file mode 100644 index 0000000..88928dc Binary files /dev/null and b/out/production/A079/gui/ppms$171.class differ diff --git a/out/production/A079/gui/ppms$172.class b/out/production/A079/gui/ppms$172.class new file mode 100644 index 0000000..2677bb7 Binary files /dev/null and b/out/production/A079/gui/ppms$172.class differ diff --git a/out/production/A079/gui/ppms$173.class b/out/production/A079/gui/ppms$173.class new file mode 100644 index 0000000..146cabb Binary files /dev/null and b/out/production/A079/gui/ppms$173.class differ diff --git a/out/production/A079/gui/ppms$174.class b/out/production/A079/gui/ppms$174.class new file mode 100644 index 0000000..fd35b33 Binary files /dev/null and b/out/production/A079/gui/ppms$174.class differ diff --git a/out/production/A079/gui/ppms$175.class b/out/production/A079/gui/ppms$175.class new file mode 100644 index 0000000..211fb07 Binary files /dev/null and b/out/production/A079/gui/ppms$175.class differ diff --git a/out/production/A079/gui/ppms$176.class b/out/production/A079/gui/ppms$176.class new file mode 100644 index 0000000..f1304d0 Binary files /dev/null and b/out/production/A079/gui/ppms$176.class differ diff --git a/out/production/A079/gui/ppms$177.class b/out/production/A079/gui/ppms$177.class new file mode 100644 index 0000000..f8966d1 Binary files /dev/null and b/out/production/A079/gui/ppms$177.class differ diff --git a/out/production/A079/gui/ppms$178.class b/out/production/A079/gui/ppms$178.class new file mode 100644 index 0000000..50383bc Binary files /dev/null and b/out/production/A079/gui/ppms$178.class differ diff --git a/out/production/A079/gui/ppms$179.class b/out/production/A079/gui/ppms$179.class new file mode 100644 index 0000000..92fb7bb Binary files /dev/null and b/out/production/A079/gui/ppms$179.class differ diff --git a/out/production/A079/gui/ppms$18.class b/out/production/A079/gui/ppms$18.class new file mode 100644 index 0000000..ed9d02a Binary files /dev/null and b/out/production/A079/gui/ppms$18.class differ diff --git a/out/production/A079/gui/ppms$180.class b/out/production/A079/gui/ppms$180.class new file mode 100644 index 0000000..3a98063 Binary files /dev/null and b/out/production/A079/gui/ppms$180.class differ diff --git a/out/production/A079/gui/ppms$181.class b/out/production/A079/gui/ppms$181.class new file mode 100644 index 0000000..785f38e Binary files /dev/null and b/out/production/A079/gui/ppms$181.class differ diff --git a/out/production/A079/gui/ppms$182.class b/out/production/A079/gui/ppms$182.class new file mode 100644 index 0000000..9de863a Binary files /dev/null and b/out/production/A079/gui/ppms$182.class differ diff --git a/out/production/A079/gui/ppms$183.class b/out/production/A079/gui/ppms$183.class new file mode 100644 index 0000000..28d6b64 Binary files /dev/null and b/out/production/A079/gui/ppms$183.class differ diff --git a/out/production/A079/gui/ppms$184.class b/out/production/A079/gui/ppms$184.class new file mode 100644 index 0000000..9bd5d67 Binary files /dev/null and b/out/production/A079/gui/ppms$184.class differ diff --git a/out/production/A079/gui/ppms$185.class b/out/production/A079/gui/ppms$185.class new file mode 100644 index 0000000..6c87934 Binary files /dev/null and b/out/production/A079/gui/ppms$185.class differ diff --git a/out/production/A079/gui/ppms$186.class b/out/production/A079/gui/ppms$186.class new file mode 100644 index 0000000..f2f8fb8 Binary files /dev/null and b/out/production/A079/gui/ppms$186.class differ diff --git a/out/production/A079/gui/ppms$187.class b/out/production/A079/gui/ppms$187.class new file mode 100644 index 0000000..7546f08 Binary files /dev/null and b/out/production/A079/gui/ppms$187.class differ diff --git a/out/production/A079/gui/ppms$188.class b/out/production/A079/gui/ppms$188.class new file mode 100644 index 0000000..0faea6d Binary files /dev/null and b/out/production/A079/gui/ppms$188.class differ diff --git a/out/production/A079/gui/ppms$189.class b/out/production/A079/gui/ppms$189.class new file mode 100644 index 0000000..9f339b7 Binary files /dev/null and b/out/production/A079/gui/ppms$189.class differ diff --git a/out/production/A079/gui/ppms$19.class b/out/production/A079/gui/ppms$19.class new file mode 100644 index 0000000..be2bfce Binary files /dev/null and b/out/production/A079/gui/ppms$19.class differ diff --git a/out/production/A079/gui/ppms$190.class b/out/production/A079/gui/ppms$190.class new file mode 100644 index 0000000..38f220a Binary files /dev/null and b/out/production/A079/gui/ppms$190.class differ diff --git a/out/production/A079/gui/ppms$191.class b/out/production/A079/gui/ppms$191.class new file mode 100644 index 0000000..39525f3 Binary files /dev/null and b/out/production/A079/gui/ppms$191.class differ diff --git a/out/production/A079/gui/ppms$192.class b/out/production/A079/gui/ppms$192.class new file mode 100644 index 0000000..2cd770c Binary files /dev/null and b/out/production/A079/gui/ppms$192.class differ diff --git a/out/production/A079/gui/ppms$193.class b/out/production/A079/gui/ppms$193.class new file mode 100644 index 0000000..cbe9f6b Binary files /dev/null and b/out/production/A079/gui/ppms$193.class differ diff --git a/out/production/A079/gui/ppms$194.class b/out/production/A079/gui/ppms$194.class new file mode 100644 index 0000000..4f8fccf Binary files /dev/null and b/out/production/A079/gui/ppms$194.class differ diff --git a/out/production/A079/gui/ppms$195.class b/out/production/A079/gui/ppms$195.class new file mode 100644 index 0000000..42251cc Binary files /dev/null and b/out/production/A079/gui/ppms$195.class differ diff --git a/out/production/A079/gui/ppms$196.class b/out/production/A079/gui/ppms$196.class new file mode 100644 index 0000000..6c5a692 Binary files /dev/null and b/out/production/A079/gui/ppms$196.class differ diff --git a/out/production/A079/gui/ppms$197.class b/out/production/A079/gui/ppms$197.class new file mode 100644 index 0000000..017dccc Binary files /dev/null and b/out/production/A079/gui/ppms$197.class differ diff --git a/out/production/A079/gui/ppms$198.class b/out/production/A079/gui/ppms$198.class new file mode 100644 index 0000000..bcf3137 Binary files /dev/null and b/out/production/A079/gui/ppms$198.class differ diff --git a/out/production/A079/gui/ppms$199.class b/out/production/A079/gui/ppms$199.class new file mode 100644 index 0000000..f2f7fc0 Binary files /dev/null and b/out/production/A079/gui/ppms$199.class differ diff --git a/out/production/A079/gui/ppms$2.class b/out/production/A079/gui/ppms$2.class new file mode 100644 index 0000000..be0f7ad Binary files /dev/null and b/out/production/A079/gui/ppms$2.class differ diff --git a/out/production/A079/gui/ppms$20.class b/out/production/A079/gui/ppms$20.class new file mode 100644 index 0000000..e87b420 Binary files /dev/null and b/out/production/A079/gui/ppms$20.class differ diff --git a/out/production/A079/gui/ppms$200.class b/out/production/A079/gui/ppms$200.class new file mode 100644 index 0000000..a28ad24 Binary files /dev/null and b/out/production/A079/gui/ppms$200.class differ diff --git a/out/production/A079/gui/ppms$201.class b/out/production/A079/gui/ppms$201.class new file mode 100644 index 0000000..89d0baa Binary files /dev/null and b/out/production/A079/gui/ppms$201.class differ diff --git a/out/production/A079/gui/ppms$202.class b/out/production/A079/gui/ppms$202.class new file mode 100644 index 0000000..3d598cf Binary files /dev/null and b/out/production/A079/gui/ppms$202.class differ diff --git a/out/production/A079/gui/ppms$203.class b/out/production/A079/gui/ppms$203.class new file mode 100644 index 0000000..2f55803 Binary files /dev/null and b/out/production/A079/gui/ppms$203.class differ diff --git a/out/production/A079/gui/ppms$204.class b/out/production/A079/gui/ppms$204.class new file mode 100644 index 0000000..e82c1b0 Binary files /dev/null and b/out/production/A079/gui/ppms$204.class differ diff --git a/out/production/A079/gui/ppms$205.class b/out/production/A079/gui/ppms$205.class new file mode 100644 index 0000000..00e34be Binary files /dev/null and b/out/production/A079/gui/ppms$205.class differ diff --git a/out/production/A079/gui/ppms$206.class b/out/production/A079/gui/ppms$206.class new file mode 100644 index 0000000..4da71ec Binary files /dev/null and b/out/production/A079/gui/ppms$206.class differ diff --git a/out/production/A079/gui/ppms$207.class b/out/production/A079/gui/ppms$207.class new file mode 100644 index 0000000..8aef98a Binary files /dev/null and b/out/production/A079/gui/ppms$207.class differ diff --git a/out/production/A079/gui/ppms$208.class b/out/production/A079/gui/ppms$208.class new file mode 100644 index 0000000..373160a Binary files /dev/null and b/out/production/A079/gui/ppms$208.class differ diff --git a/out/production/A079/gui/ppms$209.class b/out/production/A079/gui/ppms$209.class new file mode 100644 index 0000000..8f25f9a Binary files /dev/null and b/out/production/A079/gui/ppms$209.class differ diff --git a/out/production/A079/gui/ppms$21.class b/out/production/A079/gui/ppms$21.class new file mode 100644 index 0000000..9c1e298 Binary files /dev/null and b/out/production/A079/gui/ppms$21.class differ diff --git a/out/production/A079/gui/ppms$210.class b/out/production/A079/gui/ppms$210.class new file mode 100644 index 0000000..a3a89cc Binary files /dev/null and b/out/production/A079/gui/ppms$210.class differ diff --git a/out/production/A079/gui/ppms$211.class b/out/production/A079/gui/ppms$211.class new file mode 100644 index 0000000..0356902 Binary files /dev/null and b/out/production/A079/gui/ppms$211.class differ diff --git a/out/production/A079/gui/ppms$212.class b/out/production/A079/gui/ppms$212.class new file mode 100644 index 0000000..59adcee Binary files /dev/null and b/out/production/A079/gui/ppms$212.class differ diff --git a/out/production/A079/gui/ppms$213.class b/out/production/A079/gui/ppms$213.class new file mode 100644 index 0000000..99e6efa Binary files /dev/null and b/out/production/A079/gui/ppms$213.class differ diff --git a/out/production/A079/gui/ppms$214.class b/out/production/A079/gui/ppms$214.class new file mode 100644 index 0000000..8e5b51c Binary files /dev/null and b/out/production/A079/gui/ppms$214.class differ diff --git a/out/production/A079/gui/ppms$215.class b/out/production/A079/gui/ppms$215.class new file mode 100644 index 0000000..1988ce3 Binary files /dev/null and b/out/production/A079/gui/ppms$215.class differ diff --git a/out/production/A079/gui/ppms$216.class b/out/production/A079/gui/ppms$216.class new file mode 100644 index 0000000..cc366fc Binary files /dev/null and b/out/production/A079/gui/ppms$216.class differ diff --git a/out/production/A079/gui/ppms$217.class b/out/production/A079/gui/ppms$217.class new file mode 100644 index 0000000..9597703 Binary files /dev/null and b/out/production/A079/gui/ppms$217.class differ diff --git a/out/production/A079/gui/ppms$218.class b/out/production/A079/gui/ppms$218.class new file mode 100644 index 0000000..5af47bb Binary files /dev/null and b/out/production/A079/gui/ppms$218.class differ diff --git a/out/production/A079/gui/ppms$219.class b/out/production/A079/gui/ppms$219.class new file mode 100644 index 0000000..df94516 Binary files /dev/null and b/out/production/A079/gui/ppms$219.class differ diff --git a/out/production/A079/gui/ppms$22.class b/out/production/A079/gui/ppms$22.class new file mode 100644 index 0000000..ab11b1f Binary files /dev/null and b/out/production/A079/gui/ppms$22.class differ diff --git a/out/production/A079/gui/ppms$220.class b/out/production/A079/gui/ppms$220.class new file mode 100644 index 0000000..e64abac Binary files /dev/null and b/out/production/A079/gui/ppms$220.class differ diff --git a/out/production/A079/gui/ppms$221.class b/out/production/A079/gui/ppms$221.class new file mode 100644 index 0000000..760ec2f Binary files /dev/null and b/out/production/A079/gui/ppms$221.class differ diff --git a/out/production/A079/gui/ppms$222.class b/out/production/A079/gui/ppms$222.class new file mode 100644 index 0000000..92fe822 Binary files /dev/null and b/out/production/A079/gui/ppms$222.class differ diff --git a/out/production/A079/gui/ppms$223.class b/out/production/A079/gui/ppms$223.class new file mode 100644 index 0000000..89eaad1 Binary files /dev/null and b/out/production/A079/gui/ppms$223.class differ diff --git a/out/production/A079/gui/ppms$224.class b/out/production/A079/gui/ppms$224.class new file mode 100644 index 0000000..a3676d2 Binary files /dev/null and b/out/production/A079/gui/ppms$224.class differ diff --git a/out/production/A079/gui/ppms$225.class b/out/production/A079/gui/ppms$225.class new file mode 100644 index 0000000..8407731 Binary files /dev/null and b/out/production/A079/gui/ppms$225.class differ diff --git a/out/production/A079/gui/ppms$226.class b/out/production/A079/gui/ppms$226.class new file mode 100644 index 0000000..e97db73 Binary files /dev/null and b/out/production/A079/gui/ppms$226.class differ diff --git a/out/production/A079/gui/ppms$227.class b/out/production/A079/gui/ppms$227.class new file mode 100644 index 0000000..a7b4e34 Binary files /dev/null and b/out/production/A079/gui/ppms$227.class differ diff --git a/out/production/A079/gui/ppms$228.class b/out/production/A079/gui/ppms$228.class new file mode 100644 index 0000000..28bdf45 Binary files /dev/null and b/out/production/A079/gui/ppms$228.class differ diff --git a/out/production/A079/gui/ppms$229.class b/out/production/A079/gui/ppms$229.class new file mode 100644 index 0000000..0738b77 Binary files /dev/null and b/out/production/A079/gui/ppms$229.class differ diff --git a/out/production/A079/gui/ppms$23.class b/out/production/A079/gui/ppms$23.class new file mode 100644 index 0000000..fcfd034 Binary files /dev/null and b/out/production/A079/gui/ppms$23.class differ diff --git a/out/production/A079/gui/ppms$230.class b/out/production/A079/gui/ppms$230.class new file mode 100644 index 0000000..014d969 Binary files /dev/null and b/out/production/A079/gui/ppms$230.class differ diff --git a/out/production/A079/gui/ppms$231.class b/out/production/A079/gui/ppms$231.class new file mode 100644 index 0000000..b508254 Binary files /dev/null and b/out/production/A079/gui/ppms$231.class differ diff --git a/out/production/A079/gui/ppms$232.class b/out/production/A079/gui/ppms$232.class new file mode 100644 index 0000000..5569e2e Binary files /dev/null and b/out/production/A079/gui/ppms$232.class differ diff --git a/out/production/A079/gui/ppms$233.class b/out/production/A079/gui/ppms$233.class new file mode 100644 index 0000000..5e0b18a Binary files /dev/null and b/out/production/A079/gui/ppms$233.class differ diff --git a/out/production/A079/gui/ppms$234.class b/out/production/A079/gui/ppms$234.class new file mode 100644 index 0000000..734090a Binary files /dev/null and b/out/production/A079/gui/ppms$234.class differ diff --git a/out/production/A079/gui/ppms$235.class b/out/production/A079/gui/ppms$235.class new file mode 100644 index 0000000..4373e16 Binary files /dev/null and b/out/production/A079/gui/ppms$235.class differ diff --git a/out/production/A079/gui/ppms$236.class b/out/production/A079/gui/ppms$236.class new file mode 100644 index 0000000..9aafc7d Binary files /dev/null and b/out/production/A079/gui/ppms$236.class differ diff --git a/out/production/A079/gui/ppms$237.class b/out/production/A079/gui/ppms$237.class new file mode 100644 index 0000000..a4d18bd Binary files /dev/null and b/out/production/A079/gui/ppms$237.class differ diff --git a/out/production/A079/gui/ppms$238.class b/out/production/A079/gui/ppms$238.class new file mode 100644 index 0000000..cefa495 Binary files /dev/null and b/out/production/A079/gui/ppms$238.class differ diff --git a/out/production/A079/gui/ppms$239.class b/out/production/A079/gui/ppms$239.class new file mode 100644 index 0000000..2f5e255 Binary files /dev/null and b/out/production/A079/gui/ppms$239.class differ diff --git a/out/production/A079/gui/ppms$24.class b/out/production/A079/gui/ppms$24.class new file mode 100644 index 0000000..d567f1d Binary files /dev/null and b/out/production/A079/gui/ppms$24.class differ diff --git a/out/production/A079/gui/ppms$240.class b/out/production/A079/gui/ppms$240.class new file mode 100644 index 0000000..e86964a Binary files /dev/null and b/out/production/A079/gui/ppms$240.class differ diff --git a/out/production/A079/gui/ppms$241.class b/out/production/A079/gui/ppms$241.class new file mode 100644 index 0000000..5ff8eac Binary files /dev/null and b/out/production/A079/gui/ppms$241.class differ diff --git a/out/production/A079/gui/ppms$242.class b/out/production/A079/gui/ppms$242.class new file mode 100644 index 0000000..f617b69 Binary files /dev/null and b/out/production/A079/gui/ppms$242.class differ diff --git a/out/production/A079/gui/ppms$243.class b/out/production/A079/gui/ppms$243.class new file mode 100644 index 0000000..8dfd1ef Binary files /dev/null and b/out/production/A079/gui/ppms$243.class differ diff --git a/out/production/A079/gui/ppms$244.class b/out/production/A079/gui/ppms$244.class new file mode 100644 index 0000000..76b81a6 Binary files /dev/null and b/out/production/A079/gui/ppms$244.class differ diff --git a/out/production/A079/gui/ppms$245.class b/out/production/A079/gui/ppms$245.class new file mode 100644 index 0000000..a7059c9 Binary files /dev/null and b/out/production/A079/gui/ppms$245.class differ diff --git a/out/production/A079/gui/ppms$246.class b/out/production/A079/gui/ppms$246.class new file mode 100644 index 0000000..f086549 Binary files /dev/null and b/out/production/A079/gui/ppms$246.class differ diff --git a/out/production/A079/gui/ppms$247.class b/out/production/A079/gui/ppms$247.class new file mode 100644 index 0000000..342018d Binary files /dev/null and b/out/production/A079/gui/ppms$247.class differ diff --git a/out/production/A079/gui/ppms$248.class b/out/production/A079/gui/ppms$248.class new file mode 100644 index 0000000..a0223d6 Binary files /dev/null and b/out/production/A079/gui/ppms$248.class differ diff --git a/out/production/A079/gui/ppms$249.class b/out/production/A079/gui/ppms$249.class new file mode 100644 index 0000000..83539cf Binary files /dev/null and b/out/production/A079/gui/ppms$249.class differ diff --git a/out/production/A079/gui/ppms$25.class b/out/production/A079/gui/ppms$25.class new file mode 100644 index 0000000..4c28c61 Binary files /dev/null and b/out/production/A079/gui/ppms$25.class differ diff --git a/out/production/A079/gui/ppms$250.class b/out/production/A079/gui/ppms$250.class new file mode 100644 index 0000000..b4aaa04 Binary files /dev/null and b/out/production/A079/gui/ppms$250.class differ diff --git a/out/production/A079/gui/ppms$251.class b/out/production/A079/gui/ppms$251.class new file mode 100644 index 0000000..845c5a0 Binary files /dev/null and b/out/production/A079/gui/ppms$251.class differ diff --git a/out/production/A079/gui/ppms$252.class b/out/production/A079/gui/ppms$252.class new file mode 100644 index 0000000..8a68cd2 Binary files /dev/null and b/out/production/A079/gui/ppms$252.class differ diff --git a/out/production/A079/gui/ppms$253.class b/out/production/A079/gui/ppms$253.class new file mode 100644 index 0000000..2a6bf80 Binary files /dev/null and b/out/production/A079/gui/ppms$253.class differ diff --git a/out/production/A079/gui/ppms$254.class b/out/production/A079/gui/ppms$254.class new file mode 100644 index 0000000..e2d29ef Binary files /dev/null and b/out/production/A079/gui/ppms$254.class differ diff --git a/out/production/A079/gui/ppms$255.class b/out/production/A079/gui/ppms$255.class new file mode 100644 index 0000000..3dc8ca0 Binary files /dev/null and b/out/production/A079/gui/ppms$255.class differ diff --git a/out/production/A079/gui/ppms$256.class b/out/production/A079/gui/ppms$256.class new file mode 100644 index 0000000..3749c4e Binary files /dev/null and b/out/production/A079/gui/ppms$256.class differ diff --git a/out/production/A079/gui/ppms$257.class b/out/production/A079/gui/ppms$257.class new file mode 100644 index 0000000..3387b1a Binary files /dev/null and b/out/production/A079/gui/ppms$257.class differ diff --git a/out/production/A079/gui/ppms$258.class b/out/production/A079/gui/ppms$258.class new file mode 100644 index 0000000..4fe36b9 Binary files /dev/null and b/out/production/A079/gui/ppms$258.class differ diff --git a/out/production/A079/gui/ppms$259.class b/out/production/A079/gui/ppms$259.class new file mode 100644 index 0000000..6ad343e Binary files /dev/null and b/out/production/A079/gui/ppms$259.class differ diff --git a/out/production/A079/gui/ppms$26.class b/out/production/A079/gui/ppms$26.class new file mode 100644 index 0000000..2a096bc Binary files /dev/null and b/out/production/A079/gui/ppms$26.class differ diff --git a/out/production/A079/gui/ppms$260.class b/out/production/A079/gui/ppms$260.class new file mode 100644 index 0000000..6150f07 Binary files /dev/null and b/out/production/A079/gui/ppms$260.class differ diff --git a/out/production/A079/gui/ppms$261.class b/out/production/A079/gui/ppms$261.class new file mode 100644 index 0000000..2d96eb8 Binary files /dev/null and b/out/production/A079/gui/ppms$261.class differ diff --git a/out/production/A079/gui/ppms$262.class b/out/production/A079/gui/ppms$262.class new file mode 100644 index 0000000..de7ada2 Binary files /dev/null and b/out/production/A079/gui/ppms$262.class differ diff --git a/out/production/A079/gui/ppms$263.class b/out/production/A079/gui/ppms$263.class new file mode 100644 index 0000000..8789f37 Binary files /dev/null and b/out/production/A079/gui/ppms$263.class differ diff --git a/out/production/A079/gui/ppms$264.class b/out/production/A079/gui/ppms$264.class new file mode 100644 index 0000000..c73cfbc Binary files /dev/null and b/out/production/A079/gui/ppms$264.class differ diff --git a/out/production/A079/gui/ppms$265.class b/out/production/A079/gui/ppms$265.class new file mode 100644 index 0000000..c3ca532 Binary files /dev/null and b/out/production/A079/gui/ppms$265.class differ diff --git a/out/production/A079/gui/ppms$266.class b/out/production/A079/gui/ppms$266.class new file mode 100644 index 0000000..faf5900 Binary files /dev/null and b/out/production/A079/gui/ppms$266.class differ diff --git a/out/production/A079/gui/ppms$267.class b/out/production/A079/gui/ppms$267.class new file mode 100644 index 0000000..7e097be Binary files /dev/null and b/out/production/A079/gui/ppms$267.class differ diff --git a/out/production/A079/gui/ppms$268.class b/out/production/A079/gui/ppms$268.class new file mode 100644 index 0000000..7e6989c Binary files /dev/null and b/out/production/A079/gui/ppms$268.class differ diff --git a/out/production/A079/gui/ppms$269.class b/out/production/A079/gui/ppms$269.class new file mode 100644 index 0000000..98bbf86 Binary files /dev/null and b/out/production/A079/gui/ppms$269.class differ diff --git a/out/production/A079/gui/ppms$27.class b/out/production/A079/gui/ppms$27.class new file mode 100644 index 0000000..32b593f Binary files /dev/null and b/out/production/A079/gui/ppms$27.class differ diff --git a/out/production/A079/gui/ppms$270.class b/out/production/A079/gui/ppms$270.class new file mode 100644 index 0000000..63193f3 Binary files /dev/null and b/out/production/A079/gui/ppms$270.class differ diff --git a/out/production/A079/gui/ppms$271.class b/out/production/A079/gui/ppms$271.class new file mode 100644 index 0000000..8857063 Binary files /dev/null and b/out/production/A079/gui/ppms$271.class differ diff --git a/out/production/A079/gui/ppms$272.class b/out/production/A079/gui/ppms$272.class new file mode 100644 index 0000000..fcaee2f Binary files /dev/null and b/out/production/A079/gui/ppms$272.class differ diff --git a/out/production/A079/gui/ppms$273.class b/out/production/A079/gui/ppms$273.class new file mode 100644 index 0000000..5a783c6 Binary files /dev/null and b/out/production/A079/gui/ppms$273.class differ diff --git a/out/production/A079/gui/ppms$274.class b/out/production/A079/gui/ppms$274.class new file mode 100644 index 0000000..9f20e39 Binary files /dev/null and b/out/production/A079/gui/ppms$274.class differ diff --git a/out/production/A079/gui/ppms$275.class b/out/production/A079/gui/ppms$275.class new file mode 100644 index 0000000..0234644 Binary files /dev/null and b/out/production/A079/gui/ppms$275.class differ diff --git a/out/production/A079/gui/ppms$276.class b/out/production/A079/gui/ppms$276.class new file mode 100644 index 0000000..7500f4c Binary files /dev/null and b/out/production/A079/gui/ppms$276.class differ diff --git a/out/production/A079/gui/ppms$277.class b/out/production/A079/gui/ppms$277.class new file mode 100644 index 0000000..69fdd73 Binary files /dev/null and b/out/production/A079/gui/ppms$277.class differ diff --git a/out/production/A079/gui/ppms$278.class b/out/production/A079/gui/ppms$278.class new file mode 100644 index 0000000..1e2ba06 Binary files /dev/null and b/out/production/A079/gui/ppms$278.class differ diff --git a/out/production/A079/gui/ppms$279.class b/out/production/A079/gui/ppms$279.class new file mode 100644 index 0000000..9db7c2f Binary files /dev/null and b/out/production/A079/gui/ppms$279.class differ diff --git a/out/production/A079/gui/ppms$28.class b/out/production/A079/gui/ppms$28.class new file mode 100644 index 0000000..d0c2b4f Binary files /dev/null and b/out/production/A079/gui/ppms$28.class differ diff --git a/out/production/A079/gui/ppms$280.class b/out/production/A079/gui/ppms$280.class new file mode 100644 index 0000000..abfa000 Binary files /dev/null and b/out/production/A079/gui/ppms$280.class differ diff --git a/out/production/A079/gui/ppms$281.class b/out/production/A079/gui/ppms$281.class new file mode 100644 index 0000000..6aed200 Binary files /dev/null and b/out/production/A079/gui/ppms$281.class differ diff --git a/out/production/A079/gui/ppms$282.class b/out/production/A079/gui/ppms$282.class new file mode 100644 index 0000000..7324567 Binary files /dev/null and b/out/production/A079/gui/ppms$282.class differ diff --git a/out/production/A079/gui/ppms$283.class b/out/production/A079/gui/ppms$283.class new file mode 100644 index 0000000..c084cec Binary files /dev/null and b/out/production/A079/gui/ppms$283.class differ diff --git a/out/production/A079/gui/ppms$284.class b/out/production/A079/gui/ppms$284.class new file mode 100644 index 0000000..dc51685 Binary files /dev/null and b/out/production/A079/gui/ppms$284.class differ diff --git a/out/production/A079/gui/ppms$285.class b/out/production/A079/gui/ppms$285.class new file mode 100644 index 0000000..6f44dec Binary files /dev/null and b/out/production/A079/gui/ppms$285.class differ diff --git a/out/production/A079/gui/ppms$286.class b/out/production/A079/gui/ppms$286.class new file mode 100644 index 0000000..e05c546 Binary files /dev/null and b/out/production/A079/gui/ppms$286.class differ diff --git a/out/production/A079/gui/ppms$287.class b/out/production/A079/gui/ppms$287.class new file mode 100644 index 0000000..3304078 Binary files /dev/null and b/out/production/A079/gui/ppms$287.class differ diff --git a/out/production/A079/gui/ppms$288.class b/out/production/A079/gui/ppms$288.class new file mode 100644 index 0000000..e6afdf0 Binary files /dev/null and b/out/production/A079/gui/ppms$288.class differ diff --git a/out/production/A079/gui/ppms$289.class b/out/production/A079/gui/ppms$289.class new file mode 100644 index 0000000..1db04a2 Binary files /dev/null and b/out/production/A079/gui/ppms$289.class differ diff --git a/out/production/A079/gui/ppms$29.class b/out/production/A079/gui/ppms$29.class new file mode 100644 index 0000000..d3ba7ef Binary files /dev/null and b/out/production/A079/gui/ppms$29.class differ diff --git a/out/production/A079/gui/ppms$290.class b/out/production/A079/gui/ppms$290.class new file mode 100644 index 0000000..77b8ef2 Binary files /dev/null and b/out/production/A079/gui/ppms$290.class differ diff --git a/out/production/A079/gui/ppms$291.class b/out/production/A079/gui/ppms$291.class new file mode 100644 index 0000000..8eadbaa Binary files /dev/null and b/out/production/A079/gui/ppms$291.class differ diff --git a/out/production/A079/gui/ppms$292.class b/out/production/A079/gui/ppms$292.class new file mode 100644 index 0000000..378a42e Binary files /dev/null and b/out/production/A079/gui/ppms$292.class differ diff --git a/out/production/A079/gui/ppms$293.class b/out/production/A079/gui/ppms$293.class new file mode 100644 index 0000000..c82b500 Binary files /dev/null and b/out/production/A079/gui/ppms$293.class differ diff --git a/out/production/A079/gui/ppms$294.class b/out/production/A079/gui/ppms$294.class new file mode 100644 index 0000000..eb35219 Binary files /dev/null and b/out/production/A079/gui/ppms$294.class differ diff --git a/out/production/A079/gui/ppms$295.class b/out/production/A079/gui/ppms$295.class new file mode 100644 index 0000000..c4d4a20 Binary files /dev/null and b/out/production/A079/gui/ppms$295.class differ diff --git a/out/production/A079/gui/ppms$296.class b/out/production/A079/gui/ppms$296.class new file mode 100644 index 0000000..35c466c Binary files /dev/null and b/out/production/A079/gui/ppms$296.class differ diff --git a/out/production/A079/gui/ppms$297.class b/out/production/A079/gui/ppms$297.class new file mode 100644 index 0000000..eb880bc Binary files /dev/null and b/out/production/A079/gui/ppms$297.class differ diff --git a/out/production/A079/gui/ppms$298.class b/out/production/A079/gui/ppms$298.class new file mode 100644 index 0000000..58f1469 Binary files /dev/null and b/out/production/A079/gui/ppms$298.class differ diff --git a/out/production/A079/gui/ppms$299.class b/out/production/A079/gui/ppms$299.class new file mode 100644 index 0000000..d975414 Binary files /dev/null and b/out/production/A079/gui/ppms$299.class differ diff --git a/out/production/A079/gui/ppms$3.class b/out/production/A079/gui/ppms$3.class new file mode 100644 index 0000000..0171a88 Binary files /dev/null and b/out/production/A079/gui/ppms$3.class differ diff --git a/out/production/A079/gui/ppms$30.class b/out/production/A079/gui/ppms$30.class new file mode 100644 index 0000000..f85e891 Binary files /dev/null and b/out/production/A079/gui/ppms$30.class differ diff --git a/out/production/A079/gui/ppms$300.class b/out/production/A079/gui/ppms$300.class new file mode 100644 index 0000000..58e77b3 Binary files /dev/null and b/out/production/A079/gui/ppms$300.class differ diff --git a/out/production/A079/gui/ppms$301.class b/out/production/A079/gui/ppms$301.class new file mode 100644 index 0000000..679eae5 Binary files /dev/null and b/out/production/A079/gui/ppms$301.class differ diff --git a/out/production/A079/gui/ppms$302.class b/out/production/A079/gui/ppms$302.class new file mode 100644 index 0000000..eb808db Binary files /dev/null and b/out/production/A079/gui/ppms$302.class differ diff --git a/out/production/A079/gui/ppms$303.class b/out/production/A079/gui/ppms$303.class new file mode 100644 index 0000000..f71e95f Binary files /dev/null and b/out/production/A079/gui/ppms$303.class differ diff --git a/out/production/A079/gui/ppms$304.class b/out/production/A079/gui/ppms$304.class new file mode 100644 index 0000000..fbae368 Binary files /dev/null and b/out/production/A079/gui/ppms$304.class differ diff --git a/out/production/A079/gui/ppms$305.class b/out/production/A079/gui/ppms$305.class new file mode 100644 index 0000000..8d8d189 Binary files /dev/null and b/out/production/A079/gui/ppms$305.class differ diff --git a/out/production/A079/gui/ppms$306.class b/out/production/A079/gui/ppms$306.class new file mode 100644 index 0000000..81ceeb9 Binary files /dev/null and b/out/production/A079/gui/ppms$306.class differ diff --git a/out/production/A079/gui/ppms$307.class b/out/production/A079/gui/ppms$307.class new file mode 100644 index 0000000..bba615a Binary files /dev/null and b/out/production/A079/gui/ppms$307.class differ diff --git a/out/production/A079/gui/ppms$308.class b/out/production/A079/gui/ppms$308.class new file mode 100644 index 0000000..3b0180e Binary files /dev/null and b/out/production/A079/gui/ppms$308.class differ diff --git a/out/production/A079/gui/ppms$309.class b/out/production/A079/gui/ppms$309.class new file mode 100644 index 0000000..60e28a0 Binary files /dev/null and b/out/production/A079/gui/ppms$309.class differ diff --git a/out/production/A079/gui/ppms$31.class b/out/production/A079/gui/ppms$31.class new file mode 100644 index 0000000..9bf41a8 Binary files /dev/null and b/out/production/A079/gui/ppms$31.class differ diff --git a/out/production/A079/gui/ppms$310.class b/out/production/A079/gui/ppms$310.class new file mode 100644 index 0000000..5e26a67 Binary files /dev/null and b/out/production/A079/gui/ppms$310.class differ diff --git a/out/production/A079/gui/ppms$311.class b/out/production/A079/gui/ppms$311.class new file mode 100644 index 0000000..34363d3 Binary files /dev/null and b/out/production/A079/gui/ppms$311.class differ diff --git a/out/production/A079/gui/ppms$312.class b/out/production/A079/gui/ppms$312.class new file mode 100644 index 0000000..0851d2e Binary files /dev/null and b/out/production/A079/gui/ppms$312.class differ diff --git a/out/production/A079/gui/ppms$313.class b/out/production/A079/gui/ppms$313.class new file mode 100644 index 0000000..17bc970 Binary files /dev/null and b/out/production/A079/gui/ppms$313.class differ diff --git a/out/production/A079/gui/ppms$314.class b/out/production/A079/gui/ppms$314.class new file mode 100644 index 0000000..a896bbc Binary files /dev/null and b/out/production/A079/gui/ppms$314.class differ diff --git a/out/production/A079/gui/ppms$315.class b/out/production/A079/gui/ppms$315.class new file mode 100644 index 0000000..e0bd1fe Binary files /dev/null and b/out/production/A079/gui/ppms$315.class differ diff --git a/out/production/A079/gui/ppms$316.class b/out/production/A079/gui/ppms$316.class new file mode 100644 index 0000000..40c09ab Binary files /dev/null and b/out/production/A079/gui/ppms$316.class differ diff --git a/out/production/A079/gui/ppms$317.class b/out/production/A079/gui/ppms$317.class new file mode 100644 index 0000000..2c94655 Binary files /dev/null and b/out/production/A079/gui/ppms$317.class differ diff --git a/out/production/A079/gui/ppms$318.class b/out/production/A079/gui/ppms$318.class new file mode 100644 index 0000000..e840fa8 Binary files /dev/null and b/out/production/A079/gui/ppms$318.class differ diff --git a/out/production/A079/gui/ppms$319.class b/out/production/A079/gui/ppms$319.class new file mode 100644 index 0000000..a51e53a Binary files /dev/null and b/out/production/A079/gui/ppms$319.class differ diff --git a/out/production/A079/gui/ppms$32.class b/out/production/A079/gui/ppms$32.class new file mode 100644 index 0000000..5dedacb Binary files /dev/null and b/out/production/A079/gui/ppms$32.class differ diff --git a/out/production/A079/gui/ppms$320.class b/out/production/A079/gui/ppms$320.class new file mode 100644 index 0000000..2b90acd Binary files /dev/null and b/out/production/A079/gui/ppms$320.class differ diff --git a/out/production/A079/gui/ppms$321.class b/out/production/A079/gui/ppms$321.class new file mode 100644 index 0000000..33672c4 Binary files /dev/null and b/out/production/A079/gui/ppms$321.class differ diff --git a/out/production/A079/gui/ppms$322.class b/out/production/A079/gui/ppms$322.class new file mode 100644 index 0000000..28f41cc Binary files /dev/null and b/out/production/A079/gui/ppms$322.class differ diff --git a/out/production/A079/gui/ppms$323.class b/out/production/A079/gui/ppms$323.class new file mode 100644 index 0000000..da8cbe2 Binary files /dev/null and b/out/production/A079/gui/ppms$323.class differ diff --git a/out/production/A079/gui/ppms$324.class b/out/production/A079/gui/ppms$324.class new file mode 100644 index 0000000..95d0c49 Binary files /dev/null and b/out/production/A079/gui/ppms$324.class differ diff --git a/out/production/A079/gui/ppms$325.class b/out/production/A079/gui/ppms$325.class new file mode 100644 index 0000000..31db832 Binary files /dev/null and b/out/production/A079/gui/ppms$325.class differ diff --git a/out/production/A079/gui/ppms$326.class b/out/production/A079/gui/ppms$326.class new file mode 100644 index 0000000..a1c8598 Binary files /dev/null and b/out/production/A079/gui/ppms$326.class differ diff --git a/out/production/A079/gui/ppms$327.class b/out/production/A079/gui/ppms$327.class new file mode 100644 index 0000000..a14216e Binary files /dev/null and b/out/production/A079/gui/ppms$327.class differ diff --git a/out/production/A079/gui/ppms$328.class b/out/production/A079/gui/ppms$328.class new file mode 100644 index 0000000..e46e5f3 Binary files /dev/null and b/out/production/A079/gui/ppms$328.class differ diff --git a/out/production/A079/gui/ppms$329.class b/out/production/A079/gui/ppms$329.class new file mode 100644 index 0000000..b07323e Binary files /dev/null and b/out/production/A079/gui/ppms$329.class differ diff --git a/out/production/A079/gui/ppms$33.class b/out/production/A079/gui/ppms$33.class new file mode 100644 index 0000000..3d7fda0 Binary files /dev/null and b/out/production/A079/gui/ppms$33.class differ diff --git a/out/production/A079/gui/ppms$330.class b/out/production/A079/gui/ppms$330.class new file mode 100644 index 0000000..89f2fae Binary files /dev/null and b/out/production/A079/gui/ppms$330.class differ diff --git a/out/production/A079/gui/ppms$331.class b/out/production/A079/gui/ppms$331.class new file mode 100644 index 0000000..3b743d5 Binary files /dev/null and b/out/production/A079/gui/ppms$331.class differ diff --git a/out/production/A079/gui/ppms$332.class b/out/production/A079/gui/ppms$332.class new file mode 100644 index 0000000..96a0d23 Binary files /dev/null and b/out/production/A079/gui/ppms$332.class differ diff --git a/out/production/A079/gui/ppms$333.class b/out/production/A079/gui/ppms$333.class new file mode 100644 index 0000000..0affe79 Binary files /dev/null and b/out/production/A079/gui/ppms$333.class differ diff --git a/out/production/A079/gui/ppms$334.class b/out/production/A079/gui/ppms$334.class new file mode 100644 index 0000000..8d61734 Binary files /dev/null and b/out/production/A079/gui/ppms$334.class differ diff --git a/out/production/A079/gui/ppms$335.class b/out/production/A079/gui/ppms$335.class new file mode 100644 index 0000000..5a7ed70 Binary files /dev/null and b/out/production/A079/gui/ppms$335.class differ diff --git a/out/production/A079/gui/ppms$336.class b/out/production/A079/gui/ppms$336.class new file mode 100644 index 0000000..a8e3b7f Binary files /dev/null and b/out/production/A079/gui/ppms$336.class differ diff --git a/out/production/A079/gui/ppms$337.class b/out/production/A079/gui/ppms$337.class new file mode 100644 index 0000000..85f3951 Binary files /dev/null and b/out/production/A079/gui/ppms$337.class differ diff --git a/out/production/A079/gui/ppms$338.class b/out/production/A079/gui/ppms$338.class new file mode 100644 index 0000000..df0bc98 Binary files /dev/null and b/out/production/A079/gui/ppms$338.class differ diff --git a/out/production/A079/gui/ppms$339.class b/out/production/A079/gui/ppms$339.class new file mode 100644 index 0000000..14ce489 Binary files /dev/null and b/out/production/A079/gui/ppms$339.class differ diff --git a/out/production/A079/gui/ppms$34.class b/out/production/A079/gui/ppms$34.class new file mode 100644 index 0000000..206b5e9 Binary files /dev/null and b/out/production/A079/gui/ppms$34.class differ diff --git a/out/production/A079/gui/ppms$340.class b/out/production/A079/gui/ppms$340.class new file mode 100644 index 0000000..1b3b170 Binary files /dev/null and b/out/production/A079/gui/ppms$340.class differ diff --git a/out/production/A079/gui/ppms$341.class b/out/production/A079/gui/ppms$341.class new file mode 100644 index 0000000..9c0b5b6 Binary files /dev/null and b/out/production/A079/gui/ppms$341.class differ diff --git a/out/production/A079/gui/ppms$342.class b/out/production/A079/gui/ppms$342.class new file mode 100644 index 0000000..e0cfa50 Binary files /dev/null and b/out/production/A079/gui/ppms$342.class differ diff --git a/out/production/A079/gui/ppms$343.class b/out/production/A079/gui/ppms$343.class new file mode 100644 index 0000000..1301115 Binary files /dev/null and b/out/production/A079/gui/ppms$343.class differ diff --git a/out/production/A079/gui/ppms$344.class b/out/production/A079/gui/ppms$344.class new file mode 100644 index 0000000..7a03fa2 Binary files /dev/null and b/out/production/A079/gui/ppms$344.class differ diff --git a/out/production/A079/gui/ppms$345.class b/out/production/A079/gui/ppms$345.class new file mode 100644 index 0000000..f6b0800 Binary files /dev/null and b/out/production/A079/gui/ppms$345.class differ diff --git a/out/production/A079/gui/ppms$346.class b/out/production/A079/gui/ppms$346.class new file mode 100644 index 0000000..91d91cb Binary files /dev/null and b/out/production/A079/gui/ppms$346.class differ diff --git a/out/production/A079/gui/ppms$347.class b/out/production/A079/gui/ppms$347.class new file mode 100644 index 0000000..a90b2d6 Binary files /dev/null and b/out/production/A079/gui/ppms$347.class differ diff --git a/out/production/A079/gui/ppms$348.class b/out/production/A079/gui/ppms$348.class new file mode 100644 index 0000000..7b78c3a Binary files /dev/null and b/out/production/A079/gui/ppms$348.class differ diff --git a/out/production/A079/gui/ppms$349.class b/out/production/A079/gui/ppms$349.class new file mode 100644 index 0000000..b67426c Binary files /dev/null and b/out/production/A079/gui/ppms$349.class differ diff --git a/out/production/A079/gui/ppms$35.class b/out/production/A079/gui/ppms$35.class new file mode 100644 index 0000000..a10a1ad Binary files /dev/null and b/out/production/A079/gui/ppms$35.class differ diff --git a/out/production/A079/gui/ppms$350.class b/out/production/A079/gui/ppms$350.class new file mode 100644 index 0000000..2691f81 Binary files /dev/null and b/out/production/A079/gui/ppms$350.class differ diff --git a/out/production/A079/gui/ppms$351.class b/out/production/A079/gui/ppms$351.class new file mode 100644 index 0000000..a4efb28 Binary files /dev/null and b/out/production/A079/gui/ppms$351.class differ diff --git a/out/production/A079/gui/ppms$352.class b/out/production/A079/gui/ppms$352.class new file mode 100644 index 0000000..61ed430 Binary files /dev/null and b/out/production/A079/gui/ppms$352.class differ diff --git a/out/production/A079/gui/ppms$353.class b/out/production/A079/gui/ppms$353.class new file mode 100644 index 0000000..39e86be Binary files /dev/null and b/out/production/A079/gui/ppms$353.class differ diff --git a/out/production/A079/gui/ppms$354.class b/out/production/A079/gui/ppms$354.class new file mode 100644 index 0000000..2113367 Binary files /dev/null and b/out/production/A079/gui/ppms$354.class differ diff --git a/out/production/A079/gui/ppms$355.class b/out/production/A079/gui/ppms$355.class new file mode 100644 index 0000000..b97f00c Binary files /dev/null and b/out/production/A079/gui/ppms$355.class differ diff --git a/out/production/A079/gui/ppms$356.class b/out/production/A079/gui/ppms$356.class new file mode 100644 index 0000000..004b83a Binary files /dev/null and b/out/production/A079/gui/ppms$356.class differ diff --git a/out/production/A079/gui/ppms$357.class b/out/production/A079/gui/ppms$357.class new file mode 100644 index 0000000..275cc1c Binary files /dev/null and b/out/production/A079/gui/ppms$357.class differ diff --git a/out/production/A079/gui/ppms$358.class b/out/production/A079/gui/ppms$358.class new file mode 100644 index 0000000..df2a2f7 Binary files /dev/null and b/out/production/A079/gui/ppms$358.class differ diff --git a/out/production/A079/gui/ppms$359.class b/out/production/A079/gui/ppms$359.class new file mode 100644 index 0000000..557ac16 Binary files /dev/null and b/out/production/A079/gui/ppms$359.class differ diff --git a/out/production/A079/gui/ppms$36.class b/out/production/A079/gui/ppms$36.class new file mode 100644 index 0000000..c4f8d00 Binary files /dev/null and b/out/production/A079/gui/ppms$36.class differ diff --git a/out/production/A079/gui/ppms$360.class b/out/production/A079/gui/ppms$360.class new file mode 100644 index 0000000..409d675 Binary files /dev/null and b/out/production/A079/gui/ppms$360.class differ diff --git a/out/production/A079/gui/ppms$361.class b/out/production/A079/gui/ppms$361.class new file mode 100644 index 0000000..c4bd539 Binary files /dev/null and b/out/production/A079/gui/ppms$361.class differ diff --git a/out/production/A079/gui/ppms$362.class b/out/production/A079/gui/ppms$362.class new file mode 100644 index 0000000..d601841 Binary files /dev/null and b/out/production/A079/gui/ppms$362.class differ diff --git a/out/production/A079/gui/ppms$363.class b/out/production/A079/gui/ppms$363.class new file mode 100644 index 0000000..727f8c0 Binary files /dev/null and b/out/production/A079/gui/ppms$363.class differ diff --git a/out/production/A079/gui/ppms$364.class b/out/production/A079/gui/ppms$364.class new file mode 100644 index 0000000..640e76b Binary files /dev/null and b/out/production/A079/gui/ppms$364.class differ diff --git a/out/production/A079/gui/ppms$365.class b/out/production/A079/gui/ppms$365.class new file mode 100644 index 0000000..d73a05d Binary files /dev/null and b/out/production/A079/gui/ppms$365.class differ diff --git a/out/production/A079/gui/ppms$366.class b/out/production/A079/gui/ppms$366.class new file mode 100644 index 0000000..0989fa0 Binary files /dev/null and b/out/production/A079/gui/ppms$366.class differ diff --git a/out/production/A079/gui/ppms$367.class b/out/production/A079/gui/ppms$367.class new file mode 100644 index 0000000..8802d3b Binary files /dev/null and b/out/production/A079/gui/ppms$367.class differ diff --git a/out/production/A079/gui/ppms$368.class b/out/production/A079/gui/ppms$368.class new file mode 100644 index 0000000..41590a1 Binary files /dev/null and b/out/production/A079/gui/ppms$368.class differ diff --git a/out/production/A079/gui/ppms$369.class b/out/production/A079/gui/ppms$369.class new file mode 100644 index 0000000..af7650b Binary files /dev/null and b/out/production/A079/gui/ppms$369.class differ diff --git a/out/production/A079/gui/ppms$37.class b/out/production/A079/gui/ppms$37.class new file mode 100644 index 0000000..5709288 Binary files /dev/null and b/out/production/A079/gui/ppms$37.class differ diff --git a/out/production/A079/gui/ppms$370.class b/out/production/A079/gui/ppms$370.class new file mode 100644 index 0000000..ef8e1f6 Binary files /dev/null and b/out/production/A079/gui/ppms$370.class differ diff --git a/out/production/A079/gui/ppms$371.class b/out/production/A079/gui/ppms$371.class new file mode 100644 index 0000000..032b719 Binary files /dev/null and b/out/production/A079/gui/ppms$371.class differ diff --git a/out/production/A079/gui/ppms$372.class b/out/production/A079/gui/ppms$372.class new file mode 100644 index 0000000..38107aa Binary files /dev/null and b/out/production/A079/gui/ppms$372.class differ diff --git a/out/production/A079/gui/ppms$373.class b/out/production/A079/gui/ppms$373.class new file mode 100644 index 0000000..c20f26b Binary files /dev/null and b/out/production/A079/gui/ppms$373.class differ diff --git a/out/production/A079/gui/ppms$374.class b/out/production/A079/gui/ppms$374.class new file mode 100644 index 0000000..66fc5e1 Binary files /dev/null and b/out/production/A079/gui/ppms$374.class differ diff --git a/out/production/A079/gui/ppms$375.class b/out/production/A079/gui/ppms$375.class new file mode 100644 index 0000000..0cda755 Binary files /dev/null and b/out/production/A079/gui/ppms$375.class differ diff --git a/out/production/A079/gui/ppms$376.class b/out/production/A079/gui/ppms$376.class new file mode 100644 index 0000000..995e50d Binary files /dev/null and b/out/production/A079/gui/ppms$376.class differ diff --git a/out/production/A079/gui/ppms$377.class b/out/production/A079/gui/ppms$377.class new file mode 100644 index 0000000..4be7934 Binary files /dev/null and b/out/production/A079/gui/ppms$377.class differ diff --git a/out/production/A079/gui/ppms$378.class b/out/production/A079/gui/ppms$378.class new file mode 100644 index 0000000..d86ef02 Binary files /dev/null and b/out/production/A079/gui/ppms$378.class differ diff --git a/out/production/A079/gui/ppms$379.class b/out/production/A079/gui/ppms$379.class new file mode 100644 index 0000000..f568cb1 Binary files /dev/null and b/out/production/A079/gui/ppms$379.class differ diff --git a/out/production/A079/gui/ppms$38.class b/out/production/A079/gui/ppms$38.class new file mode 100644 index 0000000..d4ebaed Binary files /dev/null and b/out/production/A079/gui/ppms$38.class differ diff --git a/out/production/A079/gui/ppms$380.class b/out/production/A079/gui/ppms$380.class new file mode 100644 index 0000000..b56e7fd Binary files /dev/null and b/out/production/A079/gui/ppms$380.class differ diff --git a/out/production/A079/gui/ppms$381.class b/out/production/A079/gui/ppms$381.class new file mode 100644 index 0000000..32c6a54 Binary files /dev/null and b/out/production/A079/gui/ppms$381.class differ diff --git a/out/production/A079/gui/ppms$382.class b/out/production/A079/gui/ppms$382.class new file mode 100644 index 0000000..bdcdab3 Binary files /dev/null and b/out/production/A079/gui/ppms$382.class differ diff --git a/out/production/A079/gui/ppms$383.class b/out/production/A079/gui/ppms$383.class new file mode 100644 index 0000000..dafa33a Binary files /dev/null and b/out/production/A079/gui/ppms$383.class differ diff --git a/out/production/A079/gui/ppms$384.class b/out/production/A079/gui/ppms$384.class new file mode 100644 index 0000000..518f57f Binary files /dev/null and b/out/production/A079/gui/ppms$384.class differ diff --git a/out/production/A079/gui/ppms$385.class b/out/production/A079/gui/ppms$385.class new file mode 100644 index 0000000..9c8e184 Binary files /dev/null and b/out/production/A079/gui/ppms$385.class differ diff --git a/out/production/A079/gui/ppms$386.class b/out/production/A079/gui/ppms$386.class new file mode 100644 index 0000000..20db082 Binary files /dev/null and b/out/production/A079/gui/ppms$386.class differ diff --git a/out/production/A079/gui/ppms$387.class b/out/production/A079/gui/ppms$387.class new file mode 100644 index 0000000..baacaf1 Binary files /dev/null and b/out/production/A079/gui/ppms$387.class differ diff --git a/out/production/A079/gui/ppms$388.class b/out/production/A079/gui/ppms$388.class new file mode 100644 index 0000000..041e59b Binary files /dev/null and b/out/production/A079/gui/ppms$388.class differ diff --git a/out/production/A079/gui/ppms$389.class b/out/production/A079/gui/ppms$389.class new file mode 100644 index 0000000..ca4afb9 Binary files /dev/null and b/out/production/A079/gui/ppms$389.class differ diff --git a/out/production/A079/gui/ppms$39.class b/out/production/A079/gui/ppms$39.class new file mode 100644 index 0000000..373bddd Binary files /dev/null and b/out/production/A079/gui/ppms$39.class differ diff --git a/out/production/A079/gui/ppms$390.class b/out/production/A079/gui/ppms$390.class new file mode 100644 index 0000000..433589f Binary files /dev/null and b/out/production/A079/gui/ppms$390.class differ diff --git a/out/production/A079/gui/ppms$391.class b/out/production/A079/gui/ppms$391.class new file mode 100644 index 0000000..6aa57b2 Binary files /dev/null and b/out/production/A079/gui/ppms$391.class differ diff --git a/out/production/A079/gui/ppms$392.class b/out/production/A079/gui/ppms$392.class new file mode 100644 index 0000000..9a480cb Binary files /dev/null and b/out/production/A079/gui/ppms$392.class differ diff --git a/out/production/A079/gui/ppms$393.class b/out/production/A079/gui/ppms$393.class new file mode 100644 index 0000000..ee6fa06 Binary files /dev/null and b/out/production/A079/gui/ppms$393.class differ diff --git a/out/production/A079/gui/ppms$394.class b/out/production/A079/gui/ppms$394.class new file mode 100644 index 0000000..5645ad6 Binary files /dev/null and b/out/production/A079/gui/ppms$394.class differ diff --git a/out/production/A079/gui/ppms$395.class b/out/production/A079/gui/ppms$395.class new file mode 100644 index 0000000..0d9cd65 Binary files /dev/null and b/out/production/A079/gui/ppms$395.class differ diff --git a/out/production/A079/gui/ppms$396.class b/out/production/A079/gui/ppms$396.class new file mode 100644 index 0000000..d4f5d9e Binary files /dev/null and b/out/production/A079/gui/ppms$396.class differ diff --git a/out/production/A079/gui/ppms$397.class b/out/production/A079/gui/ppms$397.class new file mode 100644 index 0000000..2377505 Binary files /dev/null and b/out/production/A079/gui/ppms$397.class differ diff --git a/out/production/A079/gui/ppms$398.class b/out/production/A079/gui/ppms$398.class new file mode 100644 index 0000000..6e7fae6 Binary files /dev/null and b/out/production/A079/gui/ppms$398.class differ diff --git a/out/production/A079/gui/ppms$399.class b/out/production/A079/gui/ppms$399.class new file mode 100644 index 0000000..905bc8c Binary files /dev/null and b/out/production/A079/gui/ppms$399.class differ diff --git a/out/production/A079/gui/ppms$4.class b/out/production/A079/gui/ppms$4.class new file mode 100644 index 0000000..a490674 Binary files /dev/null and b/out/production/A079/gui/ppms$4.class differ diff --git a/out/production/A079/gui/ppms$40.class b/out/production/A079/gui/ppms$40.class new file mode 100644 index 0000000..3fadbad Binary files /dev/null and b/out/production/A079/gui/ppms$40.class differ diff --git a/out/production/A079/gui/ppms$400.class b/out/production/A079/gui/ppms$400.class new file mode 100644 index 0000000..5e83afb Binary files /dev/null and b/out/production/A079/gui/ppms$400.class differ diff --git a/out/production/A079/gui/ppms$401.class b/out/production/A079/gui/ppms$401.class new file mode 100644 index 0000000..1c94fd1 Binary files /dev/null and b/out/production/A079/gui/ppms$401.class differ diff --git a/out/production/A079/gui/ppms$402.class b/out/production/A079/gui/ppms$402.class new file mode 100644 index 0000000..85239ae Binary files /dev/null and b/out/production/A079/gui/ppms$402.class differ diff --git a/out/production/A079/gui/ppms$403.class b/out/production/A079/gui/ppms$403.class new file mode 100644 index 0000000..602f293 Binary files /dev/null and b/out/production/A079/gui/ppms$403.class differ diff --git a/out/production/A079/gui/ppms$404.class b/out/production/A079/gui/ppms$404.class new file mode 100644 index 0000000..0267d54 Binary files /dev/null and b/out/production/A079/gui/ppms$404.class differ diff --git a/out/production/A079/gui/ppms$405.class b/out/production/A079/gui/ppms$405.class new file mode 100644 index 0000000..765b66c Binary files /dev/null and b/out/production/A079/gui/ppms$405.class differ diff --git a/out/production/A079/gui/ppms$406.class b/out/production/A079/gui/ppms$406.class new file mode 100644 index 0000000..41c73cc Binary files /dev/null and b/out/production/A079/gui/ppms$406.class differ diff --git a/out/production/A079/gui/ppms$407.class b/out/production/A079/gui/ppms$407.class new file mode 100644 index 0000000..d94ea9e Binary files /dev/null and b/out/production/A079/gui/ppms$407.class differ diff --git a/out/production/A079/gui/ppms$408.class b/out/production/A079/gui/ppms$408.class new file mode 100644 index 0000000..b18c182 Binary files /dev/null and b/out/production/A079/gui/ppms$408.class differ diff --git a/out/production/A079/gui/ppms$409.class b/out/production/A079/gui/ppms$409.class new file mode 100644 index 0000000..04c0d48 Binary files /dev/null and b/out/production/A079/gui/ppms$409.class differ diff --git a/out/production/A079/gui/ppms$41.class b/out/production/A079/gui/ppms$41.class new file mode 100644 index 0000000..22713eb Binary files /dev/null and b/out/production/A079/gui/ppms$41.class differ diff --git a/out/production/A079/gui/ppms$410.class b/out/production/A079/gui/ppms$410.class new file mode 100644 index 0000000..5b0d107 Binary files /dev/null and b/out/production/A079/gui/ppms$410.class differ diff --git a/out/production/A079/gui/ppms$411.class b/out/production/A079/gui/ppms$411.class new file mode 100644 index 0000000..f3cf082 Binary files /dev/null and b/out/production/A079/gui/ppms$411.class differ diff --git a/out/production/A079/gui/ppms$412.class b/out/production/A079/gui/ppms$412.class new file mode 100644 index 0000000..48d50d5 Binary files /dev/null and b/out/production/A079/gui/ppms$412.class differ diff --git a/out/production/A079/gui/ppms$413.class b/out/production/A079/gui/ppms$413.class new file mode 100644 index 0000000..a4d34c9 Binary files /dev/null and b/out/production/A079/gui/ppms$413.class differ diff --git a/out/production/A079/gui/ppms$414.class b/out/production/A079/gui/ppms$414.class new file mode 100644 index 0000000..fa736c1 Binary files /dev/null and b/out/production/A079/gui/ppms$414.class differ diff --git a/out/production/A079/gui/ppms$415.class b/out/production/A079/gui/ppms$415.class new file mode 100644 index 0000000..97d0863 Binary files /dev/null and b/out/production/A079/gui/ppms$415.class differ diff --git a/out/production/A079/gui/ppms$416.class b/out/production/A079/gui/ppms$416.class new file mode 100644 index 0000000..2065d4f Binary files /dev/null and b/out/production/A079/gui/ppms$416.class differ diff --git a/out/production/A079/gui/ppms$417.class b/out/production/A079/gui/ppms$417.class new file mode 100644 index 0000000..fbd302c Binary files /dev/null and b/out/production/A079/gui/ppms$417.class differ diff --git a/out/production/A079/gui/ppms$418.class b/out/production/A079/gui/ppms$418.class new file mode 100644 index 0000000..fe7e569 Binary files /dev/null and b/out/production/A079/gui/ppms$418.class differ diff --git a/out/production/A079/gui/ppms$419.class b/out/production/A079/gui/ppms$419.class new file mode 100644 index 0000000..d5caf24 Binary files /dev/null and b/out/production/A079/gui/ppms$419.class differ diff --git a/out/production/A079/gui/ppms$42.class b/out/production/A079/gui/ppms$42.class new file mode 100644 index 0000000..182bd4f Binary files /dev/null and b/out/production/A079/gui/ppms$42.class differ diff --git a/out/production/A079/gui/ppms$420.class b/out/production/A079/gui/ppms$420.class new file mode 100644 index 0000000..3ea1152 Binary files /dev/null and b/out/production/A079/gui/ppms$420.class differ diff --git a/out/production/A079/gui/ppms$421.class b/out/production/A079/gui/ppms$421.class new file mode 100644 index 0000000..752adb5 Binary files /dev/null and b/out/production/A079/gui/ppms$421.class differ diff --git a/out/production/A079/gui/ppms$422.class b/out/production/A079/gui/ppms$422.class new file mode 100644 index 0000000..570779b Binary files /dev/null and b/out/production/A079/gui/ppms$422.class differ diff --git a/out/production/A079/gui/ppms$423.class b/out/production/A079/gui/ppms$423.class new file mode 100644 index 0000000..5bf6832 Binary files /dev/null and b/out/production/A079/gui/ppms$423.class differ diff --git a/out/production/A079/gui/ppms$424.class b/out/production/A079/gui/ppms$424.class new file mode 100644 index 0000000..73ed352 Binary files /dev/null and b/out/production/A079/gui/ppms$424.class differ diff --git a/out/production/A079/gui/ppms$425.class b/out/production/A079/gui/ppms$425.class new file mode 100644 index 0000000..d62e734 Binary files /dev/null and b/out/production/A079/gui/ppms$425.class differ diff --git a/out/production/A079/gui/ppms$426.class b/out/production/A079/gui/ppms$426.class new file mode 100644 index 0000000..52d6091 Binary files /dev/null and b/out/production/A079/gui/ppms$426.class differ diff --git a/out/production/A079/gui/ppms$427.class b/out/production/A079/gui/ppms$427.class new file mode 100644 index 0000000..733fd0b Binary files /dev/null and b/out/production/A079/gui/ppms$427.class differ diff --git a/out/production/A079/gui/ppms$428.class b/out/production/A079/gui/ppms$428.class new file mode 100644 index 0000000..4fbf80b Binary files /dev/null and b/out/production/A079/gui/ppms$428.class differ diff --git a/out/production/A079/gui/ppms$429.class b/out/production/A079/gui/ppms$429.class new file mode 100644 index 0000000..09d5fb8 Binary files /dev/null and b/out/production/A079/gui/ppms$429.class differ diff --git a/out/production/A079/gui/ppms$43.class b/out/production/A079/gui/ppms$43.class new file mode 100644 index 0000000..5a4aedb Binary files /dev/null and b/out/production/A079/gui/ppms$43.class differ diff --git a/out/production/A079/gui/ppms$430.class b/out/production/A079/gui/ppms$430.class new file mode 100644 index 0000000..ded603a Binary files /dev/null and b/out/production/A079/gui/ppms$430.class differ diff --git a/out/production/A079/gui/ppms$431.class b/out/production/A079/gui/ppms$431.class new file mode 100644 index 0000000..3de5e75 Binary files /dev/null and b/out/production/A079/gui/ppms$431.class differ diff --git a/out/production/A079/gui/ppms$432.class b/out/production/A079/gui/ppms$432.class new file mode 100644 index 0000000..011b244 Binary files /dev/null and b/out/production/A079/gui/ppms$432.class differ diff --git a/out/production/A079/gui/ppms$433.class b/out/production/A079/gui/ppms$433.class new file mode 100644 index 0000000..4977e11 Binary files /dev/null and b/out/production/A079/gui/ppms$433.class differ diff --git a/out/production/A079/gui/ppms$434.class b/out/production/A079/gui/ppms$434.class new file mode 100644 index 0000000..1ab9f0f Binary files /dev/null and b/out/production/A079/gui/ppms$434.class differ diff --git a/out/production/A079/gui/ppms$435.class b/out/production/A079/gui/ppms$435.class new file mode 100644 index 0000000..5d80bc3 Binary files /dev/null and b/out/production/A079/gui/ppms$435.class differ diff --git a/out/production/A079/gui/ppms$436.class b/out/production/A079/gui/ppms$436.class new file mode 100644 index 0000000..e876668 Binary files /dev/null and b/out/production/A079/gui/ppms$436.class differ diff --git a/out/production/A079/gui/ppms$44.class b/out/production/A079/gui/ppms$44.class new file mode 100644 index 0000000..5762c26 Binary files /dev/null and b/out/production/A079/gui/ppms$44.class differ diff --git a/out/production/A079/gui/ppms$45.class b/out/production/A079/gui/ppms$45.class new file mode 100644 index 0000000..8360269 Binary files /dev/null and b/out/production/A079/gui/ppms$45.class differ diff --git a/out/production/A079/gui/ppms$46.class b/out/production/A079/gui/ppms$46.class new file mode 100644 index 0000000..90f592b Binary files /dev/null and b/out/production/A079/gui/ppms$46.class differ diff --git a/out/production/A079/gui/ppms$47.class b/out/production/A079/gui/ppms$47.class new file mode 100644 index 0000000..4f07c87 Binary files /dev/null and b/out/production/A079/gui/ppms$47.class differ diff --git a/out/production/A079/gui/ppms$48.class b/out/production/A079/gui/ppms$48.class new file mode 100644 index 0000000..e061a9c Binary files /dev/null and b/out/production/A079/gui/ppms$48.class differ diff --git a/out/production/A079/gui/ppms$49.class b/out/production/A079/gui/ppms$49.class new file mode 100644 index 0000000..636422b Binary files /dev/null and b/out/production/A079/gui/ppms$49.class differ diff --git a/out/production/A079/gui/ppms$5.class b/out/production/A079/gui/ppms$5.class new file mode 100644 index 0000000..49ac542 Binary files /dev/null and b/out/production/A079/gui/ppms$5.class differ diff --git a/out/production/A079/gui/ppms$50.class b/out/production/A079/gui/ppms$50.class new file mode 100644 index 0000000..14972a7 Binary files /dev/null and b/out/production/A079/gui/ppms$50.class differ diff --git a/out/production/A079/gui/ppms$51.class b/out/production/A079/gui/ppms$51.class new file mode 100644 index 0000000..ad42874 Binary files /dev/null and b/out/production/A079/gui/ppms$51.class differ diff --git a/out/production/A079/gui/ppms$52.class b/out/production/A079/gui/ppms$52.class new file mode 100644 index 0000000..17eebf5 Binary files /dev/null and b/out/production/A079/gui/ppms$52.class differ diff --git a/out/production/A079/gui/ppms$53.class b/out/production/A079/gui/ppms$53.class new file mode 100644 index 0000000..1a3e602 Binary files /dev/null and b/out/production/A079/gui/ppms$53.class differ diff --git a/out/production/A079/gui/ppms$54.class b/out/production/A079/gui/ppms$54.class new file mode 100644 index 0000000..deefcad Binary files /dev/null and b/out/production/A079/gui/ppms$54.class differ diff --git a/out/production/A079/gui/ppms$55.class b/out/production/A079/gui/ppms$55.class new file mode 100644 index 0000000..42849f3 Binary files /dev/null and b/out/production/A079/gui/ppms$55.class differ diff --git a/out/production/A079/gui/ppms$56.class b/out/production/A079/gui/ppms$56.class new file mode 100644 index 0000000..cde73c4 Binary files /dev/null and b/out/production/A079/gui/ppms$56.class differ diff --git a/out/production/A079/gui/ppms$57.class b/out/production/A079/gui/ppms$57.class new file mode 100644 index 0000000..c51ef1d Binary files /dev/null and b/out/production/A079/gui/ppms$57.class differ diff --git a/out/production/A079/gui/ppms$58.class b/out/production/A079/gui/ppms$58.class new file mode 100644 index 0000000..f5ff374 Binary files /dev/null and b/out/production/A079/gui/ppms$58.class differ diff --git a/out/production/A079/gui/ppms$59.class b/out/production/A079/gui/ppms$59.class new file mode 100644 index 0000000..554d876 Binary files /dev/null and b/out/production/A079/gui/ppms$59.class differ diff --git a/out/production/A079/gui/ppms$6.class b/out/production/A079/gui/ppms$6.class new file mode 100644 index 0000000..e3e4606 Binary files /dev/null and b/out/production/A079/gui/ppms$6.class differ diff --git a/out/production/A079/gui/ppms$60.class b/out/production/A079/gui/ppms$60.class new file mode 100644 index 0000000..21b1989 Binary files /dev/null and b/out/production/A079/gui/ppms$60.class differ diff --git a/out/production/A079/gui/ppms$61.class b/out/production/A079/gui/ppms$61.class new file mode 100644 index 0000000..0d24320 Binary files /dev/null and b/out/production/A079/gui/ppms$61.class differ diff --git a/out/production/A079/gui/ppms$62.class b/out/production/A079/gui/ppms$62.class new file mode 100644 index 0000000..c6e9d2f Binary files /dev/null and b/out/production/A079/gui/ppms$62.class differ diff --git a/out/production/A079/gui/ppms$63.class b/out/production/A079/gui/ppms$63.class new file mode 100644 index 0000000..1235708 Binary files /dev/null and b/out/production/A079/gui/ppms$63.class differ diff --git a/out/production/A079/gui/ppms$64.class b/out/production/A079/gui/ppms$64.class new file mode 100644 index 0000000..750948b Binary files /dev/null and b/out/production/A079/gui/ppms$64.class differ diff --git a/out/production/A079/gui/ppms$65.class b/out/production/A079/gui/ppms$65.class new file mode 100644 index 0000000..defd1ce Binary files /dev/null and b/out/production/A079/gui/ppms$65.class differ diff --git a/out/production/A079/gui/ppms$66.class b/out/production/A079/gui/ppms$66.class new file mode 100644 index 0000000..d22fdea Binary files /dev/null and b/out/production/A079/gui/ppms$66.class differ diff --git a/out/production/A079/gui/ppms$67.class b/out/production/A079/gui/ppms$67.class new file mode 100644 index 0000000..2c91ebe Binary files /dev/null and b/out/production/A079/gui/ppms$67.class differ diff --git a/out/production/A079/gui/ppms$68.class b/out/production/A079/gui/ppms$68.class new file mode 100644 index 0000000..ea531f3 Binary files /dev/null and b/out/production/A079/gui/ppms$68.class differ diff --git a/out/production/A079/gui/ppms$69.class b/out/production/A079/gui/ppms$69.class new file mode 100644 index 0000000..f95c430 Binary files /dev/null and b/out/production/A079/gui/ppms$69.class differ diff --git a/out/production/A079/gui/ppms$7.class b/out/production/A079/gui/ppms$7.class new file mode 100644 index 0000000..b85a0a2 Binary files /dev/null and b/out/production/A079/gui/ppms$7.class differ diff --git a/out/production/A079/gui/ppms$70.class b/out/production/A079/gui/ppms$70.class new file mode 100644 index 0000000..94c87e6 Binary files /dev/null and b/out/production/A079/gui/ppms$70.class differ diff --git a/out/production/A079/gui/ppms$71.class b/out/production/A079/gui/ppms$71.class new file mode 100644 index 0000000..a74d4db Binary files /dev/null and b/out/production/A079/gui/ppms$71.class differ diff --git a/out/production/A079/gui/ppms$72.class b/out/production/A079/gui/ppms$72.class new file mode 100644 index 0000000..c3076fb Binary files /dev/null and b/out/production/A079/gui/ppms$72.class differ diff --git a/out/production/A079/gui/ppms$73.class b/out/production/A079/gui/ppms$73.class new file mode 100644 index 0000000..7bbaffa Binary files /dev/null and b/out/production/A079/gui/ppms$73.class differ diff --git a/out/production/A079/gui/ppms$74.class b/out/production/A079/gui/ppms$74.class new file mode 100644 index 0000000..2033294 Binary files /dev/null and b/out/production/A079/gui/ppms$74.class differ diff --git a/out/production/A079/gui/ppms$75.class b/out/production/A079/gui/ppms$75.class new file mode 100644 index 0000000..42608a7 Binary files /dev/null and b/out/production/A079/gui/ppms$75.class differ diff --git a/out/production/A079/gui/ppms$76.class b/out/production/A079/gui/ppms$76.class new file mode 100644 index 0000000..46a6bf9 Binary files /dev/null and b/out/production/A079/gui/ppms$76.class differ diff --git a/out/production/A079/gui/ppms$77.class b/out/production/A079/gui/ppms$77.class new file mode 100644 index 0000000..a9339bc Binary files /dev/null and b/out/production/A079/gui/ppms$77.class differ diff --git a/out/production/A079/gui/ppms$78.class b/out/production/A079/gui/ppms$78.class new file mode 100644 index 0000000..75cfeed Binary files /dev/null and b/out/production/A079/gui/ppms$78.class differ diff --git a/out/production/A079/gui/ppms$79.class b/out/production/A079/gui/ppms$79.class new file mode 100644 index 0000000..e280c3b Binary files /dev/null and b/out/production/A079/gui/ppms$79.class differ diff --git a/out/production/A079/gui/ppms$8.class b/out/production/A079/gui/ppms$8.class new file mode 100644 index 0000000..968e429 Binary files /dev/null and b/out/production/A079/gui/ppms$8.class differ diff --git a/out/production/A079/gui/ppms$80.class b/out/production/A079/gui/ppms$80.class new file mode 100644 index 0000000..909fc62 Binary files /dev/null and b/out/production/A079/gui/ppms$80.class differ diff --git a/out/production/A079/gui/ppms$81.class b/out/production/A079/gui/ppms$81.class new file mode 100644 index 0000000..4a67a30 Binary files /dev/null and b/out/production/A079/gui/ppms$81.class differ diff --git a/out/production/A079/gui/ppms$82.class b/out/production/A079/gui/ppms$82.class new file mode 100644 index 0000000..234e7ab Binary files /dev/null and b/out/production/A079/gui/ppms$82.class differ diff --git a/out/production/A079/gui/ppms$83.class b/out/production/A079/gui/ppms$83.class new file mode 100644 index 0000000..9c9d83c Binary files /dev/null and b/out/production/A079/gui/ppms$83.class differ diff --git a/out/production/A079/gui/ppms$84.class b/out/production/A079/gui/ppms$84.class new file mode 100644 index 0000000..5a197c6 Binary files /dev/null and b/out/production/A079/gui/ppms$84.class differ diff --git a/out/production/A079/gui/ppms$85.class b/out/production/A079/gui/ppms$85.class new file mode 100644 index 0000000..9453055 Binary files /dev/null and b/out/production/A079/gui/ppms$85.class differ diff --git a/out/production/A079/gui/ppms$86.class b/out/production/A079/gui/ppms$86.class new file mode 100644 index 0000000..6a11fdf Binary files /dev/null and b/out/production/A079/gui/ppms$86.class differ diff --git a/out/production/A079/gui/ppms$87.class b/out/production/A079/gui/ppms$87.class new file mode 100644 index 0000000..5ab88f2 Binary files /dev/null and b/out/production/A079/gui/ppms$87.class differ diff --git a/out/production/A079/gui/ppms$88.class b/out/production/A079/gui/ppms$88.class new file mode 100644 index 0000000..1b9df1e Binary files /dev/null and b/out/production/A079/gui/ppms$88.class differ diff --git a/out/production/A079/gui/ppms$89.class b/out/production/A079/gui/ppms$89.class new file mode 100644 index 0000000..4cd9803 Binary files /dev/null and b/out/production/A079/gui/ppms$89.class differ diff --git a/out/production/A079/gui/ppms$9.class b/out/production/A079/gui/ppms$9.class new file mode 100644 index 0000000..bdbe908 Binary files /dev/null and b/out/production/A079/gui/ppms$9.class differ diff --git a/out/production/A079/gui/ppms$90.class b/out/production/A079/gui/ppms$90.class new file mode 100644 index 0000000..dff9843 Binary files /dev/null and b/out/production/A079/gui/ppms$90.class differ diff --git a/out/production/A079/gui/ppms$91.class b/out/production/A079/gui/ppms$91.class new file mode 100644 index 0000000..b9e1b27 Binary files /dev/null and b/out/production/A079/gui/ppms$91.class differ diff --git a/out/production/A079/gui/ppms$92.class b/out/production/A079/gui/ppms$92.class new file mode 100644 index 0000000..95cab6b Binary files /dev/null and b/out/production/A079/gui/ppms$92.class differ diff --git a/out/production/A079/gui/ppms$93.class b/out/production/A079/gui/ppms$93.class new file mode 100644 index 0000000..5710c43 Binary files /dev/null and b/out/production/A079/gui/ppms$93.class differ diff --git a/out/production/A079/gui/ppms$94.class b/out/production/A079/gui/ppms$94.class new file mode 100644 index 0000000..69f43ff Binary files /dev/null and b/out/production/A079/gui/ppms$94.class differ diff --git a/out/production/A079/gui/ppms$95.class b/out/production/A079/gui/ppms$95.class new file mode 100644 index 0000000..e06adfa Binary files /dev/null and b/out/production/A079/gui/ppms$95.class differ diff --git a/out/production/A079/gui/ppms$96.class b/out/production/A079/gui/ppms$96.class new file mode 100644 index 0000000..28c57a8 Binary files /dev/null and b/out/production/A079/gui/ppms$96.class differ diff --git a/out/production/A079/gui/ppms$97.class b/out/production/A079/gui/ppms$97.class new file mode 100644 index 0000000..b60df62 Binary files /dev/null and b/out/production/A079/gui/ppms$97.class differ diff --git a/out/production/A079/gui/ppms$98.class b/out/production/A079/gui/ppms$98.class new file mode 100644 index 0000000..e05162b Binary files /dev/null and b/out/production/A079/gui/ppms$98.class differ diff --git a/out/production/A079/gui/ppms$99.class b/out/production/A079/gui/ppms$99.class new file mode 100644 index 0000000..5659162 Binary files /dev/null and b/out/production/A079/gui/ppms$99.class differ diff --git a/out/production/A079/gui/ppms.class b/out/production/A079/gui/ppms.class new file mode 100644 index 0000000..4ac9b00 Binary files /dev/null and b/out/production/A079/gui/ppms.class differ diff --git a/out/production/A079/gui/代码查询工具$1.class b/out/production/A079/gui/代码查询工具$1.class new file mode 100644 index 0000000..15eaf57 Binary files /dev/null and b/out/production/A079/gui/代码查询工具$1.class differ diff --git a/out/production/A079/gui/代码查询工具$2.class b/out/production/A079/gui/代码查询工具$2.class new file mode 100644 index 0000000..4077c4f Binary files /dev/null and b/out/production/A079/gui/代码查询工具$2.class differ diff --git a/out/production/A079/gui/代码查询工具$3.class b/out/production/A079/gui/代码查询工具$3.class new file mode 100644 index 0000000..6579a92 Binary files /dev/null and b/out/production/A079/gui/代码查询工具$3.class differ diff --git a/out/production/A079/gui/代码查询工具.class b/out/production/A079/gui/代码查询工具.class new file mode 100644 index 0000000..0cad3e0 Binary files /dev/null and b/out/production/A079/gui/代码查询工具.class differ diff --git a/out/production/A079/gui/特殊控制台$1.class b/out/production/A079/gui/特殊控制台$1.class new file mode 100644 index 0000000..429ae5f Binary files /dev/null and b/out/production/A079/gui/特殊控制台$1.class differ diff --git a/out/production/A079/gui/特殊控制台$10.class b/out/production/A079/gui/特殊控制台$10.class new file mode 100644 index 0000000..42992f3 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$10.class differ diff --git a/out/production/A079/gui/特殊控制台$11.class b/out/production/A079/gui/特殊控制台$11.class new file mode 100644 index 0000000..11b8b64 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$11.class differ diff --git a/out/production/A079/gui/特殊控制台$12.class b/out/production/A079/gui/特殊控制台$12.class new file mode 100644 index 0000000..b36474f Binary files /dev/null and b/out/production/A079/gui/特殊控制台$12.class differ diff --git a/out/production/A079/gui/特殊控制台$13.class b/out/production/A079/gui/特殊控制台$13.class new file mode 100644 index 0000000..3f20606 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$13.class differ diff --git a/out/production/A079/gui/特殊控制台$14.class b/out/production/A079/gui/特殊控制台$14.class new file mode 100644 index 0000000..e7aac0c Binary files /dev/null and b/out/production/A079/gui/特殊控制台$14.class differ diff --git a/out/production/A079/gui/特殊控制台$15.class b/out/production/A079/gui/特殊控制台$15.class new file mode 100644 index 0000000..fe1b079 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$15.class differ diff --git a/out/production/A079/gui/特殊控制台$16.class b/out/production/A079/gui/特殊控制台$16.class new file mode 100644 index 0000000..318900e Binary files /dev/null and b/out/production/A079/gui/特殊控制台$16.class differ diff --git a/out/production/A079/gui/特殊控制台$17.class b/out/production/A079/gui/特殊控制台$17.class new file mode 100644 index 0000000..b4d67fc Binary files /dev/null and b/out/production/A079/gui/特殊控制台$17.class differ diff --git a/out/production/A079/gui/特殊控制台$18.class b/out/production/A079/gui/特殊控制台$18.class new file mode 100644 index 0000000..5a08e26 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$18.class differ diff --git a/out/production/A079/gui/特殊控制台$19.class b/out/production/A079/gui/特殊控制台$19.class new file mode 100644 index 0000000..7377b4b Binary files /dev/null and b/out/production/A079/gui/特殊控制台$19.class differ diff --git a/out/production/A079/gui/特殊控制台$2.class b/out/production/A079/gui/特殊控制台$2.class new file mode 100644 index 0000000..984c11b Binary files /dev/null and b/out/production/A079/gui/特殊控制台$2.class differ diff --git a/out/production/A079/gui/特殊控制台$20.class b/out/production/A079/gui/特殊控制台$20.class new file mode 100644 index 0000000..ddaf4ef Binary files /dev/null and b/out/production/A079/gui/特殊控制台$20.class differ diff --git a/out/production/A079/gui/特殊控制台$21.class b/out/production/A079/gui/特殊控制台$21.class new file mode 100644 index 0000000..fe3b453 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$21.class differ diff --git a/out/production/A079/gui/特殊控制台$22.class b/out/production/A079/gui/特殊控制台$22.class new file mode 100644 index 0000000..a82bcf3 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$22.class differ diff --git a/out/production/A079/gui/特殊控制台$23.class b/out/production/A079/gui/特殊控制台$23.class new file mode 100644 index 0000000..82b25e4 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$23.class differ diff --git a/out/production/A079/gui/特殊控制台$24.class b/out/production/A079/gui/特殊控制台$24.class new file mode 100644 index 0000000..35e4d0f Binary files /dev/null and b/out/production/A079/gui/特殊控制台$24.class differ diff --git a/out/production/A079/gui/特殊控制台$25.class b/out/production/A079/gui/特殊控制台$25.class new file mode 100644 index 0000000..1c202cf Binary files /dev/null and b/out/production/A079/gui/特殊控制台$25.class differ diff --git a/out/production/A079/gui/特殊控制台$26.class b/out/production/A079/gui/特殊控制台$26.class new file mode 100644 index 0000000..938dbdd Binary files /dev/null and b/out/production/A079/gui/特殊控制台$26.class differ diff --git a/out/production/A079/gui/特殊控制台$27.class b/out/production/A079/gui/特殊控制台$27.class new file mode 100644 index 0000000..f5fd15b Binary files /dev/null and b/out/production/A079/gui/特殊控制台$27.class differ diff --git a/out/production/A079/gui/特殊控制台$28.class b/out/production/A079/gui/特殊控制台$28.class new file mode 100644 index 0000000..f7e36b7 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$28.class differ diff --git a/out/production/A079/gui/特殊控制台$29.class b/out/production/A079/gui/特殊控制台$29.class new file mode 100644 index 0000000..646f952 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$29.class differ diff --git a/out/production/A079/gui/特殊控制台$3.class b/out/production/A079/gui/特殊控制台$3.class new file mode 100644 index 0000000..35d78a2 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$3.class differ diff --git a/out/production/A079/gui/特殊控制台$30.class b/out/production/A079/gui/特殊控制台$30.class new file mode 100644 index 0000000..5412f1c Binary files /dev/null and b/out/production/A079/gui/特殊控制台$30.class differ diff --git a/out/production/A079/gui/特殊控制台$31.class b/out/production/A079/gui/特殊控制台$31.class new file mode 100644 index 0000000..63db252 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$31.class differ diff --git a/out/production/A079/gui/特殊控制台$32.class b/out/production/A079/gui/特殊控制台$32.class new file mode 100644 index 0000000..a179afe Binary files /dev/null and b/out/production/A079/gui/特殊控制台$32.class differ diff --git a/out/production/A079/gui/特殊控制台$33.class b/out/production/A079/gui/特殊控制台$33.class new file mode 100644 index 0000000..caa3505 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$33.class differ diff --git a/out/production/A079/gui/特殊控制台$34.class b/out/production/A079/gui/特殊控制台$34.class new file mode 100644 index 0000000..7617a18 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$34.class differ diff --git a/out/production/A079/gui/特殊控制台$35.class b/out/production/A079/gui/特殊控制台$35.class new file mode 100644 index 0000000..23ef0d0 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$35.class differ diff --git a/out/production/A079/gui/特殊控制台$36.class b/out/production/A079/gui/特殊控制台$36.class new file mode 100644 index 0000000..15c8332 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$36.class differ diff --git a/out/production/A079/gui/特殊控制台$37.class b/out/production/A079/gui/特殊控制台$37.class new file mode 100644 index 0000000..ecc6809 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$37.class differ diff --git a/out/production/A079/gui/特殊控制台$38.class b/out/production/A079/gui/特殊控制台$38.class new file mode 100644 index 0000000..ebf6618 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$38.class differ diff --git a/out/production/A079/gui/特殊控制台$39.class b/out/production/A079/gui/特殊控制台$39.class new file mode 100644 index 0000000..4310811 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$39.class differ diff --git a/out/production/A079/gui/特殊控制台$4.class b/out/production/A079/gui/特殊控制台$4.class new file mode 100644 index 0000000..51957da Binary files /dev/null and b/out/production/A079/gui/特殊控制台$4.class differ diff --git a/out/production/A079/gui/特殊控制台$40.class b/out/production/A079/gui/特殊控制台$40.class new file mode 100644 index 0000000..55302ac Binary files /dev/null and b/out/production/A079/gui/特殊控制台$40.class differ diff --git a/out/production/A079/gui/特殊控制台$41.class b/out/production/A079/gui/特殊控制台$41.class new file mode 100644 index 0000000..303a423 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$41.class differ diff --git a/out/production/A079/gui/特殊控制台$42.class b/out/production/A079/gui/特殊控制台$42.class new file mode 100644 index 0000000..04d4556 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$42.class differ diff --git a/out/production/A079/gui/特殊控制台$43.class b/out/production/A079/gui/特殊控制台$43.class new file mode 100644 index 0000000..15814f6 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$43.class differ diff --git a/out/production/A079/gui/特殊控制台$44.class b/out/production/A079/gui/特殊控制台$44.class new file mode 100644 index 0000000..af27226 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$44.class differ diff --git a/out/production/A079/gui/特殊控制台$45.class b/out/production/A079/gui/特殊控制台$45.class new file mode 100644 index 0000000..2bf0d18 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$45.class differ diff --git a/out/production/A079/gui/特殊控制台$46.class b/out/production/A079/gui/特殊控制台$46.class new file mode 100644 index 0000000..edebf12 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$46.class differ diff --git a/out/production/A079/gui/特殊控制台$5.class b/out/production/A079/gui/特殊控制台$5.class new file mode 100644 index 0000000..aeae054 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$5.class differ diff --git a/out/production/A079/gui/特殊控制台$6.class b/out/production/A079/gui/特殊控制台$6.class new file mode 100644 index 0000000..abc2771 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$6.class differ diff --git a/out/production/A079/gui/特殊控制台$7.class b/out/production/A079/gui/特殊控制台$7.class new file mode 100644 index 0000000..76c971c Binary files /dev/null and b/out/production/A079/gui/特殊控制台$7.class differ diff --git a/out/production/A079/gui/特殊控制台$8.class b/out/production/A079/gui/特殊控制台$8.class new file mode 100644 index 0000000..454b3d3 Binary files /dev/null and b/out/production/A079/gui/特殊控制台$8.class differ diff --git a/out/production/A079/gui/特殊控制台$9.class b/out/production/A079/gui/特殊控制台$9.class new file mode 100644 index 0000000..7effaed Binary files /dev/null and b/out/production/A079/gui/特殊控制台$9.class differ diff --git a/out/production/A079/gui/特殊控制台.class b/out/production/A079/gui/特殊控制台.class new file mode 100644 index 0000000..ec2a12e Binary files /dev/null and b/out/production/A079/gui/特殊控制台.class differ diff --git a/out/production/A079/gui/玩家控制台$1.class b/out/production/A079/gui/玩家控制台$1.class new file mode 100644 index 0000000..d4377e5 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$1.class differ diff --git a/out/production/A079/gui/玩家控制台$10.class b/out/production/A079/gui/玩家控制台$10.class new file mode 100644 index 0000000..58a08af Binary files /dev/null and b/out/production/A079/gui/玩家控制台$10.class differ diff --git a/out/production/A079/gui/玩家控制台$100.class b/out/production/A079/gui/玩家控制台$100.class new file mode 100644 index 0000000..db516e1 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$100.class differ diff --git a/out/production/A079/gui/玩家控制台$101.class b/out/production/A079/gui/玩家控制台$101.class new file mode 100644 index 0000000..162416d Binary files /dev/null and b/out/production/A079/gui/玩家控制台$101.class differ diff --git a/out/production/A079/gui/玩家控制台$102.class b/out/production/A079/gui/玩家控制台$102.class new file mode 100644 index 0000000..46967c9 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$102.class differ diff --git a/out/production/A079/gui/玩家控制台$103.class b/out/production/A079/gui/玩家控制台$103.class new file mode 100644 index 0000000..c9bf866 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$103.class differ diff --git a/out/production/A079/gui/玩家控制台$104.class b/out/production/A079/gui/玩家控制台$104.class new file mode 100644 index 0000000..225df98 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$104.class differ diff --git a/out/production/A079/gui/玩家控制台$105.class b/out/production/A079/gui/玩家控制台$105.class new file mode 100644 index 0000000..1ae214d Binary files /dev/null and b/out/production/A079/gui/玩家控制台$105.class differ diff --git a/out/production/A079/gui/玩家控制台$106.class b/out/production/A079/gui/玩家控制台$106.class new file mode 100644 index 0000000..bbc4b37 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$106.class differ diff --git a/out/production/A079/gui/玩家控制台$107.class b/out/production/A079/gui/玩家控制台$107.class new file mode 100644 index 0000000..3fa55c6 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$107.class differ diff --git a/out/production/A079/gui/玩家控制台$108.class b/out/production/A079/gui/玩家控制台$108.class new file mode 100644 index 0000000..e2a29e1 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$108.class differ diff --git a/out/production/A079/gui/玩家控制台$109.class b/out/production/A079/gui/玩家控制台$109.class new file mode 100644 index 0000000..cadcbd6 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$109.class differ diff --git a/out/production/A079/gui/玩家控制台$11.class b/out/production/A079/gui/玩家控制台$11.class new file mode 100644 index 0000000..d558029 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$11.class differ diff --git a/out/production/A079/gui/玩家控制台$110.class b/out/production/A079/gui/玩家控制台$110.class new file mode 100644 index 0000000..5da9a42 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$110.class differ diff --git a/out/production/A079/gui/玩家控制台$111.class b/out/production/A079/gui/玩家控制台$111.class new file mode 100644 index 0000000..462cc51 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$111.class differ diff --git a/out/production/A079/gui/玩家控制台$112.class b/out/production/A079/gui/玩家控制台$112.class new file mode 100644 index 0000000..70b5bbf Binary files /dev/null and b/out/production/A079/gui/玩家控制台$112.class differ diff --git a/out/production/A079/gui/玩家控制台$113.class b/out/production/A079/gui/玩家控制台$113.class new file mode 100644 index 0000000..43c2cab Binary files /dev/null and b/out/production/A079/gui/玩家控制台$113.class differ diff --git a/out/production/A079/gui/玩家控制台$114.class b/out/production/A079/gui/玩家控制台$114.class new file mode 100644 index 0000000..2448b9c Binary files /dev/null and b/out/production/A079/gui/玩家控制台$114.class differ diff --git a/out/production/A079/gui/玩家控制台$115.class b/out/production/A079/gui/玩家控制台$115.class new file mode 100644 index 0000000..577e6eb Binary files /dev/null and b/out/production/A079/gui/玩家控制台$115.class differ diff --git a/out/production/A079/gui/玩家控制台$116.class b/out/production/A079/gui/玩家控制台$116.class new file mode 100644 index 0000000..1dad6c5 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$116.class differ diff --git a/out/production/A079/gui/玩家控制台$117.class b/out/production/A079/gui/玩家控制台$117.class new file mode 100644 index 0000000..fafe658 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$117.class differ diff --git a/out/production/A079/gui/玩家控制台$118.class b/out/production/A079/gui/玩家控制台$118.class new file mode 100644 index 0000000..d38406e Binary files /dev/null and b/out/production/A079/gui/玩家控制台$118.class differ diff --git a/out/production/A079/gui/玩家控制台$119.class b/out/production/A079/gui/玩家控制台$119.class new file mode 100644 index 0000000..b9fccc8 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$119.class differ diff --git a/out/production/A079/gui/玩家控制台$12.class b/out/production/A079/gui/玩家控制台$12.class new file mode 100644 index 0000000..accf2cf Binary files /dev/null and b/out/production/A079/gui/玩家控制台$12.class differ diff --git a/out/production/A079/gui/玩家控制台$120.class b/out/production/A079/gui/玩家控制台$120.class new file mode 100644 index 0000000..a20082d Binary files /dev/null and b/out/production/A079/gui/玩家控制台$120.class differ diff --git a/out/production/A079/gui/玩家控制台$121.class b/out/production/A079/gui/玩家控制台$121.class new file mode 100644 index 0000000..872215b Binary files /dev/null and b/out/production/A079/gui/玩家控制台$121.class differ diff --git a/out/production/A079/gui/玩家控制台$122.class b/out/production/A079/gui/玩家控制台$122.class new file mode 100644 index 0000000..d5cc456 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$122.class differ diff --git a/out/production/A079/gui/玩家控制台$123.class b/out/production/A079/gui/玩家控制台$123.class new file mode 100644 index 0000000..5796646 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$123.class differ diff --git a/out/production/A079/gui/玩家控制台$124.class b/out/production/A079/gui/玩家控制台$124.class new file mode 100644 index 0000000..8c11ca3 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$124.class differ diff --git a/out/production/A079/gui/玩家控制台$125.class b/out/production/A079/gui/玩家控制台$125.class new file mode 100644 index 0000000..12fe814 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$125.class differ diff --git a/out/production/A079/gui/玩家控制台$126.class b/out/production/A079/gui/玩家控制台$126.class new file mode 100644 index 0000000..9af2036 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$126.class differ diff --git a/out/production/A079/gui/玩家控制台$127.class b/out/production/A079/gui/玩家控制台$127.class new file mode 100644 index 0000000..d18f46a Binary files /dev/null and b/out/production/A079/gui/玩家控制台$127.class differ diff --git a/out/production/A079/gui/玩家控制台$128.class b/out/production/A079/gui/玩家控制台$128.class new file mode 100644 index 0000000..ba77ca8 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$128.class differ diff --git a/out/production/A079/gui/玩家控制台$129.class b/out/production/A079/gui/玩家控制台$129.class new file mode 100644 index 0000000..20f74e1 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$129.class differ diff --git a/out/production/A079/gui/玩家控制台$13.class b/out/production/A079/gui/玩家控制台$13.class new file mode 100644 index 0000000..858321f Binary files /dev/null and b/out/production/A079/gui/玩家控制台$13.class differ diff --git a/out/production/A079/gui/玩家控制台$130.class b/out/production/A079/gui/玩家控制台$130.class new file mode 100644 index 0000000..05e0325 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$130.class differ diff --git a/out/production/A079/gui/玩家控制台$131.class b/out/production/A079/gui/玩家控制台$131.class new file mode 100644 index 0000000..b78db30 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$131.class differ diff --git a/out/production/A079/gui/玩家控制台$132.class b/out/production/A079/gui/玩家控制台$132.class new file mode 100644 index 0000000..2b7a515 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$132.class differ diff --git a/out/production/A079/gui/玩家控制台$133.class b/out/production/A079/gui/玩家控制台$133.class new file mode 100644 index 0000000..14609d3 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$133.class differ diff --git a/out/production/A079/gui/玩家控制台$134.class b/out/production/A079/gui/玩家控制台$134.class new file mode 100644 index 0000000..5f4039e Binary files /dev/null and b/out/production/A079/gui/玩家控制台$134.class differ diff --git a/out/production/A079/gui/玩家控制台$135.class b/out/production/A079/gui/玩家控制台$135.class new file mode 100644 index 0000000..5e9ef60 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$135.class differ diff --git a/out/production/A079/gui/玩家控制台$136.class b/out/production/A079/gui/玩家控制台$136.class new file mode 100644 index 0000000..ab20e65 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$136.class differ diff --git a/out/production/A079/gui/玩家控制台$137.class b/out/production/A079/gui/玩家控制台$137.class new file mode 100644 index 0000000..f5be499 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$137.class differ diff --git a/out/production/A079/gui/玩家控制台$138.class b/out/production/A079/gui/玩家控制台$138.class new file mode 100644 index 0000000..6bfb1c9 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$138.class differ diff --git a/out/production/A079/gui/玩家控制台$139.class b/out/production/A079/gui/玩家控制台$139.class new file mode 100644 index 0000000..0c7b3aa Binary files /dev/null and b/out/production/A079/gui/玩家控制台$139.class differ diff --git a/out/production/A079/gui/玩家控制台$14.class b/out/production/A079/gui/玩家控制台$14.class new file mode 100644 index 0000000..ab3dc0f Binary files /dev/null and b/out/production/A079/gui/玩家控制台$14.class differ diff --git a/out/production/A079/gui/玩家控制台$140.class b/out/production/A079/gui/玩家控制台$140.class new file mode 100644 index 0000000..035f244 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$140.class differ diff --git a/out/production/A079/gui/玩家控制台$15.class b/out/production/A079/gui/玩家控制台$15.class new file mode 100644 index 0000000..701b826 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$15.class differ diff --git a/out/production/A079/gui/玩家控制台$16.class b/out/production/A079/gui/玩家控制台$16.class new file mode 100644 index 0000000..e9ca289 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$16.class differ diff --git a/out/production/A079/gui/玩家控制台$17.class b/out/production/A079/gui/玩家控制台$17.class new file mode 100644 index 0000000..3b338de Binary files /dev/null and b/out/production/A079/gui/玩家控制台$17.class differ diff --git a/out/production/A079/gui/玩家控制台$18.class b/out/production/A079/gui/玩家控制台$18.class new file mode 100644 index 0000000..ad01eeb Binary files /dev/null and b/out/production/A079/gui/玩家控制台$18.class differ diff --git a/out/production/A079/gui/玩家控制台$19.class b/out/production/A079/gui/玩家控制台$19.class new file mode 100644 index 0000000..f147d2f Binary files /dev/null and b/out/production/A079/gui/玩家控制台$19.class differ diff --git a/out/production/A079/gui/玩家控制台$2.class b/out/production/A079/gui/玩家控制台$2.class new file mode 100644 index 0000000..97f2009 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$2.class differ diff --git a/out/production/A079/gui/玩家控制台$20.class b/out/production/A079/gui/玩家控制台$20.class new file mode 100644 index 0000000..2a46b84 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$20.class differ diff --git a/out/production/A079/gui/玩家控制台$21.class b/out/production/A079/gui/玩家控制台$21.class new file mode 100644 index 0000000..fa76ce0 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$21.class differ diff --git a/out/production/A079/gui/玩家控制台$22.class b/out/production/A079/gui/玩家控制台$22.class new file mode 100644 index 0000000..b4af34a Binary files /dev/null and b/out/production/A079/gui/玩家控制台$22.class differ diff --git a/out/production/A079/gui/玩家控制台$23.class b/out/production/A079/gui/玩家控制台$23.class new file mode 100644 index 0000000..e3ffea5 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$23.class differ diff --git a/out/production/A079/gui/玩家控制台$24.class b/out/production/A079/gui/玩家控制台$24.class new file mode 100644 index 0000000..dd3d617 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$24.class differ diff --git a/out/production/A079/gui/玩家控制台$25.class b/out/production/A079/gui/玩家控制台$25.class new file mode 100644 index 0000000..b63625c Binary files /dev/null and b/out/production/A079/gui/玩家控制台$25.class differ diff --git a/out/production/A079/gui/玩家控制台$26.class b/out/production/A079/gui/玩家控制台$26.class new file mode 100644 index 0000000..c027595 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$26.class differ diff --git a/out/production/A079/gui/玩家控制台$27.class b/out/production/A079/gui/玩家控制台$27.class new file mode 100644 index 0000000..05a081c Binary files /dev/null and b/out/production/A079/gui/玩家控制台$27.class differ diff --git a/out/production/A079/gui/玩家控制台$28.class b/out/production/A079/gui/玩家控制台$28.class new file mode 100644 index 0000000..1ccd967 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$28.class differ diff --git a/out/production/A079/gui/玩家控制台$29.class b/out/production/A079/gui/玩家控制台$29.class new file mode 100644 index 0000000..74d8a54 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$29.class differ diff --git a/out/production/A079/gui/玩家控制台$3.class b/out/production/A079/gui/玩家控制台$3.class new file mode 100644 index 0000000..d54b431 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$3.class differ diff --git a/out/production/A079/gui/玩家控制台$30.class b/out/production/A079/gui/玩家控制台$30.class new file mode 100644 index 0000000..db042e2 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$30.class differ diff --git a/out/production/A079/gui/玩家控制台$31.class b/out/production/A079/gui/玩家控制台$31.class new file mode 100644 index 0000000..6948883 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$31.class differ diff --git a/out/production/A079/gui/玩家控制台$32.class b/out/production/A079/gui/玩家控制台$32.class new file mode 100644 index 0000000..d7abc2f Binary files /dev/null and b/out/production/A079/gui/玩家控制台$32.class differ diff --git a/out/production/A079/gui/玩家控制台$33.class b/out/production/A079/gui/玩家控制台$33.class new file mode 100644 index 0000000..0e2a9cb Binary files /dev/null and b/out/production/A079/gui/玩家控制台$33.class differ diff --git a/out/production/A079/gui/玩家控制台$34.class b/out/production/A079/gui/玩家控制台$34.class new file mode 100644 index 0000000..c9a5bda Binary files /dev/null and b/out/production/A079/gui/玩家控制台$34.class differ diff --git a/out/production/A079/gui/玩家控制台$35.class b/out/production/A079/gui/玩家控制台$35.class new file mode 100644 index 0000000..3d6f95b Binary files /dev/null and b/out/production/A079/gui/玩家控制台$35.class differ diff --git a/out/production/A079/gui/玩家控制台$36.class b/out/production/A079/gui/玩家控制台$36.class new file mode 100644 index 0000000..f25da0c Binary files /dev/null and b/out/production/A079/gui/玩家控制台$36.class differ diff --git a/out/production/A079/gui/玩家控制台$37.class b/out/production/A079/gui/玩家控制台$37.class new file mode 100644 index 0000000..ee4e98d Binary files /dev/null and b/out/production/A079/gui/玩家控制台$37.class differ diff --git a/out/production/A079/gui/玩家控制台$38.class b/out/production/A079/gui/玩家控制台$38.class new file mode 100644 index 0000000..b65f882 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$38.class differ diff --git a/out/production/A079/gui/玩家控制台$39.class b/out/production/A079/gui/玩家控制台$39.class new file mode 100644 index 0000000..f3d833c Binary files /dev/null and b/out/production/A079/gui/玩家控制台$39.class differ diff --git a/out/production/A079/gui/玩家控制台$4.class b/out/production/A079/gui/玩家控制台$4.class new file mode 100644 index 0000000..74b35ef Binary files /dev/null and b/out/production/A079/gui/玩家控制台$4.class differ diff --git a/out/production/A079/gui/玩家控制台$40.class b/out/production/A079/gui/玩家控制台$40.class new file mode 100644 index 0000000..7526c52 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$40.class differ diff --git a/out/production/A079/gui/玩家控制台$41.class b/out/production/A079/gui/玩家控制台$41.class new file mode 100644 index 0000000..25045a4 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$41.class differ diff --git a/out/production/A079/gui/玩家控制台$42.class b/out/production/A079/gui/玩家控制台$42.class new file mode 100644 index 0000000..0d76683 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$42.class differ diff --git a/out/production/A079/gui/玩家控制台$43.class b/out/production/A079/gui/玩家控制台$43.class new file mode 100644 index 0000000..459f4bf Binary files /dev/null and b/out/production/A079/gui/玩家控制台$43.class differ diff --git a/out/production/A079/gui/玩家控制台$44.class b/out/production/A079/gui/玩家控制台$44.class new file mode 100644 index 0000000..668a9ad Binary files /dev/null and b/out/production/A079/gui/玩家控制台$44.class differ diff --git a/out/production/A079/gui/玩家控制台$45.class b/out/production/A079/gui/玩家控制台$45.class new file mode 100644 index 0000000..42cd517 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$45.class differ diff --git a/out/production/A079/gui/玩家控制台$46.class b/out/production/A079/gui/玩家控制台$46.class new file mode 100644 index 0000000..9bd3a4f Binary files /dev/null and b/out/production/A079/gui/玩家控制台$46.class differ diff --git a/out/production/A079/gui/玩家控制台$47.class b/out/production/A079/gui/玩家控制台$47.class new file mode 100644 index 0000000..89af33e Binary files /dev/null and b/out/production/A079/gui/玩家控制台$47.class differ diff --git a/out/production/A079/gui/玩家控制台$48.class b/out/production/A079/gui/玩家控制台$48.class new file mode 100644 index 0000000..36cf589 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$48.class differ diff --git a/out/production/A079/gui/玩家控制台$49.class b/out/production/A079/gui/玩家控制台$49.class new file mode 100644 index 0000000..1f63707 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$49.class differ diff --git a/out/production/A079/gui/玩家控制台$5.class b/out/production/A079/gui/玩家控制台$5.class new file mode 100644 index 0000000..0ee2aa9 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$5.class differ diff --git a/out/production/A079/gui/玩家控制台$50.class b/out/production/A079/gui/玩家控制台$50.class new file mode 100644 index 0000000..772cddc Binary files /dev/null and b/out/production/A079/gui/玩家控制台$50.class differ diff --git a/out/production/A079/gui/玩家控制台$51.class b/out/production/A079/gui/玩家控制台$51.class new file mode 100644 index 0000000..559776a Binary files /dev/null and b/out/production/A079/gui/玩家控制台$51.class differ diff --git a/out/production/A079/gui/玩家控制台$52.class b/out/production/A079/gui/玩家控制台$52.class new file mode 100644 index 0000000..337fcd6 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$52.class differ diff --git a/out/production/A079/gui/玩家控制台$53.class b/out/production/A079/gui/玩家控制台$53.class new file mode 100644 index 0000000..504b587 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$53.class differ diff --git a/out/production/A079/gui/玩家控制台$54.class b/out/production/A079/gui/玩家控制台$54.class new file mode 100644 index 0000000..af6a803 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$54.class differ diff --git a/out/production/A079/gui/玩家控制台$55.class b/out/production/A079/gui/玩家控制台$55.class new file mode 100644 index 0000000..7e2f355 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$55.class differ diff --git a/out/production/A079/gui/玩家控制台$56.class b/out/production/A079/gui/玩家控制台$56.class new file mode 100644 index 0000000..442ffdf Binary files /dev/null and b/out/production/A079/gui/玩家控制台$56.class differ diff --git a/out/production/A079/gui/玩家控制台$57.class b/out/production/A079/gui/玩家控制台$57.class new file mode 100644 index 0000000..92f5350 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$57.class differ diff --git a/out/production/A079/gui/玩家控制台$58.class b/out/production/A079/gui/玩家控制台$58.class new file mode 100644 index 0000000..e43e4e2 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$58.class differ diff --git a/out/production/A079/gui/玩家控制台$59.class b/out/production/A079/gui/玩家控制台$59.class new file mode 100644 index 0000000..1f54d75 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$59.class differ diff --git a/out/production/A079/gui/玩家控制台$6.class b/out/production/A079/gui/玩家控制台$6.class new file mode 100644 index 0000000..6eb4be0 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$6.class differ diff --git a/out/production/A079/gui/玩家控制台$60.class b/out/production/A079/gui/玩家控制台$60.class new file mode 100644 index 0000000..58b4b67 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$60.class differ diff --git a/out/production/A079/gui/玩家控制台$61.class b/out/production/A079/gui/玩家控制台$61.class new file mode 100644 index 0000000..f037307 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$61.class differ diff --git a/out/production/A079/gui/玩家控制台$62.class b/out/production/A079/gui/玩家控制台$62.class new file mode 100644 index 0000000..d28a2b1 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$62.class differ diff --git a/out/production/A079/gui/玩家控制台$63.class b/out/production/A079/gui/玩家控制台$63.class new file mode 100644 index 0000000..b032c34 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$63.class differ diff --git a/out/production/A079/gui/玩家控制台$64.class b/out/production/A079/gui/玩家控制台$64.class new file mode 100644 index 0000000..931d864 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$64.class differ diff --git a/out/production/A079/gui/玩家控制台$65.class b/out/production/A079/gui/玩家控制台$65.class new file mode 100644 index 0000000..70c8431 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$65.class differ diff --git a/out/production/A079/gui/玩家控制台$66.class b/out/production/A079/gui/玩家控制台$66.class new file mode 100644 index 0000000..e23ca19 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$66.class differ diff --git a/out/production/A079/gui/玩家控制台$67.class b/out/production/A079/gui/玩家控制台$67.class new file mode 100644 index 0000000..75ce362 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$67.class differ diff --git a/out/production/A079/gui/玩家控制台$68.class b/out/production/A079/gui/玩家控制台$68.class new file mode 100644 index 0000000..981af2c Binary files /dev/null and b/out/production/A079/gui/玩家控制台$68.class differ diff --git a/out/production/A079/gui/玩家控制台$69.class b/out/production/A079/gui/玩家控制台$69.class new file mode 100644 index 0000000..f43f504 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$69.class differ diff --git a/out/production/A079/gui/玩家控制台$7.class b/out/production/A079/gui/玩家控制台$7.class new file mode 100644 index 0000000..f8a6533 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$7.class differ diff --git a/out/production/A079/gui/玩家控制台$70.class b/out/production/A079/gui/玩家控制台$70.class new file mode 100644 index 0000000..893cb5d Binary files /dev/null and b/out/production/A079/gui/玩家控制台$70.class differ diff --git a/out/production/A079/gui/玩家控制台$71.class b/out/production/A079/gui/玩家控制台$71.class new file mode 100644 index 0000000..97cc353 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$71.class differ diff --git a/out/production/A079/gui/玩家控制台$72.class b/out/production/A079/gui/玩家控制台$72.class new file mode 100644 index 0000000..f7b3252 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$72.class differ diff --git a/out/production/A079/gui/玩家控制台$73.class b/out/production/A079/gui/玩家控制台$73.class new file mode 100644 index 0000000..8b717f8 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$73.class differ diff --git a/out/production/A079/gui/玩家控制台$74.class b/out/production/A079/gui/玩家控制台$74.class new file mode 100644 index 0000000..872b72d Binary files /dev/null and b/out/production/A079/gui/玩家控制台$74.class differ diff --git a/out/production/A079/gui/玩家控制台$75.class b/out/production/A079/gui/玩家控制台$75.class new file mode 100644 index 0000000..83247bf Binary files /dev/null and b/out/production/A079/gui/玩家控制台$75.class differ diff --git a/out/production/A079/gui/玩家控制台$76.class b/out/production/A079/gui/玩家控制台$76.class new file mode 100644 index 0000000..acf8086 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$76.class differ diff --git a/out/production/A079/gui/玩家控制台$77.class b/out/production/A079/gui/玩家控制台$77.class new file mode 100644 index 0000000..74e6a5a Binary files /dev/null and b/out/production/A079/gui/玩家控制台$77.class differ diff --git a/out/production/A079/gui/玩家控制台$78.class b/out/production/A079/gui/玩家控制台$78.class new file mode 100644 index 0000000..24702e5 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$78.class differ diff --git a/out/production/A079/gui/玩家控制台$79.class b/out/production/A079/gui/玩家控制台$79.class new file mode 100644 index 0000000..a840bc7 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$79.class differ diff --git a/out/production/A079/gui/玩家控制台$8.class b/out/production/A079/gui/玩家控制台$8.class new file mode 100644 index 0000000..b35a2cb Binary files /dev/null and b/out/production/A079/gui/玩家控制台$8.class differ diff --git a/out/production/A079/gui/玩家控制台$80.class b/out/production/A079/gui/玩家控制台$80.class new file mode 100644 index 0000000..8326528 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$80.class differ diff --git a/out/production/A079/gui/玩家控制台$81.class b/out/production/A079/gui/玩家控制台$81.class new file mode 100644 index 0000000..3bbece7 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$81.class differ diff --git a/out/production/A079/gui/玩家控制台$82.class b/out/production/A079/gui/玩家控制台$82.class new file mode 100644 index 0000000..c0b56c1 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$82.class differ diff --git a/out/production/A079/gui/玩家控制台$83.class b/out/production/A079/gui/玩家控制台$83.class new file mode 100644 index 0000000..f05b089 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$83.class differ diff --git a/out/production/A079/gui/玩家控制台$84.class b/out/production/A079/gui/玩家控制台$84.class new file mode 100644 index 0000000..371ff04 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$84.class differ diff --git a/out/production/A079/gui/玩家控制台$85.class b/out/production/A079/gui/玩家控制台$85.class new file mode 100644 index 0000000..7f00f40 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$85.class differ diff --git a/out/production/A079/gui/玩家控制台$86.class b/out/production/A079/gui/玩家控制台$86.class new file mode 100644 index 0000000..371a8c9 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$86.class differ diff --git a/out/production/A079/gui/玩家控制台$87.class b/out/production/A079/gui/玩家控制台$87.class new file mode 100644 index 0000000..8d9b336 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$87.class differ diff --git a/out/production/A079/gui/玩家控制台$88.class b/out/production/A079/gui/玩家控制台$88.class new file mode 100644 index 0000000..2bce86a Binary files /dev/null and b/out/production/A079/gui/玩家控制台$88.class differ diff --git a/out/production/A079/gui/玩家控制台$89.class b/out/production/A079/gui/玩家控制台$89.class new file mode 100644 index 0000000..64ed3cb Binary files /dev/null and b/out/production/A079/gui/玩家控制台$89.class differ diff --git a/out/production/A079/gui/玩家控制台$9.class b/out/production/A079/gui/玩家控制台$9.class new file mode 100644 index 0000000..7d8beca Binary files /dev/null and b/out/production/A079/gui/玩家控制台$9.class differ diff --git a/out/production/A079/gui/玩家控制台$90.class b/out/production/A079/gui/玩家控制台$90.class new file mode 100644 index 0000000..8b0fcdb Binary files /dev/null and b/out/production/A079/gui/玩家控制台$90.class differ diff --git a/out/production/A079/gui/玩家控制台$91.class b/out/production/A079/gui/玩家控制台$91.class new file mode 100644 index 0000000..e6ca804 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$91.class differ diff --git a/out/production/A079/gui/玩家控制台$92.class b/out/production/A079/gui/玩家控制台$92.class new file mode 100644 index 0000000..bbf4626 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$92.class differ diff --git a/out/production/A079/gui/玩家控制台$93.class b/out/production/A079/gui/玩家控制台$93.class new file mode 100644 index 0000000..ad2e6a1 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$93.class differ diff --git a/out/production/A079/gui/玩家控制台$94.class b/out/production/A079/gui/玩家控制台$94.class new file mode 100644 index 0000000..2b771c5 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$94.class differ diff --git a/out/production/A079/gui/玩家控制台$95.class b/out/production/A079/gui/玩家控制台$95.class new file mode 100644 index 0000000..760a1ae Binary files /dev/null and b/out/production/A079/gui/玩家控制台$95.class differ diff --git a/out/production/A079/gui/玩家控制台$96.class b/out/production/A079/gui/玩家控制台$96.class new file mode 100644 index 0000000..1cbf8a0 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$96.class differ diff --git a/out/production/A079/gui/玩家控制台$97.class b/out/production/A079/gui/玩家控制台$97.class new file mode 100644 index 0000000..f5bf110 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$97.class differ diff --git a/out/production/A079/gui/玩家控制台$98.class b/out/production/A079/gui/玩家控制台$98.class new file mode 100644 index 0000000..96c4c3b Binary files /dev/null and b/out/production/A079/gui/玩家控制台$98.class differ diff --git a/out/production/A079/gui/玩家控制台$99.class b/out/production/A079/gui/玩家控制台$99.class new file mode 100644 index 0000000..5df38a8 Binary files /dev/null and b/out/production/A079/gui/玩家控制台$99.class differ diff --git a/out/production/A079/gui/玩家控制台.class b/out/production/A079/gui/玩家控制台.class new file mode 100644 index 0000000..a2aafce Binary files /dev/null and b/out/production/A079/gui/玩家控制台.class differ diff --git a/out/production/A079/gui/进阶BOSS/Mushplotact$1.class b/out/production/A079/gui/进阶BOSS/Mushplotact$1.class new file mode 100644 index 0000000..e720baf Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/Mushplotact$1.class differ diff --git a/out/production/A079/gui/进阶BOSS/Mushplotact$2.class b/out/production/A079/gui/进阶BOSS/Mushplotact$2.class new file mode 100644 index 0000000..b2c351c Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/Mushplotact$2.class differ diff --git a/out/production/A079/gui/进阶BOSS/Mushplotact.class b/out/production/A079/gui/进阶BOSS/Mushplotact.class new file mode 100644 index 0000000..6573448 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/Mushplotact.class differ diff --git a/out/production/A079/gui/进阶BOSS/扎昆BOSS线程$1$1.class b/out/production/A079/gui/进阶BOSS/扎昆BOSS线程$1$1.class new file mode 100644 index 0000000..04a5d81 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/扎昆BOSS线程$1$1.class differ diff --git a/out/production/A079/gui/进阶BOSS/扎昆BOSS线程$1$2.class b/out/production/A079/gui/进阶BOSS/扎昆BOSS线程$1$2.class new file mode 100644 index 0000000..bd205c2 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/扎昆BOSS线程$1$2.class differ diff --git a/out/production/A079/gui/进阶BOSS/扎昆BOSS线程$1$3.class b/out/production/A079/gui/进阶BOSS/扎昆BOSS线程$1$3.class new file mode 100644 index 0000000..9567c1f Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/扎昆BOSS线程$1$3.class differ diff --git a/out/production/A079/gui/进阶BOSS/扎昆BOSS线程$1.class b/out/production/A079/gui/进阶BOSS/扎昆BOSS线程$1.class new file mode 100644 index 0000000..69e7aae Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/扎昆BOSS线程$1.class differ diff --git a/out/production/A079/gui/进阶BOSS/扎昆BOSS线程$2.class b/out/production/A079/gui/进阶BOSS/扎昆BOSS线程$2.class new file mode 100644 index 0000000..04eeac2 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/扎昆BOSS线程$2.class differ diff --git a/out/production/A079/gui/进阶BOSS/扎昆BOSS线程.class b/out/production/A079/gui/进阶BOSS/扎昆BOSS线程.class new file mode 100644 index 0000000..5aac5e0 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/扎昆BOSS线程.class differ diff --git a/out/production/A079/gui/进阶BOSS/捉鬼任务线程$1$1.class b/out/production/A079/gui/进阶BOSS/捉鬼任务线程$1$1.class new file mode 100644 index 0000000..292c058 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/捉鬼任务线程$1$1.class differ diff --git a/out/production/A079/gui/进阶BOSS/捉鬼任务线程$1$2.class b/out/production/A079/gui/进阶BOSS/捉鬼任务线程$1$2.class new file mode 100644 index 0000000..ac8548c Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/捉鬼任务线程$1$2.class differ diff --git a/out/production/A079/gui/进阶BOSS/捉鬼任务线程$1$3.class b/out/production/A079/gui/进阶BOSS/捉鬼任务线程$1$3.class new file mode 100644 index 0000000..e8f37d2 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/捉鬼任务线程$1$3.class differ diff --git a/out/production/A079/gui/进阶BOSS/捉鬼任务线程$1.class b/out/production/A079/gui/进阶BOSS/捉鬼任务线程$1.class new file mode 100644 index 0000000..a015b1f Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/捉鬼任务线程$1.class differ diff --git a/out/production/A079/gui/进阶BOSS/捉鬼任务线程$2.class b/out/production/A079/gui/进阶BOSS/捉鬼任务线程$2.class new file mode 100644 index 0000000..8d9aea9 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/捉鬼任务线程$2.class differ diff --git a/out/production/A079/gui/进阶BOSS/捉鬼任务线程.class b/out/production/A079/gui/进阶BOSS/捉鬼任务线程.class new file mode 100644 index 0000000..22526b7 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/捉鬼任务线程.class differ diff --git a/out/production/A079/gui/进阶BOSS/活动捉鬼任务$1.class b/out/production/A079/gui/进阶BOSS/活动捉鬼任务$1.class new file mode 100644 index 0000000..d9b6fe3 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/活动捉鬼任务$1.class differ diff --git a/out/production/A079/gui/进阶BOSS/活动捉鬼任务.class b/out/production/A079/gui/进阶BOSS/活动捉鬼任务.class new file mode 100644 index 0000000..3787f8c Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/活动捉鬼任务.class differ diff --git a/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程$1$1.class b/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程$1$1.class new file mode 100644 index 0000000..c4d3953 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程$1$1.class differ diff --git a/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程$1$2.class b/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程$1$2.class new file mode 100644 index 0000000..257dfb7 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程$1$2.class differ diff --git a/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程$1$3.class b/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程$1$3.class new file mode 100644 index 0000000..0351aa7 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程$1$3.class differ diff --git a/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程$1.class b/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程$1.class new file mode 100644 index 0000000..101786b Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程$1.class differ diff --git a/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程$2.class b/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程$2.class new file mode 100644 index 0000000..5451e7c Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程$2.class differ diff --git a/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程.class b/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程.class new file mode 100644 index 0000000..a5d18c8 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/蘑辣插BOSS线程.class differ diff --git a/out/production/A079/gui/进阶BOSS/黑龙BOSS线程$1$1.class b/out/production/A079/gui/进阶BOSS/黑龙BOSS线程$1$1.class new file mode 100644 index 0000000..9fa3bcf Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/黑龙BOSS线程$1$1.class differ diff --git a/out/production/A079/gui/进阶BOSS/黑龙BOSS线程$1$2.class b/out/production/A079/gui/进阶BOSS/黑龙BOSS线程$1$2.class new file mode 100644 index 0000000..6f543e7 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/黑龙BOSS线程$1$2.class differ diff --git a/out/production/A079/gui/进阶BOSS/黑龙BOSS线程$1$3.class b/out/production/A079/gui/进阶BOSS/黑龙BOSS线程$1$3.class new file mode 100644 index 0000000..31d6353 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/黑龙BOSS线程$1$3.class differ diff --git a/out/production/A079/gui/进阶BOSS/黑龙BOSS线程$1.class b/out/production/A079/gui/进阶BOSS/黑龙BOSS线程$1.class new file mode 100644 index 0000000..22fd7ce Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/黑龙BOSS线程$1.class differ diff --git a/out/production/A079/gui/进阶BOSS/黑龙BOSS线程$2.class b/out/production/A079/gui/进阶BOSS/黑龙BOSS线程$2.class new file mode 100644 index 0000000..3412cc9 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/黑龙BOSS线程$2.class differ diff --git a/out/production/A079/gui/进阶BOSS/黑龙BOSS线程.class b/out/production/A079/gui/进阶BOSS/黑龙BOSS线程.class new file mode 100644 index 0000000..401fff5 Binary files /dev/null and b/out/production/A079/gui/进阶BOSS/黑龙BOSS线程.class differ diff --git a/out/production/A079/handling/ExternalCodeTableGetter$1.class b/out/production/A079/handling/ExternalCodeTableGetter$1.class new file mode 100644 index 0000000..4a23a09 Binary files /dev/null and b/out/production/A079/handling/ExternalCodeTableGetter$1.class differ diff --git a/out/production/A079/handling/ExternalCodeTableGetter.class b/out/production/A079/handling/ExternalCodeTableGetter.class new file mode 100644 index 0000000..886b16b Binary files /dev/null and b/out/production/A079/handling/ExternalCodeTableGetter.class differ diff --git a/out/production/A079/handling/MapleServerHandler$1.class b/out/production/A079/handling/MapleServerHandler$1.class new file mode 100644 index 0000000..6c3a7f0 Binary files /dev/null and b/out/production/A079/handling/MapleServerHandler$1.class differ diff --git a/out/production/A079/handling/MapleServerHandler.class b/out/production/A079/handling/MapleServerHandler.class new file mode 100644 index 0000000..b9caba2 Binary files /dev/null and b/out/production/A079/handling/MapleServerHandler.class differ diff --git a/out/production/A079/handling/RecvPacketOpcode.class b/out/production/A079/handling/RecvPacketOpcode.class new file mode 100644 index 0000000..963df51 Binary files /dev/null and b/out/production/A079/handling/RecvPacketOpcode.class differ diff --git a/out/production/A079/handling/SendPacketOpcode.class b/out/production/A079/handling/SendPacketOpcode.class new file mode 100644 index 0000000..6626150 Binary files /dev/null and b/out/production/A079/handling/SendPacketOpcode.class differ diff --git a/out/production/A079/handling/WritableIntValueHolder.class b/out/production/A079/handling/WritableIntValueHolder.class new file mode 100644 index 0000000..031ea5c Binary files /dev/null and b/out/production/A079/handling/WritableIntValueHolder.class differ diff --git a/out/production/A079/handling/cashshop/CashShopServer.class b/out/production/A079/handling/cashshop/CashShopServer.class new file mode 100644 index 0000000..1285ed4 Binary files /dev/null and b/out/production/A079/handling/cashshop/CashShopServer.class differ diff --git a/out/production/A079/handling/cashshop/handler/CashShopOperation.class b/out/production/A079/handling/cashshop/handler/CashShopOperation.class new file mode 100644 index 0000000..6f249ec Binary files /dev/null and b/out/production/A079/handling/cashshop/handler/CashShopOperation.class differ diff --git a/out/production/A079/handling/cashshop/handler/MTSOperation.class b/out/production/A079/handling/cashshop/handler/MTSOperation.class new file mode 100644 index 0000000..7eaea01 Binary files /dev/null and b/out/production/A079/handling/cashshop/handler/MTSOperation.class differ diff --git a/out/production/A079/handling/channel/ChannelServer.class b/out/production/A079/handling/channel/ChannelServer.class new file mode 100644 index 0000000..29fe588 Binary files /dev/null and b/out/production/A079/handling/channel/ChannelServer.class differ diff --git a/out/production/A079/handling/channel/MapleGuildRanking$GuildRankingInfo.class b/out/production/A079/handling/channel/MapleGuildRanking$GuildRankingInfo.class new file mode 100644 index 0000000..1311560 Binary files /dev/null and b/out/production/A079/handling/channel/MapleGuildRanking$GuildRankingInfo.class differ diff --git a/out/production/A079/handling/channel/MapleGuildRanking$JobRankingInfo.class b/out/production/A079/handling/channel/MapleGuildRanking$JobRankingInfo.class new file mode 100644 index 0000000..db15665 Binary files /dev/null and b/out/production/A079/handling/channel/MapleGuildRanking$JobRankingInfo.class differ diff --git a/out/production/A079/handling/channel/MapleGuildRanking$bossLogRankingInfo.class b/out/production/A079/handling/channel/MapleGuildRanking$bossLogRankingInfo.class new file mode 100644 index 0000000..78b7679 Binary files /dev/null and b/out/production/A079/handling/channel/MapleGuildRanking$bossLogRankingInfo.class differ diff --git a/out/production/A079/handling/channel/MapleGuildRanking$levelRankingInfo.class b/out/production/A079/handling/channel/MapleGuildRanking$levelRankingInfo.class new file mode 100644 index 0000000..55257d5 Binary files /dev/null and b/out/production/A079/handling/channel/MapleGuildRanking$levelRankingInfo.class differ diff --git a/out/production/A079/handling/channel/MapleGuildRanking$mesoRankingInfo.class b/out/production/A079/handling/channel/MapleGuildRanking$mesoRankingInfo.class new file mode 100644 index 0000000..e947d5b Binary files /dev/null and b/out/production/A079/handling/channel/MapleGuildRanking$mesoRankingInfo.class differ diff --git a/out/production/A079/handling/channel/MapleGuildRanking.class b/out/production/A079/handling/channel/MapleGuildRanking.class new file mode 100644 index 0000000..0a106d0 Binary files /dev/null and b/out/production/A079/handling/channel/MapleGuildRanking.class differ diff --git a/out/production/A079/handling/channel/PlayerStorage$PersistingTask.class b/out/production/A079/handling/channel/PlayerStorage$PersistingTask.class new file mode 100644 index 0000000..869b621 Binary files /dev/null and b/out/production/A079/handling/channel/PlayerStorage$PersistingTask.class differ diff --git a/out/production/A079/handling/channel/PlayerStorage.class b/out/production/A079/handling/channel/PlayerStorage.class new file mode 100644 index 0000000..0b445e1 Binary files /dev/null and b/out/production/A079/handling/channel/PlayerStorage.class differ diff --git a/out/production/A079/handling/channel/handler/AllianceHandler.class b/out/production/A079/handling/channel/handler/AllianceHandler.class new file mode 100644 index 0000000..6dbb53b Binary files /dev/null and b/out/production/A079/handling/channel/handler/AllianceHandler.class differ diff --git a/out/production/A079/handling/channel/handler/AttackInfo.class b/out/production/A079/handling/channel/handler/AttackInfo.class new file mode 100644 index 0000000..838c020 Binary files /dev/null and b/out/production/A079/handling/channel/handler/AttackInfo.class differ diff --git a/out/production/A079/handling/channel/handler/AttackType.class b/out/production/A079/handling/channel/handler/AttackType.class new file mode 100644 index 0000000..bf601de Binary files /dev/null and b/out/production/A079/handling/channel/handler/AttackType.class differ diff --git a/out/production/A079/handling/channel/handler/BBSHandler$1.class b/out/production/A079/handling/channel/handler/BBSHandler$1.class new file mode 100644 index 0000000..54c95c1 Binary files /dev/null and b/out/production/A079/handling/channel/handler/BBSHandler$1.class differ diff --git a/out/production/A079/handling/channel/handler/BBSHandler$BBSOperation.class b/out/production/A079/handling/channel/handler/BBSHandler$BBSOperation.class new file mode 100644 index 0000000..d230be2 Binary files /dev/null and b/out/production/A079/handling/channel/handler/BBSHandler$BBSOperation.class differ diff --git a/out/production/A079/handling/channel/handler/BBSHandler.class b/out/production/A079/handling/channel/handler/BBSHandler.class new file mode 100644 index 0000000..b0e67fa Binary files /dev/null and b/out/production/A079/handling/channel/handler/BBSHandler.class differ diff --git a/out/production/A079/handling/channel/handler/BeanGame$BeansType.class b/out/production/A079/handling/channel/handler/BeanGame$BeansType.class new file mode 100644 index 0000000..48596e5 Binary files /dev/null and b/out/production/A079/handling/channel/handler/BeanGame$BeansType.class differ diff --git a/out/production/A079/handling/channel/handler/BeanGame.class b/out/production/A079/handling/channel/handler/BeanGame.class new file mode 100644 index 0000000..3e4d233 Binary files /dev/null and b/out/production/A079/handling/channel/handler/BeanGame.class differ diff --git a/out/production/A079/handling/channel/handler/BuddyListHandler.class b/out/production/A079/handling/channel/handler/BuddyListHandler.class new file mode 100644 index 0000000..7d70f95 Binary files /dev/null and b/out/production/A079/handling/channel/handler/BuddyListHandler.class differ diff --git a/out/production/A079/handling/channel/handler/ChatHandler$1$1.class b/out/production/A079/handling/channel/handler/ChatHandler$1$1.class new file mode 100644 index 0000000..9c36e99 Binary files /dev/null and b/out/production/A079/handling/channel/handler/ChatHandler$1$1.class differ diff --git a/out/production/A079/handling/channel/handler/ChatHandler$1.class b/out/production/A079/handling/channel/handler/ChatHandler$1.class new file mode 100644 index 0000000..3d2d19f Binary files /dev/null and b/out/production/A079/handling/channel/handler/ChatHandler$1.class differ diff --git a/out/production/A079/handling/channel/handler/ChatHandler.class b/out/production/A079/handling/channel/handler/ChatHandler.class new file mode 100644 index 0000000..48068e1 Binary files /dev/null and b/out/production/A079/handling/channel/handler/ChatHandler.class differ diff --git a/out/production/A079/handling/channel/handler/DamageParse$1.class b/out/production/A079/handling/channel/handler/DamageParse$1.class new file mode 100644 index 0000000..dd69adb Binary files /dev/null and b/out/production/A079/handling/channel/handler/DamageParse$1.class differ diff --git a/out/production/A079/handling/channel/handler/DamageParse.class b/out/production/A079/handling/channel/handler/DamageParse.class new file mode 100644 index 0000000..c79b80a Binary files /dev/null and b/out/production/A079/handling/channel/handler/DamageParse.class differ diff --git a/out/production/A079/handling/channel/handler/DueyHandler.class b/out/production/A079/handling/channel/handler/DueyHandler.class new file mode 100644 index 0000000..c888cfc Binary files /dev/null and b/out/production/A079/handling/channel/handler/DueyHandler.class differ diff --git a/out/production/A079/handling/channel/handler/FamilyHandler.class b/out/production/A079/handling/channel/handler/FamilyHandler.class new file mode 100644 index 0000000..998b256 Binary files /dev/null and b/out/production/A079/handling/channel/handler/FamilyHandler.class differ diff --git a/out/production/A079/handling/channel/handler/GuildHandler$1.class b/out/production/A079/handling/channel/handler/GuildHandler$1.class new file mode 100644 index 0000000..4de7380 Binary files /dev/null and b/out/production/A079/handling/channel/handler/GuildHandler$1.class differ diff --git a/out/production/A079/handling/channel/handler/GuildHandler$GuildOperation.class b/out/production/A079/handling/channel/handler/GuildHandler$GuildOperation.class new file mode 100644 index 0000000..fb8dbb5 Binary files /dev/null and b/out/production/A079/handling/channel/handler/GuildHandler$GuildOperation.class differ diff --git a/out/production/A079/handling/channel/handler/GuildHandler$Invited.class b/out/production/A079/handling/channel/handler/GuildHandler$Invited.class new file mode 100644 index 0000000..01f0307 Binary files /dev/null and b/out/production/A079/handling/channel/handler/GuildHandler$Invited.class differ diff --git a/out/production/A079/handling/channel/handler/GuildHandler.class b/out/production/A079/handling/channel/handler/GuildHandler.class new file mode 100644 index 0000000..a9bdeb2 Binary files /dev/null and b/out/production/A079/handling/channel/handler/GuildHandler.class differ diff --git a/out/production/A079/handling/channel/handler/HiredMerchantHandler.class b/out/production/A079/handling/channel/handler/HiredMerchantHandler.class new file mode 100644 index 0000000..60a4751 Binary files /dev/null and b/out/production/A079/handling/channel/handler/HiredMerchantHandler.class differ diff --git a/out/production/A079/handling/channel/handler/InterServerHandler.class b/out/production/A079/handling/channel/handler/InterServerHandler.class new file mode 100644 index 0000000..92f38ac Binary files /dev/null and b/out/production/A079/handling/channel/handler/InterServerHandler.class differ diff --git a/out/production/A079/handling/channel/handler/InventoryHandler$1.class b/out/production/A079/handling/channel/handler/InventoryHandler$1.class new file mode 100644 index 0000000..4b3fc8d Binary files /dev/null and b/out/production/A079/handling/channel/handler/InventoryHandler$1.class differ diff --git a/out/production/A079/handling/channel/handler/InventoryHandler.class b/out/production/A079/handling/channel/handler/InventoryHandler.class new file mode 100644 index 0000000..a980196 Binary files /dev/null and b/out/production/A079/handling/channel/handler/InventoryHandler.class differ diff --git a/out/production/A079/handling/channel/handler/ItemMakerHandler.class b/out/production/A079/handling/channel/handler/ItemMakerHandler.class new file mode 100644 index 0000000..e874226 Binary files /dev/null and b/out/production/A079/handling/channel/handler/ItemMakerHandler.class differ diff --git a/out/production/A079/handling/channel/handler/MobConstants.class b/out/production/A079/handling/channel/handler/MobConstants.class new file mode 100644 index 0000000..0cc0eeb Binary files /dev/null and b/out/production/A079/handling/channel/handler/MobConstants.class differ diff --git a/out/production/A079/handling/channel/handler/MobHandler.class b/out/production/A079/handling/channel/handler/MobHandler.class new file mode 100644 index 0000000..5f9c081 Binary files /dev/null and b/out/production/A079/handling/channel/handler/MobHandler.class differ diff --git a/out/production/A079/handling/channel/handler/MonsterCarnivalHandler.class b/out/production/A079/handling/channel/handler/MonsterCarnivalHandler.class new file mode 100644 index 0000000..d872b6e Binary files /dev/null and b/out/production/A079/handling/channel/handler/MonsterCarnivalHandler.class differ diff --git a/out/production/A079/handling/channel/handler/MovementParse.class b/out/production/A079/handling/channel/handler/MovementParse.class new file mode 100644 index 0000000..d768329 Binary files /dev/null and b/out/production/A079/handling/channel/handler/MovementParse.class differ diff --git a/out/production/A079/handling/channel/handler/NPCHandler.class b/out/production/A079/handling/channel/handler/NPCHandler.class new file mode 100644 index 0000000..368ca0d Binary files /dev/null and b/out/production/A079/handling/channel/handler/NPCHandler.class differ diff --git a/out/production/A079/handling/channel/handler/PartyHandler.class b/out/production/A079/handling/channel/handler/PartyHandler.class new file mode 100644 index 0000000..f83937c Binary files /dev/null and b/out/production/A079/handling/channel/handler/PartyHandler.class differ diff --git a/out/production/A079/handling/channel/handler/PetHandler.class b/out/production/A079/handling/channel/handler/PetHandler.class new file mode 100644 index 0000000..d8f6e3c Binary files /dev/null and b/out/production/A079/handling/channel/handler/PetHandler.class differ diff --git a/out/production/A079/handling/channel/handler/PlayerHandler$1.class b/out/production/A079/handling/channel/handler/PlayerHandler$1.class new file mode 100644 index 0000000..8669879 Binary files /dev/null and b/out/production/A079/handling/channel/handler/PlayerHandler$1.class differ diff --git a/out/production/A079/handling/channel/handler/PlayerHandler$2.class b/out/production/A079/handling/channel/handler/PlayerHandler$2.class new file mode 100644 index 0000000..55bd816 Binary files /dev/null and b/out/production/A079/handling/channel/handler/PlayerHandler$2.class differ diff --git a/out/production/A079/handling/channel/handler/PlayerHandler$3.class b/out/production/A079/handling/channel/handler/PlayerHandler$3.class new file mode 100644 index 0000000..5836ca8 Binary files /dev/null and b/out/production/A079/handling/channel/handler/PlayerHandler$3.class differ diff --git a/out/production/A079/handling/channel/handler/PlayerHandler$4.class b/out/production/A079/handling/channel/handler/PlayerHandler$4.class new file mode 100644 index 0000000..a35ca69 Binary files /dev/null and b/out/production/A079/handling/channel/handler/PlayerHandler$4.class differ diff --git a/out/production/A079/handling/channel/handler/PlayerHandler$5.class b/out/production/A079/handling/channel/handler/PlayerHandler$5.class new file mode 100644 index 0000000..94278e4 Binary files /dev/null and b/out/production/A079/handling/channel/handler/PlayerHandler$5.class differ diff --git a/out/production/A079/handling/channel/handler/PlayerHandler.class b/out/production/A079/handling/channel/handler/PlayerHandler.class new file mode 100644 index 0000000..0b6f400 Binary files /dev/null and b/out/production/A079/handling/channel/handler/PlayerHandler.class differ diff --git a/out/production/A079/handling/channel/handler/PlayerInteractionHandler.class b/out/production/A079/handling/channel/handler/PlayerInteractionHandler.class new file mode 100644 index 0000000..5beaa5c Binary files /dev/null and b/out/production/A079/handling/channel/handler/PlayerInteractionHandler.class differ diff --git a/out/production/A079/handling/channel/handler/PlayersHandler$1.class b/out/production/A079/handling/channel/handler/PlayersHandler$1.class new file mode 100644 index 0000000..dc8056b Binary files /dev/null and b/out/production/A079/handling/channel/handler/PlayersHandler$1.class differ diff --git a/out/production/A079/handling/channel/handler/PlayersHandler.class b/out/production/A079/handling/channel/handler/PlayersHandler.class new file mode 100644 index 0000000..4c9633a Binary files /dev/null and b/out/production/A079/handling/channel/handler/PlayersHandler.class differ diff --git a/out/production/A079/handling/channel/handler/SkillConstants.class b/out/production/A079/handling/channel/handler/SkillConstants.class new file mode 100644 index 0000000..1dad5cd Binary files /dev/null and b/out/production/A079/handling/channel/handler/SkillConstants.class differ diff --git a/out/production/A079/handling/channel/handler/StatsHandling$1.class b/out/production/A079/handling/channel/handler/StatsHandling$1.class new file mode 100644 index 0000000..0e223b0 Binary files /dev/null and b/out/production/A079/handling/channel/handler/StatsHandling$1.class differ diff --git a/out/production/A079/handling/channel/handler/StatsHandling.class b/out/production/A079/handling/channel/handler/StatsHandling.class new file mode 100644 index 0000000..0ebbfb5 Binary files /dev/null and b/out/production/A079/handling/channel/handler/StatsHandling.class differ diff --git a/out/production/A079/handling/channel/handler/SummonHandler.class b/out/production/A079/handling/channel/handler/SummonHandler.class new file mode 100644 index 0000000..f12e466 Binary files /dev/null and b/out/production/A079/handling/channel/handler/SummonHandler.class differ diff --git a/out/production/A079/handling/channel/handler/UserInterfaceHandler.class b/out/production/A079/handling/channel/handler/UserInterfaceHandler.class new file mode 100644 index 0000000..b619546 Binary files /dev/null and b/out/production/A079/handling/channel/handler/UserInterfaceHandler.class differ diff --git a/out/production/A079/handling/channel/handler/ViciousHammerHandler.class b/out/production/A079/handling/channel/handler/ViciousHammerHandler.class new file mode 100644 index 0000000..96ef011 Binary files /dev/null and b/out/production/A079/handling/channel/handler/ViciousHammerHandler.class differ diff --git a/out/production/A079/handling/channel/handler/WorldConstants.class b/out/production/A079/handling/channel/handler/WorldConstants.class new file mode 100644 index 0000000..6113c7a Binary files /dev/null and b/out/production/A079/handling/channel/handler/WorldConstants.class differ diff --git a/out/production/A079/handling/login/AccountStorage.class b/out/production/A079/handling/login/AccountStorage.class new file mode 100644 index 0000000..ee92927 Binary files /dev/null and b/out/production/A079/handling/login/AccountStorage.class differ diff --git a/out/production/A079/handling/login/LoginInformationProvider.class b/out/production/A079/handling/login/LoginInformationProvider.class new file mode 100644 index 0000000..48b5cf6 Binary files /dev/null and b/out/production/A079/handling/login/LoginInformationProvider.class differ diff --git a/out/production/A079/handling/login/LoginServer.class b/out/production/A079/handling/login/LoginServer.class new file mode 100644 index 0000000..50a9549 Binary files /dev/null and b/out/production/A079/handling/login/LoginServer.class differ diff --git a/out/production/A079/handling/login/LoginWorker$1.class b/out/production/A079/handling/login/LoginWorker$1.class new file mode 100644 index 0000000..ba69b47 Binary files /dev/null and b/out/production/A079/handling/login/LoginWorker$1.class differ diff --git a/out/production/A079/handling/login/LoginWorker.class b/out/production/A079/handling/login/LoginWorker.class new file mode 100644 index 0000000..ecf62f1 Binary files /dev/null and b/out/production/A079/handling/login/LoginWorker.class differ diff --git a/out/production/A079/handling/login/handler/AutoRegister.class b/out/production/A079/handling/login/handler/AutoRegister.class new file mode 100644 index 0000000..bd5a1ec Binary files /dev/null and b/out/production/A079/handling/login/handler/AutoRegister.class differ diff --git a/out/production/A079/handling/login/handler/CharLoginHandler.class b/out/production/A079/handling/login/handler/CharLoginHandler.class new file mode 100644 index 0000000..034e742 Binary files /dev/null and b/out/production/A079/handling/login/handler/CharLoginHandler.class differ diff --git a/out/production/A079/handling/mina/MaplePacketDecoder$DecoderState.class b/out/production/A079/handling/mina/MaplePacketDecoder$DecoderState.class new file mode 100644 index 0000000..732ab52 Binary files /dev/null and b/out/production/A079/handling/mina/MaplePacketDecoder$DecoderState.class differ diff --git a/out/production/A079/handling/mina/MaplePacketDecoder.class b/out/production/A079/handling/mina/MaplePacketDecoder.class new file mode 100644 index 0000000..5b4708f Binary files /dev/null and b/out/production/A079/handling/mina/MaplePacketDecoder.class differ diff --git a/out/production/A079/handling/mina/MaplePacketEncoder.class b/out/production/A079/handling/mina/MaplePacketEncoder.class new file mode 100644 index 0000000..422944b Binary files /dev/null and b/out/production/A079/handling/mina/MaplePacketEncoder.class differ diff --git a/out/production/A079/handling/mina/ServerConnection.class b/out/production/A079/handling/mina/ServerConnection.class new file mode 100644 index 0000000..ba8124f Binary files /dev/null and b/out/production/A079/handling/mina/ServerConnection.class differ diff --git a/out/production/A079/handling/mina/ServerInitializer.class b/out/production/A079/handling/mina/ServerInitializer.class new file mode 100644 index 0000000..dd6baf0 Binary files /dev/null and b/out/production/A079/handling/mina/ServerInitializer.class differ diff --git a/out/production/A079/handling/world/CharacterIdChannelPair.class b/out/production/A079/handling/world/CharacterIdChannelPair.class new file mode 100644 index 0000000..c253d45 Binary files /dev/null and b/out/production/A079/handling/world/CharacterIdChannelPair.class differ diff --git a/out/production/A079/handling/world/CharacterTransfer.class b/out/production/A079/handling/world/CharacterTransfer.class new file mode 100644 index 0000000..48e927f Binary files /dev/null and b/out/production/A079/handling/world/CharacterTransfer.class differ diff --git a/out/production/A079/handling/world/CheaterData.class b/out/production/A079/handling/world/CheaterData.class new file mode 100644 index 0000000..f5c1afa Binary files /dev/null and b/out/production/A079/handling/world/CheaterData.class differ diff --git a/out/production/A079/handling/world/MapleCharacterLook.class b/out/production/A079/handling/world/MapleCharacterLook.class new file mode 100644 index 0000000..1acfe12 Binary files /dev/null and b/out/production/A079/handling/world/MapleCharacterLook.class differ diff --git a/out/production/A079/handling/world/MapleMessenger.class b/out/production/A079/handling/world/MapleMessenger.class new file mode 100644 index 0000000..cf47e6b Binary files /dev/null and b/out/production/A079/handling/world/MapleMessenger.class differ diff --git a/out/production/A079/handling/world/MapleMessengerCharacter.class b/out/production/A079/handling/world/MapleMessengerCharacter.class new file mode 100644 index 0000000..6c10e59 Binary files /dev/null and b/out/production/A079/handling/world/MapleMessengerCharacter.class differ diff --git a/out/production/A079/handling/world/MapleParty.class b/out/production/A079/handling/world/MapleParty.class new file mode 100644 index 0000000..7a4672c Binary files /dev/null and b/out/production/A079/handling/world/MapleParty.class differ diff --git a/out/production/A079/handling/world/MaplePartyCharacter.class b/out/production/A079/handling/world/MaplePartyCharacter.class new file mode 100644 index 0000000..fd35e04 Binary files /dev/null and b/out/production/A079/handling/world/MaplePartyCharacter.class differ diff --git a/out/production/A079/handling/world/PartyOperation.class b/out/production/A079/handling/world/PartyOperation.class new file mode 100644 index 0000000..7282c6e Binary files /dev/null and b/out/production/A079/handling/world/PartyOperation.class differ diff --git a/out/production/A079/handling/world/PlayerBuffStorage.class b/out/production/A079/handling/world/PlayerBuffStorage.class new file mode 100644 index 0000000..d39297c Binary files /dev/null and b/out/production/A079/handling/world/PlayerBuffStorage.class differ diff --git a/out/production/A079/handling/world/PlayerBuffValueHolder.class b/out/production/A079/handling/world/PlayerBuffValueHolder.class new file mode 100644 index 0000000..f204eaa Binary files /dev/null and b/out/production/A079/handling/world/PlayerBuffValueHolder.class differ diff --git a/out/production/A079/handling/world/World$1.class b/out/production/A079/handling/world/World$1.class new file mode 100644 index 0000000..d9d153a Binary files /dev/null and b/out/production/A079/handling/world/World$1.class differ diff --git a/out/production/A079/handling/world/World$2.class b/out/production/A079/handling/world/World$2.class new file mode 100644 index 0000000..778ff07 Binary files /dev/null and b/out/production/A079/handling/world/World$2.class differ diff --git a/out/production/A079/handling/world/World$3.class b/out/production/A079/handling/world/World$3.class new file mode 100644 index 0000000..75f4e89 Binary files /dev/null and b/out/production/A079/handling/world/World$3.class differ diff --git a/out/production/A079/handling/world/World$4.class b/out/production/A079/handling/world/World$4.class new file mode 100644 index 0000000..2da428c Binary files /dev/null and b/out/production/A079/handling/world/World$4.class differ diff --git a/out/production/A079/handling/world/World$5.class b/out/production/A079/handling/world/World$5.class new file mode 100644 index 0000000..7e6d815 Binary files /dev/null and b/out/production/A079/handling/world/World$5.class differ diff --git a/out/production/A079/handling/world/World$6.class b/out/production/A079/handling/world/World$6.class new file mode 100644 index 0000000..a3b308c Binary files /dev/null and b/out/production/A079/handling/world/World$6.class differ diff --git a/out/production/A079/handling/world/World$Alliance.class b/out/production/A079/handling/world/World$Alliance.class new file mode 100644 index 0000000..0cf0b16 Binary files /dev/null and b/out/production/A079/handling/world/World$Alliance.class differ diff --git a/out/production/A079/handling/world/World$Broadcast.class b/out/production/A079/handling/world/World$Broadcast.class new file mode 100644 index 0000000..0c4aaf8 Binary files /dev/null and b/out/production/A079/handling/world/World$Broadcast.class differ diff --git a/out/production/A079/handling/world/World$Buddy.class b/out/production/A079/handling/world/World$Buddy.class new file mode 100644 index 0000000..7cca542 Binary files /dev/null and b/out/production/A079/handling/world/World$Buddy.class differ diff --git a/out/production/A079/handling/world/World$Family.class b/out/production/A079/handling/world/World$Family.class new file mode 100644 index 0000000..f21a9b5 Binary files /dev/null and b/out/production/A079/handling/world/World$Family.class differ diff --git a/out/production/A079/handling/world/World$Find.class b/out/production/A079/handling/world/World$Find.class new file mode 100644 index 0000000..2b0208d Binary files /dev/null and b/out/production/A079/handling/world/World$Find.class differ diff --git a/out/production/A079/handling/world/World$Guild.class b/out/production/A079/handling/world/World$Guild.class new file mode 100644 index 0000000..466cb9b Binary files /dev/null and b/out/production/A079/handling/world/World$Guild.class differ diff --git a/out/production/A079/handling/world/World$Messenger.class b/out/production/A079/handling/world/World$Messenger.class new file mode 100644 index 0000000..eda2b74 Binary files /dev/null and b/out/production/A079/handling/world/World$Messenger.class differ diff --git a/out/production/A079/handling/world/World$Party.class b/out/production/A079/handling/world/World$Party.class new file mode 100644 index 0000000..d5dda63 Binary files /dev/null and b/out/production/A079/handling/world/World$Party.class differ diff --git a/out/production/A079/handling/world/World$Respawn.class b/out/production/A079/handling/world/World$Respawn.class new file mode 100644 index 0000000..41bc091 Binary files /dev/null and b/out/production/A079/handling/world/World$Respawn.class differ diff --git a/out/production/A079/handling/world/World.class b/out/production/A079/handling/world/World.class new file mode 100644 index 0000000..91b9fe6 Binary files /dev/null and b/out/production/A079/handling/world/World.class differ diff --git a/out/production/A079/handling/world/family/MapleFamily$FCOp.class b/out/production/A079/handling/world/family/MapleFamily$FCOp.class new file mode 100644 index 0000000..623f31c Binary files /dev/null and b/out/production/A079/handling/world/family/MapleFamily$FCOp.class differ diff --git a/out/production/A079/handling/world/family/MapleFamily.class b/out/production/A079/handling/world/family/MapleFamily.class new file mode 100644 index 0000000..785b92c Binary files /dev/null and b/out/production/A079/handling/world/family/MapleFamily.class differ diff --git a/out/production/A079/handling/world/family/MapleFamilyBuff$MapleFamilyBuffEntry.class b/out/production/A079/handling/world/family/MapleFamilyBuff$MapleFamilyBuffEntry.class new file mode 100644 index 0000000..c5b23c8 Binary files /dev/null and b/out/production/A079/handling/world/family/MapleFamilyBuff$MapleFamilyBuffEntry.class differ diff --git a/out/production/A079/handling/world/family/MapleFamilyBuff.class b/out/production/A079/handling/world/family/MapleFamilyBuff.class new file mode 100644 index 0000000..b0e5339 Binary files /dev/null and b/out/production/A079/handling/world/family/MapleFamilyBuff.class differ diff --git a/out/production/A079/handling/world/family/MapleFamilyCharacter.class b/out/production/A079/handling/world/family/MapleFamilyCharacter.class new file mode 100644 index 0000000..1f7383c Binary files /dev/null and b/out/production/A079/handling/world/family/MapleFamilyCharacter.class differ diff --git a/out/production/A079/handling/world/guild/MapleBBSThread$MapleBBSReply.class b/out/production/A079/handling/world/guild/MapleBBSThread$MapleBBSReply.class new file mode 100644 index 0000000..248db7c Binary files /dev/null and b/out/production/A079/handling/world/guild/MapleBBSThread$MapleBBSReply.class differ diff --git a/out/production/A079/handling/world/guild/MapleBBSThread$ThreadComparator.class b/out/production/A079/handling/world/guild/MapleBBSThread$ThreadComparator.class new file mode 100644 index 0000000..59e220c Binary files /dev/null and b/out/production/A079/handling/world/guild/MapleBBSThread$ThreadComparator.class differ diff --git a/out/production/A079/handling/world/guild/MapleBBSThread.class b/out/production/A079/handling/world/guild/MapleBBSThread.class new file mode 100644 index 0000000..b506810 Binary files /dev/null and b/out/production/A079/handling/world/guild/MapleBBSThread.class differ diff --git a/out/production/A079/handling/world/guild/MapleGuild$BCOp.class b/out/production/A079/handling/world/guild/MapleGuild$BCOp.class new file mode 100644 index 0000000..f0cbce8 Binary files /dev/null and b/out/production/A079/handling/world/guild/MapleGuild$BCOp.class differ diff --git a/out/production/A079/handling/world/guild/MapleGuild.class b/out/production/A079/handling/world/guild/MapleGuild.class new file mode 100644 index 0000000..f6fa98e Binary files /dev/null and b/out/production/A079/handling/world/guild/MapleGuild.class differ diff --git a/out/production/A079/handling/world/guild/MapleGuildAlliance$GAOp.class b/out/production/A079/handling/world/guild/MapleGuildAlliance$GAOp.class new file mode 100644 index 0000000..319e9a3 Binary files /dev/null and b/out/production/A079/handling/world/guild/MapleGuildAlliance$GAOp.class differ diff --git a/out/production/A079/handling/world/guild/MapleGuildAlliance.class b/out/production/A079/handling/world/guild/MapleGuildAlliance.class new file mode 100644 index 0000000..6e3a57a Binary files /dev/null and b/out/production/A079/handling/world/guild/MapleGuildAlliance.class differ diff --git a/out/production/A079/handling/world/guild/MapleGuildCharacter.class b/out/production/A079/handling/world/guild/MapleGuildCharacter.class new file mode 100644 index 0000000..a7bd3b0 Binary files /dev/null and b/out/production/A079/handling/world/guild/MapleGuildCharacter.class differ diff --git a/out/production/A079/handling/world/guild/MapleGuildResponse.class b/out/production/A079/handling/world/guild/MapleGuildResponse.class new file mode 100644 index 0000000..0aad406 Binary files /dev/null and b/out/production/A079/handling/world/guild/MapleGuildResponse.class differ diff --git a/out/production/A079/handling/world/guild/MapleGuildSummary.class b/out/production/A079/handling/world/guild/MapleGuildSummary.class new file mode 100644 index 0000000..a7bda81 Binary files /dev/null and b/out/production/A079/handling/world/guild/MapleGuildSummary.class differ diff --git a/out/production/A079/image/01003112.png b/out/production/A079/image/01003112.png new file mode 100644 index 0000000..a75c093 Binary files /dev/null and b/out/production/A079/image/01003112.png differ diff --git a/out/production/A079/image/01003824.png b/out/production/A079/image/01003824.png new file mode 100644 index 0000000..33b1724 Binary files /dev/null and b/out/production/A079/image/01003824.png differ diff --git a/out/production/A079/image/100.png b/out/production/A079/image/100.png new file mode 100644 index 0000000..78ca240 Binary files /dev/null and b/out/production/A079/image/100.png differ diff --git a/out/production/A079/image/101.png b/out/production/A079/image/101.png new file mode 100644 index 0000000..58a57e5 Binary files /dev/null and b/out/production/A079/image/101.png differ diff --git a/out/production/A079/image/111.png b/out/production/A079/image/111.png new file mode 100644 index 0000000..a4d3fc1 Binary files /dev/null and b/out/production/A079/image/111.png differ diff --git a/out/production/A079/image/123.png b/out/production/A079/image/123.png new file mode 100644 index 0000000..09a9a81 Binary files /dev/null and b/out/production/A079/image/123.png differ diff --git a/out/production/A079/image/1802034.png b/out/production/A079/image/1802034.png new file mode 100644 index 0000000..6f0e052 Binary files /dev/null and b/out/production/A079/image/1802034.png differ diff --git a/out/production/A079/image/1802665.png b/out/production/A079/image/1802665.png new file mode 100644 index 0000000..034efb3 Binary files /dev/null and b/out/production/A079/image/1802665.png differ diff --git a/out/production/A079/image/2000001.png b/out/production/A079/image/2000001.png new file mode 100644 index 0000000..e0dff08 Binary files /dev/null and b/out/production/A079/image/2000001.png differ diff --git a/out/production/A079/image/2022442.png b/out/production/A079/image/2022442.png new file mode 100644 index 0000000..da2f386 Binary files /dev/null and b/out/production/A079/image/2022442.png differ diff --git a/out/production/A079/image/2022451.png b/out/production/A079/image/2022451.png new file mode 100644 index 0000000..08c7bd6 Binary files /dev/null and b/out/production/A079/image/2022451.png differ diff --git a/out/production/A079/image/2022452.png b/out/production/A079/image/2022452.png new file mode 100644 index 0000000..514462e Binary files /dev/null and b/out/production/A079/image/2022452.png differ diff --git a/out/production/A079/image/2030000.png b/out/production/A079/image/2030000.png new file mode 100644 index 0000000..34c184e Binary files /dev/null and b/out/production/A079/image/2030000.png differ diff --git a/out/production/A079/image/2040236.png b/out/production/A079/image/2040236.png new file mode 100644 index 0000000..b8031a9 Binary files /dev/null and b/out/production/A079/image/2040236.png differ diff --git a/out/production/A079/image/2040335.png b/out/production/A079/image/2040335.png new file mode 100644 index 0000000..d8cb4bc Binary files /dev/null and b/out/production/A079/image/2040335.png differ diff --git a/out/production/A079/image/2070005.png b/out/production/A079/image/2070005.png new file mode 100644 index 0000000..5fd557b Binary files /dev/null and b/out/production/A079/image/2070005.png differ diff --git a/out/production/A079/image/2435108.png b/out/production/A079/image/2435108.png new file mode 100644 index 0000000..eace636 Binary files /dev/null and b/out/production/A079/image/2435108.png differ diff --git a/out/production/A079/image/2470000.png b/out/production/A079/image/2470000.png new file mode 100644 index 0000000..241e3f4 Binary files /dev/null and b/out/production/A079/image/2470000.png differ diff --git a/out/production/A079/image/2614075.png b/out/production/A079/image/2614075.png new file mode 100644 index 0000000..8e32a98 Binary files /dev/null and b/out/production/A079/image/2614075.png differ diff --git a/out/production/A079/image/2630205.png b/out/production/A079/image/2630205.png new file mode 100644 index 0000000..37af20e Binary files /dev/null and b/out/production/A079/image/2630205.png differ diff --git a/out/production/A079/image/3010025.png b/out/production/A079/image/3010025.png new file mode 100644 index 0000000..8fad018 Binary files /dev/null and b/out/production/A079/image/3010025.png differ diff --git a/out/production/A079/image/3800131.png b/out/production/A079/image/3800131.png new file mode 100644 index 0000000..a6be99a Binary files /dev/null and b/out/production/A079/image/3800131.png differ diff --git a/out/production/A079/image/3800157.png b/out/production/A079/image/3800157.png new file mode 100644 index 0000000..5f89975 Binary files /dev/null and b/out/production/A079/image/3800157.png differ diff --git a/out/production/A079/image/3800158.png b/out/production/A079/image/3800158.png new file mode 100644 index 0000000..c72d088 Binary files /dev/null and b/out/production/A079/image/3800158.png differ diff --git a/out/production/A079/image/3800159.png b/out/production/A079/image/3800159.png new file mode 100644 index 0000000..88e0903 Binary files /dev/null and b/out/production/A079/image/3800159.png differ diff --git a/out/production/A079/image/3800160.png b/out/production/A079/image/3800160.png new file mode 100644 index 0000000..eac887a Binary files /dev/null and b/out/production/A079/image/3800160.png differ diff --git a/out/production/A079/image/3800161.png b/out/production/A079/image/3800161.png new file mode 100644 index 0000000..e8fcce8 Binary files /dev/null and b/out/production/A079/image/3800161.png differ diff --git a/out/production/A079/image/3800162.png b/out/production/A079/image/3800162.png new file mode 100644 index 0000000..d51bee4 Binary files /dev/null and b/out/production/A079/image/3800162.png differ diff --git a/out/production/A079/image/3800163.png b/out/production/A079/image/3800163.png new file mode 100644 index 0000000..c9ee7cb Binary files /dev/null and b/out/production/A079/image/3800163.png differ diff --git a/out/production/A079/image/3800871.png b/out/production/A079/image/3800871.png new file mode 100644 index 0000000..e5e5a67 Binary files /dev/null and b/out/production/A079/image/3800871.png differ diff --git a/out/production/A079/image/3801286.png b/out/production/A079/image/3801286.png new file mode 100644 index 0000000..0fd64ae Binary files /dev/null and b/out/production/A079/image/3801286.png differ diff --git a/out/production/A079/image/3801287.png b/out/production/A079/image/3801287.png new file mode 100644 index 0000000..fa96591 Binary files /dev/null and b/out/production/A079/image/3801287.png differ diff --git a/out/production/A079/image/3801288.png b/out/production/A079/image/3801288.png new file mode 100644 index 0000000..a5486b9 Binary files /dev/null and b/out/production/A079/image/3801288.png differ diff --git a/out/production/A079/image/3801289.png b/out/production/A079/image/3801289.png new file mode 100644 index 0000000..ba2bfda Binary files /dev/null and b/out/production/A079/image/3801289.png differ diff --git a/out/production/A079/image/3801290.png b/out/production/A079/image/3801290.png new file mode 100644 index 0000000..264cdcf Binary files /dev/null and b/out/production/A079/image/3801290.png differ diff --git a/out/production/A079/image/3801291.png b/out/production/A079/image/3801291.png new file mode 100644 index 0000000..2be921f Binary files /dev/null and b/out/production/A079/image/3801291.png differ diff --git a/out/production/A079/image/3801292.png b/out/production/A079/image/3801292.png new file mode 100644 index 0000000..23e6e2c Binary files /dev/null and b/out/production/A079/image/3801292.png differ diff --git a/out/production/A079/image/3801293.png b/out/production/A079/image/3801293.png new file mode 100644 index 0000000..7cf79aa Binary files /dev/null and b/out/production/A079/image/3801293.png differ diff --git a/out/production/A079/image/3801294.png b/out/production/A079/image/3801294.png new file mode 100644 index 0000000..02aa250 Binary files /dev/null and b/out/production/A079/image/3801294.png differ diff --git a/out/production/A079/image/3801295.png b/out/production/A079/image/3801295.png new file mode 100644 index 0000000..8b8bb3f Binary files /dev/null and b/out/production/A079/image/3801295.png differ diff --git a/out/production/A079/image/3801296.png b/out/production/A079/image/3801296.png new file mode 100644 index 0000000..2f87541 Binary files /dev/null and b/out/production/A079/image/3801296.png differ diff --git a/out/production/A079/image/3801297.png b/out/production/A079/image/3801297.png new file mode 100644 index 0000000..3791974 Binary files /dev/null and b/out/production/A079/image/3801297.png differ diff --git a/out/production/A079/image/3801309.png b/out/production/A079/image/3801309.png new file mode 100644 index 0000000..2d87f61 Binary files /dev/null and b/out/production/A079/image/3801309.png differ diff --git a/out/production/A079/image/3801310.png b/out/production/A079/image/3801310.png new file mode 100644 index 0000000..b89128e Binary files /dev/null and b/out/production/A079/image/3801310.png differ diff --git a/out/production/A079/image/3801312.png b/out/production/A079/image/3801312.png new file mode 100644 index 0000000..89d2301 Binary files /dev/null and b/out/production/A079/image/3801312.png differ diff --git a/out/production/A079/image/3801313.png b/out/production/A079/image/3801313.png new file mode 100644 index 0000000..178f85c Binary files /dev/null and b/out/production/A079/image/3801313.png differ diff --git a/out/production/A079/image/3801314.png b/out/production/A079/image/3801314.png new file mode 100644 index 0000000..ddaf3c8 Binary files /dev/null and b/out/production/A079/image/3801314.png differ diff --git a/out/production/A079/image/3801315.png b/out/production/A079/image/3801315.png new file mode 100644 index 0000000..13614f7 Binary files /dev/null and b/out/production/A079/image/3801315.png differ diff --git a/out/production/A079/image/3801316.png b/out/production/A079/image/3801316.png new file mode 100644 index 0000000..7595955 Binary files /dev/null and b/out/production/A079/image/3801316.png differ diff --git a/out/production/A079/image/3801462.png b/out/production/A079/image/3801462.png new file mode 100644 index 0000000..8d65311 Binary files /dev/null and b/out/production/A079/image/3801462.png differ diff --git a/out/production/A079/image/3801511.png b/out/production/A079/image/3801511.png new file mode 100644 index 0000000..b0a8103 Binary files /dev/null and b/out/production/A079/image/3801511.png differ diff --git a/out/production/A079/image/3801513.png b/out/production/A079/image/3801513.png new file mode 100644 index 0000000..e653e42 Binary files /dev/null and b/out/production/A079/image/3801513.png differ diff --git a/out/production/A079/image/3801514.png b/out/production/A079/image/3801514.png new file mode 100644 index 0000000..d22ca58 Binary files /dev/null and b/out/production/A079/image/3801514.png differ diff --git a/out/production/A079/image/3801515.png b/out/production/A079/image/3801515.png new file mode 100644 index 0000000..b34b2ae Binary files /dev/null and b/out/production/A079/image/3801515.png differ diff --git a/out/production/A079/image/3994106.png b/out/production/A079/image/3994106.png new file mode 100644 index 0000000..cdbd710 Binary files /dev/null and b/out/production/A079/image/3994106.png differ diff --git a/out/production/A079/image/3994183.png b/out/production/A079/image/3994183.png new file mode 100644 index 0000000..5b778ac Binary files /dev/null and b/out/production/A079/image/3994183.png differ diff --git a/out/production/A079/image/3994264.png b/out/production/A079/image/3994264.png new file mode 100644 index 0000000..103d347 Binary files /dev/null and b/out/production/A079/image/3994264.png differ diff --git a/out/production/A079/image/3994506.png b/out/production/A079/image/3994506.png new file mode 100644 index 0000000..2d089fc Binary files /dev/null and b/out/production/A079/image/3994506.png differ diff --git a/out/production/A079/image/3994609.png b/out/production/A079/image/3994609.png new file mode 100644 index 0000000..86b6af8 Binary files /dev/null and b/out/production/A079/image/3994609.png differ diff --git a/out/production/A079/image/3994610.png b/out/production/A079/image/3994610.png new file mode 100644 index 0000000..e3db6fe Binary files /dev/null and b/out/production/A079/image/3994610.png differ diff --git a/out/production/A079/image/3994691.png b/out/production/A079/image/3994691.png new file mode 100644 index 0000000..3e9c324 Binary files /dev/null and b/out/production/A079/image/3994691.png differ diff --git a/out/production/A079/image/3994706.png b/out/production/A079/image/3994706.png new file mode 100644 index 0000000..85cf640 Binary files /dev/null and b/out/production/A079/image/3994706.png differ diff --git a/out/production/A079/image/3994730.png b/out/production/A079/image/3994730.png new file mode 100644 index 0000000..0683dbd Binary files /dev/null and b/out/production/A079/image/3994730.png differ diff --git a/out/production/A079/image/4030001.png b/out/production/A079/image/4030001.png new file mode 100644 index 0000000..3cd4236 Binary files /dev/null and b/out/production/A079/image/4030001.png differ diff --git a/out/production/A079/image/4030011.png b/out/production/A079/image/4030011.png new file mode 100644 index 0000000..b2ab4cd Binary files /dev/null and b/out/production/A079/image/4030011.png differ diff --git a/out/production/A079/image/4031039.png b/out/production/A079/image/4031039.png new file mode 100644 index 0000000..604c5ea Binary files /dev/null and b/out/production/A079/image/4031039.png differ diff --git a/out/production/A079/image/4031040.png b/out/production/A079/image/4031040.png new file mode 100644 index 0000000..0cca619 Binary files /dev/null and b/out/production/A079/image/4031040.png differ diff --git a/out/production/A079/image/4031041.png b/out/production/A079/image/4031041.png new file mode 100644 index 0000000..73684f2 Binary files /dev/null and b/out/production/A079/image/4031041.png differ diff --git a/out/production/A079/image/4031683.png b/out/production/A079/image/4031683.png new file mode 100644 index 0000000..9d4ef55 Binary files /dev/null and b/out/production/A079/image/4031683.png differ diff --git a/out/production/A079/image/4110000.png b/out/production/A079/image/4110000.png new file mode 100644 index 0000000..511a9ec Binary files /dev/null and b/out/production/A079/image/4110000.png differ diff --git a/out/production/A079/image/4310003.png b/out/production/A079/image/4310003.png new file mode 100644 index 0000000..0c1326f Binary files /dev/null and b/out/production/A079/image/4310003.png differ diff --git a/out/production/A079/image/5062006.png b/out/production/A079/image/5062006.png new file mode 100644 index 0000000..b9f8a36 Binary files /dev/null and b/out/production/A079/image/5062006.png differ diff --git a/out/production/A079/image/5680149.png b/out/production/A079/image/5680149.png new file mode 100644 index 0000000..0e4ebfc Binary files /dev/null and b/out/production/A079/image/5680149.png differ diff --git a/out/production/A079/image/9104092.png b/out/production/A079/image/9104092.png new file mode 100644 index 0000000..bb5a4f3 Binary files /dev/null and b/out/production/A079/image/9104092.png differ diff --git a/out/production/A079/image/98.png b/out/production/A079/image/98.png new file mode 100644 index 0000000..086b413 Binary files /dev/null and b/out/production/A079/image/98.png differ diff --git a/out/production/A079/image/99.png b/out/production/A079/image/99.png new file mode 100644 index 0000000..bae3c16 Binary files /dev/null and b/out/production/A079/image/99.png differ diff --git a/out/production/A079/image/GM工具.png b/out/production/A079/image/GM工具.png new file mode 100644 index 0000000..8b96537 Binary files /dev/null and b/out/production/A079/image/GM工具.png differ diff --git a/out/production/A079/image/Icon.png b/out/production/A079/image/Icon.png new file mode 100644 index 0000000..a0057f2 Binary files /dev/null and b/out/production/A079/image/Icon.png differ diff --git a/out/production/A079/image/OFF1.png b/out/production/A079/image/OFF1.png new file mode 100644 index 0000000..2f1ff9e Binary files /dev/null and b/out/production/A079/image/OFF1.png differ diff --git a/out/production/A079/image/OFF2.png b/out/production/A079/image/OFF2.png new file mode 100644 index 0000000..ab4eb7e Binary files /dev/null and b/out/production/A079/image/OFF2.png differ diff --git a/out/production/A079/image/OFF3.png b/out/production/A079/image/OFF3.png new file mode 100644 index 0000000..8b05d5a Binary files /dev/null and b/out/production/A079/image/OFF3.png differ diff --git a/out/production/A079/image/ON1.png b/out/production/A079/image/ON1.png new file mode 100644 index 0000000..cb714d1 Binary files /dev/null and b/out/production/A079/image/ON1.png differ diff --git a/out/production/A079/image/ON2.png b/out/production/A079/image/ON2.png new file mode 100644 index 0000000..f442610 Binary files /dev/null and b/out/production/A079/image/ON2.png differ diff --git a/out/production/A079/image/ON3.png b/out/production/A079/image/ON3.png new file mode 100644 index 0000000..6265483 Binary files /dev/null and b/out/production/A079/image/ON3.png differ diff --git a/out/production/A079/image/QQ.png b/out/production/A079/image/QQ.png new file mode 100644 index 0000000..a7a2cb0 Binary files /dev/null and b/out/production/A079/image/QQ.png differ diff --git a/out/production/A079/image/badge_magnolia_32px_16627_easyicon.net.png b/out/production/A079/image/badge_magnolia_32px_16627_easyicon.net.png new file mode 100644 index 0000000..9fb5f1b Binary files /dev/null and b/out/production/A079/image/badge_magnolia_32px_16627_easyicon.net.png differ diff --git a/out/production/A079/image/bg.png b/out/production/A079/image/bg.png new file mode 100644 index 0000000..1900743 Binary files /dev/null and b/out/production/A079/image/bg.png differ diff --git a/out/production/A079/image/bg3.png b/out/production/A079/image/bg3.png new file mode 100644 index 0000000..03e98d1 Binary files /dev/null and b/out/production/A079/image/bg3.png differ diff --git a/out/production/A079/image/common_40_icon.png b/out/production/A079/image/common_40_icon.png new file mode 100644 index 0000000..f46f9aa Binary files /dev/null and b/out/production/A079/image/common_40_icon.png differ diff --git a/out/production/A079/image/代码查询器.png b/out/production/A079/image/代码查询器.png new file mode 100644 index 0000000..313777f Binary files /dev/null and b/out/production/A079/image/代码查询器.png differ diff --git a/out/production/A079/image/任务管理.png b/out/production/A079/image/任务管理.png new file mode 100644 index 0000000..1ee3033 Binary files /dev/null and b/out/production/A079/image/任务管理.png differ diff --git a/out/production/A079/image/信息日志.png b/out/production/A079/image/信息日志.png new file mode 100644 index 0000000..7579af2 Binary files /dev/null and b/out/production/A079/image/信息日志.png differ diff --git a/out/production/A079/image/充值.png b/out/production/A079/image/充值.png new file mode 100644 index 0000000..f4644f8 Binary files /dev/null and b/out/production/A079/image/充值.png differ diff --git a/out/production/A079/image/全部日志.png b/out/production/A079/image/全部日志.png new file mode 100644 index 0000000..53623d0 Binary files /dev/null and b/out/production/A079/image/全部日志.png differ diff --git a/out/production/A079/image/关于.png b/out/production/A079/image/关于.png new file mode 100644 index 0000000..00e4919 Binary files /dev/null and b/out/production/A079/image/关于.png differ diff --git a/out/production/A079/image/关闭.png b/out/production/A079/image/关闭.png new file mode 100644 index 0000000..296b900 Binary files /dev/null and b/out/production/A079/image/关闭.png differ diff --git a/out/production/A079/image/关闭服务器.png b/out/production/A079/image/关闭服务器.png new file mode 100644 index 0000000..8b6f2e3 Binary files /dev/null and b/out/production/A079/image/关闭服务器.png differ diff --git a/out/production/A079/image/冒险岛.png b/out/production/A079/image/冒险岛.png new file mode 100644 index 0000000..a0057f2 Binary files /dev/null and b/out/production/A079/image/冒险岛.png differ diff --git a/out/production/A079/image/发送.png b/out/production/A079/image/发送.png new file mode 100644 index 0000000..760a97e Binary files /dev/null and b/out/production/A079/image/发送.png differ diff --git a/out/production/A079/image/发送物品.png b/out/production/A079/image/发送物品.png new file mode 100644 index 0000000..a2dea94 Binary files /dev/null and b/out/production/A079/image/发送物品.png differ diff --git a/out/production/A079/image/召唤生物.png b/out/production/A079/image/召唤生物.png new file mode 100644 index 0000000..51e96df Binary files /dev/null and b/out/production/A079/image/召唤生物.png differ diff --git a/out/production/A079/image/后台.png b/out/production/A079/image/后台.png new file mode 100644 index 0000000..2f6cf34 Binary files /dev/null and b/out/production/A079/image/后台.png differ diff --git a/out/production/A079/image/商店管理.png b/out/production/A079/image/商店管理.png new file mode 100644 index 0000000..9250336 Binary files /dev/null and b/out/production/A079/image/商店管理.png differ diff --git a/out/production/A079/image/喇叭1.png b/out/production/A079/image/喇叭1.png new file mode 100644 index 0000000..8096df9 Binary files /dev/null and b/out/production/A079/image/喇叭1.png differ diff --git a/out/production/A079/image/喇叭2.png b/out/production/A079/image/喇叭2.png new file mode 100644 index 0000000..ff36723 Binary files /dev/null and b/out/production/A079/image/喇叭2.png differ diff --git a/out/production/A079/image/喇叭3.png b/out/production/A079/image/喇叭3.png new file mode 100644 index 0000000..a0b2d6e Binary files /dev/null and b/out/production/A079/image/喇叭3.png differ diff --git a/out/production/A079/image/喇叭4.png b/out/production/A079/image/喇叭4.png new file mode 100644 index 0000000..f8136f7 Binary files /dev/null and b/out/production/A079/image/喇叭4.png differ diff --git a/out/production/A079/image/喇叭5.png b/out/production/A079/image/喇叭5.png new file mode 100644 index 0000000..c561f43 Binary files /dev/null and b/out/production/A079/image/喇叭5.png differ diff --git a/out/production/A079/image/大勺爸爸.png b/out/production/A079/image/大勺爸爸.png new file mode 100644 index 0000000..6c759f6 Binary files /dev/null and b/out/production/A079/image/大勺爸爸.png differ diff --git a/out/production/A079/image/封包日志.png b/out/production/A079/image/封包日志.png new file mode 100644 index 0000000..568181d Binary files /dev/null and b/out/production/A079/image/封包日志.png differ diff --git a/out/production/A079/image/工具.png b/out/production/A079/image/工具.png new file mode 100644 index 0000000..e1c6154 Binary files /dev/null and b/out/production/A079/image/工具.png differ diff --git a/out/production/A079/image/常用功能.png b/out/production/A079/image/常用功能.png new file mode 100644 index 0000000..66576f6 Binary files /dev/null and b/out/production/A079/image/常用功能.png differ diff --git a/out/production/A079/image/开启.png b/out/production/A079/image/开启.png new file mode 100644 index 0000000..fc618bd Binary files /dev/null and b/out/production/A079/image/开启.png differ diff --git a/out/production/A079/image/怪物血量.png b/out/production/A079/image/怪物血量.png new file mode 100644 index 0000000..4bc5bb8 Binary files /dev/null and b/out/production/A079/image/怪物血量.png differ diff --git a/out/production/A079/image/扳手.png b/out/production/A079/image/扳手.png new file mode 100644 index 0000000..9136f76 Binary files /dev/null and b/out/production/A079/image/扳手.png differ diff --git a/out/production/A079/image/技能魔改.png b/out/production/A079/image/技能魔改.png new file mode 100644 index 0000000..545c491 Binary files /dev/null and b/out/production/A079/image/技能魔改.png differ diff --git a/out/production/A079/image/提交问题反馈.png b/out/production/A079/image/提交问题反馈.png new file mode 100644 index 0000000..bba29b2 Binary files /dev/null and b/out/production/A079/image/提交问题反馈.png differ diff --git a/out/production/A079/image/教程.png b/out/production/A079/image/教程.png new file mode 100644 index 0000000..ea368a1 Binary files /dev/null and b/out/production/A079/image/教程.png differ diff --git a/out/production/A079/image/日志.png b/out/production/A079/image/日志.png new file mode 100644 index 0000000..1c94ad1 Binary files /dev/null and b/out/production/A079/image/日志.png differ diff --git a/out/production/A079/image/更多设置.png b/out/production/A079/image/更多设置.png new file mode 100644 index 0000000..43f11a0 Binary files /dev/null and b/out/production/A079/image/更多设置.png differ diff --git a/out/production/A079/image/更新.png b/out/production/A079/image/更新.png new file mode 100644 index 0000000..4776d5b Binary files /dev/null and b/out/production/A079/image/更新.png differ diff --git a/out/production/A079/image/服务设置.png b/out/production/A079/image/服务设置.png new file mode 100644 index 0000000..6f82801 Binary files /dev/null and b/out/production/A079/image/服务设置.png differ diff --git a/out/production/A079/image/模拟玩家.png b/out/production/A079/image/模拟玩家.png new file mode 100644 index 0000000..d79331c Binary files /dev/null and b/out/production/A079/image/模拟玩家.png differ diff --git a/out/production/A079/image/游戏通知.png b/out/production/A079/image/游戏通知.png new file mode 100644 index 0000000..bdabe6c Binary files /dev/null and b/out/production/A079/image/游戏通知.png differ diff --git a/out/production/A079/image/爆率.png b/out/production/A079/image/爆率.png new file mode 100644 index 0000000..78b058d Binary files /dev/null and b/out/production/A079/image/爆率.png differ diff --git a/out/production/A079/image/玩家监控.png b/out/production/A079/image/玩家监控.png new file mode 100644 index 0000000..811dea7 Binary files /dev/null and b/out/production/A079/image/玩家监控.png differ diff --git a/out/production/A079/image/玩家装备背包.png b/out/production/A079/image/玩家装备背包.png new file mode 100644 index 0000000..9d363a3 Binary files /dev/null and b/out/production/A079/image/玩家装备背包.png differ diff --git a/out/production/A079/image/管理.png b/out/production/A079/image/管理.png new file mode 100644 index 0000000..f624084 Binary files /dev/null and b/out/production/A079/image/管理.png differ diff --git a/out/production/A079/image/管理全域掉落.png b/out/production/A079/image/管理全域掉落.png new file mode 100644 index 0000000..0065d47 Binary files /dev/null and b/out/production/A079/image/管理全域掉落.png differ diff --git a/out/production/A079/image/管理背包.png b/out/production/A079/image/管理背包.png new file mode 100644 index 0000000..9cf1074 Binary files /dev/null and b/out/production/A079/image/管理背包.png differ diff --git a/out/production/A079/image/管理自定义掉落.png b/out/production/A079/image/管理自定义掉落.png new file mode 100644 index 0000000..560158d Binary files /dev/null and b/out/production/A079/image/管理自定义掉落.png differ diff --git a/out/production/A079/image/经验1.png b/out/production/A079/image/经验1.png new file mode 100644 index 0000000..3dffb1b Binary files /dev/null and b/out/production/A079/image/经验1.png differ diff --git a/out/production/A079/image/自定义BUFF.png b/out/production/A079/image/自定义BUFF.png new file mode 100644 index 0000000..5c89850 Binary files /dev/null and b/out/production/A079/image/自定义BUFF.png differ diff --git a/out/production/A079/image/自定义购物中心.png b/out/production/A079/image/自定义购物中心.png new file mode 100644 index 0000000..b0804d9 Binary files /dev/null and b/out/production/A079/image/自定义购物中心.png differ diff --git a/out/production/A079/image/至尊版工具.png b/out/production/A079/image/至尊版工具.png new file mode 100644 index 0000000..7b16cc3 Binary files /dev/null and b/out/production/A079/image/至尊版工具.png differ diff --git a/out/production/A079/image/装备修改.png b/out/production/A079/image/装备修改.png new file mode 100644 index 0000000..b64391e Binary files /dev/null and b/out/production/A079/image/装备修改.png differ diff --git a/out/production/A079/image/角色管理.png b/out/production/A079/image/角色管理.png new file mode 100644 index 0000000..9947c77 Binary files /dev/null and b/out/production/A079/image/角色管理.png differ diff --git a/out/production/A079/image/警告日志.png b/out/production/A079/image/警告日志.png new file mode 100644 index 0000000..3bd8233 Binary files /dev/null and b/out/production/A079/image/警告日志.png differ diff --git a/out/production/A079/image/设置.png b/out/production/A079/image/设置.png new file mode 100644 index 0000000..6a92c59 Binary files /dev/null and b/out/production/A079/image/设置.png differ diff --git a/out/production/A079/image/设置扳手.png b/out/production/A079/image/设置扳手.png new file mode 100644 index 0000000..e709e4b Binary files /dev/null and b/out/production/A079/image/设置扳手.png differ diff --git a/out/production/A079/image/调试日志.png b/out/production/A079/image/调试日志.png new file mode 100644 index 0000000..b2098ec Binary files /dev/null and b/out/production/A079/image/调试日志.png differ diff --git a/out/production/A079/image/通用设置.png b/out/production/A079/image/通用设置.png new file mode 100644 index 0000000..a8299e2 Binary files /dev/null and b/out/production/A079/image/通用设置.png differ diff --git a/out/production/A079/image/钓鱼.png b/out/production/A079/image/钓鱼.png new file mode 100644 index 0000000..a6db77f Binary files /dev/null and b/out/production/A079/image/钓鱼.png differ diff --git a/out/production/A079/image/错误日志.png b/out/production/A079/image/错误日志.png new file mode 100644 index 0000000..6e335cf Binary files /dev/null and b/out/production/A079/image/错误日志.png differ diff --git a/out/production/A079/image/问题.png b/out/production/A079/image/问题.png new file mode 100644 index 0000000..31e768d Binary files /dev/null and b/out/production/A079/image/问题.png differ diff --git a/out/production/A079/image/静止.png b/out/production/A079/image/静止.png new file mode 100644 index 0000000..d8f5aa0 Binary files /dev/null and b/out/production/A079/image/静止.png differ diff --git a/out/production/A079/image/骰子.png b/out/production/A079/image/骰子.png new file mode 100644 index 0000000..73e5216 Binary files /dev/null and b/out/production/A079/image/骰子.png differ diff --git a/out/production/A079/image/魔方.png b/out/production/A079/image/魔方.png new file mode 100644 index 0000000..5d4c456 Binary files /dev/null and b/out/production/A079/image/魔方.png differ diff --git a/out/production/A079/org/netbeans/lib/awtextra/AbsoluteConstraints.class b/out/production/A079/org/netbeans/lib/awtextra/AbsoluteConstraints.class new file mode 100644 index 0000000..49358d3 Binary files /dev/null and b/out/production/A079/org/netbeans/lib/awtextra/AbsoluteConstraints.class differ diff --git a/out/production/A079/org/netbeans/lib/awtextra/AbsoluteLayout.class b/out/production/A079/org/netbeans/lib/awtextra/AbsoluteLayout.class new file mode 100644 index 0000000..9b5a0ee Binary files /dev/null and b/out/production/A079/org/netbeans/lib/awtextra/AbsoluteLayout.class differ diff --git a/out/production/A079/ppSetting/Game.class b/out/production/A079/ppSetting/Game.class new file mode 100644 index 0000000..cd99bc5 Binary files /dev/null and b/out/production/A079/ppSetting/Game.class differ diff --git a/out/production/A079/properties/recv.ini b/out/production/A079/properties/recv.ini new file mode 100644 index 0000000..9cfd90a --- /dev/null +++ b/out/production/A079/properties/recv.ini @@ -0,0 +1,190 @@ +PONG = 0x13 +QUEST_MAPLEPOINTS = 0x6A +LOGIN_PASSWORD = 0x01 +SERVERLIST_REQUEST = 0x02 +LICENSE_REQUEST = 0x03 +SET_GENDER = 0x04 +SERVERSTATUS_REQUEST = 0x05 +CHARLIST_REQUEST = 0x09 +CHAR_SELECT = 0x0A +PLAYER_LOGGEDIN = 0x0B +CHECK_CHAR_NAME = 0x0C +CHECK_REGISTER_ACCOUNT = 0x0D +CHECK_ACCOUNT = 0x0E +REGISTER_ACCOUNT = 0x0F +CREATE_CHAR = 0x11 +DELETE_CHAR = 0x12 +CLIENT_ERROR = 0x14 +STRANGE_DATA = 0x15 +#CLIENT_FEEDBACK = 0x0F +#AUTH_SECOND_PASSWORD = 0x13 +#HELLO_LOGIN = 0x17 +#CLIENT_LOGOUT = 0x1A +#HELLO_CHANNEL = 0xDA +#RSA_KEY = 0x1C +VICIOUS_HAMMER = 0x10D +CHANGE_MAP = 0x21 +CHANGE_CHANNEL = 0x22 +ENTER_CASH_SHOP = 0x23 +MOVE_PLAYER = 0x24 +CANCEL_CHAIR = 0x25 +USE_CHAIR = 0x26 +#SHOW_EXP_CHAIR = 0x27 +CLOSE_RANGE_ATTACK = 0x28 +RANGED_ATTACK = 0x29 +MAGIC_ATTACK = 0x2A +PASSIVE_ENERGY = 0x2B +TAKE_DAMAGE = 0x2C +GENERAL_CHAT = 0x2D +CLOSE_CHALKBOARD = 0x2E +FACE_EXPRESSION = 0x2F +USE_ITEMEFFECT = 0x30 +WHEEL_OF_FORTUNE = 0x31 +MONSTER_BOOK_COVER = 0x35 +NPC_TALK = 0x36 +#REMOTE_STORE = 0x37 +NPC_TALK_MORE = 0x38 +NPC_SHOP = 0x3A +STORAGE = 0x3B +USE_HIRED_MERCHANT = 0x3C +#USE_HIRED_FISHING = 0x3D +MERCH_ITEM_STORE = 0x3D +DUEY_ACTION = 0x3E +OWL = 0x3F +OWL_WARP = 0x40 +#USE_OWL_MINERVA = 0xFF + +ITEM_SORT = 0x42 +ITEM_GATHER = 0x43 +ITEM_MOVE = 0x44 +USE_ITEM = 0x45 +CANCEL_ITEM_EFFECT = 0x46 +USE_SUMMON_BAG = 0x48 +PET_FOOD = 0x49 +USE_MOUNT_FOOD = 0x4A +USE_SCRIPTED_NPC_ITEM = 0x4B +USE_CASH_ITEM = 0x4C +USE_CATCH_ITEM = 0x4E +USE_SKILL_BOOK = 0x4F +#USE_TELE_ROCK = 0x51 +USE_RETURN_SCROLL = 0x52 +USE_UPGRADE_SCROLL = 0x53 +#USE_EQUIP_SCROLL = 0x52 +#USE_POTENTIAL_SCROLL = 0x53 +#USE_MAGNIFY_GLASS = 0x54 +DISTRIBUTE_AP = 0x54 +AUTO_ASSIGN_AP = 0x55 +HEAL_OVER_TIME = 0x56 +DISTRIBUTE_SP = 0x57 +SPECIAL_MOVE = 0x58 +CANCEL_BUFF = 0x59 +SKILL_EFFECT = 0x5A +MESO_DROP = 0x5B +GIVE_FAME = 0x5C +CHAR_INFO_REQUEST = 0x5E +SPAWN_PET = 0x5F +CANCEL_DEBUFF = 0x60 +CHANGE_MAP_SPECIAL = 0x61 +USE_INNER_PORTAL = 0x62 +TROCK_ADD_MAP = 0x63 +LIE_DETECTOR = 0x64 +LIE_DETECTOR_SKILL = 0x65 +LIE_DETECTOR_RESPONSE = 0x66 +LIE_DETECTOR_REFRESH = 0x67 +QUEST_ACTION = 0x68 + +SPECIAL_ATTACK = 0x6C +SKILL_MACRO = 0x6D + +REWARD_ITEM = 0x72 +ITEM_MAKER = 0x71 +#REPAIR_ALL = 0x72 +#REPAIR = 0x73 +#FOLLOW_REQUEST = 0x78 +#FOLLOW_REPLY = 0x7A +USE_TREASUER_CHEST = 0x73 +PARTYCHAT = 0x74 +WHISPER = 0x75 +MESSENGER = 0x76 +PLAYER_INTERACTION = 0x77 +PARTY_OPERATION = 0x78 +DENY_PARTY_REQUEST = 0x79 +#EXPEDITION_OPERATION = 0x76 +#EXPEDITION_LISTING = 0x77 +GUILD_OPERATION = 0x7A +DENY_GUILD_REQUEST = 0x7B +BUDDYLIST_MODIFY = 0x7E +NOTE_ACTION = 0x7F +USE_DOOR = 0x81 +CHANGE_KEYMAP = 0x83 +RPS_GAME = 0x84 +RING_ACTION = 0x85 +ALLIANCE_OPERATION = 0x93 +DENY_ALLIANCE_REQUEST = 0x94 +#BBS_OPERATION = 0x8C +ENTER_MTS = 0x8D +ITEM_BAOWU = 0x70 +ITEM_SUNZI = 0x8E +REQUEST_FAMILY = 0x95 +OPEN_FAMILY = 0x96 +FAMILY_OPERATION = 0x97 +DELETE_JUNIOR = 0x98 +DELETE_SENIOR = 0x99 +ACCEPT_FAMILY = 0x9A +USE_FAMILY = 0x9B +FAMILY_PRECEPT = 0x9C +FAMILY_SUMMON = 0x9D +CYGNUS_SUMMON = 0x9E +ARAN_COMBO = 0x9F +#ITEM_UNLOCK = 0x95 +#UPDATE_CHAR_INFO = 0x97 +#SOLOMON = 0x9C +#GACH_EXP = 0x9D +#TRANSFORM_PLAYER = 0xA2 +#XMAS_SURPRISE = 0xA3 +#GAME_POLL = 0xA4 +MOVE_PET = 0xA5 +PET_CHAT = 0xA6 +PET_COMMAND = 0xA7 +PET_LOOT = 0xA8 +PET_AUTO_POT = 0xA9 +PET_IGNORE = 0xAA +MOVE_SUMMON = 0xAD +SUMMON_ATTACK = 0xAE +DAMAGE_SUMMON = 0xAF +#MOVE_DRAGON = 0xC2 +MOVE_LIFE = 0xB7 +AUTO_AGGRO = 0xB8 +FRIENDLY_DAMAGE = 0xBB +MONSTER_BOMB = 0xBC +#HYPNOTIZE_DMG = 0xBD +#MOB_NODE = 0xBE +#DISPLAY_NODE = 0xBF +NPC_ACTION = 0xC0 +ITEM_PICKUP = 0xC6 +DAMAGE_REACTOR = 0xC9 +TOUCH_REACTOR = 0xCA +SNOWBALL = 0xCF +LEFT_KNOCK_BACK = 0xD0 +COCONUT = 0xD1 +MONSTER_CARNIVAL = 0xD7 +#PARTY_SEARCH_START = 0xDB +#PARTY_SEARCH_STOP = 0xDC +PARTY_SS = 0xDF +#SHIP_OBJECT = 0xD9 +BEANS_OPERATION = 0xE2 +BEANS_UPDATE = 0xE3 +CS_UPDATE = 0xE8 +CASHSHOP_OPERATION = 0xE9 +COUPON_CODE = 0xEA + +#MAPLETV = 0xF6 +#UPDATE_QUEST = 0xF7 +#QUEST_ITEM = 0xF8 +#USE_ITEM_QUEST = 0xFA +#TOUCHING_MTS = 0xFB +#MTS_TAB = 0xFC + + +ChatRoom_SYSTEM = 0x104 +Use_ViciousHammer = 0x10D \ No newline at end of file diff --git a/out/production/A079/properties/send.ini b/out/production/A079/properties/send.ini new file mode 100644 index 0000000..42d3f3e --- /dev/null +++ b/out/production/A079/properties/send.ini @@ -0,0 +1,222 @@ + SPAWN_KITE_ERROR = 0x109 + SPAWN_KITE = 0x10A + DESTROY_KITE = 0x10B + LOGIN_STATUS = 0x00 + SERVERLIST = 0x09 + CHARLIST = 0x0A + SERVER_IP = 0x0B + CHAR_NAME_RESPONSE = 0x0C + LICENSE_RESULT = 0x02 + ADD_NEW_CHAR_ENTRY = 0x11 + DELETE_CHAR_RESPONSE = 0xFF + CHANGE_CHANNEL = 0x13 + PING = 0x14 + CS_USE = 0x15 + CHANNEL_SELECTED = 0x18 + RELOG_RESPONSE = 0x16 + SECONDPW_ERROR + CHOOSE_GENDER = 0x04 + GENDER_SET = 0x05 + SERVERSTATUS = 0x06 + OPEN_WEB =0x76 + INVENTORY_OPERATION = 0x20 + MODIFY_INVENTORY_ITEM = 0x20 + UPDATE_INVENTORY_SLOT = 0x21 + UPDATE_STATS = 0x22 + GIVE_BUFF = 0x23 + CANCEL_BUFF = 0x24 + TEMP_STATS = 0x25 + TEMP_STATS_RESET = 0x26 + UPDATE_SKILLS = 0x27 + SKILL_USE_RESULT = 0x28 + FAME_RESPONSE = 0x29 + SHOW_STATUS_INFO = 0x2A + SHOW_NOTES = 0x2B + MAP_TRANSFER_RESULT = 0x2C + LIE_DETECTOR = 0x2D + CLAIM_RESULT = 0x2F + CLAIM_STATUS_CHANGED = 0x30 + SET_TAMING_MOB_INFO = 0x31 + SHOW_QUEST_COMPLETION = 0x33 + ENTRUSTED_SHOP_CHECK_RESULT = 0x34 + USE_SKILL_BOOK = 0x35 + GATHER_ITEM_RESULT = 0x36 + SORT_ITEM_RESULT = 0x37 + CHAR_INFO = 0x3A + PARTY_OPERATION = 0x3B + BUDDYLIST = 0x3C + GUILD_OPERATION = 0x3E + ALLIANCE_OPERATION = 0x3F + SPAWN_PORTAL = 0x40 + SERVERMESSAGE = 0x41 + SHOP_SCANNER_RESULT = 0x43 + SHOP_LINK_RESULT= 0x44 + MARRIAGE_REQUEST = 0x49 + MARRIAGE_RESULT = 0x4A + MARRAGE_EFFECT + SET_WEEK_EVENT_MESSAGE = 0x4E + IMITATED_NPC_DATA = 0x5A + MONSTERBOOK_ADD = 0x5B + MONSTERBOOK_CHANGE_COVER = 0x5C + SESSION_VALUE = 0x62 + FAMILY_CHART_RESULT = 0x64 + FAMILY_INFO_RESULT = 0x65 + FAMILY_JOIN_REQUEST = 0x67 + FAMILY_JOIN_REQUEST_RESULT = 0x68 + FAMILY_JOIN_ACCEPTED = 0x69 + FAMILY_PRIVILEGE_LIST = 0x6A + FAMILY_FAMOUS_POINT_INC_RESULT = 0x6B + FAMILY_NOTIFY_LOGIN_OR_LOGOUT = 0x6C + FAMILY_SET_PRIVILEGE = 0x6D + FAMILY_SUMMON_REQUEST = 0x6E + LEVEL_UPDATE = 0x6F + MARRIAGE_UPDATE = 0x70 + JOB_UPDATE = 0x71 + SET_BUY_EQUIP_EXT = 0x72 + SCRIPT_PROGRESS_MESSAGE = 0x73 + BBS_OPERATION = 0x77 + FISHING_BOARD_UPDATE = 0x75 + AVATAR_MEGA = 0x56 + SKILL_MACRO = 0x80 + SET_FIELD = 0x81 + SET_ITC = 0x82 + SET_CASH_SHOP = 0x83 + SERVER_BLOCKED + SHOW_EQUIP_EFFECT + MULTICHAT = 0x8A + WHISPER = 0x8B + SPOUSE_CHAT = 0x8C + BOSS_ENV = 0x8D + MOVE_ENV = 0x91 + CASH_SONG = 0x92 + GM_EFFECT = 0x93 + OX_QUIZ = 0x94 + GMEVENT_INSTRUCTIONS = 0x95 + CLOCK = 0x96 + BOAT_EFFECT = 0x97 + BOAT_PACKET = 0x98 + BOAT_HIDE =0x99 + STOP_CLOCK = 0x9c + PYRAMID_UPDATE = 0xA0 + PYRAMID_RESULT = 0xA1 + MOVE_PLATFORM = 0x9F + SPAWN_PLAYER = 0xA2 + REMOVE_PLAYER_FROM_MAP = 0xA3 + CHATTEXT = 0xA4 + CHALKBOARD = 0xA6 + UPDATE_CHAR_BOX = 0xA7 + SHOW_SCROLL_EFFECT = 0xA9 + FISHING_CAUGHT = 0xAB + SPAWN_PET = 0xAD + MOVE_PET = 0xAF + PET_CHAT = 0xB0 + PET_NAMECHANGE = 0xB1 + PET_EXCEPTION_LIST =0xB2 + PET_COMMAND = 0xB3 + SPAWN_SUMMON = 0xB4 + REMOVE_SUMMON = 0xB5 + SUMMON_ATTACK = 0xB7 + MOVE_SUMMON = 0xB6 + DAMAGE_SUMMON = 0xB9 + MOVE_PLAYER = 0xBB + CLOSE_RANGE_ATTACK = 0xBC + RANGED_ATTACK = 0xBD + MAGIC_ATTACK = 0xBE + ENERGY_ATTACK = 0xBF + SKILL_EFFECT = 0xC0 + CANCEL_SKILL_EFFECT = 0xC1 + DAMAGE_PLAYER = 0xC2 + FACIAL_EXPRESSION = 0xC3 + SHOW_ITEM_EFFECT = 0xC4 + SHOW_CHAIR = 0xC6 + UPDATE_CHAR_LOOK = 0xC7 + SHOW_FOREIGN_EFFECT = 0xC8 + GIVE_FOREIGN_BUFF = 0xC9 + CANCEL_FOREIGN_BUFF = 0xCA + UPDATE_PARTYMEMBER_HP = 0xCB + CANCEL_CHAIR = 0xCF + SHOW_ITEM_GAIN_INCHAT = 0xD0 + DOJO_WARP_UP = 0xD1 + MESOBAG_SUCCESS =0xD4 + MESOBAG_FAILURE =0xD5 + CURRENT_MAP_WARP = 0x147 + UPDATE_QUEST_INFO = 0xD6 + PET_FLAG_CHANGE = 0xD8 + PLAYER_HINT = 0xD9 + REPAIR_WINDOW = 0x9A + CYGNUS_INTRO_LOCK = 0xE4 + CYGNUS_INTRO_DISABLE_UI = 0xE3 + CS_UPDATE = 0x161 + CS_OPERATION = 0x162 + SPAWN_NPC = 0x104 + REMOVE_NPC = 0x105 + SPAWN_NPC_REQUEST_CONTROLLER = 0x106 + SPAWN_MONSTER = 0xEE + SPAWN_MONSTER_CONTROL = 0xF0 + MOVE_MONSTER_RESPONSE = 0xF2 + KILL_MONSTER = 0xEF + DROP_ITEM_FROM_MAPOBJECT = 0x110 + MOVE_MONSTER = 0xF1 + OPEN_NPC_SHOP = 0x146 + CONFIRM_SHOP_TRANSACTION = 0x147 + OPEN_STORAGE = 0x14A + REMOVE_ITEM_FROM_MAP = 0x111 + PLAYER_INTERACTION = 0x14F + NPC_TALK = 0x145 + KEYMAP = 0x16F + SHOW_MONSTER_HP = 0xFC + APPLY_MONSTER_STATUS = 0xF4 + CANCEL_MONSTER_STATUS = 0xF5 + SPAWN_DOOR = 0x117 + REMOVE_DOOR = 0x118 + SPAWN_MIST = 0x115 + REMOVE_MIST = 0x116 + DAMAGE_MONSTER = 0xF8 + REACTOR_SPAWN = 0x11E + REACTOR_HIT = 0x11C + REACTOR_DESTROY = 0x11F + SHOW_MAGNET = 0xFD + MERCH_ITEM_MSG = 0x14B + MERCH_ITEM_STORE = 0x14C + MESSENGER = 0x14E + COOLDOWN = 0xEC + SUMMON_HINT = 0xE5 + SUMMON_HINT_MSG = 0xE6 + SUMMON_SKILL = 0xBA + ARIANT_PQ_START + CATCH_MONSTER = 0x103 + ARIANT_SCOREBOARD = 0x9A + ZAKUM_SHRINE = 0x144 + DUEY = 0x15F + MONSTER_CARNIVAL_START = 0x129 + MONSTER_CARNIVAL_OBTAINED_CP = 0x12A + MONSTER_CARNIVAL_PARTY_CP = 0x12B + MONSTER_CARNIVAL_SUMMON = 0x12C + MONSTER_CARNIVAL_DIED = 0x12E + SPAWN_HIRED_MERCHANT = 0x10D + UPDATE_HIRED_MERCHANT = 0x10F + DESTROY_HIRED_MERCHANT = 0x10E + FAIRY_PEND_MSG = 0x60 + VICIOUS_HAMMER = 0x183 + ROLL_SNOWBALL = 0x120 + HIT_SNOWBALL = 0x121 + SNOWBALL_MESSAGE = 0x122 + LEFT_KNOCK_BACK = 0x123 + HIT_COCONUT = 0x124 + COCONUT_SCORE = 0x125 + ARAN_COMBO = 0xE7 + MTS_OPERATION = 0x17C + ENGAGE_RESULT = 0x46 + ENGLISH_QUIZ = 0x130 + UPDATE_BEANS = 0x15E + TIP_BEANS = 0x15B + OPEN_BEANS = 0x15C + SHOOT_BEANS = 0x15D + START_TV = 0x16B + REMOVE_TV = 0x16C + ENABLE_TV = 0x16D + PET_AUTO_HP = 0x170 + PET_AUTO_MP = 0x171 + TOP_MSG = 0x73 + CHAR_CASH = 0x7D + TOP_MSG = 0x999 \ No newline at end of file diff --git a/out/production/A079/provider/MapleCanvas.class b/out/production/A079/provider/MapleCanvas.class new file mode 100644 index 0000000..1110538 Binary files /dev/null and b/out/production/A079/provider/MapleCanvas.class differ diff --git a/out/production/A079/provider/MapleData.class b/out/production/A079/provider/MapleData.class new file mode 100644 index 0000000..6213337 Binary files /dev/null and b/out/production/A079/provider/MapleData.class differ diff --git a/out/production/A079/provider/MapleDataDirectoryEntry.class b/out/production/A079/provider/MapleDataDirectoryEntry.class new file mode 100644 index 0000000..9ad1bfa Binary files /dev/null and b/out/production/A079/provider/MapleDataDirectoryEntry.class differ diff --git a/out/production/A079/provider/MapleDataEntity.class b/out/production/A079/provider/MapleDataEntity.class new file mode 100644 index 0000000..6870d74 Binary files /dev/null and b/out/production/A079/provider/MapleDataEntity.class differ diff --git a/out/production/A079/provider/MapleDataEntry.class b/out/production/A079/provider/MapleDataEntry.class new file mode 100644 index 0000000..b9cfe82 Binary files /dev/null and b/out/production/A079/provider/MapleDataEntry.class differ diff --git a/out/production/A079/provider/MapleDataFileEntry.class b/out/production/A079/provider/MapleDataFileEntry.class new file mode 100644 index 0000000..edc433d Binary files /dev/null and b/out/production/A079/provider/MapleDataFileEntry.class differ diff --git a/out/production/A079/provider/MapleDataProvider.class b/out/production/A079/provider/MapleDataProvider.class new file mode 100644 index 0000000..c5342e2 Binary files /dev/null and b/out/production/A079/provider/MapleDataProvider.class differ diff --git a/out/production/A079/provider/MapleDataProviderFactory.class b/out/production/A079/provider/MapleDataProviderFactory.class new file mode 100644 index 0000000..351714f Binary files /dev/null and b/out/production/A079/provider/MapleDataProviderFactory.class differ diff --git a/out/production/A079/provider/MapleDataTool.class b/out/production/A079/provider/MapleDataTool.class new file mode 100644 index 0000000..2b1b1d4 Binary files /dev/null and b/out/production/A079/provider/MapleDataTool.class differ diff --git a/out/production/A079/provider/WzXML/FileStoredPngMapleCanvas.class b/out/production/A079/provider/WzXML/FileStoredPngMapleCanvas.class new file mode 100644 index 0000000..072848a Binary files /dev/null and b/out/production/A079/provider/WzXML/FileStoredPngMapleCanvas.class differ diff --git a/out/production/A079/provider/WzXML/MapleDataType.class b/out/production/A079/provider/WzXML/MapleDataType.class new file mode 100644 index 0000000..d676975 Binary files /dev/null and b/out/production/A079/provider/WzXML/MapleDataType.class differ diff --git a/out/production/A079/provider/WzXML/PNGMapleCanvas.class b/out/production/A079/provider/WzXML/PNGMapleCanvas.class new file mode 100644 index 0000000..8b51f4c Binary files /dev/null and b/out/production/A079/provider/WzXML/PNGMapleCanvas.class differ diff --git a/out/production/A079/provider/WzXML/WZDirectoryEntry.class b/out/production/A079/provider/WzXML/WZDirectoryEntry.class new file mode 100644 index 0000000..43f024a Binary files /dev/null and b/out/production/A079/provider/WzXML/WZDirectoryEntry.class differ diff --git a/out/production/A079/provider/WzXML/WZEntry.class b/out/production/A079/provider/WzXML/WZEntry.class new file mode 100644 index 0000000..f286e15 Binary files /dev/null and b/out/production/A079/provider/WzXML/WZEntry.class differ diff --git a/out/production/A079/provider/WzXML/WZFileEntry.class b/out/production/A079/provider/WzXML/WZFileEntry.class new file mode 100644 index 0000000..cae8ed1 Binary files /dev/null and b/out/production/A079/provider/WzXML/WZFileEntry.class differ diff --git a/out/production/A079/provider/WzXML/XMLDomMapleData$1.class b/out/production/A079/provider/WzXML/XMLDomMapleData$1.class new file mode 100644 index 0000000..8044328 Binary files /dev/null and b/out/production/A079/provider/WzXML/XMLDomMapleData$1.class differ diff --git a/out/production/A079/provider/WzXML/XMLDomMapleData.class b/out/production/A079/provider/WzXML/XMLDomMapleData.class new file mode 100644 index 0000000..e1cd044 Binary files /dev/null and b/out/production/A079/provider/WzXML/XMLDomMapleData.class differ diff --git a/out/production/A079/provider/WzXML/XMLWZFile.class b/out/production/A079/provider/WzXML/XMLWZFile.class new file mode 100644 index 0000000..b823e94 Binary files /dev/null and b/out/production/A079/provider/WzXML/XMLWZFile.class differ diff --git a/out/production/A079/scripting/AbstractPlayerInteraction.class b/out/production/A079/scripting/AbstractPlayerInteraction.class new file mode 100644 index 0000000..800f3ea Binary files /dev/null and b/out/production/A079/scripting/AbstractPlayerInteraction.class differ diff --git a/out/production/A079/scripting/AbstractScriptManager.class b/out/production/A079/scripting/AbstractScriptManager.class new file mode 100644 index 0000000..0ea1f66 Binary files /dev/null and b/out/production/A079/scripting/AbstractScriptManager.class differ diff --git a/out/production/A079/scripting/EventInstanceManager$1.class b/out/production/A079/scripting/EventInstanceManager$1.class new file mode 100644 index 0000000..bc41de7 Binary files /dev/null and b/out/production/A079/scripting/EventInstanceManager$1.class differ diff --git a/out/production/A079/scripting/EventInstanceManager$2.class b/out/production/A079/scripting/EventInstanceManager$2.class new file mode 100644 index 0000000..afc74bc Binary files /dev/null and b/out/production/A079/scripting/EventInstanceManager$2.class differ diff --git a/out/production/A079/scripting/EventInstanceManager.class b/out/production/A079/scripting/EventInstanceManager.class new file mode 100644 index 0000000..4a6b5d5 Binary files /dev/null and b/out/production/A079/scripting/EventInstanceManager.class differ diff --git a/out/production/A079/scripting/EventManager$1.class b/out/production/A079/scripting/EventManager$1.class new file mode 100644 index 0000000..98f5582 Binary files /dev/null and b/out/production/A079/scripting/EventManager$1.class differ diff --git a/out/production/A079/scripting/EventManager$2.class b/out/production/A079/scripting/EventManager$2.class new file mode 100644 index 0000000..f1767c3 Binary files /dev/null and b/out/production/A079/scripting/EventManager$2.class differ diff --git a/out/production/A079/scripting/EventManager$3.class b/out/production/A079/scripting/EventManager$3.class new file mode 100644 index 0000000..31622a8 Binary files /dev/null and b/out/production/A079/scripting/EventManager$3.class differ diff --git a/out/production/A079/scripting/EventManager$4.class b/out/production/A079/scripting/EventManager$4.class new file mode 100644 index 0000000..71821f4 Binary files /dev/null and b/out/production/A079/scripting/EventManager$4.class differ diff --git a/out/production/A079/scripting/EventManager.class b/out/production/A079/scripting/EventManager.class new file mode 100644 index 0000000..16b8534 Binary files /dev/null and b/out/production/A079/scripting/EventManager.class differ diff --git a/out/production/A079/scripting/EventScriptManager$EventEntry.class b/out/production/A079/scripting/EventScriptManager$EventEntry.class new file mode 100644 index 0000000..a709a2e Binary files /dev/null and b/out/production/A079/scripting/EventScriptManager$EventEntry.class differ diff --git a/out/production/A079/scripting/EventScriptManager.class b/out/production/A079/scripting/EventScriptManager.class new file mode 100644 index 0000000..319b6b1 Binary files /dev/null and b/out/production/A079/scripting/EventScriptManager.class differ diff --git a/out/production/A079/scripting/LieDetectorScript.class b/out/production/A079/scripting/LieDetectorScript.class new file mode 100644 index 0000000..36160df Binary files /dev/null and b/out/production/A079/scripting/LieDetectorScript.class differ diff --git a/out/production/A079/scripting/NPCConversationManager$1.class b/out/production/A079/scripting/NPCConversationManager$1.class new file mode 100644 index 0000000..0f4e090 Binary files /dev/null and b/out/production/A079/scripting/NPCConversationManager$1.class differ diff --git a/out/production/A079/scripting/NPCConversationManager$2.class b/out/production/A079/scripting/NPCConversationManager$2.class new file mode 100644 index 0000000..2cf780d Binary files /dev/null and b/out/production/A079/scripting/NPCConversationManager$2.class differ diff --git a/out/production/A079/scripting/NPCConversationManager$3.class b/out/production/A079/scripting/NPCConversationManager$3.class new file mode 100644 index 0000000..cec01a0 Binary files /dev/null and b/out/production/A079/scripting/NPCConversationManager$3.class differ diff --git a/out/production/A079/scripting/NPCConversationManager$4.class b/out/production/A079/scripting/NPCConversationManager$4.class new file mode 100644 index 0000000..f626436 Binary files /dev/null and b/out/production/A079/scripting/NPCConversationManager$4.class differ diff --git a/out/production/A079/scripting/NPCConversationManager.class b/out/production/A079/scripting/NPCConversationManager.class new file mode 100644 index 0000000..f29348f Binary files /dev/null and b/out/production/A079/scripting/NPCConversationManager.class differ diff --git a/out/production/A079/scripting/NPCScriptManager.class b/out/production/A079/scripting/NPCScriptManager.class new file mode 100644 index 0000000..bd8d8fa Binary files /dev/null and b/out/production/A079/scripting/NPCScriptManager.class differ diff --git a/out/production/A079/scripting/PortalPlayerInteraction.class b/out/production/A079/scripting/PortalPlayerInteraction.class new file mode 100644 index 0000000..0377953 Binary files /dev/null and b/out/production/A079/scripting/PortalPlayerInteraction.class differ diff --git a/out/production/A079/scripting/PortalScript.class b/out/production/A079/scripting/PortalScript.class new file mode 100644 index 0000000..6992909 Binary files /dev/null and b/out/production/A079/scripting/PortalScript.class differ diff --git a/out/production/A079/scripting/PortalScriptManager.class b/out/production/A079/scripting/PortalScriptManager.class new file mode 100644 index 0000000..7da865c Binary files /dev/null and b/out/production/A079/scripting/PortalScriptManager.class differ diff --git a/out/production/A079/scripting/ReactorActionManager.class b/out/production/A079/scripting/ReactorActionManager.class new file mode 100644 index 0000000..24b44e4 Binary files /dev/null and b/out/production/A079/scripting/ReactorActionManager.class differ diff --git a/out/production/A079/scripting/ReactorScriptManager.class b/out/production/A079/scripting/ReactorScriptManager.class new file mode 100644 index 0000000..c7fc28a Binary files /dev/null and b/out/production/A079/scripting/ReactorScriptManager.class differ diff --git a/out/production/A079/server/AutobanManager$ExpirationEntry.class b/out/production/A079/server/AutobanManager$ExpirationEntry.class new file mode 100644 index 0000000..896a3b8 Binary files /dev/null and b/out/production/A079/server/AutobanManager$ExpirationEntry.class differ diff --git a/out/production/A079/server/AutobanManager.class b/out/production/A079/server/AutobanManager.class new file mode 100644 index 0000000..9aa3de7 Binary files /dev/null and b/out/production/A079/server/AutobanManager.class differ diff --git a/out/production/A079/server/BossInMap.class b/out/production/A079/server/BossInMap.class new file mode 100644 index 0000000..2ea1260 Binary files /dev/null and b/out/production/A079/server/BossInMap.class differ diff --git a/out/production/A079/server/CashItem.class b/out/production/A079/server/CashItem.class new file mode 100644 index 0000000..a737087 Binary files /dev/null and b/out/production/A079/server/CashItem.class differ diff --git a/out/production/A079/server/CashItemFactory.class b/out/production/A079/server/CashItemFactory.class new file mode 100644 index 0000000..f32ddcd Binary files /dev/null and b/out/production/A079/server/CashItemFactory.class differ diff --git a/out/production/A079/server/CashItemInfo$CashModInfo.class b/out/production/A079/server/CashItemInfo$CashModInfo.class new file mode 100644 index 0000000..12ab80d Binary files /dev/null and b/out/production/A079/server/CashItemInfo$CashModInfo.class differ diff --git a/out/production/A079/server/CashItemInfo.class b/out/production/A079/server/CashItemInfo.class new file mode 100644 index 0000000..aa19725 Binary files /dev/null and b/out/production/A079/server/CashItemInfo.class differ diff --git a/out/production/A079/server/CashShop.class b/out/production/A079/server/CashShop.class new file mode 100644 index 0000000..e14a5fe Binary files /dev/null and b/out/production/A079/server/CashShop.class differ diff --git a/out/production/A079/server/FishingRewardFactory$FishingReward.class b/out/production/A079/server/FishingRewardFactory$FishingReward.class new file mode 100644 index 0000000..f1b826c Binary files /dev/null and b/out/production/A079/server/FishingRewardFactory$FishingReward.class differ diff --git a/out/production/A079/server/FishingRewardFactory.class b/out/production/A079/server/FishingRewardFactory.class new file mode 100644 index 0000000..860a413 Binary files /dev/null and b/out/production/A079/server/FishingRewardFactory.class differ diff --git a/out/production/A079/server/ItemInformation.class b/out/production/A079/server/ItemInformation.class new file mode 100644 index 0000000..8ef8160 Binary files /dev/null and b/out/production/A079/server/ItemInformation.class differ diff --git a/out/production/A079/server/ItemMakerFactory$GemCreateEntry.class b/out/production/A079/server/ItemMakerFactory$GemCreateEntry.class new file mode 100644 index 0000000..f88b8a9 Binary files /dev/null and b/out/production/A079/server/ItemMakerFactory$GemCreateEntry.class differ diff --git a/out/production/A079/server/ItemMakerFactory$ItemMakerCreateEntry.class b/out/production/A079/server/ItemMakerFactory$ItemMakerCreateEntry.class new file mode 100644 index 0000000..439ea34 Binary files /dev/null and b/out/production/A079/server/ItemMakerFactory$ItemMakerCreateEntry.class differ diff --git a/out/production/A079/server/ItemMakerFactory.class b/out/production/A079/server/ItemMakerFactory.class new file mode 100644 index 0000000..30c7b41 Binary files /dev/null and b/out/production/A079/server/ItemMakerFactory.class differ diff --git a/out/production/A079/server/MTSCart.class b/out/production/A079/server/MTSCart.class new file mode 100644 index 0000000..66fd9d7 Binary files /dev/null and b/out/production/A079/server/MTSCart.class differ diff --git a/out/production/A079/server/MTSStorage$MTSItemInfo.class b/out/production/A079/server/MTSStorage$MTSItemInfo.class new file mode 100644 index 0000000..1c5a0ab Binary files /dev/null and b/out/production/A079/server/MTSStorage$MTSItemInfo.class differ diff --git a/out/production/A079/server/MTSStorage.class b/out/production/A079/server/MTSStorage.class new file mode 100644 index 0000000..a0f616f Binary files /dev/null and b/out/production/A079/server/MTSStorage.class differ diff --git a/out/production/A079/server/MapleAchievement.class b/out/production/A079/server/MapleAchievement.class new file mode 100644 index 0000000..f4fe8ae Binary files /dev/null and b/out/production/A079/server/MapleAchievement.class differ diff --git a/out/production/A079/server/MapleAchievements.class b/out/production/A079/server/MapleAchievements.class new file mode 100644 index 0000000..41005ba Binary files /dev/null and b/out/production/A079/server/MapleAchievements.class differ diff --git a/out/production/A079/server/MapleCarnivalChallenge.class b/out/production/A079/server/MapleCarnivalChallenge.class new file mode 100644 index 0000000..3dd888a Binary files /dev/null and b/out/production/A079/server/MapleCarnivalChallenge.class differ diff --git a/out/production/A079/server/MapleCarnivalFactory$MCSkill.class b/out/production/A079/server/MapleCarnivalFactory$MCSkill.class new file mode 100644 index 0000000..51c7329 Binary files /dev/null and b/out/production/A079/server/MapleCarnivalFactory$MCSkill.class differ diff --git a/out/production/A079/server/MapleCarnivalFactory.class b/out/production/A079/server/MapleCarnivalFactory.class new file mode 100644 index 0000000..b082f26 Binary files /dev/null and b/out/production/A079/server/MapleCarnivalFactory.class differ diff --git a/out/production/A079/server/MapleCarnivalParty.class b/out/production/A079/server/MapleCarnivalParty.class new file mode 100644 index 0000000..ec663ce Binary files /dev/null and b/out/production/A079/server/MapleCarnivalParty.class differ diff --git a/out/production/A079/server/MapleDueyActions.class b/out/production/A079/server/MapleDueyActions.class new file mode 100644 index 0000000..3a75299 Binary files /dev/null and b/out/production/A079/server/MapleDueyActions.class differ diff --git a/out/production/A079/server/MapleInventoryManipulator.class b/out/production/A079/server/MapleInventoryManipulator.class new file mode 100644 index 0000000..7f79f93 Binary files /dev/null and b/out/production/A079/server/MapleInventoryManipulator.class differ diff --git a/out/production/A079/server/MapleItemInformationProvider$1.class b/out/production/A079/server/MapleItemInformationProvider$1.class new file mode 100644 index 0000000..19a788a Binary files /dev/null and b/out/production/A079/server/MapleItemInformationProvider$1.class differ diff --git a/out/production/A079/server/MapleItemInformationProvider.class b/out/production/A079/server/MapleItemInformationProvider.class new file mode 100644 index 0000000..69b7f64 Binary files /dev/null and b/out/production/A079/server/MapleItemInformationProvider.class differ diff --git a/out/production/A079/server/MaplePortal.class b/out/production/A079/server/MaplePortal.class new file mode 100644 index 0000000..16ec125 Binary files /dev/null and b/out/production/A079/server/MaplePortal.class differ diff --git a/out/production/A079/server/MapleShop.class b/out/production/A079/server/MapleShop.class new file mode 100644 index 0000000..cd9526d Binary files /dev/null and b/out/production/A079/server/MapleShop.class differ diff --git a/out/production/A079/server/MapleShopFactory.class b/out/production/A079/server/MapleShopFactory.class new file mode 100644 index 0000000..81793fd Binary files /dev/null and b/out/production/A079/server/MapleShopFactory.class differ diff --git a/out/production/A079/server/MapleShopItem.class b/out/production/A079/server/MapleShopItem.class new file mode 100644 index 0000000..e300888 Binary files /dev/null and b/out/production/A079/server/MapleShopItem.class differ diff --git a/out/production/A079/server/MapleSquad$1.class b/out/production/A079/server/MapleSquad$1.class new file mode 100644 index 0000000..9e09b50 Binary files /dev/null and b/out/production/A079/server/MapleSquad$1.class differ diff --git a/out/production/A079/server/MapleSquad$MapleSquadType.class b/out/production/A079/server/MapleSquad$MapleSquadType.class new file mode 100644 index 0000000..34f9bd6 Binary files /dev/null and b/out/production/A079/server/MapleSquad$MapleSquadType.class differ diff --git a/out/production/A079/server/MapleSquad.class b/out/production/A079/server/MapleSquad.class new file mode 100644 index 0000000..daab342 Binary files /dev/null and b/out/production/A079/server/MapleSquad.class differ diff --git a/out/production/A079/server/MapleStatEffect$CancelEffectAction.class b/out/production/A079/server/MapleStatEffect$CancelEffectAction.class new file mode 100644 index 0000000..04ce016 Binary files /dev/null and b/out/production/A079/server/MapleStatEffect$CancelEffectAction.class differ diff --git a/out/production/A079/server/MapleStatEffect.class b/out/production/A079/server/MapleStatEffect.class new file mode 100644 index 0000000..fc20424 Binary files /dev/null and b/out/production/A079/server/MapleStatEffect.class differ diff --git a/out/production/A079/server/MapleStorage$1.class b/out/production/A079/server/MapleStorage$1.class new file mode 100644 index 0000000..1373510 Binary files /dev/null and b/out/production/A079/server/MapleStorage$1.class differ diff --git a/out/production/A079/server/MapleStorage$2.class b/out/production/A079/server/MapleStorage$2.class new file mode 100644 index 0000000..a4363e4 Binary files /dev/null and b/out/production/A079/server/MapleStorage$2.class differ diff --git a/out/production/A079/server/MapleStorage.class b/out/production/A079/server/MapleStorage.class new file mode 100644 index 0000000..ca180e2 Binary files /dev/null and b/out/production/A079/server/MapleStorage.class differ diff --git a/out/production/A079/server/MapleTVEffect$1.class b/out/production/A079/server/MapleTVEffect$1.class new file mode 100644 index 0000000..be4c1a2 Binary files /dev/null and b/out/production/A079/server/MapleTVEffect$1.class differ diff --git a/out/production/A079/server/MapleTVEffect.class b/out/production/A079/server/MapleTVEffect.class new file mode 100644 index 0000000..da707d6 Binary files /dev/null and b/out/production/A079/server/MapleTVEffect.class differ diff --git a/out/production/A079/server/MapleTrade$1.class b/out/production/A079/server/MapleTrade$1.class new file mode 100644 index 0000000..a682bfd Binary files /dev/null and b/out/production/A079/server/MapleTrade$1.class differ diff --git a/out/production/A079/server/MapleTrade.class b/out/production/A079/server/MapleTrade.class new file mode 100644 index 0000000..158a483 Binary files /dev/null and b/out/production/A079/server/MapleTrade.class differ diff --git a/out/production/A079/server/MerchItemPackage.class b/out/production/A079/server/MerchItemPackage.class new file mode 100644 index 0000000..fa4fab1 Binary files /dev/null and b/out/production/A079/server/MerchItemPackage.class differ diff --git a/out/production/A079/server/PortalFactory.class b/out/production/A079/server/PortalFactory.class new file mode 100644 index 0000000..86f92ec Binary files /dev/null and b/out/production/A079/server/PortalFactory.class differ diff --git a/out/production/A079/server/PredictCardFactory$PredictCard.class b/out/production/A079/server/PredictCardFactory$PredictCard.class new file mode 100644 index 0000000..5395bb1 Binary files /dev/null and b/out/production/A079/server/PredictCardFactory$PredictCard.class differ diff --git a/out/production/A079/server/PredictCardFactory$PredictCardComment.class b/out/production/A079/server/PredictCardFactory$PredictCardComment.class new file mode 100644 index 0000000..df936d0 Binary files /dev/null and b/out/production/A079/server/PredictCardFactory$PredictCardComment.class differ diff --git a/out/production/A079/server/PredictCardFactory.class b/out/production/A079/server/PredictCardFactory.class new file mode 100644 index 0000000..4adada5 Binary files /dev/null and b/out/production/A079/server/PredictCardFactory.class differ diff --git a/out/production/A079/server/RandomRewards.class b/out/production/A079/server/RandomRewards.class new file mode 100644 index 0000000..83dc350 Binary files /dev/null and b/out/production/A079/server/RandomRewards.class differ diff --git a/out/production/A079/server/Randomizer.class b/out/production/A079/server/Randomizer.class new file mode 100644 index 0000000..2159999 Binary files /dev/null and b/out/production/A079/server/Randomizer.class differ diff --git a/out/production/A079/server/RankingWorker$RankingInformation.class b/out/production/A079/server/RankingWorker$RankingInformation.class new file mode 100644 index 0000000..a9aaaf4 Binary files /dev/null and b/out/production/A079/server/RankingWorker$RankingInformation.class differ diff --git a/out/production/A079/server/RankingWorker.class b/out/production/A079/server/RankingWorker.class new file mode 100644 index 0000000..0c5f0c8 Binary files /dev/null and b/out/production/A079/server/RankingWorker.class differ diff --git a/out/production/A079/server/ServerProperties.class b/out/production/A079/server/ServerProperties.class new file mode 100644 index 0000000..d347671 Binary files /dev/null and b/out/production/A079/server/ServerProperties.class differ diff --git a/out/production/A079/server/ShutdownServer.class b/out/production/A079/server/ShutdownServer.class new file mode 100644 index 0000000..cc58981 Binary files /dev/null and b/out/production/A079/server/ShutdownServer.class differ diff --git a/out/production/A079/server/ShutdownServerMBean.class b/out/production/A079/server/ShutdownServerMBean.class new file mode 100644 index 0000000..9865e86 Binary files /dev/null and b/out/production/A079/server/ShutdownServerMBean.class differ diff --git a/out/production/A079/server/SkillType.class b/out/production/A079/server/SkillType.class new file mode 100644 index 0000000..658b652 Binary files /dev/null and b/out/production/A079/server/SkillType.class differ diff --git a/out/production/A079/server/SpeedRunner.class b/out/production/A079/server/SpeedRunner.class new file mode 100644 index 0000000..921fc4b Binary files /dev/null and b/out/production/A079/server/SpeedRunner.class differ diff --git a/out/production/A079/server/StructPotentialItem.class b/out/production/A079/server/StructPotentialItem.class new file mode 100644 index 0000000..afaee98 Binary files /dev/null and b/out/production/A079/server/StructPotentialItem.class differ diff --git a/out/production/A079/server/StructRewardItem.class b/out/production/A079/server/StructRewardItem.class new file mode 100644 index 0000000..c5a3a75 Binary files /dev/null and b/out/production/A079/server/StructRewardItem.class differ diff --git a/out/production/A079/server/StructSetItem$SetItem.class b/out/production/A079/server/StructSetItem$SetItem.class new file mode 100644 index 0000000..2f00365 Binary files /dev/null and b/out/production/A079/server/StructSetItem$SetItem.class differ diff --git a/out/production/A079/server/StructSetItem.class b/out/production/A079/server/StructSetItem.class new file mode 100644 index 0000000..96d4a36 Binary files /dev/null and b/out/production/A079/server/StructSetItem.class differ diff --git a/out/production/A079/server/Timer$1.class b/out/production/A079/server/Timer$1.class new file mode 100644 index 0000000..6de239e Binary files /dev/null and b/out/production/A079/server/Timer$1.class differ diff --git a/out/production/A079/server/Timer$BuffTimer.class b/out/production/A079/server/Timer$BuffTimer.class new file mode 100644 index 0000000..b02578d Binary files /dev/null and b/out/production/A079/server/Timer$BuffTimer.class differ diff --git a/out/production/A079/server/Timer$CheatTimer.class b/out/production/A079/server/Timer$CheatTimer.class new file mode 100644 index 0000000..a164cc3 Binary files /dev/null and b/out/production/A079/server/Timer$CheatTimer.class differ diff --git a/out/production/A079/server/Timer$CloneTimer.class b/out/production/A079/server/Timer$CloneTimer.class new file mode 100644 index 0000000..3d46a85 Binary files /dev/null and b/out/production/A079/server/Timer$CloneTimer.class differ diff --git a/out/production/A079/server/Timer$EtcTimer.class b/out/production/A079/server/Timer$EtcTimer.class new file mode 100644 index 0000000..67666a3 Binary files /dev/null and b/out/production/A079/server/Timer$EtcTimer.class differ diff --git a/out/production/A079/server/Timer$EventTimer.class b/out/production/A079/server/Timer$EventTimer.class new file mode 100644 index 0000000..788f1d6 Binary files /dev/null and b/out/production/A079/server/Timer$EventTimer.class differ diff --git a/out/production/A079/server/Timer$LoggingSaveRunnable.class b/out/production/A079/server/Timer$LoggingSaveRunnable.class new file mode 100644 index 0000000..f66f241 Binary files /dev/null and b/out/production/A079/server/Timer$LoggingSaveRunnable.class differ diff --git a/out/production/A079/server/Timer$MapTimer.class b/out/production/A079/server/Timer$MapTimer.class new file mode 100644 index 0000000..064862a Binary files /dev/null and b/out/production/A079/server/Timer$MapTimer.class differ diff --git a/out/production/A079/server/Timer$MobTimer.class b/out/production/A079/server/Timer$MobTimer.class new file mode 100644 index 0000000..e63e61c Binary files /dev/null and b/out/production/A079/server/Timer$MobTimer.class differ diff --git a/out/production/A079/server/Timer$PingTimer.class b/out/production/A079/server/Timer$PingTimer.class new file mode 100644 index 0000000..b45e2d6 Binary files /dev/null and b/out/production/A079/server/Timer$PingTimer.class differ diff --git a/out/production/A079/server/Timer$WorldTimer.class b/out/production/A079/server/Timer$WorldTimer.class new file mode 100644 index 0000000..2da1ec4 Binary files /dev/null and b/out/production/A079/server/Timer$WorldTimer.class differ diff --git a/out/production/A079/server/Timer.class b/out/production/A079/server/Timer.class new file mode 100644 index 0000000..80cd5cd Binary files /dev/null and b/out/production/A079/server/Timer.class differ diff --git a/out/production/A079/server/events/MapleCoconut$1.class b/out/production/A079/server/events/MapleCoconut$1.class new file mode 100644 index 0000000..821e921 Binary files /dev/null and b/out/production/A079/server/events/MapleCoconut$1.class differ diff --git a/out/production/A079/server/events/MapleCoconut$2.class b/out/production/A079/server/events/MapleCoconut$2.class new file mode 100644 index 0000000..9f669d8 Binary files /dev/null and b/out/production/A079/server/events/MapleCoconut$2.class differ diff --git a/out/production/A079/server/events/MapleCoconut$3.class b/out/production/A079/server/events/MapleCoconut$3.class new file mode 100644 index 0000000..cd9636d Binary files /dev/null and b/out/production/A079/server/events/MapleCoconut$3.class differ diff --git a/out/production/A079/server/events/MapleCoconut$MapleCoconuts.class b/out/production/A079/server/events/MapleCoconut$MapleCoconuts.class new file mode 100644 index 0000000..09ca50b Binary files /dev/null and b/out/production/A079/server/events/MapleCoconut$MapleCoconuts.class differ diff --git a/out/production/A079/server/events/MapleCoconut.class b/out/production/A079/server/events/MapleCoconut.class new file mode 100644 index 0000000..642d77b Binary files /dev/null and b/out/production/A079/server/events/MapleCoconut.class differ diff --git a/out/production/A079/server/events/MapleEvent$1.class b/out/production/A079/server/events/MapleEvent$1.class new file mode 100644 index 0000000..33672d8 Binary files /dev/null and b/out/production/A079/server/events/MapleEvent$1.class differ diff --git a/out/production/A079/server/events/MapleEvent.class b/out/production/A079/server/events/MapleEvent.class new file mode 100644 index 0000000..bc92025 Binary files /dev/null and b/out/production/A079/server/events/MapleEvent.class differ diff --git a/out/production/A079/server/events/MapleEventType.class b/out/production/A079/server/events/MapleEventType.class new file mode 100644 index 0000000..cfc1452 Binary files /dev/null and b/out/production/A079/server/events/MapleEventType.class differ diff --git a/out/production/A079/server/events/MapleFitness$1.class b/out/production/A079/server/events/MapleFitness$1.class new file mode 100644 index 0000000..e1aafdd Binary files /dev/null and b/out/production/A079/server/events/MapleFitness$1.class differ diff --git a/out/production/A079/server/events/MapleFitness$2.class b/out/production/A079/server/events/MapleFitness$2.class new file mode 100644 index 0000000..92d119a Binary files /dev/null and b/out/production/A079/server/events/MapleFitness$2.class differ diff --git a/out/production/A079/server/events/MapleFitness.class b/out/production/A079/server/events/MapleFitness.class new file mode 100644 index 0000000..942babc Binary files /dev/null and b/out/production/A079/server/events/MapleFitness.class differ diff --git a/out/production/A079/server/events/MapleJewel$1.class b/out/production/A079/server/events/MapleJewel$1.class new file mode 100644 index 0000000..4892104 Binary files /dev/null and b/out/production/A079/server/events/MapleJewel$1.class differ diff --git a/out/production/A079/server/events/MapleJewel.class b/out/production/A079/server/events/MapleJewel.class new file mode 100644 index 0000000..3f4b7c8 Binary files /dev/null and b/out/production/A079/server/events/MapleJewel.class differ diff --git a/out/production/A079/server/events/MapleOla$1.class b/out/production/A079/server/events/MapleOla$1.class new file mode 100644 index 0000000..096d8f0 Binary files /dev/null and b/out/production/A079/server/events/MapleOla$1.class differ diff --git a/out/production/A079/server/events/MapleOla.class b/out/production/A079/server/events/MapleOla.class new file mode 100644 index 0000000..5b3750f Binary files /dev/null and b/out/production/A079/server/events/MapleOla.class differ diff --git a/out/production/A079/server/events/MapleOxQuiz$1$1.class b/out/production/A079/server/events/MapleOxQuiz$1$1.class new file mode 100644 index 0000000..41c04a8 Binary files /dev/null and b/out/production/A079/server/events/MapleOxQuiz$1$1.class differ diff --git a/out/production/A079/server/events/MapleOxQuiz$1.class b/out/production/A079/server/events/MapleOxQuiz$1.class new file mode 100644 index 0000000..8487e6f Binary files /dev/null and b/out/production/A079/server/events/MapleOxQuiz$1.class differ diff --git a/out/production/A079/server/events/MapleOxQuiz.class b/out/production/A079/server/events/MapleOxQuiz.class new file mode 100644 index 0000000..8860ddb Binary files /dev/null and b/out/production/A079/server/events/MapleOxQuiz.class differ diff --git a/out/production/A079/server/events/MapleOxQuizFactory$MapleOxQuizEntry.class b/out/production/A079/server/events/MapleOxQuizFactory$MapleOxQuizEntry.class new file mode 100644 index 0000000..1db7a26 Binary files /dev/null and b/out/production/A079/server/events/MapleOxQuizFactory$MapleOxQuizEntry.class differ diff --git a/out/production/A079/server/events/MapleOxQuizFactory.class b/out/production/A079/server/events/MapleOxQuizFactory.class new file mode 100644 index 0000000..3e39352 Binary files /dev/null and b/out/production/A079/server/events/MapleOxQuizFactory.class differ diff --git a/out/production/A079/server/events/MapleSnowball$MapleSnowballs$1.class b/out/production/A079/server/events/MapleSnowball$MapleSnowballs$1.class new file mode 100644 index 0000000..fb2ddeb Binary files /dev/null and b/out/production/A079/server/events/MapleSnowball$MapleSnowballs$1.class differ diff --git a/out/production/A079/server/events/MapleSnowball$MapleSnowballs.class b/out/production/A079/server/events/MapleSnowball$MapleSnowballs.class new file mode 100644 index 0000000..215296f Binary files /dev/null and b/out/production/A079/server/events/MapleSnowball$MapleSnowballs.class differ diff --git a/out/production/A079/server/events/MapleSnowball.class b/out/production/A079/server/events/MapleSnowball.class new file mode 100644 index 0000000..3425707 Binary files /dev/null and b/out/production/A079/server/events/MapleSnowball.class differ diff --git a/out/production/A079/server/gashapon/Gashapon.class b/out/production/A079/server/gashapon/Gashapon.class new file mode 100644 index 0000000..40352b2 Binary files /dev/null and b/out/production/A079/server/gashapon/Gashapon.class differ diff --git a/out/production/A079/server/gashapon/GashaponFactory.class b/out/production/A079/server/gashapon/GashaponFactory.class new file mode 100644 index 0000000..6fbd7ec Binary files /dev/null and b/out/production/A079/server/gashapon/GashaponFactory.class differ diff --git a/out/production/A079/server/gashapon/GashaponReward.class b/out/production/A079/server/gashapon/GashaponReward.class new file mode 100644 index 0000000..37b24ef Binary files /dev/null and b/out/production/A079/server/gashapon/GashaponReward.class differ diff --git a/out/production/A079/server/life/AbstractLoadedMapleLife.class b/out/production/A079/server/life/AbstractLoadedMapleLife.class new file mode 100644 index 0000000..2942308 Binary files /dev/null and b/out/production/A079/server/life/AbstractLoadedMapleLife.class differ diff --git a/out/production/A079/server/life/BanishInfo.class b/out/production/A079/server/life/BanishInfo.class new file mode 100644 index 0000000..1d90d70 Binary files /dev/null and b/out/production/A079/server/life/BanishInfo.class differ diff --git a/out/production/A079/server/life/Element.class b/out/production/A079/server/life/Element.class new file mode 100644 index 0000000..ee1a3cd Binary files /dev/null and b/out/production/A079/server/life/Element.class differ diff --git a/out/production/A079/server/life/ElementalEffectiveness.class b/out/production/A079/server/life/ElementalEffectiveness.class new file mode 100644 index 0000000..e6be381 Binary files /dev/null and b/out/production/A079/server/life/ElementalEffectiveness.class differ diff --git a/out/production/A079/server/life/MapleLifeFactory.class b/out/production/A079/server/life/MapleLifeFactory.class new file mode 100644 index 0000000..beadd9c Binary files /dev/null and b/out/production/A079/server/life/MapleLifeFactory.class differ diff --git a/out/production/A079/server/life/MapleMonster$1.class b/out/production/A079/server/life/MapleMonster$1.class new file mode 100644 index 0000000..7417578 Binary files /dev/null and b/out/production/A079/server/life/MapleMonster$1.class differ diff --git a/out/production/A079/server/life/MapleMonster$2.class b/out/production/A079/server/life/MapleMonster$2.class new file mode 100644 index 0000000..862f24a Binary files /dev/null and b/out/production/A079/server/life/MapleMonster$2.class differ diff --git a/out/production/A079/server/life/MapleMonster$3.class b/out/production/A079/server/life/MapleMonster$3.class new file mode 100644 index 0000000..cbadf1f Binary files /dev/null and b/out/production/A079/server/life/MapleMonster$3.class differ diff --git a/out/production/A079/server/life/MapleMonster$AttackerEntry.class b/out/production/A079/server/life/MapleMonster$AttackerEntry.class new file mode 100644 index 0000000..4562c0a Binary files /dev/null and b/out/production/A079/server/life/MapleMonster$AttackerEntry.class differ diff --git a/out/production/A079/server/life/MapleMonster$AttackingMapleCharacter.class b/out/production/A079/server/life/MapleMonster$AttackingMapleCharacter.class new file mode 100644 index 0000000..aff592d Binary files /dev/null and b/out/production/A079/server/life/MapleMonster$AttackingMapleCharacter.class differ diff --git a/out/production/A079/server/life/MapleMonster$ExpMap.class b/out/production/A079/server/life/MapleMonster$ExpMap.class new file mode 100644 index 0000000..8123703 Binary files /dev/null and b/out/production/A079/server/life/MapleMonster$ExpMap.class differ diff --git a/out/production/A079/server/life/MapleMonster$OnePartyAttacker.class b/out/production/A079/server/life/MapleMonster$OnePartyAttacker.class new file mode 100644 index 0000000..4253f9d Binary files /dev/null and b/out/production/A079/server/life/MapleMonster$OnePartyAttacker.class differ diff --git a/out/production/A079/server/life/MapleMonster$PartyAttackerEntry.class b/out/production/A079/server/life/MapleMonster$PartyAttackerEntry.class new file mode 100644 index 0000000..2ba8855 Binary files /dev/null and b/out/production/A079/server/life/MapleMonster$PartyAttackerEntry.class differ diff --git a/out/production/A079/server/life/MapleMonster$PoisonTask.class b/out/production/A079/server/life/MapleMonster$PoisonTask.class new file mode 100644 index 0000000..fadc306 Binary files /dev/null and b/out/production/A079/server/life/MapleMonster$PoisonTask.class differ diff --git a/out/production/A079/server/life/MapleMonster$SingleAttackerEntry.class b/out/production/A079/server/life/MapleMonster$SingleAttackerEntry.class new file mode 100644 index 0000000..8785902 Binary files /dev/null and b/out/production/A079/server/life/MapleMonster$SingleAttackerEntry.class differ diff --git a/out/production/A079/server/life/MapleMonster.class b/out/production/A079/server/life/MapleMonster.class new file mode 100644 index 0000000..54d661d Binary files /dev/null and b/out/production/A079/server/life/MapleMonster.class differ diff --git a/out/production/A079/server/life/MapleMonsterInformationProvider.class b/out/production/A079/server/life/MapleMonsterInformationProvider.class new file mode 100644 index 0000000..b4b63e6 Binary files /dev/null and b/out/production/A079/server/life/MapleMonsterInformationProvider.class differ diff --git a/out/production/A079/server/life/MapleMonsterStats.class b/out/production/A079/server/life/MapleMonsterStats.class new file mode 100644 index 0000000..a9d60db Binary files /dev/null and b/out/production/A079/server/life/MapleMonsterStats.class differ diff --git a/out/production/A079/server/life/MapleNPC.class b/out/production/A079/server/life/MapleNPC.class new file mode 100644 index 0000000..940a76c Binary files /dev/null and b/out/production/A079/server/life/MapleNPC.class differ diff --git a/out/production/A079/server/life/MobAttackInfo.class b/out/production/A079/server/life/MobAttackInfo.class new file mode 100644 index 0000000..c4b1d61 Binary files /dev/null and b/out/production/A079/server/life/MobAttackInfo.class differ diff --git a/out/production/A079/server/life/MobAttackInfoFactory.class b/out/production/A079/server/life/MobAttackInfoFactory.class new file mode 100644 index 0000000..d5c7175 Binary files /dev/null and b/out/production/A079/server/life/MobAttackInfoFactory.class differ diff --git a/out/production/A079/server/life/MobSkill.class b/out/production/A079/server/life/MobSkill.class new file mode 100644 index 0000000..946d8c1 Binary files /dev/null and b/out/production/A079/server/life/MobSkill.class differ diff --git a/out/production/A079/server/life/MobSkillFactory.class b/out/production/A079/server/life/MobSkillFactory.class new file mode 100644 index 0000000..8449657 Binary files /dev/null and b/out/production/A079/server/life/MobSkillFactory.class differ diff --git a/out/production/A079/server/life/MonsterDropEntry.class b/out/production/A079/server/life/MonsterDropEntry.class new file mode 100644 index 0000000..2dc8813 Binary files /dev/null and b/out/production/A079/server/life/MonsterDropEntry.class differ diff --git a/out/production/A079/server/life/MonsterGlobalDropEntry.class b/out/production/A079/server/life/MonsterGlobalDropEntry.class new file mode 100644 index 0000000..40eab30 Binary files /dev/null and b/out/production/A079/server/life/MonsterGlobalDropEntry.class differ diff --git a/out/production/A079/server/life/MonsterListener.class b/out/production/A079/server/life/MonsterListener.class new file mode 100644 index 0000000..a9a7cd6 Binary files /dev/null and b/out/production/A079/server/life/MonsterListener.class differ diff --git a/out/production/A079/server/life/OverrideMonsterStats.class b/out/production/A079/server/life/OverrideMonsterStats.class new file mode 100644 index 0000000..7cbe49e Binary files /dev/null and b/out/production/A079/server/life/OverrideMonsterStats.class differ diff --git a/out/production/A079/server/life/PlayerNPC.class b/out/production/A079/server/life/PlayerNPC.class new file mode 100644 index 0000000..ccb96b8 Binary files /dev/null and b/out/production/A079/server/life/PlayerNPC.class differ diff --git a/out/production/A079/server/life/SpawnPoint$1.class b/out/production/A079/server/life/SpawnPoint$1.class new file mode 100644 index 0000000..41a9628 Binary files /dev/null and b/out/production/A079/server/life/SpawnPoint$1.class differ diff --git a/out/production/A079/server/life/SpawnPoint.class b/out/production/A079/server/life/SpawnPoint.class new file mode 100644 index 0000000..41e2d6f Binary files /dev/null and b/out/production/A079/server/life/SpawnPoint.class differ diff --git a/out/production/A079/server/life/SpawnPointAreaBoss$1.class b/out/production/A079/server/life/SpawnPointAreaBoss$1.class new file mode 100644 index 0000000..5c48063 Binary files /dev/null and b/out/production/A079/server/life/SpawnPointAreaBoss$1.class differ diff --git a/out/production/A079/server/life/SpawnPointAreaBoss.class b/out/production/A079/server/life/SpawnPointAreaBoss.class new file mode 100644 index 0000000..b43e8ac Binary files /dev/null and b/out/production/A079/server/life/SpawnPointAreaBoss.class differ diff --git a/out/production/A079/server/life/Spawns.class b/out/production/A079/server/life/Spawns.class new file mode 100644 index 0000000..7e6961d Binary files /dev/null and b/out/production/A079/server/life/Spawns.class differ diff --git a/out/production/A079/server/life/SummonAttackEntry.class b/out/production/A079/server/life/SummonAttackEntry.class new file mode 100644 index 0000000..70fa348 Binary files /dev/null and b/out/production/A079/server/life/SummonAttackEntry.class differ diff --git a/out/production/A079/server/maps/AbstractAnimatedMapleMapObject.class b/out/production/A079/server/maps/AbstractAnimatedMapleMapObject.class new file mode 100644 index 0000000..1b0c1e6 Binary files /dev/null and b/out/production/A079/server/maps/AbstractAnimatedMapleMapObject.class differ diff --git a/out/production/A079/server/maps/AbstractMapleMapObject.class b/out/production/A079/server/maps/AbstractMapleMapObject.class new file mode 100644 index 0000000..128bb56 Binary files /dev/null and b/out/production/A079/server/maps/AbstractMapleMapObject.class differ diff --git a/out/production/A079/server/maps/AnimatedMapleMapObject.class b/out/production/A079/server/maps/AnimatedMapleMapObject.class new file mode 100644 index 0000000..372e0b9 Binary files /dev/null and b/out/production/A079/server/maps/AnimatedMapleMapObject.class differ diff --git a/out/production/A079/server/maps/AramiaFireWorks$1.class b/out/production/A079/server/maps/AramiaFireWorks$1.class new file mode 100644 index 0000000..2689486 Binary files /dev/null and b/out/production/A079/server/maps/AramiaFireWorks$1.class differ diff --git a/out/production/A079/server/maps/AramiaFireWorks$2.class b/out/production/A079/server/maps/AramiaFireWorks$2.class new file mode 100644 index 0000000..7cee3e7 Binary files /dev/null and b/out/production/A079/server/maps/AramiaFireWorks$2.class differ diff --git a/out/production/A079/server/maps/AramiaFireWorks$3.class b/out/production/A079/server/maps/AramiaFireWorks$3.class new file mode 100644 index 0000000..47e549b Binary files /dev/null and b/out/production/A079/server/maps/AramiaFireWorks$3.class differ diff --git a/out/production/A079/server/maps/AramiaFireWorks$4.class b/out/production/A079/server/maps/AramiaFireWorks$4.class new file mode 100644 index 0000000..f1bdf05 Binary files /dev/null and b/out/production/A079/server/maps/AramiaFireWorks$4.class differ diff --git a/out/production/A079/server/maps/AramiaFireWorks$5.class b/out/production/A079/server/maps/AramiaFireWorks$5.class new file mode 100644 index 0000000..48f7224 Binary files /dev/null and b/out/production/A079/server/maps/AramiaFireWorks$5.class differ diff --git a/out/production/A079/server/maps/AramiaFireWorks$6.class b/out/production/A079/server/maps/AramiaFireWorks$6.class new file mode 100644 index 0000000..1d34c36 Binary files /dev/null and b/out/production/A079/server/maps/AramiaFireWorks$6.class differ diff --git a/out/production/A079/server/maps/AramiaFireWorks.class b/out/production/A079/server/maps/AramiaFireWorks.class new file mode 100644 index 0000000..c3ca7ba Binary files /dev/null and b/out/production/A079/server/maps/AramiaFireWorks.class differ diff --git a/out/production/A079/server/maps/Event_DojoAgent$1.class b/out/production/A079/server/maps/Event_DojoAgent$1.class new file mode 100644 index 0000000..bdfc869 Binary files /dev/null and b/out/production/A079/server/maps/Event_DojoAgent$1.class differ diff --git a/out/production/A079/server/maps/Event_DojoAgent.class b/out/production/A079/server/maps/Event_DojoAgent.class new file mode 100644 index 0000000..062b68b Binary files /dev/null and b/out/production/A079/server/maps/Event_DojoAgent.class differ diff --git a/out/production/A079/server/maps/Event_PyramidSubway$1.class b/out/production/A079/server/maps/Event_PyramidSubway$1.class new file mode 100644 index 0000000..8236146 Binary files /dev/null and b/out/production/A079/server/maps/Event_PyramidSubway$1.class differ diff --git a/out/production/A079/server/maps/Event_PyramidSubway$2.class b/out/production/A079/server/maps/Event_PyramidSubway$2.class new file mode 100644 index 0000000..f66f295 Binary files /dev/null and b/out/production/A079/server/maps/Event_PyramidSubway$2.class differ diff --git a/out/production/A079/server/maps/Event_PyramidSubway$3.class b/out/production/A079/server/maps/Event_PyramidSubway$3.class new file mode 100644 index 0000000..5cba68f Binary files /dev/null and b/out/production/A079/server/maps/Event_PyramidSubway$3.class differ diff --git a/out/production/A079/server/maps/Event_PyramidSubway.class b/out/production/A079/server/maps/Event_PyramidSubway.class new file mode 100644 index 0000000..72d1503 Binary files /dev/null and b/out/production/A079/server/maps/Event_PyramidSubway.class differ diff --git a/out/production/A079/server/maps/FieldLimitType.class b/out/production/A079/server/maps/FieldLimitType.class new file mode 100644 index 0000000..22a7d91 Binary files /dev/null and b/out/production/A079/server/maps/FieldLimitType.class differ diff --git a/out/production/A079/server/maps/MapScriptMethods$1.class b/out/production/A079/server/maps/MapScriptMethods$1.class new file mode 100644 index 0000000..2644c9e Binary files /dev/null and b/out/production/A079/server/maps/MapScriptMethods$1.class differ diff --git a/out/production/A079/server/maps/MapScriptMethods$onFirstUserEnter.class b/out/production/A079/server/maps/MapScriptMethods$onFirstUserEnter.class new file mode 100644 index 0000000..a99d29a Binary files /dev/null and b/out/production/A079/server/maps/MapScriptMethods$onFirstUserEnter.class differ diff --git a/out/production/A079/server/maps/MapScriptMethods$onUserEnter.class b/out/production/A079/server/maps/MapScriptMethods$onUserEnter.class new file mode 100644 index 0000000..be1cdcb Binary files /dev/null and b/out/production/A079/server/maps/MapScriptMethods$onUserEnter.class differ diff --git a/out/production/A079/server/maps/MapScriptMethods.class b/out/production/A079/server/maps/MapScriptMethods.class new file mode 100644 index 0000000..66dbfb5 Binary files /dev/null and b/out/production/A079/server/maps/MapScriptMethods.class differ diff --git a/out/production/A079/server/maps/MapleDoor$1.class b/out/production/A079/server/maps/MapleDoor$1.class new file mode 100644 index 0000000..3360877 Binary files /dev/null and b/out/production/A079/server/maps/MapleDoor$1.class differ diff --git a/out/production/A079/server/maps/MapleDoor.class b/out/production/A079/server/maps/MapleDoor.class new file mode 100644 index 0000000..56e6d0f Binary files /dev/null and b/out/production/A079/server/maps/MapleDoor.class differ diff --git a/out/production/A079/server/maps/MapleFoothold.class b/out/production/A079/server/maps/MapleFoothold.class new file mode 100644 index 0000000..e1ad09d Binary files /dev/null and b/out/production/A079/server/maps/MapleFoothold.class differ diff --git a/out/production/A079/server/maps/MapleFootholdTree.class b/out/production/A079/server/maps/MapleFootholdTree.class new file mode 100644 index 0000000..1693f32 Binary files /dev/null and b/out/production/A079/server/maps/MapleFootholdTree.class differ diff --git a/out/production/A079/server/maps/MapleGenericPortal.class b/out/production/A079/server/maps/MapleGenericPortal.class new file mode 100644 index 0000000..1f15c01 Binary files /dev/null and b/out/production/A079/server/maps/MapleGenericPortal.class differ diff --git a/out/production/A079/server/maps/MapleKite.class b/out/production/A079/server/maps/MapleKite.class new file mode 100644 index 0000000..51052b0 Binary files /dev/null and b/out/production/A079/server/maps/MapleKite.class differ diff --git a/out/production/A079/server/maps/MapleMap$1.class b/out/production/A079/server/maps/MapleMap$1.class new file mode 100644 index 0000000..88d75de Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$1.class differ diff --git a/out/production/A079/server/maps/MapleMap$10.class b/out/production/A079/server/maps/MapleMap$10.class new file mode 100644 index 0000000..5df5a8e Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$10.class differ diff --git a/out/production/A079/server/maps/MapleMap$11.class b/out/production/A079/server/maps/MapleMap$11.class new file mode 100644 index 0000000..4eaa7f4 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$11.class differ diff --git a/out/production/A079/server/maps/MapleMap$12.class b/out/production/A079/server/maps/MapleMap$12.class new file mode 100644 index 0000000..490963c Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$12.class differ diff --git a/out/production/A079/server/maps/MapleMap$13.class b/out/production/A079/server/maps/MapleMap$13.class new file mode 100644 index 0000000..9bc4cda Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$13.class differ diff --git a/out/production/A079/server/maps/MapleMap$14.class b/out/production/A079/server/maps/MapleMap$14.class new file mode 100644 index 0000000..cffcbe1 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$14.class differ diff --git a/out/production/A079/server/maps/MapleMap$15.class b/out/production/A079/server/maps/MapleMap$15.class new file mode 100644 index 0000000..8d93f88 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$15.class differ diff --git a/out/production/A079/server/maps/MapleMap$16.class b/out/production/A079/server/maps/MapleMap$16.class new file mode 100644 index 0000000..221f249 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$16.class differ diff --git a/out/production/A079/server/maps/MapleMap$17.class b/out/production/A079/server/maps/MapleMap$17.class new file mode 100644 index 0000000..0d7c93b Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$17.class differ diff --git a/out/production/A079/server/maps/MapleMap$18.class b/out/production/A079/server/maps/MapleMap$18.class new file mode 100644 index 0000000..5245e45 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$18.class differ diff --git a/out/production/A079/server/maps/MapleMap$19.class b/out/production/A079/server/maps/MapleMap$19.class new file mode 100644 index 0000000..8cf60dc Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$19.class differ diff --git a/out/production/A079/server/maps/MapleMap$2.class b/out/production/A079/server/maps/MapleMap$2.class new file mode 100644 index 0000000..f937e34 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$2.class differ diff --git a/out/production/A079/server/maps/MapleMap$20.class b/out/production/A079/server/maps/MapleMap$20.class new file mode 100644 index 0000000..871d639 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$20.class differ diff --git a/out/production/A079/server/maps/MapleMap$21.class b/out/production/A079/server/maps/MapleMap$21.class new file mode 100644 index 0000000..2ddf50e Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$21.class differ diff --git a/out/production/A079/server/maps/MapleMap$22.class b/out/production/A079/server/maps/MapleMap$22.class new file mode 100644 index 0000000..5b91f50 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$22.class differ diff --git a/out/production/A079/server/maps/MapleMap$23.class b/out/production/A079/server/maps/MapleMap$23.class new file mode 100644 index 0000000..71fd1ec Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$23.class differ diff --git a/out/production/A079/server/maps/MapleMap$24.class b/out/production/A079/server/maps/MapleMap$24.class new file mode 100644 index 0000000..b6828c9 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$24.class differ diff --git a/out/production/A079/server/maps/MapleMap$25.class b/out/production/A079/server/maps/MapleMap$25.class new file mode 100644 index 0000000..99dd7a6 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$25.class differ diff --git a/out/production/A079/server/maps/MapleMap$26.class b/out/production/A079/server/maps/MapleMap$26.class new file mode 100644 index 0000000..7bcff2c Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$26.class differ diff --git a/out/production/A079/server/maps/MapleMap$27.class b/out/production/A079/server/maps/MapleMap$27.class new file mode 100644 index 0000000..0a89422 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$27.class differ diff --git a/out/production/A079/server/maps/MapleMap$3.class b/out/production/A079/server/maps/MapleMap$3.class new file mode 100644 index 0000000..ac0bcaf Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$3.class differ diff --git a/out/production/A079/server/maps/MapleMap$4.class b/out/production/A079/server/maps/MapleMap$4.class new file mode 100644 index 0000000..059fe7d Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$4.class differ diff --git a/out/production/A079/server/maps/MapleMap$5.class b/out/production/A079/server/maps/MapleMap$5.class new file mode 100644 index 0000000..4c329c9 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$5.class differ diff --git a/out/production/A079/server/maps/MapleMap$6.class b/out/production/A079/server/maps/MapleMap$6.class new file mode 100644 index 0000000..5ec754d Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$6.class differ diff --git a/out/production/A079/server/maps/MapleMap$7.class b/out/production/A079/server/maps/MapleMap$7.class new file mode 100644 index 0000000..8ba7023 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$7.class differ diff --git a/out/production/A079/server/maps/MapleMap$8.class b/out/production/A079/server/maps/MapleMap$8.class new file mode 100644 index 0000000..227e212 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$8.class differ diff --git a/out/production/A079/server/maps/MapleMap$9.class b/out/production/A079/server/maps/MapleMap$9.class new file mode 100644 index 0000000..ad30444 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$9.class differ diff --git a/out/production/A079/server/maps/MapleMap$ActivateItemReactor$1.class b/out/production/A079/server/maps/MapleMap$ActivateItemReactor$1.class new file mode 100644 index 0000000..212e3ab Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$ActivateItemReactor$1.class differ diff --git a/out/production/A079/server/maps/MapleMap$ActivateItemReactor.class b/out/production/A079/server/maps/MapleMap$ActivateItemReactor.class new file mode 100644 index 0000000..74ad328 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$ActivateItemReactor.class differ diff --git a/out/production/A079/server/maps/MapleMap$DelayedPacketCreation.class b/out/production/A079/server/maps/MapleMap$DelayedPacketCreation.class new file mode 100644 index 0000000..f903440 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$DelayedPacketCreation.class differ diff --git a/out/production/A079/server/maps/MapleMap$SpawnCondition.class b/out/production/A079/server/maps/MapleMap$SpawnCondition.class new file mode 100644 index 0000000..f66eca9 Binary files /dev/null and b/out/production/A079/server/maps/MapleMap$SpawnCondition.class differ diff --git a/out/production/A079/server/maps/MapleMap.class b/out/production/A079/server/maps/MapleMap.class new file mode 100644 index 0000000..1b8f85a Binary files /dev/null and b/out/production/A079/server/maps/MapleMap.class differ diff --git a/out/production/A079/server/maps/MapleMapEffect.class b/out/production/A079/server/maps/MapleMapEffect.class new file mode 100644 index 0000000..d45313b Binary files /dev/null and b/out/production/A079/server/maps/MapleMapEffect.class differ diff --git a/out/production/A079/server/maps/MapleMapFactory.class b/out/production/A079/server/maps/MapleMapFactory.class new file mode 100644 index 0000000..a991c13 Binary files /dev/null and b/out/production/A079/server/maps/MapleMapFactory.class differ diff --git a/out/production/A079/server/maps/MapleMapItem.class b/out/production/A079/server/maps/MapleMapItem.class new file mode 100644 index 0000000..8b1c611 Binary files /dev/null and b/out/production/A079/server/maps/MapleMapItem.class differ diff --git a/out/production/A079/server/maps/MapleMapObject.class b/out/production/A079/server/maps/MapleMapObject.class new file mode 100644 index 0000000..28124a1 Binary files /dev/null and b/out/production/A079/server/maps/MapleMapObject.class differ diff --git a/out/production/A079/server/maps/MapleMapObjectType.class b/out/production/A079/server/maps/MapleMapObjectType.class new file mode 100644 index 0000000..487555c Binary files /dev/null and b/out/production/A079/server/maps/MapleMapObjectType.class differ diff --git a/out/production/A079/server/maps/MapleMapPortal.class b/out/production/A079/server/maps/MapleMapPortal.class new file mode 100644 index 0000000..eb4d085 Binary files /dev/null and b/out/production/A079/server/maps/MapleMapPortal.class differ diff --git a/out/production/A079/server/maps/MapleMist.class b/out/production/A079/server/maps/MapleMist.class new file mode 100644 index 0000000..9e68689 Binary files /dev/null and b/out/production/A079/server/maps/MapleMist.class differ diff --git a/out/production/A079/server/maps/MapleNodes$MapleNodeInfo.class b/out/production/A079/server/maps/MapleNodes$MapleNodeInfo.class new file mode 100644 index 0000000..5ddae40 Binary files /dev/null and b/out/production/A079/server/maps/MapleNodes$MapleNodeInfo.class differ diff --git a/out/production/A079/server/maps/MapleNodes$MaplePlatform.class b/out/production/A079/server/maps/MapleNodes$MaplePlatform.class new file mode 100644 index 0000000..0331353 Binary files /dev/null and b/out/production/A079/server/maps/MapleNodes$MaplePlatform.class differ diff --git a/out/production/A079/server/maps/MapleNodes$MonsterPoint.class b/out/production/A079/server/maps/MapleNodes$MonsterPoint.class new file mode 100644 index 0000000..3d9046f Binary files /dev/null and b/out/production/A079/server/maps/MapleNodes$MonsterPoint.class differ diff --git a/out/production/A079/server/maps/MapleNodes.class b/out/production/A079/server/maps/MapleNodes.class new file mode 100644 index 0000000..f030c16 Binary files /dev/null and b/out/production/A079/server/maps/MapleNodes.class differ diff --git a/out/production/A079/server/maps/MaplePvp.class b/out/production/A079/server/maps/MaplePvp.class new file mode 100644 index 0000000..ec788b9 Binary files /dev/null and b/out/production/A079/server/maps/MaplePvp.class differ diff --git a/out/production/A079/server/maps/MapleReactor$1.class b/out/production/A079/server/maps/MapleReactor$1.class new file mode 100644 index 0000000..4aaa9b7 Binary files /dev/null and b/out/production/A079/server/maps/MapleReactor$1.class differ diff --git a/out/production/A079/server/maps/MapleReactor$2.class b/out/production/A079/server/maps/MapleReactor$2.class new file mode 100644 index 0000000..f1ce16d Binary files /dev/null and b/out/production/A079/server/maps/MapleReactor$2.class differ diff --git a/out/production/A079/server/maps/MapleReactor$3.class b/out/production/A079/server/maps/MapleReactor$3.class new file mode 100644 index 0000000..f5149f5 Binary files /dev/null and b/out/production/A079/server/maps/MapleReactor$3.class differ diff --git a/out/production/A079/server/maps/MapleReactor.class b/out/production/A079/server/maps/MapleReactor.class new file mode 100644 index 0000000..b14b6c5 Binary files /dev/null and b/out/production/A079/server/maps/MapleReactor.class differ diff --git a/out/production/A079/server/maps/MapleReactorFactory.class b/out/production/A079/server/maps/MapleReactorFactory.class new file mode 100644 index 0000000..24ae0ba Binary files /dev/null and b/out/production/A079/server/maps/MapleReactorFactory.class differ diff --git a/out/production/A079/server/maps/MapleReactorStats$1.class b/out/production/A079/server/maps/MapleReactorStats$1.class new file mode 100644 index 0000000..80f7aee Binary files /dev/null and b/out/production/A079/server/maps/MapleReactorStats$1.class differ diff --git a/out/production/A079/server/maps/MapleReactorStats$StateData.class b/out/production/A079/server/maps/MapleReactorStats$StateData.class new file mode 100644 index 0000000..4fa3cad Binary files /dev/null and b/out/production/A079/server/maps/MapleReactorStats$StateData.class differ diff --git a/out/production/A079/server/maps/MapleReactorStats.class b/out/production/A079/server/maps/MapleReactorStats.class new file mode 100644 index 0000000..8ab3811 Binary files /dev/null and b/out/production/A079/server/maps/MapleReactorStats.class differ diff --git a/out/production/A079/server/maps/MapleSummon.class b/out/production/A079/server/maps/MapleSummon.class new file mode 100644 index 0000000..3f11a35 Binary files /dev/null and b/out/production/A079/server/maps/MapleSummon.class differ diff --git a/out/production/A079/server/maps/ReactorDropEntry.class b/out/production/A079/server/maps/ReactorDropEntry.class new file mode 100644 index 0000000..c4db44b Binary files /dev/null and b/out/production/A079/server/maps/ReactorDropEntry.class differ diff --git a/out/production/A079/server/maps/SavedLocationType.class b/out/production/A079/server/maps/SavedLocationType.class new file mode 100644 index 0000000..bcf8ca9 Binary files /dev/null and b/out/production/A079/server/maps/SavedLocationType.class differ diff --git a/out/production/A079/server/maps/SpeedRunType.class b/out/production/A079/server/maps/SpeedRunType.class new file mode 100644 index 0000000..23fe812 Binary files /dev/null and b/out/production/A079/server/maps/SpeedRunType.class differ diff --git a/out/production/A079/server/maps/SummonMovementType.class b/out/production/A079/server/maps/SummonMovementType.class new file mode 100644 index 0000000..fe2cb45 Binary files /dev/null and b/out/production/A079/server/maps/SummonMovementType.class differ diff --git a/out/production/A079/server/movement/AbstractLifeMovement.class b/out/production/A079/server/movement/AbstractLifeMovement.class new file mode 100644 index 0000000..90bc0c5 Binary files /dev/null and b/out/production/A079/server/movement/AbstractLifeMovement.class differ diff --git a/out/production/A079/server/movement/LifeMovement.class b/out/production/A079/server/movement/LifeMovement.class new file mode 100644 index 0000000..f308414 Binary files /dev/null and b/out/production/A079/server/movement/LifeMovement.class differ diff --git a/out/production/A079/server/movement/LifeMovementFragment.class b/out/production/A079/server/movement/LifeMovementFragment.class new file mode 100644 index 0000000..e0d2147 Binary files /dev/null and b/out/production/A079/server/movement/LifeMovementFragment.class differ diff --git a/out/production/A079/server/movement/StaticLifeMovement.class b/out/production/A079/server/movement/StaticLifeMovement.class new file mode 100644 index 0000000..9cfe639 Binary files /dev/null and b/out/production/A079/server/movement/StaticLifeMovement.class differ diff --git a/out/production/A079/server/player.class b/out/production/A079/server/player.class new file mode 100644 index 0000000..8a049a2 Binary files /dev/null and b/out/production/A079/server/player.class differ diff --git a/out/production/A079/server/quest/MapleQuest$MedalQuest.class b/out/production/A079/server/quest/MapleQuest$MedalQuest.class new file mode 100644 index 0000000..ed6abaa Binary files /dev/null and b/out/production/A079/server/quest/MapleQuest$MedalQuest.class differ diff --git a/out/production/A079/server/quest/MapleQuest.class b/out/production/A079/server/quest/MapleQuest.class new file mode 100644 index 0000000..2793de8 Binary files /dev/null and b/out/production/A079/server/quest/MapleQuest.class differ diff --git a/out/production/A079/server/quest/MapleQuestAction$1.class b/out/production/A079/server/quest/MapleQuestAction$1.class new file mode 100644 index 0000000..78786a4 Binary files /dev/null and b/out/production/A079/server/quest/MapleQuestAction$1.class differ diff --git a/out/production/A079/server/quest/MapleQuestAction$QuestItem.class b/out/production/A079/server/quest/MapleQuestAction$QuestItem.class new file mode 100644 index 0000000..0babd17 Binary files /dev/null and b/out/production/A079/server/quest/MapleQuestAction$QuestItem.class differ diff --git a/out/production/A079/server/quest/MapleQuestAction.class b/out/production/A079/server/quest/MapleQuestAction.class new file mode 100644 index 0000000..210975a Binary files /dev/null and b/out/production/A079/server/quest/MapleQuestAction.class differ diff --git a/out/production/A079/server/quest/MapleQuestActionType.class b/out/production/A079/server/quest/MapleQuestActionType.class new file mode 100644 index 0000000..c36b1bf Binary files /dev/null and b/out/production/A079/server/quest/MapleQuestActionType.class differ diff --git a/out/production/A079/server/quest/MapleQuestRequirement$1.class b/out/production/A079/server/quest/MapleQuestRequirement$1.class new file mode 100644 index 0000000..1a11c47 Binary files /dev/null and b/out/production/A079/server/quest/MapleQuestRequirement$1.class differ diff --git a/out/production/A079/server/quest/MapleQuestRequirement.class b/out/production/A079/server/quest/MapleQuestRequirement.class new file mode 100644 index 0000000..48954ac Binary files /dev/null and b/out/production/A079/server/quest/MapleQuestRequirement.class differ diff --git a/out/production/A079/server/quest/MapleQuestRequirementType.class b/out/production/A079/server/quest/MapleQuestRequirementType.class new file mode 100644 index 0000000..71f7f05 Binary files /dev/null and b/out/production/A079/server/quest/MapleQuestRequirementType.class differ diff --git a/out/production/A079/server/shops/AbstractPlayerStore$BoughtItem.class b/out/production/A079/server/shops/AbstractPlayerStore$BoughtItem.class new file mode 100644 index 0000000..3ad17a1 Binary files /dev/null and b/out/production/A079/server/shops/AbstractPlayerStore$BoughtItem.class differ diff --git a/out/production/A079/server/shops/AbstractPlayerStore.class b/out/production/A079/server/shops/AbstractPlayerStore.class new file mode 100644 index 0000000..bc01949 Binary files /dev/null and b/out/production/A079/server/shops/AbstractPlayerStore.class differ diff --git a/out/production/A079/server/shops/HiredMerchant$1.class b/out/production/A079/server/shops/HiredMerchant$1.class new file mode 100644 index 0000000..6fd24f9 Binary files /dev/null and b/out/production/A079/server/shops/HiredMerchant$1.class differ diff --git a/out/production/A079/server/shops/HiredMerchant.class b/out/production/A079/server/shops/HiredMerchant.class new file mode 100644 index 0000000..f063049 Binary files /dev/null and b/out/production/A079/server/shops/HiredMerchant.class differ diff --git a/out/production/A079/server/shops/HiredMerchantSave$1.class b/out/production/A079/server/shops/HiredMerchantSave$1.class new file mode 100644 index 0000000..78e3e26 Binary files /dev/null and b/out/production/A079/server/shops/HiredMerchantSave$1.class differ diff --git a/out/production/A079/server/shops/HiredMerchantSave$HiredMerchantSaveRunnable.class b/out/production/A079/server/shops/HiredMerchantSave$HiredMerchantSaveRunnable.class new file mode 100644 index 0000000..c84b135 Binary files /dev/null and b/out/production/A079/server/shops/HiredMerchantSave$HiredMerchantSaveRunnable.class differ diff --git a/out/production/A079/server/shops/HiredMerchantSave$TimingThread.class b/out/production/A079/server/shops/HiredMerchantSave$TimingThread.class new file mode 100644 index 0000000..61c23f7 Binary files /dev/null and b/out/production/A079/server/shops/HiredMerchantSave$TimingThread.class differ diff --git a/out/production/A079/server/shops/HiredMerchantSave.class b/out/production/A079/server/shops/HiredMerchantSave.class new file mode 100644 index 0000000..2e1f645 Binary files /dev/null and b/out/production/A079/server/shops/HiredMerchantSave.class differ diff --git a/out/production/A079/server/shops/IMaplePlayerShop.class b/out/production/A079/server/shops/IMaplePlayerShop.class new file mode 100644 index 0000000..c307e38 Binary files /dev/null and b/out/production/A079/server/shops/IMaplePlayerShop.class differ diff --git a/out/production/A079/server/shops/MapleMiniGame.class b/out/production/A079/server/shops/MapleMiniGame.class new file mode 100644 index 0000000..47008fa Binary files /dev/null and b/out/production/A079/server/shops/MapleMiniGame.class differ diff --git a/out/production/A079/server/shops/MaplePlayerShop.class b/out/production/A079/server/shops/MaplePlayerShop.class new file mode 100644 index 0000000..01f820a Binary files /dev/null and b/out/production/A079/server/shops/MaplePlayerShop.class differ diff --git a/out/production/A079/server/shops/MaplePlayerShopItem.class b/out/production/A079/server/shops/MaplePlayerShopItem.class new file mode 100644 index 0000000..6a69a86 Binary files /dev/null and b/out/production/A079/server/shops/MaplePlayerShopItem.class differ diff --git a/out/production/A079/tools/ArrayMap$1.class b/out/production/A079/tools/ArrayMap$1.class new file mode 100644 index 0000000..f591dfe Binary files /dev/null and b/out/production/A079/tools/ArrayMap$1.class differ diff --git a/out/production/A079/tools/ArrayMap$Entry.class b/out/production/A079/tools/ArrayMap$Entry.class new file mode 100644 index 0000000..3ce1303 Binary files /dev/null and b/out/production/A079/tools/ArrayMap$Entry.class differ diff --git a/out/production/A079/tools/ArrayMap.class b/out/production/A079/tools/ArrayMap.class new file mode 100644 index 0000000..f841d1b Binary files /dev/null and b/out/production/A079/tools/ArrayMap.class differ diff --git a/out/production/A079/tools/AttackPair.class b/out/production/A079/tools/AttackPair.class new file mode 100644 index 0000000..4842d7d Binary files /dev/null and b/out/production/A079/tools/AttackPair.class differ diff --git a/out/production/A079/tools/BitTools.class b/out/production/A079/tools/BitTools.class new file mode 100644 index 0000000..dc41a15 Binary files /dev/null and b/out/production/A079/tools/BitTools.class differ diff --git a/out/production/A079/tools/BytesEncodingDetect.class b/out/production/A079/tools/BytesEncodingDetect.class new file mode 100644 index 0000000..a9c964a Binary files /dev/null and b/out/production/A079/tools/BytesEncodingDetect.class differ diff --git a/out/production/A079/tools/CPUSampler$1.class b/out/production/A079/tools/CPUSampler$1.class new file mode 100644 index 0000000..5eb4816 Binary files /dev/null and b/out/production/A079/tools/CPUSampler$1.class differ diff --git a/out/production/A079/tools/CPUSampler$SampledStacktraces.class b/out/production/A079/tools/CPUSampler$SampledStacktraces.class new file mode 100644 index 0000000..4e3b8fe Binary files /dev/null and b/out/production/A079/tools/CPUSampler$SampledStacktraces.class differ diff --git a/out/production/A079/tools/CPUSampler$SamplerThread.class b/out/production/A079/tools/CPUSampler$SamplerThread.class new file mode 100644 index 0000000..537d79c Binary files /dev/null and b/out/production/A079/tools/CPUSampler$SamplerThread.class differ diff --git a/out/production/A079/tools/CPUSampler$StackTrace.class b/out/production/A079/tools/CPUSampler$StackTrace.class new file mode 100644 index 0000000..db8c3e9 Binary files /dev/null and b/out/production/A079/tools/CPUSampler$StackTrace.class differ diff --git a/out/production/A079/tools/CPUSampler$StacktraceWithCount.class b/out/production/A079/tools/CPUSampler$StacktraceWithCount.class new file mode 100644 index 0000000..27cf700 Binary files /dev/null and b/out/production/A079/tools/CPUSampler$StacktraceWithCount.class differ diff --git a/out/production/A079/tools/CPUSampler.class b/out/production/A079/tools/CPUSampler.class new file mode 100644 index 0000000..245f02a Binary files /dev/null and b/out/production/A079/tools/CPUSampler.class differ diff --git a/out/production/A079/tools/CollectionUtil.class b/out/production/A079/tools/CollectionUtil.class new file mode 100644 index 0000000..f6acc98 Binary files /dev/null and b/out/production/A079/tools/CollectionUtil.class differ diff --git a/out/production/A079/tools/ConcurrentEnumMap.class b/out/production/A079/tools/ConcurrentEnumMap.class new file mode 100644 index 0000000..05e8e6a Binary files /dev/null and b/out/production/A079/tools/ConcurrentEnumMap.class differ diff --git a/out/production/A079/tools/Encoding.class b/out/production/A079/tools/Encoding.class new file mode 100644 index 0000000..02f6f8c Binary files /dev/null and b/out/production/A079/tools/Encoding.class differ diff --git a/out/production/A079/tools/EncodingDetect.class b/out/production/A079/tools/EncodingDetect.class new file mode 100644 index 0000000..23be384 Binary files /dev/null and b/out/production/A079/tools/EncodingDetect.class differ diff --git a/out/production/A079/tools/Eval$1.class b/out/production/A079/tools/Eval$1.class new file mode 100644 index 0000000..a06d0d6 Binary files /dev/null and b/out/production/A079/tools/Eval$1.class differ diff --git a/out/production/A079/tools/Eval$Compiler.class b/out/production/A079/tools/Eval$Compiler.class new file mode 100644 index 0000000..da43c86 Binary files /dev/null and b/out/production/A079/tools/Eval$Compiler.class differ diff --git a/out/production/A079/tools/Eval$Operation.class b/out/production/A079/tools/Eval$Operation.class new file mode 100644 index 0000000..2d09af4 Binary files /dev/null and b/out/production/A079/tools/Eval$Operation.class differ diff --git a/out/production/A079/tools/Eval$Operator$1.class b/out/production/A079/tools/Eval$Operator$1.class new file mode 100644 index 0000000..e190767 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$1.class differ diff --git a/out/production/A079/tools/Eval$Operator$10.class b/out/production/A079/tools/Eval$Operator$10.class new file mode 100644 index 0000000..d02d8da Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$10.class differ diff --git a/out/production/A079/tools/Eval$Operator$11.class b/out/production/A079/tools/Eval$Operator$11.class new file mode 100644 index 0000000..b2f0bc4 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$11.class differ diff --git a/out/production/A079/tools/Eval$Operator$12.class b/out/production/A079/tools/Eval$Operator$12.class new file mode 100644 index 0000000..ae8f200 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$12.class differ diff --git a/out/production/A079/tools/Eval$Operator$13.class b/out/production/A079/tools/Eval$Operator$13.class new file mode 100644 index 0000000..9d825e7 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$13.class differ diff --git a/out/production/A079/tools/Eval$Operator$14.class b/out/production/A079/tools/Eval$Operator$14.class new file mode 100644 index 0000000..dd48e39 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$14.class differ diff --git a/out/production/A079/tools/Eval$Operator$15.class b/out/production/A079/tools/Eval$Operator$15.class new file mode 100644 index 0000000..bed3326 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$15.class differ diff --git a/out/production/A079/tools/Eval$Operator$16.class b/out/production/A079/tools/Eval$Operator$16.class new file mode 100644 index 0000000..585e805 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$16.class differ diff --git a/out/production/A079/tools/Eval$Operator$17.class b/out/production/A079/tools/Eval$Operator$17.class new file mode 100644 index 0000000..2c04105 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$17.class differ diff --git a/out/production/A079/tools/Eval$Operator$18.class b/out/production/A079/tools/Eval$Operator$18.class new file mode 100644 index 0000000..4d2b078 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$18.class differ diff --git a/out/production/A079/tools/Eval$Operator$19.class b/out/production/A079/tools/Eval$Operator$19.class new file mode 100644 index 0000000..a288d52 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$19.class differ diff --git a/out/production/A079/tools/Eval$Operator$2.class b/out/production/A079/tools/Eval$Operator$2.class new file mode 100644 index 0000000..805801c Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$2.class differ diff --git a/out/production/A079/tools/Eval$Operator$20.class b/out/production/A079/tools/Eval$Operator$20.class new file mode 100644 index 0000000..497879e Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$20.class differ diff --git a/out/production/A079/tools/Eval$Operator$21.class b/out/production/A079/tools/Eval$Operator$21.class new file mode 100644 index 0000000..d54a976 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$21.class differ diff --git a/out/production/A079/tools/Eval$Operator$22.class b/out/production/A079/tools/Eval$Operator$22.class new file mode 100644 index 0000000..9d0fd36 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$22.class differ diff --git a/out/production/A079/tools/Eval$Operator$23.class b/out/production/A079/tools/Eval$Operator$23.class new file mode 100644 index 0000000..a87f1db Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$23.class differ diff --git a/out/production/A079/tools/Eval$Operator$3.class b/out/production/A079/tools/Eval$Operator$3.class new file mode 100644 index 0000000..0642830 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$3.class differ diff --git a/out/production/A079/tools/Eval$Operator$4.class b/out/production/A079/tools/Eval$Operator$4.class new file mode 100644 index 0000000..7be49c9 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$4.class differ diff --git a/out/production/A079/tools/Eval$Operator$5.class b/out/production/A079/tools/Eval$Operator$5.class new file mode 100644 index 0000000..e998437 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$5.class differ diff --git a/out/production/A079/tools/Eval$Operator$6.class b/out/production/A079/tools/Eval$Operator$6.class new file mode 100644 index 0000000..276c2a3 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$6.class differ diff --git a/out/production/A079/tools/Eval$Operator$7.class b/out/production/A079/tools/Eval$Operator$7.class new file mode 100644 index 0000000..d725ee2 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$7.class differ diff --git a/out/production/A079/tools/Eval$Operator$8.class b/out/production/A079/tools/Eval$Operator$8.class new file mode 100644 index 0000000..8d9231a Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$8.class differ diff --git a/out/production/A079/tools/Eval$Operator$9.class b/out/production/A079/tools/Eval$Operator$9.class new file mode 100644 index 0000000..c020be9 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator$9.class differ diff --git a/out/production/A079/tools/Eval$Operator.class b/out/production/A079/tools/Eval$Operator.class new file mode 100644 index 0000000..24f83d2 Binary files /dev/null and b/out/production/A079/tools/Eval$Operator.class differ diff --git a/out/production/A079/tools/Eval$Tokeniser.class b/out/production/A079/tools/Eval$Tokeniser.class new file mode 100644 index 0000000..9b3edca Binary files /dev/null and b/out/production/A079/tools/Eval$Tokeniser.class differ diff --git a/out/production/A079/tools/Eval$Type.class b/out/production/A079/tools/Eval$Type.class new file mode 100644 index 0000000..f25ac4f Binary files /dev/null and b/out/production/A079/tools/Eval$Type.class differ diff --git a/out/production/A079/tools/Eval.class b/out/production/A079/tools/Eval.class new file mode 100644 index 0000000..ec6cf71 Binary files /dev/null and b/out/production/A079/tools/Eval.class differ diff --git a/out/production/A079/tools/FilePrinter.class b/out/production/A079/tools/FilePrinter.class new file mode 100644 index 0000000..aa1c761 Binary files /dev/null and b/out/production/A079/tools/FilePrinter.class differ diff --git a/out/production/A079/tools/FileoutputUtil.class b/out/production/A079/tools/FileoutputUtil.class new file mode 100644 index 0000000..126203b Binary files /dev/null and b/out/production/A079/tools/FileoutputUtil.class differ diff --git a/out/production/A079/tools/FixDropNullItem.class b/out/production/A079/tools/FixDropNullItem.class new file mode 100644 index 0000000..117d821 Binary files /dev/null and b/out/production/A079/tools/FixDropNullItem.class differ diff --git a/out/production/A079/tools/FixShopItemsPrice.class b/out/production/A079/tools/FixShopItemsPrice.class new file mode 100644 index 0000000..a27e7bb Binary files /dev/null and b/out/production/A079/tools/FixShopItemsPrice.class differ diff --git a/out/production/A079/tools/HexTool.class b/out/production/A079/tools/HexTool.class new file mode 100644 index 0000000..6fc27b0 Binary files /dev/null and b/out/production/A079/tools/HexTool.class differ diff --git a/out/production/A079/tools/IPAddressTool.class b/out/production/A079/tools/IPAddressTool.class new file mode 100644 index 0000000..c49b1a4 Binary files /dev/null and b/out/production/A079/tools/IPAddressTool.class differ diff --git a/out/production/A079/tools/KoreanDateUtil.class b/out/production/A079/tools/KoreanDateUtil.class new file mode 100644 index 0000000..9011ccd Binary files /dev/null and b/out/production/A079/tools/KoreanDateUtil.class differ diff --git a/out/production/A079/tools/LoadPacket.class b/out/production/A079/tools/LoadPacket.class new file mode 100644 index 0000000..73f0b75 Binary files /dev/null and b/out/production/A079/tools/LoadPacket.class differ diff --git a/out/production/A079/tools/LongValueHolder.class b/out/production/A079/tools/LongValueHolder.class new file mode 100644 index 0000000..6ee0ca1 Binary files /dev/null and b/out/production/A079/tools/LongValueHolder.class differ diff --git a/out/production/A079/tools/MacAddressTool.class b/out/production/A079/tools/MacAddressTool.class new file mode 100644 index 0000000..3500891 Binary files /dev/null and b/out/production/A079/tools/MacAddressTool.class differ diff --git a/out/production/A079/tools/MapleAESOFB.class b/out/production/A079/tools/MapleAESOFB.class new file mode 100644 index 0000000..182567b Binary files /dev/null and b/out/production/A079/tools/MapleAESOFB.class differ diff --git a/out/production/A079/tools/MapleCustomEncryption.class b/out/production/A079/tools/MapleCustomEncryption.class new file mode 100644 index 0000000..9350be5 Binary files /dev/null and b/out/production/A079/tools/MapleCustomEncryption.class differ diff --git a/out/production/A079/tools/MaplePacketCreator$1.class b/out/production/A079/tools/MaplePacketCreator$1.class new file mode 100644 index 0000000..0a190fc Binary files /dev/null and b/out/production/A079/tools/MaplePacketCreator$1.class differ diff --git a/out/production/A079/tools/MaplePacketCreator$2.class b/out/production/A079/tools/MaplePacketCreator$2.class new file mode 100644 index 0000000..3215506 Binary files /dev/null and b/out/production/A079/tools/MaplePacketCreator$2.class differ diff --git a/out/production/A079/tools/MaplePacketCreator.class b/out/production/A079/tools/MaplePacketCreator.class new file mode 100644 index 0000000..9199931 Binary files /dev/null and b/out/production/A079/tools/MaplePacketCreator.class differ diff --git a/out/production/A079/tools/MockIOSession.class b/out/production/A079/tools/MockIOSession.class new file mode 100644 index 0000000..f925115 Binary files /dev/null and b/out/production/A079/tools/MockIOSession.class differ diff --git a/out/production/A079/tools/Pair.class b/out/production/A079/tools/Pair.class new file mode 100644 index 0000000..37793fd Binary files /dev/null and b/out/production/A079/tools/Pair.class differ diff --git a/out/production/A079/tools/Quadra.class b/out/production/A079/tools/Quadra.class new file mode 100644 index 0000000..1709d8d Binary files /dev/null and b/out/production/A079/tools/Quadra.class differ diff --git a/out/production/A079/tools/SearchGenerator$1.class b/out/production/A079/tools/SearchGenerator$1.class new file mode 100644 index 0000000..30579d9 Binary files /dev/null and b/out/production/A079/tools/SearchGenerator$1.class differ diff --git a/out/production/A079/tools/SearchGenerator$SearchType.class b/out/production/A079/tools/SearchGenerator$SearchType.class new file mode 100644 index 0000000..9671b7e Binary files /dev/null and b/out/production/A079/tools/SearchGenerator$SearchType.class differ diff --git a/out/production/A079/tools/SearchGenerator.class b/out/production/A079/tools/SearchGenerator.class new file mode 100644 index 0000000..7d9f088 Binary files /dev/null and b/out/production/A079/tools/SearchGenerator.class differ diff --git a/out/production/A079/tools/StringUtil.class b/out/production/A079/tools/StringUtil.class new file mode 100644 index 0000000..63e1c99 Binary files /dev/null and b/out/production/A079/tools/StringUtil.class differ diff --git a/out/production/A079/tools/Triple.class b/out/production/A079/tools/Triple.class new file mode 100644 index 0000000..6a9a2d0 Binary files /dev/null and b/out/production/A079/tools/Triple.class differ diff --git a/out/production/A079/tools/ValidateCode.class b/out/production/A079/tools/ValidateCode.class new file mode 100644 index 0000000..7d8292a Binary files /dev/null and b/out/production/A079/tools/ValidateCode.class differ diff --git a/out/production/A079/tools/data/ByteArrayByteStream.class b/out/production/A079/tools/data/ByteArrayByteStream.class new file mode 100644 index 0000000..0fdd603 Binary files /dev/null and b/out/production/A079/tools/data/ByteArrayByteStream.class differ diff --git a/out/production/A079/tools/data/InputStreamByteStream.class b/out/production/A079/tools/data/InputStreamByteStream.class new file mode 100644 index 0000000..eadbd6e Binary files /dev/null and b/out/production/A079/tools/data/InputStreamByteStream.class differ diff --git a/out/production/A079/tools/data/LittleEndianAccessor.class b/out/production/A079/tools/data/LittleEndianAccessor.class new file mode 100644 index 0000000..6536523 Binary files /dev/null and b/out/production/A079/tools/data/LittleEndianAccessor.class differ diff --git a/out/production/A079/tools/data/MaplePacketLittleEndianWriter.class b/out/production/A079/tools/data/MaplePacketLittleEndianWriter.class new file mode 100644 index 0000000..6678913 Binary files /dev/null and b/out/production/A079/tools/data/MaplePacketLittleEndianWriter.class differ diff --git a/out/production/A079/tools/data/RandomAccessByteStream.class b/out/production/A079/tools/data/RandomAccessByteStream.class new file mode 100644 index 0000000..2ba505f Binary files /dev/null and b/out/production/A079/tools/data/RandomAccessByteStream.class differ diff --git a/out/production/A079/tools/packet/FamilyPacket.class b/out/production/A079/tools/packet/FamilyPacket.class new file mode 100644 index 0000000..06b7ebd Binary files /dev/null and b/out/production/A079/tools/packet/FamilyPacket.class differ diff --git a/out/production/A079/tools/packet/LoginPacket.class b/out/production/A079/tools/packet/LoginPacket.class new file mode 100644 index 0000000..d86c840 Binary files /dev/null and b/out/production/A079/tools/packet/LoginPacket.class differ diff --git a/out/production/A079/tools/packet/MTSCSPacket.class b/out/production/A079/tools/packet/MTSCSPacket.class new file mode 100644 index 0000000..66c263f Binary files /dev/null and b/out/production/A079/tools/packet/MTSCSPacket.class differ diff --git a/out/production/A079/tools/packet/MobPacket$1.class b/out/production/A079/tools/packet/MobPacket$1.class new file mode 100644 index 0000000..0f393ff Binary files /dev/null and b/out/production/A079/tools/packet/MobPacket$1.class differ diff --git a/out/production/A079/tools/packet/MobPacket.class b/out/production/A079/tools/packet/MobPacket.class new file mode 100644 index 0000000..442c4cb Binary files /dev/null and b/out/production/A079/tools/packet/MobPacket.class differ diff --git a/out/production/A079/tools/packet/MonsterBookPacket.class b/out/production/A079/tools/packet/MonsterBookPacket.class new file mode 100644 index 0000000..c806ecd Binary files /dev/null and b/out/production/A079/tools/packet/MonsterBookPacket.class differ diff --git a/out/production/A079/tools/packet/MonsterCarnivalPacket.class b/out/production/A079/tools/packet/MonsterCarnivalPacket.class new file mode 100644 index 0000000..d76de2d Binary files /dev/null and b/out/production/A079/tools/packet/MonsterCarnivalPacket.class differ diff --git a/out/production/A079/tools/packet/PacketHelper.class b/out/production/A079/tools/packet/PacketHelper.class new file mode 100644 index 0000000..0f1eb35 Binary files /dev/null and b/out/production/A079/tools/packet/PacketHelper.class differ diff --git a/out/production/A079/tools/packet/PetPacket.class b/out/production/A079/tools/packet/PetPacket.class new file mode 100644 index 0000000..ac3ffd5 Binary files /dev/null and b/out/production/A079/tools/packet/PetPacket.class differ diff --git a/out/production/A079/tools/packet/PlayerShopPacket.class b/out/production/A079/tools/packet/PlayerShopPacket.class new file mode 100644 index 0000000..b80fe9a Binary files /dev/null and b/out/production/A079/tools/packet/PlayerShopPacket.class differ diff --git a/out/production/A079/tools/packet/UIPacket.class b/out/production/A079/tools/packet/UIPacket.class new file mode 100644 index 0000000..b4442ae Binary files /dev/null and b/out/production/A079/tools/packet/UIPacket.class differ diff --git a/out/production/A079/tools/wztosql/DumpCashShop.class b/out/production/A079/tools/wztosql/DumpCashShop.class new file mode 100644 index 0000000..0e32d35 Binary files /dev/null and b/out/production/A079/tools/wztosql/DumpCashShop.class differ diff --git a/out/production/A079/tools/wztosql/DumpHairFace.class b/out/production/A079/tools/wztosql/DumpHairFace.class new file mode 100644 index 0000000..1cb57fa Binary files /dev/null and b/out/production/A079/tools/wztosql/DumpHairFace.class differ diff --git a/out/production/A079/tools/wztosql/DumpHairFaceTxt.class b/out/production/A079/tools/wztosql/DumpHairFaceTxt.class new file mode 100644 index 0000000..2c10ab4 Binary files /dev/null and b/out/production/A079/tools/wztosql/DumpHairFaceTxt.class differ diff --git a/out/production/A079/tools/wztosql/DumpItems.class b/out/production/A079/tools/wztosql/DumpItems.class new file mode 100644 index 0000000..fb2c44d Binary files /dev/null and b/out/production/A079/tools/wztosql/DumpItems.class differ diff --git a/out/production/A079/tools/wztosql/DumpMobSkills.class b/out/production/A079/tools/wztosql/DumpMobSkills.class new file mode 100644 index 0000000..6a26066 Binary files /dev/null and b/out/production/A079/tools/wztosql/DumpMobSkills.class differ diff --git a/out/production/A079/tools/wztosql/DumpOxQuizData.class b/out/production/A079/tools/wztosql/DumpOxQuizData.class new file mode 100644 index 0000000..ff9cc1b Binary files /dev/null and b/out/production/A079/tools/wztosql/DumpOxQuizData.class differ diff --git a/out/production/A079/tools/wztosql/DumpQuests.class b/out/production/A079/tools/wztosql/DumpQuests.class new file mode 100644 index 0000000..6e3973f Binary files /dev/null and b/out/production/A079/tools/wztosql/DumpQuests.class differ diff --git a/out/production/A079/tools/wztosql/MonsterDropCreator$MobInfo.class b/out/production/A079/tools/wztosql/MonsterDropCreator$MobInfo.class new file mode 100644 index 0000000..214fc65 Binary files /dev/null and b/out/production/A079/tools/wztosql/MonsterDropCreator$MobInfo.class differ diff --git a/out/production/A079/tools/wztosql/MonsterDropCreator.class b/out/production/A079/tools/wztosql/MonsterDropCreator.class new file mode 100644 index 0000000..afbe042 Binary files /dev/null and b/out/production/A079/tools/wztosql/MonsterDropCreator.class differ diff --git a/out/production/A079/tools/wztosql/WzStringDumper.class b/out/production/A079/tools/wztosql/WzStringDumper.class new file mode 100644 index 0000000..1d3856e Binary files /dev/null and b/out/production/A079/tools/wztosql/WzStringDumper.class differ diff --git a/src/MXDJR/BuildPack.java b/src/MXDJR/BuildPack.java new file mode 100644 index 0000000..da0b796 --- /dev/null +++ b/src/MXDJR/BuildPack.java @@ -0,0 +1,30 @@ +package MXDJR; + +import java.nio.charset.StandardCharsets; + +import com.alibaba.fastjson.JSON; + +class BuildPack { + public static byte[] Build(final Object data, final int index) { + final String str = JSON.toJSONString(data) + " "; + final byte[] temp = str.getBytes(StandardCharsets.UTF_8); + temp[temp.length - 1] = (byte) index; + return temp; + } + + public static byte[] BuildImage(final long qq, final long id, final long fid, final String img, final int index) { + String temp = ""; + if (id != 0L) { + temp = temp + "id=" + id + "&"; + } + if (fid != 0L) { + temp = temp + "fid=" + fid + "&"; + } + temp = temp + "qq=" + qq + "&"; + temp = temp + "img=" + img; + final String str = temp + " "; + final byte[] temp2 = str.getBytes(StandardCharsets.UTF_8); + temp2[temp2.length - 1] = (byte) index; + return temp2; + } +} diff --git a/src/MXDJR/ConfigObj.java b/src/MXDJR/ConfigObj.java new file mode 100644 index 0000000..6ff17ac --- /dev/null +++ b/src/MXDJR/ConfigObj.java @@ -0,0 +1,12 @@ +package MXDJR; + +import java.util.ArrayList; +import java.util.List; + +public class ConfigObj { + public List GJC; + + public ConfigObj() { + this.GJC = (List) new ArrayList(); + } +} diff --git a/src/MXDJR/ConfigRead.java b/src/MXDJR/ConfigRead.java new file mode 100644 index 0000000..ce31c2f --- /dev/null +++ b/src/MXDJR/ConfigRead.java @@ -0,0 +1,67 @@ +package MXDJR; + +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.FileOutputStream; +import java.util.Iterator; +import java.io.IOException; + +import com.alibaba.fastjson.JSON; + +import java.io.Reader; +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.io.FileInputStream; +import java.io.File; + +public class ConfigRead { + private static File ConfigFile; + + public static boolean ReadStart(final String local) { + try { + ConfigRead.ConfigFile = new File(local + "AnswerConfig.json"); + if (!ConfigRead.ConfigFile.exists()) { + ConfigRead.ConfigFile.createNewFile(); + MXDJR.Config = new ConfigObj(); + Save(); + return true; + } + final InputStreamReader reader = new InputStreamReader((InputStream) new FileInputStream(ConfigRead.ConfigFile), StandardCharsets.UTF_8); + final BufferedReader bf = new BufferedReader((Reader) reader); + final char[] buf = new char[1024]; + final StringBuilder data = new StringBuilder(); + int length; + while ((length = bf.read(buf)) != -1) { + data.append(new String(buf, 0, length)); + } + MXDJR.Config = (ConfigObj) JSON.parseObject(data.toString(), ConfigObj.class); + if (MXDJR.Config.GJC == null) { + MXDJR.Config = new ConfigObj(); + Save(); + } + bf.close(); + reader.close(); + for (final String item : MXDJR.Config.GJC) { + System.out.println("关键词:" + item); + } + } catch (IOException e) { + e.printStackTrace(); + } + return false; + } + + public static void Save() { + try { + final FileOutputStream out = new FileOutputStream(ConfigRead.ConfigFile); + final OutputStreamWriter write = new OutputStreamWriter((OutputStream) out, StandardCharsets.UTF_8); + write.write(JSON.toJSONString(MXDJR.Config)); + write.close(); + out.close(); + } catch (Exception e) { + System.out.println("配置文件保存失败:" + e); + e.printStackTrace(); + } + } +} diff --git a/src/MXDJR/FriendMessageEventPack.java b/src/MXDJR/FriendMessageEventPack.java new file mode 100644 index 0000000..cdd60c5 --- /dev/null +++ b/src/MXDJR/FriendMessageEventPack.java @@ -0,0 +1,10 @@ +package MXDJR; + +import java.util.List; + +class FriendMessageEventPack extends PackBase { + public long id; + public String name; + public List message; + public int time; +} diff --git a/src/MXDJR/GroupMessageEventPack.java b/src/MXDJR/GroupMessageEventPack.java new file mode 100644 index 0000000..213edaa --- /dev/null +++ b/src/MXDJR/GroupMessageEventPack.java @@ -0,0 +1,10 @@ +package MXDJR; + +import java.util.List; + +class GroupMessageEventPack extends PackBase { + public long id; + public long fid; + public String name; + public List message; +} diff --git a/src/MXDJR/MXDJR.java b/src/MXDJR/MXDJR.java new file mode 100644 index 0000000..7d61903 --- /dev/null +++ b/src/MXDJR/MXDJR.java @@ -0,0 +1,22 @@ +package MXDJR; + +public class MXDJR { + public static String RunDir; + public static ConfigObj Config; + + public static void startJR() { + if (RobotSocket.IsRun) { + System.out.println("机器人已经启动了,本次关闭了机器人。"); + RobotSocket.Stop(); + return; + } + MXDJR.RunDir = System.getProperty("user.dir") + "/"; + System.out.println("正在启动群机器人……"); + if (ConfigRead.ReadStart(MXDJR.RunDir)) { + System.out.println("请修改配置文件后重新点击!"); + return; + } + System.out.println("初始化完成,一共获取到" + MXDJR.Config.GJC.size() + "个关键词!"); + RobotSocket.Start(); + } +} diff --git a/src/MXDJR/PackBase.java b/src/MXDJR/PackBase.java new file mode 100644 index 0000000..97acc62 --- /dev/null +++ b/src/MXDJR/PackBase.java @@ -0,0 +1,5 @@ +package MXDJR; + +abstract class PackBase { + public long qq; +} diff --git a/src/MXDJR/RobotSocket.java b/src/MXDJR/RobotSocket.java new file mode 100644 index 0000000..5588e32 --- /dev/null +++ b/src/MXDJR/RobotSocket.java @@ -0,0 +1,266 @@ +package MXDJR; + +import java.util.ArrayList; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + +import handling.world.World.Broadcast; +import tools.MaplePacketCreator; +import com.alibaba.fastjson.JSON; + +import java.util.concurrent.CopyOnWriteArrayList; + +import constants.ServerConfig; + +import java.util.List; +import java.net.Socket; + +public class RobotSocket { + private static Socket Socket; + private static Thread ReadThread; + private static Thread DoThread; + public static boolean IsRun; + public static boolean IsConnect; + private static List QueueRead; + private static List QueueSend; + private static int Num; + private static String list; + private static long[] QQ号; + private static long[] QQ群号; + private static long[] QQ群主; + private static final StartPack PackStart; + + public static long QQ号() { + return RobotSocket.QQ号[ServerConfig.nub1]; + } + + public static long QQ群号() { + return RobotSocket.QQ群号[ServerConfig.nub1]; + } + + public static long QQ群主() { + return RobotSocket.QQ群主[ServerConfig.nub1]; + } + + public static void Start() { + RobotSocket.QueueRead = (List) new CopyOnWriteArrayList(); + RobotSocket.QueueSend = (List) new CopyOnWriteArrayList(); + RobotSocket.DoThread = new Thread((Runnable) new Runnable() { + @Override + public void run() { + while (RobotSocket.IsRun) { + try { + if (!RobotSocket.QueueRead.isEmpty()) { + final RobotTask task = (RobotTask) RobotSocket.QueueRead.remove(0); + switch (task.index) { + case 49: { + final GroupMessageEventPack pack = (GroupMessageEventPack) JSON.parseObject(task.data, GroupMessageEventPack.class); + final String item = (String) pack.message.get(1); + if (!item.contains((CharSequence) "{") && !item.contains((CharSequence) "[")) { + Broadcast.broadcastMessage(MaplePacketCreator.serverNotice(6, "[群消息]:" + pack.name + "->" + item)); + } + if (item.contains((CharSequence) "增加关键字") && pack.fid == RobotSocket.QQ群主[ServerConfig.nub1]) { + final String 关键字 = item.substring(item.indexOf("字") + 1); + System.out.println("增加游戏内关键字:" + 关键字); + MXDJR.Config.GJC.add(关键字); + ConfigRead.Save(); + final List send = Arrays.asList("我已经开通关键字:" + 关键字); + RobotSocket.SendGroupMessage(RobotSocket.QQ号[ServerConfig.nub1], RobotSocket.QQ群号[ServerConfig.nub1], send); + break; + } + if (item.contains((CharSequence) "删除关键字") && pack.fid == RobotSocket.QQ群主[ServerConfig.nub1]) { + final String 关键字 = item.substring(item.indexOf("字") + 1); + System.out.println("删除游戏内关键字:" + 关键字); + for (int num = 0; num < MXDJR.Config.GJC.size(); ++num) { + if (((String) MXDJR.Config.GJC.get(num)).contains((CharSequence) 关键字)) { + MXDJR.Config.GJC.remove(num); + ConfigRead.Save(); + final List send2 = Arrays.asList("我已经删除关键字:" + 关键字); + RobotSocket.SendGroupMessage(RobotSocket.QQ号[ServerConfig.nub1], RobotSocket.QQ群号[ServerConfig.nub1], send2); + break; + } + } + } + if (item.contains((CharSequence) "查看关键字")) { + String 关键字2 = ""; + for (int num2 = 0; num2 < MXDJR.Config.GJC.size(); ++num2) { + 关键字2 = 关键字2 + "【" + (String) MXDJR.Config.GJC.get(num2) + "】"; + } + final List send2 = Arrays.asList("游戏通告支持关键字:" + 关键字2); + RobotSocket.SendGroupMessage(RobotSocket.QQ号[ServerConfig.nub1], RobotSocket.QQ群号[ServerConfig.nub1], send2); + break; + } + break; + } + } + } + Thread.sleep(10L); + } catch (Exception e) { + ServerMain.LogError(e); + } + } + } + }); + (RobotSocket.ReadThread = new Thread((Runnable) new Runnable() { + @Override + public void run() { + try { + while (!RobotSocket.IsRun) { + Thread.sleep(100L); + } + } catch (Exception e) { + ServerMain.LogError(e); + } + RobotSocket.DoThread.start(); + while (RobotSocket.IsRun) { + try { + if (!RobotSocket.IsConnect) { + ReConnect(); + } else { + if (RobotSocket.Socket.getInputStream().available() > 0) { + final byte[] data = new byte[RobotSocket.Socket.getInputStream().available()]; + RobotSocket.Socket.getInputStream().read(data); + final byte type = data[data.length - 1]; + data[data.length - 1] = 0; + final String unicode = new String(data, "UTF-8"); + final String gbk = new String(unicode.getBytes("GBK")); + RobotSocket.QueueRead.add(new RobotTask(type, gbk)); + continue; + } + if (RobotSocket.Socket.getInputStream().available() < 0) { + ServerMain.LogOut("机器人连接中断"); + RobotSocket.IsConnect = false; + } else if (!RobotSocket.QueueSend.isEmpty()) { + final byte[] data = (byte[]) RobotSocket.QueueSend.remove(0); + RobotSocket.Socket.getOutputStream().write(data); + RobotSocket.Socket.getOutputStream().flush(); + } + } + Thread.sleep(50L); + } catch (Exception e2) { + ServerMain.LogError("机器人连接失败"); + ServerMain.LogError(e2); + RobotSocket.IsConnect = false; + ServerMain.LogError("机器人20秒后重连"); + try { + Thread.sleep(20000L); + } catch (InterruptedException interruptedException) { + interruptedException.printStackTrace(); + } + ServerMain.LogError("机器人重连中"); + } + } + } + })).start(); + RobotSocket.IsRun = true; + } + + private static boolean is() { + try { + RobotSocket.Socket.sendUrgentData(60); + return false; + } catch (Exception ex) { + return true; + } + } + + private static void ReConnect() { + try { + if (RobotSocket.Socket != null) { + RobotSocket.Socket.close(); + } + RobotSocket.Socket = new Socket("121.62.23.34", 790393010); + final byte[] data = (JSON.toJSON(RobotSocket.PackStart) + " ").getBytes(StandardCharsets.UTF_8); + data[data.length - 1] = 0; + RobotSocket.Socket.getOutputStream().write(data); + RobotSocket.Socket.getOutputStream().flush(); + RobotSocket.QueueRead.clear(); + RobotSocket.QueueSend.clear(); + ServerMain.LogOut("机器人已连接"); + RobotSocket.IsConnect = true; + } catch (Exception e) { + ServerMain.LogError("机器人连接失败"); + ServerMain.LogError(e); + } + } + + public static void SendGroupMessage(final long qq_, final long id_, final List message_) { + final byte[] data = BuildPack.Build(new SendGroupMessagePack() { + }, 52); + RobotSocket.QueueSend.add(data); + } + + public static void SendGroupPrivateMessage(final long qq_, final long id_, final long fid_, final List message_) { + final byte[] data = BuildPack.Build(new SendGroupPrivateMessagePack() { + }, 53); + RobotSocket.QueueSend.add(data); + } + + public static void SendFriendMessage(final long qq_, final long id_, final List message_) { + final byte[] data = BuildPack.Build(new SendFriendMessagePack() { + }, 54); + RobotSocket.QueueSend.add(data); + } + + public static void SendGroupImage(final long qq, final long id, final String img) { + final byte[] data = BuildPack.BuildImage(qq, id, 0L, img, 61); + RobotSocket.QueueSend.add(data); + } + + public static void SendGroupPrivateImage(final long qq, final long id, final long fid, final String img) { + final byte[] data = BuildPack.BuildImage(qq, id, fid, img, 62); + RobotSocket.QueueSend.add(data); + } + + public static void SendFriendImage(final long qq, final long id, final String img) { + final byte[] data = BuildPack.BuildImage(qq, id, 0L, img, 63); + RobotSocket.QueueSend.add(data); + } + + public static void Stop() { + ServerMain.LogOut("机器人正在断开!"); + RobotSocket.IsRun = false; + if (RobotSocket.Socket != null) { + try { + RobotSocket.Socket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + ServerMain.LogOut("机器人已断开!"); + } + + public static final void robbatSpeak(final String text) { + if (RobotSocket.IsConnect) { + final List send = Arrays.asList(text); + SendGroupMessage(RobotSocket.QQ号[ServerConfig.nub1], RobotSocket.QQ群号[ServerConfig.nub1], send); + } + } + + public static final void robbatSpeak1(final String text) { + if (RobotSocket.IsConnect) { + final List send = Arrays.asList(text); + SendFriendMessage(RobotSocket.QQ号[ServerConfig.nub1], RobotSocket.QQ群号[ServerConfig.nub1], send); + } + } + + static { + Num = 0; + QQ号 = new long[]{3430308405L}; + QQ群号 = new long[]{790393010L}; + QQ群主 = new long[]{116711496L}; + PackStart = new StartPack() { + { + Name = "MXDJR"; + Reg = new ArrayList() { + { + add(Integer.valueOf(49)); + add(Integer.valueOf(50)); + add(Integer.valueOf(51)); + } + }; + } + }; + } +} diff --git a/src/MXDJR/RobotTask.java b/src/MXDJR/RobotTask.java new file mode 100644 index 0000000..8b4a028 --- /dev/null +++ b/src/MXDJR/RobotTask.java @@ -0,0 +1,11 @@ +package MXDJR; + +class RobotTask { + public byte index; + public String data; + + public RobotTask(final byte type, final String s) { + this.index = type; + this.data = s; + } +} diff --git a/src/MXDJR/SendFriendImagePack.java b/src/MXDJR/SendFriendImagePack.java new file mode 100644 index 0000000..f77a26d --- /dev/null +++ b/src/MXDJR/SendFriendImagePack.java @@ -0,0 +1,6 @@ +package MXDJR; + +class SendFriendImagePack extends PackBase { + public long id; + public String img; +} diff --git a/src/MXDJR/SendFriendMessagePack.java b/src/MXDJR/SendFriendMessagePack.java new file mode 100644 index 0000000..8bc8573 --- /dev/null +++ b/src/MXDJR/SendFriendMessagePack.java @@ -0,0 +1,8 @@ +package MXDJR; + +import java.util.List; + +class SendFriendMessagePack extends PackBase { + public long id; + public List message; +} diff --git a/src/MXDJR/SendGroupImagePack.java b/src/MXDJR/SendGroupImagePack.java new file mode 100644 index 0000000..4e89d22 --- /dev/null +++ b/src/MXDJR/SendGroupImagePack.java @@ -0,0 +1,6 @@ +package MXDJR; + +class SendGroupImagePack extends PackBase { + public long id; + public String img; +} diff --git a/src/MXDJR/SendGroupMessagePack.java b/src/MXDJR/SendGroupMessagePack.java new file mode 100644 index 0000000..a3ede37 --- /dev/null +++ b/src/MXDJR/SendGroupMessagePack.java @@ -0,0 +1,8 @@ +package MXDJR; + +import java.util.List; + +class SendGroupMessagePack extends PackBase { + public long id; + public List message; +} diff --git a/src/MXDJR/SendGroupPrivateImagePack.java b/src/MXDJR/SendGroupPrivateImagePack.java new file mode 100644 index 0000000..8b75a89 --- /dev/null +++ b/src/MXDJR/SendGroupPrivateImagePack.java @@ -0,0 +1,7 @@ +package MXDJR; + +class SendGroupPrivateImagePack extends PackBase { + public long id; + public long fid; + public String img; +} diff --git a/src/MXDJR/SendGroupPrivateMessagePack.java b/src/MXDJR/SendGroupPrivateMessagePack.java new file mode 100644 index 0000000..8adf6ca --- /dev/null +++ b/src/MXDJR/SendGroupPrivateMessagePack.java @@ -0,0 +1,9 @@ +package MXDJR; + +import java.util.List; + +class SendGroupPrivateMessagePack extends PackBase { + public long id; + public long fid; + public List message; +} diff --git a/src/MXDJR/ServerMain.java b/src/MXDJR/ServerMain.java new file mode 100644 index 0000000..21e4bb1 --- /dev/null +++ b/src/MXDJR/ServerMain.java @@ -0,0 +1,19 @@ +package MXDJR; + +class ServerMain { + public static void LogError(final Exception e) { + final String a = "[错误]"; + System.out.println(a); + e.printStackTrace(); + } + + public static void LogError(String a) { + a = "[错误]" + a; + System.out.println(a); + } + + public static void LogOut(String a) { + a = "[信息]" + a; + System.out.println(a); + } +} diff --git a/src/MXDJR/StartPack.java b/src/MXDJR/StartPack.java new file mode 100644 index 0000000..e3d725e --- /dev/null +++ b/src/MXDJR/StartPack.java @@ -0,0 +1,8 @@ +package MXDJR; + +import java.util.List; + +class StartPack { + public String Name; + public List Reg; +} diff --git a/src/MXDJR/TempMessageEventPack.java b/src/MXDJR/TempMessageEventPack.java new file mode 100644 index 0000000..ef97107 --- /dev/null +++ b/src/MXDJR/TempMessageEventPack.java @@ -0,0 +1,5 @@ +package MXDJR; + +class TempMessageEventPack extends GroupMessageEventPack { + public int time; +} diff --git a/src/client/BuddyEntry.java b/src/client/BuddyEntry.java new file mode 100644 index 0000000..9cfeabc --- /dev/null +++ b/src/client/BuddyEntry.java @@ -0,0 +1,147 @@ +package client; + +import java.sql.ResultSet; +import java.sql.PreparedStatement; +import java.sql.Connection; +import java.sql.SQLException; + +import tools.FileoutputUtil; +import database.DBConPool; + +public class BuddyEntry { + private final String name; + private String group; + private final int characterId; + private final int level; + private final int job; + private boolean visible; + private int channel; + + public BuddyEntry(final String name, final int characterId, final String group, final int channel, final boolean visible, final int level, final int job) { + this.name = name; + this.characterId = characterId; + this.group = group; + this.channel = channel; + this.visible = visible; + this.level = level; + this.job = job; + } + + public int getChannel() { + return this.channel; + } + + public void setChannel(final int channel) { + this.channel = channel; + } + + public boolean isOnline() { + return this.channel >= 0; + } + + public void setOffline() { + this.channel = -1; + } + + public String getName() { + return this.name; + } + + public int getCharacterId() { + return this.characterId; + } + + public int getLevel() { + return this.level; + } + + public int getJob() { + return this.job; + } + + public void setVisible(final boolean visible) { + this.visible = visible; + } + + public boolean isVisible() { + return this.visible; + } + + public String getGroup() { + return this.group; + } + + public void setGroup(final String newGroup) { + this.group = newGroup; + } + + public static BuddyEntry getByNameFromDB(final String buddyName) { + Connection con = null; + PreparedStatement ps = null; + ResultSet rs = null; + try { + con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + ps = con.prepareStatement("SELECT id, name, level, job FROM characters WHERE name = ?"); + ps.setString(1, buddyName); + rs = ps.executeQuery(); + if (rs.next()) { + return new BuddyEntry(rs.getString("name"), rs.getInt("id"), "其他", -1, false, rs.getInt("level"), rs.getInt("job")); + } + rs.close(); + ps.close(); + con.close(); + return null; + } catch (SQLException ex) { + ex.printStackTrace(); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + return null; + } finally { + DBConPool.cleanUP(rs, ps, con); + } + } + + public static BuddyEntry getByIdfFromDB(final int buddyCharId) { + Connection con = null; + PreparedStatement ps = null; + ResultSet rs = null; + try { + con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + ps = con.prepareStatement("SELECT id, name, level, job FROM characters WHERE id = ?"); + ps.setInt(1, buddyCharId); + rs = ps.executeQuery(); + if (rs.next()) { + return new BuddyEntry(rs.getString("name"), rs.getInt("id"), "其他", -1, true, rs.getInt("level"), rs.getInt("job")); + } + rs.close(); + ps.close(); + con.close(); + return null; + } catch (SQLException ex) { + ex.printStackTrace(); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + return null; + } finally { + DBConPool.cleanUP(rs, ps, con); + } + } + + @Override + public final int hashCode() { + final int prime = 31; + int result = 1; + result = 31 * result + this.characterId; + return result; + } + + @Override + public final boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + final BuddyEntry other = (BuddyEntry) obj; + return this.characterId == other.characterId; + } +} diff --git a/src/client/BuddyList.java b/src/client/BuddyList.java new file mode 100644 index 0000000..98f7d52 --- /dev/null +++ b/src/client/BuddyList.java @@ -0,0 +1,262 @@ +package client; + +import tools.MaplePacketCreator; + +import java.sql.ResultSet; +import java.sql.PreparedStatement; +import java.sql.Connection; +import java.sql.SQLException; + +import tools.FileoutputUtil; +import database.DBConPool; + +import java.util.Map.Entry; +import java.util.Collection; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.Deque; +import java.util.Map; +import java.io.Serializable; + +public class BuddyList implements Serializable { + public static final String DEFAULT_GROUP = "其他"; + private final Map buddies; + private byte capacity; + private final Deque pendingReqs; + + public BuddyList(final byte capacity) { + this.pendingReqs = (Deque) new LinkedList(); + this.buddies = (Map) new LinkedHashMap(); + this.capacity = capacity; + } + + public BuddyList(final int capacity) { + this.pendingReqs = (Deque) new LinkedList(); + this.buddies = (Map) new LinkedHashMap(); + this.capacity = (byte) capacity; + } + + public boolean contains(final int characterId) { + return this.buddies.containsKey(Integer.valueOf(characterId)); + } + + public boolean containsVisible(final int charId) { + final BuddyEntry ble = (BuddyEntry) this.buddies.get(Integer.valueOf(charId)); + return ble != null && ble.isVisible(); + } + + public byte getCapacity() { + return this.capacity; + } + + public void setCapacity(final byte newCapacity) { + this.capacity = newCapacity; + } + + public BuddyEntry get(final int characterId) { + return (BuddyEntry) this.buddies.get(Integer.valueOf(characterId)); + } + + public BuddyEntry get(final String characterName) { + final String searchName = characterName.toLowerCase(); + for (final BuddyEntry ble : this.buddies.values()) { + if (ble.getName().toLowerCase().equals(searchName)) { + return ble; + } + } + return null; + } + + public void put(final BuddyEntry newEntry) { + this.buddies.put(Integer.valueOf(newEntry.getCharacterId()), newEntry); + } + + public void remove(final int characterId) { + this.buddies.remove(Integer.valueOf(characterId)); + } + + public Collection getBuddies() { + return this.buddies.values(); + } + + public boolean isFull() { + return this.buddies.size() >= this.capacity; + } + + public Collection getBuddiesIds() { + return this.buddies.keySet(); + } + + public void loadFromTransfer(final Map data) { + for (final Entry qs : data.entrySet()) { + final BuddyEntry buddyid = (BuddyEntry) qs.getKey(); + final boolean pair = ((Boolean) qs.getValue()).booleanValue(); + if (!pair) { + this.pendingReqs.push(buddyid); + } else { + this.put(new BuddyEntry(buddyid.getName(), buddyid.getCharacterId(), buddyid.getGroup(), -1, true, buddyid.getLevel(), buddyid.getJob())); + } + } + } + + public void loadFromDb(final int characterId) throws SQLException { + Connection con = null; + PreparedStatement ps = null; + ResultSet rs = null; + try { + con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + ps = con.prepareStatement("SELECT b.buddyid, b.pending, c.name as buddyname, c.job as buddyjob, c.level as buddylevel, b.groupname FROM buddies as b, characters as c WHERE c.id = b.buddyid AND b.characterid = ?"); + ps.setInt(1, characterId); + rs = ps.executeQuery(); + while (rs.next()) { + final int buddyid = rs.getInt("buddyid"); + final String buddyname = rs.getString("buddyname"); + if (rs.getInt("pending") == 1) { + this.pendingReqs.push(new BuddyEntry(buddyname, buddyid, rs.getString("groupname"), -1, false, rs.getInt("buddylevel"), rs.getInt("buddyjob"))); + } else { + this.put(new BuddyEntry(buddyname, buddyid, rs.getString("groupname"), -1, true, rs.getInt("buddylevel"), rs.getInt("buddyjob"))); + } + } + rs.close(); + ps.close(); + ps = con.prepareStatement("DELETE FROM buddies WHERE pending = 1 AND characterid = ?"); + ps.setInt(1, characterId); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } finally { + DBConPool.cleanUP(rs, ps, con); + } + } + + public BuddyEntry pollPendingRequest() { + return (BuddyEntry) this.pendingReqs.pollLast(); + } + + public void addBuddyRequest(final MapleClient client, final int buddyId, final String buddyName, final int buddyChannel, final int buddyLevel, final int buddyJob) { + this.put(new BuddyEntry(buddyName, buddyId, "其他", buddyChannel, false, buddyLevel, buddyJob)); + if (this.pendingReqs.isEmpty()) { + client.sendPacket(MaplePacketCreator.requestBuddylistAdd(buddyId, buddyName, buddyLevel, buddyJob)); + } else { + final BuddyEntry newPair = new BuddyEntry(buddyName, buddyId, "其他", -1, false, buddyJob, buddyLevel); + this.pendingReqs.push(newPair); + } + } + + public static int getBuddyCount(final int chrId, final int pending) { + int count = 0; + Connection con = null; + PreparedStatement ps = null; + ResultSet rs = null; + try { + con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + ps = con.prepareStatement("SELECT COUNT(*) as buddyCount FROM buddies WHERE characterid = ? AND pending = ?"); + ps.setInt(1, chrId); + ps.setInt(2, pending); + rs = ps.executeQuery(); + if (!rs.next()) { + rs.close(); + ps.close(); + con.close(); + throw new RuntimeException("BuddyListHandler: getBuudyCount From DB is Error."); + } + count = rs.getInt("buddyCount"); + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + ex.printStackTrace(); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } finally { + DBConPool.cleanUP(rs, ps, con); + } + return count; + } + + public static int getBuddyCapacity(final int charId) { + int capacity = -1; + Connection con = null; + PreparedStatement ps = null; + ResultSet rs = null; + try { + con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + ps = con.prepareStatement("SELECT buddyCapacity FROM characters WHERE id = ?"); + ps.setInt(1, charId); + rs = ps.executeQuery(); + if (rs.next()) { + capacity = rs.getInt("buddyCapacity"); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + ex.printStackTrace(); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } finally { + DBConPool.cleanUP(rs, ps, con); + } + return capacity; + } + + public static int getBuddyPending(final int chrId, final int buddyId) { + int pending = -1; + Connection con = null; + PreparedStatement ps = null; + ResultSet rs = null; + try { + con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + ps = con.prepareStatement("SELECT pending FROM buddies WHERE characterid = ? AND buddyid = ?"); + ps.setInt(1, chrId); + ps.setInt(2, buddyId); + rs = ps.executeQuery(); + if (rs.next()) { + pending = rs.getInt("pending"); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + ex.printStackTrace(); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } finally { + DBConPool.cleanUP(rs, ps, con); + } + return pending; + } + + public static void addBuddyToDB(final MapleCharacter player, final BuddyEntry buddy) { + Connection con = null; + PreparedStatement ps = null; + final ResultSet rs = null; + try { + con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + ps = con.prepareStatement("INSERT INTO buddies (`characterid`, `buddyid`, `groupname`, `pending`) VALUES (?, ?, ?, 1)"); + ps.setInt(1, buddy.getCharacterId()); + ps.setInt(2, player.getId()); + ps.setString(3, buddy.getGroup()); + ps.executeUpdate(); + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + ex.printStackTrace(); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } finally { + DBConPool.cleanUP(rs, ps, con); + } + } + + public enum BuddyOperation { + ADDED, + DELETED; + } + + public enum BuddyAddResult { + BUDDYLIST_FULL, + ALREADY_ON_LIST, + OK; + } +} diff --git a/src/client/ISkill.java b/src/client/ISkill.java new file mode 100644 index 0000000..6fcf268 --- /dev/null +++ b/src/client/ISkill.java @@ -0,0 +1,40 @@ +package client; + +import server.life.Element; +import server.MapleStatEffect; + +public interface ISkill { + int getId(); + + MapleStatEffect getEffect(final int p0); + + byte getMaxLevel(); + + int getAnimationTime(); + + boolean canBeLearnedBy(final int p0); + + boolean isFourthJob(); + + boolean hasAction(); + + boolean isTimeLimited(); + + int getMasterLevel(); + + Element getElement(); + + boolean isBeginnerSkill(); + + boolean hasRequiredSkill(); + + boolean isInvisible(); + + boolean isChargeSkill(); + + int getRequiredSkillLevel(); + + int getRequiredSkillId(); + + String getName(); +} diff --git a/src/client/ItemVac.java b/src/client/ItemVac.java new file mode 100644 index 0000000..4042220 --- /dev/null +++ b/src/client/ItemVac.java @@ -0,0 +1,4 @@ +package client; + +public class ItemVac extends Thread { +} diff --git a/src/client/LoginCrypto.java b/src/client/LoginCrypto.java new file mode 100644 index 0000000..ac09c48 --- /dev/null +++ b/src/client/LoginCrypto.java @@ -0,0 +1,85 @@ +package client; + +import java.io.UnsupportedEncodingException; +import java.security.NoSuchAlgorithmException; +import java.security.MessageDigest; + +import tools.HexTool; + +import java.util.Random; + +public class LoginCrypto { + protected static final int extralength = 6; + private static final String[] Alphabet = new String[]{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}; + private static final String[] Number = new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9"}; + private static final Random rand = new Random(); + + public static String Generate_13DigitAsiasoftPassport() { + final StringBuilder sb = new StringBuilder(); + sb.append(LoginCrypto.Alphabet[LoginCrypto.rand.nextInt(LoginCrypto.Alphabet.length)]); + for (int i = 0; i < 11; ++i) { + sb.append(LoginCrypto.Number[LoginCrypto.rand.nextInt(LoginCrypto.Number.length)]); + } + sb.append(LoginCrypto.Alphabet[LoginCrypto.rand.nextInt(LoginCrypto.Alphabet.length)]); + return sb.toString(); + } + + private static String toSimpleHexString(final byte[] bytes) { + return HexTool.toString(bytes).replace((CharSequence) " ", (CharSequence) "").toLowerCase(); + } + + private static String hashWithDigest(final String in, final String digest) { + try { + final MessageDigest Digester = MessageDigest.getInstance(digest); + Digester.update(in.getBytes("UTF-8"), 0, in.length()); + final byte[] sha1Hash = Digester.digest(); + return toSimpleHexString(sha1Hash); + } catch (NoSuchAlgorithmException ex) { + throw new RuntimeException("Hashing the password failed", (Throwable) ex); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException("Encoding the string failed", (Throwable) e); + } + } + + public static String hexSha1(final String in) { + return hashWithDigest(in, "SHA-1"); + } + + private static String hexSha512(final String in) { + return hashWithDigest(in, "SHA-512"); + } + + public static boolean checkSha1Hash(final String hash, final String password) { + return hash.equals(makeSaltedSha1Hash(password)); + } + + public static boolean checkSaltedSha512Hash(final String hash, final String password, final String salt) { + return hash.equals(makeSaltedSha512Hash(password, salt)); + } + + public static String makeSaltedSha512Hash(final String password, final String salt) { + return hexSha512(password + salt); + } + + public static String makeSaltedSha1Hash(final String password) { + return hexSha1(password); + } + + public static String makeSalt() { + final byte[] salt = new byte[16]; + LoginCrypto.rand.nextBytes(salt); + return toSimpleHexString(salt); + } + + public static String rand_s(final String in) { + final StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 6; ++i) { + sb.append(LoginCrypto.rand.nextBoolean() ? LoginCrypto.Alphabet[LoginCrypto.rand.nextInt(LoginCrypto.Alphabet.length)] : LoginCrypto.Number[LoginCrypto.rand.nextInt(LoginCrypto.Number.length)]); + } + return sb.toString() + in; + } + + public static String rand_r(final String in) { + return in.substring(6, 134); + } +} diff --git a/src/client/LoginCryptoLegacy.java b/src/client/LoginCryptoLegacy.java new file mode 100644 index 0000000..e03d818 --- /dev/null +++ b/src/client/LoginCryptoLegacy.java @@ -0,0 +1,124 @@ +package client; + +import java.io.UnsupportedEncodingException; +import java.security.NoSuchAlgorithmException; +import java.security.MessageDigest; +import java.util.Random; + +public class LoginCryptoLegacy { + private static final Random rand; + private static final char[] iota64; + + public static final String hashPassword(final String password) { + final byte[] randomBytes = new byte[6]; + LoginCryptoLegacy.rand.setSeed(System.currentTimeMillis()); + LoginCryptoLegacy.rand.nextBytes(randomBytes); + return myCrypt(password, genSalt(randomBytes)); + } + + public static final boolean checkPassword(final String password, final String hash) { + return myCrypt(password, hash).equals(hash); + } + + public static final boolean isLegacyPassword(final String hash) { + return hash.substring(0, 3).equals("$H$"); + } + + private static String myCrypt(final String password, String seed) throws RuntimeException { + String out = null; + int count = 8; + if (!seed.substring(0, 3).equals("$H$")) { + final byte[] randomBytes = new byte[6]; + LoginCryptoLegacy.rand.nextBytes(randomBytes); + seed = genSalt(randomBytes); + } + final String salt = seed.substring(4, 12); + if (salt.length() != 8) { + throw new RuntimeException("Error hashing password - Invalid seed."); + } + try { + final MessageDigest digester = MessageDigest.getInstance("SHA-1"); + digester.update((salt + password).getBytes("iso-8859-1"), 0, (salt + password).length()); + byte[] sha1Hash = digester.digest(); + do { + final byte[] CombinedBytes = new byte[sha1Hash.length + password.length()]; + System.arraycopy(sha1Hash, 0, CombinedBytes, 0, sha1Hash.length); + System.arraycopy(password.getBytes("iso-8859-1"), 0, CombinedBytes, sha1Hash.length, password.getBytes("iso-8859-1").length); + digester.update(CombinedBytes, 0, CombinedBytes.length); + sha1Hash = digester.digest(); + } while (--count > 0); + out = seed.substring(0, 12); + out += encode64(sha1Hash); + } catch (NoSuchAlgorithmException | UnsupportedEncodingException ex2) { + System.err.println("Error hashing password." + ex2); + } + if (out == null) { + throw new RuntimeException("Error hashing password - out = null"); + } + return out; + } + + private static String genSalt(final byte[] Random) { + final StringBuilder Salt = new StringBuilder("$H$"); + Salt.append(LoginCryptoLegacy.iota64[30]); + Salt.append(encode64(Random)); + return Salt.toString(); + } + + private static String convertToHex(final byte[] data) { + final StringBuilder buf = new StringBuilder(); + for (int i = 0; i < data.length; ++i) { + int halfbyte = data[i] >>> 4 & 0xF; + int two_halfs = 0; + do { + if (0 <= halfbyte && halfbyte <= 9) { + buf.append((char) (48 + halfbyte)); + } else { + buf.append((char) (97 + (halfbyte - 10))); + } + halfbyte = (data[i] & 0xF); + } while (two_halfs++ < 1); + } + return buf.toString(); + } + + public static final String encodeSHA1(final String text) throws NoSuchAlgorithmException, UnsupportedEncodingException { + final MessageDigest md = MessageDigest.getInstance("SHA-1"); + md.update(text.getBytes("iso-8859-1"), 0, text.length()); + return convertToHex(md.digest()); + } + + private static String encode64(final byte[] Input) { + final int iLen = Input.length; + final int oDataLen = (iLen * 4 + 2) / 3; + final int oLen = (iLen + 2) / 3 * 4; + final char[] out = new char[oLen]; + int i0; + int i2; + int i3; + int o0; + int o2; + int o3; + int o4; + for (int ip = 0, op = 0; ip < iLen; i0 = (Input[ip++] & 0xFF), i2 = ((ip < iLen) ? (Input[ip++] & 0xFF) : 0), i3 = ((ip < iLen) ? (Input[ip++] & 0xFF) : 0), o0 = i0 >>> 2, o2 = ((i0 & 0x3) << 4 | i2 >>> 4), o3 = ((i2 & 0xF) << 2 | i3 >>> 6), o4 = (i3 & 0x3F), out[op++] = LoginCryptoLegacy.iota64[o0], out[op++] = LoginCryptoLegacy.iota64[o2], out[op] = ((op < oDataLen) ? LoginCryptoLegacy.iota64[o3] : '='), ++op, out[op] = ((op < oDataLen) ? LoginCryptoLegacy.iota64[o4] : '='), ++op) { + } + return new String(out); + } + + static { + rand = new Random(); + iota64 = new char[64]; + int i = 0; + iota64[i++] = '.'; + iota64[i++] = '/'; + for (char c = 'A'; c <= 'Z'; ++c) { + iota64[i++] = c; + } + for (char c = 'a'; c <= 'z'; ++c) { + iota64[i++] = c; + } + for (char c = '0'; c <= '9'; ++c) { + iota64[i++] = c; + } + } +} diff --git a/src/client/MapleBeans.java b/src/client/MapleBeans.java new file mode 100644 index 0000000..be99be7 --- /dev/null +++ b/src/client/MapleBeans.java @@ -0,0 +1,47 @@ +package client; + +public class MapleBeans { + private final int number; + private final int type; + private final int pos; + + public MapleBeans(final int pos, final int type, final int number) { + this.pos = pos; + this.number = number; + this.type = type; + } + + public int getType() { + return this.type; + } + + public int getNumber() { + return this.number; + } + + public int getPos() { + return this.pos; + } + + public enum BeansType { + 开始打豆豆(0), + 暂停打豆豆(1), + 顏色求进洞(3), + 进洞旋转(4), + 奖励豆豆效果(5), + 未知效果(6), + 黄金狗(7), + 奖励豆豆效果B(8), + 领奖npc(9); + + final byte type; + + private BeansType(final int type) { + this.type = (byte) type; + } + + public byte getType() { + return this.type; + } + } +} diff --git a/src/client/MapleBuffStat.java b/src/client/MapleBuffStat.java new file mode 100644 index 0000000..22f3e5d --- /dev/null +++ b/src/client/MapleBuffStat.java @@ -0,0 +1,150 @@ +package client; + +import java.io.Serializable; + +public enum MapleBuffStat implements Serializable { + WATK(0), + WDEF(1), + MATK(2), + MDEF(3), + ACC(4), + AVOID(5), + HANDS(6), + SPEED(7), + JUMP(8), + MAGIC_GUARD(9), + DARKSIGHT(10), + BOOSTER(11), + POWERGUARD(12), + MAXHP(13), + MAXMP(14), + INVINCIBLE(15), + SOULARROW(16), + STUN(17), + POISON(18), + SEAL(19), + DARKNESS(20), + COMBO(21), + SUMMON(21), + WK_CHARGE(22), + DRAGONBLOOD(23), + HOLY_SYMBOL(24), + MESOUP(25), + SHADOWPARTNER(26), + PICKPOCKET(27), + PUPPET(28), + MESOGUARD(29), + WEAKEN(30), + CURSE(31), + SLOW(32), + MORPH(33), + RECOVERY(34), + HP_LOSS_GUARD(34), + MAPLE_WARRIOR(35), + STANCE(36), + SHARP_EYES(37), + MANA_REFLECTION(38), + DRAGON_ROAR(39), + SPIRIT_CLAW(40), + INFINITY(41), + HOLY_SHIELD(42), + HAMSTRING(43), + BLIND(44), + CONCENTRATE(45), + ZOMBIFY(46), + ECHO_OF_HERO(47), + UNKNOWN3(48), + MESO_RATE(48), + GHOST_MORPH(49), + ARIANT_COSS_IMU(50), + DROP_RATE(52), + EXPRATE(54), + ACASH_RATE(55), + GM_HIDE(56), + UNKNOWN7(57), + ILLUSION(58), + BERSERK_FURY(57), + DIVINE_BODY(60), + SPARK(59), + ARIANT_COSS_IMU2(62), + FINALATTACK(61), + ELEMENT_RESET(63), + WIND_WALK(64), + ARAN_COMBO(66), + COMBO_DRAIN(67), + COMBO_BARRIER(68), + BODY_PRESSURE(69), + SMART_KNOCKBACK(70), + SOUL_STONE(73), + ENERGY_CHARGE(77), + DASH_SPEED(78), + DASH_JUMP(79), + MONSTER_RIDING(80), + SPEED_INFUSION(81), + HOMING_BEACON(82), + SOARING(82), + FREEZE(83), + LIGHTNING_CHARGE(84), + MIRROR_IMAGE(85), + OWL_SPIRIT(86), + 召唤玩家1(77), + 召唤玩家2(78), + 召唤玩家3(79), + 召唤玩家4(80), + 召唤玩家5(81), + 召唤玩家6(82), + 召唤玩家7(83), + 召唤玩家8(84); + + private static final long serialVersionUID = 0L; + private final int buffstat; + private final int first; + private final long oldvalue; + + private MapleBuffStat(final int buffstat) { + this.buffstat = 1 << buffstat % 32; + this.first = 3 - (int) Math.floor((double) (buffstat / 32)); + this.oldvalue = new Long((long) this.buffstat).longValue() << 32 * (this.first % 2 + 1); + } + + private MapleBuffStat(final int buffstat, final boolean stacked) { + this.buffstat = 1 << buffstat % 32; + this.first = (int) Math.floor((double) (buffstat / 32)); + this.oldvalue = new Long((long) this.buffstat).longValue() << 32 * (this.first % 2 + 1); + } + + public final long getOldValue() { + return this.oldvalue; + } + + public final int getPosition() { + return this.first; + } + + public final int getPosition(final boolean fromZero) { + if (!fromZero) { + return this.first; + } + switch (this.first) { + case 4: { + return 0; + } + case 3: { + return 1; + } + case 2: { + return 2; + } + case 1: { + return 3; + } + default: { + return 0; + } + } + } + + public final int getValue() { + return this.buffstat; + } +} diff --git a/src/client/MapleBuffStatValueHolder.java b/src/client/MapleBuffStatValueHolder.java new file mode 100644 index 0000000..2c09b93 --- /dev/null +++ b/src/client/MapleBuffStatValueHolder.java @@ -0,0 +1,25 @@ +package client; + +import java.util.concurrent.ScheduledFuture; + +import server.MapleStatEffect; + +public class MapleBuffStatValueHolder { + public MapleStatEffect effect; + public long startTime; + public int value; + public int localDuration; + public int cid; + public int skillid; + public ScheduledFuture schedule; + + public MapleBuffStatValueHolder(final MapleStatEffect effect, final long startTime, final ScheduledFuture schedule, final int value, final int localDuration, final int cid, final int skillid) { + this.effect = effect; + this.startTime = startTime; + this.schedule = schedule; + this.value = value; + this.localDuration = localDuration; + this.cid = cid; + this.skillid = skillid; + } +} diff --git a/src/client/MapleCharacter.java b/src/client/MapleCharacter.java new file mode 100644 index 0000000..2f4e0e2 --- /dev/null +++ b/src/client/MapleCharacter.java @@ -0,0 +1,11904 @@ +package client; + +import com.alibaba.fastjson.JSONObject; +import server.shops.MaplePlayerShopItem; +import client.inventory.Equip; +import gui.jyhss.jyhwpss; +import scripting.EventManager; +import server.Timer.EventTimer; +import server.maps.MapleMapEffect; +import handling.world.World.Find; +import constants.MapConstants; +import handling.world.family.MapleFamily; +import handling.world.family.MapleFamilyBuff; +import handling.world.family.MapleFamilyBuff.MapleFamilyBuffEntry; +import constants.ServerConstants.PlayerGMRank; +import handling.cashshop.CashShopServer; +import handling.login.LoginServer; +import handling.world.PlayerBuffStorage; +import handling.world.MapleMessengerCharacter; +import io.netty.channel.Channel; +import tools.MockIOSession; +import client.inventory.MapleInventoryIdentifier; +import server.maps.MapleFoothold; + +import java.util.Comparator; + +import client.inventory.MapleRing.RingComparator; +import client.inventory.Item; +import client.inventory.MapleRing; +import tools.packet.MonsterCarnivalPacket; +import tools.packet.PlayerShopPacket; +import scripting.NPCScriptManager; +import server.life.MobSkill; +import handling.world.World.Guild; +import handling.world.guild.MapleGuild; +import client.inventory.IEquip; +import server.maps.MapleMapObjectType; + +import java.sql.Statement; +import java.sql.Timestamp; +import java.util.Calendar; + +import MXDJR.RobotSocket; +import handling.world.World.Broadcast; +import tools.packet.MobPacket; +import client.inventory.ItemFlag; +import handling.world.PartyOperation; +import client.inventory.ModifyInventory; +import handling.world.World; +import handling.world.World.Family; +import gui.Start; +import server.ServerProperties; +import server.maps.FieldLimitType; +import tools.packet.MTSCSPacket; +import gui.进阶BOSS.Mushplotact; +import handling.world.MaplePartyCharacter; + +import java.util.Collections; +import java.util.Collection; + +import handling.world.PlayerBuffValueHolder; + +import java.util.Arrays; + +import tools.packet.PetPacket; + +import java.util.EnumMap; + +import tools.HexTool; + +import java.util.concurrent.RejectedExecutionException; + +import server.FishingRewardFactory.FishingReward; +import tools.packet.UIPacket; +import server.Randomizer; +import server.FishingRewardFactory; +import server.MapleInventoryManipulator; +import server.Timer.EtcTimer; +import server.Timer.MapTimer; +import server.Timer.BuffTimer; +import server.MapleStatEffect; +import server.MapleItemInformationProvider; +import tools.MaplePacketCreator; +import tools.data.MaplePacketLittleEndianWriter; +import server.life.PlayerNPC; +import database.DatabaseException; +import tools.FilePrinter; +import client.inventory.IItem; +import tools.Pair; +import client.inventory.ItemLoader; + +import java.util.Iterator; + +import server.MaplePortal; +import server.maps.MapleMapFactory; +import constants.GameConstants; + +import java.util.Map.Entry; + +import handling.world.World.Party; +import handling.world.World.Messenger; +import handling.channel.ChannelServer; +import handling.world.CharacterTransfer; + +import java.sql.ResultSet; +import java.sql.PreparedStatement; +import java.sql.Connection; +import java.sql.SQLException; + +import tools.FileoutputUtil; +import database.DBConPool; +import server.maps.SavedLocationType; + +import java.util.LinkedList; +import java.util.LinkedHashSet; + +import client.inventory.MapleInventoryType; + +import java.util.HashMap; + +import constants.WorldConstants; +import constants.ServerConfig; + +import java.util.ArrayList; + +import tools.ConcurrentEnumMap; + +import java.util.LinkedHashMap; + +import server.maps.Event_PyramidSubway; + +import java.util.concurrent.ScheduledFuture; + +import client.inventory.MapleInventory; +import scripting.EventInstanceManager; +import handling.world.family.MapleFamilyCharacter; +import handling.world.guild.MapleGuildCharacter; +import handling.world.MapleParty; +import server.shops.IMaplePlayerShop; +import handling.world.MapleMessenger; +import client.inventory.MapleMount; +import server.MapleTrade; +import server.MapleStorage; +import server.MapleShop; +import server.maps.MapleMap; +import client.anticheat.CheatTracker; +import server.MapleCarnivalParty; +import server.MapleCarnivalChallenge; + +import java.util.Deque; + +import server.CashShop; +import server.maps.MapleSummon; +import server.quest.MapleQuest; + +import java.util.Map; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +import server.maps.MapleMapObject; +import server.life.MapleMonster; + +import java.util.Set; +import java.lang.ref.WeakReference; + +import client.inventory.MaplePet; +import server.maps.MapleDoor; +import server.movement.LifeMovementFragment; + +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.awt.Point; +import java.io.Serializable; + +import server.maps.AbstractAnimatedMapleMapObject; + +public class MapleCharacter extends AbstractAnimatedMapleMapObject implements Serializable { + private static final long serialVersionUID = 845748950829L; + private String name; + private String name2; + private String chalktext; + private String BlessOfFairy_Origin; + private String charmessage; + private String prefix; + private String teleportname; + private String nowmacs; + private String loginkey; + private String serverkey; + private String clientkey; + private String accountsecondPassword; + private long lastCombo; + private long lastfametime; + private long keydown_skill; + private long lastRecoveryTime; + private long nextConsume; + private long pqStartTime; + private long lastHPTime; + private long lastMPTime; + private long lastMDTime; + private long lastStorageTime; + private long mapChangeTime; + private long mrqdTime; + private byte dojoRecord; + private byte gmLevel; + private byte gender; + private byte initialSpawnPoint; + private byte skinColor; + private byte guildrank; + private byte allianceRank; + private byte world; + private byte fairyExp; + private byte numClones; + private byte subcategory; + private byte fairyHour; + private short level; + private short mulung_energy; + private short availableCP; + private short totalCP; + private short fame; + private short hpmpApUsed; + private short job; + private short remainingAp; + private int accountid; + private int id; + private int meso; + private long exp; + private int hair; + private int face; + private int mapid; + private int bookCover; + private int dojo; + private int guildid; + private int fallcounter; + private int maplepoints; + private int chair; + private int itemEffect; + private int vpoints; + private int rank; + private int rankMove; + private int jobRank; + private int jobRankMove; + private int marriageId; + private int marriageItemId; + private int currentrep; + private int totalrep; + private int linkMid; + private int coconutteam; + private int followid; + private int battleshipHP; + private int expression; + private int constellation; + private int blood; + private int month; + private int day; + private int beans; + private int beansNum; + private int beansRange; + private int gachexp; + private int combo; + private int MSG; + private int 打怪; + private int 吸怪; + private int FLY_吸怪; + private int vip; + private int CsMod; + private int skillzq; + private Point old; + private boolean smega; + private boolean gashponmega; + private boolean hidden; + private boolean hasSummon; + private boolean 精灵商人购买开关; + private boolean 玩家私聊开关; + private boolean 玩家密语开关; + private boolean 好友聊天开关; + private boolean 队伍聊天开关; + private boolean 公会聊天开关; + private boolean 联盟聊天开关; + private boolean GM吸怪讯息开关; + private boolean canSetBeansNum; + private boolean Vip_Medal; + private boolean auto吸怪; + private boolean DebugMessage; + private boolean itemVacs; + private boolean mobVacs; + private boolean beansStart; + private int[] wishlist; + private int[] rocks; + private int[] savedLocations; + private int[] regrocks; + private int[] remainingSp; + private int[] savedHairs; + private int[] savedFaces; + private transient AtomicInteger inst; + + private List lastmonthfameids; + private List doors; + private List pets; + private long limitBreak; + private int reinNumber; + private boolean petAutoFood; + private MapleClient c; + private transient WeakReference[] clones; + private transient Set controlled; + private transient Set visibleMapObjects; + private transient ReentrantReadWriteLock visibleMapObjectsLock; + private final Map quests; + private Map questinfo; + private final Map skills; + private final transient Map effects; + private final transient Map skillID; + private transient Map summons; + private final transient Map coolDowns; + private final transient Map diseases; + private CashShop cs; + private transient Deque pendingCarnivalRequests; + private transient MapleCarnivalParty carnivalParty; + private BuddyList buddylist; + private MonsterBook monsterbook; + private transient CheatTracker anticheat; + private transient MapleLieDetector antiMacro; + private MapleClient client; + private PlayerStats stats; + private transient PlayerRandomStream CRand; + private transient MapleMap map; + private transient MapleShop shop; + private transient RockPaperScissors rps; + private MapleStorage storage; + private transient MapleTrade trade; + private MapleMount mount; + private final List finishedAchievements; + private MapleMessenger messenger; + private byte[] petStore; + private transient IMaplePlayerShop playerShop; + private MapleParty party; + private boolean invincible; + private boolean canTalk; + private boolean clone; + private boolean followinitiator; + private boolean followon; + private MapleGuildCharacter mgc; + private MapleFamilyCharacter mfc; + private transient EventInstanceManager eventInstance; + private MapleInventory[] inventory; + private SkillMacro[] skillMacros; + private MapleKeyLayout keylayout; + private ItemVac ItemVac; + private MobVac MobVac; + public final int maxLevel; + private int 刷钱模式; + public final int maxLevel1; + private transient ScheduledFuture beholderHealingSchedule; + private transient ScheduledFuture beholderBuffSchedule; + private transient ScheduledFuture BerserkSchedule; + private transient ScheduledFuture dragonBloodSchedule; + private transient ScheduledFuture fairySchedule; + private transient ScheduledFuture mapTimeLimitTask; + private transient ScheduledFuture fishing; + private transient Event_PyramidSubway pyramidSubway; + private transient List pendingExpiration; + private transient List pendingSkills; + private final transient Map movedMobs; + public long 整理背包冷却; + public long 集合背包冷却; + private boolean stopMoving; + private double 套装伤害加成; + private int clonedamgerate; + public int jyhbh; + private int 副本地图; + private boolean 吸怪状态; + private List lastres; + + private MapleCharacter(final boolean ChannelServer) { + this.teleportname = ""; + this.nowmacs = ""; + this.吸怪状态 = false; + this.nextConsume = 0L; + this.pqStartTime = 0L; + this.guildrank = 5; + this.allianceRank = 5; + this.fairyExp = 30; + this.fairyHour = 1; + this.guildid = 0; + this.fallcounter = 0; + this.rank = 1; + this.rankMove = 0; + this.jobRank = 1; + this.jobRankMove = 0; + this.marriageItemId = 0; + this.linkMid = 0; + this.coconutteam = 0; + this.followid = 0; + this.battleshipHP = 0; + this.MSG = 0; + this.打怪 = 0; + this.吸怪 = 0; + this.FLY_吸怪 = 0; + this.CsMod = 0; + this.skillzq = 0; + this.old = new Point(0, 0); + this.smega = true; + this.gashponmega = true; + this.hasSummon = false; + this.精灵商人购买开关 = false; + this.玩家私聊开关 = false; + this.玩家密语开关 = false; + this.好友聊天开关 = false; + this.队伍聊天开关 = false; + this.公会聊天开关 = false; + this.联盟聊天开关 = false; + this.GM吸怪讯息开关 = false; + this.canSetBeansNum = false; + this.Vip_Medal = true; + this.auto吸怪 = false; + this.DebugMessage = false; + this.itemVacs = false; + this.mobVacs = false; + this.beansStart = false; + this.remainingSp = new int[10]; + this.savedHairs = new int[6]; + this.savedFaces = new int[6]; + this.skills = (Map) new LinkedHashMap(); + this.effects = new ConcurrentEnumMap(MapleBuffStat.class); + this.skillID = (Map) new LinkedHashMap(); + this.coolDowns = (Map) new LinkedHashMap(); + this.diseases = new ConcurrentEnumMap(MapleDisease.class); + this.finishedAchievements = (List) new ArrayList(); + this.invincible = false; + this.canTalk = true; + this.clone = false; + this.followinitiator = false; + this.followon = false; + this.skillMacros = new SkillMacro[5]; + this.maxLevel = ServerConfig.maxLevel; + this.刷钱模式 = 0; + this.maxLevel1 = WorldConstants.maxLevel; + this.pyramidSubway = null; + this.pendingExpiration = null; + this.pendingSkills = null; + this.movedMobs = (Map) new HashMap(); + this.整理背包冷却 = 0L; + this.集合背包冷却 = 0L; + this.clonedamgerate = 0; + this.jyhbh = -1; + this.setStance(this.副本地图 = 0); + this.setPosition(new Point(0, 0)); + this.inventory = new MapleInventory[MapleInventoryType.values().length]; + for (final MapleInventoryType type : MapleInventoryType.values()) { + this.inventory[type.ordinal()] = new MapleInventory(type); + } + this.quests = new LinkedHashMap(); + this.stats = new PlayerStats(this); + for (int i = 0; i < this.remainingSp.length; ++i) { + this.remainingSp[i] = 0; + } + for (int i = 0; i < this.savedHairs.length; ++i) { + this.savedHairs[i] = -1; + } + for (int i = 0; i < this.savedFaces.length; ++i) { + this.savedFaces[i] = -1; + } + if (ChannelServer) { + this.lastCombo = 0L; + this.mulung_energy = 0; + this.combo = 0; + this.keydown_skill = 0L; + this.lastHPTime = 0L; + this.lastMPTime = 0L; + this.mapChangeTime = 0L; + this.lastRecoveryTime = 0L; + this.petStore = new byte[3]; + for (int i = 0; i < this.petStore.length; ++i) { + this.petStore[i] = -1; + } + this.wishlist = new int[10]; + this.rocks = new int[10]; + this.regrocks = new int[5]; + this.clones = (WeakReference[]) new WeakReference[25]; + for (int i = 0; i < this.clones.length; ++i) { + this.clones[i] = new WeakReference(null); + } + (this.inst = new AtomicInteger()).set(0); + this.keylayout = new MapleKeyLayout(); + this.doors = new ArrayList(); + this.controlled = new LinkedHashSet(); + this.summons = new LinkedHashMap(); + this.visibleMapObjects = new LinkedHashSet(); + this.visibleMapObjectsLock = new ReentrantReadWriteLock(); + this.pendingCarnivalRequests = new LinkedList(); + this.savedLocations = new int[SavedLocationType.values().length]; + for (int i = 0; i < SavedLocationType.values().length; ++i) { + this.savedLocations[i] = -1; + } + this.questinfo = new LinkedHashMap(); + this.anticheat = new CheatTracker(this); + this.pets = new ArrayList(); + } + } + + public static MapleCharacter getDefault(final MapleClient client, final int type) { + final MapleCharacter ret = new MapleCharacter(false); + ret.client = client; + ret.map = null; + ret.exp = 0; + ret.gmLevel = 0; + ret.job = (short) ((type == 1) ? 0 : ((type == 0) ? 1000 : ((type == 3) ? 2001 : ((type == 4) ? 3000 : 2000)))); + ret.beans = 0; + ret.meso = 0; + ret.level = 1; + ret.remainingAp = 0; + ret.fame = 0; + ret.accountid = client.getAccID(); + ret.buddylist = new BuddyList((byte) 20); + ret.stats.str = 12; + ret.stats.dex = 5; + ret.stats.int_ = 4; + ret.stats.luk = 4; + ret.stats.maxhp = 50; + ret.stats.hp = 50; + ret.stats.maxmp = 50; + ret.stats.mp = 50; + ret.prefix = ""; + ret.gachexp = 0; + ret.limitBreak = 199999L; + ret.reinNumber = 0; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("SELECT name, 2ndpassword, mPoints, vpoints, VIP, loginkey, serverkey, clientkey FROM accounts WHERE id = ?"); + ps.setInt(1, ret.accountid); + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + ret.client.setAccountName(rs.getString("name")); + ret.accountsecondPassword = rs.getString("2ndpassword"); + ret.maplepoints = rs.getInt("mPoints"); + ret.vpoints = rs.getInt("vpoints"); + ret.vip = rs.getInt("VIP"); + ret.loginkey = rs.getString("loginkey"); + ret.serverkey = rs.getString("serverkey"); + ret.clientkey = rs.getString("clientkey"); + } + rs.close(); + } + ps.close(); + con.close(); + } catch (SQLException e) { + System.err.println("Error getting character default" + e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + return ret; + } + + public static final MapleCharacter ReconstructChr(final CharacterTransfer ct, final MapleClient client, final boolean isChannel) { + final MapleCharacter ret = new MapleCharacter(true); + ret.client = client; + if (!isChannel) { + ret.client.setChannel((int) ct.channel); + } + ret.nowmacs = ct.nowmacs; + ret.canTalk = ct.canTalk; + ret.DebugMessage = ct.DebugMessage; + ret.auto吸怪 = ct.auto吸怪; + ret.GM吸怪讯息开关 = ct.GM吸怪讯息开关; + ret.Vip_Medal = ct.Vip_Medal; + ret.精灵商人购买开关 = ct.精灵商人购买开关; + ret.玩家私聊开关 = ct.玩家私聊开关; + ret.玩家密语开关 = ct.玩家密语开关; + ret.好友聊天开关 = ct.好友聊天开关; + ret.队伍聊天开关 = ct.队伍聊天开关; + ret.公会聊天开关 = ct.公会聊天开关; + ret.联盟聊天开关 = ct.联盟聊天开关; + ret.smega = ct.smega; + ret.gashponmega = ct.gashponmega; + ret.id = ct.characterid; + ret.name = ct.name; + ret.level = ct.level; + ret.fame = ct.fame; + ret.CRand = new PlayerRandomStream(); + ret.stats.str = ct.str; + ret.stats.dex = ct.dex; + ret.stats.int_ = ct.int_; + ret.stats.luk = ct.luk; + ret.stats.maxhp = ct.maxhp; + ret.stats.maxmp = ct.maxmp; + ret.stats.hp = ct.hp; + ret.stats.mp = ct.mp; + ret.chalktext = ct.chalkboard; + ret.exp = ((ret.level >= ret.maxLevel) ? 0 : ct.exp); + ret.hpmpApUsed = ct.hpApUsed; + ret.remainingSp = ct.remainingSp; + ret.remainingAp = ct.remainingAp; + ret.savedHairs = ct.savedHairs; + ret.savedFaces = ct.savedFaces; + ret.beans = ct.beans; + ret.meso = ct.meso; + ret.gmLevel = ct.gmLevel; + ret.skinColor = ct.skinColor; + ret.gender = ct.gender; + ret.job = ct.job; + ret.hair = ct.hair; + ret.face = ct.face; + ret.accountid = ct.accountid; + ret.mapid = ct.mapid; + ret.initialSpawnPoint = ct.initialSpawnPoint; + ret.limitBreak = ct.limitBreak; + ret.reinNumber = ct.reinNumber; + ret.world = ct.world; + ret.bookCover = ct.mBookCover; + ret.dojo = ct.dojo; + ret.dojoRecord = ct.dojoRecord; + ret.guildid = ct.guildid; + ret.guildrank = ct.guildrank; + ret.allianceRank = ct.alliancerank; + ret.CsMod = ct.CsMod; + ret.vpoints = ct.vpoints; + ret.vip = ct.vip; + ret.mrqdTime = ct.mrqdTime; + ret.fairyExp = ct.fairyExp; + ret.marriageId = ct.marriageId; + ret.currentrep = ct.currentrep; + ret.totalrep = ct.totalrep; + ret.charmessage = ct.charmessage; + ret.expression = ct.expression; + ret.constellation = ct.constellation; + ret.blood = ct.blood; + ret.month = ct.month; + ret.day = ct.day; + ret.gachexp = ct.gachexp; + ret.makeMFC(ct.familyid, ct.seniorid, ct.junior1, ct.junior2); + if (ret.guildid > 0) { + ret.mgc = new MapleGuildCharacter(ret); + } + ret.buddylist = new BuddyList(ct.buddysize); + ret.subcategory = ct.subcategory; + ret.prefix = ct.prefix; + if (isChannel) { + final MapleMapFactory mapFactory = ChannelServer.getInstance(client.getChannel()).getMapFactory(); + ret.map = mapFactory.getMap(ret.mapid); + if (ret.map != null) { + if (ret.mapid == 801000110 || ret.mapid == 801000210) { + ret.map = mapFactory.getMap(801000000); + } + if (ret.mapid >= 211060000 && ret.mapid <= 211070200) { + ret.map = mapFactory.getMap(211060000); + } + } + if (ret.map == null) { + ret.map = mapFactory.getMap(100000000); + } else if (ret.map.getForcedReturnId() != 999999999) { + ret.map = ret.map.getForcedReturnMap(); + } + MaplePortal portal = ret.map.getPortal((int) ret.initialSpawnPoint); + if (portal == null) { + portal = ret.map.getPortal(0); + ret.initialSpawnPoint = 0; + } + ret.setPosition(portal.getPosition()); + final int messengerid = ct.messengerid; + if (messengerid > 0) { + ret.messenger = Messenger.getMessenger(messengerid); + } + } else { + ret.messenger = null; + } + final int partyid = ct.partyid; + if (partyid >= 0) { + final MapleParty party = Party.getParty(partyid); + if (party != null && party.getMemberById(ret.id) != null) { + ret.party = party; + } + } + for (final Entry qs : ct.Quest.entrySet()) { + final MapleQuest quest = MapleQuest.getInstance(((Integer) qs.getKey()).intValue()); + final MapleQuestStatus queststatus_from = (MapleQuestStatus) qs.getValue(); + final MapleQuestStatus queststatus = new MapleQuestStatus(quest, (int) queststatus_from.getStatus()); + queststatus.setForfeited(queststatus_from.getForfeited()); + queststatus.setCustomData(queststatus_from.getCustomData()); + queststatus.setCompletionTime(queststatus_from.getCompletionTime()); + if (queststatus_from.getMobKills() != null) { + for (final Entry mobkills : queststatus_from.getMobKills().entrySet()) { + queststatus.setMobKills(((Integer) mobkills.getKey()).intValue(), ((Integer) mobkills.getValue()).intValue()); + } + } + ret.quests.put(quest, queststatus); + } + for (final Entry qs2 : ct.Skills.entrySet()) { + ret.skills.put(SkillFactory.getSkill(((Integer) qs2.getKey()).intValue()), qs2.getValue()); + } + for (final Integer zz : ct.finishedAchievements) { + ret.finishedAchievements.add(zz); + } + ret.monsterbook = new MonsterBook(ct.mbook); + ret.inventory = (MapleInventory[]) (MapleInventory[]) ct.inventorys; + ret.BlessOfFairy_Origin = ct.BlessOfFairy; + ret.skillMacros = (SkillMacro[]) (SkillMacro[]) ct.skillmacro; + ret.petStore = ct.petStore; + ret.keylayout = new MapleKeyLayout(ct.keymap); + ret.questinfo = ct.InfoQuest; + ret.savedLocations = ct.savedlocation; + ret.wishlist = ct.wishlist; + ret.rocks = ct.rocks; + ret.regrocks = ct.regrocks; + ret.buddylist.loadFromTransfer(ct.buddies); + ret.keydown_skill = 0L; + ret.lastfametime = ct.lastfametime; + ret.lastmonthfameids = ct.famedcharacters; + ret.storage = (MapleStorage) ct.storage; + ret.cs = (CashShop) ct.cs; + client.setAccountName(ct.accountname); + ret.maplepoints = ct.MaplePoints; + ret.accountsecondPassword = ct.accountsecondPassword; + ret.loginkey = ct.loginkey; + ret.serverkey = ct.serverkey; + ret.clientkey = ct.clientkey; + ret.antiMacro = (MapleLieDetector) ct.antiMacro; + ret.numClones = ct.clonez; + ret.mount = new MapleMount(ret, ct.mount_itemid, GameConstants.isKOC((int) ret.job) ? 10001004 : (GameConstants.isAran((int) ret.job) ? 20001004 : 1004), ct.mount_Fatigue, ct.mount_level, ct.mount_exp); + ret.stats.recalcLocalStats(true); + return ret; + } + + public static MapleCharacter loadCharFromDB(final int charid, final MapleClient client, final boolean channelserver) { + final MapleCharacter ret = new MapleCharacter(channelserver); + ret.client = client; + ret.id = charid; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = null; + ResultSet rs = null; + try { + ps = con.prepareStatement("SELECT * FROM characters WHERE id = ?"); + ps.setInt(1, charid); + rs = ps.executeQuery(); + if (!rs.next()) { + throw new RuntimeException("Loading the Char Failed (char not found)"); + } + ret.Vip_Medal = (rs.getShort("VipMedal") > 0); + ret.name = rs.getString("name"); + ret.level = rs.getShort("level"); + ret.fame = rs.getShort("fame"); + ret.stats.str = rs.getShort("str"); + ret.stats.dex = rs.getShort("dex"); + ret.stats.int_ = rs.getShort("int"); + ret.stats.luk = rs.getShort("luk"); + ret.stats.maxhp = rs.getShort("maxhp"); + ret.stats.maxmp = rs.getShort("maxmp"); + ret.stats.hp = rs.getShort("hp"); + ret.stats.mp = rs.getShort("mp"); + ret.exp = ((ret.level >= ret.maxLevel) ? 0 : rs.getInt("exp")); + ret.hpmpApUsed = rs.getShort("hpApUsed"); + final String[] sp = rs.getString("sp").split(","); + for (int i = 0; i < ret.remainingSp.length; ++i) { + ret.remainingSp[i] = Integer.parseInt(sp[i]); + } + final String[] saves_faces = rs.getString("saved_faces").split(","); + for (int j = 0; j < ret.savedFaces.length; ++j) { + ret.savedFaces[j] = Integer.parseInt(saves_faces[j]); + } + final String[] saves_hairs = rs.getString("saved_hairs").split(","); + for (int k = 0; k < ret.savedHairs.length; ++k) { + ret.savedHairs[k] = Integer.parseInt(saves_hairs[k]); + } + ret.remainingAp = rs.getShort("ap"); + ret.beans = rs.getInt("beans"); + ret.meso = rs.getInt("meso"); + ret.gmLevel = rs.getByte("gm"); + ret.skinColor = rs.getByte("skincolor"); + ret.gender = rs.getByte("gender"); + ret.job = rs.getShort("job"); + ret.hair = rs.getInt("hair"); + ret.face = rs.getInt("face"); + ret.accountid = rs.getInt("accountid"); + ret.mapid = rs.getInt("map"); + ret.initialSpawnPoint = rs.getByte("spawnpoint"); + ret.world = rs.getByte("world"); + ret.guildid = rs.getInt("guildid"); + ret.guildrank = rs.getByte("guildrank"); + ret.allianceRank = rs.getByte("allianceRank"); + ret.currentrep = rs.getInt("currentrep"); + ret.totalrep = rs.getInt("totalrep"); + ret.makeMFC(rs.getInt("familyid"), rs.getInt("seniorid"), rs.getInt("junior1"), rs.getInt("junior2")); + if (ret.guildid > 0) { + ret.mgc = new MapleGuildCharacter(ret); + } + ret.buddylist = new BuddyList(rs.getByte("buddyCapacity")); + ret.subcategory = rs.getByte("subcategory"); + ret.mount = new MapleMount(ret, 0, (ret.job > 1000 && ret.job < 2000) ? 10001004 : ((ret.job >= 2000) ? ((ret.job == 2001 || (ret.job >= 2200 && ret.job <= 2218)) ? 20011004 : ((ret.job >= 3000) ? 30001004 : 20001004)) : 1004), (byte) 0, (byte) 1, 0); + ret.rank = rs.getInt("rank"); + ret.rankMove = rs.getInt("rankMove"); + ret.jobRank = rs.getInt("jobRank"); + ret.jobRankMove = rs.getInt("jobRankMove"); + ret.marriageId = rs.getInt("marriageId"); + ret.charmessage = rs.getString("charmessage"); + ret.expression = rs.getInt("expression"); + ret.constellation = rs.getInt("constellation"); + ret.blood = rs.getInt("blood"); + ret.month = rs.getInt("month"); + ret.day = rs.getInt("day"); + ret.prefix = rs.getString("prefix"); + ret.gachexp = rs.getInt("gachexp"); + ret.limitBreak = rs.getLong("limitBreak"); + ret.reinNumber = rs.getInt("reinNumber"); + if (channelserver) { + final MapleMapFactory mapFactory = ChannelServer.getInstance(client.getChannel()).getMapFactory(); + ret.antiMacro = new MapleLieDetector(ret.id); + ret.map = mapFactory.getMap(ret.mapid); + if (ret.mapid == 801000210) { + ret.map = mapFactory.getMap(801000000); + } + if (ret.mapid == 801000110) { + ret.map = mapFactory.getMap(801000000); + } + if (ret.map == null) { + ret.map = mapFactory.getMap(100000000); + } + MaplePortal portal = ret.map.getPortal((int) ret.initialSpawnPoint); + if (portal == null) { + portal = ret.map.getPortal(0); + ret.initialSpawnPoint = 0; + } + ret.setPosition(portal.getPosition()); + final int partyid = rs.getInt("party"); + if (partyid >= 0) { + final MapleParty party = Party.getParty(partyid); + if (party != null && party.getMemberById(ret.id) != null) { + ret.party = party; + } + } + ret.bookCover = rs.getInt("monsterbookcover"); + ret.dojo = rs.getInt("dojo_pts"); + ret.dojoRecord = rs.getByte("dojoRecord"); + final String[] pets = rs.getString("pets").split(","); + for (int l = 0; l < ret.petStore.length; ++l) { + ret.petStore[l] = Byte.parseByte(pets[l]); + } + rs.close(); + ps.close(); + ps = con.prepareStatement("SELECT achievementid FROM achievements WHERE accountid = ?"); + ps.setInt(1, ret.accountid); + rs = ps.executeQuery(); + while (rs.next()) { + ret.finishedAchievements.add(Integer.valueOf(rs.getInt("achievementid"))); + } + } + rs.close(); + ps.close(); + boolean compensate_previousEvans = false; + ps = con.prepareStatement("SELECT * FROM queststatus WHERE characterid = ?"); + ps.setInt(1, charid); + rs = ps.executeQuery(); + final PreparedStatement pse = con.prepareStatement("SELECT * FROM queststatusmobs WHERE queststatusid = ?"); + while (rs.next()) { + final int id = rs.getInt("quest"); + if (id == 170000) { + compensate_previousEvans = true; + } + final MapleQuest q = MapleQuest.getInstance(id); + final MapleQuestStatus status = new MapleQuestStatus(q, (int) rs.getByte("status")); + final long cTime = rs.getLong("time"); + if (cTime > -1L) { + status.setCompletionTime(cTime * 1000L); + } + status.setForfeited(rs.getInt("forfeited")); + status.setCustomData(rs.getString("customData")); + ret.quests.put(q, status); + pse.setLong(1, rs.getLong("queststatusid")); + try (final ResultSet rsMobs = pse.executeQuery()) { + while (rsMobs.next()) { + status.setMobKills(rsMobs.getInt("mob"), rsMobs.getInt("count")); + } + rsMobs.close(); + } + } + rs.close(); + ps.close(); + pse.close(); + if (channelserver) { + ret.CRand = new PlayerRandomStream(); + ret.monsterbook = MonsterBook.loadCards(charid); + ps = con.prepareStatement("SELECT * FROM inventoryslot where characterid = ?"); + ps.setInt(1, charid); + rs = ps.executeQuery(); + if (!rs.next()) { + throw new RuntimeException("No Inventory slot column found in SQL. [inventoryslot]"); + } + ret.getInventory(MapleInventoryType.EQUIP).setSlotLimit(rs.getByte("equip")); + ret.getInventory(MapleInventoryType.USE).setSlotLimit(rs.getByte("use")); + ret.getInventory(MapleInventoryType.SETUP).setSlotLimit(rs.getByte("setup")); + ret.getInventory(MapleInventoryType.ETC).setSlotLimit(rs.getByte("etc")); + ret.getInventory(MapleInventoryType.CASH).setSlotLimit(rs.getByte("cash")); + ps.close(); + rs.close(); + for (final Pair mit : ItemLoader.INVENTORY.loadItems(false, Integer.valueOf(charid)).values()) { + ret.getInventory((MapleInventoryType) mit.getRight()).addFromDB((IItem) mit.getLeft()); + if (((IItem) mit.getLeft()).getPet() != null) { + ret.pets.add(((IItem) mit.getLeft()).getPet()); + } + } + ps = con.prepareStatement("SELECT name, 2ndpassword, mPoints, vpoints, VIP, loginkey, serverkey, clientkey FROM accounts WHERE id = ?"); + ps.setInt(1, ret.accountid); + rs = ps.executeQuery(); + if (rs.next()) { + ret.getClient().setAccountName(rs.getString("name")); + ret.accountsecondPassword = rs.getString("2ndpassword"); + ret.maplepoints = rs.getInt("mPoints"); + ret.vpoints = rs.getInt("vpoints"); + ret.vip = rs.getInt("VIP"); + ret.loginkey = rs.getString("loginkey"); + ret.serverkey = rs.getString("serverkey"); + ret.clientkey = rs.getString("clientkey"); + } else { + rs.close(); + } + ps.close(); + ps = con.prepareStatement("SELECT quest, customData FROM questinfo WHERE characterid = ?"); + ps.setInt(1, charid); + rs = ps.executeQuery(); + while (rs.next()) { + ret.questinfo.put(Integer.valueOf(rs.getInt("quest")), rs.getString("customData")); + } + rs.close(); + ps.close(); + ps = con.prepareStatement("SELECT skillid, skilllevel, masterlevel, expiration FROM skills WHERE characterid = ?"); + ps.setInt(1, charid); + rs = ps.executeQuery(); + while (rs.next()) { + final ISkill skil = SkillFactory.getSkill(rs.getInt("skillid")); + if (skil != null && GameConstants.isApplicableSkill(rs.getInt("skillid")) && rs.getByte("skilllevel") >= 0) { + ret.skills.put(skil, new SkillEntry(rs.getByte("skilllevel"), rs.getByte("masterlevel"), rs.getLong("expiration"))); + } else { + if (skil != null) { + continue; + } + final int[] remainingSp = ret.remainingSp; + final int skillBookForSkill = GameConstants.getSkillBookForSkill(rs.getInt("skillid")); + remainingSp[skillBookForSkill] += rs.getByte("skilllevel"); + } + } + rs.close(); + ps.close(); + ret.expirationTask(false); + ps = con.prepareStatement("SELECT id, name, level FROM characters WHERE accountid = ? ORDER BY level DESC"); + ps.setInt(1, ret.accountid); + rs = ps.executeQuery(); + byte maxlevel_ = 0; + while (rs.next()) { + if (rs.getInt("id") != charid) { + byte maxlevel = (byte) (rs.getShort("level") / 10); + if (maxlevel > 20) { + maxlevel = 20; + } + if (maxlevel <= maxlevel_) { + continue; + } + maxlevel_ = maxlevel; + ret.BlessOfFairy_Origin = rs.getString("name"); + } else { + if (charid >= 17000 || compensate_previousEvans || ret.job < 2200 || ret.job > 2218) { + continue; + } + for (int m = 0; m <= GameConstants.getSkillBook((int) ret.job); ++m) { + final int[] remainingSp2 = ret.remainingSp; + final int n = m; + remainingSp2[n] += 2; + } + ret.setQuestAdd(MapleQuest.getInstance(170000), (byte) 0, null); + } + } + ret.skills.put(SkillFactory.getSkill(GameConstants.getBofForJob((int) ret.job)), new SkillEntry(maxlevel_, (byte) 0, -1L)); + ps.close(); + rs.close(); + ps = con.prepareStatement("SELECT * FROM skillmacros WHERE characterid = ?"); + ps.setInt(1, charid); + rs = ps.executeQuery(); + while (rs.next()) { + final int position = rs.getInt("position"); + final SkillMacro macro = new SkillMacro(rs.getInt("skill1"), rs.getInt("skill2"), rs.getInt("skill3"), rs.getString("name"), rs.getInt("shout"), position); + ret.skillMacros[position] = macro; + } + rs.close(); + ps.close(); + ps = con.prepareStatement("SELECT `key`,`type`,`action` FROM keymap WHERE characterid = ?"); + ps.setInt(1, charid); + rs = ps.executeQuery(); + final Map> keyb = ret.keylayout.Layout(); + while (rs.next()) { + keyb.put(Integer.valueOf(rs.getInt("key")), new Pair(Byte.valueOf(rs.getByte("type")), Integer.valueOf(rs.getInt("action")))); + } + rs.close(); + ps.close(); + ps = con.prepareStatement("SELECT `locationtype`,`map` FROM savedlocations WHERE characterid = ?"); + ps.setInt(1, charid); + rs = ps.executeQuery(); + while (rs.next()) { + ret.savedLocations[rs.getInt("locationtype")] = rs.getInt("map"); + } + rs.close(); + ps.close(); + ps = con.prepareStatement("SELECT `characterid_to`,`when` FROM famelog WHERE characterid = ? AND DATEDIFF(NOW(),`when`) < 30"); + ps.setInt(1, charid); + rs = ps.executeQuery(); + ret.lastfametime = 0L; + ret.lastmonthfameids = (List) new ArrayList(31); + while (rs.next()) { + ret.lastfametime = Math.max(ret.lastfametime, rs.getTimestamp("when").getTime()); + ret.lastmonthfameids.add(Integer.valueOf(rs.getInt("characterid_to"))); + } + rs.close(); + ps.close(); + ret.buddylist.loadFromDb(charid); + ret.storage = MapleStorage.loadStorage(ret.accountid); + ret.cs = new CashShop(ret.accountid, charid, (int) ret.getJob()); + ps = con.prepareStatement("SELECT sn FROM wishlist WHERE characterid = ?"); + ps.setInt(1, charid); + rs = ps.executeQuery(); + int i2 = 0; + while (rs.next()) { + ret.wishlist[i2] = rs.getInt("sn"); + ++i2; + } + while (i2 < 10) { + ret.wishlist[i2] = 0; + ++i2; + } + rs.close(); + ps.close(); + ps = con.prepareStatement("SELECT mapid FROM trocklocations WHERE characterid = ?"); + ps.setInt(1, charid); + rs = ps.executeQuery(); + int r = 0; + while (rs.next()) { + ret.rocks[r] = rs.getInt("mapid"); + ++r; + } + while (r < 10) { + ret.rocks[r] = 999999999; + ++r; + } + rs.close(); + ps.close(); + ps = con.prepareStatement("SELECT mapid FROM regrocklocations WHERE characterid = ?"); + ps.setInt(1, charid); + rs = ps.executeQuery(); + r = 0; + while (rs.next()) { + ret.regrocks[r] = rs.getInt("mapid"); + ++r; + } + while (r < 5) { + ret.regrocks[r] = 999999999; + ++r; + } + rs.close(); + ps.close(); + ps = con.prepareStatement("SELECT * FROM mountdata WHERE characterid = ?"); + ps.setInt(1, charid); + rs = ps.executeQuery(); + if (!rs.next()) { + throw new RuntimeException("No mount data found on SQL column"); + } + final IItem mount = ret.getInventory(MapleInventoryType.EQUIPPED).getItem((short) (-18)); + ret.mount = new MapleMount(ret, (mount != null) ? mount.getItemId() : 0, (ret.job > 1000 && ret.job < 2000) ? 10001004 : ((ret.job >= 2000) ? ((ret.job == 2001 || ret.job >= 2200) ? 20011004 : ((ret.job >= 3000) ? 30001004 : 20001004)) : 1004), rs.getByte("Fatigue"), rs.getByte("Level"), rs.getInt("Exp")); + ps.close(); + rs.close(); + ret.stats.recalcLocalStats(true); + } else { + for (final Pair mit : ItemLoader.INVENTORY.loadItems(true, Integer.valueOf(charid)).values()) { + ret.getInventory((MapleInventoryType) mit.getRight()).addFromDB((IItem) mit.getLeft()); + } + } + } catch (SQLException ess) { + ess.printStackTrace(); + FileoutputUtil.outError("logs/读取MapleCharacter.txt", (Throwable) ess); + FilePrinter.printError("MapleCharacter.txt", (Throwable) ess, "载入角色失败.."); + try { + if (ps != null) { + ps.close(); + } + if (rs != null) { + rs.close(); + } + } catch (SQLException ignore) { + ignore.printStackTrace(); + FileoutputUtil.outError("logs/读取MapleCharacter.txt", (Throwable) ignore); + FilePrinter.printError("MapleCharacter.txt", (Throwable) ignore, "载入角色失败.."); + } + } finally { + try { + if (ps != null) { + ps.close(); + } + if (rs != null) { + rs.close(); + } + } catch (SQLException ignore2) { + ignore2.printStackTrace(); + FileoutputUtil.outError("logs/读取MapleCharacter.txt", (Throwable) ignore2); + FilePrinter.printError("MapleCharacter.txt", (Throwable) ignore2, "载入角色失败.."); + } + } + } catch (SQLException exxx) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) exxx); + } + return ret; + } + + public static void saveNewCharToDB(final MapleCharacter chr, final int type, final boolean db) { + Connection con = null; + PreparedStatement ps = null; + PreparedStatement pse = null; + ResultSet rs = null; + try { + con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + con.setTransactionIsolation(1); + con.setAutoCommit(false); + ps = con.prepareStatement("INSERT INTO characters (level, fame, str, dex, luk, `int`, exp, hp, mp, maxhp, maxmp, sp, ap, gm, skincolor, gender, job, hair, face, map, meso, hpApUsed, spawnpoint, party, buddyCapacity, monsterbookcover, dojo_pts, dojoRecord, pets, subcategory, marriageId, currentrep, totalrep, prefix, accountid, name, world, VipMedal,limitBreak,reinNumber) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", 1); + ps.setInt(1, 1); + ps.setShort(2, (short) 0); + final PlayerStats stat = chr.stats; + ps.setShort(3, stat.getStr()); + ps.setShort(4, stat.getDex()); + ps.setShort(5, stat.getInt()); + ps.setShort(6, stat.getLuk()); + ps.setInt(7, 0); + ps.setShort(8, stat.getHp()); + ps.setShort(9, stat.getMp()); + ps.setShort(10, stat.getMaxHp()); + ps.setShort(11, stat.getMaxMp()); + ps.setString(12, "0,0,0,0,0,0,0,0,0,0"); + ps.setShort(13, (short) 0); + ps.setByte(14, (byte) 0); + ps.setByte(15, chr.skinColor); + ps.setByte(16, chr.gender); + ps.setShort(17, chr.job); + ps.setInt(18, chr.hair); + ps.setInt(19, chr.face); + ps.setInt(20, (type == 1) ? 0 : ((type == 0) ? 130030000 : ((type == 3) ? 900090000 : 914000000))); + ps.setInt(21, chr.meso); + ps.setShort(22, (short) 0); + ps.setByte(23, (byte) 0); + ps.setInt(24, -1); + ps.setByte(25, chr.buddylist.getCapacity()); + ps.setInt(26, 0); + ps.setInt(27, 0); + ps.setInt(28, 0); + ps.setString(29, "-1,-1,-1"); + ps.setInt(30, 0); + ps.setInt(31, 0); + ps.setInt(32, 0); + ps.setInt(33, 0); + ps.setString(34, chr.prefix); + ps.setInt(35, chr.getAccountID()); + ps.setString(36, chr.name); + ps.setByte(37, chr.world); + ps.setInt(38, (int) (chr.Vip_Medal ? 1 : 0)); + ps.setLong(39, chr.limitBreak); + ps.setInt(40, chr.reinNumber); + ps.executeUpdate(); + rs = ps.getGeneratedKeys(); + if (!rs.next()) { + throw new DatabaseException("Inserting char failed."); + } + chr.id = rs.getInt(1); + ps.close(); + rs.close(); + ps = con.prepareStatement("INSERT INTO queststatus (`queststatusid`, `characterid`, `quest`, `status`, `time`, `forfeited`, `customData`) VALUES (DEFAULT, ?, ?, ?, ?, ?, ?)", 1); + pse = con.prepareStatement("INSERT INTO queststatusmobs VALUES (DEFAULT, ?, ?, ?)"); + ps.setInt(1, chr.id); + for (final MapleQuestStatus q : chr.quests.values()) { + ps.setInt(2, q.getQuest().getId()); + ps.setInt(3, (int) q.getStatus()); + ps.setInt(4, (int) (q.getCompletionTime() / 1000L)); + ps.setInt(5, q.getForfeited()); + ps.setString(6, q.getCustomData()); + ps.executeUpdate(); + rs = ps.getGeneratedKeys(); + rs.next(); + if (q.hasMobKills()) { + final Iterator iterator2 = q.getMobKills().keySet().iterator(); + while (iterator2.hasNext()) { + final int mob = ((Integer) iterator2.next()).intValue(); + pse.setLong(1, rs.getLong(1)); + pse.setInt(2, mob); + pse.setInt(3, q.getMobKills(mob)); + pse.executeUpdate(); + } + } + rs.close(); + } + ps.close(); + pse.close(); + ps = con.prepareStatement("INSERT INTO inventoryslot (characterid, `equip`, `use`, `setup`, `etc`, `cash`) VALUES (?, ?, ?, ?, ?, ?)"); + ps.setInt(1, chr.id); + ps.setByte(2, (byte) 32); + ps.setByte(3, (byte) 32); + ps.setByte(4, (byte) 32); + ps.setByte(5, (byte) 32); + ps.setByte(6, (byte) 60); + ps.execute(); + ps.close(); + ps = con.prepareStatement("INSERT INTO mountdata (characterid, `Level`, `Exp`, `Fatigue`) VALUES (?, ?, ?, ?)"); + ps.setInt(1, chr.id); + ps.setByte(2, (byte) 1); + ps.setInt(3, 0); + ps.setByte(4, (byte) 0); + ps.execute(); + ps.close(); + final List> listing = (List>) new ArrayList(); + for (final MapleInventory iv : chr.inventory) { + for (final IItem item : iv.list()) { + listing.add(new Pair(item, iv.getType())); + } + } + ItemLoader.INVENTORY.saveItems(listing, con, Integer.valueOf(chr.id)); + final int[] array1 = {2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 23, 25, 26, 27, 29, 31, 34, 35, 37, 38, 40, 41, 43, 44, 45, 46, 48, 50, 56, 57, 59, 60, 61, 62, 63, 64, 65}; + final int[] array2 = {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 4, 4, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6}; + final int[] array3 = {10, 12, 13, 18, 24, 21, 8, 5, 0, 4, 1, 19, 14, 15, 52, 2, 17, 11, 3, 20, 16, 23, 9, 50, 51, 6, 22, 7, 53, 54, 100, 101, 102, 103, 104, 105, 106}; + ps = con.prepareStatement("INSERT INTO keymap (characterid, `key`, `type`, `action`) VALUES (?, ?, ?, ?)"); + ps.setInt(1, chr.id); + for (int i = 0; i < array1.length; ++i) { + ps.setInt(2, array1[i]); + ps.setInt(3, array2[i]); + ps.setInt(4, array3[i]); + ps.execute(); + } + ps.close(); + con.commit(); + } catch (SQLException ex2) { + } catch (DatabaseException e) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) e, "[角色存档] 储存角色资料失败"); + FileoutputUtil.outError("logs/MapleCharacter1.txt", (Throwable) e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + try { + con.rollback(); + } catch (SQLException ex) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex, "[角色存档] 储存失败,继续使用暂存档不储存资料库"); + FileoutputUtil.outError("logs/MapleCharacter2.txt", (Throwable) ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + try { + if (pse != null) { + pse.close(); + } + if (ps != null) { + ps.close(); + } + if (rs != null) { + rs.close(); + } + con.setAutoCommit(true); + con.setTransactionIsolation(4); + if (con != null) { + con.close(); + } + } catch (SQLException e2) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) e2, "[角色存档] 错误自动返回储存功能"); + FileoutputUtil.outError("logs/MapleCharacter3.txt", (Throwable) e2); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e2); + } + } finally { + try { + if (pse != null) { + pse.close(); + } + if (ps != null) { + ps.close(); + } + if (rs != null) { + rs.close(); + } + con.setAutoCommit(true); + con.setTransactionIsolation(4); + if (con != null) { + con.close(); + } + } catch (SQLException e3) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) e3, "[角色存档] 错误自动返回储存功能"); + FileoutputUtil.outError("logs/MapleCharacter3.txt", (Throwable) e3); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e3); + } + } + } + + public int saveToDB(final boolean dc, final boolean fromcs) { + if (this.isClone()) { + return -1; + } + int retValue = 1; + Connection con = null; + PreparedStatement ps = null; + PreparedStatement pse = null; + ResultSet rs = null; + try { + con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + con.setTransactionIsolation(1); + con.setAutoCommit(false); + ps = con.prepareStatement("UPDATE characters SET level = ?, fame = ?, str = ?, dex = ?, luk = ?, `int` = ?, exp = ?, hp = ?, mp = ?, maxhp = ?, maxmp = ?, sp = ?, ap = ?, gm = ?, skincolor = ?, gender = ?, job = ?, hair = ?, face = ?, map = ?, meso = ?, hpApUsed = ?, spawnpoint = ?, party = ?, buddyCapacity = ?, monsterbookcover = ?, dojo_pts = ?, dojoRecord = ?, pets = ?, subcategory = ?, marriageId = ?, currentrep = ?, totalrep = ?, charmessage = ?, expression = ?, constellation = ?, blood = ?, month = ?, day = ?, beans = ?, prefix = ?, gachexp = ?, name = ?, VipMedal = ?, saved_faces = ?, saved_hairs = ?, limitBreak = ? , reinNumber = ? WHERE id = ?"); + ps.setInt(1, (int) this.level); + ps.setShort(2, this.fame); + ps.setShort(3, this.stats.getStr()); + ps.setShort(4, this.stats.getDex()); + ps.setShort(5, this.stats.getLuk()); + ps.setShort(6, this.stats.getInt()); + ps.setLong(7, (this.level >= this.maxLevel) ? 0L : ((long) this.exp)); + ps.setShort(8, (short) ((this.stats.getHp() < 1) ? 50 : this.stats.getHp())); + ps.setShort(9, this.stats.getMp()); + ps.setShort(10, this.stats.getMaxHp()); + ps.setShort(11, this.stats.getMaxMp()); + final StringBuilder sps = new StringBuilder(); + for (int i = 0; i < this.remainingSp.length; ++i) { + sps.append(this.remainingSp[i]); + sps.append(","); + } + final String sp = sps.toString(); + ps.setString(12, sp.substring(0, sp.length() - 1)); + ps.setShort(13, this.remainingAp); + ps.setByte(14, this.gmLevel); + ps.setByte(15, this.skinColor); + ps.setByte(16, this.gender); + ps.setShort(17, this.job); + ps.setInt(18, this.hair); + ps.setInt(19, this.face); + if (!fromcs && this.map != null) { + if (this.map.getForcedReturnId() != 999999999) { + if (this.map.getId() == 220080001) { + ps.setInt(20, 910000000); + } else { + ps.setInt(20, this.map.getForcedReturnId()); + } + } else { + ps.setInt(20, (this.stats.getHp() < 1) ? this.map.getReturnMapId() : this.map.getId()); + } + } else { + ps.setInt(20, this.mapid); + } + ps.setInt(21, this.meso); + ps.setShort(22, this.hpmpApUsed); + if (this.map == null) { + ps.setByte(23, (byte) 0); + } else { + final MaplePortal closest = this.map.findClosestSpawnpoint(this.getPosition()); + ps.setByte(23, (byte) ((closest != null) ? closest.getId() : 0)); + } + ps.setInt(24, (this.party != null) ? this.party.getId() : -1); + ps.setShort(25, (short) this.buddylist.getCapacity()); + ps.setInt(26, this.bookCover); + ps.setInt(27, this.dojo); + ps.setInt(28, (int) this.dojoRecord); + final StringBuilder petz = new StringBuilder(); + int petLength = 0; + for (final MaplePet pet : this.pets) { + pet.saveToDb(); + if (pet.getSummoned()) { + petz.append((int) pet.getInventoryPosition()); + petz.append(","); + ++petLength; + } + } + while (petLength < 3) { + petz.append("-1,"); + ++petLength; + } + final String petstring = petz.toString(); + ps.setString(29, petstring.substring(0, petstring.length() - 1)); + ps.setByte(30, this.subcategory); + ps.setInt(31, this.marriageId); + ps.setInt(32, this.currentrep); + ps.setInt(33, this.totalrep); + ps.setString(34, this.charmessage); + ps.setInt(35, this.expression); + ps.setInt(36, this.constellation); + ps.setInt(37, this.blood); + ps.setInt(38, this.month); + ps.setInt(39, this.day); + ps.setInt(40, this.beans); + ps.setString(41, this.prefix); + ps.setInt(42, this.gachexp); + ps.setString(43, this.name); + ps.setInt(44, (int) (this.Vip_Medal ? 1 : 0)); + final StringBuilder faces = new StringBuilder(); + for (int j = 0; j < this.savedFaces.length; ++j) { + faces.append(this.savedFaces[j]); + faces.append(","); + } + final String saved_faces = faces.toString(); + ps.setString(45, saved_faces.substring(0, saved_faces.length() - 1)); + final StringBuilder hairs = new StringBuilder(); + for (int k = 0; k < this.savedHairs.length; ++k) { + hairs.append(this.savedHairs[k]); + hairs.append(","); + } + final String saved_hairs = hairs.toString(); + ps.setString(46, saved_hairs.substring(0, saved_hairs.length() - 1)); + ps.setLong(47, this.limitBreak); + ps.setInt(48, this.reinNumber); + ps.setInt(49, this.id); + if (ps.executeUpdate() < 1) { + ps.close(); + throw new DatabaseException("Character not in database (" + this.id + ")"); + } + ps.close(); + this.deleteWhereCharacterId(con, "DELETE FROM skillmacros WHERE characterid = ?"); + for (int l = 0; l < 5; ++l) { + final SkillMacro macro = this.skillMacros[l]; + ps = con.prepareStatement("INSERT INTO skillmacros (characterid, skill1, skill2, skill3, name, shout, position) VALUES (?, ?, ?, ?, ?, ?, ?)"); + if (macro != null) { + ps.setInt(1, this.id); + ps.setInt(2, macro.getSkill1()); + ps.setInt(3, macro.getSkill2()); + ps.setInt(4, macro.getSkill3()); + ps.setString(5, macro.getName()); + ps.setInt(6, macro.getShout()); + ps.setInt(7, l); + ps.execute(); + ps.close(); + } + } + this.deleteWhereCharacterId(con, "DELETE FROM inventoryslot WHERE characterid = ?"); + ps = con.prepareStatement("INSERT INTO inventoryslot (characterid, `equip`, `use`, `setup`, `etc`, `cash`) VALUES (?, ?, ?, ?, ?, ?)"); + ps.setInt(1, this.id); + ps.setByte(2, this.getInventory(MapleInventoryType.EQUIP).getSlotLimit()); + ps.setByte(3, this.getInventory(MapleInventoryType.USE).getSlotLimit()); + ps.setByte(4, this.getInventory(MapleInventoryType.SETUP).getSlotLimit()); + ps.setByte(5, this.getInventory(MapleInventoryType.ETC).getSlotLimit()); + ps.setByte(6, this.getInventory(MapleInventoryType.CASH).getSlotLimit()); + ps.execute(); + ps.close(); + final List> listing = (List>) new ArrayList(); + for (final MapleInventory iv : this.inventory) { + for (final IItem item : iv.list()) { + listing.add(new Pair(item, iv.getType())); + } + } + ItemLoader.INVENTORY.saveItems(listing, con, Integer.valueOf(this.id)); + this.deleteWhereCharacterId(con, "DELETE FROM questinfo WHERE characterid = ?"); + ps = con.prepareStatement("INSERT INTO questinfo (`characterid`, `quest`, `customData`) VALUES (?, ?, ?)"); + ps.setInt(1, this.id); + for (final Entry q : this.questinfo.entrySet()) { + ps.setInt(2, ((Integer) q.getKey()).intValue()); + ps.setString(3, (String) q.getValue()); + ps.execute(); + } + ps.close(); + this.deleteWhereCharacterId(con, "DELETE FROM queststatus WHERE characterid = ?"); + ps = con.prepareStatement("INSERT INTO queststatus (`queststatusid`, `characterid`, `quest`, `status`, `time`, `forfeited`, `customData`) VALUES (DEFAULT, ?, ?, ?, ?, ?, ?)", 1); + pse = con.prepareStatement("INSERT INTO queststatusmobs VALUES (DEFAULT, ?, ?, ?)", 1); + ps.setInt(1, this.id); + for (final MapleQuestStatus q2 : this.quests.values()) { + ps.setInt(2, q2.getQuest().getId()); + ps.setInt(3, (int) q2.getStatus()); + ps.setInt(4, (int) (q2.getCompletionTime() / 1000L)); + ps.setInt(5, q2.getForfeited()); + ps.setString(6, q2.getCustomData()); + ps.executeUpdate(); + rs = ps.getGeneratedKeys(); + rs.next(); + if (q2.hasMobKills()) { + final Iterator iterator5 = q2.getMobKills().keySet().iterator(); + while (iterator5.hasNext()) { + final int mob = ((Integer) iterator5.next()).intValue(); + pse.setLong(1, rs.getLong(1)); + pse.setInt(2, mob); + pse.setInt(3, q2.getMobKills(mob)); + pse.executeUpdate(); + } + } + rs.close(); + } + ps.close(); + pse.close(); + this.deleteWhereCharacterId(con, "DELETE FROM skills WHERE characterid = ?"); + ps = con.prepareStatement("INSERT INTO skills (characterid, skillid, skilllevel, masterlevel, expiration) VALUES (?, ?, ?, ?, ?)"); + ps.setInt(1, this.id); + for (final Entry skill : this.skills.entrySet()) { + if (GameConstants.isApplicableSkill(((ISkill) skill.getKey()).getId())) { + ps.setInt(2, ((ISkill) skill.getKey()).getId()); + ps.setByte(3, ((SkillEntry) skill.getValue()).skillevel); + ps.setByte(4, ((SkillEntry) skill.getValue()).masterlevel); + ps.setLong(5, ((SkillEntry) skill.getValue()).expiration); + ps.execute(); + } + } + ps.close(); + final List cd = this.getCooldowns(); + if (dc && cd.size() > 0) { + ps = con.prepareStatement("INSERT INTO skills_cooldowns (charid, SkillID, StartTime, length) VALUES (?, ?, ?, ?)"); + ps.setInt(1, this.getId()); + for (final MapleCoolDownValueHolder cooling : cd) { + ps.setInt(2, cooling.skillId); + ps.setLong(3, cooling.startTime); + ps.setLong(4, cooling.length); + ps.execute(); + } + ps.close(); + } + this.deleteWhereCharacterId(con, "DELETE FROM savedlocations WHERE characterid = ?"); + ps = con.prepareStatement("INSERT INTO savedlocations (characterid, `locationtype`, `map`) VALUES (?, ?, ?)"); + ps.setInt(1, this.id); + for (final SavedLocationType savedLocationType : SavedLocationType.values()) { + if (this.savedLocations[savedLocationType.getValue()] != -1) { + ps.setInt(2, savedLocationType.getValue()); + ps.setInt(3, this.savedLocations[savedLocationType.getValue()]); + ps.execute(); + } + } + ps.close(); + ps = con.prepareStatement("DELETE FROM achievements WHERE accountid = ?"); + ps.setInt(1, this.accountid); + ps.executeUpdate(); + ps.close(); + ps = con.prepareStatement("INSERT INTO achievements(charid, achievementid, accountid) VALUES(?, ?, ?)"); + for (final Integer achid : this.finishedAchievements) { + ps.setInt(1, this.id); + ps.setInt(2, achid.intValue()); + ps.setInt(3, this.accountid); + ps.executeUpdate(); + } + ps.close(); + this.deleteWhereCharacterId(con, "DELETE FROM buddies WHERE characterid = ?"); + ps = con.prepareStatement("INSERT INTO buddies (characterid, `buddyid`, `pending`) VALUES (?, ?, ?)"); + ps.setInt(1, this.id); + for (final BuddyEntry entry : this.buddylist.getBuddies()) { + if (entry != null) { + ps.setInt(2, entry.getCharacterId()); + ps.setInt(3, (int) (entry.isVisible() ? 0 : 1)); + ps.execute(); + } + } + ps.close(); + ps = con.prepareStatement("UPDATE accounts SET `mPoints` = ?, `vpoints` = ?, `VIP` = ? WHERE id = ?"); + ps.setInt(1, this.maplepoints); + ps.setInt(2, this.vpoints); + ps.setInt(3, this.vip); + ps.setInt(4, this.client.getAccID()); + ps.execute(); + ps.close(); + if (this.storage != null) { + this.storage.saveToDB(con); + } + if (this.cs != null) { + this.cs.save(con); + } + PlayerNPC.updateByCharId(this, con); + this.keylayout.saveKeys(this.id, con); + this.mount.saveMount(this.id, con); + this.monsterbook.saveCards(this.id, con); + this.deleteWhereCharacterId(con, "DELETE FROM wishlist WHERE characterid = ?"); + for (int m = 0; m < this.getWishlistSize(); ++m) { + ps = con.prepareStatement("INSERT INTO wishlist(characterid, sn) VALUES(?, ?) "); + ps.setInt(1, this.getId()); + ps.setInt(2, this.wishlist[m]); + ps.execute(); + ps.close(); + } + this.deleteWhereCharacterId(con, "DELETE FROM trocklocations WHERE characterid = ?"); + for (int m = 0; m < this.rocks.length; ++m) { + if (this.rocks[m] != 999999999) { + ps = con.prepareStatement("INSERT INTO trocklocations(characterid, mapid) VALUES(?, ?) "); + ps.setInt(1, this.getId()); + ps.setInt(2, this.rocks[m]); + ps.execute(); + ps.close(); + } + } + this.deleteWhereCharacterId(con, "DELETE FROM regrocklocations WHERE characterid = ?"); + for (int m = 0; m < this.regrocks.length; ++m) { + if (this.regrocks[m] != 999999999) { + ps = con.prepareStatement("INSERT INTO regrocklocations(characterid, mapid) VALUES(?, ?) "); + ps.setInt(1, this.getId()); + ps.setInt(2, this.regrocks[m]); + ps.execute(); + ps.close(); + } + } + con.commit(); + } catch (UnsupportedOperationException ex2) { + } catch (SQLException ex3) { + } catch (DatabaseException e) { + retValue = 0; + e.printStackTrace(); + System.out.println("保存数据出错" + e); + FileoutputUtil.logToFile("logs/保存角色数据出错.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + this.getClient().getSession().remoteAddress().toString().split(":")[0] + " 账号 " + this.getClient().getAccountName() + " 账号ID " + this.getClient().getAccID() + " 角色名 " + this.getName() + " 角色ID " + this.getId()); + FilePrinter.printError("MapleCharacter4.txt", (Throwable) e, "[角色存档]储存角色失败"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + FileoutputUtil.outError("logs/保存角色数据出错.txt", (Throwable) e); + try { + con.rollback(); + } catch (SQLException ex) { + ex.printStackTrace(); + System.out.println("回滚数据出错" + ex); + FileoutputUtil.logToFile("logs/保存角色数据出错.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + this.getClient().getSession().remoteAddress().toString().split(":")[0] + " 账号 " + this.getClient().getAccountName() + " 账号ID " + this.getClient().getAccID() + " 角色名 " + this.getName() + " 角色ID " + this.getId()); + FileoutputUtil.outError("logs/保存角色数据出错5.txt", (Throwable) ex); + FilePrinter.printError("MapleCharacter.txt", (Throwable) e, "[角色存档] 储存失败,继续使用暂存档不储存资料库"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + try { + if (ps != null) { + ps.close(); + } + if (pse != null) { + pse.close(); + } + if (rs != null) { + rs.close(); + } + con.setAutoCommit(true); + con.setTransactionIsolation(4); + if (con != null) { + con.close(); + } + } catch (SQLException es) { + retValue = 0; + es.printStackTrace(); + System.out.println("关闭数据出错" + es); + es.printStackTrace(); + FileoutputUtil.logToFile("logs/保存角色数据出错.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + this.getClient().getSession().remoteAddress().toString().split(":")[0] + " 账号 " + this.getClient().getAccountName() + " 账号ID " + this.getClient().getAccID() + " 角色名 " + this.getName() + " 角色ID " + this.getId()); + FilePrinter.printError("MapleCharacter.txt", (Throwable) es, "[角色存档] 错误自动返回储存功能"); + FileoutputUtil.outError("logs/保存角色数据出错6.txt", (Throwable) es); + FileoutputUtil.outError("logs/保存角色数据出错.txt", (Throwable) es); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) es); + } + } finally { + try { + if (ps != null) { + ps.close(); + } + if (pse != null) { + pse.close(); + } + if (rs != null) { + rs.close(); + } + con.setAutoCommit(true); + con.setTransactionIsolation(4); + if (con != null) { + con.close(); + } + } catch (SQLException es2) { + retValue = 0; + es2.printStackTrace(); + System.out.println("关闭数据出错" + es2); + es2.printStackTrace(); + FileoutputUtil.logToFile("logs/保存角色数据出错.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + this.getClient().getSession().remoteAddress().toString().split(":")[0] + " 账号 " + this.getClient().getAccountName() + " 账号ID " + this.getClient().getAccID() + " 角色名 " + this.getName() + " 角色ID " + this.getId()); + FilePrinter.printError("MapleCharacter.txt", (Throwable) es2, "[角色存档] 错误自动返回储存功能"); + FileoutputUtil.outError("logs/保存角色数据出错6.txt", (Throwable) es2); + FileoutputUtil.outError("logs/保存角色数据出错.txt", (Throwable) es2); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) es2); + } + } + return retValue; + } + + private void deleteWhereCharacterId(final Connection con, final String sql) throws SQLException { + deleteWhereCharacterId(con, sql, this.id); + } + + public static void deleteWhereCharacterId(final Connection con, final String sql, final int id) { + try { + final PreparedStatement ps = con.prepareStatement(sql); + ps.setInt(1, id); + ps.executeUpdate(); + ps.close(); + } catch (Exception ex) { + FileoutputUtil.outError("logs/保存角色数据出错7.txt", (Throwable) ex); + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex, "[deleteWhereCharacterId]"); + } + } + + public void saveInventory(final Connection con) { + final List> listing = (List>) new ArrayList(); + for (final MapleInventory iv : this.inventory) { + for (final IItem item : iv.list()) { + listing.add(new Pair(item, iv.getType())); + } + } + if (con != null) { + try { + ItemLoader.INVENTORY.saveItems(listing, con, Integer.valueOf(this.id)); + } catch (SQLException ex) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex, "[saveInventory]"); + FileoutputUtil.outError("logs/保存角色数据出错8.txt", (Throwable) ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } else { + try { + ItemLoader.INVENTORY.saveItems(listing, Integer.valueOf(this.id)); + } catch (SQLException ex) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex, "[saveInventory]"); + FileoutputUtil.outError("logs/保存角色数据出错9.txt", (Throwable) ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + } + + public final PlayerStats getStat() { + return this.stats; + } + + public final PlayerRandomStream CRand() { + return this.CRand; + } + + public final void QuestInfoPacket(final MaplePacketLittleEndianWriter mplew) { + mplew.writeShort(this.questinfo.size()); + for (final Entry q : this.questinfo.entrySet()) { + mplew.writeShort(((Integer) q.getKey()).intValue()); + mplew.writeMapleAsciiString((q.getValue() == null) ? "" : ((String) q.getValue())); + } + } + + public final void updateInfoQuest(final int questid, final String data) { + this.questinfo.put(Integer.valueOf(questid), data); + this.client.sendPacket(MaplePacketCreator.updateInfoQuest(questid, data)); + } + + public final String getInfoQuest(final int questid) { + if (this.questinfo.containsKey(Integer.valueOf(questid))) { + return (String) this.questinfo.get(Integer.valueOf(questid)); + } + return ""; + } + + public final int getNumQuest() { + int i = 0; + for (final MapleQuestStatus q : this.quests.values()) { + if (q.getStatus() == 2 && !q.isCustom()) { + ++i; + } + } + return i; + } + + public final byte getQuestStatus(final int quest) { + return this.getQuest(MapleQuest.getInstance(quest)).getStatus(); + } + + public final MapleQuestStatus getQuest(final MapleQuest quest) { + if (!this.quests.containsKey(quest)) { + return new MapleQuestStatus(quest, 0); + } + return (MapleQuestStatus) this.quests.get(quest); + } + + public final void setQuestAdd(final MapleQuest quest, final byte status, final String customData) { + if (!this.quests.containsKey(quest)) { + final MapleQuestStatus stat = new MapleQuestStatus(quest, (int) status); + stat.setCustomData(customData); + this.quests.put(quest, stat); + } + } + + public final MapleQuestStatus getQuestNAdd(final MapleQuest quest) { + if (!this.quests.containsKey(quest)) { + final MapleQuestStatus status = new MapleQuestStatus(quest, 0); + this.quests.put(quest, status); + return status; + } + return (MapleQuestStatus) this.quests.get(quest); + } + + public final MapleQuestStatus getQuestNoAdd(final MapleQuest quest) { + return (MapleQuestStatus) this.quests.get(quest); + } + + public final MapleQuestStatus getQuestRemove(final MapleQuest quest) { + return (MapleQuestStatus) this.quests.remove(quest); + } + + public final void updateQuest(final MapleQuestStatus quest) { + this.updateQuest(quest, false); + } + + public final void updateQuest(final MapleQuestStatus quest, final boolean update) { + this.quests.put(quest.getQuest(), quest); + if (!quest.isCustom()) { + this.client.sendPacket(MaplePacketCreator.updateQuest(quest)); + if (quest.getStatus() == 1 && !update) { + this.client.sendPacket(MaplePacketCreator.updateQuestInfo(this, quest.getQuest().getId(), quest.getNpc(), (byte) 8)); + } + } + } + + public final Map getInfoQuest_Map() { + return this.questinfo; + } + + public final Map getQuest_Map() { + return this.quests; + } + + public boolean isActiveBuffedValue(final int skillid) { + final LinkedList allBuffs = new LinkedList(this.effects.values()); + for (final MapleBuffStatValueHolder mbsvh : allBuffs) { + if (mbsvh.effect.isSkill() && mbsvh.effect.getSourceId() == skillid) { + return true; + } + } + return false; + } + + public boolean isBuffedValue(final int skillid) { + final LinkedList allBuffs = new LinkedList(this.effects.values()); + for (final MapleBuffStatValueHolder mbsvh : allBuffs) { + if (mbsvh.effect.getSourceId() == skillid) { + return true; + } + } + return false; + } + + public Integer getBuffedValue(final MapleBuffStat effect) { + final MapleBuffStatValueHolder mbsvh = (MapleBuffStatValueHolder) this.effects.get(effect); + return (mbsvh == null) ? null : Integer.valueOf(mbsvh.value); + } + + public boolean hasBuffedValue(final MapleBuffStat effect) { + return this.getBuffedValue(effect) != null; + } + + public final Integer getBuffedSkill_X(final MapleBuffStat effect) { + final MapleBuffStatValueHolder mbsvh = (MapleBuffStatValueHolder) this.effects.get(effect); + if (mbsvh == null) { + return null; + } + return Integer.valueOf(mbsvh.effect.getX()); + } + + public final Integer getBuffedSkill_Y(final MapleBuffStat effect) { + final MapleBuffStatValueHolder mbsvh = (MapleBuffStatValueHolder) this.effects.get(effect); + if (mbsvh == null) { + return null; + } + return Integer.valueOf(mbsvh.effect.getY()); + } + + public boolean isBuffFrom(final MapleBuffStat stat, final ISkill skill) { + final MapleBuffStatValueHolder mbsvh = (MapleBuffStatValueHolder) this.effects.get(stat); + return mbsvh != null && mbsvh.effect.isSkill() && mbsvh.effect.getSourceId() == skill.getId(); + } + + public boolean changeFace(final short item, final int color) { + int newFace = this.face / 1000 * 1000 + color + this.face % 10; + if (!MapleItemInformationProvider.getInstance().faceExists(newFace)) { + newFace = this.face; + this.gainItem((int) item, 1); + } else { + this.face = newFace; + this.updateSingleStat(MapleStat.FACE, newFace); + this.equipChanged(); + } + return MapleItemInformationProvider.faceLists.containsKey(Integer.valueOf(color)); + } + + public int getBuffSource(final MapleBuffStat stat) { + final MapleBuffStatValueHolder mbsvh = (MapleBuffStatValueHolder) this.effects.get(stat); + return (mbsvh == null) ? -1 : mbsvh.effect.getSourceId(); + } + + public int getItemQuantity(final int itemid, final boolean checkEquipped) { + int possesed = this.inventory[GameConstants.getInventoryType(itemid).ordinal()].countById(itemid); + if (checkEquipped) { + possesed += this.inventory[MapleInventoryType.EQUIPPED.ordinal()].countById(itemid); + } + return possesed; + } + + public void setBuffedValue(final MapleBuffStat effect, final int value) { + final MapleBuffStatValueHolder mbsvh = (MapleBuffStatValueHolder) this.effects.get(effect); + if (mbsvh == null) { + return; + } + mbsvh.value = value; + } + + public Long getBuffedStarttime(final MapleBuffStat effect) { + final MapleBuffStatValueHolder mbsvh = (MapleBuffStatValueHolder) this.effects.get(effect); + return (mbsvh == null) ? null : Long.valueOf(mbsvh.startTime); + } + + public MapleStatEffect getStatForBuff(final MapleBuffStat effect) { + final MapleBuffStatValueHolder mbsvh = (MapleBuffStatValueHolder) this.effects.get(effect); + return (mbsvh == null) ? null : mbsvh.effect; + } + + public void doRecovery() { + final MapleStatEffect bloodEffect = this.getStatForBuff(MapleBuffStat.RECOVERY); + if (bloodEffect != null) { + this.prepareRecovery(); + if (this.stats.getHp() >= this.stats.getCurrentMaxHp()) { + this.cancelEffectFromBuffStat(MapleBuffStat.RECOVERY); + } else { + this.healHP(bloodEffect.getX(), true); + } + } + } + + public final boolean canRecover(final long now) { + return this.lastRecoveryTime > 0L && this.lastRecoveryTime + 5000L < now; + } + + private void prepareRecovery() { + this.lastRecoveryTime = System.currentTimeMillis(); + } + + private void prepareDragonBlood(final MapleStatEffect bloodEffect) { + if (this.dragonBloodSchedule != null) { + this.dragonBloodSchedule.cancel(false); + } + this.dragonBloodSchedule = BuffTimer.getInstance().register((Runnable) new Runnable() { + @Override + public void run() { + if (MapleCharacter.this.stats.getHp() - bloodEffect.getX() > 1) { + MapleCharacter.this.cancelBuffStats(MapleBuffStat.DRAGONBLOOD); + } else { + MapleCharacter.this.addHP(-bloodEffect.getX()); + MapleCharacter.this.client.sendPacket(MaplePacketCreator.showOwnBuffEffect(bloodEffect.getSourceId(), 5)); + MapleCharacter.this.map.broadcastMessage(MapleCharacter.this, MaplePacketCreator.showBuffeffect(MapleCharacter.this.getId(), bloodEffect.getSourceId(), 5), false); + } + } + }, 4000L, 4000L); + } + + public void startMapTimeLimitTask(int time, final MapleMap to) { + this.client.sendPacket(MaplePacketCreator.getClock(time)); + time *= 1000; + this.mapTimeLimitTask = MapTimer.getInstance().register((Runnable) new Runnable() { + @Override + public void run() { + MapleCharacter.this.changeMap(to, to.getPortal(0)); + } + }, (long) time, (long) time); + } + + public void startFishingTask(final boolean VIP) { + try { + final int time = GameConstants.getFishingTime(VIP, this.isGM()); + this.cancelFishingTask(); + this.fishing = EtcTimer.getInstance().register((Runnable) new Runnable() { + @Override + public void run() { + final boolean expMulti = MapleCharacter.this.haveItem(2300001, 1, false, true); + if (!expMulti && !MapleCharacter.this.haveItem(2300000, 1, false, true)) { + MapleCharacter.this.cancelFishingTask(); + return; + } + MapleInventoryManipulator.removeById(MapleCharacter.this.client, MapleInventoryType.USE, expMulti ? 2300001 : 2300000, 1, false, false); + final int rewardType = FishingRewardFactory.getInstance().getNextRewardType(); + switch (rewardType) { + case 0: { + final int money = Randomizer.rand(expMulti ? 15 : 10, expMulti ? 3000 : 1000); + MapleCharacter.this.gainMeso(money, true); + MapleCharacter.this.client.sendPacket(UIPacket.fishingUpdate((byte) 1, money)); + break; + } + case 1: { + final int experi = Randomizer.nextInt(Math.abs(GameConstants.getExpNeededForLevel((int) MapleCharacter.this.level) / 800) + 1); + MapleCharacter.this.gainExp(expMulti ? (experi * 3 / 2) : experi, true, false, true); + MapleCharacter.this.client.sendPacket(UIPacket.fishingUpdate((byte) 2, experi)); + break; + } + default: { + final int gl = Randomizer.nextInt(2); + if (gl == 1) { + final FishingReward item = FishingRewardFactory.getInstance().getNextRewardItemId(); + if (item != null) { + if (!MapleInventoryManipulator.checkSpace(MapleCharacter.this.client, item.getItemId(), 1, MapleCharacter.this.getName())) { + MapleCharacter.this.client.sendPacket(MaplePacketCreator.serverNotice(5, "你的背包已满")); + MapleCharacter.this.cancelFishingTask(); + return; + } + MapleInventoryManipulator.addById(MapleCharacter.this.client, item.getItemId(), (short) 1, GameConstants.isChair(item.getItemId()) ? MapleCharacter.this.getName() : null, null, (long) item.getExpiration()); + MapleCharacter.this.client.sendPacket(UIPacket.fishingUpdate((byte) 0, item.getItemId())); + } + break; + } + final int moneya = Randomizer.rand(expMulti ? 15 : 10, expMulti ? 3000 : 1000); + MapleCharacter.this.gainMeso(moneya, true); + MapleCharacter.this.client.sendPacket(UIPacket.fishingUpdate((byte) 1, moneya)); + break; + } + } + MapleCharacter.this.map.broadcastMessage(UIPacket.fishingCaught(MapleCharacter.this.id)); + } + }, (long) time, (long) time); + } catch (RejectedExecutionException ex) { + } + } + + public void cancelMapTimeLimitTask() { + if (this.mapTimeLimitTask != null) { + this.mapTimeLimitTask.cancel(false); + } + } + + public void cancelFishingTask() { + if (this.fishing != null && !this.fishing.isCancelled()) { + this.fishing.cancel(false); + } + } + + public void registerEffect(final MapleStatEffect effect, final long starttime, final ScheduledFuture schedule, final int from) { + this.registerEffect(effect, starttime, schedule, effect.getStatups(), false, effect.getDuration(), from); + } + + public void registerEffect(final MapleStatEffect effect, final long starttime, final ScheduledFuture schedule, final List> statups, final boolean silent, final int localDuration, final int cid) { + if (effect.isHide() && this.isGM()) { + this.hidden = true; + this.map.broadcastNONGMMessage(this, MaplePacketCreator.removePlayerFromMap(this.getId()), false); + } else if (effect.isDragonBlood()) { + this.prepareDragonBlood(effect); + } else if (effect.isBerserk()) { + this.checkBerserk(); + } else if (effect.isMonsterRiding_()) { + this.getMount().startSchedule(); + } else if (effect.isBeholder()) { + this.prepareBeholderEffect(); + } else if (effect.isRecovery()) { + this.prepareRecovery(); + } else if (GameConstants.isAran((int) this.getJob())) { + final int reduce = this.Aran_ReduceCombo(effect.getSourceId()); + if (reduce > 0) { + this.setCombo(this.getCombo() - reduce); + } + } + int clonez = 0; + for (final Pair statup : statups) { + if (statup.getLeft() == MapleBuffStat.ILLUSION) { + clonez = ((Integer) statup.getRight()).intValue(); + } + final int value = ((Integer) statup.getRight()).intValue(); + if (statup.getLeft() == MapleBuffStat.MONSTER_RIDING && effect.getSourceId() == 5221006 && this.battleshipHP <= 0) { + this.battleshipHP = value; + } + final MapleBuffStatValueHolder mbsvh = new MapleBuffStatValueHolder(effect, starttime, schedule, value, localDuration, cid, effect.getSourceId()); + this.effects.put(statup.getLeft(), mbsvh); + this.skillID.put(Integer.valueOf(effect.getSourceId()), mbsvh); + } + if (clonez > 0) { + final int cloneSize = Math.max((int) this.getNumClones(), this.getCloneSize()); + if (clonez > cloneSize) { + for (int i = 0; i < clonez - cloneSize; ++i) { + this.cloneLook(); + } + } + } + this.stats.recalcLocalStats(); + if (this.getDebugMessage()) { + for (final Pair buf : statups) { + this.dropMessage(6, "[系统提示]\u0010" + ((MapleBuffStat) buf.getLeft()).toString() + "(0x" + HexTool.toString(((MapleBuffStat) buf.getLeft()).getValue()) + ")"); + } + } + } + + public List getBuffStats(final MapleStatEffect effect, final long startTime) { + final List bstats = (List) new ArrayList(); + final Map allBuffs = new EnumMap(this.effects); + for (final Entry stateffect : allBuffs.entrySet()) { + final MapleBuffStatValueHolder mbsvh = (MapleBuffStatValueHolder) stateffect.getValue(); + if (mbsvh.effect.sameSource(effect) && (startTime == -1L || startTime == mbsvh.startTime)) { + bstats.add(stateffect.getKey()); + } + } + return bstats; + } + + public List getBuffStatsFromStatEffect(final MapleStatEffect effect, final long startTime) { + final List bstats = (List) new ArrayList(); + final Map allBuffs = new EnumMap(this.effects); + for (final Entry stateffect : allBuffs.entrySet()) { + final MapleBuffStatValueHolder mbsvh = (MapleBuffStatValueHolder) stateffect.getValue(); + if (mbsvh.effect.sameSource(effect) && (startTime == -1L || startTime == mbsvh.startTime)) { + bstats.add(stateffect.getKey()); + this.skillID.put(Integer.valueOf(effect.getSourceId()), mbsvh); + } + } + return bstats; + } + + private boolean deregisterBuffStats(final List stats) { + boolean clonez = false; + final List effectsToCancel = (List) new ArrayList(stats.size()); + for (final MapleBuffStat stat : stats) { + final MapleBuffStatValueHolder mbsvh = (MapleBuffStatValueHolder) this.effects.remove(stat); + if (mbsvh != null) { + this.skillID.remove(Integer.valueOf(mbsvh.effect.getSourceId())); + boolean addMbsvh = true; + for (final MapleBuffStatValueHolder contained : effectsToCancel) { + if (mbsvh.startTime == contained.startTime && contained.effect == mbsvh.effect) { + addMbsvh = false; + } + } + if (addMbsvh) { + effectsToCancel.add(mbsvh); + } + if (stat == MapleBuffStat.SUMMON || stat == MapleBuffStat.PUPPET) { + final int summonId = mbsvh.effect.getSourceId(); + final MapleSummon summon = (MapleSummon) this.summons.get(Integer.valueOf(summonId)); + if (summon == null) { + continue; + } + this.map.broadcastMessage(MaplePacketCreator.removeSummon(summon, true)); + this.map.removeMapObject((MapleMapObject) summon); + this.removeVisibleMapObject((MapleMapObject) summon); + this.summons.remove(Integer.valueOf(summonId)); + if (summon.getSkill() != 1321007) { + continue; + } + if (this.beholderHealingSchedule != null) { + this.beholderHealingSchedule.cancel(false); + this.beholderHealingSchedule = null; + } + if (this.beholderBuffSchedule == null) { + continue; + } + this.beholderBuffSchedule.cancel(false); + this.beholderBuffSchedule = null; + } else if (stat == MapleBuffStat.DRAGONBLOOD) { + if (this.dragonBloodSchedule == null) { + continue; + } + this.dragonBloodSchedule.cancel(false); + this.dragonBloodSchedule = null; + } else if (stat == MapleBuffStat.RECOVERY) { + this.lastRecoveryTime = 0L; + } else { + if (stat != MapleBuffStat.ILLUSION) { + continue; + } + this.disposeClones(); + clonez = true; + } + } + } + for (final MapleBuffStatValueHolder cancelEffectCancelTasks : effectsToCancel) { + if (this.getBuffStatsFromStatEffect(cancelEffectCancelTasks.effect, cancelEffectCancelTasks.startTime).isEmpty() && cancelEffectCancelTasks.schedule != null) { + cancelEffectCancelTasks.schedule.cancel(false); + } + } + return clonez; + } + + public void cancelEffect(final MapleStatEffect effect, final boolean overwrite, final long startTime) { + if (this != null && effect != null) { + this.cancelEffect(effect, overwrite, startTime, effect.getStatups()); + } + } + + public void cancelEffect(final MapleStatEffect effect, final boolean overwrite, final long startTime, final List> statups) { + List buffstats; + if (!overwrite) { + buffstats = this.getBuffStats(effect, startTime); + } else { + buffstats = (List) new ArrayList(statups.size()); + for (final Pair statup : statups) { + buffstats.add(statup.getLeft()); + } + } + if (buffstats.size() <= 0) { + return; + } + final boolean clonez = this.deregisterBuffStats(buffstats); + if (effect.isMagicDoor()) { + if (!this.getDoors().isEmpty()) { + this.removeDoor(); + this.silentPartyUpdate(); + } + } else if (effect.isMonsterRiding_()) { + this.getMount().cancelSchedule(); + } else if (effect.isAranCombo()) { + this.combo = 0; + } + if (!overwrite) { + this.cancelPlayerBuffs(buffstats); + if (this.isGM() && effect.isHide() && this.client.getChannelServer().getPlayerStorage().getCharacterById(this.getId()) != null) { + this.hidden = false; + this.map.broadcastMessage(this, MaplePacketCreator.spawnPlayerMapobject(this), false); + for (final MaplePet pet : this.pets) { + if (pet.getSummoned()) { + this.map.broadcastMessage(this, PetPacket.showPet(this, pet, false, false), false); + } + } + for (final WeakReference chr : this.clones) { + if (chr.get() != null) { + this.map.broadcastMessage((MapleCharacter) chr.get(), MaplePacketCreator.spawnPlayerMapobject((MapleCharacter) chr.get()), false); + } + } + } + } + if (!clonez) { + for (final WeakReference chr : this.clones) { + if (chr.get() != null) { + ((MapleCharacter) chr.get()).cancelEffect(effect, overwrite, startTime); + } + } + } + if (this.getDebugMessage()) { + this.dropMessage("取消技能 - " + effect.getName() + "(" + effect.getSourceId() + ")"); + } + } + + public void cancelBuffStats(final MapleBuffStat... stat) { + final List buffStatList = Arrays.asList(stat); + this.deregisterBuffStats(buffStatList); + this.cancelPlayerBuffs(buffStatList); + } + + public void cancelEffectFromBuffStat(final MapleBuffStat stat) { + if (this.effects.get(stat) != null) { + this.cancelEffect(((MapleBuffStatValueHolder) this.effects.get(stat)).effect, false, -1L); + } + } + + private void cancelPlayerBuffs(final List buffstats) { + final MapleBuffStatValueHolder mbsvh = (MapleBuffStatValueHolder) this.effects.remove(buffstats); + final boolean write = this.client.getChannelServer().getPlayerStorage().getCharacterById(this.getId()) != null; + if (buffstats.contains(MapleBuffStat.HOMING_BEACON)) { + if (write) { + this.client.sendPacket(MaplePacketCreator.cancelHoming()); + } + } else { + if (write) { + this.stats.recalcLocalStats(); + } + this.client.sendPacket(MaplePacketCreator.cancelBuff(buffstats)); + this.map.broadcastMessage(this, MaplePacketCreator.cancelForeignBuff(this.getId(), buffstats), false); + } + } + + public void dispel() { + if (!this.isHidden()) { + final LinkedList allBuffs = new LinkedList(this.effects.values()); + for (final MapleBuffStatValueHolder mbsvh : allBuffs) { + if (mbsvh.effect.isSkill() && mbsvh.schedule != null && !mbsvh.effect.isMorph() && !mbsvh.effect.isEnergyCharge()) { + this.cancelEffect(mbsvh.effect, false, mbsvh.startTime); + } + } + } + } + + public void dispelSkill(final int skillid) { + final LinkedList allBuffs = new LinkedList(this.effects.values()); + for (final MapleBuffStatValueHolder mbsvh : allBuffs) { + if (skillid == 0) { + if (mbsvh.effect.isSkill() && (mbsvh.effect.getSourceId() == 4331003 || mbsvh.effect.getSourceId() == 4331002 || mbsvh.effect.getSourceId() == 4341002 || mbsvh.effect.getSourceId() == 22131001 || mbsvh.effect.getSourceId() == 1321007 || mbsvh.effect.getSourceId() == 2121005 || mbsvh.effect.getSourceId() == 2221005 || mbsvh.effect.getSourceId() == 2311006 || mbsvh.effect.getSourceId() == 2321003 || mbsvh.effect.getSourceId() == 3111002 || mbsvh.effect.getSourceId() == 3111005 || mbsvh.effect.getSourceId() == 3211002 || mbsvh.effect.getSourceId() == 3211005 || mbsvh.effect.getSourceId() == 4111002)) { + this.cancelEffect(mbsvh.effect, false, mbsvh.startTime); + break; + } + continue; + } else { + if (mbsvh.effect.isSkill() && mbsvh.effect.getSourceId() == skillid) { + this.cancelEffect(mbsvh.effect, false, mbsvh.startTime); + break; + } + continue; + } + } + } + + public void dispelBuff(final int skillid) { + final LinkedList allBuffs = new LinkedList(this.effects.values()); + for (final MapleBuffStatValueHolder mbsvh : allBuffs) { + if (mbsvh.effect.getSourceId() == skillid) { + this.cancelEffect(mbsvh.effect, false, mbsvh.startTime); + break; + } + } + } + + public void cancelAllBuffs_() { + this.effects.clear(); + } + + public void cancelAllSkillID() { + this.skillID.clear(); + } + + public void cancelAllBuffs() { + final LinkedList allBuffs = new LinkedList(this.effects.values()); + for (final MapleBuffStatValueHolder mbsvh : allBuffs) { + this.cancelEffect(mbsvh.effect, false, mbsvh.startTime); + } + } + + public void cancelMorphs() { + final LinkedList allBuffs = new LinkedList(this.effects.values()); + for (final MapleBuffStatValueHolder mbsvh : allBuffs) { + switch (mbsvh.effect.getSourceId()) { + case 5111005: + case 5121003: + case 13111005: + case 15111002: { + return; + } + default: { + if (!mbsvh.effect.isMorph()) { + continue; + } + this.cancelEffect(mbsvh.effect, false, mbsvh.startTime); + continue; + } + } + } + } + + public int getMorphState() { + final LinkedList allBuffs = new LinkedList(this.effects.values()); + for (final MapleBuffStatValueHolder mbsvh : allBuffs) { + if (mbsvh.effect.isMorph()) { + return mbsvh.effect.getSourceId(); + } + } + return -1; + } + + public void silentGiveBuffs(final List buffs) { + if (buffs == null) { + return; + } + for (final PlayerBuffValueHolder mbsvh : buffs) { + mbsvh.effect.silentApplyBuff(this, mbsvh.startTime, mbsvh.localDuration, mbsvh.statup, mbsvh.cid); + } + } + + public List getAllBuffs() { + final List ret = (List) new ArrayList(); + final Map, Integer> alreadyDone = (Map, Integer>) new HashMap(); + final LinkedList> allBuffs = new LinkedList(this.effects.entrySet()); + for (final Entry mbsvh : allBuffs) { + final Pair key = new Pair(Integer.valueOf(((MapleBuffStatValueHolder) mbsvh.getValue()).effect.getSourceId()), Byte.valueOf(((MapleBuffStatValueHolder) mbsvh.getValue()).effect.getLevel())); + if (alreadyDone.containsKey(key)) { + ((PlayerBuffValueHolder) ret.get(((Integer) alreadyDone.get(key)).intValue())).statup.add(new Pair(mbsvh.getKey(), Integer.valueOf(((MapleBuffStatValueHolder) mbsvh.getValue()).value))); + } else { + alreadyDone.put(key, Integer.valueOf(ret.size())); + final ArrayList> list = (ArrayList>) new ArrayList(); + list.add(new Pair(mbsvh.getKey(), Integer.valueOf(((MapleBuffStatValueHolder) mbsvh.getValue()).value))); + ret.add(new PlayerBuffValueHolder(((MapleBuffStatValueHolder) mbsvh.getValue()).startTime, ((MapleBuffStatValueHolder) mbsvh.getValue()).effect, (List>) list, ((MapleBuffStatValueHolder) mbsvh.getValue()).localDuration, ((MapleBuffStatValueHolder) mbsvh.getValue()).cid)); + } + } + return ret; + } + + public void cancelMagicDoor() { + final LinkedList allBuffs = new LinkedList(this.effects.values()); + for (final MapleBuffStatValueHolder mbsvh : allBuffs) { + if (mbsvh.effect.isMagicDoor()) { + this.cancelEffect(mbsvh.effect, false, mbsvh.startTime); + break; + } + } + } + + public int getSkillLevel(final int skillid) { + return this.getSkillLevel(SkillFactory.getSkill(skillid)); + } + + public final void handleEnergyCharge(final int skillid, final int targets) { + final ISkill echskill = SkillFactory.getSkill(skillid); + final byte skilllevel = this.getSkillLevel(echskill); + if (skilllevel > 0) { + final MapleStatEffect echeff = echskill.getEffect((int) skilllevel); + if (targets > 0) { + if (this.getBuffedValue(MapleBuffStat.ENERGY_CHARGE) == null) { + echeff.applyEnergyBuff(this, true); + } else { + Integer energyLevel = this.getBuffedValue(MapleBuffStat.ENERGY_CHARGE); + if (energyLevel.intValue() < 10000) { + energyLevel = Integer.valueOf(energyLevel.intValue() + echeff.getX() * targets); + this.client.sendPacket(MaplePacketCreator.showOwnBuffEffect(skillid, 2)); + this.map.broadcastMessage(this, MaplePacketCreator.showBuffeffect(this.id, skillid, 2), false); + if (energyLevel.intValue() >= 10000) { + energyLevel = Integer.valueOf(10000); + } + this.client.sendPacket(MaplePacketCreator.giveEnergyChargeTest(energyLevel.intValue(), echeff.getDuration() / 1000)); + this.setBuffedValue(MapleBuffStat.ENERGY_CHARGE, energyLevel.intValue()); + } else if (energyLevel.intValue() == 10000) { + echeff.applyEnergyBuff(this, false); + this.setBuffedValue(MapleBuffStat.ENERGY_CHARGE, 10001); + } + } + } + } + } + + public final void handleBattleshipHP(final int damage) { + if (this.isActiveBuffedValue(5221006)) { + this.battleshipHP -= damage; + if (this.battleshipHP <= 0) { + this.battleshipHP = 0; + final MapleStatEffect effect = this.getStatForBuff(MapleBuffStat.MONSTER_RIDING); + this.client.sendPacket(MaplePacketCreator.skillCooldown(5221006, effect.getCooldown())); + this.addCooldown(5221006, System.currentTimeMillis(), (long) (effect.getCooldown() * 1000)); + this.dispelSkill(5221006); + } + } + } + + public final void handleOrbgain() { + final int orbcount = this.getBuffedValue(MapleBuffStat.COMBO).intValue(); + ISkill theCombol = null; + ISkill advcombo = null; + switch (this.getJob()) { + case 1110: + case 1111: + case 1112: { + theCombol = SkillFactory.getSkill(11111001); + advcombo = SkillFactory.getSkill(11110005); + break; + } + default: { + theCombol = SkillFactory.getSkill(1111002); + advcombo = SkillFactory.getSkill(1120003); + break; + } + } + final int advComboSkillLevel = this.getSkillLevel(advcombo); + MapleStatEffect ceffect; + if (advComboSkillLevel > 0) { + ceffect = advcombo.getEffect(advComboSkillLevel); + } else { + if (this.getSkillLevel(theCombol) <= 0) { + return; + } + ceffect = theCombol.getEffect((int) this.getSkillLevel(theCombol)); + } + if (orbcount < ceffect.getX() + 1) { + int neworbcount = orbcount + 1; + if (advComboSkillLevel > 0 && ceffect.makeChanceResult() && neworbcount < ceffect.getX() + 1) { + ++neworbcount; + } + final List> stat = Collections.singletonList(new Pair(MapleBuffStat.COMBO, Integer.valueOf(neworbcount))); + this.setBuffedValue(MapleBuffStat.COMBO, neworbcount); + int duration = ceffect.getDuration(); + duration += (int) (this.getBuffedStarttime(MapleBuffStat.COMBO).longValue() - System.currentTimeMillis()); + this.client.sendPacket(MaplePacketCreator.giveBuff(theCombol.getId(), duration, stat, ceffect)); + this.map.broadcastMessage(this, MaplePacketCreator.giveForeignBuff(this.getId(), stat, ceffect), false); + } + } + + public void handleOrbconsume() { + ISkill theCombol = null; + switch (this.getJob()) { + case 1110: + case 1111: + case 1112: { + theCombol = SkillFactory.getSkill(11111001); + break; + } + default: { + theCombol = SkillFactory.getSkill(1111002); + break; + } + } + if (this.getSkillLevel(theCombol) <= 0) { + return; + } + final MapleStatEffect ceffect = this.getStatForBuff(MapleBuffStat.COMBO); + if (ceffect == null) { + return; + } + final List> stat = Collections.singletonList(new Pair(MapleBuffStat.COMBO, Integer.valueOf(1))); + this.setBuffedValue(MapleBuffStat.COMBO, 1); + int duration = ceffect.getDuration(); + duration += (int) (this.getBuffedStarttime(MapleBuffStat.COMBO).longValue() - System.currentTimeMillis()); + this.client.sendPacket(MaplePacketCreator.giveBuff(theCombol.getId(), duration, stat, ceffect)); + this.map.broadcastMessage(this, MaplePacketCreator.giveForeignBuff(this.getId(), stat, ceffect), false); + } + + public void silentEnforceMaxHpMp() { + this.stats.setMp((int) this.stats.getMp()); + this.stats.setHp((int) this.stats.getHp(), true); + } + + public void enforceMaxHpMp() { + final Map statups = new EnumMap(MapleStat.class); + if (this.stats.getMp() > this.stats.getCurrentMaxMp()) { + this.stats.setMp((int) this.stats.getMp()); + statups.put(MapleStat.MP, Long.valueOf((int) this.stats.getMp())); + } + if (this.stats.getHp() > this.stats.getCurrentMaxHp()) { + this.stats.setHp((int) this.stats.getHp()); + statups.put(MapleStat.HP, Long.valueOf((int) this.stats.getHp())); + } + if (statups.size() > 0) { + this.client.sendPacket(MaplePacketCreator.updatePlayerStats(statups, this)); + } + } + + public MapleMap getMap() { + return this.map; + } + + public MonsterBook getMonsterBook() { + return this.monsterbook; + } + + public void setMap(final MapleMap newmap) { + this.map = newmap; + } + + public void setMap(final int PmapId) { + this.mapid = PmapId; + } + + public int getMapId() { + if (this.map != null) { + return this.map.getId(); + } + return this.mapid; + } + + public byte getInitialSpawnpoint() { + return this.initialSpawnPoint; + } + + public int getId() { + return this.id; + } + + public String getName() { + return this.name; + } + + public final boolean canHold(final int itemid) { + return this.getInventory(GameConstants.getInventoryType(itemid)).getNextFreeSlot() > -1; + } + + public final String getBlessOfFairyOrigin() { + return this.BlessOfFairy_Origin; + } + + public final short getLevel() { + if (this.level < 1) { + this.level = 1; + } + return this.level; + } + + public final short getFame() { + return this.fame; + } + + public final int getDojo() { + return this.dojo; + } + + public final int getDojoRecord() { + return this.dojoRecord; + } + + public final int getFallCounter() { + return this.fallcounter; + } + + public final MapleClient getClient() { + return this.client; + } + + public final void setClient(final MapleClient client) { + this.client = client; + } + + public long getExp() { + return this.exp; + } + + public short getRemainingAp() { + return this.remainingAp; + } + + public int getRemainingSp() { + return this.remainingSp[GameConstants.getSkillBook((int) this.job)]; + } + + public int getRemainingSp(final int skillbook) { + return this.remainingSp[skillbook]; + } + + public int[] getRemainingSps() { + return this.remainingSp; + } + + public int getRemainingSpSize() { + int ret = 0; + for (int i = 0; i < this.remainingSp.length; ++i) { + if (this.remainingSp[i] > 0) { + ++ret; + } + } + return ret; + } + + public short getHpMpApUsed() { + return this.hpmpApUsed; + } + + public boolean isHidden() { + return this.hidden; + } + + public void setHpMpApUsed(final short hpApUsed) { + this.hpmpApUsed = hpApUsed; + } + + public byte getSkinColor() { + return this.skinColor; + } + + public void setSkinColor(final byte skinColor) { + this.skinColor = skinColor; + } + + public short getJob() { + return this.job; + } + + public byte getGender() { + return this.gender; + } + + public int getHair() { + return this.hair; + } + + public int getFace() { + return this.face; + } + + public void setName(final String name) { + this.name = name; + } + + public void setExp(final long exp) { + this.exp = exp; + } + + public void setHair(final int hair) { + this.hair = hair; + } + + public void setFace(final int face) { + this.face = face; + } + + public void setFame(final short fame) { + this.fame = fame; + } + + public void setDojo(final int dojo) { + this.dojo = dojo; + } + + public void setDojoRecord(final boolean reset) { + if (reset) { + this.dojo = 0; + this.dojoRecord = 0; + } else { + ++this.dojoRecord; + } + } + + public void setFallCounter(final int fallcounter) { + this.fallcounter = fallcounter; + } + + public Point getOldPosition() { + return this.old; + } + + public void setOldPosition(final Point x) { + this.old = x; + } + + public void setRemainingAp(final short remainingAp) { + this.remainingAp = remainingAp; + } + + public void setRemainingSp(final int remainingSp) { + this.remainingSp[GameConstants.getSkillBook((int) this.job)] = remainingSp; + } + + public void setRemainingSp(final int remainingSp, final int skillbook) { + this.remainingSp[skillbook] = remainingSp; + } + + public void setGender(final byte gender) { + this.gender = gender; + } + + public void setInvincible(final boolean invinc) { + this.invincible = invinc; + } + + public boolean isInvincible() { + return this.invincible; + } + + public CheatTracker getCheatTracker() { + return this.anticheat; + } + + public MapleLieDetector getAntiMacro() { + return this.antiMacro; + } + + public void startLieDetector(final boolean isItem) { + if ((this.getMapId() < 910000000 || this.getMapId() > 910000022) && this.getMapId() != 800040410 && !GameConstants.isFishingMap(this.getMapId()) && this.getMap().getReturnMapId() != this.getMapId()) { + if (this.getAntiMacro().isPassed()) { + this.getAntiMacro().setPassed(false); + } + if (!this.getAntiMacro().inProgress()) { + this.getAntiMacro().startLieDetector(this.getName(), isItem, false); + } + } + } + + public BuddyList getBuddylist() { + return this.buddylist; + } + + public void addFame(final int famechange) { + this.fame += (short) famechange; + this.updateFame(); + } + + public void changeMap(final int mapid) { + final MapleMap target = this.client.getChannelServer().getMapFactory().getMap(mapid); + this.changeMap(target, target.getPortal(0)); + } + + public void changeMapBanish(final int mapid, final String portal, final String msg) { + this.dropMessage(5, msg); + final MapleMap target = this.client.getChannelServer().getMapFactory().getMap(mapid); + this.changeMap(target, target.getPortal(portal)); + } + + public void changeMap(final MapleMap to, final Point pos) { + this.changeMapInternal(to, pos, MaplePacketCreator.getWarpToMap(to, 129, this), null); + } + + public void changeMap(final MapleMap to, final MaplePortal pto) { + this.changeMapInternal(to, pto.getPosition(), MaplePacketCreator.getWarpToMap(to, pto.getId(), this), null); + } + + public void changeMapPortal(final MapleMap to, final MaplePortal pto) { + this.changeMapInternal(to, pto.getPosition(), MaplePacketCreator.getWarpToMap(to, pto.getId(), this), pto); + } + + private void changeMapInternal(final MapleMap to, final Point pos, final byte[] warpPacket, final MaplePortal pto) { + if (to == null) { + return; + } + this.saveToDB(true, true); + if (pto != null && GameConstants.isNotTo(to.getId(), pto.getName())) { + if (this.getParty() == null || this.getParty().getMembers().size() == 1) { + this.changeMap(211060000); + return; + } + final int cMap = this.getMapId(); + for (final MaplePartyCharacter chr : this.getParty().getMembers()) { + final MapleCharacter curChar = this.getClient().getChannelServer().getPlayerStorage().getCharacterById(chr.getId()); + if (curChar != null && (curChar.getMapId() == cMap || curChar.getEventInstance() == this.getEventInstance())) { + curChar.changeMap(211060000); + } + } + return; + } else { + if (this.getAntiMacro().inProgress()) { + this.dropMessage(5, "被使用测谎仪时无法操作。"); + this.client.sendPacket(MaplePacketCreator.enableActions()); + return; + } + if (to.getId() != 105100300) { + this.dispelBuff(2022536); + this.dispelBuff(2022537); + } + if (to.getId() == 180000000 && this.getGMLevel() < 4) { + this.changeMap(100000000); + return; + } + final int nowmapid = this.map.getId(); + if (this.eventInstance != null) { + this.eventInstance.changedMap(this, to.getId()); + } + if (this.getTrade() != null) { + if (this.getTrade().getPartner() != null) { + final MapleTrade local = this.getTrade(); + final MapleTrade partners = local.getPartner(); + if (local.isLocked() && partners.isLocked()) { + this.client.getSession().write(MaplePacketCreator.enableActions()); + } else { + MapleTrade.cancelTrade(this.getTrade(), this.getClient()); + } + } else { + MapleTrade.cancelTrade(this.getTrade(), this.client); + } + } + final boolean pyramid = this.pyramidSubway != null; + if (this.map.getId() == nowmapid) { + this.client.sendPacket(warpPacket); + this.map.removePlayer(this); + if (!this.isClone() && this.client.getChannelServer().getPlayerStorage().getCharacterById(this.getId()) != null) { + this.map = to; + this.setPosition(pos); + to.addPlayer(this); + this.stats.relocHeal(); + } + } + if (pyramid && this.pyramidSubway != null) { + this.pyramidSubway.onChangeMap(this, to.getId()); + } + if (Mushplotact.getStartState() && Mushplotact.getEggmap() == to.getId()) { + this.client.getPlayer().dropMessage("蘑插辣的魔力源泉貌似就在附近了!!"); + } + return; + } + } + + public void leaveMap() { + this.visibleMapObjectsLock.writeLock().lock(); + try { + for (final MapleMonster mons : this.controlled) { + if (mons != null) { + mons.setController(null); + mons.setControllerHasAggro(false); + mons.setControllerKnowsAboutAggro(false); + this.map.updateMonsterController(mons); + } + } + this.controlled.clear(); + this.visibleMapObjects.clear(); + } finally { + this.visibleMapObjectsLock.writeLock().unlock(); + } + if (this.chair != 0) { + this.cancelFishingTask(); + this.chair = 0; + } + if (this.getTrade() != null) { + if (this.getTrade().getPartner() != null) { + final MapleTrade local = this.getTrade(); + final MapleTrade partners = local.getPartner(); + if (local.isLocked() && partners.isLocked()) { + this.client.getSession().write(MaplePacketCreator.enableActions()); + } else { + MapleTrade.cancelTrade(this.getTrade(), this.getClient()); + } + } else { + MapleTrade.cancelTrade(this.getTrade(), this.client); + } + } + this.cancelMapTimeLimitTask(); + } + + public void changeJob(final int newJob) { + try { + this.updateSingleStat(MapleStat.JOB, newJob); + final boolean isEv = GameConstants.isEvan((int) this.job) || GameConstants.isResist((int) this.job); + this.job = (short) newJob; + if (newJob != 0 && newJob != 1000 && newJob != 2000 && newJob != 2001 && newJob != 3000) { + if (isEv) { + final int[] remainingSp = this.remainingSp; + final int skillBook = GameConstants.getSkillBook(newJob); + remainingSp[skillBook] += 5; + this.client.getSession().write(UIPacket.getSPMsg((byte) 5, (short) newJob)); + } else { + final int[] remainingSp2 = this.remainingSp; + final int skillBook2 = GameConstants.getSkillBook(newJob); + ++remainingSp2[skillBook2]; + if (newJob % 10 >= 2) { + final int[] remainingSp3 = this.remainingSp; + final int skillBook3 = GameConstants.getSkillBook(newJob); + remainingSp3[skillBook3] += 2; + } + } + } + if (newJob > 0) { + this.resetStatsByJob(true); + if (this.getLevel() > ((newJob == 200) ? 8 : 10) && newJob % 100 == 0 && newJob % 1000 / 100 > 0) { + final int[] remainingSp4 = this.remainingSp; + final int skillBook4 = GameConstants.getSkillBook(newJob); + remainingSp4[skillBook4] += 3 * (this.getLevel() - ((newJob == 200) ? 8 : 10)); + } + } + this.client.sendPacket(MaplePacketCreator.updateSp(this, false)); + int maxhp = this.stats.getMaxHp(); + int maxmp = this.stats.getMaxMp(); + switch (this.job) { + case 100: + case 1100: + case 2100: { + maxhp += Randomizer.rand(200, 250); + break; + } + case 200: { + maxmp += Randomizer.rand(100, 150); + break; + } + case 300: + case 400: + case 500: { + maxhp += Randomizer.rand(100, 150); + maxmp += Randomizer.rand(25, 50); + break; + } + case 110: { + maxhp += Randomizer.rand(300, 350); + break; + } + case 120: + case 130: + case 510: + case 512: + case 1110: + case 2110: { + maxhp += Randomizer.rand(300, 350); + break; + } + case 210: + case 220: + case 230: { + maxmp += Randomizer.rand(400, 450); + break; + } + case 310: + case 312: + case 320: + case 322: + case 410: + case 412: + case 420: + case 422: + case 520: + case 522: + case 1310: + case 1410: { + maxhp += Randomizer.rand(300, 350); + maxhp += Randomizer.rand(150, 200); + break; + } + case 800: + case 900: { + maxhp += 30000; + maxhp += 30000; + maxmp += 30000; + maxmp += 30000; + break; + } + } + if (maxhp >= 30000) { + maxhp = 30000; + } + if (maxmp >= 30000) { + maxmp = 30000; + } + this.stats.setMaxHp((short) maxhp); + this.stats.setMaxMp((short) maxmp); + this.stats.setHp((int) (short) maxhp); + this.stats.setMp((int) (short) maxmp); + final Map statup = new EnumMap(MapleStat.class); + statup.put(MapleStat.MAXHP, Long.valueOf(maxhp)); + statup.put(MapleStat.MAXMP, Long.valueOf(maxmp)); + statup.put(MapleStat.HP, Long.valueOf(maxhp)); + statup.put(MapleStat.MP, Long.valueOf(maxmp)); + this.stats.recalcLocalStats(); + this.client.sendPacket(MaplePacketCreator.updatePlayerStats(statup, this)); + this.map.broadcastMessage(this, MaplePacketCreator.showForeignEffect(this.getId(), 9), false); + this.silentPartyUpdate(); + this.guildUpdate(); + this.familyUpdate(); + this.baseSkills(); + } catch (Exception e) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) e); + } + } + + public void setPetAutoFood(final boolean auto) { + this.petAutoFood = auto; + } + + public boolean isPetAutoFood() { + return this.petAutoFood; + } + + public void baseSkills() { + if (GameConstants.getJobNumber((int) this.job) >= 3) { + final List baseSkills = SkillFactory.getSkillsByJob((int) this.job); + if (baseSkills != null) { + final Iterator iterator = baseSkills.iterator(); + while (iterator.hasNext()) { + final int i = ((Integer) iterator.next()).intValue(); + final ISkill skil = SkillFactory.getSkill(i); + if (skil != null && !skil.isInvisible() && skil.isFourthJob() && this.getSkillLevel(skil) <= 0 && this.getMasterLevel(skil) <= 0 && skil.getMasterLevel() > 0) { + this.changeSkillLevel(skil, (byte) 0, (byte) skil.getMasterLevel()); + } + } + } + } + } + + public void gainAp(final short ap) { + this.remainingAp += ap; + this.updateSingleStat(MapleStat.AVAILABLEAP, (int) this.remainingAp); + } + + public void gainSP(final int sp) { + final int[] remainingSp = this.remainingSp; + final int skillBook = GameConstants.getSkillBook((int) this.job); + remainingSp[skillBook] += sp; + this.client.sendPacket(MaplePacketCreator.updateSp(this, false)); + this.client.sendPacket(UIPacket.getSPMsg((byte) sp, this.job)); + } + + public void gainSP(final int sp, final int skillbook) { + final int[] remainingSp = this.remainingSp; + remainingSp[skillbook] += sp; + this.client.sendPacket(MaplePacketCreator.updateSp(this, false)); + this.client.sendPacket(UIPacket.getSPMsg((byte) sp, this.job)); + } + + public void resetAPSP() { + for (int i = 0; i < this.remainingSp.length; ++i) { + this.remainingSp[i] = 0; + } + this.client.sendPacket(MaplePacketCreator.updateSp(this, false)); + this.gainAp((short) (-this.remainingAp)); + } + + public void changeSkillLevel(final ISkill skill, final byte newLevel, final byte newMasterlevel) { + if (skill == null) { + return; + } + this.changeSkillLevel(skill, newLevel, newMasterlevel, skill.isTimeLimited() ? (System.currentTimeMillis() + 2592000000L) : -1L); + } + + public void changeSkillLevel(final ISkill skill, final byte newLevel, final byte newMasterlevel, final long expiration) { + if (skill == null || (!GameConstants.isApplicableSkill(skill.getId()) && !GameConstants.isApplicableSkill_(skill.getId()))) { + return; + } + this.client.sendPacket(MaplePacketCreator.updateSkill(skill.getId(), (int) newLevel, (int) newMasterlevel, expiration)); + if (newLevel == 0 && newMasterlevel == 0) { + if (!this.skills.containsKey(skill)) { + return; + } + this.skills.remove(skill); + } else { + this.skills.put(skill, new SkillEntry(newLevel, newMasterlevel, expiration)); + } + if (GameConstants.isRecoveryIncSkill(skill.getId())) { + this.stats.relocHeal(); + } else if (GameConstants.isElementAmpSkill(skill.getId())) { + this.stats.recalcLocalStats(); + } + } + + public void changeSkillLevel_Skip(final ISkill skill, final byte newLevel, final byte newMasterlevel) { + if (skill == null) { + return; + } + this.client.sendPacket(MaplePacketCreator.updateSkill(skill.getId(), (int) newLevel, (int) newMasterlevel, -1L)); + if (newLevel == 0 && newMasterlevel == 0) { + if (this.skills.containsKey(skill)) { + this.skills.remove(skill); + } + } else { + this.skills.put(skill, new SkillEntry(newLevel, newMasterlevel, -1L)); + } + } + + public void playerDead() { + if (this.getMapId() != 109020001) { + final MapleStatEffect statss = this.getStatForBuff(MapleBuffStat.SOUL_STONE); + if (statss != null) { + this.dropMessage(5, "你已经透过灵魂之石复活了。"); + this.getStat().setHp(this.getStat().getMaxHp() / 100 * statss.getX()); + this.setStance(0); + this.changeMap(this.getMap(), this.getMap().getPortal(0)); + return; + } + } + if (this.getEventInstance() != null) { + this.getEventInstance().playerKilled(this); + } + this.client.getSession().write(MaplePacketCreator.enableActions()); + this.dispelSkill(0); + this.cancelEffectFromBuffStat(MapleBuffStat.MORPH); + this.cancelEffectFromBuffStat(MapleBuffStat.MONSTER_RIDING); + this.cancelEffectFromBuffStat(MapleBuffStat.SUMMON); + this.cancelEffectFromBuffStat(MapleBuffStat.PUPPET); + this.checkFollow(); + if (this.getMapId() != 109020001) { + if (this.job != 0 && this.job != 1000 && this.job != 2000 && this.job != 2001 && this.job != 3000) { + int charms = this.getItemQuantity(5130000, false); + if (charms > 0) { + MapleInventoryManipulator.removeById(this.client, MapleInventoryType.CASH, 5130000, 1, true, false); + if (--charms > 255) { + charms = 255; + } + this.client.sendPacket(MTSCSPacket.useCharm((byte) charms, (byte) 0)); + } else { + final int expforlevel = GameConstants.getExpNeededForLevel((int) this.level); + float diepercentage; + if (this.map.isTown() || FieldLimitType.RegularExpLoss.check(this.map.getFieldLimit())) { + diepercentage = 0.01f; + } else { + float v8; + if (this.job / 100 == 3) { + v8 = 0.08f; + } else { + v8 = 0.2f; + } + diepercentage = (float) ((double) (v8 / (float) this.stats.getLuk()) + 0.05); + } + int v9 = (int) ((long) this.exp - (long) ((double) expforlevel * (double) diepercentage)); + if (v9 < 0) { + v9 = 0; + } + this.exp = v9; + } + } + this.updateSingleStat(MapleStat.EXP, this.exp); + this.client.getSession().write(MaplePacketCreator.enableActions()); + if (!this.stats.checkEquipDurabilitys(this, -100)) { + this.dropMessage(5, "该装备耐久度已经使用完毕,必须修理才可以继续使用。"); + } + } + if (this.pyramidSubway != null) { + this.stats.setHp(50); + this.pyramidSubway.fail(this); + } + this.client.getSession().write(MaplePacketCreator.enableActions()); + } + + public void updatePartyMemberHP() { + if (this.party != null) { + final int channel = this.client.getChannel(); + for (final MaplePartyCharacter partychar : this.party.getMembers()) { + if (partychar.getMapid() == this.getMapId() && partychar.getChannel() == channel) { + final MapleCharacter other = this.client.getChannelServer().getPlayerStorage().getCharacterByName(partychar.getName()); + if (other == null) { + continue; + } + other.getClient().sendPacket(MaplePacketCreator.updatePartyMemberHP(this.getId(), (int) this.stats.getHp(), (int) this.stats.getCurrentMaxHp())); + } + } + } + } + + public void receivePartyMemberHP() { + if (this.party == null) { + return; + } + final int channel = this.client.getChannel(); + for (final MaplePartyCharacter partychar : this.party.getMembers()) { + if (partychar.getMapid() == this.getMapId() && partychar.getChannel() == channel) { + final MapleCharacter other = this.client.getChannelServer().getPlayerStorage().getCharacterByName(partychar.getName()); + if (other == null) { + continue; + } + this.client.sendPacket(MaplePacketCreator.updatePartyMemberHP(other.getId(), (int) other.getStat().getHp(), (int) other.getStat().getCurrentMaxHp())); + } + } + } + + public void healHP(final int delta) { + this.healHP(delta, false); + } + + public void healHP(final int delta, final boolean Show) { + this.addHP(delta); + if (Show) { + this.client.sendPacket(MaplePacketCreator.showOwnHpHealed(delta)); + this.getMap().broadcastMessage(this, MaplePacketCreator.showHpHealed(this.getId(), delta), false); + } + } + + public void healMP(final int delta) { + this.addMP(delta); + } + + public void addHP(final int delta) { + if (this.stats.setHp(this.stats.getHp() + delta)) { + this.updateSingleStat(MapleStat.HP, (int) this.stats.getHp()); + } + } + + public void addMP(final int delta) { + if (this.stats.setMp(this.stats.getMp() + delta)) { + this.updateSingleStat(MapleStat.MP, (int) this.stats.getMp()); + } + } + + public void addMPHP(final int hpDiff, final int mpDiff) { + final Map statups = new EnumMap(MapleStat.class); + if (this.stats.setHp(this.stats.getHp() + hpDiff)) { + statups.put(MapleStat.HP, Long.valueOf((int) this.stats.getHp())); + } + if (this.stats.setMp(this.stats.getMp() + mpDiff)) { + statups.put(MapleStat.MP, Long.valueOf((int) this.stats.getMp())); + } + if (statups.size() > 0) { + this.client.sendPacket(MaplePacketCreator.updatePlayerStats(statups, this)); + } + } + + public void 转生回归() { + final MapleCharacter player = this.client.getPlayer(); + final boolean 转生开关 = Boolean.parseBoolean(ServerProperties.getProperty("pp.转生开关")); + final int 转生最大次数 = Integer.parseInt(ServerProperties.getProperty("pp.转生最大次数")); + final boolean 转生等级开关 = Boolean.parseBoolean(ServerProperties.getProperty("pp.转生等级开关")); + final short 转生等级变几级 = Short.parseShort(ServerProperties.getProperty("pp.转生等级变几级")); + final boolean 转生四维开关 = Boolean.parseBoolean(ServerProperties.getProperty("pp.转生四维开关")); + final short 转生后力量 = Short.parseShort(ServerProperties.getProperty("pp.转生后力量")); + final short 转生后敏捷 = Short.parseShort(ServerProperties.getProperty("pp.转生后敏捷")); + final short 转生后智力 = Short.parseShort(ServerProperties.getProperty("pp.转生后智力")); + final short 转生后运气 = Short.parseShort(ServerProperties.getProperty("pp.转生后运气")); + final boolean 转生血量开关 = Boolean.parseBoolean(ServerProperties.getProperty("pp.转生血量开关")); + final short 转生后血量 = Short.parseShort(ServerProperties.getProperty("pp.转生后血量")); + final boolean 转生蓝量开关 = Boolean.parseBoolean(ServerProperties.getProperty("pp.转生蓝量开关")); + final short 转生后蓝量 = Short.parseShort(ServerProperties.getProperty("pp.转生后蓝量")); + final boolean 转生技能删除开关 = Boolean.parseBoolean(ServerProperties.getProperty("pp.转生技能删除开关")); + final boolean 转生职业变新手开关 = Boolean.parseBoolean(ServerProperties.getProperty("pp.转生职业变新手开关")); + final boolean 转生后是否加属性 = Boolean.parseBoolean(ServerProperties.getProperty("pp.转生后是否加属性开关")); + final Short 转生后一转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后一转给属性点"))); + final Short 转生后二转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后二转给属性点"))); + final Short 转生后三转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后三转给属性点"))); + final Short 转生后四转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后四转给属性点"))); + final Short 转生后五转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后五转给属性点"))); + final Short 转生后六转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后六转给属性点"))); + final Short 转生后七转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后七转给属性点"))); + final Short 转生后八转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后八转给属性点"))); + final Short 转生后九转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后九转给属性点"))); + final Short 转生后十转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十转给属性点"))); + final Short 转生后十一转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十一转给属性点"))); + final Short 转生后十二转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十二转给属性点"))); + final Short 转生后十三转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十三转给属性点"))); + final Short 转生后十四转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十四转给属性点"))); + final Short 转生后十五转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十五转给属性点"))); + final Short 转生后十六转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十六转给属性点"))); + final Short 转生后十七转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十七转给属性点"))); + final Short 转生后十八转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十八转给属性点"))); + final Short 转生后十九转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十九转给属性点"))); + final Short 转生后二十转给属性点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后二十转给属性点"))); + final Short 转生后一转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后一转给技能点"))); + final Short 转生后二转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后二转给技能点"))); + final Short 转生后三转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后三转给技能点"))); + final Short 转生后四转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后四转给技能点"))); + final Short 转生后五转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后五转给技能点"))); + final Short 转生后六转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后六转给技能点"))); + final Short 转生后七转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后七转给技能点"))); + final Short 转生后八转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后八转给技能点"))); + final Short 转生后九转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后九转给技能点"))); + final Short 转生后十转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十转给技能点"))); + final Short 转生后十一转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十一转给技能点"))); + final Short 转生后十二转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十二转给技能点"))); + final Short 转生后十三转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十三转给技能点"))); + final Short 转生后十四转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十四转给技能点"))); + final Short 转生后十五转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十五转给技能点"))); + final Short 转生后十六转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十六转给技能点"))); + final Short 转生后十七转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十七转给技能点"))); + final Short 转生后十八转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十八转给技能点"))); + final Short 转生后十九转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后十九转给技能点"))); + final Short 转生后二十转给技能点 = Short.valueOf(Short.parseShort(ServerProperties.getProperty("pp.转生后二十转给技能点"))); + Short 转生后给技能点 = Short.valueOf((short) 0); + final int 一转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.一转等级要求")); + final int 二转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.二转等级要求")); + final int 三转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.三转等级要求")); + final int 四转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.四转等级要求")); + final int 五转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.五转等级要求")); + final int 六转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.六转等级要求")); + final int 七转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.七转等级要求")); + final int 八转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.八转等级要求")); + final int 九转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.九转等级要求")); + final int 十转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.十转等级要求")); + final int 十一转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.十一转等级要求")); + final int 十二转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.十二转等级要求")); + final int 十三转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.十三转等级要求")); + final int 十四转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.十四转等级要求")); + final int 十五转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.十五转等级要求")); + final int 十六转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.十六转等级要求")); + final int 十七转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.十七转等级要求")); + final int 十八转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.十八转等级要求")); + final int 十九转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.十九转等级要求")); + final int 二十转等级要求 = Integer.parseInt(ServerProperties.getProperty("pp.二十转等级要求")); + if (转生开关) { + int 转生等级要求 = 0; + Short 转生后给属性点 = null; + switch (player.getOneTimeLog("转生次数")) { + case 0: { + 转生等级要求 = 一转等级要求; + 转生后给属性点 = 转生后一转给属性点; + 转生后给技能点 = 转生后一转给技能点; + break; + } + case 1: { + 转生等级要求 = 二转等级要求; + 转生后给属性点 = 转生后二转给属性点; + 转生后给技能点 = 转生后二转给技能点; + break; + } + case 2: { + 转生等级要求 = 三转等级要求; + 转生后给属性点 = 转生后三转给属性点; + 转生后给技能点 = 转生后三转给技能点; + break; + } + case 3: { + 转生等级要求 = 四转等级要求; + 转生后给属性点 = 转生后四转给属性点; + 转生后给技能点 = 转生后四转给技能点; + break; + } + case 4: { + 转生等级要求 = 五转等级要求; + 转生后给属性点 = 转生后五转给属性点; + 转生后给技能点 = 转生后五转给技能点; + break; + } + case 5: { + 转生等级要求 = 六转等级要求; + 转生后给属性点 = 转生后六转给属性点; + 转生后给技能点 = 转生后六转给技能点; + break; + } + case 6: { + 转生等级要求 = 七转等级要求; + 转生后给属性点 = 转生后七转给属性点; + 转生后给技能点 = 转生后七转给技能点; + break; + } + case 7: { + 转生等级要求 = 八转等级要求; + 转生后给属性点 = 转生后八转给属性点; + 转生后给技能点 = 转生后八转给技能点; + break; + } + case 8: { + 转生等级要求 = 九转等级要求; + 转生后给属性点 = 转生后九转给属性点; + 转生后给技能点 = 转生后九转给技能点; + break; + } + case 9: { + 转生等级要求 = 十转等级要求; + 转生后给属性点 = 转生后十转给属性点; + 转生后给技能点 = 转生后十转给技能点; + break; + } + case 10: { + 转生等级要求 = 十一转等级要求; + 转生后给属性点 = 转生后十一转给属性点; + 转生后给技能点 = 转生后十一转给技能点; + break; + } + case 11: { + 转生等级要求 = 十二转等级要求; + 转生后给属性点 = 转生后十二转给属性点; + 转生后给技能点 = 转生后十二转给技能点; + break; + } + case 12: { + 转生等级要求 = 十三转等级要求; + 转生后给属性点 = 转生后十三转给属性点; + 转生后给技能点 = 转生后十三转给技能点; + break; + } + case 13: { + 转生等级要求 = 十四转等级要求; + 转生后给属性点 = 转生后十四转给属性点; + 转生后给技能点 = 转生后十四转给技能点; + break; + } + case 14: { + 转生等级要求 = 十五转等级要求; + 转生后给属性点 = 转生后十五转给属性点; + 转生后给技能点 = 转生后十五转给技能点; + break; + } + case 15: { + 转生等级要求 = 十六转等级要求; + 转生后给属性点 = 转生后十六转给属性点; + 转生后给技能点 = 转生后十六转给技能点; + break; + } + case 16: { + 转生等级要求 = 十七转等级要求; + 转生后给属性点 = 转生后十七转给属性点; + 转生后给技能点 = 转生后十七转给技能点; + break; + } + case 17: { + 转生等级要求 = 十八转等级要求; + 转生后给属性点 = 转生后十八转给属性点; + 转生后给技能点 = 转生后十八转给技能点; + break; + } + case 18: { + 转生等级要求 = 十九转等级要求; + 转生后给属性点 = 转生后十九转给属性点; + 转生后给技能点 = 转生后十九转给技能点; + break; + } + case 20: { + 转生等级要求 = 二十转等级要求; + 转生后给属性点 = 转生后二十转给属性点; + 转生后给技能点 = 转生后二十转给技能点; + break; + } + default: { + player.dropMessage(6, "你已经二十转了,恭喜"); + return; + } + } + if (this.getLevel() < 转生等级要求) { + player.dropMessage(6, "无法转生,等级不够"); + return; + } + player.getStat().setHp(1); + player.updateSingleStat(MapleStat.HP, 1); + player.getStat().setMp(1); + player.updateSingleStat(MapleStat.MP, 1); + if (转生血量开关) { + player.getStat().setMaxHp(转生后血量); + player.updateSingleStat(MapleStat.MAXHP, (int) 转生后血量); + } + if (转生蓝量开关) { + player.getStat().setMaxMp(转生后蓝量); + player.updateSingleStat(MapleStat.MAXMP, (int) 转生后蓝量); + } + if (转生四维开关) { + player.getStat().setStr(转生后力量); + player.getStat().setDex(转生后敏捷); + player.getStat().setInt(转生后智力); + player.getStat().setLuk(转生后运气); + player.updateSingleStat(MapleStat.STR, (int) 转生后力量); + player.updateSingleStat(MapleStat.DEX, (int) 转生后敏捷); + player.updateSingleStat(MapleStat.INT, (int) 转生后智力); + player.updateSingleStat(MapleStat.LUK, (int) 转生后运气); + } + if (转生等级开关) { + player.setLevel(转生等级变几级); + player.updateSingleStat(MapleStat.LEVEL, (int) 转生等级变几级); + } + if (转生职业变新手开关) { + player.changeJob(0); + } + player.setOneTimeLog("转生次数"); + if (转生技能删除开关) { + this.clearSkills(); + } + this.setExp(0); + this.updateSingleStat(MapleStat.EXP, 0); + this.setRemainingAp((short) 0); + this.updateSingleStat(MapleStat.AVAILABLEAP, 0); + this.setRemainingSp(0); + this.updateSingleStat(MapleStat.AVAILABLESP, 0); + if (转生后是否加属性) { + this.setRemainingAp(转生后给属性点.shortValue()); + this.updateSingleStat(MapleStat.AVAILABLEAP, (int) 转生后给属性点.shortValue()); + } + if (!转生职业变新手开关) { + this.setRemainingSp((int) 转生后给技能点.shortValue()); + this.updateSingleStat(MapleStat.AVAILABLESP, (int) 转生后给技能点.shortValue()); + } + } else { + player.dropMessage(6, "转生没有开启"); + } + this.client.getSession().write(MaplePacketCreator.enableActions()); + } + + public void addMAXMPHP(final int hpDiff, final int mpDiff) { + final Map statups = new EnumMap(MapleStat.class); + if (this.stats.getMaxHp() + hpDiff < 30000) { + statups.put(MapleStat.MAXHP, Long.valueOf(this.stats.getMaxHp() + hpDiff)); + statups.put(MapleStat.HP, Long.valueOf(this.stats.getHp() + hpDiff)); + this.stats.setHp(this.stats.getHp() + hpDiff); + this.stats.setMaxHp((short) (this.stats.getMaxHp() + hpDiff)); + } + if (this.stats.getMaxMp() + mpDiff < 30000) { + statups.put(MapleStat.MAXMP, Long.valueOf(this.stats.getMaxMp() + mpDiff)); + statups.put(MapleStat.MP, Long.valueOf(this.stats.getMp() + mpDiff)); + this.stats.setMp(this.stats.getMp() + mpDiff); + this.stats.setMaxMp((short) (this.stats.getMaxMp() + mpDiff)); + } + if (statups.size() > 0) { + this.client.getSession().write(MaplePacketCreator.updatePlayerStats(statups, this)); + } + } + + public void updateSingleStat(final MapleStat stat, final long newval) { + this.updateSingleStat(stat, newval, false); + } + + public void updateSingleStat(final MapleStat stat, final long newval, final boolean itemReaction) { + if (stat == MapleStat.AVAILABLESP) { + this.client.sendPacket(MaplePacketCreator.updateSp(this, itemReaction)); + return; + } + final Map statup = new EnumMap(MapleStat.class); + statup.put(stat, newval); + this.client.sendPacket(MaplePacketCreator.updatePlayerStats(statup, itemReaction, this)); + } + + public void gainExp(final long total, final boolean show, final boolean inChat, final boolean white) { + try { + final long prevexp = this.getExp(); + long needed = GameConstants.getExpNeededForLevel(this.level); + if (total > 0) { + this.stats.checkEquipLevels(this, total); + } + if (this.level >= this.maxLevel) { + this.setExp(0); + } else { + boolean leveled = false; + final boolean levelUpTimesLimit = Integer.valueOf(Start.ConfigValuesMap.get((Object) "等级连升开关")) > 0; + final int 等级连升多少级之前都有效果 = (int) Integer.valueOf(Start.ConfigValuesMap.get((Object) "等级范围")); + this.exp += total; + long oexp = (long) this.exp; + short 等级 = this.level; + while (oexp >= needed) { + this.levelUp(); + leveled = true; + oexp -= needed; + ++等级; + needed = GameConstants.getExpNeededForLevel(等级); + if (Integer.valueOf(Start.ConfigValuesMap.get((Object) "世界等级开关")) > 0 && 等级 >= Start.世界等级) { + break; + } + if (!levelUpTimesLimit || 等级 >= 等级连升多少级之前都有效果 || oexp < needed || 等级 >= this.maxLevel) { + break; + } + } + if (total > 0) { + this.familyRep(prevexp, needed, leveled); + } + } + if (total != 0) { + if (this.exp < 0) { + if (total > 0) { + this.setExp(needed); + } else if (total < 0) { + this.setExp(0); + } + } + this.updateSingleStat(MapleStat.EXP, this.getExp()); + if (show) { + this.client.sendPacket(MaplePacketCreator.GainEXP_Others(total, inChat, white)); + } + } + } catch (Exception e) { + e.printStackTrace(); + FilePrinter.printError("MapleCharacter.txt", e); + } + } + + public void familyRep(final long prevexp, final long needed, final boolean leveled) { + if (this.mfc != null) { + final long onepercent = needed / 100; + int percentrep = (int) (getExp() / onepercent - prevexp / onepercent); + if (leveled) { + percentrep = 100 - percentrep + this.level / 2; + } + if (percentrep > 0) { + final int sensen = Family.setRep(this.mfc.getFamilyId(), this.mfc.getSeniorId(), percentrep, (int) this.level); + if (sensen > 0) { + Family.setRep(this.mfc.getFamilyId(), sensen, percentrep / 2, (int) this.level); + } + } + } + } + + public boolean isShowInfo() { + return this.isAdmin(); + } + + public boolean isShowErr() { + return this.isShowInfo(); + } + + public void gainExpMonster(int gain, final boolean show, final boolean white, final byte pty, final int wedding_EXP, final int Class_Bonus_EXP, final int Equipment_Bonus_EXP, int Premium_Bonus_EXP, int 活动经验) { + if (this == null) { + return; + } + this.expirationTask(true, false); + if (this.getExpm() > 1.0) { + gain *= this.getExpm(); + } + if (this.isVip()) { + gain *= 1.0 + this.getVipExpRate() / 100.0; + } + if (this.getStat().equippedRing) { + if (pty > 1) { + if (pty > 5) { + gain *= 1.3; + } else { + gain *= 1.0 + (0.1 + 0.05 * (pty - 1)); + } + } else { + gain *= 1.1; + } + } + Premium_Bonus_EXP = 0; + if (Integer.valueOf(Start.ConfigValuesMap.get((Object) "雇佣经验加成开关")) > 0) { + final boolean 雇佣 = World.hasMerchant(this.getAccountID()); + if (雇佣) { + Premium_Bonus_EXP = (int) (gain / 100.0 * Integer.valueOf(Start.ConfigValuesMap.get((Object) "雇佣经验加成比例"))); + } + } + long total = gain + Class_Bonus_EXP + Equipment_Bonus_EXP + Premium_Bonus_EXP + wedding_EXP; + int partyinc = 0; + final long prevexp = this.getExp(); + if (pty > 1) { + partyinc = (int) (gain / 20.0 * (float) (pty + 1)); + if (Integer.valueOf(Start.ConfigValuesMap.get((Object) "特殊组队经验加成")) > 0) { + boolean 判定 = false; + int 比例 = 0; + for (final MaplePartyCharacter z : this.getParty().getMembers()) { + final MapleCharacter m = this.getMap().getCharacterById(z.getId()); + if (m != null) { + for (int a = 0; a < Start.特殊组队经验加成表.size(); ++a) { + if (m.getJob() == Integer.parseInt(Start.特殊组队经验加成表.get(a))) { + 判定 = true; + } + } + } + } + if (判定) { + 比例 = Integer.valueOf(Start.ConfigValuesMap.get((Object) "修正组队经验加成")); + } else { + 比例 = Integer.valueOf(Start.ConfigValuesMap.get((Object) "原始组队经验加成")); + } + partyinc = (int) (gain / 100.0 * 比例 * pty); + } + total += partyinc; + } + if (gain > 0 && total < gain) { + total = Integer.MAX_VALUE; + } + if (total > 0) { + this.stats.checkEquipLevels(this, total); + } + final int maxLevel = (int) Integer.valueOf(Start.ConfigValuesMap.get((Object) "角色最大等级")); + int needed = GameConstants.getExpNeededForLevel(this.level); + if (GameConstants.isKOC(this.job) && this.level >= ServerConfig.kocmaxlevel) { + if (this.exp + total > needed) { + this.setExp(needed); + } else { + this.exp += total; + } + } else if (this.level >= maxLevel) { + this.setExp(0); + } else { + boolean leveled = false; + if (this.exp + total >= needed || this.exp >= needed) { + final boolean levelUpTimesLimit = Integer.valueOf(Start.ConfigValuesMap.get((Object) "等级连升开关")) > 0; + final int 等级连升多少级之前都有效果 = (int) Integer.valueOf(Start.ConfigValuesMap.get((Object) "等级范围")); + this.exp += total; + long oexp = (long) this.exp; + short 等级 = this.level; + while (oexp >= needed) { + this.levelUp(); + leveled = true; + oexp -= needed; + ++等级; + needed = GameConstants.getExpNeededForLevel(等级); + if (Integer.valueOf(Start.ConfigValuesMap.get((Object) "世界等级开关")) > 0 && 等级 >= Start.世界等级) { + break; + } + if (!levelUpTimesLimit || 等级 >= 等级连升多少级之前都有效果 || oexp < needed || 等级 >= maxLevel) { + break; + } + } + if (this.level >= maxLevel) { + this.setExp(0); + } else { + needed = GameConstants.getExpNeededForLevel(this.level); + if (this.exp >= needed) { + this.setExp(needed); + } + } + } else { + this.exp += total; + } + if (total > 0) { + this.familyRep(prevexp, needed, leveled); + } + } + if (gain != 0) { + if (this.exp < 0) { + if (gain > 0) { + this.setExp(GameConstants.getExpNeededForLevel((int) this.level)); + } else if (gain < 0) { + this.setExp(0); + } + } + this.updateSingleStat(MapleStat.EXP, this.getExp()); + if (show) { + this.client.sendPacket(MaplePacketCreator.GainEXP_Monster(gain, white, wedding_EXP, partyinc, Class_Bonus_EXP, Equipment_Bonus_EXP, Premium_Bonus_EXP, 活动经验)); + } + } + } + + public void reloadC() { + this.client.getPlayer().getClient().sendPacket(MaplePacketCreator.getCharInfo(this.client.getPlayer())); + this.client.getPlayer().getMap().removePlayer(this.client.getPlayer()); + this.client.getPlayer().getMap().addPlayer(this.client.getPlayer()); + } + + public MapleClient getPlayers() { + return this.c; + } + + public void forceReAddItem_NoUpdate(final IItem item, final MapleInventoryType type) { + this.getInventory(type).removeSlot(item.getPosition()); + this.getInventory(type).addFromDB(item); + } + + public void forceReAddItem(final IItem item, final MapleInventoryType type) { + this.forceReAddItem_NoUpdate(item, type); + if (type != MapleInventoryType.UNDEFINED) { + client.sendPacket(MaplePacketCreator.modifyInventory(false, new ModifyInventory(ModifyInventory.Types.UPDATE, item))); + } + } + + public void forceReAddItem_NoUpdate1(Item item, MapleInventoryType type) { + getInventory(type).removeSlot(item.getPosition()); + getInventory(type).addFromDB(item); + } + + public void forceReAddItem1(Item item, MapleInventoryType type) { + forceReAddItem_NoUpdate1(item, type); + type = MapleInventoryType.EQUIP; + if (type != MapleInventoryType.UNDEFINED) { + client.sendPacket(MTSCSPacket.addInventorySlot(type, item, false)); + } + } + + public void forceReAddItem_Flag(final IItem item, final MapleInventoryType type) { + this.forceReAddItem_NoUpdate(item, type); + if (type != MapleInventoryType.UNDEFINED) { + client.sendPacket(MaplePacketCreator.modifyInventory(false, new ModifyInventory(ModifyInventory.Types.ADD, item))); + } + } + + public void silentPartyUpdate() { + if (this.party != null) { + Party.updateParty(this.party.getId(), PartyOperation.SILENT_UPDATE, new MaplePartyCharacter(this)); + } + } + + public boolean isGM() { + return this.gmLevel > 0; + } + + public boolean isAdmin() { + return this.gmLevel >= 5; + } + + public int getGMLevel() { + return this.gmLevel; + } + + public boolean isPlayer() { + return this.gmLevel == 0; + } + + public boolean hasGmLevel(final int level) { + return this.gmLevel >= level; + } + + public void setGmLevelHM(final byte level) { + this.gmLevel = level; + } + + public final MapleInventory getInventory(final MapleInventoryType type) { + return this.inventory[type.ordinal()]; + } + + public final MapleInventory[] getInventorys() { + return this.inventory; + } + + public final void expirationTask() { + this.expirationTask(false); + } + + public final void expirationTask(final boolean pending) { + this.expirationTask(false, pending); + } + + public final void expirationTask(final boolean packet, final boolean pending) { + if (pending) { + if (this.pendingExpiration != null) { + for (final Integer z : this.pendingExpiration) { + this.client.sendPacket(MTSCSPacket.itemExpired(z.intValue())); + } + } + this.pendingExpiration = null; + if (this.pendingSkills != null) { + for (final Integer z : this.pendingSkills) { + this.client.sendPacket(MaplePacketCreator.updateSkill(z.intValue(), 0, 0, -1L)); + this.client.sendPacket(MaplePacketCreator.serverNotice(5, "[" + SkillFactory.getSkillName(z.intValue()) + "] 技能已经过期,系统自动从技能栏位移除。")); + } + } + this.pendingSkills = null; + return; + } + final List ret = (List) new ArrayList(); + final long currenttime = System.currentTimeMillis(); + final List> toberemove = (List>) new ArrayList(); + final List tobeunlock = (List) new ArrayList(); + for (final MapleInventoryType inv : MapleInventoryType.values()) { + for (final IItem item : this.getInventory(inv)) { + final long expiration = item.getExpiration(); + if (expiration != -1L && !GameConstants.isPet(item.getItemId()) && currenttime > expiration) { + if (ItemFlag.LOCK.check((int) item.getFlag())) { + tobeunlock.add(item); + } else { + if (currenttime <= expiration) { + continue; + } + toberemove.add(new Pair(inv, item)); + } + } else { + if (item.getItemId() != 5000054 || item.getPet() == null || item.getPet().getSecondsLeft() > 0) { + continue; + } + toberemove.add(new Pair(inv, item)); + } + } + } + for (final Pair itemz : toberemove) { + final IItem item2 = (IItem) itemz.getRight(); + ret.add(Integer.valueOf(item2.getItemId())); + if (packet) { + this.getInventory((MapleInventoryType) itemz.getLeft()).removeItem(item2.getPosition(), item2.getQuantity(), false, this); + } else { + this.getInventory((MapleInventoryType) itemz.getLeft()).removeItem(item2.getPosition(), item2.getQuantity(), false); + } + } + for (final IItem itemz2 : tobeunlock) { + itemz2.setExpiration(-1L); + itemz2.setFlag((byte) (itemz2.getFlag() - ItemFlag.LOCK.getValue())); + } + this.pendingExpiration = ret; + final List skilz = (List) new ArrayList(); + final List toberem = (List) new ArrayList(); + for (final Entry skil : this.skills.entrySet()) { + if (((SkillEntry) skil.getValue()).expiration != -1L && currenttime > ((SkillEntry) skil.getValue()).expiration) { + toberem.add(skil.getKey()); + } + } + for (final ISkill skil2 : toberem) { + skilz.add(Integer.valueOf(skil2.getId())); + this.skills.remove(skil2); + } + this.pendingSkills = skilz; + } + + public MapleShop getShop() { + return this.shop; + } + + public void setShop(final MapleShop shop) { + this.shop = shop; + } + + public int getMeso() { + return this.meso; + } + + public final int[] getSavedLocations() { + return this.savedLocations; + } + + public int getSavedLocation(final SavedLocationType type) { + return this.savedLocations[type.getValue()]; + } + + public void saveLocation(final SavedLocationType type) { + this.savedLocations[type.getValue()] = this.getMapId(); + } + + public void saveLocation(final SavedLocationType type, final int mapz) { + this.savedLocations[type.getValue()] = mapz; + } + + public void clearSavedLocation(final SavedLocationType type) { + this.savedLocations[type.getValue()] = -1; + } + + public void gainMeso(final int gain, final boolean show) { + this.gainMeso(gain, show, false, false); + } + + public void gainMeso(final int gain, final boolean show, final boolean enableActions) { + this.gainMeso(gain, show, enableActions, false); + } + + public void gainMeso(final int gain, final boolean show, final boolean enableActions, final boolean inChat) { + if (this.meso + gain < 0) { + this.client.sendPacket(MaplePacketCreator.enableActions()); + return; + } + this.meso += gain; + this.updateSingleStat(MapleStat.MESO, this.meso, enableActions); + if (show) { + this.client.sendPacket(MaplePacketCreator.showMesoGain(gain, inChat)); + } + + if (gain > 0) { + List integers = Start.ConfigItemJson.get("jb"); + if (integers == null) return; + if (this.meso > integers.get(0)) { + int i = this.meso / integers.get(0); + this.gainItem(integers.get(1), i); + gainMeso(-integers.get(0) * i, false, true, true); + } + } + + + } + + public void controlMonster(final MapleMonster monster, final boolean aggro) { + if (this.clone) { + return; + } + if (this.吸怪状态) { + monster.setController(null); + } else { + monster.setController(this); + this.controlled.add(monster); + this.client.sendPacket(MobPacket.controlMonster(monster, false, aggro)); + } + monster.sendStatus(this.client); + } + + public void stopControllingMonster(final MapleMonster monster) { + if (this.clone) { + return; + } + if (monster != null && this.controlled.contains(monster)) { + this.controlled.remove(monster); + } + } + + public void checkMonsterAggro(final MapleMonster monster) { + if (this.clone || monster == null) { + return; + } + if (monster.getController() == this) { + monster.setControllerHasAggro(true); + } else { + monster.switchController(this, true); + } + } + + public Set getControlled() { + return this.controlled; + } + + public int getControlledSize() { + return this.controlled.size(); + } + + public int getAccountID() { + return this.accountid; + } + + public void mobKilled(final int id, final int skillID) { + try { + for (final MapleQuestStatus q : this.quests.values()) { + if (q.getStatus() == 1) { + if (!q.hasMobKills()) { + continue; + } + if (!q.mobKilled(id, skillID)) { + continue; + } + this.client.sendPacket(MaplePacketCreator.updateQuestMobKills(q)); + if (!q.getQuest().canComplete(this, null)) { + continue; + } + this.client.sendPacket(MaplePacketCreator.getShowQuestCompletion(q.getQuest().getId())); + } + } + } catch (Exception ex) { + ex.printStackTrace(); + FileoutputUtil.outError("logs/杀死怪物计次异常.txt", (Throwable) ex); + } + } + + public final List getStartedQuests() { + final List ret = (List) new LinkedList(); + for (final MapleQuestStatus q : this.quests.values()) { + if (q.getStatus() == 1 && !q.isCustom()) { + ret.add(q); + } + } + return ret; + } + + public final List getCompletedQuests() { + final List ret = (List) new LinkedList(); + for (final MapleQuestStatus q : this.quests.values()) { + if (q.getStatus() == 2 && !q.isCustom()) { + ret.add(q); + } + } + return ret; + } + + public Map getSkills() { + return Collections.unmodifiableMap(this.skills); + } + + public byte getSkillLevel(final ISkill skill) { + final SkillEntry ret = (SkillEntry) this.skills.get(skill); + if (ret == null || ret.skillevel <= 0) { + return 0; + } + return (byte) Math.min((int) skill.getMaxLevel(), ret.skillevel + (skill.isBeginnerSkill() ? 0 : this.stats.incAllskill)); + } + + public byte getMasterLevel(final int skill) { + return this.getMasterLevel(SkillFactory.getSkill(skill)); + } + + public byte getMasterLevel(final ISkill skill) { + final SkillEntry ret = (SkillEntry) this.skills.get(skill); + if (ret == null) { + return 0; + } + return ret.masterlevel; + } + + public void levelUp() { + if (this.getLevel() >= this.maxLevel) { + return; + } + if (this.getLevel() >= this.maxLevel1) { + return; + } + if (((Integer) Start.ConfigValuesMap.get("世界等级开关")).intValue() > 0 && this.getLevel() >= Start.世界等级) { + return; + } + if (this.getLevel() >= 取限制等级()) { + return; + } + final MapleCharacter player = this.client.getPlayer(); + final boolean 转生后升级是否加血量 = Boolean.parseBoolean(ServerProperties.getProperty("pp.转生后升级是否加血量")); + final boolean 转生后升级是否加蓝量 = Boolean.parseBoolean(ServerProperties.getProperty("pp.转生后升级是否加蓝量")); + final boolean 转生后升级是否加属性 = Boolean.parseBoolean(ServerProperties.getProperty("pp.转生后升级是否加属性")); + final int 转生后一转升级给属性点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后一转升级给属性点")); + final int 转生后二转升级给属性点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后二转升级给属性点")); + final int 转生后三转升级给属性点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后三转升级给属性点")); + final int 转生后四转升级给属性点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后四转升级给属性点")); + final int 转生后五转升级给属性点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后五转升级给属性点")); + final int 转生后六转升级给属性点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后六转升级给属性点")); + final int 转生后七转升级给属性点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后七转升级给属性点")); + final int 转生后八转升级给属性点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后八转升级给属性点")); + final int 转生后九转升级给属性点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后九转升级给属性点")); + final int 转生后十转升级给属性点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后十转升级给属性点")); + int 转生后升级给属性点 = 5; + final boolean 转生后升级是否加技能点 = Boolean.parseBoolean(ServerProperties.getProperty("pp.转生后升级是否加技能点")); + final int 转生后一转升级给技能点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后一转升级给技能点")); + final int 转生后二转升级给技能点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后二转升级给技能点")); + final int 转生后三转升级给技能点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后三转升级给技能点")); + final int 转生后四转升级给技能点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后四转升级给技能点")); + final int 转生后五转升级给技能点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后五转升级给技能点")); + final int 转生后六转升级给技能点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后六转升级给技能点")); + final int 转生后七转升级给技能点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后七转升级给技能点")); + final int 转生后八转升级给技能点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后八转升级给技能点")); + final int 转生后九转升级给技能点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后九转升级给技能点")); + final int 转生后十转升级给技能点 = Integer.parseInt(ServerProperties.getProperty("pp.转生后十转升级给技能点")); + int 转生后升级给技能点 = 3; + switch (player.getOneTimeLog("转生次数")) { + case 0: { + 转生后升级给属性点 = 5; + 转生后升级给技能点 = 3; + break; + } + case 1: { + 转生后升级给属性点 = 转生后一转升级给属性点; + 转生后升级给技能点 = 转生后一转升级给属性点; + break; + } + case 2: { + 转生后升级给属性点 = 转生后二转升级给属性点; + 转生后升级给技能点 = 转生后二转升级给技能点; + break; + } + case 3: { + 转生后升级给属性点 = 转生后三转升级给属性点; + 转生后升级给技能点 = 转生后三转升级给技能点; + break; + } + case 4: { + 转生后升级给属性点 = 转生后四转升级给属性点; + 转生后升级给技能点 = 转生后四转升级给技能点; + break; + } + case 5: { + 转生后升级给属性点 = 转生后五转升级给属性点; + 转生后升级给技能点 = 转生后五转升级给技能点; + break; + } + case 6: { + 转生后升级给属性点 = 转生后六转升级给属性点; + 转生后升级给技能点 = 转生后六转升级给技能点; + break; + } + case 7: { + 转生后升级给属性点 = 转生后七转升级给属性点; + 转生后升级给技能点 = 转生后七转升级给技能点; + break; + } + case 8: { + 转生后升级给属性点 = 转生后八转升级给属性点; + 转生后升级给技能点 = 转生后八转升级给技能点; + break; + } + case 9: { + 转生后升级给属性点 = 转生后九转升级给属性点; + 转生后升级给技能点 = 转生后九转升级给技能点; + break; + } + case 10: { + 转生后升级给属性点 = 转生后十转升级给属性点; + 转生后升级给技能点 = 转生后十转升级给技能点; + break; + } + default: { + 转生后升级给属性点 = 5; + 转生后升级给技能点 = 3; + break; + } + } + if (player.getOneTimeLog("转生次数") > 0) { + if (转生后升级是否加属性) { + this.remainingAp += (short) 转生后升级给属性点; + } + } else if (GameConstants.isKOC((int) this.job)) { + if (this.level <= 70) { + this.remainingAp += 6; + } else { + this.remainingAp += 5; + } + } else { + this.remainingAp += 5; + } + int maxhp = this.stats.getMaxHp(); + int maxmp = this.stats.getMaxMp(); + if (this.job == 0 || this.job == 1000 || this.job == 2000) { + if (player.getOneTimeLog("转生次数") > 0) { + if (转生后升级是否加血量) { + maxhp += Randomizer.rand(12, 16); + } + if (转生后升级是否加蓝量) { + maxmp += Randomizer.rand(10, 12); + } + } else { + maxhp += Randomizer.rand(12, 16); + maxmp += Randomizer.rand(10, 12); + } + } else if (this.job >= 100 && this.job <= 132) { + final ISkill improvingMaxHP = SkillFactory.getSkill(1000001); + final int slevel = this.getSkillLevel(improvingMaxHP); + if (player.getOneTimeLog("转生次数") > 0) { + if (转生后升级是否加血量) { + if (slevel > 0) { + maxhp += improvingMaxHP.getEffect(slevel).getX(); + } + maxhp += Randomizer.rand(24, 28); + } + if (转生后升级是否加蓝量) { + maxmp += Randomizer.rand(4, 6); + } + } else { + if (slevel > 0) { + maxhp += improvingMaxHP.getEffect(slevel).getX(); + } + maxhp += Randomizer.rand(24, 28); + maxmp += Randomizer.rand(4, 6); + } + } else if (this.job >= 200 && this.job <= 232) { + final ISkill improvingMaxMP = SkillFactory.getSkill(2000001); + final int slevel = this.getSkillLevel(improvingMaxMP); + if (player.getOneTimeLog("转生次数") > 0) { + if (转生后升级是否加蓝量) { + if (slevel > 0) { + maxmp += improvingMaxMP.getEffect(slevel).getX() * 2; + } + maxmp += Randomizer.rand(22, 24); + } + if (转生后升级是否加血量) { + maxhp += Randomizer.rand(10, 14); + } + } else { + if (slevel > 0) { + maxmp += improvingMaxMP.getEffect(slevel).getX() * 2; + } + maxmp += Randomizer.rand(22, 24); + maxhp += Randomizer.rand(10, 14); + } + } else if ((this.job >= 300 && this.job <= 322) || (this.job >= 400 && this.job <= 422) || (this.job >= 1300 && this.job <= 1311) || (this.job >= 1400 && this.job <= 1411)) { + if (player.getOneTimeLog("转生次数") > 0) { + if (转生后升级是否加血量) { + maxhp += Randomizer.rand(20, 24); + } + if (转生后升级是否加蓝量) { + maxmp += Randomizer.rand(14, 16); + } + } else { + maxhp += Randomizer.rand(20, 24); + maxmp += Randomizer.rand(14, 16); + } + } else if (this.job >= 500 && this.job <= 522) { + final ISkill improvingMaxHP = SkillFactory.getSkill(5100000); + final int slevel = this.getSkillLevel(improvingMaxHP); + if (player.getOneTimeLog("转生次数") > 0) { + if (转生后升级是否加血量) { + if (slevel > 0) { + maxhp += improvingMaxHP.getEffect(slevel).getX(); + } + maxhp += Randomizer.rand(22, 26); + } + if (转生后升级是否加蓝量) { + maxmp += Randomizer.rand(18, 22); + } + } else { + if (slevel > 0) { + maxhp += improvingMaxHP.getEffect(slevel).getX(); + } + maxhp += Randomizer.rand(22, 26); + maxmp += Randomizer.rand(18, 22); + } + } else if (this.job >= 1100 && this.job <= 1111) { + final ISkill improvingMaxHP = SkillFactory.getSkill(11000000); + final int slevel = this.getSkillLevel(improvingMaxHP); + if (player.getOneTimeLog("转生次数") > 0) { + if (转生后升级是否加血量) { + if (slevel > 0) { + maxhp += improvingMaxHP.getEffect(slevel).getX(); + } + maxhp += Randomizer.rand(24, 28); + } + if (转生后升级是否加蓝量) { + maxmp += Randomizer.rand(4, 6); + } + } else { + if (slevel > 0) { + maxhp += improvingMaxHP.getEffect(slevel).getX(); + } + maxhp += Randomizer.rand(24, 28); + maxmp += Randomizer.rand(4, 6); + } + } else if (this.job >= 1200 && this.job <= 1212) { + final ISkill improvingMaxMP = SkillFactory.getSkill(12000000); + final int slevel = this.getSkillLevel(improvingMaxMP); + if (player.getOneTimeLog("转生次数") > 0) { + if (转生后升级是否加蓝量) { + if (slevel > 0) { + maxmp += improvingMaxMP.getEffect(slevel).getX() * 2; + } + maxmp += Randomizer.rand(22, 24); + } + if (转生后升级是否加血量) { + maxhp += Randomizer.rand(10, 14); + } + } else { + if (slevel > 0) { + maxmp += improvingMaxMP.getEffect(slevel).getX() * 2; + } + maxmp += Randomizer.rand(22, 24); + maxhp += Randomizer.rand(10, 14); + } + } else if (this.job >= 1500 && this.job <= 1512) { + final ISkill improvingMaxHP = SkillFactory.getSkill(15100000); + final int slevel = this.getSkillLevel(improvingMaxHP); + if (player.getOneTimeLog("转生次数") > 0) { + if (转生后升级是否加血量) { + if (slevel > 0) { + maxhp += improvingMaxHP.getEffect(slevel).getX(); + } + maxhp += Randomizer.rand(22, 26); + } + if (转生后升级是否加蓝量) { + maxmp += Randomizer.rand(18, 22); + } + } else { + if (slevel > 0) { + maxhp += improvingMaxHP.getEffect(slevel).getX(); + } + maxhp += Randomizer.rand(22, 26); + maxmp += Randomizer.rand(18, 22); + } + } else if (this.job >= 2100 && this.job <= 2112) { + if (player.getOneTimeLog("转生次数") > 0) { + if (转生后升级是否加血量) { + maxhp += Randomizer.rand(50, 52); + } + if (转生后升级是否加蓝量) { + maxmp += Randomizer.rand(4, 6); + } + } else { + maxhp += Randomizer.rand(50, 52); + maxmp += Randomizer.rand(4, 6); + } + } else if (player.getOneTimeLog("转生次数") > 0) { + if (转生后升级是否加血量) { + maxhp += Randomizer.rand(50, 100); + } + if (转生后升级是否加蓝量) { + maxmp += Randomizer.rand(50, 100); + } + } else { + maxhp += Randomizer.rand(50, 100); + maxmp += Randomizer.rand(50, 100); + } + if (player.getOneTimeLog("转生次数") > 0) { + if (转生后升级是否加蓝量) { + maxmp += this.stats.getTotalInt() / 10; + } + } else { + maxmp += this.stats.getTotalInt() / 10; + } + this.exp -= GameConstants.getExpNeededForLevel((int) this.level); + if (this.exp < 0) { + this.exp = 0; + } + ++this.level; + maxhp = (short) Math.min(30000, Math.abs(maxhp)); + maxmp = (short) Math.min(30000, Math.abs(maxmp)); + final Map statup = new EnumMap(MapleStat.class); + statup.put(MapleStat.MAXHP, (long) maxhp); + statup.put(MapleStat.MAXMP, (long) maxmp); + statup.put(MapleStat.HP, (long) maxhp); + statup.put(MapleStat.MP, (long) maxmp); + statup.put(MapleStat.EXP, exp); + statup.put(MapleStat.LEVEL, (long) level); + if ((this.job != 0 && this.job != 1000 && this.job != 2000 && this.job != 2001 && this.job != 3000 && this.level > 9) || this.job == 200) { + if (player.getOneTimeLog("转生次数") > 0) { + if (转生后升级是否加技能点) { + final int[] remainingSp = this.remainingSp; + final int skillBook = GameConstants.getSkillBook((int) this.job); + remainingSp[skillBook] += 转生后升级给技能点; + this.client.sendPacket(MaplePacketCreator.updateSp(this, false)); + } + } else { + final int[] remainingSp2 = this.remainingSp; + final int skillBook2 = GameConstants.getSkillBook((int) this.job); + remainingSp2[skillBook2] += 3; + this.client.sendPacket(MaplePacketCreator.updateSp(this, false)); + } + } else if (this.level <= 10) { + this.stats.setStr((short) (this.stats.getStr() + this.remainingAp)); + this.remainingAp = 0; + statup.put(MapleStat.STR, (long) stats.getStr()); + } + statup.put(MapleStat.AVAILABLEAP, (long) remainingAp); + this.stats.setMaxHp((short) maxhp); + this.stats.setMaxMp((short) maxmp); + this.stats.setHp((int) (short) maxhp); + this.stats.setMp((int) (short) maxmp); + this.client.sendPacket(MaplePacketCreator.updatePlayerStats(statup, this)); + this.map.broadcastMessage(this, MaplePacketCreator.showForeignEffect(this.getId(), 0), false); + this.stats.recalcLocalStats(); + this.silentPartyUpdate(); + this.guildUpdate(); + this.familyUpdate(); + this.DoLevelMsg(); + if (this.level >= 20 && this.level <= 25 && !this.isGM()) { + this.DoLevelMap(); + } + if ((this.job == 1000 || (this.job >= 1100 && this.job <= 1111) || (this.job >= 1200 && this.job <= 1212) || (this.job >= 1300 && this.job <= 1312) || (this.job >= 1400 && this.job <= 1412) || (this.job >= 1500 && this.job <= 1512)) && this.level == 120) { + Broadcast.broadcastMessage(MaplePacketCreator.serverNotice(6, "[恭贺] 玩家" + this.getName() + " 皇家骑士团到达120级。")); + } + if (this.level == 200) { + Broadcast.broadcastMessage(MaplePacketCreator.serverNotice(6, "[恭贺] 玩家" + this.getName() + " 到达200级。")); + } + if (this.level == 100 && this.getStLog() >= 1) { + final int stjfid = this.getStLogid(this.id); + if (this.getStjfLog(stjfid) >= 1) { + this.updateStjfLog(stjfid, this.getStjf(stjfid) + 1); + } else { + this.setStjfLog(stjfid, 1); + } + } + if (!this.isGM() && ((Integer) Start.ConfigValuesMap.get("玩家升级喇叭")).intValue() > 0) { + final StringBuilder sb = new StringBuilder(); + sb.append("[升级公告]:"); + sb.append(this.getName()).append("在地图 : " + this.map.getMapName()).append(",恭喜达到了").append((int) this.level).append("加油,扑街~!"); + Broadcast.broadcastMessage(MaplePacketCreator.serverNotice(2, sb.toString())); + if (((Integer) Start.ConfigValuesMap.get("升级群消息通知")).intValue() > 0) { + RobotSocket.robbatSpeak(sb.toString()); + } + } + FileoutputUtil.logToFile("logs/Data/升级日志.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + this.getClient().getSession().remoteAddress().toString().split(":")[0] + " 账号: " + this.getClient().getAccountName() + " 玩家: " + this.getName() + " 升级到" + (int) this.level); + } + + public void DoLevelMsg() { + if (this.level == 200 && !this.isGM()) { + final StringBuilder sb = new StringBuilder("[恭喜] "); + final IItem medal = this.getInventory(MapleInventoryType.EQUIPPED).getItem((short) (-21)); + if (medal != null) { + sb.append("<"); + sb.append(MapleItemInformationProvider.getInstance().getName(medal.getItemId())); + sb.append("> "); + } + sb.append(this.getName()); + sb.append(" 达到了等级200级!请大家一起恭喜他!"); + Broadcast.broadcastMessage(MaplePacketCreator.serverNotice(6, sb.toString())); + } + if (GameConstants.isAran((int) this.job)) { + switch (this.level) { + case 30: { + this.client.sendPacket(MaplePacketCreator.startMapEffect("恭喜达到30等请回瑞恩岛二转吧。", 5120000, true)); + break; + } + case 70: { + this.client.sendPacket(MaplePacketCreator.startMapEffect("恭喜达到70等请到冰原雪域长老公管三转吧。", 5120000, true)); + break; + } + case 120: { + this.client.sendPacket(MaplePacketCreator.startMapEffect("恭喜达到120等请回神木村祭司森林四转吧。", 5120000, true)); + break; + } + } + } + if (GameConstants.isKOC((int) this.job) && this.level == 70) { + this.client.sendPacket(MaplePacketCreator.startMapEffect("恭喜达到70等请回耶雷弗三转吧。", 5120000, true)); + } + } + + public void DoLevelMap() { + boolean warp = false; + int Return_Map = 0; + switch (this.getMapId()) { + case 910060000: { + warp = true; + Return_Map = 100010000; + break; + } + case 910120000: { + warp = true; + Return_Map = 100040000; + break; + } + case 910220000: { + warp = true; + Return_Map = 101040000; + break; + } + case 910310000: { + warp = true; + Return_Map = 103010000; + break; + } + case 912030000: { + warp = true; + Return_Map = 120010000; + break; + } + } + if (warp) { + final MapleMap warpMap = this.client.getChannelServer().getMapFactory().getMap(Return_Map); + if (warpMap != null) { + this.changeMap(warpMap, warpMap.getPortal(0)); + this.dropMessage("由于你的等级超过20,已经不符合新手需求,将把您传出训练场。"); + } + } + } + + public void changeKeybinding(final int key, final byte type, final int action) { + if (type != 0) { + this.keylayout.Layout().put(Integer.valueOf(key), new Pair(Byte.valueOf(type), Integer.valueOf(action))); + } else { + this.keylayout.Layout().remove(Integer.valueOf(key)); + } + } + + public void GetSkillByKeybinding(int key, int type, int action, byte level) { + ISkill skill = SkillFactory.getSkill(action); + this.changeSkillLevel(skill, level, (byte) skill.getMaxLevel()); + this.changeKeybinding(key, (byte) type, action); + this.getClient().sendPacket(MaplePacketCreator.getKeymap(this.getKeyLayout())); + } + + public boolean changeKeybinding(String key_name, byte tybe, int action) { + int key; + switch (key_name.toUpperCase()) { + case "F1": + case "F2": + case "F3": + case "F4": + case "F5": + case "F6": + case "F7": + case "F8": + case "F9": + case "F10": + case "F11": + case "F12": + return true; + } + + return false; + } + + public void sendMacros() { + final int i = 0; + if (i < 5) { + this.client.sendPacket(MaplePacketCreator.getMacros(this.skillMacros)); + } + } + + public void updateMacros(final int position, final SkillMacro updateMacro) { + this.skillMacros[position] = updateMacro; + } + + public final SkillMacro[] getMacros() { + return this.skillMacros; + } + + public void tempban(final String reason, final Calendar duration, final int greason, final boolean bandIp) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + FileoutputUtil.logToFile("logs/Hack/Ban/MySql_input.txt", "\r\n[tempBan] " + FileoutputUtil.NowTime() + " IP: " + this.client.getSession().remoteAddress().toString().split(":")[0] + " MAC: " + this.getClient().getMacs() + " 理由: " + reason, false, false); + PreparedStatement ps = con.prepareStatement("INSERT INTO ipbans (ip) VALUES (?)"); + ps.setString(1, this.client.getSession().remoteAddress().toString().split(":")[0]); + ps.executeUpdate(); + ps.close(); + ps = con.prepareStatement("UPDATE accounts SET tempban = ?, banreason = ?, greason = ? WHERE id = ?"); + final Timestamp TS = new Timestamp(duration.getTimeInMillis()); + ps.setTimestamp(1, TS); + ps.setString(2, reason); + ps.setInt(3, greason); + ps.setInt(4, this.accountid); + ps.execute(); + ps.close(); + con.close(); + this.client.disconnect(true, false); + } catch (SQLException ex) { + System.err.println("Error while tempbanning" + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + + public static boolean ban(final String ip, final String id, final String reason, final boolean accountId, final int gmlevel, final boolean hellban) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + if (!isVpn(ip) && id.matches("/[0-9]{1,3}\\..*")) { + FileoutputUtil.logToFile("logs/Hack/Ban/MySql_input.txt", "\r\n[Ban-1] " + FileoutputUtil.NowTime() + " IP: " + ip + " 理由: " + reason, false, false); + final PreparedStatement ps = con.prepareStatement("INSERT INTO ipbans (ip) VALUES (?)"); + ps.setString(1, id); + ps.executeUpdate(); + ps.close(); + return true; + } + PreparedStatement ps; + if (accountId) { + ps = con.prepareStatement("SELECT id FROM accounts WHERE name = ?"); + } else { + ps = con.prepareStatement("SELECT accountid FROM characters WHERE name = ?"); + } + boolean ret = false; + ps.setString(1, id); + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + final int z = rs.getInt(1); + try (final PreparedStatement psb = con.prepareStatement("UPDATE accounts SET banned = 1, banreason = ? WHERE id = ? AND gm < ?")) { + psb.setString(1, reason); + psb.setInt(2, z); + psb.setInt(3, gmlevel); + psb.execute(); + psb.close(); + } + if (gmlevel > 100) { + try (final PreparedStatement psa = con.prepareStatement("SELECT * FROM accounts WHERE id = ?")) { + psa.setInt(1, z); + try (final ResultSet rsa = psa.executeQuery()) { + if (rsa.next()) { + final String sessionIP = rsa.getString("sessionIP"); + if (sessionIP != null && sessionIP.matches("/[0-9]{1,3}\\..*")) { + FileoutputUtil.logToFile("logs/Hack/Ban/MySql_input.txt", "\r\n[Ban-2] " + FileoutputUtil.NowTime() + " IP: " + ip + " 理由: " + reason, false, false); + } + final String macData = rsa.getString("macs"); + if (macData != null) { + MapleClient.banMacs(macData); + } + if (hellban) { + try (final PreparedStatement pss = con.prepareStatement("UPDATE accounts SET banned = 1, banreason = ? WHERE email = ?" + ((sessionIP == null) ? "" : " OR SessionIP = ?"))) { + pss.setString(1, reason); + pss.setString(2, rsa.getString("email")); + if (sessionIP != null) { + pss.setString(3, sessionIP); + } + pss.execute(); + pss.close(); + } + } + } + rsa.close(); + } + psa.close(); + } + } + ret = true; + } + rs.close(); + } + ps.close(); + con.close(); + return ret; + } catch (SQLException ex) { + System.err.println("Error while banning" + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + return false; + } + } + + public final boolean ban(final String reason, final boolean banIP, final boolean autoban, final boolean hellban) { + if (this.lastmonthfameids == null) { + throw new RuntimeException("Trying to ban a non-loaded character (testhack)"); + } + final String ip = this.client.getSessionIPAddress(); + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = con.prepareStatement("UPDATE accounts SET banned = ?, banreason = ? WHERE id = ?"); + ps.setInt(1, autoban ? 2 : 1); + ps.setString(2, reason); + ps.setInt(3, this.accountid); + ps.execute(); + ps.close(); + if (!isVpn(ip)) { + FileoutputUtil.logToFile("logs/Hack/Ban/MySql_input.txt", "\r\n" + FileoutputUtil.NowTime() + " IP: " + ip + " MAC: " + this.getClient().getMacs() + " 理由: " + reason, false, false); + ps = con.prepareStatement("INSERT INTO ipbans (ip) VALUES (?)"); + ps.setString(1, ip); + ps.executeUpdate(); + ps.close(); + try { + for (final ChannelServer cs : ChannelServer.getAllInstances()) { + for (final MapleCharacter chr : cs.getPlayerStorage().getAllCharactersThreadSafe()) { + if (chr.getClient().getSessionIPAddress().equals(this.client.getSessionIPAddress()) && !chr.getClient().isGm()) { + chr.getClient().disconnect(true, false); + chr.getClient().getSession().close(); + } + } + } + } catch (Exception ex3) { + } + } + this.client.banMacs(); + if (hellban) { + try (final PreparedStatement psa = con.prepareStatement("SELECT * FROM accounts WHERE id = ?")) { + psa.setInt(1, this.accountid); + try (final ResultSet rsa = psa.executeQuery()) { + if (rsa.next()) { + try (final PreparedStatement pss = con.prepareStatement("UPDATE accounts SET banned = ?, banreason = ? WHERE email = ? OR SessionIP = ?")) { + pss.setInt(1, autoban ? 2 : 1); + pss.setString(2, reason); + pss.setString(3, rsa.getString("email")); + pss.setString(4, ip); + pss.execute(); + pss.close(); + } + } + rsa.close(); + } + psa.close(); + } + } + con.close(); + } catch (SQLException ex) { + System.err.println("Error while banning" + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + return false; + } + try { + this.client.disconnect(true, false); + } catch (Exception ex2) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex2); + } + return true; + } + + public boolean OfflineBanByName(final String name, final String reason) { + int id = 0; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = null; + ps = con.prepareStatement("select id from characters where name = ?"); + ps.setString(1, name); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + id = rs.getInt("id"); + } + rs.close(); + ps.close(); + con.close(); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return id != 0 && this.OfflineBanById(id, reason); + } + + public boolean OfflineBanById(final int id, final String reason) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final Statement stmt = con.createStatement(); + final int z = id; + int acid = 0; + String ip = ""; + String mac = ""; + ResultSet rs = stmt.executeQuery("select accountid from characters where id = " + id); + while (rs.next()) { + acid = rs.getInt("accountid"); + } + if (acid == 0) { + return false; + } + try (final PreparedStatement psb = con.prepareStatement("UPDATE accounts SET banned = 1, banreason = ? WHERE id = ?")) { + psb.setString(1, reason); + psb.setInt(2, acid); + psb.execute(); + psb.close(); + } + rs = stmt.executeQuery("select SessionIP, macs from accounts where id = " + acid); + while (rs.next()) { + ip = rs.getString("SessionIP"); + mac = rs.getString("macs"); + } + if (!isVpn(ip)) { + FileoutputUtil.logToFile("logs/Hack/Ban/MySql_input.txt", "\r\n[offlineBan] " + FileoutputUtil.NowTime() + " IP: " + ip + " MAC: " + this.getClient().getMacs() + " 理由: " + reason, false, false); + final PreparedStatement ps = con.prepareStatement("INSERT INTO ipbans (ip) VALUES (?)"); + ps.setString(1, ip); + ps.executeUpdate(); + ps.close(); + try { + for (final ChannelServer cs : ChannelServer.getAllInstances()) { + for (final MapleCharacter chr : cs.getPlayerStorage().getAllCharactersThreadSafe()) { + if (chr.getClient().getSessionIPAddress().equals(ip) && !chr.getClient().isGm()) { + chr.getClient().disconnect(true, false); + chr.getClient().getSession().close(); + } + } + } + } catch (Exception ex2) { + } + } + final MapleClient client = this.client; + MapleClient.banMacs(mac); + rs.close(); + stmt.close(); + con.close(); + return true; + } catch (Exception ex) { + System.err.println("封锁出现错误 " + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + return false; + } + } + + @Override + public int getObjectId() { + return this.getId(); + } + + @Override + public void setObjectId(final int id) { + throw new UnsupportedOperationException(); + } + + public MapleStorage getStorage() { + return this.storage; + } + + public void addVisibleMapObject(MapleMapObject mo) { + if (clone) { + return; + } + visibleMapObjectsLock.writeLock().lock(); + try { + visibleMapObjects.add(mo); + } finally { + visibleMapObjectsLock.writeLock().unlock(); + } + } + + public void removeVisibleMapObject(MapleMapObject mo) { + if (clone) { + return; + } + visibleMapObjectsLock.writeLock().lock(); + try { + visibleMapObjects.remove(mo); + } finally { + visibleMapObjectsLock.writeLock().unlock(); + } + } + + public boolean isMapObjectVisible(MapleMapObject mo) { + visibleMapObjectsLock.readLock().lock(); + try { + return !clone && visibleMapObjects.contains(mo); + } finally { + visibleMapObjectsLock.readLock().unlock(); + } + } + + public Collection getAndWriteLockVisibleMapObjects() { + visibleMapObjectsLock.writeLock().lock(); + return visibleMapObjects; + } + + public void unlockWriteVisibleMapObjects() { + visibleMapObjectsLock.writeLock().unlock(); + } + + public boolean isAlive() { + return this.stats.getHp() > 0; + } + + @Override + public void sendDestroyData(final MapleClient client) { + client.sendPacket(MaplePacketCreator.removePlayerFromMap(this.getObjectId())); + for (final WeakReference chr : this.clones) { + if (chr.get() != null) { + ((MapleCharacter) chr.get()).sendDestroyData(client); + } + } + } + + @Override + public void sendSpawnData(final MapleClient client) { + if (client.getPlayer().allowedToTarget(this)) { + client.sendPacket(MaplePacketCreator.spawnPlayerMapobject(this)); + if (this.getParty() != null && !this.isClone()) { + this.updatePartyMemberHP(); + this.receivePartyMemberHP(); + } + for (final MaplePet pet : this.getSummonedPets()) { + if (this.getId() != client.getPlayer().getId()) { + client.sendPacket(PetPacket.showPet(this, pet, false, false)); + } + } + for (final WeakReference chr : this.clones) { + if (chr.get() != null) { + ((MapleCharacter) chr.get()).sendSpawnData(client); + } + } + if (this.summons != null) { + for (final MapleSummon summon : this.summons.values()) { + client.sendPacket(MaplePacketCreator.spawnSummon(summon, false)); + } + } + if (this.followid > 0) { + client.sendPacket(MaplePacketCreator.followEffect(this.followinitiator ? this.id : this.followid, this.followinitiator ? this.followid : this.id, null)); + } + } + } + + public final void equipChanged() { + if (this.map == null) { + return; + } + this.map.broadcastMessage(this, MaplePacketCreator.updateCharLook(this), false); + this.stats.recalcLocalStats(); + if (this.getMessenger() != null) { + Messenger.updateMessenger(this.getMessenger().getId(), this.getName(), this.client.getChannel()); + } + this.saveToDB(false, false); + } + + public final MaplePet getPet(final int index) { + byte count = 0; + for (final MaplePet pet : this.pets) { + if (pet.getSummoned()) { + if (count == index) { + return pet; + } + ++count; + } + } + return null; + } + + public void addPet(final MaplePet pet) { + if (this.pets.contains(pet)) { + this.pets.remove(pet); + } + this.pets.add(pet); + } + + public void removePet(final MaplePet pet) { + pet.setSummoned(0); + this.pets.remove(pet); + } + + public final List getSummonedPets() { + final List ret = (List) new ArrayList(); + for (int i = 0; i < 3; ++i) { + ret.add(null); + } + for (int i = 0; i < 3; ++i) { + for (final MaplePet pet : this.pets) { + if (pet != null && pet.getSummoned()) { + final int index = pet.getSummonedValue() - 1; + if (index == i) { + ret.remove(index); + ret.add(index, pet); + break; + } + continue; + } + } + } + final List nullArr = (List) new ArrayList(); + nullArr.add(null); + ret.removeAll((Collection) nullArr); + return ret; + } + + public final MaplePet getSummonedPet(final int index) { + for (final MaplePet pet : this.getSummonedPets()) { + if (pet.getSummonedValue() - 1 == index) { + return pet; + } + } + return null; + } + + public final void shiftPetsRight() { + final List petsz = this.getSummonedPets(); + if (petsz.size() >= 3 || petsz.size() < 1) { + return; + } + final boolean[] indexBool = {false, false, false}; + for (int i = 0; i < 3; ++i) { + for (final MaplePet p : petsz) { + if (p.getSummonedValue() == i + 1) { + indexBool[i] = true; + } + } + } + if (petsz.size() > 1) { + if (!indexBool[2]) { + ((MaplePet) petsz.get(0)).setSummoned(2); + ((MaplePet) petsz.get(1)).setSummoned(3); + } else if (!indexBool[1]) { + ((MaplePet) petsz.get(0)).setSummoned(2); + } + } else if (indexBool[0]) { + ((MaplePet) petsz.get(0)).setSummoned(2); + } + } + + public final int getPetSlotNext() { + final List petsz = this.getSummonedPets(); + int index = 0; + if (petsz.size() >= 3) { + this.unequipPet(this.getSummonedPet(0), false); + } else { + final boolean[] indexBool = {false, false, false}; + for (int i = 0; i < 3; ++i) { + for (final MaplePet p : petsz) { + if (p.getSummonedValue() == i + 1) { + indexBool[i] = true; + break; + } + } + } + for (final boolean b : indexBool) { + if (!b) { + break; + } + ++index; + } + index = Math.min(index, 2); + for (final MaplePet p2 : petsz) { + if (p2.getSummonedValue() == index + 1) { + this.unequipPet(p2, false); + } + } + } + return index; + } + + public final byte getPetIndex(final MaplePet petz) { + return (byte) Math.max(-1, petz.getSummonedValue() - 1); + } + + public final byte getPetIndex(final int petId) { + for (final MaplePet pet : this.getSummonedPets()) { + if (pet.getUniqueId() == petId) { + return (byte) Math.max(-1, pet.getSummonedValue() - 1); + } + } + return -1; + } + + public final List getPets() { + return this.pets; + } + + public final void unequipAllPets() { + for (final MaplePet pet : this.getSummonedPets()) { + this.unequipPet(pet, false); + } + } + + public void unequipPet(final MaplePet pet, final boolean hunger) { + if (pet.getSummoned()) { + pet.saveToDb(); + final List summonedPets = this.getSummonedPets(); + if (summonedPets.contains(pet)) { + summonedPets.remove(pet); + int i = 1; + for (final MaplePet p : summonedPets) { + if (p == null) { + continue; + } + p.setSummoned(i); + ++i; + } + } + if (this.map != null) { + this.map.broadcastMessage(this, PetPacket.showPet(this, pet, true, hunger), true); + } + pet.setSummoned(0); + this.client.sendPacket(PetPacket.petStatUpdate(this)); + this.client.sendPacket(MaplePacketCreator.enableActions()); + } + } + + public final long getLastFameTime() { + return this.lastfametime; + } + + public final List getFamedCharacters() { + return this.lastmonthfameids; + } + + public FameStatus canGiveFame(final MapleCharacter from) { + if (this.lastfametime >= System.currentTimeMillis() - 86400000L) { + return FameStatus.NOT_TODAY; + } + if (from == null || this.lastmonthfameids == null || this.lastmonthfameids.contains(Integer.valueOf(from.getId()))) { + return FameStatus.NOT_THIS_MONTH; + } + return FameStatus.OK; + } + + public void hasGivenFame(final MapleCharacter to) { + this.lastfametime = System.currentTimeMillis(); + this.lastmonthfameids.add(Integer.valueOf(to.getId())); + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("INSERT INTO famelog (characterid, characterid_to) VALUES (?, ?)")) { + ps.setInt(1, this.getId()); + ps.setInt(2, to.getId()); + ps.execute(); + } catch (SQLException e) { + System.err.println("ERROR writing famelog for char " + this.getName() + " to " + to.getName() + e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + } + + public final MapleKeyLayout getKeyLayout() { + return this.keylayout; + } + + public MapleParty getParty() { + return this.party; + } + + public int getPartyId() { + return (this.party != null) ? this.party.getId() : -1; + } + + public byte getWorld() { + return this.world; + } + + public void setWorld(final byte world) { + this.world = world; + } + + public void setParty(final MapleParty party) { + this.party = party; + } + + public MapleTrade getTrade() { + return this.trade; + } + + public void setTrade(final MapleTrade trade) { + this.trade = trade; + } + + public EventInstanceManager getEventInstance() { + return this.eventInstance; + } + + public void setEventInstance(final EventInstanceManager eventInstance) { + this.eventInstance = eventInstance; + } + + public void addDoor(final MapleDoor door) { + this.doors.add(door); + } + + public void clearDoors() { + this.doors.clear(); + } + + public List getDoors() { + return new ArrayList(this.doors); + } + + public void setSmega() { + if (this.smega) { + this.smega = false; + this.dropMessage(5, "由于您关闭了显示广播,所以您看不见任何的广播,如果要打开请打@TSmega。"); + } else { + this.smega = true; + this.dropMessage(5, "目前已经打开显示广播,若要再次关闭请打@TSmega。"); + } + } + + public boolean getSmega() { + return this.smega; + } + + public void setGashponmega() { + if (this.gashponmega) { + this.gashponmega = false; + this.dropMessage(5, "由于您关闭了转蛋广播,所以您看不见任何的转蛋广播,如果要打开请打@Gashponmega。"); + } else { + this.gashponmega = true; + this.dropMessage(5, "目前已经打开显示转蛋广播,若要再次关闭请打@Gashponmega。"); + } + } + + public boolean getGashponmega() { + return this.gashponmega; + } + + public Map getSummons() { + return this.summons; + } + + public int getChair() { + return this.chair; + } + + public int getItemEffect() { + return this.itemEffect; + } + + public void setChair(final int chair) { + this.chair = chair; + this.stats.relocHeal(); + } + + public void setItemEffect(final int itemEffect) { + this.itemEffect = itemEffect; + } + + @Override + public MapleMapObjectType getType() { + return MapleMapObjectType.PLAYER; + } + + public int getFamilyId() { + if (this.mfc == null) { + return 0; + } + return this.mfc.getFamilyId(); + } + + public int getSeniorId() { + if (this.mfc == null) { + return 0; + } + return this.mfc.getSeniorId(); + } + + public int getJunior1() { + if (this.mfc == null) { + return 0; + } + return this.mfc.getJunior1(); + } + + public int getJunior2() { + if (this.mfc == null) { + return 0; + } + return this.mfc.getJunior2(); + } + + public int getCurrentRep() { + return this.currentrep; + } + + public int getTotalRep() { + return this.totalrep; + } + + public void setCurrentRep(final int _rank) { + this.currentrep = _rank; + if (this.mfc != null) { + this.mfc.setCurrentRep(_rank); + } + } + + public void setTotalRep(final int _rank) { + this.totalrep = _rank; + if (this.mfc != null) { + this.mfc.setTotalRep(_rank); + } + } + + public int getGuildId() { + return this.guildid; + } + + public byte getGuildRank() { + return this.guildrank; + } + + public int getCombat() { + final short[] TemporaryGroup = {-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -15, -16, -17, -18, -19, -26, -27, -28, -29, -101, -102, -103, -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -114, -115, -116, -118, -119, -121, -127, -128}; + int Num = 0; + for (short i = 0; i < TemporaryGroup.length; ++i) { + final IEquip equip = (IEquip) this.getInventory(MapleInventoryType.EQUIPPED).getItem(TemporaryGroup[i]); + if (equip != null) { + if (((Integer) Start.ConfigValuesMap.get("战力修正")).intValue() > 0) { + Num += this.RuinStat1(equip); + } else { + Num += this.RuinStat(equip); + } + } + } + return Num; + } + + public int getComStr() { + final short[] TemporaryGroup = {-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -15, -16, -17, -18, -19, -26, -27, -28, -29, -101, -102, -103, -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -114, -115, -116, -118, -119, -121, -127, -128}; + int Num = 0; + for (short i = 0; i < TemporaryGroup.length; ++i) { + final IEquip equip = (IEquip) this.getInventory(MapleInventoryType.EQUIPPED).getItem(TemporaryGroup[i]); + if (equip != null) { + if (((Integer) Start.ConfigValuesMap.get("战力修正")).intValue() > 0) { + Num += this.RuinStr(equip) * 10; + } else { + Num += this.RuinStr(equip); + } + } + } + return Num; + } + + public int getComDex() { + final short[] TemporaryGroup = {-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -15, -16, -17, -18, -19, -26, -27, -28, -29, -101, -102, -103, -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -114, -115, -116, -118, -119, -121, -127, -128}; + int Num = 0; + for (short i = 0; i < TemporaryGroup.length; ++i) { + final IEquip equip = (IEquip) this.getInventory(MapleInventoryType.EQUIPPED).getItem(TemporaryGroup[i]); + if (equip != null) { + if (((Integer) Start.ConfigValuesMap.get("战力修正")).intValue() > 0) { + Num += this.RuinDex(equip) * 10; + } else { + Num += this.RuinDex(equip); + } + } + } + return Num; + } + + public int getComInt() { + final short[] TemporaryGroup = {-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -15, -16, -17, -18, -19, -26, -27, -28, -29, -101, -102, -103, -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -114, -115, -116, -118, -119, -121, -127, -128}; + int Num = 0; + for (short i = 0; i < TemporaryGroup.length; ++i) { + final IEquip equip = (IEquip) this.getInventory(MapleInventoryType.EQUIPPED).getItem(TemporaryGroup[i]); + if (equip != null) { + if (((Integer) Start.ConfigValuesMap.get("战力修正")).intValue() > 0) { + Num += this.RuinInt(equip) * 10; + } else { + Num += this.RuinInt(equip); + } + } + } + return Num; + } + + public int getComLuk() { + final short[] TemporaryGroup = {-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -15, -16, -17, -18, -19, -26, -27, -28, -29, -101, -102, -103, -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -114, -115, -116, -118, -119, -121, -127, -128}; + int Num = 0; + for (short i = 0; i < TemporaryGroup.length; ++i) { + final IEquip equip = (IEquip) this.getInventory(MapleInventoryType.EQUIPPED).getItem(TemporaryGroup[i]); + if (equip != null) { + if (((Integer) Start.ConfigValuesMap.get("战力修正")).intValue() > 0) { + Num += this.RuinLuk(equip) * 10; + } else { + Num += this.RuinLuk(equip); + } + } + } + return Num; + } + + public int getComWatk() { + final short[] TemporaryGroup = {-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -15, -16, -17, -18, -19, -26, -27, -28, -29, -101, -102, -103, -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -114, -115, -116, -118, -119, -121, -127, -128}; + int Num = 0; + for (short i = 0; i < TemporaryGroup.length; ++i) { + final IEquip equip = (IEquip) this.getInventory(MapleInventoryType.EQUIPPED).getItem(TemporaryGroup[i]); + if (equip != null) { + if (((Integer) Start.ConfigValuesMap.get("战力修正")).intValue() > 0) { + Num += this.RuinWatk(equip) * 50; + } else { + Num += this.RuinWatk(equip); + } + } + } + return Num; + } + + public int getComMatk() { + final short[] TemporaryGroup = {-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -15, -16, -17, -18, -19, -26, -27, -28, -29, -101, -102, -103, -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -114, -115, -116, -118, -119, -121, -127, -128}; + int Num = 0; + for (short i = 0; i < TemporaryGroup.length; ++i) { + final IEquip equip = (IEquip) this.getInventory(MapleInventoryType.EQUIPPED).getItem(TemporaryGroup[i]); + if (equip != null) { + if (((Integer) Start.ConfigValuesMap.get("战力修正")).intValue() > 0) { + Num += this.RuinMatk(equip) * 10; + } else { + Num += this.RuinMatk(equip); + } + } + } + return Num; + } + + public int getComMdef() { + final short[] TemporaryGroup = {-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -15, -16, -17, -18, -19, -26, -27, -28, -29, -101, -102, -103, -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -114, -115, -116, -118, -119, -121, -127, -128}; + int Num = 0; + for (short i = 0; i < TemporaryGroup.length; ++i) { + final IEquip equip = (IEquip) this.getInventory(MapleInventoryType.EQUIPPED).getItem(TemporaryGroup[i]); + if (equip != null) { + if (((Integer) Start.ConfigValuesMap.get("战力修正")).intValue() > 0) { + Num += this.RuinMdef(equip) * 10; + } else { + Num += this.RuinMdef(equip); + } + } + } + return Num; + } + + public int getComWdef() { + final short[] TemporaryGroup = {-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -15, -16, -17, -18, -19, -26, -27, -28, -29, -101, -102, -103, -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -114, -115, -116, -118, -119, -121, -127, -128}; + int Num = 0; + for (short i = 0; i < TemporaryGroup.length; ++i) { + final IEquip equip = (IEquip) this.getInventory(MapleInventoryType.EQUIPPED).getItem(TemporaryGroup[i]); + if (equip != null) { + if (((Integer) Start.ConfigValuesMap.get("战力修正")).intValue() > 0) { + Num += this.RuinWdef(equip) * 10; + } else { + Num += this.RuinWdef(equip); + } + } + } + return Num; + } + + public int getComHp() { + final short[] TemporaryGroup = {-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -15, -16, -17, -18, -19, -26, -27, -28, -29, -101, -102, -103, -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -114, -115, -116, -118, -119, -121, -127, -128}; + int Num = 0; + for (short i = 0; i < TemporaryGroup.length; ++i) { + final IEquip equip = (IEquip) this.getInventory(MapleInventoryType.EQUIPPED).getItem(TemporaryGroup[i]); + if (equip != null) { + if (((Integer) Start.ConfigValuesMap.get("战力修正")).intValue() > 0) { + Num += this.RuinHp(equip) * 10; + } else { + Num += this.RuinHp(equip); + } + } + } + return Num; + } + + public int getComMp() { + final short[] TemporaryGroup = {-1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -15, -16, -17, -18, -19, -26, -27, -28, -29, -101, -102, -103, -104, -105, -106, -107, -108, -109, -110, -111, -112, -113, -114, -115, -116, -118, -119, -121, -127, -128}; + int Num = 0; + for (short i = 0; i < TemporaryGroup.length; ++i) { + final IEquip equip = (IEquip) this.getInventory(MapleInventoryType.EQUIPPED).getItem(TemporaryGroup[i]); + if (equip != null) { + if (((Integer) Start.ConfigValuesMap.get("战力修正")).intValue() > 0) { + Num += this.RuinMp(equip) * 10; + } else { + Num += this.RuinMp(equip); + } + } + } + return Num; + } + + public int RuinStat(final IEquip equip) { + return equip.getStr() + equip.getDex() + equip.getInt() + equip.getLuk() + equip.getWatk() + equip.getMatk() + equip.getMdef() + equip.getWdef() + equip.getUpgradeSlots() + equip.getLevel(); + } + + public int RuinStat1(final IEquip equip) { + return equip.getStr() * 10 + equip.getDex() * 10 + equip.getInt() * 10 + equip.getLuk() * 10 + equip.getWatk() * 50 + equip.getMatk() * 50 + equip.getMdef() + equip.getWdef(); + } + + public int RuinStr(final IEquip equip) { + return equip.getStr(); + } + + public int RuinDex(final IEquip equip) { + return equip.getDex(); + } + + public int RuinInt(final IEquip equip) { + return equip.getInt(); + } + + public int RuinLuk(final IEquip equip) { + return equip.getLuk(); + } + + public int RuinWatk(final IEquip equip) { + return equip.getWatk(); + } + + public int RuinMatk(final IEquip equip) { + return equip.getMatk(); + } + + public int RuinMdef(final IEquip equip) { + return equip.getMdef(); + } + + public int RuinWdef(final IEquip equip) { + return equip.getWdef(); + } + + public int RuinHp(final IEquip equip) { + return equip.getHp(); + } + + public int RuinMp(final IEquip equip) { + return equip.getMp(); + } + + public void setGuildId(final int _id) { + this.guildid = _id; + if (this.guildid > 0) { + if (this.mgc == null) { + this.mgc = new MapleGuildCharacter(this); + } else { + this.mgc.setGuildId(this.guildid); + } + } else { + this.mgc = null; + } + } + + public void setGuildRank(final byte _rank) { + this.guildrank = _rank; + if (this.mgc != null) { + this.mgc.setGuildRank(_rank); + } + } + + public MapleGuildCharacter getMGC() { + return this.mgc; + } + + public void setAllianceRank(final byte rank) { + this.allianceRank = rank; + if (this.mgc != null) { + this.mgc.setAllianceRank(rank); + } + } + + public byte getAllianceRank() { + return this.allianceRank; + } + + public MapleGuild getGuild() { + if (this.getGuildId() <= 0) { + return null; + } + return Guild.getGuild(this.getGuildId()); + } + + public void guildUpdate() { + if (this.guildid <= 0) { + return; + } + this.mgc.setLevel(this.level); + this.mgc.setJobId((int) this.job); + Guild.memberLevelJobUpdate(this.mgc); + } + + public void saveGuildStatus() { + MapleGuild.saveCharacterGuildInfo(this.guildid, this.guildrank, this.allianceRank, this.id); + } + + public void familyUpdate() { + if (this.mfc == null) { + return; + } + Family.memberFamilyUpdate(this.mfc, this); + } + + public void saveFamilyStatus() { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE characters SET familyid = ?, seniorid = ?, junior1 = ?, junior2 = ? WHERE id = ?")) { + if (this.mfc == null) { + ps.setInt(1, 0); + ps.setInt(2, 0); + ps.setInt(3, 0); + ps.setInt(4, 0); + } else { + ps.setInt(1, this.mfc.getFamilyId()); + ps.setInt(2, this.mfc.getSeniorId()); + ps.setInt(3, this.mfc.getJunior1()); + ps.setInt(4, this.mfc.getJunior2()); + } + ps.setInt(5, this.id); + ps.execute(); + } catch (SQLException se) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) se, "saveFamilyStatus"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) se); + } + } + + public void modifyCSPoints(final int type, final int quantity) { + this.modifyCSPoints(type, quantity, false); + } + + public void dropMessage(final String message) { + this.dropMessage(6, message); + } + + public void modifyCSPoints(final int type, final int quantity, final boolean show) { + switch (type) { + case 1: { + final int Acash = this.getAcash(); + if (Acash + quantity < 0) { + if (show) { + this.dropMessage(-1, "目前点券点数已满,无法获得更多的点券点数"); + } + return; + } + this.setAcash(Acash + quantity); + break; + } + case 2: { + if (this.maplepoints + quantity < 0) { + if (show) { + this.dropMessage(-1, "目前抵用已满,无法获得更多的抵用."); + } + return; + } + this.maplepoints += quantity; + break; + } + case 3: { + final int Points = this.getPoints(); + if (Points + quantity < 0) { + if (show) { + this.dropMessage(-1, "目前红利点数已满,无法获得更多的红利点数"); + } + return; + } + this.setPoints(Points + quantity); + break; + } + case 5: { + this.gainwzcz(this.id, quantity); + this.dropMessage("您 " + ((quantity > 0) ? "获得 " : "失去") + quantity + "交易币"); + break; + } + } + if (show && quantity != 0) { + this.dropMessage(-1, "您已经 " + ((quantity > 0) ? "获得 " : "花费 ") + quantity + ((type == 1) ? " 点券点数." : ((type == 2) ? " 抵用." : "红利点数"))); + this.UpdateCash(); + } + } + + public void UpdateCash() { + this.getClient().sendPacket(MaplePacketCreator.showCharCash(this)); + } + + public int getCSPoints(final int type) { + switch (type) { + case 1: { + return this.getAcash(); + } + case 2: { + return this.maplepoints; + } + case 3: { + return this.getPoints(); + } + case 5: { + return this.getwzcz(this.id); + } + default: { + return 0; + } + } + } + + public int getName2() { + return 1; + } + + public int getOfflineAcash(final MapleCharacter victim) { + return this.getAcash(victim); + } + + public final boolean hasEquipped(final int itemid) { + return this.inventory[MapleInventoryType.EQUIPPED.ordinal()].countById(itemid) >= 1; + } + + public final List getEquList() { + + return this.inventory[MapleInventoryType.EQUIPPED.ordinal()].equlist(); + } + + public int 判断物品数量(int itemid) { + MapleInventoryType type = GameConstants.getInventoryType(itemid); + int quantity = inventory[type.ordinal()].countById(itemid); + return quantity; + } + + public final boolean haveItem(final int itemid, final int quantity, final boolean checkEquipped, final boolean greaterOrEquals) { + final MapleInventoryType type = GameConstants.getInventoryType(itemid); + int possesed = inventory[type.ordinal()].countById(itemid); + if (type == MapleInventoryType.EQUIP) { + possesed += inventory[MapleInventoryType.EQUIPPED.ordinal()].countById(itemid); + } + int sl = quantity; + if (quantity < 0) { + sl -= quantity; + sl += -quantity; + } + if (type == MapleInventoryType.EQUIP && checkEquipped) { + return possesed >= sl; + } else if (greaterOrEquals && 判断物品数量(itemid) >= sl) { + return possesed >= sl; + } + return false; + } + /*public final boolean haveItem(final int itemid, final int quantity, final boolean checkEquipped, final boolean greaterOrEquals) { + final MapleInventoryType type = GameConstants.getInventoryType(itemid); + int possesed = this.inventory[type.ordinal()].countById(itemid); + if (checkEquipped && type == MapleInventoryType.EQUIP) { + possesed += this.inventory[MapleInventoryType.EQUIPPED.ordinal()].countById(itemid); + } + if (greaterOrEquals) { + return possesed >= quantity; + } + return possesed == quantity; + }*/ + + public final boolean haveItem(final int itemid, final int quantity) { + return this.haveItem(itemid, quantity, true, true); + } + + public final boolean haveItem(final int itemid) { + return this.haveItem(itemid, 1, true, true); + } + + public final short haveItemPos(final int itemid) { + final MapleInventoryType type = GameConstants.getInventoryType(itemid); + final IItem findById = this.inventory[type.ordinal()].findById(itemid); + short possesed; + if (findById != null) { + possesed = findById.getPosition(); + } else { + possesed = 100; + } + return possesed; + } + + public void dropNPC(final String message) { + this.client.sendPacket(MaplePacketCreator.getNPCTalk(9010000, (byte) 0, message, "00 00", (byte) 0)); + } + + public void dropNPC(final int npc, final String message) { + this.client.sendPacket(MaplePacketCreator.getNPCTalk(npc, (byte) 0, message, "00 00", (byte) 0)); + } + + public boolean getItemVac() { + return this.itemVacs; + } + + public boolean getMobVac() { + return this.mobVacs; + } + + public final int getCombo() { + return this.combo; + } + + public void setCombo(final int combo) { + this.combo = combo; + this.lastCombo = System.currentTimeMillis(); + this.getClient().getSession().writeAndFlush(MaplePacketCreator.updateCombo(combo)); + if (combo % 10 == 0 && combo >= 10 && combo <= 100) { + if (this.getSkillLevel(21000000) < combo / 10) { + return; + } + if (combo == 9 && this.getQuestStatus(10370) == 0) { + this.giftMedal(1142134); + MapleQuest.getInstance(10370).forceComplete(this, 0); + this.dropMessage(5, "您刚才拿到了连续技高手勋章。"); + } + if (combo == 4999 && this.getQuestStatus(10371) == 0) { + this.giftMedal(1142135); + MapleQuest.getInstance(10371).forceComplete(this, 0); + this.dropMessage(5, "您刚才拿到了连续技达人勋章。"); + } + if (combo == 14999 && this.getQuestStatus(10372) == 0) { + this.giftMedal(1142136); + MapleQuest.getInstance(10372).forceComplete(this, 0); + this.dropMessage(5, "您刚才拿到了连续技之王勋章。"); + } + SkillFactory.getSkill(21000000).getEffect(combo / 10).applyComboBuff(this, combo); + } else if (combo < 10) { + SkillFactory.getSkill(21000000).getEffect(combo / 10).applyComboBuff(this, 0); + } + } + + public final long getLastCombo() { + return this.lastCombo; + } + + public void setLastCombo(final long combo) { + this.lastCombo = combo; + } + + public int get副本地图() { + return this.副本地图; + } + + public void set副本地图(final int 副本地图) { + this.副本地图 = 副本地图; + } + + public byte getBuddyCapacity() { + return this.buddylist.getCapacity(); + } + + public void setBuddyCapacity(final byte capacity) { + this.buddylist.setCapacity(capacity); + this.client.sendPacket(MaplePacketCreator.updateBuddyCapacity((int) capacity)); + } + + public MapleMessenger getMessenger() { + return this.messenger; + } + + public void setMessenger(final MapleMessenger messenger) { + this.messenger = messenger; + } + + public void addCooldown(final int skillId, final long startTime, final long length) { + this.coolDowns.put(Integer.valueOf(skillId), new MapleCoolDownValueHolder(skillId, startTime, length)); + } + + public void removeCooldown(final int skillId) { + if (this.coolDowns.containsKey(Integer.valueOf(skillId))) { + this.coolDowns.remove(Integer.valueOf(skillId)); + } + } + + public boolean skillisCooling(final int skillId) { + return this.coolDowns.containsKey(Integer.valueOf(skillId)); + } + + public void giveCoolDowns(final int skillid, final long starttime, final long length) { + this.addCooldown(skillid, starttime, length); + } + + public void giveCoolDowns(final List cooldowns) { + if (cooldowns != null) { + for (final MapleCoolDownValueHolder cooldown : cooldowns) { + this.coolDowns.put(Integer.valueOf(cooldown.skillId), cooldown); + this.client.sendPacket(MaplePacketCreator.skillCooldown(cooldown.skillId, (int) ((cooldown.length - ((System.currentTimeMillis() - cooldown.startTime > cooldown.length) ? 0L : (System.currentTimeMillis() - cooldown.startTime))) / 1000L))); + } + } else { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT SkillID,StartTime,length FROM skills_cooldowns WHERE charid = ?")) { + ps.setInt(1, this.getId()); + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + if (rs.getLong("length") + rs.getLong("StartTime") - System.currentTimeMillis() <= 0L) { + continue; + } + this.giveCoolDowns(rs.getInt("SkillID"), rs.getLong("StartTime"), rs.getLong("length")); + } + rs.close(); + ps.close(); + this.deleteWhereCharacterId(con, "DELETE FROM skills_cooldowns WHERE charid = ?"); + con.close(); + } catch (SQLException e) { + FilePrinter.printError("MapleCharcter.txt", (Throwable) e, "Error while retriving cooldown from SQL storage"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + } + } + + public List getCooldowns() { + return new ArrayList(this.coolDowns.values()); + } + + public final List getAllDiseases() { + return new ArrayList(this.diseases.values()); + } + + public final boolean hasDisease(final MapleDisease dis) { + return this.diseases.keySet().contains(dis); + } + + public void getDiseaseBuff(final MapleDisease disease, final MobSkill skill) { + this.getDiseaseBuff(disease, skill.getX(), skill.getDuration(), skill.getSkillId(), skill.getSkillLevel()); + } + + public void getDiseaseBuff(final MapleDisease disease, final int x, final long duration, final int skillid, final int level) { + final List> debuff = Collections.singletonList(new Pair(disease, Integer.valueOf(x))); + if (!this.hasDisease(disease) && this.diseases.size() < 2) { + if (disease != MapleDisease.SEDUCE && disease != MapleDisease.STUN && this.isActiveBuffedValue(2321005)) { + return; + } + this.diseases.put(disease, new MapleDiseaseValueHolder(disease, System.currentTimeMillis(), duration)); + this.client.sendPacket(MaplePacketCreator.giveDebuff(debuff, skillid, level, (int) duration)); + this.map.broadcastMessage(this, MaplePacketCreator.giveForeignDebuff(this.id, debuff, skillid, level), false); + } + } + + public final void giveSilentDebuff(final List ld) { + if (ld != null) { + for (final MapleDiseaseValueHolder disease : ld) { + this.diseases.put(disease.disease, disease); + } + } + } + + public void dispelDebuff(final MapleDisease debuff) { + if (this.hasDisease(debuff)) { + final long mask = debuff.getValue(); + final boolean first = debuff.isFirst(); + this.diseases.remove(debuff); + this.client.sendPacket(MaplePacketCreator.cancelDebuff(mask, first)); + this.map.broadcastMessage(this, MaplePacketCreator.cancelForeignDebuff(this.id, mask, first), false); + } + } + + public void dispelDebuffs() { + this.dispelDebuff(MapleDisease.CURSE); + this.dispelDebuff(MapleDisease.DARKNESS); + this.dispelDebuff(MapleDisease.POISON); + this.dispelDebuff(MapleDisease.SEAL); + this.dispelDebuff(MapleDisease.STUN); + this.dispelDebuff(MapleDisease.WEAKEN); + } + + public void cancelAllDebuffs() { + this.diseases.clear(); + } + + public void setLevel(final short level) { + this.level = level; + } + + public void sendNote(final String to, final String msg) { + this.sendNote(to, msg, 0); + } + + public void sendNote(final String to, final String msg, final int fame) { + MapleCharacterUtil.sendNote(to, this.getName(), msg, fame); + } + + public void showNote() { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT * FROM notes WHERE `to`=?", 1005, 1008)) { + ps.setString(1, this.getName()); + try (final ResultSet rs = ps.executeQuery()) { + rs.last(); + final int count = rs.getRow(); + rs.first(); + this.client.sendPacket(MTSCSPacket.showNotes(rs, count)); + rs.close(); + } + ps.close(); + con.close(); + } catch (SQLException e) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) e, "Unable to show note"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + } + + public void deleteNote(final int id, final int fame) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT gift FROM notes WHERE `id`=?"); + ps.setInt(1, id); + final ResultSet rs = ps.executeQuery(); + if (rs.next() && rs.getInt("gift") == fame && fame > 0) { + this.addFame(fame); + this.updateSingleStat(MapleStat.FAME, (int) this.getFame()); + this.client.sendPacket(MaplePacketCreator.getShowFameGain(fame)); + } + rs.close(); + ps.close(); + ps = con.prepareStatement("DELETE FROM notes WHERE `id`=?"); + ps.setInt(1, id); + ps.execute(); + ps.close(); + } catch (SQLException e) { + System.err.println("Unable to delete note" + e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + } + + public int getmulungEnergy() { + return this.mulung_energy; + } + + public void mulungEnergyModify(final boolean inc) { + if (inc) { + if (this.mulung_energy + 100 > 10000) { + this.mulung_energy = 10000; + } else { + this.mulung_energy += 100; + } + } else { + this.mulung_energy = 0; + } + if (this.isAdmin()) { + this.mulung_energy = 10000; + } + this.client.sendPacket(MaplePacketCreator.MulungEnergy((int) this.mulung_energy)); + } + + public void writeMulungEnergy() { + this.client.sendPacket(MaplePacketCreator.MulungEnergy((int) this.mulung_energy)); + } + + public void writeEnergy(final String type, final String inc) { + this.client.sendPacket(MaplePacketCreator.sendPyramidEnergy(type, inc)); + } + + public void writeStatus(final String type, final String inc) { + this.client.sendPacket(MaplePacketCreator.sendGhostStatus(type, inc)); + } + + public void writePoint(final String type, final String inc) { + this.client.sendPacket(MaplePacketCreator.sendGhostPoint(type, inc)); + } + + public final long getKeyDownSkill_Time() { + return this.keydown_skill; + } + + public void setKeyDownSkill_Time(final long keydown_skill) { + this.keydown_skill = keydown_skill; + } + + public void checkBerserk() { + if (this.BerserkSchedule != null) { + this.BerserkSchedule.cancel(false); + this.BerserkSchedule = null; + } + final ISkill BerserkX = SkillFactory.getSkill(1320006); + final int skilllevel = this.getSkillLevel(BerserkX); + if (skilllevel >= 1) { + final MapleStatEffect ampStat = BerserkX.getEffect(skilllevel); + this.stats.Berserk = (this.stats.getHp() * 100 / this.stats.getMaxHp() <= ampStat.getX()); + try { + this.BerserkSchedule = BuffTimer.getInstance().schedule((Runnable) new Runnable() { + @Override + public void run() { + MapleCharacter.this.checkBerserk(); + } + }, 10000L); + } catch (RejectedExecutionException ex) { + } + } + } + + private void prepareBeholderEffect() { + if (this.beholderHealingSchedule != null) { + this.beholderHealingSchedule.cancel(false); + } + if (this.beholderBuffSchedule != null) { + this.beholderBuffSchedule.cancel(false); + } + final ISkill bHealing = SkillFactory.getSkill(1320008); + final int bHealingLvl = this.getSkillLevel(bHealing); + final int berserkLvl = this.getSkillLevel(SkillFactory.getSkill(1320006)); + if (bHealingLvl > 0) { + final MapleStatEffect healEffect = bHealing.getEffect(bHealingLvl); + final int healInterval = healEffect.getX() * 1000; + this.beholderHealingSchedule = BuffTimer.getInstance().register((Runnable) new Runnable() { + @Override + public void run() { + final int remhppercentage = (int) Math.ceil((double) MapleCharacter.this.getStat().getHp() * 100.0 / (double) MapleCharacter.this.getStat().getMaxHp()); + if (berserkLvl == 0 || remhppercentage >= berserkLvl + 10) { + MapleCharacter.this.addHP((int) healEffect.getHp()); + } + MapleCharacter.this.client.sendPacket(MaplePacketCreator.showOwnBuffEffect(1321007, 2)); + MapleCharacter.this.map.broadcastMessage(MaplePacketCreator.summonSkill(MapleCharacter.this.getId(), 1321007, 5)); + MapleCharacter.this.map.broadcastMessage(MapleCharacter.this, MaplePacketCreator.showBuffeffect(MapleCharacter.this.getId(), 1321007, 2), false); + } + }, (long) healInterval, (long) healInterval); + } + final ISkill bBuff = SkillFactory.getSkill(1320009); + final int bBuffLvl = this.getSkillLevel(bBuff); + if (bBuffLvl > 0) { + final MapleStatEffect buffEffect = bBuff.getEffect(bBuffLvl); + final int buffInterval = buffEffect.getX() * 1000; + this.beholderBuffSchedule = BuffTimer.getInstance().register((Runnable) new Runnable() { + @Override + public void run() { + buffEffect.applyTo(MapleCharacter.this); + MapleCharacter.this.client.sendPacket(MaplePacketCreator.showOwnBuffEffect(1321007, 2)); + MapleCharacter.this.map.broadcastMessage(MaplePacketCreator.summonSkill(MapleCharacter.this.getId(), 1321007, Randomizer.nextInt(3) + 6)); + MapleCharacter.this.map.broadcastMessage(MapleCharacter.this, MaplePacketCreator.showBuffeffect(MapleCharacter.this.getId(), 1321007, 2), false); + } + }, (long) buffInterval, (long) buffInterval); + } + } + + public void setChalkboard(final String text) { + this.chalktext = text; + this.map.broadcastMessage(MTSCSPacket.useChalkboard(this.getId(), text)); + } + + public String getChalkboard() { + return this.chalktext; + } + + public MapleMount getMount() { + return this.mount; + } + + public int gmLevel() { + return this.gmLevel; + } + + public int[] getWishlist() { + return this.wishlist; + } + + public void clearWishlist() { + for (int i = 0; i < 10; ++i) { + this.wishlist[i] = 0; + } + } + + public int getWishlistSize() { + int ret = 0; + for (int i = 0; i < 10; ++i) { + if (this.wishlist[i] > 0) { + ++ret; + } + } + return ret; + } + + public void setWishlist(final int[] wl) { + this.wishlist = wl; + } + + public int[] getRocks() { + return this.rocks; + } + + public int getRockSize() { + int ret = 0; + for (int i = 0; i < 10; ++i) { + if (this.rocks[i] != 999999999) { + ++ret; + } + } + return ret; + } + + public void deleteFromRocks(final int map) { + for (int i = 0; i < 10; ++i) { + if (this.rocks[i] == map) { + this.rocks[i] = 999999999; + break; + } + } + } + + public void addRockMap() { + if (this.getRockSize() >= 10) { + return; + } + this.rocks[this.getRockSize()] = this.getMapId(); + } + + public boolean isRockMap(final int id) { + for (int i = 0; i < 10; ++i) { + if (this.rocks[i] == id) { + return true; + } + } + return false; + } + + public int[] getRegRocks() { + return this.regrocks; + } + + public int getRegRockSize() { + int ret = 0; + for (int i = 0; i < 5; ++i) { + if (this.regrocks[i] != 999999999) { + ++ret; + } + } + return ret; + } + + public void deleteFromRegRocks(final int map) { + for (int i = 0; i < 5; ++i) { + if (this.regrocks[i] == map) { + this.regrocks[i] = 999999999; + break; + } + } + } + + public void addRegRockMap() { + if (this.getRegRockSize() >= 5) { + return; + } + this.regrocks[this.getRegRockSize()] = this.getMapId(); + } + + public boolean isRegRockMap(final int id) { + for (int i = 0; i < 5; ++i) { + if (this.regrocks[i] == id) { + return true; + } + } + return false; + } + + public List getLastRes() { + return this.lastres; + } + + public void setLastRes(final List lastres) { + this.lastres = lastres; + } + + public void setMonsterBookCover(final int bookCover) { + this.bookCover = bookCover; + } + + public int getMonsterBookCover() { + return this.bookCover; + } + + public String getAccountSecondPassword() { + return this.accountsecondPassword; + } + + public final void openNpc(final int id) { + this.openNpc(id, null); + } + + public final void openPartyNpc(final MapleCharacter c, final int id, final String bossid) { + if (c.getParty() == null || c.getParty().getMembers().size() == 1) { + c.openNpc(id, bossid); + return; + } + for (final MaplePartyCharacter chr : c.getParty().getMembers()) { + final MapleCharacter curChar = c.getMap().getCharacterById(chr.getId()); + if (curChar != null) { + curChar.openNpc(id, bossid); + } + } + } + + public final void setPartyAccountidLog(final MapleCharacter c, final String log1, final int slot) { + if (c.getParty() == null || c.getParty().getMembers().size() == 1) { + c.setAccountidLog(log1, slot); + return; + } + for (final MaplePartyCharacter chr : c.getParty().getMembers()) { + final MapleCharacter curChar = c.getMap().getCharacterById(chr.getId()); + if (curChar != null) { + curChar.setAccountidLog(log1, slot); + } + } + } + + public final void openNpc(final int id, final String mode) { + this.getClient().removeClickedNPC(); + NPCScriptManager.getInstance().dispose(this.getClient()); + NPCScriptManager.getInstance().start(this.getClient(), id, mode); + } + + public int getOneWeekLog(final String log1) { + int jf = 0; + Connection con = null; + PreparedStatement ps = null; + PreparedStatement psu = null; + ResultSet rs = null; + try { + con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + ps = con.prepareStatement("select * from onetimelogd where characterid =? and log = ?"); + ps.setInt(1, this.id); + ps.setString(2, log1); + rs = ps.executeQuery(); + if (rs.next()) { + jf = rs.getInt("sz1"); + } else { + psu = con.prepareStatement("insert into onetimelogd (characterid,log, sz1) VALUES (?,?, ?)"); + psu.setInt(1, this.id); + psu.setString(2, log1); + psu.setInt(3, 0); + psu.executeUpdate(); + psu.close(); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("onetimelogd读取发生错误: " + ex); + } + return jf; + } + + public void setOneWeekLog(final String boss) { + this.setOneWeekLog(boss, 1); + } + + public void setOneWeekLog(final String boss, final int count) { + final int bossCount = this.getOneWeekLog(boss); + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE onetimelogd SET sz1 = ? WHERE characterid = ? AND log = ?"); + ps.setInt(1, bossCount + count); + ps.setInt(2, this.id); + ps.setString(3, boss); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (Exception Ex) { + System.err.println("onetimelogd读取发生错误: " + Ex); + } + } + + public int getBossLog1(final String boss) { + return this.getBossLog1(boss, 0); + } + + public int getBossLog1(final String boss, final int type) { + try { + int count = 0; + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT * FROM bosslog1 WHERE characterid = ? AND bossid = ?"); + ps.setInt(1, this.id); + ps.setString(2, boss); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + count = rs.getInt("count"); + final Timestamp bossTime = rs.getTimestamp("time"); + if (type == 0) { + if (bossTime != null) { + final Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(bossTime.getTime()); + if (cal.get(5) + 1 <= Calendar.getInstance().get(5) || cal.get(2) + 1 <= Calendar.getInstance().get(2)) { + count = 0; + final PreparedStatement psa = con.prepareStatement("UPDATE bosslog1 SET count = 0 WHERE characterid = ? AND bossid = ?"); + psa.setInt(1, this.id); + psa.setString(2, boss); + psa.executeUpdate(); + psa.close(); + } + } + final PreparedStatement psa2 = con.prepareStatement("UPDATE bosslog1 SET time = CURRENT_TIMESTAMP() WHERE characterid = ? AND bossid = ?"); + psa2.setInt(1, this.id); + psa2.setString(2, boss); + psa2.executeUpdate(); + psa2.close(); + } + } else { + final PreparedStatement psu = con.prepareStatement("INSERT INTO bosslog1 (characterid, bossid, count, type) VALUES (?, ?, ?, ?)"); + psu.setInt(1, this.id); + psu.setString(2, boss); + psu.setInt(3, 0); + psu.setInt(4, type); + psu.executeUpdate(); + psu.close(); + } + rs.close(); + ps.close(); + con.close(); + return count; + } catch (Exception ex) { + return -1; + } + } + + public void setBossLog1(final String boss) { + this.setBossLog1(boss, 0); + } + + public void setBossLog1(final String boss, final int type) { + this.setBossLog1(boss, type, 1); + } + + public void setBossLog1(final String boss, final int type, final int count) { + final int bossCount = this.getBossLog1(boss, type); + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE bosslog1 SET count = ?, type = ?, time = CURRENT_TIMESTAMP() WHERE characterid = ? AND bossid = ?"); + ps.setInt(1, bossCount + count); + ps.setInt(2, type); + ps.setInt(3, this.id); + ps.setString(4, boss); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (Exception ex) { + } + } + + public int getAccountidLog(final String log1) { + int jf = 0; + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("select * from accountidlog where id =? and log = ?"); + ps.setInt(1, this.accountid); + ps.setString(2, log1); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + jf = rs.getInt("sz1"); + } else { + final PreparedStatement psu = con.prepareStatement("insert into accountidlog (id,log, sz1) VALUES (?,?, ?)"); + psu.setInt(1, this.accountid); + psu.setString(2, log1); + psu.setInt(3, 0); + psu.executeUpdate(); + psu.close(); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("FZ3读取发生错误: " + ex); + } + return jf; + } + + public void setAccountidLog(final String log1) { + this.setAccountidLog(log1, 1); + } + + public void setAccountidLog(final String log1, final int slot) { + final int jf = this.getAccountidLog(log1); + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE accountidlog SET sz1 = ? where id = ? AND log = ?"); + ps.setInt(1, jf + slot); + ps.setInt(2, this.accountid); + ps.setString(3, log1); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("FZ3加减发生错误: " + ex); + } + } + + public int getAccountLog(final String log1, final int a) { + if (a < 1) { + return this.getAccountidBossLog(log1); + } + return this.getAccountidLog(log1); + } + + public void setAccountLog(final String log1, final int a) { + if (a < 1) { + this.setAccountidBossLog(log1, 1); + } else { + this.setAccountidLog(log1, 1); + } + } + + public void setAccountLog(final String log1, final int a, final int b) { + if (a < 1) { + this.setAccountidBossLog(log1, b); + } else { + this.setAccountidLog(log1, b); + } + } + + public int getAccountidBossLog(final String log1) { + int jf = 0; + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("select * from accountidbosslog where id =? and log = ?"); + ps.setInt(1, this.accountid); + ps.setString(2, log1); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + jf = rs.getInt("sz1"); + } else { + final PreparedStatement psu = con.prepareStatement("insert into accountidbosslog (id,log, sz1) VALUES (?,?, ?)"); + psu.setInt(1, this.accountid); + psu.setString(2, log1); + psu.setInt(3, 0); + psu.executeUpdate(); + psu.close(); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("FZ3读取发生错误: " + ex); + } + return jf; + } + + public void setAccountidBossLog(final String log1) { + this.setAccountidBossLog(log1, 1); + } + + public void setAccountidBossLog(final String log1, final int slot) { + final int jf = this.getAccountidBossLog(log1); + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE accountidbosslog SET sz1 = ? where id = ? AND log = ?"); + ps.setInt(1, jf + slot); + ps.setInt(2, this.accountid); + ps.setString(3, log1); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("accountidbosslog加减发生错误: " + ex); + } + } + + public int getFZ4(final String log1) { + int jf = 0; + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("select * from fz4 where log = ?"); + ps.setString(1, log1); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + jf = rs.getInt("sz1"); + } else { + final PreparedStatement psu = con.prepareStatement("insert into fz4 (log, sz1) VALUES (?, ?)"); + psu.setString(1, log1); + jf = 0; + psu.setInt(2, 0); + psu.executeUpdate(); + psu.close(); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("FZ4读取发生错误: " + ex); + } + return jf; + } + + public void setFZ4(final String name, final int value) { + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + PreparedStatement ps = null; + ps = con.prepareStatement("UPDATE fz4 SET sz1 = ? WHERE log = ?"); + ps.setInt(1, value); + ps.setString(2, name); + ps.execute(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("FZ4更新发生错误: " + ex); + } + } + + public static int getFZ9(final String log1) { + int jf = 0; + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("select * from fz9 where log = ?"); + ps.setString(1, log1); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + jf = rs.getInt("sz1"); + } else { + final PreparedStatement psu = con.prepareStatement("insert into fz9 (log, sz1) VALUES (?, ?)"); + psu.setString(1, log1); + jf = 50; + psu.setInt(2, 50); + psu.executeUpdate(); + psu.close(); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("FZ9读取发生错误: " + ex); + } + return jf; + } + + public int getFZ3modid(final int someid, final String log1) { + int jf = 0; + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("select * from fz3 where cid = ? AND log = ?"); + ps.setInt(1, someid); + ps.setString(2, log1); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + jf = rs.getInt("sz1"); + } else { + final PreparedStatement psu = con.prepareStatement("insert into fz3 (cid,log, sz1,sz2) VALUES (?, ?, ?,?)"); + psu.setInt(1, someid); + psu.setString(2, log1); + psu.setInt(3, 0); + psu.setInt(4, 0); + psu.executeUpdate(); + psu.close(); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("FZ3读取发生错误: " + ex); + } + return jf; + } + + public int getFZ3slid(final int someid, final String log1) { + int jf = 0; + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("select * from fz3 where cid = ? AND log = ?"); + ps.setInt(1, someid); + ps.setString(2, log1); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + jf = rs.getInt("sz2"); + } else { + final PreparedStatement psu = con.prepareStatement("insert into fz3 (cid,log, sz1,sz2) VALUES (?, ?, ?,?)"); + psu.setInt(1, someid); + psu.setString(2, log1); + psu.setInt(3, 0); + psu.setInt(4, 0); + psu.executeUpdate(); + psu.close(); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("FZ3读取发生错误: " + ex); + } + return jf; + } + + public int setFZ3modid(final int someid, final String log1, final int slot) { + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE fz3 SET sz1 = ? where cid = ? AND log = ?"); + ps.setInt(1, slot); + ps.setInt(2, someid); + ps.setString(3, log1); + ps.executeUpdate(); + ps.close(); + con.close(); + return 1; + } catch (SQLException ex) { + System.err.println("FZ3加减发生错误: " + ex); + return 0; + } + } + + public int setFZ3slid(final int someid, final String log1, final int slot) { + final int jf = this.getFZ3slid(someid, log1); + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE fz3 SET sz2 = ? where cid = ? AND log = ? "); + ps.setInt(1, slot + jf); + ps.setInt(2, someid); + ps.setString(3, log1); + ps.executeUpdate(); + ps.close(); + con.close(); + return 1; + } catch (SQLException ex) { + System.err.println("FZ3加减发生错误: " + ex); + return 0; + } + } + + public int reaFZ3slid(final int someid, final String log1) { + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE fz3 SET sz2 = ? AND sz2 = ?where cid = ? AND log = ?"); + ps.setInt(1, 0); + ps.setInt(2, 0); + ps.setInt(3, someid); + ps.setString(4, log1); + ps.executeUpdate(); + ps.close(); + con.close(); + return 1; + } catch (SQLException ex) { + System.err.println("FZ3加减发生错误: " + ex); + return 0; + } + } + + public int getAccNewTime(final String time) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select count(*) from accounts where id = ? and createdat <= '" + time + "'"); + ps.setInt(1, this.accountid); + int ret_count; + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + ret_count = rs.getInt(1); + } else { + ret_count = -1; + } + rs.close(); + } + ps.close(); + con.close(); + return ret_count; + } catch (Exception Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + return -1; + } + } + + public int getAddLog() { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + int money = 0; + final PreparedStatement ps = con.prepareStatement("SELECT money FROM addlog WHERE accid = ?"); + ps.setInt(1, this.getClient().getAccID()); + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + money += rs.getInt("money"); + } + rs.close(); + ps.close(); + con.close(); + return money; + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + return -1; + } + } + + public void setPrizeLog(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("insert into Prizelog (accid, bossid) values (?,?)"); + ps.setInt(1, this.getClient().getAccID()); + ps.setString(2, bossid); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (Exception Wx) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Wx); + } + } + + public int getPrizeLog(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + int ret_count = 0; + final PreparedStatement ps = con.prepareStatement("select count(*) from Prizelog where accid = ? and bossid = ?"); + ps.setInt(1, this.getClient().getAccID()); + ps.setString(2, bossid); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + ret_count = rs.getInt(1); + } else { + ret_count = -1; + } + rs.close(); + ps.close(); + con.close(); + return ret_count; + } catch (Exception Wx) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Wx); + return -1; + } + } + + public void setAcLog(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("insert into Aclog (accid, bossid) values (?,?)"); + ps.setInt(1, this.getClient().getAccID()); + ps.setString(2, bossid); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (Exception Wx) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Wx); + } + } + + public void setAcLogS(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("insert into Aclog (accid, bossid) values (?,?)"); + ps.setInt(1, this.getAccountID()); + ps.setString(2, bossid); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (Exception Wx) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Wx); + } + } + + public int getAcLog(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + int ret_count = 0; + final PreparedStatement ps = con.prepareStatement("select count(*) from Aclog where accid = ? and bossid = ? and lastattempt >= subtime(current_timestamp, '1 0:0:0.0')"); + ps.setInt(1, this.getClient().getAccID()); + ps.setString(2, bossid); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + ret_count = rs.getInt(1); + } else { + ret_count = -1; + } + rs.close(); + ps.close(); + con.close(); + return ret_count; + } catch (Exception Wx) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Wx); + return -1; + } + } + + public int getAcLogS(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + int ret_count = 0; + final PreparedStatement ps = con.prepareStatement("select count(*) from Aclog where accid = ? and bossid = ?"); + ps.setInt(1, this.getClient().getAccID()); + ps.setString(2, bossid); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + ret_count = rs.getInt(1); + } else { + ret_count = -1; + } + rs.close(); + ps.close(); + con.close(); + return ret_count; + } catch (Exception Wx) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Wx); + return -1; + } + } + + public void dropMessage(final int type, final String message) { + if (type == -1) { + this.client.sendPacket(UIPacket.getTopMsg(message)); + } else if (type == -2) { + this.client.sendPacket(PlayerShopPacket.shopChat(message, 0)); + } else if (type == -11) { + this.client.getSession().writeAndFlush(MaplePacketCreator.yellowChat(message)); + } else { + this.client.sendPacket(MaplePacketCreator.serverNotice(type, message)); + } + } + + public void showInfo(final String caption, final boolean pink, String msg) { + final short type = (short) (pink ? 5 : 6); + if (caption != null && !caption.isEmpty()) { + msg = "[" + caption + "] " + msg; + } + this.dropMessage((int) type, msg); + this.dropMessage(-1, msg); + } + + public IMaplePlayerShop getPlayerShop() { + return this.playerShop; + } + + public void setPlayerShop(final IMaplePlayerShop playerShop) { + this.playerShop = playerShop; + } + + public int getConversation() { + return this.inst.get(); + } + + public void setConversation(final int inst) { + this.inst.set(inst); + } + + public MapleCarnivalParty getCarnivalParty() { + return this.carnivalParty; + } + + public void setCarnivalParty(final MapleCarnivalParty party) { + this.carnivalParty = party; + } + + public void addCP(final int ammount) { + this.totalCP += (short) ammount; + this.availableCP += (short) ammount; + } + + public void useCP(final int ammount) { + if (this.availableCP >= ammount) { + this.availableCP -= (short) ammount; + } + } + + public int getAvailableCP() { + return this.availableCP; + } + + public int getTotalCP() { + return this.totalCP; + } + + public void resetCP() { + this.totalCP = 0; + this.availableCP = 0; + } + + public static int getIdByName(final String name) { + try { + int id = -1; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT id FROM characters WHERE name = ?")) { + ps.setString(1, name); + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + id = rs.getInt("id"); + } + rs.close(); + } + ps.close(); + con.close(); + } + return id; + } catch (Exception e) { + System.err.println("错误 'getIdByName' " + e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + return -1; + } + } + + public void addCarnivalRequest(final MapleCarnivalChallenge request) { + this.pendingCarnivalRequests.add(request); + } + + public final MapleCarnivalChallenge getNextCarnivalRequest() { + return (MapleCarnivalChallenge) this.pendingCarnivalRequests.pollLast(); + } + + public void clearCarnivalRequests() { + this.pendingCarnivalRequests = (Deque) new LinkedList(); + } + + public void startMonsterCarnival(final int enemyavailable, final int enemytotal) { + this.client.sendPacket(MonsterCarnivalPacket.startMonsterCarnival(this, enemyavailable, enemytotal)); + } + + public void CPUpdate(final boolean party, final int available, final int total, final int team) { + this.client.sendPacket(MonsterCarnivalPacket.CPUpdate(party, available, total, team)); + } + + public void playerDiedCPQ(final String name, final int lostCP, final int team) { + this.client.sendPacket(MonsterCarnivalPacket.playerDiedMessage(name, lostCP, team)); + } + + public boolean getCanTalk() { + return this.canTalk; + } + + public void canTalk(final boolean talk) { + this.canTalk = talk; + } + + public int getEXPMod() { + return this.stats.expMod; + } + + public int getDropMod() { + return this.stats.dropMod; + } + + public double getDropm() { + return this.stats.dropm; + } + + public double getExpm() { + return this.stats.expm; + } + + public int getCashMod() { + return this.stats.cashMod; + } + + public int getCloneDamgeRate() { + return this.clonedamgerate; + } + + public void setCloneDamgeRate(final int a) { + this.clonedamgerate = a; + } + + public void setVPoints(final int p) { + this.vpoints = p; + } + + public int getVPoints() { + return this.vpoints; + } + + public CashShop getCashInventory() { + return this.cs; + } + + public void removeAll(final int id) { + this.removeAll(id, false); + } + + public void removeAll(final int id, final boolean show) { + this.removeAll(id, false, false); + } + + public void removeAll(final int id, final boolean show, final boolean equip) { + MapleInventoryType type = GameConstants.getInventoryType(id); + int possessed = this.getInventory(type).countById(id); + if (possessed > 0) { + MapleInventoryManipulator.removeById(this.getClient(), type, id, possessed, true, false); + if (show) { + this.getClient().sendPacket(MaplePacketCreator.getShowItemGain(id, (short) (-possessed), true)); + } + } + if (equip && type == MapleInventoryType.EQUIP) { + type = MapleInventoryType.EQUIPPED; + possessed = this.getInventory(type).countById(id); + if (possessed > 0) { + MapleInventoryManipulator.removeById(this.getClient(), type, id, possessed, true, false); + this.getClient().sendPacket(MaplePacketCreator.getShowItemGain(id, (short) (-possessed), true)); + } + } + } + + public MapleRing getMarriageRing(final boolean incluedEquip) { + MapleInventory iv = this.getInventory(MapleInventoryType.EQUIPPED); + final Collection equippedC = iv.list(); + final List equipped = (List) new ArrayList(equippedC.size()); + for (final IItem item : equippedC) { + equipped.add((Item) item); + } + for (final Item item2 : equipped) { + if (item2.getRing() != null) { + final MapleRing ring = item2.getRing(); + ring.setEquipped(true); + if (GameConstants.isMarriageRing(item2.getItemId())) { + return ring; + } + continue; + } + } + if (incluedEquip) { + iv = this.getInventory(MapleInventoryType.EQUIP); + for (final IItem item : iv.list()) { + if (item.getRing() != null && GameConstants.isMarriageRing(item.getItemId())) { + final MapleRing ring = item.getRing(); + ring.setEquipped(false); + return ring; + } + } + } + return null; + } + + public Pair, List> getRings(final boolean equip) { + MapleInventory iv = this.getInventory(MapleInventoryType.EQUIPPED); + final Collection equippedC = iv.list(); + final List equipped = (List) new ArrayList(equippedC.size()); + for (final IItem item : equippedC) { + equipped.add((Item) item); + } + Collections.sort(equipped); + final List crings = (List) new ArrayList(); + final List frings = (List) new ArrayList(); + for (final Item item2 : equipped) { + if (item2.getRing() != null) { + final MapleRing ring = item2.getRing(); + ring.setEquipped(true); + if (!GameConstants.isEffectRing(item2.getItemId())) { + continue; + } + if (equip) { + if (GameConstants.isCrushRing(item2.getItemId())) { + crings.add(ring); + } else { + if (!GameConstants.isFriendshipRing(item2.getItemId())) { + continue; + } + frings.add(ring); + } + } else if (crings.isEmpty() && GameConstants.isCrushRing(item2.getItemId())) { + crings.add(ring); + } else { + if (!frings.isEmpty() || !GameConstants.isFriendshipRing(item2.getItemId())) { + continue; + } + frings.add(ring); + } + } + } + if (equip) { + iv = this.getInventory(MapleInventoryType.EQUIP); + for (final IItem item3 : iv.list()) { + if (item3.getRing() != null && GameConstants.isEffectRing(item3.getItemId())) { + final MapleRing ring = item3.getRing(); + ring.setEquipped(false); + if (GameConstants.isFriendshipRing(item3.getItemId())) { + frings.add(ring); + } else { + if (!GameConstants.isCrushRing(item3.getItemId())) { + continue; + } + crings.add(ring); + } + } + } + } + Collections.sort(frings, new RingComparator()); + Collections.sort(crings, new RingComparator()); + return new Pair(crings, frings); + } + + public int getFH() { + final MapleFoothold fh = this.getMap().getFootholds().findBelow(this.getPosition()); + if (fh != null) { + return fh.getId(); + } + return 0; + } + + public void startFairySchedule(final boolean exp) { + this.startFairySchedule(exp, false); + } + + public void startFairySchedule(final boolean exp, final boolean equipped) { + try { + this.cancelFairySchedule(exp); + if (this.fairyExp < 30 && this.stats.equippedFairy) { + if (equipped) { + this.dropMessage(5, "您装备了精灵吊坠在1小时后经验获取将增加到 " + (this.fairyExp + 10) + "%"); + } + this.fairySchedule = EtcTimer.getInstance().schedule((Runnable) new Runnable() { + @Override + public void run() { + if (MapleCharacter.this.fairyExp < 30 && MapleCharacter.this.stats.equippedFairy) { + MapleCharacter.this.fairyExp = (byte) 30; + ++MapleCharacter.this.fairyHour; + MapleCharacter.this.dropMessage(5, "因装备精灵坠饰经过了" + (int) MapleCharacter.this.fairyHour + "小时,打怪时可以额外获得红利经验值" + (int) MapleCharacter.this.fairyExp + "%."); + MapleCharacter.this.startFairySchedule(false, true); + } else { + MapleCharacter.this.cancelFairySchedule(!MapleCharacter.this.stats.equippedFairy); + } + } + }, 3600000L); + } else { + this.cancelFairySchedule(!this.stats.equippedFairy); + } + } catch (RejectedExecutionException ex) { + } + } + + public void cancelFairySchedule(final boolean exp) { + if (this.fairySchedule != null) { + this.fairySchedule.cancel(false); + this.fairySchedule = null; + } + if (exp) { + this.fairyExp = 30; + this.fairyHour = 1; + } + } + + public byte getFairyExp() { + return this.fairyExp; + } + + public void setFairyExp(final byte Exp) { + this.fairyExp = Exp; + } + + public int getCoconutTeam() { + return this.coconutteam; + } + + public void setCoconutTeam(final int team) { + this.coconutteam = team; + } + + public void spawnPet(final byte slot) { + this.spawnPet(slot, false, true); + } + + public void spawnPet(final byte slot, final boolean lead) { + this.spawnPet(slot, lead, true); + final boolean 宠物buff开关 = Boolean.parseBoolean(ServerProperties.getProperty("pp.宠物buff开关")); + final boolean 宠物特殊buff开关 = Boolean.parseBoolean(ServerProperties.getProperty("pp.宠物特殊buff开关")); + final boolean 宠物基础buff开关 = Boolean.parseBoolean(ServerProperties.getProperty("pp.宠物基础buff开关")); + final String[] 特殊宠物代码 = ServerProperties.getProperty("pp.特殊宠物代码").split(","); + boolean 特殊宠物开关 = false; + if (宠物buff开关) { + for (int i = 0; i < 特殊宠物代码.length; ++i) { + if (this.getInventory(MapleInventoryType.CASH).getItem((short) slot).getItemId() == Integer.parseInt(特殊宠物代码[i])) { + 特殊宠物开关 = true; + } + } + if (特殊宠物开关) { + if (宠物特殊buff开关) { + MapleItemInformationProvider.getInstance().getItemEffect1(2001517).applyTo(this.client.getPlayer()); + } + } else if (宠物基础buff开关) { + MapleItemInformationProvider.getInstance().getItemEffect1(2001519).applyTo(this.client.getPlayer()); + } + } + } + + public void removeFromSlot(final int type, final short slot, final short number) { + MapleInventoryType a = MapleInventoryType.EQUIP; + if (type == 1) { + a = MapleInventoryType.EQUIP; + } else if (type == 2) { + a = MapleInventoryType.USE; + } else if (type == 3) { + a = MapleInventoryType.SETUP; + } else if (type == 4) { + a = MapleInventoryType.ETC; + } else if (type == 5) { + a = MapleInventoryType.CASH; + } + MapleInventoryManipulator.removeFromSlot(this.client, a, slot, number, false); + } + + public void addFromDrop(final IItem item, final boolean a) { + MapleInventoryManipulator.addFromDrop(this.client, item, a); + } + + public void spawnPet(final byte slot, final boolean lead, final boolean broadcast) { + final IItem item = this.getInventory(MapleInventoryType.CASH).getItem((short) slot); + final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); + if (item == null || item.getItemId() > 5010000 || item.getItemId() < 5000000) { + return; + } + switch (item.getItemId()) { + case 5000028: + case 5000047: { + final MaplePet pet = MaplePet.createPet(item.getItemId() + 1, MapleInventoryIdentifier.getInstance()); + if (pet != null) { + MapleInventoryManipulator.addById(this.client, item.getItemId() + 1, (short) 1, item.getOwner(), pet, 45L); + MapleInventoryManipulator.removeFromSlot(this.client, MapleInventoryType.CASH, (short) slot, (short) 1, false); + break; + } + break; + } + default: { + final MaplePet pet = item.getPet(); + if (pet == null || (item.getItemId() == 5000054 && pet.getSecondsLeft() <= 0) || (item.getExpiration() != -1L && item.getExpiration() <= System.currentTimeMillis())) { + break; + } + if (pet.getSummoned()) { + this.unequipPet(pet, false); + break; + } + int leadid = 8; + if (GameConstants.isKOC((int) this.getJob())) { + leadid = 10000018; + } else if (GameConstants.isAran((int) this.getJob())) { + leadid = 20000024; + } + if (this.getSkillLevel(SkillFactory.getSkill(leadid)) == 0 && this.getSummonedPet(0) != null) { + this.unequipPet(this.getSummonedPet(0), false); + } else if (lead) { + this.shiftPetsRight(); + } + final Point pos = this.getPosition(); + pet.setPos(pos); + try { + pet.setFh(this.getMap().getFootholds().findBelow(pos).getId()); + } catch (NullPointerException e) { + pet.setFh(0); + } + pet.setStance(0); + pet.setSummoned(this.getPetSlotNext() + 1); + this.addPet(pet); + if (this.getMap() != null) { + this.getMap().broadcastMessage(this, PetPacket.showPet(this, pet, false, false), true); + this.client.sendPacket(PetPacket.loadExceptionList(this, pet)); + this.client.sendPacket(PetPacket.petStatUpdate(this)); + } + break; + } + } + this.client.sendPacket(PetPacket.emptyStatUpdate()); + } + + public void addMoveMob(int mobid) { + if (movedMobs.containsKey(mobid)) { + movedMobs.put(mobid, movedMobs.get(mobid) + 1); + if (movedMobs.get(mobid) > 30) { + for (MapleCharacter chr : getMap().getCharactersThreadsafe()) { + if (chr.getMoveMobs().containsKey(mobid)) { + chr.getClient().sendPacket(MobPacket.killMonster(mobid, 1)); + chr.getMoveMobs().remove(mobid); + } + } + } + } else { + movedMobs.put(mobid, 1); + } + } + + public Map getMoveMobs() { + return this.movedMobs; + } + + public int getLinkMid() { + return this.linkMid; + } + + public void setLinkMid(final int lm) { + this.linkMid = lm; + } + + public boolean isClone() { + return this.clone; + } + + public void setClone(final boolean c) { + this.clone = c; + } + + public WeakReference[] getClones() { + return this.clones; + } + + public MapleCharacter cloneLooks() { + final MapleClient cloneClient = new MapleClient(null, null, (Channel) new MockIOSession()); + final int minus = this.getId() + Randomizer.nextInt(this.getId()); + final MapleCharacter ret = new MapleCharacter(true); + ret.id = minus; + ret.client = cloneClient; + ret.exp = 0; + ret.meso = 0; + ret.beans = this.beans; + ret.blood = this.blood; + ret.month = this.month; + ret.day = this.day; + ret.charmessage = this.charmessage; + ret.expression = this.expression; + ret.constellation = this.constellation; + ret.remainingAp = 0; + ret.fame = 0; + ret.accountid = this.client.getAccID(); + ret.name = this.name; + ret.level = this.level; + ret.fame = this.fame; + ret.job = this.job; + ret.hair = this.hair; + ret.face = this.face; + ret.skinColor = this.skinColor; + ret.bookCover = this.bookCover; + ret.monsterbook = this.monsterbook; + ret.mount = this.mount; + ret.CRand = new PlayerRandomStream(); + ret.gmLevel = this.gmLevel; + ret.gender = this.gender; + ret.mapid = this.map.getId(); + ret.map = this.map; + ret.setStance(this.getStance()); + ret.chair = this.chair; + ret.itemEffect = this.itemEffect; + ret.guildid = this.guildid; + ret.currentrep = this.currentrep; + ret.totalrep = this.totalrep; + ret.stats = this.stats; + ret.limitBreak = this.limitBreak; + ret.reinNumber = this.reinNumber; + ret.effects.putAll(this.effects); + if (ret.effects.get(MapleBuffStat.ILLUSION) != null) { + ret.effects.remove(MapleBuffStat.ILLUSION); + } + if (ret.effects.get(MapleBuffStat.SUMMON) != null) { + ret.effects.remove(MapleBuffStat.SUMMON); + } + if (ret.effects.get(MapleBuffStat.PUPPET) != null) { + ret.effects.remove(MapleBuffStat.PUPPET); + } + ret.guildrank = this.guildrank; + ret.allianceRank = this.allianceRank; + ret.hidden = this.hidden; + ret.setPosition(new Point(this.getPosition())); + for (final IItem equip : this.getInventory(MapleInventoryType.EQUIPPED)) { + ret.getInventory(MapleInventoryType.EQUIPPED).addFromDB(equip); + } + ret.skillMacros = this.skillMacros; + ret.keylayout = this.keylayout; + ret.questinfo = this.questinfo; + ret.savedLocations = this.savedLocations; + ret.wishlist = this.wishlist; + ret.rocks = this.rocks; + ret.regrocks = this.regrocks; + ret.buddylist = this.buddylist; + ret.keydown_skill = 0L; + ret.lastmonthfameids = this.lastmonthfameids; + ret.lastfametime = this.lastfametime; + ret.storage = this.storage; + ret.cs = this.cs; + ret.client.setAccountName(this.client.getAccountName()); + ret.maplepoints = this.maplepoints; + ret.clone = true; + ret.client.setChannel(this.client.getChannel()); + while (this.map.getCharacterById(ret.id) != null || this.client.getChannelServer().getPlayerStorage().getCharacterById(ret.id) != null) { + final MapleCharacter mapleCharacter = ret; + ++mapleCharacter.id; + } + ret.client.setPlayer(ret); + return ret; + } + + public final void cloneLook() { + this.cloneLook(false, null, null); + } + + public final void cloneLook(final boolean isStopMoving) { + this.cloneLook(isStopMoving, null, null); + } + + public final void cloneLook(final MapleCharacter look) { + this.cloneLook(false, look, null); + } + + public final void cloneLook(final boolean isStopMoving, final MapleCharacter look) { + this.cloneLook(isStopMoving, look, null); + } + + public boolean isStopMoving() { + return this.stopMoving; + } + + public void setStopMoving(final boolean stopMoving) { + this.stopMoving = stopMoving; + } + + public final void cloneLook(final boolean isStopMoving, final MapleCharacter look, final String name) { + if (this.clone) { + return; + } + for (int i = 0; i < this.clones.length; ++i) { + if (this.clones[i].get() == null) { + final MapleCharacter newp = (look == null) ? this.cloneLooks() : look; + if (name != null) { + newp.setName(name); + } + this.map.addPlayer(newp); + this.map.broadcastMessage(MaplePacketCreator.updateCharLook(newp)); + this.map.movePlayer(newp, this.getPosition()); + this.clones[i] = new WeakReference(newp); + newp.setStopMoving(isStopMoving); + return; + } + } + } + + public final void disposeClones() { + this.numClones = 0; + for (int i = 0; i < this.clones.length; ++i) { + if (this.clones[i].get() != null) { + this.map.removePlayer((MapleCharacter) this.clones[i].get()); + ((MapleCharacter) this.clones[i].get()).getClient().disconnect(false, false); + this.clones[i] = new WeakReference(null); + ++this.numClones; + } + } + } + + public final int getCloneSize() { + int z = 0; + for (final WeakReference clone1 : this.clones) { + if (clone1.get() != null) { + ++z; + } + } + return z; + } + + public void spawnClones() { + if (this.numClones == 0 && this.stats.hasClone) { + this.cloneLook(); + } + for (int i = 0; i < this.numClones; ++i) { + this.cloneLook(); + } + this.numClones = 0; + } + + public byte getNumClones() { + return this.numClones; + } + + public final void spawnSavedPets() { + for (int i = 0; i < this.petStore.length; ++i) { + if (this.petStore[i] > -1) { + this.spawnPet(this.petStore[i], false, false); + } + } + this.client.sendPacket(PetPacket.petStatUpdate(this)); + this.petStore = new byte[]{-1, -1, -1}; + } + + public final byte[] getPetStores() { + return this.petStore; + } + + public void resetStats(final int str, final int dex, final int int_, final int luk) { + final Map statup = new EnumMap(MapleStat.class); + int total = this.stats.getStr() + this.stats.getDex() + this.stats.getLuk() + this.stats.getInt() + this.getRemainingAp(); + total -= str; + this.stats.setStr((short) str); + total -= dex; + this.stats.setDex((short) dex); + total -= int_; + this.stats.setInt((short) int_); + total -= luk; + this.stats.setLuk((short) luk); + this.setRemainingAp((short) total); + statup.put(MapleStat.STR, (long) str); + statup.put(MapleStat.DEX, (long) dex); + statup.put(MapleStat.INT, (long) int_); + statup.put(MapleStat.LUK, (long) luk); + statup.put(MapleStat.AVAILABLEAP, (long) total); + this.client.sendPacket(MaplePacketCreator.updatePlayerStats(statup, false, this)); + } + + public Event_PyramidSubway getPyramidSubway() { + return this.pyramidSubway; + } + + public void setPyramidSubway(final Event_PyramidSubway ps) { + this.pyramidSubway = ps; + } + + public byte getSubcategory() { + if (this.job >= 430 && this.job <= 434) { + return 1; + } + return this.subcategory; + } + + public int itemQuantity(final int itemid) { + return this.getInventory(GameConstants.getInventoryType(itemid)).countById(itemid); + } + + public void setRPS(final RockPaperScissors rps) { + this.rps = rps; + } + + public RockPaperScissors getRPS() { + return this.rps; + } + + public long getNextConsume() { + return this.nextConsume; + } + + public void setNextConsume(final long nc) { + this.nextConsume = nc; + } + + public int getRank() { + return this.rank; + } + + public int getRankMove() { + return this.rankMove; + } + + public int getJobRank() { + return this.jobRank; + } + + public int getJobRankMove() { + return this.jobRankMove; + } + + public void dispelBuff() { + final LinkedList> allBuffs = new LinkedList(this.effects.entrySet()); + for (final Entry mbsvh : allBuffs) { + final long startTime = ((MapleBuffStatValueHolder) mbsvh.getValue()).startTime; + final long localDuration = (long) ((MapleBuffStatValueHolder) mbsvh.getValue()).localDuration; + final long nowtime = System.currentTimeMillis(); + if (startTime + localDuration - nowtime < 8000L) { + this.dispelBuff(((MapleBuffStatValueHolder) mbsvh.getValue()).skillid); + } + } + } + + public void ForcechangeChannel(final int channel) { + final ChannelServer toch = ChannelServer.getInstance(channel); + try { + this.saveToDB(false, false); + } catch (Exception ex) { + FileoutputUtil.logToFile("logs/ForcechangeChannel保存数据异常.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + this.getClient().getSession().remoteAddress().toString().split(":")[0] + " 账号 " + this.getClient().getAccountName() + " 账号ID " + this.getClient().getAccID() + " 角色名 " + this.getName() + " 角色ID " + this.getId()); + FileoutputUtil.outError("logs/ForcechangeChannel保存数据异常.txt", (Throwable) ex); + } + if (toch == null || toch.isShutdown()) { + this.client.sendPacket(MaplePacketCreator.serverBlocked(1)); + return; + } + this.changeRemoval(); + this.dispelBuff(); + final ChannelServer ch = ChannelServer.getInstance(this.client.getChannel()); + if (this.getMessenger() != null) { + Messenger.silentLeaveMessenger(this.getMessenger().getId(), new MapleMessengerCharacter(this)); + } + PlayerBuffStorage.addBuffsToStorage(this.getId(), this.getAllBuffs()); + PlayerBuffStorage.addCooldownsToStorage(this.getId(), this.getCooldowns()); + PlayerBuffStorage.addDiseaseToStorage(this.getId(), this.getAllDiseases()); + World.channelChangeData(new CharacterTransfer(this), this.getId(), channel); + ch.removePlayer(this); + this.client.updateLoginState(6, this.client.getSessionIPAddress()); + this.client.sendPacket(MaplePacketCreator.getChannelChange(this.client, Integer.parseInt(toch.getSocket().split(":")[1]))); + this.getMap().removePlayer(this); + this.client.setPlayer(null); + this.client.setReceiving(false); + } + + public void changeChannel(final int channel) { + final ChannelServer toch = ChannelServer.getInstance(channel); + try { + this.saveToDB(false, false); + } catch (Exception ex) { + FileoutputUtil.logToFile("logs/更换频道保存数据异常.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + this.getClient().getSession().remoteAddress().toString().split(":")[0] + " 账号 " + this.getClient().getAccountName() + " 账号ID " + this.getClient().getAccID() + " 角色名 " + this.getName() + " 角色ID " + this.getId()); + FileoutputUtil.outError("logs/更换频道保存数据异常.txt", (Throwable) ex); + } + if (channel == this.client.getChannel() || toch == null || toch.isShutdown()) { + this.client.sendPacket(MaplePacketCreator.serverBlocked(1)); + return; + } + this.dispelBuff(); + this.changeRemoval(); + final ChannelServer ch = ChannelServer.getInstance(this.client.getChannel()); + if (this.getMessenger() != null) { + Messenger.silentLeaveMessenger(this.getMessenger().getId(), new MapleMessengerCharacter(this)); + } + PlayerBuffStorage.addBuffsToStorage(this.getId(), this.getAllBuffs()); + PlayerBuffStorage.addCooldownsToStorage(this.getId(), this.getCooldowns()); + PlayerBuffStorage.addDiseaseToStorage(this.getId(), this.getAllDiseases()); + World.channelChangeData(new CharacterTransfer(this), this.getId(), channel); + if (ch != null) { + ch.removePlayer(this); + } + this.client.updateLoginState(6, this.client.getSessionIPAddress()); + this.client.sendPacket(MaplePacketCreator.getChannelChange(this.client, Integer.parseInt(toch.getSocket().split(":")[1]))); + this.getMap().removePlayer(this); + if (!LoginServer.CanLoginKey(this.getLoginKey(), this.getAccountID()) || (LoginServer.getLoginKey(this.getAccountID()) == null && !this.getLoginKey().isEmpty())) { + FileoutputUtil.logToFile("logs/Data/客戶端登录KEY异常.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + this.client.getSession().remoteAddress().toString().split(":")[0] + " 账号: " + this.client.getAccountName() + " 客戶端key:" + LoginServer.getLoginKey(this.getAccountID()) + " 服务端key:" + this.getLoginKey() + " 更换频道10"); + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, "[GM 密语系统] 非法更换频道 账号 " + this.client.getAccountName())); + this.client.getSession().close(); + return; + } + if (!LoginServer.CanServerKey(this.getServerKey(), this.getAccountID()) || (LoginServer.getServerKey(this.getAccountID()) == null && !this.getServerKey().isEmpty())) { + FileoutputUtil.logToFile("logs/Data/客戶端频道KEY异常.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + this.client.getSession().remoteAddress().toString().split(":")[0] + " 账号: " + this.client.getAccountName() + " 客戶端key:" + LoginServer.getServerKey(this.getAccountID()) + " 服务端key:" + this.getServerKey() + " 更换频道11"); + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, "[GM 密语系统] 非法更换频道 账号 " + this.client.getAccountName())); + this.client.getSession().close(); + return; + } + if (!LoginServer.CanClientKey(this.getClientKey(), this.getAccountID()) || (LoginServer.getClientKey(this.getAccountID()) == null && !this.getClientKey().isEmpty())) { + FileoutputUtil.logToFile("logs/Data/客戶端进入KEY异常.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + this.client.getSession().remoteAddress().toString().split(":")[0] + " 账号: " + this.client.getAccountName() + " 客戶端key:" + LoginServer.getClientKey(this.getAccountID()) + " 服务端key:" + this.getClientKey() + " 更换频道12"); + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, "[GM 密语系统] 非法更换频道 账号 " + this.client.getAccountName())); + this.client.getSession().close(); + return; + } + final List charNamesa = this.client.loadCharacterNamesByCharId(this.getId()); + for (final ChannelServer cs : ChannelServer.getAllInstances()) { + for (final String name : charNamesa) { + if (cs.getPlayerStorage().getCharacterByName(name) != null) { + FileoutputUtil.logToFile("logs/Data/非法登录.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + this.client.getSession().remoteAddress().toString().split(":")[0] + " 账号 " + this.client.getAccountName() + "更换频道1"); + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, "[GM 密语系统] 非法更换频道 账号 " + this.client.getAccountName())); + this.client.getSession().close(); + return; + } + } + } + for (final String name2 : charNamesa) { + if (CashShopServer.getPlayerStorage().getCharacterByName(name2) != null) { + FileoutputUtil.logToFile("logs/Data/非法登录.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + this.client.getSession().remoteAddress().toString().split(":")[0] + " 账号 " + this.client.getAccountName() + "更换频道2"); + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, "[GM 密语系统] 非法更换频道 账号 " + this.client.getAccountName())); + this.client.getSession().close(); + return; + } + } + final List charNames = this.client.loadCharacterNamesByCharId(this.getId()); + for (final ChannelServer cs2 : ChannelServer.getAllInstances()) { + for (final String name3 : charNames) { + final MapleCharacter character = cs2.getPlayerStorage().getCharacterByName(name3); + if (character != null) { + FileoutputUtil.logToFile("logs/Data/非法登录.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + this.client.getSession().remoteAddress().toString().split(":")[0] + " 账号 " + this.client.getAccountName() + "更换频道3"); + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, "[GM 密语系统] 非法更换频道 账号 " + this.client.getAccountName())); + this.client.getSession().close(); + character.getClient().getSession().close(); + } + } + } + for (final String name4 : charNames) { + final MapleCharacter charactercs = CashShopServer.getPlayerStorage().getCharacterByName(name4); + if (charactercs != null) { + FileoutputUtil.logToFile("logs/Data/非法登录.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + this.client.getSession().remoteAddress().toString().split(":")[0] + " 账号 " + this.client.getAccountName() + "更换频道4"); + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, "[GM 密语系统] 非法更换频道 账号 " + this.client.getAccountName())); + this.client.getSession().close(); + charactercs.getClient().getSession().close(); + } + } + this.client.setPlayer(null); + this.client.setReceiving(false); + this.expirationTask(true, false); + } + + public void expandInventory(final byte type, final int amount) { + final MapleInventory inv = this.getInventory(MapleInventoryType.getByType(type)); + inv.addSlot((byte) amount); + this.client.sendPacket(MaplePacketCreator.getSlotUpdate(type, inv.getSlotLimit())); + } + + public boolean allowedToTarget(final MapleCharacter other) { + return other != null && (!other.isHidden() || this.getGMLevel() >= other.getGMLevel()); + } + + public int getFollowId() { + return this.followid; + } + + public void setFollowId(final int fi) { + this.followid = fi; + if (fi == 0) { + this.followinitiator = false; + this.followon = false; + } + } + + public void setFollowInitiator(final boolean fi) { + this.followinitiator = fi; + } + + public void setFollowOn(final boolean fi) { + this.followon = fi; + } + + public boolean isFollowOn() { + return this.followon; + } + + public boolean isFollowInitiator() { + return this.followinitiator; + } + + public void checkFollow() { + if (this.followon) { + this.map.broadcastMessage(MaplePacketCreator.followEffect(this.id, 0, null)); + this.map.broadcastMessage(MaplePacketCreator.followEffect(this.followid, 0, null)); + final MapleCharacter tt = this.map.getCharacterById(this.followid); + this.client.sendPacket(MaplePacketCreator.getFollowMessage("Follow canceled.")); + if (tt != null) { + tt.setFollowId(0); + tt.getClient().sendPacket(MaplePacketCreator.getFollowMessage("Follow canceled.")); + } + this.setFollowId(0); + } + } + + public int getMarriageId() { + return this.marriageId; + } + + public void setMarriageId(final int mi) { + this.marriageId = mi; + } + + public int getMarriageItemId() { + return this.marriageItemId; + } + + public void setMarriageItemId(final int mi) { + this.marriageItemId = mi; + } + + public boolean isStaff() { + return this.gmLevel > PlayerGMRank.普通玩家.getLevel(); + } + + public boolean startPartyQuest(final int questid) { + boolean ret = false; + if (!this.quests.containsKey(MapleQuest.getInstance(questid)) || !this.questinfo.containsKey(Integer.valueOf(questid))) { + final MapleQuestStatus status = this.getQuestNAdd(MapleQuest.getInstance(questid)); + status.setStatus((byte) 1); + this.updateQuest(status); + switch (questid) { + case 1300: + case 1301: + case 1302: { + this.updateInfoQuest(questid, "min=0;sec=0;date=0000-00-00;have=0;rank=F;try=0;cmp=0;CR=0;VR=0;gvup=0;vic=0;lose=0;draw=0"); + break; + } + case 1204: { + this.updateInfoQuest(questid, "min=0;sec=0;date=0000-00-00;have0=0;have1=0;have2=0;have3=0;rank=F;try=0;cmp=0;CR=0;VR=0"); + break; + } + case 1206: { + this.updateInfoQuest(questid, "min=0;sec=0;date=0000-00-00;have0=0;have1=0;rank=F;try=0;cmp=0;CR=0;VR=0"); + break; + } + default: { + this.updateInfoQuest(questid, "min=0;sec=0;date=0000-00-00;have=0;rank=F;try=0;cmp=0;CR=0;VR=0"); + break; + } + } + ret = true; + } + return ret; + } + + public String getOneInfo(final int questid, final String key) { + if (!this.questinfo.containsKey(Integer.valueOf(questid)) || key == null) { + return null; + } + final String[] split3; + final String[] split = split3 = ((String) this.questinfo.get(Integer.valueOf(questid))).split(";"); + for (final String x : split3) { + final String[] split2 = x.split("="); + if (split2.length == 2 && split2[0].equals(key)) { + return split2[1]; + } + } + return null; + } + + public void updateOneInfo(final int questid, final String key, final String value) { + if (!this.questinfo.containsKey(Integer.valueOf(questid)) || key == null || value == null) { + return; + } + final String[] split = ((String) this.questinfo.get(Integer.valueOf(questid))).split(";"); + boolean changed = false; + final StringBuilder newQuest = new StringBuilder(); + for (final String x : split) { + final String[] split2 = x.split("="); + if (split2.length == 2) { + if (split2[0].equals(key)) { + newQuest.append(key).append("=").append(value); + } else { + newQuest.append(x); + } + newQuest.append(";"); + changed = true; + } + } + this.updateInfoQuest(questid, changed ? newQuest.toString().substring(0, newQuest.toString().length() - 1) : newQuest.toString()); + } + + public void recalcPartyQuestRank(final int questid) { + if (!this.startPartyQuest(questid)) { + final String oldRank = this.getOneInfo(questid, "rank"); + if (oldRank == null || oldRank.equals("S")) { + return; + } + final String s = oldRank; + String newRank = null; + switch (s) { + case "A": { + newRank = "S"; + break; + } + case "B": { + newRank = "A"; + break; + } + case "C": { + newRank = "B"; + break; + } + case "D": { + newRank = "C"; + break; + } + case "F": { + newRank = "D"; + break; + } + default: { + return; + } + } + final List>> questInfo = MapleQuest.getInstance(questid).getInfoByRank(newRank); + for (final Pair> q : questInfo) { + boolean found = false; + final String val = this.getOneInfo(questid, (String) (q.right).left); + if (val == null) { + return; + } + int vall; + try { + vall = Integer.parseInt(val); + } catch (NumberFormatException e) { + return; + } + final String s2 = (String) q.left; + switch (s2) { + case "less": { + found = (vall < ((Integer) (q.right).right).intValue()); + break; + } + case "more": { + found = (vall > ((Integer) (q.right).right).intValue()); + break; + } + case "equal": { + found = (vall == ((Integer) (q.right).right).intValue()); + break; + } + } + if (!found) { + return; + } + } + this.updateOneInfo(questid, "rank", newRank); + } + } + + public void tryPartyQuest(final int questid) { + try { + this.startPartyQuest(questid); + this.pqStartTime = System.currentTimeMillis(); + this.updateOneInfo(questid, "try", String.valueOf(Integer.parseInt(this.getOneInfo(questid, "try")) + 1)); + } catch (Exception e) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) e, "tryPartyQuest error"); + } + } + + public void cmpPartyQuest(final int questid, final int sl) { + this.updateOneInfo(questid, "cmp", String.valueOf(Integer.parseInt(this.getOneInfo(questid, "cmp")) - sl)); + } + + public void endPartyQuest(final int questid) { + try { + this.startPartyQuest(questid); + if (this.pqStartTime > 0L) { + final long changeTime = System.currentTimeMillis() - this.pqStartTime; + final int mins = (int) (changeTime / 1000L / 60L); + final int secs = (int) (changeTime / 1000L % 60L); + final int mins2 = Integer.parseInt(this.getOneInfo(questid, "min")); + final int secs2 = Integer.parseInt(this.getOneInfo(questid, "sec")); + if (mins2 <= 0 || mins < mins2) { + this.updateOneInfo(questid, "min", String.valueOf(mins)); + this.updateOneInfo(questid, "sec", String.valueOf(secs)); + this.updateOneInfo(questid, "date", FilePrinter.getLocalDateString()); + } + final int newCmp = Integer.parseInt(this.getOneInfo(questid, "cmp")) + 1; + this.updateOneInfo(questid, "cmp", String.valueOf(newCmp)); + this.updateOneInfo(questid, "CR", String.valueOf((int) Math.ceil((double) newCmp * 100.0 / (double) Integer.parseInt(this.getOneInfo(questid, "try"))))); + this.recalcPartyQuestRank(questid); + this.pqStartTime = 0L; + } + } catch (Exception e) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) e, "endPartyQuest error"); + } + } + + public void havePartyQuest(final int itemId) { + int index = -1; + int questid = 0; + switch (itemId) { + case 1002798: { + questid = 1200; + break; + } + case 1072369: { + questid = 1201; + break; + } + case 1022073: { + questid = 1202; + break; + } + case 1082232: { + questid = 1203; + break; + } + case 1002571: + case 1002572: + case 1002573: + case 1002574: { + questid = 1204; + index = itemId - 1002571; + break; + } + case 1122010: { + questid = 1205; + break; + } + case 1032060: + case 1032061: { + questid = 1206; + index = itemId - 1032060; + break; + } + case 3010018: { + questid = 1300; + break; + } + case 1122007: { + questid = 1301; + break; + } + case 1122058: { + questid = 1302; + break; + } + default: { + return; + } + } + this.startPartyQuest(questid); + this.updateOneInfo(questid, "have" + ((index == -1) ? "" : Integer.valueOf(index)), "1"); + } + + public void resetStatsByJob(final boolean beginnerJob) { + final int baseJob = beginnerJob ? (this.job % 1000) : (this.job % 1000 / 100 * 100); + if (baseJob == 100) { + this.resetStats(25, 4, 4, 4); + } else if (baseJob == 200) { + this.resetStats(4, 4, 25, 4); + } else if (baseJob == 300 || baseJob == 400) { + this.resetStats(4, 25, 4, 4); + } else if (baseJob == 400) { + this.resetStats(4, 4, 4, 25); + } else if (baseJob == 500) { + this.resetStats(4, 4, 4, 4); + } + } + + public void setGMLevel(final byte g) { + this.gmLevel = g; + } + + public int get刷钱模式() { + return this.刷钱模式; + } + + public void set刷钱模式(final int invinc) { + this.刷钱模式 = invinc; + } + + public boolean hasSummon() { + return this.hasSummon; + } + + public void setHasSummon(final boolean summ) { + this.hasSummon = summ; + } + + public void removeDoor() { + final MapleDoor door = (MapleDoor) this.getDoors().iterator().next(); + for (final MapleCharacter chr : door.getTarget().getCharactersThreadsafe()) { + door.sendDestroyData(chr.getClient()); + } + for (final MapleCharacter chr : door.getTown().getCharactersThreadsafe()) { + door.sendDestroyData(chr.getClient()); + } + for (final MapleDoor destroyDoor : this.getDoors()) { + door.getTarget().removeMapObject((MapleMapObject) destroyDoor); + door.getTown().removeMapObject((MapleMapObject) destroyDoor); + } + this.clearDoors(); + } + + public void changeRemoval() { + this.changeRemoval(false); + } + + public void changeRemoval(final boolean dc) { + if (this.getTrade() != null) { + if (this.getTrade().getPartner() != null) { + final MapleTrade local = this.getTrade(); + final MapleTrade partners = local.getPartner(); + if (local.isLocked() && partners.isLocked()) { + this.client.getSession().write(MaplePacketCreator.enableActions()); + } else { + MapleTrade.cancelTrade(this.getTrade(), this.getClient()); + } + } else { + MapleTrade.cancelTrade(this.getTrade(), this.client); + } + } + if (this.getCheatTracker() != null) { + this.getCheatTracker().dispose(); + } + if (!dc) { + this.cancelEffectFromBuffStat(MapleBuffStat.MONSTER_RIDING); + this.cancelEffectFromBuffStat(MapleBuffStat.PUPPET); + } + if (this.getPyramidSubway() != null) { + this.getPyramidSubway().dispose(this); + } + if (this.playerShop != null && !dc) { + this.playerShop.removeVisitor(this); + if (this.playerShop.isOwner(this)) { + this.playerShop.setOpen(true); + } + } + if (!this.getDoors().isEmpty()) { + this.removeDoor(); + } + this.disposeClones(); + NPCScriptManager.getInstance().dispose(this.client); + } + + public void updateTick(final int newTick) { + if (this.anticheat != null) { + this.anticheat.updateTick(newTick); + } + } + + public boolean canUseFamilyBuff(final MapleFamilyBuffEntry buff) { + final MapleQuestStatus stat = this.getQuestNAdd(MapleQuest.getInstance(buff.questID)); + if (stat.getCustomData() == null) { + stat.setCustomData("0"); + } + return Long.parseLong(stat.getCustomData()) + 86400000L < System.currentTimeMillis(); + } + + public void useFamilyBuff(final MapleFamilyBuffEntry buff) { + final MapleQuestStatus stat = this.getQuestNAdd(MapleQuest.getInstance(buff.questID)); + stat.setCustomData(String.valueOf(System.currentTimeMillis())); + } + + public List> usedBuffs() { + final List> used = (List>) new ArrayList(); + for (final MapleFamilyBuffEntry buff : MapleFamilyBuff.getBuffEntry()) { + if (!this.canUseFamilyBuff(buff)) { + used.add(new Pair(Integer.valueOf(buff.index), Integer.valueOf(buff.count))); + } + } + return used; + } + + public String getTeleportName() { + return this.teleportname; + } + + public void setTeleportName(final String tname) { + this.teleportname = tname; + } + + public int getNoJuniors() { + if (this.mfc == null) { + return 0; + } + return this.mfc.getNoJuniors(); + } + + public MapleFamilyCharacter getMFC() { + return this.mfc; + } + + public void makeMFC(final int familyid, final int seniorid, final int junior1, final int junior2) { + if (familyid > 0) { + final MapleFamily f = Family.getFamily(familyid); + if (f == null) { + this.mfc = null; + } else { + this.mfc = f.getMFC(this.id); + if (this.mfc == null) { + this.mfc = f.addFamilyMemberInfo(this, seniorid, junior1, junior2); + } + if (this.mfc.getSeniorId() != seniorid) { + this.mfc.setSeniorId(seniorid); + } + if (this.mfc.getJunior1() != junior1) { + this.mfc.setJunior1(junior1); + } + if (this.mfc.getJunior2() != junior2) { + this.mfc.setJunior2(junior2); + } + } + } else { + this.mfc = null; + } + } + + public void setFamily(final int newf, final int news, final int newj1, final int newj2) { + if (this.mfc == null || newf != this.mfc.getFamilyId() || news != this.mfc.getSeniorId() || newj1 != this.mfc.getJunior1() || newj2 != this.mfc.getJunior2()) { + this.makeMFC(newf, news, newj1, newj2); + } + } + + public int maxBattleshipHP(final int skillid) { + return this.getSkillLevel(skillid) * 5000 + (this.getLevel() - 120) * 3000; + } + + public int currentBattleshipHP() { + return this.battleshipHP; + } + + public int getGachExp() { + return this.gachexp; + } + + public void setGachExp(final int ge) { + this.gachexp = ge; + } + + public void sendEnglishQuiz(final String msg) { + this.client.sendPacket(MaplePacketCreator.englishQuizMsg(msg)); + } + + public void fakeRelog() { + final int chan = this.client.getChannel(); + this.client.sendPacket(MaplePacketCreator.getCharInfo(this)); + final MapleMap mapp = this.getMap(); + mapp.removePlayer(this); + mapp.addPlayer(this); + this.ForcechangeChannel(chan); + } + + public String getcharmessage() { + return this.charmessage; + } + + public void setcharmessage(String s) { + if (s.getBytes().length >= 24) { + s = s.substring(0, 24); + } + this.charmessage = s; + } + + public int getexpression() { + return this.expression; + } + + public void setexpression(final int s) { + this.expression = s; + } + + public int getconstellation() { + return this.constellation; + } + + public void setconstellation(final int s) { + this.constellation = s; + } + + public int getblood() { + return this.blood; + } + + public void setblood(final int s) { + this.blood = s; + } + + public int getmonth() { + return this.month; + } + + public void setmonth(final int s) { + this.month = s; + } + + public int getday() { + return this.day; + } + + public void setday(final int s) { + this.day = s; + } + + public int getTeam() { + return this.coconutteam; + } + + public int getBeans() { + return this.beans; + } + + public void gainBeans(final int s) { + this.beans += s; + } + + public void setBeans(final int s) { + this.beans = s; + } + + public int getBeansNum() { + return this.beansNum; + } + + public void setBeansNum(final int beansNum) { + this.beansNum = beansNum; + } + + public int getBeansRange() { + return this.beansRange; + } + + public void setBeansRange(final int beansRange) { + this.beansRange = beansRange; + } + + public boolean isCanSetBeansNum() { + return this.canSetBeansNum; + } + + public void setCanSetBeansNum(final boolean canSetBeansNum) { + this.canSetBeansNum = canSetBeansNum; + } + + public boolean getBeansStart() { + return this.beansStart; + } + + public void setBeansStart(final boolean beansStart) { + this.beansStart = beansStart; + } + + public boolean haveGM() { + return this.gmLevel >= 2 && this.gmLevel <= 3; + } + + public void setprefix(final String prefix) { + this.prefix = prefix; + } + + public String getPrefix() { + return this.prefix; + } + + public void gainItem(final int code, final int amount) { + MapleInventoryManipulator.addById(this.client, code, (short) amount, null); + } + + public void gainItem(final int code) { + MapleInventoryManipulator.addById(this.client, code, (short) 1, null); + } + + public void giftMedal(final int id) { + if (!this.getInventory(MapleInventoryType.EQUIP).isFull() && this.getInventory(MapleInventoryType.EQUIP).countById(id) == 0 && this.getInventory(MapleInventoryType.EQUIPPED).countById(id) == 0) { + MapleInventoryManipulator.addById(this.client, id, (short) 1); + Broadcast.broadcastMessage(MaplePacketCreator.serverNotice(6, "[恭喜]" + this.getName() + "刚才得到了 " + MapleItemInformationProvider.getInstance().getName(id) + "!")); + } else if (this.getInventory(MapleInventoryType.EQUIP).countById(id) == 0 && this.getInventory(MapleInventoryType.EQUIPPED).countById(id) == 0) { + MapleInventoryManipulator.drop(this.client, MapleInventoryType.EQUIP, (short) 1, (short) 1); + MapleInventoryManipulator.addById(this.client, id, (short) 1); + Broadcast.broadcastMessage(MaplePacketCreator.serverNotice(6, "[恭喜]" + this.getName() + "刚才得到了 " + MapleItemInformationProvider.getInstance().getName(id) + "!")); + } + } + + public final void showInstruction(final String msg, final int width, final int height) { + this.client.getSession().writeAndFlush(MaplePacketCreator.sendHint(msg, width, height)); + } + + public void removeItem(final int id, final int quantity) { + MapleInventoryManipulator.removeById(this.client, GameConstants.getInventoryType(id), id, -quantity, true, false); + this.client.sendPacket(MaplePacketCreator.getShowItemGain(id, (short) quantity, true)); + } + + public String getVipName() { + String name = ""; + if (this.getVip() > 0) { + name = ServerConfig.getVipMedalName(this.getVip()); + } + return name; + } + + public String getNick() { + String name = ""; + if (this.getOneTimeLog("关闭VIP星星数显示") < 1 && this.getVipMedal() && this.getVip() > 0) { + name += this.getVipName(); + } + if (this.getGMLevel() > 0) { + name += ""; + } + return name; + } + + public boolean getVipMedal() { + return this.Vip_Medal; + } + + public void setVipMedat(final boolean x) { + this.Vip_Medal = x; + } + + public void setVipMedal(final boolean x) { + this.Vip_Medal = x; + } + + public int getVipExpRate() { + if (this.getVip() <= 5) { + return (this.getVip() == 0) ? 0 : ((this.getVip() + 1) * 5); + } + return (this.getVip() == 0) ? 0 : ((this.getVip() + 1) * 5); + } + + public void control_精灵商人(final boolean control) { + this.精灵商人购买开关 = control; + } + + public void control_玩家私聊(final boolean control) { + this.玩家私聊开关 = control; + } + + public void control_玩家密语(final boolean control) { + this.玩家密语开关 = control; + } + + public void control_好友聊天(final boolean control) { + this.好友聊天开关 = control; + } + + public void control_队伍聊天(final boolean control) { + this.队伍聊天开关 = control; + } + + public void control_公会聊天(final boolean control) { + this.公会聊天开关 = control; + } + + public void control_联盟聊天(final boolean control) { + this.联盟聊天开关 = control; + } + + public void control_吸怪讯息(final boolean control) { + this.GM吸怪讯息开关 = control; + } + + public boolean get_control_精灵商人() { + return this.精灵商人购买开关; + } + + public boolean get_control_玩家私聊() { + return this.玩家私聊开关; + } + + public boolean get_control_玩家密语() { + return this.玩家密语开关; + } + + public boolean get_control_好友聊天() { + return this.好友聊天开关; + } + + public boolean get_control_队伍聊天() { + return this.队伍聊天开关; + } + + public boolean get_control_公会聊天() { + return this.公会聊天开关; + } + + public boolean get_control_联盟聊天() { + return this.联盟聊天开关; + } + + public boolean get_control_吸怪讯息() { + return this.GM吸怪讯息开关; + } + + public int getDiseaseSize() { + return this.diseases.size(); + } + + public int getMSG() { + return this.MSG; + } + + public void setMSG(final int x) { + this.MSG = x; + } + + public void addMSG() { + ++this.MSG; + } + + public void fly() { + } + + public final boolean CanStorage() { + if (this.lastStorageTime + 1000L > System.currentTimeMillis()) { + return false; + } + this.lastStorageTime = System.currentTimeMillis(); + return true; + } + + public final boolean canHP() { + if (this.lastHPTime + 5000L > System.currentTimeMillis()) { + return false; + } + this.lastHPTime = System.currentTimeMillis(); + return true; + } + + public final boolean canMP() { + if (this.lastMPTime + 5000L > System.currentTimeMillis()) { + return false; + } + this.lastMPTime = System.currentTimeMillis(); + return true; + } + + public final boolean canUseMD() { + if (this.lastMDTime + 5000L > System.currentTimeMillis()) { + return false; + } + this.lastMDTime = System.currentTimeMillis(); + return true; + } + + public void add打怪() { + ++this.打怪; + } + + public int get打怪() { + return this.打怪; + } + + public void add吸怪() { + ++this.吸怪; + } + + public int get吸怪() { + return this.吸怪; + } + + public void addFly_吸怪() { + ++this.FLY_吸怪; + } + + public int getFly_吸怪() { + return this.FLY_吸怪; + } + + public int Aran_ReduceCombo(final int skill) { + int reduce = 0; + switch (skill) { + case 21100004: + case 21100005: { + reduce = 1; + break; + } + case 21110004: { + reduce = 1; + break; + } + case 21120006: + case 21120007: { + reduce = 1; + break; + } + } + return reduce; + } + + public int getAcash() { + return this.getAcash(this); + } + + public int getAcash(final MapleCharacter chr) { + final int maxtimes = 10; + int nowtime = 0; + final int delay = 500; + boolean error = false; + int x = 0; + do { + ++nowtime; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final Statement stmt = con.createStatement(); + final ResultSet rs = stmt.executeQuery("Select Acash from Accounts Where id = " + chr.getClient().getAccID()); + while (rs.next()) { + int debug = -1; + try { + debug = rs.getInt("Acash"); + } catch (Exception ex2) { + } + if (debug != -1) { + x = rs.getInt("Acash"); + error = false; + } else { + error = true; + } + } + rs.close(); + stmt.close(); + con.close(); + } catch (SQLException SQL) { + System.err.println("[getAcash]无法连接资料库"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) SQL); + } catch (Exception ex) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex, "getAcash"); + System.err.println("[getAcash]" + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + if (error) { + try { + Thread.sleep((long) delay); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + } while (error && nowtime < maxtimes); + return x; + } + + public void setAcash(final int x) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("Update Accounts set Acash = ? Where id = ?"); + ps.setInt(1, x); + ps.setInt(2, this.getClient().getAccID()); + ps.execute(); + ps.close(); + } catch (SQLException ex) { + System.err.println("[Acash]无法连接资料库"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } catch (Exception ex2) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex2, "SetAcash"); + System.err.println("[setAcash]" + ex2); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex2); + } + } + + public int getCZJF() { + return this.getCZJF(this); + } + + public int getCZJF(final MapleCharacter chr) { + final int maxtimes = 10; + int nowtime = 0; + final int delay = 500; + boolean error = false; + int x = 0; + do { + ++nowtime; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final Statement stmt = con.createStatement(); + final ResultSet rs = stmt.executeQuery("Select CZJF from Accounts Where id = " + chr.getClient().getAccID()); + while (rs.next()) { + int debug = -1; + try { + debug = rs.getInt("CZJF"); + } catch (Exception ex2) { + } + if (debug != -1) { + x = rs.getInt("CZJF"); + error = false; + } else { + error = true; + } + } + rs.close(); + stmt.close(); + con.close(); + } catch (SQLException SQL) { + System.err.println("[getCZJF]无法连接资料库"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) SQL); + } catch (Exception ex) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex, "getCZJF"); + System.err.println("[getCZJF]" + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + if (error) { + try { + Thread.sleep((long) delay); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + } while (error && nowtime < maxtimes); + return x; + } + + public void setCZJF(final int x) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("Update Accounts set CZJF = ? Where id = ?"); + ps.setInt(1, x); + ps.setInt(2, this.getClient().getAccID()); + ps.execute(); + ps.close(); + } catch (SQLException ex) { + System.err.println("[CZJF]无法连接资料库"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } catch (Exception ex2) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex2, "SetCZJF"); + System.err.println("[setCZJF]" + ex2); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex2); + } + } + + public int getTGJF() { + return this.getTGJF(this); + } + + public int getTGJF(final MapleCharacter chr) { + final int maxtimes = 10; + int nowtime = 0; + final int delay = 500; + boolean error = false; + int x = 0; + do { + ++nowtime; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final Statement stmt = con.createStatement(); + final ResultSet rs = stmt.executeQuery("Select TGJF from Accounts Where id = " + chr.getClient().getAccID()); + while (rs.next()) { + int debug = -1; + try { + debug = rs.getInt("TGJF"); + } catch (Exception ex2) { + } + if (debug != -1) { + x = rs.getInt("TGJF"); + error = false; + } else { + error = true; + } + } + rs.close(); + stmt.close(); + con.close(); + } catch (SQLException SQL) { + System.err.println("[getTGJF]无法连接资料库"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) SQL); + } catch (Exception ex) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex, "getTGJF"); + System.err.println("[getTGJF]" + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + if (error) { + try { + Thread.sleep((long) delay); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + } while (error && nowtime < maxtimes); + return x; + } + + public void setTGJF(final int x) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("Update Accounts set TGJF = ? Where id = ?"); + ps.setInt(1, x); + ps.setInt(2, this.getClient().getAccID()); + ps.execute(); + ps.close(); + } catch (SQLException ex) { + System.err.println("[TGJF]无法连接资料库"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } catch (Exception ex2) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex2, "SetTGJFF"); + System.err.println("[setTGJF]" + ex2); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex2); + } + } + + public int getTJJF() { + return this.getTJJF(this); + } + + public int getTJJF(final MapleCharacter chr) { + final int maxtimes = 10; + int nowtime = 0; + final int delay = 500; + boolean error = false; + int x = 0; + do { + ++nowtime; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final Statement stmt = con.createStatement(); + final ResultSet rs = stmt.executeQuery("Select TJJF from Accounts Where id = " + chr.getClient().getAccID()); + while (rs.next()) { + int debug = -1; + try { + debug = rs.getInt("TJJF"); + } catch (Exception ex2) { + } + if (debug != -1) { + x = rs.getInt("TJJF"); + error = false; + } else { + error = true; + } + } + rs.close(); + stmt.close(); + con.close(); + } catch (SQLException SQL) { + System.err.println("[getTJJF]无法连接资料库"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) SQL); + } catch (Exception ex) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex, "getTJJF"); + System.err.println("[getTJJF]" + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + if (error) { + try { + Thread.sleep((long) delay); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + } while (error && nowtime < maxtimes); + return x; + } + + public void setTJJF(final int x) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("Update Accounts set TJJF = ? Where id = ?"); + ps.setInt(1, x); + ps.setInt(2, this.getClient().getAccID()); + ps.execute(); + ps.close(); + } catch (SQLException ex) { + System.err.println("[TJJF]无法连接资料库"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } catch (Exception ex2) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex2, "SetTJJFF"); + System.err.println("[setTJJF]" + ex2); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex2); + } + } + + public void modifyJF(final int type, final int quantity) { + switch (type) { + case 1: { + final int CZJF = this.getCZJF(); + if (CZJF + quantity < 0) { + return; + } + this.setCZJF(CZJF + quantity); + break; + } + case 2: { + final int TGJF = this.getTGJF(); + if (TGJF + quantity < 0) { + return; + } + this.setTGJF(TGJF + quantity); + break; + } + case 3: { + final int TJJF = this.getTJJF(); + if (TJJF + quantity < 0) { + return; + } + this.setTJJF(TJJF + quantity); + break; + } + case 4: { + final int DDJF = this.getDDJF(); + if (DDJF + quantity < 0) { + return; + } + this.setDDJF(DDJF + quantity); + break; + } + } + } + + public boolean getAuto吸怪() { + return this.auto吸怪; + } + + public void setAuto吸怪(final boolean x) { + this.auto吸怪 = x; + } + + public void warpAuto吸怪(final MapleCharacter chr_) { + final MapleCharacter chr = this; + try { + if (chr.getMapId() != chr_.getMapId()) { + chr.changeMap(chr_.getMapId()); + chr.changeMap(chr_.getMap(), chr_.getMap().findClosestSpawnpoint(chr_.getPosition())); + } + if (chr.getClient().getChannel() != chr_.getClient().getChannel()) { + chr.changeChannel(chr_.getClient().getChannel()); + } + } catch (Exception ex) { + } + } + + public void setDebugMessage(final boolean control) { + this.DebugMessage = control; + } + + public boolean getDebugMessage() { + return this.DebugMessage; + } + + public void RemoveHired() { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = con.prepareStatement("Delete From hiredmerch Where characterid = ?"); + ps.setInt(1, this.id); + ps.execute(); + ps = con.prepareStatement("Delete From hiredmerchitems Where characterid = ?"); + ps.setInt(1, this.id); + ps.execute(); + ps.close(); + } catch (Exception ex) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex, "RemoveHired"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + + public final void maxSkills() { + for (final ISkill skil : SkillFactory.getAllSkills()) { + this.changeSkillLevel(skil, skil.getMaxLevel(), skil.getMaxLevel()); + } + } + + public final void maxSkillsa() { + for (final ISkill skil : SkillFactory.getAllSkills()) { + if (skil.getId() != 5121003 && skil.getId() != 5111005 && skil.getId() != 15111002) { + this.changeSkillLevel(skil, skil.getMaxLevel(), skil.getMaxLevel()); + } + } + } + + public final void clearSkills() { + for (final ISkill skil : SkillFactory.getAllSkills()) { + this.changeSkillLevel(skil, (byte) 0, (byte) 0); + } + deleteskillmacros(); + } + + public final void deleteskillmacros() { + try { + String format = String.format("DELETE FROM skillmacros WHERE characterid=%s", this.id); + final Connection con = DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement(format); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (Exception Ex2) { + System.err.println("清除宏出错" + Ex2); + } + } + + public final void LearnSameSkill(final MapleCharacter victim) { + for (final ISkill skil : SkillFactory.getAllSkills()) { + if (victim.getSkillLevel(skil) > 0) { + this.changeSkillLevel(skil, victim.getSkillLevel(skil), victim.getMasterLevel(skil)); + } + } + } + + public final void openSkill(final MapleCharacter victim) { + for (final ISkill skil : SkillFactory.getAllSkills()) { + if (victim.getSkillLevel(skil) < 1) { + this.changeSkillLevel(skil, (byte) 0, (byte) 10); + } + } + } + + public int getStr() { + return this.getStat().getStr(); + } + + public int getInt() { + return this.getStat().getInt(); + } + + public int getLuk() { + return this.getStat().getLuk(); + } + + public int getDex() { + return this.getStat().getDex(); + } + + public int getHp() { + return this.getStat().getHp(); + } + + public int getMp() { + return this.getStat().getMp(); + } + + public int getMaxHp() { + return this.getStat().getMaxHp(); + } + + public int getMaxMp() { + return this.getStat().getMaxMp(); + } + + public void setHp(final int amount) { + this.getStat().setHp(amount); + } + + public void setMp(final int amount) { + this.getStat().setMp(amount); + } + + public void setMaxHp(final int amount) { + this.getStat().setMaxHp((short) amount); + } + + public void setMaxMp(final int amount) { + this.getStat().setMaxMp((short) amount); + } + + public void setStr(final int str) { + this.stats.str = (short) str; + this.stats.recalcLocalStats(false); + } + + public void setLuk(final int luk) { + this.stats.luk = (short) luk; + this.stats.recalcLocalStats(false); + } + + public void setDex(final int dex) { + this.stats.dex = (short) dex; + this.stats.recalcLocalStats(false); + } + + public void setInt(final int int_) { + this.stats.int_ = (short) int_; + this.stats.recalcLocalStats(false); + } + + public void setMeso(final int mesos) { + this.meso = mesos; + } + + public void updateFame() { + this.updateSingleStat(MapleStat.FAME, (int) this.getFame()); + } + + public boolean inBossMap() { + return MapConstants.inBossMap(this.getMapId()); + } + + public static boolean isVpn(final String ip) { + switch (ip) { + case "/1.34.145.220": + case "/59.125.5.52": + case "/59.126.97.123": + case "/60.251.73.100": + case "/61.219.216.173": + case "/61.219.216.174": + case "/61.227.252.169": + case "/61.228.228.128": { + return true; + } + default: { + return false; + } + } + } + + public boolean isKOC() { + return this.job >= 1000 && this.job < 2000; + } + + public boolean isAran() { + return this.job >= 2000 && this.job <= 2112 && this.job != 2001; + } + + public boolean isAdventurer() { + return this.job >= 0 && this.job < 1000; + } + + public boolean isCygnus() { + return this.job >= 1000 && this.job <= 1512; + } + + public boolean isGod() { + return this.gmLevel >= 100; + } + + public static String getCharacterNameById(final int id) { + String name = null; + final MapleCharacter chr = getOnlineCharacterById(id); + if (chr != null) { + return chr.getName(); + } + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = null; + final Statement stmt = con.createStatement(); + ps = con.prepareStatement("select name from characters where id = ?"); + ps.setInt(1, id); + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + name = rs.getString("name"); + } + ps.close(); + rs.close(); + con.close(); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return name; + } + + public static String getCharacterNameById2(final int id) { + String name = null; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = null; + final Statement stmt = con.createStatement(); + ps = con.prepareStatement("select name from characters where id = ?"); + ps.setInt(1, id); + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + name = rs.getString("name"); + } + ps.close(); + rs.close(); + con.close(); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return name; + } + + public static int getCharacterIdByName(final String name) { + int id = -1; + final MapleCharacter chr = getOnlineCharacterByName(name); + if (chr != null) { + return chr.getId(); + } + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = null; + final Statement stmt = con.createStatement(); + ps = con.prepareStatement("select id from characters where name = ?"); + ps.setString(1, name); + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + id = rs.getInt("id"); + } + ps.close(); + rs.close(); + con.close(); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return id; + } + + public static MapleCharacter getOnlineCharacterById(final int cid) { + MapleCharacter chr = null; + if (Find.findChannel(cid) >= 1) { + chr = ChannelServer.getInstance(Find.findChannel(cid)).getPlayerStorage().getCharacterById(cid); + if (chr != null) { + return chr; + } + } + return null; + } + + public static MapleCharacter getOnlineCharacterByName(final String name) { + MapleCharacter chr = null; + if (Find.findChannel(name) >= 1) { + chr = ChannelServer.getInstance(Find.findChannel(name)).getPlayerStorage().getCharacterByName(name); + if (chr != null) { + return chr; + } + } + return null; + } + + public static MapleCharacter getCharacterById(final int cid) { + final MapleCharacter chr = getOnlineCharacterById(cid); + if (chr != null) { + return chr; + } + final String name = getCharacterNameById(cid); + return (name == null) ? null : loadCharFromDB(cid, new MapleClient(null, null, (Channel) new MockIOSession()), true); + } + + public static MapleCharacter getCharacterByName(final String name) { + final MapleCharacter chr = getOnlineCharacterByName(name); + if (chr != null) { + return chr; + } + final int cid = getCharacterIdByName(name); + return (cid == -1) ? null : loadCharFromDB(cid, new MapleClient(null, null, (Channel) new MockIOSession()), true); + } + + public static void setMP(final Map GiveList, final boolean showMessage) { + final Iterator iter = GiveList.keySet().iterator(); + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = null; + while (iter.hasNext()) { + final StringBuilder sql = new StringBuilder(); + final MapleCharacter chr = (MapleCharacter) iter.next(); + final int MP = ((Integer) GiveList.get(chr)).intValue(); + sql.append("Update Accounts set MP = "); + sql.append(chr.getMP() + MP); + sql.append(" Where id = "); + sql.append(chr.getAccountID()); + ps = con.prepareStatement(sql.toString()); + ps.execute(); + if (showMessage) { + final String MSG = "「在线奖励」获得在线点数 " + MP + " 若要领取请输入 @在线点数/@jcds"; + chr.dropMessage(MSG); + } + } + if (ps != null) { + ps.close(); + } + } catch (SQLException ex) { + System.err.println("[setMP]无法连接资料库 " + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } catch (Exception ex2) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex2, "setMP"); + System.err.println("[setMP]" + ex2); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex2); + } + } + + public void setMP(final int x) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("Update Accounts set MP = ? Where id = ?"); + ps.setInt(1, x); + ps.setInt(2, this.getClient().getAccID()); + ps.execute(); + ps.close(); + } catch (SQLException ex) { + System.err.println("[setMP]无法连接资料库 " + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } catch (Exception ex2) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex2, "setMP"); + System.err.println("[setMP]" + ex2); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex2); + } + } + + public int getMP() { + final int maxtimes = 10; + int nowtime = 0; + final int delay = 500; + boolean error = false; + int mp = 0; + do { + ++nowtime; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final Statement stmt = con.createStatement(); + final ResultSet rs = stmt.executeQuery("Select MP from Accounts Where id = " + this.getClient().getAccID()); + while (rs.next()) { + int debug = -1; + try { + debug = rs.getInt("MP"); + } catch (Exception ex2) { + } + if (debug != -1) { + mp = rs.getInt("MP"); + error = false; + } else { + error = true; + } + } + rs.close(); + stmt.close(); + con.close(); + } catch (SQLException SQL) { + System.err.println("[getMP] 无法连接资料库" + SQL); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) SQL); + } catch (Exception ex) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex, "getMP"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + if (error) { + try { + Thread.sleep((long) delay); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + } while (error && nowtime < maxtimes); + return mp; + } + + public boolean hasBlockedInventory(final boolean dead) { + boolean has = false; + if (dead) { + has = (!this.isAlive() || this.getTrade() != null || this.getConversation() > 0 || this.getPlayerShop() != null); + } else { + has = (this.getTrade() != null || this.getConversation() > 0 || this.getPlayerShop() != null); + } + return has; + } + + public boolean hasBlockedInventory2(final boolean dead) { + boolean has = false; + if (dead) { + has = (!this.isAlive() || this.getTrade() != null || this.getPlayerShop() != null); + } else { + has = (this.getTrade() != null || this.getPlayerShop() != null); + } + return has; + } + + public String getNowMacs() { + return this.nowmacs; + } + + public void setNowMacs(final String macs) { + this.nowmacs = macs; + } + + public int loadVip(final int accountID) { + int vip = 0; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("SELECT vip FROM accounts WHERE id = ?"); + ps.setInt(1, accountID); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + vip = rs.getShort("vip"); + ps.close(); + rs.close(); + } + con.close(); + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + return vip; + } + + public Map getSkillID() { + return this.skillID; + } + + public boolean isItemBuffedValue(final int itemid) { + final LinkedList allBuffs = new LinkedList(this.skillID.values()); + for (final MapleBuffStatValueHolder mbsvh : allBuffs) { + if (mbsvh.effect.getSourceId() == itemid) { + return true; + } + } + return false; + } + + public void startMapEffect(final String msg, final int itemId) { + this.startMapEffect(msg, itemId, 10000); + } + + public void startMapEffect(final String msg, final int itemId, final int duration) { + final MapleMapEffect mapEffect = new MapleMapEffect(msg, itemId); + this.getClient().getSession().writeAndFlush(mapEffect.makeStartData()); + EventTimer.getInstance().schedule((Runnable) new Runnable() { + @Override + public void run() { + MapleCharacter.this.getClient().getSession().writeAndFlush(mapEffect.makeDestroyData()); + } + }, (long) duration); + } + + public void forceCompleteQuest(final int id) { + MapleQuest.getInstance(id).forceComplete(this, 0); + } + + public String getLoginKey() { + return this.loginkey; + } + + public String getServerKey() { + return this.serverkey; + } + + public String getClientKey() { + return this.clientkey; + } + + public boolean chrdangerousIp(final String lip) { + final String ip = lip.substring(1, lip.lastIndexOf(58)); + boolean ret = false; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT COUNT(*) FROM dangerousip WHERE ? LIKE CONCAT(ip, '%')")) { + ps.setString(1, ip); + try (final ResultSet rs = ps.executeQuery()) { + rs.next(); + if (rs.getInt(1) > 0) { + ret = true; + } + rs.close(); + } + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("Error dangerousIp " + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return ret; + } + + public void setChrDangerousIp(final String lip) { + final String ip = lip.substring(1, lip.lastIndexOf(58)); + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("INSERT INTO dangerousip (ip) VALUES (?)"); + ps.setString(1, ip); + ps.executeUpdate(); + ps.close(); + } catch (SQLException Wx) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Wx); + } + } + + public final void updateNewState(final int newstate, final int accountId) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE `accounts` SET `loggedin` = ? WHERE id = ?")) { + ps.setInt(1, newstate); + ps.setInt(2, accountId); + ps.executeUpdate(); + } catch (SQLException ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + + public int getIntNoRecord(final int questID) { + final MapleQuestStatus stat = this.getQuestNoAdd(MapleQuest.getInstance(questID)); + if (stat == null || stat.getCustomData() == null) { + return 0; + } + return Integer.parseInt(stat.getCustomData()); + } + + public int getIntRecord(final int questID) { + final MapleQuestStatus stat = this.getQuestNAdd(MapleQuest.getInstance(questID)); + if (stat.getCustomData() == null) { + stat.setCustomData("0"); + } + return Integer.parseInt(stat.getCustomData()); + } + + public void updatePetAuto() { + if (this.getIntNoRecord(122221) > 0) { + this.client.getSession().writeAndFlush(MaplePacketCreator.petAutoHP(this.getIntRecord(122221))); + } + if (this.getIntNoRecord(122223) > 0) { + this.client.getSession().writeAndFlush(MaplePacketCreator.petAutoMP(this.getIntRecord(122223))); + } + } + + public long getChrMeso() { + long meso = 0L; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT * FROM characters")) { + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + meso += (long) rs.getInt("meso"); + } + rs.close(); + ps.close(); + con.close(); + } catch (Exception e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + e.printStackTrace(); + } + return meso; + } + + public long getStorageMeso() { + long meso = 0L; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT * FROM storages")) { + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + meso += (long) rs.getInt("meso"); + } + rs.close(); + ps.close(); + con.close(); + } catch (Exception e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + e.printStackTrace(); + } + return meso; + } + + public long getHiredMerchMeso() { + long meso = 0L; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT * FROM hiredmerch")) { + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + meso += (long) rs.getInt("Mesos"); + } + rs.close(); + ps.close(); + con.close(); + } catch (Exception e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + e.printStackTrace(); + } + return meso; + } + + public int getQianDaoTime(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select count(*) from bosslog where characterid = ? and bossid = ? and lastattempt >= DATE_SUB(curdate(),INTERVAL 0 DAY)"); + ps.setInt(1, this.id); + ps.setString(2, bossid); + int ret_count; + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + ret_count = rs.getInt(1); + } else { + ret_count = -1; + } + rs.close(); + } + ps.close(); + con.close(); + return ret_count; + } catch (Exception Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + return -1; + } + } + + public int getQianDaoAcLog(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + int ret_count = 0; + final PreparedStatement ps = con.prepareStatement("select count(*) from Aclog where accid = ? and bossid = ? and lastattempt >= DATE_SUB(curdate(),INTERVAL 0 DAY)"); + ps.setInt(1, this.getClient().getAccID()); + ps.setString(2, bossid); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + ret_count = rs.getInt(1); + } else { + ret_count = -1; + } + rs.close(); + ps.close(); + con.close(); + return ret_count; + } catch (Exception Wx) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Wx); + return -1; + } + } + + public boolean ChrDangerousAcc(final String acc) { + boolean ret = false; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT COUNT(*) FROM dangerousacc WHERE ? LIKE CONCAT(acc, '%')")) { + ps.setString(1, acc); + try (final ResultSet rs = ps.executeQuery()) { + rs.next(); + if (rs.getInt(1) > 0) { + ret = true; + } + rs.close(); + } + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("Error dangerousname " + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return ret; + } + + public void setChrDangerousAcc(final String acc) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("INSERT INTO dangerousacc (acc) VALUES (?)"); + ps.setString(1, acc); + ps.executeUpdate(); + ps.close(); + } catch (SQLException Wx) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Wx); + } + } + + public long getChangeTime() { + return this.mapChangeTime; + } + + public void setChangeTime(final boolean changeMap) { + this.mapChangeTime = System.currentTimeMillis(); + if (changeMap) { + this.getCheatTracker().resetInMapIimeCount(); + } + } + + public int getDDJF() { + return this.getDDJF(this); + } + + public int getDDJF(final MapleCharacter chr) { + final int maxtimes = 10; + int nowtime = 0; + final int delay = 500; + boolean error = false; + int x = 0; + do { + ++nowtime; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final Statement stmt = con.createStatement(); + final ResultSet rs = stmt.executeQuery("Select DDJF from Accounts Where id = " + chr.getClient().getAccID()); + while (rs.next()) { + int debug = -1; + try { + debug = rs.getInt("DDJF"); + } catch (Exception ex2) { + } + if (debug != -1) { + x = rs.getInt("DDJF"); + error = false; + } else { + error = true; + } + } + rs.close(); + stmt.close(); + con.close(); + } catch (SQLException SQL) { + System.err.println("[getDDJF]无法连接资料库"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) SQL); + } catch (Exception ex) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex, "getDDJF"); + System.err.println("[getDDJF]" + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + if (error) { + try { + Thread.sleep((long) delay); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + } while (error && nowtime < maxtimes); + return x; + } + + public void setDDJF(final int x) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("Update Accounts set DDJF = ? Where id = ?"); + ps.setInt(1, x); + ps.setInt(2, this.getClient().getAccID()); + ps.execute(); + ps.close(); + } catch (SQLException ex) { + System.err.println("[DDJF]无法连接资料库"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } catch (Exception ex2) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex2, "SetDDJFF"); + System.err.println("[setDDJF]" + ex2); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex2); + } + } + + public final boolean canHold() { + for (int i = 1; i <= 5; ++i) { + if (this.getInventory(MapleInventoryType.getByType((byte) i)).getNextFreeSlot() <= -1) { + return false; + } + } + return true; + } + + public void deleteAcLog(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("DELETE FROM Aclog WHERE accid = ? and bossid = ?"); + ps.setInt(1, this.getClient().getAccID()); + ps.setString(2, bossid); + ps.executeUpdate(); + ps.close(); + } catch (SQLException Wx) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Wx); + } + } + + public int getAcLogD(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select count(*) from Aclog where accid = ? and bossid = ? and lastattempt >= DATE_SUB(curdate(),INTERVAL 0 DAY)"); + ps.setInt(1, this.getClient().getAccID()); + ps.setString(2, bossid); + int ret_count; + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + ret_count = rs.getInt(1); + } else { + ret_count = -1; + } + rs.close(); + } + ps.close(); + con.close(); + return ret_count; + } catch (SQLException Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + return -1; + } + } + + public int getAclogY(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select count(*) from Aclog where accid = ? and bossid = ? and DATE_FORMAT(lastattempt, '%Y%m') = DATE_FORMAT(CURDATE( ), '%Y%m')"); + ps.setInt(1, this.getClient().getAccID()); + ps.setString(2, bossid); + int ret_count; + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + ret_count = rs.getInt(1); + } else { + ret_count = -1; + } + rs.close(); + } + ps.close(); + con.close(); + return ret_count; + } catch (SQLException Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + return -1; + } + } + + public int getBossLogAS(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select count(*) from bosslog where characterid = ? and bossid = ?"); + ps.setInt(1, this.id); + ps.setString(2, bossid); + int ret_count; + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + ret_count = rs.getInt(1); + } else { + ret_count = -1; + } + rs.close(); + } + ps.close(); + con.close(); + return ret_count; + } catch (SQLException Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + return -1; + } + } + + public int getBossLogC(final String bossid) { + int ret_count = 0; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select count(*) from bosslog where characterid = ? and bossid = ?"); + ps.setInt(1, this.id); + ps.setString(2, bossid); + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + ret_count += rs.getInt(1); + } + ps.close(); + rs.close(); + con.close(); + return ret_count; + } catch (SQLException Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + return -1; + } + } + + public int getAcLogC(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + int ret_count = 0; + final PreparedStatement ps = con.prepareStatement("select count(*) from Aclog where accid = ? and bossid = ?"); + ps.setInt(1, this.getClient().getAccID()); + ps.setString(2, bossid); + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + ret_count += rs.getInt(1); + } + rs.close(); + ps.close(); + con.close(); + return ret_count; + } catch (SQLException Wx) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Wx); + return -1; + } + } + + public int getBossLogD(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select count(*) from bosslog where characterid = ? and bossid = ? and lastattempt >= DATE_SUB(curdate(),INTERVAL 0 DAY)"); + ps.setInt(1, this.id); + ps.setString(2, bossid); + int ret_count; + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + ret_count = rs.getInt(1); + } else { + ret_count = -1; + } + rs.close(); + } + ps.close(); + con.close(); + return ret_count; + } catch (SQLException Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + return -1; + } + } + + public int getBossLogY(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select count(*) from bosslog where characterid = ? and bossid = ? and DATE_FORMAT(lastattempt, '%Y%m') = DATE_FORMAT(CURDATE( ), '%Y%m')"); + ps.setInt(1, this.id); + ps.setString(2, bossid); + int ret_count; + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + ret_count = rs.getInt(1); + } else { + ret_count = -1; + } + rs.close(); + } + ps.close(); + con.close(); + return ret_count; + } catch (SQLException Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + return -1; + } + } + + public long getMrqdTime() { + return this.mrqdTime; + } + + public void setMrqdTime(final long r) { + this.mrqdTime = r; + } + + public int getStChrLog() { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select count(*) from characterid where stlog = ?"); + ps.setInt(1, this.id); + int ret_count; + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + ret_count = rs.getInt(1); + } else { + ret_count = -1; + } + rs.close(); + } + ps.close(); + con.close(); + return ret_count; + } catch (SQLException Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + return -1; + } + } + + public String getStChrNameLog(final int id) { + final int maxtimes = 10; + int nowtime = 0; + final int delay = 500; + boolean error = false; + int x = 0; + String name = ""; + do { + ++nowtime; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final Statement stmt = con.createStatement(); + final ResultSet rs = stmt.executeQuery("Select characterid from stlog Where stid = " + id); + while (rs.next()) { + int debug = -1; + try { + debug = rs.getInt("characterid"); + } catch (SQLException ex2) { + } + if (debug != -1) { + x = rs.getInt("characterid"); + name = name + getCharacterNameById(x) + ","; + error = false; + } else { + error = true; + } + } + rs.close(); + stmt.close(); + con.close(); + } catch (SQLException SQL) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) SQL); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + if (error) { + try { + Thread.sleep((long) delay); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + } while (error && nowtime < maxtimes); + return name; + } + + public int getStLog() { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select count(*) from stlog where characterid = ?"); + ps.setInt(1, this.id); + int ret_count; + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + ret_count = rs.getInt(1); + } else { + ret_count = -1; + } + rs.close(); + } + ps.close(); + con.close(); + return ret_count; + } catch (SQLException Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + return -1; + } + } + + public int getStjfLog(final int id) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select count(*) from stjflog where characterid = ?"); + ps.setInt(1, id); + int ret_count; + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + ret_count = rs.getInt(1); + } else { + ret_count = -1; + } + rs.close(); + } + ps.close(); + con.close(); + return ret_count; + } catch (SQLException Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + return -1; + } + } + + public int getStLogid(final int id) { + final int maxtimes = 10; + int nowtime = 0; + final int delay = 500; + boolean error = false; + int x = 0; + do { + ++nowtime; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final Statement stmt = con.createStatement(); + final ResultSet rs = stmt.executeQuery("Select stid from stlog Where characterid = " + id); + while (rs.next()) { + int debug = -1; + try { + debug = rs.getInt("stid"); + } catch (SQLException ex2) { + } + if (debug != -1) { + x = rs.getInt("stid"); + error = false; + } else { + error = true; + } + } + rs.close(); + stmt.close(); + con.close(); + } catch (SQLException SQL) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) SQL); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + if (error) { + try { + Thread.sleep((long) delay); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + } while (error && nowtime < maxtimes); + return x; + } + + public void setStLog(final int stid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("insert into stlog (characterid, stid) values (?,?)"); + ps.setInt(1, this.id); + ps.setInt(2, stid); + ps.executeUpdate(); + ps.close(); + } catch (SQLException Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + } + } + + public void setStjfLog(final int id, final int stid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("insert into stjflog (characterid, stjf) values (?,?)"); + ps.setInt(1, id); + ps.setInt(2, stid); + ps.executeUpdate(); + ps.close(); + } catch (SQLException Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + } + } + + public void updateStjfLog(final int id, final int stid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("Update stjflog SET stjf = ? WHERE characterid = ?"); + ps.setInt(1, stid); + ps.setInt(2, id); + ps.executeUpdate(); + ps.close(); + } catch (SQLException Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + } + } + + public int getStjf(final int id) { + final int maxtimes = 10; + int nowtime = 0; + final int delay = 500; + boolean error = false; + int x = 0; + do { + ++nowtime; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final Statement stmt = con.createStatement(); + final ResultSet rs = stmt.executeQuery("Select stjf from stjflog Where characterid = " + id); + while (rs.next()) { + int debug = -1; + try { + debug = rs.getInt("stjf"); + } catch (SQLException ex2) { + } + if (debug != -1) { + x = rs.getInt("stjf"); + error = false; + } else { + error = true; + } + } + rs.close(); + stmt.close(); + con.close(); + } catch (SQLException SQL) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) SQL); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + if (error) { + try { + Thread.sleep((long) delay); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + } while (error && nowtime < maxtimes); + return x; + } + + public int getVip() { + return this.vip; + } + + public void setVip(final int r) { + this.vip = r; + } + + public boolean isVip() { + return this.getVip() > 0; + } + + public int getOfflinePoints(final MapleCharacter victim) { + return this.getPoints(victim); + } + + public int getPoints() { + return this.getPoints(this); + } + + public int getPoints(final MapleCharacter chr) { + final int maxtimes = 10; + int nowtime = 0; + final int delay = 500; + boolean error = false; + int x = 0; + do { + ++nowtime; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final Statement stmt = con.createStatement(); + final ResultSet rs = stmt.executeQuery("Select points from Accounts Where id = " + chr.getClient().getAccID()); + while (rs.next()) { + int debug = -1; + try { + debug = rs.getInt("points"); + } catch (SQLException ex2) { + } + if (debug != -1) { + x = rs.getInt("points"); + error = false; + } else { + error = true; + } + } + rs.close(); + stmt.close(); + con.close(); + } catch (SQLException SQL) { + System.err.println("[getPoints]无法连接资料库"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) SQL); + } catch (Exception ex) { + System.err.println("[getPoints]" + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + if (error) { + try { + Thread.sleep((long) delay); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + } while (error && nowtime < maxtimes); + return x; + } + + public void setPoints(final int x) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("Update Accounts set points = ? Where id = ?"); + ps.setInt(1, x); + ps.setInt(2, this.getClient().getAccID()); + ps.execute(); + ps.close(); + } catch (SQLException ex) { + System.err.println("[Points]无法连接资料库"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } catch (Exception ex2) { + System.err.println("[setPoints]" + ex2); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex2); + } + } + + public void gainVip() { + final int rmb = this.getMoneyAll(); + if (rmb >= 2000 && rmb < 4000) { + this.setVip(1); + } else if (rmb >= 4000 && rmb < 6000) { + this.setVip(2); + } else if (rmb >= 6000 && rmb < 8000) { + this.setVip(3); + } else if (rmb >= 8000 && rmb < 10000) { + this.setVip(4); + } else if (rmb >= 10000) { + this.setVip(5); + } + } + + public int getMoneyAll() { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + int money = 0; + final PreparedStatement ps = con.prepareStatement("SELECT amount FROM donate WHERE username = ?"); + ps.setString(1, this.getClient().getAccountName()); + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + money += rs.getInt("amount"); + } + rs.close(); + ps.close(); + con.close(); + return money; + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + return -1; + } + } + + public void setBuLingZanZu(final int bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("insert into donate (username, amount, paymentMethod, date) values (?,?,?,?)"); + ps.setString(1, this.getClient().getAccountName()); + ps.setString(2, String.valueOf(bossid)); + ps.setString(3, "补领赞助"); + ps.setString(4, FileoutputUtil.NowTime()); + ps.executeUpdate(); + ps.close(); + } catch (SQLException Wx) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Wx); + } + } + + public void isSquadPlayerID() { + if (this.getMapId() == 240060000 || this.getMapId() == 240060100 || this.getMapId() == 240060200) { + final EventManager em = this.getClient().getChannelServer().getEventSM().getEventManager("HorntailBattle"); + final EventInstanceManager eim = em.getInstance("HorntailBattle"); + final String propsa = eim.getProperty("isSquadPlayerID_" + this.getId()); + if (eim != null && propsa != null && propsa.equals("0")) { + eim.setProperty("isSquadPlayerID_" + this.getId(), "1"); + } + } + if (this.getMapId() == 280030000) { + final EventManager em = this.getClient().getChannelServer().getEventSM().getEventManager("ZakumBattle"); + final EventInstanceManager eim = em.getInstance("ZakumBattle"); + final String propsa = eim.getProperty("isSquadPlayerID_" + this.getId()); + if (eim != null && propsa != null && propsa.equals("0")) { + eim.setProperty("isSquadPlayerID_" + this.getId(), "1"); + } + } + if (this.getMapId() == 802000823) { + final EventManager em = this.getClient().getChannelServer().getEventSM().getEventManager("pangboss"); + final EventInstanceManager eim = em.getInstance("pangboss"); + final String propsa = eim.getProperty("isSquadPlayerID_" + this.getId()); + if (eim != null && propsa != null && propsa.equals("0")) { + eim.setProperty("isSquadPlayerID_" + this.getId(), "1"); + } + } + if (this.getMapId() == 270050100) { + final EventManager em = this.getClient().getChannelServer().getEventSM().getEventManager("PinkBeanBattle"); + final EventInstanceManager eim = em.getInstance("PinkBeanBattle"); + final String propsa = eim.getProperty("isSquadPlayerID_" + this.getId()); + if (eim != null && propsa != null && propsa.equals("0")) { + eim.setProperty("isSquadPlayerID_" + this.getId(), "1"); + } + } + if (this.getMapId() == 551030200) { + final EventManager em = this.getClient().getChannelServer().getEventSM().getEventManager("ScarTarBattle"); + final EventInstanceManager eim = em.getInstance("ScarTarBattle"); + final String propsa = eim.getProperty("isSquadPlayerID_" + this.getId()); + if (eim != null && propsa != null && propsa.equals("0")) { + eim.setProperty("isSquadPlayerID_" + this.getId(), "1"); + } + } + } + + public void setCsMod(final int mod) { + this.CsMod = mod; + } + + public int getCsMod() { + return this.CsMod; + } + + public void setFxName(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("insert into fxlog (bossid, characterid) values (?,?)"); + ps.setString(1, bossid); + ps.setInt(2, this.id); + ps.executeUpdate(); + ps.close(); + } catch (Exception Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + } + } + + public int getFxName(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select count(*) from fxlog where bossid = ?"); + ps.setString(1, bossid); + int ret_count; + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + ret_count = rs.getInt(1); + } else { + ret_count = -1; + } + rs.close(); + } + ps.close(); + con.close(); + return ret_count; + } catch (SQLException Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + return -1; + } + } + + public int[] getSavedFaces() { + return this.savedFaces; + } + + public void setSavedFace(final int sel, final int id) { + this.savedFaces[sel] = id; + } + + public int getSavedFace(final int sel) { + if (sel < this.savedFaces.length) { + return this.savedFaces[sel]; + } + return -1; + } + + public int[] getSavedHairs() { + return this.savedHairs; + } + + public void setSavedHair(final int sel, final int id) { + this.savedHairs[sel] = id; + } + + public int getSavedHair(final int sel) { + if (sel < this.savedHairs.length) { + return this.savedHairs[sel]; + } + return -1; + } + + public final void maxSkillsByJob() { + for (final ISkill skil : SkillFactory.getAllSkills()) { + if (skil.canBeLearnedBy((int) this.job) && skil.getId() >= 1000000) { + this.changeSkillLevel(skil, skil.getMaxLevel(), skil.getMaxLevel()); + } + } + } + + public final void LearnSkillsByJob(final MapleCharacter c) { + for (final ISkill skil : SkillFactory.getAllSkills()) { + if (skil.canBeLearnedBy((int) this.job) && Math.floor((double) (skil.getId() / 10000)) == (double) c.getJob()) { + this.changeSkillLevel(skil, (byte) 0, (byte) 10); + } + } + } + + public int setHuanPaoTask(final int item) { + final Map itemMap = this.selectPaoHuanItem(); + if (itemMap == null) { + this.insertPaoHuanItem(item, 0); + return item; + } + return ((Integer) itemMap.get("itemId")).intValue(); + } + + public void insertPaoHuanItem(final int itemId, final int times) { + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + try (final PreparedStatement ps = con.prepareStatement("INSERT INTO `pao_huan` ( `characters_id`, `item_id`, `date`, `times`, `gmt_create`) VALUES ( ?, ?, ?, ?, now())")) { + ps.setInt(1, this.id); + ps.setInt(2, itemId); + ps.setString(3, FileoutputUtil.CurrentReadable_Date()); + ps.setInt(4, times); + ps.execute(); + } + } catch (SQLException Ex) { + throw new RuntimeException(); + } + } + + public Map selectPaoHuanItem() { + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + try (final PreparedStatement ps = con.prepareStatement("SELECT * from pao_huan where characters_id=? and date=?")) { + ps.setInt(1, this.id); + ps.setString(2, FileoutputUtil.CurrentReadable_Date()); + final ResultSet resultSet = ps.executeQuery(); + if (resultSet.next()) { + final int itemId = resultSet.getInt("item_id"); + final int times = resultSet.getInt("times"); + final Map result = (Map) new HashMap(); + result.put("itemId", Integer.valueOf(itemId)); + result.put("times", Integer.valueOf(times)); + resultSet.close(); + return result; + } + ps.close(); + } + con.close(); + } catch (SQLException Ex) { + throw new RuntimeException(); + } + return null; + } + + public void deletePaoHuanItem() { + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + try (final PreparedStatement ps = con.prepareStatement("delete from pao_huan where characters_id=?")) { + ps.setInt(1, this.id); + ps.execute(); + } + } catch (SQLException Ex) { + throw new RuntimeException(); + } + } + + public int setHuanPaoTask2(final int item) { + final Map itemMap = this.selectPaoHuanItem2(); + if (itemMap == null) { + this.insertPaoHuanItem2(item, 0); + return item; + } + return ((Integer) itemMap.get("itemId")).intValue(); + } + + public void insertPaoHuanItem2(final int itemId, final int times) { + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + try (final PreparedStatement ps = con.prepareStatement("INSERT INTO `pao_huan2` ( `characters_id`, `item_id`, `date`, `times`, `gmt_create`) VALUES ( ?, ?, ?, ?, now())")) { + ps.setInt(1, this.id); + ps.setInt(2, itemId); + ps.setString(3, FileoutputUtil.CurrentReadable_Date()); + ps.setInt(4, times); + ps.execute(); + } + } catch (SQLException Ex) { + throw new RuntimeException(); + } + } + + public Map selectPaoHuanItem2() { + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + try (final PreparedStatement ps = con.prepareStatement("SELECT * from pao_huan2 where characters_id=? and date=?")) { + ps.setInt(1, this.id); + ps.setString(2, FileoutputUtil.CurrentReadable_Date()); + final ResultSet resultSet = ps.executeQuery(); + if (resultSet.next()) { + final int itemId = resultSet.getInt("item_id"); + final int times = resultSet.getInt("times"); + final Map result = (Map) new HashMap(); + result.put("itemId", Integer.valueOf(itemId)); + result.put("times", Integer.valueOf(times)); + resultSet.close(); + return result; + } + ps.close(); + } + con.close(); + } catch (SQLException Ex) { + throw new RuntimeException(); + } + return null; + } + + public void deletePaoHuanItem2() { + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + try (final PreparedStatement ps = con.prepareStatement("delete from pao_huan2 where characters_id=?")) { + ps.setInt(1, this.id); + ps.execute(); + } + } catch (SQLException Ex) { + throw new RuntimeException(); + } + } + + public byte getProfessionLevel(final int id) { + final int ret = this.getSkillLevel(id); + if (ret <= 0) { + return 0; + } + return (byte) (ret >>> 24 & 0xFF); + } + + public short getProfessionExp(final int id) { + final int ret = this.getSkillLevel(id); + if (ret <= 0) { + return 0; + } + return (short) (ret & 0xFFFF); + } + + public int getQianDao(final String bossid) { + return this.getQianDao(this.id, bossid); + } + + public int getQianDao(final int id, final String log1) { + int jf = 0; + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("select * from qiandao where id =? and log = ?"); + ps.setInt(1, id); + ps.setString(2, log1); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + jf = rs.getInt("sz1"); + } else { + final PreparedStatement psu = con.prepareStatement("insert into qiandao (id,log, sz1) VALUES (?,?, ?)"); + psu.setInt(1, id); + psu.setString(2, log1); + psu.setInt(3, 0); + psu.executeUpdate(); + psu.close(); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("onetimelog读取发生错误: " + ex); + } + return jf; + } + + public void setQianDao(final int id, final String bossid) { + this.setQianDao(id, bossid, 1); + } + + public void setQianDao(final int id, final String log1, final int slot) { + final int jf = this.getQianDao(log1); + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE qiandao SET sz1 = ? where id = ? AND log = ?"); + ps.setInt(1, jf + slot); + ps.setInt(2, id); + ps.setString(3, log1); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("qiaodao加减发生错误: " + ex); + } + } + + public void setQLQianDao(final int id, final String bossid) { + try { + final Connection con1 = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = DBConPool.getInstance().getDataSource().getConnection().getConnection().prepareStatement("delete from qiandao where characterid = ? and log = ?"); + ps.setInt(1, id); + ps.setString(2, bossid); + ps.executeUpdate(); + ps.close(); + con1.close(); + } catch (SQLException ex) { + } + } + + public int getGamePoints() { + try { + int gamePoints = 0; + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT * FROM accounts_info WHERE accId = ? AND worldId = ?"); + ps.setInt(1, this.getClient().getAccID()); + ps.setInt(2, (int) this.getWorld()); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + gamePoints = rs.getInt("gamePoints"); + final Timestamp updateTime = rs.getTimestamp("updateTime"); + final Calendar sqlcal = Calendar.getInstance(); + if (updateTime != null) { + sqlcal.setTimeInMillis(updateTime.getTime()); + } + if (sqlcal.get(5) + 1 <= Calendar.getInstance().get(5) || sqlcal.get(2) + 1 <= Calendar.getInstance().get(2) || sqlcal.get(1) + 1 <= Calendar.getInstance().get(1)) { + gamePoints = 0; + final PreparedStatement psu = con.prepareStatement("UPDATE accounts_info SET gamePoints = 0, updateTime = CURRENT_TIMESTAMP() WHERE accId = ? AND worldId = ?"); + psu.setInt(1, this.getClient().getAccID()); + psu.setInt(2, (int) this.getWorld()); + psu.executeUpdate(); + psu.close(); + } + } else { + final PreparedStatement psu2 = con.prepareStatement("INSERT INTO accounts_info (accId, worldId, gamePoints) VALUES (?, ?, ?)"); + psu2.setInt(1, this.getClient().getAccID()); + psu2.setInt(2, (int) this.getWorld()); + psu2.setInt(3, 0); + psu2.executeUpdate(); + psu2.close(); + } + rs.close(); + ps.close(); + con.close(); + return gamePoints; + } catch (SQLException Ex) { + System.err.println("获取角色帐号的在线时间点出现错误 - 数据库查询失败1" + Ex); + return -1; + } + } + + public int getGamePointsPD() { + try { + int gamePointsPD = 0; + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT * FROM accounts_info WHERE accId = ? AND worldId = ?"); + ps.setInt(1, this.getClient().getAccID()); + ps.setInt(2, (int) this.getWorld()); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + gamePointsPD = rs.getInt("gamePointspd"); + final Timestamp updateTime = rs.getTimestamp("updateTime"); + final Calendar sqlcal = Calendar.getInstance(); + if (updateTime != null) { + sqlcal.setTimeInMillis(updateTime.getTime()); + } + if (sqlcal.get(5) + 1 <= Calendar.getInstance().get(5) || sqlcal.get(2) + 1 <= Calendar.getInstance().get(2) || sqlcal.get(1) + 1 <= Calendar.getInstance().get(1)) { + gamePointsPD = 0; + final PreparedStatement psu = con.prepareStatement("UPDATE accounts_info SET gamePointspd = 0, updateTime = CURRENT_TIMESTAMP() WHERE accId = ? AND worldId = ?"); + psu.setInt(1, this.getClient().getAccID()); + psu.setInt(2, (int) this.getWorld()); + psu.executeUpdate(); + psu.close(); + } + } else { + final PreparedStatement psu2 = con.prepareStatement("INSERT INTO accounts_info (accId, worldId, gamePointspd) VALUES (?, ?, ?)"); + psu2.setInt(1, this.getClient().getAccID()); + psu2.setInt(2, (int) this.getWorld()); + psu2.setInt(3, 0); + psu2.executeUpdate(); + psu2.close(); + } + rs.close(); + ps.close(); + con.close(); + return gamePointsPD; + } catch (SQLException Ex) { + System.err.println("获取角色帐号的在线时间点出现错误 - 数据库查询失败2" + Ex); + return -1; + } + } + + public void gainGamePoints(final int amount) { + final int gamePoints = this.getGamePoints() + amount; + this.updateGamePoints(gamePoints); + } + + public void gainGamePointsPD(final int amount) { + final int gamePointsPD = this.getGamePointsPD() + amount; + this.updateGamePointsPD(gamePointsPD); + } + + public void resetGamePointsPD() { + this.updateGamePointsPD(0); + } + + public void updateGamePointsPD(final int amount) { + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE accounts_info SET gamePointspd = ?, updateTime = CURRENT_TIMESTAMP() WHERE accId = ? AND worldId = ?"); + ps.setInt(1, amount); + ps.setInt(2, this.getClient().getAccID()); + ps.setInt(3, (int) this.getWorld()); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException Ex) { + System.err.println("更新角色帐号的在线时间出现错误 - 数据库更新失败3." + Ex); + } + } + + public void resetGamePoints() { + this.updateGamePoints(0); + } + + public void updateGamePoints(final int amount) { + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE accounts_info SET gamePoints = ?, updateTime = CURRENT_TIMESTAMP() WHERE accId = ? AND worldId = ?"); + ps.setInt(1, amount); + ps.setInt(2, this.getClient().getAccID()); + ps.setInt(3, (int) this.getWorld()); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException Ex) { + System.err.println("更新角色帐号的在线时间出现错误 - 数据库更新失败4." + Ex); + } + } + + public int getGamePointsRQ() { + try { + int gamePointsRQ = 0; + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT * FROM accounts_info WHERE accId = ? AND worldId = ?"); + ps.setInt(1, this.getClient().getAccID()); + ps.setInt(2, (int) this.getWorld()); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + gamePointsRQ = rs.getInt("gamePointsrq"); + final Timestamp updateTime = rs.getTimestamp("updateTime"); + final Calendar sqlcal = Calendar.getInstance(); + if (updateTime != null) { + sqlcal.setTimeInMillis(updateTime.getTime()); + } + if (sqlcal.get(5) + 1 <= Calendar.getInstance().get(5) || sqlcal.get(2) + 1 <= Calendar.getInstance().get(2) || sqlcal.get(1) + 1 <= Calendar.getInstance().get(1)) { + gamePointsRQ = 0; + final PreparedStatement psu = con.prepareStatement("UPDATE accounts_info SET gamePointsrq = 0, updateTime = CURRENT_TIMESTAMP() WHERE accId = ? AND worldId = ?"); + psu.setInt(1, this.getClient().getAccID()); + psu.setInt(2, (int) this.getWorld()); + psu.executeUpdate(); + psu.close(); + } + } else { + final PreparedStatement psu2 = con.prepareStatement("INSERT INTO accounts_info (accId, worldId, gamePointsrq) VALUES (?, ?, ?)"); + psu2.setInt(1, this.getClient().getAccID()); + psu2.setInt(2, (int) this.getWorld()); + psu2.setInt(3, 0); + psu2.executeUpdate(); + psu2.close(); + } + rs.close(); + ps.close(); + con.close(); + return gamePointsRQ; + } catch (SQLException Ex) { + System.err.println("获取角色帐号的在线时间点出现错误 - 数据库查询失败5" + Ex); + return -1; + } + } + + public void gainGamePointsRQ(final int amount) { + final int gamePointsRQ = this.getGamePointsRQ() + amount; + this.updateGamePointsRQ(gamePointsRQ); + } + + public void resetGamePointsRQ() { + this.updateGamePointsRQ(0); + } + + public void updateGamePointsRQ(final int amount) { + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE accounts_info SET gamePointsrq = ?, updateTime = CURRENT_TIMESTAMP() WHERE accId = ? AND worldId = ?"); + ps.setInt(1, amount); + ps.setInt(2, this.getClient().getAccID()); + ps.setInt(3, (int) this.getWorld()); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException Ex) { + System.err.println("更新角色帐号的在线时间出现错误 - 数据库更新失败6." + Ex); + } + } + + public int getGamePointsPS() { + try { + int gamePointsRQ = 0; + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT * FROM accounts_info WHERE accId = ? AND worldId = ?"); + ps.setInt(1, this.getClient().getAccID()); + ps.setInt(2, (int) this.getWorld()); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + gamePointsRQ = rs.getInt("gamePointsps"); + final Timestamp updateTime = rs.getTimestamp("updateTime"); + final Calendar sqlcal = Calendar.getInstance(); + if (updateTime != null) { + sqlcal.setTimeInMillis(updateTime.getTime()); + } + if (sqlcal.get(5) + 1 <= Calendar.getInstance().get(5) || sqlcal.get(2) + 1 <= Calendar.getInstance().get(2) || sqlcal.get(1) + 1 <= Calendar.getInstance().get(1)) { + gamePointsRQ = 0; + final PreparedStatement psu = con.prepareStatement("UPDATE accounts_info SET gamePointsps = 0, updateTime = CURRENT_TIMESTAMP() WHERE accId = ? AND worldId = ?"); + psu.setInt(1, this.getClient().getAccID()); + psu.setInt(2, (int) this.getWorld()); + psu.executeUpdate(); + psu.close(); + } + } else { + final PreparedStatement psu2 = con.prepareStatement("INSERT INTO accounts_info (accId, worldId, gamePointsps) VALUES (?, ?, ?)"); + psu2.setInt(1, this.getClient().getAccID()); + psu2.setInt(2, (int) this.getWorld()); + psu2.setInt(3, 0); + psu2.executeUpdate(); + psu2.close(); + } + rs.close(); + ps.close(); + con.close(); + return gamePointsRQ; + } catch (SQLException Ex) { + System.err.println("获取角色帐号的在线时间点出现错误 - 数据库查询失败7" + Ex); + return -1; + } + } + + public void gainGamePointsPS(final int amount) { + final int gamePointsPS = this.getGamePointsPS() + amount; + this.updateGamePointsPS(gamePointsPS); + } + + public void resetGamePointsPS() { + this.updateGamePointsPS(0); + } + + public void updateGamePointsPS(final int amount) { + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE accounts_info SET gamePointsps = ?, updateTime = CURRENT_TIMESTAMP() WHERE accId = ? AND worldId = ?"); + ps.setInt(1, amount); + ps.setInt(2, this.getClient().getAccID()); + ps.setInt(3, (int) this.getWorld()); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException Ex) { + System.err.println("更新角色帐号的在线时间出现错误 - 数据库更新失败8." + Ex); + } + } + + public int getSkillzq() { + return this.skillzq; + } + + public void gainSkillzq(final int gain) { + this.skillzq += gain; + } + + public void setSkillzq(final int id) { + this.skillzq = id; + } + + public static int getQuestKillCount(final MapleCharacter chr, final int mobid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement pse; + try (final PreparedStatement ps = con.prepareStatement("SELECT queststatusid FROM queststatus WHERE characterid = ?")) { + ResultSet rse; + try (final ResultSet rs = ps.executeQuery()) { + pse = con.prepareStatement("SELECT count FROM queststatusmobs WHERE queststatusid = ?"); + rse = pse.executeQuery(); + if (rs.next()) { + return rse.getInt("count"); + } + rs.close(); + } + rse.close(); + } + pse.close(); + con.close(); + } catch (SQLException e) { + System.err.println("getQuestKillCount" + e); + FileoutputUtil.outputFileError("logs/数据库异常.txt", (Throwable) e); + } + return -1; + } + + public static void deleteWhereCharacterId_NoLock(final Connection con, final String sql, final int id) throws SQLException { + try (final PreparedStatement ps = con.prepareStatement(sql)) { + ps.setInt(1, id); + ps.execute(); + } + } + + public boolean isBuffFrom(final MapleBuffStat stat, final Skill skill) { + final MapleBuffStatValueHolder mbsvh = (MapleBuffStatValueHolder) this.effects.get(stat); + return mbsvh != null && mbsvh.effect != null && mbsvh.effect.isSkill() && mbsvh.effect.getSourceId() == skill.getId(); + } + + public int getTrueBuffSource(final MapleBuffStat stat) { + final MapleBuffStatValueHolder mbsvh = (MapleBuffStatValueHolder) this.effects.get(stat); + return (mbsvh == null) ? -1 : (mbsvh.effect.isSkill() ? mbsvh.effect.getSourceId() : (-mbsvh.effect.getSourceId())); + } + + public int getItemQuantity(final int itemid) { + final MapleInventoryType type = GameConstants.getInventoryType(itemid); + return this.getInventory(type).countById(itemid); + } + + public void cancelEffectFromBuffStat(final MapleBuffStat stat, final int from) { + if (this.effects.get(stat) != null && ((MapleBuffStatValueHolder) this.effects.get(stat)).cid == from) { + this.cancelEffect(((MapleBuffStatValueHolder) this.effects.get(stat)).effect, false, -1L); + } + } + + public void dispelSummons() { + final LinkedList allBuffs = new LinkedList(this.effects.values()); + for (final MapleBuffStatValueHolder mbsvh : allBuffs) { + if (mbsvh.effect.getSummonMovementType() != null) { + this.cancelEffect(mbsvh.effect, false, mbsvh.startTime); + } + } + } + + public String getJobName(final short id) { + return MapleJob.getName(MapleJob.getById((int) id)); + } + + public void gainFame(final int famechange, final boolean show) { + this.fame += (short) famechange; + this.updateSingleStat(MapleStat.FAME, (int) this.fame); + if (show && famechange != 0) { + this.client.sendPacket(MaplePacketCreator.getShowFameGain(famechange)); + } + } + + public void handleDemonJob(final int selection) { + if (selection == 0) { + this.changeJob(3101); + } else if (selection == 1) { + this.changeJob(3100); + } + } + + public void resetSP(final int sp) { + for (int i = 0; i < this.remainingSp.length; ++i) { + this.remainingSp[i] = sp; + } + this.client.getSession().write(MaplePacketCreator.updateSp(this, false)); + } + + public void setGmLevel(final byte level) { + this.gmLevel = level; + } + + public void dispose(final byte level) { + this.gmLevel = level; + } + + public void setGM(final byte level) { + this.gmLevel = level; + } + + public short getSpace(final int type) { + return this.getInventory(MapleInventoryType.getByType((byte) type)).getNumFreeSlot(); + } + + public int getCooldownSize() { + return this.coolDowns.size(); + } + + public void 击杀野外BOSS特效2() { + this.map.broadcastMessage(MaplePacketCreator.environmentChange("dojang/end/clear", 3)); + } + + public void 击杀野外BOSS特效() { + } + + public void giveDebuff(final MapleDisease disease, final MobSkill skill) { + this.giveDebuff(disease, skill.getX(), skill.getDuration(), skill.getSkillId(), skill.getSkillLevel()); + } + + public void giveDebuff(final MapleDisease disease, final int x, final long duration, final int skillid, final int level) { + final List> debuff = Collections.singletonList(new Pair(disease, Integer.valueOf(x))); + if (!this.hasDisease(disease) && this.diseases.size() < 2) { + if (disease != MapleDisease.SEDUCE && disease != MapleDisease.STUN && this.isActiveBuffedValue(2321005)) { + return; + } + this.client.sendPacket(MaplePacketCreator.giveDebuff(debuff, skillid, level, (int) duration)); + this.map.broadcastMessage(this, MaplePacketCreator.giveForeignDebuff(this.id, debuff, skillid, level), false); + this.diseases.put(disease, new MapleDiseaseValueHolder(disease, System.currentTimeMillis(), duration / 100L * 65L)); + } else { + this.diseases.put(disease, new MapleDiseaseValueHolder(disease, System.currentTimeMillis(), duration)); + } + } + + public void setBossLogs(final String bossid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("insert into bosslogps (characterid, bossid) values (?,?)"); + ps.setInt(1, this.getClient().getAccID()); + ps.setString(2, bossid); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (Exception Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + } + } + + public void deleteBossLogps(final String bossid) { + try { + final Connection con1 = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con1.prepareStatement("delete from bosslogps where characterid = ? and bossid = ?"); + ps.setInt(1, this.getClient().getAccID()); + ps.setString(2, bossid); + ps.executeUpdate(); + ps.close(); + con1.close(); + } catch (SQLException ex) { + } + } + + public void deleteBossLog(final String bossid) { + try { + final Connection con1 = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con1.prepareStatement("delete from bosslog where characterid = ? and bossid = ?"); + ps.setInt(1, this.id); + ps.setString(2, bossid); + ps.executeUpdate(); + ps.close(); + con1.close(); + } catch (SQLException ex) { + } + } + + public int getBossLogS(final String bossid) { + try { + final Connection con1 = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + int ret_count = 0; + final PreparedStatement ps = con1.prepareStatement("select count(*) from bosslogps where characterid = ? and bossid = ?"); + ps.setInt(1, this.getClient().getAccID()); + ps.setString(2, bossid); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + ret_count = rs.getInt(1); + } else { + ret_count = -1; + } + rs.close(); + ps.close(); + con1.close(); + return ret_count; + } catch (Exception Wx) { + return -1; + } + } + + public void setLxExp(final int a) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("Update characters set exp = ? Where id = ?"); + ps.setInt(1, a); + ps.setInt(2, this.id); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (Exception Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + } + } + + public void setLxMeso(final int a) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("Update characters set meso = ? Where id = ?"); + ps.setInt(1, a); + ps.setInt(2, this.id); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (Exception Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + } + } + + public void setMPoints(final int a) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("Update Accounts set mPoints = ? Where id = ?"); + ps.setInt(1, a); + ps.setInt(2, this.getClient().getAccID()); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (Exception Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + } + } + + public void setMQoints(final int a) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("Update Accounts set Acash = ? Where id = ?"); + ps.setInt(1, a); + ps.setInt(2, this.getClient().getAccID()); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (Exception Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + } + } + + public void updateOfflineTime1() { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("Update lefttime set lefttime = ? Where accid = ?"); + ps.setLong(1, System.currentTimeMillis()); + ps.setInt(2, this.getClient().getAccID()); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (Exception Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + } + } + + public void updateOfflineTime() { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("Update lefttime set lefttime = ? Where accid = ?"); + ps.setLong(1, System.currentTimeMillis()); + ps.setInt(2, this.getClient().getAccID()); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (Exception Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + } + } + + public long getLastOfflineTime() { + long 离线时间 = 0L; + try { + final Connection con1 = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con1.prepareStatement("select lefttime from lefttime WHERE accid = ?"); + ps.setInt(1, this.getClient().getAccID()); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + 离线时间 = rs.getLong("lefttime"); + } else { + 离线时间 = System.currentTimeMillis(); + final PreparedStatement psu = con1.prepareStatement("insert into lefttime (accid, lefttime) values (?,?)"); + psu.setInt(1, this.getClient().getAccID()); + psu.setLong(2, System.currentTimeMillis()); + psu.executeUpdate(); + psu.close(); + } + rs.close(); + ps.close(); + con1.close(); + return 离线时间; + } catch (Exception Ex) { + return -1L; + } + } + + public void setNewWorldLevel() { + Start.世界等级 = getFZ9("世界等级"); + } + + public int getBossLog(final String log1, final int a) { + if (a < 1) { + return this.getBossLog(log1); + } + return this.getOneTimeLog(log1); + } + + public void setBossLog(final String log1, final int a, final int b) { + if (a < 1) { + this.setBossLog(log1, b); + } else { + this.setOneTimeLog(log1, b); + } + } + + public int getBossLog(final String log1) { + int jf = 0; + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("select * from bosslog where id =? and log = ?"); + ps.setInt(1, this.id); + ps.setString(2, log1); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + jf = rs.getInt("sz1"); + } else { + final PreparedStatement psu = con.prepareStatement("insert into bosslog (id,log, sz1) VALUES (?,?, ?)"); + psu.setInt(1, this.id); + psu.setString(2, log1); + psu.setInt(3, 0); + psu.executeUpdate(); + psu.close(); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("bosslog读取发生错误: " + ex); + } + return jf; + } + + public void setBossLog(final String log1) { + this.setBossLog(log1, 1); + } + + public void set套装伤害加成(final double set) { + this.套装伤害加成 = set; + } + + public double get套装伤害加成() { + return this.套装伤害加成; + } + + public void setBossLog(final String log1, final int slot) { + final int jf = this.getBossLog(log1); + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE bosslog SET sz1 = ? where id = ? AND log = ?"); + ps.setInt(1, jf + slot); + ps.setInt(2, this.id); + ps.setString(3, log1); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("bosslog加减发生错误: " + ex); + } + } + + public int getOneTimeLog(final String log1) { + int jf = 0; + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("select * from onetimelog where id =? and log = ?"); + ps.setInt(1, this.id); + ps.setString(2, log1); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + jf = rs.getInt("sz1"); + } else { + final PreparedStatement psu = con.prepareStatement("insert into onetimelog (id,log, sz1) VALUES (?,?, ?)"); + psu.setInt(1, this.id); + psu.setString(2, log1); + psu.setInt(3, 0); + psu.executeUpdate(); + psu.close(); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("onetimelog读取发生错误: " + ex); + } + return jf; + } + + public void setOneTimeLog(final String log1) { + this.setOneTimeLog(log1, 1); + } + + public void setOneTimeLog(final String log1, final int slot) { + final int jf = this.getOneTimeLog(log1); + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE onetimelog SET sz1 = ? where id = ? AND log = ?"); + ps.setInt(1, jf + slot); + ps.setInt(2, this.id); + ps.setString(3, log1); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("onetimelog加减发生错误: " + ex); + } + } + + public void deleteOneTimeLog(final String log1) { + this.deleteOneTimeLog(log1, 1); + } + + public void deleteOneTimeLog(final String log1, final int slot) { + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE onetimelog SET sz1 = ? where id = ? AND log = ?"); + ps.setInt(1, 0); + ps.setInt(2, this.id); + ps.setString(3, log1); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("onetimelog加减发生错误: " + ex); + } + } + + public String getItemName(final int id) { + final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); + return ii.getName(id); + } + + public int getzb() { + return this.getLJJF(this.id); + } + + public void gainzb(final int number) { + this.setLJJF(this.id, number); + } + + public int getLJJF(final int id) { + int jf = 0; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select * from paymoney where characterid =?"); + ps.setInt(1, id); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + jf = rs.getInt("ljjf"); + } else { + final PreparedStatement psu = con.prepareStatement("insert into paymoney (characterid,syjf,ljjf,kydj) VALUES (?,?,?,?)"); + psu.setInt(1, id); + psu.setInt(2, 0); + psu.setInt(3, 0); + psu.setInt(4, 0); + psu.executeUpdate(); + psu.close(); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("累计积分读取发生错误: " + ex); + } + return jf; + } + + public int getSYJF(final int id) { + int jf = 0; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select * from paymoney where characterid =?"); + ps.setInt(1, id); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + jf = rs.getInt("syjf"); + } else { + final PreparedStatement psu = con.prepareStatement("insert into paymoney (characterid,syjf,ljjf,kydj) VALUES (?,?,?,?)"); + psu.setInt(1, id); + psu.setInt(2, 0); + psu.setInt(3, 0); + psu.setInt(4, 0); + psu.executeUpdate(); + psu.close(); + } + ps.close(); + rs.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("剩余积分读取发生错误: " + ex); + } + return jf; + } + + public int getKYDJ(final int id) { + int jf = 0; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select * from paymoney where characterid =?"); + ps.setInt(1, id); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + jf = rs.getInt("kydj"); + } else { + final PreparedStatement psu = con.prepareStatement("insert into paymoney (characterid,syjf,ljjf,kydj) VALUES (?,?,?,?)"); + psu.setInt(1, id); + psu.setInt(2, 0); + psu.setInt(3, 0); + psu.setInt(4, 0); + psu.executeUpdate(); + psu.close(); + } + ps.close(); + rs.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("可用点券读取发生错误: " + ex); + } + return jf; + } + + public int getMRJF(final int id) { + int jf = 0; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select * from paymoney1 where characterid =?"); + ps.setInt(1, id); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + jf = rs.getInt("mrjf"); + } else { + final PreparedStatement psu = con.prepareStatement("insert into paymoney1 (characterid,mrjf) VALUES (?,?)"); + psu.setInt(1, id); + psu.setInt(2, 0); + psu.executeUpdate(); + psu.close(); + } + ps.close(); + rs.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("每日积分读取发生错误: " + ex); + } + return jf; + } + + public void setLJJF(final int id, final int slot) { + final int jf = this.getLJJF(id); + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE paymoney SET ljjf = ? where characterid = ?"); + ps.setInt(1, jf + slot); + ps.setInt(2, id); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("累计充值加减发生错误: " + ex); + } + } + + public void setSYJF(final int id, final int slot) { + final int jf = this.getSYJF(id); + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE paymoney SET syjf = ? where characterid = ?"); + ps.setInt(1, jf + slot); + ps.setInt(2, id); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("剩余充值加减发生错误: " + ex); + } + } + + public void setKYDJ(final int id, final int slot) { + final int jf = this.getKYDJ(id); + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE paymoney SET kydj = ? where characterid = ?"); + ps.setInt(1, jf + slot); + ps.setInt(2, id); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("可用点券加减发生错误: " + ex); + } + } + + public void setMRJF(final int id, final int slot) { + final int jf = this.getMRJF(id); + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE paymoney1 SET mrjf = ? where characterid = ?"); + ps.setInt(1, jf + slot); + ps.setInt(2, id); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("每日充值加减发生错误: " + ex); + } + } + + public int getMountId() { + for (int i = 0; i < Start.坐骑列表.size(); ++i) { + if (this.id == ((Integer) (Start.坐骑列表.get(i)).getLeft()).intValue()) { + return ((Integer) (Start.坐骑列表.get(i)).getRight()).intValue(); + } + } + this.初始化坐骑(); + return 0; + } + + public void setMountId(final int cid) { + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + PreparedStatement ps = null; + ps = con.prepareStatement("UPDATE riddingmob SET numb = ? WHERE characterid = ?"); + ps.setInt(1, cid); + ps.setInt(2, this.id); + ps.execute(); + ps.close(); + } catch (SQLException ex) { + System.err.println("更新坐骑发生错误: " + ex); + } + Start.坐骑列表.clear(); + Start.GetRidMobTable(); + } + + public void 初始化坐骑() { + Start.坐骑列表.clear(); + final int jf = 0; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("insert into riddingmob (characterid,numb) VALUES (?,?)"); + ps.setInt(1, this.id); + ps.setInt(2, 1902000); + ps.executeUpdate(); + ps.close(); + } catch (SQLException ex) { + System.err.println("初始化坐骑发生错误: " + ex); + } + Start.GetRidMobTable(); + } + + public final int getNX() { + return this.getCSPoints(1); + } + + public void setQuestAdd(final int quest) { + this.setQuestAddZ(MapleQuest.getInstance(quest), (byte) 2, null); + } + + public final void setQuestAddZ(final MapleQuest quest, final byte status, final String customData) { + final MapleQuestStatus stat = new MapleQuestStatus(quest, (int) status); + stat.setCustomData(customData); + this.quests.put(quest, stat); + } + + public long getLimitBreak() { + return this.limitBreak; + } + + public void setLimitBreak(final long limitBreak) { + this.limitBreak = limitBreak; + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE characters SET limitBreak = ? WHERE id = ?"); + ps.setLong(1, limitBreak); + ps.setInt(2, this.getId()); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException Ex) { + System.err.println("更新角色破功值错误-ps。" + Ex); + } + } + + public int getReinNumber() { + return this.reinNumber; + } + + public void setReinNumber(final int reinNumber) { + this.reinNumber = reinNumber; + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE characters SET reinNumber = ? WHERE id = ?"); + ps.setLong(1, (long) reinNumber); + ps.setInt(2, this.getId()); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException Ex) { + System.err.println("更新角色破功值错误-ps。" + Ex); + } + } + + public int getjyhbh() { + return this.jyhbh; + } + + public final String ssjyhitem(final String beizhu) { + if (Start.canCheckjyh()) { + injyhDb(); + } + String fh = ""; + final Iterator i = Start.jyhshu.keySet().iterator(); + while (i.hasNext()) { + final int key = ((Integer) i.next()).intValue(); + if (((jyhwpss) Start.jyhshu.get(Integer.valueOf(key))).getbeizhu().indexOf(beizhu) != -1) { + fh = fh + "" + key + "#" + ((jyhwpss) Start.jyhshu.get(Integer.valueOf(key))).getbeizhu() + " (" + ((jyhwpss) Start.jyhshu.get(Integer.valueOf(key))).getsl() + ")@"; + } + } + return fh; + } + + public final String ssjyhitema(final int lei) { + if (Start.canCheckjyh()) { + injyhDb(); + } + String fh = ""; + final Iterator i = Start.jyhshu.keySet().iterator(); + while (i.hasNext()) { + final int key = ((Integer) i.next()).intValue(); + if (((jyhwpss) Start.jyhshu.get(Integer.valueOf(key))).inventorytype == lei) { + fh = fh + "" + key + "#" + ((jyhwpss) Start.jyhshu.get(Integer.valueOf(key))).getbeizhu() + " (" + ((jyhwpss) Start.jyhshu.get(Integer.valueOf(key))).getsl() + ")@"; + } + } + return fh; + } + + public final String ssjyhitemb() { + String fh = ""; + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT * FROM jyh where charactersid =" + this.id); + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + String lx = ""; + switch (rs.getInt("moneytype")) { + case 1: { + lx = " 点卷"; + break; + } + case 2: { + lx = " 抵用卷"; + break; + } + case 0: { + lx = " 金币"; + break; + } + case 3: { + lx = " 交易币"; + break; + } + } + fh = fh + "" + rs.getInt("tid") + "#" + rs.getString("beizhu") + " * " + (int) rs.getShort("quantity") + " 售价: " + rs.getInt("money") + lx + "@"; + } + rs.close(); + ps.close(); + con.close(); + return fh; + } catch (SQLException ex) { + System.out.println("读取自身交易行失败"); + return fh; + } + } + + public final String cxjyhyh() { + String fh = ""; + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + PreparedStatement ps = con.prepareStatement("SELECT * FROM jyhyh where characterid =" + this.id); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + fh = fh + "" + rs.getInt("jb") + "#" + rs.getInt("dj") + "#" + rs.getInt("jyb"); + } else if (fh == "") { + final Connection con2 = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + ps = con2.prepareStatement("insert into jyhyh (characterid,jb,dj,jyb) values (?,?,?,?)"); + ps.setInt(1, this.id); + ps.setInt(2, 0); + ps.setInt(3, 0); + ps.setInt(4, 0); + ps.executeUpdate(); + ps.close(); + con2.close(); + Start.jyhdq.put(Integer.valueOf(this.id), Boolean.valueOf(true)); + } + rs.close(); + ps.close(); + con.close(); + if (fh != "") { + Start.jyhdq.put(Integer.valueOf(this.id), Boolean.valueOf(true)); + } + return fh; + } catch (SQLException ex) { + System.out.println("读取自身交易行失败"); + return fh; + } + } + + public static void injyhDb() { + if (!Start.交易行) { + return; + } + Start.jyhItem.clear(); + Start.jyhshu.clear(); + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT * FROM jyh"); + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + final int inventorytype = rs.getInt("inventorytype"); + if (inventorytype == 1) { + Equip equip = null; + equip = new Equip(rs.getInt("itemid"), (short) 0); + equip.setQuantity((short) 1); + equip.setOwner(rs.getString("owner")); + equip.setExpiration(rs.getLong("expiredate")); + equip.setUpgradeSlots(rs.getByte("upgradeslots")); + equip.setLevel(rs.getByte("level")); + equip.setStr(rs.getShort("str")); + equip.setDex(rs.getShort("dex")); + equip.setInt(rs.getShort("int")); + equip.setLuk(rs.getShort("luk")); + equip.setHp(rs.getShort("hp")); + equip.setMp(rs.getShort("mp")); + equip.setWatk(rs.getShort("watk")); + equip.setMatk(rs.getShort("matk")); + equip.setWdef(rs.getShort("wdef")); + equip.setMdef(rs.getShort("mdef")); + equip.setAcc(rs.getShort("acc")); + equip.setAvoid(rs.getShort("avoid")); + equip.setHands(rs.getShort("hands")); + equip.setSpeed(rs.getShort("speed")); + equip.setJump(rs.getShort("jump")); + equip.setViciousHammer(rs.getByte("ViciousHammer")); + equip.setItemEXP(rs.getInt("itemEXP")); + equip.setGMLog(rs.getString("GM_Log")); + equip.setDurability(rs.getInt("durability")); + equip.setEnhance(rs.getByte("enhance")); + equip.setPotential1(rs.getShort("potential1")); + equip.setPotential2(rs.getShort("potential2")); + equip.setPotential3(rs.getShort("potential3")); + equip.setHpR(rs.getShort("hpR")); + equip.setMpR(rs.getShort("mpR")); + equip.setGiftFrom(rs.getString("sender")); + equip.setIncSkill(rs.getInt("incSkill")); + equip.setPVPDamage(rs.getShort("pvpDamage")); + equip.setCharmEXP(rs.getShort("charmEXP")); + Start.jyhItem.add(new MaplePlayerShopItem((Item) equip.copy(), (short) 1, rs.getInt("money"), rs.getInt("moneytype"), rs.getInt("tid"))); + Start.jyhshucc(rs.getInt("itemid"), 1, rs.getString("beizhu"), inventorytype); + } else { + final Item item = new Item(rs.getInt("itemid"), rs.getByte("position"), rs.getShort("quantity")); + Start.jyhItem.add(new MaplePlayerShopItem((Item) item.copy(), rs.getShort("quantity"), rs.getInt("money"), rs.getInt("moneytype"), rs.getInt("tid"))); + Start.jyhshucc(rs.getInt("itemid"), 1, rs.getString("beizhu"), inventorytype); + } + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.out.println("读取交易行失败" + ex); + } + } + + public int getwzcz(final int id) { + int jf = 0; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select * from paymoney2 where characterid =?"); + ps.setInt(1, id); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + jf = rs.getInt("jyhhb"); + } else { + final PreparedStatement psu = con.prepareStatement("insert into paymoney2 (characterid,jyhhb) VALUES (?,?)"); + psu.setInt(1, id); + psu.setInt(2, 0); + psu.executeUpdate(); + psu.close(); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("交易行货币读取发生错误: " + ex); + } + return jf; + } + + public void gainwzcz(final int id, final int slot) { + final int jf = this.getwzcz(id); + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE paymoney2 SET jyhhb = ? where characterid = ?"); + ps.setInt(1, jf + slot); + ps.setInt(2, id); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("交易行货币加减发生错误: " + ex); + } + } + + public boolean buyjyhitem(final int 编号) { + return Start.交易行 && Start.buyjyh(this, 编号); + } + + public final boolean canHoldSlots(final int slot) { + for (int i = 1; i <= 5; ++i) { + if (this.getInventory(MapleInventoryType.getByType((byte) i)).isFull(slot)) { + return false; + } + } + return true; + } + + public boolean gainjyhyh(final int lei, final int characterid, final int slot) { + if (!Start.jyhdq.containsKey(Integer.valueOf(characterid))) { + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + PreparedStatement ps = con.prepareStatement("SELECT * FROM jyhyh where characterid =" + characterid); + final ResultSet rs = ps.executeQuery(); + String fh = null; + while (rs.next()) { + fh = fh + "" + rs.getInt("jb") + "#" + rs.getInt("dj") + "#" + rs.getInt("jyb"); + } + rs.close(); + ps.close(); + con.close(); + if (fh == null) { + final Connection con2 = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + ps = con2.prepareStatement("insert into jyhyh (characterid,jb,dj,jyb) values (?,?,?,?)"); + ps.setInt(1, characterid); + ps.setInt(2, 0); + ps.setInt(3, 0); + ps.setInt(4, 0); + ps.executeUpdate(); + ps.close(); + con2.close(); + Start.jyhdq.put(Integer.valueOf(characterid), Boolean.valueOf(true)); + } + } catch (SQLException ex) { + return false; + } + } + if (slot == 0) { + return false; + } + if (lei == 0) { + try { + final int cid = characterid; + final Connection con3 = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps2 = con3.prepareStatement("UPDATE jyhyh SET jb =jb+ " + slot + " WHERE characterid = " + cid + ""); + ps2.executeUpdate(); + ps2.close(); + con3.close(); + return true; + } catch (SQLException ex) { + return false; + } + } + if (lei == 1) { + try { + final int cid = characterid; + final Connection con3 = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps2 = con3.prepareStatement("UPDATE jyhyh SET dj =dj+ " + slot + " WHERE characterid = " + cid + ""); + ps2.executeUpdate(); + ps2.close(); + con3.close(); + return true; + } catch (SQLException ex) { + return false; + } + } + if (lei == 3) { + try { + final int cid = characterid; + final Connection con3 = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps2 = con3.prepareStatement("UPDATE jyhyh SET jyb =jyb+ " + slot + " WHERE characterid = " + cid + ""); + ps2.executeUpdate(); + ps2.close(); + con3.close(); + return true; + } catch (SQLException ex) { + return false; + } + } + return false; + } + + public final void killjyhitem(final int id) { + for (final MaplePlayerShopItem itemss : Start.jyhItem) { + if (itemss.jyhid == id) { + Start.jyhItem.remove(itemss); + Start.jyhshucc(itemss.item.getItemId(), -1, ((jyhwpss) Start.jyhshu.get(Integer.valueOf(itemss.item.getItemId()))).getbeizhu(), ((jyhwpss) Start.jyhshu.get(Integer.valueOf(itemss.item.getItemId()))).getinventorytype()); + break; + } + } + } + + public int getOneTimeLogcs(final String log1) { + return this.getOneTimeLog(log1); + } + + public void gainOneTimeLogcs(final String log1, final int slot) { + this.setOneTimeLog(log1, slot); + } + + public boolean hasBlockedInventory() { + return !this.isAlive() || this.getTrade() != null || this.getConversation() > 0 || this.getPlayerShop() != null || this.map == null; + } + + public int getInviteid(final int log1) { + int jf = 0; + try { + final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("select * from invsystem where ownid =? "); + ps.setInt(1, log1); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + jf = rs.getInt("objecid"); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("invsystem读取发生错误: " + ex); + } + return jf; + } + + public boolean get吸怪状态() { + return this.吸怪状态; + } + + public void set吸怪状态(boolean xx) { + this.吸怪状态 = xx; + } + + public enum FameStatus { + OK, + NOT_TODAY, + NOT_THIS_MONTH; + } + + public int 取限制等级() { + int 限制等级 = 0; + try { + final int cid = 4001128; + final Connection con = DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement limitCheck = con.prepareStatement("SELECT * FROM shijiexianzhidengji WHERE huoyaotongid=" + cid + ""); + final ResultSet rs = limitCheck.executeQuery(); + if (rs.next()) { + 限制等级 = rs.getInt("xianzhidengji"); + } + limitCheck.close(); + rs.close(); + con.close(); + } catch (SQLException ex) { + } + return 限制等级; + } + + public int getDD() { + int Magnification = 0; + JSONObject dd = Start.ConfigValuesJson.getJSONObject("ddbb"); + JSONObject ddzb = Start.ConfigValuesJson.getJSONObject("ddzb"); + + if ((dd == null && ddzb == null) || Start.ConfigValuesJson.getInteger("isdd") == 0) return 0; + + + if (dd != null) { + Set strings = dd.keySet(); + for (String string : strings) { + boolean b = this.haveItem(Integer.parseInt(string)); + if (b) { + Magnification += dd.getInteger(string); + } + } + } + if (ddzb != null) { + Set strings = ddzb.keySet(); + for (String string : strings) { + boolean b = this.hasEquipped(Integer.parseInt(string)); + if (b) { + Magnification += ddzb.getInteger(string); + + } + } + } + List equList = this.getEquList(); + for (Equip equip : equList) { + Magnification += equip.getdd(); + } + return Magnification; + } + + public int getDB() { + int re = 0; + JSONObject dd = Start.ConfigValuesJson.getJSONObject("dbbb"); + JSONObject ddzb = Start.ConfigValuesJson.getJSONObject("dbzb"); + + if ((dd == null && ddzb == null) || Start.ConfigValuesJson.getInteger("isdb") == 0) return 0; + + + if (dd != null) { + Set strings = dd.keySet(); + for (String string : strings) { + boolean b = this.haveItem(Integer.parseInt(string)); + if (b) { + re += dd.getInteger(string); + } + } + } + if (ddzb != null) { + Set strings = ddzb.keySet(); + for (String string : strings) { + boolean b = this.hasEquipped(Integer.parseInt(string)); + if (b) { + re += ddzb.getInteger(string); + } + } + } + + List equList = this.getEquList(); + for (Equip equip : equList) { + re += equip.getdb(); + } + + return re; + } + + + public int getQG() { + int re = 0; + JSONObject qgbb = Start.ConfigValuesJson.getJSONObject("qgbb"); + JSONObject qgzb = Start.ConfigValuesJson.getJSONObject("qgzb"); + + if ((qgbb == null && qgzb == null) || Start.ConfigValuesJson.getInteger("isqg") == 0) return 0; + if (qgbb != null) { + Set strings = qgbb.keySet(); + for (String string : strings) { + boolean b = this.haveItem(Integer.parseInt(string)); + if (b) { + re += qgbb.getInteger(string); + } + } + } + if (qgzb != null) { + Set strings = qgzb.keySet(); + for (String string : strings) { + boolean b = this.hasEquipped(Integer.parseInt(string)); + if (b) { + re += qgzb.getInteger(string); + } + } + } + + List equList = this.getEquList(); + for (Equip equip : equList) { + re += equip.getqg(); + } + + return re; + } +} diff --git a/src/client/MapleCharacterUtil.java b/src/client/MapleCharacterUtil.java new file mode 100644 index 0000000..6a5cca0 --- /dev/null +++ b/src/client/MapleCharacterUtil.java @@ -0,0 +1,328 @@ +package client; + +import tools.FilePrinter; +import tools.Pair; + +import java.sql.ResultSet; +import java.sql.PreparedStatement; +import java.sql.Connection; +import java.sql.SQLException; + +import tools.FileoutputUtil; +import database.DBConPool; +import constants.GameConstants; + +import java.util.regex.Pattern; + +public class MapleCharacterUtil { + private static final Pattern namePattern = Pattern.compile("[a-zA-Z0-9_-]{3,12}"); + private static final Pattern petPattern = Pattern.compile("[a-zA-Z0-9_-]{4,12}"); + + public static final boolean canCreateChar(final String name) { + return getIdByName(name) == -1 && isEligibleCharName(name); + } + + public static boolean canCreateChar(final String name, final boolean gm) { + return getIdByName(name) == -1 && isEligibleCharName(name, gm); + } + + public static boolean isEligibleCharName(final String name, final boolean gm) { + if (name.getBytes().length > 13) { + return false; + } + if (gm) { + return true; + } + if (name.getBytes().length < 3) { + return false; + } + for (final String z : GameConstants.RESERVED) { + if (name.contains((CharSequence) z)) { + return false; + } + } + return true; + } + + public static final boolean isEligibleCharName(final String name) { + if (name.length() > 11) { + return false; + } + if (name.length() < 2) { + return false; + } + for (final String z : GameConstants.RESERVED) { + if (name.contains((CharSequence) z)) { + return false; + } + } + return true; + } + + public static final boolean canChangePetName(final String name) { + if (MapleCharacterUtil.petPattern.matcher((CharSequence) name).matches()) { + for (final String z : GameConstants.RESERVED) { + if (name.contains((CharSequence) z)) { + return false; + } + } + return true; + } + return false; + } + + public static final String makeMapleReadable(final String in) { + String wui = in.replace('I', 'i'); + wui = wui.replace('l', 'L'); + wui = wui.replace((CharSequence) "rn", (CharSequence) "Rn"); + wui = wui.replace((CharSequence) "vv", (CharSequence) "Vv"); + wui = wui.replace((CharSequence) "VV", (CharSequence) "Vv"); + return wui; + } + + public static final int getIdByName(final String name) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT id FROM characters WHERE name = ?")) { + ps.setString(1, name); + int id; + try (final ResultSet rs = ps.executeQuery()) { + if (!rs.next()) { + rs.close(); + ps.close(); + return -1; + } + id = rs.getInt("id"); + } + con.close(); + return id; + } catch (SQLException e) { + System.err.println("error 'getIdByName' " + e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + return -1; + } + } + + public static final boolean PromptPoll(final int accountid) { + PreparedStatement ps = null; + ResultSet rs = null; + boolean prompt = false; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + ps = con.prepareStatement("SELECT * from game_poll_reply where AccountId = ?"); + ps.setInt(1, accountid); + rs = ps.executeQuery(); + prompt = !rs.next(); + rs.close(); + ps.close(); + con.close(); + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + try { + if (ps != null) { + ps.close(); + } + if (rs != null) { + rs.close(); + } + } catch (SQLException e2) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e2); + } + } finally { + try { + if (ps != null) { + ps.close(); + } + if (rs != null) { + rs.close(); + } + } catch (SQLException e2) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e2); + } + } + return prompt; + } + + public static final boolean SetPoll(final int accountid, final int selection) { + if (!PromptPoll(accountid)) { + return false; + } + PreparedStatement ps = null; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + ps = con.prepareStatement("INSERT INTO game_poll_reply (AccountId, SelectAns) VALUES (?, ?)"); + ps.setInt(1, accountid); + ps.setInt(2, selection); + ps.execute(); + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + try { + if (ps != null) { + ps.close(); + } + } catch (SQLException e2) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e2); + } + } finally { + try { + if (ps != null) { + ps.close(); + } + } catch (SQLException e2) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e2); + } + } + return true; + } + + private static boolean check_ifPasswordEquals(final String passhash, final String pwd, final String salt) { + return (LoginCryptoLegacy.isLegacyPassword(passhash) && LoginCryptoLegacy.checkPassword(pwd, passhash)) || (salt == null && LoginCrypto.checkSha1Hash(passhash, pwd)) || LoginCrypto.checkSaltedSha512Hash(passhash, pwd, salt); + } + + public static Pair> getInfoByName(final String name, final int world) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT * FROM characters WHERE name = ? AND world = ?")) { + ps.setString(1, name); + ps.setInt(2, world); + Pair> id; + try (final ResultSet rs = ps.executeQuery()) { + if (!rs.next()) { + rs.close(); + ps.close(); + return null; + } + id = new Pair(Integer.valueOf(rs.getInt("id")), new Pair(Integer.valueOf(rs.getInt("accountid")), Integer.valueOf(rs.getInt("gender")))); + } + con.close(); + return id; + } catch (Exception e) { + FilePrinter.printError("MapleCharacterUtil.txt", (Throwable) e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + return null; + } + } + + public static void setNXCodeUsed(final String name, final String code) throws SQLException { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE nxcode SET `user` = ?, `valid` = 0 WHERE code = ?")) { + ps.setString(1, name); + ps.setString(2, code); + ps.execute(); + } catch (SQLException ex) { + ex.printStackTrace(); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + + public static void sendNote(final String to, final String name, final String msg, final int fame) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("INSERT INTO notes (`to`, `from`, `message`, `timestamp`, `gift`) VALUES (?, ?, ?, ?, ?)")) { + ps.setString(1, to); + ps.setString(2, name); + ps.setString(3, msg); + ps.setLong(4, System.currentTimeMillis()); + ps.setInt(5, fame); + ps.executeUpdate(); + } catch (SQLException e) { + FilePrinter.printError("MapleCharacterUtil.txt", (Throwable) e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + } + + public static boolean getNXCodeValid(final String code, boolean validcode) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT `valid` FROM nxcode WHERE code = ?")) { + ps.setString(1, code); + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + validcode = (rs.getInt("valid") > 0); + } + rs.close(); + } + ps.close(); + con.close(); + } catch (SQLException ex) { + FilePrinter.printError("MapleCharacterUtil.txt", (Throwable) ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return validcode; + } + + public static int getNXCodeType(final String code) { + int type = -1; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT `type` FROM nxcode WHERE code = ?")) { + ps.setString(1, code); + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + type = rs.getInt("type"); + } + rs.close(); + } + ps.close(); + con.close(); + } catch (SQLException ex) { + FilePrinter.printError("MapleCharacterUtil.txt", (Throwable) ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return type; + } + + public static int getNXCodeItem(final String code) { + int item = -1; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT `item` FROM nxcode WHERE code = ?")) { + ps.setString(1, code); + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + item = rs.getInt("item"); + } + rs.close(); + } + ps.close(); + con.close(); + } catch (SQLException ex) { + FilePrinter.printError("MapleCharacterUtil.txt", (Throwable) ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return item; + } + + public static int getNXCodeSize(final String code) { + int item = -1; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT `size` FROM nxcode WHERE code = ?")) { + ps.setString(1, code); + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + item = rs.getInt("size"); + } + rs.close(); + } + ps.close(); + con.close(); + } catch (SQLException ex) { + FilePrinter.printError("MapleCharacterUtil.txt", (Throwable) ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return item; + } + + public static int getNXCodeTime(final String code) { + int item = -1; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT `time` FROM nxcode WHERE code = ?")) { + ps.setString(1, code); + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + item = rs.getInt("time"); + } + rs.close(); + } + ps.close(); + con.close(); + } catch (SQLException ex) { + FilePrinter.printError("MapleCharacterUtil.txt", (Throwable) ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return item; + } + +} diff --git a/src/client/MapleClient.java b/src/client/MapleClient.java new file mode 100644 index 0000000..f3e7cc7 --- /dev/null +++ b/src/client/MapleClient.java @@ -0,0 +1,1902 @@ +package client; + +import tools.MaplePacketCreator; + +import java.util.Collections; +import java.util.ArrayList; + +import constants.ServerConstants.PlayerGMRank; +import server.Timer.PingTimer; +import tools.packet.LoginPacket; +import handling.world.family.MapleFamilyCharacter; +import handling.world.guild.MapleGuildCharacter; +import handling.world.MapleParty; +import server.maps.MapleMap; +import handling.cashshop.CashShopServer; +import handling.world.World.Find; +import handling.world.World.Family; +import handling.world.World.Guild; +import handling.world.World.Buddy; +import handling.world.World.Party; +import handling.world.PartyOperation; +import handling.world.World.Messenger; +import handling.world.MapleMessengerCharacter; +import handling.world.MaplePartyCharacter; +import server.shops.IMaplePlayerShop; +import gui.Start; +import server.quest.MapleQuest; +import database.DatabaseException; + +import java.io.UnsupportedEncodingException; +import java.security.NoSuchAlgorithmException; +import java.util.logging.Level; +import java.util.logging.Logger; + +import tools.HexTool; + +import java.security.MessageDigest; + +import tools.FilePrinter; +import handling.channel.ChannelServer; + +import java.sql.ResultSet; +import java.sql.PreparedStatement; +import java.sql.Connection; +import java.sql.SQLException; + +import tools.FileoutputUtil; +import database.DBConPool; + +import java.util.Iterator; +import java.util.concurrent.locks.ReentrantLock; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.ScheduledFuture; +import javax.script.ScriptEngine; +import java.util.Map; +import java.util.Set; +import java.util.List; +import java.util.Calendar; + +import io.netty.channel.Channel; +import tools.MapleAESOFB; +import io.netty.util.AttributeKey; + +public class MapleClient { + public static final transient byte LOGIN_NOTLOGGEDIN = 0; + public static final transient byte LOGIN_SERVER_TRANSITION = 1; + public static final transient byte LOGIN_LOGGEDIN = 2; + public static final transient byte LOGIN_WAITING = 3; + public static final transient byte CASH_SHOP_TRANSITION = 4; + public static final transient byte LOGIN_CS_LOGGEDIN = 5; + public static final transient byte CHANGE_CHANNEL = 6; + public static final int DEFAULT_CHARSLOT = 3; + public static final AttributeKey CLIENT_KEY = AttributeKey.valueOf("Client"); + private final MapleAESOFB send; + private final MapleAESOFB receive; + private final Channel session; + private MapleCharacter player; + private MapleClient c; + private int accountId; + private String accountName; + private int world; + private int channel; + private int birthday; + private int charslots; + private boolean loggedIn; + private boolean serverTransition; + private boolean canloginpw; + private transient Calendar tempban; + private transient long lastPong; + private transient long lastPing; + private boolean monitored; + private boolean receiving; + private int gmLevel; + private short vip; + private byte bannedReason; + private byte gender; + public transient short loginAttempt; + private final transient List allowedChar; + private final transient Set macs; + private final transient Map engines; + private transient ScheduledFuture idleTask; + private transient String secondPassword; + private final transient Lock mutex; + private final transient Lock npcMutex; + private long lastNpcClick; + private long lastLoginTime; + private static final Lock loginMutex = new ReentrantLock(true); + private String loginKey; + private String serverKey; + private int loginKeya; + private boolean closeseesion; + + public MapleClient(final MapleAESOFB send, final MapleAESOFB receive, final Channel session) { + this.accountId = 1; + this.world = 1; + this.channel = 1; + this.charslots = 3; + this.loggedIn = false; + this.serverTransition = false; + this.canloginpw = false; + this.tempban = null; + this.lastPong = 0L; + this.lastPing = 0L; + this.monitored = false; + this.receiving = true; + this.bannedReason = 1; + this.gender = -1; + this.loginAttempt = 0; + this.allowedChar = (List) new LinkedList(); + this.macs = (Set) new HashSet(); + this.engines = (Map) new HashMap(); + this.idleTask = null; + this.mutex = new ReentrantLock(true); + this.npcMutex = new ReentrantLock(); + this.lastNpcClick = 0L; + this.loginKeya = 0; + this.closeseesion = false; + this.send = send; + this.receive = receive; + this.session = session; + } + + public final MapleAESOFB getReceiveCrypto() { + return this.receive; + } + + public final MapleAESOFB getSendCrypto() { + return this.send; + } + + public final Channel getSession() { + return this.session; + } + + public final Lock getLock() { + return this.mutex; + } + + public final Lock getNPCLock() { + return this.npcMutex; + } + + public MapleCharacter getPlayer() { + return this.player; + } + + public void setPlayer(final MapleCharacter player) { + this.player = player; + } + + public void createdChar(final int id) { + this.allowedChar.add(Integer.valueOf(id)); + } + + public final boolean login_Auth(final int id) { + return this.allowedChar.contains(Integer.valueOf(id)); + } + + public final List loadCharacters(final int serverId) { + final List chars = (List) new LinkedList(); + for (final CharNameAndId cni : this.loadCharactersInternal(serverId)) { + final MapleCharacter chr = MapleCharacter.loadCharFromDB(cni.id, this, false); + chars.add(chr); + this.allowedChar.add(Integer.valueOf(chr.getId())); + } + return chars; + } + + public List loadCharacterNames(final int serverId) { + final List chars = (List) new LinkedList(); + for (final CharNameAndId cni : this.loadCharactersInternal(serverId)) { + chars.add(cni.name); + } + return chars; + } + + private List loadCharactersInternal(final int serverId) { + final List chars = (List) new LinkedList(); + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT id, name FROM characters WHERE accountid = ? AND world = ?")) { + ps.setInt(1, this.accountId); + ps.setInt(2, serverId); + try (final ResultSet rs = ps.executeQuery()) { + while (rs.next()) { + chars.add(new CharNameAndId(rs.getString("name"), rs.getInt("id"))); + } + rs.close(); + } + ps.close(); + con.close(); + } catch (SQLException e) { + System.err.println("error loading characters internal" + e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + return chars; + } + + public boolean isLoggedIn() { + return this.loggedIn; + } + + private Calendar getTempBanCalendar(final ResultSet rs) throws SQLException { + final Calendar lTempban = Calendar.getInstance(); + if (rs.getLong("tempban") == 0L) { + lTempban.setTimeInMillis(0L); + return lTempban; + } + final Calendar today = Calendar.getInstance(); + lTempban.setTimeInMillis(rs.getTimestamp("tempban").getTime()); + if (today.getTimeInMillis() < lTempban.getTimeInMillis()) { + return lTempban; + } + lTempban.setTimeInMillis(0L); + return lTempban; + } + + public Calendar getTempBanCalendar() { + return this.tempban; + } + + public byte getBanReason() { + return this.bannedReason; + } + + public boolean isBannedIP(final String ip) { + boolean ret = false; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT COUNT(*) FROM ipbans WHERE ? LIKE CONCAT(ip, '%')")) { + ps.setString(1, ip); + try (final ResultSet rs = ps.executeQuery()) { + rs.next(); + if (rs.getInt(1) > 0) { + ret = true; + } + rs.close(); + } + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("Error checking ip bans" + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return ret; + } + + public boolean hasBannedIP() { + boolean ret = false; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT COUNT(*) FROM ipbans WHERE ? LIKE CONCAT(ip, '%')")) { + ps.setString(1, this.getSessionIPAddress()); + try (final ResultSet rs = ps.executeQuery()) { + rs.next(); + if (rs.getInt(1) > 0) { + ret = true; + } + rs.close(); + } + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("Error checking ip bans" + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return ret; + } + + public int finishLogin() { + MapleClient.loginMutex.lock(); + try { + final byte state = this.getLoginState(); + if (state > 0 && state != 3) { + this.loggedIn = false; + return 7; + } + this.updateLoginState(2, this.getSessionIPAddress()); + } finally { + MapleClient.loginMutex.unlock(); + } + return 0; + } + + public int login(final String account, final String password, final boolean isIPBanned) { + int loginok = 5; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + try (final PreparedStatement ps = con.prepareStatement("SELECT id, banned, password, salt, macs, 2ndpassword, gm, vip, greason, tempban, gender, SessionIP FROM accounts WHERE name = ?")) { + ps.setString(1, account); + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + final int banned = rs.getInt("banned"); + final String passhash = rs.getString("password"); + final String salt = rs.getString("salt"); + final String oldSession = rs.getString("SessionIP"); + this.accountId = rs.getInt("id"); + this.secondPassword = rs.getString("2ndpassword"); + this.gmLevel = rs.getInt("gm"); + this.vip = rs.getShort("vip"); + this.bannedReason = rs.getByte("greason"); + this.tempban = this.getTempBanCalendar(rs); + this.gender = rs.getByte("gender"); + ps.close(); + if (banned > 0 && !this.isGm()) { + loginok = 3; + } else { + if (banned == -1) { + this.unban(); + } + final byte loginstate = this.getLoginState(); + boolean updatePasswordHash = false; + if (LoginCryptoLegacy.isLegacyPassword(passhash) && LoginCryptoLegacy.checkPassword(password, passhash)) { + loginok = 0; + updatePasswordHash = true; + } else if (salt == null && LoginCrypto.checkSha1Hash(passhash, password)) { + loginok = 0; + updatePasswordHash = true; + } else if (password.equals(passhash)) { + loginok = 0; + updatePasswordHash = true; + } else if (LoginCrypto.checkSaltedSha512Hash(passhash, password, salt)) { + loginok = 0; + } else { + this.loggedIn = false; + loginok = 4; + } + if (loginok == 0) { + ChannelServer.forceRemovePlayerByAccId(this, this.accountId); + this.updateLoginState(0, this.getSessionIPAddress()); + } + } + } + rs.close(); + } + ps.close(); + } + con.close(); + } catch (SQLException e) { + System.err.println("ERROR" + e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + if (loginok == 0) { + this.canloginpw = true; + this.lastLoginTime = System.currentTimeMillis(); + } + return loginok; + } + + public void loadVip(final int accountID) { + PreparedStatement ps = null; + ResultSet rs = null; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + ps = con.prepareStatement("SELECT vip FROM accounts WHERE id = ?"); + ps.setInt(1, accountID); + rs = ps.executeQuery(); + if (rs.next()) { + this.vip = rs.getShort("vip"); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException e) { + FilePrinter.printError("MapleClient.txt", (Throwable) e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + try { + if (rs != null && !rs.isClosed()) { + rs.close(); + } + if (ps != null && !ps.isClosed()) { + ps.close(); + } + } catch (SQLException e2) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e2); + } + } finally { + try { + if (rs != null && !rs.isClosed()) { + rs.close(); + } + if (ps != null && !ps.isClosed()) { + ps.close(); + } + } catch (SQLException e2) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e2); + } + } + } + + public final void update2ndPassword() { + try { + final MessageDigest digester = MessageDigest.getInstance("SHA-1"); + digester.update(this.secondPassword.getBytes("UTF-8"), 0, this.secondPassword.length()); + final String hash = HexTool.toString(digester.digest()).replace((CharSequence) " ", (CharSequence) "").toLowerCase(); + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE `accounts` SET `2ndpassword` = ? WHERE id = ?")) { + ps.setString(1, hash); + ps.setInt(2, this.accountId); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException ex) { + FilePrinter.printError("MapleClient.txt", (Throwable) ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } catch (NoSuchAlgorithmException | UnsupportedEncodingException ex4) { + Logger.getLogger(MapleClient.class.getName()).log(Level.SEVERE, null, (Throwable) ex4); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex4); + } + } + + private void unban() { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + try (final PreparedStatement ps = con.prepareStatement("UPDATE accounts SET banned = 0 and banreason = '' WHERE id = ?")) { + ps.setInt(1, this.accountId); + ps.executeUpdate(); + ps.close(); + } + con.close(); + } catch (SQLException e) { + System.err.println("Error while unbanning" + e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + } + + public static final byte unban(final String charname) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT accountid from characters where name = ?"); + ps.setString(1, charname); + final ResultSet rs = ps.executeQuery(); + if (!rs.next()) { + rs.close(); + ps.close(); + return -1; + } + final int accid = rs.getInt(1); + rs.close(); + ps.close(); + ps = con.prepareStatement("UPDATE accounts SET banned = 0 and banreason = '' WHERE id = ?"); + ps.setInt(1, accid); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException e) { + System.err.println("Error while unbanning" + e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + return -2; + } + return 0; + } + + public void setAccID(final int id) { + this.accountId = id; + } + + public int getAccID() { + return this.accountId; + } + + public final void updateLoginState(final int newstate, final String SessionID) { + MapleClient.loginMutex.lock(); + try { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE accounts SET loggedin = ?, SessionIP = ?, lastlogin = CURRENT_TIMESTAMP() WHERE id = ?")) { + ps.setInt(1, newstate); + ps.setString(2, SessionID); + ps.setInt(3, this.getAccID()); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException e) { + System.err.println("更新登入状态错误" + e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + if (newstate == 0 || newstate == 3) { + this.loggedIn = false; + this.serverTransition = false; + } else { + this.serverTransition = (newstate == 1 || newstate == 6); + this.loggedIn = !this.serverTransition; + } + } finally { + MapleClient.loginMutex.unlock(); + } + } + + public final void updateGender() { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE `accounts` SET `gender` = ? WHERE id = ?")) { + ps.setInt(1, (int) this.gender); + ps.setInt(2, this.accountId); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException e) { + System.err.println("更新性別错误" + e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + } + + public final byte getLoginState() { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("SELECT loggedin, lastlogin, `birthday` + 0 AS `bday` FROM accounts WHERE id = ?"); + ps.setInt(1, this.getAccID()); + byte state; + try (final ResultSet rs = ps.executeQuery()) { + if (!rs.next()) { + ps.close(); + throw new DatabaseException("Everything sucks"); + } + this.birthday = rs.getInt("bday"); + state = rs.getByte("loggedin"); + if ((state == 1 || state == 6) && rs.getTimestamp("lastlogin").getTime() + 70000L < System.currentTimeMillis()) { + state = 0; + this.updateLoginState((int) state, this.getSessionIPAddress()); + } + rs.close(); + } + ps.close(); + this.loggedIn = (state == 2); + con.close(); + return state; + } catch (SQLException e) { + this.loggedIn = false; + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + throw new DatabaseException("登入状态获取失败", (Throwable) e); + } + } + + public final boolean checkBirthDate(final int date) { + return this.birthday == date; + } + + public final void removalTask(final boolean shutdown) { + try { + this.player.cancelAllBuffs_(); + this.player.cancelAllDebuffs(); + this.player.cancelAllSkillID(); + if (this.player.getMarriageId() > 0) { + final MapleQuestStatus stat1 = this.player.getQuestNAdd(MapleQuest.getInstance(160001)); + final MapleQuestStatus stat2 = this.player.getQuestNAdd(MapleQuest.getInstance(160002)); + if (stat1.getCustomData() != null && (stat1.getCustomData().equals("2_") || stat1.getCustomData().equals("2"))) { + if (stat2.getCustomData() != null) { + stat2.setCustomData("0"); + } + stat1.setCustomData("3"); + } + } + this.player.changeRemoval(true); + if (this.player.getEventInstance() != null) { + this.player.getEventInstance().playerDisconnected(this.player, this.player.getId()); + } + if (this.player.getMap() != null) { + switch (this.player.getMapId()) { + case 220080001: + case 240060000: + case 240060100: + case 240060200: + case 541010100: + case 541020800: + case 551030200: { + this.player.getMap().addDisconnected(this.player.getId()); + break; + } + } + if (((Integer) Start.ConfigValuesMap.get("离线泡点开关")).intValue() > 0 && this.player.getMapId() == ((Integer) Start.ConfigValuesMap.get("离线泡点地图")).intValue()) { + this.player.getMap().removePlayer2(this.player); + } else { + this.player.getMap().removePlayer(this.player); + } + } + final IMaplePlayerShop shop = this.player.getPlayerShop(); + if (shop != null) { + shop.removeVisitor(this.player); + if (shop.isOwner(this.player)) { + if (shop.getShopType() == 1 && shop.isAvailable() && !shutdown) { + shop.setOpen(true); + } else { + shop.closeShop(true, !shutdown); + } + } + } + this.player.setMessenger(null); + if (this.player.getAntiMacro().inProgress()) { + this.player.getAntiMacro().end(); + } + } catch (Throwable e) { + FilePrinter.printError("AccountStuck.txt", e); + } + } + + public final void disconnect(final boolean RemoveInChannelServer, final boolean fromCS) { + this.disconnect(RemoveInChannelServer, fromCS, false); + } + + public final void disconnect(final boolean RemoveInChannelServer, final boolean fromCS, final boolean shutdown) { + try { + if (this.player != null) { + final MapleMap map = this.player.getMap(); + final MapleParty party = this.player.getParty(); + final boolean clone = this.player.isClone(); + final String namez = this.player.getName(); + final boolean hidden = this.player.isHidden(); + final int gmLevel = this.player.getGMLevel(); + final int idz = this.player.getId(); + final int messengerid = (this.player.getMessenger() == null) ? 0 : this.player.getMessenger().getId(); + final int gid = this.player.getGuildId(); + final int fid = this.player.getFamilyId(); + final BuddyList bl = this.player.getBuddylist(); + final MaplePartyCharacter chrp = new MaplePartyCharacter(this.player); + final MapleMessengerCharacter chrm = new MapleMessengerCharacter(this.player); + final MapleGuildCharacter chrg = this.player.getMGC(); + final MapleFamilyCharacter chrf = this.player.getMFC(); + this.removalTask(shutdown); + try { + if (this.player != null) { + this.player.saveToDB(true, fromCS); + } + } catch (Exception ex) { + FileoutputUtil.outError("logs/下线保存数据异常.txt", (Throwable) ex); + FileoutputUtil.logToFile("logs/下线保存数据异常.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + this.getSession().remoteAddress().toString().split(":")[0] + " 账号 " + this.getAccountName() + " 账号ID " + this.getAccID() + " 角色名 " + this.player.getName() + " 角色ID " + this.player.getId()); + FileoutputUtil.outError("logs/下线保存数据异常.txt", (Throwable) ex); + } + if (shutdown) { + this.player = null; + this.receiving = false; + return; + } + if (!fromCS) { + final ChannelServer ch = ChannelServer.getInstance((map == null) ? this.channel : map.getChannel()); + try { + if (ch == null || clone || ch.isShutdown()) { + this.player = null; + return; + } + if (messengerid > 0) { + Messenger.leaveMessenger(messengerid, chrm); + } + if (party != null) { + chrp.setOnline(false); + Party.updateParty(party.getId(), PartyOperation.LOG_ONOFF, chrp); + if (map != null && party.getLeader().getId() == idz) { + MaplePartyCharacter lchr = null; + for (final MaplePartyCharacter pchr : party.getMembers()) { + if (pchr != null && map.getCharacterById(pchr.getId()) != null && (lchr == null || lchr.getLevel() < pchr.getLevel())) { + lchr = pchr; + } + } + if (lchr != null) { + Party.updateParty(party.getId(), PartyOperation.CHANGE_LEADER_DC, lchr); + } + } + } + if (bl != null) { + if (!this.serverTransition && this.isLoggedIn()) { + Buddy.loggedOff(namez, idz, this.channel, bl.getBuddiesIds(), gmLevel, hidden); + } else { + Buddy.loggedOn(namez, idz, this.channel, bl.getBuddiesIds(), gmLevel, hidden); + } + } + if (gid > 0) { + Guild.setGuildMemberOnline(chrg, false, -1); + } + if (fid > 0) { + Family.setFamilyMemberOnline(chrf, false, -1); + } + } catch (Exception e) { + FilePrinter.printError("AccountStuck.txt", (Throwable) e); + } finally { + if (RemoveInChannelServer && ch != null) { + ch.removePlayer(idz, namez); + } + this.player = null; + } + } else { + final int ch2 = Find.findChannel(idz); + if (ch2 > 0) { + this.disconnect(RemoveInChannelServer, false); + return; + } + try { + if (party != null) { + chrp.setOnline(false); + Party.updateParty(party.getId(), PartyOperation.LOG_ONOFF, chrp); + } + if (!this.serverTransition && this.isLoggedIn()) { + Buddy.loggedOff(namez, idz, this.channel, bl.getBuddiesIds(), gmLevel, hidden); + } else { + Buddy.loggedOn(namez, idz, this.channel, bl.getBuddiesIds(), gmLevel, hidden); + } + if (gid > 0) { + Guild.setGuildMemberOnline(chrg, false, -1); + } + if (this.player != null) { + this.player.setMessenger(null); + } + } catch (Exception e) { + FilePrinter.printError("AccountStuck.txt", (Throwable) e); + } finally { + if ((RemoveInChannelServer && ch2 > 0) || (RemoveInChannelServer && ch2 == -10)) { + CashShopServer.getPlayerStorage().deregisterPlayer(idz, namez); + } + this.player = null; + } + } + } + if (!this.serverTransition && this.isLoggedIn()) { + this.updateLoginState(0, this.getSessionIPAddress()); + } + this.engines.clear(); + } catch (Exception ex2) { + FileoutputUtil.logToFile("logs/下线处理异常.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + this.getSession().remoteAddress().toString().split(":")[0] + " 账号 " + this.getAccountName() + " 账号ID " + this.getAccID() + " 角色名 " + this.player.getName() + " 角色ID " + this.player.getId()); + FileoutputUtil.outError("logs/下线处理异常.txt", (Throwable) ex2); + FileoutputUtil.outError("logs/下线处理异常.txt", (Throwable) ex2); + } + } + + public final String getSessionIPAddress() { + if (this.session != null && this.session.remoteAddress() != null) { + return this.session.remoteAddress().toString().split(":")[0]; + } + return this.getLastIPAddress(); + } + + public final String getLastIPAddress() { + String sessionIP = null; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT SessionIP FROM accounts WHERE id = ?")) { + ps.setInt(1, this.accountId); + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + sessionIP = rs.getString("SessionIP"); + } + } + } catch (SQLException e) { + System.err.println("Failed in checking IP address for client."); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + return (sessionIP == null) ? "" : sessionIP; + } + + public final boolean CheckIPAddress() { + boolean canlogin = false; + final String sessionIP = this.getLastIPAddress(); + if (!sessionIP.isEmpty()) { + canlogin = this.getSessionIPAddress().equals(sessionIP.split(":")[0]); + } + return canlogin; + } + + public final void DebugMessage(final StringBuilder sb) { + sb.append(this.getSession().remoteAddress()); + sb.append(" Connected: "); + sb.append(this.getSession().isActive()); + sb.append(" ClientKeySet: "); + sb.append(this.getSession().attr(MapleClient.CLIENT_KEY).get() != null); + sb.append(" loggedin: "); + sb.append(this.isLoggedIn()); + sb.append(" has char: "); + sb.append(this.getPlayer() != null); + } + + public final int getChannel() { + return this.channel; + } + + public final ChannelServer getChannelServer() { + return ChannelServer.getInstance(this.channel); + } + + public final int deleteCharacter(final int cid) { + String name = null; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = null; + ps = con.prepareStatement("select name from characters where id = ?"); + ps.setInt(1, cid); + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + name = rs.getString("name"); + } + ps.close(); + rs.close(); + } catch (Exception ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + FileoutputUtil.logToFile("Logs/Data/角色刪除.txt", FileoutputUtil.NowTime() + " 账号: " + this.accountName + "(" + this.accountId + ") 角色: " + cid + " (" + name + ") IP: " + this.getSessionIPAddress() + " \r\n"); + final Set channels = ChannelServer.getAllChannels(); + for (final Integer ch : channels) { + final MapleCharacter chr = ChannelServer.getInstance(ch.intValue()).getPlayerStorage().getCharacterById(cid); + if (chr != null) { + ChannelServer.getInstance(ch.intValue()).removePlayer(chr); + } + } + try (final Connection con2 = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + try (final PreparedStatement ps2 = con2.prepareStatement("SELECT guildid, guildrank, familyid, name FROM characters WHERE id = ? AND accountid = ?")) { + ps2.setInt(1, cid); + ps2.setInt(2, this.accountId); + try (final ResultSet rs2 = ps2.executeQuery()) { + if (!rs2.next()) { + rs2.close(); + ps2.close(); + return 1; + } + if (rs2.getInt("guildid") > 0) { + if (rs2.getInt("guildrank") == 1) { + rs2.close(); + ps2.close(); + return 1; + } + Guild.deleteGuildCharacter(rs2.getInt("guildid"), cid); + } + if (rs2.getInt("familyid") > 0) { + Family.getFamily(rs2.getInt("familyid")).leaveFamily(cid); + } + } + } + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM characters WHERE id = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM monsterbook WHERE charid = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM mts_cart WHERE characterid = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM mts_items WHERE characterid = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM mountdata WHERE characterid = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM inventoryitems WHERE characterid = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM famelog WHERE characterid = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM famelog WHERE characterid_to = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM dueypackages WHERE RecieverId = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM wishlist WHERE characterid = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM buddies WHERE characterid = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM buddies WHERE buddyid = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM keymap WHERE characterid = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM savedlocations WHERE characterid = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM skills WHERE characterid = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM mountdata WHERE characterid = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM skillmacros WHERE characterid = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM trocklocations WHERE characterid = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM queststatus WHERE characterid = ?", cid); + MapleCharacter.deleteWhereCharacterId(con2, "DELETE FROM inventoryslot WHERE characterid = ?", cid); + return 0; + } catch (Exception e) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) e, "deleteCharacter"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + return 1; + } + } + + public final byte getGender() { + return this.gender; + } + + public final void setGender(final byte gender) { + this.gender = gender; + } + + public final String getSecondPassword() { + return this.secondPassword; + } + + public boolean getCheckSecondPassword(final String in) { + boolean allow = false; + if (LoginCrypto.checkSha1Hash(this.secondPassword, in)) { + allow = true; + } + return allow; + } + + public final void updateSecondPassword() { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("UPDATE `accounts` SET `2ndpassword` = ? WHERE id = ?"); + ps.setString(1, LoginCrypto.hexSha1(this.secondPassword)); + ps.setInt(2, this.accountId); + ps.executeUpdate(); + ps.close(); + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + FileoutputUtil.outputFileError("logs/资料库异常.txt", (Throwable) e); + System.err.println("error updating login state" + e); + } + } + + public final void setSecondPassword(final String secondPassword) { + this.secondPassword = secondPassword; + } + + public boolean check2ndPassword(final String secondPassword) { + boolean allow = false; + if (checkHash(this.secondPassword, "SHA-1", secondPassword)) { + allow = true; + } + return allow; + } + + public static boolean checkHash(final String hash, final String type, final String password) { + try { + final MessageDigest digester = MessageDigest.getInstance(type); + digester.update(password.getBytes("UTF-8"), 0, password.length()); + return HexTool.toString(digester.digest()).replace((CharSequence) " ", (CharSequence) "").toLowerCase().equals(hash); + } catch (NoSuchAlgorithmException | UnsupportedEncodingException ex2) { + throw new RuntimeException("Encoding the string failed", (Throwable) ex2); + } + } + + public final String getAccountName() { + return this.accountName; + } + + public final void setAccountName(final String accountName) { + this.accountName = accountName; + } + + public final void setChannel(final int channel) { + this.channel = channel; + } + + public final int getWorld() { + return this.world; + } + + public final void setWorld(final int world) { + this.world = world; + } + + public final int getLatency() { + return (int) (this.lastPong - this.lastPing); + } + + public final long getLastPong() { + return this.lastPong; + } + + public final long getLastPing() { + return this.lastPing; + } + + public final void pongReceived() { + this.lastPong = System.currentTimeMillis(); + } + + public final void sendPing() { + this.lastPing = System.currentTimeMillis(); + this.session.writeAndFlush(LoginPacket.getPing()); + PingTimer.getInstance().schedule((Runnable) new Runnable() { + @Override + public void run() { + try { + if (MapleClient.this.getLatency() < 0) { + MapleClient.this.closeseesion = true; + MapleClient.this.setReceiving(false); + MapleClient.this.updateLoginState(0, MapleClient.this.getSessionIPAddress()); + MapleClient.this.getSession().close(); + } + } catch (NullPointerException e) { + MapleClient.this.closeseesion = true; + MapleClient.this.getSession().close(); + } + } + }, 30000L); + } + + public boolean canClickNPC() { + return this.lastNpcClick + 500L < System.currentTimeMillis(); + } + + public void setClickedNPC() { + this.lastNpcClick = System.currentTimeMillis(); + } + + public void removeClickedNPC() { + this.lastNpcClick = 0L; + } + + public static final String getLogMessage(final MapleClient cfor, final String message) { + return getLogMessage(cfor, message, new Object[0]); + } + + public static final String getLogMessage(final MapleCharacter cfor, final String message) { + return getLogMessage((cfor == null) ? null : cfor.getClient(), message); + } + + public static final String getLogMessage(final MapleCharacter cfor, final String message, final Object... parms) { + return getLogMessage((cfor == null) ? null : cfor.getClient(), message, parms); + } + + public static final String getLogMessage(final MapleClient cfor, final String message, final Object... parms) { + final StringBuilder builder = new StringBuilder(); + if (cfor != null) { + if (cfor.getPlayer() != null) { + builder.append("<"); + builder.append(MapleCharacterUtil.makeMapleReadable(cfor.getPlayer().getName())); + builder.append(" (cid: "); + builder.append(cfor.getPlayer().getId()); + builder.append(")> "); + } + if (cfor.getAccountName() != null) { + builder.append("(Account: "); + builder.append(cfor.getAccountName()); + builder.append(") "); + } + } + builder.append(message); + for (final Object parm : parms) { + final int start = builder.indexOf("{}"); + builder.replace(start, start + 2, parm.toString()); + } + return builder.toString(); + } + + public static final int findAccIdForCharacterName(final String charName) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + int ret; + try (final PreparedStatement ps = con.prepareStatement("SELECT accountid FROM characters WHERE name = ?")) { + ps.setString(1, charName); + try (final ResultSet rs = ps.executeQuery()) { + ret = -1; + if (rs.next()) { + ret = rs.getInt("accountid"); + } + } + } + return ret; + } catch (SQLException e) { + System.err.println("findAccIdForCharacterName SQL error"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + return -1; + } + } + + public boolean isGm() { + return this.gmLevel > PlayerGMRank.普通玩家.getLevel(); + } + + public boolean isSuperGM() { + return this.gmLevel >= PlayerGMRank.超级管理员.getLevel(); + } + + public boolean isGod() { + return this.gmLevel >= PlayerGMRank.神.getLevel(); + } + + public int getGmLevel() { + return this.gmLevel; + } + + public final void setGmLevel(final int gmLevel) { + this.gmLevel = gmLevel; + } + + public void setVip(final int x) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("Update Accounts set vip = ? Where id = ?"); + ps.setInt(1, x); + ps.setInt(2, this.getAccID()); + ps.execute(); + ps.close(); + } catch (SQLException ex) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex, "SetVip"); + System.err.println("[vip]无法连接资料库"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } catch (Exception ex2) { + FilePrinter.printError("MapleCharacter.txt", (Throwable) ex2, "SetVip"); + System.err.println("[setvip]" + ex2); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex2); + } + } + + public int getVip() { + return this.vip; + } + + public final void setScriptEngine(final String name, final ScriptEngine e) { + this.engines.put(name, e); + } + + public final ScriptEngine getScriptEngine(final String name) { + return (ScriptEngine) this.engines.get(name); + } + + public final void removeScriptEngine(final String name) { + this.engines.remove(name); + } + + public final ScheduledFuture getIdleTask() { + return this.idleTask; + } + + public final void setIdleTask(final ScheduledFuture idleTask) { + this.idleTask = idleTask; + } + + public int getCharacterSlots() { + if (this.charslots != 3) { + return this.charslots; + } + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT charslots FROM character_slots WHERE accid = ? AND worldid = ?")) { + ps.setInt(1, this.accountId); + ps.setInt(2, this.world); + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + this.charslots = rs.getInt("charslots"); + } else { + try (final PreparedStatement psu = con.prepareStatement("INSERT INTO character_slots (accid, worldid, charslots) VALUES (?, ?, ?)")) { + psu.setInt(1, this.accountId); + psu.setInt(2, this.world); + psu.setInt(3, this.charslots); + psu.executeUpdate(); + } + } + } + } catch (SQLException sqlE) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) sqlE); + } + return this.charslots; + } + + public boolean gainCharacterSlot() { + if (this.getCharacterSlots() >= 15) { + return false; + } + ++this.charslots; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE character_slots SET charslots = ? WHERE worldid = ? AND accid = ?")) { + ps.setInt(1, this.charslots); + ps.setInt(2, this.world + 120); + ps.setInt(3, this.accountId); + ps.executeUpdate(); + } catch (SQLException sqlE) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) sqlE); + return false; + } + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE character_slots SET charslots = ? WHERE worldid = ? AND accid = ?")) { + ps.setInt(1, this.charslots); + ps.setInt(2, this.world); + ps.setInt(3, this.accountId); + ps.executeUpdate(); + } catch (SQLException sqlE) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) sqlE); + return false; + } + return true; + } + + public static final byte unbanIPMacs(final String charname) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT accountid from characters where name = ?"); + ps.setString(1, charname); + ResultSet rs = ps.executeQuery(); + if (!rs.next()) { + rs.close(); + ps.close(); + return -1; + } + final int accid = rs.getInt(1); + rs.close(); + ps.close(); + ps = con.prepareStatement("SELECT sessionIP, macs FROM accounts WHERE id = ?"); + ps.setInt(1, accid); + rs = ps.executeQuery(); + if (!rs.next()) { + rs.close(); + ps.close(); + return -1; + } + final String sessionIP = rs.getString("sessionIP"); + final String macs = rs.getString("macs"); + rs.close(); + ps.close(); + byte ret = 0; + if (sessionIP != null) { + try (final PreparedStatement psa = con.prepareStatement("DELETE FROM ipbans WHERE ip = ?")) { + psa.setString(1, sessionIP); + psa.execute(); + psa.close(); + } + ++ret; + } + if (macs != null) { + final String[] split; + final String[] macz = split = macs.split(", "); + for (final String mac : split) { + if (!mac.equals("")) { + try (final PreparedStatement psa2 = con.prepareStatement("DELETE FROM macbans WHERE mac = ?")) { + psa2.setString(1, mac); + psa2.execute(); + psa2.close(); + } + } + } + ++ret; + } + con.close(); + return ret; + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + System.err.println("Error while unbanning" + e); + return -2; + } + } + + public static final byte unbanIP(final String charname) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT accountid from characters where name = ?"); + ps.setString(1, charname); + ResultSet rs = ps.executeQuery(); + if (!rs.next()) { + rs.close(); + ps.close(); + return -1; + } + final int accid = rs.getInt(1); + rs.close(); + ps.close(); + ps = con.prepareStatement("SELECT sessionIP FROM accounts WHERE id = ?"); + ps.setInt(1, accid); + rs = ps.executeQuery(); + if (!rs.next()) { + rs.close(); + ps.close(); + return -1; + } + final String sessionIP = rs.getString("sessionIP"); + rs.close(); + ps.close(); + byte ret = 0; + if (sessionIP != null) { + try (final PreparedStatement psa = con.prepareStatement("DELETE FROM ipbans WHERE ip = ?")) { + psa.setString(1, sessionIP); + psa.execute(); + psa.close(); + } + ++ret; + } + return ret; + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + System.err.println("Error while unbanning" + e); + return -2; + } + } + + public static final byte unHellban(final String charname) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT accountid from characters where name = ?"); + ps.setString(1, charname); + ResultSet rs = ps.executeQuery(); + if (!rs.next()) { + rs.close(); + ps.close(); + return -1; + } + final int accid = rs.getInt(1); + rs.close(); + ps.close(); + ps = con.prepareStatement("SELECT sessionIP, email FROM accounts WHERE id = ?"); + ps.setInt(1, accid); + rs = ps.executeQuery(); + if (!rs.next()) { + rs.close(); + ps.close(); + return -1; + } + final String sessionIP = rs.getString("sessionIP"); + final String email = rs.getString("email"); + rs.close(); + ps.close(); + ps = con.prepareStatement("UPDATE accounts SET banned = 0, banreason = '' WHERE email = ?" + ((sessionIP == null) ? "" : " OR sessionIP = ?")); + ps.setString(1, email); + if (sessionIP != null) { + ps.setString(2, sessionIP); + } + ps.execute(); + ps.close(); + con.close(); + return 0; + } catch (SQLException e) { + System.err.println("Error while unbanning" + e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + return -2; + } + } + + public static List getLoggedIdsFromDB(final int state) { + final List ret = (List) new ArrayList(); + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("SELECT id from accounts where loggedin = ?"); + ps.setInt(1, state); + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + ret.add(Integer.valueOf(rs.getInt("id"))); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return ret; + } + + public boolean isMonitored() { + return this.monitored; + } + + public void setMonitored(final boolean m) { + this.monitored = m; + } + + public boolean isReceiving() { + return this.receiving; + } + + public void setReceiving(final boolean m) { + this.receiving = m; + } + + public void sendPacket(final byte[] packet) { + this.getSession().writeAndFlush(packet); + } + + public static boolean banMacs(final String macData) { + if (macData.equalsIgnoreCase("00-00-00-00-00-00") || macData.length() != 17) { + return false; + } + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("INSERT INTO macbans (mac) VALUES (?)")) { + ps.setString(1, macData); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException e) { + System.err.println("Error banning MACs" + e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + return false; + } + return true; + } + + public final Set getMacs() { + return Collections.unmodifiableSet(this.macs); + } + + public boolean isBannedMac(final String mac) { + if (mac.equalsIgnoreCase("00-00-00-00-00-00") || mac.length() != 17) { + return false; + } + boolean ret = false; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT COUNT(*) FROM macbans WHERE mac = ?")) { + ps.setString(1, mac); + try (final ResultSet rs = ps.executeQuery()) { + rs.next(); + if (rs.getInt(1) > 0) { + ret = true; + } + rs.close(); + } + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("Error checking mac bans" + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return ret; + } + + public boolean hasBannedMac() { + if (this.macs.isEmpty()) { + return false; + } + boolean ret = false; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final StringBuilder sql = new StringBuilder("SELECT COUNT(*) FROM macbans WHERE mac IN ("); + for (int i = 0; i < this.macs.size(); ++i) { + sql.append("?"); + if (i != this.macs.size() - 1) { + sql.append(", "); + } + } + sql.append(")"); + try (final PreparedStatement ps = con.prepareStatement(sql.toString())) { + int i = 0; + for (final String mac : this.macs) { + ++i; + ps.setString(i, mac); + } + try (final ResultSet rs = ps.executeQuery()) { + rs.next(); + if (rs.getInt(1) > 0) { + ret = true; + } + } + ps.close(); + } + con.close(); + } catch (SQLException ex) { + System.err.println("Error checking mac bans" + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return ret; + } + + private void loadMacsIfNescessary() throws SQLException { + if (this.macs.isEmpty()) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT macs FROM accounts WHERE id = ?")) { + ps.setInt(1, this.accountId); + try (final ResultSet rs = ps.executeQuery()) { + if (!rs.next()) { + rs.close(); + ps.close(); + throw new RuntimeException("No valid account associated with this client."); + } + if (rs.getString("macs") != null) { + final String[] split; + final String[] macData = split = rs.getString("macs").split(", "); + for (final String mac : split) { + if (!mac.equals("")) { + this.macs.add(mac); + } + } + } + rs.close(); + } + ps.close(); + con.close(); + } catch (SQLException ex) { + ex.printStackTrace(); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + } + + public void banMacs() { + try { + this.loadMacsIfNescessary(); + if (this.macs.size() > 0) { + final String[] macBans = new String[this.macs.size()]; + int z = 0; + for (final String mac : this.macs) { + macBans[z] = mac; + ++z; + } + banMacs(macBans); + } + } catch (SQLException ex) { + } + } + + public static void banMacs(final String[] macs) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final List filtered = (List) new LinkedList(); + PreparedStatement ps = con.prepareStatement("SELECT filter FROM macfilters"); + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + filtered.add(rs.getString("filter")); + } + rs.close(); + ps.close(); + ps = con.prepareStatement("INSERT INTO macbans (mac) VALUES (?)"); + for (final String mac : macs) { + boolean matched = false; + for (final String filter : filtered) { + if (mac.matches(filter)) { + matched = true; + break; + } + } + if (!matched) { + ps.setString(1, mac); + try { + ps.executeUpdate(); + } catch (SQLException ex) { + } + } + } + ps.close(); + con.close(); + } catch (SQLException e) { + System.err.println("Error banning MACs" + e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + } + + public List loadCharacterNamesByCharId(final int charId) { + final List chars = (List) new LinkedList(); + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + try (final PreparedStatement ps = con.prepareStatement("SELECT id,name FROM characters WHERE accountid= (SELECT accountid FROM characters where id=?)")) { + ps.setInt(1, charId); + try (final ResultSet rs = ps.executeQuery()) { + while (rs.next()) { + chars.add(rs.getString("name")); + } + rs.close(); + } + ps.close(); + } + con.close(); + } catch (SQLException e) { + System.err.println("error loading characters internal" + e); + FileoutputUtil.outputFileError("logs/资料库异常.txt", (Throwable) e); + } + return chars; + } + + public int loadLogGedin(final int accountID) { + int login = 0; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("SELECT loggedin FROM accounts WHERE id = ?"); + ps.setInt(1, accountID); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + login = rs.getShort("loggedin"); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + return login; + } + + public void setLoginKey(final String key) { + this.loginKey = key; + } + + public int getLoginKeya() { + return this.loginKeya; + } + + public void setLoginKeya(final int keya) { + this.loginKeya = keya; + } + + public String getLoginKey() { + return this.loginKey; + } + + public String loadLoginKey() { + String loginkey = null; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("SELECT loginkey FROM accounts WHERE id = ?"); + ps.setInt(1, this.getAccID()); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + loginkey = rs.getString("loginkey"); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + return loginkey; + } + + public void setServerKey(final String key) { + this.serverKey = key; + } + + public String getServerKey() { + return this.serverKey; + } + + public String loadServerKey() { + String serverkey = null; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("SELECT serverkey FROM accounts WHERE id = ?"); + ps.setInt(1, this.getAccID()); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + serverkey = rs.getString("serverkey"); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + return serverkey; + } + + public final void updateLoginKey(final String loginkey) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("UPDATE accounts SET loginkey = ? WHERE id = ?"); + ps.setString(1, loginkey); + ps.setInt(2, this.getAccID()); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + } + + public final void updateServerKey(final String serverkey) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("UPDATE accounts SET serverkey = ? WHERE id = ?"); + ps.setString(1, serverkey); + ps.setInt(2, this.getAccID()); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + } + + public final void updateClientKey(final String clientkey) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("UPDATE accounts SET clientkey = ? WHERE id = ?"); + ps.setString(1, clientkey); + ps.setInt(2, this.getAccID()); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + } + + public static final byte setTGJF(final String charname, final int x) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT accountid from characters where name = ?"); + ps.setString(1, charname); + final ResultSet rs = ps.executeQuery(); + if (!rs.next()) { + rs.close(); + ps.close(); + return -1; + } + final int accid = rs.getInt(1); + rs.close(); + ps.close(); + ps = con.prepareStatement("UPDATE accounts SET TGJF = ? WHERE id = ?"); + ps.setInt(1, x); + ps.setInt(2, accid); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException e) { + System.err.println("Error while unbanning" + e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + return -2; + } + return 0; + } + + public static final int getTGJF(final int accid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("SELECT TGJF FROM accounts WHERE id = ?"); + ps.setInt(1, accid); + int ret; + try (final ResultSet rs = ps.executeQuery()) { + ret = -1; + if (rs.next()) { + ret = rs.getInt("TGJF"); + } + rs.close(); + } + ps.close(); + con.close(); + return ret; + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + return -1; + } + } + + public final void updateMacs(final String macs) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("UPDATE accounts SET macs = ? WHERE id = ?"); + ps.setString(1, macs); + ps.setInt(2, this.getAccID()); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + } + + public static final byte setTJJF(final String charname, final int x) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT accountid from characters where name = ?"); + ps.setString(1, charname); + final ResultSet rs = ps.executeQuery(); + if (!rs.next()) { + rs.close(); + ps.close(); + return -1; + } + final int accid = rs.getInt(1); + rs.close(); + ps.close(); + ps = con.prepareStatement("UPDATE accounts SET TJJF = ? WHERE id = ?"); + ps.setInt(1, x); + ps.setInt(2, accid); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException e) { + System.err.println("Error while unbanning" + e); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + return -2; + } + return 0; + } + + public static final int getTJJF(final int accid) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("SELECT TJJF FROM accounts WHERE id = ?"); + ps.setInt(1, accid); + int ret; + try (final ResultSet rs = ps.executeQuery()) { + ret = -1; + if (rs.next()) { + ret = rs.getInt("TJJF"); + } + rs.close(); + } + ps.close(); + con.close(); + return ret; + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + return -1; + } + } + + public boolean dangerousIp(final String lip) { + final String ip = lip.substring(1, lip.lastIndexOf(58)); + boolean ret = false; + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT COUNT(*) FROM dangerousip WHERE ? LIKE CONCAT(ip, '%')")) { + ps.setString(1, ip); + try (final ResultSet rs = ps.executeQuery()) { + rs.next(); + if (rs.getInt(1) > 0) { + ret = true; + } + rs.close(); + } + ps.close(); + con.close(); + } catch (SQLException ex) { + System.err.println("Error dangerousIp " + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return ret; + } + + public void setDangerousIp(final String lip) { + final String ip = lip.substring(1, lip.lastIndexOf(58)); + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("INSERT INTO dangerousip (ip) VALUES (?)"); + ps.setString(1, ip); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException Wx) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Wx); + } + } + + public int getMacsCout(final byte loggedin, final String macs) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("select count(*) from accounts where loggedin > ? and macs = ?"); + ps.setByte(1, loggedin); + ps.setString(2, macs); + int ret_count; + try (final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + ret_count = rs.getInt(1); + } else { + ret_count = -1; + } + rs.close(); + } + ps.close(); + con.close(); + return ret_count; + } catch (SQLException Ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) Ex); + return -1; + } + } + + public long getLastLoginTime() { + return this.lastLoginTime; + } + + public void setLastLoginTime(final long lastLoginTime) { + this.lastLoginTime = lastLoginTime; + } + + public final void unLockDisconnect() { + this.getSession().writeAndFlush(MaplePacketCreator.serverNotice(1, "当前账号在別处登入\r\n若不是你本人操作请及时更改密码。")); + this.disconnect(this.serverTransition, this.getChannel() == -10); + this.getSession().close(); + this.closeseesion = true; + final MapleClient client = this; + final Thread closeSession = new Thread() { + @Override + public void run() { + try { + Thread.sleep(3000L); + } catch (InterruptedException ex) { + } + client.getSession().close(); + } + }; + try { + closeSession.start(); + } catch (Exception ex) { + } + } + + public boolean getCloseSession() { + return this.closeseesion; + } + + public boolean isCanloginpw() { + return this.canloginpw; + } + + public void setCanloginpw(final boolean x) { + this.canloginpw = x; + } + + public List loadCharacterNamesByAccId(final int accId) { + final List Acc = (List) new LinkedList(); + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("SELECT name FROM characters WHERE accountid = ?"); + ps.setInt(1, accId); + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + Acc.add(rs.getString("name")); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException e) { + System.err.println("error loading characters names by id " + e); + } + return Acc; + } + + public List loadCharacterIDsByAccId(final int accId) { + final List Acc = (List) new LinkedList(); + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("SELECT id FROM characters WHERE accountid = ?"); + ps.setInt(1, accId); + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + Acc.add(Integer.valueOf(rs.getInt("id"))); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException e) { + System.err.println("error loading characters cids by id " + e); + } + return Acc; + } + + public List loadCharacterIds(final int serverId) { + final List chars = (List) new LinkedList(); + for (final CharNameAndId cni : this.loadCharactersInternal(serverId)) { + chars.add(Integer.valueOf(cni.id)); + } + return chars; + } + + protected static final class CharNameAndId { + public final String name; + public final int id; + + public CharNameAndId(final String name, final int id) { + this.name = name; + this.id = id; + } + } +} diff --git a/src/client/MapleCoolDownValueHolder.java b/src/client/MapleCoolDownValueHolder.java new file mode 100644 index 0000000..4cc9515 --- /dev/null +++ b/src/client/MapleCoolDownValueHolder.java @@ -0,0 +1,13 @@ +package client; + +public class MapleCoolDownValueHolder { + public int skillId; + public long startTime; + public long length; + + public MapleCoolDownValueHolder(final int skillId, final long startTime, final long length) { + this.skillId = skillId; + this.startTime = startTime; + this.length = length; + } +} diff --git a/src/client/MapleDisease.java b/src/client/MapleDisease.java new file mode 100644 index 0000000..0d26c8f --- /dev/null +++ b/src/client/MapleDisease.java @@ -0,0 +1,161 @@ +package client; + +import server.Randomizer; + +import java.io.Serializable; + +public enum MapleDisease implements Serializable { + POTION(8796093022208L, true), + SHADOW(17592186044416L, true), + BLIND(35184372088832L, true), + FREEZE(2251799813685248L, true), + SLOW(1L), + MORPH(2L), + SEDUCE(128L), + ZOMBIFY(16384L), + REVERSE_DIRECTION(524288L), + WEIRD_FLAME(134217728L), + STUN(562949953421312L), + POISON(1125899906842624L), + SEAL(2251799813685248L), + DARKNESS(4503599627370496L), + WEAKEN(4611686018427387904L), + CURSE(Long.MIN_VALUE); + + private static final long serialVersionUID = 0L; + private final long i; + private final boolean first; + + private MapleDisease(final long i) { + this.i = i; + this.first = false; + } + + private MapleDisease(final long i, final boolean first) { + this.i = i; + this.first = first; + } + + public boolean isFirst() { + return this.first; + } + + public long getValue() { + return this.i; + } + + public static final MapleDisease getRandom() { + MapleDisease dis = null; + Block_1: + while (true) { + final MapleDisease[] values = values(); + for (int length = values.length, i = 0; i < length; ++i) { + dis = values[i]; + if (Randomizer.nextInt(values().length) == 0) { + break Block_1; + } + } + } + return dis; + } + + public static final MapleDisease getByMobSkill(final int skill) { + switch (skill) { + case 120: { + return MapleDisease.SEAL; + } + case 121: { + return MapleDisease.DARKNESS; + } + case 122: { + return MapleDisease.WEAKEN; + } + case 123: { + return MapleDisease.STUN; + } + case 124: { + return MapleDisease.CURSE; + } + case 125: { + return MapleDisease.POISON; + } + case 126: { + return MapleDisease.SLOW; + } + case 128: { + return MapleDisease.SEDUCE; + } + case 132: { + return MapleDisease.REVERSE_DIRECTION; + } + case 133: { + return MapleDisease.ZOMBIFY; + } + case 134: { + return MapleDisease.POTION; + } + case 135: { + return MapleDisease.SHADOW; + } + case 136: { + return MapleDisease.BLIND; + } + case 137: { + return MapleDisease.FREEZE; + } + default: { + return null; + } + } + } + + public static final int getByDisease(final MapleDisease skill) { + switch (skill) { + case SEAL: { + return 120; + } + case DARKNESS: { + return 121; + } + case WEAKEN: { + return 122; + } + case STUN: { + return 123; + } + case CURSE: { + return 124; + } + case POISON: { + return 125; + } + case SLOW: { + return 126; + } + case SEDUCE: { + return 128; + } + case REVERSE_DIRECTION: { + return 132; + } + case ZOMBIFY: { + return 133; + } + case POTION: { + return 134; + } + case SHADOW: { + return 135; + } + case BLIND: { + return 136; + } + case FREEZE: { + return 137; + } + default: { + return 0; + } + } + } +} diff --git a/src/client/MapleDiseaseValueHolder.java b/src/client/MapleDiseaseValueHolder.java new file mode 100644 index 0000000..7fa2867 --- /dev/null +++ b/src/client/MapleDiseaseValueHolder.java @@ -0,0 +1,16 @@ +package client; + +import java.io.Serializable; + +public class MapleDiseaseValueHolder implements Serializable { + private static final long serialVersionUID = 9179541993413738569L; + public long startTime; + public long length; + public MapleDisease disease; + + public MapleDiseaseValueHolder(final MapleDisease disease, final long startTime, final long length) { + this.disease = disease; + this.startTime = startTime; + this.length = length; + } +} diff --git a/src/client/MapleEquipOnlyId.java b/src/client/MapleEquipOnlyId.java new file mode 100644 index 0000000..f18bc96 --- /dev/null +++ b/src/client/MapleEquipOnlyId.java @@ -0,0 +1,52 @@ +package client; + +import java.sql.ResultSet; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import tools.FileoutputUtil; +import database.DBConPool; + +import java.util.concurrent.atomic.AtomicLong; + +public class MapleEquipOnlyId { + private final AtomicLong runningId; + + public static MapleEquipOnlyId getInstance() { + return SingletonHolder.instance; + } + + private MapleEquipOnlyId() { + this.runningId = new AtomicLong(0L); + } + + public long getNextEquipOnlyId() { + if (this.runningId.get() <= 0L) { + this.runningId.set(this.initOnlyId()); + } else { + this.runningId.set(this.runningId.get() + 1L); + } + return this.runningId.get(); + } + + public long initOnlyId() { + long ret = 0L; + try (final PreparedStatement ps = DBConPool.getInstance().getDataSource().getConnection().prepareStatement("SELECT MAX(equipOnlyId) FROM inventoryitems WHERE equipOnlyId > 0"); + final ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + ret = (long) (rs.getInt(1) + 1); + } + ps.close(); + rs.close(); + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + e.printStackTrace(); + } + return ret; + } + + private static class SingletonHolder { + protected static final MapleEquipOnlyId instance = new MapleEquipOnlyId(); + + } +} diff --git a/src/client/MapleJob.java b/src/client/MapleJob.java new file mode 100644 index 0000000..ce92a09 --- /dev/null +++ b/src/client/MapleJob.java @@ -0,0 +1,384 @@ +package client; + +import constants.SkillConstants; + +public enum MapleJob { + 新手(0), + 战士(100), + 剑客(110), + 勇士(111), + 英雄(112), + 准骑士(120), + 骑士(121), + 圣骑士(122), + 枪战士(130), + 龙骑士(131), + 黑骑士(132), + 魔法师(200), + 火毒法师(210), + 火毒巫师(211), + 火毒魔导士(212), + 冰雷法师(220), + 冰雷巫师(221), + 冰雷魔导士(222), + 牧师(230), + 祭司(231), + 主教(232), + 弓箭手(300), + 猎人(310), + 游俠(311), + 神射手(312), + 弩弓手(320), + 游侠(321), + 箭神(322), + 盜贼(400), + 刺客(410), + 无影人(411), + 隐士(412), + 侠客(420), + 独行客(421), + 侠盗(422), + 海盜(500), + 拳手(510), + 斗士(511), + 冲锋队长(512), + 火枪手(520), + 大副(521), + 船长(522), + 巡查者(800), + 管理员(900), + 初心者(1000), + 魂骑士1转(1100), + 魂骑士2转(1110), + 魂骑士3转(1111), + 魂骑士4转(1112), + 炎术士1转(1200), + 炎术士2转(1210), + 炎术士3转(1211), + 炎术士4转(1212), + 风灵使者1转(1300), + 风灵使者2转(1310), + 风灵使者3转(1311), + 风灵使者4转(1312), + 夜行者1转(1400), + 夜行者2转(1410), + 夜行者3转(1411), + 夜行者4转(1412), + 奇袭者1转(1500), + 奇袭者2转(1510), + 奇袭者3转(1511), + 奇袭者4转(1512), + 战童(2000), + 战神1转(2100), + 战神2转(2110), + 战神3转(2111), + 战神4转(2112), + 未知(999999); + + private final int jobid; + + private MapleJob(final int id) { + this.jobid = id; + } + + public int getId() { + return this.jobid; + } + + public static String getName(final MapleJob mjob) { + return mjob.name(); + } + + public static MapleJob getById(final int id) { + for (final MapleJob l : values()) { + if (l.getId() == id) { + return l; + } + } + return MapleJob.未知; + } + + public static boolean isExist(final int id) { + for (final MapleJob job : values()) { + if (job.getId() == id) { + return true; + } + } + return false; + } + + public static boolean is冒险家(final int job) { + return job / 1000 == 0; + } + + public static boolean is英雄(final int job) { + return job / 10 == 11; + } + + public static boolean is圣骑士(final int job) { + return job / 10 == 12; + } + + public static boolean is黑骑士(final int job) { + return job / 10 == 13; + } + + public static boolean is大魔导士_火毒(final int job) { + return job / 10 == 21; + } + + public static boolean is大魔导士_冰雷(final int job) { + return job / 10 == 22; + } + + public static boolean is主教(final int job) { + return job / 10 == 23; + } + + public static boolean is箭神(final int job) { + return job / 10 == 31; + } + + public static boolean is神射手(final int job) { + return job / 10 == 32; + } + + public static boolean is隐士(final int job) { + return job / 10 == 41; + } + + public static boolean is侠盗(final int job) { + return job / 10 == 42; + } + + public static boolean is影武者(final int job) { + return job / 10 == 43; + } + + public static boolean is拳霸(final int job) { + return job / 10 == 51; + } + + public static boolean is枪神(final int job) { + return job / 10 == 52; + } + + public static boolean is管理员(final int job) { + return job == 800 || job == 900 || job == 910; + } + + public static boolean is皇家骑士团(final int job) { + return job / 1000 == 1; + } + + public static boolean is魂骑士(final int job) { + return job / 100 == 11; + } + + public static boolean is炎术士(final int job) { + return job / 100 == 12; + } + + public static boolean is风灵使者(final int job) { + return job / 100 == 13; + } + + public static boolean is夜行者(final int job) { + return job / 100 == 14; + } + + public static boolean is奇袭者(final int job) { + return job / 100 == 15; + } + + public static boolean is英雄团(final int job) { + return job / 1000 == 2; + } + + public static boolean is战神(final int job) { + return job / 100 == 21 || job == 2000; + } + + public static boolean is剑士(final int job) { + return getJobBranch(job) == 1; + } + + public static boolean is魔法师(final int job) { + return getJobBranch(job) == 2; + } + + public static boolean is弓箭手(final int job) { + return getJobBranch(job) == 3; + } + + public static boolean is盜贼(final int job) { + return getJobBranch(job) == 4 || getJobBranch(job) == 6; + } + + public static boolean is海盜(final int job) { + return getJobBranch(job) == 5 || getJobBranch(job) == 6; + } + + public static short getBeginner(final short job) { + if (job % 1000 < 10) { + return job; + } + switch (job / 100) { + case 0: + case 1: + case 2: + case 3: + case 4: + case 5: + case 8: + case 9: { + return (short) MapleJob.新手.getId(); + } + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: { + return (short) MapleJob.初心者.getId(); + } + case 20: { + return (short) MapleJob.战童.getId(); + } + case 21: { + return (short) MapleJob.战童.getId(); + } + default: { + return (short) MapleJob.新手.getId(); + } + } + } + + public static boolean is初心者(final int jobid) { + Label_0084: + { + if (jobid <= 5000) { + if (jobid != 5000) { + if (jobid < 2001) { + break Label_0084; + } + if (jobid > 2005) { + if (jobid <= 3000) { + break Label_0084; + } + if (jobid > 3002) { + if (jobid <= 4000) { + break Label_0084; + } + if (jobid > 4002) { + break Label_0084; + } + } + } + } + return true; + } + if (jobid >= 6000 && (jobid <= 6001 || jobid == 13000)) { + return true; + } + } + boolean result = isJob12000(jobid); + if (jobid % 1000 == 0 || jobid / 100 == 8000 || jobid == 8001 || result) { + result = true; + } + return result; + } + + public static boolean isJob12000(final int job) { + boolean result = isJob12000HighLv(job); + if (isJob12000LowLv(job) || result) { + result = true; + } + return result; + } + + public static boolean isJob12000HighLv(final int job) { + return job == 12003 || job == 12004; + } + + public static boolean isJob12000LowLv(final int job) { + return job == 12000 || job == 12001 || job == 12002; + } + + public static boolean isJob8000(final int job) { + final int v1 = SkillConstants.getJobBySkill(job); + return (v1 >= 800000 && v1 <= 800099) || v1 == 8001; + } + + public static boolean isJob9500(final int job) { + final boolean result = job >= 0 && SkillConstants.getJobBySkill(job) == 9500; + return result; + } + + public static int get转数(final int jobid) { + int result; + if (is初心者(jobid) || jobid % 100 == 0 || jobid == 501 || jobid == 3101 || jobid == 508) { + result = 1; + } else { + final int v1 = jobid % 10; + if (jobid / 10 == 43) { + final int v2 = v1 / 2 + 2; + } else { + final int v2 = v1 + 2; + } + result = 0; + } + return result; + } + + public static boolean isBeginner(final int job) { + return getJobGrade(job) == 0; + } + + public static boolean isSameJob(final int job, final int job2) { + final int jobNum = getJobGrade(job); + final int job2Num = getJobGrade(job2); + if (jobNum == 0 || job2Num == 0) { + return getBeginner((short) job) == getBeginner((short) job2); + } + if (getJobGroup(job) != getJobGroup(job2)) { + return false; + } + if (is管理员(job) || is管理员(job)) { + return is管理员(job2) && is管理员(job2); + } + if (jobNum == 1 || job2Num == 1) { + return job / 100 == job2 / 100; + } + return job / 10 == job2 / 10; + } + + public static int getJobGroup(final int job) { + return job / 1000; + } + + public static int getJobBranch(final int job) { + if (job / 100 == 27) { + return 2; + } + return job % 1000 / 100; + } + + public static int getJobBranch2nd(final int job) { + if (job / 100 == 27) { + return 2; + } + return job % 1000 / 100; + } + + public static int getJobGrade(final int jobz) { + final int job = jobz % 1000; + if (job / 10 == 0) { + return 0; + } + if (job / 10 % 10 == 0) { + return 1; + } + return job % 10 + 2; + } +} diff --git a/src/client/MapleKeyLayout.java b/src/client/MapleKeyLayout.java new file mode 100644 index 0000000..fec0a61 --- /dev/null +++ b/src/client/MapleKeyLayout.java @@ -0,0 +1,85 @@ +package client; + +import java.sql.SQLException; +import java.util.Iterator; +import java.sql.PreparedStatement; + +import tools.FileoutputUtil; + +import java.util.Map.Entry; +import java.sql.Connection; + +import tools.data.MaplePacketLittleEndianWriter; + +import java.util.HashMap; + +import tools.Pair; + +import java.util.Map; +import java.io.Serializable; + +public class MapleKeyLayout implements Serializable { + private static final long serialVersionUID = 9179541993413738569L; + private boolean changed; + private final Map> keymap; + + public MapleKeyLayout() { + this.changed = false; + this.keymap = (Map>) new HashMap(); + } + + public MapleKeyLayout(final Map> keys) { + this.changed = false; + this.keymap = keys; + } + + public final Map> Layout() { + this.changed = true; + return this.keymap; + } + + public final void writeData(final MaplePacketLittleEndianWriter mplew) { + for (int x = 0; x < 90; ++x) { + final Pair binding = this.keymap.get(Integer.valueOf(x)); + if (binding != null) { + mplew.write(((Byte) binding.getLeft()).byteValue()); + mplew.writeInt(((Integer) binding.getRight()).intValue()); + } else { + mplew.write(0); + mplew.writeInt(0); + } + } + } + + public final void saveKeys(final int charid, final Connection con) throws SQLException { + if (!this.changed || this.keymap.isEmpty()) { + return; + } + try { + PreparedStatement ps = con.prepareStatement("DELETE FROM keymap WHERE characterid = ?"); + ps.setInt(1, charid); + ps.execute(); + ps.close(); + boolean first = true; + final StringBuilder query = new StringBuilder(); + for (final Entry> keybinding : this.keymap.entrySet()) { + if (first) { + first = false; + query.append("INSERT INTO keymap VALUES ("); + } else { + query.append(",("); + } + query.append("DEFAULT,"); + query.append(charid).append(","); + query.append(((Integer) keybinding.getKey()).intValue()).append(","); + query.append((int) ((Byte) ((Pair) keybinding.getValue()).getLeft()).byteValue()).append(","); + query.append(((Integer) ((Pair) keybinding.getValue()).getRight()).intValue()).append(")"); + } + ps = con.prepareStatement(query.toString()); + ps.execute(); + ps.close(); + } catch (Exception se) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) se); + } + } +} diff --git a/src/client/MapleLieDetector.java b/src/client/MapleLieDetector.java new file mode 100644 index 0000000..3765450 --- /dev/null +++ b/src/client/MapleLieDetector.java @@ -0,0 +1,122 @@ +package client; + +import tools.Pair; +import server.maps.MapleMap; +import handling.world.World.Broadcast; +import server.Timer.EtcTimer; +import tools.MaplePacketCreator; +import tools.HexTool; +import scripting.LieDetectorScript; + +import java.util.concurrent.ScheduledFuture; + +public class MapleLieDetector { + public byte type; + public int attempt; + public int cid; + public String tester; + public String answer; + public boolean inProgress; + public boolean passed; + public long lasttime; + public ScheduledFuture schedule; + + public MapleLieDetector(final int chid) { + this.inProgress = false; + this.cid = chid; + this.reset(); + } + + public final boolean startLieDetector(final String tester, final boolean isItem, final boolean anotherAttempt) { + if (!anotherAttempt && ((this.isPassed() && isItem) || this.inProgress() || this.attempt == 3)) { + return false; + } + final Pair captcha = LieDetectorScript.getImageBytes(); + if (captcha == null) { + return false; + } + final byte[] image = HexTool.getByteArrayFromHexString((String) captcha.getLeft()); + this.answer = (String) captcha.getRight(); + this.tester = tester; + this.inProgress = true; + this.type = (byte) (byte) (isItem ? 0 : 1); + ++this.attempt; + final MapleCharacter chrid = MapleCharacter.getOnlineCharacterById(this.cid); + if (this.attempt < 3 && chrid != null) { + chrid.getClient().getSession().writeAndFlush(MaplePacketCreator.sendLieDetector(image, this.attempt)); + } + this.schedule = EtcTimer.getInstance().schedule((Runnable) new Runnable() { + @Override + public void run() { + final MapleCharacter searchchr = MapleCharacter.getOnlineCharacterById(MapleLieDetector.this.cid); + if (!MapleLieDetector.this.isPassed() && searchchr != null) { + if (MapleLieDetector.this.attempt >= 3) { + final MapleCharacter search_chr = searchchr.getMap().getCharacterByName(tester); + if (search_chr != null && search_chr.getId() != searchchr.getId()) { + search_chr.dropMessage(5, searchchr.getName() + " 沒有通过测谎仪。"); + } + MapleLieDetector.this.end(); + searchchr.getClient().getSession().writeAndFlush(MaplePacketCreator.LieDetectorResponse((byte) 7, (byte) 0)); + final MapleMap map = searchchr.getMap().getReturnMap(); + searchchr.changeMap(map, map.getPortal(0)); + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, "[GM密语] 玩家: " + searchchr.getName() + " (等级 " + (int) searchchr.getLevel() + ") 未通过测谎仪检测,疑似使用脚本外挂!")); + } else { + MapleLieDetector.this.startLieDetector(tester, isItem, true); + } + } + } + }, 60000L); + return true; + } + + public final int getAttempt() { + return this.attempt; + } + + public final byte getLastType() { + return this.type; + } + + public final String getTester() { + return this.tester; + } + + public final String getAnswer() { + return this.answer; + } + + public final boolean inProgress() { + return this.inProgress; + } + + public final boolean isPassed() { + return this.passed; + } + + public void setPassed(final boolean passedi) { + this.passed = passedi; + } + + public final boolean canDetector(final long time) { + return this.lasttime + 300000L > time; + } + + public final void end() { + this.inProgress = false; + this.passed = true; + this.attempt = 0; + this.lasttime = System.currentTimeMillis(); + if (this.schedule != null) { + this.schedule.cancel(false); + this.schedule = null; + } + } + + public final void reset() { + this.tester = ""; + this.answer = ""; + this.attempt = 0; + this.inProgress = false; + this.passed = false; + } +} diff --git a/src/client/MapleQuestStatus.java b/src/client/MapleQuestStatus.java new file mode 100644 index 0000000..e30af71 --- /dev/null +++ b/src/client/MapleQuestStatus.java @@ -0,0 +1,188 @@ +package client; + +import server.life.MapleLifeFactory; +import tools.FileoutputUtil; + +import java.util.Map.Entry; +import java.util.Iterator; +import java.util.LinkedHashMap; + +import constants.GameConstants; + +import java.util.Map; + +import server.quest.MapleQuest; + +import java.io.Serializable; + +public class MapleQuestStatus implements Serializable { + private static final long serialVersionUID = 91795419934134L; + private final transient MapleQuest quest; + private byte status; + private Map killedMobs; + private int npc; + private long completionTime; + private int forfeited; + private String customData; + + public MapleQuestStatus(final MapleQuest quest, final int status) { + this.killedMobs = null; + this.forfeited = 0; + this.quest = quest; + this.setStatus((byte) status); + this.completionTime = System.currentTimeMillis(); + if (status == 1 && !quest.getRelevantMobs().isEmpty()) { + this.registerMobs(); + } + } + + public MapleQuestStatus(final MapleQuest quest, final byte status, final int npc) { + this.killedMobs = null; + this.forfeited = 0; + this.quest = quest; + this.setStatus(status); + this.setNpc(npc); + this.completionTime = System.currentTimeMillis(); + if (status == 1 && !quest.getRelevantMobs().isEmpty()) { + this.registerMobs(); + } + } + + public final MapleQuest getQuest() { + return this.quest; + } + + public final byte getStatus() { + return this.status; + } + + public final void setStatus(final byte status) { + this.status = status; + } + + public final int getNpc() { + return this.npc; + } + + public final void setNpc(final int npc) { + this.npc = npc; + } + + public boolean isCustom() { + return GameConstants.isCustomQuest(this.quest.getId()); + } + + private void registerMobs() { + this.killedMobs = (Map) new LinkedHashMap(); + final Iterator iterator = this.quest.getRelevantMobs().keySet().iterator(); + while (iterator.hasNext()) { + final int i = ((Integer) iterator.next()).intValue(); + this.killedMobs.put(Integer.valueOf(i), Integer.valueOf(0)); + } + } + + private int maxMob(final int mobid) { + for (final Entry qs : this.quest.getRelevantMobs().entrySet()) { + if (((Integer) qs.getKey()).intValue() == mobid) { + return ((Integer) qs.getValue()).intValue(); + } + } + return 0; + } + + public final boolean mobKilled(final int id, final int skillID) { + try { + if (this.quest != null && this.quest.getSkillID() > 0 && this.quest.getSkillID() != skillID) { + return false; + } + final Integer mob = (Integer) this.killedMobs.get(Integer.valueOf(id)); + if (mob != null) { + final int mo = this.maxMob(id); + if (mob.intValue() >= mo) { + return false; + } + this.killedMobs.put(Integer.valueOf(id), Integer.valueOf(Math.min(mob.intValue() + 1, mo))); + return true; + } else { + for (final Entry mo2 : this.killedMobs.entrySet()) { + if (this.questCount(((Integer) mo2.getKey()).intValue(), id)) { + final int mobb = this.maxMob(((Integer) mo2.getKey()).intValue()); + if (((Integer) mo2.getValue()).intValue() >= mobb) { + return false; + } + this.killedMobs.put(mo2.getKey(), Integer.valueOf(Math.min(((Integer) mo2.getValue()).intValue() + 1, mobb))); + return true; + } + } + } + } catch (Exception ex) { + ex.printStackTrace(); + FileoutputUtil.outError("logs/杀死怪物计次异常.txt", (Throwable) ex); + } + return false; + } + + private boolean questCount(final int mo, final int id) { + if (MapleLifeFactory.getQuestCount(mo) != null) { + final Iterator iterator = MapleLifeFactory.getQuestCount(mo).iterator(); + while (iterator.hasNext()) { + final int i = ((Integer) iterator.next()).intValue(); + if (i == id) { + return true; + } + } + } + return false; + } + + public final void setMobKills(final int id, final int count) { + if (this.killedMobs == null) { + this.registerMobs(); + } + this.killedMobs.put(Integer.valueOf(id), Integer.valueOf(count)); + } + + public final boolean hasMobKills() { + return this.killedMobs != null && this.killedMobs.size() > 0; + } + + public final int getMobKills(final int id) { + final Integer mob = (Integer) this.killedMobs.get(Integer.valueOf(id)); + if (mob == null) { + return 0; + } + return mob.intValue(); + } + + public final Map getMobKills() { + return this.killedMobs; + } + + public final long getCompletionTime() { + return this.completionTime; + } + + public final void setCompletionTime(final long completionTime) { + this.completionTime = completionTime; + } + + public final int getForfeited() { + return this.forfeited; + } + + public final void setForfeited(final int forfeited) { + if (forfeited >= this.forfeited) { + this.forfeited = forfeited; + return; + } + throw new IllegalArgumentException("Can't set forfeits to something lower than before."); + } + + public final void setCustomData(final String customData) { + this.customData = customData; + } + + public final String getCustomData() { + return this.customData; + } +} diff --git a/src/client/MapleStat.java b/src/client/MapleStat.java new file mode 100644 index 0000000..650623a --- /dev/null +++ b/src/client/MapleStat.java @@ -0,0 +1,68 @@ +package client; + +public enum MapleStat { + SKIN(1), + FACE(2), + HAIR(4), + LEVEL(64), + JOB(128), + STR(256), + DEX(512), + INT(1024), + LUK(2048), + HP(4096), + MAXHP(8192), + MP(16384), + MAXMP(32768), + AVAILABLEAP(65536), + AVAILABLESP(131072), + EXP(262144), + FAME(524288), + MESO(1048576), + PET(56), + GACHAPONEXP(2097152); + + private final int i; + + private MapleStat(final int i) { + this.i = i; + } + + public int getValue() { + return this.i; + } + + public static final MapleStat getByValue(final int value) { + for (final MapleStat stat : values()) { + if (stat.i == value) { + return stat; + } + } + return null; + } + + public enum Temp { + STR(1), + DEX(2), + INT(4), + LUK(8), + WATK(16), + WDEF(32), + MATK(64), + MDEF(128), + ACC(256), + AVOID(512), + SPEED(1024), + JUMP(2048); + + private final int i; + + private Temp(final int i) { + this.i = i; + } + + public int getValue() { + return this.i; + } + } +} diff --git a/src/client/MobVac.java b/src/client/MobVac.java new file mode 100644 index 0000000..1f04880 --- /dev/null +++ b/src/client/MobVac.java @@ -0,0 +1,4 @@ +package client; + +public class MobVac extends Thread { +} diff --git a/src/client/MonsterBook.java b/src/client/MonsterBook.java new file mode 100644 index 0000000..9ab04ff --- /dev/null +++ b/src/client/MonsterBook.java @@ -0,0 +1,180 @@ +package client; + +import tools.MaplePacketCreator; +import tools.packet.MonsterBookPacket; +import server.MapleItemInformationProvider; +import tools.data.MaplePacketLittleEndianWriter; + +import java.sql.ResultSet; +import java.sql.PreparedStatement; +import java.sql.Connection; +import java.sql.SQLException; + +import tools.FileoutputUtil; + +import java.util.LinkedHashMap; + +import database.DBConPool; + +import java.util.Iterator; + +import constants.GameConstants; + +import java.util.Map.Entry; +import java.util.Map; +import java.io.Serializable; + +public class MonsterBook implements Serializable { + private static final long serialVersionUID = 7179541993413738569L; + private boolean changed; + private int SpecialCard; + private int NormalCard; + private int BookLevel; + private final Map cards; + + public MonsterBook(final Map cards) { + this.changed = false; + this.SpecialCard = 0; + this.NormalCard = 0; + this.BookLevel = 1; + this.cards = cards; + for (final Entry card : cards.entrySet()) { + if (GameConstants.isSpecialCard(((Integer) card.getKey()).intValue())) { + this.SpecialCard += ((Integer) card.getValue()).intValue(); + } else { + this.NormalCard += ((Integer) card.getValue()).intValue(); + } + } + this.calculateLevel(); + } + + public Map getCards() { + return this.cards; + } + + public final int getTotalCards() { + return this.SpecialCard + this.NormalCard; + } + + public final int getLevelByCard(final int cardid) { + return (this.cards.get(Integer.valueOf(cardid)) == null) ? 0 : ((Integer) this.cards.get(Integer.valueOf(cardid))).intValue(); + } + + public static final MonsterBook loadCards(final int charid) throws SQLException { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT * FROM monsterbook WHERE charid = ? ORDER BY cardid ASC")) { + ps.setInt(1, charid); + Map cards; + try (final ResultSet rs = ps.executeQuery()) { + cards = (Map) new LinkedHashMap(); + while (rs.next()) { + cards.put(Integer.valueOf(rs.getInt("cardid")), Integer.valueOf(rs.getInt("level"))); + } + rs.close(); + } + ps.close(); + con.close(); + return new MonsterBook(cards); + } catch (SQLException ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + return null; + } + } + + public final void saveCards(final int charid, final Connection con) throws SQLException { + if (!this.changed || this.cards.isEmpty()) { + return; + } + try { + PreparedStatement ps = con.prepareStatement("DELETE FROM monsterbook WHERE charid = ?"); + ps.setInt(1, charid); + ps.execute(); + ps.close(); + boolean first = true; + final StringBuilder query = new StringBuilder(); + for (final Entry all : this.cards.entrySet()) { + if (first) { + first = false; + query.append("INSERT INTO monsterbook VALUES (DEFAULT,"); + } else { + query.append(",(DEFAULT,"); + } + query.append(charid); + query.append(","); + query.append(all.getKey()); + query.append(","); + query.append(all.getValue()); + query.append(")"); + } + ps = con.prepareStatement(query.toString()); + ps.execute(); + ps.close(); + } catch (Exception se) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) se); + } + } + + private void calculateLevel() { + final int Size = this.NormalCard + this.SpecialCard; + this.BookLevel = 8; + for (int i = 0; i < 8; ++i) { + if (Size <= GameConstants.getBookLevel(i)) { + this.BookLevel = i + 1; + break; + } + } + } + + public final void addCardPacket(final MaplePacketLittleEndianWriter mplew) { + mplew.writeShort(this.cards.size()); + for (final Entry all : this.cards.entrySet()) { + mplew.writeShort(GameConstants.getCardShortId(((Integer) all.getKey()).intValue())); + mplew.write(((Integer) all.getValue()).intValue()); + } + } + + public final void addCharInfoPacket(final int bookcover, final MaplePacketLittleEndianWriter mplew) { + mplew.writeInt(this.BookLevel); + mplew.writeInt(this.NormalCard); + mplew.writeInt(this.SpecialCard); + mplew.writeInt(this.NormalCard + this.SpecialCard); + mplew.writeInt(MapleItemInformationProvider.getInstance().getCardMobId(bookcover)); + } + + public final void updateCard(final MapleClient c, final int cardid) { + c.sendPacket(MonsterBookPacket.changeCover(cardid)); + } + + public final void addCard(final MapleClient c, final int cardid) { + this.changed = true; + c.getPlayer().getMap().broadcastMessage(c.getPlayer(), MonsterBookPacket.showForeginCardEffect(c.getPlayer().getId()), false); + if (this.cards.containsKey(Integer.valueOf(cardid))) { + final int levels = ((Integer) this.cards.get(Integer.valueOf(cardid))).intValue(); + if (levels >= 5) { + c.sendPacket(MonsterBookPacket.addCard(true, cardid, levels)); + } else { + if (GameConstants.isSpecialCard(cardid)) { + ++this.SpecialCard; + } else { + ++this.NormalCard; + } + c.sendPacket(MonsterBookPacket.addCard(false, cardid, levels)); + c.sendPacket(MonsterBookPacket.showGainCard(cardid)); + c.sendPacket(MaplePacketCreator.showSpecialEffect(15)); + this.cards.put(Integer.valueOf(cardid), Integer.valueOf(levels + 1)); + this.calculateLevel(); + } + return; + } + if (GameConstants.isSpecialCard(cardid)) { + ++this.SpecialCard; + } else { + ++this.NormalCard; + } + this.cards.put(Integer.valueOf(cardid), Integer.valueOf(1)); + c.sendPacket(MonsterBookPacket.addCard(false, cardid, 1)); + c.sendPacket(MonsterBookPacket.showGainCard(cardid)); + c.sendPacket(MaplePacketCreator.showSpecialEffect(15)); + this.calculateLevel(); + } +} diff --git a/src/client/PlayerRandomStream.java b/src/client/PlayerRandomStream.java new file mode 100644 index 0000000..1061301 --- /dev/null +++ b/src/client/PlayerRandomStream.java @@ -0,0 +1,102 @@ +package client; + +import tools.data.MaplePacketLittleEndianWriter; +import server.Randomizer; + +public class PlayerRandomStream { + private transient long seed1; + private transient long seed2; + private transient long seed3; + private transient long seed1_; + private transient long seed2_; + private transient long seed3_; + private transient long seed1__; + private transient long seed2__; + private transient long seed3__; + private transient long seed1___; + private transient long seed2___; + private transient long seed3___; + + public PlayerRandomStream() { + final int v4 = 5; + this.CRand32__Seed(Randomizer.nextLong(), 803157710L, 803157710L); + } + + public final void CRand32__Seed(final long s1, final long s2, final long s3) { + this.seed1 = (s1 | 0x100000L); + this.seed2 = (s2 | 0x1000L); + this.seed3 = (s3 | 0x10L); + this.seed1_ = (s1 | 0x100000L); + this.seed2_ = (s2 | 0x1000L); + this.seed3_ = (s3 | 0x10L); + this.seed1__ = (s1 | 0x100000L); + this.seed2__ = (s2 | 0x1000L); + this.seed3__ = (s3 | 0x10L); + } + + public final long CRand32__Random() { + final long v4 = this.seed1; + final long v5 = this.seed2; + final long v6 = this.seed3; + final long v7 = this.seed1; + final long v8 = (v4 & 0xFFFFFFFFFFFFFFFEL) << 12 ^ ((v7 & 0x7FFC0L) ^ v4 >> 13) >> 6; + final long v9 = 16L * (v5 & 0xFFFFFFFFFFFFFFF8L) ^ (v5 >> 2 ^ (v5 & 0x3F800000L)) >> 23; + final long v10 = (v6 & 0xFFFFFFFFFFFFFFF0L) << 17 ^ (v6 >> 3 ^ (v6 & 0x1FFFFF00L)) >> 8; + this.seed3_ = (v10 & 0xFFFFFFFFL); + this.seed1_ = (v8 & 0xFFFFFFFFL); + this.seed2_ = (v9 & 0xFFFFFFFFL); + return (v8 ^ v9 ^ v10) & 0xFFFFFFFFL; + } + + public final long CRand32__Random_Character() { + final long v4 = this.seed1_; + final long v5 = this.seed2_; + final long v6 = this.seed3_; + final long v7 = this.seed1_; + final long v8 = (v4 & 0xFFFFFFFFFFFFFFFEL) << 12 ^ ((v7 & 0x7FFC0L) ^ v4 >> 13) >> 6; + final long v9 = 16L * (v5 & 0xFFFFFFFFFFFFFFF8L) ^ (v5 >> 2 ^ (v5 & 0x3F800000L)) >> 23; + final long v10 = (v6 & 0xFFFFFFFFFFFFFFF0L) << 17 ^ (v6 >> 3 ^ (v6 & 0x1FFFFF00L)) >> 8; + this.seed3_ = (v10 & 0xFFFFFFFFL); + this.seed1_ = (v8 & 0xFFFFFFFFL); + this.seed2_ = (v9 & 0xFFFFFFFFL); + return (v8 ^ v9 ^ v10) & 0xFFFFFFFFL; + } + + public final long CRand32__Random_CheckDamageMiss() { + final long v4 = this.seed1__; + final long v5 = this.seed2__; + final long v6 = this.seed3__; + final long v7 = this.seed1__; + final long v8 = (v4 & 0xFFFFFFFFFFFFFFFEL) << 12 ^ ((v7 & 0x7FFC0L) ^ v4 >> 13) >> 6; + final long v9 = 16L * (v5 & 0xFFFFFFFFFFFFFFF8L) ^ (v5 >> 2 ^ (v5 & 0x3F800000L)) >> 23; + final long v10 = (v6 & 0xFFFFFFFFFFFFFFF0L) << 17 ^ (v6 >> 3 ^ (v6 & 0x1FFFFF00L)) >> 8; + this.seed3_ = (v10 & 0xFFFFFFFFL); + this.seed1_ = (v8 & 0xFFFFFFFFL); + this.seed2_ = (v9 & 0xFFFFFFFFL); + return (v8 ^ v9 ^ v10) & 0xFFFFFFFFL; + } + + public final long CRand32__Random_ForMonster() { + final long v4 = this.seed1___; + final long v5 = this.seed2___; + final long v6 = this.seed3___; + final long v7 = this.seed1___; + final long v8 = (v4 & 0xFFFFFFFFFFFFFFFEL) << 12 ^ ((v7 & 0x7FFC0L) ^ v4 >> 13) >> 6; + final long v9 = 16L * (v5 & 0xFFFFFFFFFFFFFFF8L) ^ (v5 >> 2 ^ (v5 & 0x3F800000L)) >> 23; + final long v10 = (v6 & 0xFFFFFFFFFFFFFFF0L) << 17 ^ (v6 >> 3 ^ (v6 & 0x1FFFFF00L)) >> 8; + this.seed3_ = (v10 & 0xFFFFFFFFL); + this.seed1_ = (v8 & 0xFFFFFFFFL); + this.seed2_ = (v9 & 0xFFFFFFFFL); + return (v8 ^ v9 ^ v10) & 0xFFFFFFFFL; + } + + public final void connectData(final MaplePacketLittleEndianWriter mplew) { + final long v5 = this.CRand32__Random(); + final long s2 = this.CRand32__Random(); + final long v6 = this.CRand32__Random(); + this.CRand32__Seed(v5, s2, v6); + mplew.writeInt((int) v5); + mplew.writeInt((int) s2); + mplew.writeInt((int) v6); + } +} diff --git a/src/client/PlayerStats.java b/src/client/PlayerStats.java new file mode 100644 index 0000000..6ed9f65 --- /dev/null +++ b/src/client/PlayerStats.java @@ -0,0 +1,1515 @@ +package client; + +import client.inventory.Item; +import tools.data.MaplePacketLittleEndianWriter; +import client.inventory.MapleWeaponType; +import client.inventory.ModifyInventory; +import server.MapleInventoryManipulator; +import tools.MaplePacketCreator; + +import java.util.Collection; + +import server.MapleStatEffect; +import server.StructSetItem; + +import java.util.Iterator; +import java.util.Calendar; + +import server.StructSetItem.SetItem; + +import java.util.Map.Entry; + +import server.StructPotentialItem; +import tools.Pair; +import gui.Start; +import client.inventory.IEquip; +import client.inventory.IItem; +import client.inventory.MapleInventoryType; +import constants.GameConstants; +import server.MapleItemInformationProvider; + +import java.util.HashMap; +import java.util.ArrayList; +import java.util.concurrent.locks.ReentrantLock; + +import client.inventory.Equip; + +import java.util.List; +import java.util.Map; +import java.lang.ref.WeakReference; +import java.io.Serializable; + +public class PlayerStats implements Serializable { + private static final long serialVersionUID = -679541993413738569L; + private final transient WeakReference chr; + private final Map setHandling; + private final List durabilityHandling; + private final List equipLevelHandling; + private transient float shouldHealHP; + private transient float shouldHealMP; + public short str; + public short dex; + public short luk; + public short int_; + public short hp; + public short maxhp; + public short mp; + public short maxmp; + private transient short passive_sharpeye_percent; + private transient short localmaxhp; + private transient short localmaxmp; + private transient byte passive_mastery; + private transient byte passive_sharpeye_rate; + private transient int localstr; + private transient int localdex; + private transient int localluk; + private transient int localint_; + private transient int magic; + private transient int watk; + private transient int hands; + private transient int accuracy; + public transient boolean equippedWelcomeBackRing; + public transient boolean equippedFairy; + public transient boolean hasMeso; + public transient boolean hasItem; + public transient boolean hasVac; + public transient boolean hasClone; + public transient boolean hasPartyBonus; + public transient boolean Berserk; + public transient boolean isRecalc; + public transient boolean equippedRing; + public transient int equipmentBonusExp; + public transient int expMod; + public transient int dropMod; + public transient int cashMod; + public transient int levelBonus; + public transient double expBuff; + public transient double dropBuff; + public transient double mesoBuff; + public transient double cashBuff; + public transient double realExpBuff; + public transient double realDropBuff; + public transient double realMesoBuff; + public transient double realCashBuff; + public transient double dam_r; + public transient double bossdam_r; + public transient double dropm; + public transient double expm; + public transient int recoverHP; + public transient int recoverMP; + public transient int mpconReduce; + public transient int incMesoProp; + public transient int incRewardProp; + public transient int DAMreflect; + public transient int DAMreflect_rate; + public transient int mpRestore; + public transient int hpRecover; + public transient int hpRecoverProp; + public transient int mpRecover; + public transient int mpRecoverProp; + public transient int RecoveryUP; + public transient int incAllskill; + private transient float speedMod; + private transient float jumpMod; + private transient float localmaxbasedamage; + public transient int def; + public transient int element_ice; + public transient int element_fire; + public transient int element_light; + public transient int element_psn; + public static final short maxStr = 999; + public ReentrantLock lock; + public short pickRate; + public int defRange; + public transient int dotTime; + public transient int harvestingTool; + + public PlayerStats(final MapleCharacter chr) { + this.equipLevelHandling = (List) new ArrayList(); + this.Berserk = false; + this.isRecalc = false; + this.lock = new ReentrantLock(); + this.setHandling = (Map) new HashMap(); + this.durabilityHandling = (List) new ArrayList(); + this.chr = new WeakReference(chr); + } + + public final void init() { + this.recalcLocalStats(); + this.relocHeal(); + } + + public final short getStr() { + return this.str; + } + + public final short getDex() { + return this.dex; + } + + public final short getLuk() { + return this.luk; + } + + public final short getInt() { + return this.int_; + } + + public final void setStr(final short str) { + this.str = str; + this.recalcLocalStats(); + } + + public final void setDex(final short dex) { + this.dex = dex; + this.recalcLocalStats(); + } + + public final void setLuk(final short luk) { + this.luk = luk; + this.recalcLocalStats(); + } + + public final void setInt(final short int_) { + this.int_ = int_; + this.recalcLocalStats(); + } + + public final boolean setHp(final int newhp) { + return this.setHp(newhp, false); + } + + public final boolean setHp(final int newhp, final boolean silent) { + final short oldHp = this.hp; + int thp = newhp; + if (thp < 0) { + thp = 0; + } + if (thp > this.localmaxhp) { + thp = this.localmaxhp; + } + this.hp = (short) thp; + final MapleCharacter chra = (MapleCharacter) this.chr.get(); + if (chra != null) { + if (!silent) { + chra.updatePartyMemberHP(); + } + if (oldHp > this.hp && !chra.isAlive()) { + chra.playerDead(); + } + } + return this.hp != oldHp; + } + + public final boolean setMp(final int newmp) { + final short oldMp = this.mp; + int tmp = newmp; + if (tmp < 0) { + tmp = 0; + } + if (tmp > this.localmaxmp) { + tmp = this.localmaxmp; + } + this.mp = (short) tmp; + return this.mp != oldMp; + } + + public final void setMaxHp(final short hp) { + this.maxhp = hp; + this.recalcLocalStats(); + } + + public final void setMaxMp(final short mp) { + this.maxmp = mp; + this.recalcLocalStats(); + } + + public final short getHp() { + return this.hp; + } + + public final short getMaxHp() { + return this.maxhp; + } + + public final short getMp() { + return this.mp; + } + + public final short getMaxMp() { + return this.maxmp; + } + + public final int getTotalDex() { + return this.localdex; + } + + public final int getTotalInt() { + return this.localint_; + } + + public final int getTotalStr() { + return this.localstr; + } + + public final int getTotalLuk() { + return this.localluk; + } + + public final int getTotalMagic() { + return this.magic; + } + + public final double getSpeedMod() { + return (double) this.speedMod; + } + + public final double getJumpMod() { + return (double) this.jumpMod; + } + + public final int getTotalWatk() { + return this.watk; + } + + public final short getCurrentMaxHp() { + return this.localmaxhp; + } + + public final short getCurrentMaxMp() { + return this.localmaxmp; + } + + public final int getHands() { + return this.hands; + } + + public final float getCurrentMaxBaseDamage() { + return this.localmaxbasedamage; + } + + public void recalcLocalStats() { + this.recalcLocalStats(false); + } + + public void recalcLocalStats(final boolean first_login) { + final MapleCharacter chra = (MapleCharacter) this.chr.get(); + if (chra == null) { + return; + } + if (this.isRecalc) { + return; + } + this.isRecalc = true; + final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); + final int oldmaxhp = this.localmaxhp; + int localmaxhp_ = this.getMaxHp(); + int localmaxmp_ = this.getMaxMp(); + this.localdex = this.getDex(); + this.localint_ = this.getInt(); + this.localstr = this.getStr(); + this.localluk = this.getLuk(); + int speed = 100; + int jump = 100; + this.dotTime = 0; + int percent_hp = 0; + int percent_mp = 0; + int percent_str = 0; + int percent_dex = 0; + int percent_int = 0; + int percent_luk = 0; + int percent_acc = 0; + int percent_atk = 0; + int percent_matk = 0; + int added_sharpeye_rate = 0; + int added_sharpeye_dmg = 0; + this.magic = this.localint_; + this.watk = 0; + if (chra.getJob() == 500 || (chra.getJob() >= 520 && chra.getJob() <= 522)) { + this.watk = 20; + } else if (chra.getJob() == 400 || (chra.getJob() >= 410 && chra.getJob() <= 412) || (chra.getJob() >= 1400 && chra.getJob() <= 1412)) { + this.watk = 30; + } + this.dam_r = 100.0; + this.bossdam_r = 100.0; + this.realExpBuff = 100.0; + this.realCashBuff = 100.0; + this.realDropBuff = 100.0; + this.realMesoBuff = 100.0; + this.expBuff = 100.0; + this.cashBuff = 100.0; + this.dropBuff = 100.0; + this.mesoBuff = 100.0; + this.recoverHP = 0; + this.recoverMP = 0; + this.mpconReduce = 0; + this.incMesoProp = 0; + this.incRewardProp = 0; + this.DAMreflect = 0; + this.DAMreflect_rate = 0; + this.hpRecover = 0; + this.hpRecoverProp = 0; + this.mpRecover = 0; + this.mpRecoverProp = 0; + this.mpRestore = 0; + this.equippedWelcomeBackRing = false; + this.equippedRing = false; + this.equippedFairy = false; + this.hasMeso = false; + this.hasItem = false; + this.hasPartyBonus = false; + this.hasVac = false; + this.hasClone = false; + final boolean canEquipLevel = chra.getLevel() >= 120 && !GameConstants.isKOC((int) chra.getJob()); + this.equipmentBonusExp = 0; + this.RecoveryUP = 0; + this.dropMod = 1; + this.dropm = 1.0; + this.expMod = 1; + this.expm = 1.0; + this.cashMod = 1; + this.levelBonus = 0; + this.incAllskill = 0; + this.durabilityHandling.clear(); + this.equipLevelHandling.clear(); + this.setHandling.clear(); + this.element_fire = 100; + this.element_ice = 100; + this.element_light = 100; + this.element_psn = 100; + this.def = 100; + this.defRange = 0; + for (final IItem item : chra.getInventory(MapleInventoryType.EQUIPPED)) { + final IEquip equip = (IEquip) item; + if (equip.getPosition() == -11 && GameConstants.isMagicWeapon(equip.getItemId())) { + final Map eqstat = MapleItemInformationProvider.getInstance().getEquipStats(equip.getItemId()); + this.element_fire = ((Integer) eqstat.get("incRMAF")).intValue(); + this.element_ice = ((Integer) eqstat.get("incRMAI")).intValue(); + this.element_light = ((Integer) eqstat.get("incRMAL")).intValue(); + this.element_psn = ((Integer) eqstat.get("incRMAS")).intValue(); + this.def = ((Integer) eqstat.get("elemDefault")).intValue(); + } + this.accuracy += equip.getAcc(); + localmaxhp_ += equip.getHp(); + localmaxmp_ += equip.getMp(); + this.localdex += equip.getDex(); + this.localint_ += equip.getInt(); + this.localstr += equip.getStr(); + this.localluk += equip.getLuk(); + this.magic += equip.getMatk() + equip.getInt(); + this.watk += equip.getWatk(); + speed += equip.getSpeed(); + jump += equip.getJump(); + switch (equip.getItemId()) { + case 1112427: { + added_sharpeye_rate += 5; + added_sharpeye_dmg += 20; + break; + } + case 1112428: { + added_sharpeye_rate += 10; + added_sharpeye_dmg += 10; + break; + } + case 1112429: { + added_sharpeye_rate += 5; + added_sharpeye_dmg += 20; + break; + } + case 1112127: { + this.equippedWelcomeBackRing = true; + break; + } + case 1114000: { + this.equippedRing = true; + break; + } + case 1122017: + case 1122086: + case 1122207: + case 1122215: { + this.equippedFairy = true; + break; + } + case 1812000: { + this.hasMeso = true; + break; + } + case 1812001: { + this.hasItem = true; + break; + } + default: { + for (int a = 0; a < Start.经验加成表.size(); ++a) { + final int eb_bonus = Integer.parseInt((String) (Start.经验加成表.get(a)).getLeft()); + if (equip.getItemId() == eb_bonus) { + this.equipmentBonusExp += GameConstants.Equipment_Bonus_EXP(eb_bonus); + } + } + break; + } + } + percent_hp += equip.getHpR(); + percent_mp += equip.getMpR(); + final int set = ii.getSetItemID(equip.getItemId()); + if (set > 0) { + int value = 1; + if (this.setHandling.get(Integer.valueOf(set)) != null) { + value += ((Integer) this.setHandling.get(Integer.valueOf(set))).intValue(); + } + this.setHandling.put(Integer.valueOf(set), Integer.valueOf(value)); + } + if (equip.getState() > 1) { + final int[] array; + final int[] potentials = array = new int[]{equip.getPotential1(), equip.getPotential2(), equip.getPotential3()}; + for (final int i : array) { + if (i > 0) { + final StructPotentialItem pot = (StructPotentialItem) ii.getPotentialInfo(i).get(ii.getReqLevel(equip.getItemId()) / 10); + if (pot != null) { + this.localstr += pot.incSTR; + this.localdex += pot.incDEX; + this.localint_ += pot.incINT; + this.localluk += pot.incLUK; + this.localmaxhp += pot.incMHP; + this.localmaxmp += pot.incMMP; + this.watk += pot.incPAD; + this.magic += pot.incINT + pot.incMAD; + speed += pot.incSpeed; + jump += pot.incJump; + this.accuracy += pot.incACC; + this.incAllskill += pot.incAllskill; + percent_hp += pot.incMHPr; + percent_mp += pot.incMMPr; + percent_str += pot.incSTRr; + percent_dex += pot.incDEXr; + percent_int += pot.incINTr; + percent_luk += pot.incLUKr; + percent_acc += pot.incACCr; + percent_atk += pot.incPADr; + percent_matk += pot.incMADr; + added_sharpeye_rate += pot.incCr; + added_sharpeye_dmg += pot.incCr; + if (!pot.boss) { + this.dam_r = Math.max((double) pot.incDAMr, this.dam_r); + } else { + this.bossdam_r = Math.max((double) pot.incDAMr, this.bossdam_r); + } + this.recoverHP += pot.RecoveryHP; + this.recoverMP += pot.RecoveryMP; + this.RecoveryUP += pot.RecoveryUP; + if (pot.HP > 0) { + this.hpRecover += pot.HP; + this.hpRecoverProp += pot.prop; + } + if (pot.MP > 0) { + this.mpRecover += pot.MP; + this.mpRecoverProp += pot.prop; + } + this.mpconReduce += pot.mpconReduce; + this.incMesoProp += pot.incMesoProp; + this.incRewardProp += pot.incRewardProp; + if (pot.DAMreflect > 0) { + this.DAMreflect += pot.DAMreflect; + this.DAMreflect_rate += pot.prop; + } + this.mpRestore += pot.mpRestore; + if (!first_login && pot.skillID > 0) { + chra.changeSkillLevel_Skip(SkillFactory.getSkill(this.getSkillByJob((int) pot.skillID, (int) chra.getJob())), (byte) 1, (byte) 1); + } + } + } + } + } + if (equip.getDurability() > 0) { + this.durabilityHandling.add((Equip) equip); + } + if (canEquipLevel && GameConstants.getMaxLevel(equip.getItemId()) > 0) { + if (GameConstants.getStatFromWeapon(equip.getItemId()) == null) { + if (equip.getEquipLevel() > GameConstants.getMaxLevel(equip.getItemId())) { + continue; + } + } else if (equip.getEquipLevel() >= GameConstants.getMaxLevel(equip.getItemId())) { + continue; + } + this.equipLevelHandling.add((Equip) equip); + } + } + for (final Entry entry : this.setHandling.entrySet()) { + final StructSetItem set2 = ii.getSetItem(((Integer) entry.getKey()).intValue()); + if (set2 != null) { + final Map itemz = set2.getItems(); + for (final Entry ent : itemz.entrySet()) { + if (((Integer) ent.getKey()).intValue() <= ((Integer) entry.getValue()).intValue()) { + final SetItem se = (SetItem) ent.getValue(); + this.localstr += se.incSTR; + this.localdex += se.incDEX; + this.localint_ += se.incINT; + this.localluk += se.incLUK; + this.watk += se.incPAD; + this.magic += se.incINT + se.incMAD; + speed += se.incSpeed; + this.accuracy += se.incACC; + localmaxhp_ += se.incMHP; + localmaxmp_ += se.incMMP; + } + } + } + } + final int hour = Calendar.getInstance().get(11); + final int weekDay = Calendar.getInstance().get(7); + if (chra.getMarriageId() > 0) { + this.expm = 1.1; + this.dropm = 1.1; + } + this.expMod = 1; + this.dropMod = 1; + for (final IItem item2 : chra.getInventory(MapleInventoryType.CASH)) { + if (this.expMod < 3 && (item2.getItemId() == 5211060 || item2.getItemId() == 5211050 || item2.getItemId() == 5211051 || item2.getItemId() == 5211052 || item2.getItemId() == 5211053 || item2.getItemId() == 5211054)) { + this.expMod = 3; + } else if (this.expMod < 2 && (item2.getItemId() == 5211061 || item2.getItemId() == 5211000 || item2.getItemId() == 5211001 || item2.getItemId() == 5211002 || item2.getItemId() == 5211003 || item2.getItemId() == 5211046 || item2.getItemId() == 5211047 || item2.getItemId() == 5211048 || item2.getItemId() == 5211049)) { + this.expMod = 2; + } else if (this.expMod < 2 && (item2.getItemId() == 5210002 || item2.getItemId() == 5210003) && ((hour >= 6 && hour <= 18 && weekDay >= 2 && weekDay <= 6) || weekDay == 1 || weekDay == 7)) { + this.expMod = 2; + } else if (this.expMod < 2 && (item2.getItemId() == 5210004 || item2.getItemId() == 5210005 || item2.getItemId() == 521000) && (((hour >= 18 || hour <= 6) && weekDay >= 2 && weekDay <= 6) || weekDay == 1 || weekDay == 7)) { + this.expMod = 2; + } else if (this.expMod < 2 && (item2.getItemId() == 5210000 || item2.getItemId() == 5210001) && ((hour >= 10 && hour <= 22 && weekDay >= 2 && weekDay <= 6) || weekDay == 1 || weekDay == 7)) { + this.expMod = 2; + } + if (this.dropMod == 1) { + if (item2.getItemId() == 5360015 || item2.getItemId() == 5360014 || item2.getItemId() == 5360016) { + this.dropMod = 2; + } else if (item2.getItemId() == 5360018 && hour >= 0 && hour <= 24) { //10倍爆率卡 + this.dropMod = 10; + } else if (item2.getItemId() == 5360000 && hour >= 0 && hour <= 6) { + this.dropMod = 2; + } else if (item2.getItemId() == 5360001 && hour >= 6 && hour <= 12) { + this.dropMod = 2; + } else if (item2.getItemId() == 5360002 && hour >= 12 && hour <= 18) { + this.dropMod = 2; + } else if (item2.getItemId() == 5360003 && hour >= 18 && hour <= 24) { + this.dropMod = 2; + } + + + } + if (item2.getItemId() == 5650000) { + this.hasPartyBonus = true; + } else if (item2.getItemId() == 5590001) { + this.levelBonus = 10; + } else { + if (this.levelBonus != 0 || item2.getItemId() != 5590000) { + continue; + } + this.levelBonus = 5; + } + } + for (final IItem item2 : chra.getInventory(MapleInventoryType.ETC)) { + switch (item2.getItemId()) { + case 5062000: { + this.hasVac = true; + continue; + } + case 4030004: { + this.hasClone = true; + continue; + } + case 4030005: { + this.cashMod = 2; + continue; + } + case 4101000: + case 4101002: { + this.equippedFairy = true; + chra.setFairyExp((byte) 30); + continue; + } + } + } + for (final IItem item2 : chra.getInventory(MapleInventoryType.CASH)) { + switch (item2.getItemId()) { + case 5062000: { + this.hasVac = true; + continue; + } + } + } + this.magic += chra.getSkillLevel(SkillFactory.getSkill(22000000)); + this.localstr = (int) ((float) this.localstr + (float) (percent_str * this.localstr) / 100.0f); + this.localdex = (int) ((float) this.localdex + (float) (percent_dex * this.localdex) / 100.0f); + final int before_ = this.localint_; + this.localint_ = (int) ((float) this.localint_ + (float) (percent_int * this.localint_) / 100.0f); + this.magic += this.localint_ - before_; + this.localluk = (int) ((float) this.localluk + (float) (percent_luk * this.localluk) / 100.0f); + this.accuracy = (int) ((float) this.accuracy + (float) (percent_acc * this.accuracy) / 100.0f); + this.watk = (int) ((float) this.watk + (float) (percent_atk * this.watk) / 100.0f); + this.magic = (int) ((float) this.magic + (float) (percent_matk * this.magic) / 100.0f); + localmaxhp_ = (int) ((float) localmaxhp_ + (float) (percent_hp * localmaxhp_) / 100.0f); + localmaxmp_ = (int) ((float) localmaxmp_ + (float) (percent_mp * localmaxmp_) / 100.0f); + this.magic = Math.min(this.magic, 1999); + Integer buff = chra.getBuffedValue(MapleBuffStat.MAPLE_WARRIOR); + if (buff != null) { + final double d = buff.doubleValue() / 100.0; + this.localstr = (int) ((double) this.localstr + d * (double) this.str); + this.localdex = (int) ((double) this.localdex + d * (double) this.dex); + this.localluk = (int) ((double) this.localluk + d * (double) this.luk); + final int before = this.localint_; + this.localint_ = (int) ((double) this.localint_ + d * (double) this.int_); + this.magic += this.localint_ - before; + } + buff = chra.getBuffedValue(MapleBuffStat.ECHO_OF_HERO); + if (buff != null) { + final double d = buff.doubleValue() / 100.0; + this.watk += (int) ((double) this.watk * d); + this.magic += (int) ((double) this.magic * d); + } + buff = chra.getBuffedValue(MapleBuffStat.ARAN_COMBO); + if (buff != null) { + this.watk += buff.intValue() / 10; + } + buff = chra.getBuffedValue(MapleBuffStat.MAXHP); + if (buff != null) { + localmaxhp_ = (int) ((double) localmaxhp_ + buff.doubleValue() / 100.0 * (double) localmaxhp_); + } + buff = chra.getBuffedValue(MapleBuffStat.MAXMP); + if (buff != null) { + localmaxmp_ = (int) ((double) localmaxmp_ + buff.doubleValue() / 100.0 * (double) localmaxmp_); + } + switch (chra.getJob()) { + case 322: { + final ISkill expert = SkillFactory.getSkill(3220004); + final int boostLevel = chra.getSkillLevel(expert); + if (boostLevel > 0) { + this.watk += expert.getEffect(boostLevel).getX(); + break; + } + break; + } + case 312: { + final ISkill expert = SkillFactory.getSkill(3120005); + final int boostLevel = chra.getSkillLevel(expert); + if (boostLevel > 0) { + this.watk += expert.getEffect(boostLevel).getX(); + break; + } + break; + } + case 211: + case 212: { + final ISkill amp = SkillFactory.getSkill(2110001); + final int level = chra.getSkillLevel(amp); + if (level > 0) { + this.dam_r *= (double) amp.getEffect(level).getY() / 100.0; + this.bossdam_r *= (double) amp.getEffect(level).getY() / 100.0; + break; + } + break; + } + case 221: + case 222: { + final ISkill amp = SkillFactory.getSkill(2210001); + final int level = chra.getSkillLevel(amp); + if (level > 0) { + this.dam_r *= (double) amp.getEffect(level).getY() / 100.0; + this.bossdam_r *= (double) amp.getEffect(level).getY() / 100.0; + break; + } + break; + } + case 1211: + case 1212: { + final ISkill amp = SkillFactory.getSkill(12110001); + final int level = chra.getSkillLevel(amp); + if (level > 0) { + this.dam_r *= (double) amp.getEffect(level).getY() / 100.0; + this.bossdam_r *= (double) amp.getEffect(level).getY() / 100.0; + break; + } + break; + } + case 2112: { + final ISkill expert = SkillFactory.getSkill(21120001); + final int boostLevel = chra.getSkillLevel(expert); + if (boostLevel > 0) { + this.watk += expert.getEffect(boostLevel).getX(); + break; + } + break; + } + } + final ISkill blessoffairy = SkillFactory.getSkill(GameConstants.getBofForJob((int) chra.getJob())); + final int boflevel = chra.getSkillLevel(blessoffairy); + if (boflevel > 0) { + this.watk += blessoffairy.getEffect(boflevel).getX(); + this.magic += blessoffairy.getEffect(boflevel).getY(); + this.accuracy += blessoffairy.getEffect(boflevel).getX(); + } + buff = chra.getBuffedValue(MapleBuffStat.EXPRATE); + if (buff != null) { + this.expBuff *= buff.doubleValue() / 100.0; + this.realExpBuff += buff.doubleValue(); + } + if (chra.isBuffedValue(2382046)) { + this.realMesoBuff += 100.0; + this.mesoBuff *= 2.0; + this.realDropBuff += 200.0; + this.dropBuff *= 3.0; + } else if (chra.isBuffedValue(2382028)) { + this.realMesoBuff += 100.0; + this.mesoBuff *= 2.0; + this.realDropBuff += 200.0; + this.dropBuff *= 3.0; + } + buff = chra.getBuffedValue(MapleBuffStat.DROP_RATE); + if (buff != null) { + if (chra.getBuffSource(MapleBuffStat.DROP_RATE) == 2382028) { + switch (chra.getMapId()) { + case 100040101: + case 100040102: + case 100040103: + case 100040104: + case 107000401: + case 107000402: + case 107000403: + case 191000000: { + this.realDropBuff += buff.doubleValue(); + this.dropBuff *= buff.doubleValue() / 100.0; + break; + } + } + } else if (chra.getBuffSource(MapleBuffStat.DROP_RATE) == 2382028) { + switch (chra.getMapId()) { + case 222020100: + case 222020200: + case 222020300: { + this.realDropBuff += buff.doubleValue(); + this.dropBuff *= buff.doubleValue() / 100.0; + break; + } + } + } else if (chra.getBuffSource(MapleBuffStat.DROP_RATE) == 2022462) { + this.realDropBuff += 50.0; + this.dropBuff *= 1.5; + } else if (chra.getBuffSource(MapleBuffStat.DROP_RATE) == 2382001) { + this.realMesoBuff += 100.0; + this.mesoBuff *= 2.0; + this.realDropBuff += 200.0; + this.dropBuff *= 3.0; + } else if (chra.getBuffSource(MapleBuffStat.DROP_RATE) == 2382040) { + this.realMesoBuff += 100.0; + this.mesoBuff *= 2.0; + this.realDropBuff += 200.0; + this.dropBuff *= 3.0; + } else if (chra.getBuffSource(MapleBuffStat.DROP_RATE) == 2383003) { + this.realMesoBuff += 100.0; + this.mesoBuff *= 2.0; + this.realDropBuff += 200.0; + this.dropBuff *= 3.0; + } else if (chra.getBuffSource(MapleBuffStat.DROP_RATE) == 2383006) { + this.realDropBuff += 300.0; + this.dropBuff *= 4.0; + } else { + this.realDropBuff += buff.doubleValue(); + this.dropBuff *= buff.doubleValue() / 100.0; + } + } + buff = chra.getBuffedValue(MapleBuffStat.ACASH_RATE); + if (buff != null) { + this.realCashBuff += buff.doubleValue(); + this.cashBuff *= buff.doubleValue() / 100.0; + } + buff = chra.getBuffedValue(MapleBuffStat.MESO_RATE); + if (buff != null) { + if (chra.getBuffSource(MapleBuffStat.MESO_RATE) == 2382005 || chra.getBuffSource(MapleBuffStat.MESO_RATE) == 2382016) { + if (chra.getMapId() >= 221020000 && chra.getMapId() <= 221024400) { + this.mesoBuff *= buff.doubleValue() / 100.0; + this.realMesoBuff += buff.doubleValue(); + } + } else if (chra.getBuffSource(MapleBuffStat.MESO_RATE) == 2022459) { + this.realMesoBuff += 30.0; + this.mesoBuff *= 1.3; + } else if (chra.getBuffSource(MapleBuffStat.MESO_RATE) == 2022460) { + this.realMesoBuff += 50.0; + this.mesoBuff *= 1.5; + } else { + this.realMesoBuff += buff.doubleValue(); + this.mesoBuff *= buff.doubleValue() / 100.0; + } + } + buff = chra.getBuffedValue(MapleBuffStat.MESOUP); + if (buff != null) { + this.realMesoBuff += buff.doubleValue(); + this.mesoBuff *= buff.doubleValue() / 100.0; + } + buff = chra.getBuffedValue(MapleBuffStat.ACC); + if (buff != null) { + this.accuracy += buff.intValue(); + } + buff = chra.getBuffedValue(MapleBuffStat.WATK); + if (buff != null) { + this.watk += buff.intValue(); + } + buff = chra.getBuffedValue(MapleBuffStat.MATK); + if (buff != null) { + this.magic += buff.intValue(); + } + buff = chra.getBuffedValue(MapleBuffStat.SPEED); + if (buff != null) { + speed += buff.intValue(); + } + buff = chra.getBuffedValue(MapleBuffStat.JUMP); + if (buff != null) { + jump += buff.intValue(); + } + buff = chra.getBuffedValue(MapleBuffStat.DASH_SPEED); + if (buff != null) { + speed += buff.intValue(); + } + buff = chra.getBuffedValue(MapleBuffStat.DASH_JUMP); + if (buff != null) { + jump += buff.intValue(); + } + buff = chra.getBuffedValue(MapleBuffStat.WIND_WALK); + if (buff != null) { + final MapleStatEffect eff = chra.getStatForBuff(MapleBuffStat.WIND_WALK); + this.dam_r *= (double) eff.getDamage() / 100.0; + this.bossdam_r *= (double) eff.getDamage() / 100.0; + } + buff = chra.getBuffedSkill_Y(MapleBuffStat.OWL_SPIRIT); + if (buff != null) { + this.dam_r *= buff.doubleValue() / 100.0; + this.bossdam_r *= buff.doubleValue() / 100.0; + } + buff = chra.getBuffedValue(MapleBuffStat.BERSERK_FURY); + if (buff != null) { + this.dam_r *= 2.0; + this.bossdam_r *= 2.0; + } + final ISkill bx = SkillFactory.getSkill(1320006); + if (chra.getSkillLevel(bx) > 0) { + this.dam_r *= (double) bx.getEffect((int) chra.getSkillLevel(bx)).getDamage() / 100.0; + this.bossdam_r *= (double) bx.getEffect((int) chra.getSkillLevel(bx)).getDamage() / 100.0; + } + buff = chra.getBuffedValue(MapleBuffStat.WK_CHARGE); + if (buff != null) { + final MapleStatEffect eff2 = chra.getStatForBuff(MapleBuffStat.WK_CHARGE); + this.dam_r *= (double) eff2.getDamage() / 100.0; + this.bossdam_r *= (double) eff2.getDamage() / 100.0; + } + buff = chra.getBuffedValue(MapleBuffStat.MONSTER_RIDING); + if (buff != null) { + final MapleStatEffect eff2 = chra.getStatForBuff(MapleBuffStat.MONSTER_RIDING); + this.pickRate = eff2.getProb(); + } + buff = chra.getBuffedValue(MapleBuffStat.LIGHTNING_CHARGE); + if (buff != null) { + final MapleStatEffect eff2 = chra.getStatForBuff(MapleBuffStat.LIGHTNING_CHARGE); + this.dam_r *= (double) eff2.getDamage() / 100.0; + this.bossdam_r *= (double) eff2.getDamage() / 100.0; + } + buff = chra.getBuffedSkill_X(MapleBuffStat.SHARP_EYES); + if (buff != null) { + added_sharpeye_rate += buff.intValue(); + } + buff = chra.getBuffedSkill_Y(MapleBuffStat.SHARP_EYES); + if (buff != null) { + added_sharpeye_dmg += buff.intValue() - 100; + } + if (speed > 140) { + speed = 140; + } + if (jump > 123) { + jump = 123; + } + this.speedMod = (float) speed / 100.0f; + this.jumpMod = (float) jump / 100.0f; + final Integer mount = chra.getBuffedValue(MapleBuffStat.MONSTER_RIDING); + if (mount != null) { + this.jumpMod = 1.23f; + switch (mount.intValue()) { + case 1: { + this.speedMod = 1.5f; + break; + } + case 2: { + this.speedMod = 1.7f; + break; + } + case 3: { + this.speedMod = 1.8f; + break; + } + default: { + System.err.println("Unhandeled monster riding level, Speedmod = " + this.speedMod + ""); + break; + } + } + } + this.hands = this.localdex + this.localint_ + this.localluk; + this.localmaxhp = (short) Math.min(30000, Math.abs(Math.max(-30000, localmaxhp_))); + this.localmaxmp = (short) Math.min(30000, Math.abs(Math.max(-30000, localmaxmp_))); + this.CalcPassive_SharpEye(chra, added_sharpeye_rate, added_sharpeye_dmg); + this.CalcPassive_Mastery(chra); + this.CalcPassive_Range(chra); + if (first_login) { + chra.silentEnforceMaxHpMp(); + } else { + chra.enforceMaxHpMp(); + } + this.localmaxbasedamage = this.calculateMaxBaseDamage(this.magic, this.watk); + if (oldmaxhp != 0 && oldmaxhp != this.localmaxhp) { + chra.updatePartyMemberHP(); + } + this.isRecalc = false; + } + + public boolean checkEquipLevels(final MapleCharacter chr, final long gain) { + boolean changed = false; + final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); + final List all = new ArrayList(this.equipLevelHandling); + for (Equip eq : all) { + final int lvlz = eq.getEquipLevel(); + eq.setItemEXP(Math.min(eq.getItemEXP() + gain, Integer.MAX_VALUE)); + if (eq.getEquipLevel() > lvlz) { + for (int i = eq.getEquipLevel() - lvlz; i > 0; --i) { + final Map> inc = ii.getEquipIncrements(eq.getItemId()); + if (inc != null && inc.containsKey(Integer.valueOf(lvlz + i))) { + eq = ii.levelUpEquip(eq, inc.get(Integer.valueOf(lvlz + i))); + } + if (GameConstants.getStatFromWeapon(eq.getItemId()) == null) { + final Map> ins = ii.getEquipSkills(eq.getItemId()); + if (ins != null && ins.containsKey(Integer.valueOf(lvlz + i))) { + for (final Integer z : ins.get(Integer.valueOf(lvlz + i))) { + if (Math.random() < 0.1) { + final ISkill skil = SkillFactory.getSkill(z.intValue()); + if (skil == null || !skil.canBeLearnedBy((int) chr.getJob()) || chr.getSkillLevel(skil) >= chr.getMasterLevel(skil)) { + continue; + } + chr.changeSkillLevel(skil, (byte) (chr.getSkillLevel(skil) + 1), chr.getMasterLevel(skil)); + } + } + } + } + } + changed = true; + } + chr.forceReAddItem_Flag(eq.copy(), MapleInventoryType.EQUIPPED); + } + if (changed) { + chr.equipChanged(); + chr.getClient().sendPacket(MaplePacketCreator.showItemLevelupEffect()); + chr.getMap().broadcastMessage(chr, MaplePacketCreator.showForeignItemLevelupEffect(chr.getId()), false); + } + return changed; + } + + public boolean checkEquipDurabilitys(final MapleCharacter chr, final int gain) { + for (final Equip item : this.durabilityHandling) { + item.setDurability(item.getDurability() + gain); + if (item.getDurability() < 0) { + item.setDurability(0); + } + } + final List all = new ArrayList(this.durabilityHandling); + for (final Equip eqq : all) { + if (eqq.getDurability() == 0) { + if (chr.getInventory(MapleInventoryType.EQUIP).isFull()) { + chr.getClient().sendPacket(MaplePacketCreator.getInventoryFull()); + chr.getClient().sendPacket(MaplePacketCreator.getShowInventoryFull()); + return false; + } + this.durabilityHandling.remove(eqq); + final short pos = chr.getInventory(MapleInventoryType.EQUIP).getNextFreeSlot(); + MapleInventoryManipulator.unequip(chr.getClient(), eqq.getPosition(), pos); + chr.getClient().sendPacket(MaplePacketCreator.modifyInventory(false, new ModifyInventory(1, (IItem) eqq, pos))); + } else { + chr.forceReAddItem(eqq.copy(), MapleInventoryType.EQUIPPED); + } + } + return true; + } + + private void CalcPassive_Mastery(final MapleCharacter player) { + if (player.getInventory(MapleInventoryType.EQUIPPED).getItem((short) (-11)) == null) { + this.passive_mastery = 0; + return; + } + int skil = 0; + switch (GameConstants.getWeaponType(player.getInventory(MapleInventoryType.EQUIPPED).getItem((short) (-11)).getItemId())) { + case 弓: { + skil = 3100000; + break; + } + case 拳套: { + skil = 4100000; + break; + } + case 双刀: + case 短剑: { + skil = ((player.getJob() >= 430 && player.getJob() <= 434) ? 4300000 : 4200000); + break; + } + case 弩: { + skil = 3200000; + break; + } + case 单手斧: + case 双手斧: { + skil = 1100001; + break; + } + case 单手剑: + case 双手剑: { + skil = (GameConstants.isKOC((int) player.getJob()) ? 11100000 : ((player.getJob() > 112) ? 1200000 : 1100000)); + break; + } + case 单手棍: + case 双手棍: { + skil = 1200001; + break; + } + case 枪: { + skil = (GameConstants.isAran((int) player.getJob()) ? 21100000 : 1300001); + break; + } + case 矛: { + skil = 1300000; + break; + } + case 指虎: { + skil = (GameConstants.isKOC((int) player.getJob()) ? 15100001 : 5100001); + break; + } + case 火枪: { + skil = 5200000; + break; + } + case 短杖: { + skil = 32100006; + break; + } + default: { + this.passive_mastery = 0; + return; + } + } + if (player.getSkillLevel(skil) <= 0) { + this.passive_mastery = 0; + return; + } + this.passive_mastery = (byte) (player.getSkillLevel(skil) / 2 + player.getSkillLevel(skil) % 2); + } + + private void CalcPassive_SharpEye(final MapleCharacter player, final int added_sharpeye_rate, final int added_sharpeye_dmg) { + switch (player.getJob()) { + case 410: + case 411: + case 412: { + final ISkill critSkill = SkillFactory.getSkill(4100001); + final int critlevel = player.getSkillLevel(critSkill); + if (critlevel > 0) { + this.passive_sharpeye_percent = (short) (critSkill.getEffect(critlevel).getDamage() - 100 + added_sharpeye_dmg); + this.passive_sharpeye_rate = (byte) (critSkill.getEffect(critlevel).getProb() + added_sharpeye_rate); + return; + } + break; + } + case 1410: + case 1411: + case 1412: { + final ISkill critSkill = SkillFactory.getSkill(14100001); + final int critlevel = player.getSkillLevel(critSkill); + if (critlevel > 0) { + this.passive_sharpeye_percent = (short) (critSkill.getEffect(critlevel).getDamage() - 100 + added_sharpeye_dmg); + this.passive_sharpeye_rate = (byte) (critSkill.getEffect(critlevel).getProb() + added_sharpeye_rate); + return; + } + break; + } + case 511: + case 512: { + final ISkill critSkill = SkillFactory.getSkill(5110000); + final int critlevel = player.getSkillLevel(critSkill); + if (critlevel > 0) { + this.passive_sharpeye_percent = (short) (critSkill.getEffect(critlevel).getDamage() - 100 + added_sharpeye_dmg); + this.passive_sharpeye_rate = (byte) (critSkill.getEffect(critlevel).getProb() + added_sharpeye_rate); + return; + } + break; + } + case 1511: + case 1512: { + final ISkill critSkill = SkillFactory.getSkill(15110000); + final int critlevel = player.getSkillLevel(critSkill); + if (critlevel > 0) { + this.passive_sharpeye_percent = (short) (critSkill.getEffect(critlevel).getDamage() - 100 + added_sharpeye_dmg); + this.passive_sharpeye_rate = (byte) (critSkill.getEffect(critlevel).getProb() + added_sharpeye_rate); + return; + } + break; + } + case 2111: + case 2112: { + final ISkill critSkill = SkillFactory.getSkill(21110000); + final int critlevel = player.getSkillLevel(critSkill); + if (critlevel > 0) { + this.passive_sharpeye_percent = (short) (critSkill.getEffect(critlevel).getX() * critSkill.getEffect(critlevel).getDamage() + added_sharpeye_dmg); + this.passive_sharpeye_rate = (byte) (critSkill.getEffect(critlevel).getX() * critSkill.getEffect(critlevel).getY() + added_sharpeye_rate); + return; + } + break; + } + case 300: + case 310: + case 311: + case 312: + case 320: + case 321: + case 322: { + final ISkill critSkill = SkillFactory.getSkill(3000001); + final int critlevel = player.getSkillLevel(critSkill); + if (critlevel > 0) { + this.passive_sharpeye_percent = (short) (critSkill.getEffect(critlevel).getDamage() - 100 + added_sharpeye_dmg); + this.passive_sharpeye_rate = (byte) (critSkill.getEffect(critlevel).getProb() + added_sharpeye_rate); + return; + } + break; + } + case 1300: + case 1310: + case 1311: + case 1312: { + final ISkill critSkill = SkillFactory.getSkill(13000000); + final int critlevel = player.getSkillLevel(critSkill); + if (critlevel > 0) { + this.passive_sharpeye_percent = (short) (critSkill.getEffect(critlevel).getDamage() - 100 + added_sharpeye_dmg); + this.passive_sharpeye_rate = (byte) (critSkill.getEffect(critlevel).getProb() + added_sharpeye_rate); + return; + } + break; + } + case 2214: + case 2215: + case 2216: + case 2217: + case 2218: { + final ISkill critSkill = SkillFactory.getSkill(22140000); + final int critlevel = player.getSkillLevel(critSkill); + if (critlevel > 0) { + this.passive_sharpeye_percent = (short) (critSkill.getEffect(critlevel).getDamage() - 100 + added_sharpeye_dmg); + this.passive_sharpeye_rate = (byte) (critSkill.getEffect(critlevel).getProb() + added_sharpeye_rate); + return; + } + break; + } + } + this.passive_sharpeye_percent = (short) added_sharpeye_dmg; + this.passive_sharpeye_rate = (byte) added_sharpeye_rate; + } + + private void CalcPassive_Range(final MapleCharacter chra) { + switch (chra.getJob()) { + case 300: + case 310: + case 311: + case 312: + case 320: + case 321: + case 322: { + this.defRange = 100; + final ISkill bx = SkillFactory.getSkill(3000002); + final int bof = chra.getSkillLevel(bx); + if (bof > 0) { + this.defRange += bx.getEffect(bof).getRange(); + break; + } + break; + } + case 410: + case 411: + case 412: + case 420: + case 421: + case 422: { + this.defRange = 100; + final ISkill bx = SkillFactory.getSkill(4000001); + final int bof = chra.getSkillLevel(bx); + if (bof > 0) { + this.defRange += bx.getEffect(bof).getRange(); + break; + } + break; + } + case 520: + case 521: + case 522: { + this.defRange = 100; + break; + } + case 1300: + case 1310: + case 1311: + case 1312: { + this.defRange = 100; + final ISkill bx = SkillFactory.getSkill(13000001); + final int bof = chra.getSkillLevel(bx); + if (bof > 0) { + this.defRange += bx.getEffect(bof).getRange(); + break; + } + break; + } + case 1400: + case 1410: + case 1411: + case 1412: { + this.defRange = 100; + final ISkill bx = SkillFactory.getSkill(14000001); + final int bof = chra.getSkillLevel(bx); + if (bof > 0) { + this.defRange += bx.getEffect(bof).getRange(); + break; + } + break; + } + case 2100: + case 2110: + case 2111: + case 2112: { + this.defRange = 80; + break; + } + } + } + + public final short passive_sharpeye_percent() { + return this.passive_sharpeye_percent; + } + + public final byte passive_sharpeye_rate() { + return this.passive_sharpeye_rate; + } + + public final byte passive_mastery() { + return this.passive_mastery; + } + + public final float calculateMaxBaseDamage(final int matk, final int watk) { + final MapleCharacter chra = (MapleCharacter) this.chr.get(); + if (chra == null) { + return 0.0f; + } + float maxbasedamage; + if (watk == 0) { + maxbasedamage = 1.0f; + } else { + final IItem weapon_item = chra.getInventory(MapleInventoryType.EQUIPPED).getItem((short) (-11)); + final int job = chra.getJob(); + final MapleWeaponType weapon = (weapon_item == null) ? MapleWeaponType.沒有武器 : GameConstants.getWeaponType(weapon_item.getItemId()); + final boolean magican = (job >= 200 && job <= 232) || (job >= 1200 && job <= 1212); + int mainstat = 0; + int secondarystat = 0; + switch (weapon) { + case 矛: { + mainstat = (int) ((double) this.localstr * 1.25); + secondarystat = (int) ((double) this.localdex * 1.25); + break; + } + case 弓: + case 弩: { + mainstat = this.localdex * 2; + secondarystat = this.localstr * 2; + break; + } + case 拳套: + case 双刀: + case 短剑: { + if ((job >= 400 && job <= 434) || (job >= 1400 && job <= 1412)) { + mainstat = this.localluk; + secondarystat = this.localdex + this.localstr; + break; + } + mainstat = this.localstr; + secondarystat = this.localdex; + break; + } + case 指虎: { + mainstat = this.localstr; + secondarystat = this.localdex; + break; + } + case 火枪: { + mainstat = this.localdex; + secondarystat = this.localstr; + break; + } + case 沒有武器: { + if ((job >= 500 && job <= 522) || (job >= 1500 && job <= 1512)) { + mainstat = this.localstr; + secondarystat = this.localdex; + break; + } + mainstat = 0; + secondarystat = 0; + break; + } + default: { + if (magican) { + mainstat = this.localint_; + secondarystat = this.localluk; + break; + } + mainstat = this.localstr; + secondarystat = this.localdex; + break; + } + } + maxbasedamage = (weapon.getMaxDamageMultiplier() * (float) mainstat + (float) secondarystat) * (float) (magican ? matk : watk) / 100.0f; + } + return maxbasedamage; + } + + public final float getHealHP() { + int shouldHealHP = 10; + Skill bx = (Skill) SkillFactory.getSkill(1000000); + int bof = ((MapleCharacter) this.chr.get()).getSkillLevel((ISkill) bx); + if (bof > 0) { + final MapleStatEffect eff = bx.getEffect(bof); + shouldHealHP += eff.getHp(); + } + bx = (Skill) SkillFactory.getSkill(1320008); + bof = ((MapleCharacter) this.chr.get()).getSkillLevel((ISkill) bx); + if (bof > 0) { + final MapleStatEffect eff = bx.getEffect(bof); + shouldHealHP += eff.getHp(); + } + bx = (Skill) SkillFactory.getSkill(4100002); + bof = ((MapleCharacter) this.chr.get()).getSkillLevel((ISkill) bx); + if (bof > 0) { + final MapleStatEffect eff = bx.getEffect(bof); + shouldHealHP += eff.getHp(); + } + bx = (Skill) SkillFactory.getSkill(4200001); + bof = ((MapleCharacter) this.chr.get()).getSkillLevel((ISkill) bx); + if (bof > 0) { + final MapleStatEffect eff = bx.getEffect(bof); + shouldHealHP += eff.getHp(); + } + return (float) shouldHealHP; + } + + public final float getHealMP() { + int shouldHealMP = 3; + Skill bx = (Skill) SkillFactory.getSkill(2000000); + int bof = ((MapleCharacter) this.chr.get()).getSkillLevel((ISkill) bx); + if (bof > 0) { + shouldHealMP += bof * 5; + } + bx = (Skill) SkillFactory.getSkill(4100002); + bof = ((MapleCharacter) this.chr.get()).getSkillLevel((ISkill) bx); + if (bof > 0) { + final MapleStatEffect eff = bx.getEffect(bof); + shouldHealMP += eff.getMp(); + } + bx = (Skill) SkillFactory.getSkill(4200001); + bof = ((MapleCharacter) this.chr.get()).getSkillLevel((ISkill) bx); + if (bof > 0) { + final MapleStatEffect eff = bx.getEffect(bof); + shouldHealMP += eff.getMp(); + } + return (float) shouldHealMP; + } + + public final void relocHeal() { + final MapleCharacter chra = (MapleCharacter) this.chr.get(); + if (chra == null) { + return; + } + final int playerjob = chra.getJob(); + this.shouldHealHP = (float) (10 + this.recoverHP); + this.shouldHealMP = (float) (3 + this.mpRestore + this.recoverMP); + if (GameConstants.isJobFamily(200, playerjob)) { + this.shouldHealMP += (float) chra.getSkillLevel(SkillFactory.getSkill(2000000)) / 10.0f * (float) chra.getLevel(); + } else if (GameConstants.isJobFamily(111, playerjob)) { + final ISkill effect = SkillFactory.getSkill(1110000); + final int lvl = chra.getSkillLevel(effect); + if (lvl > 0) { + this.shouldHealMP += (float) effect.getEffect(lvl).getMp(); + } + } else if (GameConstants.isJobFamily(121, playerjob)) { + final ISkill effect = SkillFactory.getSkill(1210000); + final int lvl = chra.getSkillLevel(effect); + if (lvl > 0) { + this.shouldHealMP += (float) effect.getEffect(lvl).getMp(); + } + } else if (GameConstants.isJobFamily(1111, playerjob)) { + final ISkill effect = SkillFactory.getSkill(11110000); + final int lvl = chra.getSkillLevel(effect); + if (lvl > 0) { + this.shouldHealMP += (float) effect.getEffect(lvl).getMp(); + } + } else if (GameConstants.isJobFamily(410, playerjob)) { + final ISkill effect = SkillFactory.getSkill(4100002); + final int lvl = chra.getSkillLevel(effect); + if (lvl > 0) { + this.shouldHealHP += (float) effect.getEffect(lvl).getHp(); + this.shouldHealMP += (float) effect.getEffect(lvl).getMp(); + } + } else if (GameConstants.isJobFamily(420, playerjob)) { + final ISkill effect = SkillFactory.getSkill(4200001); + final int lvl = chra.getSkillLevel(effect); + if (lvl > 0) { + this.shouldHealHP += (float) effect.getEffect(lvl).getHp(); + this.shouldHealMP += (float) effect.getEffect(lvl).getMp(); + } + } + if (chra.isGM()) { + this.shouldHealHP += 1000.0f; + this.shouldHealMP += 1000.0f; + } + if (chra.getChair() != 0) { + this.shouldHealHP += 99.0f; + this.shouldHealMP += 99.0f; + } else { + final float recvRate = chra.getMap().getRecoveryRate(); + this.shouldHealHP *= recvRate; + this.shouldHealMP *= recvRate; + } + this.shouldHealHP *= 2.0f; + this.shouldHealMP *= 2.0f; + } + + public final void connectData(final MaplePacketLittleEndianWriter mplew) { + mplew.writeShort((int) this.str); + mplew.writeShort((int) this.dex); + mplew.writeShort((int) this.int_); + mplew.writeShort((int) this.luk); + mplew.writeShort((int) this.hp); + mplew.writeShort((int) this.maxhp); + mplew.writeShort((int) this.mp); + mplew.writeShort((int) this.maxmp); + } + + public final int getSkillByJob(final int skillID, final int job) { + if (GameConstants.isKOC(job)) { + return skillID + 10000000; + } + if (GameConstants.isAran(job)) { + return skillID + 20000000; + } + return skillID; + } + + public final void handleProfessionTool(final MapleCharacter chra) { + if (chra.getProfessionLevel(92000000) > 0 || chra.getProfessionLevel(92010000) > 0) { + for (final Equip equip : (List) (List) chra.getInventory(MapleInventoryType.EQUIP).newList()) { + if ((equip.getDurability() != 0 && equip.getItemId() / 10000 == 150 && chra.getProfessionLevel(92000000) > 0) || (equip.getItemId() / 10000 == 151 && chra.getProfessionLevel(92010000) > 0)) { + if (equip.getDurability() > 0) { + this.durabilityHandling.add(equip); + } + this.harvestingTool = equip.getPosition(); + break; + } + } + } + } +} diff --git a/src/client/RockPaperScissors.java b/src/client/RockPaperScissors.java new file mode 100644 index 0000000..4c75de8 --- /dev/null +++ b/src/client/RockPaperScissors.java @@ -0,0 +1,4 @@ +package client; + +public class RockPaperScissors { +} diff --git a/src/client/Skill.java b/src/client/Skill.java new file mode 100644 index 0000000..300e637 --- /dev/null +++ b/src/client/Skill.java @@ -0,0 +1,312 @@ +package client; + +import constants.GameConstants; + +import java.util.Iterator; + +import provider.MapleDataTool; +import provider.MapleData; + +import java.util.ArrayList; + +import server.life.Element; +import server.MapleStatEffect; + +import java.util.List; + +public class Skill implements ISkill { + private String name; + private final List effects; + private Element element; + private byte level; + private final int id; + private int animationTime; + private int requiredSkill; + private int masterLevel; + private boolean action; + private boolean invisible; + private boolean chargeskill; + private boolean timeLimited; + + public Skill(final int id) { + this.name = ""; + this.effects = (List) new ArrayList(); + this.id = id; + } + + public void setName(final String name) { + this.name = name; + } + + @Override + public int getId() { + return this.id; + } + + @Override + public String getName() { + return this.name; + } + + public static final Skill loadFromData(final int id, final MapleData data) { + final Skill ret = new Skill(id); + boolean isBuff = false; + final int skillType = MapleDataTool.getInt("skillType", data, -1); + final String elem = MapleDataTool.getString("elemAttr", data, null); + if (elem != null) { + ret.element = Element.getFromChar(elem.charAt(0)); + } else { + ret.element = Element.NEUTRAL; + } + ret.invisible = (MapleDataTool.getInt("invisible", data, 0) > 0); + ret.timeLimited = (MapleDataTool.getInt("timeLimited", data, 0) > 0); + ret.masterLevel = MapleDataTool.getInt("masterLevel", data, 0); + final MapleData effect = data.getChildByPath("effect"); + if (skillType != -1) { + if (skillType == 2) { + isBuff = true; + } + } else { + final MapleData action_ = data.getChildByPath("action"); + final MapleData hit = data.getChildByPath("hit"); + final MapleData ball = data.getChildByPath("ball"); + boolean action = false; + if (action_ == null) { + if (data.getChildByPath("prepare/action") != null) { + action = true; + } else { + switch (id) { + case 3101005: + case 4221001: + case 4321000: + case 4321001: + case 4331001: + case 5201001: + case 5221009: { + action = true; + break; + } + } + } + } else { + action = true; + } + ret.action = action; + isBuff = (effect != null && hit == null && ball == null); + isBuff |= (action_ != null && MapleDataTool.getString("0", action_, "").equals("alert2")); + switch (id) { + case 2111002: + case 2111003: + case 2121001: + case 2221001: + case 2301002: + case 2321001: + case 4211001: + case 12111005: { + isBuff = false; + break; + } + case 1004: + case 1026: + case 1111002: + case 1111007: + case 1211009: + case 1311007: + case 1320009: + case 4111001: + case 4211003: + case 4321000: + case 4331003: + case 4341002: + case 5001005: + case 5110001: + case 5111005: + case 5121003: + case 5121009: + case 5211001: + case 5211002: + case 5211006: + case 5220002: + case 5220011: + case 9001004: + case 9101004: + case 10001004: + case 10001026: + case 11111001: + case 12101005: + case 13111005: + case 15001003: + case 15100004: + case 15101006: + case 15111002: + case 15111005: + case 15111006: + case 20001004: + case 20001026: + case 20011004: + case 20011026: + case 21000000: + case 21101003: + case 22121001: + case 22131001: + case 22141002: + case 22151002: + case 22151003: + case 22171000: + case 22171004: + case 22181000: + case 22181003: + case 30001004: + case 30001026: + case 32001003: + case 32101002: + case 32101003: + case 32110000: + case 32120000: + case 32120001: + case 33111003: + case 35001001: + case 35001002: + case 35101002: + case 35101007: + case 35101009: + case 35111007: + case 35120000: + case 35121005: + case 35121006: + case 35121013: { + isBuff = true; + break; + } + } + } + ret.chargeskill = (data.getChildByPath("keydown") != null); + for (final MapleData level : data.getChildByPath("level")) { + ret.effects.add(MapleStatEffect.loadSkillEffectFromData(level, id, isBuff, Byte.parseByte(level.getName()))); + } + final MapleData reqDataRoot = data.getChildByPath("req"); + if (reqDataRoot != null) { + for (final MapleData reqData : reqDataRoot.getChildren()) { + ret.requiredSkill = Integer.parseInt(reqData.getName()); + ret.level = (byte) MapleDataTool.getInt(reqData, 1); + } + } + ret.animationTime = 0; + if (effect != null) { + for (final MapleData effectEntry : effect) { + final Skill skill = ret; + skill.animationTime += MapleDataTool.getIntConvert("delay", effectEntry, 0); + } + } + return ret; + } + + @Override + public MapleStatEffect getEffect(final int level) { + if (this.effects.size() < level) { + if (this.effects.size() > 0) { + return (MapleStatEffect) this.effects.get(this.effects.size() - 1); + } + return null; + } else { + if (level <= 0) { + return (MapleStatEffect) this.effects.get(0); + } + return (MapleStatEffect) this.effects.get(level - 1); + } + } + + public MapleStatEffect getEffect1(final int level) { + if (this.effects.size() <= level) { + for (int a = 0; a < this.effects.size(); ++a) { + if (((MapleStatEffect) this.effects.get(a)).getLevel() == level) { + return (MapleStatEffect) this.effects.get(a); + } + } + return null; + } + if (level <= 0) { + return (MapleStatEffect) this.effects.get(0); + } + return (MapleStatEffect) this.effects.get(level - 1); + } + + @Override + public boolean hasAction() { + return this.action; + } + + @Override + public boolean isChargeSkill() { + return this.chargeskill; + } + + @Override + public boolean isInvisible() { + return this.invisible; + } + + @Override + public boolean hasRequiredSkill() { + return this.level > 0; + } + + @Override + public int getRequiredSkillLevel() { + return this.level; + } + + @Override + public int getRequiredSkillId() { + return this.requiredSkill; + } + + @Override + public byte getMaxLevel() { + return (byte) this.effects.size(); + } + + @Override + public boolean canBeLearnedBy(final int job) { + final int jid = job; + final int skillForJob = this.id / 10000; + return jid / 100 == skillForJob / 100 && jid / 1000 == skillForJob / 1000 && (!GameConstants.isAdventurer(skillForJob) || GameConstants.isAdventurer(job)) && (!GameConstants.isKOC(skillForJob) || GameConstants.isKOC(job)) && (!GameConstants.isAran(skillForJob) || GameConstants.isAran(job)) && skillForJob / 10 % 10 <= jid / 10 % 10 && skillForJob % 10 <= jid % 10; + } + + @Override + public boolean isTimeLimited() { + return this.timeLimited; + } + + @Override + public boolean isFourthJob() { + if (this.id / 10000 >= 2212 && this.id / 10000 < 3000) { + return this.id / 10000 % 10 >= 7; + } + if (this.id / 10000 >= 430 && this.id / 10000 <= 434) { + return this.id / 10000 % 10 == 4 || this.getMasterLevel() > 0; + } + return this.id / 10000 % 10 == 2; + } + + @Override + public Element getElement() { + return this.element; + } + + @Override + public int getAnimationTime() { + return this.animationTime; + } + + @Override + public int getMasterLevel() { + return this.masterLevel; + } + + @Override + public boolean isBeginnerSkill() { + final int jobId = this.id / 10000; + return jobId == 0 || jobId == 1000 || jobId == 2000 || jobId == 2001 || jobId == 3000; + } +} diff --git a/src/client/SkillEntry.java b/src/client/SkillEntry.java new file mode 100644 index 0000000..2e583ff --- /dev/null +++ b/src/client/SkillEntry.java @@ -0,0 +1,16 @@ +package client; + +import java.io.Serializable; + +public class SkillEntry implements Serializable { + private static final long serialVersionUID = 9179541993413738569L; + public final byte skillevel; + public final byte masterlevel; + public final long expiration; + + public SkillEntry(final byte skillevel, final byte masterlevel, final long expiration) { + this.skillevel = skillevel; + this.masterlevel = masterlevel; + this.expiration = expiration; + } +} diff --git a/src/client/SkillFactory.java b/src/client/SkillFactory.java new file mode 100644 index 0000000..ef7800f --- /dev/null +++ b/src/client/SkillFactory.java @@ -0,0 +1,110 @@ +package client; + +import java.util.HashMap; +import java.util.Collection; + +import tools.StringUtil; + +import java.util.Iterator; + +import provider.MapleDataDirectoryEntry; +import provider.MapleDataProvider; +import provider.MapleDataTool; + +import java.util.ArrayList; + +import provider.MapleDataFileEntry; +import provider.MapleDataProviderFactory; +import tools.FileoutputUtil; +import provider.MapleData; + +import java.util.List; +import java.util.Map; + +public class SkillFactory { + private static final Map skills = new HashMap(); + private static final Map> summonSkills = new HashMap(); + private static final Map summonSkillsInfo = new HashMap(); + private static final MapleData stringSkills = MapleDataProviderFactory.getDataProvider("String.wz").getData("Skill.img"); + + public static void LoadSkillInformaion() { + System.out.println("[" + FileoutputUtil.CurrentReadable_Time() + "][信息]:初始化技能信息列表"); + final MapleDataProvider skillWZ = MapleDataProviderFactory.getDataProvider("Skill.wz"); + final MapleDataDirectoryEntry root = skillWZ.getRoot(); + for (final MapleDataFileEntry topDir : root.getFiles()) { + if (topDir.getName().length() <= 8) { + for (final MapleData data : skillWZ.getData(topDir.getName())) { + if (data.getName().equals("skill")) { + for (final MapleData subData : data) { + if (subData != null) { + final int skillId = Integer.parseInt(subData.getName()); + final Skill skil = Skill.loadFromData(skillId, subData); + List job = SkillFactory.summonSkills.get(Integer.valueOf(skillId / 10000)); + if (job == null) { + job = (List) new ArrayList(); + SkillFactory.summonSkills.put(Integer.valueOf(skillId / 10000), job); + } + job.add(Integer.valueOf(skillId)); + skil.setName(getName(skillId)); + SkillFactory.skills.put(Integer.valueOf(skillId), skil); + final MapleData summon_data = subData.getChildByPath("summon/attack1/info"); + if (summon_data == null) { + continue; + } + final SummonSkillEntry sse = new SummonSkillEntry(); + sse.attackAfter = (short) MapleDataTool.getInt("attackAfter", summon_data, 999999); + sse.type = (byte) MapleDataTool.getInt("type", summon_data, 0); + sse.mobCount = (byte) MapleDataTool.getInt("mobCount", summon_data, 1); + SkillFactory.summonSkillsInfo.put(Integer.valueOf(skillId), sse); + } + } + } + } + } + } + } + + public static final ISkill getSkill(final int id) { + if (!SkillFactory.skills.isEmpty()) { + return (ISkill) SkillFactory.skills.get(Integer.valueOf(id)); + } + return null; + } + + public static long getDefaultSExpiry(final ISkill skill) { + if (skill == null) { + return -1L; + } + return skill.isTimeLimited() ? (System.currentTimeMillis() + 2592000000L) : -1L; + } + + public static final List getSkillsByJob(final int jobId) { + return SkillFactory.summonSkills.get(Integer.valueOf(jobId)); + } + + public static final String getSkillName(final int id) { + final ISkill skil = getSkill(id); + if (skil != null) { + return skil.getName(); + } + return ""; + } + + public static final String getName(final int id) { + String strId = Integer.toString(id); + strId = StringUtil.getLeftPaddedStr(strId, '0', 7); + final MapleData skillroot = SkillFactory.stringSkills.getChildByPath(strId); + if (skillroot != null) { + return MapleDataTool.getString(skillroot.getChildByPath("name"), ""); + } + return ""; + } + + public static final SummonSkillEntry getSummonData(final int skillid) { + return (SummonSkillEntry) SkillFactory.summonSkillsInfo.get(Integer.valueOf(skillid)); + } + + public static final Collection getAllSkills() { + return SkillFactory.skills.values(); + } +} diff --git a/src/client/SkillMacro.java b/src/client/SkillMacro.java new file mode 100644 index 0000000..a72aebc --- /dev/null +++ b/src/client/SkillMacro.java @@ -0,0 +1,79 @@ +package client; + +import java.io.Serializable; + +public class SkillMacro implements Serializable { + private static final long serialVersionUID = -63413738569L; + private int macroId; + private int skill1; + private int skill2; + private int skill3; + private String name; + private int shout; + private int position; + + public SkillMacro(final int skill1, final int skill2, final int skill3, final String name, final int shout, final int position) { + this.skill1 = skill1; + this.skill2 = skill2; + this.skill3 = skill3; + this.name = name; + this.shout = shout; + this.position = position; + } + + public int getMacroId() { + return this.macroId; + } + + public int getSkill1() { + return this.skill1; + } + + public int getSkill2() { + return this.skill2; + } + + public int getSkill3() { + return this.skill3; + } + + public String getName() { + return this.name; + } + + public int getShout() { + return this.shout; + } + + public int getPosition() { + return this.position; + } + + public void setMacroId(final int macroId) { + this.macroId = macroId; + } + + public void setSkill1(final int skill1) { + this.skill1 = skill1; + } + + public void setSkill2(final int skill2) { + this.skill2 = skill2; + } + + public void setSkill3(final int skill3) { + this.skill3 = skill3; + } + + public void setName(final String name) { + this.name = name; + } + + public void setShout(final int shout) { + this.shout = shout; + } + + public void setPosition(final int position) { + this.position = position; + } +} diff --git a/src/client/SummonSkillEntry.java b/src/client/SummonSkillEntry.java new file mode 100644 index 0000000..783250d --- /dev/null +++ b/src/client/SummonSkillEntry.java @@ -0,0 +1,7 @@ +package client; + +public class SummonSkillEntry { + public byte type; + public byte mobCount; + public short attackAfter; +} diff --git a/src/client/anticheat/CheatTracker.java b/src/client/anticheat/CheatTracker.java new file mode 100644 index 0000000..646197e --- /dev/null +++ b/src/client/anticheat/CheatTracker.java @@ -0,0 +1,516 @@ +package client.anticheat; + +import java.util.Iterator; +import java.util.List; +import java.util.Comparator; +import java.util.ArrayList; +import java.util.Collections; + +import tools.StringUtil; +import client.MapleCharacterUtil; +import constants.PiPiConfig; +import handling.world.World.Broadcast; +import tools.MaplePacketCreator; +import constants.WorldConstants; +import client.SkillFactory; +import tools.FileoutputUtil; +import gui.Start; +import client.MapleBuffStat; +import constants.GameConstants; +import server.Timer.CheatTimer; + +import java.util.LinkedHashMap; +import java.util.concurrent.ScheduledFuture; +import java.awt.Point; + +import client.MapleCharacter; + +import java.lang.ref.WeakReference; +import java.util.Map; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +public class CheatTracker { + private final ReentrantReadWriteLock lock; + private final Lock rL; + private final Lock wL; + private final Map offenses; + private final WeakReference chr; + private long lastAttackTime; + private int inMapIimeCount; + private int lastAttackTickCount; + private byte Attack_tickResetCount; + private long Server_ClientAtkTickDiff; + private long lastDamage; + private long takingDamageSince; + private int numSequentialDamage; + private long lastDamageTakenTime; + private byte numZeroDamageTaken; + private int numSequentialSummonAttack; + private long summonSummonTime; + private int numSameDamage; + private Point lastMonsterMove; + private int monsterMoveCount; + private int attacksWithoutHit; + private byte dropsPerSecond; + private long lastDropTime; + private byte msgsPerSecond; + private long lastMsgTime; + private ScheduledFuture invalidationTask; + private int gm_message; + private int lastTickCount; + private int tickSame; + private long lastASmegaTime; + private long[] lastTime; + private long lastSaveTime; + private long lastLieDetectorTime; + private long lastLieTime; + private long TV = 0; + + public CheatTracker(final MapleCharacter chr) { + this.lock = new ReentrantReadWriteLock(); + this.rL = this.lock.readLock(); + this.wL = this.lock.writeLock(); + this.offenses = (Map) new LinkedHashMap(); + this.lastAttackTime = 0L; + this.inMapIimeCount = 0; + this.lastAttackTickCount = 0; + this.Attack_tickResetCount = 0; + this.Server_ClientAtkTickDiff = 0L; + this.lastDamage = 0L; + this.numSequentialDamage = 0; + this.lastDamageTakenTime = 0L; + this.numZeroDamageTaken = 0; + this.numSequentialSummonAttack = 0; + this.summonSummonTime = 0L; + this.numSameDamage = 0; + this.attacksWithoutHit = 0; + this.dropsPerSecond = 0; + this.lastDropTime = 0L; + this.msgsPerSecond = 0; + this.lastMsgTime = 0L; + this.gm_message = 100; + this.lastTickCount = 0; + this.tickSame = 0; + this.lastASmegaTime = 0L; + this.lastTime = new long[6]; + this.lastSaveTime = 0L; + this.lastLieDetectorTime = 0L; + this.lastLieTime = 0L; + this.chr = new WeakReference(chr); + this.invalidationTask = CheatTimer.getInstance().register((Runnable) new InvalidationTask(), 60000L); + this.takingDamageSince = System.currentTimeMillis(); + } + + public final void checkAttack(final int skillId, final int tickcount) { + short AtkDelay = GameConstants.getAttackDelay(skillId); + if (((MapleCharacter) this.chr.get()).getBuffedValue(MapleBuffStat.BODY_PRESSURE) != null) { + AtkDelay /= 6; + } + if (((MapleCharacter) this.chr.get()).getBuffedValue(MapleBuffStat.BOOSTER) != null) { + AtkDelay = (short) (int) ((double) AtkDelay / 1.5); + } + if (((MapleCharacter) this.chr.get()).getBuffedValue(MapleBuffStat.SPEED_INFUSION) != null) { + AtkDelay = (short) (int) ((double) AtkDelay / 1.35); + } + if (GameConstants.isAran((int) ((MapleCharacter) this.chr.get()).getJob())) { + AtkDelay = (short) (int) ((double) AtkDelay / 1.4); + } + if (((MapleCharacter) this.chr.get()).getJob() >= 500 && ((MapleCharacter) this.chr.get()).getJob() <= 512) { + AtkDelay = 0; + } + if (skillId == 21101003 || skillId == 5110001) { + AtkDelay = 0; + } + if (tickcount - this.lastAttackTickCount < AtkDelay && GameConstants.getWuYanChi(skillId) && ((Integer) Start.ConfigValuesMap.get("攻速检测")).intValue() > 0) { + FileoutputUtil.logToFile("logs/Hack/攻击速度异常.txt", "\r\n " + FileoutputUtil.NowTime() + " 玩家:" + ((MapleCharacter) this.chr.get()).getName() + " 职业:" + (int) ((MapleCharacter) this.chr.get()).getJob() + "\u3000技能: " + skillId + "(" + SkillFactory.getSkillName(skillId) + ") check: " + (tickcount - this.lastAttackTickCount) + " AtkDelay: " + (int) AtkDelay); + if (WorldConstants.WUYANCHI) { + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, "[GM密语] ID " + ((MapleCharacter) this.chr.get()).getId() + " " + ((MapleCharacter) this.chr.get()).getName() + " 攻击速度异常,技能: " + skillId + "(" + SkillFactory.getSkillName(skillId) + ")")); + } + } + if (((MapleCharacter) this.chr.get()).getDebugMessage()) { + ((MapleCharacter) this.chr.get()).dropMessage("Delay [" + skillId + "] = " + (tickcount - this.lastAttackTickCount) + ", " + (int) AtkDelay); + } + if (WorldConstants.LieDetector) { + this.lastAttackTime = System.currentTimeMillis(); + if (this.chr.get() != null && this.lastAttackTime - ((MapleCharacter) this.chr.get()).getChangeTime() > 60000L) { + ((MapleCharacter) this.chr.get()).setChangeTime(false); + if (!GameConstants.isBossMap(((MapleCharacter) this.chr.get()).getMapId()) && ((MapleCharacter) this.chr.get()).getEventInstance() == null && ((MapleCharacter) this.chr.get()).getMap().getMobsSize() >= 1) { + ++this.inMapIimeCount; + if (this.inMapIimeCount >= 30) { + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, "[GM密语] ID " + ((MapleCharacter) this.chr.get()).getId() + " " + ((MapleCharacter) this.chr.get()).getName() + " 打怪时间超过 30 分钟,该玩家可能在挂机。 ")); + } + if (this.inMapIimeCount >= 30) { + this.inMapIimeCount = 0; + ((MapleCharacter) this.chr.get()).startLieDetector(false); + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, "[GM密语] ID " + ((MapleCharacter) this.chr.get()).getId() + " " + ((MapleCharacter) this.chr.get()).getName() + " 打怪时间超过 30 分钟,系统启动测谎仪系统。 ")); + } + } + } + } + final long STime_TC = System.currentTimeMillis() - (long) tickcount; + if (this.Server_ClientAtkTickDiff - STime_TC > 1000L && GameConstants.getWuYanChi(skillId) && ((Integer) Start.ConfigValuesMap.get("攻速检测")).intValue() > 0 && WorldConstants.WUYANCHI) { + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, "[GM密语] ID " + ((MapleCharacter) this.chr.get()).getId() + " " + ((MapleCharacter) this.chr.get()).getName() + " 攻击速度异常,技能: " + skillId + "(" + SkillFactory.getSkillName(skillId) + ")")); + } + this.Server_ClientAtkTickDiff = STime_TC; + ((MapleCharacter) this.chr.get()).updateTick(tickcount); + this.lastAttackTickCount = tickcount; + } + + public final void checkTakeDamage(final int damage) { + ++this.numSequentialDamage; + this.lastDamageTakenTime = System.currentTimeMillis(); + if (this.lastDamageTakenTime - this.takingDamageSince / 500L < (long) this.numSequentialDamage) { + } + if (this.lastDamageTakenTime - this.takingDamageSince > 4500L) { + this.takingDamageSince = this.lastDamageTakenTime; + this.numSequentialDamage = 0; + } + if (damage == 0) { + ++this.numZeroDamageTaken; + if (this.numZeroDamageTaken >= 35) { + this.numZeroDamageTaken = 0; + this.registerOffense(CheatingOffense.HIGH_AVOID, "回避率过高 "); + } + } else if (damage != -1) { + this.numZeroDamageTaken = 0; + } + } + + public final void checkSameDamage(final int dmg, final double expected) { + if (dmg > 2000 && this.lastDamage == (long) dmg && this.chr.get() != null && (((MapleCharacter) this.chr.get()).getLevel() < 175 || (double) dmg > expected * 2.0)) { + ++this.numSameDamage; + if (this.numSameDamage > 5) { + this.numSameDamage = 0; + this.registerOffense(CheatingOffense.SAME_DAMAGE, this.numSameDamage + " 次, 攻击伤害: " + dmg + ", 预计伤害: " + expected + " [等级: " + (int) ((MapleCharacter) this.chr.get()).getLevel() + ", 职业: " + (int) ((MapleCharacter) this.chr.get()).getJob() + "]"); + } + } else { + this.lastDamage = (long) dmg; + this.numSameDamage = 0; + } + } + + public final void checkMoveMonster(final Point pos) { + if (pos == this.lastMonsterMove) { + ++this.monsterMoveCount; + if (this.monsterMoveCount > 10) { + this.monsterMoveCount = 0; + } + } else { + this.lastMonsterMove = pos; + this.monsterMoveCount = 1; + } + } + + public final void resetSummonAttack() { + this.summonSummonTime = System.currentTimeMillis(); + this.numSequentialSummonAttack = 0; + } + + public final boolean checkSummonAttack() { + ++this.numSequentialSummonAttack; + return true; + } + + public final void checkDrop() { + this.checkDrop(false); + } + + public final void checkDrop(final boolean dc) { + if (System.currentTimeMillis() - this.lastDropTime < 1000L) { + ++this.dropsPerSecond; + if (this.dropsPerSecond >= (dc ? 32 : 16) && this.chr.get() != null && !((MapleCharacter) this.chr.get()).isGM()) { + if (dc) { + ((MapleCharacter) this.chr.get()).getClient().getSession().close(); + } else { + ((MapleCharacter) this.chr.get()).getClient().setMonitored(true); + } + } + } else { + this.dropsPerSecond = 0; + } + this.lastDropTime = System.currentTimeMillis(); + } + + public boolean canAvatarSmega2() { + long time = 10000L; + if (this.chr.get() != null) { + if (((MapleCharacter) this.chr.get()).getId() == 845 || ((MapleCharacter) this.chr.get()).getId() == 5247 || ((MapleCharacter) this.chr.get()).getId() == 12048) { + time = 20000L; + } + if (this.lastASmegaTime + time > System.currentTimeMillis() && !((MapleCharacter) this.chr.get()).isGM()) { + return false; + } + } + this.lastASmegaTime = System.currentTimeMillis(); + return true; + } + + public synchronized boolean GMSpam(final int limit, int type) { + if (type < 0 || this.lastTime.length < type) { + type = 1; + } + if (System.currentTimeMillis() < (long) limit + this.lastTime[type]) { + return true; + } + this.lastTime[type] = System.currentTimeMillis(); + return false; + } + + public final void checkMsg() { + if (System.currentTimeMillis() - this.lastMsgTime < 1000L) { + ++this.msgsPerSecond; + } else { + this.msgsPerSecond = 0; + } + this.lastMsgTime = System.currentTimeMillis(); + } + + public final int getAttacksWithoutHit() { + return this.attacksWithoutHit; + } + + public final void setAttacksWithoutHit(final boolean increase) { + if (increase) { + ++this.attacksWithoutHit; + } else { + this.attacksWithoutHit = 0; + } + } + + public final void registerOffense(final CheatingOffense offense) { + this.registerOffense(offense, null); + } + + public final void registerOffense(final CheatingOffense offense, final String param) { + final MapleCharacter chrhardref = (MapleCharacter) this.chr.get(); + if (chrhardref == null || !offense.isEnabled() || chrhardref.isClone()) { + return; + } + if (((MapleCharacter) this.chr.get()).hasGmLevel(5)) { + } + CheatingOffenseEntry entry = null; + this.rL.lock(); + try { + entry = (CheatingOffenseEntry) this.offenses.get(offense); + } finally { + this.rL.unlock(); + } + if (entry != null && entry.isExpired()) { + this.expireEntry(entry); + entry = null; + } + if (entry == null) { + entry = new CheatingOffenseEntry(offense, chrhardref.getId()); + } + if (param != null) { + entry.setParam(param); + } + entry.incrementCount(); + if (offense.shouldAutoban(entry.getCount())) { + final byte type = offense.getBanType(); + if (type != 1) { + if (type == 2) { + final String outputFileName = "断线"; + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, "[GM密语] " + chrhardref.getName() + " 自动断线 类別: " + offense.toString() + " 原因: " + ((param == null) ? "" : (" - " + param)))); + FileoutputUtil.logToFile("logs/Hack/" + outputFileName + ".txt", "\r\n " + FileoutputUtil.NowTime() + " 玩家:" + ((MapleCharacter) this.chr.get()).getName() + " 项目:" + offense.toString() + " 原因: " + ((param == null) ? "" : (" - " + param))); + chrhardref.getClient().getSession().close(); + } else if (type == 3) { + boolean ban = true; + String outputFileName = "封锁"; + final String show = "使用违法程式练功"; + String real = ""; + if (offense.toString() == "ITEMVAC_SERVER") { + outputFileName = "全图吸物"; + real = "使用全图吸物"; + if (!PiPiConfig.getAutoban()) { + ban = false; + } + } else if (offense.toString() == "FAST_SUMMON_ATTACK") { + outputFileName = "召唤兽无延迟"; + real = "使用召唤兽无延迟攻击"; + } else if (offense.toString() == "MOB_VAC") { + outputFileName = "吸怪"; + real = "使用吸怪"; + if (!PiPiConfig.getAutoban()) { + ban = false; + } + } else if (offense.toString() == "ATTACK_FARAWAY_MONSTER_BAN") { + outputFileName = "全图打"; + real = "使用全图打"; + if (!PiPiConfig.getAutoban()) { + ban = false; + } + } else { + ban = false; + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, "[GM密语] " + MapleCharacterUtil.makeMapleReadable(chrhardref.getName()) + " (编号: " + chrhardref.getId() + " )使用外挂! " + StringUtil.makeEnumHumanReadable(offense.name()) + ((param == null) ? "" : (" - " + param)))); + } + if (!((MapleCharacter) this.chr.get()).hasGmLevel(1)) { + if (ban) { + if (((Integer) Start.ConfigValuesMap.get("全服通告")).intValue() > 0) { + FileoutputUtil.logToFile("logs/Hack/Ban/" + outputFileName + ".txt", "\r\n " + FileoutputUtil.NowTime() + " 玩家:" + ((MapleCharacter) this.chr.get()).getName() + " 项目:" + offense.toString() + " 原因: " + ((param == null) ? "" : (" - " + param))); + Broadcast.broadcastMessage(MaplePacketCreator.serverNotice(6, "[封锁系统] " + chrhardref.getName() + " 因为" + show + "而被管理员永久停权。")); + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, "[GM密语] " + chrhardref.getName() + " " + real + "自动封锁! ")); + } + if (((Integer) Start.ConfigValuesMap.get("封停IP")).intValue() > 0) { + chrhardref.ban(chrhardref.getName() + real, true, true, false); + } + if (((Integer) Start.ConfigValuesMap.get("封停MAC")).intValue() > 0) { + chrhardref.getClient().banMacs(); + } + if (((Integer) Start.ConfigValuesMap.get("封停账号")).intValue() > 0) { + chrhardref.getClient().getSession().close(); + } + } + } + } + } + this.gm_message = 100; + return; + } + this.wL.lock(); + try { + this.offenses.put(offense, entry); + } finally { + this.wL.unlock(); + } + CheatingOffensePersister.getInstance().persistEntry(entry); + } + + public void updateTick(final int newTick) { + if (newTick == this.lastTickCount) { + ++this.tickSame; + } else { + this.tickSame = 0; + } + this.lastTickCount = newTick; + } + + public final void expireEntry(final CheatingOffenseEntry coe) { + this.wL.lock(); + try { + this.offenses.remove(coe.getOffense()); + } finally { + this.wL.unlock(); + } + } + + public final int getPoints() { + int ret = 0; + this.rL.lock(); + CheatingOffenseEntry[] offenses_copy; + try { + offenses_copy = (CheatingOffenseEntry[]) this.offenses.values().toArray(new CheatingOffenseEntry[this.offenses.size()]); + } finally { + this.rL.unlock(); + } + for (final CheatingOffenseEntry entry : offenses_copy) { + if (entry.isExpired()) { + this.expireEntry(entry); + } else { + ret += entry.getPoints(); + } + } + return ret; + } + + public final Map getOffenses() { + return Collections.unmodifiableMap(this.offenses); + } + + public final String getSummary() { + final StringBuilder ret = new StringBuilder(); + final List offenseList = (List) new ArrayList(); + this.rL.lock(); + try { + for (final CheatingOffenseEntry entry : this.offenses.values()) { + if (!entry.isExpired()) { + offenseList.add(entry); + } + } + } finally { + this.rL.unlock(); + } + Collections.sort(offenseList, new Comparator() { + @Override + public final int compare(final CheatingOffenseEntry o1, final CheatingOffenseEntry o2) { + final int thisVal = o1.getPoints(); + final int anotherVal = o2.getPoints(); + return (thisVal < anotherVal) ? 1 : ((thisVal == anotherVal) ? 0 : -1); + } + }); + for (int to = Math.min(offenseList.size(), 4), x = 0; x < to; ++x) { + ret.append(StringUtil.makeEnumHumanReadable(((CheatingOffenseEntry) offenseList.get(x)).getOffense().name())); + ret.append(": "); + ret.append(((CheatingOffenseEntry) offenseList.get(x)).getCount()); + if (x != to - 1) { + ret.append(" "); + } + } + return ret.toString(); + } + + public final void dispose() { + if (this.invalidationTask != null) { + this.invalidationTask.cancel(false); + } + this.invalidationTask = null; + } + + public boolean canSaveDB() { + if (System.currentTimeMillis() - this.lastSaveTime < 300000L) { + return false; + } + this.lastSaveTime = System.currentTimeMillis(); + return true; + } + + public int getlastSaveTime() { + return (int) ((System.currentTimeMillis() - this.lastSaveTime) / 1000L); + } + + public int getlastLieTime() { + return (int) ((System.currentTimeMillis() - this.lastLieTime) / 1000L); + } + + public boolean canLieDetector() { + if (this.lastLieDetectorTime + 300000L > System.currentTimeMillis() && this.chr.get() != null) { + return false; + } + this.lastLieDetectorTime = System.currentTimeMillis(); + return true; + } + + public void resetInMapIimeCount() { + this.inMapIimeCount = 0; + } + + public boolean canTV() { + if (TV + 60000 > System.currentTimeMillis()) { + return false; + } + TV = System.currentTimeMillis(); + return true; + } + + private final class InvalidationTask implements Runnable { + @Override + public final void run() { + CheatTracker.this.rL.lock(); + CheatingOffenseEntry[] offenses_copy; + try { + offenses_copy = (CheatingOffenseEntry[]) CheatTracker.this.offenses.values().toArray((Object[]) new CheatingOffenseEntry[CheatTracker.this.offenses.size()]); + } finally { + CheatTracker.this.rL.unlock(); + } + for (final CheatingOffenseEntry offense : offenses_copy) { + if (offense.isExpired()) { + CheatTracker.this.expireEntry(offense); + } + } + if (CheatTracker.this.chr.get() == null) { + CheatTracker.this.dispose(); + } + } + } +} diff --git a/src/client/anticheat/CheatingOffense.java b/src/client/anticheat/CheatingOffense.java new file mode 100644 index 0000000..baf00eb --- /dev/null +++ b/src/client/anticheat/CheatingOffense.java @@ -0,0 +1,84 @@ +package client.anticheat; + +public enum CheatingOffense { + FAST_SUMMON_ATTACK((byte) 5, 6000L, 50, (byte) 3), + FASTATTACK((byte) 5, 6000L, 50, (byte) 2), + FASTATTACK2((byte) 5, 10000L, 20, (byte) 1), + MOVE_MONSTERS((byte) 1, 30000L), + FAST_HP_MP_REGEN((byte) 5, 20000L, 10, (byte) 2), + SAME_DAMAGE((byte) 2, 30000L, 150), + ATTACK_WITHOUT_GETTING_HIT((byte) 1, 30000L, 1200, (byte) 0), + HIGH_DAMAGE_MAGIC((byte) 5, 30000L, -1, (byte) 0), + HIGH_DAMAGE_MAGIC_2((byte) 10, 30000L, -1, (byte) 0), + HIGH_DAMAGE((byte) 5, 30000L, -1, (byte) 0), + HIGH_DAMAGE_2((byte) 10, 30000L, -1, (byte) 0), + EXCEED_DAMAGE_CAP((byte) 5, 60000L, 800, (byte) 0), + ATTACK_FARAWAY_MONSTER((byte) 5, 60000L, 5000), + ATTACK_FARAWAY_MONSTER_BAN((byte) 3, 60000L, 5, (byte) 3), + ATTACK_FARAWAY_MONSTER_SUMMON((byte) 5, 60000L, 200), + REGEN_HIGH_HP((byte) 1, 30000L, 1000, (byte) 2), + REGEN_HIGH_MP((byte) 1, 30000L, 1000, (byte) 2), + MOB_VAC((byte) 3, 7000L, 5, (byte) 3), + ITEMVAC_CLIENT((byte) 5, 5000L, 10), + ITEMVAC_SERVER((byte) 1, 10000L, 10, (byte) 2), + PET_ITEMVAC_CLIENT((byte) 5, 20000L, 20, (byte) 2), + PET_ITEMVAC_SERVER((byte) 3, 30000L, 20, (byte) 2), + USING_FARAWAY_PORTAL((byte) 1, 60000L, 100, (byte) 0), + AST_TAKE_DAMAG((byte) 1, 60000L, 100), + HIGH_AVOID((byte) 20, 180000L, 100), + HIGH_JUMP((byte) 1, 60000L), + MISMATCHING_BULLETCOUNT((byte) 1, 300000L), + ETC_EXPLOSION((byte) 1, 300000L), + ATTACKING_WHILE_DEAD((byte) 1, 300000L, -1, (byte) 0), + USING_UNAVAILABLE_ITEM((byte) 1, 300000L), + EXPLODING_NONEXISTANT((byte) 1, 300000L), + SUMMON_HACK((byte) 1, 300000L), + SUMMON_HACK_MOBS((byte) 1, 300000L), + ARAN_COMBO_HACK((byte) 1, 600000L, 50), + HEAL_ATTACKING_UNDEAD((byte) 20, 30000L, 2); + + private final byte points; + private final long validityDuration; + private final int autobancount; + private byte bantype; + + public final byte getPoints() { + return this.points; + } + + public final long getValidityDuration() { + return this.validityDuration; + } + + public final boolean shouldAutoban(final int count) { + return this.autobancount != -1 && count >= this.autobancount; + } + + public final byte getBanType() { + return this.bantype; + } + + public final void setEnabled(final boolean enabled) { + this.bantype = (byte) (byte) (enabled ? 1 : 0); + } + + public final boolean isEnabled() { + return this.bantype >= 1; + } + + private CheatingOffense(final byte points, final long validityDuration) { + this(points, validityDuration, -1, (byte) 1); + } + + private CheatingOffense(final byte points, final long validityDuration, final int autobancount) { + this(points, validityDuration, autobancount, (byte) 1); + } + + private CheatingOffense(final byte points, final long validityDuration, final int autobancount, final byte bantype) { + this.bantype = 0; + this.points = points; + this.validityDuration = validityDuration; + this.autobancount = autobancount; + this.bantype = bantype; + } +} diff --git a/src/client/anticheat/CheatingOffenseEntry.java b/src/client/anticheat/CheatingOffenseEntry.java new file mode 100644 index 0000000..0703bdb --- /dev/null +++ b/src/client/anticheat/CheatingOffenseEntry.java @@ -0,0 +1,64 @@ +package client.anticheat; + +public class CheatingOffenseEntry { + private CheatingOffense offense; + private int count; + private int characterid; + private long lastOffense; + private long firstOffense; + private String param; + private int dbid; + + public CheatingOffenseEntry(final CheatingOffense offense, final int characterid) { + this.count = 0; + this.dbid = -1; + this.offense = offense; + this.characterid = characterid; + this.firstOffense = System.currentTimeMillis(); + } + + public CheatingOffense getOffense() { + return this.offense; + } + + public int getCount() { + return this.count; + } + + public int getChrfor() { + return this.characterid; + } + + public void incrementCount() { + ++this.count; + this.lastOffense = System.currentTimeMillis(); + } + + public boolean isExpired() { + return this.lastOffense < System.currentTimeMillis() - this.offense.getValidityDuration(); + } + + public int getPoints() { + return this.count * this.offense.getPoints(); + } + + public String getParam() { + return this.param; + } + + public void setParam(final String param) { + this.param = param; + } + + public long getLastOffenseTime() { + return this.lastOffense; + } + + public int getDbId() { + return this.dbid; + } + + public void setDbId(final int dbid) { + this.dbid = dbid; + } +} diff --git a/src/client/anticheat/CheatingOffensePersister.java b/src/client/anticheat/CheatingOffensePersister.java new file mode 100644 index 0000000..917cf6c --- /dev/null +++ b/src/client/anticheat/CheatingOffensePersister.java @@ -0,0 +1,46 @@ +package client.anticheat; + +import server.Timer.CheatTimer; + +import java.util.concurrent.locks.ReentrantLock; +import java.util.LinkedHashSet; +import java.util.concurrent.locks.Lock; +import java.util.Set; + +public class CheatingOffensePersister { + private static final CheatingOffensePersister instance = new CheatingOffensePersister(); + private final Set toPersist; + private final Lock mutex; + + private CheatingOffensePersister() { + this.toPersist = (Set) new LinkedHashSet(); + this.mutex = new ReentrantLock(); + CheatTimer.getInstance().register((Runnable) new PersistingTask(), 61000L); + } + + public static CheatingOffensePersister getInstance() { + return CheatingOffensePersister.instance; + } + + public void persistEntry(final CheatingOffenseEntry coe) { + this.mutex.lock(); + try { + this.toPersist.remove(coe); + this.toPersist.add(coe); + } finally { + this.mutex.unlock(); + } + } + + public class PersistingTask implements Runnable { + @Override + public void run() { + CheatingOffensePersister.this.mutex.lock(); + try { + CheatingOffensePersister.this.toPersist.clear(); + } finally { + CheatingOffensePersister.this.mutex.unlock(); + } + } + } +} diff --git a/src/client/inventory/Equip.java b/src/client/inventory/Equip.java new file mode 100644 index 0000000..edc2edf --- /dev/null +++ b/src/client/inventory/Equip.java @@ -0,0 +1,648 @@ +package client.inventory; + +import server.Randomizer; +import constants.GameConstants; + +import java.io.Serializable; + +public class Equip extends Item implements IEquip, Serializable { + private byte upgradeSlots; + private byte level; + private byte vicioushammer; + private byte enhance; + private short str; + private short dex; + private short _int; + private short luk; + private short hp; + private short mp; + private short watk; + private short matk; + private short wdef; + private short mdef; + private short acc; + private short avoid; + private short hands; + private short speed; + private short jump; + private short potential1; + private short potential2; + private short potential3; + private short hpR; + private short mpR; + private short charmExp; + private short pvpDamage; + private long itemEXP; + private int durability; + private int incSkill; + private int dd; + private int db; + private int qg; + + public Equip(final int id, final short position, final byte flag) { + super(id, position, (short) 1, flag); + this.upgradeSlots = 0; + this.level = 0; + this.vicioushammer = 0; + this.enhance = 0; + this.str = 0; + this.dex = 0; + this._int = 0; + this.luk = 0; + this.hp = 0; + this.mp = 0; + this.watk = 0; + this.matk = 0; + this.wdef = 0; + this.mdef = 0; + this.acc = 0; + this.avoid = 0; + this.hands = 0; + this.speed = 0; + this.jump = 0; + this.potential1 = 0; + this.potential2 = 0; + this.potential3 = 0; + this.hpR = 0; + this.mpR = 0; + this.charmExp = 0; + this.pvpDamage = 0; + this.itemEXP = 0; + this.durability = -1; + this.incSkill = -1; + this.dd = 0; + this.db = 0; + this.qg = 0; + } + + public Equip(final int id, final short position) { + super(id, position, (short) 1, (byte) 0); + this.upgradeSlots = 0; + this.level = 0; + this.vicioushammer = 0; + this.enhance = 0; + this.str = 0; + this.dex = 0; + this._int = 0; + this.luk = 0; + this.hp = 0; + this.mp = 0; + this.watk = 0; + this.matk = 0; + this.wdef = 0; + this.mdef = 0; + this.acc = 0; + this.avoid = 0; + this.hands = 0; + this.speed = 0; + this.jump = 0; + this.potential1 = 0; + this.potential2 = 0; + this.potential3 = 0; + this.hpR = 0; + this.mpR = 0; + this.charmExp = 0; + this.pvpDamage = 0; + this.itemEXP = 0; + this.durability = -1; + this.incSkill = -1; + this.dd = 0; + this.db = 0; + this.qg = 0; + } + + public Equip(final int id, final short position, final int uniqueid, final byte flag) { + super(id, position, (short) 1, flag, uniqueid); + this.upgradeSlots = 0; + this.level = 0; + this.vicioushammer = 0; + this.enhance = 0; + this.str = 0; + this.dex = 0; + this._int = 0; + this.luk = 0; + this.hp = 0; + this.mp = 0; + this.watk = 0; + this.matk = 0; + this.wdef = 0; + this.mdef = 0; + this.acc = 0; + this.avoid = 0; + this.hands = 0; + this.speed = 0; + this.jump = 0; + this.potential1 = 0; + this.potential2 = 0; + this.potential3 = 0; + this.hpR = 0; + this.mpR = 0; + this.charmExp = 0; + this.pvpDamage = 0; + this.itemEXP = 0; + this.durability = -1; + this.incSkill = -1; + this.dd = 0; + this.db = 0; + this.qg = 0; + } + + @Override + public IItem copy() { + final Equip ret = new Equip(this.getItemId(), this.getPosition(), this.getUniqueId(), this.getFlag()); + ret.str = this.str; + ret.dex = this.dex; + ret._int = this._int; + ret.luk = this.luk; + ret.hp = this.hp; + ret.mp = this.mp; + ret.matk = this.matk; + ret.mdef = this.mdef; + ret.watk = this.watk; + ret.wdef = this.wdef; + ret.acc = this.acc; + ret.avoid = this.avoid; + ret.hands = this.hands; + ret.speed = this.speed; + ret.jump = this.jump; + ret.enhance = this.enhance; + ret.upgradeSlots = this.upgradeSlots; + ret.level = this.level; + ret.itemEXP = this.itemEXP; + ret.durability = this.durability; + ret.vicioushammer = this.vicioushammer; + ret.potential1 = this.potential1; + ret.potential2 = this.potential2; + ret.potential3 = this.potential3; + ret.charmExp = this.charmExp; + ret.pvpDamage = this.pvpDamage; + ret.hpR = this.hpR; + ret.mpR = this.mpR; + ret.incSkill = this.incSkill; + ret.dd = this.dd; + ret.db = this.db; + ret.qg = this.qg; + ret.setGiftFrom(this.getGiftFrom()); + ret.setOwner(this.getOwner()); + ret.setQuantity(this.getQuantity()); + ret.setExpiration(this.getExpiration()); + ret.setInventoryId(this.getInventoryId()); + ret.setEquipOnlyId(this.getEquipOnlyId()); + + return ret; + } + + @Override + public byte getType() { + return 1; + } + + @Override + public byte getUpgradeSlots() { + return this.upgradeSlots; + } + + @Override + public short getStr() { + return this.str; + } + + @Override + public short getDex() { + return this.dex; + } + + @Override + public short getInt() { + return this._int; + } + + @Override + public short getLuk() { + return this.luk; + } + + @Override + public short getHp() { + return this.hp; + } + + @Override + public short getMp() { + return this.mp; + } + + @Override + public short getWatk() { + return this.watk; + } + + @Override + public short getMatk() { + return this.matk; + } + + @Override + public short getWdef() { + return this.wdef; + } + + @Override + public short getMdef() { + return this.mdef; + } + + @Override + public short getAcc() { + return this.acc; + } + + @Override + public short getAvoid() { + return this.avoid; + } + + @Override + public short getHands() { + return this.hands; + } + + @Override + public short getSpeed() { + return this.speed; + } + + @Override + public short getJump() { + return this.jump; + } + + public void setStr(short str) { + if (str < 0) { + str = 0; + } + this.str = str; + } + + public void setDex(short dex) { + if (dex < 0) { + dex = 0; + } + this.dex = dex; + } + + public void setInt(short _int) { + if (_int < 0) { + _int = 0; + } + this._int = _int; + } + + public void setLuk(short luk) { + if (luk < 0) { + luk = 0; + } + this.luk = luk; + } + + public void setHp(short hp) { + if (hp < 0) { + hp = 0; + } + this.hp = hp; + } + + public void setMp(short mp) { + if (mp < 0) { + mp = 0; + } + this.mp = mp; + } + + public void setWatk(short watk) { + if (watk < 0) { + watk = 0; + } + this.watk = watk; + } + + public void setMatk(short matk) { + if (matk < 0) { + matk = 0; + } + this.matk = matk; + } + + public void setWdef(short wdef) { + if (wdef < 0) { + wdef = 0; + } + this.wdef = wdef; + } + + public void setMdef(short mdef) { + if (mdef < 0) { + mdef = 0; + } + this.mdef = mdef; + } + + public void setAcc(short acc) { + if (acc < 0) { + acc = 0; + } + this.acc = acc; + } + + public void setAvoid(short avoid) { + if (avoid < 0) { + avoid = 0; + } + this.avoid = avoid; + } + + public void setHands(short hands) { + if (hands < 0) { + hands = 0; + } + this.hands = hands; + } + + public void setSpeed(short speed) { + if (speed < 0) { + speed = 0; + } + this.speed = speed; + } + + public void setJump(short jump) { + if (jump < 0) { + jump = 0; + } + this.jump = jump; + } + + + public void setdd(int dd) { + if (dd < 0) { + dd = 0; + } + this.dd = dd; + } + + public void setdb(int db) { + if (db < 0) { + db = 0; + } + this.db = db; + } + + public void setqg(int qg) { + if (qg < 0) { + qg = 0; + } + this.qg = qg; + } + + + public void setUpgradeSlots(final byte upgradeSlots) { + this.upgradeSlots = upgradeSlots; + } + + @Override + public byte getLevel() { + return this.level; + } + + public void setLevel(final byte level) { + this.level = level; + } + + @Override + public byte getViciousHammer() { + return this.vicioushammer; + } + + public void setViciousHammer(final byte ham) { + this.vicioushammer = ham; + } + + @Override + public long getItemEXP() { + return this.itemEXP; + } + + public void setItemEXP(long itemEXP) { + if (itemEXP < 0) { + itemEXP = 0; + } + this.itemEXP = itemEXP; + } + + @Override + public long getEquipExp() { + if (this.itemEXP <= 0) { + return 0; + } + if (GameConstants.isWeapon(this.getItemId())) { + return this.itemEXP / 700000; + } + return this.itemEXP / 350000; + } + + @Override + public long getEquipExpForLevel() { + if (this.getEquipExp() <= 0) { + return 0; + } + long expz = this.getEquipExp(); + for (int i = this.getBaseLevel(); i <= GameConstants.getMaxLevel(this.getItemId()) && expz >= GameConstants.getExpForLevel(i, this.getItemId()); expz -= GameConstants.getExpForLevel(i, this.getItemId()), ++i) { + } + return expz; + } + + @Override + public long getExpPercentage() { + if (this.getEquipLevel() < this.getBaseLevel() || this.getEquipLevel() > GameConstants.getMaxLevel(this.getItemId()) || GameConstants.getExpForLevel(this.getEquipLevel(), this.getItemId()) <= 0) { + return 0; + } + return this.getEquipExpForLevel() * 100 / GameConstants.getExpForLevel(this.getEquipLevel(), this.getItemId()); + } + + @Override + public int getEquipLevel() { + if (GameConstants.getMaxLevel(this.getItemId()) <= 0) { + return 0; + } + if (this.getEquipExp() <= 0) { + return this.getBaseLevel(); + } + int levelz = this.getBaseLevel(); + long expz = this.getEquipExp(); + int i = levelz; + while (true) { + if (GameConstants.getStatFromWeapon(this.getItemId()) == null) { + if (i > GameConstants.getMaxLevel(this.getItemId())) { + break; + } + } else if (i >= GameConstants.getMaxLevel(this.getItemId())) { + break; + } + if (expz < GameConstants.getExpForLevel(i, this.getItemId())) { + break; + } + ++levelz; + expz -= GameConstants.getExpForLevel(i, this.getItemId()); + ++i; + } + return levelz; + } + + @Override + public int getBaseLevel() { + return (GameConstants.getStatFromWeapon(this.getItemId()) == null) ? 1 : 0; + } + + @Override + public void setQuantity(final short quantity) { + if (quantity < 0 || quantity > 1) { + throw new RuntimeException("Setting the quantity to " + (int) quantity + " on an equip (itemid: " + this.getItemId() + ")"); + } + super.setQuantity(quantity); + } + + @Override + public int getDurability() { + return this.durability; + } + + public void setDurability(final int dur) { + this.durability = dur; + } + + @Override + public byte getEnhance() { + return this.enhance; + } + + public void setEnhance(final byte en) { + this.enhance = en; + } + + @Override + public short getPotential1() { + return this.potential1; + } + + public void setPotential1(final short en) { + this.potential1 = en; + } + + @Override + public short getPotential2() { + return this.potential2; + } + + public void setPotential2(final short en) { + this.potential2 = en; + } + + @Override + public short getPotential3() { + return this.potential3; + } + + public void setPotential3(final short en) { + this.potential3 = en; + } + + @Override + public byte getState() { + final int pots = this.potential1 + this.potential2 + this.potential3; + if (this.potential1 >= 30000 || this.potential2 >= 30000 || this.potential3 >= 30000) { + return 7; + } + if (this.potential1 >= 20000 || this.potential2 >= 20000 || this.potential3 >= 20000) { + return 6; + } + if (pots >= 1) { + return 5; + } + if (pots < 0) { + return 1; + } + return 0; + } + + public void resetPotential() { + final int rank = (Randomizer.nextInt(100) < 4) ? ((Randomizer.nextInt(100) < 4) ? -7 : -6) : -5; + this.setPotential1((short) rank); + this.setPotential2((short) ((Randomizer.nextInt(10) == 1) ? rank : 0)); + this.setPotential3((short) 0); + } + + public void renewPotential() { + final int rank = (Randomizer.nextInt(100) < 4 && this.getState() != 7) ? (-(this.getState() + 1)) : (-this.getState()); + this.setPotential1((short) rank); + this.setPotential2((short) ((this.getPotential3() > 0) ? rank : 0)); + this.setPotential3((short) 0); + } + + @Override + public short getHpR() { + return this.hpR; + } + + public void setHpR(final short hp) { + this.hpR = hp; + } + + @Override + public short getMpR() { + return this.mpR; + } + + @Override + public int getdd() { + return this.dd; + } + + @Override + public int getdb() { + return this.db; + } + + @Override + public int getqg() { + return this.qg; + } + + public void setMpR(final short mp) { + this.mpR = mp; + } + + public int getIncSkill() { + return this.incSkill; + } + + public void setIncSkill(final int inc) { + this.incSkill = inc; + } + + public short getCharmEXP() { + return this.charmExp; + } + + public void setCharmEXP(final short s) { + this.charmExp = s; + } + + public short getPVPDamage() { + return this.pvpDamage; + } + + public void setPVPDamage(final short p) { + this.pvpDamage = p; + } + +} diff --git a/src/client/inventory/EquipAdditions.java b/src/client/inventory/EquipAdditions.java new file mode 100644 index 0000000..b615c58 --- /dev/null +++ b/src/client/inventory/EquipAdditions.java @@ -0,0 +1,103 @@ +package client.inventory; + +import java.util.Arrays; +import java.util.List; + +public enum EquipAdditions { + elemboost("elemVol", "elemVol", true), + mobcategory("category", "damage"), + critical("prob", "damage"), + boss("prob", "damage"), + mobdie("hpIncOnMobDie", "mpIncOnMobDie"), + hpmpchange("hpChangerPerTime", "mpChangerPerTime"), + skill("id", "level"), + statinc("incDEX", "incINT", "incLUK", "incPAD", "incSpeed", "incSTR"); + + private final String i1; + private final String i2; + private final String i3; + private final String i4; + private final String i5; + private final String i6; + private final boolean element; + + private EquipAdditions(final String i1, final String i2) { + this.i1 = i1; + this.i2 = i2; + this.i3 = ""; + this.i4 = ""; + this.i5 = ""; + this.i6 = ""; + this.element = false; + } + + private EquipAdditions(final String i1, final String i2, final boolean element) { + this.i1 = i1; + this.i2 = i2; + this.i3 = ""; + this.i4 = ""; + this.i5 = ""; + this.i6 = ""; + this.element = element; + } + + private EquipAdditions(final String i1, final String i2, final String i3, final String i4, final String i5, final String i6) { + this.i1 = i1; + this.i2 = i2; + this.i3 = i3; + this.i4 = i4; + this.i5 = i5; + this.i6 = i6; + this.element = false; + } + + public final String getValue1() { + return this.i1; + } + + public final String getValue2() { + return this.i2; + } + + public final String getValue3() { + return this.i3; + } + + public final String getValue4() { + return this.i4; + } + + public final String getValue5() { + return this.i5; + } + + public final String getValue6() { + return this.i6; + } + + public final boolean isElement() { + return this.element; + } + + public static final EquipAdditions fromString(final String str) { + for (final EquipAdditions s : values()) { + if (s.name().equalsIgnoreCase(str)) { + return s; + } + } + return null; + } + + public enum RingSet { + 天使的祝福戒指(new Integer[]{Integer.valueOf(1112585), Integer.valueOf(1112586), Integer.valueOf(1112594)}), + 职业戒指(new Integer[]{Integer.valueOf(1112427), Integer.valueOf(1112428), Integer.valueOf(1112429), Integer.valueOf(1112405), Integer.valueOf(1112445), Integer.valueOf(1112591), Integer.valueOf(1112592)}), + Evolving_Ring(new Integer[]{Integer.valueOf(1112499), Integer.valueOf(1112500), Integer.valueOf(1112501), Integer.valueOf(1112502), Integer.valueOf(1112503), Integer.valueOf(1112504), Integer.valueOf(1112505), Integer.valueOf(1112506), Integer.valueOf(1112507), Integer.valueOf(1112508), Integer.valueOf(1112509), Integer.valueOf(1112510), Integer.valueOf(1112511), Integer.valueOf(1112512), Integer.valueOf(1112513), Integer.valueOf(1112514), Integer.valueOf(1112515), Integer.valueOf(1112516), Integer.valueOf(1112517), Integer.valueOf(1112518), Integer.valueOf(1112519), Integer.valueOf(1112520), Integer.valueOf(1112521), Integer.valueOf(1112522), Integer.valueOf(1112523), Integer.valueOf(1112524), Integer.valueOf(1112525), Integer.valueOf(1112526), Integer.valueOf(1112527), Integer.valueOf(1112528), Integer.valueOf(1112529), Integer.valueOf(1112530), Integer.valueOf(1112531), Integer.valueOf(1112532), Integer.valueOf(1112533)}), + Evolving_Ring_II(new Integer[]{Integer.valueOf(1112614), Integer.valueOf(1112615), Integer.valueOf(1112616), Integer.valueOf(1112617), Integer.valueOf(1112618), Integer.valueOf(1112619), Integer.valueOf(1112620), Integer.valueOf(1112621), Integer.valueOf(1112622), Integer.valueOf(1112623), Integer.valueOf(1112624), Integer.valueOf(1112625), Integer.valueOf(1112626), Integer.valueOf(1112627), Integer.valueOf(1112628), Integer.valueOf(1112629), Integer.valueOf(1112630), Integer.valueOf(1112631), Integer.valueOf(1112632), Integer.valueOf(1112633), Integer.valueOf(1112634), Integer.valueOf(1112635), Integer.valueOf(1112636), Integer.valueOf(1112637), Integer.valueOf(1112638), Integer.valueOf(1112639), Integer.valueOf(1112640), Integer.valueOf(1112641), Integer.valueOf(1112642), Integer.valueOf(1112643), Integer.valueOf(1112644), Integer.valueOf(1112645), Integer.valueOf(1112646), Integer.valueOf(1112647), Integer.valueOf(1112648)}); + + public List id; + + private RingSet(final Integer[] ids) { + this.id = Arrays.asList(ids); + } + } +} diff --git a/src/client/inventory/IEquip.java b/src/client/inventory/IEquip.java new file mode 100644 index 0000000..fa34936 --- /dev/null +++ b/src/client/inventory/IEquip.java @@ -0,0 +1,82 @@ +package client.inventory; + +public interface IEquip extends IItem { + public static final int ARMOR_RATIO = 350000; + public static final int WEAPON_RATIO = 700000; + + byte getUpgradeSlots(); + + byte getLevel(); + + byte getViciousHammer(); + + long getItemEXP(); + + long getExpPercentage(); + + int getEquipLevel(); + + long getEquipExp(); + + long getEquipExpForLevel(); + + int getBaseLevel(); + + short getStr(); + + short getDex(); + + short getInt(); + + short getLuk(); + + short getHp(); + + short getMp(); + + short getWatk(); + + short getMatk(); + + short getWdef(); + + short getMdef(); + + short getAcc(); + + short getAvoid(); + + short getHands(); + + short getSpeed(); + + short getJump(); + + int getDurability(); + + byte getEnhance(); + + byte getState(); + + short getPotential1(); + + short getPotential2(); + + short getPotential3(); + + short getHpR(); + + short getMpR(); + + int getdd(); + + int getdb(); + + int getqg(); + + public enum ScrollResult { + SUCCESS, + FAIL, + CURSE; + } +} diff --git a/src/client/inventory/IItem.java b/src/client/inventory/IItem.java new file mode 100644 index 0000000..ae71530 --- /dev/null +++ b/src/client/inventory/IItem.java @@ -0,0 +1,59 @@ +package client.inventory; + +public interface IItem extends Comparable { + byte getType(); + + short getPosition(); + + byte getFlag(); + + short getQuantity(); + + String getOwner(); + + String getGMLog(); + + int getItemId(); + + void setItemId(final int p0); + + MaplePet getPet(); + + int getUniqueId(); + + boolean hasSetOnlyId(); + + long getEquipOnlyId(); + + long getInventoryId(); + + IItem copy(); + + IItem copyWithQuantity(final short p0); + + long getExpiration(); + + void setFlag(final byte p0); + + void setUniqueId(final int p0); + + void setEquipOnlyId(final long p0); + + void setInventoryId(final long p0); + + void setPosition(final short p0); + + void setExpiration(final long p0); + + void setOwner(final String p0); + + void setGMLog(final String p0); + + void setQuantity(final short p0); + + void setGiftFrom(final String p0); + + String getGiftFrom(); + + MapleRing getRing(); +} diff --git a/src/client/inventory/InventoryException.java b/src/client/inventory/InventoryException.java new file mode 100644 index 0000000..797e0cb --- /dev/null +++ b/src/client/inventory/InventoryException.java @@ -0,0 +1,12 @@ +package client.inventory; + +public class InventoryException extends RuntimeException { + private static final long serialVersionUID = 1L; + + public InventoryException() { + } + + public InventoryException(final String msg) { + super(msg); + } +} diff --git a/src/client/inventory/Item.java b/src/client/inventory/Item.java new file mode 100644 index 0000000..cf42aeb --- /dev/null +++ b/src/client/inventory/Item.java @@ -0,0 +1,301 @@ +package client.inventory; + +import constants.GameConstants; +import server.MapleItemInformationProvider; + +import java.io.Serializable; + +public class Item implements IItem, Serializable { + private int id; + private short position; + private short quantity; + private byte flag; + private long expiration; + private long inventoryitemid; + private MaplePet pet; + private int uniqueid; + private long equipOnlyId; + private String owner; + private String GameMaster_log; + private String giftFrom; + protected MapleRing ring; + + public Item(final int id, final short position, final short quantity, final byte flag, final int uniqueid) { + this.expiration = -1L; + this.inventoryitemid = 0L; + this.pet = null; + this.uniqueid = -1; + this.equipOnlyId = -1L; + this.owner = ""; + this.GameMaster_log = null; + this.giftFrom = ""; + this.ring = null; + this.id = id; + this.position = position; + this.quantity = quantity; + this.flag = flag; + this.uniqueid = uniqueid; + this.equipOnlyId = -1L; + } + + public Item(final int id, final short position, final short quantity, final byte flag) { + this.expiration = -1L; + this.inventoryitemid = 0L; + this.pet = null; + this.uniqueid = -1; + this.equipOnlyId = -1L; + this.owner = ""; + this.GameMaster_log = null; + this.giftFrom = ""; + this.ring = null; + this.id = id; + this.position = position; + this.quantity = quantity; + this.flag = flag; + this.equipOnlyId = -1L; + } + + @Override + public Item copyWithQuantity(final short qq) { + final Item ret = new Item(this.id, this.position, qq, this.flag, this.uniqueid); + ret.pet = this.pet; + ret.owner = this.owner; + ret.GameMaster_log = this.GameMaster_log; + ret.expiration = this.expiration; + ret.giftFrom = this.giftFrom; + ret.equipOnlyId = this.equipOnlyId; + return ret; + } + + public Item(final int id, final byte position, final short quantity) { + this.expiration = -1L; + this.inventoryitemid = 0L; + this.pet = null; + this.uniqueid = -1; + this.equipOnlyId = -1L; + this.owner = ""; + this.GameMaster_log = null; + this.giftFrom = ""; + this.ring = null; + this.id = id; + this.position = (short) position; + this.quantity = quantity; + this.equipOnlyId = -1L; + } + + @Override + public IItem copy() { + final Item ret = new Item(this.id, this.position, this.quantity, this.flag, this.uniqueid); + ret.pet = this.pet; + ret.owner = this.owner; + ret.GameMaster_log = this.GameMaster_log; + ret.expiration = this.expiration; + ret.giftFrom = this.giftFrom; + ret.quantity = this.quantity; + ret.equipOnlyId = this.equipOnlyId; + return ret; + } + + @Override + public final void setPosition(final short position) { + this.position = position; + if (this.pet != null) { + this.pet.setInventoryPosition(position); + } + } + + @Override + public void setQuantity(final short quantity) { + this.quantity = quantity; + } + + @Override + public final int getItemId() { + return this.id; + } + + @Override + public void setItemId(final int ui) { + this.id = ui; + } + + @Override + public final short getPosition() { + return this.position; + } + + @Override + public final byte getFlag() { + return this.flag; + } + + @Override + public final short getQuantity() { + return this.quantity; + } + + @Override + public byte getType() { + return 2; + } + + @Override + public final String getOwner() { + return this.owner; + } + + @Override + public final void setOwner(final String owner) { + this.owner = owner; + } + + @Override + public final void setFlag(final byte flag) { + this.flag = flag; + } + + public final void setLocked(final byte flag) { + if (flag == 1) { + this.setFlag((byte) ItemFlag.LOCK.getValue()); + } else if (flag == 0) { + this.setFlag((byte) (this.getFlag() - ItemFlag.LOCK.getValue())); + } + } + + public final boolean getLocked() { + return this.flag == ItemFlag.LOCK.getValue(); + } + + @Override + public final long getExpiration() { + return this.expiration; + } + + @Override + public final void setExpiration(final long expire) { + this.expiration = expire; + } + + @Override + public final String getGMLog() { + return this.GameMaster_log; + } + + @Override + public void setGMLog(final String GameMaster_log) { + this.GameMaster_log = GameMaster_log; + } + + @Override + public final int getUniqueId() { + return this.uniqueid; + } + + @Override + public final void setUniqueId(final int id) { + this.uniqueid = id; + } + + @Override + public boolean hasSetOnlyId() { + final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); + return this.uniqueid <= 0 && !ii.isCash(this.id) && this.id / 1000000 == 1 && this.equipOnlyId <= 0L; + } + + @Override + public long getEquipOnlyId() { + return this.equipOnlyId; + } + + @Override + public void setEquipOnlyId(final long OnlyId) { + this.equipOnlyId = OnlyId; + } + + @Override + public final long getInventoryId() { + return this.inventoryitemid; + } + + @Override + public void setInventoryId(final long ui) { + this.inventoryitemid = ui; + } + + @Override + public final MaplePet getPet() { + return this.pet; + } + + public final void setPet(final MaplePet pet) { + this.pet = pet; + } + + @Override + public void setGiftFrom(final String gf) { + this.giftFrom = gf; + } + + @Override + public String getGiftFrom() { + return this.giftFrom; + } + + @Override + public int compareTo(final IItem other) { + if (Math.abs((int) this.position) < Math.abs((int) other.getPosition())) { + return -1; + } + if (Math.abs((int) this.position) == Math.abs((int) other.getPosition())) { + return 0; + } + return 1; + } + + @Override + public boolean equals(final Object obj) { + if (!(obj instanceof IItem)) { + return false; + } + final IItem ite = (IItem) obj; + return this.uniqueid == ite.getUniqueId() && this.id == ite.getItemId() && this.quantity == ite.getQuantity() && Math.abs((int) this.position) == Math.abs((int) ite.getPosition()); + } + + @Override + public int hashCode() { + int hash = 3; + hash = 97 * hash + this.id; + hash = 97 * hash + this.position; + hash = 97 * hash + this.quantity; + hash = 97 * hash + this.uniqueid; + return hash; + } + + @Override + public String toString() { + return "物品: " + this.id + " 数量: " + (int) this.quantity; + } + + @Override + public MapleRing getRing() { + if (!GameConstants.isEffectRing(this.id) || this.getUniqueId() <= 0) { + return null; + } + if (this.ring == null) { + this.ring = MapleRing.loadFromDb(this.getUniqueId(), this.position < 0); + } + return this.ring; + } + + public void setRing(final MapleRing ring) { + this.ring = ring; + } + + public final void setLoEQed(final byte flag) { + if (flag == 1) { + this.setFlag((byte) ItemFlag.KARMA_EQ.getValue()); + } else if (flag == 0) { + this.setFlag((byte) (this.getFlag() - ItemFlag.KARMA_EQ.getValue())); + } + } +} diff --git a/src/client/inventory/ItemFlag.java b/src/client/inventory/ItemFlag.java new file mode 100644 index 0000000..b2772f2 --- /dev/null +++ b/src/client/inventory/ItemFlag.java @@ -0,0 +1,24 @@ +package client.inventory; + +public enum ItemFlag { + LOCK(1), + SPIKES(2), + COLD(4), + UNTRADEABLE(8), + KARMA_EQ(16), + KARMA_USE(2); + + private final int i; + + private ItemFlag(final int i) { + this.i = i; + } + + public final int getValue() { + return this.i; + } + + public final boolean check(final int flag) { + return (flag & this.i) == this.i; + } +} diff --git a/src/client/inventory/ItemFlag2.java b/src/client/inventory/ItemFlag2.java new file mode 100644 index 0000000..aff5cb3 --- /dev/null +++ b/src/client/inventory/ItemFlag2.java @@ -0,0 +1,23 @@ +package client.inventory; + +public enum ItemFlag2 { + notSale(16), + pickUpBlock(64), + only(128), + accountSharable(256), + tradeBlock(1024); + + private final int i; + + private ItemFlag2(final int i) { + this.i = i; + } + + public final int getValue() { + return this.i; + } + + public final boolean check(final int flag) { + return (flag & this.i) == this.i; + } +} diff --git a/src/client/inventory/ItemLoader.java b/src/client/inventory/ItemLoader.java new file mode 100644 index 0000000..6b30185 --- /dev/null +++ b/src/client/inventory/ItemLoader.java @@ -0,0 +1,308 @@ +package client.inventory; + +import java.util.logging.Level; +import java.util.logging.Logger; +import java.sql.ResultSet; +import java.sql.PreparedStatement; +import java.sql.Connection; +import java.util.Iterator; +import java.sql.SQLException; + +import tools.FileoutputUtil; +import constants.GameConstants; +import database.DBConPool; + +import java.util.LinkedHashMap; + +import tools.Pair; + +import java.util.Map; +import java.util.Arrays; +import java.util.List; + +public enum ItemLoader { + INVENTORY("inventoryitems", "inventoryequipment", 0, new String[]{"characterid"}), + STORAGE("inventoryitems", "inventoryequipment", 1, new String[]{"accountid"}), + CASHSHOP_EXPLORER("csitems", "csequipment", 2, new String[]{"accountid"}), + CASHSHOP_CYGNUS("csitems", "csequipment", 3, new String[]{"accountid"}), + CASHSHOP_ARAN("csitems", "csequipment", 4, new String[]{"accountid"}), + HIRED_MERCHANT("hiredmerchitems", "hiredmerchequipment", 5, new String[]{"packageid", "accountid"}), + DUEY("dueyitems", "dueyequipment", 6, new String[]{"packageid"}), + CASHSHOP_EVAN("csitems", "csequipment", 7, new String[]{"accountid"}), + MTS("mtsitems", "mtsequipment", 8, new String[]{"packageid"}), + MTS_TRANSFER("mtstransfer", "mtstransferequipment", 9, new String[]{"characterid"}), + CASHSHOP_DB("csitems", "csequipment", 10, new String[]{"accountid"}), + CASHSHOP_RESIST("csitems", "csequipment", 11, new String[]{"accountid"}); + + private final int value; + private final String table; + private final String table_equip; + private List arg; + + private ItemLoader(final String table, final String table_equip, final int value, final String[] arg) { + this.table = table; + this.table_equip = table_equip; + this.value = value; + this.arg = Arrays.asList(arg); + } + + public int getValue() { + return this.value; + } + + public Map> loadItems(final boolean login, final Integer... id) throws SQLException { + final List lulz = Arrays.asList(id); + final Map> items = (Map>) new LinkedHashMap(); + if (lulz.size() != this.arg.size()) { + return items; + } + final StringBuilder query = new StringBuilder(); + query.append("SELECT * FROM `"); + query.append(this.table); + query.append("` LEFT JOIN `"); + query.append(this.table_equip); + query.append("` USING(`inventoryitemid`) WHERE `type` = ?"); + for (final String g : this.arg) { + query.append(" AND `"); + query.append(g); + query.append("` = ?"); + } + if (login) { + query.append(" AND `inventorytype` = "); + query.append((int) MapleInventoryType.EQUIPPED.getType()); + } + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement(query.toString()); + ps.setInt(1, this.value); + for (int i = 0; i < lulz.size(); ++i) { + ps.setInt(i + 2, ((Integer) lulz.get(i)).intValue()); + } + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + final MapleInventoryType mit = MapleInventoryType.getByType(rs.getByte("inventorytype")); + if (mit.equals(MapleInventoryType.EQUIP) || mit.equals(MapleInventoryType.EQUIPPED)) { + final Equip equip = new Equip(rs.getInt("itemid"), rs.getShort("position"), rs.getInt("uniqueid"), rs.getByte("flag")); + if (!login) { + equip.setQuantity((short) 1); + equip.setInventoryId(rs.getLong("inventoryitemid")); + equip.setOwner(rs.getString("owner")); + equip.setExpiration(rs.getLong("expiredate")); + equip.setUpgradeSlots(rs.getByte("upgradeslots")); + equip.setLevel(rs.getByte("level")); + equip.setStr(rs.getShort("str")); + equip.setDex(rs.getShort("dex")); + equip.setInt(rs.getShort("int")); + equip.setLuk(rs.getShort("luk")); + equip.setHp(rs.getShort("hp")); + equip.setMp(rs.getShort("mp")); + equip.setWatk(rs.getShort("watk")); + equip.setMatk(rs.getShort("matk")); + equip.setWdef(rs.getShort("wdef")); + equip.setMdef(rs.getShort("mdef")); + equip.setAcc(rs.getShort("acc")); + equip.setAvoid(rs.getShort("avoid")); + equip.setHands(rs.getShort("hands")); + equip.setSpeed(rs.getShort("speed")); + equip.setJump(rs.getShort("jump")); + equip.setViciousHammer(rs.getByte("ViciousHammer")); + equip.setItemEXP(rs.getInt("itemEXP")); + equip.setGMLog(rs.getString("GM_Log")); + equip.setDurability(rs.getInt("durability")); + equip.setEnhance(rs.getByte("enhance")); + equip.setPotential1(rs.getShort("potential1")); + equip.setPotential2(rs.getShort("potential2")); + equip.setPotential3(rs.getShort("potential3")); + equip.setHpR(rs.getShort("hpR")); + equip.setMpR(rs.getShort("mpR")); + equip.setdd(rs.getInt("dd")); + equip.setdb(rs.getInt("db")); + equip.setqg(rs.getInt("qg")); + equip.setGiftFrom(rs.getString("sender")); + if (equip.getUniqueId() > -1 && GameConstants.isEffectRing(rs.getInt("itemid"))) { + final MapleRing ring = MapleRing.loadFromDb(equip.getUniqueId(), mit.equals(MapleInventoryType.EQUIPPED)); + if (ring != null) { + equip.setRing(ring); + } + } + } + items.put(Long.valueOf(rs.getLong("inventoryitemid")), new Pair(equip.copy(), mit)); + } else { + final Item item = new Item(rs.getInt("itemid"), rs.getShort("position"), rs.getShort("quantity"), rs.getByte("flag")); + item.setUniqueId(rs.getInt("uniqueid")); + item.setOwner(rs.getString("owner")); + item.setInventoryId(rs.getLong("inventoryitemid")); + item.setExpiration(rs.getLong("expiredate")); + item.setGMLog(rs.getString("GM_Log")); + item.setGiftFrom(rs.getString("sender")); + if (GameConstants.isPet(item.getItemId())) { + if (item.getUniqueId() > -1) { + final MaplePet pet = MaplePet.loadFromDb(item.getItemId(), item.getUniqueId(), item.getPosition()); + if (pet != null) { + item.setPet(pet); + } + } else { + final int new_unique = MapleInventoryIdentifier.getInstance(); + item.setUniqueId(new_unique); + item.setPet(MaplePet.createPet(item.getItemId(), new_unique)); + } + } + items.put(Long.valueOf(rs.getLong("inventoryitemid")), new Pair(item.copy(), mit)); + } + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + return items; + } + + public void saveItems(final List> items, final Integer... id) throws SQLException { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + this.saveItems(items, con, id); + con.close(); + } catch (SQLException ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + + public void saveItems(final List> items, final Connection con, final Integer... id) throws SQLException { + try { + final List lulz = Arrays.asList(id); + if (lulz.size() != this.arg.size()) { + return; + } + final StringBuilder query = new StringBuilder(); + query.append("DELETE FROM `"); + query.append(this.table); + query.append("` WHERE `type` = ? AND (`"); + query.append((String) this.arg.get(0)); + query.append("` = ?"); + if (this.arg.size() > 1) { + for (int i = 1; i < this.arg.size(); ++i) { + query.append(" OR `"); + query.append((String) this.arg.get(i)); + query.append("` = ?"); + } + } + query.append(")"); + PreparedStatement ps = con.prepareStatement(query.toString()); + ps.setInt(1, this.value); + for (int j = 0; j < lulz.size(); ++j) { + ps.setInt(j + 2, ((Integer) lulz.get(j)).intValue()); + } + ps.executeUpdate(); + ps.close(); + if (items == null) { + return; + } + final StringBuilder query_2 = new StringBuilder("INSERT INTO `"); + query_2.append(this.table); + query_2.append("` ("); + for (final String g : this.arg) { + query_2.append(g); + query_2.append(", "); + } + query_2.append("itemid, inventorytype, position, quantity, owner, GM_Log, uniqueid, expiredate, flag, `type`, sender, equipOnlyId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?"); + for (final String g : this.arg) { + query_2.append(", ?"); + } + query_2.append(")"); + ps = con.prepareStatement(query_2.toString(), 1); + final PreparedStatement pse = con.prepareStatement("INSERT INTO " + this.table_equip + " VALUES (DEFAULT, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,?,?,?)", 1); + for (final Pair pair : items) { + final IItem item = (IItem) pair.getLeft(); + final MapleInventoryType mit = (MapleInventoryType) pair.getRight(); + int k = 1; + for (int x = 0; x < lulz.size(); ++x) { + ps.setInt(k, ((Integer) lulz.get(x)).intValue()); + ++k; + } + ps.setInt(k, item.getItemId()); + ps.setInt(k + 1, (int) mit.getType()); + ps.setInt(k + 2, (int) item.getPosition()); + ps.setInt(k + 3, (int) item.getQuantity()); + ps.setString(k + 4, item.getOwner()); + ps.setString(k + 5, item.getGMLog()); + ps.setInt(k + 6, item.getUniqueId()); + ps.setLong(k + 7, item.getExpiration()); + ps.setByte(k + 8, item.getFlag()); + ps.setByte(k + 9, (byte) this.value); + ps.setString(k + 10, item.getGiftFrom()); + ps.setLong(k + 11, item.getEquipOnlyId()); + ps.executeUpdate(); + if (mit.equals(MapleInventoryType.EQUIP) || mit.equals(MapleInventoryType.EQUIPPED)) { + try (final ResultSet rs = ps.getGeneratedKeys()) { + if (!rs.next()) { + throw new RuntimeException("Inserting item failed."); + } + pse.setLong(1, rs.getLong(1)); + } + final IEquip equip = (IEquip) item; + pse.setInt(2, (int) equip.getUpgradeSlots()); + pse.setInt(3, (int) equip.getLevel()); + pse.setInt(4, (int) equip.getStr()); + pse.setInt(5, (int) equip.getDex()); + pse.setInt(6, (int) equip.getInt()); + pse.setInt(7, (int) equip.getLuk()); + pse.setInt(8, (int) equip.getHp()); + pse.setInt(9, (int) equip.getMp()); + pse.setInt(10, (int) equip.getWatk()); + pse.setInt(11, (int) equip.getMatk()); + pse.setInt(12, (int) equip.getWdef()); + pse.setInt(13, (int) equip.getMdef()); + pse.setInt(14, (int) equip.getAcc()); + pse.setInt(15, (int) equip.getAvoid()); + pse.setInt(16, (int) equip.getHands()); + pse.setInt(17, (int) equip.getSpeed()); + pse.setInt(18, (int) equip.getJump()); + pse.setInt(19, (int) equip.getViciousHammer()); + pse.setLong(20, equip.getItemEXP()); + pse.setInt(21, equip.getDurability()); + pse.setByte(22, equip.getEnhance()); + pse.setInt(23, (int) equip.getPotential1()); + pse.setInt(24, (int) equip.getPotential2()); + pse.setInt(25, (int) equip.getPotential3()); + pse.setInt(26, (int) equip.getHpR()); + pse.setInt(27, (int) equip.getMpR()); + pse.setInt(28, (int) equip.getdd()); + pse.setInt(29, (int) equip.getdb()); + pse.setInt(30, (int) equip.getqg()); + pse.executeUpdate(); + } + } + pse.close(); + ps.close(); + } catch (SQLException ex) { + System.out.println(ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + + public static boolean isExistsByUniqueid(final int uniqueid) { + for (final ItemLoader il : values()) { + final StringBuilder query = new StringBuilder(); + query.append("SELECT * FROM `inventoryitems` WHERE `type` = ? AND uniqueid = ?"); + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement(query.toString()); + ps.setInt(1, il.value); + ps.setInt(2, uniqueid); + final ResultSet rs = ps.executeQuery(); + if (rs.first()) { + rs.close(); + ps.close(); + con.close(); + return true; + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex) { + Logger.getLogger(ItemLoader.class.getName()).log(Level.SEVERE, null, (Throwable) ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + return false; + } +} diff --git a/src/client/inventory/MapleInventory.java b/src/client/inventory/MapleInventory.java new file mode 100644 index 0000000..1fbdb9c --- /dev/null +++ b/src/client/inventory/MapleInventory.java @@ -0,0 +1,294 @@ +package client.inventory; + +import java.util.LinkedList; + +import server.MapleItemInformationProvider; +import tools.MaplePacketCreator; +import client.MapleCharacter; +import constants.GameConstants; + +import java.util.Collection; +import java.util.Collections; +import java.util.ArrayList; +import java.util.List; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Map; +import java.io.Serializable; + +public class MapleInventory implements Iterable, Serializable { + private Map inventory; + private byte slotLimit; + private MapleInventoryType type; + + public MapleInventory(final MapleInventoryType type) { + this.slotLimit = 0; + this.inventory = (Map) new LinkedHashMap(); + this.type = type; + } + + public void addSlot(final byte slot) { + this.slotLimit += slot; + if (this.slotLimit > 96) { + this.slotLimit = 96; + } + } + + public byte getSlotLimit() { + return this.slotLimit; + } + + public void setSlotLimit(byte slot) { + if (slot > 96) { + slot = 96; + } + this.slotLimit = slot; + } + + public IItem findById(final int itemId) { + for (final IItem item : this.inventory.values()) { + if (item.getItemId() == itemId) { + return item; + } + } + return null; + } + + public IItem findByUniqueId(final int itemId) { + for (final IItem item : this.inventory.values()) { + if (item.getUniqueId() == itemId) { + return item; + } + } + return null; + } + + public int countById(final int itemId) { + int possesed = 0; + for (final IItem item : this.inventory.values()) { + if (item.getItemId() == itemId) { + possesed += item.getQuantity(); + } + } + return possesed; + } + + public List listById(final int itemId) { + final List ret = (List) new ArrayList(); + for (final IItem item : this.inventory.values()) { + if (item.getItemId() == itemId) { + ret.add(item); + } + } + if (ret.size() > 1) { + Collections.sort(ret); + } + return ret; + } + + public Collection list() { + return this.inventory.values(); + } + + + public ArrayList equlist() { + Collection values = this.inventory.values(); + final ArrayList ret = new ArrayList<>(); + for (final IItem item : values) { + if (item instanceof Equip) { + ret.add((Equip) item); + } + } + + return ret; + } + + public short addItem(final IItem item) { + final short slotId = this.getNextFreeSlot(); + if (slotId < 0) { + return -1; + } + this.inventory.put(Short.valueOf(slotId), item); + item.setPosition(slotId); + return slotId; + } + + public short addItem(final Item item, final int slotId) { + this.inventory.put(Short.valueOf((short) slotId), item); + item.setPosition((short) slotId); + return (short) slotId; + } + + public short addItem(final IItem item, final int slotId) { + this.inventory.put(Short.valueOf((short) slotId), item); + item.setPosition((short) slotId); + return (short) slotId; + } + + public void addFromDB(final IItem item) { + if (item.getPosition() < 0 && !this.type.equals(MapleInventoryType.EQUIPPED)) { + return; + } + this.inventory.put(Short.valueOf(item.getPosition()), item); + } + + public void move(final short sSlot, final short dSlot, final short slotMax) { + if (dSlot > this.slotLimit) { + return; + } + final Item source = (Item) this.inventory.get(Short.valueOf(sSlot)); + final Item target = (Item) this.inventory.get(Short.valueOf(dSlot)); + if (source == null) { + throw new InventoryException("Trying to move empty slot"); + } + if (target == null) { + source.setPosition(dSlot); + this.inventory.put(Short.valueOf(dSlot), source); + this.inventory.remove(Short.valueOf(sSlot)); + } else if (target.getItemId() == source.getItemId() && !GameConstants.isThrowingStar(source.getItemId()) && !GameConstants.isBullet(source.getItemId()) && target.getOwner().equals(source.getOwner()) && target.getExpiration() == source.getExpiration()) { + if (this.type.getType() == MapleInventoryType.EQUIP.getType() || this.type.getType() == MapleInventoryType.CASH.getType()) { + this.swap((IItem) target, (IItem) source); + } else if (source.getQuantity() + target.getQuantity() > slotMax) { + source.setQuantity((short) (source.getQuantity() + target.getQuantity() - slotMax)); + target.setQuantity(slotMax); + } else { + target.setQuantity((short) (source.getQuantity() + target.getQuantity())); + this.inventory.remove(Short.valueOf(sSlot)); + } + } else { + this.swap((IItem) target, (IItem) source); + } + } + + private void swap(final IItem source, final IItem target) { + this.inventory.remove(Short.valueOf(source.getPosition())); + this.inventory.remove(Short.valueOf(target.getPosition())); + final short swapPos = source.getPosition(); + source.setPosition(target.getPosition()); + target.setPosition(swapPos); + this.inventory.put(Short.valueOf(source.getPosition()), source); + this.inventory.put(Short.valueOf(target.getPosition()), target); + } + + public IItem getItem(final short slot) { + return (IItem) this.inventory.get(Short.valueOf(slot)); + } + + public void removeItem(final short slot) { + this.removeItem(slot, (short) 1, false); + } + + public void removeItem(final short slot, final short quantity, final boolean allowZero) { + this.removeItem(slot, quantity, allowZero, null); + } + + public void removeItem(final short slot, final short quantity, final boolean allowZero, final MapleCharacter chr) { + final IItem item = (IItem) this.inventory.get(Short.valueOf(slot)); + if (item == null) { + return; + } + item.setQuantity((short) (item.getQuantity() - quantity)); + if (item.getQuantity() < 0) { + item.setQuantity((short) 0); + } + if (item.getQuantity() == 0 && !allowZero) { + this.removeSlot(slot); + } + if (chr != null) { + chr.getClient().sendPacket(MaplePacketCreator.modifyInventory(false, new ModifyInventory(3, item))); + chr.dropMessage(5, "加载道具[" + MapleItemInformationProvider.getInstance().getName(item.getItemId()) + "]因到期而消失了。"); + } + } + + public void removeSlot(final short slot) { + this.inventory.remove(Short.valueOf(slot)); + } + + public boolean isFull() { + return this.inventory.size() >= this.slotLimit; + } + + public boolean isFull(final int margin) { + return this.inventory.size() + margin >= this.slotLimit; + } + + public short getNextFreeSlot() { + if (this.isFull()) { + return -1; + } + for (short i = 1; i <= this.slotLimit; ++i) { + if (!this.inventory.keySet().contains(Short.valueOf(i))) { + return i; + } + } + return -1; + } + + public int getNumSlotLimit() { + return this.inventory.size(); + } + + public short getNumFreeSlot() { + if (this.isFull()) { + return 0; + } + byte free = 0; + for (short i = 1; i <= this.slotLimit; ++i) { + if (!this.inventory.keySet().contains(Short.valueOf(i))) { + ++free; + } + } + return (short) free; + } + + public MapleInventoryType getType() { + return this.type; + } + + @Override + public Iterator iterator() { + return Collections.unmodifiableCollection(this.inventory.values()).iterator(); + } + + public IItem getItemByInventoryItemId(final Long inventoryitemid) { + for (final IItem item : this.inventory.values()) { + if (item.getInventoryId() == inventoryitemid.longValue()) { + return item; + } + } + return null; + } + + public List listByEquipOnlyId(final long equipOnlyId) { + final List ret = new ArrayList(); + for (final IItem item : this.inventory.values()) { + if (item.getEquipOnlyId() > 0L && item.getEquipOnlyId() == equipOnlyId) { + ret.add(item); + } + } + if (ret.size() > 1) { + Collections.sort(ret); + } + return (List) ret; + } + + public List newList() { + if (this.inventory.size() <= 0) { + return Collections.emptyList(); + } + return new LinkedList(this.inventory.values()); + } + + public List listIds() { + final List ret = new ArrayList(); + for (final IItem item : this.inventory.values()) { + if (!ret.contains(Integer.valueOf(item.getItemId()))) { + ret.add(Integer.valueOf(item.getItemId())); + } + } + if (ret.size() > 1) { + Collections.sort(ret); + } + return (List) ret; + } +} diff --git a/src/client/inventory/MapleInventoryIdentifier.java b/src/client/inventory/MapleInventoryIdentifier.java new file mode 100644 index 0000000..be697b5 --- /dev/null +++ b/src/client/inventory/MapleInventoryIdentifier.java @@ -0,0 +1,116 @@ +package client.inventory; + +import java.sql.ResultSet; +import java.sql.PreparedStatement; +import java.sql.Connection; + +import tools.FileoutputUtil; +import database.DBConPool; + +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.concurrent.atomic.AtomicInteger; +import java.io.Serializable; + +public class MapleInventoryIdentifier implements Serializable { + private static final long serialVersionUID = 21830921831301L; + private AtomicInteger runningUID; + private ReentrantReadWriteLock rwl; + private Lock readLock; + private Lock writeLock; + private static MapleInventoryIdentifier instance = new MapleInventoryIdentifier(); + + public MapleInventoryIdentifier() { + this.rwl = new ReentrantReadWriteLock(); + this.readLock = this.rwl.readLock(); + this.writeLock = this.rwl.writeLock(); + this.runningUID = new AtomicInteger(0); + this.getNextUniqueId(); + } + + public static int getInstance() { + return MapleInventoryIdentifier.instance.getNextUniqueId(); + } + + public int getNextUniqueId() { + if (this.grabRunningUID() <= 0) { + this.setRunningUID(this.initUID()); + } + this.incrementRunningUID(); + return this.grabRunningUID(); + } + + public int grabRunningUID() { + this.readLock.lock(); + try { + return this.runningUID.get(); + } finally { + this.readLock.unlock(); + } + } + + public void incrementRunningUID() { + this.setRunningUID(this.grabRunningUID() + 1); + } + + public void setRunningUID(final int rUID) { + if (rUID < this.grabRunningUID()) { + return; + } + this.writeLock.lock(); + try { + this.runningUID.set(rUID); + } finally { + this.writeLock.unlock(); + } + } + + public int initUID() { + int ret = 0; + if (this.grabRunningUID() > 0) { + return this.grabRunningUID(); + } + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final int[] ids = new int[4]; + PreparedStatement ps = con.prepareStatement("SELECT MAX(uniqueid) FROM inventoryitems"); + ResultSet rs = ps.executeQuery(); + if (rs.next()) { + ids[0] = rs.getInt(1) + 1; + } + rs.close(); + ps.close(); + ps = con.prepareStatement("SELECT MAX(petid) FROM pets"); + rs = ps.executeQuery(); + if (rs.next()) { + ids[1] = rs.getInt(1) + 1; + } + rs.close(); + ps.close(); + ps = con.prepareStatement("SELECT MAX(ringid) FROM rings"); + rs = ps.executeQuery(); + if (rs.next()) { + ids[2] = rs.getInt(1) + 1; + } + rs.close(); + ps.close(); + ps = con.prepareStatement("SELECT MAX(partnerringid) FROM rings"); + rs = ps.executeQuery(); + if (rs.next()) { + ids[3] = rs.getInt(1) + 1; + } + rs.close(); + ps.close(); + for (int i = 0; i < 4; ++i) { + if (ids[i] > ret) { + ret = ids[i]; + } + } + con.close(); + } catch (Exception e) { + e.printStackTrace(); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + return ret; + } + +} diff --git a/src/client/inventory/MapleInventoryType.java b/src/client/inventory/MapleInventoryType.java new file mode 100644 index 0000000..d2ac854 --- /dev/null +++ b/src/client/inventory/MapleInventoryType.java @@ -0,0 +1,55 @@ +package client.inventory; + +public enum MapleInventoryType { + UNDEFINED(0), + FACE(0), + HAIR(0), + EQUIP(1), + USE(2), + SETUP(3), + ETC(4), + CASH(5), + EQUIPPED(-1); + + final byte type; + + private MapleInventoryType(final int type) { + this.type = (byte) type; + } + + public byte getType() { + return this.type; + } + + public short getBitfieldEncoding() { + return (short) (2 << this.type); + } + + public static MapleInventoryType getByType(final byte type) { + for (final MapleInventoryType l : values()) { + if (l.getType() == type) { + return l; + } + } + return null; + } + + public static MapleInventoryType getByWZName(final String name) { + if (name.equals("Install")) { + return MapleInventoryType.SETUP; + } + if (name.equals("Consume")) { + return MapleInventoryType.USE; + } + if (name.equals("Etc")) { + return MapleInventoryType.ETC; + } + if (name.equals("Cash")) { + return MapleInventoryType.CASH; + } + if (name.equals("Pet")) { + return MapleInventoryType.CASH; + } + return MapleInventoryType.UNDEFINED; + } +} diff --git a/src/client/inventory/MapleMount.java b/src/client/inventory/MapleMount.java new file mode 100644 index 0000000..e9fdcdb --- /dev/null +++ b/src/client/inventory/MapleMount.java @@ -0,0 +1,199 @@ +package client.inventory; + +import server.Randomizer; +import server.Timer.MapTimer; +import client.MapleBuffStat; +import server.MapleInventoryManipulator; +import tools.MaplePacketCreator; +import constants.GameConstants; +import gui.Start; + +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import tools.FileoutputUtil; +import tools.FilePrinter; + +import java.sql.Connection; +import java.util.concurrent.ScheduledFuture; + +import client.MapleCharacter; + +import java.lang.ref.WeakReference; +import java.io.Serializable; + +public class MapleMount implements Serializable { + public byte fatigue; + public byte level; + private static final long serialVersionUID = 9179541993413738569L; + private final int skillid; + private int itemid; + private int exp; + private transient boolean changed; + private long lastFatigue; + private final transient WeakReference owner; + private ScheduledFuture tirednessSchedule; + private boolean Riding; + + public MapleMount(final MapleCharacter owner, final int id, final int skillid, final byte fatigue, final byte level, final int exp) { + this.changed = false; + this.lastFatigue = 0L; + this.Riding = false; + this.itemid = id; + this.skillid = skillid; + this.fatigue = fatigue; + this.level = level; + this.exp = exp; + this.owner = new WeakReference(owner); + } + + public void saveMount(final int charid, final Connection con) { + if (!this.changed) { + return; + } + try (final PreparedStatement ps = con.prepareStatement("UPDATE mountdata set `Level` = ?, `Exp` = ?, `Fatigue` = ? WHERE characterid = ?")) { + ps.setByte(1, this.level); + ps.setInt(2, this.exp); + ps.setByte(3, this.fatigue); + ps.setInt(4, charid); + ps.executeUpdate(); + } catch (SQLException ex) { + FilePrinter.printError("MapleMount.txt", (Throwable) ex, "saveMount"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + + public int getItemId() { + return this.itemid; + } + + public int getSkillId() { + return this.skillid; + } + + public byte getFatigue() { + return this.fatigue; + } + + public int getExp() { + return this.exp; + } + + public byte getLevel() { + return this.level; + } + + public void setItemId(final int c) { + this.changed = true; + this.itemid = c; + } + + public void setFatigue(final byte amount) { + this.changed = true; + this.fatigue += amount; + if (this.fatigue < 0) { + this.fatigue = 0; + } + } + + public void setExp(final int c) { + this.changed = true; + this.exp = c; + } + + public void setLevel(final byte c) { + this.changed = true; + this.level = c; + } + + public void increaseFatigue() { + final MapleCharacter chr = (MapleCharacter) this.owner.get(); + this.changed = true; + ++this.fatigue; + if (chr != null && ((Integer) Start.ConfigValuesMap.get("坐骑恢复开关")).intValue() > 0) { + final int itemid = 2260000; + final int toUse = chr.getItemQuantity(2260000, false); + final MapleMount mount = chr.getMount(); + boolean pd = false; + if (chr.getItemQuantity(((Integer) Start.ConfigValuesMap.get("坐骑恢复道具")).intValue(), false) > 0) { + pd = true; + } + if (pd && this.fatigue >= ((Integer) Start.ConfigValuesMap.get("坐骑恢复频率")).intValue() && toUse > 0) { + final int fatigue = mount.getFatigue(); + boolean levelup = false; + mount.setFatigue((byte) (-30)); + if (fatigue > 0) { + mount.increaseExp(); + final int level = mount.getLevel(); + if (level < 30 && mount.getExp() >= GameConstants.getMountExpNeededForLevel(level + 1)) { + mount.setLevel((byte) (level + 1)); + levelup = true; + } + } + chr.getMap().broadcastMessage(MaplePacketCreator.updateMount(chr, levelup)); + if (chr != null) { + MapleInventoryManipulator.removeById(chr.getClient(), MapleInventoryType.USE, 2260000, 1, false, false); + chr.getClient().getSession().write(MaplePacketCreator.getShowItemGain(2260000, (short) (-1), true)); + chr.dropMessage(5, "VIP自动使用骑宠疲劳药水,目前骑宠疲劳:" + fatigue); + } + } + } + if (chr != null && chr.getMap() != null) { + chr.getMap().broadcastMessage(MaplePacketCreator.updateMount(chr, false)); + } + if (((Integer) Start.ConfigValuesMap.get("坐骑不饥饿开关")).intValue() > 0) { + this.fatigue = 100; + } + if (this.fatigue > 99) { + this.fatigue = 95; + if (chr != null) { + chr.cancelEffectFromBuffStat(MapleBuffStat.MONSTER_RIDING); + } + } + } + + public final boolean canTire(final long now) { + return this.lastFatigue > 0L && this.lastFatigue + 30000L < now; + } + + public long getTiredness() { + return this.lastFatigue; + } + + public void startSchedule() { + this.changed = true; + this.tirednessSchedule = MapTimer.getInstance().register((Runnable) new Runnable() { + @Override + public void run() { + if (MapleMount.this.Riding) { + MapleMount.this.increaseFatigue(); + if (MapleMount.this.owner.get() != null) { + } + } else { + MapleMount.this.Riding = true; + } + } + }, 60000L); + } + + public void cancelSchedule() { + if (this.tirednessSchedule != null) { + this.Riding = false; + this.tirednessSchedule.cancel(false); + } + } + + public void increaseExp() { + int e; + if (this.level >= 1 && this.level <= 7) { + e = Randomizer.nextInt(10) + 15; + } else if (this.level >= 8 && this.level <= 15) { + e = Randomizer.nextInt(13) + 7; + } else if (this.level >= 16 && this.level <= 24) { + e = Randomizer.nextInt(23) + 9; + } else { + e = Randomizer.nextInt(28) + 12; + } + this.setExp(this.exp + e); + } +} diff --git a/src/client/inventory/MaplePet.java b/src/client/inventory/MaplePet.java new file mode 100644 index 0000000..2d4b788 --- /dev/null +++ b/src/client/inventory/MaplePet.java @@ -0,0 +1,417 @@ +package client.inventory; + +import java.util.ArrayList; + +import server.movement.StaticLifeMovement; +import server.movement.LifeMovementFragment; + +import java.util.List; +import java.util.Iterator; + +import server.MapleItemInformationProvider; + +import java.sql.ResultSet; +import java.sql.PreparedStatement; +import java.sql.Connection; +import java.sql.SQLException; + +import tools.FileoutputUtil; +import tools.FilePrinter; +import database.DBConPool; + +import java.awt.Point; +import java.io.Serializable; + +public class MaplePet implements Serializable { + private static final long serialVersionUID = 9179541993413738569L; + private String name; + private final int uniqueid; + private final int petitemid; + private int Fh; + private int stance; + private int limitedLife; + private Point pos; + private byte fullness; + private byte level; + private byte summoned; + private short inventorypos; + private short closeness; + private short flags; + private boolean changed; + private int[] excluded; + + private MaplePet(final int petitemid, final int uniqueid) { + this.Fh = 0; + this.stance = 0; + this.limitedLife = 0; + this.fullness = 100; + this.level = 1; + this.summoned = 0; + this.inventorypos = 0; + this.closeness = 0; + this.flags = 0; + this.changed = false; + this.excluded = new int[10]; + this.petitemid = petitemid; + this.uniqueid = uniqueid; + for (int i = 0; i < this.excluded.length; ++i) { + this.excluded[i] = 0; + } + } + + private MaplePet(final int petitemid, final int uniqueid, final short inventorypos) { + this.Fh = 0; + this.stance = 0; + this.limitedLife = 0; + this.fullness = 100; + this.level = 1; + this.summoned = 0; + this.inventorypos = 0; + this.closeness = 0; + this.flags = 0; + this.changed = false; + this.excluded = new int[10]; + this.petitemid = petitemid; + this.uniqueid = uniqueid; + this.inventorypos = inventorypos; + for (int i = 0; i < this.excluded.length; ++i) { + this.excluded[i] = 0; + } + } + + public static final MaplePet loadFromDb(final int itemid, final int petid, final short inventorypos) { + final MaplePet ret = new MaplePet(itemid, petid, inventorypos); + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT * FROM pets WHERE petid = ?")) { + ps.setInt(1, petid); + try (final ResultSet rs = ps.executeQuery()) { + if (!rs.next()) { + rs.close(); + ps.close(); + return null; + } + ret.setName(rs.getString("name")); + ret.setCloseness((int) rs.getShort("closeness")); + ret.setLevel((int) rs.getByte("level")); + ret.setFullness((int) rs.getByte("fullness")); + ret.setLimitedLife(rs.getInt("seconds")); + ret.setFlags((int) rs.getShort("flags")); + final String[] list = rs.getString("excluded").split(","); + for (int i = 0; i < ret.excluded.length; ++i) { + ret.excluded[i] = Integer.parseInt(list[i]); + } + ret.changed = false; + rs.close(); + } + ps.close(); + con.close(); + return ret; + } catch (SQLException ex) { + FilePrinter.printError("MaplePet.txt", (Throwable) ex, "loadFromDb"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + return null; + } + } + + public final void saveToDb() { + if (!this.changed) { + return; + } + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("UPDATE pets SET name = ?, level = ?, closeness = ?, fullness = ?, seconds = ?, flags = ?, excluded = ? WHERE petid = ?")) { + ps.setString(1, this.name); + ps.setByte(2, this.level); + ps.setShort(3, this.closeness); + ps.setByte(4, this.fullness); + ps.setInt(5, this.limitedLife); + ps.setShort(6, this.flags); + final StringBuilder list = new StringBuilder(); + for (int i = 0; i < this.excluded.length; ++i) { + list.append(this.excluded[i]); + list.append(","); + } + final String newlist = list.toString(); + ps.setString(7, newlist.substring(0, newlist.length() - 1)); + ps.setInt(8, this.uniqueid); + ps.executeUpdate(); + ps.close(); + con.close(); + this.changed = false; + } catch (SQLException ex) { + FilePrinter.printError("MaplePet.txt", (Throwable) ex, "saveToDb"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + + public static final MaplePet createPet(final int itemid, final int uniqueid) { + final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); + return createPet(itemid, ii.getName(itemid), 1, 0, 100, uniqueid, ii.getPetLimitLife(itemid), ii.getPetFlagInfo(itemid)); + } + + public static final MaplePet createPet(final int itemid, final String name, final int level, final int closeness, final int fullness, int uniqueid, final int limitedLife, final short flag) { + if (uniqueid <= -1) { + uniqueid = MapleInventoryIdentifier.getInstance(); + } + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement pse = con.prepareStatement("INSERT INTO pets (petid, name, level, closeness, fullness, seconds, flags) VALUES (?, ?, ?, ?, ?, ?, ?)")) { + pse.setInt(1, uniqueid); + pse.setString(2, name); + pse.setByte(3, (byte) level); + pse.setShort(4, (short) closeness); + pse.setByte(5, (byte) fullness); + pse.setInt(6, limitedLife); + pse.setShort(7, flag); + pse.executeUpdate(); + pse.close(); + con.close(); + } catch (SQLException ex) { + FilePrinter.printError("MaplePet.txt", (Throwable) ex, "createPet"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + return null; + } + final MaplePet pet = new MaplePet(itemid, uniqueid); + pet.setName(name); + pet.setLevel(level); + pet.setFullness(fullness); + pet.setCloseness(closeness); + pet.setFlags((int) flag); + pet.setLimitedLife(limitedLife); + return pet; + } + + public final String getName() { + if (this.name == null) { + this.setName(MapleItemInformationProvider.getInstance().getName(this.petitemid)); + } + return this.name; + } + + public final void setName(final String name) { + this.name = name; + this.changed = true; + } + + public final boolean getSummoned() { + return this.summoned > 0; + } + + public final byte getSummonedValue() { + return this.summoned; + } + + public final void setSummoned(final int summoned) { + this.summoned = (byte) summoned; + } + + public final short getInventoryPosition() { + return this.inventorypos; + } + + public final void setInventoryPosition(final short inventorypos) { + this.inventorypos = inventorypos; + } + + public int getUniqueId() { + return this.uniqueid; + } + + public final short getCloseness() { + return this.closeness; + } + + public final void setCloseness(int closeness) { + if (closeness >= Integer.MAX_VALUE || closeness <= 0) { + closeness = 1; + } + this.closeness = (short) closeness; + this.changed = true; + } + + public final byte getLevel() { + return this.level; + } + + public final void setLevel(final int level) { + this.level = (byte) level; + this.changed = true; + } + + public final byte getFullness() { + return this.fullness; + } + + public final void setFullness(final int fullness) { + this.fullness = (byte) fullness; + this.changed = true; + } + + public final short getFlags() { + return this.flags; + } + + public final void setFlags(final int fffh) { + this.flags = (short) fffh; + this.changed = true; + } + + public final int getFh() { + return this.Fh; + } + + public final void setFh(final int Fh) { + this.Fh = Fh; + } + + public final Point getPos() { + return this.pos; + } + + public final void setPos(final Point pos) { + this.pos = pos; + } + + public final int getStance() { + return this.stance; + } + + public final void setStance(final int stance) { + this.stance = stance; + } + + public final int getPetItemId() { + return this.petitemid; + } + + public final boolean canConsume(final int itemId) { + final MapleItemInformationProvider mii = MapleItemInformationProvider.getInstance(); + final Iterator iterator = mii.petsCanConsume(itemId).iterator(); + while (iterator.hasNext()) { + final int petId = ((Integer) iterator.next()).intValue(); + if (petId == this.petitemid) { + return true; + } + } + return false; + } + + public final void updatePosition(final List movement) { + for (final LifeMovementFragment move : movement) { + if (move instanceof StaticLifeMovement) { + final Point newPos = move.getPosition(); + if (newPos == null) { + continue; + } + this.setPos(newPos); + this.setStance(((StaticLifeMovement) move).getNewstate()); + } + } + } + + public final int getSecondsLeft() { + return this.limitedLife; + } + + public final void setLimitedLife(final int sl) { + this.limitedLife = sl; + this.changed = true; + } + + public static void main(final String[] args) { + clearPet(); + } + + public static void clearPet() { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT * FROM pets"); + final ResultSet rs = ps.executeQuery(); + while (rs.next()) { + final int uid = rs.getInt("petid"); + if (!ItemLoader.isExistsByUniqueid(uid)) { + ps = con.prepareStatement("DELETE FROM pets WHERE petid = ?"); + ps.setInt(1, uid); + ps.executeUpdate(); + System.err.println("宠物:" + rs.getString("name") + " petid: " + uid + " 不存在, 清理。"); + } + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException se) { + System.err.println("[MaplePet] 从数据库中加载宠物讯息出错"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) se); + } + } + + public void clearExcluded() { + for (int i = 0; i < this.excluded.length; ++i) { + this.excluded[i] = 0; + } + this.changed = true; + } + + public List getExcluded() { + final List list = new ArrayList(); + for (int i = 0; i < this.excluded.length; ++i) { + if (this.excluded[i] > 0 && PetFlag.UNPICKABLE.check((int) this.flags)) { + list.add(Integer.valueOf(this.excluded[i])); + } + } + return (List) list; + } + + public void addExcluded(final int i, final int itemId) { + if (i < this.excluded.length) { + this.excluded[i] = itemId; + this.changed = true; + } + } + + public enum PetFlag { + ITEM_PICKUP(1, 5190000, 5191000), + EXPAND_PICKUP(2, 5190002, 5191002), + AUTO_PICKUP(4, 5190003, 5191003), + UNPICKABLE(8, 5190005, -1), + LEFTOVER_PICKUP(16, 5190004, 5191004), + HP_CHARGE(32, 5190001, 5191001), + MP_CHARGE(64, 5190006, -1), + PET_BUFF(128, -1, -1), + PET_DRAW(256, 5190007, -1), + PET_DIALOGUE(512, 5190008, -1); + + private final int i; + private final int item; + private final int remove; + + private PetFlag(final int i, final int item, final int remove) { + this.i = i; + this.item = item; + this.remove = remove; + } + + public final int getValue() { + return this.i; + } + + public final boolean check(final int flag) { + return (flag & this.i) == this.i; + } + + public static final PetFlag getByAddId(final int itemId) { + for (final PetFlag flag : values()) { + if (flag.item == itemId) { + return flag; + } + } + return null; + } + + public static final PetFlag getByDelId(final int itemId) { + for (final PetFlag flag : values()) { + if (flag.remove == itemId) { + return flag; + } + } + return null; + } + } +} diff --git a/src/client/inventory/MapleRing.java b/src/client/inventory/MapleRing.java new file mode 100644 index 0000000..c3431ed --- /dev/null +++ b/src/client/inventory/MapleRing.java @@ -0,0 +1,198 @@ +package client.inventory; + +import java.util.Comparator; + +import server.MapleInventoryManipulator; +import com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException; +import client.MapleCharacter; + +import java.sql.ResultSet; +import java.sql.PreparedStatement; +import java.sql.Connection; +import java.sql.SQLException; + +import tools.FileoutputUtil; +import tools.FilePrinter; +import database.DBConPool; + +import java.io.Serializable; + +public class MapleRing implements Serializable { + private static final long serialVersionUID = 9179541993413738579L; + private final int ringId; + private final int ringId2; + private final int partnerId; + private final int itemId; + private String partnerName; + private boolean equipped; + + private MapleRing(final int id, final int id2, final int partnerId, final int itemid, final String partnerName) { + this.equipped = false; + this.ringId = id; + this.ringId2 = id2; + this.partnerId = partnerId; + this.itemId = itemid; + this.partnerName = partnerName; + } + + public static MapleRing loadFromDb(final int ringId) { + return loadFromDb(ringId, false); + } + + public static MapleRing loadFromDb(final int ringId, final boolean equipped) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + final PreparedStatement ps = con.prepareStatement("SELECT * FROM rings WHERE ringId = ?")) { + ps.setInt(1, ringId); + MapleRing ret; + try (final ResultSet rs = ps.executeQuery()) { + ret = null; + if (rs.next()) { + ret = new MapleRing(ringId, rs.getInt("partnerRingId"), rs.getInt("partnerChrId"), rs.getInt("itemid"), rs.getString("partnerName")); + ret.setEquipped(equipped); + } + rs.close(); + } + ps.close(); + con.close(); + return ret; + } catch (SQLException ex) { + FilePrinter.printError("MapleRing.txt", (Throwable) ex, "loadFromDB"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + return null; + } + } + + public static void addToDB(final int itemid, final MapleCharacter chr, final String player, final int id, final int[] ringId) throws SQLException { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = con.prepareStatement("INSERT INTO rings (ringId, itemid, partnerChrId, partnerName, partnerRingId) VALUES (?, ?, ?, ?, ?)"); + ps.setInt(1, ringId[0]); + ps.setInt(2, itemid); + ps.setInt(3, chr.getId()); + ps.setString(4, chr.getName()); + ps.setInt(5, ringId[1]); + ps.executeUpdate(); + ps.close(); + ps = con.prepareStatement("INSERT INTO rings (ringId, itemid, partnerChrId, partnerName, partnerRingId) VALUES (?, ?, ?, ?, ?)"); + ps.setInt(1, ringId[1]); + ps.setInt(2, itemid); + ps.setInt(3, id); + ps.setString(4, player); + ps.setInt(5, ringId[0]); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException ex) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + + public static int createRing(final int itemid, final MapleCharacter partner1, final String partner2, final String msg, final int id2, final int sn) { + try { + if (partner1 == null) { + return -2; + } + if (id2 <= 0) { + return -1; + } + return makeRing(itemid, partner1, partner2, id2, msg, sn); + } catch (Exception ex) { + FilePrinter.printError("MapleRing.txt", (Throwable) ex, "createRing"); + return 0; + } + } + + public static int makeRing(final int itemid, final MapleCharacter partner1, final String partner2, final int id2, final String msg, final int sn) throws Exception { + final int[] ringID = {MapleInventoryIdentifier.getInstance(), MapleInventoryIdentifier.getInstance()}; + try { + addToDB(itemid, partner1, partner2, id2, ringID); + } catch (MySQLIntegrityConstraintViolationException mslcve) { + return 0; + } + MapleInventoryManipulator.addRing(partner1, itemid, ringID[1], sn); + partner1.getCashInventory().gift(id2, partner1.getName(), msg, sn, ringID[0]); + return 1; + } + + public int getRingId() { + return this.ringId; + } + + public int getPartnerRingId() { + return this.ringId2; + } + + public int getPartnerChrId() { + return this.partnerId; + } + + public int getItemId() { + return this.itemId; + } + + public boolean isEquipped() { + return this.equipped; + } + + public void setEquipped(final boolean equipped) { + this.equipped = equipped; + } + + public String getPartnerName() { + return this.partnerName; + } + + public void setPartnerName(final String partnerName) { + this.partnerName = partnerName; + } + + @Override + public boolean equals(final Object o) { + return o instanceof MapleRing && ((MapleRing) o).getRingId() == this.getRingId(); + } + + @Override + public int hashCode() { + int hash = 5; + hash = 53 * hash + this.ringId; + return hash; + } + + public static void removeRingFromDB(final MapleCharacter player) { + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT * FROM rings WHERE partnerChrId = ?"); + ps.setInt(1, player.getId()); + final ResultSet rs = ps.executeQuery(); + if (!rs.next()) { + ps.close(); + rs.close(); + return; + } + final int otherId = rs.getInt("partnerRingId"); + final int otherotherId = rs.getInt("ringId"); + rs.close(); + ps.close(); + ps = con.prepareStatement("DELETE FROM rings WHERE ringId = ? OR ringId = ?"); + ps.setInt(1, otherotherId); + ps.setInt(2, otherId); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException ex) { + FilePrinter.printError("MapleRing.txt", (Throwable) ex, "removeRingFromDB"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + + public static class RingComparator implements Comparator, Serializable { + @Override + public int compare(final MapleRing o1, final MapleRing o2) { + if (o1.ringId < o2.ringId) { + return -1; + } + if (o1.ringId == o2.ringId) { + return 0; + } + return 1; + } + } +} diff --git a/src/client/inventory/MapleWeaponType.java b/src/client/inventory/MapleWeaponType.java new file mode 100644 index 0000000..0f1e95e --- /dev/null +++ b/src/client/inventory/MapleWeaponType.java @@ -0,0 +1,54 @@ +package client.inventory; + +public enum MapleWeaponType { + 沒有武器(0.0f, 0), + 闪亮克魯(1.2f, 25), + 灵魂射手(1.7f, 15), + 魔剑(1.3f, 20), + 能量剑(1.3125f, 20), + 幻兽棍棒(1.34f, 20), + 单手剑(1.2f, 20), + 单手斧(1.2f, 20), + 单手棍(1.2f, 20), + 短剑(1.3f, 20), + 双刀(1.3f, 20), + 手杖(1.3f, 20), + 短杖(1.0f, 25), + 长杖(1.0f, 25), + 双手剑(1.34f, 20), + 双手斧(1.34f, 20), + 双手棍(1.34f, 20), + 枪(1.49f, 20), + 矛(1.49f, 20), + 弓(1.3f, 15), + 弩(1.35f, 15), + 拳套(1.75f, 15), + 指虎(1.7f, 20), + 火枪(1.5f, 15), + 双弩枪(1.3f, 15), + 加農炮(1.5f, 15), + 太刀(1.25f, 20), + 扇子(1.35f, 25), + 琉(1.49f, 20), + 璃(1.34f, 20), + ESP限制器(1.0f, 20), + BIG_SWORD(1.3f, 15), + LONG_SWORD(1.3f, 15), + 未知(0.0f, 0); + + private final float damageMultiplier; + private final int baseMastery; + + private MapleWeaponType(final float maxDamageMultiplier, final int baseMastery) { + this.damageMultiplier = maxDamageMultiplier; + this.baseMastery = baseMastery; + } + + public final float getMaxDamageMultiplier() { + return this.damageMultiplier; + } + + public final int getBaseMastery() { + return this.baseMastery; + } +} diff --git a/src/client/inventory/ModifyInventory.java b/src/client/inventory/ModifyInventory.java new file mode 100644 index 0000000..5ac27d0 --- /dev/null +++ b/src/client/inventory/ModifyInventory.java @@ -0,0 +1,55 @@ +package client.inventory; + +import constants.GameConstants; + +public class ModifyInventory { + private final int mode; + private IItem item; + private short oldPos; + + public ModifyInventory(final int mode, final IItem item) { + this.mode = mode; + this.item = item.copy(); + } + + public ModifyInventory(final int mode, final IItem item, final short oldPos) { + this.mode = mode; + this.item = item.copy(); + this.oldPos = oldPos; + } + + public final int getMode() { + return this.mode; + } + + public final int getInventoryType() { + return GameConstants.getInventoryType(this.item.getItemId()).getType(); + } + + public final short getPosition() { + return this.item.getPosition(); + } + + public final short getOldPosition() { + return this.oldPos; + } + + public final short getQuantity() { + return this.item.getQuantity(); + } + + public final IItem getItem() { + return this.item; + } + + public final void clear() { + this.item = null; + } + + public static class Types { + public static final int ADD = 0; + public static final int UPDATE = 1; + public static final int MOVE = 2; + public static final int REMOVE = 3; + } +} diff --git a/src/client/inventory/OnlyID.java b/src/client/inventory/OnlyID.java new file mode 100644 index 0000000..69ba333 --- /dev/null +++ b/src/client/inventory/OnlyID.java @@ -0,0 +1,170 @@ +package client.inventory; + +import java.util.ListIterator; +import java.sql.ResultSet; +import java.sql.PreparedStatement; +import java.sql.Connection; +import java.util.Map; +import java.sql.SQLException; + +import tools.FileoutputUtil; +import handling.world.World.Broadcast; +import tools.MaplePacketCreator; +import server.MapleItemInformationProvider; +import tools.Quadra; +import database.DBConPool; + +import java.util.LinkedList; +import java.util.HashMap; +import java.util.ArrayList; + +import server.Timer.WorldTimer; +import tools.Triple; + +import java.util.List; + +public class OnlyID { + private static final OnlyID instance = new OnlyID(); + private static List> OnlyIDList = (List>) new ArrayList(); + + public static OnlyID getInstance() { + return OnlyID.instance; + } + + protected OnlyID() { + WorldTimer.getInstance().register((Runnable) new run(), 43200000L); + } + + public static List> getData() { + return OnlyID.OnlyIDList; + } + + public static void addData(final int chrid, final long inventoryitemid, final long ItemOnlyID) { + OnlyID.OnlyIDList.add(new Triple(Integer.valueOf(chrid), Long.valueOf(inventoryitemid), Long.valueOf(ItemOnlyID))); + } + + public static void removeData(final int chrid) { + OnlyID.OnlyIDList.remove(chrid); + } + + public static void clearData() { + if (!OnlyID.OnlyIDList.isEmpty()) { + OnlyID.OnlyIDList.clear(); + } + } + + public void StartCheckings() { + StartChecking(); + } + + public static void StartChecking() { + if (!OnlyID.OnlyIDList.isEmpty()) { + OnlyID.OnlyIDList.clear(); + } + StringBuilder chrs = new StringBuilder(); + StringBuilder Sql = new StringBuilder(); + final List> equipOnlyIds = (List>) new ArrayList(); + final Map checkItems = new HashMap(); + final List all = (List) new LinkedList(); + final List gm = (List) new LinkedList(); + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + PreparedStatement ps = con.prepareStatement("SELECT characterid FROM inventoryitems WHERE equipOnlyId > 0"); + ResultSet rs = ps.executeQuery(); + while (rs.next()) { + final int chr = rs.getInt("characterid"); + if (chr != 0) { + all.add(Integer.valueOf(chr)); + } + } + ps.close(); + rs.close(); + Sql = new StringBuilder(); + if (!all.isEmpty()) { + Sql.append("and (id = "); + for (int i = 0; i < all.size(); ++i) { + Sql.append(all.get(i)); + if (i < all.size() - 1) { + Sql.append(" OR id = "); + } + } + Sql.append(")"); + } + ps = con.prepareStatement("SELECT id FROM characters WHERE gm > 0 " + Sql); + rs = ps.executeQuery(); + while (rs.next()) { + final int chr = rs.getInt("id"); + if (chr != 0) { + gm.add(Integer.valueOf(chr)); + } + } + ps.close(); + rs.close(); + Sql = new StringBuilder(); + if (!gm.isEmpty()) { + Sql.append("and characterid != "); + for (int i = 0; i < gm.size(); ++i) { + Sql.append(gm.get(i)); + if (i < gm.size() - 1) { + Sql.append(" and characterid != "); + } + } + } + ps = con.prepareStatement("SELECT * FROM inventoryitems WHERE equipOnlyId > 0 " + Sql); + rs = ps.executeQuery(); + while (rs.next()) { + final int chr = rs.getInt("characterid"); + final int ac = rs.getInt("accountid"); + final int itemId = rs.getInt("itemId"); + final long equipOnlyId = rs.getLong("equipOnlyId"); + final long inventoryitemid = rs.getLong("inventoryitemid"); + if (equipOnlyId > 0L) { + if (checkItems.containsKey(Long.valueOf(equipOnlyId))) { + if (((Integer) checkItems.get(Long.valueOf(equipOnlyId))).intValue() != itemId) { + continue; + } + equipOnlyIds.add(new Quadra(Integer.valueOf(chr), Integer.valueOf(ac), Long.valueOf(equipOnlyId), Integer.valueOf(itemId))); + addData(chr, inventoryitemid, equipOnlyId); + } else { + checkItems.put(Long.valueOf(equipOnlyId), Integer.valueOf(itemId)); + } + } + } + rs.close(); + ps.close(); + final ListIterator> OnlyId = equipOnlyIds.listIterator(); + while (OnlyId.hasNext()) { + chrs = new StringBuilder(); + final Quadra Only = OnlyId.next(); + final long itemonly = ((Long) Only.getThird()).longValue(); + final int item = ((Integer) Only.getForth()).intValue(); + ps = con.prepareStatement("SELECT characterid FROM inventoryitems WHERE equipOnlyId = " + itemonly); + rs = ps.executeQuery(); + while (rs.next()) { + final int chr2 = rs.getInt("characterid"); + if (chr2 != 0) { + chrs.append("角色 [").append(chr2).append("]"); + } + } + rs.close(); + ps.close(); + String itemname = "null"; + itemname = MapleItemInformationProvider.getInstance().getName(item); + final String msg = "发现复制,唯一ID [" + itemonly + "] " + chrs.toString() + " 物品[" + itemname + "](" + item + ")"; + System.out.println(msg); + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, msg)); + FileoutputUtil.logToFile("Hack/复制装备.txt", FileoutputUtil.CurrentReadable_TimeGMT() + " " + msg + "\r\n"); + } + con.close(); + } catch (SQLException ex) { + System.out.println("[EXCEPTION] 复制装备出现错误." + ex); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + } + } + + public static class run implements Runnable { + @Override + public void run() { + OnlyID.StartChecking(); + } + } +} diff --git a/src/client/inventory/PetCommand.java b/src/client/inventory/PetCommand.java new file mode 100644 index 0000000..ba53428 --- /dev/null +++ b/src/client/inventory/PetCommand.java @@ -0,0 +1,31 @@ +package client.inventory; + +public class PetCommand { + private final int petId; + private final int skillId; + private final int prob; + private final int inc; + + public PetCommand(final int petId, final int skillId, final int prob, final int inc) { + this.petId = petId; + this.skillId = skillId; + this.prob = prob; + this.inc = inc; + } + + public int getPetId() { + return this.petId; + } + + public int getSkillId() { + return this.skillId; + } + + public int getProbability() { + return this.prob; + } + + public int getIncrease() { + return this.inc; + } +} diff --git a/src/client/inventory/PetDataFactory.java b/src/client/inventory/PetDataFactory.java new file mode 100644 index 0000000..709d3a0 --- /dev/null +++ b/src/client/inventory/PetDataFactory.java @@ -0,0 +1,47 @@ +package client.inventory; + +import java.util.HashMap; + +import provider.MapleDataProviderFactory; +import provider.MapleData; +import provider.MapleDataTool; +import tools.Pair; + +import java.util.Map; + +import provider.MapleDataProvider; + +public class PetDataFactory { + private static final MapleDataProvider dataRoot = MapleDataProviderFactory.getDataProvider("Item.wz"); + private static final Map, PetCommand> petCommands = new HashMap(); + private static final Map petHunger = new HashMap(); + + public static final PetCommand getPetCommand(final int petId, final int skillId) { + PetCommand ret = (PetCommand) PetDataFactory.petCommands.get(new Pair(Integer.valueOf(petId), Integer.valueOf(skillId))); + if (ret != null) { + return ret; + } + final MapleData skillData = PetDataFactory.dataRoot.getData("Pet/" + petId + ".img"); + int prob = 0; + int inc = 0; + if (skillData != null) { + prob = MapleDataTool.getInt("interact/" + skillId + "/prob", skillData, 0); + inc = MapleDataTool.getInt("interact/" + skillId + "/inc", skillData, 0); + } + ret = new PetCommand(petId, skillId, prob, inc); + PetDataFactory.petCommands.put(new Pair(Integer.valueOf(petId), Integer.valueOf(skillId)), ret); + return ret; + } + + public static final int getHunger(final int petId) { + Integer ret = (Integer) PetDataFactory.petHunger.get(Integer.valueOf(petId)); + if (ret != null) { + return ret.intValue(); + } + final MapleData hungerData = PetDataFactory.dataRoot.getData("Pet/" + petId + ".img").getChildByPath("info/hungry"); + ret = Integer.valueOf(MapleDataTool.getInt(hungerData, 1)); + PetDataFactory.petHunger.put(Integer.valueOf(petId), ret); + return ret.intValue(); + } + +} diff --git a/src/client/messages/CommandProcessor.java b/src/client/messages/CommandProcessor.java new file mode 100644 index 0000000..5d5dcd7 --- /dev/null +++ b/src/client/messages/CommandProcessor.java @@ -0,0 +1,318 @@ +package client.messages; + +import java.lang.reflect.InvocationTargetException; +import java.util.Collections; + +import client.messages.commands.CommandExecute; + +import java.lang.reflect.Modifier; + +import client.messages.commands.GodCommand; +import client.messages.commands.AdminCommand; +import client.messages.commands.GMCommand; +import client.messages.commands.InternCommand; +import client.messages.commands.SkilledCommand; +import client.messages.commands.PracticerCommand; +import client.messages.commands.PlayerCommand; + +import java.sql.PreparedStatement; +import java.sql.Connection; +import java.sql.SQLException; + +import tools.FilePrinter; +import database.DBConPool; +import client.MapleCharacter; +import handling.world.World.Broadcast; +import tools.MaplePacketCreator; +import constants.PiPiConfig; + +import java.util.LinkedList; + +import tools.FileoutputUtil; +import constants.ServerConstants.PlayerGMRank; +import constants.ServerConstants.CommandType; + +import java.util.Iterator; + +import client.MapleClient; + +import java.util.List; +import java.util.ArrayList; + +import client.messages.commands.CommandObject; + +import java.util.HashMap; + +public class CommandProcessor { + private static final HashMap commands = new HashMap(); + private static final HashMap> NormalCommandList = new HashMap(); + private static final HashMap> VipCommandList = new HashMap(); + private static final List showcommands = new LinkedList(); + + public static void dropHelp(final MapleClient c, final int type) { + final StringBuilder sb = new StringBuilder("指令列表:\r\n "); + HashMap> commandList = (HashMap>) new HashMap(); + int check = 0; + if (type == 0) { + commandList = CommandProcessor.NormalCommandList; + check = c.getPlayer().getGMLevel(); + } + for (int i = 0; i <= check; ++i) { + if (commandList.containsKey(Integer.valueOf(i))) { + sb.append((type == 1) ? "VIP" : "").append("权限等级: ").append(i).append("\r\n"); + for (final String s : commandList.get(Integer.valueOf(i))) { + final CommandObject co = (CommandObject) CommandProcessor.commands.get(s); + sb.append(co.getMessage()); + sb.append(" \r\n"); + } + } + } + c.getPlayer().dropNPC(sb.toString()); + } + + private static void sendDisplayMessage(final MapleClient c, final String msg, final CommandType type) { + if (c.getPlayer() == null) { + return; + } + switch (type) { + case NORMAL: { + c.getPlayer().dropMessage(6, msg); + break; + } + case TRADE: { + c.getPlayer().dropMessage(-2, "错误 : " + msg); + break; + } + } + } + + public static boolean processCommand(final MapleClient c, final String line, final CommandType type) { + if (c != null) { + final char commandPrefix = line.charAt(0); + for (final PlayerGMRank prefix : PlayerGMRank.values()) { + if (line.startsWith(String.valueOf(prefix.getCommandPrefix() + prefix.getCommandPrefix()))) { + return false; + } + } + if (commandPrefix == PlayerGMRank.普通玩家.getCommandPrefix()) { + final String[] splitted = line.split(" "); + splitted[0] = splitted[0].toLowerCase(); + final CommandObject co = (CommandObject) CommandProcessor.commands.get(splitted[0]); + if (co == null || co.getType() != type) { + sendDisplayMessage(c, "沒有这个指令,可以使用 @help 来查看指令.", type); + return true; + } + try { + final boolean ret = co.execute(c, splitted); + if (!ret) { + c.getPlayer().dropMessage("指令错误,用法: " + co.getMessage()); + } + } catch (Exception e) { + sendDisplayMessage(c, "有错误.", type); + if (c.getPlayer().isGM()) { + sendDisplayMessage(c, "错误: " + e, type); + } + FileoutputUtil.outputFileError("logs\\Except\\Log_Command_Except.txt", (Throwable) e); + FileoutputUtil.logToFile("logs\\Except\\Log_Command_Except.txt", FileoutputUtil.NowTime() + c.getPlayer().getName() + "(" + c.getPlayer().getId() + ")使用了指令 " + line + " ---在地图「" + c.getPlayer().getMapId() + "」频道:" + c.getChannel() + " \r\n"); + } + return true; + } else if (c.getPlayer().getGMLevel() > PlayerGMRank.普通玩家.getLevel()) { + final String[] splitted = line.split(" "); + splitted[0] = splitted[0].toLowerCase(); + final List show = (List) new LinkedList(); + for (final String com : CommandProcessor.showcommands) { + if (com.contains((CharSequence) splitted[0])) { + show.add(com); + } + } + if (show.isEmpty()) { + final StringBuilder sb = new StringBuilder(); + final int iplength = splitted[0].length(); + for (final String com2 : CommandProcessor.showcommands) { + final int sclength = com2.length(); + final String[] next = new String[sclength]; + for (int i = 0; i < next.length; ++i) { + next[i] = "false"; + } + if (iplength == sclength) { + for (int i = 0; i < sclength; ++i) { + final String st = com2.substring(i, i + 1); + for (int r = 0; r < iplength; ++r) { + final String it = splitted[0].substring(r, r + 1); + if (st.equals(it)) { + next[i] = "true"; + } + } + } + boolean last = true; + for (int j = 0; j < next.length; ++j) { + if ("false".equals(next[j])) { + last = false; + } + } + if (!last || !show.isEmpty()) { + continue; + } + show.add(com2); + } + } + } + if (show.size() == 1 && !splitted[0].equals(show.get(0))) { + sendDisplayMessage(c, "自动識別关联指令[" + (String) show.get(0) + "].", type); + splitted[0] = (String) show.get(0); + } + if (line.charAt(0) == '!') { + final CommandObject co2 = (CommandObject) CommandProcessor.commands.get(splitted[0]); + if (co2 == null || co2.getType() != type) { + if (splitted[0].equals(line.charAt(0) + "help")) { + dropHelp(c, 0); + return true; + } + sendDisplayMessage(c, "沒有这个指令.", type); + return true; + } else { + boolean CanUseCommand = false; + if (c.getPlayer().getGMLevel() >= co2.getReqGMLevel()) { + CanUseCommand = true; + } + if (!CanUseCommand) { + sendDisplayMessage(c, "你沒有权限可以使用指令.", type); + return true; + } + if (PiPiConfig.getCommandLock() && !c.getPlayer().isGod()) { + sendDisplayMessage(c, "目前无法使用指令.", type); + return true; + } + if (c.getPlayer() != null) { + boolean ret2 = false; + try { + ret2 = co2.execute(c, splitted); + if (ret2) { + logGMCommandToDB(c.getPlayer(), line); + FileoutputUtil.logToFile("logs/Data/管理员命令.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + c.getSession().remoteAddress().toString().split(":")[0] + " 账号: " + c.getAccountName() + " 玩家: " + c.getPlayer().getName() + " 使用管理员命令:" + line); + ShowMsg(c, line, type); + } else { + c.getPlayer().dropMessage("指令错误,用法: " + co2.getMessage()); + } + } catch (Exception e2) { + FileoutputUtil.outputFileError("logs\\Except\\Log_Command_Except.txt", (Throwable) e2); + String output = FileoutputUtil.NowTime(); + if (c != null && c.getPlayer() != null) { + output = output + c.getPlayer().getName() + "(" + c.getPlayer().getId() + ")使用了指令 " + line + " ---在地图「" + c.getPlayer().getMapId() + "」频道:" + c.getChannel(); + } + FileoutputUtil.logToFile("logs\\Except\\Log_Command_Except.txt", output + " \r\n"); + } + return true; + } + } + } + } + } + return false; + } + + private static void ShowMsg(final MapleClient c, final String line, final CommandType type) { + if (c.getPlayer() != null) { + if (!c.getPlayer().isGod() && !line.toLowerCase().startsWith("!cngm")) { + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, "[GM密语] " + c.getPlayer().getName() + "(" + c.getPlayer().getId() + ")使用了指令 " + line + " ---在地图「" + c.getPlayer().getMapId() + "」频道:" + c.getChannel())); + } + if (c.getPlayer().getGMLevel() == 5) { + System.out.println("<超级管理员> " + c.getPlayer().getName() + " 使用了指令: " + line); + } else if (c.getPlayer().getGMLevel() == 4) { + System.out.println("<领导者> " + c.getPlayer().getName() + " 使用了指令: " + line); + } else if (c.getPlayer().getGMLevel() == 3) { + System.out.println("<巡逻者> " + c.getPlayer().getName() + " 使用了指令: " + line); + } else if (c.getPlayer().getGMLevel() == 2) { + System.out.println("<老实习生> " + c.getPlayer().getName() + " 使用了指令: " + line); + } else if (c.getPlayer().getGMLevel() == 1) { + System.out.println("<新实习生> " + c.getPlayer().getName() + " 使用了指令: " + line); + } else if (c.getPlayer().getGMLevel() != 100) { + sendDisplayMessage(c, "你沒有权限可以使用指令.", type); + } + } + } + + private static void logGMCommandToDB(final MapleCharacter player, final String command) { + if (player == null) { + return; + } + Connection con = null; + PreparedStatement ps = null; + try { + con = (Connection) DBConPool.getInstance().getDataSource().getConnection(); + ps = con.prepareStatement("INSERT INTO gmlog (cid, command, mapid) VALUES (?, ?, ?)"); + ps.setInt(1, player.getId()); + ps.setString(2, command); + ps.setInt(3, player.getMap().getId()); + ps.executeUpdate(); + ps.close(); + con.close(); + } catch (SQLException ex) { + FilePrinter.printError("CommandProccessor.txt", (Throwable) ex, "logGMCommandToDB"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) ex); + try { + if (ps != null) { + ps.close(); + } + if (con != null) { + con.close(); + } + } catch (SQLException e) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + } finally { + try { + if (ps != null) { + ps.close(); + } + if (con != null) { + con.close(); + } + } catch (SQLException e2) { + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e2); + } + } + } + + private static void DoNormalCommand() { + final Class[] array; + final Class[] CommandFiles = (Class[]) (array = new Class[]{PlayerCommand.class, PracticerCommand.class, SkilledCommand.class, InternCommand.class, GMCommand.class, AdminCommand.class, GodCommand.class}); + for (final Class clasz : array) { + try { + final PlayerGMRank rankNeeded = (PlayerGMRank) clasz.getMethod("getPlayerLevelRequired", new Class[0]).invoke(null, (Object[]) null); + final Class[] commandClasses = clasz.getDeclaredClasses(); + final ArrayList cL = (ArrayList) new ArrayList(); + for (final Class c : commandClasses) { + try { + if (!Modifier.isAbstract(c.getModifiers()) && !c.isSynthetic()) { + final Object o = c.newInstance(); + boolean enabled; + try { + enabled = c.getDeclaredField("enabled").getBoolean(c.getDeclaredField("enabled")); + } catch (NoSuchFieldException ex3) { + enabled = true; + } + if (o instanceof CommandExecute && enabled) { + cL.add(rankNeeded.getCommandPrefix() + c.getSimpleName().toLowerCase()); + CommandProcessor.commands.put(rankNeeded.getCommandPrefix() + c.getSimpleName().toLowerCase(), new CommandObject(rankNeeded.getCommandPrefix() + c.getSimpleName().toLowerCase(), (CommandExecute) o, rankNeeded.getLevel())); + CommandProcessor.showcommands.add(rankNeeded.getCommandPrefix() + c.getSimpleName().toLowerCase()); + } + } + } catch (InstantiationException | IllegalAccessException | SecurityException | + IllegalArgumentException ex6) { + FilePrinter.printError("CommandProccessor.txt", (Throwable) ex6); + } + } + Collections.sort((List) cL); + CommandProcessor.NormalCommandList.put(Integer.valueOf(rankNeeded.getLevel()), cL); + } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | + InvocationTargetException ex7) { + FilePrinter.printError("CommandProccessor.txt", (Throwable) ex7); + } + } + } + + static { + DoNormalCommand(); + } +} diff --git a/src/client/messages/CommandProcessorUtil.java b/src/client/messages/CommandProcessorUtil.java new file mode 100644 index 0000000..b2e9987 --- /dev/null +++ b/src/client/messages/CommandProcessorUtil.java @@ -0,0 +1,75 @@ +package client.messages; + +import tools.StringUtil; + +public class CommandProcessorUtil { + public static String joinAfterString(final String[] splitted, final String str) { + for (int i = 1; i < splitted.length; ++i) { + if (splitted[i].equalsIgnoreCase(str) && i + 1 < splitted.length) { + return StringUtil.joinStringFrom(splitted, i + 1); + } + } + return null; + } + + public static int getOptionalIntArg(final String[] splitted, final int position, final int def) { + if (splitted.length > position) { + try { + return Integer.parseInt(splitted[position]); + } catch (NumberFormatException nfe) { + return def; + } + } + return def; + } + + public static String getNamedArg(final String[] splitted, final int startpos, final String name) { + for (int i = startpos; i < splitted.length; ++i) { + if (splitted[i].equalsIgnoreCase(name) && i + 1 < splitted.length) { + return splitted[i + 1]; + } + } + return null; + } + + public static Long getNamedLongArg(final String[] splitted, final int startpos, final String name) { + final String arg = getNamedArg(splitted, startpos, name); + if (arg != null) { + try { + return Long.valueOf(Long.parseLong(arg)); + } catch (NumberFormatException ex) { + } + } + return null; + } + + public static Integer getNamedIntArg(final String[] splitted, final int startpos, final String name) { + final String arg = getNamedArg(splitted, startpos, name); + if (arg != null) { + try { + return Integer.valueOf(Integer.parseInt(arg)); + } catch (NumberFormatException ex) { + } + } + return null; + } + + public static int getNamedIntArg(final String[] splitted, final int startpos, final String name, final int def) { + final Integer ret = getNamedIntArg(splitted, startpos, name); + if (ret == null) { + return def; + } + return ret.intValue(); + } + + public static Double getNamedDoubleArg(final String[] splitted, final int startpos, final String name) { + final String arg = getNamedArg(splitted, startpos, name); + if (arg != null) { + try { + return Double.valueOf(Double.parseDouble(arg)); + } catch (NumberFormatException ex) { + } + } + return null; + } +} diff --git a/src/client/messages/ConsoleCommandProcessor.java b/src/client/messages/ConsoleCommandProcessor.java new file mode 100644 index 0000000..64a5352 --- /dev/null +++ b/src/client/messages/ConsoleCommandProcessor.java @@ -0,0 +1,70 @@ +package client.messages; + +import java.util.List; +import java.util.Collections; + +import tools.FilePrinter; +import client.messages.commands.ConsoleCommandExecute; + +import java.lang.reflect.Modifier; +import java.util.ArrayList; + +import client.messages.commands.ConsoleCommand; +import client.messages.commands.ConsoleCommandObject; + +import java.util.HashMap; + +public class ConsoleCommandProcessor { + private static final HashMap commands; + + private static void sendDisplayMessage(final String msg) { + System.err.println("[sendDisplayMessage]错误:" + msg); + } + + public static boolean processCommand(final String line) { + final String[] splitted = line.split(" "); + splitted[0] = splitted[0].toLowerCase(); + final ConsoleCommandObject co = (ConsoleCommandObject) ConsoleCommandProcessor.commands.get(splitted[0]); + if (co == null) { + sendDisplayMessage("沒有这个指令."); + return true; + } + final int ret = co.execute(splitted); + return true; + } + + static { + commands = new HashMap(); + final Class[] array; + final Class[] CommandFiles = (Class[]) (array = new Class[]{ConsoleCommand.class}); + for (final Class clasz : array) { + try { + final Class[] a = clasz.getDeclaredClasses(); + final ArrayList cL = (ArrayList) new ArrayList(); + for (final Class c : a) { + try { + if (!Modifier.isAbstract(c.getModifiers()) && !c.isSynthetic()) { + final Object o = c.newInstance(); + boolean enabled; + try { + enabled = c.getDeclaredField("enabled").getBoolean(c.getDeclaredField("enabled")); + } catch (NoSuchFieldException ex3) { + enabled = true; + } + if (o instanceof ConsoleCommandExecute && enabled) { + cL.add(c.getSimpleName().toLowerCase()); + commands.put(c.getSimpleName().toLowerCase(), new ConsoleCommandObject(c.getSimpleName().toLowerCase(), (ConsoleCommandExecute) o)); + } + } + } catch (InstantiationException | IllegalAccessException | SecurityException | + IllegalArgumentException ex5) { + FilePrinter.printError("ConsoleCommandProcessor.txt", (Throwable) ex5); + } + } + Collections.sort((List) cL); + } catch (Exception ex2) { + FilePrinter.printError("ConsoleCommandProcessor.txt", (Throwable) ex2); + } + } + } +} diff --git a/src/client/messages/commands/AdminCommand.java b/src/client/messages/commands/AdminCommand.java new file mode 100644 index 0000000..06523bc --- /dev/null +++ b/src/client/messages/commands/AdminCommand.java @@ -0,0 +1,2029 @@ +package client.messages.commands; + +import server.gashapon.GashaponFactory; +import server.MaplePortal; +import tools.HexTool; +import tools.data.MaplePacketLittleEndianWriter; +import constants.PiPiConfig; + +import java.sql.PreparedStatement; +import java.sql.Connection; +import java.sql.SQLException; + +import database.DBConPool; + +import java.io.IOException; +import java.io.Writer; +import java.io.FileWriter; +import java.io.File; + +import tools.CPUSampler; +import server.life.OverrideMonsterStats; +import client.MapleCharacterUtil; +import io.netty.channel.Channel; +import tools.MockIOSession; +import server.life.PlayerNPC; +import server.life.MapleNPC; +import server.life.MapleLifeFactory; +import server.maps.MapleMap; +import handling.world.World; +import client.anticheat.CheatingOffense; +import server.life.MobSkillFactory; +import client.MapleDisease; +import client.inventory.ModifyInventory; +import server.events.MapleEventType; +import server.Timer.EventTimer; +import server.events.MapleEvent; + +import java.util.concurrent.ScheduledFuture; + +import scripting.EventManager; +import server.maps.MapleMapObject; +import tools.packet.MobPacket; +import server.life.MapleMonster; +import tools.StringUtil; +import client.inventory.ItemFlag; +import client.inventory.IItem; +import client.inventory.Item; +import client.inventory.Equip; +import client.inventory.MapleInventoryType; +import server.MapleInventoryManipulator; +import client.inventory.MaplePet; +import client.inventory.MapleInventoryIdentifier; +import constants.GameConstants; +import server.MapleItemInformationProvider; +import client.messages.CommandProcessorUtil; +import handling.world.World.Broadcast; +import tools.MaplePacketCreator; +import client.MapleCharacter; +import client.MapleStat; +import handling.world.World.Find; + +import java.util.Iterator; + +import handling.channel.ChannelServer; +import tools.FileoutputUtil; +import client.MapleClient; +import constants.ServerConstants.PlayerGMRank; + +public class AdminCommand { + public static PlayerGMRank getPlayerLevelRequired() { + return PlayerGMRank.超级管理员; + } + + public static class 丢 extends Drop { + } + + public static class 临时npc extends NPC { + } + + public static class 永久npc extends PNPC { + } + + public static class GC extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + System.gc(); + System.out.println("系统释放记忆体 ---- " + FileoutputUtil.NowTime()); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!GC - 系统释放记忆体").toString(); + } + } + + public static class 清理内存 extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + System.gc(); + System.out.println("系统释放记忆体 ---- " + FileoutputUtil.NowTime()); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!清理内存 - 系统释放内存").toString(); + } + } + + + public static class SavePlayerShops extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + for (final ChannelServer cserv : ChannelServer.getAllInstances()) { + cserv.closeAllMerchant(); + } + c.getPlayer().dropMessage(6, "精灵商人储存完毕."); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!savePlayerShops - 储存精灵商人").toString(); + } + } + + public static class Fame extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + final MapleCharacter player = c.getPlayer(); + if (splitted.length < 2) { + return false; + } + final String name = splitted[1]; + final int ch = Find.findChannel(name); + if (ch <= 0) { + return false; + } + final MapleCharacter victim = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(name); + short fame; + try { + fame = Short.parseShort(splitted[2]); + } catch (Exception nfe) { + c.getPlayer().dropMessage(6, "不合法的数字"); + return false; + } + if (victim != null && player.allowedToTarget(victim)) { + victim.addFame((int) fame); + victim.updateSingleStat(MapleStat.FAME, (int) victim.getFame()); + } else { + c.getPlayer().dropMessage(6, "[fame] 角色不存在"); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!fame <角色名称> <名声> ... - 名声").toString(); + } + } + + public static class 无敌 extends GodMode { + @Override + public String getMessage() { + return new StringBuilder().append("!无敌 - 无敌开启").toString(); + } + } + + public static class GodMode extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + final MapleCharacter player = c.getPlayer(); + if (player.isInvincible()) { + player.setInvincible(false); + player.dropMessage(6, "无敌已经关闭"); + } else { + player.setInvincible(true); + player.dropMessage(6, "无敌已经开启."); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!godmode - 无敌关闭").toString(); + } + } + + public static class GainCash extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 3) { + return false; + } + int amount = 0; + String name = ""; + try { + amount = Integer.parseInt(splitted[1]); + name = splitted[2]; + } catch (Exception ex) { + return false; + } + final int ch = Find.findChannel(name); + if (ch <= 0) { + c.getPlayer().dropMessage("该玩家不在线上"); + return true; + } + final MapleCharacter player = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(name); + if (player == null) { + c.getPlayer().dropMessage("该玩家不在线上"); + return true; + } + player.modifyCSPoints(1, amount, true); + player.dropMessage("已经收到Gash点数" + amount + "点"); + final String msg = "[GM 密语] GM " + c.getPlayer().getName() + " 给了 " + player.getName() + " Gash点数 " + amount + "点"; + FileoutputUtil.logToFile("logs/Data/给予点数.txt", "\r\n " + FileoutputUtil.NowTime() + " IP: " + c.getSession().remoteAddress().toString().split(":")[0] + " GM " + c.getPlayer().getName() + " 给了 " + player.getName() + " Gash点数 " + amount + "点"); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!gaingash <数量> <玩家> - 取得Gash点数").toString(); + } + } + + public static class 给抵用 extends GainMaplePoint { + @Override + public String getMessage() { + return new StringBuilder().append("!给抵用 <数量> <玩家> - 取得抵用").toString(); + } + } + + public static class GainMaplePoint extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 3) { + return false; + } + int amount = 0; + String name = ""; + try { + amount = Integer.parseInt(splitted[1]); + name = splitted[2]; + } catch (Exception ex) { + } + final int ch = Find.findChannel(name); + if (ch <= 0) { + c.getPlayer().dropMessage("该玩家不在线上"); + return true; + } + final MapleCharacter player = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(name); + if (player == null) { + c.getPlayer().dropMessage("该玩家不在线上"); + return true; + } + player.modifyCSPoints(2, amount, true); + final String msg = "[GM 密语] GM " + c.getPlayer().getName() + " 给了 " + player.getName() + " 抵用 " + amount + "点"; + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, msg)); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!gainmaplepoint <数量> <玩家> - 取得抵用").toString(); + } + } + + public static class GainPoint extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 3) { + return false; + } + int amount = 0; + String name = ""; + try { + amount = Integer.parseInt(splitted[1]); + name = splitted[2]; + } catch (Exception ex) { + } + final int ch = Find.findChannel(name); + if (ch <= 0) { + c.getPlayer().dropMessage("该玩家不在线上"); + return true; + } + final MapleCharacter player = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(name); + if (player == null) { + c.getPlayer().dropMessage("该玩家不在线上"); + return true; + } + player.setPoints(player.getPoints() + amount); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!gainpoint <数量> <玩家> - 取得Point").toString(); + } + } + + public static class GainVP extends GainPoint { + } + + public static class 给所有人道具 extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length > 2) { + int itemId = 0; + try { + itemId = Integer.parseInt(splitted[1]); + } catch (Exception ex) { + } + final short quantity = (short) CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1); + final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); + int ret = 0; + for (final ChannelServer cserv : ChannelServer.getAllInstances()) { + for (final MapleCharacter mch : cserv.getPlayerStorage().getAllCharacters()) { + if (GameConstants.isPet(itemId)) { + final MaplePet pet = MaplePet.createPet(itemId, MapleInventoryIdentifier.getInstance()); + if (pet != null) { + MapleInventoryManipulator.addById(mch.getClient(), itemId, (short) 1, "", pet, (long) ii.getPetLife(itemId)); + } + } else if (!ii.itemExists(itemId)) { + c.getPlayer().dropMessage(5, itemId + " - 物品不存在"); + } else { + IItem item; + if (GameConstants.getInventoryType(itemId) == MapleInventoryType.EQUIP) { + item = ii.randomizeStats((Equip) ii.getEquipById(itemId)); + } else { + item = new client.inventory.Item(itemId, (short) 0, quantity, (byte) 0); + if (GameConstants.getInventoryType(itemId) != MapleInventoryType.USE) { + } + } + item.setGMLog(c.getPlayer().getName()); + MapleInventoryManipulator.addbyItem(mch.getClient(), item); + } + ++ret; + } + } + for (final ChannelServer cserv2 : ChannelServer.getAllInstances()) { + for (final MapleCharacter mch : cserv2.getPlayerStorage().getAllCharacters()) { + mch.startMapEffect(c.getPlayer().getName() + "发放礼物" + (int) quantity + "个" + ii.getName(itemId) + "给在线的所有玩家!祝您玩得开心快乐", 5121009); + } + } + c.getPlayer().dropMessage(6, "命令使用成功,当前共有: " + ret + " 个玩家获得: " + (int) quantity + " 个" + ii.getName(itemId)); + } else { + c.getPlayer().dropMessage(6, "用法: !给所有人道具 [物品ID] [数量] "); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!给所有人道具 [物品ID] [数量]").toString(); + } + } + + public static class Item extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + int itemId = 0; + try { + itemId = Integer.parseInt(splitted[1]); + } catch (Exception ex) { + } + final short quantity = (short) CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1); + final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); + if (GameConstants.isPet(itemId)) { + final MaplePet pet = MaplePet.createPet(itemId, MapleInventoryIdentifier.getInstance()); + if (pet != null) { + MapleInventoryManipulator.addById(c, itemId, (short) 1, c.getPlayer().getName(), pet, (long) ii.getPetLife(itemId)); + } + } else if (!ii.itemExists(itemId)) { + c.getPlayer().dropMessage(5, itemId + " - 物品不存在"); + } else { + byte flag = 0; + flag |= (byte) ItemFlag.LOCK.getValue(); + IItem item; + if (GameConstants.getInventoryType(itemId) == MapleInventoryType.EQUIP) { + item = ii.randomizeStats((Equip) ii.getEquipById(itemId)); + item.setFlag(flag); + } else { + item = new client.inventory.Item(itemId, (short) 0, quantity, (byte) 0); + if (GameConstants.getInventoryType(itemId) != MapleInventoryType.USE) { + item.setFlag(flag); + } + } + item.setOwner(c.getPlayer().getName()); + item.setGMLog(c.getPlayer().getName()); + MapleInventoryManipulator.addbyItem(c, item); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!item <道具ID> - 取得道具").toString(); + } + } + + public static class serverMsg extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length > 1) { + final StringBuilder sb = new StringBuilder(); + sb.append(StringUtil.joinStringFrom(splitted, 1)); + for (final ChannelServer ch : ChannelServer.getAllInstances()) { + ch.setServerMessage(sb.toString()); + } + Broadcast.broadcastMessage(MaplePacketCreator.serverMessage(sb.toString())); + return true; + } + return false; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!servermsg 讯息 - 更改上方黄色公告").toString(); + } + } + + public static class MobVac extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + for (final MapleMapObject mmo : c.getPlayer().getMap().getAllMonstersThreadsafe()) { + final MapleMonster monster = (MapleMonster) mmo; + c.getPlayer().getMap().broadcastMessage(MobPacket.moveMonster(false, 0, 0, monster.getObjectId(), monster.getPosition(), c.getPlayer().getPosition(), c.getPlayer().getLastRes())); + monster.setPosition(c.getPlayer().getPosition()); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!mobvac - 全图吸怪").toString(); + } + } + + public static class 开启自动活动 extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + final EventManager em = c.getChannelServer().getEventSM().getEventManager("AutomatedEvent"); + if (em != null) { + em.scheduleRandomEvent(); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!开启自动活动 - 开启自动活动").toString(); + } + } + + public static class 活动开始 extends CommandExecute { + private static ScheduledFuture ts = null; + ; + private int min; + private int sec; + + public 活动开始() { + this.min = 1; + this.sec = 0; + } + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (c.getChannelServer().getEvent() == c.getPlayer().getMapId()) { + MapleEvent.setEvent(c.getChannelServer(), false); + if (c.getPlayer().getMapId() == 109020001) { + this.sec = 10; + c.getPlayer().dropMessage(5, "已经关闭活动入口,10秒后开始活动。"); + Broadcast.broadcastMessage(MaplePacketCreator.serverNotice(6, "频道:" + c.getChannel() + "活动目前已经关闭大门口,10秒后开始活动。")); + c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.getClock(this.sec)); + } else { + this.sec = 60; + c.getPlayer().dropMessage(5, "已经关闭活动入口,60秒后开始活动。"); + Broadcast.broadcastMessage(MaplePacketCreator.serverNotice(6, "频道:" + c.getChannel() + "活动目前已经关闭大门口,60秒后开始活动。")); + c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.getClock(this.sec)); + } + 活动开始.ts = EventTimer.getInstance().register((Runnable) new Runnable() { + @Override + public void run() { + if (活动开始.this.min == 0) { + MapleEvent.onStartEvent(c.getPlayer()); + 活动开始.ts.cancel(false); + return; + } + 活动开始.this.min--; + } + }, (long) (this.sec * 1000)); + return true; + } + c.getPlayer().dropMessage(5, "您必须先使用 !选择活动 设定当前频道的活动,并在当前频道活动地图里使用。"); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!活动开始 - 活动开始").toString(); + } + } + + public static class 选择活动 extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + final MapleEventType type = MapleEventType.getByString(splitted[1]); + if (type == null) { + final StringBuilder sb = new StringBuilder("目前开放的活动有: "); + for (final MapleEventType t : MapleEventType.values()) { + sb.append(t.name()).append(","); + } + c.getPlayer().dropMessage(5, sb.toString().substring(0, sb.toString().length() - 1)); + } + final String msg = MapleEvent.scheduleEvent(type, c.getChannelServer()); + if (msg.length() > 0) { + c.getPlayer().dropMessage(5, msg); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!选择活动 - 选择活动").toString(); + } + } + + public static class LockItem extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 3) { + return false; + } + final MapleCharacter chr = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); + if (chr == null) { + c.getPlayer().dropMessage(6, "此玩家并不存在"); + } else { + final int itemid = Integer.parseInt(splitted[2]); + MapleInventoryType type = GameConstants.getInventoryType(itemid); + for (final IItem item : chr.getInventory(type).listById(itemid)) { + item.setFlag((byte) (item.getFlag() | ItemFlag.LOCK.getValue())); + chr.getClient().sendPacket(MaplePacketCreator.modifyInventory(false, new ModifyInventory(1, item))); + } + if (type == MapleInventoryType.EQUIP) { + type = MapleInventoryType.EQUIPPED; + for (final IItem item : chr.getInventory(type).listById(itemid)) { + item.setFlag((byte) (item.getFlag() | ItemFlag.LOCK.getValue())); + chr.getClient().sendPacket(MaplePacketCreator.modifyInventory(false, new ModifyInventory(1, item))); + } + } + c.getPlayer().dropMessage(6, "玩家 " + splitted[1] + "身上所有ID为 " + splitted[2] + " 的道具已经从锁定了"); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!lockitem <角色名称> <物品ID> - 上锁玩家身上的道具").toString(); + } + } + + public static class KillMap extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + for (final MapleCharacter map : c.getPlayer().getMap().getCharactersThreadsafe()) { + if (map != null && !map.isGM()) { + map.getStat().setHp(0); + map.getStat().setMp(0); + map.updateSingleStat(MapleStat.HP, 0); + map.updateSingleStat(MapleStat.MP, 0); + } + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!killmap - 杀掉所有玩家").toString(); + } + } + + public static class Disease extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 3) { + return false; + } + int type; + if (splitted[1].equalsIgnoreCase("SEAL")) { + type = 120; + } else if (splitted[1].equalsIgnoreCase("DARKNESS")) { + type = 121; + } else if (splitted[1].equalsIgnoreCase("WEAKEN")) { + type = 122; + } else if (splitted[1].equalsIgnoreCase("STUN")) { + type = 123; + } else if (splitted[1].equalsIgnoreCase("CURSE")) { + type = 124; + } else if (splitted[1].equalsIgnoreCase("POISON")) { + type = 125; + } else if (splitted[1].equalsIgnoreCase("SLOW")) { + type = 126; + } else if (splitted[1].equalsIgnoreCase("SEDUCE")) { + type = 128; + } else if (splitted[1].equalsIgnoreCase("REVERSE")) { + type = 132; + } else if (splitted[1].equalsIgnoreCase("ZOMBIFY")) { + type = 133; + } else if (splitted[1].equalsIgnoreCase("POTION")) { + type = 134; + } else if (splitted[1].equalsIgnoreCase("SHADOW")) { + type = 135; + } else if (splitted[1].equalsIgnoreCase("BLIND")) { + type = 136; + } else { + if (!splitted[1].equalsIgnoreCase("FREEZE")) { + return false; + } + type = 137; + } + final MapleDisease dis = MapleDisease.getByMobSkill(type); + if (splitted.length == 4) { + final String name = splitted[2]; + final int ch = Find.findChannel(name); + if (ch <= 0) { + c.getPlayer().dropMessage(6, "玩家必须上线"); + return true; + } + final MapleCharacter victim = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(name); + if (victim == null) { + c.getPlayer().dropMessage(5, "找不到此玩家"); + } else { + victim.setChair(0); + victim.getClient().sendPacket(MaplePacketCreator.cancelChair(-1)); + victim.getMap().broadcastMessage(victim, MaplePacketCreator.showChair(c.getPlayer().getId(), 0), false); + victim.getDiseaseBuff(dis, MobSkillFactory.getMobSkill(type, CommandProcessorUtil.getOptionalIntArg(splitted, 3, 1))); + } + } else { + for (final MapleCharacter victim2 : c.getPlayer().getMap().getCharactersThreadsafe()) { + victim2.setChair(0); + victim2.getClient().sendPacket(MaplePacketCreator.cancelChair(-1)); + victim2.getMap().broadcastMessage(victim2, MaplePacketCreator.showChair(c.getPlayer().getId(), 0), false); + victim2.getDiseaseBuff(dis, MobSkillFactory.getMobSkill(type, CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1))); + } + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!disease [角色名称] <状态等级> - 让人得到特殊状态").toString(); + } + } + + public static class SendAllNote extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length >= 1) { + final String text = StringUtil.joinStringFrom(splitted, 1); + for (final MapleCharacter mch : c.getChannelServer().getPlayerStorage().getAllCharactersThreadSafe()) { + c.getPlayer().sendNote(mch.getName(), text); + } + return true; + } + return false; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!sendallnote <文字> 传送Note给目前频道的所有人").toString(); + } + } + + public static class giveMeso extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + final String name = splitted[1]; + final int gain = Integer.parseInt(splitted[2]); + final int ch = Find.findChannel(name); + if (ch <= 0) { + c.getPlayer().dropMessage(6, "玩家必须上线"); + return true; + } + final MapleCharacter victim = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(name); + if (victim == null) { + c.getPlayer().dropMessage(5, "找不到 '" + name); + } else { + victim.gainMeso(gain, false); + final String msg = "[GM 密语] GM " + c.getPlayer().getName() + " 给了 " + victim.getName() + " 金币 " + gain + "点"; + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, msg)); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!gainmeso <名字> <数量> - 给玩家金币").toString(); + } + } + + public static class MesoEveryone extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + final int gain = Integer.parseInt(splitted[1]); + for (final ChannelServer cserv : ChannelServer.getAllInstances()) { + for (final MapleCharacter mch : cserv.getPlayerStorage().getAllCharactersThreadSafe()) { + mch.gainMeso(gain, true); + } + } + final String msg = "[GM 密语] GM " + c.getPlayer().getName() + " 给了 所有玩家 金币 " + gain + "点"; + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, msg)); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!mesoeveryone <数量> - 给所有玩家金币").toString(); + } + } + + public static class CloneMe extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + boolean stopMoving = false; + if (splitted.length > 1) { + stopMoving = splitted[1].equals("true"); + } + c.getPlayer().cloneLook(stopMoving); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!cloneme - 产生克龙体").toString(); + } + } + + public static class DisposeClones extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + c.getPlayer().dropMessage(6, c.getPlayer().getCloneSize() + "个克龙体消失了."); + c.getPlayer().disposeClones(); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!disposeclones - 摧毀克龙体").toString(); + } + } + + public static class Monitor extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + final MapleCharacter target = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); + if (target != null) { + if (target.getClient().isMonitored()) { + target.getClient().setMonitored(false); + c.getPlayer().dropMessage(5, "Not monitoring " + target.getName() + " anymore."); + } else { + target.getClient().setMonitored(true); + c.getPlayer().dropMessage(5, "Monitoring " + target.getName() + "."); + } + } else { + c.getPlayer().dropMessage(5, "找不到该玩家"); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!monitor <玩家> - 记录玩家资讯").toString(); + } + } + + public static class PermWeather extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (c.getPlayer().getMap().getPermanentWeather() > 0) { + c.getPlayer().getMap().setPermanentWeather(0); + c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.removeMapEffect()); + c.getPlayer().dropMessage(5, "Map weather has been disabled."); + } else { + final int weather = CommandProcessorUtil.getOptionalIntArg(splitted, 1, 5120000); + if (!MapleItemInformationProvider.getInstance().itemExists(weather) || weather / 10000 != 512) { + c.getPlayer().dropMessage(5, "Invalid ID."); + } else { + c.getPlayer().getMap().setPermanentWeather(weather); + c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.startMapEffect("", weather, false)); + c.getPlayer().dropMessage(5, "Map weather has been enabled."); + } + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!permweather - 设定天气").toString(); + } + } + + public static class Threads extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + final Thread[] threads = new Thread[Thread.activeCount()]; + Thread.enumerate(threads); + String filter = ""; + if (splitted.length > 1) { + filter = splitted[1]; + } + for (int i = 0; i < threads.length; ++i) { + final String tstring = threads[i].toString(); + if (tstring.toLowerCase().contains((CharSequence) filter.toLowerCase())) { + c.getPlayer().dropMessage(6, i + ": " + tstring); + } + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!threads - 查看Threads资讯").toString(); + } + } + + public static class ShowTrace extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + final Thread[] threads = new Thread[Thread.activeCount()]; + Thread.enumerate(threads); + final Thread t = threads[Integer.parseInt(splitted[1])]; + c.getPlayer().dropMessage(6, t.toString() + ":"); + for (final StackTraceElement elem : t.getStackTrace()) { + c.getPlayer().dropMessage(6, elem.toString()); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!showtrace - show trace info").toString(); + } + } + + public static class ToggleOffense extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + try { + final CheatingOffense co = CheatingOffense.valueOf(splitted[1]); + co.setEnabled(!co.isEnabled()); + } catch (IllegalArgumentException iae) { + c.getPlayer().dropMessage(6, "Offense " + splitted[1] + " not found"); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!toggleoffense - 开启或关闭CheatOffense").toString(); + } + } + + public static class toggleDrop extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + c.getPlayer().getMap().toggleDrops(); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!toggledrop - 开启或关闭掉落").toString(); + } + } + + public static class ToggleMegaphone extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + World.toggleMegaphoneMuteState(); + c.getPlayer().dropMessage(6, "广播是否封锁 : " + (c.getChannelServer().getMegaphoneMuteState() ? "是" : "否")); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!togglemegaphone - 开启或关闭广播").toString(); + } + } + + public static class DCAll extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + int range = -1; + if (splitted.length < 2) { + return false; + } + String input = null; + try { + input = splitted[1]; + } catch (Exception ex) { + } + final String s = splitted[1]; + switch (s) { + case "m": { + range = 0; + break; + } + case "c": { + range = 1; + break; + } + default: { + range = 2; + break; + } + } + if (range == -1) { + range = 1; + } + if (range == 0) { + c.getPlayer().getMap().disconnectAll(c.getPlayer()); + } else if (range == 1) { + c.getChannelServer().getPlayerStorage().disconnectAll(c.getPlayer()); + } else if (range == 2) { + for (final ChannelServer cserv : ChannelServer.getAllInstances()) { + cserv.getPlayerStorage().disconnectAll(true); + } + } + String show = ""; + switch (range) { + case 0: { + show = "地图"; + break; + } + case 1: { + show = "频道"; + break; + } + case 2: { + show = "世界"; + break; + } + } + final String msg = "[GM 密语] GM " + c.getPlayer().getName() + " DC 了 " + show + "玩家"; + Broadcast.broadcastGMMessage(MaplePacketCreator.serverNotice(6, msg)); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!dcall [m|c|w] - 所有玩家断线").toString(); + } + } + + public static class KillMonsterByOID extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + final MapleMap map = c.getPlayer().getMap(); + final int targetId = Integer.parseInt(splitted[1]); + final MapleMonster monster = map.getMonsterByOid(targetId); + if (monster != null) { + map.killMonster(monster, c.getPlayer(), false, false, (byte) 1); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!killmonsterbyoid - 杀掉地图上某个怪物").toString(); + } + } + + public static class HitMonsterByOID extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + final MapleMap map = c.getPlayer().getMap(); + final int targetId = Integer.parseInt(splitted[1]); + final int damage = Integer.parseInt(splitted[2]); + final MapleMonster monster = map.getMonsterByOid(targetId); + if (monster != null) { + map.broadcastMessage(MobPacket.damageMonster(targetId, (long) damage)); + monster.damage(c.getPlayer(), (long) damage, false); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!hitmonsterbyoid - 碰撞地图上某个怪物").toString(); + } + } + + public static class NPC extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + int npcId = 0; + try { + npcId = Integer.parseInt(splitted[1]); + } catch (Exception ex) { + } + final MapleNPC npc = MapleLifeFactory.getNPC(npcId); + if (npc != null && !npc.getName().equals("MISSINGNO")) { + npc.setPosition(c.getPlayer().getPosition()); + npc.setCy(c.getPlayer().getPosition().y); + npc.setRx0(c.getPlayer().getPosition().x); + npc.setRx1(c.getPlayer().getPosition().x); + npc.setFh(c.getPlayer().getMap().getFootholds().findBelow(c.getPlayer().getPosition()).getId()); + npc.setCustom(true); + c.getPlayer().getMap().addMapObject((MapleMapObject) npc); + c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.spawnNPC(npc, true)); + } else { + c.getPlayer().dropMessage(6, "找不到此代码为" + npcId + "的Npc"); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!npc - 呼叫出NPC").toString(); + } + } + + public static class MakePNPC extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 3) { + return false; + } + try { + c.getPlayer().dropMessage(6, "Making playerNPC..."); + final String name = splitted[1]; + final int ch = Find.findChannel(name); + if (ch <= 0) { + c.getPlayer().dropMessage(6, "玩家必须上线"); + return true; + } + final MapleCharacter chhr = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(name); + if (chhr == null) { + c.getPlayer().dropMessage(6, splitted[1] + " is not online"); + } else { + final int npcId = Integer.parseInt(splitted[2]); + final MapleNPC npc_c = MapleLifeFactory.getNPC(npcId); + if (npcId < 9901500 || npcId > 9901551 || npcId < 9901000 || npcId < 9901319) { + c.getPlayer().dropMessage(6, "NPC不存在"); + return true; + } + final PlayerNPC npc = new PlayerNPC(chhr, npcId, c.getPlayer().getMap(), c.getPlayer()); + npc.addToServer(); + c.getPlayer().dropMessage(6, "Done"); + } + } catch (Exception e) { + c.getPlayer().dropMessage(6, "NPC failed... : " + e.getMessage()); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!makepnpc - 创造玩家NPC").toString(); + } + } + + public static class MakeOfflineP extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + try { + c.getPlayer().dropMessage(6, "Making playerNPC..."); + final MapleClient cs = new MapleClient(null, null, (Channel) new MockIOSession()); + final MapleCharacter chhr = MapleCharacter.loadCharFromDB(MapleCharacterUtil.getIdByName(splitted[1]), cs, false); + if (chhr == null) { + c.getPlayer().dropMessage(6, splitted[1] + " does not exist"); + } else { + final int npcId = Integer.parseInt(splitted[2]); + if (npcId < 9901500 || npcId > 9901551 || npcId < 9901000 || npcId < 9901319) { + c.getPlayer().dropMessage(6, "NPC不存在"); + return true; + } + final PlayerNPC npc = new PlayerNPC(chhr, npcId, c.getPlayer().getMap(), c.getPlayer()); + npc.addToServer(); + c.getPlayer().dropMessage(6, "Done"); + } + } catch (Exception e) { + c.getPlayer().dropMessage(6, "NPC failed... : " + e.getMessage()); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!deletepnpc - 创造离线PNPC").toString(); + } + } + + public static class DestroyPNPC extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + try { + c.getPlayer().dropMessage(6, "Destroying playerNPC..."); + final MapleNPC npc = c.getPlayer().getMap().getNPCByOid(Integer.parseInt(splitted[1])); + if (npc instanceof PlayerNPC) { + ((PlayerNPC) npc).destroy(true); + c.getPlayer().dropMessage(6, "Done"); + } else { + c.getPlayer().dropMessage(6, "!destroypnpc [objectid]"); + } + } catch (Exception e) { + c.getPlayer().dropMessage(6, "NPC failed... : " + e.getMessage()); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!destroypnpc [objectid] - 刪除PNPC").toString(); + } + } + + public static class Spawn extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + int mid = 0; + try { + mid = Integer.parseInt(splitted[1]); + } catch (Exception ex) { + } + int num = Math.min(CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1), 500); + if (num > 1000) { + num = 1000; + } + final Long hp = CommandProcessorUtil.getNamedLongArg(splitted, 1, "hp"); + final Integer mp = CommandProcessorUtil.getNamedIntArg(splitted, 1, "mp"); + final Integer exp = CommandProcessorUtil.getNamedIntArg(splitted, 1, "exp"); + final Double php = CommandProcessorUtil.getNamedDoubleArg(splitted, 1, "php"); + final Double pmp = CommandProcessorUtil.getNamedDoubleArg(splitted, 1, "pmp"); + final Double pexp = CommandProcessorUtil.getNamedDoubleArg(splitted, 1, "pexp"); + MapleMonster onemob; + try { + onemob = MapleLifeFactory.getMonster(mid); + } catch (RuntimeException e) { + c.getPlayer().dropMessage(5, "错误1: " + e.getMessage()); + return true; + } + long newhp; + if (hp != null) { + newhp = hp.longValue(); + } else if (php != null) { + newhp = (long) ((double) onemob.getMobMaxHp() * (php.doubleValue() / 100.0)); + } else { + newhp = onemob.getMobMaxHp(); + } + if (mp != null) { + final int newmp = mp.intValue(); + } else if (pmp != null) { + final int newmp = (int) ((double) onemob.getMobMaxMp() * (pmp.doubleValue() / 100.0)); + } else { + final int newmp = onemob.getMobMaxMp(); + } + int newexp; + if (exp != null) { + newexp = exp.intValue(); + } else if (pexp != null) { + newexp = (int) ((double) onemob.getMobExp() * (pexp.doubleValue() / 100.0)); + } else { + newexp = onemob.getMobExp(); + } + if (newhp < 1L) { + newhp = 1L; + } + final OverrideMonsterStats overrideStats = new OverrideMonsterStats(newhp, onemob.getMobMaxMp(), newexp, false); + for (int i = 0; i < num; ++i) { + final MapleMonster mob = MapleLifeFactory.getMonster(mid); + mob.setHp(newhp); + mob.setOverrideStats(overrideStats); + c.getPlayer().getMap().spawnMonsterOnGroundBelow(mob, c.getPlayer().getPosition()); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!spawn <怪物ID> - 召唤怪物").toString(); + } + } + + public static class WarpPlayersTo extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + try { + final MapleMap target = c.getChannelServer().getMapFactory().getMap(Integer.parseInt(splitted[1])); + final MapleMap from = c.getPlayer().getMap(); + for (final MapleCharacter chr : from.getCharactersThreadsafe()) { + chr.changeMap(target, target.getPortal(0)); + } + } catch (Exception e) { + return false; + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!WarpPlayersTo 把所有玩家传送到某个地图").toString(); + } + } + + public static class WarpAllHere extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + for (final ChannelServer CS : ChannelServer.getAllInstances()) { + for (final MapleCharacter mch : CS.getPlayerStorage().getAllCharactersThreadSafe()) { + if (mch.getMapId() != c.getPlayer().getMapId()) { + mch.changeMap(c.getPlayer().getMap(), c.getPlayer().getPosition()); + } + if (mch.getClient().getChannel() != c.getPlayer().getClient().getChannel()) { + mch.changeChannel(c.getPlayer().getClient().getChannel()); + } + } + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!WarpAllHere 把所有玩家传送到这里").toString(); + } + } + + public static class LOLCastle extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length != 2) { + return false; + } + final MapleMap target = c.getChannelServer().getEventSM().getEventManager("lolcastle").getInstance("lolcastle" + splitted[1]).getMapFactory().getMap(990000300, false, false); + c.getPlayer().changeMap(target, target.getPortal(0)); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!lolcastle level (level = 1-5) - 不知道是啥").toString(); + } + } + + public static class StartProfiling extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + final CPUSampler sampler = CPUSampler.getInstance(); + sampler.addIncluded("client"); + sampler.addIncluded("constants"); + sampler.addIncluded("database"); + sampler.addIncluded("handling"); + sampler.addIncluded("provider"); + sampler.addIncluded("scripting"); + sampler.addIncluded("server"); + sampler.addIncluded("tools"); + sampler.start(); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!startprofiling 开始纪录JVM资讯").toString(); + } + } + + public static class StopProfiling extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + final CPUSampler sampler = CPUSampler.getInstance(); + try { + String filename = "odinprofile.txt"; + if (splitted.length > 1) { + filename = splitted[1]; + } + final File file = new File(filename); + if (file.exists()) { + c.getPlayer().dropMessage(6, "The entered filename already exists, choose a different one"); + return true; + } + sampler.stop(); + try (final FileWriter fw = new FileWriter(file)) { + sampler.save((Writer) fw, 1, 10); + } + } catch (IOException e) { + System.err.println("Error saving profile" + e); + } + sampler.reset(); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!stopprofiling - 取消纪录JVM资讯并储存到档案").toString(); + } + } + + public static class ReloadMap extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + final int mapId = Integer.parseInt(splitted[1]); + for (final ChannelServer cserv : ChannelServer.getAllInstances()) { + if (cserv.getMapFactory().isMapLoaded(mapId) && cserv.getMapFactory().getMap(mapId).getCharactersSize() > 0) { + c.getPlayer().dropMessage(5, "There exists characters on channel " + cserv.getChannel()); + return true; + } + } + for (final ChannelServer cserv : ChannelServer.getAllInstances()) { + if (cserv.getMapFactory().isMapLoaded(mapId)) { + cserv.getMapFactory().removeMap(mapId); + } + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!reloadmap - 重置某个地图").toString(); + } + } + + public static class Respawn extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + c.getPlayer().getMap().respawn(true); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!respawn - 重新进入地图").toString(); + } + } + + public static class ResetMap extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + c.getPlayer().getMap().resetFully(); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!respawn - 重置这个地图").toString(); + } + } + + public static class PNPC extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + final int npcId = Integer.parseInt(splitted[1]); + final MapleNPC npc = MapleLifeFactory.getNPC(npcId); + if (npc != null && !npc.getName().equals("MISSINGNO")) { + final int xpos = c.getPlayer().getPosition().x; + final int ypos = c.getPlayer().getPosition().y; + final int fh = c.getPlayer().getMap().getFootholds().findBelow(c.getPlayer().getPosition()).getId(); + npc.setPosition(c.getPlayer().getPosition()); + npc.setCy(ypos); + npc.setRx0(xpos); + npc.setRx1(xpos); + npc.setFh(fh); + npc.setCustom(true); + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + try (final PreparedStatement ps = con.prepareStatement("INSERT INTO wz_customlife (dataid, f, hide, fh, cy, rx0, rx1, type, x, y, mid) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")) { + ps.setInt(1, npcId); + ps.setInt(2, 0); + ps.setInt(3, 0); + ps.setInt(4, fh); + ps.setInt(5, ypos); + ps.setInt(6, xpos); + ps.setInt(7, xpos); + ps.setString(8, "n"); + ps.setInt(9, xpos); + ps.setInt(10, ypos); + ps.setInt(11, c.getPlayer().getMapId()); + ps.executeUpdate(); + ps.close(); + } + con.close(); + } catch (SQLException e) { + c.getPlayer().dropMessage(6, "Failed to save NPC to the database"); + FileoutputUtil.outError("logs/资料库异常.txt", (Throwable) e); + } + for (final ChannelServer cserv : ChannelServer.getAllInstances()) { + cserv.getMapFactory().getMap(c.getPlayer().getMapId()).addMapObject((MapleMapObject) npc); + cserv.getMapFactory().getMap(c.getPlayer().getMapId()).broadcastMessage(MaplePacketCreator.spawnNPC(npc, true)); + } + c.getPlayer().dropMessage(6, "Please do not reload this map or else the NPC will disappear till the next restart."); + } else { + c.getPlayer().dropMessage(6, "查无此 Npc "); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!pnpc - 建立永久NPC").toString(); + } + } + + public static class autoban extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + PiPiConfig.setAutoban(!PiPiConfig.getAutoban()); + c.getPlayer().dropMessage("自动封锁: " + (PiPiConfig.getAutoban() ? "开启" : "关闭")); + System.out.println("自动封锁: " + (PiPiConfig.getAutoban() ? "开启" : "关闭")); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!Autoban - 自动封锁开关").toString(); + } + } + + public static class Packet extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + final MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter(); + final int packetheader = Integer.parseInt(splitted[1]); + String packet_in = " 00 00 00 00 00 00 00 00 00 "; + if (splitted.length > 2) { + packet_in = StringUtil.joinStringFrom(splitted, 2); + } + mplew.writeShort(packetheader); + mplew.write(HexTool.getByteArrayFromHexString(packet_in)); + mplew.writeZeroBytes(20); + c.sendPacket(mplew.getPacket()); + c.getPlayer().dropMessage(packetheader + "已传送封包[" + packetheader + "] : " + mplew.toString()); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!Packet - <封包內容>").toString(); + } + } + + public static class maxmeso extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + c.getPlayer().gainMeso(Integer.MAX_VALUE - c.getPlayer().getMeso(), true); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!maxmeso - 金币满").toString(); + } + } + + public static class mesos extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + int meso = 0; + try { + meso = Integer.parseInt(splitted[1]); + } catch (Exception ex) { + } + c.getPlayer().gainMeso(meso, true); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!mesos <需要的数量> - 得到金币").toString(); + } + } + + public static class Drop extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + int itemId = 0; + String name = null; + try { + itemId = Integer.parseInt(splitted[1]); + name = splitted[3]; + } catch (Exception ex) { + } + final short quantity = (short) CommandProcessorUtil.getOptionalIntArg(splitted, 2, 1); + final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); + if (GameConstants.isPet(itemId)) { + c.getPlayer().dropMessage(5, "宠物请到购物商城购买."); + } else if (!ii.itemExists(itemId)) { + c.getPlayer().dropMessage(5, itemId + " - 物品不存在"); + } else { + IItem toDrop; + if (GameConstants.getInventoryType(itemId) == MapleInventoryType.EQUIP) { + toDrop = ii.randomizeStats((Equip) ii.getEquipById(itemId)); + } else { + toDrop = new client.inventory.Item(itemId, (short) 0, quantity, (byte) 0); + } + toDrop.setGMLog(c.getPlayer().getName()); + if (name != null) { + final int ch = Find.findChannel(name); + if (ch > 0) { + final MapleCharacter victim = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(name); + if (victim != null) { + victim.getMap().spawnItemDrop((MapleMapObject) victim, victim, toDrop, victim.getPosition(), true, true); + } + } else { + c.getPlayer().dropMessage("玩家: [" + name + "] 不在线上写"); + } + } else { + c.getPlayer().getMap().spawnItemDrop((MapleMapObject) c.getPlayer(), c.getPlayer(), toDrop, c.getPlayer().getPosition(), true, true); + } + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!Drop <道具ID> - 掉落道具").toString(); + } + } + + public static class ProDrop extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 3) { + return false; + } + int itemId = 0; + final int quantity = 1; + int Str = 0; + int Dex = 0; + int Int = 0; + int Luk = 0; + int HP = 0; + int MP = 0; + int Watk = 0; + int Matk = 0; + int Wdef = 0; + int Mdef = 0; + int Scroll = 0; + int Upg = 0; + int Acc = 0; + int Avoid = 0; + int jump = 0; + int speed = 0; + int day = 0; + try { + int splitted_count = 1; + itemId = Integer.parseInt(splitted[splitted_count++]); + Str = Integer.parseInt(splitted[splitted_count++]); + Dex = Integer.parseInt(splitted[splitted_count++]); + Int = Integer.parseInt(splitted[splitted_count++]); + Luk = Integer.parseInt(splitted[splitted_count++]); + HP = Integer.parseInt(splitted[splitted_count++]); + MP = Integer.parseInt(splitted[splitted_count++]); + Watk = Integer.parseInt(splitted[splitted_count++]); + Matk = Integer.parseInt(splitted[splitted_count++]); + Wdef = Integer.parseInt(splitted[splitted_count++]); + Mdef = Integer.parseInt(splitted[splitted_count++]); + Upg = Integer.parseInt(splitted[splitted_count++]); + Acc = Integer.parseInt(splitted[splitted_count++]); + Avoid = Integer.parseInt(splitted[splitted_count++]); + speed = Integer.parseInt(splitted[splitted_count++]); + jump = Integer.parseInt(splitted[splitted_count++]); + Scroll = Integer.parseInt(splitted[splitted_count++]); + day = Integer.parseInt(splitted[splitted_count++]); + } catch (Exception ex) { + } + final boolean Str_check = Str != 0; + final boolean Int_check = Int != 0; + final boolean Dex_check = Dex != 0; + final boolean Luk_check = Luk != 0; + final boolean HP_check = HP != 0; + final boolean MP_check = MP != 0; + final boolean WATK_check = Watk != 0; + final boolean MATK_check = Matk != 0; + final boolean WDEF_check = Wdef != 0; + final boolean MDEF_check = Mdef != 0; + final boolean SCROLL_check = true; + final boolean UPG_check = Upg != 0; + final boolean ACC_check = Acc != 0; + final boolean AVOID_check = Avoid != 0; + final boolean JUMP_check = jump != 0; + final boolean SPEED_check = speed != 0; + final boolean DAY_check = day != 0; + final MapleItemInformationProvider ii = MapleItemInformationProvider.getInstance(); + if (GameConstants.isPet(itemId)) { + c.getPlayer().dropMessage(5, "请从商城购买宠物."); + return true; + } + if (!ii.itemExists(itemId)) { + c.getPlayer().dropMessage(5, itemId + " 不存在"); + return true; + } + if (GameConstants.getInventoryType(itemId) == MapleInventoryType.EQUIP) { + final Equip equip = ii.randomizeStats((Equip) ii.getEquipById(itemId)); + equip.setGMLog(c.getPlayer().getName() + " 使用 !Prodrop"); + if (Str_check) { + equip.setStr((short) Str); + } + if (Luk_check) { + equip.setLuk((short) Luk); + } + if (Dex_check) { + equip.setDex((short) Dex); + } + if (Int_check) { + equip.setInt((short) Int); + } + if (HP_check) { + equip.setHp((short) HP); + } + if (MP_check) { + equip.setMp((short) MP); + } + if (WATK_check) { + equip.setWatk((short) Watk); + } + if (MATK_check) { + equip.setMatk((short) Matk); + } + if (WDEF_check) { + equip.setWdef((short) Wdef); + } + if (MDEF_check) { + equip.setMdef((short) Mdef); + } + if (ACC_check) { + equip.setAcc((short) Acc); + } + if (AVOID_check) { + equip.setAvoid((short) Avoid); + } + if (SCROLL_check) { + equip.setUpgradeSlots((byte) Scroll); + } + if (UPG_check) { + equip.setLevel((byte) Upg); + } + if (JUMP_check) { + equip.setJump((short) jump); + } + if (SPEED_check) { + equip.setSpeed((short) speed); + } + if (DAY_check) { + equip.setExpiration(System.currentTimeMillis() + (long) (day * 24 * 60 * 60 * 1000)); + } + c.getPlayer().getMap().spawnItemDrop((MapleMapObject) c.getPlayer(), c.getPlayer(), (IItem) equip, c.getPlayer().getPosition(), true, true); + } else { + final IItem toDrop = new client.inventory.Item(itemId, (short) 0, (short) quantity, (byte) 0); + toDrop.setGMLog(c.getPlayer().getName() + " 使用 !Prodrop"); + c.getPlayer().getMap().spawnItemDrop((MapleMapObject) c.getPlayer(), c.getPlayer(), toDrop, c.getPlayer().getPosition(), true, true); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!ProDrop <物品代码> (<力量> <敏捷> <智力> <幸运> <物攻> <魔攻> <物防> <魔防> <武器+x> <命中> <回避> <移动> <跳跃> <冲捲数> <天数>)").toString(); + } + } + + public static class 给点数 extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 4) { + return false; + } + String error = null; + final String input = splitted[1]; + final String name = splitted[2]; + int nx = 0; + int gain = 0; + try { + final String s = input; + switch (s) { + case "点数": { + nx = 1; + break; + } + case "抵用": { + nx = 2; + break; + } + default: { + error = "输入的文字不是[点数]和[抵用] 而是[" + input + "]"; + break; + } + } + gain = Integer.parseInt(splitted[3]); + } catch (Exception ex) { + error = "请输入数字以及不能给予超过21474836470的 " + input + " 错误为: " + ex.toString(); + } + if (error != null) { + c.getPlayer().dropMessage(error); + return true; + } + final int ch = Find.findChannel(name); + if (ch <= 0) { + c.getPlayer().dropMessage("玩家必须上线"); + return true; + } + final MapleCharacter victim = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(name); + if (victim == null) { + c.getPlayer().dropMessage("找不到此玩家"); + } else { + c.getPlayer().dropMessage("已经给予玩家[" + name + "] " + input + " " + gain); + FileoutputUtil.logToFile("logs/Data/给点数.txt", "\r\n " + FileoutputUtil.NowTime() + " GM " + c.getPlayer().getName() + " 给了 " + victim.getName() + " " + input + " " + gain + "点"); + victim.modifyCSPoints(nx, gain, true); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!给点数 点数/抵用 玩家名称 数量").toString(); + } + } + + public static class ResetMobs extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + c.getPlayer().getMap().killAllMonsters(false); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!resetmobs - 重置地图上所有怪物").toString(); + } + } + + public static class 最近传送点 extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + final MaplePortal portal = c.getPlayer().getMap().findClosestPortal(c.getPlayer().getTruePosition()); + c.getPlayer().dropMessage(-11, portal.getName() + " id: " + portal.getId() + " script: " + portal.getScriptName()); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!最近传送点 - 查看最近的传送点").toString(); + } + } + + public static class 给所有人点数 extends CashEveryone { + } + + public static class CashEveryone extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length > 2) { + int type = Integer.parseInt(splitted[1]); + int quantity = Integer.parseInt(splitted[2]); + if (type == 1) { + type = 1; + } else { + if (type != 2) { + c.getPlayer().dropMessage(6, "用法: !给所有人点数 [点数类型1-2] [点数数量] 1是点券.2是抵用"); + return true; + } + type = 2; + } + if (quantity > 10000) { + quantity = 10000; + } + int ret = 0; + for (final ChannelServer cserv : ChannelServer.getAllInstances()) { + for (final MapleCharacter mch : cserv.getPlayerStorage().getAllCharacters()) { + mch.modifyCSPoints(type, quantity, true); + ++ret; + } + } + final String show = (type == 1) ? "点券" : "抵用"; + for (final ChannelServer cserv2 : ChannelServer.getAllInstances()) { + for (final MapleCharacter mch2 : cserv2.getPlayerStorage().getAllCharacters()) { + mch2.startMapEffect("管理员发放" + quantity + show + "给在线的所有玩家!祝您玩得开心快乐", 5121009); + } + } + c.getPlayer().dropMessage(6, "命令使用成功,当前共有: " + ret + " 个玩家获得: " + quantity + " 点的" + ((type == 1) ? "点券 " : " 抵用 ") + " 共计: " + ret * quantity); + } else { + c.getPlayer().dropMessage(6, "用法: !给所有人点数 [点数类型1-2] [点数数量] 1是点券.2是抵用"); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!给所有人点数 - [点数类型1-2] [点数数量]").toString(); + } + } + + public static class 给地图人点数 extends CashMap { + } + + public static class CashMap extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length > 2) { + int type = Integer.parseInt(splitted[1]); + int quantity = Integer.parseInt(splitted[2]); + if (type == 1) { + type = 1; + } else { + if (type != 2) { + c.getPlayer().dropMessage(6, "用法: !给所有人点数 [点数类型1-2] [点数数量] 1是点券.2是抵用"); + return true; + } + type = 2; + } + if (quantity > 10000) { + quantity = 10000; + } + int ret = 0; + final MapleMap from = c.getPlayer().getMap(); + for (final MapleCharacter chrr : from.getCharactersThreadsafe()) { + chrr.modifyCSPoints(type, quantity); + ++ret; + } + final String show = (type == 1) ? "点券" : "抵用"; + final MapleMap froma = c.getPlayer().getMap(); + for (final MapleCharacter chrrr : froma.getCharactersThreadsafe()) { + chrrr.startMapEffect("管理员发放" + quantity + show + "给地图的所有玩家!祝您玩得开心快乐", 5121009); + } + c.getPlayer().dropMessage(6, "命令使用成功,当前共有: " + ret + " 个玩家获得: " + quantity + " 点的" + ((type == 1) ? "点券 " : " 抵用 ") + " 共计: " + ret * quantity); + } else { + c.getPlayer().dropMessage(6, "用法: !给地图人点数 [点数类型1-2] [点数数量] 1是点券.2是抵用"); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!给地图人点数 - [点数类型1-2] [点数数量]").toString(); + } + } + + public static class 给地图人金币 extends MesoMap { + } + + public static class MesoMap extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length > 1) { + final int quantity = Integer.parseInt(splitted[1]); + int ret = 0; + final MapleMap from = c.getPlayer().getMap(); + for (final MapleCharacter chrr : from.getCharactersThreadsafe()) { + chrr.gainMeso(quantity, true); + ++ret; + } + final MapleMap froma = c.getPlayer().getMap(); + for (final MapleCharacter chrrr : froma.getCharactersThreadsafe()) { + chrrr.startMapEffect("管理员发放" + quantity + "金币给地图的所有玩家!祝您玩得开心快乐", 5121009); + } + c.getPlayer().dropMessage(6, "命令使用成功,当前共有: " + ret + " 个玩家获得: " + quantity + " 金币" + " 共计: " + ret * quantity); + } else { + c.getPlayer().dropMessage(6, "用法: !给地图人金币 [数量]"); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!给地图人金币 - [数量]").toString(); + } + } + + public static class 给地图人红利 extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length > 1) { + final int quantity = Integer.parseInt(splitted[1]); + int ret = 0; + final MapleMap from = c.getPlayer().getMap(); + for (final MapleCharacter chrr : from.getCharactersThreadsafe()) { + chrr.modifyCSPoints(3, quantity, true); + ++ret; + } + final MapleMap froma = c.getPlayer().getMap(); + for (final MapleCharacter chrrr : froma.getCharactersThreadsafe()) { + chrrr.startMapEffect("管理员发放" + quantity + "红利给地图的所有玩家!祝您玩得开心快乐", 5121009); + } + c.getPlayer().dropMessage(6, "命令使用成功,当前共有: " + ret + " 个玩家获得: " + quantity + " 红利" + " 共计: " + ret * quantity); + } else { + c.getPlayer().dropMessage(6, "用法: !给地图人红利 [数量]"); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!给地图人红利 - [数量]").toString(); + } + } + + public static class 给推广积分 extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 3) { + return false; + } + final String name = splitted[1]; + final int gain = Integer.parseInt(splitted[2]); + final int accid = MapleClient.findAccIdForCharacterName(name); + final int tgjf = MapleClient.getTGJF(accid); + if (tgjf > 0) { + c.getPlayer().dropMessage("玩家[" + name + "] 推广积分不等于0。"); + return true; + } + final byte ret = MapleClient.setTGJF(name, gain); + if (ret == -2) { + c.getPlayer().dropMessage(6, "[给推广积分] SQL 错误"); + } else if (ret == -1) { + c.getPlayer().dropMessage(6, "[给推广积分] 目标玩家不存在"); + } else { + c.getPlayer().dropMessage(6, "[给推广积分] 成功给予推广积分"); + } + c.getPlayer().dropMessage("已经给予玩家[" + name + "] " + gain + " 推广积分"); + FileoutputUtil.logToFile("logs/Data/给推广积分.txt", "\r\n " + FileoutputUtil.NowTime() + " GM " + c.getPlayer().getName() + " 给了 " + name + " " + gain + "推广积分"); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!给推广积分 玩家名称 数量").toString(); + } + } + + public static class 给FB积分 extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 3) { + return false; + } + final String name = splitted[1]; + final int gain = Integer.parseInt(splitted[2]); + final int accid = MapleClient.findAccIdForCharacterName(name); + final int tjjf = MapleClient.getTJJF(accid); + if (tjjf > 0) { + c.getPlayer().dropMessage("玩家[" + name + "] FB积分不等于0。"); + return true; + } + final byte ret = MapleClient.setTJJF(name, gain); + if (ret == -2) { + c.getPlayer().dropMessage(6, "[给FB积分] SQL 错误"); + } else if (ret == -1) { + c.getPlayer().dropMessage(6, "[给FB积分] 目标玩家不存在"); + } else { + c.getPlayer().dropMessage(6, "[给FB积分] 成功给予FB积分"); + } + c.getPlayer().dropMessage("已经给予玩家[" + name + "] " + gain + " FB积分"); + FileoutputUtil.logToFile("logs/Data/给FB积分.txt", "\r\n " + FileoutputUtil.NowTime() + " GM " + c.getPlayer().getName() + " 给了 " + name + " " + gain + "FB积分"); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!给推广积分 玩家名称 数量").toString(); + } + } + + public static class 测谎所有人 extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + int ret = 0; + for (final ChannelServer cserv : ChannelServer.getAllInstances()) { + for (final MapleCharacter mch : cserv.getPlayerStorage().getAllCharacters()) { + mch.startLieDetector(false); + ++ret; + } + } + c.getPlayer().dropMessage(6, "命令使用成功,当前共有: " + ret + " 个玩家被测谎"); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!测谎所有人 - [测谎所有人]").toString(); + } + } + + public static class ReloadGashapon extends CommandExecute { + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + GashaponFactory.getInstance().reloadGashapons(); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!reloadGashapon - 重新载入转蛋机").toString(); + } + } +} diff --git a/src/client/messages/commands/CommandExecute.java b/src/client/messages/commands/CommandExecute.java new file mode 100644 index 0000000..7e678f1 --- /dev/null +++ b/src/client/messages/commands/CommandExecute.java @@ -0,0 +1,26 @@ +package client.messages.commands; + +import constants.ServerConstants.CommandType; +import client.MapleClient; + +public abstract class CommandExecute { + public abstract boolean execute(final MapleClient p0, final String[] p1); + + public CommandType getType() { + return CommandType.NORMAL; + } + + public abstract String getMessage(); + + enum ReturnValue { + DONT_LOG, + LOG; + } + + public abstract static class TradeExecute extends CommandExecute { + @Override + public CommandType getType() { + return CommandType.TRADE; + } + } +} diff --git a/src/client/messages/commands/CommandObject.java b/src/client/messages/commands/CommandObject.java new file mode 100644 index 0000000..0199058 --- /dev/null +++ b/src/client/messages/commands/CommandObject.java @@ -0,0 +1,32 @@ +package client.messages.commands; + +import constants.ServerConstants.CommandType; +import client.MapleClient; + +public class CommandObject { + private final String command; + private final int gmLevelReq; + private final CommandExecute exe; + + public CommandObject(final String com, final CommandExecute c, final int gmLevel) { + this.command = com; + this.exe = c; + this.gmLevelReq = gmLevel; + } + + public boolean execute(final MapleClient c, final String[] splitted) { + return this.exe.execute(c, splitted); + } + + public CommandType getType() { + return this.exe.getType(); + } + + public int getReqGMLevel() { + return this.gmLevelReq; + } + + public String getMessage() { + return (this.command != null) ? this.exe.getMessage() : ""; + } +} diff --git a/src/client/messages/commands/ConsoleCommand.java b/src/client/messages/commands/ConsoleCommand.java new file mode 100644 index 0000000..1b01104 --- /dev/null +++ b/src/client/messages/commands/ConsoleCommand.java @@ -0,0 +1,4 @@ +package client.messages.commands; + +public class ConsoleCommand { +} diff --git a/src/client/messages/commands/ConsoleCommandExecute.java b/src/client/messages/commands/ConsoleCommandExecute.java new file mode 100644 index 0000000..db99119 --- /dev/null +++ b/src/client/messages/commands/ConsoleCommandExecute.java @@ -0,0 +1,5 @@ +package client.messages.commands; + +public abstract class ConsoleCommandExecute { + public abstract int execute(final String[] p0); +} diff --git a/src/client/messages/commands/ConsoleCommandObject.java b/src/client/messages/commands/ConsoleCommandObject.java new file mode 100644 index 0000000..27d3ede --- /dev/null +++ b/src/client/messages/commands/ConsoleCommandObject.java @@ -0,0 +1,15 @@ +package client.messages.commands; + +public class ConsoleCommandObject { + private final String command; + private final ConsoleCommandExecute exe; + + public ConsoleCommandObject(final String com, final ConsoleCommandExecute c) { + this.command = com; + this.exe = c; + } + + public int execute(final String[] splitted) { + return this.exe.execute(splitted); + } +} diff --git a/src/client/messages/commands/GMCommand.java b/src/client/messages/commands/GMCommand.java new file mode 100644 index 0000000..dc81d2e --- /dev/null +++ b/src/client/messages/commands/GMCommand.java @@ -0,0 +1,3618 @@ +package client.messages.commands; + +import gui.进阶BOSS.Mushplotact; +import tools.LoadPacket; + +import java.util.Collection; +import java.util.LinkedHashSet; + +import handling.world.MapleParty; + +import java.util.ListIterator; + +import handling.cashshop.CashShopServer; +import tools.Triple; +import client.inventory.OnlyID; +import server.life.MapleMonster; +import server.life.OverrideMonsterStats; + +import java.util.Arrays; + +import server.maps.MapleMapObjectType; +import server.maps.MapleReactorStats; +import server.maps.MapleReactorFactory; +import constants.ServerConfig; +import constants.WorldConstants; +import handling.login.LoginServer; +import client.inventory.MapleRing; +import client.inventory.Equip; +import client.inventory.MapleInventoryIdentifier; +import constants.GameConstants; +import client.inventory.Item; + +import java.util.Map; +import java.util.Map.Entry; + +import client.inventory.ItemFlag; +import tools.ArrayMap; +import tools.Pair; + +import java.util.ArrayList; + +import client.ISkill; +import client.SkillFactory; +import handling.world.family.MapleFamily; +import handling.world.guild.MapleGuild; +import server.MapleItemInformationProvider; +import server.maps.MapleMapFactory; +import server.events.MapleOxQuizFactory; +import server.quest.MapleQuest; +import server.FishingRewardFactory; +import server.CashItemFactory; +import server.MapleShopFactory; +import scripting.PortalScriptManager; +import scripting.ReactorScriptManager; +import server.life.MapleMonsterInformationProvider; +import handling.RecvPacketOpcode; +import handling.SendPacketOpcode; +import client.messages.CommandProcessorUtil; +import client.inventory.ModifyInventory; +import client.inventory.MapleInventory; +import server.MapleInventoryManipulator; +import client.inventory.IItem; + +import java.util.LinkedList; + +import client.inventory.MapleInventoryType; + +import java.text.DateFormat; +import java.util.Calendar; + +import handling.world.World; +import server.Timer.EventTimer; + +import java.util.concurrent.ScheduledFuture; + +import server.ShutdownServer; +import gui.进阶BOSS.活动捉鬼任务; +import server.maps.MapleMap; + +import java.util.HashMap; + +import server.MaplePortal; +import server.maps.MapleReactor; +import server.maps.MapleMapObject; +import handling.world.World.Find; + +import java.sql.ResultSet; +import java.sql.PreparedStatement; +import java.sql.Connection; +import java.sql.SQLException; + +import handling.world.World.Guild; +import database.DBConPool; +import server.life.MapleNPC; +import server.life.MapleLifeFactory; +import handling.world.World.Broadcast; +import tools.StringUtil; + +import java.awt.Point; + +import client.MapleStat; + +import java.util.List; +import java.util.Iterator; + +import client.MapleCharacter; +import handling.channel.ChannelServer; +import constants.ServerConstants; +import tools.FileoutputUtil; +import tools.MaplePacketCreator; +import scripting.NPCScriptManager; +import client.MapleClient; +import constants.ServerConstants.PlayerGMRank; + +public class GMCommand { + + public static PlayerGMRank getPlayerLevelRequired() { + return PlayerGMRank.领导者; + } + + public static class 刷新地图1 extends UpdateMap { + } + + public static class 清怪 extends KillAll { + } + + public static class 爆率 extends MobDrop { + } + + public static class 高级检索 extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + c.removeClickedNPC(); + NPCScriptManager.getInstance().dispose(c); + c.getSession().write(MaplePacketCreator.enableActions()); + NPCScriptManager.getInstance().start(c, 9010000, "高级检索"); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!高级检索 - 各种功能检索功能").toString(); + } + } + + public static class 查看当前地图信息 extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (!c.getPlayer().isAdmin()) { + return false; + } + c.getPlayer().dropMessage(6, "当前地图信息: ID " + c.getPlayer().getMapId() + " 名字 " + c.getPlayer().getMap().getMapName() + " 当前坐标: X " + c.getPlayer().getPosition().x + " Y " + c.getPlayer().getPosition().y); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!查看当前地图信息 - 查看当前地图信息").toString(); + } + } + + public static class spmap extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + for (int i = 0; i <= 990001101; ++i) { + if (c.getChannelServer().getMapFactory().getMap(i) != null) { + final StringBuilder sb = new StringBuilder(); + sb.append(c.getChannelServer().getMapFactory().getMap(i).getFirstUserEnter()); + sb.append("\r\n"); + FileoutputUtil.logToFile("logs/地图事件1.txt", sb.toString()); + final StringBuilder sb2 = new StringBuilder(); + sb2.append(c.getChannelServer().getMapFactory().getMap(i).getonUserEnter()); + sb2.append("\r\n"); + FileoutputUtil.logToFile("logs/地图事件2.txt", sb2.toString()); + } + } + c.getPlayer().dropMessage(6, "添加完毕"); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!spmap").toString(); + } + } + + public static class 修改人气商品 extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 3) { + return false; + } + int input = 0; + int Change = 0; + int sn = 0; + try { + input = Integer.parseInt(splitted[1]); + Change = input - 1; + sn = Integer.parseInt(splitted[2]); + } catch (Exception ex) { + return false; + } + if (input < 1 || input > 5) { + c.getPlayer().dropMessage("数字只能输入1~5之间写"); + return true; + } + ServerConstants.hot_sell[Change] = sn; + c.getPlayer().dropMessage("商城人气商品第" + input + "个已经修改为SN是 " + sn + " 的道具"); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!修改人气商品 <第X个人气商品> <新商品的SN> - 修改商城右边人气商品").toString(); + } + } + + public static class SaveAll extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + int p = 0; + for (final ChannelServer cserv : ChannelServer.getAllInstances()) { + final List chrs = cserv.getPlayerStorage().getAllCharactersThreadSafe(); + for (final MapleCharacter chr : chrs) { + ++p; + chr.saveToDB(false, false); + } + } + c.getPlayer().dropMessage("[保存] " + p + "个玩家数据保存到数据中."); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!saveall - 储存所有角色资料").toString(); + } + } + + public static class LowHP extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + c.getPlayer().getStat().setHp(1); + c.getPlayer().getStat().setMp(1); + c.getPlayer().updateSingleStat(MapleStat.HP, 1); + c.getPlayer().updateSingleStat(MapleStat.MP, 1); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!lowhp - 血魔归ㄧ").toString(); + } + } + + public static class 升级 extends CommandExecute { + + @Override + public boolean execute(MapleClient c, String splitted[]) { + if (splitted.length < 2) { + c.getPlayer().levelUp(); + } else { + int up = 0; + try { + up = Integer.parseInt(splitted[1]); + } catch (Exception ex) { + + } + for (int i = 0; i < up; i++) { + c.getPlayer().levelUp(); + } + } + c.getPlayer().setExp(0); + c.getPlayer().updateSingleStat(MapleStat.EXP, 0); +// if (c.getPlayer().getLevel() < 200) { +// c.getPlayer().gainExp(GameConstants.getExpNeededForLevel(c.getPlayer().getLevel()) + 1, true, false, true); +// } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!升级 - 等级上升").toString(); + } + } + + public static class 添加aclog extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 3) { + return false; + } + final String playername = splitted[1]; + final String mod = splitted[2]; + final int playerid = MapleCharacter.getCharacterIdByName(playername); + if (playerid == -1) { + c.getPlayer().dropMessage(6, "玩家[" + playername + "]不存在于资料库內。"); + return true; + } + final MapleCharacter victim = MapleCharacter.getCharacterById(playerid); + if (victim != null) { + victim.setAcLog(mod); + c.getPlayer().dropMessage(6, "添加玩家[" + playername + "] aclog [" + mod + "]成功。"); + } else { + c.getPlayer().dropMessage(6, "玩家[" + playername + "]不存在于资料库內。"); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!添加aclog <玩家名字> - aclog类型").toString(); + } + } + + public static class 推文 extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 3) { + return false; + } + final String playername = splitted[1]; + final int playerid = MapleCharacter.getCharacterIdByName(playername); + if (playerid == -1) { + c.getPlayer().dropMessage(6, "玩家[" + playername + "]不存在于资料库內。"); + return true; + } + final MapleCharacter victim = MapleCharacter.getCharacterById(playerid); + if (victim != null) { + victim.modifyCSPoints(1, 300, true); + victim.modifyCSPoints(2, 500, true); + c.getPlayer().dropMessage(6, "推文玩家[" + playername + "] 300Gash 500抵用发放成功。"); + } else { + c.getPlayer().dropMessage(6, "玩家[" + playername + "]不存在于资料库內。"); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!推文 <玩家名字>").toString(); + } + } + + public static class 分享奖励 extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + final String playername = splitted[1]; + c.getPlayer().setFxName(playername); + c.getPlayer().dropMessage(6, "添加玩家[" + playername + "] 分享奖励成功。"); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!分享奖励 <玩家名字> - aclog类型").toString(); + } + } + + public static class 补领赞助 extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 3) { + return false; + } + final String playername = splitted[1]; + final int mod = Integer.parseInt(splitted[2]); + final int playerid = MapleCharacter.getCharacterIdByName(playername); + if (playerid == -1) { + c.getPlayer().dropMessage(6, "玩家[" + playername + "]不存在于资料库內。"); + return true; + } + final MapleCharacter victim = MapleCharacter.getCharacterById(playerid); + if (victim != null) { + victim.setBuLingZanZu(mod); + victim.modifyCSPoints(1, mod * 5, true); + victim.gainVip(); + FileoutputUtil.logToFile("logs/Data/补领赞助.txt", "\r\n " + FileoutputUtil.NowTime() + " GM " + c.getPlayer().getName() + " 给了 " + victim.getName() + " " + mod + "台币补领赞助"); + c.getPlayer().dropMessage(6, "玩家[" + playername + "] 补领赞助 [" + mod + "] 台币。"); + } else { + c.getPlayer().dropMessage(6, "玩家[" + playername + "]不存在于资料库內。"); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!补领赞助 <玩家名字> - 赞助台币数量").toString(); + } + } + + public static class 补领红利 extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 3) { + return false; + } + final String playername = splitted[1]; + final int mod = Integer.parseInt(splitted[2]); + final int playerid = MapleCharacter.getCharacterIdByName(playername); + if (playerid == -1) { + c.getPlayer().dropMessage(6, "玩家[" + playername + "]不存在于资料库內。"); + return true; + } + final MapleCharacter victim = MapleCharacter.getCharacterById(playerid); + if (victim != null) { + victim.modifyCSPoints(3, mod, true); + FileoutputUtil.logToFile("logs/Data/补领红利.txt", "\r\n " + FileoutputUtil.NowTime() + " GM " + c.getPlayer().getName() + " 给了 " + victim.getName() + " " + mod + "点补领红利"); + c.getPlayer().dropMessage(6, "玩家[" + playername + "] 补领红利 [" + mod + "] 红利。"); + } else { + c.getPlayer().dropMessage(6, "玩家[" + playername + "]不存在于资料库內。"); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!补领红利 <玩家名字> - 补领红利数量").toString(); + } + } + + public static class MyPos extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + final Point pos = c.getPlayer().getPosition(); + c.getPlayer().dropMessage(6, "X: " + pos.x + " | Y: " + pos.y + " | RX0: " + (pos.x + 50) + " | RX1: " + (pos.x - 50) + " | FH: " + c.getPlayer().getFH() + "| CY:" + pos.y); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!mypos - 我的位置").toString(); + } + } + + public static class Notice extends CommandExecute { + + private static int getNoticeType(final String typestring) { + switch (typestring) { + case "n": { + return 0; + } + case "p": { + return 1; + } + case "l": { + return 2; + } + case "nv": { + return 5; + } + case "v": { + return 5; + } + case "b": { + return 6; + } + default: { + return -1; + } + } + } + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + int joinmod = 1; + int range = -1; + if (splitted.length < 2) { + return false; + } + final String s = splitted[1]; + switch (s) { + case "m": { + range = 0; + break; + } + case "c": { + range = 1; + break; + } + case "w": { + range = 2; + break; + } + } + int tfrom = 2; + if (range == -1) { + range = 2; + tfrom = 1; + } + if (splitted.length < tfrom + 1) { + return false; + } + int type = getNoticeType(splitted[tfrom]); + if (type == -1) { + type = 0; + joinmod = 0; + } + final StringBuilder sb = new StringBuilder(); + if (splitted[tfrom].equals("nv")) { + sb.append("[Notice]"); + } else { + sb.append(""); + } + joinmod += tfrom; + if (splitted.length < joinmod + 1) { + return false; + } + sb.append(StringUtil.joinStringFrom(splitted, joinmod)); + final byte[] packet = MaplePacketCreator.serverNotice(type, sb.toString()); + if (range == 0) { + c.getPlayer().getMap().broadcastMessage(packet); + } else if (range == 1) { + ChannelServer.getInstance(c.getChannel()).broadcastPacket(packet); + } else if (range == 2) { + Broadcast.broadcastMessage(packet); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!notice - 公告").toString(); + } + } + + public static class Yellow extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + int range = -1; + final String s = splitted[1]; + switch (s) { + case "m": { + range = 0; + break; + } + case "c": { + range = 1; + break; + } + case "w": { + range = 2; + break; + } + } + if (range == -1) { + range = 2; + } + final byte[] packet = MaplePacketCreator.yellowChat((splitted[0].equals("!y") ? ("[" + c.getPlayer().getName() + "] ") : "") + StringUtil.joinStringFrom(splitted, 2)); + if (range == 0) { + c.getPlayer().getMap().broadcastMessage(packet); + } else if (range == 1) { + ChannelServer.getInstance(c.getChannel()).broadcastPacket(packet); + } else if (range == 2) { + Broadcast.broadcastMessage(packet); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!yellow - 黄色公告").toString(); + } + } + + public static class Y extends Yellow { + } + + public static class NpcNotice extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length <= 2) { + return false; + } + final int npcid = Integer.parseInt(splitted[1]); + final String msg = splitted[2]; + Broadcast.broadcastMessage(MaplePacketCreator.getNPCTalk(npcid, (byte) 0, msg, "00 00", (byte) 0)); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!NpcNotice - 用NPC发讯息").toString(); + } + } + + public static class opennpc extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + int npcid = 0; + try { + npcid = Integer.parseInt(splitted[1]); + } catch (NumberFormatException ex) { + } + final MapleNPC npc = MapleLifeFactory.getNPC(npcid); + if (npc != null && !npc.getName().equalsIgnoreCase("MISSINGNO")) { + NPCScriptManager.getInstance().start(c, npcid); + } else { + c.getPlayer().dropMessage(6, "未知NPC"); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!openNpc - 开启NPC").toString(); + } + } + + public static class 改名字 extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + final String after = splitted[1]; + if (after.length() <= 12) { + c.getPlayer().setName(splitted[1]); + c.getPlayer().fakeRelog(); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!改名字 \t新名字\u0010 - 改角色名字").toString(); + } + } + + public static class 加入公会 extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length != 2) { + return false; + } + try (final Connection con = (Connection) DBConPool.getInstance().getDataSource().getConnection()) { + final PreparedStatement ps = con.prepareStatement("SELECT guildid FROM guilds WHERE name = ?"); + ps.setString(1, splitted[1]); + final ResultSet rs = ps.executeQuery(); + if (rs.next()) { + if (c.getPlayer().getGuildId() > 0) { + try { + Guild.leaveGuild(c.getPlayer().getMGC()); + } catch (Exception e) { + c.sendPacket(MaplePacketCreator.serverNotice(5, "无法连接到世界服务器,请稍后再尝试。")); + return false; + } + c.sendPacket(MaplePacketCreator.showGuildInfo(null)); + c.getPlayer().setGuildId(0); + c.getPlayer().saveGuildStatus(); + } + c.getPlayer().setGuildId(rs.getInt("guildid")); + c.getPlayer().setGuildRank((byte) 2); + try { + Guild.addGuildMember(c.getPlayer().getMGC(), false); + } catch (Exception ex) { + } + c.sendPacket(MaplePacketCreator.showGuildInfo(c.getPlayer())); + c.getPlayer().getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.removePlayerFromMap(c.getPlayer().getId()), false); + c.getPlayer().getMap().broadcastMessage(c.getPlayer(), MaplePacketCreator.spawnPlayerMapobject(c.getPlayer()), false); + c.getPlayer().saveGuildStatus(); + } else { + c.getPlayer().dropMessage(6, "公会名称不存在。"); + } + rs.close(); + ps.close(); + con.close(); + } catch (SQLException ex2) { + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!加入公会 \t公会名字\u0010 - 强制加入公会").toString(); + } + } + + public static class 离婚 extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + final String name = splitted[1]; + final int ch = Find.findChannel(name); + if (ch <= 0) { + c.getPlayer().dropMessage(6, "玩家必须上线"); + return true; + } + final MapleCharacter victim = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(name); + if (victim == null) { + c.getPlayer().dropMessage(6, "玩家必须上线"); + return true; + } + victim.setMarriageId(0); + victim.reloadC(); + victim.dropMessage(5, "离婚成功!"); + victim.saveToDB(false, false); + c.getPlayer().dropMessage(6, victim.getName() + "离婚成功!"); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!离婚 <玩家名称> - 离婚").toString(); + } + } + + public static class CancelBuffs extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + c.getPlayer().cancelAllBuffs(); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!CancelBuffs - 取消所有BUFF").toString(); + } + } + + public static class RemoveNPCs extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + c.getPlayer().getMap().resetNPCs(); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!removenpcs - 刪除所有NPC").toString(); + } + } + + public static class LookNPCs extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + for (final MapleMapObject reactor1l : c.getPlayer().getMap().getAllNPCsThreadsafe()) { + final MapleNPC reactor2l = (MapleNPC) reactor1l; + c.getPlayer().dropMessage(5, "NPC: oID: " + reactor2l.getObjectId() + " npcID: " + reactor2l.getId() + " Position: " + reactor2l.getPosition().toString() + " Name: " + reactor2l.getName()); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!looknpcs - 查看所有NPC").toString(); + } + } + + public static class LookReactors extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + for (final MapleMapObject reactor1l : c.getPlayer().getMap().getAllReactorsThreadsafe()) { + final MapleReactor reactor2l = (MapleReactor) reactor1l; + c.getPlayer().dropMessage(5, "Reactor: oID: " + reactor2l.getObjectId() + " reactorID: " + reactor2l.getReactorId() + " Position: " + reactor2l.getPosition().toString() + " State: " + (int) reactor2l.getState() + " Name: " + reactor2l.getName()); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!lookreactors - 查看所有反应堆").toString(); + } + } + + public static class LookPortals extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + for (final MaplePortal portal : c.getPlayer().getMap().getPortals()) { + c.getPlayer().dropMessage(5, "Portal: ID: " + portal.getId() + " script: " + portal.getScriptName() + " name: " + portal.getName() + " pos: " + portal.getPosition().x + "," + portal.getPosition().y + " target: " + portal.getTargetMapId() + " / " + portal.getTarget()); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!lookportals - 查看所有反应堆").toString(); + } + } + + public static class GoTo extends CommandExecute { + + private static final HashMap gotomaps; + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + c.getPlayer().dropMessage(6, "使用方法: !goto <地图名称>"); + } else if (GoTo.gotomaps.containsKey(splitted[1])) { + final MapleMap target = c.getChannelServer().getMapFactory().getMap(((Integer) GoTo.gotomaps.get(splitted[1])).intValue()); + final MaplePortal targetPortal = target.getPortal(0); + c.getPlayer().changeMap(target, targetPortal); + } else if (splitted[1].equals("目的地")) { + c.getPlayer().dropMessage(6, "使用 !goto <目的地>. 目的地地图如下:"); + final StringBuilder sb = new StringBuilder(); + for (final String s : GoTo.gotomaps.keySet()) { + sb.append(s).append(", "); + } + c.getPlayer().dropMessage(6, sb.substring(0, sb.length() - 2)); + } else { + c.getPlayer().dropMessage(6, "错误的指令规则 - 使用 !goto <目的地>. 来看目的地地图清单, 接著使用 !goto 目的地地图名称."); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!goto <名称> - 到某个地图").toString(); + } + + static { + (gotomaps = new HashMap()).put("gmmap", Integer.valueOf(180000000)); + gotomaps.put("southperry", Integer.valueOf(2000000)); + gotomaps.put("amherst", Integer.valueOf(1010000)); + gotomaps.put("henesys", Integer.valueOf(100000000)); + gotomaps.put("ellinia", Integer.valueOf(101000000)); + gotomaps.put("perion", Integer.valueOf(102000000)); + gotomaps.put("kerning", Integer.valueOf(103000000)); + gotomaps.put("lithharbour", Integer.valueOf(104000000)); + gotomaps.put("sleepywood", Integer.valueOf(105040300)); + gotomaps.put("florina", Integer.valueOf(110000000)); + gotomaps.put("orbis", Integer.valueOf(200000000)); + gotomaps.put("happyville", Integer.valueOf(209000000)); + gotomaps.put("elnath", Integer.valueOf(211000000)); + gotomaps.put("ludibrium", Integer.valueOf(220000000)); + gotomaps.put("aquaroad", Integer.valueOf(230000000)); + gotomaps.put("leafre", Integer.valueOf(240000000)); + gotomaps.put("mulung", Integer.valueOf(250000000)); + gotomaps.put("herbtown", Integer.valueOf(251000000)); + gotomaps.put("omegasector", Integer.valueOf(221000000)); + gotomaps.put("koreanfolktown", Integer.valueOf(222000000)); + gotomaps.put("newleafcity", Integer.valueOf(600000000)); + gotomaps.put("sharenian", Integer.valueOf(990000000)); + gotomaps.put("pianus", Integer.valueOf(230040420)); + gotomaps.put("horntail", Integer.valueOf(240060200)); + gotomaps.put("chorntail", Integer.valueOf(240060201)); + gotomaps.put("mushmom", Integer.valueOf(100000005)); + gotomaps.put("griffey", Integer.valueOf(240020101)); + gotomaps.put("manon", Integer.valueOf(240020401)); + gotomaps.put("zakum", Integer.valueOf(280030000)); + gotomaps.put("czakum", Integer.valueOf(280030001)); + gotomaps.put("papulatus", Integer.valueOf(220080001)); + gotomaps.put("showatown", Integer.valueOf(801000000)); + gotomaps.put("zipangu", Integer.valueOf(800000000)); + gotomaps.put("ariant", Integer.valueOf(260000100)); + gotomaps.put("nautilus", Integer.valueOf(120000000)); + gotomaps.put("boatquay", Integer.valueOf(541000000)); + gotomaps.put("malaysia", Integer.valueOf(550000000)); + gotomaps.put("taiwan", Integer.valueOf(740000000)); + gotomaps.put("thailand", Integer.valueOf(500000000)); + gotomaps.put("erev", Integer.valueOf(130000000)); + gotomaps.put("ellinforest", Integer.valueOf(300000000)); + gotomaps.put("kampung", Integer.valueOf(551000000)); + gotomaps.put("singapore", Integer.valueOf(540000000)); + gotomaps.put("amoria", Integer.valueOf(680000000)); + gotomaps.put("timetemple", Integer.valueOf(270000000)); + gotomaps.put("pinkbean", Integer.valueOf(270050100)); + gotomaps.put("peachblossom", Integer.valueOf(700000000)); + gotomaps.put("fm", Integer.valueOf(910000000)); + gotomaps.put("freemarket", Integer.valueOf(910000000)); + gotomaps.put("oxquiz", Integer.valueOf(109020001)); + gotomaps.put("ola", Integer.valueOf(109030101)); + gotomaps.put("fitness", Integer.valueOf(109040000)); + gotomaps.put("snowball", Integer.valueOf(109060000)); + gotomaps.put("cashmap", Integer.valueOf(741010200)); + gotomaps.put("golden", Integer.valueOf(950100000)); + gotomaps.put("phantom", Integer.valueOf(610010000)); + gotomaps.put("cwk", Integer.valueOf(610030000)); + gotomaps.put("rien", Integer.valueOf(140000000)); + } + } + + public static class cleardrops extends RemoveDrops { + } + + public static class 清除地面道具 extends RemoveDrops { + } + + public static class RemoveDrops extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + c.getPlayer().dropMessage(5, "清除了 " + c.getPlayer().getMap().getNumItems() + " 个掉落物"); + c.getPlayer().getMap().removeDrops(); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!removedrops - 移除地上的物品").toString(); + } + } + + public static class 重载捉鬼任务 extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + 活动捉鬼任务.启动捉鬼任务(); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!重载捉鬼任务 - 重载捉鬼任务").toString(); + } + } + + public static class NearestPortal extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + final MaplePortal portal = c.getPlayer().getMap().findClosestSpawnpoint(c.getPlayer().getPosition()); + c.getPlayer().dropMessage(6, portal.getName() + " id: " + portal.getId() + " script: " + portal.getScriptName()); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!nearestportal - 不知道啥").toString(); + } + } + + public static class SpawnDebug extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + c.getPlayer().dropMessage(6, c.getPlayer().getMap().spawnDebug()); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!spawndebug - debug怪物出生").toString(); + } + } + + public static class Speak extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + final String name = splitted[1]; + final int ch = Find.findChannel(name); + if (ch <= 0) { + c.getPlayer().dropMessage(6, "玩家必须上线"); + return true; + } + final MapleCharacter victim = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(name); + if (victim == null) { + c.getPlayer().dropMessage(5, "找不到 '" + splitted[1]); + return false; + } + victim.getMap().broadcastMessage(MaplePacketCreator.getChatText(victim.getId(), StringUtil.joinStringFrom(splitted, 2), victim.isGM(), 0)); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!speak <玩家名称> <讯息> - 对某个玩家传讯息").toString(); + } + } + + public static class SpeakMap extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + for (final MapleCharacter victim : c.getPlayer().getMap().getCharactersThreadsafe()) { + if (victim.getId() != c.getPlayer().getId()) { + victim.getMap().broadcastMessage(MaplePacketCreator.getChatText(victim.getId(), StringUtil.joinStringFrom(splitted, 1), victim.isGM(), 0)); + } + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!speakmap <讯息> - 对目前地图进行传送讯息").toString(); + } + } + + public static class SpeakChannel extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + for (final MapleCharacter victim : c.getChannelServer().getPlayerStorage().getAllCharactersThreadSafe()) { + if (victim.getId() != c.getPlayer().getId()) { + victim.getMap().broadcastMessage(MaplePacketCreator.getChatText(victim.getId(), StringUtil.joinStringFrom(splitted, 1), victim.isGM(), 0)); + } + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!speakchannel <讯息> - 对目前频道进行传送讯息").toString(); + } + } + + public static class SpeakWorld extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + for (final ChannelServer cserv : ChannelServer.getAllInstances()) { + for (final MapleCharacter victim : cserv.getPlayerStorage().getAllCharactersThreadSafe()) { + if (victim.getId() != c.getPlayer().getId()) { + victim.getMap().broadcastMessage(MaplePacketCreator.getChatText(victim.getId(), StringUtil.joinStringFrom(splitted, 1), victim.isGM(), 0)); + } + } + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!speakchannel <讯息> - 对目前服务器进行传送讯息").toString(); + } + } + + public static class SpeakMega extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + MapleCharacter victim = null; + if (splitted.length >= 2) { + victim = c.getChannelServer().getPlayerStorage().getCharacterByName(splitted[1]); + } + try { + Broadcast.broadcastSmega(MaplePacketCreator.serverNotice(3, (victim == null) ? c.getChannel() : victim.getClient().getChannel(), (victim == null) ? splitted[1] : (victim.getName() + " : " + StringUtil.joinStringFrom(splitted, 2)), true)); + } catch (Exception e) { + return false; + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!speakmega [玩家名称] <讯息> - 对某个玩家的频道进行广播").toString(); + } + } + + public static class Say extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length > 1) { + final StringBuilder sb = new StringBuilder(); + sb.append("["); + sb.append(c.getPlayer().getName()); + sb.append("] "); + sb.append(StringUtil.joinStringFrom(splitted, 1)); + Broadcast.broadcastMessage(MaplePacketCreator.serverNotice(6, sb.toString())); + return true; + } + return false; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!say 讯息 - 服务器公告").toString(); + } + } + + public static class 关闭服务器 extends Shutdown { + } + + public static class Shutdown extends CommandExecute { + + private static Thread t; + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + c.getPlayer().dropMessage(6, "关闭服务器中..."); + if (Shutdown.t == null || !Shutdown.t.isAlive()) { + (Shutdown.t = new Thread((Runnable) ShutdownServer.getInstance())).start(); + } else { + c.getPlayer().dropMessage(6, "已在执行中..."); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!shutdown - 关闭服务器").toString(); + } + + static { + t = null; + } + } + + public static class 关闭服务器时间 extends ShutdownTime { + } + + public static class ShutdownTime extends CommandExecute { + + private static ScheduledFuture ts; + private int minutesLeft; + private static Thread t; + + public ShutdownTime() { + this.minutesLeft = 0; + } + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + this.minutesLeft = Integer.parseInt(splitted[1]); + c.getPlayer().dropMessage(6, "服务器将在 " + this.minutesLeft + "分钟后关闭. 请盡速关闭精灵商人 并下线."); + if (ShutdownTime.ts == null && (ShutdownTime.t == null || !ShutdownTime.t.isAlive())) { + ShutdownTime.t = new Thread((Runnable) ShutdownServer.getInstance()); + ShutdownTime.ts = EventTimer.getInstance().register((Runnable) new Runnable() { + @Override + public void run() { + if (ShutdownTime.this.minutesLeft > 0 && ShutdownTime.this.minutesLeft <= 11 && !World.isShutDown) { + World.isShutDown = true; + c.getPlayer().dropMessage(6, "已经限制玩家玩家所有行动。"); + } else if (ShutdownTime.this.minutesLeft == 0) { + ShutdownServer.getInstance().shutdown(); + ShutdownTime.t.start(); + ShutdownTime.ts.cancel(false); + return; + } + final StringBuilder message = new StringBuilder(); + message.append("[游戏公告] 服务器将在 "); + message.append(ShutdownTime.this.minutesLeft); + message.append(" 分钟后关闭,请勿关闭精灵商人并存档并下线。"); + Broadcast.broadcastMessage(MaplePacketCreator.serverNotice(6, message.toString())); + Broadcast.broadcastMessage(MaplePacketCreator.serverMessage(message.toString())); + for (final ChannelServer cs : ChannelServer.getAllInstances()) { + cs.setServerMessage("服务器将于 " + ShutdownTime.this.minutesLeft + " 分钟后关机"); + } + ShutdownTime.this.minutesLeft--; + } + }, 60000L); + } else { + c.getPlayer().dropMessage(6, "服务器关闭时间修改为 " + this.minutesLeft + "分钟后,请稍等服务器关闭"); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!shutdowntime <分钟数> - 关闭服务器").toString(); + } + + static { + ts = null; + t = null; + } + } + + public static class UnbanIP extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + final byte ret_ = MapleClient.unbanIP(splitted[1]); + if (ret_ == -2) { + c.getPlayer().dropMessage(6, "[unbanip] SQL 错误."); + } else if (ret_ == -1) { + c.getPlayer().dropMessage(6, "[unbanip] 角色不存在."); + } else if (ret_ == 0) { + c.getPlayer().dropMessage(6, "[unbanip] No IP or Mac with that character exists!"); + } else if (ret_ == 1) { + c.getPlayer().dropMessage(6, "[unbanip] IP或Mac已解锁其中一个."); + } else if (ret_ == 2) { + c.getPlayer().dropMessage(6, "[unbanip] IP以及Mac已成功解锁."); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!unbanip <玩家名称> - 解锁玩家").toString(); + } + } + + public static class TempBan extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + final String name = splitted[1]; + final int ch = Find.findChannel(name); + if (ch <= 0) { + return false; + } + final MapleCharacter victim = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(name); + final int reason = Integer.parseInt(splitted[2]); + final int numDay = Integer.parseInt(splitted[3]); + final Calendar cal = Calendar.getInstance(); + cal.add(5, numDay); + final DateFormat df = DateFormat.getInstance(); + if (victim == null) { + c.getPlayer().dropMessage(6, "[tempban] 找不到目标角色"); + } else { + victim.tempban("由" + c.getPlayer().getName() + "暂时锁定了", cal, reason, true); + c.getPlayer().dropMessage(6, "[tempban] " + splitted[1] + " 已成功被暂时锁定至 " + df.format(cal.getTime())); + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!tempban <玩家名称> - 暂时锁定玩家").toString(); + } + } + + public static class 禁止玩家使用 extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + World.isShutDown = !World.isShutDown; + c.getPlayer().dropMessage(0, "[禁止玩家使用] " + (World.isShutDown ? "开启" : "关闭")); + System.out.println("[禁止玩家使用] " + (World.isShutDown ? "开启" : "关闭")); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!禁止玩家使用 - 管理员登入模式开关").toString(); + } + } + + public static class 禁止使用精灵商店 extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + World.isShopShutDown = !World.isShopShutDown; + c.getPlayer().dropMessage(0, "[禁止使用精灵商店] " + (World.isShopShutDown ? "开启" : "关闭")); + System.out.println("[禁止使用精灵商店] " + (World.isShopShutDown ? "开启" : "关闭")); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!禁止使用精灵商店 - 禁止使用精灵商店").toString(); + } + } + + public static class copyAll extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + final MapleCharacter player = c.getPlayer(); + if (splitted.length < 2) { + return false; + } + final String name = splitted[1]; + final int ch = Find.findChannel(name); + if (ch <= 0) { + c.getPlayer().dropMessage(6, "玩家必须上线"); + return true; + } + final MapleCharacter victim = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(name); + if (victim == null) { + player.dropMessage("找不到该玩家"); + return true; + } + final MapleInventory equipped = c.getPlayer().getInventory(MapleInventoryType.EQUIPPED); + final MapleInventory equip = c.getPlayer().getInventory(MapleInventoryType.EQUIP); + final List ids = (List) new LinkedList(); + for (final IItem item : equipped.list()) { + ids.add(Short.valueOf(item.getPosition())); + } + final Iterator iterator2 = ids.iterator(); + while (iterator2.hasNext()) { + final short id = ((Short) iterator2.next()).shortValue(); + MapleInventoryManipulator.unequip(c, id, equip.getNextFreeSlot()); + } + c.getPlayer().clearSkills(); + c.getPlayer().setStr(victim.getStr()); + c.getPlayer().setDex(victim.getDex()); + c.getPlayer().setInt(victim.getInt()); + c.getPlayer().setLuk(victim.getLuk()); + c.getPlayer().setMeso(victim.getMeso()); + c.getPlayer().setLevel(victim.getLevel()); + c.getPlayer().changeJob((int) victim.getJob()); + c.getPlayer().setHp(victim.getHp()); + c.getPlayer().setMp(victim.getMp()); + c.getPlayer().setMaxHp(victim.getMaxHp()); + c.getPlayer().setMaxMp(victim.getMaxMp()); + final String normal = victim.getName(); + final String after = normal + "x2"; + if (after.length() <= 12) { + c.getPlayer().setName(victim.getName() + "x2"); + } + c.getPlayer().setRemainingAp(victim.getRemainingAp()); + c.getPlayer().setRemainingSp(victim.getRemainingSp()); + c.getPlayer().LearnSameSkill(victim); + c.getPlayer().setFame(victim.getFame()); + c.getPlayer().setHair(victim.getHair()); + c.getPlayer().setFace(victim.getFace()); + c.getPlayer().setSkinColor((victim.getSkinColor() == 0) ? c.getPlayer().getSkinColor() : victim.getSkinColor()); + c.getPlayer().setGender(victim.getGender()); + for (final IItem ii : victim.getInventory(MapleInventoryType.EQUIPPED).list()) { + final IItem eq = ii.copy(); + eq.setPosition(eq.getPosition()); + eq.setQuantity((short) 1); + c.getPlayer().forceReAddItem_NoUpdate(eq, MapleInventoryType.EQUIPPED); + } + c.getPlayer().fakeRelog(); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!copyall 玩家名称 - 复制玩家").toString(); + } + } + + public static class copyInv extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + final MapleCharacter player = c.getPlayer(); + int type = 1; + if (splitted.length < 2) { + return false; + } + final String name = splitted[1]; + final int ch = Find.findChannel(name); + if (ch <= 0) { + c.getPlayer().dropMessage(6, "玩家必须上线"); + return false; + } + final MapleCharacter victim = ChannelServer.getInstance(ch).getPlayerStorage().getCharacterByName(name); + if (victim == null) { + player.dropMessage("找不到该玩家"); + return true; + } + try { + type = Integer.parseInt(splitted[2]); + } catch (Exception ex) { + } + if (type == 0) { + for (final IItem ii : victim.getInventory(MapleInventoryType.EQUIPPED).list()) { + final IItem n = ii.copy(); + player.getInventory(MapleInventoryType.EQUIP).addItem(n); + } + player.fakeRelog(); + } else { + MapleInventoryType types; + if (type == 1) { + types = MapleInventoryType.EQUIP; + } else if (type == 2) { + types = MapleInventoryType.USE; + } else if (type == 3) { + types = MapleInventoryType.ETC; + } else if (type == 4) { + types = MapleInventoryType.SETUP; + } else if (type == 5) { + types = MapleInventoryType.CASH; + } else { + types = null; + } + if (types == null) { + c.getPlayer().dropMessage("发生错误"); + return true; + } + final int[] equip = new int[97]; + for (int i = 1; i < 97; ++i) { + if (victim.getInventory(types).getItem((short) i) != null) { + equip[i] = i; + } + } + for (int i = 0; i < equip.length; ++i) { + if (equip[i] != 0) { + final IItem n2 = victim.getInventory(types).getItem((short) equip[i]).copy(); + player.getInventory(types).addItem(n2); + c.sendPacket(MaplePacketCreator.modifyInventory(false, new ModifyInventory(0, n2))); + } + } + } + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!copyinv 玩家名称 装备栏位(0 = 装备中 1=装备栏 2=消耗栏 3=其他栏 4=装饰栏 5=点数栏)(预设装备栏) - 复制玩家道具").toString(); + } + } + + public static class Clock extends CommandExecute { + + @Override + public boolean execute(final MapleClient c, final String[] splitted) { + if (splitted.length < 2) { + return false; + } + c.getPlayer().getMap().broadcastMessage(MaplePacketCreator.getClock(CommandProcessorUtil.getOptionalIntArg(splitted, 1, 60))); + return true; + } + + @Override + public String getMessage() { + return new StringBuilder().append("!clock