From 6be6ea9927a6297ae23350b1af6d8bf054cd987c Mon Sep 17 00:00:00 2001 From: P0nk Date: Thu, 9 Sep 2021 23:26:02 +0200 Subject: [PATCH] Reformat and clean up "net" package --- src/main/java/net/AbstractPacketHandler.java | 2 +- src/main/java/net/PacketProcessor.java | 5 +- src/main/java/net/encryption/MapleAESOFB.java | 18 +- src/main/java/net/opcodes/RecvOpcode.java | 6 +- src/main/java/net/opcodes/SendOpcode.java | 38 +- .../java/net/server/PlayerBuffStorage.java | 16 +- .../net/server/PlayerBuffValueHolder.java | 1 - .../net/server/PlayerCoolDownValueHolder.java | 1 - .../net/server/PlayerDiseaseValueHolder.java | 6 +- src/main/java/net/server/PlayerStorage.java | 46 +- src/main/java/net/server/Server.java | 8 +- .../java/net/server/audit/LockCollector.java | 25 +- .../java/net/server/audit/ThreadTracker.java | 124 ++- .../server/audit/locks/MonitoredLockType.java | 1 - .../server/audit/locks/MonitoredReadLock.java | 11 +- .../audit/locks/MonitoredReentrantLock.java | 11 +- .../MonitoredReentrantReadWriteLock.java | 9 +- .../audit/locks/MonitoredWriteLock.java | 11 +- .../audit/locks/active/TrackerReadLock.java | 53 +- .../locks/active/TrackerReentrantLock.java | 55 +- .../audit/locks/active/TrackerWriteLock.java | 51 +- .../audit/locks/empty/AbstractEmptyLock.java | 8 +- .../audit/locks/empty/EmptyReadLock.java | 11 +- .../audit/locks/empty/EmptyReentrantLock.java | 11 +- .../audit/locks/empty/EmptyWriteLock.java | 11 +- .../factory/MonitoredReadLockFactory.java | 1 - .../MonitoredReentrantLockFactory.java | 3 +- .../factory/MonitoredWriteLockFactory.java | 1 - src/main/java/net/server/channel/Channel.java | 501 ++++++----- .../channel/CharacterIdChannelPair.java | 1 - .../handlers/AbstractDealDamageHandler.java | 493 +++++----- .../AbstractMovementPacketHandler.java | 28 +- .../channel/handlers/AcceptFamilyHandler.java | 45 +- .../channel/handlers/AdminChatHandler.java | 1 - .../channel/handlers/AdminCommandHandler.java | 8 +- .../handlers/AllianceOperationHandler.java | 65 +- .../channel/handlers/AranComboHandler.java | 6 +- .../channel/handlers/AutoAggroHandler.java | 8 +- .../channel/handlers/AutoAssignHandler.java | 3 +- .../channel/handlers/BeholderHandler.java | 1 - .../handlers/BuddylistModifyHandler.java | 4 +- .../channel/handlers/CancelBuffHandler.java | 6 +- .../channel/handlers/CancelChairHandler.java | 6 +- .../handlers/CashOperationHandler.java | 64 +- .../handlers/CashShopSurpriseHandler.java | 9 +- .../handlers/ChangeChannelHandler.java | 15 +- .../channel/handlers/ChangeMapHandler.java | 2 +- .../handlers/ChangeMapSpecialHandler.java | 32 +- .../handlers/CharInfoRequestHandler.java | 6 +- .../channel/handlers/ClickGuideHandler.java | 1 - .../handlers/CloseChalkboardHandler.java | 3 +- .../handlers/CloseRangeDamageHandler.java | 45 +- .../channel/handlers/CoconutHandler.java | 95 +- .../channel/handlers/CouponCodeHandler.java | 45 +- .../channel/handlers/DamageSummonHandler.java | 8 +- .../handlers/DenyAllianceRequestHandler.java | 2 +- .../handlers/DenyGuildRequestHandler.java | 3 +- .../handlers/DenyPartyRequestHandler.java | 6 +- .../channel/handlers/DistributeAPHandler.java | 6 +- .../channel/handlers/DistributeSPHandler.java | 2 +- .../server/channel/handlers/DoorHandler.java | 7 +- .../server/channel/handlers/DueyHandler.java | 14 +- .../handlers/EnterCashShopHandler.java | 15 +- .../channel/handlers/EnterMTSHandler.java | 16 +- .../handlers/FaceExpressionHandler.java | 6 +- .../channel/handlers/FamilyAddHandler.java | 19 +- .../handlers/FamilyPreceptsHandler.java | 12 +- .../handlers/FamilySeparateHandler.java | 34 +- .../handlers/FamilySummonResponseHandler.java | 14 +- .../channel/handlers/FamilyUseHandler.java | 81 +- .../handlers/FieldDamageMobHandler.java | 10 +- .../channel/handlers/FredrickHandler.java | 1 - .../channel/handlers/GeneralChatHandler.java | 76 +- .../channel/handlers/GiveFameHandler.java | 4 +- .../handlers/GrenadeEffectHandler.java | 6 +- .../handlers/GuildOperationHandler.java | 73 +- .../channel/handlers/HealOvertimeHandler.java | 18 +- .../handlers/HiredMerchantRequest.java | 5 +- .../channel/handlers/InnerPortalHandler.java | 1 - .../handlers/InventoryMergeHandler.java | 36 +- .../handlers/InventorySortHandler.java | 151 ++-- .../channel/handlers/ItemMoveHandler.java | 13 +- .../channel/handlers/ItemPickupHandler.java | 9 +- .../channel/handlers/ItemRewardHandler.java | 12 +- .../channel/handlers/KeymapChangeHandler.java | 90 +- .../handlers/LeftKnockbackHandler.java | 9 +- .../server/channel/handlers/MTSHandler.java | 8 +- .../channel/handlers/MagicDamageHandler.java | 82 +- .../channel/handlers/MakerSkillHandler.java | 3 +- .../channel/handlers/MesoDropHandler.java | 63 +- .../handlers/MobBanishPlayerHandler.java | 4 +- .../handlers/MobDamageMobFriendlyHandler.java | 95 +- .../channel/handlers/MobDamageMobHandler.java | 29 +- .../handlers/MonsterCarnivalHandler.java | 12 +- .../channel/handlers/MoveDragonHandler.java | 5 +- .../channel/handlers/MoveLifeHandler.java | 265 +++--- .../channel/handlers/MovePetHandler.java | 2 +- .../channel/handlers/MovePlayerHandler.java | 5 +- .../channel/handlers/MoveSummonHandler.java | 5 +- .../channel/handlers/MultiChatHandler.java | 16 +- .../channel/handlers/NPCMoreTalkHandler.java | 1 - .../channel/handlers/NPCShopHandler.java | 9 +- .../channel/handlers/NPCTalkHandler.java | 18 +- .../channel/handlers/NewYearCardHandler.java | 61 +- .../channel/handlers/OpenFamilyHandler.java | 5 +- .../handlers/OpenFamilyPedigreeHandler.java | 7 +- .../channel/handlers/OwlWarpHandler.java | 46 +- .../handlers/PartyOperationHandler.java | 16 +- .../handlers/PartySearchRegisterHandler.java | 3 +- .../handlers/PartySearchStartHandler.java | 57 +- .../handlers/PartySearchUpdateHandler.java | 2 +- .../channel/handlers/PetAutoPotHandler.java | 10 +- .../channel/handlers/PetChatHandler.java | 14 +- .../channel/handlers/PetCommandHandler.java | 2 +- .../handlers/PetExcludeItemsHandler.java | 4 +- .../channel/handlers/PetFoodHandler.java | 10 +- .../channel/handlers/PetLootHandler.java | 8 +- .../handlers/PlayerInteractionHandler.java | 136 +-- .../handlers/PlayerLoggedinHandler.java | 34 +- .../handlers/PlayerMapTransitionHandler.java | 9 +- .../channel/handlers/QuestActionHandler.java | 43 +- .../QuickslotKeyMappedModifiedHandler.java | 17 +- .../channel/handlers/RPSActionHandler.java | 106 +-- .../channel/handlers/RaiseIncExpHandler.java | 11 +- .../channel/handlers/RaiseUIStateHandler.java | 7 +- .../channel/handlers/RangedAttackHandler.java | 59 +- .../channel/handlers/ReactorHitHandler.java | 4 +- .../handlers/RemoteGachaponHandler.java | 51 +- .../channel/handlers/RemoteStoreHandler.java | 3 +- .../channel/handlers/ReportHandler.java | 116 +-- .../channel/handlers/RingActionHandler.java | 161 ++-- .../channel/handlers/ScriptedItemHandler.java | 11 +- .../channel/handlers/ScrollHandler.java | 22 +- .../channel/handlers/SkillBookHandler.java | 8 +- .../channel/handlers/SkillMacroHandler.java | 4 +- .../channel/handlers/SnowballHandler.java | 25 +- .../channel/handlers/SpawnPetHandler.java | 4 +- .../channel/handlers/SpecialMoveHandler.java | 24 +- .../channel/handlers/SpouseChatHandler.java | 2 +- .../channel/handlers/StorageHandler.java | 9 +- .../channel/handlers/SummonDamageHandler.java | 28 +- .../channel/handlers/TakeDamageHandler.java | 102 +-- .../channel/handlers/TouchReactorHandler.java | 3 +- .../handlers/TouchingCashShopHandler.java | 1 - .../channel/handlers/TransferNameHandler.java | 19 +- .../handlers/TransferNameResultHandler.java | 3 +- .../handlers/TransferWorldHandler.java | 17 +- .../channel/handlers/TrockAddMapHandler.java | 15 +- .../channel/handlers/UseCatchItemHandler.java | 29 +- .../channel/handlers/UseChairHandler.java | 4 +- .../channel/handlers/UseGachaExpHandler.java | 9 +- .../channel/handlers/UseHammerHandler.java | 1 - .../handlers/UseItemEffectHandler.java | 4 +- .../channel/handlers/UseItemHandler.java | 24 +- .../channel/handlers/UseMapleLifeHandler.java | 9 +- .../channel/handlers/UseMountFoodHandler.java | 10 +- .../handlers/UseOwlOfMinervaHandler.java | 14 +- .../channel/handlers/UseSolomonHandler.java | 9 +- .../channel/handlers/UseSummonBagHandler.java | 1 - .../channel/handlers/WeddingHandler.java | 16 +- .../channel/handlers/WeddingTalkHandler.java | 11 +- .../handlers/WeddingTalkMoreHandler.java | 7 +- .../coordinator/login/LoginStorage.java | 7 +- .../AbstractMatchCheckerListener.java | 1 - .../MatchCheckerListenerFactory.java | 17 +- .../MatchCheckerListenerRecipe.java | 1 - .../listener/MatchCheckerCPQChallenge.java | 33 +- .../listener/MatchCheckerGuildCreation.java | 53 +- .../partysearch/PartySearchCharacter.java | 25 +- .../partysearch/PartySearchEchelon.java | 19 +- .../partysearch/PartySearchStorage.java | 55 +- .../net/server/coordinator/session/Hwid.java | 2 +- .../session/SessionCoordinator.java | 57 +- src/main/java/net/server/guild/Guild.java | 6 +- .../server/handlers/CustomPacketHandler.java | 2 +- .../handlers/LoginRequiringNoOpHandler.java | 2 +- .../handlers/login/AcceptToSHandler.java | 1 - .../handlers/login/CharSelectedHandler.java | 24 +- .../login/CharSelectedWithPicHandler.java | 24 +- .../login/CharlistRequestHandler.java | 10 +- .../handlers/login/CreateCharHandler.java | 103 ++- .../handlers/login/DeleteCharHandler.java | 100 +-- .../handlers/login/RegisterPicHandler.java | 28 +- .../handlers/login/RegisterPinHandler.java | 2 +- .../login/ServerStatusRequestHandler.java | 2 +- .../login/ServerlistRequestHandler.java | 4 +- .../handlers/login/SetGenderHandler.java | 1 - .../handlers/login/ViewAllCharHandler.java | 16 +- .../login/ViewAllCharRegisterPicHandler.java | 26 +- .../login/ViewAllCharSelectedHandler.java | 28 +- .../ViewAllCharSelectedWithPicHandler.java | 26 +- .../net/server/services/BaseScheduler.java | 93 +- .../java/net/server/services/BaseService.java | 7 +- .../server/services/SchedulerListener.java | 1 - .../java/net/server/services/Service.java | 13 +- .../java/net/server/services/ServiceType.java | 3 +- .../net/server/services/ServicesManager.java | 13 +- .../services/task/channel/EventService.java | 25 +- .../task/channel/FaceExpressionService.java | 51 +- .../task/channel/MobAnimationService.java | 32 +- .../task/channel/MobClearSkillService.java | 27 +- .../services/task/channel/MobMistService.java | 25 +- .../task/channel/MobStatusService.java | 47 +- .../services/task/channel/OverallService.java | 29 +- .../task/world/CharacterSaveService.java | 17 +- .../server/services/type/ChannelServices.java | 27 +- .../server/services/type/WorldServices.java | 19 +- src/main/java/net/server/task/BaseTask.java | 4 +- .../java/net/server/task/BossLogTask.java | 2 +- .../server/task/CharacterAutosaverTask.java | 14 +- .../net/server/task/CharacterDiseaseTask.java | 4 +- src/main/java/net/server/task/CouponTask.java | 8 +- .../net/server/task/DueyFredrickTask.java | 2 +- .../task/EventRecallCoordinatorTask.java | 3 +- .../net/server/task/FamilyDailyResetTask.java | 14 +- .../java/net/server/task/FishingTask.java | 4 +- .../net/server/task/HiredMerchantTask.java | 4 +- .../java/net/server/task/InvitationTask.java | 2 +- .../net/server/task/LoginCoordinatorTask.java | 3 +- .../net/server/task/LoginStorageTask.java | 3 +- .../net/server/task/MapOwnershipTask.java | 6 +- .../net/server/task/MountTirednessTask.java | 4 +- .../java/net/server/task/PartySearchTask.java | 5 +- .../java/net/server/task/PetFullnessTask.java | 4 +- .../net/server/task/RankingCommandTask.java | 3 +- .../net/server/task/RankingLoginTask.java | 4 +- .../java/net/server/task/ReleaseLockTask.java | 2 +- .../java/net/server/task/RespawnTask.java | 2 +- .../net/server/task/ServerMessageTask.java | 6 +- .../net/server/task/TimedMapObjectTask.java | 4 +- .../java/net/server/task/TimeoutTask.java | 5 +- .../server/task/WeddingReservationTask.java | 19 +- .../net/server/world/MessengerCharacter.java | 4 +- .../java/net/server/world/PartyCharacter.java | 4 +- src/main/java/net/server/world/World.java | 846 +++++++++--------- 235 files changed, 3556 insertions(+), 3398 deletions(-) diff --git a/src/main/java/net/AbstractPacketHandler.java b/src/main/java/net/AbstractPacketHandler.java index a477c3aad0..a01ace7f55 100644 --- a/src/main/java/net/AbstractPacketHandler.java +++ b/src/main/java/net/AbstractPacketHandler.java @@ -29,7 +29,7 @@ public abstract class AbstractPacketHandler implements PacketHandler { public boolean validateState(Client c) { return c.isLoggedIn(); } - + protected static long currentServerTime() { return Server.getInstance().getCurrentTime(); } diff --git a/src/main/java/net/PacketProcessor.java b/src/main/java/net/PacketProcessor.java index ad08c6d83c..498332b0ab 100644 --- a/src/main/java/net/PacketProcessor.java +++ b/src/main/java/net/PacketProcessor.java @@ -60,10 +60,7 @@ public final class PacketProcessor { return null; } PacketHandler handler = handlers[packetId]; - if (handler != null) { - return handler; - } - return null; + return handler; } public void registerHandler(RecvOpcode code, PacketHandler handler) { diff --git a/src/main/java/net/encryption/MapleAESOFB.java b/src/main/java/net/encryption/MapleAESOFB.java index 96ab7d52bb..f55b2a277f 100644 --- a/src/main/java/net/encryption/MapleAESOFB.java +++ b/src/main/java/net/encryption/MapleAESOFB.java @@ -36,15 +36,15 @@ import java.security.NoSuchAlgorithmException; public class MapleAESOFB { private static final Logger log = LoggerFactory.getLogger(MapleAESOFB.class); private final static SecretKeySpec skey = new SecretKeySpec( - new byte[]{ - 0x13, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, - (byte) 0xB4, 0x00, 0x00, 0x00, - 0x1B, 0x00, 0x00, 0x00, - 0x0F, 0x00, 0x00, 0x00, - 0x33, 0x00, 0x00, 0x00, - 0x52, 0x00, 0x00, 0x00}, "AES"); + new byte[]{ + 0x13, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, + (byte) 0xB4, 0x00, 0x00, 0x00, + 0x1B, 0x00, 0x00, 0x00, + 0x0F, 0x00, 0x00, 0x00, + 0x33, 0x00, 0x00, 0x00, + 0x52, 0x00, 0x00, 0x00}, "AES"); private static final byte[] funnyBytes = new byte[]{ (byte) 0xEC, (byte) 0x3F, (byte) 0x77, (byte) 0xA4, (byte) 0x45, (byte) 0xD0, (byte) 0x71, (byte) 0xBF, diff --git a/src/main/java/net/opcodes/RecvOpcode.java b/src/main/java/net/opcodes/RecvOpcode.java index 9fc6ae8226..3c277ef61a 100644 --- a/src/main/java/net/opcodes/RecvOpcode.java +++ b/src/main/java/net/opcodes/RecvOpcode.java @@ -23,7 +23,7 @@ package net.opcodes; public enum RecvOpcode { CUSTOM_PACKET(0x3713),//13 37 lol - + LOGIN_PASSWORD(0x01), GUEST_LOGIN(0x02), SERVERLIST_REREQUEST(0x04), @@ -203,10 +203,10 @@ public enum RecvOpcode { MTS_OPERATION(0xFD), USE_MAPLELIFE(0x100), USE_HAMMER(0x104); - + private int code = -2; - private RecvOpcode(int code) { + RecvOpcode(int code) { this.code = code; } diff --git a/src/main/java/net/opcodes/SendOpcode.java b/src/main/java/net/opcodes/SendOpcode.java index efdc46da23..e9c0304719 100644 --- a/src/main/java/net/opcodes/SendOpcode.java +++ b/src/main/java/net/opcodes/SendOpcode.java @@ -31,10 +31,10 @@ public enum SendOpcode { CONFIRM_EULA_RESULT(0x05), CHECK_PINCODE(0x06), UPDATE_PINCODE(0x07), - + VIEW_ALL_CHAR(0x08), SELECT_CHARACTER_BY_VAC(0x09), - + SERVERLIST(0x0A), CHARLIST(0x0B), SERVER_IP(0x0C), @@ -51,7 +51,7 @@ public enum SendOpcode { LAST_CONNECTED_WORLD(0x1A), RECOMMENDED_WORLD_MESSAGE(0x1B), CHECK_SPW_RESULT(0x1C), - + /*CWvsContext::OnPacket*/ INVENTORY_OPERATION(0x1D), INVENTORY_GROW(0x1E), @@ -91,16 +91,16 @@ public enum SendOpcode { INCUBATOR_RESULT(0x45), SHOP_SCANNER_RESULT(0x46), SHOP_LINK_RESULT(0x47), - + MARRIAGE_REQUEST(0x48), MARRIAGE_RESULT(0x49), WEDDING_GIFT_RESULT(0x4A), NOTIFY_MARRIED_PARTNER_MAP_TRANSFER(0x4B), - + CASH_PET_FOOD_RESULT(0x4C), SET_WEEK_EVENT_MESSAGE(0x4D), SET_POTION_DISCOUNT_RATE(0x4E), - + BRIDLE_MOB_CATCH_FAIL(0x4F), IMITATED_NPC_RESULT(0x50), IMITATED_NPC_DATA(0x51), @@ -116,7 +116,7 @@ public enum SendOpcode { PARTY_VALUE(0x5B), FIELD_SET_VARIABLE(0x5C), BONUS_EXP_CHANGED(0x5D),//pendant of spirit etc (guess, not sure about the opcode in v83) - + FAMILY_CHART_RESULT(0x5E), FAMILY_INFO_RESULT(0x5F), FAMILY_RESULT(0x60), @@ -128,7 +128,7 @@ public enum SendOpcode { FAMILY_NOTIFY_LOGIN_OR_LOGOUT(0x66), //? is logged in. LOLWUT FAMILY_SET_PRIVILEGE(0x67), FAMILY_SUMMON_REQUEST(0x68), - + NOTIFY_LEVELUP(0x69), NOTIFY_MARRIAGE(0x6A), NOTIFY_JOB_CHANGE(0x6B), @@ -149,12 +149,12 @@ public enum SendOpcode { SCRIPT_PROGRESS_MESSAGE(0x7A), DATA_CRC_CHECK_FAILED(0x7B), MACRO_SYS_DATA_INIT(0x7C), - + /*CStage::OnPacket*/ SET_FIELD(0x7D), SET_ITC(0x7E), SET_CASH_SHOP(0x7F), - + /*CField::OnPacket*/ SET_BACK_EFFECT(0x80), SET_MAP_OBJECT_VISIBLE(0x81),//CMapLoadable::OnSetMapObjectVisible O_O @@ -166,7 +166,7 @@ public enum SendOpcode { WHISPER(0x87), SPOUSE_CHAT(0x88), SUMMON_ITEM_INAVAILABLE(0x89), //You can't use it in this map - + FIELD_EFFECT(0x8A), FIELD_OBSTACLE_ONOFF(0x8B), FIELD_OBSTACLE_ONOFF_LIST(0x8C), @@ -197,7 +197,7 @@ public enum SendOpcode { UPDATE_CHAR_BOX(0xA5), SHOW_CONSUME_EFFECT(0xA6), SHOW_SCROLL_EFFECT(0xA7), - + SPAWN_PET(0xA8), MOVE_PET(0xAA), PET_CHAT(0xAB), @@ -299,7 +299,7 @@ public enum SendOpcode { MONSTER_CARNIVAL_MESSAGE(0x125), MONSTER_CARNIVAL_DIED(0x126), MONSTER_CARNIVAL_LEAVE(0x127), - + ARIANT_ARENA_USER_SCORE(0x129), SHEEP_RANCH_INFO(0x12B), SHEEP_RANCH_CLOTHES(0x12C), @@ -317,18 +317,18 @@ public enum SendOpcode { RPS_GAME(0x138), MESSENGER(0x139), PLAYER_INTERACTION(0x13A), - + TOURNAMENT(0x13B), TOURNAMENT_MATCH_TABLE(0x13C), TOURNAMENT_SET_PRIZE(0x13D), TOURNAMENT_UEW(0x13E), TOURNAMENT_CHARACTERS(0x13F),//they never coded this :| - + WEDDING_PROGRESS(0x140),//byte step, int groomid, int brideid WEDDING_CEREMONY_END(0x141), - + PARCEL(0x142), - + CHARGE_PARAM_RESULT(0x143), QUERY_CASH_RESULT(0x144), CASHSHOP_OPERATION(0x145), @@ -341,7 +341,7 @@ public enum SendOpcode { CASHSHOP_GACHAPON_STAMP_RESULT(0x14C), CASHSHOP_CASH_ITEM_GACHAPON_RESULT(0x14D), CASHSHOP_CASH_GACHAPON_OPEN_RESULT(0x14E), - + KEYMAP(0x14F), AUTO_HP_POT(0x150), AUTO_MP_POT(0x151), @@ -356,7 +356,7 @@ public enum SendOpcode { VEGA_SCROLL(0x166); private int code = -2; - private SendOpcode(int code) { + SendOpcode(int code) { this.code = code; } diff --git a/src/main/java/net/server/PlayerBuffStorage.java b/src/main/java/net/server/PlayerBuffStorage.java index f04deff6e9..fb4a4b873e 100644 --- a/src/main/java/net/server/PlayerBuffStorage.java +++ b/src/main/java/net/server/PlayerBuffStorage.java @@ -33,15 +33,14 @@ import java.util.Map; import java.util.concurrent.locks.Lock; /** - * * @author Danny//changed to map :3 * @author Ronan//debuffs to storage as well */ public class PlayerBuffStorage { - private int id = (int) (Math.random() * 100); - private final Lock lock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.BUFF_STORAGE, true); - private Map> buffs = new HashMap<>(); - private Map>> diseases = new HashMap<>(); + private final int id = (int) (Math.random() * 100); + private final Lock lock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.BUFF_STORAGE, true); + private final Map> buffs = new HashMap<>(); + private final Map>> diseases = new HashMap<>(); public void addBuffsToStorage(int chrid, List toStore) { lock.lock(); @@ -60,7 +59,7 @@ public class PlayerBuffStorage { lock.unlock(); } } - + public void addDiseasesToStorage(int chrid, Map> toStore) { lock.lock(); try { @@ -99,9 +98,6 @@ public class PlayerBuffStorage { return false; } final PlayerBuffStorage other = (PlayerBuffStorage) obj; - if (id != other.id) { - return false; - } - return true; + return id == other.id; } } diff --git a/src/main/java/net/server/PlayerBuffValueHolder.java b/src/main/java/net/server/PlayerBuffValueHolder.java index 423ff79342..c5eee1efac 100644 --- a/src/main/java/net/server/PlayerBuffValueHolder.java +++ b/src/main/java/net/server/PlayerBuffValueHolder.java @@ -24,7 +24,6 @@ package net.server; import server.StatEffect; /** - * * @author Danny */ public class PlayerBuffValueHolder { diff --git a/src/main/java/net/server/PlayerCoolDownValueHolder.java b/src/main/java/net/server/PlayerCoolDownValueHolder.java index d68bd2e694..e005d39e38 100644 --- a/src/main/java/net/server/PlayerCoolDownValueHolder.java +++ b/src/main/java/net/server/PlayerCoolDownValueHolder.java @@ -22,7 +22,6 @@ package net.server; /** - * * @author Danny */ public class PlayerCoolDownValueHolder { diff --git a/src/main/java/net/server/PlayerDiseaseValueHolder.java b/src/main/java/net/server/PlayerDiseaseValueHolder.java index d30a9b627f..59898f8965 100644 --- a/src/main/java/net/server/PlayerDiseaseValueHolder.java +++ b/src/main/java/net/server/PlayerDiseaseValueHolder.java @@ -29,8 +29,8 @@ public class PlayerDiseaseValueHolder {//Thanks Celino public Disease disease; public PlayerDiseaseValueHolder(final Disease disease, final long startTime, final long length) { - this.disease = disease; - this.startTime = startTime; - this.length = length; + this.disease = disease; + this.startTime = startTime; + this.length = length; } } \ No newline at end of file diff --git a/src/main/java/net/server/PlayerStorage.java b/src/main/java/net/server/PlayerStorage.java index 49e8df5968..8fa6b4e472 100644 --- a/src/main/java/net/server/PlayerStorage.java +++ b/src/main/java/net/server/PlayerStorage.java @@ -36,8 +36,8 @@ public class PlayerStorage { private final MonitoredReentrantReadWriteLock locks = new MonitoredReentrantReadWriteLock(MonitoredLockType.PLAYER_STORAGE, true); private final Map storage = new LinkedHashMap<>(); private final Map nameStorage = new LinkedHashMap<>(); - private MonitoredReadLock rlock = MonitoredReadLockFactory.createLock(locks); - private MonitoredWriteLock wlock = MonitoredWriteLockFactory.createLock(locks); + private final MonitoredReadLock rlock = MonitoredReadLockFactory.createLock(locks); + private final MonitoredWriteLock wlock = MonitoredWriteLockFactory.createLock(locks); public void addPlayer(Character chr) { wlock.lock(); @@ -45,16 +45,18 @@ public class PlayerStorage { storage.put(chr.getId(), chr); nameStorage.put(chr.getName().toLowerCase(), chr); } finally { - wlock.unlock(); - } + wlock.unlock(); + } } public Character removePlayer(int chr) { wlock.lock(); try { Character mc = storage.remove(chr); - if(mc != null) nameStorage.remove(mc.getName().toLowerCase()); - + if (mc != null) { + nameStorage.remove(mc.getName().toLowerCase()); + } + return mc; } finally { wlock.unlock(); @@ -62,7 +64,7 @@ public class PlayerStorage { } public Character getCharacterByName(String name) { - rlock.lock(); + rlock.lock(); try { return nameStorage.get(name.toLowerCase()); } finally { @@ -71,7 +73,7 @@ public class PlayerStorage { } public Character getCharacterById(int id) { - rlock.lock(); + rlock.lock(); try { return storage.get(id); } finally { @@ -90,28 +92,28 @@ public class PlayerStorage { public final void disconnectAll() { List chrList; - rlock.lock(); - try { + rlock.lock(); + try { chrList = new ArrayList<>(storage.values()); - } finally { - rlock.unlock(); - } - - for(Character mc : chrList) { + } finally { + rlock.unlock(); + } + + for (Character mc : chrList) { Client client = mc.getClient(); - if(client != null) { + if (client != null) { client.forceDisconnect(); } } - + wlock.lock(); - try { + try { storage.clear(); - } finally { - wlock.unlock(); - } + } finally { + wlock.unlock(); + } } - + public int getSize() { rlock.lock(); try { diff --git a/src/main/java/net/server/Server.java b/src/main/java/net/server/Server.java index 6e6d13ce19..774a0639c5 100644 --- a/src/main/java/net/server/Server.java +++ b/src/main/java/net/server/Server.java @@ -96,14 +96,14 @@ public class Server { private static final List activeCoupons = new LinkedList<>(); private LoginServer loginServer; - private List> channels = new LinkedList<>(); - private List worlds = new ArrayList<>(); + private final List> channels = new LinkedList<>(); + private final List worlds = new ArrayList<>(); private final Properties subnetInfo = new Properties(); private final Map> accountChars = new HashMap<>(); private final Map accountCharacterCount = new HashMap<>(); private final Map worldChars = new HashMap<>(); private final Map transitioningChars = new HashMap<>(); - private List> worldRecommendedList = new LinkedList<>(); + private final List> worldRecommendedList = new LinkedList<>(); private final Map guilds = new HashMap<>(100); private final Map inLoginState = new HashMap<>(100); @@ -1613,7 +1613,7 @@ public class Server { String reason = Character.checkWorldTransferEligibility(con, characterId, oldWorld, newWorld); //check if character is still eligible if (reason != null) { removedTransfers.add(nameChangeId); - FilePrinter.print(FilePrinter.WORLD_TRANSFER, "World transfer cancelled : Character ID " + characterId + " at " + Calendar.getInstance().getTime().toString() + ", Reason : " + reason); + FilePrinter.print(FilePrinter.WORLD_TRANSFER, "World transfer cancelled : Character ID " + characterId + " at " + Calendar.getInstance().getTime() + ", Reason : " + reason); try (PreparedStatement delPs = con.prepareStatement("DELETE FROM worldtransfers WHERE id = ?")) { delPs.setInt(1, nameChangeId); delPs.executeUpdate(); diff --git a/src/main/java/net/server/audit/LockCollector.java b/src/main/java/net/server/audit/LockCollector.java index 79cc29be16..ba276286f5 100644 --- a/src/main/java/net/server/audit/LockCollector.java +++ b/src/main/java/net/server/audit/LockCollector.java @@ -20,28 +20,27 @@ package net.server.audit; import java.util.ArrayList; -import java.util.List; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** - * * @author Ronan */ public class LockCollector { - + private static final LockCollector instance = new LockCollector(); - + public static LockCollector getInstance() { return instance; } - - private Map disposableLocks = new HashMap<>(200); + + private final Map disposableLocks = new HashMap<>(200); private final Lock lock = new ReentrantLock(true); - + public void registerDisposeAction(Runnable r) { lock.lock(); try { @@ -50,15 +49,15 @@ public class LockCollector { lock.unlock(); } } - + public void runLockCollector() { List toDispose = new ArrayList<>(); - + lock.lock(); try { - for(Entry e : disposableLocks.entrySet()) { + for (Entry e : disposableLocks.entrySet()) { Integer eVal = e.getValue(); - if(eVal > 5) { // updates each 2min + if (eVal > 5) { // updates each 2min toDispose.add(e.getKey()); } else { disposableLocks.put(e.getKey(), ++eVal); @@ -67,8 +66,8 @@ public class LockCollector { } finally { lock.unlock(); } - - for(Runnable r : toDispose) { + + for (Runnable r : toDispose) { r.run(); } } diff --git a/src/main/java/net/server/audit/ThreadTracker.java b/src/main/java/net/server/audit/ThreadTracker.java index cd03a30981..f36b82f9d9 100644 --- a/src/main/java/net/server/audit/ThreadTracker.java +++ b/src/main/java/net/server/audit/ThreadTracker.java @@ -33,121 +33,120 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** - * * @author RonanLana - * + *

* This tool has the main purpose of auditing deadlocks throughout the server and must be used only for debugging. The flag is USE_THREAD_TRACKER. */ public class ThreadTracker { private static ThreadTracker instance = null; - + public static ThreadTracker getInstance() { if (instance == null) { instance = new ThreadTracker(); } return instance; } - + private final Lock ttLock = new ReentrantLock(true); - + private final Map> threadTracker = new HashMap<>(); private final Map threadUpdate = new HashMap<>(); private final Map threads = new HashMap<>(); - + private final Map lockCount = new HashMap<>(); private final Map lockIds = new HashMap<>(); private final Map lockThreads = new HashMap<>(); private final Map lockUpdate = new HashMap<>(); - + private final Map> locks = new HashMap<>(); ScheduledFuture threadTrackerSchedule; - + private String printThreadTrackerState(String dateFormat) { - + Map> lockValues = new HashMap<>(); Set executingThreads = new HashSet<>(); - - for(Map.Entry lc : lockCount.entrySet()) { - if(lc.getValue().get() != 0) { + + for (Map.Entry lc : lockCount.entrySet()) { + if (lc.getValue().get() != 0) { executingThreads.add(lockThreads.get(lc.getKey())); - + MonitoredLockType lockId = lockIds.get(lc.getKey()); List list = lockValues.get(lockId); - - if(list == null) { + + if (list == null) { list = new ArrayList<>(); lockValues.put(lockId, list); } - + list.add(lc.getValue().get()); } } - - + + String s = "----------------------------\r\n" + dateFormat + "\r\n "; s += "Lock-thread usage count:"; - for(Map.Entry> lock : lockValues.entrySet()) { + for (Map.Entry> lock : lockValues.entrySet()) { s += ("\r\n " + lock.getKey().name() + ": "); - - for(Integer i : lock.getValue()) { + + for (Integer i : lock.getValue()) { s += (i + " "); } } s += "\r\n\r\nThread opened lock path:"; - - for(Long tid : executingThreads) { + + for (Long tid : executingThreads) { s += "\r\n"; - for(MonitoredLockType lockid : threadTracker.get(tid)) { + for (MonitoredLockType lockid : threadTracker.get(tid)) { s += (lockid.name() + " "); } s += "|"; } - + s += "\r\n\r\n"; - + return s; } - + private static String printThreadLog(List stillLockedPath, String dateFormat) { String s = "----------------------------\r\n" + dateFormat + "\r\n "; - for(MonitoredLockType lock : stillLockedPath) { + for (MonitoredLockType lock : stillLockedPath) { s += (lock.name() + " "); } s += "\r\n\r\n"; - + return s; } - + private static String printThreadStack(StackTraceElement[] list, String dateFormat) { String s = "----------------------------\r\n" + dateFormat + "\r\n"; for (StackTraceElement stackTraceElement : list) { s += (" " + stackTraceElement.toString() + "\r\n"); } - + return s; } - + public void accessThreadTracker(boolean update, boolean lock, MonitoredLockType lockId, long lockOid) { ttLock.lock(); try { - if(update) { - if(!lock) { // update tracker + if (update) { + if (!lock) { // update tracker List toRemove = new ArrayList<>(); - for(Long l : threadUpdate.keySet()) { + for (Long l : threadUpdate.keySet()) { int next = threadUpdate.get(l) + 1; - if(next == 4) { + if (next == 4) { List tt = threadTracker.get(l); - if(tt.isEmpty()) { + if (tt.isEmpty()) { toRemove.add(l); } else { StackTraceElement[] ste = threads.get(l).getStackTrace(); - if(ste.length > 0) { + if (ste.length > 0) { DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getDefault()); String df = dateFormat.format(new Date()); - + FilePrinter.print(FilePrinter.DEADLOCK_LOCKS, printThreadLog(tt, df)); FilePrinter.print(FilePrinter.DEADLOCK_STACK, printThreadStack(ste, df)); } @@ -157,29 +156,29 @@ public class ThreadTracker { threadUpdate.put(l, next); } - for(Long l : toRemove) { + for (Long l : toRemove) { threadTracker.remove(l); threadUpdate.remove(l); threads.remove(l); - for(Map threadLock : locks.values()) { + for (Map threadLock : locks.values()) { threadLock.remove(l); } } toRemove.clear(); - for(Entry it : lockUpdate.entrySet()) { + for (Entry it : lockUpdate.entrySet()) { int val = it.getValue() + 1; - if(val < 60) { + if (val < 60) { lockUpdate.put(it.getKey(), val); } else { toRemove.add(it.getKey()); // free the structure after 60 silent updates } } - for(Long l : toRemove) { + for (Long l : toRemove) { lockCount.remove(l); lockIds.remove(l); lockThreads.remove(l); @@ -195,9 +194,9 @@ public class ThreadTracker { } else { long tid = Thread.currentThread().getId(); - if(lock) { + if (lock) { AtomicInteger c = lockCount.get(lockOid); - if(c == null) { + if (c == null) { c = new AtomicInteger(0); lockCount.put(lockOid, c); lockIds.put(lockOid, lockId); @@ -207,40 +206,39 @@ public class ThreadTracker { c.incrementAndGet(); List list = threadTracker.get(tid); - if(list == null) { + if (list == null) { list = new ArrayList<>(5); threadTracker.put(tid, list); threadUpdate.put(tid, 0); threads.put(tid, Thread.currentThread()); - } else if(list.isEmpty()) { + } else if (list.isEmpty()) { threadUpdate.put(tid, 0); } list.add(lockId); Map threadLock = locks.get(lockId); - if(threadLock == null) { + if (threadLock == null) { threadLock = new HashMap<>(5); locks.put(lockId, threadLock); } Integer lc = threadLock.get(tid); - if(lc != null) { + if (lc != null) { threadLock.put(tid, lc + 1); } else { threadLock.put(tid, 1); } - } - else { + } else { AtomicInteger c = lockCount.get(lockOid); if (c != null) { // thanks BHB for detecting an NPE here c.decrementAndGet(); } - + lockUpdate.put(lockOid, 0); List list = threadTracker.get(tid); - for(int i = list.size() - 1; i >= 0; i--) { - if(lockId.equals(list.get(i))) { + for (int i = list.size() - 1; i >= 0; i--) { + if (lockId.equals(list.get(i))) { list.remove(i); break; } @@ -254,25 +252,25 @@ public class ThreadTracker { ttLock.unlock(); } } - + private String printLockStatus(MonitoredLockType lockId) { String s = ""; - - for(Long threadid : locks.get(lockId).keySet()) { - for(MonitoredLockType lockid : threadTracker.get(threadid)) { + + for (Long threadid : locks.get(lockId).keySet()) { + for (MonitoredLockType lockid : threadTracker.get(threadid)) { s += (" " + lockid.name()); } - + s += " |\r\n"; } - + return s; } - + public void registerThreadTrackerTask() { threadTrackerSchedule = TimerManager.getInstance().register(() -> accessThreadTracker(true, false, MonitoredLockType.UNDEFINED, -1), 10000, 10000); } - + public void cancelThreadTrackerTask() { threadTrackerSchedule.cancel(false); } diff --git a/src/main/java/net/server/audit/locks/MonitoredLockType.java b/src/main/java/net/server/audit/locks/MonitoredLockType.java index 520db9a291..05002d7eb9 100644 --- a/src/main/java/net/server/audit/locks/MonitoredLockType.java +++ b/src/main/java/net/server/audit/locks/MonitoredLockType.java @@ -20,7 +20,6 @@ package net.server.audit.locks; /** - * * @author RonanLana */ diff --git a/src/main/java/net/server/audit/locks/MonitoredReadLock.java b/src/main/java/net/server/audit/locks/MonitoredReadLock.java index 3cd5799ab6..2e36cecfd0 100644 --- a/src/main/java/net/server/audit/locks/MonitoredReadLock.java +++ b/src/main/java/net/server/audit/locks/MonitoredReadLock.java @@ -20,17 +20,16 @@ package net.server.audit.locks; /** - * * @author RonanLana */ public interface MonitoredReadLock { - + void lock(); - + void unlock(); - + boolean tryLock(); - + MonitoredReadLock dispose(); - + } diff --git a/src/main/java/net/server/audit/locks/MonitoredReentrantLock.java b/src/main/java/net/server/audit/locks/MonitoredReentrantLock.java index 9bd2323c62..006e3cf06f 100644 --- a/src/main/java/net/server/audit/locks/MonitoredReentrantLock.java +++ b/src/main/java/net/server/audit/locks/MonitoredReentrantLock.java @@ -20,17 +20,16 @@ package net.server.audit.locks; /** - * * @author RonanLana */ public interface MonitoredReentrantLock { - + void lock(); - + void unlock(); - + boolean tryLock(); - + MonitoredReentrantLock dispose(); - + } diff --git a/src/main/java/net/server/audit/locks/MonitoredReentrantReadWriteLock.java b/src/main/java/net/server/audit/locks/MonitoredReentrantReadWriteLock.java index c3257734f2..aa1f7bbcee 100644 --- a/src/main/java/net/server/audit/locks/MonitoredReentrantReadWriteLock.java +++ b/src/main/java/net/server/audit/locks/MonitoredReentrantReadWriteLock.java @@ -22,27 +22,26 @@ package net.server.audit.locks; import java.util.concurrent.locks.ReentrantReadWriteLock; /** - * * @author RonanLana */ public class MonitoredReentrantReadWriteLock extends ReentrantReadWriteLock { public final MonitoredLockType id; - + public MonitoredReentrantReadWriteLock(MonitoredLockType id) { super(); this.id = id; } - + public MonitoredReentrantReadWriteLock(MonitoredLockType id, boolean fair) { super(fair); this.id = id; } - + @Override public ReadLock readLock() { return super.readLock(); } - + @Override public WriteLock writeLock() { return super.writeLock(); diff --git a/src/main/java/net/server/audit/locks/MonitoredWriteLock.java b/src/main/java/net/server/audit/locks/MonitoredWriteLock.java index 0c2bb39484..c4a3326157 100644 --- a/src/main/java/net/server/audit/locks/MonitoredWriteLock.java +++ b/src/main/java/net/server/audit/locks/MonitoredWriteLock.java @@ -20,17 +20,16 @@ package net.server.audit.locks; /** - * * @author RonanLana */ public interface MonitoredWriteLock { - + void lock(); - + void unlock(); - + boolean tryLock(); - + MonitoredWriteLock dispose(); - + } diff --git a/src/main/java/net/server/audit/locks/active/TrackerReadLock.java b/src/main/java/net/server/audit/locks/active/TrackerReadLock.java index 2c854f5c9c..8e50de8a55 100644 --- a/src/main/java/net/server/audit/locks/active/TrackerReadLock.java +++ b/src/main/java/net/server/audit/locks/active/TrackerReadLock.java @@ -37,7 +37,6 @@ import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** - * * @author RonanLana */ public class TrackerReadLock extends ReentrantReadWriteLock.ReadLock implements MonitoredReadLock { @@ -47,17 +46,17 @@ public class TrackerReadLock extends ReentrantReadWriteLock.ReadLock implements private final int hashcode; private final Lock state = new ReentrantLock(true); private final AtomicInteger reentrantCount = new AtomicInteger(0); - + public TrackerReadLock(MonitoredReentrantReadWriteLock lock) { super(lock); this.id = lock.id; hashcode = this.hashCode(); } - + @Override public void lock() { - if(YamlConfig.config.server.USE_THREAD_TRACKER) { - if(deadlockedState != null) { + if (YamlConfig.config.server.USE_THREAD_TRACKER) { + if (deadlockedState != null) { DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getDefault()); @@ -68,24 +67,24 @@ public class TrackerReadLock extends ReentrantReadWriteLock.ReadLock implements registerLocking(); } - + super.lock(); } - + @Override public void unlock() { - if(YamlConfig.config.server.USE_THREAD_TRACKER) { + if (YamlConfig.config.server.USE_THREAD_TRACKER) { unregisterLocking(); } - + super.unlock(); } - + @Override public boolean tryLock() { - if(super.tryLock()) { - if(YamlConfig.config.server.USE_THREAD_TRACKER) { - if(deadlockedState != null) { + if (super.tryLock()) { + if (YamlConfig.config.server.USE_THREAD_TRACKER) { + if (deadlockedState != null) { //FilePrinter.printError(FilePrinter.DEADLOCK_ERROR, "Deadlock occurred when trying to use the '" + id.name() + "' lock resources:\r\n" + printStackTrace(deadlockedState)); ThreadTracker.getInstance().accessThreadTracker(true, true, id, hashcode); deadlockedState = null; @@ -98,13 +97,13 @@ public class TrackerReadLock extends ReentrantReadWriteLock.ReadLock implements return false; } } - + private void registerLocking() { state.lock(); try { ThreadTracker.getInstance().accessThreadTracker(false, true, id, hashcode); - - if(reentrantCount.incrementAndGet() == 1) { + + if (reentrantCount.incrementAndGet() == 1) { final Thread t = Thread.currentThread(); timeoutSchedule = TimerManager.getInstance().schedule(() -> issueDeadlock(t), YamlConfig.config.server.LOCK_MONITOR_TIME); } @@ -112,51 +111,51 @@ public class TrackerReadLock extends ReentrantReadWriteLock.ReadLock implements state.unlock(); } } - + private void unregisterLocking() { state.lock(); try { - if(reentrantCount.decrementAndGet() == 0) { - if(timeoutSchedule != null) { + if (reentrantCount.decrementAndGet() == 0) { + if (timeoutSchedule != null) { timeoutSchedule.cancel(false); timeoutSchedule = null; } } - + ThreadTracker.getInstance().accessThreadTracker(false, false, id, hashcode); } finally { state.unlock(); } } - + private void issueDeadlock(Thread t) { deadlockedState = t.getStackTrace(); //super.unlock(); } - + private static String printStackTrace(StackTraceElement[] list) { String s = ""; for (StackTraceElement stackTraceElement : list) { s += (" " + stackTraceElement.toString() + "\r\n"); } - + return s; } - + @Override public MonitoredReadLock dispose() { state.lock(); try { - if(timeoutSchedule != null) { + if (timeoutSchedule != null) { timeoutSchedule.cancel(false); timeoutSchedule = null; } - + reentrantCount.set(Integer.MAX_VALUE); } finally { state.unlock(); } - + //unlock(); return new EmptyReadLock(id); } diff --git a/src/main/java/net/server/audit/locks/active/TrackerReentrantLock.java b/src/main/java/net/server/audit/locks/active/TrackerReentrantLock.java index 41028828ab..b36a00835b 100644 --- a/src/main/java/net/server/audit/locks/active/TrackerReentrantLock.java +++ b/src/main/java/net/server/audit/locks/active/TrackerReentrantLock.java @@ -35,7 +35,6 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** - * * @author RonanLana */ public class TrackerReentrantLock extends ReentrantLock implements MonitoredReentrantLock { @@ -45,23 +44,23 @@ public class TrackerReentrantLock extends ReentrantLock implements MonitoredReen private final int hashcode; private final Lock state = new ReentrantLock(true); private final AtomicInteger reentrantCount = new AtomicInteger(0); - + public TrackerReentrantLock(MonitoredLockType id) { super(); this.id = id; hashcode = this.hashCode(); } - + public TrackerReentrantLock(MonitoredLockType id, boolean fair) { super(fair); this.id = id; hashcode = this.hashCode(); } - + @Override public void lock() { - if(YamlConfig.config.server.USE_THREAD_TRACKER) { - if(deadlockedState != null) { + if (YamlConfig.config.server.USE_THREAD_TRACKER) { + if (deadlockedState != null) { DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getDefault()); @@ -72,24 +71,24 @@ public class TrackerReentrantLock extends ReentrantLock implements MonitoredReen registerLocking(); } - + super.lock(); } - + @Override public void unlock() { - if(YamlConfig.config.server.USE_THREAD_TRACKER) { + if (YamlConfig.config.server.USE_THREAD_TRACKER) { unregisterLocking(); } - + super.unlock(); } - + @Override public boolean tryLock() { - if(super.tryLock()) { - if(YamlConfig.config.server.USE_THREAD_TRACKER) { - if(deadlockedState != null) { + if (super.tryLock()) { + if (YamlConfig.config.server.USE_THREAD_TRACKER) { + if (deadlockedState != null) { //FilePrinter.printError(FilePrinter.DEADLOCK_ERROR, "Deadlock occurred when trying to use the '" + id.name() + "' lock resources:\r\n" + printStackTrace(deadlockedState)); ThreadTracker.getInstance().accessThreadTracker(true, true, id, hashcode); deadlockedState = null; @@ -102,13 +101,13 @@ public class TrackerReentrantLock extends ReentrantLock implements MonitoredReen return false; } } - + private void registerLocking() { state.lock(); try { ThreadTracker.getInstance().accessThreadTracker(false, true, id, hashcode); - - if(reentrantCount.incrementAndGet() == 1) { + + if (reentrantCount.incrementAndGet() == 1) { final Thread t = Thread.currentThread(); timeoutSchedule = TimerManager.getInstance().schedule(() -> issueDeadlock(t), YamlConfig.config.server.LOCK_MONITOR_TIME); } @@ -116,51 +115,51 @@ public class TrackerReentrantLock extends ReentrantLock implements MonitoredReen state.unlock(); } } - + private void unregisterLocking() { state.lock(); try { - if(reentrantCount.decrementAndGet() == 0) { - if(timeoutSchedule != null) { + if (reentrantCount.decrementAndGet() == 0) { + if (timeoutSchedule != null) { timeoutSchedule.cancel(false); timeoutSchedule = null; } } - + ThreadTracker.getInstance().accessThreadTracker(false, false, id, hashcode); } finally { state.unlock(); } } - + private void issueDeadlock(Thread t) { deadlockedState = t.getStackTrace(); //super.unlock(); } - + private static String printStackTrace(StackTraceElement[] list) { String s = ""; for (StackTraceElement stackTraceElement : list) { s += (" " + stackTraceElement.toString() + "\r\n"); } - + return s; } - + @Override public MonitoredReentrantLock dispose() { state.lock(); try { - if(timeoutSchedule != null) { + if (timeoutSchedule != null) { timeoutSchedule.cancel(false); timeoutSchedule = null; } - + reentrantCount.set(Integer.MAX_VALUE); } finally { state.unlock(); } - + //unlock(); return new EmptyReentrantLock(id); } diff --git a/src/main/java/net/server/audit/locks/active/TrackerWriteLock.java b/src/main/java/net/server/audit/locks/active/TrackerWriteLock.java index b0981895ae..9bbe526b43 100644 --- a/src/main/java/net/server/audit/locks/active/TrackerWriteLock.java +++ b/src/main/java/net/server/audit/locks/active/TrackerWriteLock.java @@ -37,7 +37,6 @@ import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** - * * @author RonanLana */ public class TrackerWriteLock extends ReentrantReadWriteLock.WriteLock implements MonitoredWriteLock { @@ -53,11 +52,11 @@ public class TrackerWriteLock extends ReentrantReadWriteLock.WriteLock implement this.id = lock.id; hashcode = this.hashCode(); } - + @Override public void lock() { - if(YamlConfig.config.server.USE_THREAD_TRACKER) { - if(deadlockedState != null) { + if (YamlConfig.config.server.USE_THREAD_TRACKER) { + if (deadlockedState != null) { DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getDefault()); @@ -68,24 +67,24 @@ public class TrackerWriteLock extends ReentrantReadWriteLock.WriteLock implement registerLocking(); } - + super.lock(); } - + @Override public void unlock() { - if(YamlConfig.config.server.USE_THREAD_TRACKER) { + if (YamlConfig.config.server.USE_THREAD_TRACKER) { unregisterLocking(); } - + super.unlock(); } - + @Override public boolean tryLock() { - if(super.tryLock()) { - if(YamlConfig.config.server.USE_THREAD_TRACKER) { - if(deadlockedState != null) { + if (super.tryLock()) { + if (YamlConfig.config.server.USE_THREAD_TRACKER) { + if (deadlockedState != null) { //FilePrinter.printError(FilePrinter.DEADLOCK_ERROR, "Deadlock occurred when trying to use the '" + id.name() + "' lock resources:\r\n" + printStackTrace(deadlockedState)); ThreadTracker.getInstance().accessThreadTracker(true, true, id, hashcode); deadlockedState = null; @@ -98,13 +97,13 @@ public class TrackerWriteLock extends ReentrantReadWriteLock.WriteLock implement return false; } } - + private void registerLocking() { state.lock(); try { ThreadTracker.getInstance().accessThreadTracker(false, true, id, hashcode); - - if(reentrantCount.incrementAndGet() == 1) { + + if (reentrantCount.incrementAndGet() == 1) { final Thread t = Thread.currentThread(); timeoutSchedule = TimerManager.getInstance().schedule(() -> issueDeadlock(t), YamlConfig.config.server.LOCK_MONITOR_TIME); } @@ -112,51 +111,51 @@ public class TrackerWriteLock extends ReentrantReadWriteLock.WriteLock implement state.unlock(); } } - + private void unregisterLocking() { state.lock(); try { - if(reentrantCount.decrementAndGet() == 0) { - if(timeoutSchedule != null) { + if (reentrantCount.decrementAndGet() == 0) { + if (timeoutSchedule != null) { timeoutSchedule.cancel(false); timeoutSchedule = null; } } - + ThreadTracker.getInstance().accessThreadTracker(false, false, id, hashcode); } finally { state.unlock(); } } - + private void issueDeadlock(Thread t) { deadlockedState = t.getStackTrace(); //super.unlock(); } - + private static String printStackTrace(StackTraceElement[] list) { String s = ""; for (StackTraceElement stackTraceElement : list) { s += (" " + stackTraceElement.toString() + "\r\n"); } - + return s; } - + @Override public MonitoredWriteLock dispose() { state.lock(); try { - if(timeoutSchedule != null) { + if (timeoutSchedule != null) { timeoutSchedule.cancel(false); timeoutSchedule = null; } - + reentrantCount.set(Integer.MAX_VALUE); } finally { state.unlock(); } - + //unlock(); return new EmptyWriteLock(id); } diff --git a/src/main/java/net/server/audit/locks/empty/AbstractEmptyLock.java b/src/main/java/net/server/audit/locks/empty/AbstractEmptyLock.java index 6796301423..f89e8e01f6 100644 --- a/src/main/java/net/server/audit/locks/empty/AbstractEmptyLock.java +++ b/src/main/java/net/server/audit/locks/empty/AbstractEmptyLock.java @@ -6,19 +6,19 @@ import java.util.Date; import java.util.TimeZone; public abstract class AbstractEmptyLock { - + protected static String printThreadStack(StackTraceElement[] list) { DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); // DRY-code opportunity performed by jtumidanski dateFormat.setTimeZone(TimeZone.getDefault()); String df = dateFormat.format(new Date()); - + String s = "\r\n" + df + "\r\n"; for (StackTraceElement stackTraceElement : list) { s += (" " + stackTraceElement.toString() + "\r\n"); } s += "----------------------------\r\n\r\n"; - + return s; } - + } diff --git a/src/main/java/net/server/audit/locks/empty/EmptyReadLock.java b/src/main/java/net/server/audit/locks/empty/EmptyReadLock.java index 3c453e3e54..1e6c5eb1f1 100644 --- a/src/main/java/net/server/audit/locks/empty/EmptyReadLock.java +++ b/src/main/java/net/server/audit/locks/empty/EmptyReadLock.java @@ -24,30 +24,29 @@ import net.server.audit.locks.MonitoredReadLock; import tools.FilePrinter; /** - * * @author RonanLana */ public class EmptyReadLock extends AbstractEmptyLock implements MonitoredReadLock { private final MonitoredLockType id; - + public EmptyReadLock(MonitoredLockType type) { this.id = type; } - + @Override public void lock() { FilePrinter.printError(FilePrinter.DISPOSED_LOCKS, "Captured locking tentative on disposed lock " + id + ":" + printThreadStack(Thread.currentThread().getStackTrace())); } - + @Override public void unlock() {} - + @Override public boolean tryLock() { FilePrinter.printError(FilePrinter.DISPOSED_LOCKS, "Captured try-locking tentative on disposed lock " + id + ":" + printThreadStack(Thread.currentThread().getStackTrace())); return false; } - + @Override public MonitoredReadLock dispose() { return this; diff --git a/src/main/java/net/server/audit/locks/empty/EmptyReentrantLock.java b/src/main/java/net/server/audit/locks/empty/EmptyReentrantLock.java index 31446ce2b3..ebd3578a1f 100644 --- a/src/main/java/net/server/audit/locks/empty/EmptyReentrantLock.java +++ b/src/main/java/net/server/audit/locks/empty/EmptyReentrantLock.java @@ -24,30 +24,29 @@ import net.server.audit.locks.MonitoredReentrantLock; import tools.FilePrinter; /** - * * @author RonanLana */ public class EmptyReentrantLock extends AbstractEmptyLock implements MonitoredReentrantLock { private final MonitoredLockType id; - + public EmptyReentrantLock(MonitoredLockType type) { this.id = type; } - + @Override public void lock() { FilePrinter.printError(FilePrinter.DISPOSED_LOCKS, "Captured locking tentative on disposed lock " + id + ":" + printThreadStack(Thread.currentThread().getStackTrace())); } - + @Override public void unlock() {} - + @Override public boolean tryLock() { FilePrinter.printError(FilePrinter.DISPOSED_LOCKS, "Captured try-locking tentative on disposed lock " + id + ":" + printThreadStack(Thread.currentThread().getStackTrace())); return false; } - + @Override public MonitoredReentrantLock dispose() { return this; diff --git a/src/main/java/net/server/audit/locks/empty/EmptyWriteLock.java b/src/main/java/net/server/audit/locks/empty/EmptyWriteLock.java index 5bd1f78d95..d4ab75c529 100644 --- a/src/main/java/net/server/audit/locks/empty/EmptyWriteLock.java +++ b/src/main/java/net/server/audit/locks/empty/EmptyWriteLock.java @@ -24,30 +24,29 @@ import net.server.audit.locks.MonitoredWriteLock; import tools.FilePrinter; /** - * * @author RonanLana */ public class EmptyWriteLock extends AbstractEmptyLock implements MonitoredWriteLock { private final MonitoredLockType id; - + public EmptyWriteLock(MonitoredLockType type) { this.id = type; } - + @Override public void lock() { FilePrinter.printError(FilePrinter.DISPOSED_LOCKS, "Captured locking tentative on disposed lock " + id + ":" + printThreadStack(Thread.currentThread().getStackTrace())); } - + @Override public void unlock() {} - + @Override public boolean tryLock() { FilePrinter.printError(FilePrinter.DISPOSED_LOCKS, "Captured try-locking tentative on disposed lock " + id + ":" + printThreadStack(Thread.currentThread().getStackTrace())); return false; } - + @Override public MonitoredWriteLock dispose() { return this; diff --git a/src/main/java/net/server/audit/locks/factory/MonitoredReadLockFactory.java b/src/main/java/net/server/audit/locks/factory/MonitoredReadLockFactory.java index c618ee8347..ae50172c62 100644 --- a/src/main/java/net/server/audit/locks/factory/MonitoredReadLockFactory.java +++ b/src/main/java/net/server/audit/locks/factory/MonitoredReadLockFactory.java @@ -23,7 +23,6 @@ import net.server.audit.locks.MonitoredReentrantReadWriteLock; import net.server.audit.locks.active.TrackerReadLock; /** - * * @author RonanLana */ public class MonitoredReadLockFactory { diff --git a/src/main/java/net/server/audit/locks/factory/MonitoredReentrantLockFactory.java b/src/main/java/net/server/audit/locks/factory/MonitoredReentrantLockFactory.java index 39bb54281e..b127c0d5c8 100644 --- a/src/main/java/net/server/audit/locks/factory/MonitoredReentrantLockFactory.java +++ b/src/main/java/net/server/audit/locks/factory/MonitoredReentrantLockFactory.java @@ -23,14 +23,13 @@ import net.server.audit.locks.MonitoredLockType; import net.server.audit.locks.active.TrackerReentrantLock; /** - * * @author RonanLana */ public class MonitoredReentrantLockFactory { public static TrackerReentrantLock createLock(MonitoredLockType id) { return new TrackerReentrantLock(id); } - + public static TrackerReentrantLock createLock(MonitoredLockType id, boolean fair) { return new TrackerReentrantLock(id, fair); } diff --git a/src/main/java/net/server/audit/locks/factory/MonitoredWriteLockFactory.java b/src/main/java/net/server/audit/locks/factory/MonitoredWriteLockFactory.java index e8cdec51c1..2445d0bfe2 100644 --- a/src/main/java/net/server/audit/locks/factory/MonitoredWriteLockFactory.java +++ b/src/main/java/net/server/audit/locks/factory/MonitoredWriteLockFactory.java @@ -23,7 +23,6 @@ import net.server.audit.locks.MonitoredReentrantReadWriteLock; import net.server.audit.locks.active.TrackerWriteLock; /** - * * @author RonanLana */ public class MonitoredWriteLockFactory { diff --git a/src/main/java/net/server/channel/Channel.java b/src/main/java/net/server/channel/Channel.java index 9ee4d7eaa2..f3ea31bcb4 100644 --- a/src/main/java/net/server/channel/Channel.java +++ b/src/main/java/net/server/channel/Channel.java @@ -70,28 +70,28 @@ public final class Channel { private MapManager mapManager; private EventScriptManager eventSM; private ServicesManager services; - private Map hiredMerchants = new HashMap<>(); + private final Map hiredMerchants = new HashMap<>(); private final Map storedVars = new HashMap<>(); - private Set playersAway = new HashSet<>(); - private Map expeditions = new HashMap<>(); - private Map dungeons = new HashMap<>(); - private List expedType = new ArrayList<>(); - private Set ownedMaps = Collections.synchronizedSet(Collections.newSetFromMap(new WeakHashMap<>())); + private final Set playersAway = new HashSet<>(); + private final Map expeditions = new HashMap<>(); + private final Map dungeons = new HashMap<>(); + private final List expedType = new ArrayList<>(); + private final Set ownedMaps = Collections.synchronizedSet(Collections.newSetFromMap(new WeakHashMap<>())); private Event event; private boolean finishedShutdown = false; - private Set usedMC = new HashSet<>(); - + private final Set usedMC = new HashSet<>(); + private int usedDojo = 0; private int[] dojoStage; private long[] dojoFinishTime; private ScheduledFuture[] dojoTask; - private Map dojoParty = new HashMap<>(); - - private List chapelReservationQueue = new LinkedList<>(); - private List cathedralReservationQueue = new LinkedList<>(); + private final Map dojoParty = new HashMap<>(); + + private final List chapelReservationQueue = new LinkedList<>(); + private final List cathedralReservationQueue = new LinkedList<>(); private ScheduledFuture chapelReservationTask; private ScheduledFuture cathedralReservationTask; - + private Integer ongoingChapel = null; private Boolean ongoingChapelType = null; private Set ongoingChapelGuests = null; @@ -99,19 +99,19 @@ public final class Channel { private Boolean ongoingCathedralType = null; private Set ongoingCathedralGuests = null; private long ongoingStartTime; - - private MonitoredReentrantReadWriteLock merchantLock = new MonitoredReentrantReadWriteLock(MonitoredLockType.MERCHANT, true); - private MonitoredReadLock merchRlock = MonitoredReadLockFactory.createLock(merchantLock); - private MonitoredWriteLock merchWlock = MonitoredWriteLockFactory.createLock(merchantLock); - - private MonitoredReentrantLock[] faceLock = new MonitoredReentrantLock[YamlConfig.config.server.CHANNEL_LOCKS]; - + + private final MonitoredReentrantReadWriteLock merchantLock = new MonitoredReentrantReadWriteLock(MonitoredLockType.MERCHANT, true); + private final MonitoredReadLock merchRlock = MonitoredReadLockFactory.createLock(merchantLock); + private final MonitoredWriteLock merchWlock = MonitoredWriteLockFactory.createLock(merchantLock); + + private final MonitoredReentrantLock[] faceLock = new MonitoredReentrantLock[YamlConfig.config.server.CHANNEL_LOCKS]; + private MonitoredReentrantLock lock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.CHANNEL, true); - + public Channel(final int world, final int channel, long startTime) { this.world = world; this.channel = channel; - + this.ongoingStartTime = startTime + 10000; // rude approach to a world's last channel boot time, placeholder for the 1st wedding reservation ever this.mapManager = new MapManager(null, world, channel); this.port = BASE_PORT + (this.channel - 1) + (world * 100); @@ -120,7 +120,7 @@ public final class Channel { try { this.channelServer = initServer(port, world, channel); expedType.addAll(Arrays.asList(ExpeditionType.values())); - + if (Server.getInstance().isOnline()) { // postpone event loading to improve boot time... thanks Riizade, daronhudson for noticing slow startup times eventSM = new EventScriptManager(this, getEvents()); eventSM.init(); @@ -128,18 +128,18 @@ public final class Channel { String[] ev = {"0_EXAMPLE"}; eventSM = new EventScriptManager(this, ev); } - + dojoStage = new int[20]; dojoFinishTime = new long[20]; dojoTask = new ScheduledFuture[20]; - for(int i = 0; i < 20; i++) { + for (int i = 0; i < 20; i++) { dojoStage[i] = 0; dojoFinishTime[i] = 0; dojoTask[i] = null; } - + services = new ServicesManager(ChannelServices.OVERALL); - + log.info("Channel {}: Listening on port {}", getId(), port); } catch (Exception e) { log.warn("Error during channel initialization", e); @@ -151,15 +151,15 @@ public final class Channel { channelServer.start(); return channelServer; } - - public synchronized void reloadEventScriptManager(){ + + public synchronized void reloadEventScriptManager() { if (finishedShutdown) { return; } - + eventSM.cancel(); - eventSM = null; - eventSM = new EventScriptManager(this, getEvents()); + eventSM = null; + eventSM = new EventScriptManager(this, getEvents()); } public final synchronized void shutdown() { @@ -167,24 +167,24 @@ public final class Channel { if (finishedShutdown) { return; } - + System.out.println("Shutting down Channel " + channel + " on World " + world); - + closeAllMerchants(); disconnectAwayPlayers(); players.disconnectAll(); - + eventSM.dispose(); eventSM = null; - + mapManager.dispose(); mapManager = null; - + closeChannelSchedules(); players = null; channelServer.stop(); - + finishedShutdown = true; System.out.println("Successfully shut down Channel " + channel + " on World " + world + "\r\n"); } catch (Exception e) { @@ -192,16 +192,16 @@ public final class Channel { System.err.println("Error while shutting down Channel " + channel + " on World " + world + "\r\n" + e); } } - + private void closeChannelServices() { services.shutdown(); } - + private void closeChannelSchedules() { lock.lock(); try { - for(int i = 0; i < dojoTask.length; i++) { - if(dojoTask[i] != null) { + for (int i = 0; i < dojoTask.length; i++) { + if (dojoTask[i] != null) { dojoTask[i].cancel(false); dojoTask[i] = null; } @@ -209,27 +209,27 @@ public final class Channel { } finally { lock.unlock(); } - + closeChannelServices(); disposeLocks(); } - + private void disposeLocks() { LockCollector.getInstance().registerDisposeAction(() -> emptyLocks()); } - + private void emptyLocks() { - for(int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { + for (int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { faceLock[i] = faceLock[i].dispose(); } - + lock = lock.dispose(); } - + private void closeAllMerchants() { try { List merchs; - + merchWlock.lock(); try { merchs = new ArrayList<>(hiredMerchants.values()); @@ -245,28 +245,28 @@ public final class Channel { e.printStackTrace(); } } - + public MapManager getMapFactory() { return mapManager; } - + public BaseService getServiceAccess(ChannelServices sv) { return services.getAccess(sv).getService(); } - + public int getWorld() { return world; } - + public World getWorldServer() { return Server.getInstance().getWorld(world); } - + public void addPlayer(Character chr) { players.addPlayer(chr); chr.sendPacket(PacketCreator.serverMessage(serverMessage)); } - + public String getServerMessage() { return serverMessage; } @@ -278,9 +278,9 @@ public final class Channel { public boolean removePlayer(Character chr) { return players.removePlayer(chr.getId()) != null; } - + public int getChannelCapacity() { - return (int)(Math.ceil(((float) players.getAllCharacters().size() / YamlConfig.config.server.CHANNEL_LOAD) * 800)); + return (int) (Math.ceil(((float) players.getAllCharacters().size() / YamlConfig.config.server.CHANNEL_LOAD) * 800)); } public void broadcastPacket(Packet packet) { @@ -288,7 +288,7 @@ public final class Channel { chr.sendPacket(packet); } } - + public final int getId() { return channel; } @@ -329,19 +329,19 @@ public final class Channel { } return partym; } - + public void insertPlayerAway(int chrId) { // either they in CS or MTS playersAway.add(chrId); } - + public void removePlayerAway(int chrId) { playersAway.remove(chrId); } - + public boolean canUninstall() { return players.getSize() == 0 && playersAway.isEmpty(); } - + private void disconnectAwayPlayers() { World wserv = getWorldServer(); for (Integer cid : playersAway) { @@ -351,7 +351,7 @@ public final class Channel { } } } - + public Map getHiredMerchants() { merchRlock.lock(); try { @@ -372,7 +372,7 @@ public final class Channel { public void removeHiredMerchant(int chrid) { merchWlock.lock(); - try { + try { hiredMerchants.remove(chrid); } finally { merchWlock.unlock(); @@ -397,114 +397,118 @@ public final class Channel { } return retArr; } - + public boolean addExpedition(Expedition exped) { synchronized (expeditions) { if (expeditions.containsKey(exped.getType())) { return false; } - + expeditions.put(exped.getType(), exped); exped.beginRegistration(); // thanks Conrad for noticing leader still receiving packets on failure-to-register cases return true; } } - + public void removeExpedition(Expedition exped) { synchronized (expeditions) { expeditions.remove(exped.getType()); } } - + public Expedition getExpedition(ExpeditionType type) { return expeditions.get(type); } - + public List getExpeditions() { synchronized (expeditions) { return new ArrayList<>(expeditions.values()); } } - + public boolean isConnected(String name) { return getPlayerStorage().getCharacterByName(name) != null; } - + public boolean isActive() { EventScriptManager esm = this.getEventSM(); return esm != null && esm.isActive(); } - + public boolean finishedShutdown() { return finishedShutdown; } - + public void setServerMessage(String message) { this.serverMessage = message; broadcastPacket(PacketCreator.serverMessage(message)); getWorldServer().resetDisabledServerMessages(); } - - private static String [] getEvents(){ - List events = new ArrayList<>(); - for (File file : new File("scripts/event").listFiles()){ + + private static String[] getEvents() { + List events = new ArrayList<>(); + for (File file : new File("scripts/event").listFiles()) { events.add(file.getName().substring(0, file.getName().length() - 3)); - } - return events.toArray(new String[0]); + } + return events.toArray(new String[0]); } - + public int getStoredVar(int key) { - if(storedVars.containsKey(key)) { + if (storedVars.containsKey(key)) { return storedVars.get(key); } return 0; } - + public void setStoredVar(int key, int val) { this.storedVars.put(key, val); } - + public int lookupPartyDojo(Party party) { - if(party == null) return -1; - + if (party == null) { + return -1; + } + Integer i = dojoParty.get(party.hashCode()); return (i != null) ? i : -1; } - + public int ingressDojo(boolean isPartyDojo, int fromStage) { return ingressDojo(isPartyDojo, null, fromStage); } - + public int ingressDojo(boolean isPartyDojo, Party party, int fromStage) { lock.lock(); try { int dojoList = this.usedDojo; int range, slot = 0; - if(!isPartyDojo) { + if (!isPartyDojo) { dojoList = dojoList >> 5; range = 15; } else { range = 5; } - while((dojoList & 1) != 0) { + while ((dojoList & 1) != 0) { dojoList = (dojoList >> 1); slot++; } - if(slot < range) { + if (slot < range) { int slotMapid = (isPartyDojo ? 925030000 : 925020000) + (100 * (fromStage + 1)) + slot; int dojoSlot = getDojoSlot(slotMapid); - - if(party != null) { - if(dojoParty.containsKey(party.hashCode())) return -2; + + if (party != null) { + if (dojoParty.containsKey(party.hashCode())) { + return -2; + } dojoParty.put(party.hashCode(), dojoSlot); } - + this.usedDojo |= (1 << dojoSlot); - + this.resetDojo(slotMapid); this.startDojoSchedule(slotMapid); return slot; @@ -515,77 +519,83 @@ public final class Channel { lock.unlock(); } } - + private void freeDojoSlot(int slot, Party party) { int mask = 0b11111111111111111111; mask ^= (1 << slot); - + lock.lock(); try { usedDojo &= mask; } finally { lock.unlock(); } - - if(party != null) { - if(dojoParty.remove(party.hashCode()) != null) return; + + if (party != null) { + if (dojoParty.remove(party.hashCode()) != null) { + return; + } } - - if(dojoParty.containsValue(slot)) { // strange case, no party there! + + if (dojoParty.containsValue(slot)) { // strange case, no party there! Set> es = new HashSet<>(dojoParty.entrySet()); - - for(Entry e: es) { - if(e.getValue() == slot) { + + for (Entry e : es) { + if (e.getValue() == slot) { dojoParty.remove(e.getKey()); break; } } } } - + private static int getDojoSlot(int dojoMapId) { return (dojoMapId % 100) + ((dojoMapId / 10000 == 92502) ? 5 : 0); } - + public void resetDojoMap(int fromMapId) { - for(int i = 0; i < (((fromMapId / 100) % 100 <= 36) ? 5 : 2); i++) { + for (int i = 0; i < (((fromMapId / 100) % 100 <= 36) ? 5 : 2); i++) { this.getMapFactory().getMap(fromMapId + (100 * i)).resetMapObjects(); } } - + public void resetDojo(int dojoMapId) { resetDojo(dojoMapId, -1); } - + private void resetDojo(int dojoMapId, int thisStg) { int slot = getDojoSlot(dojoMapId); this.dojoStage[slot] = thisStg; } - - public void freeDojoSectionIfEmpty(int dojoMapId) { - final int slot = getDojoSlot(dojoMapId); - final int delta = (dojoMapId) % 100; - final int stage = (dojoMapId / 100) % 100; - final int dojoBaseMap = (dojoMapId >= 925030000) ? 925030000 : 925020000; - for (int i = 0; i < 5; i++) { //only 32 stages, but 38 maps - if (stage + i > 38) { - break; - } - MapleMap dojoMap = getMapFactory().getMap(dojoBaseMap + (100 * (stage + i)) + delta); - if(!dojoMap.getAllPlayers().isEmpty()) return; + public void freeDojoSectionIfEmpty(int dojoMapId) { + final int slot = getDojoSlot(dojoMapId); + final int delta = (dojoMapId) % 100; + final int stage = (dojoMapId / 100) % 100; + final int dojoBaseMap = (dojoMapId >= 925030000) ? 925030000 : 925020000; + + for (int i = 0; i < 5; i++) { //only 32 stages, but 38 maps + if (stage + i > 38) { + break; } - - freeDojoSlot(slot, null); + MapleMap dojoMap = getMapFactory().getMap(dojoBaseMap + (100 * (stage + i)) + delta); + if (!dojoMap.getAllPlayers().isEmpty()) { + return; + } + } + + freeDojoSlot(slot, null); } - + private void startDojoSchedule(final int dojoMapId) { final int slot = getDojoSlot(dojoMapId); final int stage = (dojoMapId / 100) % 100; - if(stage <= dojoStage[slot]) return; - + if (stage <= dojoStage[slot]) { + return; + } + long clockTime = (stage > 36 ? 15 : (stage / 6) + 5) * 60000; - + lock.lock(); try { if (this.dojoTask[slot] != null) { @@ -602,8 +612,8 @@ public final class Channel { } MapleMap dojoExit = getMapFactory().getMap(925020002); - for(Character chr: getMapFactory().getMap(dojoBaseMap + (100 * (stage + i)) + delta).getAllPlayers()) { - if(GameConstants.isDojo(chr.getMap().getId())) { + for (Character chr : getMapFactory().getMap(dojoBaseMap + (100 * (stage + i)) + delta).getAllPlayers()) { + if (GameConstants.isDojo(chr.getMap().getId())) { chr.changeMap(dojoExit); } party = chr.getParty(); @@ -615,59 +625,63 @@ public final class Channel { } finally { lock.unlock(); } - + dojoFinishTime[slot] = Server.getInstance().getCurrentTime() + clockTime; } - + public void dismissDojoSchedule(int dojoMapId, Party party) { int slot = getDojoSlot(dojoMapId); int stage = (dojoMapId / 100) % 100; - if(stage <= dojoStage[slot]) return; - + if (stage <= dojoStage[slot]) { + return; + } + lock.lock(); try { - if(this.dojoTask[slot] != null) { + if (this.dojoTask[slot] != null) { this.dojoTask[slot].cancel(false); this.dojoTask[slot] = null; } } finally { lock.unlock(); } - + freeDojoSlot(slot, party); } - + public boolean setDojoProgress(int dojoMapId) { int slot = getDojoSlot(dojoMapId); int dojoStg = (dojoMapId / 100) % 100; - - if(this.dojoStage[slot] < dojoStg) { + + if (this.dojoStage[slot] < dojoStg) { this.dojoStage[slot] = dojoStg; return true; } else { return false; } } - + public long getDojoFinishTime(int dojoMapId) { return dojoFinishTime[getDojoSlot(dojoMapId)]; } - + public boolean addMiniDungeon(int dungeonid) { lock.lock(); try { - if(dungeons.containsKey(dungeonid)) return false; - + if (dungeons.containsKey(dungeonid)) { + return false; + } + MiniDungeonInfo mmdi = MiniDungeonInfo.getDungeon(dungeonid); MiniDungeon mmd = new MiniDungeon(mmdi.getBase(), this.getMapFactory().getMap(mmdi.getDungeonId()).getTimeLimit()); // thanks Conrad for noticing hardcoded time limit for minidungeons - + dungeons.put(dungeonid, mmd); return true; } finally { lock.unlock(); } } - + public MiniDungeon getMiniDungeon(int dungeonid) { lock.lock(); try { @@ -676,7 +690,7 @@ public final class Channel { lock.unlock(); } } - + public void removeMiniDungeon(int dungeonid) { lock.lock(); try { @@ -685,35 +699,39 @@ public final class Channel { lock.unlock(); } } - + public Pair>> getNextWeddingReservation(boolean cathedral) { Integer ret; - + lock.lock(); try { List weddingReservationQueue = (cathedral ? cathedralReservationQueue : chapelReservationQueue); - if(weddingReservationQueue.isEmpty()) return null; + if (weddingReservationQueue.isEmpty()) { + return null; + } ret = weddingReservationQueue.remove(0); - if(ret == null) return null; + if (ret == null) { + return null; + } } finally { lock.unlock(); } - + World wserv = getWorldServer(); - + Pair coupleId = wserv.getMarriageQueuedCouple(ret); Pair> typeGuests = wserv.removeMarriageQueued(ret); - + Pair couple = new Pair<>(Character.getNameById(coupleId.getLeft()), Character.getNameById(coupleId.getRight())); wserv.dropMessage(6, couple.getLeft() + " and " + couple.getRight() + "'s wedding is going to be started at " + (cathedral ? "Cathedral" : "Chapel") + " on Channel " + channel + "."); - + return new Pair<>(typeGuests.getLeft(), new Pair<>(ret, typeGuests.getRight())); } - + public boolean isWeddingReserved(Integer weddingId) { World wserv = getWorldServer(); - + lock.lock(); try { return wserv.isMarriageQueued(weddingId) || weddingId.equals(ongoingCathedral) || weddingId.equals(ongoingChapel); @@ -721,48 +739,56 @@ public final class Channel { lock.unlock(); } } - + public int getWeddingReservationStatus(Integer weddingId, boolean cathedral) { - if(weddingId == null) return -1; - + if (weddingId == null) { + return -1; + } + lock.lock(); try { - if(cathedral) { - if(weddingId.equals(ongoingCathedral)) return 0; - - for(int i = 0; i < cathedralReservationQueue.size(); i++) { - if(weddingId.equals(cathedralReservationQueue.get(i))) { + if (cathedral) { + if (weddingId.equals(ongoingCathedral)) { + return 0; + } + + for (int i = 0; i < cathedralReservationQueue.size(); i++) { + if (weddingId.equals(cathedralReservationQueue.get(i))) { return i + 1; } } } else { - if(weddingId.equals(ongoingChapel)) return 0; - - for(int i = 0; i < chapelReservationQueue.size(); i++) { - if(weddingId.equals(chapelReservationQueue.get(i))) { + if (weddingId.equals(ongoingChapel)) { + return 0; + } + + for (int i = 0; i < chapelReservationQueue.size(); i++) { + if (weddingId.equals(chapelReservationQueue.get(i))) { return i + 1; } } } - + return -1; } finally { lock.unlock(); } } - + public int pushWeddingReservation(Integer weddingId, boolean cathedral, boolean premium, Integer groomId, Integer brideId) { - if(weddingId == null || isWeddingReserved(weddingId)) return -1; - + if (weddingId == null || isWeddingReserved(weddingId)) { + return -1; + } + World wserv = getWorldServer(); wserv.putMarriageQueued(weddingId, cathedral, premium, groomId, brideId); - + lock.lock(); try { List weddingReservationQueue = (cathedral ? cathedralReservationQueue : chapelReservationQueue); - + int delay = YamlConfig.config.server.WEDDING_RESERVATION_DELAY - 1 - weddingReservationQueue.size(); - for(int i = 0; i < delay; i++) { + for (int i = 0; i < delay; i++) { weddingReservationQueue.add(null); // push empty slots to fill the waiting time } @@ -772,11 +798,11 @@ public final class Channel { lock.unlock(); } } - + public boolean isOngoingWeddingGuest(boolean cathedral, int playerId) { lock.lock(); try { - if(cathedral) { + if (cathedral) { return ongoingCathedralGuests != null && ongoingCathedralGuests.contains(playerId); } else { return ongoingChapelGuests != null && ongoingChapelGuests.contains(playerId); @@ -785,7 +811,7 @@ public final class Channel { lock.unlock(); } } - + public Integer getOngoingWedding(boolean cathedral) { lock.lock(); try { @@ -794,7 +820,7 @@ public final class Channel { lock.unlock(); } } - + public boolean getOngoingWeddingType(boolean cathedral) { lock.lock(); try { @@ -803,11 +829,11 @@ public final class Channel { lock.unlock(); } } - + public void closeOngoingWedding(boolean cathedral) { lock.lock(); try { - if(cathedral) { + if (cathedral) { ongoingCathedral = null; ongoingCathedralType = null; ongoingCathedralGuests = null; @@ -820,11 +846,11 @@ public final class Channel { lock.unlock(); } } - + public void setOngoingWedding(final boolean cathedral, Boolean premium, Integer weddingId, Set guests) { lock.lock(); try { - if(cathedral) { + if (cathedral) { ongoingCathedral = weddingId; ongoingCathedralType = premium; ongoingCathedralGuests = guests; @@ -836,105 +862,112 @@ public final class Channel { } finally { lock.unlock(); } - + ongoingStartTime = System.currentTimeMillis(); - if(weddingId != null) { + if (weddingId != null) { ScheduledFuture weddingTask = TimerManager.getInstance().schedule(() -> closeOngoingWedding(cathedral), YamlConfig.config.server.WEDDING_RESERVATION_TIMEOUT * 60 * 1000); - - if(cathedral) { + + if (cathedral) { cathedralReservationTask = weddingTask; } else { chapelReservationTask = weddingTask; } } } - + public synchronized boolean acceptOngoingWedding(final boolean cathedral) { // couple succeeded to show up and started the ceremony - if(cathedral) { - if(cathedralReservationTask == null) return false; - + if (cathedral) { + if (cathedralReservationTask == null) { + return false; + } + cathedralReservationTask.cancel(false); cathedralReservationTask = null; } else { - if(chapelReservationTask == null) return false; - + if (chapelReservationTask == null) { + return false; + } + chapelReservationTask.cancel(false); chapelReservationTask = null; } - + return true; } - + private static String getTimeLeft(long futureTime) { StringBuilder str = new StringBuilder(); long leftTime = futureTime - System.currentTimeMillis(); - - if(leftTime < 0) { + + if (leftTime < 0) { return null; } - + byte mode = 0; - if(leftTime / (60*1000) > 0) { + if (leftTime / (60 * 1000) > 0) { mode++; //counts minutes - - if(leftTime / (60*60*1000) > 0) + + if (leftTime / (60 * 60 * 1000) > 0) { mode++; //counts hours + } } - - switch(mode) { + + switch (mode) { case 2: - int hours = (int) ((leftTime / (1000*60*60))); + int hours = (int) ((leftTime / (1000 * 60 * 60))); str.append(hours + " hours, "); - + case 1: - int minutes = (int) ((leftTime / (1000*60)) % 60); + int minutes = (int) ((leftTime / (1000 * 60)) % 60); str.append(minutes + " minutes, "); - + default: - int seconds = (int) (leftTime / 1000) % 60 ; + int seconds = (int) (leftTime / 1000) % 60; str.append(seconds + " seconds"); } - + return str.toString(); } - + public long getWeddingTicketExpireTime(int resSlot) { return ongoingStartTime + getRelativeWeddingTicketExpireTime(resSlot); } - + public static long getRelativeWeddingTicketExpireTime(int resSlot) { return (resSlot * YamlConfig.config.server.WEDDING_RESERVATION_INTERVAL * 60 * 1000); } - + public String getWeddingReservationTimeLeft(Integer weddingId) { - if(weddingId == null) return null; - + if (weddingId == null) { + return null; + } + lock.lock(); try { boolean cathedral = true; - + int resStatus; resStatus = getWeddingReservationStatus(weddingId, true); - if(resStatus < 0) { + if (resStatus < 0) { cathedral = false; resStatus = getWeddingReservationStatus(weddingId, false); - - if(resStatus < 0) { + + if (resStatus < 0) { return null; } } - + String venue = (cathedral ? "Cathedral" : "Chapel"); - if(resStatus == 0) { + if (resStatus == 0) { return venue + " - RIGHT NOW"; } - + return venue + " - " + getTimeLeft(ongoingStartTime + (resStatus * YamlConfig.config.server.WEDDING_RESERVATION_INTERVAL * 60 * 1000)) + " from now"; } finally { lock.unlock(); } } - + public Pair getWeddingCoupleForGuest(int guestId, boolean cathedral) { lock.lock(); try { @@ -943,55 +976,55 @@ public final class Channel { lock.unlock(); } } - + public void dropMessage(int type, String message) { for (Character player : getPlayerStorage().getAllCharacters()) { player.dropMessage(type, message); } } - + public void registerOwnedMap(MapleMap map) { ownedMaps.add(map); } - + public void unregisterOwnedMap(MapleMap map) { ownedMaps.remove(map); } - + public void runCheckOwnedMapsSchedule() { if (!ownedMaps.isEmpty()) { List ownedMapsList; - + synchronized (ownedMaps) { ownedMapsList = new ArrayList<>(ownedMaps); } - + for (MapleMap map : ownedMapsList) { map.checkMapOwnerActivity(); } } } - + private static int getMonsterCarnivalRoom(boolean cpq1, int field) { return (cpq1 ? 0 : 100) + field; } - + public void initMonsterCarnival(boolean cpq1, int field) { usedMC.add(getMonsterCarnivalRoom(cpq1, field)); } - + public void finishMonsterCarnival(boolean cpq1, int field) { usedMC.remove(getMonsterCarnivalRoom(cpq1, field)); } - + public boolean canInitMonsterCarnival(boolean cpq1, int field) { return !usedMC.contains(getMonsterCarnivalRoom(cpq1, field)); } - + public void debugMarriageStatus() { System.out.println(" ----- WORLD DATA -----"); getWorldServer().debugMarriageStatus(); - + System.out.println(" ----- CH. " + channel + " -----"); System.out.println(" ----- CATHEDRAL -----"); System.out.println("Current Queue: " + cathedralReservationQueue); diff --git a/src/main/java/net/server/channel/CharacterIdChannelPair.java b/src/main/java/net/server/channel/CharacterIdChannelPair.java index 9535a81bdf..6b3b553d42 100644 --- a/src/main/java/net/server/channel/CharacterIdChannelPair.java +++ b/src/main/java/net/server/channel/CharacterIdChannelPair.java @@ -22,7 +22,6 @@ package net.server.channel; /** - * * @author Frz */ public class CharacterIdChannelPair { diff --git a/src/main/java/net/server/channel/handlers/AbstractDealDamageHandler.java b/src/main/java/net/server/channel/handlers/AbstractDealDamageHandler.java index 9d8d2d6845..8dd75a1f90 100644 --- a/src/main/java/net/server/channel/handlers/AbstractDealDamageHandler.java +++ b/src/main/java/net/server/channel/handlers/AbstractDealDamageHandler.java @@ -57,16 +57,18 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { public boolean ranged, magic; public int speed = 4; public Point position = new Point(); - + public StatEffect getAttackEffect(Character chr, Skill theSkill) { Skill mySkill = theSkill; if (mySkill == null) { mySkill = SkillFactory.getSkill(skill); } - + int skillLevel = chr.getSkillLevel(mySkill); - if(skillLevel == 0 && GameConstants.isPqSkillMap(chr.getMapId()) && GameConstants.isPqSkill(mySkill.getId())) skillLevel = 1; - + if (skillLevel == 0 && GameConstants.isPqSkillMap(chr.getMapId()) && GameConstants.isPqSkill(mySkill.getId())) { + skillLevel = 1; + } + if (skillLevel == 0) { return null; } @@ -85,7 +87,7 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { if (map.isOwnershipRestricted(player)) { return; } - + Skill theSkill = null; StatEffect attackEffect = null; final int job = player.getJob().getId(); @@ -108,20 +110,20 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { int mobCount = attackEffect.getMobCount(); if (attack.skill != Cleric.HEAL) { if (player.isAlive()) { - if(attack.skill == Aran.BODY_PRESSURE || attack.skill == Marauder.ENERGY_CHARGE || attack.skill == ThunderBreaker.ENERGY_CHARGE) { // thanks IxianMace for noticing Energy Charge skills refreshing on touch + if (attack.skill == Aran.BODY_PRESSURE || attack.skill == Marauder.ENERGY_CHARGE || attack.skill == ThunderBreaker.ENERGY_CHARGE) { // thanks IxianMace for noticing Energy Charge skills refreshing on touch // prevent touch dmg skills refreshing - } else if(attack.skill == DawnWarrior.FINAL_ATTACK || attack.skill == WindArcher.FINAL_ATTACK) { + } else if (attack.skill == DawnWarrior.FINAL_ATTACK || attack.skill == WindArcher.FINAL_ATTACK) { // prevent cygnus FA refreshing mobCount = 15; - } else if(attack.skill == NightWalker.POISON_BOMB) {// Poison Bomb + } else if (attack.skill == NightWalker.POISON_BOMB) {// Poison Bomb attackEffect.applyTo(player, new Point(attack.position.x, attack.position.y)); } else { attackEffect.applyTo(player); - + if (attack.skill == Page.FINAL_ATTACK_BW || attack.skill == Page.FINAL_ATTACK_SWORD || attack.skill == Fighter.FINAL_ATTACK_SWORD || attack.skill == Fighter.FINAL_ATTACK_AXE || attack.skill == Spearman.FINAL_ATTACK_SPEAR || attack.skill == Spearman.FINAL_ATTACK_POLEARM || attack.skill == Hunter.FINAL_ATTACK || attack.skill == Crossbowman.FINAL_ATTACK) { - + mobCount = 15;//:( } else if (attack.skill == Aran.HIDDEN_FULL_DOUBLE || attack.skill == Aran.HIDDEN_FULL_TRIPLE || attack.skill == Aran.HIDDEN_OVER_DOUBLE || attack.skill == Aran.HIDDEN_OVER_TRIPLE) { mobCount = 12; @@ -131,7 +133,7 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { player.sendPacket(PacketCreator.enableActions()); } } - + if (attack.numAttacked > mobCount) { AutobanFactory.MOB_COUNT.autoban(player, "Skill: " + attack.skill + "; Count: " + attack.numAttacked + " Max: " + attackEffect.getMobCount()); return; @@ -145,7 +147,7 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { /*if (attackCount != attack.numDamage && attack.skill != ChiefBandit.MESO_EXPLOSION && attack.skill != NightWalker.VAMPIRE && attack.skill != WindArcher.WIND_SHOT && attack.skill != Aran.COMBO_SMASH && attack.skill != Aran.COMBO_FENRIR && attack.skill != Aran.COMBO_TEMPEST && attack.skill != NightLord.NINJA_AMBUSH && attack.skill != Shadower.NINJA_AMBUSH) { return; }*/ - + int totDamage = 0; if (attack.skill == ChiefBandit.MESO_EXPLOSION) { @@ -154,30 +156,30 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { MapObject mapobject = map.getMapObject(oned); if (mapobject != null && mapobject.getType() == MapObjectType.ITEM) { final MapItem mapitem = (MapItem) mapobject; - if (mapitem.getMeso() == 0) { //Maybe it is possible some how? + if (mapitem.getMeso() == 0) { //Maybe it is possible some how? + return; + } + + mapitem.lockItem(); + try { + if (mapitem.isPickedUp()) { return; } - - mapitem.lockItem(); - try { - if (mapitem.isPickedUp()) { - return; - } - TimerManager.getInstance().schedule(() -> { - mapitem.lockItem(); - try { - if (mapitem.isPickedUp()) { - return; - } - map.pickItemDrop(PacketCreator.removeItemFromMap(mapitem.getObjectId(), 4, 0), mapitem); - } finally { - mapitem.unlockItem(); + TimerManager.getInstance().schedule(() -> { + mapitem.lockItem(); + try { + if (mapitem.isPickedUp()) { + return; } - }, delay); - delay += 100; - } finally { - mapitem.unlockItem(); - } + map.pickItemDrop(PacketCreator.removeItemFromMap(mapitem.getObjectId(), 4, 0), mapitem); + } finally { + mapitem.unlockItem(); + } + }, delay); + delay += 100; + } finally { + mapitem.unlockItem(); + } } else if (mapobject != null && mapobject.getType() != MapObjectType.MONSTER) { return; } @@ -185,42 +187,42 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { } for (Integer oned : attack.allDamage.keySet()) { final Monster monster = map.getMonsterByOid(oned); - if (monster != null) { + if (monster != null) { double distance = player.getPosition().distanceSq(monster.getPosition()); double distanceToDetect = 200000.0; - - if(attack.ranged) + + if (attack.ranged) { distanceToDetect += 400000; - - if(attack.magic) + } + + if (attack.magic) { distanceToDetect += 200000; - - if(player.getJob().isA(Job.ARAN1)) + } + + if (player.getJob().isA(Job.ARAN1)) { distanceToDetect += 200000; // Arans have extra range over normal warriors. - - if(attack.skill == Aran.COMBO_SMASH || attack.skill == Aran.BODY_PRESSURE) + } + + if (attack.skill == Aran.COMBO_SMASH || attack.skill == Aran.BODY_PRESSURE) { distanceToDetect += 40000; - - else if(attack.skill == Bishop.GENESIS || attack.skill == ILArchMage.BLIZZARD || attack.skill == FPArchMage.METEOR_SHOWER) + } else if (attack.skill == Bishop.GENESIS || attack.skill == ILArchMage.BLIZZARD || attack.skill == FPArchMage.METEOR_SHOWER) { distanceToDetect += 275000; - - else if(attack.skill == Hero.BRANDISH || attack.skill == DragonKnight.SPEAR_CRUSHER || attack.skill == DragonKnight.POLE_ARM_CRUSHER) + } else if (attack.skill == Hero.BRANDISH || attack.skill == DragonKnight.SPEAR_CRUSHER || attack.skill == DragonKnight.POLE_ARM_CRUSHER) { distanceToDetect += 40000; - - else if(attack.skill == DragonKnight.DRAGON_ROAR || attack.skill == SuperGM.SUPER_DRAGON_ROAR) + } else if (attack.skill == DragonKnight.DRAGON_ROAR || attack.skill == SuperGM.SUPER_DRAGON_ROAR) { distanceToDetect += 250000; - - else if(attack.skill == Shadower.BOOMERANG_STEP) + } else if (attack.skill == Shadower.BOOMERANG_STEP) { distanceToDetect += 60000; - + } + if (distance > distanceToDetect) { AutobanFactory.DISTANCE_HACK.alert(player, "Distance Sq to monster: " + distance + " SID: " + attack.skill + " MID: " + monster.getId()); monster.refreshMobPosition(); } - + int totDamageToOneMonster = 0; List onedList = attack.allDamage.get(oned); - + if (attack.magic) { // thanks BHB, Alex (CanIGetaPR) for noticing no immunity status check here if (monster.isBuffed(MonsterStatus.MAGIC_IMMUNITY)) { Collections.fill(onedList, 1); @@ -230,7 +232,7 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { Collections.fill(onedList, 1); } } - + if (GameConstants.isDojoBoss(monster.getId())) { if (attack.skill == 1009 || attack.skill == 10001009 || attack.skill == 20001009) { int dmgLimit = (int) Math.ceil(0.3 * monster.getMaxHp()); @@ -238,13 +240,15 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { for (Integer i : onedList) { _onedList.add(i < dmgLimit ? i : dmgLimit); } - + onedList = _onedList; } } - + for (Integer eachd : onedList) { - if(eachd < 0) eachd += Integer.MAX_VALUE; + if (eachd < 0) { + eachd += Integer.MAX_VALUE; + } totDamageToOneMonster += eachd; } totDamage += totDamageToOneMonster; @@ -252,18 +256,19 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { if (player.getBuffedValue(BuffStat.PICKPOCKET) != null && (attack.skill == 0 || attack.skill == Rogue.DOUBLE_STAB || attack.skill == Bandit.SAVAGE_BLOW || attack.skill == ChiefBandit.ASSAULTER || attack.skill == ChiefBandit.BAND_OF_THIEVES || attack.skill == Shadower.ASSASSINATE || attack.skill == Shadower.TAUNT || attack.skill == Shadower.BOOMERANG_STEP)) { Skill pickpocket = SkillFactory.getSkill(ChiefBandit.PICKPOCKET); int picklv = (player.isGM()) ? pickpocket.getMaxLevel() : player.getSkillLevel(pickpocket); - if(picklv > 0) { + if (picklv > 0) { int delay = 0; final int maxmeso = player.getBuffedValue(BuffStat.PICKPOCKET); - for (Integer eachd : onedList) { + for (Integer eachd : onedList) { eachd += Integer.MAX_VALUE; if (pickpocket.getEffect(picklv).makeChanceResult()) { final int eachdf; - if(eachd < 0) - eachdf = eachd + Integer.MAX_VALUE; - else - eachdf = eachd; + if (eachd < 0) { + eachdf = eachd + Integer.MAX_VALUE; + } else { + eachdf = eachd; + } TimerManager.getInstance().schedule(() -> map.spawnMesoDrop(Math.min((int) Math.max(((double) eachdf / (double) 20000) * (double) maxmeso, 1), maxmeso), new Point((int) (monster.getPosition().getX() + Randomizer.nextInt(100) - 50), (int) (monster.getPosition().getY())), monster, player, true, (byte) 2), delay); delay += 100; @@ -277,18 +282,20 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { if (monster.getStolen().size() < 1) { // One steal per mob <3 if (steal.getEffect(player.getSkillLevel(steal)).makeChanceResult()) { monster.addStolen(0); - + MonsterInformationProvider mi = MonsterInformationProvider.getInstance(); List dropPool = mi.retrieveDropPool(monster.getId()); - if(!dropPool.isEmpty()) { + if (!dropPool.isEmpty()) { int rndPool = (int) Math.floor(Math.random() * dropPool.get(dropPool.size() - 1)); - + int i = 0; - while(rndPool >= dropPool.get(i)) i++; - + while (rndPool >= dropPool.get(i)) { + i++; + } + List toSteal = new ArrayList<>(); toSteal.add(mi.retrieveDrop(monster.getId()).get(i)); - + map.dropItemsFromMonster(toSteal, player, monster); monster.addStolen(toSteal.get(0).itemId); } @@ -311,15 +318,15 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { } } } - + if (player.isAran()) { - if (player.getBuffedValue(BuffStat.WK_CHARGE) != null) { + if (player.getBuffedValue(BuffStat.WK_CHARGE) != null) { Skill snowCharge = SkillFactory.getSkill(Aran.SNOW_CHARGE); if (totDamageToOneMonster > 0) { MonsterStatusEffect monsterStatusEffect = new MonsterStatusEffect(Collections.singletonMap(MonsterStatus.SPEED, snowCharge.getEffect(player.getSkillLevel(snowCharge)).getX()), snowCharge, null, false); monster.applyStatus(player, monsterStatusEffect, false, snowCharge.getEffect(player.getSkillLevel(snowCharge)).getY() * 1000); } - } + } } if (player.getBuffedValue(BuffStat.HAMSTRING) != null) { Skill hamstring = SkillFactory.getSkill(Bowmaster.HAMSTRING); @@ -348,14 +355,14 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { if (player.isBuffFrom(BuffStat.WK_CHARGE, chargeSkill)) { if (totDamageToOneMonster > 0) { if (charge == WhiteKnight.BW_ICE_CHARGE || charge == WhiteKnight.SWORD_ICE_CHARGE) { - monster.setTempEffectiveness(Element.ICE, ElementalEffectiveness.WEAK, chargeSkill.getEffect(player.getSkillLevel(chargeSkill)).getY() * 1000); + monster.setTempEffectiveness(Element.ICE, ElementalEffectiveness.WEAK, chargeSkill.getEffect(player.getSkillLevel(chargeSkill)).getY() * 1000); break; } if (charge == WhiteKnight.BW_FIRE_CHARGE || charge == WhiteKnight.SWORD_FIRE_CHARGE) { monster.setTempEffectiveness(Element.FIRE, ElementalEffectiveness.WEAK, chargeSkill.getEffect(player.getSkillLevel(chargeSkill)).getY() * 1000); break; } - } + } } } if (job == 122) { @@ -389,15 +396,15 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { } } } - } else if (job >= 311 && job <= 322) { - if (!monster.isBoss()) { + } else if (job >= 311 && job <= 322) { + if (!monster.isBoss()) { Skill mortalBlow; if (job == 311 || job == 312) { mortalBlow = SkillFactory.getSkill(Ranger.MORTAL_BLOW); } else { mortalBlow = SkillFactory.getSkill(Sniper.MORTAL_BLOW); } - + int skillLevel = player.getSkillLevel(mortalBlow); if (skillLevel > 0) { StatEffect mortal = mortalBlow.getEffect(skillLevel); @@ -407,24 +414,24 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { } } } - } + } } if (attack.skill != 0) { if (attackEffect.getFixDamage() != -1) { if (totDamageToOneMonster != attackEffect.getFixDamage() && totDamageToOneMonster != 0) { AutobanFactory.FIX_DAMAGE.autoban(player, totDamageToOneMonster + " damage"); } - + int threeSnailsId = player.getJobType() * 10000000 + 1000; - if(attack.skill == threeSnailsId) { - if(YamlConfig.config.server.USE_ULTRA_THREE_SNAILS) { + if (attack.skill == threeSnailsId) { + if (YamlConfig.config.server.USE_ULTRA_THREE_SNAILS) { int skillLv = player.getSkillLevel(threeSnailsId); - if(skillLv > 0) { + if (skillLv > 0) { AbstractPlayerInteraction api = player.getAbstractPlayerInteraction(); int shellId; - switch(skillLv) { + switch (skillLv) { case 1: shellId = 4000019; break; @@ -437,7 +444,7 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { shellId = 4000016; } - if(api.haveItem(shellId, 1)) { + if (api.haveItem(shellId, 1)) { api.gainItem(shellId, (short) -1, false); totDamageToOneMonster *= player.getLevel(); } else { @@ -452,36 +459,36 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { } if (totDamageToOneMonster > 0 && attackEffect != null) { Map attackEffectStati = attackEffect.getMonsterStati(); - if(!attackEffectStati.isEmpty()) { + if (!attackEffectStati.isEmpty()) { if (attackEffect.makeChanceResult()) { monster.applyStatus(player, new MonsterStatusEffect(attackEffectStati, theSkill, null, false), attackEffect.isPoison(), attackEffect.getDuration()); } } } if (attack.skill == Paladin.HEAVENS_HAMMER) { - if(!monster.isBoss()) { + if (!monster.isBoss()) { damageMonsterWithSkill(player, map, monster, monster.getHp() - 1, attack.skill, 1777); } else { int HHDmg = (player.calculateMaxBaseDamage(player.getTotalWatk()) * (SkillFactory.getSkill(Paladin.HEAVENS_HAMMER).getEffect(player.getSkillLevel(SkillFactory.getSkill(Paladin.HEAVENS_HAMMER))).getDamage() / 100)); damageMonsterWithSkill(player, map, monster, (int) (Math.floor(Math.random() * (HHDmg / 5) + HHDmg * .8)), attack.skill, 1777); } } else if (attack.skill == Aran.COMBO_TEMPEST) { - if(!monster.isBoss()) { + if (!monster.isBoss()) { damageMonsterWithSkill(player, map, monster, monster.getHp(), attack.skill, 0); } else { int TmpDmg = (player.calculateMaxBaseDamage(player.getTotalWatk()) * (SkillFactory.getSkill(Aran.COMBO_TEMPEST).getEffect(player.getSkillLevel(SkillFactory.getSkill(Aran.COMBO_TEMPEST))).getDamage() / 100)); damageMonsterWithSkill(player, map, monster, (int) (Math.floor(Math.random() * (TmpDmg / 5) + TmpDmg * .8)), attack.skill, 0); } } else { - if(attack.skill == Aran.BODY_PRESSURE) { + if (attack.skill == Aran.BODY_PRESSURE) { map.broadcastMessage(PacketCreator.damageMonster(monster.getObjectId(), totDamageToOneMonster)); } - + map.damageMonster(player, monster, totDamageToOneMonster); } if (monster.isBuffed(MonsterStatus.WEAPON_REFLECT) && !attack.magic) { List> mobSkills = monster.getSkills(); - + for (Pair ms : mobSkills) { if (ms.left == 145) { MobSkill toUse = MobSkillFactory.getMobSkill(ms.left, ms.right); @@ -489,10 +496,10 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { map.broadcastMessage(player, PacketCreator.damagePlayer(0, monster.getId(), player.getId(), toUse.getX(), 0, 0, false, 0, true, monster.getObjectId(), 0, 0), true); } } - } + } if (monster.isBuffed(MonsterStatus.MAGIC_REFLECT) && attack.magic) { List> mobSkills = monster.getSkills(); - + for (Pair ms : mobSkills) { if (ms.left == 145) { MobSkill toUse = MobSkillFactory.getMobSkill(ms.left, ms.right); @@ -510,11 +517,14 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { private static void damageMonsterWithSkill(final Character attacker, final MapleMap map, final Monster monster, final int damage, int skillid, int fixedTime) { int animationTime; - - if(fixedTime == 0) animationTime = SkillFactory.getSkill(skillid).getAnimationTime(); - else animationTime = fixedTime; - - if(animationTime > 0) { // be sure to only use LIMITED ATTACKS with animation time here + + if (fixedTime == 0) { + animationTime = SkillFactory.getSkill(skillid).getAnimationTime(); + } else { + animationTime = fixedTime; + } + + if (animationTime > 0) { // be sure to only use LIMITED ATTACKS with animation time here TimerManager.getInstance().schedule(() -> { map.broadcastMessage(PacketCreator.damageMonster(monster.getObjectId(), damage), monster.getPosition()); map.damageMonster(attacker, monster, damage); @@ -524,9 +534,9 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { map.damageMonster(attacker, monster, damage); } } - + protected AttackInfo parseDamage(InPacket p, Character chr, boolean ranged, boolean magic) { - //2C 00 00 01 91 A1 12 00 A5 57 62 FC E2 75 99 10 00 47 80 01 04 01 C6 CC 02 DD FF 5F 00 + //2C 00 00 01 91 A1 12 00 A5 57 62 FC E2 75 99 10 00 47 80 01 04 01 C6 CC 02 DD FF 5F 00 AttackInfo ret = new AttackInfo(); p.readByte(); ret.numAttackedAndDamage = p.readByte(); @@ -536,18 +546,20 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { ret.skill = p.readInt(); ret.ranged = ranged; ret.magic = magic; - + if (ret.skill > 0) { ret.skilllevel = chr.getSkillLevel(ret.skill); - if(ret.skilllevel == 0 && GameConstants.isPqSkillMap(chr.getMapId()) && GameConstants.isPqSkill(ret.skill)) ret.skilllevel = 1; + if (ret.skilllevel == 0 && GameConstants.isPqSkillMap(chr.getMapId()) && GameConstants.isPqSkill(ret.skill)) { + ret.skilllevel = 1; + } } - + if (ret.skill == Evan.ICE_BREATH || ret.skill == Evan.FIRE_BREATH || ret.skill == FPArchMage.BIG_BANG || ret.skill == ILArchMage.BIG_BANG || ret.skill == Bishop.BIG_BANG || ret.skill == Gunslinger.GRENADE || ret.skill == Brawler.CORKSCREW_BLOW || ret.skill == ThunderBreaker.CORKSCREW_BLOW || ret.skill == NightWalker.POISON_BOMB) { ret.charge = p.readInt(); } else { ret.charge = 0; } - + p.skip(8); ret.display = p.readByte(); ret.direction = p.readByte(); @@ -602,56 +614,60 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { ret.speed = p.readByte(); p.skip(4); } - + // Find the base damage to base futher calculations on. // Several skills have their own formula in this section. long calcDmgMax; - - if(magic && ret.skill != 0) { // thanks onechord for noticing a few false positives stemming from maxdmg as 0 + + if (magic && ret.skill != 0) { // thanks onechord for noticing a few false positives stemming from maxdmg as 0 calcDmgMax = (long) (Math.ceil((chr.getTotalMagic() * Math.ceil(chr.getTotalMagic() / 1000.0) + chr.getTotalMagic()) / 30.0) + Math.ceil(chr.getTotalInt() / 200.0)); - } else if(ret.skill == 4001344 || ret.skill == NightWalker.LUCKY_SEVEN || ret.skill == NightLord.TRIPLE_THROW) { + } else if (ret.skill == 4001344 || ret.skill == NightWalker.LUCKY_SEVEN || ret.skill == NightLord.TRIPLE_THROW) { calcDmgMax = (long) ((chr.getTotalLuk() * 5) * Math.ceil(chr.getTotalWatk() / 100.0)); - } else if(ret.skill == DragonKnight.DRAGON_ROAR) { + } else if (ret.skill == DragonKnight.DRAGON_ROAR) { calcDmgMax = (long) ((chr.getTotalStr() * 4 + chr.getTotalDex()) * Math.ceil(chr.getTotalWatk() / 100.0)); - } else if(ret.skill == NightLord.VENOMOUS_STAR || ret.skill == Shadower.VENOMOUS_STAB) { + } else if (ret.skill == NightLord.VENOMOUS_STAR || ret.skill == Shadower.VENOMOUS_STAB) { calcDmgMax = (long) (Math.ceil((18.5 * (chr.getTotalStr() + chr.getTotalLuk()) + chr.getTotalDex() * 2) / 100.0) * chr.calculateMaxBaseDamage(chr.getTotalWatk())); } else { calcDmgMax = chr.calculateMaxBaseDamage(chr.getTotalWatk()); } - if(ret.skill != 0) { + if (ret.skill != 0) { Skill skill = SkillFactory.getSkill(ret.skill); StatEffect effect = skill.getEffect(ret.skilllevel); if (magic) { // Since the skill is magic based, use the magic formula - if(chr.getJob() == Job.IL_ARCHMAGE || chr.getJob() == Job.IL_MAGE) { + if (chr.getJob() == Job.IL_ARCHMAGE || chr.getJob() == Job.IL_MAGE) { int skillLvl = chr.getSkillLevel(ILMage.ELEMENT_AMPLIFICATION); - if(skillLvl > 0) + if (skillLvl > 0) { calcDmgMax = calcDmgMax * SkillFactory.getSkill(ILMage.ELEMENT_AMPLIFICATION).getEffect(skillLvl).getY() / 100; - } else if(chr.getJob() == Job.FP_ARCHMAGE || chr.getJob() == Job.FP_MAGE) { + } + } else if (chr.getJob() == Job.FP_ARCHMAGE || chr.getJob() == Job.FP_MAGE) { int skillLvl = chr.getSkillLevel(FPMage.ELEMENT_AMPLIFICATION); - if(skillLvl > 0) + if (skillLvl > 0) { calcDmgMax = calcDmgMax * SkillFactory.getSkill(FPMage.ELEMENT_AMPLIFICATION).getEffect(skillLvl).getY() / 100; - } else if(chr.getJob() == Job.BLAZEWIZARD3 || chr.getJob() == Job.BLAZEWIZARD4) { + } + } else if (chr.getJob() == Job.BLAZEWIZARD3 || chr.getJob() == Job.BLAZEWIZARD4) { int skillLvl = chr.getSkillLevel(BlazeWizard.ELEMENT_AMPLIFICATION); - if(skillLvl > 0) + if (skillLvl > 0) { calcDmgMax = calcDmgMax * SkillFactory.getSkill(BlazeWizard.ELEMENT_AMPLIFICATION).getEffect(skillLvl).getY() / 100; - } else if(chr.getJob() == Job.EVAN7 || chr.getJob() == Job.EVAN8 || chr.getJob() == Job.EVAN9 || chr.getJob() == Job.EVAN10) { + } + } else if (chr.getJob() == Job.EVAN7 || chr.getJob() == Job.EVAN8 || chr.getJob() == Job.EVAN9 || chr.getJob() == Job.EVAN10) { int skillLvl = chr.getSkillLevel(Evan.MAGIC_AMPLIFICATION); - if(skillLvl > 0) + if (skillLvl > 0) { calcDmgMax = calcDmgMax * SkillFactory.getSkill(Evan.MAGIC_AMPLIFICATION).getEffect(skillLvl).getY() / 100; + } } - + calcDmgMax *= effect.getMatk(); - if(ret.skill == Cleric.HEAL) { + if (ret.skill == Cleric.HEAL) { // This formula is still a bit wonky, but it is fairly accurate. calcDmgMax = (int) Math.round((chr.getTotalInt() * 4.8 + chr.getTotalLuk() * 4) * chr.getTotalMagic() / 1000); - calcDmgMax = calcDmgMax * effect.getHp() / 100; - + calcDmgMax = calcDmgMax * effect.getHp() / 100; + ret.speed = 7; } - } else if(ret.skill == Hermit.SHADOW_MESO) { + } else if (ret.skill == Hermit.SHADOW_MESO) { // Shadow Meso also has its own formula calcDmgMax = effect.getMoneyCon() * 10; calcDmgMax = (int) Math.floor(calcDmgMax * 1.5); @@ -662,108 +678,106 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { } Integer comboBuff = chr.getBuffedValue(BuffStat.COMBO); - if(comboBuff != null && comboBuff > 0) { + if (comboBuff != null && comboBuff > 0) { int oid = chr.isCygnus() ? DawnWarrior.COMBO : Crusader.COMBO; int advcomboid = chr.isCygnus() ? DawnWarrior.ADVANCED_COMBO : Hero.ADVANCED_COMBO; - - if(comboBuff > 6) { + + if (comboBuff > 6) { // Advanced Combo StatEffect ceffect = SkillFactory.getSkill(advcomboid).getEffect(chr.getSkillLevel(advcomboid)); calcDmgMax = (long) Math.floor(calcDmgMax * (ceffect.getDamage() + 50) / 100 + 0.20 + (comboBuff - 5) * 0.04); } else { // Normal Combo int skillLv = chr.getSkillLevel(oid); - if(skillLv <= 0 || chr.isGM()) skillLv = SkillFactory.getSkill(oid).getMaxLevel(); - - if(skillLv > 0) { + if (skillLv <= 0 || chr.isGM()) { + skillLv = SkillFactory.getSkill(oid).getMaxLevel(); + } + + if (skillLv > 0) { StatEffect ceffect = SkillFactory.getSkill(oid).getEffect(skillLv); calcDmgMax = (long) Math.floor(calcDmgMax * (ceffect.getDamage() + 50) / 100 + Math.floor((comboBuff - 1) * (skillLv / 6)) / 100); } } - - if(GameConstants.isFinisherSkill(ret.skill)) { + + if (GameConstants.isFinisherSkill(ret.skill)) { // Finisher skills do more damage based on how many orbs the player has. int orbs = comboBuff - 1; - if(orbs == 2) + if (orbs == 2) { calcDmgMax *= 1.2; - else if(orbs == 3) + } else if (orbs == 3) { calcDmgMax *= 1.54; - else if(orbs == 4) + } else if (orbs == 4) { calcDmgMax *= 2; - else if(orbs >= 5) + } else if (orbs >= 5) { calcDmgMax *= 2.5; + } } } - - if(chr.getEnergyBar() == 15000) { + + if (chr.getEnergyBar() == 15000) { int energycharge = chr.isCygnus() ? ThunderBreaker.ENERGY_CHARGE : Marauder.ENERGY_CHARGE; StatEffect ceffect = SkillFactory.getSkill(energycharge).getEffect(chr.getSkillLevel(energycharge)); calcDmgMax *= (100 + ceffect.getDamage()) / 100; } - + int bonusDmgBuff = 100; for (PlayerBuffValueHolder pbvh : chr.getAllBuffs()) { int bonusDmg = pbvh.effect.getDamage() - 100; bonusDmgBuff += bonusDmg; } - + if (bonusDmgBuff != 100) { float dmgBuff = bonusDmgBuff / 100.0f; calcDmgMax = (long) Math.ceil(calcDmgMax * dmgBuff); } - - if(chr.getMapId() >= 914000000 && chr.getMapId() <= 914000500) { + + if (chr.getMapId() >= 914000000 && chr.getMapId() <= 914000500) { calcDmgMax += 80000; // Aran Tutorial. } - boolean canCrit = false; - if(chr.getJob().isA((Job.BOWMAN)) || chr.getJob().isA(Job.THIEF) || chr.getJob().isA(Job.NIGHTWALKER1) || chr.getJob().isA(Job.WINDARCHER1) || chr.getJob() == Job.ARAN3 || chr.getJob() == Job.ARAN4 || chr.getJob() == Job.MARAUDER || chr.getJob() == Job.BUCCANEER) { - canCrit = true; - } - - if(chr.getBuffEffect(BuffStat.SHARP_EYES) != null) { + boolean canCrit = chr.getJob().isA((Job.BOWMAN)) || chr.getJob().isA(Job.THIEF) || chr.getJob().isA(Job.NIGHTWALKER1) || chr.getJob().isA(Job.WINDARCHER1) || chr.getJob() == Job.ARAN3 || chr.getJob() == Job.ARAN4 || chr.getJob() == Job.MARAUDER || chr.getJob() == Job.BUCCANEER; + + if (chr.getBuffEffect(BuffStat.SHARP_EYES) != null) { // Any class that has sharp eyes can crit. Also, since it stacks with normal crit go ahead // and calc it in. canCrit = true; calcDmgMax *= 1.4; } - - boolean shadowPartner = false; - if(chr.getBuffEffect(BuffStat.SHADOWPARTNER) != null) { - shadowPartner = true; - } - - if(ret.skill != 0) { + + boolean shadowPartner = chr.getBuffEffect(BuffStat.SHADOWPARTNER) != null; + + if (ret.skill != 0) { int fixed = ret.getAttackEffect(chr, SkillFactory.getSkill(ret.skill)).getFixDamage(); - if(fixed > 0) + if (fixed > 0) { calcDmgMax = fixed; + } } for (int i = 0; i < ret.numAttacked; i++) { int oid = p.readInt(); p.skip(14); List allDamageNumbers = new ArrayList<>(); Monster monster = chr.getMap().getMonsterByOid(oid); - - if(chr.getBuffEffect(BuffStat.WK_CHARGE) != null) { + + if (chr.getBuffEffect(BuffStat.WK_CHARGE) != null) { // Charge, so now we need to check elemental effectiveness int sourceID = chr.getBuffSource(BuffStat.WK_CHARGE); int level = chr.getBuffedValue(BuffStat.WK_CHARGE); - if(monster != null) { - if(sourceID == WhiteKnight.BW_FIRE_CHARGE || sourceID == WhiteKnight.SWORD_FIRE_CHARGE) { - if(monster.getStats().getEffectiveness(Element.FIRE) == ElementalEffectiveness.WEAK) { + if (monster != null) { + if (sourceID == WhiteKnight.BW_FIRE_CHARGE || sourceID == WhiteKnight.SWORD_FIRE_CHARGE) { + if (monster.getStats().getEffectiveness(Element.FIRE) == ElementalEffectiveness.WEAK) { calcDmgMax *= 1.05 + level * 0.015; } - } else if(sourceID == WhiteKnight.BW_ICE_CHARGE || sourceID == WhiteKnight.SWORD_ICE_CHARGE) { - if(monster.getStats().getEffectiveness(Element.ICE) == ElementalEffectiveness.WEAK) { + } else if (sourceID == WhiteKnight.BW_ICE_CHARGE || sourceID == WhiteKnight.SWORD_ICE_CHARGE) { + if (monster.getStats().getEffectiveness(Element.ICE) == ElementalEffectiveness.WEAK) { calcDmgMax *= 1.05 + level * 0.015; } - } else if(sourceID == WhiteKnight.BW_LIT_CHARGE || sourceID == WhiteKnight.SWORD_LIT_CHARGE) { - if(monster.getStats().getEffectiveness(Element.LIGHTING) == ElementalEffectiveness.WEAK) { + } else if (sourceID == WhiteKnight.BW_LIT_CHARGE || sourceID == WhiteKnight.SWORD_LIT_CHARGE) { + if (monster.getStats().getEffectiveness(Element.LIGHTING) == ElementalEffectiveness.WEAK) { calcDmgMax *= 1.05 + level * 0.015; } - } else if(sourceID == Paladin.BW_HOLY_CHARGE || sourceID == Paladin.SWORD_HOLY_CHARGE) { - if(monster.getStats().getEffectiveness(Element.HOLY) == ElementalEffectiveness.WEAK) { + } else if (sourceID == Paladin.BW_HOLY_CHARGE || sourceID == Paladin.SWORD_HOLY_CHARGE) { + if (monster.getStats().getEffectiveness(Element.HOLY) == ElementalEffectiveness.WEAK) { calcDmgMax *= 1.2 + level * 0.015; } } @@ -773,92 +787,95 @@ public abstract class AbstractDealDamageHandler extends AbstractPacketHandler { calcDmgMax *= 1.5; } } - - if(ret.skill != 0) { - Skill skill = SkillFactory.getSkill(ret.skill); - if(skill.getElement() != Element.NEUTRAL && chr.getBuffedValue(BuffStat.ELEMENTAL_RESET) == null) { - // The skill has an element effect, so we need to factor that in. - if(monster != null) { - ElementalEffectiveness eff = monster.getElementalEffectiveness(skill.getElement()); - if(eff == ElementalEffectiveness.WEAK) { - calcDmgMax *= 1.5; - } else if(eff == ElementalEffectiveness.STRONG) { - //calcDmgMax *= 0.5; - } - } else { - // Since we already know the skill has an elemental attribute, but we dont know if the monster is weak or not, lets - // take the safe approach and just assume they are weak. + + if (ret.skill != 0) { + Skill skill = SkillFactory.getSkill(ret.skill); + if (skill.getElement() != Element.NEUTRAL && chr.getBuffedValue(BuffStat.ELEMENTAL_RESET) == null) { + // The skill has an element effect, so we need to factor that in. + if (monster != null) { + ElementalEffectiveness eff = monster.getElementalEffectiveness(skill.getElement()); + if (eff == ElementalEffectiveness.WEAK) { calcDmgMax *= 1.5; + } else if (eff == ElementalEffectiveness.STRONG) { + //calcDmgMax *= 0.5; + } + } else { + // Since we already know the skill has an elemental attribute, but we dont know if the monster is weak or not, lets + // take the safe approach and just assume they are weak. + calcDmgMax *= 1.5; + } + } + if (ret.skill == FPWizard.POISON_BREATH || ret.skill == FPMage.POISON_MIST || ret.skill == FPArchMage.FIRE_DEMON || ret.skill == ILArchMage.ICE_DEMON) { + if (monster != null) { + // Turns out poison is completely server side, so I don't know why I added this. >.< + //calcDmgMax = monster.getHp() / (70 - chr.getSkillLevel(skill)); + } + } else if (ret.skill == Hermit.SHADOW_WEB) { + if (monster != null) { + calcDmgMax = monster.getHp() / (50 - chr.getSkillLevel(skill)); + } + } else if (ret.skill == Hermit.SHADOW_MESO) { + if (monster != null) { + monster.debuffMob(Hermit.SHADOW_MESO); + } + } else if (ret.skill == Aran.BODY_PRESSURE) { + if (monster != null) { + int bodyPressureDmg = (int) Math.ceil(monster.getMaxHp() * SkillFactory.getSkill(Aran.BODY_PRESSURE).getEffect(ret.skilllevel).getDamage() / 100.0); + if (bodyPressureDmg > calcDmgMax) { + calcDmgMax = bodyPressureDmg; } } - if(ret.skill == FPWizard.POISON_BREATH || ret.skill == FPMage.POISON_MIST || ret.skill == FPArchMage.FIRE_DEMON || ret.skill == ILArchMage.ICE_DEMON) { - if(monster != null) { - // Turns out poison is completely server side, so I don't know why I added this. >.< - //calcDmgMax = monster.getHp() / (70 - chr.getSkillLevel(skill)); - } - } else if(ret.skill == Hermit.SHADOW_WEB) { - if(monster != null) { - calcDmgMax = monster.getHp() / (50 - chr.getSkillLevel(skill)); - } - } else if(ret.skill == Hermit.SHADOW_MESO) { - if(monster != null) { - monster.debuffMob(Hermit.SHADOW_MESO); - } - } else if (ret.skill == Aran.BODY_PRESSURE) { - if (monster != null) { - int bodyPressureDmg = (int) Math.ceil(monster.getMaxHp() * SkillFactory.getSkill(Aran.BODY_PRESSURE).getEffect(ret.skilllevel).getDamage() / 100.0); - if (bodyPressureDmg > calcDmgMax) { - calcDmgMax = bodyPressureDmg; - } - } - } + } } - + for (int j = 0; j < ret.numDamage; j++) { - int damage = p.readInt(); - long hitDmgMax = calcDmgMax; - if(ret.skill == Buccaneer.BARRAGE || ret.skill == ThunderBreaker.BARRAGE) { - if(j > 3) - hitDmgMax *= Math.pow(2, (j - 3)); + int damage = p.readInt(); + long hitDmgMax = calcDmgMax; + if (ret.skill == Buccaneer.BARRAGE || ret.skill == ThunderBreaker.BARRAGE) { + if (j > 3) { + hitDmgMax *= Math.pow(2, (j - 3)); } - if(shadowPartner) { - // For shadow partner, the second half of the hits only do 50% damage. So calc that - // in for the crit effects. - if(j >= ret.numDamage / 2) { - hitDmgMax *= 0.5; - } + } + if (shadowPartner) { + // For shadow partner, the second half of the hits only do 50% damage. So calc that + // in for the crit effects. + if (j >= ret.numDamage / 2) { + hitDmgMax *= 0.5; } + } - if(ret.skill == Marksman.SNIPE) { - damage = 195000 + Randomizer.nextInt(5000); - hitDmgMax = 200000; - } else if (ret.skill == Beginner.BAMBOO_RAIN || ret.skill == Noblesse.BAMBOO_RAIN || ret.skill == Evan.BAMBOO_THRUST || ret.skill == Legend.BAMBOO_THRUST) { - hitDmgMax = 82569000; // 30% of Max HP of strongest Dojo boss - } + if (ret.skill == Marksman.SNIPE) { + damage = 195000 + Randomizer.nextInt(5000); + hitDmgMax = 200000; + } else if (ret.skill == Beginner.BAMBOO_RAIN || ret.skill == Noblesse.BAMBOO_RAIN || ret.skill == Evan.BAMBOO_THRUST || ret.skill == Legend.BAMBOO_THRUST) { + hitDmgMax = 82569000; // 30% of Max HP of strongest Dojo boss + } - long maxWithCrit = hitDmgMax; - if(canCrit) // They can crit, so up the max. - maxWithCrit *= 2; - - // Warn if the damage is over 1.5x what we calculated above. - if(damage > maxWithCrit * 1.5) { - AutobanFactory.DAMAGE_HACK.alert(chr, "DMG: " + damage + " MaxDMG: " + maxWithCrit + " SID: " + ret.skill + " MobID: " + (monster != null ? monster.getId() : "null") + " Map: " + chr.getMap().getMapName() + " (" + chr.getMapId() + ")"); - } + long maxWithCrit = hitDmgMax; + if (canCrit) // They can crit, so up the max. + { + maxWithCrit *= 2; + } - // Add a ab point if its over 5x what we calculated. - if(damage > maxWithCrit * 5) { - AutobanFactory.DAMAGE_HACK.addPoint(chr.getAutobanManager(), "DMG: " + damage + " MaxDMG: " + maxWithCrit + " SID: " + ret.skill + " MobID: " + (monster != null ? monster.getId() : "null") + " Map: " + chr.getMap().getMapName() + " (" + chr.getMapId() + ")"); - } + // Warn if the damage is over 1.5x what we calculated above. + if (damage > maxWithCrit * 1.5) { + AutobanFactory.DAMAGE_HACK.alert(chr, "DMG: " + damage + " MaxDMG: " + maxWithCrit + " SID: " + ret.skill + " MobID: " + (monster != null ? monster.getId() : "null") + " Map: " + chr.getMap().getMapName() + " (" + chr.getMapId() + ")"); + } - if (ret.skill == Marksman.SNIPE || (canCrit && damage > hitDmgMax)) { - // If the skill is a crit, inverse the damage to make it show up on clients. - damage = -Integer.MAX_VALUE + damage - 1; - } + // Add a ab point if its over 5x what we calculated. + if (damage > maxWithCrit * 5) { + AutobanFactory.DAMAGE_HACK.addPoint(chr.getAutobanManager(), "DMG: " + damage + " MaxDMG: " + maxWithCrit + " SID: " + ret.skill + " MobID: " + (monster != null ? monster.getId() : "null") + " Map: " + chr.getMap().getMapName() + " (" + chr.getMapId() + ")"); + } - allDamageNumbers.add(damage); + if (ret.skill == Marksman.SNIPE || (canCrit && damage > hitDmgMax)) { + // If the skill is a crit, inverse the damage to make it show up on clients. + damage = -Integer.MAX_VALUE + damage - 1; + } + + allDamageNumbers.add(damage); } if (ret.skill != Corsair.RAPID_FIRE || ret.skill != Aran.HIDDEN_FULL_DOUBLE || ret.skill != Aran.HIDDEN_FULL_TRIPLE || ret.skill != Aran.HIDDEN_OVER_DOUBLE || ret.skill != Aran.HIDDEN_OVER_TRIPLE) { - p.skip(4); + p.skip(4); } ret.allDamage.put(oid, allDamageNumbers); } diff --git a/src/main/java/net/server/channel/handlers/AbstractMovementPacketHandler.java b/src/main/java/net/server/channel/handlers/AbstractMovementPacketHandler.java index d68d9b0cb9..ef61e81842 100644 --- a/src/main/java/net/server/channel/handlers/AbstractMovementPacketHandler.java +++ b/src/main/java/net/server/channel/handlers/AbstractMovementPacketHandler.java @@ -36,7 +36,9 @@ public abstract class AbstractMovementPacketHandler extends AbstractPacketHandle protected List parseMovement(InPacket p) throws EmptyMovementException { List res = new ArrayList<>(); byte numCommands = p.readByte(); - if (numCommands < 1) throw new EmptyMovementException(p); + if (numCommands < 1) { + throw new EmptyMovementException(p); + } for (byte i = 0; i < numCommands; i++) { byte command = p.readByte(); switch (command) { @@ -138,24 +140,26 @@ public abstract class AbstractMovementPacketHandler extends AbstractPacketHandle throw new EmptyMovementException(p); } } - + if (res.isEmpty()) { throw new EmptyMovementException(p); } return res; } - + protected void updatePosition(InPacket p, AnimatedMapObject target, int yOffset) throws EmptyMovementException { - + byte numCommands = p.readByte(); - if (numCommands < 1) throw new EmptyMovementException(p); + if (numCommands < 1) { + throw new EmptyMovementException(p); + } for (byte i = 0; i < numCommands; i++) { byte command = p.readByte(); switch (command) { case 0: // normal move case 5: case 17: { // Float - //Absolute movement - only this is important for the server, other movement can be passed to the client + //Absolute movement - only this is important for the server, other movement can be passed to the client short xpos = p.readShort(); //is signed fine here? short ypos = p.readShort(); target.setPosition(new Point(xpos, ypos + yOffset)); @@ -175,8 +179,8 @@ public abstract class AbstractMovementPacketHandler extends AbstractPacketHandle case 19: // Springs on maps case 20: // Aran Combat Step case 22: { - //Relative movement - server only cares about stance - p.skip(4); //xpos = lea.readShort(); ypos = lea.readShort(); + //Relative movement - server only cares about stance + p.skip(4); //xpos = lea.readShort(); ypos = lea.readShort(); byte newstate = p.readByte(); target.setStance(newstate); p.readShort(); //duration @@ -190,8 +194,8 @@ public abstract class AbstractMovementPacketHandler extends AbstractPacketHandle case 11: //chair { // case 14: { - //Teleport movement - same as above - p.skip(8); //xpos = lea.readShort(); ypos = lea.readShort(); xwobble = lea.readShort(); ywobble = lea.readShort(); + //Teleport movement - same as above + p.skip(8); //xpos = lea.readShort(); ypos = lea.readShort(); xwobble = lea.readShort(); ywobble = lea.readShort(); byte newstate = p.readByte(); target.setStance(newstate); break; @@ -215,8 +219,8 @@ public abstract class AbstractMovementPacketHandler extends AbstractPacketHandle break; }*/ case 15: { - //Jump down movement - stance only - p.skip(12); //short xpos = lea.readShort(); ypos = lea.readShort(); xwobble = lea.readShort(); ywobble = lea.readShort(); fh = lea.readShort(); ofh = lea.readShort(); + //Jump down movement - stance only + p.skip(12); //short xpos = lea.readShort(); ypos = lea.readShort(); xwobble = lea.readShort(); ywobble = lea.readShort(); fh = lea.readShort(); ofh = lea.readShort(); byte newstate = p.readByte(); target.setStance(newstate); p.readShort(); // duration diff --git a/src/main/java/net/server/channel/handlers/AcceptFamilyHandler.java b/src/main/java/net/server/channel/handlers/AcceptFamilyHandler.java index ee67d1d76e..b67a3166b5 100644 --- a/src/main/java/net/server/channel/handlers/AcceptFamilyHandler.java +++ b/src/main/java/net/server/channel/handlers/AcceptFamilyHandler.java @@ -41,7 +41,6 @@ import java.sql.PreparedStatement; import java.sql.SQLException; /** - * * @author Jay Estrella * @author Ubaware */ @@ -49,7 +48,7 @@ public final class AcceptFamilyHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { - if(!YamlConfig.config.server.USE_FAMILY_SYSTEM) { + if (!YamlConfig.config.server.USE_FAMILY_SYSTEM) { return; } Character chr = c.getPlayer(); @@ -58,15 +57,17 @@ public final class AcceptFamilyHandler extends AbstractPacketHandler { boolean accept = p.readByte() != 0; // String inviterName = slea.readMapleAsciiString(); Character inviter = c.getWorldServer().getPlayerStorage().getCharacterById(inviterId); - if(inviter != null) { + if (inviter != null) { InviteResult inviteResult = InviteCoordinator.answerInvite(InviteType.FAMILY, c.getPlayer().getId(), c.getPlayer(), accept); - if(inviteResult.result == InviteResultType.NOT_FOUND) return; //was never invited. (or expired on server only somehow?) - if(accept) { - if(inviter.getFamily() != null) { - if(chr.getFamily() == null) { + if (inviteResult.result == InviteResultType.NOT_FOUND) { + return; //was never invited. (or expired on server only somehow?) + } + if (accept) { + if (inviter.getFamily() != null) { + if (chr.getFamily() == null) { FamilyEntry newEntry = new FamilyEntry(inviter.getFamily(), chr.getId(), chr.getName(), chr.getLevel(), chr.getJob()); newEntry.setCharacter(chr); - if(!newEntry.setSenior(inviter.getFamilyEntry(), true)) { + if (!newEntry.setSenior(inviter.getFamilyEntry(), true)) { inviter.sendPacket(PacketCreator.sendFamilyMessage(1, 0)); return; } else { @@ -77,8 +78,10 @@ public final class AcceptFamilyHandler extends AbstractPacketHandler { } else { //absorb target family FamilyEntry targetEntry = chr.getFamilyEntry(); Family targetFamily = targetEntry.getFamily(); - if(targetFamily.getLeader() != targetEntry) return; - if(inviter.getFamily().getTotalGenerations() + targetFamily.getTotalGenerations() <= YamlConfig.config.server.FAMILY_MAX_GENERATIONS) { + if (targetFamily.getLeader() != targetEntry) { + return; + } + if (inviter.getFamily().getTotalGenerations() + targetFamily.getTotalGenerations() <= YamlConfig.config.server.FAMILY_MAX_GENERATIONS) { targetEntry.join(inviter.getFamilyEntry()); } else { inviter.sendPacket(PacketCreator.sendFamilyMessage(76, 0)); @@ -87,7 +90,7 @@ public final class AcceptFamilyHandler extends AbstractPacketHandler { } } } else { // create new family - if(chr.getFamily() != null && inviter.getFamily() != null && chr.getFamily().getTotalGenerations() + inviter.getFamily().getTotalGenerations() >= YamlConfig.config.server.FAMILY_MAX_GENERATIONS) { + if (chr.getFamily() != null && inviter.getFamily() != null && chr.getFamily().getTotalGenerations() + inviter.getFamily().getTotalGenerations() >= YamlConfig.config.server.FAMILY_MAX_GENERATIONS) { inviter.sendPacket(PacketCreator.sendFamilyMessage(76, 0)); chr.sendPacket(PacketCreator.sendFamilyMessage(76, 0)); return; @@ -96,9 +99,9 @@ public final class AcceptFamilyHandler extends AbstractPacketHandler { c.getWorldServer().addFamily(newFamily.getID(), newFamily); FamilyEntry inviterEntry = new FamilyEntry(newFamily, inviter.getId(), inviter.getName(), inviter.getLevel(), inviter.getJob()); inviterEntry.setCharacter(inviter); - newFamily.setLeader(inviter.getFamilyEntry()); + newFamily.setLeader(inviter.getFamilyEntry()); newFamily.addEntry(inviterEntry); - if(chr.getFamily() == null) { //completely new family + if (chr.getFamily() == null) { //completely new family FamilyEntry newEntry = new FamilyEntry(newFamily, chr.getId(), chr.getName(), chr.getLevel(), chr.getJob()); newEntry.setCharacter(chr); newEntry.setSenior(inviterEntry, true); @@ -107,7 +110,7 @@ public final class AcceptFamilyHandler extends AbstractPacketHandler { insertNewFamilyRecord(chr.getId(), newFamily.getID(), inviter.getId(), false); // char was already saved from setSenior() above newFamily.setMessage("", true); } else { //new family for inviter, absorb invitee family - insertNewFamilyRecord(inviter.getId(), newFamily.getID(), 0 , true); + insertNewFamilyRecord(inviter.getId(), newFamily.getID(), 0, true); newFamily.setMessage("", true); chr.getFamilyEntry().join(inviterEntry); } @@ -124,27 +127,27 @@ public final class AcceptFamilyHandler extends AbstractPacketHandler { } private static void insertNewFamilyRecord(int characterID, int familyID, int seniorID, boolean updateChar) { - try(Connection con = DatabaseConnection.getConnection()) { - try(PreparedStatement ps = con.prepareStatement("INSERT INTO family_character (cid, familyid, seniorid) VALUES (?, ?, ?)")) { + try (Connection con = DatabaseConnection.getConnection()) { + try (PreparedStatement ps = con.prepareStatement("INSERT INTO family_character (cid, familyid, seniorid) VALUES (?, ?, ?)")) { ps.setInt(1, characterID); ps.setInt(2, familyID); ps.setInt(3, seniorID); ps.executeUpdate(); - } catch(SQLException e) { + } catch (SQLException e) { FilePrinter.printError(FilePrinter.FAMILY_ERROR, e, "Could not save new family record for char id " + characterID + "."); e.printStackTrace(); } - if(updateChar) { - try(PreparedStatement ps = con.prepareStatement("UPDATE characters SET familyid = ? WHERE id = ?")) { + if (updateChar) { + try (PreparedStatement ps = con.prepareStatement("UPDATE characters SET familyid = ? WHERE id = ?")) { ps.setInt(1, familyID); ps.setInt(2, characterID); ps.executeUpdate(); - } catch(SQLException e) { + } catch (SQLException e) { FilePrinter.printError(FilePrinter.FAMILY_ERROR, e, "Could not update 'characters' 'familyid' record for char id " + characterID + "."); e.printStackTrace(); } } - } catch(SQLException e) { + } catch (SQLException e) { FilePrinter.printError(FilePrinter.FAMILY_ERROR, e, "Could not get connection to DB."); e.printStackTrace(); } diff --git a/src/main/java/net/server/channel/handlers/AdminChatHandler.java b/src/main/java/net/server/channel/handlers/AdminChatHandler.java index e61aa87996..44a1de029a 100644 --- a/src/main/java/net/server/channel/handlers/AdminChatHandler.java +++ b/src/main/java/net/server/channel/handlers/AdminChatHandler.java @@ -9,7 +9,6 @@ import tools.LogHelper; import tools.PacketCreator; /** - * * @author kevintjuh93 */ public class AdminChatHandler extends AbstractPacketHandler { diff --git a/src/main/java/net/server/channel/handlers/AdminCommandHandler.java b/src/main/java/net/server/channel/handlers/AdminCommandHandler.java index cd44b35b28..147556bfee 100644 --- a/src/main/java/net/server/channel/handlers/AdminCommandHandler.java +++ b/src/main/java/net/server/channel/handlers/AdminCommandHandler.java @@ -75,10 +75,10 @@ public final class AdminCommandHandler extends AbstractPacketHandler { c.getPlayer().setExp(p.readInt()); break; case 0x03: // /ban - c.getPlayer().yellowMessage("Please use !ban "); - break; + c.getPlayer().yellowMessage("Please use !ban "); + break; case 0x04: // /block - victim = p.readString(); + victim = p.readString(); int type = p.readByte(); //reason int duration = p.readInt(); String description = p.readString(); @@ -176,7 +176,7 @@ public final class AdminCommandHandler extends AbstractPacketHandler { } break; default: - System.out.println("New GM packet encountered (MODE : " + mode + ": " + p.toString()); + System.out.println("New GM packet encountered (MODE : " + mode + ": " + p); break; } } diff --git a/src/main/java/net/server/channel/handlers/AllianceOperationHandler.java b/src/main/java/net/server/channel/handlers/AllianceOperationHandler.java index a0f1ae16d8..86b2a8fc88 100644 --- a/src/main/java/net/server/channel/handlers/AllianceOperationHandler.java +++ b/src/main/java/net/server/channel/handlers/AllianceOperationHandler.java @@ -33,7 +33,6 @@ import net.server.guild.GuildPackets; import tools.PacketCreator; /** - * * @author XoticStory, Ronan */ public final class AllianceOperationHandler extends AbstractPacketHandler { @@ -42,16 +41,16 @@ public final class AllianceOperationHandler extends AbstractPacketHandler { public final void handlePacket(InPacket p, Client c) { Alliance alliance = null; Character chr = c.getPlayer(); - + if (chr.getGuild() == null) { c.sendPacket(PacketCreator.enableActions()); return; } - + if (chr.getGuild().getAllianceId() > 0) { alliance = chr.getAlliance(); } - + byte b = p.readByte(); if (alliance == null) { if (b != 4) { @@ -64,13 +63,13 @@ public final class AllianceOperationHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.enableActions()); return; } - + if (chr.getMGC().getAllianceRank() > 2 || !alliance.getGuilds().contains(chr.getGuildId())) { c.sendPacket(PacketCreator.enableActions()); return; } } - + // "alliance" is only null at case 0x04 switch (b) { case 0x01: @@ -80,61 +79,61 @@ public final class AllianceOperationHandler extends AbstractPacketHandler { if (chr.getGuild().getAllianceId() == 0 || chr.getGuildId() < 1 || chr.getGuildRank() != 1) { return; } - + Alliance.removeGuildFromAlliance(chr.getGuild().getAllianceId(), chr.getGuildId(), chr.getWorld()); break; } case 0x03: // Send Invite String guildName = p.readString(); - + if (alliance.getGuilds().size() == alliance.getCapacity()) { chr.dropMessage(5, "Your alliance cannot comport any more guilds at the moment."); } else { Alliance.sendInvitation(c, guildName, alliance.getId()); } - + break; case 0x04: { // Accept Invite Guild guild = chr.getGuild(); if (guild.getAllianceId() != 0 || chr.getGuildRank() != 1 || chr.getGuildId() < 1) { return; } - + int allianceid = p.readInt(); //slea.readMapleAsciiString(); //recruiter's guild name - + alliance = Server.getInstance().getAlliance(allianceid); if (alliance == null) { return; } - + if (!Alliance.answerInvitation(c.getPlayer().getId(), guild.getName(), alliance.getId(), true)) { return; } - + if (alliance.getGuilds().size() == alliance.getCapacity()) { chr.dropMessage(5, "Your alliance cannot comport any more guilds at the moment."); return; } - + int guildid = chr.getGuildId(); Server.getInstance().addGuildtoAlliance(alliance.getId(), guildid); Server.getInstance().resetAllianceGuildPlayersRank(guildid); - + chr.getMGC().setAllianceRank(2); Guild g = Server.getInstance().getGuild(chr.getGuildId()); if (g != null) { g.getMGC(chr.getId()).setAllianceRank(2); } - + chr.saveGuildStatus(); Server.getInstance().allianceMessage(alliance.getId(), GuildPackets.addGuildToAlliance(alliance, guildid, c), -1, -1); Server.getInstance().allianceMessage(alliance.getId(), GuildPackets.updateAllianceInfo(alliance, c.getWorld()), -1, -1); Server.getInstance().allianceMessage(alliance.getId(), GuildPackets.allianceNotice(alliance.getId(), alliance.getNotice()), -1, -1); guild.dropMessage("Your guild has joined the [" + alliance.getName() + "] union."); - + break; } case 0x06: { // Expel Guild @@ -143,14 +142,14 @@ public final class AllianceOperationHandler extends AbstractPacketHandler { if (chr.getGuild().getAllianceId() == 0 || chr.getGuild().getAllianceId() != allianceid) { return; } - + Server.getInstance().allianceMessage(alliance.getId(), GuildPackets.removeGuildFromAlliance(alliance, guildid, c.getWorld()), -1, -1); Server.getInstance().removeGuildFromAlliance(alliance.getId(), guildid); - + Server.getInstance().allianceMessage(alliance.getId(), GuildPackets.getGuildAlliances(alliance, c.getWorld()), -1, -1); Server.getInstance().allianceMessage(alliance.getId(), GuildPackets.allianceNotice(alliance.getId(), alliance.getNotice()), -1, -1); Server.getInstance().guildMessage(guildid, GuildPackets.disbandAlliance(allianceid)); - + alliance.dropMessage("[" + Server.getInstance().getGuild(guildid).getName() + "] guild has been expelled from the union."); break; } @@ -163,7 +162,7 @@ public final class AllianceOperationHandler extends AbstractPacketHandler { if (player.getAllianceRank() != 2) { return; } - + //Server.getInstance().allianceMessage(alliance.getId(), sendChangeLeader(chr.getGuild().getAllianceId(), chr.getId(), slea.readInt()), -1, -1); changeLeaderAllianceRank(alliance, player); break; @@ -179,47 +178,49 @@ public final class AllianceOperationHandler extends AbstractPacketHandler { case 0x09: { int int1 = p.readInt(); byte byte1 = p.readByte(); - + //Server.getInstance().allianceMessage(alliance.getId(), sendChangeRank(chr.getGuild().getAllianceId(), chr.getId(), int1, byte1), -1, -1); Character player = Server.getInstance().getWorld(c.getWorld()).getPlayerStorage().getCharacterById(int1); changePlayerAllianceRank(alliance, player, (byte1 > 0)); - + break; } case 0x0A: String notice = p.readString(); Server.getInstance().setAllianceNotice(alliance.getId(), notice); Server.getInstance().allianceMessage(alliance.getId(), GuildPackets.allianceNotice(alliance.getId(), notice), -1, -1); - + alliance.dropMessage(5, "* Alliance Notice : " + notice); break; default: chr.dropMessage("Feature not available"); } - + alliance.saveToDB(); } - + private void changeLeaderAllianceRank(Alliance alliance, Character newLeader) { GuildCharacter lmgc = alliance.getLeader(); Character leader = newLeader.getWorldServer().getPlayerStorage().getCharacterById(lmgc.getId()); leader.getMGC().setAllianceRank(2); leader.saveGuildStatus(); - + newLeader.getMGC().setAllianceRank(1); newLeader.saveGuildStatus(); - + Server.getInstance().allianceMessage(alliance.getId(), GuildPackets.getGuildAlliances(alliance, newLeader.getWorld()), -1, -1); alliance.dropMessage("'" + newLeader.getName() + "' has been appointed as the new head of this Alliance."); } - + private void changePlayerAllianceRank(Alliance alliance, Character chr, boolean raise) { int newRank = chr.getAllianceRank() + (raise ? -1 : 1); - if(newRank < 3 || newRank > 5) return; - + if (newRank < 3 || newRank > 5) { + return; + } + chr.getMGC().setAllianceRank(newRank); chr.saveGuildStatus(); - + Server.getInstance().allianceMessage(alliance.getId(), GuildPackets.getGuildAlliances(alliance, chr.getWorld()), -1, -1); alliance.dropMessage("'" + chr.getName() + "' has been reassigned to '" + alliance.getRankTitle(newRank) + "' in this Alliance."); } diff --git a/src/main/java/net/server/channel/handlers/AranComboHandler.java b/src/main/java/net/server/channel/handlers/AranComboHandler.java index c7fc8d35d8..e112ec8343 100644 --- a/src/main/java/net/server/channel/handlers/AranComboHandler.java +++ b/src/main/java/net/server/channel/handlers/AranComboHandler.java @@ -39,7 +39,7 @@ public class AranComboHandler extends AbstractPacketHandler { final long currentTime = currentServerTime(); short combo = player.getCombo(); if ((currentTime - player.getLastCombo()) > 3000 && combo > 0) { - combo = 0; + combo = 0; } combo++; switch (combo) { @@ -53,7 +53,9 @@ public class AranComboHandler extends AbstractPacketHandler { case 80: case 90: case 100: - if (player.getJob().getId() != 2000 && (combo / 10) > skillLevel) break; + if (player.getJob().getId() != 2000 && (combo / 10) > skillLevel) { + break; + } SkillFactory.getSkill(Aran.COMBO_ABILITY).getEffect(combo / 10).applyComboBuff(player, combo); break; } diff --git a/src/main/java/net/server/channel/handlers/AutoAggroHandler.java b/src/main/java/net/server/channel/handlers/AutoAggroHandler.java index 6e74b114fa..5cf6609c83 100644 --- a/src/main/java/net/server/channel/handlers/AutoAggroHandler.java +++ b/src/main/java/net/server/channel/handlers/AutoAggroHandler.java @@ -33,11 +33,13 @@ public final class AutoAggroHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { Character player = c.getPlayer(); - if (player.isHidden()) return; // Don't auto aggro GM's in hide... - + if (player.isHidden()) { + return; // Don't auto aggro GM's in hide... + } + MapleMap map = player.getMap(); int oid = p.readInt(); - + Monster monster = map.getMonsterByOid(oid); if (monster != null) { monster.aggroAutoAggroUpdate(player); diff --git a/src/main/java/net/server/channel/handlers/AutoAssignHandler.java b/src/main/java/net/server/channel/handlers/AutoAssignHandler.java index fb0b3a8eb9..727a05fcd1 100644 --- a/src/main/java/net/server/channel/handlers/AutoAssignHandler.java +++ b/src/main/java/net/server/channel/handlers/AutoAssignHandler.java @@ -27,11 +27,10 @@ import net.AbstractPacketHandler; import net.packet.InPacket; /** - * * @author Generic, Ronan */ public class AutoAssignHandler extends AbstractPacketHandler { - + @Override public void handlePacket(InPacket p, Client c) { AssignAPProcessor.APAutoAssignAction(p, c); diff --git a/src/main/java/net/server/channel/handlers/BeholderHandler.java b/src/main/java/net/server/channel/handlers/BeholderHandler.java index 06280a5f97..4ce6e8d5a8 100644 --- a/src/main/java/net/server/channel/handlers/BeholderHandler.java +++ b/src/main/java/net/server/channel/handlers/BeholderHandler.java @@ -30,7 +30,6 @@ import server.maps.Summon; import java.util.Collection; /** - * * @author BubblesDev */ public final class BeholderHandler extends AbstractPacketHandler {//Summon Skills noobs diff --git a/src/main/java/net/server/channel/handlers/BuddylistModifyHandler.java b/src/main/java/net/server/channel/handlers/BuddylistModifyHandler.java index a47ab1db42..88b4453a99 100644 --- a/src/main/java/net/server/channel/handlers/BuddylistModifyHandler.java +++ b/src/main/java/net/server/channel/handlers/BuddylistModifyHandler.java @@ -40,7 +40,7 @@ import static client.BuddyList.BuddyOperation.ADDED; public class BuddylistModifyHandler extends AbstractPacketHandler { private static class CharacterIdNameBuddyCapacity extends CharacterNameAndId { - private int buddyCapacity; + private final int buddyCapacity; public CharacterIdNameBuddyCapacity(int id, String name, int buddyCapacity) { super(id, name); @@ -108,7 +108,7 @@ public class BuddylistModifyHandler extends AbstractPacketHandler { if (charWithId != null) { BuddyAddResult buddyAddResult = null; if (channel != -1) { - buddyAddResult = world.requestBuddyAdd(addName, c.getChannel(), player.getId(), player.getName()); + buddyAddResult = world.requestBuddyAdd(addName, c.getChannel(), player.getId(), player.getName()); } else { try (Connection con = DatabaseConnection.getConnection()) { try (PreparedStatement ps = con.prepareStatement("SELECT COUNT(*) as buddyCount FROM buddies WHERE characterid = ? AND pending = 0")) { diff --git a/src/main/java/net/server/channel/handlers/CancelBuffHandler.java b/src/main/java/net/server/channel/handlers/CancelBuffHandler.java index 937c97c618..a9788250b2 100644 --- a/src/main/java/net/server/channel/handlers/CancelBuffHandler.java +++ b/src/main/java/net/server/channel/handlers/CancelBuffHandler.java @@ -30,11 +30,11 @@ import net.packet.InPacket; import tools.PacketCreator; public final class CancelBuffHandler extends AbstractPacketHandler implements PacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { int sourceid = p.readInt(); - + switch (sourceid) { case FPArchMage.BIG_BANG: case ILArchMage.BIG_BANG: @@ -47,7 +47,7 @@ public final class CancelBuffHandler extends AbstractPacketHandler implements Pa case Evan.ICE_BREATH: c.getPlayer().getMap().broadcastMessage(c.getPlayer(), PacketCreator.skillCancel(c.getPlayer(), sourceid), false); break; - + default: c.getPlayer().cancelEffect(SkillFactory.getSkill(sourceid).getEffect(1), false, -1); break; diff --git a/src/main/java/net/server/channel/handlers/CancelChairHandler.java b/src/main/java/net/server/channel/handlers/CancelChairHandler.java index a2e4c312ea..e5f6a2c43f 100644 --- a/src/main/java/net/server/channel/handlers/CancelChairHandler.java +++ b/src/main/java/net/server/channel/handlers/CancelChairHandler.java @@ -27,16 +27,16 @@ import net.AbstractPacketHandler; import net.packet.InPacket; public final class CancelChairHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { int id = p.readShort(); Character mc = c.getPlayer(); - + if (id >= mc.getMap().getSeats()) { return; } - + if (c.tryacquireClient()) { try { mc.sitChair(id); diff --git a/src/main/java/net/server/channel/handlers/CashOperationHandler.java b/src/main/java/net/server/channel/handlers/CashOperationHandler.java index fa56934563..8b091e2341 100644 --- a/src/main/java/net/server/channel/handlers/CashOperationHandler.java +++ b/src/main/java/net/server/channel/handlers/CashOperationHandler.java @@ -53,12 +53,12 @@ public final class CashOperationHandler extends AbstractPacketHandler { public final void handlePacket(InPacket p, Client c) { Character chr = c.getPlayer(); CashShop cs = chr.getCashShop(); - + if (!cs.isOpened()) { c.sendPacket(PacketCreator.enableActions()); return; } - + if (c.tryacquireClient()) { // thanks Thora for finding out an exploit within cash operations try { final int action = p.readByte(); @@ -92,7 +92,7 @@ public final class CashOperationHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.showBoughtCashItem(item, c.getAccID())); } else { // Package cs.gainCash(useNX, cItem, chr.getWorld()); - + List cashPackage = CashItemFactory.getPackage(cItem.getItemId()); for (Item item : cashPackage) { cs.addToInventory(item); @@ -129,7 +129,9 @@ public final class CashOperationHandler extends AbstractPacketHandler { ex.printStackTrace(); } Character receiver = c.getChannelServer().getPlayerStorage().getCharacterByName(recipient.get("name")); - if (receiver != null) receiver.showNote(); + if (receiver != null) { + receiver.showNote(); + } } else if (action == 0x05) { // Modify wish list cs.clearWishList(); for (byte i = 0; i < 10; i++) { @@ -262,9 +264,9 @@ public final class CashOperationHandler extends AbstractPacketHandler { cs.removeFromInventory(item); c.sendPacket(PacketCreator.takeFromCashInventory(item)); - if(item instanceof Equip) { + if (item instanceof Equip) { Equip equip = (Equip) item; - if(equip.getRingId() >= 0) { + if (equip.getRingId() >= 0) { Ring ring = Ring.loadFromDb(equip.getRingId()); chr.addPlayerRing(ring); } @@ -316,7 +318,7 @@ public final class CashOperationHandler extends AbstractPacketHandler { return; }*/ //Gotta let them faggots marry too, hence why this is commented out <3 - if(itemRing.toItem() instanceof Equip) { + if (itemRing.toItem() instanceof Equip) { Equip eqp = (Equip) itemRing.toItem(); Pair rings = Ring.createRing(itemRing.getItemId(), chr, partner); eqp.setRingId(rings.getLeft()); @@ -331,7 +333,7 @@ public final class CashOperationHandler extends AbstractPacketHandler { ex.printStackTrace(); } partner.showNote(); - } + } } } else { c.sendPacket(PacketCreator.showCashShopMessage((byte) 0xC4)); @@ -377,10 +379,10 @@ public final class CashOperationHandler extends AbstractPacketHandler { String text = p.readString(); Character partner = c.getChannelServer().getPlayerStorage().getCharacterByName(sentTo); if (partner == null) { - c.sendPacket(PacketCreator.showCashShopMessage((byte)0xBE)); + c.sendPacket(PacketCreator.showCashShopMessage((byte) 0xBE)); } else { // Need to check to make sure its actually an equip and the right SN... - if(itemRing.toItem() instanceof Equip) { + if (itemRing.toItem() instanceof Equip) { Equip eqp = (Equip) itemRing.toItem(); Pair rings = Ring.createRing(itemRing.getItemId(), chr, partner); eqp.setRingId(rings.getLeft()); @@ -405,59 +407,59 @@ public final class CashOperationHandler extends AbstractPacketHandler { } else if (action == 0x2E) { //name change CashItem cItem = CashItemFactory.getItem(p.readInt()); if (cItem == null || !canBuy(chr, cItem, cs.getCash(4))) { - c.sendPacket(PacketCreator.showCashShopMessage((byte)0)); + c.sendPacket(PacketCreator.showCashShopMessage((byte) 0)); c.enableCSActions(); return; } - if(cItem.getSN() == 50600000 && YamlConfig.config.server.ALLOW_CASHSHOP_NAME_CHANGE) { + if (cItem.getSN() == 50600000 && YamlConfig.config.server.ALLOW_CASHSHOP_NAME_CHANGE) { p.readString(); //old name String newName = p.readString(); - if(!Character.canCreateChar(newName) || chr.getLevel() < 10) { //(longest ban duration isn't tracked currently) - c.sendPacket(PacketCreator.showCashShopMessage((byte)0)); + if (!Character.canCreateChar(newName) || chr.getLevel() < 10) { //(longest ban duration isn't tracked currently) + c.sendPacket(PacketCreator.showCashShopMessage((byte) 0)); c.enableCSActions(); return; - } else if(c.getTempBanCalendar() != null && c.getTempBanCalendar().getTimeInMillis() + (30*24*60*60*1000) > Calendar.getInstance().getTimeInMillis()) { - c.sendPacket(PacketCreator.showCashShopMessage((byte)0)); + } else if (c.getTempBanCalendar() != null && c.getTempBanCalendar().getTimeInMillis() + (30 * 24 * 60 * 60 * 1000) > Calendar.getInstance().getTimeInMillis()) { + c.sendPacket(PacketCreator.showCashShopMessage((byte) 0)); c.enableCSActions(); return; } - if(chr.registerNameChange(newName)) { //success + if (chr.registerNameChange(newName)) { //success Item item = cItem.toItem(); c.sendPacket(PacketCreator.showNameChangeSuccess(item, c.getAccID())); cs.gainCash(4, cItem, chr.getWorld()); cs.addToInventory(item); } else { - c.sendPacket(PacketCreator.showCashShopMessage((byte)0)); + c.sendPacket(PacketCreator.showCashShopMessage((byte) 0)); } } c.enableCSActions(); - } else if(action == 0x31) { //world transfer + } else if (action == 0x31) { //world transfer CashItem cItem = CashItemFactory.getItem(p.readInt()); if (cItem == null || !canBuy(chr, cItem, cs.getCash(4))) { - c.sendPacket(PacketCreator.showCashShopMessage((byte)0)); + c.sendPacket(PacketCreator.showCashShopMessage((byte) 0)); c.enableCSActions(); return; } - if(cItem.getSN() == 50600001 && YamlConfig.config.server.ALLOW_CASHSHOP_WORLD_TRANSFER) { + if (cItem.getSN() == 50600001 && YamlConfig.config.server.ALLOW_CASHSHOP_WORLD_TRANSFER) { int newWorldSelection = p.readInt(); - + int worldTransferError = chr.checkWorldTransferEligibility(); - if(worldTransferError != 0 || newWorldSelection >= Server.getInstance().getWorldsSize() || Server.getInstance().getWorldsSize() <= 1) { - c.sendPacket(PacketCreator.showCashShopMessage((byte)0)); + if (worldTransferError != 0 || newWorldSelection >= Server.getInstance().getWorldsSize() || Server.getInstance().getWorldsSize() <= 1) { + c.sendPacket(PacketCreator.showCashShopMessage((byte) 0)); return; - } else if(newWorldSelection == c.getWorld()) { - c.sendPacket(PacketCreator.showCashShopMessage((byte)0xDC)); + } else if (newWorldSelection == c.getWorld()) { + c.sendPacket(PacketCreator.showCashShopMessage((byte) 0xDC)); return; - } else if(c.getAvailableCharacterWorldSlots(newWorldSelection) < 1 || Server.getInstance().getAccountWorldCharacterCount(c.getAccID(), newWorldSelection) >= 3) { - c.sendPacket(PacketCreator.showCashShopMessage((byte)0xDF)); + } else if (c.getAvailableCharacterWorldSlots(newWorldSelection) < 1 || Server.getInstance().getAccountWorldCharacterCount(c.getAccID(), newWorldSelection) >= 3) { + c.sendPacket(PacketCreator.showCashShopMessage((byte) 0xDF)); return; - } else if(chr.registerWorldTransfer(newWorldSelection)) { + } else if (chr.registerWorldTransfer(newWorldSelection)) { Item item = cItem.toItem(); c.sendPacket(PacketCreator.showWorldTransferSuccess(item, c.getAccID())); cs.gainCash(4, cItem, chr.getWorld()); cs.addToInventory(item); } else { - c.sendPacket(PacketCreator.showCashShopMessage((byte)0)); + c.sendPacket(PacketCreator.showCashShopMessage((byte) 0)); } } c.enableCSActions(); @@ -481,7 +483,7 @@ public final class CashOperationHandler extends AbstractPacketHandler { cal.set(year, month - 1, day); return c.checkBirthDate(cal); } - + private static boolean canBuy(Character chr, CashItem item, int cash) { if (item != null && item.isOnSale() && item.getPrice() <= cash) { FilePrinter.print(FilePrinter.CASHITEM_BOUGHT, chr + " bought " + ItemInformationProvider.getInstance().getName(item.getItemId()) + " (SN " + item.getSN() + ") for " + item.getPrice()); diff --git a/src/main/java/net/server/channel/handlers/CashShopSurpriseHandler.java b/src/main/java/net/server/channel/handlers/CashShopSurpriseHandler.java index 32c91da6c8..0d56fd2b29 100644 --- a/src/main/java/net/server/channel/handlers/CashShopSurpriseHandler.java +++ b/src/main/java/net/server/channel/handlers/CashShopSurpriseHandler.java @@ -28,18 +28,17 @@ import tools.PacketCreator; import tools.Pair; /** - * * @author RonanLana */ public class CashShopSurpriseHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { CashShop cs = c.getPlayer().getCashShop(); - - if(cs.isOpened()) { + + if (cs.isOpened()) { Pair cssResult = cs.openCashShopSurprise(); - - if(cssResult != null) { + + if (cssResult != null) { Item cssItem = cssResult.getLeft(), cssBox = cssResult.getRight(); c.sendPacket(PacketCreator.onCashGachaponOpenSuccess(c.getAccID(), cssBox.getSN(), cssBox.getQuantity(), cssItem, cssItem.getItemId(), cssItem.getQuantity(), true)); } else { diff --git a/src/main/java/net/server/channel/handlers/ChangeChannelHandler.java b/src/main/java/net/server/channel/handlers/ChangeChannelHandler.java index f66d081a77..418537094b 100644 --- a/src/main/java/net/server/channel/handlers/ChangeChannelHandler.java +++ b/src/main/java/net/server/channel/handlers/ChangeChannelHandler.java @@ -28,7 +28,6 @@ import net.packet.InPacket; import net.server.Server; /** - * * @author Matze */ public final class ChangeChannelHandler extends AbstractPacketHandler { @@ -38,14 +37,14 @@ public final class ChangeChannelHandler extends AbstractPacketHandler { int channel = p.readByte() + 1; p.readInt(); c.getPlayer().getAutobanManager().setTimestamp(6, Server.getInstance().getCurrentTimestamp(), 3); - if(c.getChannel() == channel) { - AutobanFactory.GENERAL.alert(c.getPlayer(), "CCing to same channel."); - c.disconnect(false, false); - return; + if (c.getChannel() == channel) { + AutobanFactory.GENERAL.alert(c.getPlayer(), "CCing to same channel."); + c.disconnect(false, false); + return; } else if (c.getPlayer().getCashShop().isOpened() || c.getPlayer().getMiniGame() != null || c.getPlayer().getPlayerShop() != null) { - return; - } - + return; + } + c.changeChannel(channel); } } \ No newline at end of file diff --git a/src/main/java/net/server/channel/handlers/ChangeMapHandler.java b/src/main/java/net/server/channel/handlers/ChangeMapHandler.java index 7c3dd1a30f..7dba890c9c 100644 --- a/src/main/java/net/server/channel/handlers/ChangeMapHandler.java +++ b/src/main/java/net/server/channel/handlers/ChangeMapHandler.java @@ -46,7 +46,7 @@ public final class ChangeMapHandler extends AbstractPacketHandler { if (chr.isChangingMaps() || chr.isBanned()) { if (chr.isChangingMaps()) { - FilePrinter.printError(FilePrinter.PORTAL_STUCK + chr.getName() + ".txt", "Player " + chr.getName() + " got stuck when changing maps. Timestamp: " + Calendar.getInstance().getTime().toString() + " Last visited mapids: " + chr.getLastVisitedMapids()); + FilePrinter.printError(FilePrinter.PORTAL_STUCK + chr.getName() + ".txt", "Player " + chr.getName() + " got stuck when changing maps. Timestamp: " + Calendar.getInstance().getTime() + " Last visited mapids: " + chr.getLastVisitedMapids()); } c.sendPacket(PacketCreator.enableActions()); diff --git a/src/main/java/net/server/channel/handlers/ChangeMapSpecialHandler.java b/src/main/java/net/server/channel/handlers/ChangeMapSpecialHandler.java index c2da5d16f7..62b0d75762 100644 --- a/src/main/java/net/server/channel/handlers/ChangeMapSpecialHandler.java +++ b/src/main/java/net/server/channel/handlers/ChangeMapSpecialHandler.java @@ -32,21 +32,21 @@ import tools.PacketCreator; public final class ChangeMapSpecialHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { - p.readByte(); - String startwp = p.readString(); - p.readShort(); - Portal portal = c.getPlayer().getMap().getPortal(startwp); - if (portal == null || c.getPlayer().portalDelay() > currentServerTime() || c.getPlayer().getBlockedPortals().contains(portal.getScriptName())) { - c.sendPacket(PacketCreator.enableActions()); - return; - } - if (c.getPlayer().isChangingMaps() || c.getPlayer().isBanned()) { - c.sendPacket(PacketCreator.enableActions()); - return; - } - if (c.getPlayer().getTrade() != null) { - Trade.cancelTrade(c.getPlayer(), TradeResult.UNSUCCESSFUL_ANOTHER_MAP); - } - portal.enterPortal(c); + p.readByte(); + String startwp = p.readString(); + p.readShort(); + Portal portal = c.getPlayer().getMap().getPortal(startwp); + if (portal == null || c.getPlayer().portalDelay() > currentServerTime() || c.getPlayer().getBlockedPortals().contains(portal.getScriptName())) { + c.sendPacket(PacketCreator.enableActions()); + return; + } + if (c.getPlayer().isChangingMaps() || c.getPlayer().isBanned()) { + c.sendPacket(PacketCreator.enableActions()); + return; + } + if (c.getPlayer().getTrade() != null) { + Trade.cancelTrade(c.getPlayer(), TradeResult.UNSUCCESSFUL_ANOTHER_MAP); + } + portal.enterPortal(c); } } diff --git a/src/main/java/net/server/channel/handlers/CharInfoRequestHandler.java b/src/main/java/net/server/channel/handlers/CharInfoRequestHandler.java index 5e4c8a4171..ddc6be1ce9 100644 --- a/src/main/java/net/server/channel/handlers/CharInfoRequestHandler.java +++ b/src/main/java/net/server/channel/handlers/CharInfoRequestHandler.java @@ -29,7 +29,7 @@ import server.maps.MapObject; import tools.PacketCreator; public final class CharInfoRequestHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { p.skip(4); @@ -38,8 +38,8 @@ public final class CharInfoRequestHandler extends AbstractPacketHandler { if (target != null) { if (target instanceof Character) { Character player = (Character) target; - - if(c.getPlayer().getId() != player.getId()) { + + if (c.getPlayer().getId() != player.getId()) { player.exportExcludedItems(c); } c.sendPacket(PacketCreator.charInfo(player)); diff --git a/src/main/java/net/server/channel/handlers/ClickGuideHandler.java b/src/main/java/net/server/channel/handlers/ClickGuideHandler.java index 7fe68d0978..9a4349caeb 100644 --- a/src/main/java/net/server/channel/handlers/ClickGuideHandler.java +++ b/src/main/java/net/server/channel/handlers/ClickGuideHandler.java @@ -29,7 +29,6 @@ import net.packet.InPacket; import scripting.npc.NPCScriptManager; /** - * * @author kevintjuh93 */ public class ClickGuideHandler extends AbstractPacketHandler { diff --git a/src/main/java/net/server/channel/handlers/CloseChalkboardHandler.java b/src/main/java/net/server/channel/handlers/CloseChalkboardHandler.java index d6dcfff2f5..1beb36c207 100644 --- a/src/main/java/net/server/channel/handlers/CloseChalkboardHandler.java +++ b/src/main/java/net/server/channel/handlers/CloseChalkboardHandler.java @@ -27,11 +27,10 @@ import net.packet.InPacket; import tools.PacketCreator; /** - * * @author Xterminator */ public final class CloseChalkboardHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { c.getPlayer().setChalkboard(null); diff --git a/src/main/java/net/server/channel/handlers/CloseRangeDamageHandler.java b/src/main/java/net/server/channel/handlers/CloseRangeDamageHandler.java index c295f804d2..410d1df811 100644 --- a/src/main/java/net/server/channel/handlers/CloseRangeDamageHandler.java +++ b/src/main/java/net/server/channel/handlers/CloseRangeDamageHandler.java @@ -36,7 +36,7 @@ import java.util.Iterator; import java.util.List; public final class CloseRangeDamageHandler extends AbstractDealDamageHandler { - + @Override public final void handlePacket(InPacket p, Client c) { Character chr = c.getPlayer(); @@ -46,23 +46,25 @@ public final class CloseRangeDamageHandler extends AbstractDealDamageHandler { AutobanFactory.FAST_ATTACK.alert(chr, "Time: " + timeElapsed); } chr.getAutobanManager().spam(8);*/ - + AttackInfo attack = parseDamage(p, chr, false, false); if (chr.getBuffEffect(BuffStat.MORPH) != null) { - if(chr.getBuffEffect(BuffStat.MORPH).isMorphWithoutAttack()) { + if (chr.getBuffEffect(BuffStat.MORPH).isMorphWithoutAttack()) { // How are they attacking when the client won't let them? chr.getClient().disconnect(false, false); - return; + return; } } - + if (chr.getDojoEnergy() < 10000 && (attack.skill == 1009 || attack.skill == 10001009 || attack.skill == 20001009)) // PE hacking or maybe just lagging + { return; + } if (GameConstants.isDojo(chr.getMap().getId()) && attack.numAttacked > 0) { chr.setDojoEnergy(chr.getDojoEnergy() + YamlConfig.config.server.DOJO_ENERGY_ATK); c.sendPacket(PacketCreator.getEnergy("energy", chr.getDojoEnergy())); } - + chr.getMap().broadcastMessage(chr, PacketCreator.closeRangeAttack(chr, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, attack.allDamage, attack.speed, attack.direction, attack.display), false, true); int numFinisherOrbs = 0; Integer comboBuff = chr.getBuffedValue(BuffStat.COMBO); @@ -84,12 +86,17 @@ public final class CloseRangeDamageHandler extends AbstractDealDamageHandler { ceffect = advcombo.getEffect(advComboSkillLevel); } else { int comboLv = chr.getSkillLevel(combo); - if(comboLv <= 0 || chr.isGM()) comboLv = SkillFactory.getSkill(oid).getMaxLevel(); - - if(comboLv > 0) ceffect = combo.getEffect(comboLv); - else ceffect = null; + if (comboLv <= 0 || chr.isGM()) { + comboLv = SkillFactory.getSkill(oid).getMaxLevel(); + } + + if (comboLv > 0) { + ceffect = combo.getEffect(comboLv); + } else { + ceffect = null; + } } - if(ceffect != null) { + if (ceffect != null) { if (orbcount < ceffect.getX() + 1) { int neworbcount = orbcount + 1; if (advComboSkillLevel > 0 && ceffect.makeChanceResult()) { @@ -99,11 +106,13 @@ public final class CloseRangeDamageHandler extends AbstractDealDamageHandler { } int olv = chr.getSkillLevel(oid); - if(olv <= 0) olv = SkillFactory.getSkill(oid).getMaxLevel(); - + if (olv <= 0) { + olv = SkillFactory.getSkill(oid).getMaxLevel(); + } + int duration = combo.getEffect(olv).getDuration(); List> stat = Collections.singletonList(new Pair<>(BuffStat.COMBO, neworbcount)); - chr.setBuffedValue(BuffStat.COMBO, neworbcount); + chr.setBuffedValue(BuffStat.COMBO, neworbcount); duration -= (int) (currentServerTime() - chr.getBuffedStarttime(BuffStat.COMBO)); c.sendPacket(PacketCreator.giveBuff(oid, duration, stat)); chr.getMap().broadcastMessage(chr, PacketCreator.giveForeignBuff(chr.getId(), stat), false); @@ -121,7 +130,7 @@ public final class CloseRangeDamageHandler extends AbstractDealDamageHandler { if (dmgIt.hasNext()) { totDamageToOneMonster = dmgIt.next().get(0); } - + chr.safeAddHP(-1 * totDamageToOneMonster * attack.getAttackEffect(chr, null).getX() / 100); } if (attack.numAttacked > 0 && attack.skill == 1211002) { @@ -145,7 +154,7 @@ public final class CloseRangeDamageHandler extends AbstractDealDamageHandler { if (chr.getDojoEnergy() < 10000) { // PE hacking or maybe just lagging return; } - + chr.setDojoEnergy(0); c.sendPacket(PacketCreator.getEnergy("energy", chr.getDojoEnergy())); c.sendPacket(PacketCreator.serverNotice(5, "As you used the secret skill, your energy bar has been reset.")); @@ -164,11 +173,11 @@ public final class CloseRangeDamageHandler extends AbstractDealDamageHandler { if ((chr.getSkillLevel(SkillFactory.getSkill(NightWalker.VANISH)) > 0 || chr.getSkillLevel(SkillFactory.getSkill(Rogue.DARK_SIGHT)) > 0) && chr.getBuffedValue(BuffStat.DARKSIGHT) != null) {// && chr.getBuffSource(BuffStat.DARKSIGHT) != 9101004 chr.cancelEffectFromBuffStat(BuffStat.DARKSIGHT); chr.cancelBuffStats(BuffStat.DARKSIGHT); - } else if(chr.getSkillLevel(SkillFactory.getSkill(WindArcher.WIND_WALK)) > 0 && chr.getBuffedValue(BuffStat.WIND_WALK) != null) { + } else if (chr.getSkillLevel(SkillFactory.getSkill(WindArcher.WIND_WALK)) > 0 && chr.getBuffedValue(BuffStat.WIND_WALK) != null) { chr.cancelEffectFromBuffStat(BuffStat.WIND_WALK); chr.cancelBuffStats(BuffStat.WIND_WALK); } - + applyAttack(attack, chr, attackCount); } } \ No newline at end of file diff --git a/src/main/java/net/server/channel/handlers/CoconutHandler.java b/src/main/java/net/server/channel/handlers/CoconutHandler.java index 34b10e927d..f00b3fcb38 100644 --- a/src/main/java/net/server/channel/handlers/CoconutHandler.java +++ b/src/main/java/net/server/channel/handlers/CoconutHandler.java @@ -31,55 +31,54 @@ import server.maps.MapleMap; import tools.PacketCreator; /** - * * @author kevintjuh93 */ public final class CoconutHandler extends AbstractPacketHandler { - public final void handlePacket(InPacket p, Client c) { - /*CB 00 A6 00 06 01 - * A6 00 = coconut id - * 06 01 = ? - */ - int id = p.readShort(); - MapleMap map = c.getPlayer().getMap(); - Coconut event = map.getCoconut(); - Coconuts nut = event.getCoconut(id); - if (!nut.isHittable()){ - return; - } - if (event == null){ - return; - } - if (currentServerTime() < nut.getHitTime()){ - return; - } - if (nut.getHits() > 2 && Math.random() < 0.4) { - if (Math.random() < 0.01 && event.getStopped() > 0) { - nut.setHittable(false); - event.stopCoconut(); - map.broadcastMessage(PacketCreator.hitCoconut(false, id, 1)); - return; - } - nut.setHittable(false); // for sure :) - nut.resetHits(); // For next event (without restarts) - if (Math.random() < 0.05 && event.getBombings() > 0) { - map.broadcastMessage(PacketCreator.hitCoconut(false, id, 2)); - event.bombCoconut(); - } else if (event.getFalling() > 0) { - map.broadcastMessage(PacketCreator.hitCoconut(false, id, 3)); - event.fallCoconut(); - if (c.getPlayer().getTeam() == 0) { - event.addMapleScore(); - map.broadcastMessage(PacketCreator.serverNotice(5, c.getPlayer().getName() + " of Team Maple knocks down a coconut.")); - } else { - event.addStoryScore(); - map.broadcastMessage(PacketCreator.serverNotice(5, c.getPlayer().getName() + " of Team Story knocks down a coconut.")); - } - map.broadcastMessage(PacketCreator.coconutScore(event.getMapleScore(), event.getStoryScore())); - } - } else { - nut.hit(); - map.broadcastMessage(PacketCreator.hitCoconut(false, id, 1)); - } - } + public final void handlePacket(InPacket p, Client c) { + /*CB 00 A6 00 06 01 + * A6 00 = coconut id + * 06 01 = ? + */ + int id = p.readShort(); + MapleMap map = c.getPlayer().getMap(); + Coconut event = map.getCoconut(); + Coconuts nut = event.getCoconut(id); + if (!nut.isHittable()) { + return; + } + if (event == null) { + return; + } + if (currentServerTime() < nut.getHitTime()) { + return; + } + if (nut.getHits() > 2 && Math.random() < 0.4) { + if (Math.random() < 0.01 && event.getStopped() > 0) { + nut.setHittable(false); + event.stopCoconut(); + map.broadcastMessage(PacketCreator.hitCoconut(false, id, 1)); + return; + } + nut.setHittable(false); // for sure :) + nut.resetHits(); // For next event (without restarts) + if (Math.random() < 0.05 && event.getBombings() > 0) { + map.broadcastMessage(PacketCreator.hitCoconut(false, id, 2)); + event.bombCoconut(); + } else if (event.getFalling() > 0) { + map.broadcastMessage(PacketCreator.hitCoconut(false, id, 3)); + event.fallCoconut(); + if (c.getPlayer().getTeam() == 0) { + event.addMapleScore(); + map.broadcastMessage(PacketCreator.serverNotice(5, c.getPlayer().getName() + " of Team Maple knocks down a coconut.")); + } else { + event.addStoryScore(); + map.broadcastMessage(PacketCreator.serverNotice(5, c.getPlayer().getName() + " of Team Story knocks down a coconut.")); + } + map.broadcastMessage(PacketCreator.coconutScore(event.getMapleScore(), event.getStoryScore())); + } + } else { + nut.hit(); + map.broadcastMessage(PacketCreator.hitCoconut(false, id, 1)); + } + } } diff --git a/src/main/java/net/server/channel/handlers/CouponCodeHandler.java b/src/main/java/net/server/channel/handlers/CouponCodeHandler.java index 5afd2be242..90475f2028 100644 --- a/src/main/java/net/server/channel/handlers/CouponCodeHandler.java +++ b/src/main/java/net/server/channel/handlers/CouponCodeHandler.java @@ -45,16 +45,15 @@ import java.util.*; import java.util.Map.Entry; /** - * * @author Penguins (Acrylic) * @author Ronan (HeavenMS) */ public final class CouponCodeHandler extends AbstractPacketHandler { - + private static List>> getNXCodeItems(Character chr, Connection con, int codeid) throws SQLException { Map couponItems = new HashMap<>(); Map couponPoints = new HashMap<>(5); - + try (PreparedStatement ps = con.prepareStatement("SELECT * FROM nxcode_items WHERE codeid = ?")) { ps.setInt(1, codeid); @@ -81,36 +80,36 @@ public final class CouponCodeHandler extends AbstractPacketHandler { } } } - + List>> ret = new LinkedList<>(); if (!couponItems.isEmpty()) { for (Entry e : couponItems.entrySet()) { int item = e.getKey(), qty = e.getValue(); - + if (ItemInformationProvider.getInstance().getName(item) == null) { item = 4000000; qty = 1; - + FilePrinter.printError(FilePrinter.UNHANDLED_EVENT, "Error trying to redeem itemid " + item + " from codeid " + codeid + "."); } - + if (!chr.canHold(item, qty)) { return null; } - + ret.add(new Pair<>(5, new Pair<>(item, qty))); } } - + if (!couponPoints.isEmpty()) { for (Entry e : couponPoints.entrySet()) { ret.add(new Pair<>(e.getKey(), new Pair<>(777, e.getValue()))); } } - + return ret; } - + private static Pair>>> getNXCodeResult(Character chr, String code) { Client c = chr.getClient(); List>> ret = new LinkedList<>(); @@ -158,31 +157,31 @@ public final class CouponCodeHandler extends AbstractPacketHandler { c.resetCsCoupon(); return new Pair<>(0, ret); } - + private static int parseCouponResult(int res) { switch (res) { case -1: return 0xB0; - + case -2: return 0xB3; - + case -3: return 0xB2; - + case -4: return 0xBB; - + default: return 0xB1; } } - + @Override public final void handlePacket(InPacket p, Client c) { p.skip(2); String code = p.readString(); - + if (c.tryacquireClient()) { try { Pair>>> codeRes = getNXCodeResult(c.getPlayer(), code.toUpperCase()); @@ -196,7 +195,7 @@ public final class CouponCodeHandler extends AbstractPacketHandler { int maplePoints = 0; int nxPrepaid = 0; int mesos = 0; - + for (Pair> pair : codeRes.getRight()) { type = pair.getLeft(); int quantity = pair.getRight().getRight(); @@ -228,7 +227,7 @@ public final class CouponCodeHandler extends AbstractPacketHandler { default: int item = pair.getRight().getLeft(); - + short qty; if (quantity > Short.MAX_VALUE) { qty = Short.MAX_VALUE; @@ -237,7 +236,7 @@ public final class CouponCodeHandler extends AbstractPacketHandler { } else { qty = (short) quantity; } - + if (ItemInformationProvider.getInstance().isCash(item)) { Item it = CashShop.generateCouponItem(item, qty); @@ -250,11 +249,11 @@ public final class CouponCodeHandler extends AbstractPacketHandler { break; } } - if(cashItems.size() > 255) { + if (cashItems.size() > 255) { List oldList = cashItems; cashItems = Arrays.asList(new Item[255]); int index = 0; - for(Item item : oldList) { + for (Item item : oldList) { cashItems.set(index, item); index++; } diff --git a/src/main/java/net/server/channel/handlers/DamageSummonHandler.java b/src/main/java/net/server/channel/handlers/DamageSummonHandler.java index d9aaf0804d..0446d7d4ee 100644 --- a/src/main/java/net/server/channel/handlers/DamageSummonHandler.java +++ b/src/main/java/net/server/channel/handlers/DamageSummonHandler.java @@ -37,13 +37,13 @@ public final class DamageSummonHandler extends AbstractPacketHandler { p.skip(1); // -1 int damage = p.readInt(); int monsterIdFrom = p.readInt(); - + Character player = c.getPlayer(); MapObject mmo = player.getMap().getMapObject(oid); - - if(mmo != null && mmo instanceof Summon) { + + if (mmo != null && mmo instanceof Summon) { Summon summon = (Summon) mmo; - + summon.addHP(-damage); if (summon.getHP() <= 0) { player.cancelEffectFromBuffStat(BuffStat.PUPPET); diff --git a/src/main/java/net/server/channel/handlers/DenyAllianceRequestHandler.java b/src/main/java/net/server/channel/handlers/DenyAllianceRequestHandler.java index a4d15dafb8..3ea3c437e2 100644 --- a/src/main/java/net/server/channel/handlers/DenyAllianceRequestHandler.java +++ b/src/main/java/net/server/channel/handlers/DenyAllianceRequestHandler.java @@ -35,7 +35,7 @@ public final class DenyAllianceRequestHandler extends AbstractPacketHandler { p.readByte(); String inviterName = p.readString(); String guildName = p.readString(); - + Character chr = c.getWorldServer().getPlayerStorage().getCharacterByName(inviterName); if (chr != null) { Alliance alliance = chr.getAlliance(); diff --git a/src/main/java/net/server/channel/handlers/DenyGuildRequestHandler.java b/src/main/java/net/server/channel/handlers/DenyGuildRequestHandler.java index 6d17c7be74..3376d01a3f 100644 --- a/src/main/java/net/server/channel/handlers/DenyGuildRequestHandler.java +++ b/src/main/java/net/server/channel/handlers/DenyGuildRequestHandler.java @@ -28,11 +28,10 @@ import net.packet.InPacket; import net.server.guild.Guild; /** - * * @author Xterminator */ public final class DenyGuildRequestHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { p.readByte(); diff --git a/src/main/java/net/server/channel/handlers/DenyPartyRequestHandler.java b/src/main/java/net/server/channel/handlers/DenyPartyRequestHandler.java index dfceba6e05..a1c94145dd 100644 --- a/src/main/java/net/server/channel/handlers/DenyPartyRequestHandler.java +++ b/src/main/java/net/server/channel/handlers/DenyPartyRequestHandler.java @@ -31,16 +31,16 @@ import net.server.coordinator.world.InviteCoordinator.InviteType; import tools.PacketCreator; public final class DenyPartyRequestHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { p.readByte(); String[] cname = p.readString().split("PS: "); - + Character cfrom = c.getChannelServer().getPlayerStorage().getCharacterByName(cname[cname.length - 1]); if (cfrom != null) { Character chr = c.getPlayer(); - + if (InviteCoordinator.answerInvite(InviteType.PARTY, chr.getId(), cfrom.getPartyId(), false).result == InviteResultType.DENIED) { chr.updatePartySearchAvailability(chr.getParty() == null); cfrom.sendPacket(PacketCreator.partyStatusMessage(23, chr.getName())); diff --git a/src/main/java/net/server/channel/handlers/DistributeAPHandler.java b/src/main/java/net/server/channel/handlers/DistributeAPHandler.java index 1fb72837a3..79fa610a63 100644 --- a/src/main/java/net/server/channel/handlers/DistributeAPHandler.java +++ b/src/main/java/net/server/channel/handlers/DistributeAPHandler.java @@ -27,12 +27,12 @@ import net.AbstractPacketHandler; import net.packet.InPacket; public final class DistributeAPHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { p.readInt(); int num = p.readInt(); - + AssignAPProcessor.APAssignAction(c, num); - } + } } diff --git a/src/main/java/net/server/channel/handlers/DistributeSPHandler.java b/src/main/java/net/server/channel/handlers/DistributeSPHandler.java index 8465f3a892..58092c7926 100644 --- a/src/main/java/net/server/channel/handlers/DistributeSPHandler.java +++ b/src/main/java/net/server/channel/handlers/DistributeSPHandler.java @@ -31,7 +31,7 @@ public final class DistributeSPHandler extends AbstractPacketHandler { public final void handlePacket(InPacket p, Client c) { p.readInt(); int skillid = p.readInt(); - + AssignSPProcessor.SPAssignAction(c, skillid); } } \ No newline at end of file diff --git a/src/main/java/net/server/channel/handlers/DoorHandler.java b/src/main/java/net/server/channel/handlers/DoorHandler.java index c4fea26f22..e312d26f2e 100644 --- a/src/main/java/net/server/channel/handlers/DoorHandler.java +++ b/src/main/java/net/server/channel/handlers/DoorHandler.java @@ -30,7 +30,6 @@ import server.maps.MapObject; import tools.PacketCreator; /** - * * @author Matze */ public final class DoorHandler extends AbstractPacketHandler { @@ -38,13 +37,13 @@ public final class DoorHandler extends AbstractPacketHandler { public final void handlePacket(InPacket p, Client c) { int ownerid = p.readInt(); p.readByte(); // specifies if backwarp or not, 1 town to target, 0 target to town - + Character chr = c.getPlayer(); if (chr.isChangingMaps() || chr.isBanned()) { c.sendPacket(PacketCreator.enableActions()); return; } - + for (MapObject obj : chr.getMap().getMapObjects()) { if (obj instanceof DoorObject) { DoorObject door = (DoorObject) obj; @@ -54,7 +53,7 @@ public final class DoorHandler extends AbstractPacketHandler { } } } - + c.sendPacket(PacketCreator.blockedMessage(6)); c.sendPacket(PacketCreator.enableActions()); } diff --git a/src/main/java/net/server/channel/handlers/DueyHandler.java b/src/main/java/net/server/channel/handlers/DueyHandler.java index deb888045e..635ac2bcc3 100644 --- a/src/main/java/net/server/channel/handlers/DueyHandler.java +++ b/src/main/java/net/server/channel/handlers/DueyHandler.java @@ -29,14 +29,14 @@ import net.packet.InPacket; import tools.PacketCreator; public final class DueyHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { - if (!YamlConfig.config.server.USE_DUEY){ + if (!YamlConfig.config.server.USE_DUEY) { c.sendPacket(PacketCreator.enableActions()); return; - } - + } + byte operation = p.readByte(); if (operation == DueyProcessor.Actions.TOSERVER_RECV_ITEM.getCode()) { // on click 'O' Button, thanks inhyuk DueyProcessor.dueySendTalk(c, false); @@ -48,15 +48,15 @@ public final class DueyHandler extends AbstractPacketHandler { String recipient = p.readString(); boolean quick = p.readByte() != 0; String message = quick ? p.readString() : null; - + DueyProcessor.dueySendItem(c, inventId, itemPos, amount, mesos, message, recipient, quick); } else if (operation == DueyProcessor.Actions.TOSERVER_REMOVE_PACKAGE.getCode()) { int packageid = p.readInt(); - + DueyProcessor.dueyRemovePackage(c, packageid, true); } else if (operation == DueyProcessor.Actions.TOSERVER_CLAIM_PACKAGE.getCode()) { int packageid = p.readInt(); - + DueyProcessor.dueyClaimPackage(c, packageid); } else if (operation == DueyProcessor.Actions.TOSERVER_CLAIM_PACKAGE.getCode()) { DueyProcessor.dueySendTalk(c, false); diff --git a/src/main/java/net/server/channel/handlers/EnterCashShopHandler.java b/src/main/java/net/server/channel/handlers/EnterCashShopHandler.java index 127baed6d8..bc2c9b1e39 100644 --- a/src/main/java/net/server/channel/handlers/EnterCashShopHandler.java +++ b/src/main/java/net/server/channel/handlers/EnterCashShopHandler.java @@ -30,7 +30,6 @@ import server.maps.MiniDungeonInfo; import tools.PacketCreator; /** - * * @author Flav */ public class EnterCashShopHandler extends AbstractPacketHandler { @@ -43,19 +42,19 @@ public class EnterCashShopHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.enableActions()); return; } - - if(mc.getEventInstance() != null) { + + if (mc.getEventInstance() != null) { c.sendPacket(PacketCreator.serverNotice(5, "Entering Cash Shop or MTS are disabled when registered on an event.")); c.sendPacket(PacketCreator.enableActions()); return; } - - if(MiniDungeonInfo.isDungeonMap(mc.getMapId())) { + + if (MiniDungeonInfo.isDungeonMap(mc.getMapId())) { c.sendPacket(PacketCreator.serverNotice(5, "Changing channels or entering Cash Shop or MTS are disabled when inside a Mini-Dungeon.")); c.sendPacket(PacketCreator.enableActions()); return; } - + if (mc.getCashShop().isOpened()) { return; } @@ -75,10 +74,10 @@ public class EnterCashShopHandler extends AbstractPacketHandler { mc.cancelDiseaseExpireTask(); mc.cancelSkillCooldownTask(); mc.cancelExpirationTask(); - + mc.forfeitExpirableQuests(); mc.cancelQuestExpirationTask(); - + c.sendPacket(PacketCreator.openCashShop(c, false)); c.sendPacket(PacketCreator.showCashInventory(c)); c.sendPacket(PacketCreator.showGifts(mc.getCashShop().loadGifts())); diff --git a/src/main/java/net/server/channel/handlers/EnterMTSHandler.java b/src/main/java/net/server/channel/handlers/EnterMTSHandler.java index 159c88fa8e..26e1cc5449 100644 --- a/src/main/java/net/server/channel/handlers/EnterMTSHandler.java +++ b/src/main/java/net/server/channel/handlers/EnterMTSHandler.java @@ -48,8 +48,8 @@ public final class EnterMTSHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { Character chr = c.getPlayer(); - - if(!chr.isAlive() && YamlConfig.config.server.USE_BUYBACK_SYSTEM) { + + if (!chr.isAlive() && YamlConfig.config.server.USE_BUYBACK_SYSTEM) { BuybackProcessor.processBuyback(c); c.sendPacket(PacketCreator.enableActions()); } else { @@ -58,18 +58,18 @@ public final class EnterMTSHandler extends AbstractPacketHandler { return; } - if(chr.getEventInstance() != null) { + if (chr.getEventInstance() != null) { c.sendPacket(PacketCreator.serverNotice(5, "Entering Cash Shop or MTS are disabled when registered on an event.")); c.sendPacket(PacketCreator.enableActions()); return; } - - if(MiniDungeonInfo.isDungeonMap(chr.getMapId())) { + + if (MiniDungeonInfo.isDungeonMap(chr.getMapId())) { c.sendPacket(PacketCreator.serverNotice(5, "Changing channels or entering Cash Shop or MTS are disabled when inside a Mini-Dungeon.")); c.sendPacket(PacketCreator.enableActions()); return; } - + if (FieldLimit.CANNOTMIGRATE.check(chr.getMap().getFieldLimit())) { chr.dropMessage(1, "You can't do it here in this map."); c.sendPacket(PacketCreator.enableActions()); @@ -88,7 +88,7 @@ public final class EnterMTSHandler extends AbstractPacketHandler { chr.closePlayerInteractions(); chr.closePartySearchInteractions(); - + chr.unregisterChairBuff(); Server.getInstance().getPlayerBuffStorage().addBuffsToStorage(chr.getId(), chr.getAllBuffs()); Server.getInstance().getPlayerBuffStorage().addDiseasesToStorage(chr.getId(), chr.getAllDiseases()); @@ -106,7 +106,7 @@ public final class EnterMTSHandler extends AbstractPacketHandler { chr.cancelQuestExpirationTask(); chr.saveCharToDB(); - + c.getChannelServer().removePlayer(chr); chr.getMap().removePlayer(c.getPlayer()); try { diff --git a/src/main/java/net/server/channel/handlers/FaceExpressionHandler.java b/src/main/java/net/server/channel/handlers/FaceExpressionHandler.java index 267b5fafe7..ae98b6969a 100644 --- a/src/main/java/net/server/channel/handlers/FaceExpressionHandler.java +++ b/src/main/java/net/server/channel/handlers/FaceExpressionHandler.java @@ -32,7 +32,7 @@ public final class FaceExpressionHandler extends AbstractPacketHandler { public final void handlePacket(InPacket p, Client c) { Character chr = c.getPlayer(); int emote = p.readInt(); - + if (emote > 7) { int itemid = 5159992 + emote; // thanks RajanGrewal (Darter) for reporting unchecked emote itemid if (!ItemConstants.isFaceExpression(itemid) || chr.getInventory(ItemConstants.getInventoryType(itemid)).findById(itemid) == null) { @@ -41,8 +41,8 @@ public final class FaceExpressionHandler extends AbstractPacketHandler { } else if (emote < 1) { return; } - - if(c.tryacquireClient()) { + + if (c.tryacquireClient()) { try { // expecting players never intends to wear the emote 0 (default face, that changes back after 5sec timeout) if (chr.isLoggedinWorld()) { chr.changeFaceExpression(emote); diff --git a/src/main/java/net/server/channel/handlers/FamilyAddHandler.java b/src/main/java/net/server/channel/handlers/FamilyAddHandler.java index 4296429de8..a40330b081 100644 --- a/src/main/java/net/server/channel/handlers/FamilyAddHandler.java +++ b/src/main/java/net/server/channel/handlers/FamilyAddHandler.java @@ -31,34 +31,33 @@ import net.server.coordinator.world.InviteCoordinator.InviteType; import tools.PacketCreator; /** - * * @author Jay Estrella * @author Ubaware */ public final class FamilyAddHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { - if(!YamlConfig.config.server.USE_FAMILY_SYSTEM) { + if (!YamlConfig.config.server.USE_FAMILY_SYSTEM) { return; } String toAdd = p.readString(); Character addChr = c.getChannelServer().getPlayerStorage().getCharacterByName(toAdd); Character chr = c.getPlayer(); - if(addChr == null) { + if (addChr == null) { c.sendPacket(PacketCreator.sendFamilyMessage(65, 0)); - } else if(addChr == chr) { //only possible through packet editing/client editing i think? + } else if (addChr == chr) { //only possible through packet editing/client editing i think? c.sendPacket(PacketCreator.enableActions()); - } else if(addChr.getMap() != chr.getMap() || (addChr.isHidden()) && chr.gmLevel() < addChr.gmLevel()) { + } else if (addChr.getMap() != chr.getMap() || (addChr.isHidden()) && chr.gmLevel() < addChr.gmLevel()) { c.sendPacket(PacketCreator.sendFamilyMessage(69, 0)); - } else if(addChr.getLevel() <= 10) { + } else if (addChr.getLevel() <= 10) { c.sendPacket(PacketCreator.sendFamilyMessage(77, 0)); - } else if(Math.abs(addChr.getLevel() - chr.getLevel()) > 20) { + } else if (Math.abs(addChr.getLevel() - chr.getLevel()) > 20) { c.sendPacket(PacketCreator.sendFamilyMessage(72, 0)); - } else if(addChr.getFamily() != null && addChr.getFamily() == chr.getFamily()) { //same family + } else if (addChr.getFamily() != null && addChr.getFamily() == chr.getFamily()) { //same family c.sendPacket(PacketCreator.enableActions()); - } else if(InviteCoordinator.hasInvite(InviteType.FAMILY, addChr.getId())) { + } else if (InviteCoordinator.hasInvite(InviteType.FAMILY, addChr.getId())) { c.sendPacket(PacketCreator.sendFamilyMessage(73, 0)); - } else if(chr.getFamily() != null && addChr.getFamily() != null && addChr.getFamily().getTotalGenerations() + chr.getFamily().getTotalGenerations() > YamlConfig.config.server.FAMILY_MAX_GENERATIONS) { + } else if (chr.getFamily() != null && addChr.getFamily() != null && addChr.getFamily().getTotalGenerations() + chr.getFamily().getTotalGenerations() > YamlConfig.config.server.FAMILY_MAX_GENERATIONS) { c.sendPacket(PacketCreator.sendFamilyMessage(76, 0)); } else { InviteCoordinator.createInvite(InviteType.FAMILY, chr, addChr, addChr.getId()); diff --git a/src/main/java/net/server/channel/handlers/FamilyPreceptsHandler.java b/src/main/java/net/server/channel/handlers/FamilyPreceptsHandler.java index 1792a025db..673a4114a6 100644 --- a/src/main/java/net/server/channel/handlers/FamilyPreceptsHandler.java +++ b/src/main/java/net/server/channel/handlers/FamilyPreceptsHandler.java @@ -11,10 +11,16 @@ public class FamilyPreceptsHandler extends AbstractPacketHandler { @Override public void handlePacket(InPacket p, Client c) { Family family = c.getPlayer().getFamily(); - if(family == null) return; - if(family.getLeader().getChr() != c.getPlayer()) return; //only the leader can set the precepts + if (family == null) { + return; + } + if (family.getLeader().getChr() != c.getPlayer()) { + return; //only the leader can set the precepts + } String newPrecepts = p.readString(); - if(newPrecepts.length() > 200) return; + if (newPrecepts.length() > 200) { + return; + } family.setMessage(newPrecepts, true); //family.broadcastFamilyInfoUpdate(); //probably don't need to broadcast for this? c.sendPacket(PacketCreator.getFamilyInfo(c.getPlayer().getFamilyEntry())); diff --git a/src/main/java/net/server/channel/handlers/FamilySeparateHandler.java b/src/main/java/net/server/channel/handlers/FamilySeparateHandler.java index a473361ff5..11e5afea78 100644 --- a/src/main/java/net/server/channel/handlers/FamilySeparateHandler.java +++ b/src/main/java/net/server/channel/handlers/FamilySeparateHandler.java @@ -31,42 +31,54 @@ public class FamilySeparateHandler extends AbstractPacketHandler { @Override public void handlePacket(InPacket p, Client c) { - if(!YamlConfig.config.server.USE_FAMILY_SYSTEM) return; + if (!YamlConfig.config.server.USE_FAMILY_SYSTEM) { + return; + } Family oldFamily = c.getPlayer().getFamily(); - if(oldFamily == null) return; + if (oldFamily == null) { + return; + } FamilyEntry forkOn = null; boolean isSenior; - if(p.available() > 0) { //packet 0x95 doesn't send id, since there is only one senior + if (p.available() > 0) { //packet 0x95 doesn't send id, since there is only one senior forkOn = c.getPlayer().getFamily().getEntryByID(p.readInt()); - if(!c.getPlayer().getFamilyEntry().isJunior(forkOn)) return; //packet editing? + if (!c.getPlayer().getFamilyEntry().isJunior(forkOn)) { + return; //packet editing? + } isSenior = true; } else { forkOn = c.getPlayer().getFamilyEntry(); isSenior = false; } - if(forkOn == null) return; - + if (forkOn == null) { + return; + } + FamilyEntry senior = forkOn.getSenior(); - if(senior == null) return; + if (senior == null) { + return; + } int levelDiff = Math.abs(c.getPlayer().getLevel() - senior.getLevel()); int cost = 2500 * levelDiff; cost += levelDiff * levelDiff; - if(c.getPlayer().getMeso() < cost) { + if (c.getPlayer().getMeso() < cost) { c.sendPacket(PacketCreator.sendFamilyMessage(isSenior ? 81 : 80, cost)); return; } c.getPlayer().gainMeso(-cost); int repCost = separateRepCost(forkOn); senior.gainReputation(-repCost, false); - if(senior.getSenior() != null) senior.getSenior().gainReputation(-(repCost/2), false); + if (senior.getSenior() != null) { + senior.getSenior().gainReputation(-(repCost / 2), false); + } forkOn.announceToSenior(PacketCreator.serverNotice(5, forkOn.getName() + " has left the family."), true); forkOn.fork(); c.sendPacket(PacketCreator.getFamilyInfo(forkOn)); //pedigree info will be requested from the client if the window is open forkOn.updateSeniorFamilyInfo(true); c.sendPacket(PacketCreator.sendFamilyMessage(1, 0)); } - - + + private static int separateRepCost(FamilyEntry junior) { int level = junior.getLevel(); int ret = level / 20; diff --git a/src/main/java/net/server/channel/handlers/FamilySummonResponseHandler.java b/src/main/java/net/server/channel/handlers/FamilySummonResponseHandler.java index d9a14d91e1..a7e4f3a273 100644 --- a/src/main/java/net/server/channel/handlers/FamilySummonResponseHandler.java +++ b/src/main/java/net/server/channel/handlers/FamilySummonResponseHandler.java @@ -18,16 +18,22 @@ public class FamilySummonResponseHandler extends AbstractPacketHandler { @Override public void handlePacket(InPacket p, Client c) { - if(!YamlConfig.config.server.USE_FAMILY_SYSTEM) return; + if (!YamlConfig.config.server.USE_FAMILY_SYSTEM) { + return; + } p.readString(); //family name boolean accept = p.readByte() != 0; InviteResult inviteResult = InviteCoordinator.answerInvite(InviteType.FAMILY_SUMMON, c.getPlayer().getId(), c.getPlayer(), accept); - if(inviteResult.result == InviteResultType.NOT_FOUND) return; + if (inviteResult.result == InviteResultType.NOT_FOUND) { + return; + } Character inviter = inviteResult.from; FamilyEntry inviterEntry = inviter.getFamilyEntry(); - if(inviterEntry == null) return; + if (inviterEntry == null) { + return; + } MapleMap map = (MapleMap) inviteResult.params[0]; - if(accept && inviter.getMap() == map) { //cancel if inviter has changed maps + if (accept && inviter.getMap() == map) { //cancel if inviter has changed maps c.getPlayer().changeMap(map, map.getPortal(0)); } else { inviterEntry.refundEntitlement(FamilyEntitlement.SUMMON_FAMILY); diff --git a/src/main/java/net/server/channel/handlers/FamilyUseHandler.java b/src/main/java/net/server/channel/handlers/FamilyUseHandler.java index 22ecfec824..8a00692dd3 100644 --- a/src/main/java/net/server/channel/handlers/FamilyUseHandler.java +++ b/src/main/java/net/server/channel/handlers/FamilyUseHandler.java @@ -35,35 +35,34 @@ import server.maps.MapleMap; import tools.PacketCreator; /** - * * @author Moogra * @author Ubaware */ public final class FamilyUseHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { - if(!YamlConfig.config.server.USE_FAMILY_SYSTEM) { + if (!YamlConfig.config.server.USE_FAMILY_SYSTEM) { return; } FamilyEntitlement type = FamilyEntitlement.values()[p.readInt()]; int cost = type.getRepCost(); FamilyEntry entry = c.getPlayer().getFamilyEntry(); - if(entry.getReputation() < cost || entry.isEntitlementUsed(type)) { + if (entry.getReputation() < cost || entry.isEntitlementUsed(type)) { return; // shouldn't even be able to request it } c.sendPacket(PacketCreator.getFamilyInfo(entry)); Character victim; - if(type == FamilyEntitlement.FAMILY_REUINION || type == FamilyEntitlement.SUMMON_FAMILY) { + if (type == FamilyEntitlement.FAMILY_REUINION || type == FamilyEntitlement.SUMMON_FAMILY) { victim = c.getChannelServer().getPlayerStorage().getCharacterByName(p.readString()); - if(victim != null && victim != c.getPlayer()) { - if(victim.getFamily() == c.getPlayer().getFamily()) { + if (victim != null && victim != c.getPlayer()) { + if (victim.getFamily() == c.getPlayer().getFamily()) { MapleMap targetMap = victim.getMap(); MapleMap ownMap = c.getPlayer().getMap(); - if(targetMap != null) { - if(type == FamilyEntitlement.FAMILY_REUINION) { - if(!FieldLimit.CANNOTMIGRATE.check(ownMap.getFieldLimit()) && !FieldLimit.CANNOTVIPROCK.check(targetMap.getFieldLimit()) + if (targetMap != null) { + if (type == FamilyEntitlement.FAMILY_REUINION) { + if (!FieldLimit.CANNOTMIGRATE.check(ownMap.getFieldLimit()) && !FieldLimit.CANNOTVIPROCK.check(targetMap.getFieldLimit()) && (targetMap.getForcedReturnId() == 999999999 || targetMap.getId() < 100000000) && targetMap.getEventInstance() == null) { - + c.getPlayer().changeMap(victim.getMap(), victim.getMap().getPortal(0)); useEntitlement(entry, type); } else { @@ -71,10 +70,10 @@ public final class FamilyUseHandler extends AbstractPacketHandler { return; } } else { - if(!FieldLimit.CANNOTMIGRATE.check(targetMap.getFieldLimit()) && !FieldLimit.CANNOTVIPROCK.check(ownMap.getFieldLimit()) + if (!FieldLimit.CANNOTMIGRATE.check(targetMap.getFieldLimit()) && !FieldLimit.CANNOTVIPROCK.check(ownMap.getFieldLimit()) && (ownMap.getForcedReturnId() == 999999999 || ownMap.getId() < 100000000) && ownMap.getEventInstance() == null) { - - if(InviteCoordinator.hasInvite(InviteType.FAMILY_SUMMON, victim.getId())) { + + if (InviteCoordinator.hasInvite(InviteType.FAMILY_SUMMON, victim.getId())) { c.sendPacket(PacketCreator.sendFamilyMessage(74, 0)); return; } @@ -91,7 +90,7 @@ public final class FamilyUseHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.sendFamilyMessage(67, 0)); } } - } else if(type == FamilyEntitlement.FAMILY_BONDING) { + } else if (type == FamilyEntitlement.FAMILY_BONDING) { //not implemented } else { boolean party = false; @@ -99,39 +98,39 @@ public final class FamilyUseHandler extends AbstractPacketHandler { float rate = 1.5f; int duration = 15; do { - switch(type) { - case PARTY_EXP_2_30MIN: - party = true; - isExp = true; - type = FamilyEntitlement.SELF_EXP_2_30MIN; - continue; - case PARTY_DROP_2_30MIN: - party = true; - type = FamilyEntitlement.SELF_DROP_2_30MIN; - continue; - case SELF_DROP_2_30MIN: - duration = 30; - case SELF_DROP_2: - rate = 2.0f; - case SELF_DROP_1_5: - break; - case SELF_EXP_2_30MIN: - duration = 30; - case SELF_EXP_2: - rate = 2.0f; - case SELF_EXP_1_5: - isExp = true; - default: - break; + switch (type) { + case PARTY_EXP_2_30MIN: + party = true; + isExp = true; + type = FamilyEntitlement.SELF_EXP_2_30MIN; + continue; + case PARTY_DROP_2_30MIN: + party = true; + type = FamilyEntitlement.SELF_DROP_2_30MIN; + continue; + case SELF_DROP_2_30MIN: + duration = 30; + case SELF_DROP_2: + rate = 2.0f; + case SELF_DROP_1_5: + break; + case SELF_EXP_2_30MIN: + duration = 30; + case SELF_EXP_2: + rate = 2.0f; + case SELF_EXP_1_5: + isExp = true; + default: + break; } break; - } while(true); + } while (true); //not implemented } } - + private boolean useEntitlement(FamilyEntry entry, FamilyEntitlement entitlement) { - if(entry.useEntitlement(entitlement)) { + if (entry.useEntitlement(entitlement)) { entry.gainReputation(-entitlement.getRepCost(), false); entry.getChr().sendPacket(PacketCreator.getFamilyInfo(entry)); return true; diff --git a/src/main/java/net/server/channel/handlers/FieldDamageMobHandler.java b/src/main/java/net/server/channel/handlers/FieldDamageMobHandler.java index 801ca12d82..ea2b5af4d5 100644 --- a/src/main/java/net/server/channel/handlers/FieldDamageMobHandler.java +++ b/src/main/java/net/server/channel/handlers/FieldDamageMobHandler.java @@ -31,27 +31,27 @@ import tools.FilePrinter; import tools.PacketCreator; public class FieldDamageMobHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { int mobOid = p.readInt(); // packet structure found thanks to Darter (Rajan) int dmg = p.readInt(); - + Character chr = c.getPlayer(); MapleMap map = chr.getMap(); - + if (map.getEnvironment().isEmpty()) { // no environment objects activated to actually hit the mob FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to use an obstacle on mapid " + map.getId() + " to attack."); return; } - + Monster mob = map.getMonsterByOid(mobOid); if (mob != null) { if (dmg < 0 || dmg > GameConstants.MAX_FIELD_MOB_DAMAGE) { FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to use an obstacle on mapid " + map.getId() + " to attack " + MonsterInformationProvider.getInstance().getMobNameFromId(mob.getId()) + " with damage " + dmg); return; } - + map.broadcastMessage(chr, PacketCreator.damageMonster(mobOid, dmg), true); map.damageMonster(chr, mob, dmg); } diff --git a/src/main/java/net/server/channel/handlers/FredrickHandler.java b/src/main/java/net/server/channel/handlers/FredrickHandler.java index e245c3277c..11dd5517ca 100644 --- a/src/main/java/net/server/channel/handlers/FredrickHandler.java +++ b/src/main/java/net/server/channel/handlers/FredrickHandler.java @@ -28,7 +28,6 @@ import net.AbstractPacketHandler; import net.packet.InPacket; /** - * * @author kevintjuh93 */ public class FredrickHandler extends AbstractPacketHandler { diff --git a/src/main/java/net/server/channel/handlers/GeneralChatHandler.java b/src/main/java/net/server/channel/handlers/GeneralChatHandler.java index ca0d99522f..633327057d 100644 --- a/src/main/java/net/server/channel/handlers/GeneralChatHandler.java +++ b/src/main/java/net/server/channel/handlers/GeneralChatHandler.java @@ -33,43 +33,43 @@ import tools.LogHelper; import tools.PacketCreator; public final class GeneralChatHandler extends AbstractPacketHandler { - @Override - public final void handlePacket(InPacket p, Client c) { - String s = p.readString(); - Character chr = c.getPlayer(); - if(chr.getAutobanManager().getLastSpam(7) + 200 > currentServerTime()) { - c.sendPacket(PacketCreator.enableActions()); - return; - } - if (s.length() > Byte.MAX_VALUE && !chr.isGM()) { - AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit in General Chat."); - FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to send text with length of " + s.length()); - c.disconnect(true, false); - return; - } - char heading = s.charAt(0); - if (CommandsExecutor.isCommand(c, s)) { - CommandsExecutor.getInstance().handle(c, s); - } else if (heading != '/') { - int show = p.readByte(); - if(chr.getMap().isMuted() && !chr.isGM()) { - chr.dropMessage(5, "The map you are in is currently muted. Please try again later."); - return; - } - - if (!chr.isHidden()) { - chr.getMap().broadcastMessage(PacketCreator.getChatText(chr.getId(), s, chr.getWhiteChat(), show)); - if (YamlConfig.config.server.USE_ENABLE_CHAT_LOG) { - LogHelper.logChat(c, "General", s); - } - } else { - chr.getMap().broadcastGMMessage(PacketCreator.getChatText(chr.getId(), s, chr.getWhiteChat(), show)); - if (YamlConfig.config.server.USE_ENABLE_CHAT_LOG) { - LogHelper.logChat(c, "GM General", s); - } - } - - chr.getAutobanManager().spam(7); - } + @Override + public final void handlePacket(InPacket p, Client c) { + String s = p.readString(); + Character chr = c.getPlayer(); + if (chr.getAutobanManager().getLastSpam(7) + 200 > currentServerTime()) { + c.sendPacket(PacketCreator.enableActions()); + return; } + if (s.length() > Byte.MAX_VALUE && !chr.isGM()) { + AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit in General Chat."); + FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to send text with length of " + s.length()); + c.disconnect(true, false); + return; + } + char heading = s.charAt(0); + if (CommandsExecutor.isCommand(c, s)) { + CommandsExecutor.getInstance().handle(c, s); + } else if (heading != '/') { + int show = p.readByte(); + if (chr.getMap().isMuted() && !chr.isGM()) { + chr.dropMessage(5, "The map you are in is currently muted. Please try again later."); + return; + } + + if (!chr.isHidden()) { + chr.getMap().broadcastMessage(PacketCreator.getChatText(chr.getId(), s, chr.getWhiteChat(), show)); + if (YamlConfig.config.server.USE_ENABLE_CHAT_LOG) { + LogHelper.logChat(c, "General", s); + } + } else { + chr.getMap().broadcastGMMessage(PacketCreator.getChatText(chr.getId(), s, chr.getWhiteChat(), show)); + if (YamlConfig.config.server.USE_ENABLE_CHAT_LOG) { + LogHelper.logChat(c, "GM General", s); + } + } + + chr.getAutobanManager().spam(7); + } + } } \ No newline at end of file diff --git a/src/main/java/net/server/channel/handlers/GiveFameHandler.java b/src/main/java/net/server/channel/handlers/GiveFameHandler.java index ef2cbb165b..2e9bfcee4c 100644 --- a/src/main/java/net/server/channel/handlers/GiveFameHandler.java +++ b/src/main/java/net/server/channel/handlers/GiveFameHandler.java @@ -31,7 +31,7 @@ import tools.FilePrinter; import tools.PacketCreator; public final class GiveFameHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { Character target = (Character) c.getPlayer().getMap().getMapObject(p.readInt()); @@ -46,7 +46,7 @@ public final class GiveFameHandler extends AbstractPacketHandler { c.disconnect(true, false); return; } - + FameStatus status = player.canGiveFame(target); if (status == FameStatus.OK) { if (target.gainFame(famechange, player, mode)) { diff --git a/src/main/java/net/server/channel/handlers/GrenadeEffectHandler.java b/src/main/java/net/server/channel/handlers/GrenadeEffectHandler.java index 7898a22f8f..4032f64e76 100644 --- a/src/main/java/net/server/channel/handlers/GrenadeEffectHandler.java +++ b/src/main/java/net/server/channel/handlers/GrenadeEffectHandler.java @@ -34,14 +34,14 @@ import java.awt.*; * @author GabrielSin */ public class GrenadeEffectHandler extends AbstractPacketHandler { - + @Override public void handlePacket(InPacket p, Client c) { Character chr = c.getPlayer(); Point position = new Point(p.readInt(), p.readInt()); int keyDown = p.readInt(); int skillId = p.readInt(); - + switch (skillId) { case NightWalker.POISON_BOMB: case Gunslinger.GRENADE: @@ -54,5 +54,5 @@ public class GrenadeEffectHandler extends AbstractPacketHandler { FilePrinter.printError(FilePrinter.UNHANDLED_EVENT, "The skill id: " + skillId + " is not coded in " + this.getClass().getName() + "."); } } - + } \ No newline at end of file diff --git a/src/main/java/net/server/channel/handlers/GuildOperationHandler.java b/src/main/java/net/server/channel/handlers/GuildOperationHandler.java index 49ca2ae0bc..a6fc6f4561 100644 --- a/src/main/java/net/server/channel/handlers/GuildOperationHandler.java +++ b/src/main/java/net/server/channel/handlers/GuildOperationHandler.java @@ -76,7 +76,7 @@ public final class GuildOperationHandler extends AbstractPacketHandler { mc.dropMessage(1, "The Guild name you have chosen is not accepted."); return; } - + Set eligibleMembers = new HashSet<>(Guild.getEligiblePlayersForGuild(mc)); if (eligibleMembers.size() < YamlConfig.config.server.CREATE_GUILD_MIN_PARTNERS) { if (mc.getMap().getAllPlayers().size() < YamlConfig.config.server.CREATE_GUILD_MIN_PARTNERS) { @@ -86,33 +86,34 @@ public final class GuildOperationHandler extends AbstractPacketHandler { // players may be unaware of not belonging on a party in order to become eligible, thanks Hair (Legalize) for pointing this out mc.dropMessage(1, "Please make sure everyone you are trying to invite is neither on a guild nor on a party."); } - + return; } - + if (!Party.createParty(mc, true)) { mc.dropMessage(1, "You cannot create a new Guild while in a party."); return; } - + Set eligibleCids = new HashSet<>(); for (Character chr : eligibleMembers) { eligibleCids.add(chr.getId()); } - + c.getWorldServer().getMatchCheckerCoordinator().createMatchConfirmation(MatchCheckerType.GUILD_CREATION, c.getWorld(), mc.getId(), eligibleCids, guildName); break; case 0x05: if (mc.getGuildId() <= 0 || mc.getGuildRank() > 2) { return; } - + String targetName = p.readString(); GuildResponse mgr = Guild.sendInvitation(c, targetName); if (mgr != null) { c.sendPacket(mgr.getPacket(targetName)); - } else {} // already sent invitation, do nothing - + } else { + } // already sent invitation, do nothing + break; case 0x06: if (mc.getGuildId() > 0) { @@ -125,27 +126,29 @@ public final class GuildOperationHandler extends AbstractPacketHandler { System.out.println("[Hack] " + mc.getName() + " attempted to join a guild with a different character id."); return; } - + if (!Guild.answerInvitation(cid, mc.getName(), gid, true)) { return; } - + mc.getMGC().setGuildId(gid); // joins the guild mc.getMGC().setGuildRank(5); // start at lowest rank mc.getMGC().setAllianceRank(5); - + int s = Server.getInstance().addGuildMember(mc.getMGC(), mc); if (s == 0) { mc.dropMessage(1, "The guild you are trying to join is already full."); mc.getMGC().setGuildId(0); return; } - + c.sendPacket(GuildPackets.showGuildInfo(mc)); - + allianceId = mc.getGuild().getAllianceId(); - if(allianceId > 0) Server.getInstance().getAlliance(allianceId).updateAlliancePackets(mc); - + if (allianceId > 0) { + Server.getInstance().getAlliance(allianceId).updateAlliancePackets(mc); + } + mc.saveGuildStatus(); // update database mc.getMap().broadcastPacket(mc, GuildPackets.guildNameChanged(mc.getId(), mc.getGuild().getName())); // thanks Vcoc for pointing out an issue with updating guild tooltip to players in the map mc.getMap().broadcastPacket(mc, GuildPackets.guildMarkChanged(mc.getId(), mc.getGuild())); @@ -157,15 +160,17 @@ public final class GuildOperationHandler extends AbstractPacketHandler { System.out.println("[Hack] " + mc.getName() + " tried to quit guild under the name \"" + name + "\" and current guild id of " + mc.getGuildId() + "."); return; } - + allianceId = mc.getGuild().getAllianceId(); - + c.sendPacket(GuildPackets.updateGP(mc.getGuildId(), 0)); Server.getInstance().leaveGuild(mc.getMGC()); - + c.sendPacket(GuildPackets.showGuildInfo(null)); - if(allianceId > 0) Server.getInstance().getAlliance(allianceId).updateAlliancePackets(mc); - + if (allianceId > 0) { + Server.getInstance().getAlliance(allianceId).updateAlliancePackets(mc); + } + mc.getMGC().setGuildId(0); mc.getMGC().setGuildRank(5); mc.saveGuildStatus(); @@ -173,16 +178,18 @@ public final class GuildOperationHandler extends AbstractPacketHandler { break; case 0x08: allianceId = mc.getGuild().getAllianceId(); - + cid = p.readInt(); name = p.readString(); if (mc.getGuildRank() > 2 || mc.getGuildId() <= 0) { System.out.println("[Hack] " + mc.getName() + " is trying to expel without rank 1 or 2."); return; } - + Server.getInstance().expelMember(mc.getMGC(), name, cid); - if(allianceId > 0) Server.getInstance().getAlliance(allianceId).updateAlliancePackets(mc); + if (allianceId > 0) { + Server.getInstance().getAlliance(allianceId).updateAlliancePackets(mc); + } break; case 0x0d: if (mc.getGuildId() <= 0 || mc.getGuildRank() != 1) { @@ -193,7 +200,7 @@ public final class GuildOperationHandler extends AbstractPacketHandler { for (int i = 0; i < 5; i++) { ranks[i] = p.readString(); } - + Server.getInstance().changeRankTitle(mc.getGuildId(), ranks); break; case 0x0e: @@ -222,19 +229,21 @@ public final class GuildOperationHandler extends AbstractPacketHandler { short logo = p.readShort(); byte logocolor = p.readByte(); Server.getInstance().setGuildEmblem(mc.getGuildId(), bg, bgcolor, logo, logocolor); - + if (mc.getGuild() != null && mc.getGuild().getAllianceId() > 0) { Alliance alliance = mc.getAlliance(); Server.getInstance().allianceMessage(alliance.getId(), GuildPackets.getGuildAlliances(alliance, c.getWorld()), -1, -1); } - + mc.gainMeso(-YamlConfig.config.server.CHANGE_EMBLEM_COST, true, false, true); mc.getGuild().broadcastNameChanged(); mc.getGuild().broadcastEmblemChanged(); break; case 0x10: if (mc.getGuildId() <= 0 || mc.getGuildRank() > 2) { - if(mc.getGuildId() <= 0) System.out.println("[Hack] " + mc.getName() + " tried to change guild notice while not in a guild."); + if (mc.getGuildId() <= 0) { + System.out.println("[Hack] " + mc.getName() + " tried to change guild notice while not in a guild."); + } return; } String notice = p.readString(); @@ -246,12 +255,12 @@ public final class GuildOperationHandler extends AbstractPacketHandler { case 0x1E: p.readInt(); World wserv = c.getWorldServer(); - + if (mc.getParty() != null) { wserv.getMatchCheckerCoordinator().dismissMatchConfirmation(mc.getId()); return; } - + int leaderid = wserv.getMatchCheckerCoordinator().getMatchConfirmationLeaderid(mc.getId()); if (leaderid != -1) { boolean result = p.readByte() != 0; @@ -264,13 +273,13 @@ public final class GuildOperationHandler extends AbstractPacketHandler { } } } - + wserv.getMatchCheckerCoordinator().answerMatchConfirmation(mc.getId(), result); } - + break; default: - System.out.println("Unhandled GUILD_OPERATION packet: \n" + p.toString()); + System.out.println("Unhandled GUILD_OPERATION packet: \n" + p); } } } diff --git a/src/main/java/net/server/channel/handlers/HealOvertimeHandler.java b/src/main/java/net/server/channel/handlers/HealOvertimeHandler.java index 232346334b..5af9f49931 100644 --- a/src/main/java/net/server/channel/handlers/HealOvertimeHandler.java +++ b/src/main/java/net/server/channel/handlers/HealOvertimeHandler.java @@ -35,24 +35,28 @@ public final class HealOvertimeHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { Character chr = c.getPlayer(); - if(!chr.isLoggedinWorld()) return; - + if (!chr.isLoggedinWorld()) { + return; + } + AutobanManager abm = chr.getAutobanManager(); int timestamp = Server.getInstance().getCurrentTimestamp(); p.skip(8); - + short healHP = p.readShort(); if (healHP != 0) { abm.setTimestamp(8, timestamp, 28); // thanks Vcoc & Thora for pointing out d/c happening here - if ((abm.getLastSpam(0) + 1500) > timestamp) AutobanFactory.FAST_HP_HEALING.addPoint(abm, "Fast hp healing"); - + if ((abm.getLastSpam(0) + 1500) > timestamp) { + AutobanFactory.FAST_HP_HEALING.addPoint(abm, "Fast hp healing"); + } + MapleMap map = chr.getMap(); - int abHeal = (int)(77 * map.getRecovery() * 1.5); // thanks Ari for noticing players not getting healed in sauna in certain cases + int abHeal = (int) (77 * map.getRecovery() * 1.5); // thanks Ari for noticing players not getting healed in sauna in certain cases if (healHP > abHeal) { AutobanFactory.HIGH_HP_HEALING.autoban(chr, "Healing: " + healHP + "; Max is " + abHeal + "."); return; } - + chr.addHP(healHP); chr.getMap().broadcastMessage(chr, PacketCreator.showHpHealed(chr.getId(), healHP), false); abm.spam(0, timestamp); diff --git a/src/main/java/net/server/channel/handlers/HiredMerchantRequest.java b/src/main/java/net/server/channel/handlers/HiredMerchantRequest.java index 1bd7009316..04c5f4345f 100644 --- a/src/main/java/net/server/channel/handlers/HiredMerchantRequest.java +++ b/src/main/java/net/server/channel/handlers/HiredMerchantRequest.java @@ -38,14 +38,13 @@ import java.sql.SQLException; import java.util.Arrays; /** - * * @author XoticStory */ public final class HiredMerchantRequest extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { Character chr = c.getPlayer(); - + try { for (MapObject mmo : chr.getMap().getMapObjectsInRange(chr.getPosition(), 23000, Arrays.asList(MapObjectType.HIRED_MERCHANT, MapObjectType.PLAYER))) { if (mmo instanceof Character) { @@ -71,7 +70,7 @@ public final class HiredMerchantRequest extends AbstractPacketHandler { } catch (Exception e) { e.printStackTrace(); } - + if (GameConstants.isFreeMarketRoom(chr.getMapId())) { if (!chr.hasMerchant()) { try { diff --git a/src/main/java/net/server/channel/handlers/InnerPortalHandler.java b/src/main/java/net/server/channel/handlers/InnerPortalHandler.java index d25c098f82..0474db8238 100644 --- a/src/main/java/net/server/channel/handlers/InnerPortalHandler.java +++ b/src/main/java/net/server/channel/handlers/InnerPortalHandler.java @@ -26,7 +26,6 @@ import net.AbstractPacketHandler; import net.packet.InPacket; /** - * * @author BubblesDev */ public final class InnerPortalHandler extends AbstractPacketHandler { diff --git a/src/main/java/net/server/channel/handlers/InventoryMergeHandler.java b/src/main/java/net/server/channel/handlers/InventoryMergeHandler.java index 4b857c9485..dc20cd9f0a 100644 --- a/src/main/java/net/server/channel/handlers/InventoryMergeHandler.java +++ b/src/main/java/net/server/channel/handlers/InventoryMergeHandler.java @@ -41,37 +41,45 @@ public final class InventoryMergeHandler extends AbstractPacketHandler { Character chr = c.getPlayer(); p.readInt(); chr.getAutobanManager().setTimestamp(2, Server.getInstance().getCurrentTimestamp(), 4); - - if(!YamlConfig.config.server.USE_ITEM_SORT) { + + if (!YamlConfig.config.server.USE_ITEM_SORT) { c.sendPacket(PacketCreator.enableActions()); return; - } - + } + byte invType = p.readByte(); if (invType < 1 || invType > 5) { c.disconnect(false, false); return; } - + InventoryType inventoryType = InventoryType.getByType(invType); - Inventory inventory = c.getPlayer().getInventory(inventoryType); + Inventory inventory = c.getPlayer().getInventory(inventoryType); inventory.lockInventory(); try { //------------------- RonanLana's SLOT MERGER ----------------- - + ItemInformationProvider ii = ItemInformationProvider.getInstance(); Item srcItem, dstItem; - for(short dst = 1; dst <= inventory.getSlotLimit(); dst++) { + for (short dst = 1; dst <= inventory.getSlotLimit(); dst++) { dstItem = inventory.getItem(dst); - if(dstItem == null) continue; + if (dstItem == null) { + continue; + } - for(short src = (short)(dst + 1); src <= inventory.getSlotLimit(); src++) { + for (short src = (short) (dst + 1); src <= inventory.getSlotLimit(); src++) { srcItem = inventory.getItem(src); - if(srcItem == null) continue; + if (srcItem == null) { + continue; + } - if(dstItem.getItemId() != srcItem.getItemId()) continue; - if(dstItem.getQuantity() == ii.getSlotMax(c, inventory.getItem(dst).getItemId())) break; + if (dstItem.getItemId() != srcItem.getItemId()) { + continue; + } + if (dstItem.getQuantity() == ii.getSlotMax(c, inventory.getItem(dst).getItemId())) { + break; + } InventoryManipulator.move(c, inventoryType, src, dst); } @@ -105,7 +113,7 @@ public final class InventoryMergeHandler extends AbstractPacketHandler { } finally { inventory.unlockInventory(); } - + c.sendPacket(PacketCreator.finishedSort(inventoryType.getType())); c.sendPacket(PacketCreator.enableActions()); } diff --git a/src/main/java/net/server/channel/handlers/InventorySortHandler.java b/src/main/java/net/server/channel/handlers/InventorySortHandler.java index 5cc62e918d..e6721569bf 100644 --- a/src/main/java/net/server/channel/handlers/InventorySortHandler.java +++ b/src/main/java/net/server/channel/handlers/InventorySortHandler.java @@ -35,7 +35,6 @@ import java.util.ArrayList; import java.util.List; /** - * * @author BubblesDev * @author Ronan */ @@ -45,18 +44,22 @@ class PairedQuicksort { private int j = 0; private final ArrayList intersect; ItemInformationProvider ii = ItemInformationProvider.getInstance(); - + private void PartitionByItemId(int Esq, int Dir, ArrayList A) { Item x, w; i = Esq; j = Dir; - + x = A.get((i + j) / 2); do { - while (x.getItemId() > A.get(i).getItemId()) i++; - while (x.getItemId() < A.get(j).getItemId()) j--; - + while (x.getItemId() > A.get(i).getItemId()) { + i++; + } + while (x.getItemId() < A.get(j).getItemId()) { + j--; + } + if (i <= j) { w = A.get(i); A.set(i, A.get(j)); @@ -67,23 +70,27 @@ class PairedQuicksort { } } while (i <= j); } - + private int getWatkForProjectile(Item item) { return ii.getWatkForProjectile(item.getItemId()); } - + private void PartitionByProjectileAtk(int Esq, int Dir, ArrayList A) { Item x, w; i = Esq; j = Dir; - + x = A.get((i + j) / 2); do { int watk = getWatkForProjectile(x); - while (watk < getWatkForProjectile(A.get(i))) i++; - while (watk > getWatkForProjectile(A.get(j))) j--; - + while (watk < getWatkForProjectile(A.get(i))) { + i++; + } + while (watk > getWatkForProjectile(A.get(j))) { + j--; + } + if (i <= j) { w = A.get(i); A.set(i, A.get(j)); @@ -94,18 +101,22 @@ class PairedQuicksort { } } while (i <= j); } - + private void PartitionByName(int Esq, int Dir, ArrayList A) { Item x, w; i = Esq; j = Dir; - + x = A.get((i + j) / 2); do { - while (ii.getName(x.getItemId()).compareTo(ii.getName(A.get(i).getItemId())) > 0) i++; - while (ii.getName(x.getItemId()).compareTo(ii.getName(A.get(j).getItemId())) < 0) j--; - + while (ii.getName(x.getItemId()).compareTo(ii.getName(A.get(i).getItemId())) > 0) { + i++; + } + while (ii.getName(x.getItemId()).compareTo(ii.getName(A.get(j).getItemId())) < 0) { + j--; + } + if (i <= j) { w = A.get(i); A.set(i, A.get(j)); @@ -116,18 +127,22 @@ class PairedQuicksort { } } while (i <= j); } - + private void PartitionByQuantity(int Esq, int Dir, ArrayList A) { Item x, w; i = Esq; j = Dir; - + x = A.get((i + j) / 2); do { - while (x.getQuantity() > A.get(i).getQuantity()) i++; - while (x.getQuantity() < A.get(j).getQuantity()) j--; - + while (x.getQuantity() > A.get(i).getQuantity()) { + i++; + } + while (x.getQuantity() < A.get(j).getQuantity()) { + j--; + } + if (i <= j) { w = A.get(i); A.set(i, A.get(j)); @@ -138,22 +153,26 @@ class PairedQuicksort { } } while (i <= j); } - + private void PartitionByLevel(int Esq, int Dir, ArrayList A) { Equip x, w; i = Esq; j = Dir; - - x = (Equip)(A.get((i + j) / 2)); - + + x = (Equip) (A.get((i + j) / 2)); + do { - while (x.getLevel() > ((Equip)A.get(i)).getLevel()) i++; - while (x.getLevel() < ((Equip)A.get(j)).getLevel()) j--; - + while (x.getLevel() > ((Equip) A.get(i)).getLevel()) { + i++; + } + while (x.getLevel() < ((Equip) A.get(j)).getLevel()) { + j--; + } + if (i <= j) { - w = (Equip)A.get(i); + w = (Equip) A.get(i); A.set(i, A.get(j)); A.set(j, w); @@ -164,40 +183,44 @@ class PairedQuicksort { } void MapleQuicksort(int Esq, int Dir, ArrayList A, int sort) { - switch(sort) { + switch (sort) { case 3: PartitionByLevel(Esq, Dir, A); break; - + case 2: PartitionByName(Esq, Dir, A); break; - + case 1: PartitionByQuantity(Esq, Dir, A); break; - + default: PartitionByItemId(Esq, Dir, A); } - - - if (Esq < j) MapleQuicksort(Esq, j, A, sort); - if (i < Dir) MapleQuicksort(i, Dir, A, sort); + + + if (Esq < j) { + MapleQuicksort(Esq, j, A, sort); + } + if (i < Dir) { + MapleQuicksort(i, Dir, A, sort); + } } - + private static int getItemSubtype(Item it) { return it.getItemId() / 10000; } - + private int[] BinarySearchElement(ArrayList A, int rangeId) { int st = 0, en = A.size() - 1; - + int mid = -1, idx = -1; while (en >= st) { idx = (st + en) / 2; mid = getItemSubtype(A.get(idx)); - + if (mid == rangeId) { break; } else if (mid < rangeId) { @@ -206,55 +229,57 @@ class PairedQuicksort { en = idx - 1; } } - + if (en < st) { return null; } - + st = idx - 1; en = idx + 1; while (st >= 0 && getItemSubtype(A.get(st)) == rangeId) { st -= 1; } st += 1; - + while (en < A.size() && getItemSubtype(A.get(en)) == rangeId) { en += 1; } en -= 1; - + return new int[]{st, en}; } - + public void reverseSortSublist(ArrayList A, int[] range) { if (range != null) { PartitionByProjectileAtk(range[0], range[1], A); } } - + public PairedQuicksort(ArrayList A, int primarySort, int secondarySort) { intersect = new ArrayList<>(); - - if(A.size() > 0) { + + if (A.size() > 0) { MapleQuicksort(0, A.size() - 1, A, primarySort); - + if (A.get(0).getInventoryType().equals(InventoryType.USE)) { // thanks KDA & Vcoc for suggesting stronger projectiles coming before weaker ones reverseSortSublist(A, BinarySearchElement(A, 206)); // arrows reverseSortSublist(A, BinarySearchElement(A, 207)); // stars reverseSortSublist(A, BinarySearchElement(A, 233)); // bullets } } - + intersect.add(0); - for(int ind = 1; ind < A.size(); ind++) { - if(A.get(ind - 1).getItemId() != A.get(ind).getItemId()) { + for (int ind = 1; ind < A.size(); ind++) { + if (A.get(ind - 1).getItemId() != A.get(ind).getItemId()) { intersect.add(ind); } } intersect.add(A.size()); - - for(int ind = 0; ind < intersect.size() - 1; ind++) { - if(intersect.get(ind + 1) > intersect.get(ind)) MapleQuicksort(intersect.get(ind), intersect.get(ind + 1) - 1, A, secondarySort); + + for (int ind = 0; ind < intersect.size() - 1; ind++) { + if (intersect.get(ind + 1) > intersect.get(ind)) { + MapleQuicksort(intersect.get(ind), intersect.get(ind + 1) - 1, A, secondarySort); + } } } } @@ -265,21 +290,21 @@ public final class InventorySortHandler extends AbstractPacketHandler { Character chr = c.getPlayer(); p.readInt(); chr.getAutobanManager().setTimestamp(3, Server.getInstance().getCurrentTimestamp(), 4); - - if(!YamlConfig.config.server.USE_ITEM_SORT) { + + if (!YamlConfig.config.server.USE_ITEM_SORT) { c.sendPacket(PacketCreator.enableActions()); return; } - + byte invType = p.readByte(); if (invType < 1 || invType > 5) { c.disconnect(false, false); return; } - + ArrayList itemarray = new ArrayList<>(); List mods = new ArrayList<>(); - + Inventory inventory = chr.getInventory(InventoryType.getByType(invType)); inventory.lockInventory(); try { @@ -307,7 +332,7 @@ public final class InventorySortHandler extends AbstractPacketHandler { } finally { inventory.unlockInventory(); } - + c.sendPacket(PacketCreator.modifyInventory(true, mods)); c.sendPacket(PacketCreator.finishedSort2(invType)); c.sendPacket(PacketCreator.enableActions()); diff --git a/src/main/java/net/server/channel/handlers/ItemMoveHandler.java b/src/main/java/net/server/channel/handlers/ItemMoveHandler.java index bc32241836..dcb97b90a5 100644 --- a/src/main/java/net/server/channel/handlers/ItemMoveHandler.java +++ b/src/main/java/net/server/channel/handlers/ItemMoveHandler.java @@ -29,23 +29,22 @@ import net.packet.InPacket; import tools.PacketCreator; /** - * * @author Matze */ public final class ItemMoveHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { p.skip(4); - if(c.getPlayer().getAutobanManager().getLastSpam(6) + 300 > currentServerTime()) { + if (c.getPlayer().getAutobanManager().getLastSpam(6) + 300 > currentServerTime()) { c.sendPacket(PacketCreator.enableActions()); return; } - + InventoryType type = InventoryType.getByType(p.readByte()); short src = p.readShort(); //is there any reason to use byte instead of short in src and action? short action = p.readShort(); short quantity = p.readShort(); - + if (src < 0 && action > 0) { InventoryManipulator.unequip(c, src, action); } else if (action < 0) { @@ -55,8 +54,10 @@ public final class ItemMoveHandler extends AbstractPacketHandler { } else { InventoryManipulator.move(c, type, src, action); } - - if (c.getPlayer().getMap().getHPDec() > 0) c.getPlayer().resetHpDecreaseTask(); + + if (c.getPlayer().getMap().getHPDec() > 0) { + c.getPlayer().resetHpDecreaseTask(); + } c.getPlayer().getAutobanManager().spam(6); } } \ No newline at end of file diff --git a/src/main/java/net/server/channel/handlers/ItemPickupHandler.java b/src/main/java/net/server/channel/handlers/ItemPickupHandler.java index ae908f860b..c16079f367 100644 --- a/src/main/java/net/server/channel/handlers/ItemPickupHandler.java +++ b/src/main/java/net/server/channel/handlers/ItemPickupHandler.java @@ -31,7 +31,6 @@ import tools.FilePrinter; import java.awt.*; /** - * * @author Matze * @author Ronan */ @@ -45,15 +44,17 @@ public final class ItemPickupHandler extends AbstractPacketHandler { int oid = p.readInt(); Character chr = c.getPlayer(); MapObject ob = chr.getMap().getMapObject(oid); - if(ob == null) return; - + if (ob == null) { + return; + } + Point charPos = chr.getPosition(); Point obPos = ob.getPosition(); if (Math.abs(charPos.getX() - obPos.getX()) > 800 || Math.abs(charPos.getY() - obPos.getY()) > 600) { FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to pick up an item too far away. Mapid: " + chr.getMapId() + " Player pos: " + charPos + " Object pos: " + obPos); return; } - + chr.pickupItem(ob); } } diff --git a/src/main/java/net/server/channel/handlers/ItemRewardHandler.java b/src/main/java/net/server/channel/handlers/ItemRewardHandler.java index 53c5348281..a66fc2924e 100644 --- a/src/main/java/net/server/channel/handlers/ItemRewardHandler.java +++ b/src/main/java/net/server/channel/handlers/ItemRewardHandler.java @@ -46,10 +46,12 @@ public final class ItemRewardHandler extends AbstractPacketHandler { public final void handlePacket(InPacket p, Client c) { byte slot = (byte) p.readShort(); int itemId = p.readInt(); // will load from xml I don't care. - + Item it = c.getPlayer().getInventory(InventoryType.USE).getItem(slot); // null check here thanks to Thora - if (it == null || it.getItemId() != itemId || c.getPlayer().getInventory(InventoryType.USE).countById(itemId) < 1) return; - + if (it == null || it.getItemId() != itemId || c.getPlayer().getInventory(InventoryType.USE).countById(itemId) < 1) { + return; + } + ItemInformationProvider ii = ItemInformationProvider.getInstance(); Pair> rewards = ii.getItemReward(itemId); for (RewardItem reward : rewards.getRight()) { @@ -58,10 +60,10 @@ public final class ItemRewardHandler extends AbstractPacketHandler { break; } if (Randomizer.nextInt(rewards.getLeft()) < reward.prob) {//Is it even possible to get an item with prob 1? - if (ItemConstants.getInventoryType(reward.itemid) == InventoryType.EQUIP) { + if (ItemConstants.getInventoryType(reward.itemid) == InventoryType.EQUIP) { final Item item = ii.getEquipById(reward.itemid); if (reward.period != -1) { - item.setExpiration(currentServerTime() + (reward.period * 60 * 60 * 10)); + item.setExpiration(currentServerTime() + (reward.period * 60 * 60 * 10)); } InventoryManipulator.addFromDrop(c, item, false); } else { diff --git a/src/main/java/net/server/channel/handlers/KeymapChangeHandler.java b/src/main/java/net/server/channel/handlers/KeymapChangeHandler.java index 214a845d1c..e13599cfac 100644 --- a/src/main/java/net/server/channel/handlers/KeymapChangeHandler.java +++ b/src/main/java/net/server/channel/handlers/KeymapChangeHandler.java @@ -31,53 +31,53 @@ import net.AbstractPacketHandler; import net.packet.InPacket; public final class KeymapChangeHandler extends AbstractPacketHandler { - @Override - public final void handlePacket(InPacket p, Client c) { - if (p.available() >= 8) { - int mode = p.readInt(); - if(mode == 0) { - int numChanges = p.readInt(); - for (int i = 0; i < numChanges; i++) { - int key = p.readInt(); - int type = p.readByte(); - int action = p.readInt(); - - if(type == 1) { - Skill skill = SkillFactory.getSkill(action); - boolean isBanndedSkill; - if (skill != null) { - isBanndedSkill = GameConstants.bannedBindSkills(skill.getId()); - if (isBanndedSkill || (!c.getPlayer().isGM() && GameConstants.isGMSkills(skill.getId())) || (!GameConstants.isInJobTree(skill.getId(), c.getPlayer().getJob().getId()) && !c.getPlayer().isGM())) { //for those skills are are "technically" in the beginner tab, like bamboo rain in Dojo or skills you find in PYPQ - //AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit keymapping."); - //FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to use skill " + skill.getId()); - //c.disconnect(true, false); - //return; + @Override + public final void handlePacket(InPacket p, Client c) { + if (p.available() >= 8) { + int mode = p.readInt(); + if (mode == 0) { + int numChanges = p.readInt(); + for (int i = 0; i < numChanges; i++) { + int key = p.readInt(); + int type = p.readByte(); + int action = p.readInt(); - continue; // fk that - } + if (type == 1) { + Skill skill = SkillFactory.getSkill(action); + boolean isBanndedSkill; + if (skill != null) { + isBanndedSkill = GameConstants.bannedBindSkills(skill.getId()); + if (isBanndedSkill || (!c.getPlayer().isGM() && GameConstants.isGMSkills(skill.getId())) || (!GameConstants.isInJobTree(skill.getId(), c.getPlayer().getJob().getId()) && !c.getPlayer().isGM())) { //for those skills are are "technically" in the beginner tab, like bamboo rain in Dojo or skills you find in PYPQ + //AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit keymapping."); + //FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to use skill " + skill.getId()); + //c.disconnect(true, false); + //return; + + continue; // fk that + } /* if (c.getPlayer().getSkillLevel(skill) < 1) { HOW WOULD A SKILL EVEN BE AVAILABLE TO KEYBINDING continue; IF THERE IS NOT EVEN A SINGLE POINT USED INTO IT?? } */ - } - } - - c.getPlayer().changeKeybinding(key, new KeyBinding(type, action)); - } - } else if(mode == 1) { // Auto HP Potion - int itemID = p.readInt(); - if(itemID != 0 && c.getPlayer().getInventory(InventoryType.USE).findById(itemID) == null) { - c.disconnect(false, false); // Don't let them send a packet with a use item they dont have. - return; - } - c.getPlayer().changeKeybinding(91, new KeyBinding(7, itemID)); - } else if(mode == 2) { // Auto MP Potion - int itemID = p.readInt(); - if(itemID != 0 && c.getPlayer().getInventory(InventoryType.USE).findById(itemID) == null) { - c.disconnect(false, false); // Don't let them send a packet with a use item they dont have. - return; - } - c.getPlayer().changeKeybinding(92, new KeyBinding(7, itemID)); - } - } - } + } + } + + c.getPlayer().changeKeybinding(key, new KeyBinding(type, action)); + } + } else if (mode == 1) { // Auto HP Potion + int itemID = p.readInt(); + if (itemID != 0 && c.getPlayer().getInventory(InventoryType.USE).findById(itemID) == null) { + c.disconnect(false, false); // Don't let them send a packet with a use item they dont have. + return; + } + c.getPlayer().changeKeybinding(91, new KeyBinding(7, itemID)); + } else if (mode == 2) { // Auto MP Potion + int itemID = p.readInt(); + if (itemID != 0 && c.getPlayer().getInventory(InventoryType.USE).findById(itemID) == null) { + c.disconnect(false, false); // Don't let them send a packet with a use item they dont have. + return; + } + c.getPlayer().changeKeybinding(92, new KeyBinding(7, itemID)); + } + } + } } diff --git a/src/main/java/net/server/channel/handlers/LeftKnockbackHandler.java b/src/main/java/net/server/channel/handlers/LeftKnockbackHandler.java index 0a92891e7f..50b901b39d 100644 --- a/src/main/java/net/server/channel/handlers/LeftKnockbackHandler.java +++ b/src/main/java/net/server/channel/handlers/LeftKnockbackHandler.java @@ -28,12 +28,11 @@ import net.packet.InPacket; import tools.PacketCreator; /** - * * @author kevintjuh93 */ public class LeftKnockbackHandler extends AbstractPacketHandler { - public void handlePacket(InPacket p, final Client c) { - c.sendPacket(PacketCreator.leftKnockBack()); - c.sendPacket(PacketCreator.enableActions()); - } + public void handlePacket(InPacket p, final Client c) { + c.sendPacket(PacketCreator.leftKnockBack()); + c.sendPacket(PacketCreator.enableActions()); + } } diff --git a/src/main/java/net/server/channel/handlers/MTSHandler.java b/src/main/java/net/server/channel/handlers/MTSHandler.java index a16f47d729..4e951cb9d6 100644 --- a/src/main/java/net/server/channel/handlers/MTSHandler.java +++ b/src/main/java/net/server/channel/handlers/MTSHandler.java @@ -52,7 +52,7 @@ public final class MTSHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { // TODO add karma-to-untradeable flag on sold items here - + if (!c.getPlayer().getCashShop().isOpened()) { return; } @@ -108,7 +108,7 @@ public final class MTSHandler extends AbstractPacketHandler { Connection con = null; try { con = DatabaseConnection.getConnection(); - + PreparedStatement ps = con.prepareStatement("SELECT COUNT(*) FROM mts_items WHERE seller = ?"); ps.setInt(1, c.getPlayer().getId()); ResultSet rs = ps.executeQuery(); @@ -214,7 +214,7 @@ public final class MTSHandler extends AbstractPacketHandler { ps.executeUpdate(); ps.close(); InventoryManipulator.removeFromSlot(c, invType, slot, quantity, false); - + con.close(); } catch (SQLException e) { e.printStackTrace(); @@ -537,7 +537,7 @@ public final class MTSHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.MTSFailBuy()); } } else { - System.out.println("Unhandled OP(MTS): " + op + " Packet: " + p.toString()); + System.out.println("Unhandled OP(MTS): " + op + " Packet: " + p); } } else { c.sendPacket(PacketCreator.showMTSCash(c.getPlayer())); diff --git a/src/main/java/net/server/channel/handlers/MagicDamageHandler.java b/src/main/java/net/server/channel/handlers/MagicDamageHandler.java index 1345d3d5e7..85c2d5936f 100644 --- a/src/main/java/net/server/channel/handlers/MagicDamageHandler.java +++ b/src/main/java/net/server/channel/handlers/MagicDamageHandler.java @@ -35,9 +35,9 @@ import server.StatEffect; import tools.PacketCreator; public final class MagicDamageHandler extends AbstractDealDamageHandler { - @Override - public final void handlePacket(InPacket p, Client c) { - Character chr = c.getPlayer(); + @Override + public final void handlePacket(InPacket p, Client c) { + Character chr = c.getPlayer(); /*long timeElapsed = currentServerTime() - chr.getAutobanManager().getLastSpam(8); if(timeElapsed < 300) { @@ -45,43 +45,43 @@ public final class MagicDamageHandler extends AbstractDealDamageHandler { } chr.getAutobanManager().spam(8);*/ - AttackInfo attack = parseDamage(p, chr, false, true); - - if (chr.getBuffEffect(BuffStat.MORPH) != null) { - if(chr.getBuffEffect(BuffStat.MORPH).isMorphWithoutAttack()) { - // How are they attacking when the client won't let them? - chr.getClient().disconnect(false, false); - return; - } - } - - if (GameConstants.isDojo(chr.getMap().getId()) && attack.numAttacked > 0) { - chr.setDojoEnergy(chr.getDojoEnergy() + + YamlConfig.config.server.DOJO_ENERGY_ATK); - c.sendPacket(PacketCreator.getEnergy("energy", chr.getDojoEnergy())); - } + AttackInfo attack = parseDamage(p, chr, false, true); - int charge = (attack.skill == Evan.FIRE_BREATH || attack.skill == Evan.ICE_BREATH || attack.skill == FPArchMage.BIG_BANG || attack.skill == ILArchMage.BIG_BANG || attack.skill == Bishop.BIG_BANG) ? attack.charge : -1; - Packet packet = PacketCreator.magicAttack(chr, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, attack.allDamage, charge, attack.speed, attack.direction, attack.display); - - chr.getMap().broadcastMessage(chr, packet, false, true); - StatEffect effect = attack.getAttackEffect(chr, null); - Skill skill = SkillFactory.getSkill(attack.skill); - StatEffect effect_ = skill.getEffect(chr.getSkillLevel(skill)); - if (effect_.getCooldown() > 0) { - if (chr.skillIsCooling(attack.skill)) { - return; - } else { - c.sendPacket(PacketCreator.skillCooldown(attack.skill, effect_.getCooldown())); - chr.addCooldown(attack.skill, currentServerTime(), effect_.getCooldown() * 1000); - } - } - applyAttack(attack, chr, effect.getAttackCount()); - Skill eaterSkill = SkillFactory.getSkill((chr.getJob().getId() - (chr.getJob().getId() % 10)) * 10000);// MP Eater, works with right job - int eaterLevel = chr.getSkillLevel(eaterSkill); - if (eaterLevel > 0) { - for (Integer singleDamage : attack.allDamage.keySet()) { - eaterSkill.getEffect(eaterLevel).applyPassive(chr, chr.getMap().getMapObject(singleDamage), 0); - } - } - } + if (chr.getBuffEffect(BuffStat.MORPH) != null) { + if (chr.getBuffEffect(BuffStat.MORPH).isMorphWithoutAttack()) { + // How are they attacking when the client won't let them? + chr.getClient().disconnect(false, false); + return; + } + } + + if (GameConstants.isDojo(chr.getMap().getId()) && attack.numAttacked > 0) { + chr.setDojoEnergy(chr.getDojoEnergy() + +YamlConfig.config.server.DOJO_ENERGY_ATK); + c.sendPacket(PacketCreator.getEnergy("energy", chr.getDojoEnergy())); + } + + int charge = (attack.skill == Evan.FIRE_BREATH || attack.skill == Evan.ICE_BREATH || attack.skill == FPArchMage.BIG_BANG || attack.skill == ILArchMage.BIG_BANG || attack.skill == Bishop.BIG_BANG) ? attack.charge : -1; + Packet packet = PacketCreator.magicAttack(chr, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, attack.allDamage, charge, attack.speed, attack.direction, attack.display); + + chr.getMap().broadcastMessage(chr, packet, false, true); + StatEffect effect = attack.getAttackEffect(chr, null); + Skill skill = SkillFactory.getSkill(attack.skill); + StatEffect effect_ = skill.getEffect(chr.getSkillLevel(skill)); + if (effect_.getCooldown() > 0) { + if (chr.skillIsCooling(attack.skill)) { + return; + } else { + c.sendPacket(PacketCreator.skillCooldown(attack.skill, effect_.getCooldown())); + chr.addCooldown(attack.skill, currentServerTime(), effect_.getCooldown() * 1000); + } + } + applyAttack(attack, chr, effect.getAttackCount()); + Skill eaterSkill = SkillFactory.getSkill((chr.getJob().getId() - (chr.getJob().getId() % 10)) * 10000);// MP Eater, works with right job + int eaterLevel = chr.getSkillLevel(eaterSkill); + if (eaterLevel > 0) { + for (Integer singleDamage : attack.allDamage.keySet()) { + eaterSkill.getEffect(eaterLevel).applyPassive(chr, chr.getMap().getMapObject(singleDamage), 0); + } + } + } } diff --git a/src/main/java/net/server/channel/handlers/MakerSkillHandler.java b/src/main/java/net/server/channel/handlers/MakerSkillHandler.java index b374e702c4..daa72eb776 100644 --- a/src/main/java/net/server/channel/handlers/MakerSkillHandler.java +++ b/src/main/java/net/server/channel/handlers/MakerSkillHandler.java @@ -27,11 +27,10 @@ import net.AbstractPacketHandler; import net.packet.InPacket; /** - * * @author Jay Estrella, Ronan */ public final class MakerSkillHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { MakerProcessor.makerAction(p, c); diff --git a/src/main/java/net/server/channel/handlers/MesoDropHandler.java b/src/main/java/net/server/channel/handlers/MesoDropHandler.java index afcbd047aa..2c8254aed7 100644 --- a/src/main/java/net/server/channel/handlers/MesoDropHandler.java +++ b/src/main/java/net/server/channel/handlers/MesoDropHandler.java @@ -28,41 +28,40 @@ import net.packet.InPacket; import tools.PacketCreator; /** - * * @author Matze * @author Ronan - concurrency protection */ public final class MesoDropHandler extends AbstractPacketHandler { - @Override - public final void handlePacket(InPacket p, Client c) { - Character player = c.getPlayer(); - if (!player.isAlive()) { - c.sendPacket(PacketCreator.enableActions()); - return; - } - p.skip(4); - int meso = p.readInt(); - - if (c.tryacquireClient()) { // thanks imbee for noticing players not being able to throw mesos too fast - try { - if (meso <= player.getMeso() && meso > 9 && meso < 50001) { - player.gainMeso(-meso, false, true, false); - } else { - c.sendPacket(PacketCreator.enableActions()); - return; - } - } finally { - c.releaseClient(); - } - } else { - c.sendPacket(PacketCreator.enableActions()); - return; - } - - if (player.attemptCatchFish(meso)) { - player.getMap().disappearingMesoDrop(meso, player, player, player.getPosition()); - } else { - player.getMap().spawnMesoDrop(meso, player.getPosition(), player, player, true, (byte) 2); - } + @Override + public final void handlePacket(InPacket p, Client c) { + Character player = c.getPlayer(); + if (!player.isAlive()) { + c.sendPacket(PacketCreator.enableActions()); + return; } + p.skip(4); + int meso = p.readInt(); + + if (c.tryacquireClient()) { // thanks imbee for noticing players not being able to throw mesos too fast + try { + if (meso <= player.getMeso() && meso > 9 && meso < 50001) { + player.gainMeso(-meso, false, true, false); + } else { + c.sendPacket(PacketCreator.enableActions()); + return; + } + } finally { + c.releaseClient(); + } + } else { + c.sendPacket(PacketCreator.enableActions()); + return; + } + + if (player.attemptCatchFish(meso)) { + player.getMap().disappearingMesoDrop(meso, player, player, player.getPosition()); + } else { + player.getMap().spawnMesoDrop(meso, player.getPosition(), player, player, true, (byte) 2); + } + } } \ No newline at end of file diff --git a/src/main/java/net/server/channel/handlers/MobBanishPlayerHandler.java b/src/main/java/net/server/channel/handlers/MobBanishPlayerHandler.java index 0c4017d7eb..25db10357a 100644 --- a/src/main/java/net/server/channel/handlers/MobBanishPlayerHandler.java +++ b/src/main/java/net/server/channel/handlers/MobBanishPlayerHandler.java @@ -31,10 +31,10 @@ public final class MobBanishPlayerHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { int mobid = p.readInt(); // mob banish handling detected thanks to MedicOP - + Character chr = c.getPlayer(); Monster mob = chr.getMap().getMonsterById(mobid); - + if (mob != null) { BanishInfo banishInfo = mob.getBanish(); if (banishInfo != null) { diff --git a/src/main/java/net/server/channel/handlers/MobDamageMobFriendlyHandler.java b/src/main/java/net/server/channel/handlers/MobDamageMobFriendlyHandler.java index 075d05f7ce..566348416b 100644 --- a/src/main/java/net/server/channel/handlers/MobDamageMobFriendlyHandler.java +++ b/src/main/java/net/server/channel/handlers/MobDamageMobFriendlyHandler.java @@ -31,59 +31,58 @@ import tools.PacketCreator; import tools.Randomizer; /** - * * @author Xotic (XoticStory) & BubblesDev */ public final class MobDamageMobFriendlyHandler extends AbstractPacketHandler { - @Override - public final void handlePacket(InPacket p, Client c) { - int attacker = p.readInt(); - p.readInt(); - int damaged = p.readInt(); - - MapleMap map = c.getPlayer().getMap(); - Monster monster = map.getMonsterByOid(damaged); + @Override + public final void handlePacket(InPacket p, Client c) { + int attacker = p.readInt(); + p.readInt(); + int damaged = p.readInt(); - if (monster == null || map.getMonsterByOid(attacker) == null) { - return; - } + MapleMap map = c.getPlayer().getMap(); + Monster monster = map.getMonsterByOid(damaged); - int damage = Randomizer.nextInt(((monster.getMaxHp() / 13 + monster.getPADamage() * 10)) * 2 + 500) / 10; // Formula planned by Beng. - - if (monster.getHp() - damage < 1) { // friendly dies - if(monster.getId() == 9300102) { - map.broadcastMessage(PacketCreator.serverNotice(6, "The Watch Hog has been injured by the aliens. Better luck next time...")); - } else if (monster.getId() == 9300061) { //moon bunny - map.broadcastMessage(PacketCreator.serverNotice(6, "The Moon Bunny went home because he was sick.")); - } else if(monster.getId() == 9300093) { //tylus - map.broadcastMessage(PacketCreator.serverNotice(6, "Tylus has fallen by the overwhelming forces of the ambush.")); - } else if(monster.getId() == 9300137) { //juliet - map.broadcastMessage(PacketCreator.serverNotice(6, "Juliet has fainted in the middle of the combat.")); - } else if(monster.getId() == 9300138) { //romeo - map.broadcastMessage(PacketCreator.serverNotice(6, "Romeo has fainted in the middle of the combat.")); - } else if(monster.getId() == 9400322 || monster.getId() == 9400327 || monster.getId() == 9400332) { //snowman - map.broadcastMessage(PacketCreator.serverNotice(6, "The Snowman has melted on the heat of the battle.")); - } else if(monster.getId() == 9300162) { //delli - map.broadcastMessage(PacketCreator.serverNotice(6, "Delli vanished after the ambush, sheets still laying on the ground...")); - } - - map.killFriendlies(monster); - } else { - EventInstanceManager eim = map.getEventInstance(); - if (eim != null) { - eim.friendlyDamaged(monster); - } - } - - monster.applyAndGetHpDamage(damage, false); - int remainingHp = monster.getHp(); - if(remainingHp <= 0) { - remainingHp = 0; - map.removeMapObject(monster); - } + if (monster == null || map.getMonsterByOid(attacker) == null) { + return; + } - map.broadcastMessage(PacketCreator.MobDamageMobFriendly(monster, damage, remainingHp), monster.getPosition()); - c.sendPacket(PacketCreator.enableActions()); - } + int damage = Randomizer.nextInt(((monster.getMaxHp() / 13 + monster.getPADamage() * 10)) * 2 + 500) / 10; // Formula planned by Beng. + + if (monster.getHp() - damage < 1) { // friendly dies + if (monster.getId() == 9300102) { + map.broadcastMessage(PacketCreator.serverNotice(6, "The Watch Hog has been injured by the aliens. Better luck next time...")); + } else if (monster.getId() == 9300061) { //moon bunny + map.broadcastMessage(PacketCreator.serverNotice(6, "The Moon Bunny went home because he was sick.")); + } else if (monster.getId() == 9300093) { //tylus + map.broadcastMessage(PacketCreator.serverNotice(6, "Tylus has fallen by the overwhelming forces of the ambush.")); + } else if (monster.getId() == 9300137) { //juliet + map.broadcastMessage(PacketCreator.serverNotice(6, "Juliet has fainted in the middle of the combat.")); + } else if (monster.getId() == 9300138) { //romeo + map.broadcastMessage(PacketCreator.serverNotice(6, "Romeo has fainted in the middle of the combat.")); + } else if (monster.getId() == 9400322 || monster.getId() == 9400327 || monster.getId() == 9400332) { //snowman + map.broadcastMessage(PacketCreator.serverNotice(6, "The Snowman has melted on the heat of the battle.")); + } else if (monster.getId() == 9300162) { //delli + map.broadcastMessage(PacketCreator.serverNotice(6, "Delli vanished after the ambush, sheets still laying on the ground...")); + } + + map.killFriendlies(monster); + } else { + EventInstanceManager eim = map.getEventInstance(); + if (eim != null) { + eim.friendlyDamaged(monster); + } + } + + monster.applyAndGetHpDamage(damage, false); + int remainingHp = monster.getHp(); + if (remainingHp <= 0) { + remainingHp = 0; + map.removeMapObject(monster); + } + + map.broadcastMessage(PacketCreator.MobDamageMobFriendly(monster, damage, remainingHp), monster.getPosition()); + c.sendPacket(PacketCreator.enableActions()); + } } \ No newline at end of file diff --git a/src/main/java/net/server/channel/handlers/MobDamageMobHandler.java b/src/main/java/net/server/channel/handlers/MobDamageMobHandler.java index 6609f56dc9..1bf961c3f2 100644 --- a/src/main/java/net/server/channel/handlers/MobDamageMobHandler.java +++ b/src/main/java/net/server/channel/handlers/MobDamageMobHandler.java @@ -37,7 +37,6 @@ import tools.PacketCreator; import java.util.Map; /** - * * @author Jay Estrella * @author Ronan */ @@ -50,54 +49,54 @@ public final class MobDamageMobHandler extends AbstractPacketHandler { boolean magic = p.readByte() == 0; int dmg = p.readInt(); Character chr = c.getPlayer(); - + MapleMap map = chr.getMap(); Monster attacker = map.getMonsterByOid(from); Monster damaged = map.getMonsterByOid(to); - + if (attacker != null && damaged != null) { int maxDmg = calcMaxDamage(attacker, damaged, magic); // thanks Darter (YungMoozi) for reporting unchecked dmg - + if (dmg > maxDmg) { AutobanFactory.DAMAGE_HACK.alert(c.getPlayer(), "Possible packet editing hypnotize damage exploit."); // thanks Rien dev team - + FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " had hypnotized " + MonsterInformationProvider.getInstance().getMobNameFromId(attacker.getId()) + " to attack " + MonsterInformationProvider.getInstance().getMobNameFromId(damaged.getId()) + " with damage " + dmg + " (max: " + maxDmg + ")"); dmg = maxDmg; } - + map.damageMonster(chr, damaged, dmg); map.broadcastMessage(chr, PacketCreator.damageMonster(to, dmg), false); } } - + private static int calcMaxDamage(Monster attacker, Monster damaged, boolean magic) { int attackerAtk, damagedDef, attackerLevel = attacker.getLevel(); double maxDamage; if (magic) { int atkRate = calcModifier(attacker, MonsterStatus.MAGIC_ATTACK_UP, MonsterStatus.MATK); attackerAtk = (attacker.getStats().getMADamage() * atkRate) / 100; - + int defRate = calcModifier(damaged, MonsterStatus.MAGIC_DEFENSE_UP, MonsterStatus.MDEF); damagedDef = (damaged.getStats().getMDDamage() * defRate) / 100; - + maxDamage = ((attackerAtk * (1.15 + (0.025 * attackerLevel))) - (0.75 * damagedDef)) * (Math.log(Math.abs(damagedDef - attackerAtk)) / Math.log(12)); } else { int atkRate = calcModifier(attacker, MonsterStatus.WEAPON_ATTACK_UP, MonsterStatus.WATK); attackerAtk = (attacker.getStats().getPADamage() * atkRate) / 100; - + int defRate = calcModifier(damaged, MonsterStatus.WEAPON_DEFENSE_UP, MonsterStatus.WDEF); damagedDef = (damaged.getStats().getPDDamage() * defRate) / 100; - + maxDamage = ((attackerAtk * (1.15 + (0.025 * attackerLevel))) - (0.75 * damagedDef)) * (Math.log(Math.abs(damagedDef - attackerAtk)) / Math.log(17)); } - + return (int) maxDamage; } - + private static int calcModifier(Monster monster, MonsterStatus buff, MonsterStatus nerf) { int atkModifier; final Map monsterStati = monster.getStati(); - + MonsterStatusEffect atkBuff = monsterStati.get(buff); if (atkBuff != null) { atkModifier = atkBuff.getStati().get(buff); @@ -109,7 +108,7 @@ public final class MobDamageMobHandler extends AbstractPacketHandler { if (atkNerf != null) { atkModifier -= atkNerf.getStati().get(nerf); } - + return atkModifier; } } diff --git a/src/main/java/net/server/channel/handlers/MonsterCarnivalHandler.java b/src/main/java/net/server/channel/handlers/MonsterCarnivalHandler.java index d43d7297ec..a477e9edd9 100644 --- a/src/main/java/net/server/channel/handlers/MonsterCarnivalHandler.java +++ b/src/main/java/net/server/channel/handlers/MonsterCarnivalHandler.java @@ -41,8 +41,8 @@ import java.util.List; /** - *@author Drago (Dragohe4rt) -*/ + * @author Drago (Dragohe4rt) + */ public final class MonsterCarnivalHandler extends AbstractPacketHandler { @@ -54,7 +54,7 @@ public final class MonsterCarnivalHandler extends AbstractPacketHandler { int tab = p.readByte(); int num = p.readByte(); int neededCP = 0; - if (tab == 0) { + if (tab == 0) { final List> mobs = c.getPlayer().getMap().getMobsToSpawn(); if (num >= mobs.size() || c.getPlayer().getCP() < mobs.get(num).right) { c.sendPacket(PacketCreator.CPQMessage((byte) 1)); @@ -70,7 +70,7 @@ public final class MonsterCarnivalHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.enableActions()); return; } - + if (c.getPlayer().getTeam() == 0) { mcpq.summonR(); } else { @@ -139,7 +139,7 @@ public final class MonsterCarnivalHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.enableActions()); return; } - + MonsterCarnival mcpq = c.getPlayer().getMonsterCarnival(); if (mcpq != null) { if (!mcpq.canGuardianR() && c.getPlayer().getTeam() == 0 || !mcpq.canGuardianB() && c.getPlayer().getTeam() == 1) { @@ -171,7 +171,7 @@ public final class MonsterCarnivalHandler extends AbstractPacketHandler { } c.getPlayer().gainCP(-neededCP); c.getPlayer().getMap().broadcastMessage(PacketCreator.playerSummoned(c.getPlayer().getName(), tab, num)); - }catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); } } finally { diff --git a/src/main/java/net/server/channel/handlers/MoveDragonHandler.java b/src/main/java/net/server/channel/handlers/MoveDragonHandler.java index bd36928bbc..76230c5a99 100644 --- a/src/main/java/net/server/channel/handlers/MoveDragonHandler.java +++ b/src/main/java/net/server/channel/handlers/MoveDragonHandler.java @@ -43,13 +43,14 @@ public class MoveDragonHandler extends AbstractMovementPacketHandler { updatePosition(p, dragon, 0); long movementDataLength = p.getPosition() - movementDataStart; //how many bytes were read by updatePosition p.seek(movementDataStart); - + if (chr.isHidden()) { chr.getMap().broadcastGMPacket(chr, PacketCreator.moveDragon(dragon, startPos, p, movementDataLength)); } else { chr.getMap().broadcastMessage(chr, PacketCreator.moveDragon(dragon, startPos, p, movementDataLength), dragon.getPosition()); } - } catch (EmptyMovementException e) {} + } catch (EmptyMovementException e) { + } } } } \ No newline at end of file diff --git a/src/main/java/net/server/channel/handlers/MoveLifeHandler.java b/src/main/java/net/server/channel/handlers/MoveLifeHandler.java index 5a261a3467..96369ce4aa 100644 --- a/src/main/java/net/server/channel/handlers/MoveLifeHandler.java +++ b/src/main/java/net/server/channel/handlers/MoveLifeHandler.java @@ -47,138 +47,141 @@ import java.util.List; * @author Ronan (HeavenMS) */ public final class MoveLifeHandler extends AbstractMovementPacketHandler { - - @Override - public final void handlePacket(InPacket p, Client c) { - Character player = c.getPlayer(); - MapleMap map = player.getMap(); - - if (player.isChangingMaps()) { // thanks Lame for noticing mob movement shuffle (mob OID on different maps) happening on map transitions - return; - } - - int objectid = p.readInt(); - short moveid = p.readShort(); - MapObject mmo = map.getMapObject(objectid); - if (mmo == null || mmo.getType() != MapObjectType.MONSTER) { - return; - } - - Monster monster = (Monster) mmo; - List banishPlayers = null; - - byte pNibbles = p.readByte(); - byte rawActivity = p.readByte(); - int skillId = p.readByte() & 0xff; - int skillLv = p.readByte() & 0xff; - short pOption = p.readShort(); - p.skip(8); - - if (rawActivity >= 0) { - rawActivity = (byte) (rawActivity & 0xFF >> 1); - } - boolean isAttack = inRangeInclusive(rawActivity, 24, 41); - boolean isSkill = inRangeInclusive(rawActivity, 42, 59); - - MobSkill toUse = null; - int useSkillId = 0, useSkillLevel = 0; - - MobSkill nextUse = null; - int nextSkillId = 0, nextSkillLevel = 0; - - boolean nextMovementCouldBeSkill = !(isSkill || (pNibbles != 0)); - - int castPos; - if (isSkill) { - useSkillId = skillId; - useSkillLevel = skillLv; - - castPos = monster.getSkillPos(useSkillId, useSkillLevel); - if (castPos != -1) { - toUse = MobSkillFactory.getMobSkill(useSkillId, useSkillLevel); - - if (monster.canUseSkill(toUse, true)) { - int animationTime = MonsterInformationProvider.getInstance().getMobSkillAnimationTime(toUse); - if(animationTime > 0 && toUse.getSkillId() != 129) { - toUse.applyDelayedEffect(player, monster, true, animationTime); - } else { - banishPlayers = new LinkedList<>(); - toUse.applyEffect(player, monster, true, banishPlayers); - } - } - } - } else { - castPos = (rawActivity - 24) / 2; - - int atkStatus = monster.canUseAttack(castPos, isSkill); - if (atkStatus < 1) { - rawActivity = -1; - pOption = 0; - } - } - - int mobMp = monster.getMp(); - if (nextMovementCouldBeSkill) { - int noSkills = monster.getNoSkills(); - if (noSkills > 0) { - int rndSkill = Randomizer.nextInt(noSkills); - - Pair skillToUse = monster.getSkills().get(rndSkill); - nextSkillId = skillToUse.getLeft(); - nextSkillLevel = skillToUse.getRight(); - nextUse = MobSkillFactory.getMobSkill(nextSkillId, nextSkillLevel); - - if (!(nextUse != null && monster.canUseSkill(nextUse, false) && nextUse.getHP() >= (int) (((float) monster.getHp() / monster.getMaxHp()) * 100) && mobMp >= nextUse.getMpCon())) { - // thanks OishiiKawaiiDesu for noticing mobs trying to cast skills they are not supposed to be able - - nextSkillId = 0; - nextSkillLevel = 0; - nextUse = null; - } - } - } - - p.readByte(); - p.readInt(); // whatever - short start_x = p.readShort(); // hmm.. startpos? - short start_y = p.readShort(); // hmm... - Point startPos = new Point(start_x, start_y - 2); - Point serverStartPos = new Point(monster.getPosition()); - - Boolean aggro = monster.aggroMoveLifeUpdate(player); - if (aggro == null) return; + @Override + public final void handlePacket(InPacket p, Client c) { + Character player = c.getPlayer(); + MapleMap map = player.getMap(); - if (nextUse != null) { - c.sendPacket(PacketCreator.moveMonsterResponse(objectid, moveid, mobMp, aggro, nextSkillId, nextSkillLevel)); - } else { - c.sendPacket(PacketCreator.moveMonsterResponse(objectid, moveid, mobMp, aggro)); - } - - - try { - int movementDataStart = p.getPosition(); - updatePosition(p, monster, -2); // Thanks Doodle & ZEROå‚‘æ´› for noticing sponge-based bosses moving out of stage in case of no-offset applied - long movementDataLength = p.getPosition() - movementDataStart; //how many bytes were read by updatePosition - p.seek(movementDataStart); - - if (YamlConfig.config.server.USE_DEBUG_SHOW_RCVD_MVLIFE) { - System.out.println((isSkill ? "SKILL " : (isAttack ? "ATTCK " : " ")) + "castPos: " + castPos + " rawAct: " + rawActivity + " opt: " + pOption + " skillID: " + useSkillId + " skillLV: " + useSkillLevel + " " + "allowSkill: " + nextMovementCouldBeSkill + " mobMp: " + mobMp); - } - - map.broadcastMessage(player, PacketCreator.moveMonster(objectid, nextMovementCouldBeSkill, rawActivity, useSkillId, useSkillLevel, pOption, startPos, p, movementDataLength), serverStartPos); - //updatePosition(res, monster, -2); //does this need to be done after the packet is broadcast? - map.moveMonster(monster, monster.getPosition()); - } catch (EmptyMovementException e) {} - - if (banishPlayers != null) { - for (Character chr : banishPlayers) { - chr.changeMapBanish(monster.getBanish().getMap(), monster.getBanish().getPortal(), monster.getBanish().getMsg()); - } - } - } + if (player.isChangingMaps()) { // thanks Lame for noticing mob movement shuffle (mob OID on different maps) happening on map transitions + return; + } - private static boolean inRangeInclusive(Byte pVal, Integer pMin, Integer pMax) { - return !(pVal < pMin) || (pVal > pMax); - } + int objectid = p.readInt(); + short moveid = p.readShort(); + MapObject mmo = map.getMapObject(objectid); + if (mmo == null || mmo.getType() != MapObjectType.MONSTER) { + return; + } + + Monster monster = (Monster) mmo; + List banishPlayers = null; + + byte pNibbles = p.readByte(); + byte rawActivity = p.readByte(); + int skillId = p.readByte() & 0xff; + int skillLv = p.readByte() & 0xff; + short pOption = p.readShort(); + p.skip(8); + + if (rawActivity >= 0) { + rawActivity = (byte) (rawActivity & 0xFF >> 1); + } + + boolean isAttack = inRangeInclusive(rawActivity, 24, 41); + boolean isSkill = inRangeInclusive(rawActivity, 42, 59); + + MobSkill toUse = null; + int useSkillId = 0, useSkillLevel = 0; + + MobSkill nextUse = null; + int nextSkillId = 0, nextSkillLevel = 0; + + boolean nextMovementCouldBeSkill = !(isSkill || (pNibbles != 0)); + + int castPos; + if (isSkill) { + useSkillId = skillId; + useSkillLevel = skillLv; + + castPos = monster.getSkillPos(useSkillId, useSkillLevel); + if (castPos != -1) { + toUse = MobSkillFactory.getMobSkill(useSkillId, useSkillLevel); + + if (monster.canUseSkill(toUse, true)) { + int animationTime = MonsterInformationProvider.getInstance().getMobSkillAnimationTime(toUse); + if (animationTime > 0 && toUse.getSkillId() != 129) { + toUse.applyDelayedEffect(player, monster, true, animationTime); + } else { + banishPlayers = new LinkedList<>(); + toUse.applyEffect(player, monster, true, banishPlayers); + } + } + } + } else { + castPos = (rawActivity - 24) / 2; + + int atkStatus = monster.canUseAttack(castPos, isSkill); + if (atkStatus < 1) { + rawActivity = -1; + pOption = 0; + } + } + + int mobMp = monster.getMp(); + if (nextMovementCouldBeSkill) { + int noSkills = monster.getNoSkills(); + if (noSkills > 0) { + int rndSkill = Randomizer.nextInt(noSkills); + + Pair skillToUse = monster.getSkills().get(rndSkill); + nextSkillId = skillToUse.getLeft(); + nextSkillLevel = skillToUse.getRight(); + nextUse = MobSkillFactory.getMobSkill(nextSkillId, nextSkillLevel); + + if (!(nextUse != null && monster.canUseSkill(nextUse, false) && nextUse.getHP() >= (int) (((float) monster.getHp() / monster.getMaxHp()) * 100) && mobMp >= nextUse.getMpCon())) { + // thanks OishiiKawaiiDesu for noticing mobs trying to cast skills they are not supposed to be able + + nextSkillId = 0; + nextSkillLevel = 0; + nextUse = null; + } + } + } + + p.readByte(); + p.readInt(); // whatever + short start_x = p.readShort(); // hmm.. startpos? + short start_y = p.readShort(); // hmm... + Point startPos = new Point(start_x, start_y - 2); + Point serverStartPos = new Point(monster.getPosition()); + + Boolean aggro = monster.aggroMoveLifeUpdate(player); + if (aggro == null) { + return; + } + + if (nextUse != null) { + c.sendPacket(PacketCreator.moveMonsterResponse(objectid, moveid, mobMp, aggro, nextSkillId, nextSkillLevel)); + } else { + c.sendPacket(PacketCreator.moveMonsterResponse(objectid, moveid, mobMp, aggro)); + } + + + try { + int movementDataStart = p.getPosition(); + updatePosition(p, monster, -2); // Thanks Doodle & ZEROå‚‘æ´› for noticing sponge-based bosses moving out of stage in case of no-offset applied + long movementDataLength = p.getPosition() - movementDataStart; //how many bytes were read by updatePosition + p.seek(movementDataStart); + + if (YamlConfig.config.server.USE_DEBUG_SHOW_RCVD_MVLIFE) { + System.out.println((isSkill ? "SKILL " : (isAttack ? "ATTCK " : " ")) + "castPos: " + castPos + " rawAct: " + rawActivity + " opt: " + pOption + " skillID: " + useSkillId + " skillLV: " + useSkillLevel + " " + "allowSkill: " + nextMovementCouldBeSkill + " mobMp: " + mobMp); + } + + map.broadcastMessage(player, PacketCreator.moveMonster(objectid, nextMovementCouldBeSkill, rawActivity, useSkillId, useSkillLevel, pOption, startPos, p, movementDataLength), serverStartPos); + //updatePosition(res, monster, -2); //does this need to be done after the packet is broadcast? + map.moveMonster(monster, monster.getPosition()); + } catch (EmptyMovementException e) { + } + + if (banishPlayers != null) { + for (Character chr : banishPlayers) { + chr.changeMapBanish(monster.getBanish().getMap(), monster.getBanish().getPortal(), monster.getBanish().getMsg()); + } + } + } + + private static boolean inRangeInclusive(Byte pVal, Integer pMin, Integer pMax) { + return !(pVal < pMin) || (pVal > pMax); + } } \ No newline at end of file diff --git a/src/main/java/net/server/channel/handlers/MovePetHandler.java b/src/main/java/net/server/channel/handlers/MovePetHandler.java index 09bb11b966..6f7a6a36dd 100644 --- a/src/main/java/net/server/channel/handlers/MovePetHandler.java +++ b/src/main/java/net/server/channel/handlers/MovePetHandler.java @@ -37,7 +37,7 @@ public final class MovePetHandler extends AbstractMovementPacketHandler { p.readLong(); // Point startPos = StreamUtil.readShortPoint(slea); List res; - + try { res = parseMovement(p); } catch (EmptyMovementException e) { diff --git a/src/main/java/net/server/channel/handlers/MovePlayerHandler.java b/src/main/java/net/server/channel/handlers/MovePlayerHandler.java index 5e2113fa97..bd1bb96444 100644 --- a/src/main/java/net/server/channel/handlers/MovePlayerHandler.java +++ b/src/main/java/net/server/channel/handlers/MovePlayerHandler.java @@ -35,13 +35,14 @@ public final class MovePlayerHandler extends AbstractMovementPacketHandler { updatePosition(p, c.getPlayer(), 0); long movementDataLength = p.getPosition() - movementDataStart; //how many bytes were read by updatePosition p.seek(movementDataStart); - + c.getPlayer().getMap().movePlayer(c.getPlayer(), c.getPlayer().getPosition()); if (c.getPlayer().isHidden()) { c.getPlayer().getMap().broadcastGMMessage(c.getPlayer(), PacketCreator.movePlayer(c.getPlayer().getId(), p, movementDataLength), false); } else { c.getPlayer().getMap().broadcastMessage(c.getPlayer(), PacketCreator.movePlayer(c.getPlayer().getId(), p, movementDataLength), false); } - } catch (EmptyMovementException e) {} + } catch (EmptyMovementException e) { + } } } diff --git a/src/main/java/net/server/channel/handlers/MoveSummonHandler.java b/src/main/java/net/server/channel/handlers/MoveSummonHandler.java index e0305a3c96..8ba535e6f4 100644 --- a/src/main/java/net/server/channel/handlers/MoveSummonHandler.java +++ b/src/main/java/net/server/channel/handlers/MoveSummonHandler.java @@ -51,9 +51,10 @@ public final class MoveSummonHandler extends AbstractMovementPacketHandler { updatePosition(p, summon, 0); long movementDataLength = p.getPosition() - movementDataStart; //how many bytes were read by updatePosition p.seek(movementDataStart); - + player.getMap().broadcastMessage(player, PacketCreator.moveSummon(player.getId(), oid, startPos, p, movementDataLength), summon.getPosition()); - } catch (EmptyMovementException e) {} + } catch (EmptyMovementException e) { + } } } } diff --git a/src/main/java/net/server/channel/handlers/MultiChatHandler.java b/src/main/java/net/server/channel/handlers/MultiChatHandler.java index 8012f3a05c..ea02341b70 100644 --- a/src/main/java/net/server/channel/handlers/MultiChatHandler.java +++ b/src/main/java/net/server/channel/handlers/MultiChatHandler.java @@ -37,10 +37,10 @@ public final class MultiChatHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { Character player = c.getPlayer(); - if(player.getAutobanManager().getLastSpam(7) + 200 > currentServerTime()) { - return; + if (player.getAutobanManager().getLastSpam(7) + 200 > currentServerTime()) { + return; } - + int type = p.readByte(); // 0 for buddys, 1 for partys int numRecipients = p.readByte(); int[] recipients = new int[numRecipients]; @@ -49,11 +49,11 @@ public final class MultiChatHandler extends AbstractPacketHandler { } String chattext = p.readString(); if (chattext.length() > Byte.MAX_VALUE && !player.isGM()) { - AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit chats."); - FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to send text with length of " + chattext.length()); - c.disconnect(true, false); - return; - } + AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit chats."); + FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to send text with length of " + chattext.length()); + c.disconnect(true, false); + return; + } World world = c.getWorldServer(); if (type == 0) { world.buddyChat(recipients, player.getId(), player.getName(), chattext); diff --git a/src/main/java/net/server/channel/handlers/NPCMoreTalkHandler.java b/src/main/java/net/server/channel/handlers/NPCMoreTalkHandler.java index bf3ee1cf8b..0dc04cd8a0 100644 --- a/src/main/java/net/server/channel/handlers/NPCMoreTalkHandler.java +++ b/src/main/java/net/server/channel/handlers/NPCMoreTalkHandler.java @@ -28,7 +28,6 @@ import scripting.npc.NPCScriptManager; import scripting.quest.QuestScriptManager; /** - * * @author Matze */ public final class NPCMoreTalkHandler extends AbstractPacketHandler { diff --git a/src/main/java/net/server/channel/handlers/NPCShopHandler.java b/src/main/java/net/server/channel/handlers/NPCShopHandler.java index 68a2153239..47ccda3b67 100644 --- a/src/main/java/net/server/channel/handlers/NPCShopHandler.java +++ b/src/main/java/net/server/channel/handlers/NPCShopHandler.java @@ -29,7 +29,6 @@ import net.packet.InPacket; import tools.FilePrinter; /** - * * @author Matze */ public final class NPCShopHandler extends AbstractPacketHandler { @@ -40,10 +39,10 @@ public final class NPCShopHandler extends AbstractPacketHandler { int itemId = p.readInt(); short quantity = p.readShort(); if (quantity < 1) { - AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit a npc shop."); - FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to buy quantity " + quantity + " of item id " + itemId); - c.disconnect(true, false); - return; + AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit a npc shop."); + FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to buy quantity " + quantity + " of item id " + itemId); + c.disconnect(true, false); + return; } c.getPlayer().getShop().buy(c, slot, itemId, quantity); } else if (bmode == 1) { // sell ;) diff --git a/src/main/java/net/server/channel/handlers/NPCTalkHandler.java b/src/main/java/net/server/channel/handlers/NPCTalkHandler.java index d758963b3b..87d3f7e8d2 100644 --- a/src/main/java/net/server/channel/handlers/NPCTalkHandler.java +++ b/src/main/java/net/server/channel/handlers/NPCTalkHandler.java @@ -40,18 +40,20 @@ public final class NPCTalkHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.enableActions()); return; } - - if(currentServerTime() - c.getPlayer().getNpcCooldown() < YamlConfig.config.server.BLOCK_NPC_RACE_CONDT) { + + if (currentServerTime() - c.getPlayer().getNpcCooldown() < YamlConfig.config.server.BLOCK_NPC_RACE_CONDT) { c.sendPacket(PacketCreator.enableActions()); return; } - + int oid = p.readInt(); MapObject obj = c.getPlayer().getMap().getMapObject(oid); if (obj instanceof NPC) { NPC npc = (NPC) obj; - if(YamlConfig.config.server.USE_DEBUG == true) c.getPlayer().dropMessage(5, "Talking to NPC " + npc.getId()); - + if (YamlConfig.config.server.USE_DEBUG == true) { + c.getPlayer().dropMessage(5, "Talking to NPC " + npc.getId()); + } + if (npc.getId() == 9010009) { //is duey DueyProcessor.dueySendTalk(c, false); } else { @@ -59,7 +61,7 @@ public final class NPCTalkHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.enableActions()); return; } - + // Custom handling to reduce the amount of scripts needed. if (npc.getId() >= 9100100 && npc.getId() <= 9100200) { NPCScriptManager.getInstance().start(c, npc.getId(), "gachapon", null); @@ -77,7 +79,7 @@ public final class NPCTalkHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.enableActions()); return; } - + npc.sendShop(c); } } @@ -85,7 +87,7 @@ public final class NPCTalkHandler extends AbstractPacketHandler { } else if (obj instanceof PlayerNPC) { PlayerNPC pnpc = (PlayerNPC) obj; NPCScriptManager nsm = NPCScriptManager.getInstance(); - + if (pnpc.getScriptId() < 9977777 && !nsm.isNpcScriptAvailable(c, "" + pnpc.getScriptId())) { nsm.start(c, pnpc.getScriptId(), "rank_user", null); } else { diff --git a/src/main/java/net/server/channel/handlers/NewYearCardHandler.java b/src/main/java/net/server/channel/handlers/NewYearCardHandler.java index 16c53e11f1..d62e17880c 100644 --- a/src/main/java/net/server/channel/handlers/NewYearCardHandler.java +++ b/src/main/java/net/server/channel/handlers/NewYearCardHandler.java @@ -36,10 +36,9 @@ import java.sql.ResultSet; import java.sql.SQLException; /** - * * @author Ronan - * - * Header layout thanks to Eric + *

+ * Header layout thanks to Eric */ public final class NewYearCardHandler extends AbstractPacketHandler { @@ -47,27 +46,27 @@ public final class NewYearCardHandler extends AbstractPacketHandler { public final void handlePacket(InPacket p, Client c) { final Character player = c.getPlayer(); byte reqMode = p.readByte(); //[00] -> NewYearReq (0 = Send) - - if(reqMode == 0) { // card has been sent - if(player.haveItem(2160101)) { // new year's card + + if (reqMode == 0) { // card has been sent + if (player.haveItem(2160101)) { // new year's card short slot = p.readShort(); //[00 2C] -> nPOS (Item Slot Pos) int itemid = p.readInt(); //[00 20 F5 E5] -> nItemID (item id) int status = getValidNewYearCardStatus(itemid, player, slot); - if(status == 0) { - if(player.canHold(4300000, 1)) { + if (status == 0) { + if (player.canHold(4300000, 1)) { String receiver = p.readString(); //[04 00 54 65 73 74] -> sReceiverName (person to send to) int receiverid = getReceiverId(receiver, c.getWorld()); - if(receiverid != -1) { - if(receiverid != c.getPlayer().getId()) { + if (receiverid != -1) { + if (receiverid != c.getPlayer().getId()) { String message = p.readString(); //[06 00 4C 65 74 74 65 72] -> sContent (message) NewYearCardRecord newyear = new NewYearCardRecord(player.getId(), player.getName(), receiverid, receiver, message); NewYearCardRecord.saveNewYearCard(newyear); player.addNewYearRecord(newyear); - player.getAbstractPlayerInteraction().gainItem(2160101, (short)-1); + player.getAbstractPlayerInteraction().gainItem(2160101, (short) -1); player.getAbstractPlayerInteraction().gainItem(4300000, (short) 1); Server.getInstance().setNewYearCard(newyear); @@ -90,17 +89,19 @@ public final class NewYearCardHandler extends AbstractPacketHandler { } } else { //receiver accepted the card int cardid = p.readInt(); - + NewYearCardRecord newyear = NewYearCardRecord.loadNewYearCard(cardid); - - if(newyear != null && newyear.getReceiverId() == player.getId() && !newyear.isReceiverCardReceived()) { - if(!newyear.isSenderCardDiscarded()) { - if(player.canHold(4301000, 1)) { + + if (newyear != null && newyear.getReceiverId() == player.getId() && !newyear.isReceiverCardReceived()) { + if (!newyear.isSenderCardDiscarded()) { + if (player.canHold(4301000, 1)) { newyear.stopNewYearCardTask(); NewYearCardRecord.updateNewYearCard(newyear); - player.getAbstractPlayerInteraction().gainItem(4301000, (short)1); - if(!newyear.getMessage().isEmpty()) player.dropMessage(6, "[New Year] " + newyear.getSenderName() + ": " + newyear.getMessage()); + player.getAbstractPlayerInteraction().gainItem(4301000, (short) 1); + if (!newyear.getMessage().isEmpty()) { + player.dropMessage(6, "[New Year] " + newyear.getSenderName() + ": " + newyear.getMessage()); + } player.addNewYearRecord(newyear); player.sendPacket(PacketCreator.onNewYearCardRes(player, newyear, 6, 0)); // successfully rcvd @@ -108,7 +109,7 @@ public final class NewYearCardHandler extends AbstractPacketHandler { player.getMap().broadcastMessage(PacketCreator.onNewYearCardRes(player, newyear, 0xD, 0)); Character sender = c.getWorldServer().getPlayerStorage().getCharacterById(newyear.getSenderId()); - if(sender != null && sender.isLoggedinWorld()) { + if (sender != null && sender.isLoggedinWorld()) { sender.getMap().broadcastMessage(PacketCreator.onNewYearCardRes(sender, newyear, 0xD, 0)); sender.dropMessage(6, "[New Year] Your addressee successfully received the New Year card."); } @@ -119,36 +120,38 @@ public final class NewYearCardHandler extends AbstractPacketHandler { player.dropMessage(6, "[New Year] The sender of the New Year card already dropped it. Nothing to receive."); } } else { - if(newyear == null) { + if (newyear == null) { player.dropMessage(6, "[New Year] The sender of the New Year card already dropped it. Nothing to receive."); } } } } - + private static int getReceiverId(String receiver, int world) { try (Connection con = DatabaseConnection.getConnection()) { try (PreparedStatement ps = con.prepareStatement("SELECT id, world FROM characters WHERE name LIKE ?")) { ps.setString(1, receiver); try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { - if(rs.getInt("world") == world) { + if (rs.getInt("world") == world) { return rs.getInt("id"); } } } } - } catch(SQLException sqle) { + } catch (SQLException sqle) { sqle.printStackTrace(); } - + return -1; } - + private static int getValidNewYearCardStatus(int itemid, Character player, short slot) { - if(!ItemConstants.isNewYearCardUse(itemid)) return 0x14; - - Item it = player.getInventory(ItemConstants.getInventoryType(itemid)).getItem(slot); + if (!ItemConstants.isNewYearCardUse(itemid)) { + return 0x14; + } + + Item it = player.getInventory(ItemConstants.getInventoryType(itemid)).getItem(slot); return (it != null && it.getItemId() == itemid) ? 0 : 0x12; - } + } } diff --git a/src/main/java/net/server/channel/handlers/OpenFamilyHandler.java b/src/main/java/net/server/channel/handlers/OpenFamilyHandler.java index ed07333437..8e0f2985c9 100644 --- a/src/main/java/net/server/channel/handlers/OpenFamilyHandler.java +++ b/src/main/java/net/server/channel/handlers/OpenFamilyHandler.java @@ -27,13 +27,14 @@ import net.packet.InPacket; import tools.PacketCreator; /** - * * @author Ubaware */ public final class OpenFamilyHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { - if(!YamlConfig.config.server.USE_FAMILY_SYSTEM) return; + if (!YamlConfig.config.server.USE_FAMILY_SYSTEM) { + return; + } Character chr = c.getPlayer(); c.sendPacket(PacketCreator.getFamilyInfo(chr.getFamilyEntry())); } diff --git a/src/main/java/net/server/channel/handlers/OpenFamilyPedigreeHandler.java b/src/main/java/net/server/channel/handlers/OpenFamilyPedigreeHandler.java index d9c81c3a1a..1477b4364b 100644 --- a/src/main/java/net/server/channel/handlers/OpenFamilyPedigreeHandler.java +++ b/src/main/java/net/server/channel/handlers/OpenFamilyPedigreeHandler.java @@ -27,15 +27,16 @@ import net.packet.InPacket; import tools.PacketCreator; /** - * * @author Ubaware */ public final class OpenFamilyPedigreeHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { - if(!YamlConfig.config.server.USE_FAMILY_SYSTEM) return; + if (!YamlConfig.config.server.USE_FAMILY_SYSTEM) { + return; + } Character target = c.getChannelServer().getPlayerStorage().getCharacterByName(p.readString()); - if(target != null && target.getFamily() != null) { + if (target != null && target.getFamily() != null) { c.sendPacket(PacketCreator.showPedigree(target.getFamilyEntry())); } } diff --git a/src/main/java/net/server/channel/handlers/OwlWarpHandler.java b/src/main/java/net/server/channel/handlers/OwlWarpHandler.java index 7d9df7265f..a1152fcaf1 100644 --- a/src/main/java/net/server/channel/handlers/OwlWarpHandler.java +++ b/src/main/java/net/server/channel/handlers/OwlWarpHandler.java @@ -36,31 +36,37 @@ public final class OwlWarpHandler extends AbstractPacketHandler { public final void handlePacket(InPacket p, Client c) { int ownerid = p.readInt(); int mapid = p.readInt(); - - if(ownerid == c.getPlayer().getId()) { + + if (ownerid == c.getPlayer().getId()) { c.sendPacket(PacketCreator.serverNotice(1, "You cannot visit your own shop.")); return; } - + HiredMerchant hm = c.getWorldServer().getHiredMerchant(ownerid); // if both hired merchant and player shop is on the same map PlayerShop ps; - if(hm == null || hm.getMapId() != mapid || !hm.hasItem(c.getPlayer().getOwlSearch())) { + if (hm == null || hm.getMapId() != mapid || !hm.hasItem(c.getPlayer().getOwlSearch())) { ps = c.getWorldServer().getPlayerShop(ownerid); - if(ps == null || ps.getMapId() != mapid || !ps.hasItem(c.getPlayer().getOwlSearch())) { - if(hm == null && ps == null) c.sendPacket(PacketCreator.getOwlMessage(1)); - else c.sendPacket(PacketCreator.getOwlMessage(3)); + if (ps == null || ps.getMapId() != mapid || !ps.hasItem(c.getPlayer().getOwlSearch())) { + if (hm == null && ps == null) { + c.sendPacket(PacketCreator.getOwlMessage(1)); + } else { + c.sendPacket(PacketCreator.getOwlMessage(3)); + } return; } - - if(ps.isOpen()) { - if(GameConstants.isFreeMarketRoom(mapid)) { - if(ps.getChannel() == c.getChannel()) { + + if (ps.isOpen()) { + if (GameConstants.isFreeMarketRoom(mapid)) { + if (ps.getChannel() == c.getChannel()) { c.getPlayer().changeMap(mapid); - if(ps.isOpen()) { //change map has a delay, must double check - if(!ps.visitShop(c.getPlayer())) { - if(!ps.isBanned(c.getPlayer().getName())) c.sendPacket(PacketCreator.getOwlMessage(2)); - else c.sendPacket(PacketCreator.getOwlMessage(17)); + if (ps.isOpen()) { //change map has a delay, must double check + if (!ps.visitShop(c.getPlayer())) { + if (!ps.isBanned(c.getPlayer().getName())) { + c.sendPacket(PacketCreator.getOwlMessage(2)); + } else { + c.sendPacket(PacketCreator.getOwlMessage(17)); + } } } else { //c.sendPacket(PacketCreator.serverNotice(1, "That merchant has either been closed or is under maintenance.")); @@ -77,13 +83,13 @@ public final class OwlWarpHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.getOwlMessage(18)); } } else { - if(hm.isOpen()) { - if(GameConstants.isFreeMarketRoom(mapid)) { - if(hm.getChannel() == c.getChannel()) { + if (hm.isOpen()) { + if (GameConstants.isFreeMarketRoom(mapid)) { + if (hm.getChannel() == c.getChannel()) { c.getPlayer().changeMap(mapid); - if(hm.isOpen()) { //change map has a delay, must double check - if(hm.addVisitor(c.getPlayer())) { + if (hm.isOpen()) { //change map has a delay, must double check + if (hm.addVisitor(c.getPlayer())) { c.sendPacket(PacketCreator.getHiredMerchant(c.getPlayer(), hm, false)); c.getPlayer().setHiredMerchant(hm); } else { diff --git a/src/main/java/net/server/channel/handlers/PartyOperationHandler.java b/src/main/java/net/server/channel/handlers/PartyOperationHandler.java index 6923ea3949..eddbe0fdbe 100644 --- a/src/main/java/net/server/channel/handlers/PartyOperationHandler.java +++ b/src/main/java/net/server/channel/handlers/PartyOperationHandler.java @@ -39,7 +39,7 @@ import tools.PacketCreator; import java.util.List; public final class PartyOperationHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { int operation = p.readByte(); @@ -48,7 +48,7 @@ public final class PartyOperationHandler extends AbstractPacketHandler { Party party = player.getParty(); switch (operation) { case 1: { // create - Party.createParty(player, false); + Party.createParty(player, false); break; } case 2: { // leave/disband @@ -63,7 +63,7 @@ public final class PartyOperationHandler extends AbstractPacketHandler { } case 3: { // join int partyid = p.readInt(); - + InviteResult inviteRes = InviteCoordinator.answerInvite(InviteType.PARTY, player.getId(), partyid, true); InviteResultType res = inviteRes.result; if (res == InviteResultType.ACCEPTED) { @@ -77,21 +77,21 @@ public final class PartyOperationHandler extends AbstractPacketHandler { String name = p.readString(); Character invited = world.getPlayerStorage().getCharacterByName(name); if (invited != null) { - if(invited.getLevel() < 10 && (!YamlConfig.config.server.USE_PARTY_FOR_STARTERS || player.getLevel() >= 10)) { //min requirement is level 10 + if (invited.getLevel() < 10 && (!YamlConfig.config.server.USE_PARTY_FOR_STARTERS || player.getLevel() >= 10)) { //min requirement is level 10 c.sendPacket(PacketCreator.serverNotice(5, "The player you have invited does not meet the requirements.")); return; } - if(YamlConfig.config.server.USE_PARTY_FOR_STARTERS && invited.getLevel() >= 10 && player.getLevel() < 10) { //trying to invite high level + if (YamlConfig.config.server.USE_PARTY_FOR_STARTERS && invited.getLevel() >= 10 && player.getLevel() < 10) { //trying to invite high level c.sendPacket(PacketCreator.serverNotice(5, "The player you have invited does not meet the requirements.")); return; } - + if (invited.getParty() == null) { if (party == null) { if (!Party.createParty(player, false)) { return; } - + party = player.getParty(); } if (party.getMembers().size() < 6) { @@ -122,6 +122,6 @@ public final class PartyOperationHandler extends AbstractPacketHandler { world.updateParty(party.getId(), PartyOperation.CHANGE_LEADER, newLeadr); break; } - } + } } } \ No newline at end of file diff --git a/src/main/java/net/server/channel/handlers/PartySearchRegisterHandler.java b/src/main/java/net/server/channel/handlers/PartySearchRegisterHandler.java index a2bb8c3bec..8c08934acf 100644 --- a/src/main/java/net/server/channel/handlers/PartySearchRegisterHandler.java +++ b/src/main/java/net/server/channel/handlers/PartySearchRegisterHandler.java @@ -26,11 +26,10 @@ import net.AbstractPacketHandler; import net.packet.InPacket; /** - * * @author Quasar */ public class PartySearchRegisterHandler extends AbstractPacketHandler { - + @Override public void handlePacket(InPacket p, Client c) {} } \ No newline at end of file diff --git a/src/main/java/net/server/channel/handlers/PartySearchStartHandler.java b/src/main/java/net/server/channel/handlers/PartySearchStartHandler.java index 0f9b8a8804..1b55fee3d3 100644 --- a/src/main/java/net/server/channel/handlers/PartySearchStartHandler.java +++ b/src/main/java/net/server/channel/handlers/PartySearchStartHandler.java @@ -30,43 +30,44 @@ import net.server.world.World; import tools.PacketCreator; /** - * * @author XoticStory * @author BubblesDev * @author Ronan */ public class PartySearchStartHandler extends AbstractPacketHandler { - @Override - public void handlePacket(InPacket p, Client c) { - int min = p.readInt(); - int max = p.readInt(); + @Override + public void handlePacket(InPacket p, Client c) { + int min = p.readInt(); + int max = p.readInt(); - Character chr = c.getPlayer(); - if (min > max) { - chr.dropMessage(1, "The min. value is higher than the max!"); - c.sendPacket(PacketCreator.enableActions()); - return; - } + Character chr = c.getPlayer(); + if (min > max) { + chr.dropMessage(1, "The min. value is higher than the max!"); + c.sendPacket(PacketCreator.enableActions()); + return; + } - if (max - min > 30) { - chr.dropMessage(1, "You can only search for party members within a range of 30 levels."); - c.sendPacket(PacketCreator.enableActions()); - return; - } + if (max - min > 30) { + chr.dropMessage(1, "You can only search for party members within a range of 30 levels."); + c.sendPacket(PacketCreator.enableActions()); + return; + } - if (chr.getLevel() < min || chr.getLevel() > max) { - chr.dropMessage(1, "The range of level for search has to include your own level."); - c.sendPacket(PacketCreator.enableActions()); - return; - } + if (chr.getLevel() < min || chr.getLevel() > max) { + chr.dropMessage(1, "The range of level for search has to include your own level."); + c.sendPacket(PacketCreator.enableActions()); + return; + } - p.readInt(); // members - int jobs = p.readInt(); + p.readInt(); // members + int jobs = p.readInt(); - Party party = c.getPlayer().getParty(); - if (party == null || !c.getPlayer().isPartyLeader()) return; + Party party = c.getPlayer().getParty(); + if (party == null || !c.getPlayer().isPartyLeader()) { + return; + } - World world = c.getWorldServer(); - world.getPartySearchCoordinator().registerPartyLeader(chr, min, max, jobs); - } + World world = c.getWorldServer(); + world.getPartySearchCoordinator().registerPartyLeader(chr, min, max, jobs); + } } \ No newline at end of file diff --git a/src/main/java/net/server/channel/handlers/PartySearchUpdateHandler.java b/src/main/java/net/server/channel/handlers/PartySearchUpdateHandler.java index fa56e3fa8c..98321453df 100644 --- a/src/main/java/net/server/channel/handlers/PartySearchUpdateHandler.java +++ b/src/main/java/net/server/channel/handlers/PartySearchUpdateHandler.java @@ -26,7 +26,7 @@ import net.AbstractPacketHandler; import net.packet.InPacket; public final class PartySearchUpdateHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { c.getWorldServer().getPartySearchCoordinator().unregisterPartyLeader(c.getPlayer()); diff --git a/src/main/java/net/server/channel/handlers/PetAutoPotHandler.java b/src/main/java/net/server/channel/handlers/PetAutoPotHandler.java index 822fd8bcbe..fb008d0a77 100644 --- a/src/main/java/net/server/channel/handlers/PetAutoPotHandler.java +++ b/src/main/java/net/server/channel/handlers/PetAutoPotHandler.java @@ -30,7 +30,7 @@ import server.ItemInformationProvider; import server.StatEffect; public final class PetAutoPotHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { p.readByte(); @@ -38,20 +38,20 @@ public final class PetAutoPotHandler extends AbstractPacketHandler { p.readInt(); short slot = p.readShort(); int itemId = p.readInt(); - + Character chr = c.getPlayer(); StatEffect stat = ItemInformationProvider.getInstance().getItemEffect(itemId); if (stat.getHp() > 0 || stat.getHpRate() > 0.0) { float estimatedHp = ((float) chr.getHp()) / chr.getMaxHp(); chr.setAutopotHpAlert(estimatedHp + 0.05f); } - + if (stat.getMp() > 0 || stat.getMpRate() > 0.0) { float estimatedMp = ((float) chr.getMp()) / chr.getMaxMp(); chr.setAutopotMpAlert(estimatedMp + 0.05f); } - + PetAutopotProcessor.runAutopotAction(c, slot, itemId); } - + } diff --git a/src/main/java/net/server/channel/handlers/PetChatHandler.java b/src/main/java/net/server/channel/handlers/PetChatHandler.java index a85f68fcf5..7173179ad9 100644 --- a/src/main/java/net/server/channel/handlers/PetChatHandler.java +++ b/src/main/java/net/server/channel/handlers/PetChatHandler.java @@ -31,7 +31,7 @@ import tools.LogHelper; import tools.PacketCreator; public final class PetChatHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { int petId = p.readInt(); @@ -40,18 +40,18 @@ public final class PetChatHandler extends AbstractPacketHandler { int act = p.readByte(); byte pet = c.getPlayer().getPetIndex(petId); if ((pet < 0 || pet > 3) || (act < 0 || act > 9)) { - return; + return; } String text = p.readString(); if (text.length() > Byte.MAX_VALUE) { - AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit with pets."); - FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to send text with length of " + text.length()); - c.disconnect(true, false); - return; + AutobanFactory.PACKET_EDIT.alert(c.getPlayer(), c.getPlayer().getName() + " tried to packet edit with pets."); + FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " tried to send text with length of " + text.length()); + c.disconnect(true, false); + return; } c.getPlayer().getMap().broadcastMessage(c.getPlayer(), PacketCreator.petChat(c.getPlayer().getId(), pet, act, text), true); if (YamlConfig.config.server.USE_ENABLE_CHAT_LOG) { LogHelper.logChat(c, "Pet", text); } - } + } } diff --git a/src/main/java/net/server/channel/handlers/PetCommandHandler.java b/src/main/java/net/server/channel/handlers/PetCommandHandler.java index 2dbdb28dc9..1c7510bb12 100644 --- a/src/main/java/net/server/channel/handlers/PetCommandHandler.java +++ b/src/main/java/net/server/channel/handlers/PetCommandHandler.java @@ -51,7 +51,7 @@ public final class PetCommandHandler extends AbstractPacketHandler { if (petCommand == null) { return; } - + if (Randomizer.nextInt(100) < petCommand.getProbability()) { pet.gainClosenessFullness(chr, petCommand.getIncrease(), 0, command); chr.getMap().broadcastMessage(PacketCreator.commandResponse(chr.getId(), petIndex, false, command, false)); diff --git a/src/main/java/net/server/channel/handlers/PetExcludeItemsHandler.java b/src/main/java/net/server/channel/handlers/PetExcludeItemsHandler.java index b172fa3503..04e6157b4c 100644 --- a/src/main/java/net/server/channel/handlers/PetExcludeItemsHandler.java +++ b/src/main/java/net/server/channel/handlers/PetExcludeItemsHandler.java @@ -41,7 +41,9 @@ public final class PetExcludeItemsHandler extends AbstractPacketHandler { Character chr = c.getPlayer(); byte petIndex = chr.getPetIndex(petId); - if (petIndex < 0) return; + if (petIndex < 0) { + return; + } final Pet pet = chr.getPet(petIndex); if (pet == null) { diff --git a/src/main/java/net/server/channel/handlers/PetFoodHandler.java b/src/main/java/net/server/channel/handlers/PetFoodHandler.java index 8195a92c70..4c44e65fc2 100644 --- a/src/main/java/net/server/channel/handlers/PetFoodHandler.java +++ b/src/main/java/net/server/channel/handlers/PetFoodHandler.java @@ -62,13 +62,15 @@ public final class PetFoodHandler extends AbstractPacketHandler { } } } - + Pet pet = chr.getPet(slot); - if(pet == null) return; - + if (pet == null) { + return; + } + short pos = p.readShort(); int itemId = p.readInt(); - + if (c.tryacquireClient()) { try { Inventory useInv = chr.getInventory(InventoryType.USE); diff --git a/src/main/java/net/server/channel/handlers/PetLootHandler.java b/src/main/java/net/server/channel/handlers/PetLootHandler.java index 456173899e..b20e81df84 100644 --- a/src/main/java/net/server/channel/handlers/PetLootHandler.java +++ b/src/main/java/net/server/channel/handlers/PetLootHandler.java @@ -40,14 +40,14 @@ public final class PetLootHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { Character chr = c.getPlayer(); - + int petIndex = chr.getPetIndex(p.readInt()); Pet pet = chr.getPet(petIndex); if (pet == null || !pet.isSummoned()) { c.sendPacket(PacketCreator.enableActions()); return; } - + p.skip(13); int oid = p.readInt(); MapObject ob = chr.getMap().getMapObject(oid); @@ -61,7 +61,7 @@ public final class PetLootHandler extends AbstractPacketHandler { if (chr.isEquippedPetItemIgnore()) { final Set petIgnore = chr.getExcludedItems(); - if(!petIgnore.isEmpty() && petIgnore.contains(Integer.MAX_VALUE)) { + if (!petIgnore.isEmpty() && petIgnore.contains(Integer.MAX_VALUE)) { c.sendPacket(PacketCreator.enableActions()); return; } @@ -74,7 +74,7 @@ public final class PetLootHandler extends AbstractPacketHandler { if (chr.isEquippedPetItemIgnore()) { final Set petIgnore = chr.getExcludedItems(); - if(!petIgnore.isEmpty() && petIgnore.contains(mapitem.getItem().getItemId())) { + if (!petIgnore.isEmpty() && petIgnore.contains(mapitem.getItem().getItemId())) { c.sendPacket(PacketCreator.enableActions()); return; } diff --git a/src/main/java/net/server/channel/handlers/PlayerInteractionHandler.java b/src/main/java/net/server/channel/handlers/PlayerInteractionHandler.java index fd670a78ad..75e90ae749 100644 --- a/src/main/java/net/server/channel/handlers/PlayerInteractionHandler.java +++ b/src/main/java/net/server/channel/handlers/PlayerInteractionHandler.java @@ -46,7 +46,6 @@ import java.sql.SQLException; import java.util.Arrays; /** - * * @author Matze * @author Ronan - concurrency safety and reviewed minigames */ @@ -100,7 +99,7 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { SELECT_CARD(0x44); final byte code; - private Action(int code) { + Action(int code) { this.code = (byte) code; } @@ -118,26 +117,26 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { return 13; } - if(chr.getEventInstance() != null) { + if (chr.getEventInstance() != null) { return 5; } - + return 0; } - + @Override public final void handlePacket(InPacket p, Client c) { if (!c.tryacquireClient()) { // thanks GabrielSin for pointing dupes within player interactions c.sendPacket(PacketCreator.enableActions()); return; } - + try { byte mode = p.readByte(); final Character chr = c.getPlayer(); - + if (mode == Action.CREATE.getCode()) { - if(!chr.isAlive()) { // thanks GabrielSin for pointing this + if (!chr.isAlive()) { // thanks GabrielSin for pointing this chr.sendPacket(PacketCreator.getMiniRoomError(4)); return; } @@ -221,7 +220,7 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { chr.getMap().broadcastMessage(PacketCreator.addMatchCardBox(chr, 1, 0)); game.sendMatchCard(c, type); } else if (createType == 4 || createType == 5) { // shop - if(!GameConstants.isFreeMarketRoom(chr.getMapId())) { + if (!GameConstants.isFreeMarketRoom(chr.getMapId())) { chr.sendPacket(PacketCreator.getMiniRoomError(15)); return; } @@ -231,11 +230,11 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { chr.sendPacket(PacketCreator.getMiniRoomError(status)); return; } - + if (!canPlaceStore(chr)) { return; } - + String desc = p.readString(); p.skip(3); int itemId = p.readInt(); @@ -265,7 +264,7 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { if (other == null || chr.getId() == other.getId()) { return; } - + Trade.inviteTrade(chr, other); } else if (mode == Action.DECLINE.getCode()) { Trade.declineTrade(chr); @@ -278,7 +277,9 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { return; } } else { - if (isTradeOpen(chr)) return; + if (isTradeOpen(chr)) { + return; + } int oid = p.readInt(); MapObject ob = chr.getMap().getMapObject(oid); @@ -290,7 +291,7 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { String pw = p.available() > 1 ? p.readString() : ""; MiniGame game = (MiniGame) ob; - if(game.checkPassword(pw)) { + if (game.checkPassword(pw)) { if (game.hasFreeSlot() && !game.isVisitor(chr)) { game.addVisitor(chr); chr.setMiniGame(game); @@ -339,8 +340,10 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { chr.closeHiredMerchant(true); } } else if (mode == Action.OPEN_STORE.getCode() || mode == Action.OPEN_CASH.getCode()) { - if (isTradeOpen(chr)) return; - + if (isTradeOpen(chr)) { + return; + } + if (mode == Action.OPEN_STORE.getCode()) { p.readByte(); //01 } else { @@ -350,10 +353,10 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.serverNotice(1, "Please check again the birthday date.")); return; } - + c.sendPacket(PacketCreator.hiredMerchantOwnerMaintenanceLeave()); } - + if (!canPlaceStore(chr)) { // thanks Ari for noticing player shops overlapping on opening time return; } @@ -361,10 +364,11 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { PlayerShop shop = chr.getPlayerShop(); HiredMerchant merchant = chr.getHiredMerchant(); if (shop != null && shop.isOwner(chr)) { - if(YamlConfig.config.server.USE_ERASE_PERMIT_ON_OPENSHOP) { + if (YamlConfig.config.server.USE_ERASE_PERMIT_ON_OPENSHOP) { try { InventoryManipulator.removeById(c, InventoryType.CASH, shop.getItemId(), 1, true, false); - } catch(RuntimeException re) {} // fella does not have a player shop permit... + } catch (RuntimeException re) { + } // fella does not have a player shop permit... } chr.getMap().broadcastMessage(PacketCreator.updatePlayerShopBox(shop)); @@ -483,30 +487,30 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.enableActions()); return; } - + if (item == null) { c.sendPacket(PacketCreator.serverNotice(1, "Invalid item description.")); c.sendPacket(PacketCreator.enableActions()); return; } - + if (ii.isUnmerchable(item.getItemId())) { if (ItemConstants.isPet(item.getItemId())) { c.sendPacket(PacketCreator.serverNotice(1, "Pets are not allowed to be traded.")); } else { c.sendPacket(PacketCreator.serverNotice(1, "Cash items are not allowed to be traded.")); } - + c.sendPacket(PacketCreator.enableActions()); return; } - + if (quantity < 1 || quantity > item.getQuantity()) { c.sendPacket(PacketCreator.serverNotice(1, "You don't have enough quantity of the item.")); c.sendPacket(PacketCreator.enableActions()); return; } - + Trade trade = chr.getTrade(); if (trade != null) { if ((quantity <= item.getQuantity() && quantity >= 0) || ItemConstants.isRechargeable(item.getItemId())) { @@ -517,7 +521,7 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { return; } } - + Inventory inv = chr.getInventory(ivType); inv.lockInventory(); try { @@ -527,18 +531,18 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.enableActions()); return; } - + Item tradeItem = item.copy(); if (ItemConstants.isRechargeable(item.getItemId())) { quantity = item.getQuantity(); } - + tradeItem.setQuantity(quantity); tradeItem.setPosition(targetSlot); - + if (trade.addItem(tradeItem)) { InventoryManipulator.removeFromSlot(c, ivType, item.getPosition(), quantity, true); - + trade.getChr().sendPacket(PacketCreator.getTradeItemAdd((byte) 0, tradeItem)); if (trade.getPartner() != null) { trade.getPartner().getChr().sendPacket(PacketCreator.getTradeItemAdd((byte) 1, tradeItem)); @@ -554,7 +558,9 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { } else if (mode == Action.CONFIRM.getCode()) { Trade.completeTrade(chr); } else if (mode == Action.ADD_ITEM.getCode() || mode == Action.PUT_ITEM.getCode()) { - if (isTradeOpen(chr)) return; + if (isTradeOpen(chr)) { + return; + } InventoryType ivType = InventoryType.getByType(p.readByte()); short slot = p.readShort(); @@ -571,13 +577,13 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { } else { c.sendPacket(PacketCreator.serverNotice(1, "Cash items are not allowed to be sold on the Player Store.")); } - + c.sendPacket(PacketCreator.enableActions()); return; } short perBundle = p.readShort(); - + if (ItemConstants.isRechargeable(ivItem.getItemId())) { perBundle = 1; bundles = 1; @@ -593,9 +599,9 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { FilePrinter.printError(FilePrinter.EXPLOITS + chr.getName() + ".txt", chr.getName() + " might of possibly packet edited Hired Merchants\nperBundle: " + perBundle + "\nperBundle * bundles (This multiplied cannot be greater than 2000): " + perBundle * bundles + "\nbundles: " + bundles + "\nprice: " + price); return; } - + Item sellItem = ivItem.copy(); - if(!ItemConstants.isRechargeable(ivItem.getItemId())) { + if (!ItemConstants.isRechargeable(ivItem.getItemId())) { sellItem.setQuantity(perBundle); } @@ -607,37 +613,37 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.serverNotice(1, "You can't sell it anymore.")); return; } - + if (ItemConstants.isRechargeable(ivItem.getItemId())) { InventoryManipulator.removeFromSlot(c, ivType, slot, ivItem.getQuantity(), true); } else { InventoryManipulator.removeFromSlot(c, ivType, slot, (short) (bundles * perBundle), true); } - + c.sendPacket(PacketCreator.getPlayerShopItemUpdate(shop)); } else if (merchant != null && merchant.isOwner(chr)) { if (ivType.equals(InventoryType.CASH) && merchant.isPublished()) { c.sendPacket(PacketCreator.serverNotice(1, "Cash items are only allowed to be sold when first opening the store.")); return; } - + if (merchant.isOpen() || !merchant.addItem(shopItem)) { // thanks Vcoc for pointing an exploit with unlimited shop slots c.sendPacket(PacketCreator.serverNotice(1, "You can't sell it anymore.")); return; } - + if (ItemConstants.isRechargeable(ivItem.getItemId())) { InventoryManipulator.removeFromSlot(c, ivType, slot, ivItem.getQuantity(), true); } else { InventoryManipulator.removeFromSlot(c, ivType, slot, (short) (bundles * perBundle), true); } - + c.sendPacket(PacketCreator.updateHiredMerchant(merchant, chr)); - + if (YamlConfig.config.server.USE_ENFORCE_MERCHANT_SAVE) { chr.saveCharToDB(false); } - + try { merchant.saveItems(false); // thanks Masterrulax for realizing yet another dupe with merchants/Fredrick } catch (SQLException ex) { @@ -647,7 +653,9 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.serverNotice(1, "You can't sell without owning a shop.")); } } else if (mode == Action.REMOVE_ITEM.getCode()) { - if (isTradeOpen(chr)) return; + if (isTradeOpen(chr)) { + return; + } PlayerShop shop = chr.getPlayerShop(); if (shop != null && shop.isOwner(chr)) { @@ -668,12 +676,16 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { } } else if (mode == Action.MERCHANT_MESO.getCode()) { HiredMerchant merchant = chr.getHiredMerchant(); - if (merchant == null) return; + if (merchant == null) { + return; + } merchant.withdrawMesos(chr); } else if (mode == Action.MERCHANT_ORGANIZE.getCode()) { HiredMerchant merchant = chr.getHiredMerchant(); - if (merchant == null || !merchant.isOwner(chr)) return; + if (merchant == null || !merchant.isOwner(chr)) { + return; + } merchant.withdrawMesos(chr); merchant.clearInexistentItems(); @@ -685,7 +697,9 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.updateHiredMerchant(merchant, chr)); } else if (mode == Action.BUY.getCode() || mode == Action.MERCHANT_BUY.getCode()) { - if (isTradeOpen(chr)) return; + if (isTradeOpen(chr)) { + return; + } int itemid = p.readByte(); short quantity = p.readShort(); @@ -706,7 +720,9 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { merchant.broadcastToVisitorsThreadsafe(PacketCreator.updateHiredMerchant(merchant, chr)); } } else if (mode == Action.TAKE_ITEM_BACK.getCode()) { - if (isTradeOpen(chr)) return; + if (isTradeOpen(chr)) { + return; + } HiredMerchant merchant = chr.getHiredMerchant(); if (merchant != null && merchant.isOwner(chr)) { @@ -726,17 +742,21 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { merchant.takeItemBack(slot, chr); } } else if (mode == Action.CLOSE_MERCHANT.getCode()) { - if (isTradeOpen(chr)) return; + if (isTradeOpen(chr)) { + return; + } HiredMerchant merchant = chr.getHiredMerchant(); if (merchant != null) { merchant.closeOwnerMerchant(chr); } } else if (mode == Action.MAINTENANCE_OFF.getCode()) { - if (isTradeOpen(chr)) return; + if (isTradeOpen(chr)) { + return; + } HiredMerchant merchant = chr.getHiredMerchant(); - if(merchant != null) { + if (merchant != null) { if (merchant.isOwner(chr)) { if (merchant.getItems().isEmpty()) { merchant.closeOwnerMerchant(chr); @@ -759,22 +779,22 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { } } else if (mode == Action.EXPEL.getCode()) { MiniGame miniGame = chr.getMiniGame(); - if(miniGame != null && miniGame.isOwner(chr)) { + if (miniGame != null && miniGame.isOwner(chr)) { Character visitor = miniGame.getVisitor(); - if(visitor != null) { + if (visitor != null) { visitor.closeMiniGame(false); visitor.sendPacket(PacketCreator.getMiniGameClose(true, 5)); } } } else if (mode == Action.EXIT_AFTER_GAME.getCode()) { MiniGame miniGame = chr.getMiniGame(); - if(miniGame != null) { + if (miniGame != null) { miniGame.setQuitAfterGame(chr, true); } } else if (mode == Action.CANCEL_EXIT_AFTER_GAME.getCode()) { MiniGame miniGame = chr.getMiniGame(); - if(miniGame != null) { + if (miniGame != null) { miniGame.setQuitAfterGame(chr, false); } } @@ -782,17 +802,17 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { c.releaseClient(); } } - + private static boolean isTradeOpen(Character chr) { if (chr.getTrade() != null) { // thanks to Rien dev team //Apparently there is a dupe exploit that causes racing conditions when saving/retrieving from the db with stuff like trade open. chr.sendPacket(PacketCreator.enableActions()); return true; } - + return false; } - + private static boolean canPlaceStore(Character chr) { try { for (MapObject mmo : chr.getMap().getMapObjectsInRange(chr.getPosition(), 23000, Arrays.asList(MapObjectType.HIRED_MERCHANT, MapObjectType.PLAYER))) { @@ -822,7 +842,7 @@ public final class PlayerInteractionHandler extends AbstractPacketHandler { } catch (Exception e) { e.printStackTrace(); } - + return true; } } diff --git a/src/main/java/net/server/channel/handlers/PlayerLoggedinHandler.java b/src/main/java/net/server/channel/handlers/PlayerLoggedinHandler.java index 55784517ba..179ffe3401 100644 --- a/src/main/java/net/server/channel/handlers/PlayerLoggedinHandler.java +++ b/src/main/java/net/server/channel/handlers/PlayerLoggedinHandler.java @@ -61,24 +61,24 @@ import java.util.stream.Collectors; public final class PlayerLoggedinHandler extends AbstractPacketHandler { private static final Set attemptingLoginAccounts = new HashSet<>(); - + private boolean tryAcquireAccount(int accId) { synchronized (attemptingLoginAccounts) { if (attemptingLoginAccounts.contains(accId)) { return false; } - + attemptingLoginAccounts.add(accId); return true; } } - + private void releaseAccount(int accId) { synchronized (attemptingLoginAccounts) { attemptingLoginAccounts.remove(accId); } } - + @Override public final boolean validateState(Client c) { return !c.isLoggedIn(); @@ -88,7 +88,7 @@ public final class PlayerLoggedinHandler extends AbstractPacketHandler { public final void handlePacket(InPacket p, Client c) { final int cid = p.readInt(); // TODO: investigate if this is the "client id" supplied in PacketCreator#getServerIP() final Server server = Server.getInstance(); - + if (!c.tryacquireClient()) { // thanks MedicOP for assisting on concurrency protection here c.sendPacket(PacketCreator.getAfterLoginError(10)); @@ -385,7 +385,9 @@ public final class PlayerLoggedinHandler extends AbstractPacketHandler { player.commitExcludedItems(); showDueyNotification(c, player); - if (player.getMap().getHPDec() > 0) player.resetHpDecreaseTask(); + if (player.getMap().getHPDec() > 0) { + player.resetHpDecreaseTask(); + } player.resetPlayerRates(); if (YamlConfig.config.server.USE_ADD_RATES_BY_LEVEL) { @@ -432,22 +434,24 @@ public final class PlayerLoggedinHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.setNPCScriptable(npcsIds)); } - if (newcomer) player.setLoginTime(System.currentTimeMillis()); + if (newcomer) { + player.setLoginTime(System.currentTimeMillis()); + } } catch (Exception e) { e.printStackTrace(); } finally { c.releaseClient(); } } - + private static void showDueyNotification(Client c, Character player) { try (Connection con = DatabaseConnection.getConnection(); - PreparedStatement ps = con.prepareStatement("SELECT Type FROM dueypackages WHERE ReceiverId = ? AND Checked = 1 ORDER BY Type DESC")) { + PreparedStatement ps = con.prepareStatement("SELECT Type FROM dueypackages WHERE ReceiverId = ? AND Checked = 1 ORDER BY Type DESC")) { ps.setInt(1, player.getId()); try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { - try (PreparedStatement ps2 = con.prepareStatement("UPDATE dueypackages SET Checked = 0 WHERE ReceiverId = ?")){ + try (PreparedStatement ps2 = con.prepareStatement("UPDATE dueypackages SET Checked = 0 WHERE ReceiverId = ?")) { ps2.setInt(1, player.getId()); ps2.executeUpdate(); @@ -459,17 +463,17 @@ public final class PlayerLoggedinHandler extends AbstractPacketHandler { e.printStackTrace(); } } - + private static List> getLocalStartTimes(List lpbvl) { List> timedBuffs = new ArrayList<>(); long curtime = currentServerTime(); - - for(PlayerBuffValueHolder pb : lpbvl) { + + for (PlayerBuffValueHolder pb : lpbvl) { timedBuffs.add(new Pair<>(curtime - pb.usedTime, pb)); } - + timedBuffs.sort((p1, p2) -> p1.getLeft().compareTo(p2.getLeft())); - + return timedBuffs; } } diff --git a/src/main/java/net/server/channel/handlers/PlayerMapTransitionHandler.java b/src/main/java/net/server/channel/handlers/PlayerMapTransitionHandler.java index afbda6061d..0339a3d7f6 100644 --- a/src/main/java/net/server/channel/handlers/PlayerMapTransitionHandler.java +++ b/src/main/java/net/server/channel/handlers/PlayerMapTransitionHandler.java @@ -34,24 +34,23 @@ import java.util.Collections; import java.util.List; /** - * * @author Ronan */ public final class PlayerMapTransitionHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { Character chr = c.getPlayer(); chr.setMapTransitionComplete(); - + int beaconid = chr.getBuffSource(BuffStat.HOMING_BEACON); if (beaconid != -1) { chr.cancelBuffStats(BuffStat.HOMING_BEACON); - + final List> stat = Collections.singletonList(new Pair<>(BuffStat.HOMING_BEACON, 0)); chr.sendPacket(PacketCreator.giveBuff(1, beaconid, stat)); } - + if (!chr.isHidden()) { // thanks Lame (Conrad) for noticing hidden characters controlling mobs for (MapObject mo : chr.getMap().getMonsters()) { // thanks BHB, IxianMace, Jefe for noticing several issues regarding mob statuses (such as freeze) Monster m = (Monster) mo; diff --git a/src/main/java/net/server/channel/handlers/QuestActionHandler.java b/src/main/java/net/server/channel/handlers/QuestActionHandler.java index f3db90f242..9a11c75814 100644 --- a/src/main/java/net/server/channel/handlers/QuestActionHandler.java +++ b/src/main/java/net/server/channel/handlers/QuestActionHandler.java @@ -32,17 +32,16 @@ import server.quest.Quest; import java.awt.*; /** - * * @author Matze */ public final class QuestActionHandler extends AbstractPacketHandler { - + // isNpcNearby thanks to GabrielSin private static boolean isNpcNearby(InPacket p, Character player, Quest quest, int npcId) { Point playerP; Point pos = player.getPosition(); - - if(p.available() >= 4) { + + if (p.available() >= 4) { playerP = new Point(p.readShort(), p.readShort()); if (playerP.distance(pos) > 1000) { // thanks Darter (YungMoozi) for reporting unchecked player position playerP = pos; @@ -50,50 +49,50 @@ public final class QuestActionHandler extends AbstractPacketHandler { } else { playerP = pos; } - + if (!quest.isAutoStart() && !quest.isAutoComplete()) { NPC npc = player.getMap().getNPCById(npcId); - if(npc == null) { + if (npc == null) { return false; } - + Point npcP = npc.getPosition(); if (Math.abs(npcP.getX() - playerP.getX()) > 1200 || Math.abs(npcP.getY() - playerP.getY()) > 800) { player.dropMessage(5, "Approach the NPC to fulfill this quest operation."); return false; } } - + return true; } - + @Override public final void handlePacket(InPacket p, Client c) { byte action = p.readByte(); short questid = p.readShort(); Character player = c.getPlayer(); Quest quest = Quest.getInstance(questid); - + if (action == 0) { // Restore lost item, Credits Darter ( Rajan ) p.readInt(); int itemid = p.readInt(); quest.restoreLostItem(player, itemid); } else if (action == 1) { //Start Quest int npc = p.readInt(); - if(!isNpcNearby(p, player, quest, npc)) { + if (!isNpcNearby(p, player, quest, npc)) { return; } - - if(quest.canStart(player, npc)) { + + if (quest.canStart(player, npc)) { quest.start(player, npc); } } else if (action == 2) { // Complete Quest int npc = p.readInt(); - if(!isNpcNearby(p, player, quest, npc)) { + if (!isNpcNearby(p, player, quest, npc)) { return; } - - if(quest.canComplete(player, npc)) { + + if (quest.canComplete(player, npc)) { if (p.available() >= 2) { int selection = p.readShort(); quest.complete(player, npc, selection); @@ -105,20 +104,20 @@ public final class QuestActionHandler extends AbstractPacketHandler { quest.forfeit(player); } else if (action == 4) { // scripted start quest int npc = p.readInt(); - if(!isNpcNearby(p, player, quest, npc)) { + if (!isNpcNearby(p, player, quest, npc)) { return; } - - if(quest.canStart(player, npc)) { + + if (quest.canStart(player, npc)) { QuestScriptManager.getInstance().start(c, questid, npc); } } else if (action == 5) { // scripted end quests int npc = p.readInt(); - if(!isNpcNearby(p, player, quest, npc)) { + if (!isNpcNearby(p, player, quest, npc)) { return; } - - if(quest.canComplete(player, npc)) { + + if (quest.canComplete(player, npc)) { QuestScriptManager.getInstance().end(c, questid, npc); } } diff --git a/src/main/java/net/server/channel/handlers/QuickslotKeyMappedModifiedHandler.java b/src/main/java/net/server/channel/handlers/QuickslotKeyMappedModifiedHandler.java index abd57ca666..fba135f542 100644 --- a/src/main/java/net/server/channel/handlers/QuickslotKeyMappedModifiedHandler.java +++ b/src/main/java/net/server/channel/handlers/QuickslotKeyMappedModifiedHandler.java @@ -6,26 +6,21 @@ import net.AbstractPacketHandler; import net.packet.InPacket; /** - * * @author Shavit */ -public class QuickslotKeyMappedModifiedHandler extends AbstractPacketHandler -{ +public class QuickslotKeyMappedModifiedHandler extends AbstractPacketHandler { @Override - public void handlePacket(InPacket p, Client c) - { + public void handlePacket(InPacket p, Client c) { // Invalid size for the packet. - if(p.available() != QuickslotBinding.QUICKSLOT_SIZE * Integer.BYTES || - // not logged in-game - c.getPlayer() == null) - { + if (p.available() != QuickslotBinding.QUICKSLOT_SIZE * Integer.BYTES || + // not logged in-game + c.getPlayer() == null) { return; } byte[] aQuickslotKeyMapped = new byte[QuickslotBinding.QUICKSLOT_SIZE]; - for(int i = 0; i < QuickslotBinding.QUICKSLOT_SIZE; i++) - { + for (int i = 0; i < QuickslotBinding.QUICKSLOT_SIZE; i++) { aQuickslotKeyMapped[i] = (byte) p.readInt(); } diff --git a/src/main/java/net/server/channel/handlers/RPSActionHandler.java b/src/main/java/net/server/channel/handlers/RPSActionHandler.java index 0916f648af..9a362dd068 100644 --- a/src/main/java/net/server/channel/handlers/RPSActionHandler.java +++ b/src/main/java/net/server/channel/handlers/RPSActionHandler.java @@ -14,58 +14,58 @@ import tools.PacketCreator; */ public final class RPSActionHandler extends AbstractPacketHandler { - @Override - public final void handlePacket(InPacket p, Client c){ - Character chr = c.getPlayer(); - RockPaperScissor rps = chr.getRPS(); - - if (c.tryacquireClient()) { - try { - if(p.available() == 0 || !chr.getMap().containsNPC(9000019)){ - if(rps != null){ - rps.dispose(c); - } - return; - } - final byte mode = p.readByte(); - switch (mode){ - case 0: // start game - case 5: // retry - if(rps != null){ - rps.reward(c); - } - if(chr.getMeso() >= 1000){ - chr.setRPS(new RockPaperScissor(c, mode)); - }else{ - c.sendPacket(PacketCreator.rpsMesoError(-1)); - } - break; - case 1: // answer - if(rps == null || !rps.answer(c, p.readByte())){ - c.sendPacket(PacketCreator.rpsMode((byte) 0x0D));// 13 - } - break; - case 2: // time over - if(rps == null || !rps.timeOut(c)){ - c.sendPacket(PacketCreator.rpsMode((byte) 0x0D)); - } - break; - case 3: // continue - if(rps == null || !rps.nextRound(c)){ - c.sendPacket(PacketCreator.rpsMode((byte) 0x0D)); - } - break; - case 4: // leave - if(rps != null){ - rps.dispose(c); - }else{ - c.sendPacket(PacketCreator.rpsMode((byte) 0x0D)); - } - break; - } - } finally { - c.releaseClient(); - } + @Override + public final void handlePacket(InPacket p, Client c) { + Character chr = c.getPlayer(); + RockPaperScissor rps = chr.getRPS(); + + if (c.tryacquireClient()) { + try { + if (p.available() == 0 || !chr.getMap().containsNPC(9000019)) { + if (rps != null) { + rps.dispose(c); + } + return; } - } + final byte mode = p.readByte(); + switch (mode) { + case 0: // start game + case 5: // retry + if (rps != null) { + rps.reward(c); + } + if (chr.getMeso() >= 1000) { + chr.setRPS(new RockPaperScissor(c, mode)); + } else { + c.sendPacket(PacketCreator.rpsMesoError(-1)); + } + break; + case 1: // answer + if (rps == null || !rps.answer(c, p.readByte())) { + c.sendPacket(PacketCreator.rpsMode((byte) 0x0D));// 13 + } + break; + case 2: // time over + if (rps == null || !rps.timeOut(c)) { + c.sendPacket(PacketCreator.rpsMode((byte) 0x0D)); + } + break; + case 3: // continue + if (rps == null || !rps.nextRound(c)) { + c.sendPacket(PacketCreator.rpsMode((byte) 0x0D)); + } + break; + case 4: // leave + if (rps != null) { + rps.dispose(c); + } else { + c.sendPacket(PacketCreator.rpsMode((byte) 0x0D)); + } + break; + } + } finally { + c.releaseClient(); + } + } + } } diff --git a/src/main/java/net/server/channel/handlers/RaiseIncExpHandler.java b/src/main/java/net/server/channel/handlers/RaiseIncExpHandler.java index 94e8a38803..cd0e697f30 100644 --- a/src/main/java/net/server/channel/handlers/RaiseIncExpHandler.java +++ b/src/main/java/net/server/channel/handlers/RaiseIncExpHandler.java @@ -16,7 +16,6 @@ import tools.PacketCreator; import java.util.Map; /** - * * @author Xari * @author Ronan - added concurrency protection and quest progress limit */ @@ -27,7 +26,7 @@ public class RaiseIncExpHandler extends AbstractPacketHandler { byte inventorytype = p.readByte();//nItemIT short slot = p.readShort();//nSlotPosition int itemid = p.readInt();//nItemID - + if (c.tryacquireClient()) { try { ItemInformationProvider ii = ItemInformationProvider.getInstance(); @@ -38,14 +37,14 @@ public class RaiseIncExpHandler extends AbstractPacketHandler { int infoNumber = consItem.questid; Map consumables = consItem.items; - + Character chr = c.getPlayer(); Quest quest = Quest.getInstanceFromInfoNumber(infoNumber); if (!chr.getQuest(quest).getStatus().equals(QuestStatus.Status.STARTED)) { c.sendPacket(PacketCreator.enableActions()); return; } - + int consId; Inventory inv = chr.getInventory(InventoryType.getByType(inventorytype)); inv.lockInventory(); @@ -59,11 +58,11 @@ public class RaiseIncExpHandler extends AbstractPacketHandler { } finally { inv.unlockInventory(); } - + int questid = quest.getId(); int nextValue = Math.min(consumables.get(consId) + c.getAbstractPlayerInteraction().getQuestProgressInt(questid, infoNumber), consItem.exp * consItem.grade); c.getAbstractPlayerInteraction().setQuestProgress(questid, infoNumber, nextValue); - + c.sendPacket(PacketCreator.enableActions()); } finally { c.releaseClient(); diff --git a/src/main/java/net/server/channel/handlers/RaiseUIStateHandler.java b/src/main/java/net/server/channel/handlers/RaiseUIStateHandler.java index 87def4ece3..1fdccf9177 100644 --- a/src/main/java/net/server/channel/handlers/RaiseUIStateHandler.java +++ b/src/main/java/net/server/channel/handlers/RaiseUIStateHandler.java @@ -10,7 +10,6 @@ import scripting.quest.QuestScriptManager; import server.quest.Quest; /** - * * @author Xari */ public class RaiseUIStateHandler extends AbstractPacketHandler { @@ -18,15 +17,15 @@ public class RaiseUIStateHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { int infoNumber = p.readShort(); - + if (c.tryacquireClient()) { try { Character chr = c.getPlayer(); Quest quest = Quest.getInstanceFromInfoNumber(infoNumber); QuestStatus mqs = chr.getQuest(quest); - + QuestScriptManager.getInstance().raiseOpen(c, (short) infoNumber, mqs.getNpc()); - + if (mqs.getStatus() == QuestStatus.Status.NOT_STARTED) { quest.forceStart(chr, 22000); c.getAbstractPlayerInteraction().setQuestProgress(quest.getId(), infoNumber, 0); diff --git a/src/main/java/net/server/channel/handlers/RangedAttackHandler.java b/src/main/java/net/server/channel/handlers/RangedAttackHandler.java index a2f1c8ea51..6a1b522de6 100644 --- a/src/main/java/net/server/channel/handlers/RangedAttackHandler.java +++ b/src/main/java/net/server/channel/handlers/RangedAttackHandler.java @@ -51,42 +51,42 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler { AutobanFactory.FAST_ATTACK.alert(chr, "Time: " + timeElapsed); } chr.getAutobanManager().spam(8);*/ - + AttackInfo attack = parseDamage(p, chr, true, false); - + if (chr.getBuffEffect(BuffStat.MORPH) != null) { - if(chr.getBuffEffect(BuffStat.MORPH).isMorphWithoutAttack()) { + if (chr.getBuffEffect(BuffStat.MORPH).isMorphWithoutAttack()) { // How are they attacking when the client won't let them? chr.getClient().disconnect(false, false); - return; + return; } } - + if (GameConstants.isDojo(chr.getMap().getId()) && attack.numAttacked > 0) { chr.setDojoEnergy(chr.getDojoEnergy() + YamlConfig.config.server.DOJO_ENERGY_ATK); c.sendPacket(PacketCreator.getEnergy("energy", chr.getDojoEnergy())); } - + if (attack.skill == Buccaneer.ENERGY_ORB || attack.skill == ThunderBreaker.SPARK || attack.skill == Shadower.TAUNT || attack.skill == NightLord.TAUNT) { chr.getMap().broadcastMessage(chr, PacketCreator.rangedAttack(chr, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, 0, attack.allDamage, attack.speed, attack.direction, attack.display), false); applyAttack(attack, chr, 1); } else if (attack.skill == ThunderBreaker.SHARK_WAVE && chr.getSkillLevel(ThunderBreaker.SHARK_WAVE) > 0) { chr.getMap().broadcastMessage(chr, PacketCreator.rangedAttack(chr, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, 0, attack.allDamage, attack.speed, attack.direction, attack.display), false); applyAttack(attack, chr, 1); - + for (int i = 0; i < attack.numAttacked; i++) { chr.handleEnergyChargeGain(); } } else if (attack.skill == Aran.COMBO_SMASH || attack.skill == Aran.COMBO_FENRIR || attack.skill == Aran.COMBO_TEMPEST) { chr.getMap().broadcastMessage(chr, PacketCreator.rangedAttack(chr, attack.skill, attack.skilllevel, attack.stance, attack.numAttackedAndDamage, 0, attack.allDamage, attack.speed, attack.direction, attack.display), false); if (attack.skill == Aran.COMBO_SMASH && chr.getCombo() >= 30) { - chr.setCombo((short) 0); - applyAttack(attack, chr, 1); + chr.setCombo((short) 0); + applyAttack(attack, chr, 1); } else if (attack.skill == Aran.COMBO_FENRIR && chr.getCombo() >= 100) { - chr.setCombo((short) 0); - applyAttack(attack, chr, 2); + chr.setCombo((short) 0); + applyAttack(attack, chr, 2); } else if (attack.skill == Aran.COMBO_TEMPEST && chr.getCombo() >= 200) { - chr.setCombo((short) 0); + chr.setCombo((short) 0); applyAttack(attack, chr, 4); } } else { @@ -105,10 +105,10 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler { if (effect.getCooldown() > 0) { c.sendPacket(PacketCreator.skillCooldown(attack.skill, effect.getCooldown())); } - - if(attack.skill == 4111004) { // shadow meso + + if (attack.skill == 4111004) { // shadow meso bulletCount = 0; - + int money = effect.getMoneyCon(); if (money != 0) { int moneyMod = money / 2; @@ -130,13 +130,13 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler { if (item != null) { int id = item.getItemId(); slot = item.getPosition(); - + boolean bow = ItemConstants.isArrowForBow(id); boolean cbow = ItemConstants.isArrowForCrossBow(id); if (item.getQuantity() >= bulletCount) { //Fixes the bug where you can't use your last arrow. if (type == WeaponType.CLAW && ItemConstants.isThrowingStar(id) && weapon.getItemId() != 1472063) { if (((id == 2070007 || id == 2070018) && chr.getLevel() < 70) || (id == 2070016 && chr.getLevel() < 50)) { - } else { + } else { projectile = id; break; } @@ -156,7 +156,7 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler { } } } - } + } boolean soulArrow = chr.getBuffedValue(BuffStat.SOULARROW) != null; boolean shadowClaw = chr.getBuffedValue(BuffStat.SHADOW_CLAW) != null; if (projectile != 0) { @@ -164,16 +164,19 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler { short bulletConsume = bulletCount; if (effect != null && effect.getBulletConsume() != 0) { - bulletConsume = (byte) (effect.getBulletConsume() * (hasShadowPartner ? 2 : 1)); + bulletConsume = (byte) (effect.getBulletConsume() * (hasShadowPartner ? 2 : 1)); } - if(slot < 0) System.out.println(" Projectile to use was unable to be found."); - else InventoryManipulator.removeFromSlot(c, InventoryType.USE, slot, bulletConsume, false, true); + if (slot < 0) { + System.out.println(" Projectile to use was unable to be found."); + } else { + InventoryManipulator.removeFromSlot(c, InventoryType.USE, slot, bulletConsume, false, true); + } } } - + if (projectile != 0 || soulArrow || attack.skill == 11101004 || attack.skill == 15111007 || attack.skill == 14101006 || attack.skill == 4111004 || attack.skill == 13101005) { - int visProjectile = projectile; //visible projectile sent to players + int visProjectile = projectile; //visible projectile sent to players if (ItemConstants.isThrowingStar(projectile)) { Inventory cash = chr.getInventory(InventoryType.CASH); for (int i = 1; i <= cash.getSlotLimit(); i++) { // impose order... @@ -188,7 +191,7 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler { } else if (soulArrow || attack.skill == 3111004 || attack.skill == 3211004 || attack.skill == 11101004 || attack.skill == 15111007 || attack.skill == 14101006 || attack.skill == 13101005) { visProjectile = 0; } - + final Packet packet; switch (attack.skill) { case 3121004: // Hurricane @@ -202,7 +205,7 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler { break; } chr.getMap().broadcastMessage(chr, packet, false, true); - + if (attack.skill != 0) { Skill skill = SkillFactory.getSkill(attack.skill); StatEffect effect_ = skill.getEffect(chr.getSkillLevel(skill)); @@ -215,15 +218,15 @@ public final class RangedAttackHandler extends AbstractDealDamageHandler { } } } - + if (chr.getSkillLevel(SkillFactory.getSkill(NightWalker.VANISH)) > 0 && chr.getBuffedValue(BuffStat.DARKSIGHT) != null && attack.numAttacked > 0 && chr.getBuffSource(BuffStat.DARKSIGHT) != 9101004) { chr.cancelEffectFromBuffStat(BuffStat.DARKSIGHT); chr.cancelBuffStats(BuffStat.DARKSIGHT); - } else if(chr.getSkillLevel(SkillFactory.getSkill(WindArcher.WIND_WALK)) > 0 && chr.getBuffedValue(BuffStat.WIND_WALK) != null && attack.numAttacked > 0) { + } else if (chr.getSkillLevel(SkillFactory.getSkill(WindArcher.WIND_WALK)) > 0 && chr.getBuffedValue(BuffStat.WIND_WALK) != null && attack.numAttacked > 0) { chr.cancelEffectFromBuffStat(BuffStat.WIND_WALK); chr.cancelBuffStats(BuffStat.WIND_WALK); } - + applyAttack(attack, chr, bulletCount); } } diff --git a/src/main/java/net/server/channel/handlers/ReactorHitHandler.java b/src/main/java/net/server/channel/handlers/ReactorHitHandler.java index ffef1b6377..bd7612e562 100644 --- a/src/main/java/net/server/channel/handlers/ReactorHitHandler.java +++ b/src/main/java/net/server/channel/handlers/ReactorHitHandler.java @@ -32,9 +32,9 @@ import server.maps.Reactor; public final class ReactorHitHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { - //System.out.println(slea); //To see if there are any differences with packets + //System.out.println(slea); //To see if there are any differences with packets //CD 00 6B 00 00 00 01 00 00 00 03 00 00 00 20 03 F7 03 00 00 - //[CD 00] [66 00 00 00] [00 00 00 00] [02 00] [00 00 19 01] [00 00 00 00] + //[CD 00] [66 00 00 00] [00 00 00 00] [02 00] [00 00 19 01] [00 00 00 00] int oid = p.readInt(); int charPos = p.readInt(); short stance = p.readShort(); diff --git a/src/main/java/net/server/channel/handlers/RemoteGachaponHandler.java b/src/main/java/net/server/channel/handlers/RemoteGachaponHandler.java index 05ffd434a2..ef91a56e7e 100644 --- a/src/main/java/net/server/channel/handlers/RemoteGachaponHandler.java +++ b/src/main/java/net/server/channel/handlers/RemoteGachaponHandler.java @@ -29,33 +29,32 @@ import net.packet.InPacket; import scripting.npc.NPCScriptManager; /** - * * @author Generic */ public final class RemoteGachaponHandler extends AbstractPacketHandler { - @Override - public final void handlePacket(InPacket p, Client c) { - int ticket = p.readInt(); - int gacha = p.readInt(); - if (ticket != 5451000){ - AutobanFactory.GENERAL.alert(c.getPlayer(), " Tried to use RemoteGachaponHandler with item id: " + ticket); - c.disconnect(false, false); - return; - } else if(gacha < 0 || gacha > 11) { - AutobanFactory.GENERAL.alert(c.getPlayer(), " Tried to use RemoteGachaponHandler with mode: " + gacha); - c.disconnect(false, false); - return; - } else if (c.getPlayer().getInventory(ItemConstants.getInventoryType(ticket)).countById(ticket) < 1) { - AutobanFactory.GENERAL.alert(c.getPlayer(), " Tried to use RemoteGachaponHandler without a ticket."); - c.disconnect(false, false); - return; - } - int npcId = 9100100; - if (gacha != 8 && gacha != 9) { - npcId += gacha; - } else { - npcId = gacha == 8 ? 9100109 : 9100117; - } - NPCScriptManager.getInstance().start(c, npcId, "gachaponRemote", null); - } + @Override + public final void handlePacket(InPacket p, Client c) { + int ticket = p.readInt(); + int gacha = p.readInt(); + if (ticket != 5451000) { + AutobanFactory.GENERAL.alert(c.getPlayer(), " Tried to use RemoteGachaponHandler with item id: " + ticket); + c.disconnect(false, false); + return; + } else if (gacha < 0 || gacha > 11) { + AutobanFactory.GENERAL.alert(c.getPlayer(), " Tried to use RemoteGachaponHandler with mode: " + gacha); + c.disconnect(false, false); + return; + } else if (c.getPlayer().getInventory(ItemConstants.getInventoryType(ticket)).countById(ticket) < 1) { + AutobanFactory.GENERAL.alert(c.getPlayer(), " Tried to use RemoteGachaponHandler without a ticket."); + c.disconnect(false, false); + return; + } + int npcId = 9100100; + if (gacha != 8 && gacha != 9) { + npcId += gacha; + } else { + npcId = gacha == 8 ? 9100109 : 9100117; + } + NPCScriptManager.getInstance().start(c, npcId, "gachaponRemote", null); + } } diff --git a/src/main/java/net/server/channel/handlers/RemoteStoreHandler.java b/src/main/java/net/server/channel/handlers/RemoteStoreHandler.java index 37924a9318..c5aff78f62 100644 --- a/src/main/java/net/server/channel/handlers/RemoteStoreHandler.java +++ b/src/main/java/net/server/channel/handlers/RemoteStoreHandler.java @@ -30,7 +30,6 @@ import server.maps.HiredMerchant; import tools.PacketCreator; /** - * * @author kevintjuh93 - :3 */ public class RemoteStoreHandler extends AbstractPacketHandler { @@ -46,7 +45,7 @@ public class RemoteStoreHandler extends AbstractPacketHandler { } return; } else { - chr.dropMessage(1, "You don't have a Merchant open."); + chr.dropMessage(1, "You don't have a Merchant open."); } c.sendPacket(PacketCreator.enableActions()); } diff --git a/src/main/java/net/server/channel/handlers/ReportHandler.java b/src/main/java/net/server/channel/handlers/ReportHandler.java index dd1fb3fe43..23c4176243 100644 --- a/src/main/java/net/server/channel/handlers/ReportHandler.java +++ b/src/main/java/net/server/channel/handlers/ReportHandler.java @@ -36,66 +36,66 @@ import java.sql.Timestamp; import java.util.Calendar; /* - * + * * @author BubblesDev */ public final class ReportHandler extends AbstractPacketHandler { - public final void handlePacket(InPacket p, Client c) { - int type = p.readByte(); //01 = Conversation claim 00 = illegal program - String victim = p.readString(); - int reason = p.readByte(); - String description = p.readString(); - if (type == 0) { - if (c.getPlayer().getPossibleReports() > 0) { - if (c.getPlayer().getMeso() > 299) { - c.getPlayer().decreaseReports(); - c.getPlayer().gainMeso(-300, true); - } else { - c.sendPacket(PacketCreator.reportResponse((byte) 4)); - return; - } - } else { - c.sendPacket(PacketCreator.reportResponse((byte) 2)); - return; - } - Server.getInstance().broadcastGMMessage(c.getWorld(), PacketCreator.serverNotice(6, victim + " was reported for: " + description)); - addReport(c.getPlayer().getId(), Character.getIdByName(victim), 0, description, null); - } else if (type == 1) { - String chatlog = p.readString(); - if (chatlog == null) { - return; - } - if (c.getPlayer().getPossibleReports() > 0) { - if (c.getPlayer().getMeso() > 299) { - c.getPlayer().decreaseReports(); - c.getPlayer().gainMeso(-300, true); - } else { - c.sendPacket(PacketCreator.reportResponse((byte) 4)); - return; - } - } - Server.getInstance().broadcastGMMessage(c.getWorld(), PacketCreator.serverNotice(6, victim + " was reported for: " + description)); - addReport(c.getPlayer().getId(), Character.getIdByName(victim), reason, description, chatlog); - } else { - Server.getInstance().broadcastGMMessage(c.getWorld(), PacketCreator.serverNotice(6, c.getPlayer().getName() + " is probably packet editing. Got unknown report type, which is impossible.")); - } - } + public final void handlePacket(InPacket p, Client c) { + int type = p.readByte(); //01 = Conversation claim 00 = illegal program + String victim = p.readString(); + int reason = p.readByte(); + String description = p.readString(); + if (type == 0) { + if (c.getPlayer().getPossibleReports() > 0) { + if (c.getPlayer().getMeso() > 299) { + c.getPlayer().decreaseReports(); + c.getPlayer().gainMeso(-300, true); + } else { + c.sendPacket(PacketCreator.reportResponse((byte) 4)); + return; + } + } else { + c.sendPacket(PacketCreator.reportResponse((byte) 2)); + return; + } + Server.getInstance().broadcastGMMessage(c.getWorld(), PacketCreator.serverNotice(6, victim + " was reported for: " + description)); + addReport(c.getPlayer().getId(), Character.getIdByName(victim), 0, description, null); + } else if (type == 1) { + String chatlog = p.readString(); + if (chatlog == null) { + return; + } + if (c.getPlayer().getPossibleReports() > 0) { + if (c.getPlayer().getMeso() > 299) { + c.getPlayer().decreaseReports(); + c.getPlayer().gainMeso(-300, true); + } else { + c.sendPacket(PacketCreator.reportResponse((byte) 4)); + return; + } + } + Server.getInstance().broadcastGMMessage(c.getWorld(), PacketCreator.serverNotice(6, victim + " was reported for: " + description)); + addReport(c.getPlayer().getId(), Character.getIdByName(victim), reason, description, chatlog); + } else { + Server.getInstance().broadcastGMMessage(c.getWorld(), PacketCreator.serverNotice(6, c.getPlayer().getName() + " is probably packet editing. Got unknown report type, which is impossible.")); + } + } - public void addReport(int reporterid, int victimid, int reason, String description, String chatlog) { - Calendar calendar = Calendar.getInstance(); - Timestamp currentTimestamp = new java.sql.Timestamp(calendar.getTime().getTime()); - try (Connection con = DatabaseConnection.getConnection(); - PreparedStatement ps = con.prepareStatement("INSERT INTO reports (`reporttime`, `reporterid`, `victimid`, `reason`, `chatlog`, `description`) VALUES (?, ?, ?, ?, ?, ?)")) { - ps.setString(1, currentTimestamp.toGMTString().toString()); - ps.setInt(2, reporterid); - ps.setInt(3, victimid); - ps.setInt(4, reason); - ps.setString(5, chatlog); - ps.setString(6, description); - ps.addBatch(); - ps.executeBatch(); - } catch (SQLException ex) { - ex.printStackTrace(); - } - } + public void addReport(int reporterid, int victimid, int reason, String description, String chatlog) { + Calendar calendar = Calendar.getInstance(); + Timestamp currentTimestamp = new java.sql.Timestamp(calendar.getTime().getTime()); + try (Connection con = DatabaseConnection.getConnection(); + PreparedStatement ps = con.prepareStatement("INSERT INTO reports (`reporttime`, `reporterid`, `victimid`, `reason`, `chatlog`, `description`) VALUES (?, ?, ?, ?, ?, ?)")) { + ps.setString(1, currentTimestamp.toGMTString()); + ps.setInt(2, reporterid); + ps.setInt(3, victimid); + ps.setInt(4, reason); + ps.setString(5, chatlog); + ps.setString(6, description); + ps.addBatch(); + ps.executeBatch(); + } catch (SQLException ex) { + ex.printStackTrace(); + } + } } diff --git a/src/main/java/net/server/channel/handlers/RingActionHandler.java b/src/main/java/net/server/channel/handlers/RingActionHandler.java index dea78255cb..50e1950e42 100644 --- a/src/main/java/net/server/channel/handlers/RingActionHandler.java +++ b/src/main/java/net/server/channel/handlers/RingActionHandler.java @@ -54,12 +54,12 @@ public final class RingActionHandler extends AbstractPacketHandler { private static int getBoxId(int useItemId) { return useItemId == 2240000 ? 4031357 : (useItemId == 2240001 ? 4031359 : (useItemId == 2240002 ? 4031361 : (useItemId == 2240003 ? 4031363 : (1112300 + (useItemId - 2240004))))); } - + public static void sendEngageProposal(final Client c, final String name, final int itemid) { final int newBoxId = getBoxId(itemid); final Character target = c.getChannelServer().getPlayerStorage().getCharacterByName(name); final Character source = c.getPlayer(); - + // TODO: get the correct packet bytes for these popups if (source.isMarried()) { source.dropMessage(1, "You're already married!"); @@ -81,11 +81,11 @@ public final class RingActionHandler extends AbstractPacketHandler { source.dropMessage(1, "You can't engage yourself."); source.sendPacket(WeddingPackets.OnMarriageResult((byte) 0)); return; - } else if(target.getLevel() < 50) { + } else if (target.getLevel() < 50) { source.dropMessage(1, "You can only propose to someone level 50 or higher."); source.sendPacket(WeddingPackets.OnMarriageResult((byte) 0)); return; - } else if(source.getLevel() < 50) { + } else if (source.getLevel() < 50) { source.dropMessage(1, "You can only propose being level 50 or higher."); source.sendPacket(WeddingPackets.OnMarriageResult((byte) 0)); return; @@ -125,11 +125,11 @@ public final class RingActionHandler extends AbstractPacketHandler { source.sendPacket(WeddingPackets.OnMarriageResult((byte) 0)); return; } - + source.setMarriageItemId(itemid); target.sendPacket(WeddingPackets.onMarriageRequest(source.getName(), source.getId())); } - + private static void eraseEngagementOffline(int characterId) { try (Connection con = DatabaseConnection.getConnection()) { eraseEngagementOffline(characterId, con); @@ -137,14 +137,14 @@ public final class RingActionHandler extends AbstractPacketHandler { sqle.printStackTrace(); } } - + private static void eraseEngagementOffline(int characterId, Connection con) throws SQLException { try (PreparedStatement ps = con.prepareStatement("UPDATE characters SET marriageItemId=-1, partnerId=-1 WHERE id=?")) { ps.setInt(1, characterId); ps.executeUpdate(); } } - + private static void breakEngagementOffline(int characterId) { try (Connection con = DatabaseConnection.getConnection(); PreparedStatement ps = con.prepareStatement("SELECT marriageItemId FROM characters WHERE id=?")) { @@ -170,20 +170,22 @@ public final class RingActionHandler extends AbstractPacketHandler { System.out.println("Error updating offline breakup " + ex.getMessage()); } } - + private synchronized static void breakMarriage(Character chr) { int partnerid = chr.getPartnerId(); - if(partnerid <= 0) return; - + if (partnerid <= 0) { + return; + } + chr.getClient().getWorldServer().deleteRelationship(chr.getId(), partnerid); Ring.removeRing(chr.getMarriageRing()); - + Character partner = chr.getClient().getWorldServer().getPlayerStorage().getCharacterById(partnerid); - if(partner == null) { + if (partner == null) { eraseEngagementOffline(partnerid); } else { partner.dropMessage(5, chr.getName() + " has decided to break up the marriage."); - + //partner.sendPacket(Wedding.OnMarriageResult((byte) 0)); ok, how to gracefully unengage someone without the need to cc? partner.sendPacket(WeddingPackets.OnNotifyWeddingPartnerTransfer(0, 0)); resetRingId(partner); @@ -191,9 +193,9 @@ public final class RingActionHandler extends AbstractPacketHandler { partner.setMarriageItemId(-1); partner.addMarriageRing(null); } - + chr.dropMessage(5, "You have successfully break the marriage with " + Character.getNameById(partnerid) + "."); - + //chr.sendPacket(Wedding.OnMarriageResult((byte) 0)); chr.sendPacket(WeddingPackets.OnNotifyWeddingPartnerTransfer(0, 0)); resetRingId(chr); @@ -201,55 +203,55 @@ public final class RingActionHandler extends AbstractPacketHandler { chr.setMarriageItemId(-1); chr.addMarriageRing(null); } - + private static void resetRingId(Character player) { int ringitemid = player.getMarriageRing().getItemId(); - + Item it = player.getInventory(InventoryType.EQUIP).findById(ringitemid); - if(it == null) { + if (it == null) { it = player.getInventory(InventoryType.EQUIPPED).findById(ringitemid); } - if(it != null) { + if (it != null) { Equip eqp = (Equip) it; eqp.setRingId(-1); } } - + private synchronized static void breakEngagement(Character chr) { int partnerid = chr.getPartnerId(); int marriageitemid = chr.getMarriageItemId(); - + chr.getClient().getWorldServer().deleteRelationship(chr.getId(), partnerid); - + Character partner = chr.getClient().getWorldServer().getPlayerStorage().getCharacterById(partnerid); - if(partner == null) { + if (partner == null) { breakEngagementOffline(partnerid); } else { partner.dropMessage(5, chr.getName() + " has decided to break up the engagement."); - + int partnerMarriageitemid = marriageitemid + ((chr.getGender() == 0) ? 1 : -1); - if(partner.haveItem(partnerMarriageitemid)) { + if (partner.haveItem(partnerMarriageitemid)) { InventoryManipulator.removeById(partner.getClient(), InventoryType.ETC, partnerMarriageitemid, (short) 1, false, false); } - + //partner.sendPacket(Wedding.OnMarriageResult((byte) 0)); ok, how to gracefully unengage someone without the need to cc? partner.sendPacket(WeddingPackets.OnNotifyWeddingPartnerTransfer(0, 0)); partner.setPartnerId(-1); partner.setMarriageItemId(-1); } - if(chr.haveItem(marriageitemid)) { + if (chr.haveItem(marriageitemid)) { InventoryManipulator.removeById(chr.getClient(), InventoryType.ETC, marriageitemid, (short) 1, false, false); } chr.dropMessage(5, "You have successfully break the engagement with " + Character.getNameById(partnerid) + "."); - + //chr.sendPacket(Wedding.OnMarriageResult((byte) 0)); chr.sendPacket(WeddingPackets.OnNotifyWeddingPartnerTransfer(0, 0)); chr.setPartnerId(-1); chr.setMarriageItemId(-1); } - + public static void breakMarriageRing(Character chr, final int wItemId) { final InventoryType type = InventoryType.getByType((byte) (wItemId / 1000000)); final Item wItem = chr.getInventory(type).findById(wItemId); @@ -257,7 +259,7 @@ public final class RingActionHandler extends AbstractPacketHandler { final boolean weddingRing = (wItem != null && wItemId / 10 == 111280); if (weddingRing) { - if(chr.getPartnerId() > 0) { + if (chr.getPartnerId() > 0) { breakMarriage(chr); } @@ -270,7 +272,7 @@ public final class RingActionHandler extends AbstractPacketHandler { chr.getMap().disappearingItemDrop(chr, chr, wItem, chr.getPosition()); } } - + public static void giveMarriageRings(Character player, Character partner, int marriageRingId) { Pair rings = Ring.createRing(marriageRingId, player, partner); ItemInformationProvider ii = ItemInformationProvider.getInstance(); @@ -289,65 +291,65 @@ public final class RingActionHandler extends AbstractPacketHandler { InventoryManipulator.addFromDrop(partner.getClient(), ringEqp, false, -1); partner.broadcastMarriageMessage(); } - + @Override public final void handlePacket(InPacket p, Client c) { byte mode = p.readByte(); String name; byte slot; - switch(mode) { + switch (mode) { case 0: // Send Proposal sendEngageProposal(c, p.readString(), p.readInt()); break; - + case 1: // Cancel Proposal - if(c.getPlayer().getMarriageItemId() / 1000000 != 4) { + if (c.getPlayer().getMarriageItemId() / 1000000 != 4) { c.getPlayer().setMarriageItemId(-1); } break; - + case 2: // Accept/Deny Proposal final boolean accepted = p.readByte() > 0; name = p.readString(); final int id = p.readInt(); - + final Character source = c.getWorldServer().getPlayerStorage().getCharacterByName(name); final Character target = c.getPlayer(); - + if (source == null) { target.sendPacket(PacketCreator.enableActions()); return; } - + final int itemid = source.getMarriageItemId(); if (target.getPartnerId() > 0 || source.getId() != id || itemid <= 0 || !source.haveItem(itemid) || source.getPartnerId() > 0 || !source.isAlive() || !target.isAlive()) { target.sendPacket(PacketCreator.enableActions()); return; } - + if (accepted) { final int newItemId = getBoxId(itemid); if (!InventoryManipulator.checkSpace(c, newItemId, 1, "") || !InventoryManipulator.checkSpace(source.getClient(), newItemId, 1, "")) { target.sendPacket(PacketCreator.enableActions()); return; } - + try { InventoryManipulator.removeById(source.getClient(), InventoryType.USE, itemid, 1, false, false); - + int marriageId = c.getWorldServer().createRelationship(source.getId(), target.getId()); source.setPartnerId(target.getId()); // engage them (new marriageitemid, partnerid for both) target.setPartnerId(source.getId()); - + source.setMarriageItemId(newItemId); target.setMarriageItemId(newItemId + 1); - + InventoryManipulator.addById(source.getClient(), newItemId, (short) 1); InventoryManipulator.addById(c, (newItemId + 1), (short) 1); - + source.sendPacket(WeddingPackets.OnMarriageResult(marriageId, source, false)); target.sendPacket(WeddingPackets.OnMarriageResult(marriageId, source, false)); - + source.sendPacket(WeddingPackets.OnNotifyWeddingPartnerTransfer(target.getId(), target.getMapId())); target.sendPacket(WeddingPackets.OnNotifyWeddingPartnerTransfer(source.getId(), source.getMapId())); } catch (Exception e) { @@ -356,67 +358,67 @@ public final class RingActionHandler extends AbstractPacketHandler { } else { source.dropMessage(1, "She has politely declined your engagement request."); source.sendPacket(WeddingPackets.OnMarriageResult((byte) 0)); - + source.setMarriageItemId(-1); } break; - + case 3: // Break Engagement breakMarriageRing(c.getPlayer(), p.readInt()); break; - + case 5: // Invite %s to Wedding name = p.readString(); int marriageId = p.readInt(); slot = p.readByte(); // this is an int - + int itemId; try { itemId = c.getPlayer().getInventory(InventoryType.ETC).getItem(slot).getItemId(); - } catch(NullPointerException npe) { + } catch (NullPointerException npe) { c.sendPacket(PacketCreator.enableActions()); return; } - - if((itemId != 4031377 && itemId != 4031395) || !c.getPlayer().haveItem(itemId)) { + + if ((itemId != 4031377 && itemId != 4031395) || !c.getPlayer().haveItem(itemId)) { c.sendPacket(PacketCreator.enableActions()); return; } - + String groom = c.getPlayer().getName(), bride = Character.getNameById(c.getPlayer().getPartnerId()); int guest = Character.getIdByName(name); if (groom == null || bride == null || groom.equals("") || bride.equals("") || guest <= 0) { c.getPlayer().dropMessage(5, "Unable to find " + name + "!"); return; } - + try { World wserv = c.getWorldServer(); Pair registration = wserv.getMarriageQueuedLocation(marriageId); - - if(registration != null) { - if(wserv.addMarriageGuest(marriageId, guest)) { + + if (registration != null) { + if (wserv.addMarriageGuest(marriageId, guest)) { boolean cathedral = registration.getLeft(); int newItemId = cathedral ? 4031407 : 4031406; - + Channel cserv = c.getChannelServer(); int resStatus = cserv.getWeddingReservationStatus(marriageId, cathedral); - if(resStatus > 0) { + if (resStatus > 0) { long expiration = cserv.getWeddingTicketExpireTime(resStatus + 1); Character guestChr = c.getWorldServer().getPlayerStorage().getCharacterById(guest); - if(guestChr != null && InventoryManipulator.checkSpace(guestChr.getClient(), newItemId, 1, "") && InventoryManipulator.addById(guestChr.getClient(), newItemId, (short) 1, expiration)) { + if (guestChr != null && InventoryManipulator.checkSpace(guestChr.getClient(), newItemId, 1, "") && InventoryManipulator.addById(guestChr.getClient(), newItemId, (short) 1, expiration)) { guestChr.dropMessage(6, "[Wedding] You've been invited to " + groom + " and " + bride + "'s Wedding!"); } else { - if(guestChr != null && guestChr.isLoggedinWorld()) { + if (guestChr != null && guestChr.isLoggedinWorld()) { guestChr.dropMessage(6, "[Wedding] You've been invited to " + groom + " and " + bride + "'s Wedding! Receive your invitation from Duey!"); } else { c.getPlayer().sendNote(name, "You've been invited to " + groom + " and " + bride + "'s Wedding! Receive your invitation from Duey!", (byte) 0); } - + Item weddingTicket = new Item(newItemId, (short) 0, (short) 1); weddingTicket.setExpiration(expiration); - + DueyProcessor.dueyCreatePackage(weddingTicket, 0, groom, guest); } } else { @@ -428,22 +430,22 @@ public final class RingActionHandler extends AbstractPacketHandler { } else { c.getPlayer().dropMessage(5, "Invitation was not sent to '" + name + "'. Either the time for your marriage reservation already came or it was not found."); } - + } catch (SQLException ex) { ex.printStackTrace(); return; } - + c.getAbstractPlayerInteraction().gainItem(itemId, (short) -1); break; - + case 6: // Open Wedding Invitation slot = (byte) p.readInt(); int invitationid = p.readInt(); - - if(invitationid == 4031406 || invitationid == 4031407) { + + if (invitationid == 4031406 || invitationid == 4031407) { Item item = c.getPlayer().getInventory(InventoryType.ETC).getItem(slot); - if(item == null || item.getItemId() != invitationid) { + if (item == null || item.getItemId() != invitationid) { c.sendPacket(PacketCreator.enableActions()); return; } @@ -455,10 +457,10 @@ public final class RingActionHandler extends AbstractPacketHandler { c.sendPacket(WeddingPackets.sendWeddingInvitation(Character.getNameById(groomId), Character.getNameById(brideId))); } } - + break; - - case 9: + + case 9: try { // By -- Dragoso (Drago) // Groom and Bride's Wishlist @@ -493,15 +495,16 @@ public final class RingActionHandler extends AbstractPacketHandler { } } } - } catch (NumberFormatException nfe) {} - + } catch (NumberFormatException nfe) { + } + break; - + default: - System.out.println("Unhandled RING_ACTION Mode: " + p.toString()); + System.out.println("Unhandled RING_ACTION Mode: " + p); break; } - + c.sendPacket(PacketCreator.enableActions()); } } diff --git a/src/main/java/net/server/channel/handlers/ScriptedItemHandler.java b/src/main/java/net/server/channel/handlers/ScriptedItemHandler.java index d9946b68f1..a0f9a8b7ab 100644 --- a/src/main/java/net/server/channel/handlers/ScriptedItemHandler.java +++ b/src/main/java/net/server/channel/handlers/ScriptedItemHandler.java @@ -31,7 +31,6 @@ import server.ItemInformationProvider; import server.ItemInformationProvider.ScriptedItem; /** - * * @author Jay Estrella */ public final class ScriptedItemHandler extends AbstractPacketHandler { @@ -40,16 +39,18 @@ public final class ScriptedItemHandler extends AbstractPacketHandler { p.readInt(); // trash stamp, thanks RMZero213 short itemSlot = p.readShort(); // item slot, thanks RMZero213 int itemId = p.readInt(); - + ItemInformationProvider ii = ItemInformationProvider.getInstance(); ScriptedItem info = ii.getScriptedItemInfo(itemId); - if (info == null) return; - + if (info == null) { + return; + } + Item item = c.getPlayer().getInventory(ItemConstants.getInventoryType(itemId)).getItem(itemSlot); if (item == null || item.getItemId() != itemId || item.getQuantity() < 1) { return; } - + ItemScriptManager ism = ItemScriptManager.getInstance(); ism.runItemScript(c, info); } diff --git a/src/main/java/net/server/channel/handlers/ScrollHandler.java b/src/main/java/net/server/channel/handlers/ScrollHandler.java index 793d5b5092..ad9fa900d0 100644 --- a/src/main/java/net/server/channel/handlers/ScrollHandler.java +++ b/src/main/java/net/server/channel/handlers/ScrollHandler.java @@ -114,31 +114,31 @@ public final class ScrollHandler extends AbstractPacketHandler { } else if (scrolled.getLevel() > oldLevel || (ItemConstants.isCleanSlate(scroll.getItemId()) && scrolled.getUpgradeSlots() == oldSlots + 1) || ItemConstants.isFlagModifier(scroll.getItemId(), scrolled.getFlag())) { scrollSuccess = Equip.ScrollResult.SUCCESS; } - + useInventory.lockInventory(); try { if (scroll.getQuantity() < 1) { announceCannotScroll(c, legendarySpirit); return; } - + if (whiteScroll && !ItemConstants.isCleanSlate(scroll.getItemId())) { if (wscroll.getQuantity() < 1) { announceCannotScroll(c, legendarySpirit); return; } - + InventoryManipulator.removeFromSlot(c, InventoryType.USE, wscroll.getPosition(), (short) 1, false, false); } - + InventoryManipulator.removeFromSlot(c, InventoryType.USE, scroll.getPosition(), (short) 1, false); } finally { useInventory.unlockInventory(); } - + final List mods = new ArrayList<>(); if (scrollSuccess == Equip.ScrollResult.CURSE) { - if(!ItemConstants.isWeddingRing(toScroll.getItemId())) { + if (!ItemConstants.isWeddingRing(toScroll.getItemId())) { mods.add(new ModifyInventory(3, toScroll)); if (dst < 0) { Inventory inv = chr.getInventory(InventoryType.EQUIPPED); @@ -152,7 +152,7 @@ public final class ScrollHandler extends AbstractPacketHandler { } } else { Inventory inv = chr.getInventory(InventoryType.EQUIP); - + inv.lockInventory(); try { inv.removeItem(toScroll.getPosition()); @@ -181,7 +181,7 @@ public final class ScrollHandler extends AbstractPacketHandler { } } } - + private static void announceCannotScroll(Client c, boolean legendarySpirit) { if (legendarySpirit) { c.sendPacket(PacketCreator.getScrollEffect(c.getPlayer().getId(), Equip.ScrollResult.FAIL, false, false)); @@ -192,11 +192,11 @@ public final class ScrollHandler extends AbstractPacketHandler { private static boolean canScroll(int scrollid, int itemid) { int sid = scrollid / 100; - - switch(sid) { + + switch (sid) { case 20492: //scroll for accessory (pendant, belt, ring) return canScroll(2041100, itemid) || canScroll(2041200, itemid) || canScroll(2041300, itemid); - + default: return (scrollid / 100) % 100 == (itemid / 10000) % 100; } diff --git a/src/main/java/net/server/channel/handlers/SkillBookHandler.java b/src/main/java/net/server/channel/handlers/SkillBookHandler.java index 193da1e098..a969e64723 100644 --- a/src/main/java/net/server/channel/handlers/SkillBookHandler.java +++ b/src/main/java/net/server/channel/handlers/SkillBookHandler.java @@ -43,16 +43,16 @@ public final class SkillBookHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.enableActions()); return; } - + p.readInt(); short slot = p.readShort(); int itemId = p.readInt(); - + boolean canuse; boolean success = false; int skill = 0; int maxlevel = 0; - + Character player = c.getPlayer(); if (c.tryacquireClient()) { try { @@ -95,7 +95,7 @@ public final class SkillBookHandler extends AbstractPacketHandler { } finally { c.releaseClient(); } - + // thanks Vcoc for noting skill book result not showing for all in area player.getMap().broadcastMessage(PacketCreator.skillBookResult(player, skill, maxlevel, canuse, success)); } diff --git a/src/main/java/net/server/channel/handlers/SkillMacroHandler.java b/src/main/java/net/server/channel/handlers/SkillMacroHandler.java index a19374407e..c8adafdd8e 100644 --- a/src/main/java/net/server/channel/handlers/SkillMacroHandler.java +++ b/src/main/java/net/server/channel/handlers/SkillMacroHandler.java @@ -34,7 +34,9 @@ public final class SkillMacroHandler extends AbstractPacketHandler { public final void handlePacket(InPacket p, Client c) { Character chr = c.getPlayer(); int num = p.readByte(); - if (num > 5) return; + if (num > 5) { + return; + } for (int i = 0; i < num; i++) { String name = p.readString(); diff --git a/src/main/java/net/server/channel/handlers/SnowballHandler.java b/src/main/java/net/server/channel/handlers/SnowballHandler.java index cfec0e437b..bba6411ac4 100644 --- a/src/main/java/net/server/channel/handlers/SnowballHandler.java +++ b/src/main/java/net/server/channel/handlers/SnowballHandler.java @@ -29,7 +29,6 @@ import server.events.gm.Snowball; import server.maps.MapleMap; /** - * * @author kevintjuh93 */ public final class SnowballHandler extends AbstractPacketHandler { @@ -43,23 +42,31 @@ public final class SnowballHandler extends AbstractPacketHandler { int what = p.readByte(); //slea.skip(4); - if (snowball == null || othersnowball == null || snowball.getSnowmanHP() == 0) return; - if ((currentServerTime() - chr.getLastSnowballAttack()) < 500) return; - if (chr.getTeam() != (what % 2)) return; + if (snowball == null || othersnowball == null || snowball.getSnowmanHP() == 0) { + return; + } + if ((currentServerTime() - chr.getLastSnowballAttack()) < 500) { + return; + } + if (chr.getTeam() != (what % 2)) { + return; + } chr.setLastSnowballAttack(currentServerTime()); int damage = 0; - if (what < 2 && othersnowball.getSnowmanHP() > 0) + if (what < 2 && othersnowball.getSnowmanHP() > 0) { damage = 10; - else if (what == 2 || what == 3) { - if (Math.random() < 0.03) + } else if (what == 2 || what == 3) { + if (Math.random() < 0.03) { damage = 45; - else + } else { damage = 15; + } } - if (what >= 0 && what <= 4) + if (what >= 0 && what <= 4) { snowball.hit(what, damage); + } } } diff --git a/src/main/java/net/server/channel/handlers/SpawnPetHandler.java b/src/main/java/net/server/channel/handlers/SpawnPetHandler.java index 18e891a0f0..8240489547 100644 --- a/src/main/java/net/server/channel/handlers/SpawnPetHandler.java +++ b/src/main/java/net/server/channel/handlers/SpawnPetHandler.java @@ -27,14 +27,14 @@ import net.AbstractPacketHandler; import net.packet.InPacket; public final class SpawnPetHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { p.readInt(); byte slot = p.readByte(); p.readByte(); boolean lead = p.readByte() == 1; - + SpawnPetProcessor.processSpawnPet(c, slot, lead); } } diff --git a/src/main/java/net/server/channel/handlers/SpecialMoveHandler.java b/src/main/java/net/server/channel/handlers/SpecialMoveHandler.java index e2599c5a0a..1641f6f497 100644 --- a/src/main/java/net/server/channel/handlers/SpecialMoveHandler.java +++ b/src/main/java/net/server/channel/handlers/SpecialMoveHandler.java @@ -37,10 +37,10 @@ import tools.PacketCreator; import java.awt.*; public final class SpecialMoveHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { - Character chr = c.getPlayer(); + Character chr = c.getPlayer(); p.readInt(); chr.getAutobanManager().setTimestamp(4, Server.getInstance().getCurrentTimestamp(), 28); int skillid = p.readInt(); @@ -53,7 +53,7 @@ public final class SpecialMoveHandler extends AbstractPacketHandler { return; } */ - + Point pos = null; int __skillLevel = p.readByte(); Skill skill = SkillFactory.getSkill(skillid); @@ -67,18 +67,20 @@ public final class SpecialMoveHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.getEnergy("energy", chr.getDojoEnergy())); c.sendPacket(PacketCreator.serverNotice(5, "As you used the secret skill, your energy bar has been reset.")); } - if (skillLevel == 0 || skillLevel != __skillLevel) return; - + if (skillLevel == 0 || skillLevel != __skillLevel) { + return; + } + StatEffect effect = skill.getEffect(skillLevel); if (effect.getCooldown() > 0) { if (chr.skillIsCooling(skillid)) { return; } else if (skillid != Corsair.BATTLE_SHIP) { int cooldownTime = effect.getCooldown(); - if(StatEffect.isHerosWill(skillid) && YamlConfig.config.server.USE_FAST_REUSE_HERO_WILL) { + if (StatEffect.isHerosWill(skillid) && YamlConfig.config.server.USE_FAST_REUSE_HERO_WILL) { cooldownTime /= 60; } - + c.sendPacket(PacketCreator.skillCooldown(skillid, cooldownTime)); chr.addCooldown(skillid, currentServerTime(), cooldownTime * 1000); } @@ -94,7 +96,7 @@ public final class SpecialMoveHandler extends AbstractPacketHandler { if (!monster.isBoss()) { monster.aggroClearDamages(); monster.aggroMonsterDamage(chr, 1); - + // thanks onechord for pointing out Magnet crashing the caster (issue would actually happen upon failing to catch mob) // thanks Conrad for noticing Magnet crashing when trying to pull bosses and fixed mobs monster.aggroSwitchController(chr, true); @@ -108,7 +110,7 @@ public final class SpecialMoveHandler extends AbstractPacketHandler { } else if (skillid == Brawler.MP_RECOVERY) {// MP Recovery Skill s = SkillFactory.getSkill(skillid); StatEffect ef = s.getEffect(chr.getSkillLevel(s)); - + int lose = chr.safeAddHP(-1 * (chr.getCurrentMaxHp() / ef.getX())); int gain = -lose * (ef.getY() / 100); chr.addMP(gain); @@ -118,7 +120,7 @@ public final class SpecialMoveHandler extends AbstractPacketHandler { } else if (skillid % 10000000 == 1004) { p.readShort(); } - + if (p.available() == 5) { pos = new Point(p.readShort(), p.readShort()); } @@ -142,7 +144,7 @@ public final class SpecialMoveHandler extends AbstractPacketHandler { c.releaseClient(); } } - + c.sendPacket(PacketCreator.enableActions()); } } else { diff --git a/src/main/java/net/server/channel/handlers/SpouseChatHandler.java b/src/main/java/net/server/channel/handlers/SpouseChatHandler.java index 3104508ae3..7b43153354 100644 --- a/src/main/java/net/server/channel/handlers/SpouseChatHandler.java +++ b/src/main/java/net/server/channel/handlers/SpouseChatHandler.java @@ -34,7 +34,7 @@ public final class SpouseChatHandler extends AbstractPacketHandler { public final void handlePacket(InPacket p, Client c) { p.readString();//recipient String msg = p.readString(); - + int partnerId = c.getPlayer().getPartnerId(); if (partnerId > 0) { // yay marriage Character spouse = c.getWorldServer().getPlayerStorage().getCharacterById(partnerId); diff --git a/src/main/java/net/server/channel/handlers/StorageHandler.java b/src/main/java/net/server/channel/handlers/StorageHandler.java index e494a26c2c..2f75c9f3eb 100644 --- a/src/main/java/net/server/channel/handlers/StorageHandler.java +++ b/src/main/java/net/server/channel/handlers/StorageHandler.java @@ -27,12 +27,11 @@ import net.AbstractPacketHandler; import net.packet.InPacket; /** - * * @author Matze */ public final class StorageHandler extends AbstractPacketHandler { - @Override - public final void handlePacket(InPacket p, Client c) { - StorageProcessor.storageAction(p, c); - } + @Override + public final void handlePacket(InPacket p, Client c) { + StorageProcessor.storageAction(p, c); + } } \ No newline at end of file diff --git a/src/main/java/net/server/channel/handlers/SummonDamageHandler.java b/src/main/java/net/server/channel/handlers/SummonDamageHandler.java index 77c8c94c6f..caa988fec6 100644 --- a/src/main/java/net/server/channel/handlers/SummonDamageHandler.java +++ b/src/main/java/net/server/channel/handlers/SummonDamageHandler.java @@ -44,12 +44,12 @@ import java.util.ArrayList; import java.util.List; public final class SummonDamageHandler extends AbstractDealDamageHandler { - + public final class SummonAttackEntry { - private int monsterOid; - private int damage; - + private final int monsterOid; + private final int damage; + public SummonAttackEntry(int monsterOid, int damage) { this.monsterOid = monsterOid; this.damage = damage; @@ -62,7 +62,7 @@ public final class SummonDamageHandler extends AbstractDealDamageHandler { public int getDamage() { return damage; } - + } @Override @@ -95,11 +95,11 @@ public final class SummonDamageHandler extends AbstractDealDamageHandler { allDamage.add(new SummonAttackEntry(monsterOid, damage)); } player.getMap().broadcastMessage(player, PacketCreator.summonAttack(player.getId(), summon.getObjectId(), direction, allDamage), summon.getPosition()); - + if (player.getMap().isOwnershipRestricted(player)) { return; } - + boolean magic = summonEffect.getWatk() == 0; int maxDmg = calcMaxDamage(summonEffect, player, magic); // thanks Darter (YungMoozi) for reporting unchecked max dmg for (SummonAttackEntry attackEntry : allDamage) { @@ -112,7 +112,7 @@ public final class SummonDamageHandler extends AbstractDealDamageHandler { FilePrinter.printError(FilePrinter.EXPLOITS + c.getPlayer().getName() + ".txt", c.getPlayer().getName() + " used a summon of skillid " + summon.getSkill() + " to attack " + MonsterInformationProvider.getInstance().getMobNameFromId(target.getId()) + " with damage " + damage + " (max: " + maxDmg + ")"); damage = maxDmg; } - + if (damage > 0 && summonEffect.getMonsterStati().size() > 0) { if (summonEffect.makeChanceResult()) { target.applyStatus(player, new MonsterStatusEffect(summonEffect.getMonsterStati(), summonSkill, null, false), summonEffect.isPoison(), 4000); @@ -121,33 +121,33 @@ public final class SummonDamageHandler extends AbstractDealDamageHandler { player.getMap().damageMonster(player, target, damage); } } - + if (summon.getSkill() == Outlaw.GAVIOTA) { // thanks Periwinks for noticing Gaviota not cancelling after grenade toss player.cancelEffect(summonEffect, false, -1); } } - + private static int calcMaxDamage(StatEffect summonEffect, Character player, boolean magic) { double maxDamage; - + if (magic) { int matk = Math.max(player.getTotalMagic(), 14); maxDamage = player.calculateMaxBaseMagicDamage(matk) * (0.05 * summonEffect.getMatk()); } else { int watk = Math.max(player.getTotalWatk(), 14); Item weapon_item = player.getInventory(InventoryType.EQUIPPED).getItem((short) -11); - + int maxBaseDmg; // thanks Conrad, Atoot for detecting some summons legitimately hitting over the calculated limit if (weapon_item != null) { maxBaseDmg = player.calculateMaxBaseDamage(watk, ItemInformationProvider.getInstance().getWeaponType(weapon_item.getItemId())); } else { maxBaseDmg = player.calculateMaxBaseDamage(watk, WeaponType.SWORD1H); } - + float summonDmgMod = (maxBaseDmg >= 438) ? 0.054f : 0.077f; maxDamage = maxBaseDmg * (summonDmgMod * summonEffect.getWatk()); } - + return (int) maxDamage; } } diff --git a/src/main/java/net/server/channel/handlers/TakeDamageHandler.java b/src/main/java/net/server/channel/handlers/TakeDamageHandler.java index 0c8dec5338..720bcc9a9f 100644 --- a/src/main/java/net/server/channel/handlers/TakeDamageHandler.java +++ b/src/main/java/net/server/channel/handlers/TakeDamageHandler.java @@ -54,7 +54,7 @@ public final class TakeDamageHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { List banishPlayers = new ArrayList<>(); - + Character chr = c.getPlayer(); p.readInt(); byte damagefrom = p.readByte(); @@ -68,22 +68,22 @@ public final class TakeDamageHandler extends AbstractPacketHandler { final MapleMap map = chr.getMap(); if (damagefrom != -3 && damagefrom != -4) { monsteridfrom = p.readInt(); - oid = p.readInt(); - + oid = p.readInt(); + try { MapObject mmo = map.getMapObject(oid); - if(mmo instanceof Monster) { + if (mmo instanceof Monster) { attacker = (Monster) mmo; - if(attacker.getId() != monsteridfrom) { + if (attacker.getId() != monsteridfrom) { attacker = null; } } - + if (attacker != null) { if (attacker.isBuffed(MonsterStatus.NEUTRALISE)) { return; } - + List loseItems; if (damage > 0) { loseItems = attacker.getStats().loseItem(); @@ -95,17 +95,17 @@ public final class TakeDamageHandler extends AbstractPacketHandler { Point pos = new Point(0, chr.getPosition().y); for (loseItem loseItem : loseItems) { type = ItemConstants.getInventoryType(loseItem.getId()); - + int dropCount = 0; for (byte b = 0; b < loseItem.getX(); b++) { if (Randomizer.nextInt(100) < loseItem.getChance()) { dropCount += 1; } } - + if (dropCount > 0) { int qty; - + Inventory inv = chr.getInventory(type); inv.lockInventory(); try { @@ -114,7 +114,7 @@ public final class TakeDamageHandler extends AbstractPacketHandler { } finally { inv.unlockInventory(); } - + if (loseItem.getId() == 4031868) { chr.updateAriantScore(); } @@ -133,67 +133,67 @@ public final class TakeDamageHandler extends AbstractPacketHandler { } else if (damagefrom != 0 || !map.removeSelfDestructive(oid)) { // thanks inhyuk for noticing self-destruct damage not being handled properly return; } - } catch(ClassCastException e) { + } catch (ClassCastException e) { //this happens due to mob on last map damaging player just before changing maps - + e.printStackTrace(); FilePrinter.printError(FilePrinter.EXCEPTION_CAUGHT, "Attacker is not a mob-type, rather is a " + map.getMapObject(oid).getClass().getName() + " entity."); - + return; } - + direction = p.readByte(); } if (damagefrom != -1 && damagefrom != -2 && attacker != null) { MobAttackInfo attackInfo = MobAttackInfoFactory.getMobAttackInfo(attacker, damagefrom); if (attackInfo != null) { - if (attackInfo.isDeadlyAttack()) { - mpattack = chr.getMp() - 1; - is_deadly = true; - } - mpattack += attackInfo.getMpBurn(); - MobSkill mobSkill = MobSkillFactory.getMobSkill(attackInfo.getDiseaseSkill(), attackInfo.getDiseaseLevel()); - if (mobSkill != null && damage > 0) { - mobSkill.applyEffect(chr, attacker, false, banishPlayers); - } - - attacker.setMp(attacker.getMp() - attackInfo.getMpCon()); - if (chr.getBuffedValue(BuffStat.MANA_REFLECTION) != null && damage > 0 && !attacker.isBoss()) { - int jobid = chr.getJob().getId(); - if (jobid == 212 || jobid == 222 || jobid == 232) { - int id = jobid * 10000 + 1002; - Skill manaReflectSkill = SkillFactory.getSkill(id); - if (chr.isBuffFrom(BuffStat.MANA_REFLECTION, manaReflectSkill) && chr.getSkillLevel(manaReflectSkill) > 0 && manaReflectSkill.getEffect(chr.getSkillLevel(manaReflectSkill)).makeChanceResult()) { - int bouncedamage = (damage * manaReflectSkill.getEffect(chr.getSkillLevel(manaReflectSkill)).getX() / 100); - if (bouncedamage > attacker.getMaxHp() / 5) { - bouncedamage = attacker.getMaxHp() / 5; - } - map.damageMonster(chr, attacker, bouncedamage); - map.broadcastMessage(chr, PacketCreator.damageMonster(oid, bouncedamage), true); - chr.sendPacket(PacketCreator.showOwnBuffEffect(id, 5)); - map.broadcastMessage(chr, PacketCreator.showBuffEffect(chr.getId(), id, 5), false); + if (attackInfo.isDeadlyAttack()) { + mpattack = chr.getMp() - 1; + is_deadly = true; + } + mpattack += attackInfo.getMpBurn(); + MobSkill mobSkill = MobSkillFactory.getMobSkill(attackInfo.getDiseaseSkill(), attackInfo.getDiseaseLevel()); + if (mobSkill != null && damage > 0) { + mobSkill.applyEffect(chr, attacker, false, banishPlayers); + } + + attacker.setMp(attacker.getMp() - attackInfo.getMpCon()); + if (chr.getBuffedValue(BuffStat.MANA_REFLECTION) != null && damage > 0 && !attacker.isBoss()) { + int jobid = chr.getJob().getId(); + if (jobid == 212 || jobid == 222 || jobid == 232) { + int id = jobid * 10000 + 1002; + Skill manaReflectSkill = SkillFactory.getSkill(id); + if (chr.isBuffFrom(BuffStat.MANA_REFLECTION, manaReflectSkill) && chr.getSkillLevel(manaReflectSkill) > 0 && manaReflectSkill.getEffect(chr.getSkillLevel(manaReflectSkill)).makeChanceResult()) { + int bouncedamage = (damage * manaReflectSkill.getEffect(chr.getSkillLevel(manaReflectSkill)).getX() / 100); + if (bouncedamage > attacker.getMaxHp() / 5) { + bouncedamage = attacker.getMaxHp() / 5; } + map.damageMonster(chr, attacker, bouncedamage); + map.broadcastMessage(chr, PacketCreator.damageMonster(oid, bouncedamage), true); + chr.sendPacket(PacketCreator.showOwnBuffEffect(id, 5)); + map.broadcastMessage(chr, PacketCreator.showBuffEffect(chr.getId(), id, 5), false); } } - } + } + } } - + if (damage == -1) { fake = 4020002 + (chr.getJob().getId() / 10 - 40) * 100000; } - + if (damage > 0) { chr.getAutobanManager().resetMisses(); } else { chr.getAutobanManager().addMiss(); } - + //in dojo player cannot use pot, so deadly attacks should be turned off as well - if(is_deadly && GameConstants.isDojo(chr.getMap().getId()) && !YamlConfig.config.server.USE_DEADLY_DOJO) { + if (is_deadly && GameConstants.isDojo(chr.getMap().getId()) && !YamlConfig.config.server.USE_DEADLY_DOJO) { damage = 0; mpattack = 0; } - + if (damage > 0 && !chr.isHidden()) { if (attacker != null) { if (damagefrom == -1) { @@ -215,7 +215,7 @@ public final class TakeDamageHandler extends AbstractPacketHandler { } } } - + StatEffect cBarrier = chr.getBuffEffect(BuffStat.COMBO_BARRIER); // thanks BHB for noticing Combo Barrier buff not working if (cBarrier != null) { damage *= (cBarrier.getX() / 1000.0); @@ -232,7 +232,7 @@ public final class TakeDamageHandler extends AbstractPacketHandler { if (achilles != 0 && achilles1 != null) { damage *= (achilles1.getEffect(achilles).getX() / 1000.0); } - + Skill highDef = SkillFactory.getSkill(Aran.HIGH_DEFENSE); int hdLevel = chr.getSkillLevel(highDef); if (highDef != null && hdLevel > 0) { @@ -243,13 +243,13 @@ public final class TakeDamageHandler extends AbstractPacketHandler { if (chr.getBuffedValue(BuffStat.MAGIC_GUARD) != null && mpattack == 0) { int mploss = (int) (damage * (chr.getBuffedValue(BuffStat.MAGIC_GUARD).doubleValue() / 100.0)); int hploss = damage - mploss; - + int curmp = chr.getMp(); if (mploss > curmp) { hploss += mploss - curmp; mploss = curmp; } - + chr.addMPHP(-hploss, -mploss); } else if (mesoguard != null) { damage = Math.round(damage / 2); @@ -277,7 +277,7 @@ public final class TakeDamageHandler extends AbstractPacketHandler { chr.setDojoEnergy(chr.getDojoEnergy() + YamlConfig.config.server.DOJO_ENERGY_DMG); c.sendPacket(PacketCreator.getEnergy("energy", chr.getDojoEnergy())); } - + for (Character player : banishPlayers) { // chill, if this list ever gets non-empty an attacker does exist, trust me :) player.changeMapBanish(attacker.getBanish().getMap(), attacker.getBanish().getPortal(), attacker.getBanish().getMsg()); } diff --git a/src/main/java/net/server/channel/handlers/TouchReactorHandler.java b/src/main/java/net/server/channel/handlers/TouchReactorHandler.java index b3f684d9e0..d204f45b10 100644 --- a/src/main/java/net/server/channel/handlers/TouchReactorHandler.java +++ b/src/main/java/net/server/channel/handlers/TouchReactorHandler.java @@ -28,11 +28,10 @@ import scripting.reactor.ReactorScriptManager; import server.maps.Reactor; /** - * * @author Generic */ public final class TouchReactorHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { int oid = p.readInt(); diff --git a/src/main/java/net/server/channel/handlers/TouchingCashShopHandler.java b/src/main/java/net/server/channel/handlers/TouchingCashShopHandler.java index 4035762447..279878960a 100644 --- a/src/main/java/net/server/channel/handlers/TouchingCashShopHandler.java +++ b/src/main/java/net/server/channel/handlers/TouchingCashShopHandler.java @@ -27,7 +27,6 @@ import net.packet.InPacket; import tools.PacketCreator; /** - * * @author Terry Han (Acrylic) */ public final class TouchingCashShopHandler extends AbstractPacketHandler { diff --git a/src/main/java/net/server/channel/handlers/TransferNameHandler.java b/src/main/java/net/server/channel/handlers/TransferNameHandler.java index 1b7baca07c..bca96e816d 100644 --- a/src/main/java/net/server/channel/handlers/TransferNameHandler.java +++ b/src/main/java/net/server/channel/handlers/TransferNameHandler.java @@ -32,12 +32,11 @@ import java.sql.*; import java.util.Calendar; /** - * * @author Ronan * @author Ubaware */ public final class TransferNameHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { p.readInt(); //cid @@ -47,34 +46,34 @@ public final class TransferNameHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.enableActions()); return; } - if(!YamlConfig.config.server.ALLOW_CASHSHOP_NAME_CHANGE) { + if (!YamlConfig.config.server.ALLOW_CASHSHOP_NAME_CHANGE) { c.sendPacket(PacketCreator.sendNameTransferRules(4)); return; } Character chr = c.getPlayer(); - if(chr.getLevel() < 10) { + if (chr.getLevel() < 10) { c.sendPacket(PacketCreator.sendNameTransferRules(4)); return; - } else if(c.getTempBanCalendar() != null && c.getTempBanCalendar().getTimeInMillis() + (30*24*60*60*1000) < Calendar.getInstance().getTimeInMillis()) { + } else if (c.getTempBanCalendar() != null && c.getTempBanCalendar().getTimeInMillis() + (30 * 24 * 60 * 60 * 1000) < Calendar.getInstance().getTimeInMillis()) { c.sendPacket(PacketCreator.sendNameTransferRules(2)); return; } //sql queries try (Connection con = DatabaseConnection.getConnection(); - PreparedStatement ps = con.prepareStatement("SELECT completionTime FROM namechanges WHERE characterid=?")) { //double check, just in case + PreparedStatement ps = con.prepareStatement("SELECT completionTime FROM namechanges WHERE characterid=?")) { //double check, just in case ps.setInt(1, chr.getId()); ResultSet rs = ps.executeQuery(); - while(rs.next()) { + while (rs.next()) { Timestamp completedTimestamp = rs.getTimestamp("completionTime"); - if(completedTimestamp == null) { //has pending name request + if (completedTimestamp == null) { //has pending name request c.sendPacket(PacketCreator.sendNameTransferRules(1)); return; - } else if(completedTimestamp.getTime() + YamlConfig.config.server.NAME_CHANGE_COOLDOWN > System.currentTimeMillis()) { + } else if (completedTimestamp.getTime() + YamlConfig.config.server.NAME_CHANGE_COOLDOWN > System.currentTimeMillis()) { c.sendPacket(PacketCreator.sendNameTransferRules(3)); return; } } - } catch(SQLException e) { + } catch (SQLException e) { e.printStackTrace(); return; } diff --git a/src/main/java/net/server/channel/handlers/TransferNameResultHandler.java b/src/main/java/net/server/channel/handlers/TransferNameResultHandler.java index 1cb0dd15cb..f32d96a410 100644 --- a/src/main/java/net/server/channel/handlers/TransferNameResultHandler.java +++ b/src/main/java/net/server/channel/handlers/TransferNameResultHandler.java @@ -27,11 +27,10 @@ import net.packet.InPacket; import tools.PacketCreator; /** - * * @author Ronan */ public final class TransferNameResultHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { String name = p.readString(); diff --git a/src/main/java/net/server/channel/handlers/TransferWorldHandler.java b/src/main/java/net/server/channel/handlers/TransferWorldHandler.java index 7bbfcd39c6..17179ca903 100644 --- a/src/main/java/net/server/channel/handlers/TransferWorldHandler.java +++ b/src/main/java/net/server/channel/handlers/TransferWorldHandler.java @@ -32,12 +32,11 @@ import tools.PacketCreator; import java.sql.*; /** - * * @author Ronan * @author Ubaware */ public final class TransferWorldHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { p.readInt(); //cid @@ -48,30 +47,30 @@ public final class TransferWorldHandler extends AbstractPacketHandler { return; } Character chr = c.getPlayer(); - if(!YamlConfig.config.server.ALLOW_CASHSHOP_WORLD_TRANSFER || Server.getInstance().getWorldsSize() <= 1) { + if (!YamlConfig.config.server.ALLOW_CASHSHOP_WORLD_TRANSFER || Server.getInstance().getWorldsSize() <= 1) { c.sendPacket(PacketCreator.sendWorldTransferRules(9, c)); return; } int worldTransferError = chr.checkWorldTransferEligibility(); - if(worldTransferError != 0) { + if (worldTransferError != 0) { c.sendPacket(PacketCreator.sendWorldTransferRules(worldTransferError, c)); return; } try (Connection con = DatabaseConnection.getConnection(); - PreparedStatement ps = con.prepareStatement("SELECT completionTime FROM worldtransfers WHERE characterid=?")) { + PreparedStatement ps = con.prepareStatement("SELECT completionTime FROM worldtransfers WHERE characterid=?")) { ps.setInt(1, chr.getId()); ResultSet rs = ps.executeQuery(); - while(rs.next()) { + while (rs.next()) { Timestamp completedTimestamp = rs.getTimestamp("completionTime"); - if(completedTimestamp == null) { //has pending world transfer + if (completedTimestamp == null) { //has pending world transfer c.sendPacket(PacketCreator.sendWorldTransferRules(6, c)); return; - } else if(completedTimestamp.getTime() + YamlConfig.config.server.WORLD_TRANSFER_COOLDOWN > System.currentTimeMillis()) { + } else if (completedTimestamp.getTime() + YamlConfig.config.server.WORLD_TRANSFER_COOLDOWN > System.currentTimeMillis()) { c.sendPacket(PacketCreator.sendWorldTransferRules(7, c)); return; } } - } catch(SQLException e) { + } catch (SQLException e) { e.printStackTrace(); return; } diff --git a/src/main/java/net/server/channel/handlers/TrockAddMapHandler.java b/src/main/java/net/server/channel/handlers/TrockAddMapHandler.java index 0f2dd40856..8ead1aa624 100644 --- a/src/main/java/net/server/channel/handlers/TrockAddMapHandler.java +++ b/src/main/java/net/server/channel/handlers/TrockAddMapHandler.java @@ -29,11 +29,10 @@ import server.maps.FieldLimit; import tools.PacketCreator; /** - * * @author kevintjuh93 */ public final class TrockAddMapHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { Character chr = c.getPlayer(); @@ -41,19 +40,21 @@ public final class TrockAddMapHandler extends AbstractPacketHandler { boolean vip = p.readByte() == 1; if (type == 0x00) { int mapId = p.readInt(); - if (vip) + if (vip) { chr.deleteFromVipTrocks(mapId); - else + } else { chr.deleteFromTrocks(mapId); + } c.sendPacket(PacketCreator.trockRefreshMapList(chr, true, vip)); } else if (type == 0x01) { if (!FieldLimit.CANNOTVIPROCK.check(chr.getMap().getFieldLimit())) { - if (vip) + if (vip) { chr.addVipTrockMap(); - else + } else { chr.addTrockMap(); + } - c.sendPacket(PacketCreator.trockRefreshMapList(chr, false, vip)); + c.sendPacket(PacketCreator.trockRefreshMapList(chr, false, vip)); } else { chr.message("You may not save this map."); } diff --git a/src/main/java/net/server/channel/handlers/UseCatchItemHandler.java b/src/main/java/net/server/channel/handlers/UseCatchItemHandler.java index d6419dabe8..06fa2dc3f5 100644 --- a/src/main/java/net/server/channel/handlers/UseCatchItemHandler.java +++ b/src/main/java/net/server/channel/handlers/UseCatchItemHandler.java @@ -35,7 +35,6 @@ import server.life.Monster; import tools.PacketCreator; /** - * * @author kevintjuh93 */ public final class UseCatchItemHandler extends AbstractPacketHandler { @@ -48,13 +47,13 @@ public final class UseCatchItemHandler extends AbstractPacketHandler { p.readShort(); int itemId = p.readInt(); int monsterid = p.readInt(); - + Monster mob = chr.getMap().getMonsterByOid(monsterid); if (chr.getInventory(ItemConstants.getInventoryType(itemId)).countById(itemId) <= 0) { - return; + return; } if (mob == null) { - return; + return; } switch (itemId) { case 2270000: @@ -63,7 +62,7 @@ public final class UseCatchItemHandler extends AbstractPacketHandler { mob.getMap().killMonster(mob, null, false); InventoryManipulator.removeById(c, InventoryType.USE, itemId, 1, true, true); InventoryManipulator.addById(c, 1902000, (short) 1, "", -1); - } + } c.sendPacket(PacketCreator.enableActions()); break; case 2270001: @@ -98,7 +97,7 @@ public final class UseCatchItemHandler extends AbstractPacketHandler { } else { chr.dropMessage(5, "Make a ETC slot available before using this item."); } - + abm.spam(10); } else { c.sendPacket(PacketCreator.catchMessage(0)); @@ -162,12 +161,12 @@ public final class UseCatchItemHandler extends AbstractPacketHandler { case 2270004: if (mob.getId() == 9300175) { if (mob.getHp() < ((mob.getMaxHp() / 10) * 4)) { - chr.getMap().broadcastMessage(PacketCreator.catchMonster(monsterid, itemId, (byte) 1)); - mob.getMap().killMonster(mob, null, false); - InventoryManipulator.removeById(c, InventoryType.USE, itemId, 1, true, true); - InventoryManipulator.addById(c, 4001169, (short) 1, "", -1); + chr.getMap().broadcastMessage(PacketCreator.catchMonster(monsterid, itemId, (byte) 1)); + mob.getMap().killMonster(mob, null, false); + InventoryManipulator.removeById(c, InventoryType.USE, itemId, 1, true, true); + InventoryManipulator.addById(c, 4001169, (short) 1, "", -1); } else { - c.sendPacket(PacketCreator.catchMessage(0)); + c.sendPacket(PacketCreator.catchMessage(0)); } } c.sendPacket(PacketCreator.enableActions()); @@ -188,15 +187,15 @@ public final class UseCatchItemHandler extends AbstractPacketHandler { break; default: // proper Fish catch, thanks to Dragohe4rt - + ItemInformationProvider ii = ItemInformationProvider.getInstance(); int itemGanho = ii.getCreateItem(itemId); int mobItem = ii.getMobItem(itemId); - + if (itemGanho != 0 && mobItem == mob.getId()) { int timeCatch = ii.getUseDelay(itemId); int mobHp = ii.getMobHP(itemId); - + if (timeCatch != 0 && (abm.getLastSpam(10) + timeCatch) < currentServerTime()) { if (mobHp != 0 && mob.getHp() < ((mob.getMaxHp() / 100) * mobHp)) { chr.getMap().broadcastMessage(PacketCreator.catchMonster(monsterid, itemId, (byte) 1)); @@ -214,7 +213,7 @@ public final class UseCatchItemHandler extends AbstractPacketHandler { } } c.sendPacket(PacketCreator.enableActions()); - + // System.out.println("UseCatchItemHandler: \r\n" + slea.toString()); } } diff --git a/src/main/java/net/server/channel/handlers/UseChairHandler.java b/src/main/java/net/server/channel/handlers/UseChairHandler.java index ff92a001e4..317e5c80ec 100644 --- a/src/main/java/net/server/channel/handlers/UseChairHandler.java +++ b/src/main/java/net/server/channel/handlers/UseChairHandler.java @@ -31,12 +31,12 @@ public final class UseChairHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { int itemId = p.readInt(); - + // thanks Darter (YungMoozi) for reporting unchecked chair item if (!ItemConstants.isChair(itemId) || c.getPlayer().getInventory(InventoryType.SETUP).findById(itemId) == null) { return; } - + if (c.tryacquireClient()) { try { c.getPlayer().sitChair(itemId); diff --git a/src/main/java/net/server/channel/handlers/UseGachaExpHandler.java b/src/main/java/net/server/channel/handlers/UseGachaExpHandler.java index 60702ea1f7..ba1384297d 100644 --- a/src/main/java/net/server/channel/handlers/UseGachaExpHandler.java +++ b/src/main/java/net/server/channel/handlers/UseGachaExpHandler.java @@ -29,16 +29,15 @@ import net.packet.InPacket; import tools.PacketCreator; /** - * * @author kevintjuh93 - * + *

* Modified by -- Ronan - concurrency protection */ public class UseGachaExpHandler extends AbstractPacketHandler { - + @Override public void handlePacket(InPacket p, Client c) { - + if (c.tryacquireClient()) { try { if (c.getPlayer().getGachaExp() <= 0) { @@ -49,7 +48,7 @@ public class UseGachaExpHandler extends AbstractPacketHandler { c.releaseClient(); } } - + c.sendPacket(PacketCreator.enableActions()); } } diff --git a/src/main/java/net/server/channel/handlers/UseHammerHandler.java b/src/main/java/net/server/channel/handlers/UseHammerHandler.java index f2a160a720..8a0dd9db0e 100644 --- a/src/main/java/net/server/channel/handlers/UseHammerHandler.java +++ b/src/main/java/net/server/channel/handlers/UseHammerHandler.java @@ -27,7 +27,6 @@ import net.packet.InPacket; import tools.PacketCreator; /** - * * @author Jay Estrella */ public final class UseHammerHandler extends AbstractPacketHandler { diff --git a/src/main/java/net/server/channel/handlers/UseItemEffectHandler.java b/src/main/java/net/server/channel/handlers/UseItemEffectHandler.java index e1838d0048..7cb9307773 100644 --- a/src/main/java/net/server/channel/handlers/UseItemEffectHandler.java +++ b/src/main/java/net/server/channel/handlers/UseItemEffectHandler.java @@ -39,7 +39,9 @@ public final class UseItemEffectHandler extends AbstractPacketHandler { toUse = c.getPlayer().getInventory(InventoryType.CASH).findById(itemId); } if (toUse == null || toUse.getQuantity() < 1) { - if (itemId != 0) return; + if (itemId != 0) { + return; + } } c.getPlayer().setItemEffect(itemId); c.getPlayer().getMap().broadcastMessage(c.getPlayer(), PacketCreator.itemEffect(c.getPlayer().getId(), itemId), false); diff --git a/src/main/java/net/server/channel/handlers/UseItemHandler.java b/src/main/java/net/server/channel/handlers/UseItemHandler.java index 10e792a94a..b0d7a802a5 100644 --- a/src/main/java/net/server/channel/handlers/UseItemHandler.java +++ b/src/main/java/net/server/channel/handlers/UseItemHandler.java @@ -42,7 +42,7 @@ public final class UseItemHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { Character chr = c.getPlayer(); - + if (!chr.isAlive()) { c.sendPacket(PacketCreator.enableActions()); return; @@ -58,29 +58,29 @@ public final class UseItemHandler extends AbstractPacketHandler { remove(c, slot); return; } else if (itemId == 2050001) { - chr.dispelDebuff(Disease.DARKNESS); + chr.dispelDebuff(Disease.DARKNESS); remove(c, slot); return; - } else if (itemId == 2050002) { - chr.dispelDebuff(Disease.WEAKEN); + } else if (itemId == 2050002) { + chr.dispelDebuff(Disease.WEAKEN); chr.dispelDebuff(Disease.SLOW); remove(c, slot); return; } else if (itemId == 2050003) { chr.dispelDebuff(Disease.SEAL); - chr.dispelDebuff(Disease.CURSE); + chr.dispelDebuff(Disease.CURSE); remove(c, slot); return; } else if (ItemConstants.isTownScroll(itemId)) { int banMap = chr.getMapId(); int banSp = chr.getMap().findClosestPlayerSpawnpoint(chr.getPosition()).getId(); long banTime = currentServerTime(); - + if (ii.getItemEffect(toUse.getItemId()).applyTo(chr)) { - if(YamlConfig.config.server.USE_BANISHABLE_TOWN_SCROLL) { + if (YamlConfig.config.server.USE_BANISHABLE_TOWN_SCROLL) { chr.setBanishPlayerData(banMap, banSp, banTime); } - + remove(c, slot); } return; @@ -92,14 +92,14 @@ public final class UseItemHandler extends AbstractPacketHandler { } return; } - + remove(c, slot); - - if(toUse.getItemId() != 2022153) { + + if (toUse.getItemId() != 2022153) { ii.getItemEffect(toUse.getItemId()).applyTo(chr); } else { StatEffect mse = ii.getItemEffect(toUse.getItemId()); - for(Character player : chr.getMap().getCharacters()) { + for (Character player : chr.getMap().getCharacters()) { mse.applyTo(player); } } diff --git a/src/main/java/net/server/channel/handlers/UseMapleLifeHandler.java b/src/main/java/net/server/channel/handlers/UseMapleLifeHandler.java index 515d610c3d..9628c7bf98 100644 --- a/src/main/java/net/server/channel/handlers/UseMapleLifeHandler.java +++ b/src/main/java/net/server/channel/handlers/UseMapleLifeHandler.java @@ -26,7 +26,6 @@ import net.packet.InPacket; import tools.PacketCreator; /** - * * @author RonanLana */ public class UseMapleLifeHandler extends AbstractPacketHandler { @@ -34,17 +33,17 @@ public class UseMapleLifeHandler extends AbstractPacketHandler { public void handlePacket(InPacket p, Client c) { Character player = c.getPlayer(); long timeNow = currentServerTime(); - - if(timeNow - player.getLastUsedCashItem() < 3000) { + + if (timeNow - player.getLastUsedCashItem() < 3000) { player.dropMessage(5, "Please wait a moment before trying again."); c.sendPacket(PacketCreator.sendMapleLifeError(3)); c.sendPacket(PacketCreator.enableActions()); return; } player.setLastUsedCashItem(timeNow); - + String name = p.readString(); - if(Character.canCreateChar(name)) { + if (Character.canCreateChar(name)) { c.sendPacket(PacketCreator.sendMapleLifeCharacterInfo()); } else { c.sendPacket(PacketCreator.sendMapleLifeNameError()); diff --git a/src/main/java/net/server/channel/handlers/UseMountFoodHandler.java b/src/main/java/net/server/channel/handlers/UseMountFoodHandler.java index 56a049df0d..a514ce5ac5 100644 --- a/src/main/java/net/server/channel/handlers/UseMountFoodHandler.java +++ b/src/main/java/net/server/channel/handlers/UseMountFoodHandler.java @@ -43,15 +43,15 @@ public final class UseMountFoodHandler extends AbstractPacketHandler { p.skip(4); short pos = p.readShort(); int itemid = p.readInt(); - + Character chr = c.getPlayer(); Mount mount = chr.getMount(); Inventory useInv = chr.getInventory(InventoryType.USE); - + if (c.tryacquireClient()) { try { Boolean mountLevelup = null; - + useInv.lockInventory(); try { Item item = useInv.getItem(pos); @@ -69,7 +69,7 @@ public final class UseMountFoodHandler extends AbstractPacketHandler { if (levelup) { mount.setLevel(level + 1); } - + mountLevelup = levelup; } @@ -78,7 +78,7 @@ public final class UseMountFoodHandler extends AbstractPacketHandler { } finally { useInv.unlockInventory(); } - + if (mountLevelup != null) { chr.getMap().broadcastMessage(PacketCreator.updateMount(chr.getId(), mount, mountLevelup)); } diff --git a/src/main/java/net/server/channel/handlers/UseOwlOfMinervaHandler.java b/src/main/java/net/server/channel/handlers/UseOwlOfMinervaHandler.java index 37b88b3ed5..7e276f59bd 100644 --- a/src/main/java/net/server/channel/handlers/UseOwlOfMinervaHandler.java +++ b/src/main/java/net/server/channel/handlers/UseOwlOfMinervaHandler.java @@ -40,25 +40,25 @@ public final class UseOwlOfMinervaHandler extends AbstractPacketHandler { public final void handlePacket(InPacket p, Client c) { List> owlSearched = c.getWorldServer().getOwlSearchedItems(); List owlLeaderboards; - - if(owlSearched.size() < 5) { + + if (owlSearched.size() < 5) { owlLeaderboards = new LinkedList<>(); - for(int i : GameConstants.OWL_DATA) { + for (int i : GameConstants.OWL_DATA) { owlLeaderboards.add(i); } } else { // descending order Comparator> comparator = (p1, p2) -> p2.getRight().compareTo(p1.getRight()); - + PriorityQueue> queue = new PriorityQueue<>(Math.max(1, owlSearched.size()), comparator); queue.addAll(owlSearched); - + owlLeaderboards = new LinkedList<>(); - for(int i = 0; i < Math.min(owlSearched.size(), 10); i++) { + for (int i = 0; i < Math.min(owlSearched.size(), 10); i++) { owlLeaderboards.add(queue.remove().getLeft()); } } - + c.sendPacket(PacketCreator.getOwlOpen(owlLeaderboards)); } } \ No newline at end of file diff --git a/src/main/java/net/server/channel/handlers/UseSolomonHandler.java b/src/main/java/net/server/channel/handlers/UseSolomonHandler.java index e460d81245..c47d1c8a03 100644 --- a/src/main/java/net/server/channel/handlers/UseSolomonHandler.java +++ b/src/main/java/net/server/channel/handlers/UseSolomonHandler.java @@ -33,9 +33,8 @@ import server.ItemInformationProvider; import tools.PacketCreator; /** - * * @author XoticStory - * + *

* Modified by -- kevintjuh93, Ronan */ public final class UseSolomonHandler extends AbstractPacketHandler { @@ -46,7 +45,7 @@ public final class UseSolomonHandler extends AbstractPacketHandler { short slot = p.readShort(); int itemId = p.readInt(); ItemInformationProvider ii = ItemInformationProvider.getInstance(); - + if (c.tryacquireClient()) { try { Character chr = c.getPlayer(); @@ -57,7 +56,7 @@ public final class UseSolomonHandler extends AbstractPacketHandler { if (slotItem == null) { return; } - + long gachaexp = ii.getExpById(itemId); if (slotItem.getItemId() != itemId || slotItem.getQuantity() <= 0 || chr.getLevel() > ii.getMaxLevelById(itemId)) { return; @@ -74,7 +73,7 @@ public final class UseSolomonHandler extends AbstractPacketHandler { c.releaseClient(); } } - + c.sendPacket(PacketCreator.enableActions()); } } diff --git a/src/main/java/net/server/channel/handlers/UseSummonBagHandler.java b/src/main/java/net/server/channel/handlers/UseSummonBagHandler.java index 2c63ae9d8e..d7d7aff22a 100644 --- a/src/main/java/net/server/channel/handlers/UseSummonBagHandler.java +++ b/src/main/java/net/server/channel/handlers/UseSummonBagHandler.java @@ -33,7 +33,6 @@ import tools.PacketCreator; import tools.Randomizer; /** - * * @author AngelSL */ public final class UseSummonBagHandler extends AbstractPacketHandler { diff --git a/src/main/java/net/server/channel/handlers/WeddingHandler.java b/src/main/java/net/server/channel/handlers/WeddingHandler.java index f66fdfba9e..7078c27bfc 100644 --- a/src/main/java/net/server/channel/handlers/WeddingHandler.java +++ b/src/main/java/net/server/channel/handlers/WeddingHandler.java @@ -26,14 +26,13 @@ import java.util.Collections; import java.util.List; /** - * * @author Drago (Dragohe4rt) */ public final class WeddingHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { - + if (c.tryacquireClient()) { try { Character chr = c.getPlayer(); @@ -70,7 +69,7 @@ public final class WeddingHandler extends AbstractPacketHandler { marriage.addGiftItem(groomWishlist, newItem); InventoryManipulator.removeFromSlot(c, type, slot, quantity, false, false); - + KarmaManipulator.toggleKarmaFlagToUntradeable(newItem); marriage.setIntProperty(groomWishlistProp, giftCount + 1); @@ -83,9 +82,11 @@ public final class WeddingHandler extends AbstractPacketHandler { } finally { chrInv.unlockInventory(); } - + if (newItem != null) { - if (YamlConfig.config.server.USE_ENFORCE_MERCHANT_SAVE) chr.saveCharToDB(false); + if (YamlConfig.config.server.USE_ENFORCE_MERCHANT_SAVE) { + chr.saveCharToDB(false); + } marriage.saveGiftItemsToDb(c, groomWishlist, cid); } } else { @@ -97,7 +98,8 @@ public final class WeddingHandler extends AbstractPacketHandler { } else { c.sendPacket(WeddingPackets.onWeddingGiftResult((byte) 0xC, marriage.getWishlistItems(groomWishlist), null)); } - } catch (NumberFormatException nfe) {} + } catch (NumberFormatException nfe) { + } } else { c.sendPacket(PacketCreator.enableActions()); } diff --git a/src/main/java/net/server/channel/handlers/WeddingTalkHandler.java b/src/main/java/net/server/channel/handlers/WeddingTalkHandler.java index 33acf9a99d..5bc845138b 100644 --- a/src/main/java/net/server/channel/handlers/WeddingTalkHandler.java +++ b/src/main/java/net/server/channel/handlers/WeddingTalkHandler.java @@ -28,18 +28,17 @@ import tools.PacketCreator; import tools.packets.WeddingPackets; /** - * * @author Ronan */ public final class WeddingTalkHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { byte action = p.readByte(); - if(action == 1) { + if (action == 1) { EventInstanceManager eim = c.getPlayer().getEventInstance(); - - if(eim != null && !(c.getPlayer().getId() == eim.getIntProperty("groomId") || c.getPlayer().getId() == eim.getIntProperty("brideId"))) { + + if (eim != null && !(c.getPlayer().getId() == eim.getIntProperty("groomId") || c.getPlayer().getId() == eim.getIntProperty("brideId"))) { c.sendPacket(WeddingPackets.OnWeddingProgress(false, 0, 0, (byte) 2)); } else { c.sendPacket(WeddingPackets.OnWeddingProgress(true, 0, 0, (byte) 3)); @@ -47,7 +46,7 @@ public final class WeddingTalkHandler extends AbstractPacketHandler { } else { c.sendPacket(WeddingPackets.OnWeddingProgress(true, 0, 0, (byte) 3)); } - + c.sendPacket(PacketCreator.enableActions()); } } \ No newline at end of file diff --git a/src/main/java/net/server/channel/handlers/WeddingTalkMoreHandler.java b/src/main/java/net/server/channel/handlers/WeddingTalkMoreHandler.java index 830283251c..d65cf34554 100644 --- a/src/main/java/net/server/channel/handlers/WeddingTalkMoreHandler.java +++ b/src/main/java/net/server/channel/handlers/WeddingTalkMoreHandler.java @@ -28,19 +28,18 @@ import tools.PacketCreator; import tools.packets.WeddingPackets; /** - * * @author Ronan */ public final class WeddingTalkMoreHandler extends AbstractPacketHandler { - + @Override public final void handlePacket(InPacket p, Client c) { EventInstanceManager eim = c.getPlayer().getEventInstance(); - if(eim != null && !(c.getPlayer().getId() == eim.getIntProperty("groomId") || c.getPlayer().getId() == eim.getIntProperty("brideId"))) { + if (eim != null && !(c.getPlayer().getId() == eim.getIntProperty("groomId") || c.getPlayer().getId() == eim.getIntProperty("brideId"))) { eim.gridInsert(c.getPlayer(), 1); c.getPlayer().dropMessage(5, "High Priest John: Your blessings have been added to their love. What a noble act for a lovely couple!"); } - + c.sendPacket(WeddingPackets.OnWeddingProgress(true, 0, 0, (byte) 3)); c.sendPacket(PacketCreator.enableActions()); } diff --git a/src/main/java/net/server/coordinator/login/LoginStorage.java b/src/main/java/net/server/coordinator/login/LoginStorage.java index d8e14e49f4..a3f7815d77 100644 --- a/src/main/java/net/server/coordinator/login/LoginStorage.java +++ b/src/main/java/net/server/coordinator/login/LoginStorage.java @@ -31,12 +31,11 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; /** - * * @author Ronan */ public class LoginStorage { private final ConcurrentHashMap> loginHistory = new ConcurrentHashMap<>(); // Key: accountId - + public boolean registerLogin(int accountId) { List attempts = loginHistory.computeIfAbsent(accountId, k -> new ArrayList<>()); @@ -47,12 +46,12 @@ public class LoginStorage { Collections.fill(attempts, attemptExpiry); return false; } - + attempts.add(attemptExpiry); return true; } } - + public void clearExpiredAttempts() { final Instant now = Instant.ofEpochMilli(Server.getInstance().getCurrentTime()); List accountIdsToClear = new ArrayList<>(); diff --git a/src/main/java/net/server/coordinator/matchchecker/AbstractMatchCheckerListener.java b/src/main/java/net/server/coordinator/matchchecker/AbstractMatchCheckerListener.java index 6bde60a8b3..9076c00670 100644 --- a/src/main/java/net/server/coordinator/matchchecker/AbstractMatchCheckerListener.java +++ b/src/main/java/net/server/coordinator/matchchecker/AbstractMatchCheckerListener.java @@ -24,7 +24,6 @@ import client.Character; import java.util.Set; /** - * * @author Ronan */ public interface AbstractMatchCheckerListener { diff --git a/src/main/java/net/server/coordinator/matchchecker/MatchCheckerListenerFactory.java b/src/main/java/net/server/coordinator/matchchecker/MatchCheckerListenerFactory.java index d150b8fcda..b1f7400a98 100644 --- a/src/main/java/net/server/coordinator/matchchecker/MatchCheckerListenerFactory.java +++ b/src/main/java/net/server/coordinator/matchchecker/MatchCheckerListenerFactory.java @@ -19,29 +19,28 @@ */ package net.server.coordinator.matchchecker; -import net.server.coordinator.matchchecker.listener.MatchCheckerGuildCreation; import net.server.coordinator.matchchecker.listener.MatchCheckerCPQChallenge; +import net.server.coordinator.matchchecker.listener.MatchCheckerGuildCreation; /** - * * @author Ronan */ public class MatchCheckerListenerFactory { - + public enum MatchCheckerType { - + GUILD_CREATION(MatchCheckerGuildCreation.loadListener()), CPQ_CHALLENGE(MatchCheckerCPQChallenge.loadListener()); - + private final AbstractMatchCheckerListener listener; - - private MatchCheckerType(AbstractMatchCheckerListener listener) { + + MatchCheckerType(AbstractMatchCheckerListener listener) { this.listener = listener; } - + public AbstractMatchCheckerListener getListener() { return this.listener; } } - + } diff --git a/src/main/java/net/server/coordinator/matchchecker/MatchCheckerListenerRecipe.java b/src/main/java/net/server/coordinator/matchchecker/MatchCheckerListenerRecipe.java index 8f8bf571d0..7da39333ee 100644 --- a/src/main/java/net/server/coordinator/matchchecker/MatchCheckerListenerRecipe.java +++ b/src/main/java/net/server/coordinator/matchchecker/MatchCheckerListenerRecipe.java @@ -20,7 +20,6 @@ package net.server.coordinator.matchchecker; /** - * * @author Ronan */ public interface MatchCheckerListenerRecipe { diff --git a/src/main/java/net/server/coordinator/matchchecker/listener/MatchCheckerCPQChallenge.java b/src/main/java/net/server/coordinator/matchchecker/listener/MatchCheckerCPQChallenge.java index 1681cc4ca8..0e113eaa1e 100644 --- a/src/main/java/net/server/coordinator/matchchecker/listener/MatchCheckerCPQChallenge.java +++ b/src/main/java/net/server/coordinator/matchchecker/listener/MatchCheckerCPQChallenge.java @@ -32,15 +32,14 @@ import java.util.List; import java.util.Set; /** - * * @author Ronan */ public class MatchCheckerCPQChallenge implements MatchCheckerListenerRecipe { - + public static AbstractMatchCheckerListener loadListener() { return (new MatchCheckerCPQChallenge()).getListener(); } - + private static Character getChallenger(int leaderid, Set matchPlayers) { Character leader = null; for (Character chr : matchPlayers) { @@ -49,47 +48,47 @@ public class MatchCheckerCPQChallenge implements MatchCheckerListenerRecipe { break; } } - + return leader; } - + @Override public AbstractMatchCheckerListener getListener() { return new AbstractMatchCheckerListener() { - + @Override public void onMatchCreated(Character leader, Set nonLeaderMatchPlayers, String message) { NPCConversationManager cm = leader.getClient().getCM(); int npcid = cm.getNpc(); - + Character ldr = null; for (Character chr : nonLeaderMatchPlayers) { ldr = chr; break; } - + Character chr = leader; - + List chrMembers = new LinkedList<>(); for (PartyCharacter mpc : chr.getParty().getMembers()) { if (mpc.isOnline()) { chrMembers.add(mpc); } } - + if (message.contentEquals("cpq1")) { NPCScriptManager.getInstance().start("cpqchallenge", ldr.getClient(), npcid, chrMembers); } else { NPCScriptManager.getInstance().start("cpqchallenge2", ldr.getClient(), npcid, chrMembers); } - + cm.sendOk(LanguageConstants.getMessage(chr, LanguageConstants.CPQChallengeRoomSent)); } - + @Override public void onMatchAccepted(int leaderid, Set matchPlayers, String message) { Character chr = getChallenger(leaderid, matchPlayers); - + Character ldr = null; for (Character ch : matchPlayers) { if (ch != chr) { @@ -97,24 +96,24 @@ public class MatchCheckerCPQChallenge implements MatchCheckerListenerRecipe { break; } } - + if (message.contentEquals("cpq1")) { ldr.getClient().getCM().startCPQ(chr, ldr.getMapId() + 1); } else { ldr.getClient().getCM().startCPQ2(chr, ldr.getMapId() + 1); } - + ldr.getParty().setEnemy(chr.getParty()); chr.getParty().setEnemy(ldr.getParty()); chr.setChallenged(false); } - + @Override public void onMatchDeclined(int leaderid, Set matchPlayers, String message) { Character chr = getChallenger(leaderid, matchPlayers); chr.dropMessage(5, LanguageConstants.getMessage(chr, LanguageConstants.CPQChallengeRoomDenied)); } - + @Override public void onMatchDismissed(int leaderid, Set matchPlayers, String message) {} }; diff --git a/src/main/java/net/server/coordinator/matchchecker/listener/MatchCheckerGuildCreation.java b/src/main/java/net/server/coordinator/matchchecker/listener/MatchCheckerGuildCreation.java index c0ccf29672..55b803b9c8 100644 --- a/src/main/java/net/server/coordinator/matchchecker/listener/MatchCheckerGuildCreation.java +++ b/src/main/java/net/server/coordinator/matchchecker/listener/MatchCheckerGuildCreation.java @@ -34,11 +34,10 @@ import net.server.world.Party; import java.util.Set; /** - * * @author Ronan */ public class MatchCheckerGuildCreation implements MatchCheckerListenerRecipe { - + private static void broadcastGuildCreationDismiss(Set nonLeaderMatchPlayers) { for (Character chr : nonLeaderMatchPlayers) { if (chr.isLoggedinWorld()) { @@ -46,26 +45,26 @@ public class MatchCheckerGuildCreation implements MatchCheckerListenerRecipe { } } } - + public static AbstractMatchCheckerListener loadListener() { return (new MatchCheckerGuildCreation()).getListener(); } - + @Override public AbstractMatchCheckerListener getListener() { return new AbstractMatchCheckerListener() { - + @Override public void onMatchCreated(Character leader, Set nonLeaderMatchPlayers, String message) { Packet createGuildPacket = GuildPackets.createGuildMessage(leader.getName(), message); - + for (Character chr : nonLeaderMatchPlayers) { if (chr.isLoggedinWorld()) { chr.sendPacket(createGuildPacket); } } } - + @Override public void onMatchAccepted(int leaderid, Set matchPlayers, String message) { Character leader = null; @@ -75,13 +74,13 @@ public class MatchCheckerGuildCreation implements MatchCheckerListenerRecipe { break; } } - + if (leader == null || !leader.isLoggedinWorld()) { broadcastGuildCreationDismiss(matchPlayers); return; } matchPlayers.remove(leader); - + if (leader.getGuildId() > 0) { leader.dropMessage(1, "You cannot create a new Guild while in one."); broadcastGuildCreationDismiss(matchPlayers); @@ -110,7 +109,7 @@ public class MatchCheckerGuildCreation implements MatchCheckerListenerRecipe { broadcastGuildCreationDismiss(matchPlayers); return; } - + int gid = Server.getInstance().createGuild(leader.getId(), message); if (gid == 0) { leader.sendPacket(GuildPackets.genericGuildMessage((byte) 0x23)); @@ -118,57 +117,57 @@ public class MatchCheckerGuildCreation implements MatchCheckerListenerRecipe { return; } leader.gainMeso(-YamlConfig.config.server.CREATE_GUILD_COST, true, false, true); - + leader.getMGC().setGuildId(gid); Guild guild = Server.getInstance().getGuild(leader.getGuildId(), leader.getWorld(), leader); // initialize guild structure Server.getInstance().changeRank(gid, leader.getId(), 1); - + leader.sendPacket(GuildPackets.showGuildInfo(leader)); leader.dropMessage(1, "You have successfully created a Guild."); - + for (Character chr : matchPlayers) { boolean cofounder = chr.getPartyId() == partyid; - + GuildCharacter mgc = chr.getMGC(); mgc.setGuildId(gid); mgc.setGuildRank(cofounder ? 2 : 5); mgc.setAllianceRank(5); Server.getInstance().addGuildMember(mgc, chr); - + if (chr.isLoggedinWorld()) { chr.sendPacket(GuildPackets.showGuildInfo(chr)); - + if (cofounder) { chr.dropMessage(1, "You have successfully cofounded a Guild."); } else { chr.dropMessage(1, "You have successfully joined the new Guild."); } } - + chr.saveGuildStatus(); // update database } - + guild.broadcastNameChanged(); guild.broadcastEmblemChanged(); } - + @Override public void onMatchDeclined(int leaderid, Set matchPlayers, String message) { for (Character chr : matchPlayers) { if (chr.getId() == leaderid && chr.getClient() != null) { Party.leaveParty(chr.getParty(), chr.getClient()); } - + if (chr.isLoggedinWorld()) { - chr.sendPacket(GuildPackets.genericGuildMessage((byte)0x26)); + chr.sendPacket(GuildPackets.genericGuildMessage((byte) 0x26)); } } } - + @Override public void onMatchDismissed(int leaderid, Set matchPlayers, String message) { - + Character leader = null; for (Character chr : matchPlayers) { if (chr.getId() == leaderid) { @@ -176,22 +175,22 @@ public class MatchCheckerGuildCreation implements MatchCheckerListenerRecipe { break; } } - + String msg; if (leader != null && leader.getParty() == null) { msg = "The Guild creation has been dismissed since the leader left the founding party."; } else { msg = "The Guild creation has been dismissed since a member was already in a party when they answered."; } - + for (Character chr : matchPlayers) { if (chr.getId() == leaderid && chr.getClient() != null) { Party.leaveParty(chr.getParty(), chr.getClient()); } - + if (chr.isLoggedinWorld()) { chr.message(msg); - chr.sendPacket(GuildPackets.genericGuildMessage((byte)0x26)); + chr.sendPacket(GuildPackets.genericGuildMessage((byte) 0x26)); } } } diff --git a/src/main/java/net/server/coordinator/partysearch/PartySearchCharacter.java b/src/main/java/net/server/coordinator/partysearch/PartySearchCharacter.java index 8594500baa..5518fe6654 100644 --- a/src/main/java/net/server/coordinator/partysearch/PartySearchCharacter.java +++ b/src/main/java/net/server/coordinator/partysearch/PartySearchCharacter.java @@ -24,37 +24,36 @@ import client.Character; import java.lang.ref.WeakReference; /** - * * @author Ronan */ public class PartySearchCharacter { - - private WeakReference player; - private int level; + + private final WeakReference player; + private final int level; private boolean queued; - + public PartySearchCharacter(Character chr) { player = new WeakReference(chr); level = chr.getLevel(); queued = true; } - + @Override public String toString() { Character chr = player.get(); return chr == null ? "[empty]" : chr.toString(); } - + public Character callPlayer(int leaderid, int callerMapid) { Character chr = player.get(); if (chr == null || !PartySearchCoordinator.isInVicinity(callerMapid, chr.getMapId())) { return null; } - + if (chr.hasDisabledPartySearchInvite(leaderid)) { return null; } - + queued = false; if (chr.isLoggedinWorld() && chr.getParty() == null) { return chr; @@ -62,17 +61,17 @@ public class PartySearchCharacter { return null; } } - + public Character getPlayer() { return player.get(); } - + public int getLevel() { return level; } - + public boolean isQueued() { return queued; } - + } diff --git a/src/main/java/net/server/coordinator/partysearch/PartySearchEchelon.java b/src/main/java/net/server/coordinator/partysearch/PartySearchEchelon.java index 2f35217539..661f0069e5 100644 --- a/src/main/java/net/server/coordinator/partysearch/PartySearchEchelon.java +++ b/src/main/java/net/server/coordinator/partysearch/PartySearchEchelon.java @@ -34,36 +34,35 @@ import java.util.List; import java.util.Map; /** - * * @author Ronan */ public class PartySearchEchelon { - + private final MonitoredReentrantReadWriteLock psLock = new MonitoredReentrantReadWriteLock(MonitoredLockType.WORLD_PARTY_SEARCH_ECHELON, true); private final MonitoredReadLock psRLock = MonitoredReadLockFactory.createLock(psLock); private final MonitoredWriteLock psWLock = MonitoredWriteLockFactory.createLock(psLock); - - private Map> echelon = new HashMap<>(20); - + + private final Map> echelon = new HashMap<>(20); + public List exportEchelon() { psWLock.lock(); // reversing read/write actually could provide a lax yet sure performance/precision trade-off here try { List players = new ArrayList<>(echelon.size()); - + for (WeakReference chrRef : echelon.values()) { Character chr = chrRef.get(); if (chr != null) { players.add(chr); } } - + echelon.clear(); return players; } finally { psWLock.unlock(); } } - + public void attachPlayer(Character chr) { psRLock.lock(); try { @@ -72,7 +71,7 @@ public class PartySearchEchelon { psRLock.unlock(); } } - + public boolean detachPlayer(Character chr) { psRLock.lock(); try { @@ -81,5 +80,5 @@ public class PartySearchEchelon { psRLock.unlock(); } } - + } diff --git a/src/main/java/net/server/coordinator/partysearch/PartySearchStorage.java b/src/main/java/net/server/coordinator/partysearch/PartySearchStorage.java index f3cc44a1de..66aa36f5ca 100644 --- a/src/main/java/net/server/coordinator/partysearch/PartySearchStorage.java +++ b/src/main/java/net/server/coordinator/partysearch/PartySearchStorage.java @@ -31,18 +31,17 @@ import tools.IntervalBuilder; import java.util.*; /** - * * @author Ronan */ public class PartySearchStorage { - - private List storage = new ArrayList<>(20); - private IntervalBuilder emptyIntervals = new IntervalBuilder(); - + + private final List storage = new ArrayList<>(20); + private final IntervalBuilder emptyIntervals = new IntervalBuilder(); + private final MonitoredReentrantReadWriteLock psLock = new MonitoredReentrantReadWriteLock(MonitoredLockType.WORLD_PARTY_SEARCH_STORAGE, true); private final MonitoredReadLock psRLock = MonitoredReadLockFactory.createLock(psLock); private final MonitoredWriteLock psWLock = MonitoredWriteLockFactory.createLock(psLock); - + public List getStorageList() { psRLock.lock(); try { @@ -51,11 +50,11 @@ public class PartySearchStorage { psRLock.unlock(); } } - + private Map fetchRemainingPlayers() { List players = getStorageList(); Map remainingPlayers = new HashMap<>(players.size()); - + for (PartySearchCharacter psc : players) { if (psc.isQueued()) { Character chr = psc.getPlayer(); @@ -64,19 +63,19 @@ public class PartySearchStorage { } } } - + return remainingPlayers; } - + public void updateStorage(Collection echelon) { Map newcomers = new HashMap<>(); for (Character chr : echelon) { newcomers.put(chr.getId(), chr); } - + Map curStorage = fetchRemainingPlayers(); curStorage.putAll(newcomers); - + List pscList = new ArrayList<>(curStorage.size()); for (Character chr : curStorage.values()) { pscList.add(new PartySearchCharacter(chr)); @@ -86,7 +85,7 @@ public class PartySearchStorage { int levelP1 = c1.getLevel(), levelP2 = c2.getLevel(); return levelP1 > levelP2 ? 1 : (levelP1 == levelP2 ? 0 : -1); }); - + psWLock.lock(); try { storage.clear(); @@ -94,18 +93,18 @@ public class PartySearchStorage { } finally { psWLock.unlock(); } - + emptyIntervals.clear(); } - + private static int bsearchStorage(List storage, int level) { int st = 0, en = storage.size() - 1; - + int mid, idx; while (en >= st) { idx = (st + en) / 2; mid = storage.get(idx).getLevel(); - + if (mid == level) { return idx; } else if (mid < level) { @@ -114,49 +113,49 @@ public class PartySearchStorage { en = idx - 1; } } - + return en; } - + public Character callPlayer(int callerCid, int callerMapid, int minLevel, int maxLevel) { if (emptyIntervals.inInterval(minLevel, maxLevel)) { return null; } - + List pscList = getStorageList(); - + int idx = bsearchStorage(pscList, maxLevel); for (int i = idx; i >= 0; i--) { PartySearchCharacter psc = pscList.get(i); if (!psc.isQueued()) { continue; } - + if (psc.getLevel() < minLevel) { break; } - + Character chr = psc.callPlayer(callerCid, callerMapid); if (chr != null) { return chr; } } - + emptyIntervals.addInterval(minLevel, maxLevel); return null; } - + public void detachPlayer(Character chr) { PartySearchCharacter toRemove = null; for (PartySearchCharacter psc : getStorageList()) { Character player = psc.getPlayer(); - + if (player != null && player.getId() == chr.getId()) { toRemove = psc; break; } } - + if (toRemove != null) { psWLock.lock(); try { @@ -166,5 +165,5 @@ public class PartySearchStorage { } } } - + } diff --git a/src/main/java/net/server/coordinator/session/Hwid.java b/src/main/java/net/server/coordinator/session/Hwid.java index bd8ad7ce61..caed12c96e 100644 --- a/src/main/java/net/server/coordinator/session/Hwid.java +++ b/src/main/java/net/server/coordinator/session/Hwid.java @@ -2,7 +2,7 @@ package net.server.coordinator.session; import java.util.regex.Pattern; -public record Hwid (String hwid) { +public record Hwid(String hwid) { private static final int HWID_LENGTH = 8; // First part is a mac address (without dashes), second part is the hwid private static final Pattern VALID_HOST_STRING_PATTERN = Pattern.compile("[0-9A-F]{12}_[0-9A-F]{8}"); diff --git a/src/main/java/net/server/coordinator/session/SessionCoordinator.java b/src/main/java/net/server/coordinator/session/SessionCoordinator.java index d093cc2780..d5e18782d4 100644 --- a/src/main/java/net/server/coordinator/session/SessionCoordinator.java +++ b/src/main/java/net/server/coordinator/session/SessionCoordinator.java @@ -37,17 +37,16 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; /** - * * @author Ronan */ public class SessionCoordinator { private static final Logger log = LoggerFactory.getLogger(SessionCoordinator.class); private static final SessionCoordinator instance = new SessionCoordinator(); - + public static SessionCoordinator getInstance() { return instance; } - + public enum AntiMulticlientResult { SUCCESS, REMOTE_LOGGEDIN, @@ -64,7 +63,7 @@ public class SessionCoordinator { private final Set onlineRemoteHwids = new HashSet<>(); // Hwid/nibblehwid private final Map loginRemoteHosts = new ConcurrentHashMap<>(); // Key: Ip (+ nibblehwid) private final HostHwidCache hostHwidCache = new HostHwidCache(); - + private SessionCoordinator() { } @@ -92,10 +91,10 @@ public class SessionCoordinator { return false; } - + public static String getSessionRemoteHost(Client client) { Hwid hwid = client.getHwid(); - + if (hwid != null) { return client.getRemoteAddress() + "-" + hwid.hwid(); } else { @@ -141,7 +140,7 @@ public class SessionCoordinator { final HostHwid knownHwid = hostHwidCache.getEntry(remoteHost); if (knownHwid != null && onlineRemoteHwids.contains(knownHwid.hwid())) { return false; - } else if (loginRemoteHosts.containsKey(remoteHost)) { + } else if (loginRemoteHosts.containsKey(remoteHost)) { return false; } @@ -221,7 +220,7 @@ public class SessionCoordinator { if (initResult != InitializationResult.SUCCESS) { return initResult.getAntiMulticlientResult(); } - + try { Hwid clientHwid = client.getHwid(); // thanks Paxum for noticing account stuck after PIC failure if (clientHwid == null) { @@ -267,7 +266,7 @@ public class SessionCoordinator { log.warn("Failed to associate hwid {} with account id {}", hwid, accountId, ex); } } - + private static Client fetchInTransitionSessionClient(Client client) { Hwid hwid = SessionCoordinator.getInstance().getGameSessionHwid(client); if (hwid == null) { // maybe this session was currently in-transition? @@ -287,12 +286,12 @@ public class SessionCoordinator { return fakeClient; } - + public void closeSession(Client client, Boolean immediately) { if (client == null) { client = fetchInTransitionSessionClient(client); } - + final Hwid hwid = client.getHwid(); client.setHwid(null); // making sure to clean up calls to this function on login phase if (hwid != null) { @@ -321,20 +320,20 @@ public class SessionCoordinator { // thanks BHB, resinate for noticing players from same network not being able to login return hostHwidCache.removeEntryAndGetItsHwid(remoteHost); } - + public Hwid getGameSessionHwid(Client client) { String remoteHost = getSessionRemoteHost(client); return hostHwidCache.getEntryHwid(remoteHost); } - + public void clearExpiredHwidHistory() { hostHwidCache.clearExpired(); } - + public void runUpdateLoginHistory() { loginStorage.clearExpiredAttempts(); } - + public void printSessionTrace() { if (!onlineClients.isEmpty()) { List> elist = new ArrayList<>(onlineClients.entrySet()); @@ -343,65 +342,65 @@ public class SessionCoordinator { .sorted(Integer::compareTo) .map(Object::toString) .collect(Collectors.joining(", ")); - + System.out.println("Current online clients: " + commaSeparatedClients); } - + if (!onlineRemoteHwids.isEmpty()) { List hwids = new ArrayList<>(onlineRemoteHwids); hwids.sort(Comparator.comparing(Hwid::hwid)); - + System.out.println("Current online HWIDs: "); for (Hwid s : hwids) { System.out.println(" " + s); } } - + if (!loginRemoteHosts.isEmpty()) { List> elist = new ArrayList<>(loginRemoteHosts.entrySet()); elist.sort(Entry.comparingByKey()); - + System.out.println("Current login sessions: "); for (Entry e : elist) { System.out.println(" " + e.getKey() + ", client: " + e.getValue()); } } } - + public void printSessionTrace(Client c) { String str = "Opened server sessions:\r\n\r\n"; - + if (!onlineClients.isEmpty()) { List> elist = new ArrayList<>(onlineClients.entrySet()); elist.sort(Entry.comparingByKey()); - + str += ("Current online clients:\r\n"); for (Entry e : elist) { str += (" " + e.getKey() + "\r\n"); } } - + if (!onlineRemoteHwids.isEmpty()) { List hwids = new ArrayList<>(onlineRemoteHwids); hwids.sort(Comparator.comparing(Hwid::hwid)); - + str += ("Current online HWIDs:\r\n"); for (Hwid s : hwids) { str += (" " + s + "\r\n"); } } - + if (!loginRemoteHosts.isEmpty()) { List> elist = new ArrayList<>(loginRemoteHosts.entrySet()); - + elist.sort((e1, e2) -> e1.getKey().compareTo(e2.getKey())); - + str += ("Current login sessions:\r\n"); for (Entry e : elist) { str += (" " + e.getKey() + ", IP: " + e.getValue().getRemoteAddress() + "\r\n"); } } - + c.getAbstractPlayerInteraction().npcTalk(2140000, str); } } diff --git a/src/main/java/net/server/guild/Guild.java b/src/main/java/net/server/guild/Guild.java index 703b7674ed..7cd99383d6 100644 --- a/src/main/java/net/server/guild/Guild.java +++ b/src/main/java/net/server/guild/Guild.java @@ -53,11 +53,11 @@ public class Guild { private final List members; private final Lock membersLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.GUILD, true); - private String[] rankTitles = new String[5]; // 1 = master, 2 = jr, 5 = lowest member + private final String[] rankTitles = new String[5]; // 1 = master, 2 = jr, 5 = lowest member private String name, notice; private int id, gp, logo, logoColor, leader, capacity, logoBG, logoBGColor, signature, allianceId; - private int world; - private Map> notifications = new LinkedHashMap<>(); + private final int world; + private final Map> notifications = new LinkedHashMap<>(); private boolean bDirty = true; public Guild(int guildid, int world) { diff --git a/src/main/java/net/server/handlers/CustomPacketHandler.java b/src/main/java/net/server/handlers/CustomPacketHandler.java index fd08140b27..fe6bf3764e 100644 --- a/src/main/java/net/server/handlers/CustomPacketHandler.java +++ b/src/main/java/net/server/handlers/CustomPacketHandler.java @@ -30,7 +30,7 @@ public class CustomPacketHandler implements PacketHandler { @Override public void handlePacket(InPacket p, Client c) { if (p.available() > 0 && c.getGMLevel() == 4) {//w/e - c.sendPacket(PacketCreator.customPacket(p.readBytes((int) p.available()))); + c.sendPacket(PacketCreator.customPacket(p.readBytes(p.available()))); } } diff --git a/src/main/java/net/server/handlers/LoginRequiringNoOpHandler.java b/src/main/java/net/server/handlers/LoginRequiringNoOpHandler.java index 400cbe4646..75ccc2b5bd 100644 --- a/src/main/java/net/server/handlers/LoginRequiringNoOpHandler.java +++ b/src/main/java/net/server/handlers/LoginRequiringNoOpHandler.java @@ -26,7 +26,7 @@ import net.PacketHandler; import net.packet.InPacket; public final class LoginRequiringNoOpHandler implements PacketHandler { - private static LoginRequiringNoOpHandler instance = new LoginRequiringNoOpHandler(); + private static final LoginRequiringNoOpHandler instance = new LoginRequiringNoOpHandler(); public static LoginRequiringNoOpHandler getInstance() { return instance; diff --git a/src/main/java/net/server/handlers/login/AcceptToSHandler.java b/src/main/java/net/server/handlers/login/AcceptToSHandler.java index 75255f8edc..4f44319da3 100644 --- a/src/main/java/net/server/handlers/login/AcceptToSHandler.java +++ b/src/main/java/net/server/handlers/login/AcceptToSHandler.java @@ -6,7 +6,6 @@ import net.packet.InPacket; import tools.PacketCreator; /** - * * @author kevintjuh93 */ public final class AcceptToSHandler extends AbstractPacketHandler { diff --git a/src/main/java/net/server/handlers/login/CharSelectedHandler.java b/src/main/java/net/server/handlers/login/CharSelectedHandler.java index 69f3c89a8b..9654531cd3 100644 --- a/src/main/java/net/server/handlers/login/CharSelectedHandler.java +++ b/src/main/java/net/server/handlers/login/CharSelectedHandler.java @@ -38,7 +38,7 @@ import java.net.UnknownHostException; public final class CharSelectedHandler extends AbstractPacketHandler { private static final Logger log = LoggerFactory.getLogger(CharSelectedHandler.class); - + private static int parseAntiMulticlientError(AntiMulticlientResult res) { return switch (res) { case REMOTE_PROCESSING -> 10; @@ -48,11 +48,11 @@ public final class CharSelectedHandler extends AbstractPacketHandler { default -> 9; }; } - + @Override public final void handlePacket(InPacket p, Client c) { int charId = p.readInt(); - + String macs = p.readString(); String hostString = p.readString(); @@ -64,7 +64,7 @@ public final class CharSelectedHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.getAfterLoginError(17)); return; } - + c.updateMacs(macs); c.updateHwid(hwid); @@ -73,34 +73,34 @@ public final class CharSelectedHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.getAfterLoginError(parseAntiMulticlientError(res))); return; } - + if (c.hasBannedMac() || c.hasBannedHWID()) { SessionCoordinator.getInstance().closeSession(c, true); return; } Server server = Server.getInstance(); - if(!server.haveCharacterEntry(c.getAccID(), charId)) { + if (!server.haveCharacterEntry(c.getAccID(), charId)) { SessionCoordinator.getInstance().closeSession(c, true); return; } - + c.setWorld(server.getCharacterWorld(charId)); World wserv = c.getWorldServer(); - if(wserv == null || wserv.isWorldCapacityFull()) { + if (wserv == null || wserv.isWorldCapacityFull()) { c.sendPacket(PacketCreator.getAfterLoginError(10)); return; } - + String[] socket = server.getInetSocket(c, c.getWorld(), c.getChannel()); - if(socket == null) { + if (socket == null) { c.sendPacket(PacketCreator.getAfterLoginError(10)); return; } - + server.unregisterLoginState(c); c.setCharacterOnSessionTransitionState(charId); - + try { c.sendPacket(PacketCreator.getServerIP(InetAddress.getByName(socket[0]), Integer.parseInt(socket[1]), charId)); } catch (UnknownHostException | NumberFormatException e) { diff --git a/src/main/java/net/server/handlers/login/CharSelectedWithPicHandler.java b/src/main/java/net/server/handlers/login/CharSelectedWithPicHandler.java index af8a397f1e..11c1a9f0ad 100644 --- a/src/main/java/net/server/handlers/login/CharSelectedWithPicHandler.java +++ b/src/main/java/net/server/handlers/login/CharSelectedWithPicHandler.java @@ -27,12 +27,12 @@ public class CharSelectedWithPicHandler extends AbstractPacketHandler { default -> 9; }; } - + @Override public void handlePacket(InPacket p, Client c) { String pic = p.readString(); int charId = p.readInt(); - + String macs = p.readString(); String hostString = p.readString(); @@ -44,7 +44,7 @@ public class CharSelectedWithPicHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.getAfterLoginError(17)); return; } - + c.updateMacs(macs); c.updateHwid(hwid); @@ -52,36 +52,36 @@ public class CharSelectedWithPicHandler extends AbstractPacketHandler { SessionCoordinator.getInstance().closeSession(c, true); return; } - + Server server = Server.getInstance(); - if(!server.haveCharacterEntry(c.getAccID(), charId)) { + if (!server.haveCharacterEntry(c.getAccID(), charId)) { SessionCoordinator.getInstance().closeSession(c, true); return; } - + if (c.checkPic(pic)) { c.setWorld(server.getCharacterWorld(charId)); World wserv = c.getWorldServer(); - if(wserv == null || wserv.isWorldCapacityFull()) { + if (wserv == null || wserv.isWorldCapacityFull()) { c.sendPacket(PacketCreator.getAfterLoginError(10)); return; } - + String[] socket = server.getInetSocket(c, c.getWorld(), c.getChannel()); - if(socket == null) { + if (socket == null) { c.sendPacket(PacketCreator.getAfterLoginError(10)); return; } - + AntiMulticlientResult res = SessionCoordinator.getInstance().attemptGameSession(c, c.getAccID(), hwid); if (res != AntiMulticlientResult.SUCCESS) { c.sendPacket(PacketCreator.getAfterLoginError(parseAntiMulticlientError(res))); return; } - + server.unregisterLoginState(c); c.setCharacterOnSessionTransitionState(charId); - + try { c.sendPacket(PacketCreator.getServerIP(InetAddress.getByName(socket[0]), Integer.parseInt(socket[1]), charId)); } catch (UnknownHostException | NumberFormatException e) { diff --git a/src/main/java/net/server/handlers/login/CharlistRequestHandler.java b/src/main/java/net/server/handlers/login/CharlistRequestHandler.java index bf5529a87a..0ca780dc50 100644 --- a/src/main/java/net/server/handlers/login/CharlistRequestHandler.java +++ b/src/main/java/net/server/handlers/login/CharlistRequestHandler.java @@ -35,20 +35,20 @@ public final class CharlistRequestHandler extends AbstractPacketHandler { public final void handlePacket(InPacket p, Client c) { p.readByte(); int world = p.readByte(); - + World wserv = Server.getInstance().getWorld(world); - if(wserv == null || wserv.isWorldCapacityFull()) { + if (wserv == null || wserv.isWorldCapacityFull()) { c.sendPacket(PacketCreator.getServerStatus(2)); return; } - + int channel = p.readByte() + 1; Channel ch = wserv.getChannel(channel); - if(ch == null) { + if (ch == null) { c.sendPacket(PacketCreator.getServerStatus(2)); return; } - + c.setWorld(world); c.setChannel(channel); c.sendCharList(world); diff --git a/src/main/java/net/server/handlers/login/CreateCharHandler.java b/src/main/java/net/server/handlers/login/CreateCharHandler.java index a2d3ba220b..e79a78bd89 100644 --- a/src/main/java/net/server/handlers/login/CreateCharHandler.java +++ b/src/main/java/net/server/handlers/login/CreateCharHandler.java @@ -35,61 +35,60 @@ import java.util.HashSet; import java.util.Set; public final class CreateCharHandler extends AbstractPacketHandler { - - private final static Set IDs = new HashSet<>(Arrays.asList(new Integer[]{ - 1302000, 1312004, 1322005, 1442079,// weapons - 1040002, 1040006, 1040010, 1041002, 1041006, 1041010, 1041011, 1042167,// bottom - 1060002, 1060006, 1061002, 1061008, 1062115, // top - 1072001, 1072005, 1072037, 1072038, 1072383,// shoes - 30000, 30010,30020, 30030, 31000, 31040, 31050,// hair - 20000, 20001, 20002, 21000, 21001, 21002, 21201, 20401, 20402, 21700, 20100 //face - //#NeverTrustStevenCode - })); - private static boolean isLegal(Integer toCompare) { - return IDs.contains(toCompare); - } + private final static Set IDs = new HashSet<>(Arrays.asList(1302000, 1312004, 1322005, 1442079,// weapons + 1040002, 1040006, 1040010, 1041002, 1041006, 1041010, 1041011, 1042167,// bottom + 1060002, 1060006, 1061002, 1061008, 1062115, // top + 1072001, 1072005, 1072037, 1072038, 1072383,// shoes + 30000, 30010, 30020, 30030, 31000, 31040, 31050,// hair + 20000, 20001, 20002, 21000, 21001, 21002, 21201, 20401, 20402, 21700, 20100 //face + //#NeverTrustStevenCode + )); + + private static boolean isLegal(Integer toCompare) { + return IDs.contains(toCompare); + } - @Override - public final void handlePacket(InPacket p, Client c) { - String name = p.readString(); - int job = p.readInt(); - int face = p.readInt(); + @Override + public final void handlePacket(InPacket p, Client c) { + String name = p.readString(); + int job = p.readInt(); + int face = p.readInt(); - int hair = p.readInt(); - int haircolor = p.readInt(); - int skincolor = p.readInt(); + int hair = p.readInt(); + int haircolor = p.readInt(); + int skincolor = p.readInt(); - int top = p.readInt(); - int bottom = p.readInt(); - int shoes = p.readInt(); - int weapon = p.readInt(); - int gender = p.readByte(); - - int [] items = new int [] {weapon, top, bottom, shoes, hair, face}; - for (int item : items) { - if (!isLegal(item)) { - FilePrinter.printError(FilePrinter.EXPLOITS + name + ".txt", "Owner from account '" + c.getAccountName() + "' tried to packet edit in char creation."); - c.disconnect(true, false); - return; - } - } - - int status; - if (job == 0) { // Knights of Cygnus - status = NoblesseCreator.createCharacter(c, name, face, hair + haircolor, skincolor, top, bottom, shoes, weapon, gender); - } else if (job == 1) { // Adventurer - status = BeginnerCreator.createCharacter(c, name, face, hair + haircolor, skincolor, top, bottom, shoes, weapon, gender); - } else if (job == 2) { // Aran - status = LegendCreator.createCharacter(c, name, face, hair + haircolor, skincolor, top, bottom, shoes, weapon, gender); - } else { - c.sendPacket(PacketCreator.deleteCharResponse(0, 9)); - return; - } - - if (status == -2) { - c.sendPacket(PacketCreator.deleteCharResponse(0, 9)); - } - } + int top = p.readInt(); + int bottom = p.readInt(); + int shoes = p.readInt(); + int weapon = p.readInt(); + int gender = p.readByte(); + + int[] items = new int[]{weapon, top, bottom, shoes, hair, face}; + for (int item : items) { + if (!isLegal(item)) { + FilePrinter.printError(FilePrinter.EXPLOITS + name + ".txt", "Owner from account '" + c.getAccountName() + "' tried to packet edit in char creation."); + c.disconnect(true, false); + return; + } + } + + int status; + if (job == 0) { // Knights of Cygnus + status = NoblesseCreator.createCharacter(c, name, face, hair + haircolor, skincolor, top, bottom, shoes, weapon, gender); + } else if (job == 1) { // Adventurer + status = BeginnerCreator.createCharacter(c, name, face, hair + haircolor, skincolor, top, bottom, shoes, weapon, gender); + } else if (job == 2) { // Aran + status = LegendCreator.createCharacter(c, name, face, hair + haircolor, skincolor, top, bottom, shoes, weapon, gender); + } else { + c.sendPacket(PacketCreator.deleteCharResponse(0, 9)); + return; + } + + if (status == -2) { + c.sendPacket(PacketCreator.deleteCharResponse(0, 9)); + } + } } \ No newline at end of file diff --git a/src/main/java/net/server/handlers/login/DeleteCharHandler.java b/src/main/java/net/server/handlers/login/DeleteCharHandler.java index b751ba023f..a12c6db34b 100644 --- a/src/main/java/net/server/handlers/login/DeleteCharHandler.java +++ b/src/main/java/net/server/handlers/login/DeleteCharHandler.java @@ -39,56 +39,56 @@ public final class DeleteCharHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { - String pic = p.readString(); - int cid = p.readInt(); - if (c.checkPic(pic)) { - //check for family, guild leader, pending marriage, world transfer - try (Connection con = DatabaseConnection.getConnection(); - PreparedStatement ps = con.prepareStatement("SELECT `world`, `guildid`, `guildrank`, `familyId` FROM characters WHERE id = ?"); - PreparedStatement ps2 = con.prepareStatement("SELECT COUNT(*) as rowcount FROM worldtransfers WHERE `characterid` = ? AND completionTime IS NULL")) { - ps.setInt(1, cid); + String pic = p.readString(); + int cid = p.readInt(); + if (c.checkPic(pic)) { + //check for family, guild leader, pending marriage, world transfer + try (Connection con = DatabaseConnection.getConnection(); + PreparedStatement ps = con.prepareStatement("SELECT `world`, `guildid`, `guildrank`, `familyId` FROM characters WHERE id = ?"); + PreparedStatement ps2 = con.prepareStatement("SELECT COUNT(*) as rowcount FROM worldtransfers WHERE `characterid` = ? AND completionTime IS NULL")) { + ps.setInt(1, cid); - try (ResultSet rs = ps.executeQuery()) { - if (!rs.next()) { - throw new SQLException("Character record does not exist."); - } - int world = rs.getInt("world"); - int guildId = rs.getInt("guildid"); - int guildRank = rs.getInt("guildrank"); - int familyId = rs.getInt("familyId"); - if (guildId != 0 && guildRank <= 1) { - c.sendPacket(PacketCreator.deleteCharResponse(cid, 0x16)); - return; - } else if (familyId != -1) { - Family family = Server.getInstance().getWorld(world).getFamily(familyId); - if (family != null && family.getTotalMembers() > 1) { - c.sendPacket(PacketCreator.deleteCharResponse(cid, 0x1D)); - return; - } - } - } + try (ResultSet rs = ps.executeQuery()) { + if (!rs.next()) { + throw new SQLException("Character record does not exist."); + } + int world = rs.getInt("world"); + int guildId = rs.getInt("guildid"); + int guildRank = rs.getInt("guildrank"); + int familyId = rs.getInt("familyId"); + if (guildId != 0 && guildRank <= 1) { + c.sendPacket(PacketCreator.deleteCharResponse(cid, 0x16)); + return; + } else if (familyId != -1) { + Family family = Server.getInstance().getWorld(world).getFamily(familyId); + if (family != null && family.getTotalMembers() > 1) { + c.sendPacket(PacketCreator.deleteCharResponse(cid, 0x1D)); + return; + } + } + } - ps2.setInt(1, cid); - try (ResultSet rs = ps2.executeQuery()) { - rs.next(); - if (rs.getInt("rowcount") > 0) { - c.sendPacket(PacketCreator.deleteCharResponse(cid, 0x1A)); - return; - } - } - } catch (SQLException e) { - e.printStackTrace(); - c.sendPacket(PacketCreator.deleteCharResponse(cid, 0x09)); - return; - } - if (c.deleteCharacter(cid, c.getAccID())) { - FilePrinter.print(FilePrinter.DELETED_CHAR + c.getAccountName() + ".txt", c.getAccountName() + " deleted CID: " + cid); - c.sendPacket(PacketCreator.deleteCharResponse(cid, 0)); - } else { - c.sendPacket(PacketCreator.deleteCharResponse(cid, 0x09)); - } - } else { - c.sendPacket(PacketCreator.deleteCharResponse(cid, 0x14)); - } - } + ps2.setInt(1, cid); + try (ResultSet rs = ps2.executeQuery()) { + rs.next(); + if (rs.getInt("rowcount") > 0) { + c.sendPacket(PacketCreator.deleteCharResponse(cid, 0x1A)); + return; + } + } + } catch (SQLException e) { + e.printStackTrace(); + c.sendPacket(PacketCreator.deleteCharResponse(cid, 0x09)); + return; + } + if (c.deleteCharacter(cid, c.getAccID())) { + FilePrinter.print(FilePrinter.DELETED_CHAR + c.getAccountName() + ".txt", c.getAccountName() + " deleted CID: " + cid); + c.sendPacket(PacketCreator.deleteCharResponse(cid, 0)); + } else { + c.sendPacket(PacketCreator.deleteCharResponse(cid, 0x09)); + } + } else { + c.sendPacket(PacketCreator.deleteCharResponse(cid, 0x14)); + } + } } diff --git a/src/main/java/net/server/handlers/login/RegisterPicHandler.java b/src/main/java/net/server/handlers/login/RegisterPicHandler.java index 0ea4c4ea71..031361def6 100644 --- a/src/main/java/net/server/handlers/login/RegisterPicHandler.java +++ b/src/main/java/net/server/handlers/login/RegisterPicHandler.java @@ -27,12 +27,12 @@ public final class RegisterPicHandler extends AbstractPacketHandler { default -> 9; }; } - + @Override public final void handlePacket(InPacket p, Client c) { p.readByte(); int charId = p.readInt(); - + String macs = p.readString(); String hostString = p.readString(); @@ -44,47 +44,47 @@ public final class RegisterPicHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.getAfterLoginError(17)); return; } - + c.updateMacs(macs); c.updateHwid(hwid); - + AntiMulticlientResult res = SessionCoordinator.getInstance().attemptGameSession(c, c.getAccID(), hwid); if (res != AntiMulticlientResult.SUCCESS) { c.sendPacket(PacketCreator.getAfterLoginError(parseAntiMulticlientError(res))); return; } - + if (c.hasBannedMac() || c.hasBannedHWID()) { SessionCoordinator.getInstance().closeSession(c, true); return; } - + Server server = Server.getInstance(); - if(!server.haveCharacterEntry(c.getAccID(), charId)) { + if (!server.haveCharacterEntry(c.getAccID(), charId)) { SessionCoordinator.getInstance().closeSession(c, true); return; } - + String pic = p.readString(); if (c.getPic() == null || c.getPic().equals("")) { c.setPic(pic); - + c.setWorld(server.getCharacterWorld(charId)); World wserv = c.getWorldServer(); - if(wserv == null || wserv.isWorldCapacityFull()) { + if (wserv == null || wserv.isWorldCapacityFull()) { c.sendPacket(PacketCreator.getAfterLoginError(10)); return; } - + String[] socket = server.getInetSocket(c, c.getWorld(), c.getChannel()); - if(socket == null) { + if (socket == null) { c.sendPacket(PacketCreator.getAfterLoginError(10)); return; } - + server.unregisterLoginState(c); c.setCharacterOnSessionTransitionState(charId); - + try { c.sendPacket(PacketCreator.getServerIP(InetAddress.getByName(socket[0]), Integer.parseInt(socket[1]), charId)); } catch (UnknownHostException e) { diff --git a/src/main/java/net/server/handlers/login/RegisterPinHandler.java b/src/main/java/net/server/handlers/login/RegisterPinHandler.java index effa36669e..db73ea9327 100644 --- a/src/main/java/net/server/handlers/login/RegisterPinHandler.java +++ b/src/main/java/net/server/handlers/login/RegisterPinHandler.java @@ -42,7 +42,7 @@ public final class RegisterPinHandler extends AbstractPacketHandler { if (pin != null) { c.setPin(pin); c.sendPacket(PacketCreator.pinRegistered()); - + SessionCoordinator.getInstance().closeSession(c, null); c.updateLoginState(Client.LOGIN_NOTLOGGEDIN); } diff --git a/src/main/java/net/server/handlers/login/ServerStatusRequestHandler.java b/src/main/java/net/server/handlers/login/ServerStatusRequestHandler.java index e3cadbe973..154db4fd45 100644 --- a/src/main/java/net/server/handlers/login/ServerStatusRequestHandler.java +++ b/src/main/java/net/server/handlers/login/ServerStatusRequestHandler.java @@ -34,7 +34,7 @@ public final class ServerStatusRequestHandler extends AbstractPacketHandler { public final void handlePacket(InPacket p, Client c) { byte world = (byte) p.readShort(); World wserv = Server.getInstance().getWorld(world); - if(wserv != null) { + if (wserv != null) { int status = wserv.getWorldCapacityStatus(); c.sendPacket(PacketCreator.getServerStatus(status)); } else { diff --git a/src/main/java/net/server/handlers/login/ServerlistRequestHandler.java b/src/main/java/net/server/handlers/login/ServerlistRequestHandler.java index e09318941c..a4ddf909f6 100644 --- a/src/main/java/net/server/handlers/login/ServerlistRequestHandler.java +++ b/src/main/java/net/server/handlers/login/ServerlistRequestHandler.java @@ -35,10 +35,10 @@ public final class ServerlistRequestHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { - Server server = Server.getInstance(); + Server server = Server.getInstance(); List worlds = server.getWorlds(); c.requestedServerlist(worlds.size()); - + for (World world : worlds) { c.sendPacket(PacketCreator.getServerList(world.getId(), GameConstants.WORLD_NAMES[world.getId()], world.getFlag(), world.getEventMessage(), world.getChannels())); } diff --git a/src/main/java/net/server/handlers/login/SetGenderHandler.java b/src/main/java/net/server/handlers/login/SetGenderHandler.java index d35337e2a3..40bc9c3f0b 100644 --- a/src/main/java/net/server/handlers/login/SetGenderHandler.java +++ b/src/main/java/net/server/handlers/login/SetGenderHandler.java @@ -30,7 +30,6 @@ import net.server.coordinator.session.SessionCoordinator; import tools.PacketCreator; /** - * * @author kevintjuh93 */ public class SetGenderHandler extends AbstractPacketHandler { diff --git a/src/main/java/net/server/handlers/login/ViewAllCharHandler.java b/src/main/java/net/server/handlers/login/ViewAllCharHandler.java index cc36002798..19d79f5632 100644 --- a/src/main/java/net/server/handlers/login/ViewAllCharHandler.java +++ b/src/main/java/net/server/handlers/login/ViewAllCharHandler.java @@ -36,34 +36,34 @@ public final class ViewAllCharHandler extends AbstractPacketHandler { @Override public final void handlePacket(InPacket p, Client c) { try { - if(!c.canRequestCharlist()) { // client breaks if the charlist request pops too soon + if (!c.canRequestCharlist()) { // client breaks if the charlist request pops too soon c.sendPacket(PacketCreator.showAllCharacter(0, 0)); return; } - + int accountId = c.getAccID(); Pair>, List>>> loginBlob = Server.getInstance().loadAccountCharlist(accountId, c.getVisibleWorlds()); - + List>> worldChars = loginBlob.getRight(); int chrTotal = loginBlob.getLeft().getLeft(); List lastwchars = loginBlob.getLeft().getRight(); - + if (chrTotal > 9) { int padRight = chrTotal % 3; if (padRight > 0 && lastwchars != null) { Character chr = lastwchars.get(lastwchars.size() - 1); - - for(int i = padRight; i < 3; i++) { // filling the remaining slots with the last character loaded + + for (int i = padRight; i < 3; i++) { // filling the remaining slots with the last character loaded chrTotal++; lastwchars.add(chr); } } } - + int charsSize = chrTotal; int unk = charsSize + (3 - charsSize % 3); //rowSize? c.sendPacket(PacketCreator.showAllCharacter(charsSize, unk)); - + for (Pair> wchars : worldChars) { c.sendPacket(PacketCreator.showAllCharacterInfo(wchars.getLeft(), wchars.getRight(), YamlConfig.config.server.ENABLE_PIC && !c.canBypassPic())); } diff --git a/src/main/java/net/server/handlers/login/ViewAllCharRegisterPicHandler.java b/src/main/java/net/server/handlers/login/ViewAllCharRegisterPicHandler.java index 73bf080295..0495db2ff0 100644 --- a/src/main/java/net/server/handlers/login/ViewAllCharRegisterPicHandler.java +++ b/src/main/java/net/server/handlers/login/ViewAllCharRegisterPicHandler.java @@ -28,13 +28,13 @@ public final class ViewAllCharRegisterPicHandler extends AbstractPacketHandler { default -> 9; }; } - + @Override public final void handlePacket(InPacket p, Client c) { p.readByte(); int charId = p.readInt(); p.readInt(); // please don't let the client choose which world they should login - + String mac = p.readString(); String hostString = p.readString(); @@ -46,10 +46,10 @@ public final class ViewAllCharRegisterPicHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.getAfterLoginError(17)); return; } - + c.updateMacs(mac); c.updateHwid(hwid); - + if (c.hasBannedMac() || c.hasBannedHWID()) { SessionCoordinator.getInstance().closeSession(c, true); return; @@ -60,35 +60,35 @@ public final class ViewAllCharRegisterPicHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.getAfterLoginError(parseAntiMulticlientError(res))); return; } - + Server server = Server.getInstance(); - if(!server.haveCharacterEntry(c.getAccID(), charId)) { + if (!server.haveCharacterEntry(c.getAccID(), charId)) { SessionCoordinator.getInstance().closeSession(c, true); return; } - + c.setWorld(server.getCharacterWorld(charId)); World wserv = c.getWorldServer(); - if(wserv == null || wserv.isWorldCapacityFull()) { + if (wserv == null || wserv.isWorldCapacityFull()) { c.sendPacket(PacketCreator.getAfterLoginError(10)); return; } - + int channel = Randomizer.rand(1, server.getWorld(c.getWorld()).getChannelsSize()); c.setChannel(channel); - + String pic = p.readString(); c.setPic(pic); - + String[] socket = server.getInetSocket(c, c.getWorld(), channel); if (socket == null) { c.sendPacket(PacketCreator.getAfterLoginError(10)); return; } - + server.unregisterLoginState(c); c.setCharacterOnSessionTransitionState(charId); - + try { c.sendPacket(PacketCreator.getServerIP(InetAddress.getByName(socket[0]), Integer.parseInt(socket[1]), charId)); } catch (UnknownHostException e) { diff --git a/src/main/java/net/server/handlers/login/ViewAllCharSelectedHandler.java b/src/main/java/net/server/handlers/login/ViewAllCharSelectedHandler.java index 45dae4a54a..3dc0ba8f58 100644 --- a/src/main/java/net/server/handlers/login/ViewAllCharSelectedHandler.java +++ b/src/main/java/net/server/handlers/login/ViewAllCharSelectedHandler.java @@ -49,12 +49,12 @@ public final class ViewAllCharSelectedHandler extends AbstractPacketHandler { default -> 9; }; } - + @Override public final void handlePacket(InPacket p, Client c) { int charId = p.readInt(); p.readInt(); // please don't let the client choose which world they should login - + String macs = p.readString(); String hostString = p.readString(); @@ -66,10 +66,10 @@ public final class ViewAllCharSelectedHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.getAfterLoginError(17)); return; } - + c.updateMacs(macs); c.updateHwid(hwid); - + if (c.hasBannedMac() || c.hasBannedHWID()) { SessionCoordinator.getInstance().closeSession(c, true); return; @@ -80,21 +80,21 @@ public final class ViewAllCharSelectedHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.getAfterLoginError(parseAntiMulticlientError(res))); return; } - + Server server = Server.getInstance(); - if(!server.haveCharacterEntry(c.getAccID(), charId)) { + if (!server.haveCharacterEntry(c.getAccID(), charId)) { SessionCoordinator.getInstance().closeSession(c, true); return; } - + c.setWorld(server.getCharacterWorld(charId)); - + World wserv = c.getWorldServer(); - if(wserv == null || wserv.isWorldCapacityFull()) { + if (wserv == null || wserv.isWorldCapacityFull()) { c.sendPacket(PacketCreator.getAfterLoginError(10)); return; } - + try { int channel = Randomizer.rand(1, wserv.getChannelsSize()); c.setChannel(channel); @@ -102,16 +102,16 @@ public final class ViewAllCharSelectedHandler extends AbstractPacketHandler { e.printStackTrace(); c.setChannel(1); } - + String[] socket = server.getInetSocket(c, c.getWorld(), c.getChannel()); - if(socket == null) { + if (socket == null) { c.sendPacket(PacketCreator.getAfterLoginError(10)); return; } - + server.unregisterLoginState(c); c.setCharacterOnSessionTransitionState(charId); - + try { c.sendPacket(PacketCreator.getServerIP(InetAddress.getByName(socket[0]), Integer.parseInt(socket[1]), charId)); } catch (UnknownHostException e) { diff --git a/src/main/java/net/server/handlers/login/ViewAllCharSelectedWithPicHandler.java b/src/main/java/net/server/handlers/login/ViewAllCharSelectedWithPicHandler.java index ae81c0750f..c5fb6b4600 100644 --- a/src/main/java/net/server/handlers/login/ViewAllCharSelectedWithPicHandler.java +++ b/src/main/java/net/server/handlers/login/ViewAllCharSelectedWithPicHandler.java @@ -28,14 +28,14 @@ public class ViewAllCharSelectedWithPicHandler extends AbstractPacketHandler { default -> 9; }; } - + @Override public void handlePacket(InPacket p, Client c) { String pic = p.readString(); int charId = p.readInt(); p.readInt(); // please don't let the client choose which world they should login - + String macs = p.readString(); String hostString = p.readString(); @@ -47,47 +47,47 @@ public class ViewAllCharSelectedWithPicHandler extends AbstractPacketHandler { c.sendPacket(PacketCreator.getAfterLoginError(17)); return; } - + c.updateMacs(macs); c.updateHwid(hwid); - + if (c.hasBannedMac() || c.hasBannedHWID()) { SessionCoordinator.getInstance().closeSession(c, true); return; } Server server = Server.getInstance(); - if(!server.haveCharacterEntry(c.getAccID(), charId)) { + if (!server.haveCharacterEntry(c.getAccID(), charId)) { SessionCoordinator.getInstance().closeSession(c, true); return; } - + c.setWorld(server.getCharacterWorld(charId)); World wserv = c.getWorldServer(); - if(wserv == null || wserv.isWorldCapacityFull()) { + if (wserv == null || wserv.isWorldCapacityFull()) { c.sendPacket(PacketCreator.getAfterLoginError(10)); return; } - + int channel = Randomizer.rand(1, wserv.getChannelsSize()); c.setChannel(channel); - + if (c.checkPic(pic)) { String[] socket = server.getInetSocket(c, c.getWorld(), c.getChannel()); - if(socket == null) { + if (socket == null) { c.sendPacket(PacketCreator.getAfterLoginError(10)); return; } - + AntiMulticlientResult res = SessionCoordinator.getInstance().attemptGameSession(c, c.getAccID(), hwid); if (res != AntiMulticlientResult.SUCCESS) { c.sendPacket(PacketCreator.getAfterLoginError(parseAntiMulticlientError(res))); return; } - + server.unregisterLoginState(c); c.setCharacterOnSessionTransitionState(charId); - + try { c.sendPacket(PacketCreator.getServerIP(InetAddress.getByName(socket[0]), Integer.parseInt(socket[1]), charId)); } catch (UnknownHostException e) { diff --git a/src/main/java/net/server/services/BaseScheduler.java b/src/main/java/net/server/services/BaseScheduler.java index 2a48bd36a8..6d15e0fb16 100644 --- a/src/main/java/net/server/services/BaseScheduler.java +++ b/src/main/java/net/server/services/BaseScheduler.java @@ -33,166 +33,165 @@ import java.util.Map.Entry; import java.util.concurrent.ScheduledFuture; /** - * * @author Ronan */ public abstract class BaseScheduler { private int idleProcs = 0; - private List listeners = new LinkedList<>(); + private final List listeners = new LinkedList<>(); private final List externalLocks = new LinkedList<>(); - private Map> registeredEntries = new HashMap<>(); - + private final Map> registeredEntries = new HashMap<>(); + private ScheduledFuture schedulerTask = null; private MonitoredReentrantLock schedulerLock; - private Runnable monitorTask = () -> runBaseSchedule(); - + private final Runnable monitorTask = () -> runBaseSchedule(); + protected BaseScheduler(MonitoredLockType lockType) { schedulerLock = MonitoredReentrantLockFactory.createLock(lockType, true); } - + // NOTE: practice EXTREME caution when adding external locks to the scheduler system, if you don't know what you're doing DON'T USE THIS. protected BaseScheduler(MonitoredLockType lockType, List extLocks) { schedulerLock = MonitoredReentrantLockFactory.createLock(lockType, true); externalLocks.addAll(extLocks); } - + protected void addListener(SchedulerListener listener) { listeners.add(listener); } - + private void lockScheduler() { - if(!externalLocks.isEmpty()) { - for(MonitoredReentrantLock l : externalLocks) { + if (!externalLocks.isEmpty()) { + for (MonitoredReentrantLock l : externalLocks) { l.lock(); } } - + schedulerLock.lock(); } - + private void unlockScheduler() { - if(!externalLocks.isEmpty()) { - for(MonitoredReentrantLock l : externalLocks) { + if (!externalLocks.isEmpty()) { + for (MonitoredReentrantLock l : externalLocks) { l.unlock(); } } - + schedulerLock.unlock(); } - + private void runBaseSchedule() { List toRemove; Map> registeredEntriesCopy; - + lockScheduler(); try { - if(registeredEntries.isEmpty()) { + if (registeredEntries.isEmpty()) { idleProcs++; - - if(idleProcs >= YamlConfig.config.server.MOB_STATUS_MONITOR_LIFE) { - if(schedulerTask != null) { + + if (idleProcs >= YamlConfig.config.server.MOB_STATUS_MONITOR_LIFE) { + if (schedulerTask != null) { schedulerTask.cancel(false); schedulerTask = null; } } - + return; } - + idleProcs = 0; registeredEntriesCopy = new HashMap<>(registeredEntries); } finally { unlockScheduler(); } - + long timeNow = Server.getInstance().getCurrentTime(); toRemove = new LinkedList<>(); - for(Entry> rmd : registeredEntriesCopy.entrySet()) { + for (Entry> rmd : registeredEntriesCopy.entrySet()) { Pair r = rmd.getValue(); - if(r.getRight() < timeNow) { + if (r.getRight() < timeNow) { r.getLeft().run(); // runs the scheduled action toRemove.add(rmd.getKey()); } } - - if(!toRemove.isEmpty()) { + + if (!toRemove.isEmpty()) { lockScheduler(); try { - for(Object o : toRemove) { + for (Object o : toRemove) { registeredEntries.remove(o); } } finally { unlockScheduler(); } } - + dispatchRemovedEntries(toRemove, true); } - + protected void registerEntry(Object key, Runnable removalAction, long duration) { lockScheduler(); try { idleProcs = 0; - if(schedulerTask == null) { + if (schedulerTask == null) { schedulerTask = TimerManager.getInstance().register(monitorTask, YamlConfig.config.server.MOB_STATUS_MONITOR_PROC, YamlConfig.config.server.MOB_STATUS_MONITOR_PROC); } - + registeredEntries.put(key, new Pair<>(removalAction, Server.getInstance().getCurrentTime() + duration)); } finally { unlockScheduler(); } } - + protected void interruptEntry(Object key) { Runnable toRun = null; - + lockScheduler(); try { Pair rm = registeredEntries.remove(key); - if(rm != null) { + if (rm != null) { toRun = rm.getLeft(); } } finally { unlockScheduler(); } - - if(toRun != null) { + + if (toRun != null) { toRun.run(); } - + dispatchRemovedEntries(Collections.singletonList(key), false); } - + private void dispatchRemovedEntries(List toRemove, boolean fromUpdate) { for (SchedulerListener listener : listeners.toArray(new SchedulerListener[listeners.size()])) { listener.removedScheduledEntries(toRemove, fromUpdate); } } - + public void dispose() { lockScheduler(); try { - if(schedulerTask != null) { + if (schedulerTask != null) { schedulerTask.cancel(false); schedulerTask = null; } - + listeners.clear(); registeredEntries.clear(); } finally { unlockScheduler(); externalLocks.clear(); } - + disposeLocks(); } - + private void disposeLocks() { LockCollector.getInstance().registerDisposeAction(() -> emptyLocks()); } - + private void emptyLocks() { schedulerLock = schedulerLock.dispose(); } diff --git a/src/main/java/net/server/services/BaseService.java b/src/main/java/net/server/services/BaseService.java index 4a6a95da62..bd7f55f919 100644 --- a/src/main/java/net/server/services/BaseService.java +++ b/src/main/java/net/server/services/BaseService.java @@ -22,16 +22,15 @@ package net.server.services; import config.YamlConfig; /** - * * @author Ronan */ public abstract class BaseService { - + protected static int getChannelSchedulerIndex(int mapid) { int section = 1000000000 / YamlConfig.config.server.CHANNEL_LOCKS; return mapid / section; } - + public abstract void dispose(); - + } diff --git a/src/main/java/net/server/services/SchedulerListener.java b/src/main/java/net/server/services/SchedulerListener.java index 6a3f9c8b52..bf50d4a469 100644 --- a/src/main/java/net/server/services/SchedulerListener.java +++ b/src/main/java/net/server/services/SchedulerListener.java @@ -22,7 +22,6 @@ package net.server.services; import java.util.List; /** - * * @author Ronan */ public interface SchedulerListener { diff --git a/src/main/java/net/server/services/Service.java b/src/main/java/net/server/services/Service.java index 950279e913..defbdf1bfa 100644 --- a/src/main/java/net/server/services/Service.java +++ b/src/main/java/net/server/services/Service.java @@ -20,14 +20,13 @@ package net.server.services; /** - * * @author Ronan */ -public class Service { - +public class Service { + private Class cls; private BaseService service; - + public Service(Class s) { try { cls = s; @@ -36,15 +35,15 @@ public class Service { e.printStackTrace(); } } - + public T getService() { return cls.cast(service); } - + public void dispose() { service.dispose(); service = null; } - + } diff --git a/src/main/java/net/server/services/ServiceType.java b/src/main/java/net/server/services/ServiceType.java index 420c89e09e..08039bc34f 100644 --- a/src/main/java/net/server/services/ServiceType.java +++ b/src/main/java/net/server/services/ServiceType.java @@ -20,10 +20,9 @@ package net.server.services; /** - * * @author Ronan */ -public interface ServiceType > { +public interface ServiceType> { Service createService(); int ordinal(); T[] enumValues(); diff --git a/src/main/java/net/server/services/ServicesManager.java b/src/main/java/net/server/services/ServicesManager.java index 1ef1ab055c..9c46e9a416 100644 --- a/src/main/java/net/server/services/ServicesManager.java +++ b/src/main/java/net/server/services/ServicesManager.java @@ -20,31 +20,30 @@ package net.server.services; /** - * * @author Ronan */ public class ServicesManager { - + private Service[] services; - + public ServicesManager(ServiceType serviceBundle) { Enum[] serviceTypes = serviceBundle.enumValues(); - + services = new Service[serviceTypes.length]; for (Enum type : serviceTypes) { services[type.ordinal()] = ((ServiceType) type).createService(); } } - + public Service getAccess(ServiceType s) { return services[s.ordinal()]; } - + public void shutdown() { for (Service service : services) { service.dispose(); } services = null; } - + } diff --git a/src/main/java/net/server/services/task/channel/EventService.java b/src/main/java/net/server/services/task/channel/EventService.java index 51e3528d8f..5104486f0d 100644 --- a/src/main/java/net/server/services/task/channel/EventService.java +++ b/src/main/java/net/server/services/task/channel/EventService.java @@ -25,35 +25,34 @@ import net.server.services.BaseScheduler; import net.server.services.BaseService; /** - * * @author Ronan */ public class EventService extends BaseService { - - private EventScheduler[] eventSchedulers = new EventScheduler[YamlConfig.config.server.CHANNEL_LOCKS]; - + + private final EventScheduler[] eventSchedulers = new EventScheduler[YamlConfig.config.server.CHANNEL_LOCKS]; + public EventService() { - for(int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { + for (int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { eventSchedulers[i] = new EventScheduler(); } } - + @Override public void dispose() { - for(int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { - if(eventSchedulers[i] != null) { + for (int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { + if (eventSchedulers[i] != null) { eventSchedulers[i].dispose(); eventSchedulers[i] = null; } } } - + public void registerEventAction(int mapid, Runnable runAction, long delay) { eventSchedulers[getChannelSchedulerIndex(mapid)].registerDelayedAction(runAction, delay); } - + private class EventScheduler extends BaseScheduler { - + public EventScheduler() { super(MonitoredLockType.CHANNEL_EVENTS); } @@ -61,7 +60,7 @@ public class EventService extends BaseService { public void registerDelayedAction(Runnable runAction, long delay) { registerEntry(runAction, runAction, delay); } - + } - + } diff --git a/src/main/java/net/server/services/task/channel/FaceExpressionService.java b/src/main/java/net/server/services/task/channel/FaceExpressionService.java index 2313ebd3fe..98ea9c8261 100644 --- a/src/main/java/net/server/services/task/channel/FaceExpressionService.java +++ b/src/main/java/net/server/services/task/channel/FaceExpressionService.java @@ -33,69 +33,68 @@ import tools.PacketCreator; import java.util.Collections; /** - * * @author Ronan */ public class FaceExpressionService extends BaseService { - - private FaceExpressionScheduler[] faceExpressionSchedulers = new FaceExpressionScheduler[YamlConfig.config.server.CHANNEL_LOCKS]; - private MonitoredReentrantLock[] faceLock = new MonitoredReentrantLock[YamlConfig.config.server.CHANNEL_LOCKS]; - + + private final FaceExpressionScheduler[] faceExpressionSchedulers = new FaceExpressionScheduler[YamlConfig.config.server.CHANNEL_LOCKS]; + private final MonitoredReentrantLock[] faceLock = new MonitoredReentrantLock[YamlConfig.config.server.CHANNEL_LOCKS]; + public FaceExpressionService() { - for(int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { + for (int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { faceLock[i] = MonitoredReentrantLockFactory.createLock(MonitoredLockType.CHANNEL_FACEEXPRS, true); faceExpressionSchedulers[i] = new FaceExpressionScheduler(faceLock[i]); } } - + private void emptyLocks() { - for(int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { + for (int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { faceLock[i] = faceLock[i].dispose(); } } - + private void disposeLocks() { LockCollector.getInstance().registerDisposeAction(() -> emptyLocks()); } - + @Override public void dispose() { - for(int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { - if(faceExpressionSchedulers[i] != null) { + for (int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { + if (faceExpressionSchedulers[i] != null) { faceExpressionSchedulers[i].dispose(); faceExpressionSchedulers[i] = null; } } - + disposeLocks(); } - + public void registerFaceExpression(final MapleMap map, final Character chr, int emote) { int lockid = getChannelSchedulerIndex(map.getId()); - + Runnable cancelAction = () -> { - if(chr.isLoggedinWorld()) { + if (chr.isLoggedinWorld()) { map.broadcastMessage(chr, PacketCreator.facialExpression(chr, 0), false); } }; - + faceLock[lockid].lock(); try { - if(!chr.isLoggedinWorld()) { + if (!chr.isLoggedinWorld()) { return; } - + faceExpressionSchedulers[lockid].registerFaceExpression(chr.getId(), cancelAction); } finally { faceLock[lockid].unlock(); } - + map.broadcastMessage(chr, PacketCreator.facialExpression(chr, emote), false); } - + public void unregisterFaceExpression(int mapid, Character chr) { int lockid = getChannelSchedulerIndex(mapid); - + faceLock[lockid].lock(); try { faceExpressionSchedulers[lockid].unregisterFaceExpression(chr.getId()); @@ -103,9 +102,9 @@ public class FaceExpressionService extends BaseService { faceLock[lockid].unlock(); } } - + private class FaceExpressionScheduler extends BaseScheduler { - + public FaceExpressionScheduler(final MonitoredReentrantLock channelFaceLock) { super(MonitoredLockType.CHANNEL_FACESCHDL, Collections.singletonList(channelFaceLock)); } @@ -117,7 +116,7 @@ public class FaceExpressionService extends BaseService { public void unregisterFaceExpression(Integer characterId) { interruptEntry(characterId); } - + } - + } diff --git a/src/main/java/net/server/services/task/channel/MobAnimationService.java b/src/main/java/net/server/services/task/channel/MobAnimationService.java index b30cac8a7d..1eff4728c1 100644 --- a/src/main/java/net/server/services/task/channel/MobAnimationService.java +++ b/src/main/java/net/server/services/task/channel/MobAnimationService.java @@ -31,47 +31,47 @@ import java.util.HashSet; import java.util.Set; /** - * * @author Ronan */ public class MobAnimationService extends BaseService { - - private MobAnimationScheduler[] mobAnimationSchedulers = new MobAnimationScheduler[YamlConfig.config.server.CHANNEL_LOCKS]; - + + private final MobAnimationScheduler[] mobAnimationSchedulers = new MobAnimationScheduler[YamlConfig.config.server.CHANNEL_LOCKS]; + public MobAnimationService() { - for(int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { + for (int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { mobAnimationSchedulers[i] = new MobAnimationScheduler(); } } - + @Override public void dispose() { - for(int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { - if(mobAnimationSchedulers[i] != null) { + for (int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { + if (mobAnimationSchedulers[i] != null) { mobAnimationSchedulers[i].dispose(); mobAnimationSchedulers[i] = null; } } } - + public boolean registerMobOnAnimationEffect(int mapid, int mobHash, long delay) { return mobAnimationSchedulers[getChannelSchedulerIndex(mapid)].registerAnimationMode(mobHash, delay); } // do nothing - private static Runnable r = () -> {}; - + private static final Runnable r = () -> { + }; + private class MobAnimationScheduler extends BaseScheduler { Set onAnimationMobs = new HashSet<>(1000); private MonitoredReentrantLock animationLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.CHANNEL_MOBANIMAT, true); - + public MobAnimationScheduler() { super(MonitoredLockType.CHANNEL_MOBACTION); super.addListener((toRemove, update) -> { animationLock.lock(); try { - for(Object hashObj : toRemove) { + for (Object hashObj : toRemove) { Integer mobHash = (Integer) hashObj; onAnimationMobs.remove(mobHash); } @@ -84,7 +84,7 @@ public class MobAnimationService extends BaseService { public boolean registerAnimationMode(Integer mobHash, long animationTime) { animationLock.lock(); try { - if(onAnimationMobs.contains(mobHash)) { + if (onAnimationMobs.contains(mobHash)) { return false; } @@ -109,7 +109,7 @@ public class MobAnimationService extends BaseService { private void emptyLocks() { animationLock = animationLock.dispose(); } - + } - + } diff --git a/src/main/java/net/server/services/task/channel/MobClearSkillService.java b/src/main/java/net/server/services/task/channel/MobClearSkillService.java index a949484600..c06f1e447b 100644 --- a/src/main/java/net/server/services/task/channel/MobClearSkillService.java +++ b/src/main/java/net/server/services/task/channel/MobClearSkillService.java @@ -25,35 +25,34 @@ import net.server.services.BaseScheduler; import net.server.services.BaseService; /** - * * @author Ronan */ public class MobClearSkillService extends BaseService { - - private MobClearSkillScheduler[] mobClearSkillSchedulers = new MobClearSkillScheduler[YamlConfig.config.server.CHANNEL_LOCKS]; - + + private final MobClearSkillScheduler[] mobClearSkillSchedulers = new MobClearSkillScheduler[YamlConfig.config.server.CHANNEL_LOCKS]; + public MobClearSkillService() { - for(int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { + for (int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { mobClearSkillSchedulers[i] = new MobClearSkillScheduler(); } } - + @Override public void dispose() { - for(int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { - if(mobClearSkillSchedulers[i] != null) { + for (int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { + if (mobClearSkillSchedulers[i] != null) { mobClearSkillSchedulers[i].dispose(); mobClearSkillSchedulers[i] = null; } - } + } } - + public void registerMobClearSkillAction(int mapid, Runnable runAction, long delay) { mobClearSkillSchedulers[getChannelSchedulerIndex(mapid)].registerClearSkillAction(runAction, delay); } - + private class MobClearSkillScheduler extends BaseScheduler { - + public MobClearSkillScheduler() { super(MonitoredLockType.CHANNEL_MOBSKILL); } @@ -61,7 +60,7 @@ public class MobClearSkillService extends BaseService { public void registerClearSkillAction(Runnable runAction, long delay) { registerEntry(runAction, runAction, delay); } - + } - + } diff --git a/src/main/java/net/server/services/task/channel/MobMistService.java b/src/main/java/net/server/services/task/channel/MobMistService.java index 937e6b1076..f3de67899c 100644 --- a/src/main/java/net/server/services/task/channel/MobMistService.java +++ b/src/main/java/net/server/services/task/channel/MobMistService.java @@ -25,33 +25,32 @@ import net.server.services.BaseScheduler; import net.server.services.BaseService; /** - * * @author Ronan */ public class MobMistService extends BaseService { - - private MobMistScheduler[] mobMistSchedulers = new MobMistScheduler[YamlConfig.config.server.CHANNEL_LOCKS]; - + + private final MobMistScheduler[] mobMistSchedulers = new MobMistScheduler[YamlConfig.config.server.CHANNEL_LOCKS]; + public MobMistService() { - for(int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { + for (int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { mobMistSchedulers[i] = new MobMistScheduler(); } } - + @Override public void dispose() { - for(int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { - if(mobMistSchedulers[i] != null) { + for (int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { + if (mobMistSchedulers[i] != null) { mobMistSchedulers[i].dispose(); mobMistSchedulers[i] = null; } - } + } } - + public void registerMobMistCancelAction(int mapid, Runnable runAction, long delay) { mobMistSchedulers[getChannelSchedulerIndex(mapid)].registerMistCancelAction(runAction, delay); } - + private class MobMistScheduler extends BaseScheduler { public MobMistScheduler() { @@ -61,7 +60,7 @@ public class MobMistService extends BaseService { public void registerMistCancelAction(Runnable runAction, long delay) { registerEntry(runAction, runAction, delay); } - + } - + } diff --git a/src/main/java/net/server/services/task/channel/MobStatusService.java b/src/main/java/net/server/services/task/channel/MobStatusService.java index 4c656734b5..bdf9547901 100644 --- a/src/main/java/net/server/services/task/channel/MobStatusService.java +++ b/src/main/java/net/server/services/task/channel/MobStatusService.java @@ -34,60 +34,59 @@ import java.util.List; import java.util.Map; /** - * * @author Ronan */ public class MobStatusService extends BaseService { - - private MobStatusScheduler[] mobStatusSchedulers = new MobStatusScheduler[YamlConfig.config.server.CHANNEL_LOCKS]; - + + private final MobStatusScheduler[] mobStatusSchedulers = new MobStatusScheduler[YamlConfig.config.server.CHANNEL_LOCKS]; + public MobStatusService() { - for(int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { + for (int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { mobStatusSchedulers[i] = new MobStatusScheduler(); } } - + @Override public void dispose() { - for(int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { - if(mobStatusSchedulers[i] != null) { + for (int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { + if (mobStatusSchedulers[i] != null) { mobStatusSchedulers[i].dispose(); mobStatusSchedulers[i] = null; } } } - + public void registerMobStatus(int mapid, MonsterStatusEffect mse, Runnable cancelAction, long duration) { registerMobStatus(mapid, mse, cancelAction, duration, null, -1); } - + public void registerMobStatus(int mapid, MonsterStatusEffect mse, Runnable cancelAction, long duration, Runnable overtimeAction, int overtimeDelay) { mobStatusSchedulers[getChannelSchedulerIndex(mapid)].registerMobStatus(mse, cancelAction, duration, overtimeAction, overtimeDelay); } - + public void interruptMobStatus(int mapid, MonsterStatusEffect mse) { mobStatusSchedulers[getChannelSchedulerIndex(mapid)].interruptMobStatus(mse); } - + private class MobStatusScheduler extends BaseScheduler { - private Map registeredMobStatusOvertime = new HashMap<>(); + private final Map registeredMobStatusOvertime = new HashMap<>(); private MonitoredReentrantLock overtimeStatusLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.CHANNEL_OVTSTATUS, true); private class MobStatusOvertimeEntry { private int procCount; - private int procLimit; - private Runnable r; + private final int procLimit; + private final Runnable r; protected MobStatusOvertimeEntry(int delay, Runnable run) { procCount = 0; - procLimit = (int)Math.ceil((float) delay / YamlConfig.config.server.MOB_STATUS_MONITOR_PROC); + procLimit = (int) Math.ceil((float) delay / YamlConfig.config.server.MOB_STATUS_MONITOR_PROC); r = run; } protected void update(List toRun) { procCount++; - if(procCount >= procLimit) { + if (procCount >= procLimit) { procCount = 0; toRun.add(r); } @@ -102,15 +101,15 @@ public class MobStatusService extends BaseService { overtimeStatusLock.lock(); try { - for(Object mseo : toRemove) { + for (Object mseo : toRemove) { MonsterStatusEffect mse = (MonsterStatusEffect) mseo; registeredMobStatusOvertime.remove(mse); } - if(update) { + if (update) { // it's probably ok to use one thread for both management & overtime actions List mdoeList = new ArrayList<>(registeredMobStatusOvertime.values()); - for(MobStatusOvertimeEntry mdoe : mdoeList) { + for (MobStatusOvertimeEntry mdoe : mdoeList) { mdoe.update(toRun); } } @@ -118,14 +117,14 @@ public class MobStatusService extends BaseService { overtimeStatusLock.unlock(); } - for(Runnable r : toRun) { + for (Runnable r : toRun) { r.run(); } }); } public void registerMobStatus(MonsterStatusEffect mse, Runnable cancelStatus, long duration, Runnable overtimeStatus, int overtimeDelay) { - if(overtimeStatus != null) { + if (overtimeStatus != null) { MobStatusOvertimeEntry mdoe = new MobStatusOvertimeEntry(overtimeDelay, overtimeStatus); overtimeStatusLock.lock(); @@ -156,7 +155,7 @@ public class MobStatusService extends BaseService { private void emptyLocks() { overtimeStatusLock = overtimeStatusLock.dispose(); } - + } - + } diff --git a/src/main/java/net/server/services/task/channel/OverallService.java b/src/main/java/net/server/services/task/channel/OverallService.java index 54a9cf3adb..7f2ca75978 100644 --- a/src/main/java/net/server/services/task/channel/OverallService.java +++ b/src/main/java/net/server/services/task/channel/OverallService.java @@ -25,40 +25,39 @@ import net.server.services.BaseScheduler; import net.server.services.BaseService; /** - * * @author Ronan */ public class OverallService extends BaseService { // thanks Alex for suggesting a refactor over the several channel schedulers unnecessarily populating the Channel class - - private OverallScheduler[] channelSchedulers = new OverallScheduler[YamlConfig.config.server.CHANNEL_LOCKS]; - + + private final OverallScheduler[] channelSchedulers = new OverallScheduler[YamlConfig.config.server.CHANNEL_LOCKS]; + public OverallService() { - for(int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { + for (int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { channelSchedulers[i] = new OverallScheduler(); } } - + @Override public void dispose() { - for(int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { - if(channelSchedulers[i] != null) { + for (int i = 0; i < YamlConfig.config.server.CHANNEL_LOCKS; i++) { + if (channelSchedulers[i] != null) { channelSchedulers[i].dispose(); channelSchedulers[i] = null; } } } - + public void registerOverallAction(int mapid, Runnable runAction, long delay) { channelSchedulers[getChannelSchedulerIndex(mapid)].registerDelayedAction(runAction, delay); } - + public void forceRunOverallAction(int mapid, Runnable runAction) { channelSchedulers[getChannelSchedulerIndex(mapid)].forceRunDelayedAction(runAction); } - - + + public class OverallScheduler extends BaseScheduler { - + public OverallScheduler() { super(MonitoredLockType.CHANNEL_OVERALL); } @@ -70,7 +69,7 @@ public class OverallService extends BaseService { // thanks Alex for suggestin public void forceRunDelayedAction(Runnable runAction) { interruptEntry(runAction); } - + } - + } diff --git a/src/main/java/net/server/services/task/world/CharacterSaveService.java b/src/main/java/net/server/services/task/world/CharacterSaveService.java index 1d7fe096b6..fc2b699e9f 100644 --- a/src/main/java/net/server/services/task/world/CharacterSaveService.java +++ b/src/main/java/net/server/services/task/world/CharacterSaveService.java @@ -24,27 +24,26 @@ import net.server.services.BaseScheduler; import net.server.services.BaseService; /** - * * @author Ronan */ public class CharacterSaveService extends BaseService { - + CharacterSaveScheduler chrSaveScheduler = new CharacterSaveScheduler(); - + @Override public void dispose() { - if(chrSaveScheduler != null) { + if (chrSaveScheduler != null) { chrSaveScheduler.dispose(); chrSaveScheduler = null; } } - + public void registerSaveCharacter(int characterId, Runnable runAction) { chrSaveScheduler.registerSaveCharacter(characterId, runAction); } - + private class CharacterSaveScheduler extends BaseScheduler { - + public CharacterSaveScheduler() { super(MonitoredLockType.WORLD_SAVECHARS); } @@ -56,7 +55,7 @@ public class CharacterSaveService extends BaseService { public void unregisterSaveCharacter(Integer characterId) { interruptEntry(characterId); } - + } - + } diff --git a/src/main/java/net/server/services/type/ChannelServices.java b/src/main/java/net/server/services/type/ChannelServices.java index d878edf66c..aedebeb1ce 100644 --- a/src/main/java/net/server/services/type/ChannelServices.java +++ b/src/main/java/net/server/services/type/ChannelServices.java @@ -19,23 +19,16 @@ */ package net.server.services.type; -import net.server.services.ServiceType; -import net.server.services.task.channel.EventService; -import net.server.services.task.channel.FaceExpressionService; -import net.server.services.task.channel.MobAnimationService; -import net.server.services.task.channel.MobClearSkillService; -import net.server.services.task.channel.MobMistService; -import net.server.services.task.channel.MobStatusService; -import net.server.services.task.channel.OverallService; import net.server.services.BaseService; import net.server.services.Service; +import net.server.services.ServiceType; +import net.server.services.task.channel.*; /** - * * @author Ronan */ public enum ChannelServices implements ServiceType { - + MOB_STATUS(MobStatusService.class), MOB_ANIMATION(MobAnimationService.class), MOB_CLEAR_SKILL(MobClearSkillService.class), @@ -43,21 +36,21 @@ public enum ChannelServices implements ServiceType { FACE_EXPRESSION(FaceExpressionService.class), EVENT(EventService.class), OVERALL(OverallService.class); - - private Class s; - - private ChannelServices(Class service) { + + private final Class s; + + ChannelServices(Class service) { s = service; } - + @Override public Service createService() { return new Service(s); } - + @Override public ChannelServices[] enumValues() { return ChannelServices.values(); } - + } diff --git a/src/main/java/net/server/services/type/WorldServices.java b/src/main/java/net/server/services/type/WorldServices.java index 033ea3fe38..f7b9c22d2a 100644 --- a/src/main/java/net/server/services/type/WorldServices.java +++ b/src/main/java/net/server/services/type/WorldServices.java @@ -19,33 +19,32 @@ */ package net.server.services.type; -import net.server.services.ServiceType; import net.server.services.BaseService; import net.server.services.Service; +import net.server.services.ServiceType; import net.server.services.task.world.CharacterSaveService; /** - * * @author Ronan */ public enum WorldServices implements ServiceType { - + SAVE_CHARACTER(CharacterSaveService.class); - - private Class s; - - private WorldServices(Class service) { + + private final Class s; + + WorldServices(Class service) { s = service; } - + @Override public Service createService() { return new Service(s); } - + @Override public WorldServices[] enumValues() { return WorldServices.values(); } - + } diff --git a/src/main/java/net/server/task/BaseTask.java b/src/main/java/net/server/task/BaseTask.java index 73b1af0864..20e59ad55b 100644 --- a/src/main/java/net/server/task/BaseTask.java +++ b/src/main/java/net/server/task/BaseTask.java @@ -26,10 +26,10 @@ import net.server.world.World; */ public abstract class BaseTask implements Runnable { protected World wserv; - + @Override public void run() {} - + public BaseTask(World world) { wserv = world; } diff --git a/src/main/java/net/server/task/BossLogTask.java b/src/main/java/net/server/task/BossLogTask.java index 631d1b2356..658da74086 100644 --- a/src/main/java/net/server/task/BossLogTask.java +++ b/src/main/java/net/server/task/BossLogTask.java @@ -25,7 +25,7 @@ import server.expeditions.ExpeditionBossLog; * @author Ronan */ public class BossLogTask implements Runnable { - + @Override public void run() { ExpeditionBossLog.resetBossLogTable(); diff --git a/src/main/java/net/server/task/CharacterAutosaverTask.java b/src/main/java/net/server/task/CharacterAutosaverTask.java index e98862fd60..0210b42261 100644 --- a/src/main/java/net/server/task/CharacterAutosaverTask.java +++ b/src/main/java/net/server/task/CharacterAutosaverTask.java @@ -28,19 +28,21 @@ import net.server.world.World; * @author Ronan */ public class CharacterAutosaverTask extends BaseTask implements Runnable { // thanks Alex09 (Alex-0000) for noticing these runnable classes are tasks, "workers" runs them - + @Override public void run() { - if(!YamlConfig.config.server.USE_AUTOSAVE) return; - + if (!YamlConfig.config.server.USE_AUTOSAVE) { + return; + } + PlayerStorage ps = wserv.getPlayerStorage(); - for(Character chr: ps.getAllCharacters()) { - if(chr != null && chr.isLoggedin()) { + for (Character chr : ps.getAllCharacters()) { + if (chr != null && chr.isLoggedin()) { chr.saveCharToDB(false); } } } - + public CharacterAutosaverTask(World world) { super(world); } diff --git a/src/main/java/net/server/task/CharacterDiseaseTask.java b/src/main/java/net/server/task/CharacterDiseaseTask.java index 9f25bc392c..92348bc1ff 100644 --- a/src/main/java/net/server/task/CharacterDiseaseTask.java +++ b/src/main/java/net/server/task/CharacterDiseaseTask.java @@ -23,13 +23,13 @@ import net.server.Server; /** * @author Ronan - * @info Thread responsible for announcing other players diseases when one enters into a map + * @info Thread responsible for announcing other players diseases when one enters into a map */ public class CharacterDiseaseTask implements Runnable { @Override public void run() { Server serv = Server.getInstance(); - + serv.updateCurrentTime(); serv.runAnnouncePlayerDiseasesSchedule(); } diff --git a/src/main/java/net/server/task/CouponTask.java b/src/main/java/net/server/task/CouponTask.java index cd622c8f0e..13a05201f3 100644 --- a/src/main/java/net/server/task/CouponTask.java +++ b/src/main/java/net/server/task/CouponTask.java @@ -19,17 +19,17 @@ */ package net.server.task; -import java.sql.Connection; -import java.sql.SQLException; import net.server.Server; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import tools.DatabaseConnection; -import tools.FilePrinter; + +import java.sql.Connection; +import java.sql.SQLException; /** * @author Ronan - * @info Thread responsible for maintaining coupons EXP & DROP effects active + * @info Thread responsible for maintaining coupons EXP & DROP effects active */ public class CouponTask implements Runnable { private static final Logger log = LoggerFactory.getLogger(CouponTask.class); diff --git a/src/main/java/net/server/task/DueyFredrickTask.java b/src/main/java/net/server/task/DueyFredrickTask.java index dd570f71e2..60b95ff560 100644 --- a/src/main/java/net/server/task/DueyFredrickTask.java +++ b/src/main/java/net/server/task/DueyFredrickTask.java @@ -26,7 +26,7 @@ import client.processor.npc.FredrickProcessor; * @author Ronan */ public class DueyFredrickTask implements Runnable { - + @Override public void run() { FredrickProcessor.runFredrickSchedule(); diff --git a/src/main/java/net/server/task/EventRecallCoordinatorTask.java b/src/main/java/net/server/task/EventRecallCoordinatorTask.java index c94847681d..1e562f2b11 100644 --- a/src/main/java/net/server/task/EventRecallCoordinatorTask.java +++ b/src/main/java/net/server/task/EventRecallCoordinatorTask.java @@ -22,11 +22,10 @@ package net.server.task; import net.server.coordinator.world.EventRecallCoordinator; /** - * * @author Ronan */ public class EventRecallCoordinatorTask implements Runnable { - + @Override public void run() { EventRecallCoordinator.getInstance().manageEventInstances(); diff --git a/src/main/java/net/server/task/FamilyDailyResetTask.java b/src/main/java/net/server/task/FamilyDailyResetTask.java index 2c7b3ab67a..9653b8e784 100644 --- a/src/main/java/net/server/task/FamilyDailyResetTask.java +++ b/src/main/java/net/server/task/FamilyDailyResetTask.java @@ -21,7 +21,7 @@ public class FamilyDailyResetTask implements Runnable { @Override public void run() { resetEntitlementUsage(world); - for(Family family : world.getFamilies()) { + for (Family family : world.getFamilies()) { family.resetDailyReps(); } } @@ -33,22 +33,22 @@ public class FamilyDailyResetTask implements Runnable { resetTime.set(Calendar.MINUTE, 0); resetTime.set(Calendar.SECOND, 0); resetTime.set(Calendar.MILLISECOND, 0); - try(Connection con = DatabaseConnection.getConnection()) { - try(PreparedStatement ps = con.prepareStatement("UPDATE family_character SET todaysrep = 0, reptosenior = 0 WHERE lastresettime <= ?")) { + try (Connection con = DatabaseConnection.getConnection()) { + try (PreparedStatement ps = con.prepareStatement("UPDATE family_character SET todaysrep = 0, reptosenior = 0 WHERE lastresettime <= ?")) { ps.setLong(1, resetTime.getTimeInMillis()); ps.executeUpdate(); - } catch(SQLException e) { + } catch (SQLException e) { FilePrinter.printError(FilePrinter.FAMILY_ERROR, e, "Could not reset daily rep for families. On " + Calendar.getInstance().getTime()); e.printStackTrace(); } - try(PreparedStatement ps = con.prepareStatement("DELETE FROM family_entitlement WHERE timestamp <= ?")) { + try (PreparedStatement ps = con.prepareStatement("DELETE FROM family_entitlement WHERE timestamp <= ?")) { ps.setLong(1, resetTime.getTimeInMillis()); ps.executeUpdate(); - } catch(SQLException e) { + } catch (SQLException e) { FilePrinter.printError(FilePrinter.FAMILY_ERROR, e, "Could not do daily reset for family entitlements. On " + Calendar.getInstance().getTime()); e.printStackTrace(); } - } catch(SQLException e) { + } catch (SQLException e) { FilePrinter.printError(FilePrinter.FAMILY_ERROR, e, "Could not get connection to DB."); e.printStackTrace(); } diff --git a/src/main/java/net/server/task/FishingTask.java b/src/main/java/net/server/task/FishingTask.java index 8d45625424..9739bfaeef 100644 --- a/src/main/java/net/server/task/FishingTask.java +++ b/src/main/java/net/server/task/FishingTask.java @@ -25,12 +25,12 @@ import net.server.world.World; * @author Ronan */ public class FishingTask extends BaseTask implements Runnable { - + @Override public void run() { wserv.runCheckFishingSchedule(); } - + public FishingTask(World world) { super(world); } diff --git a/src/main/java/net/server/task/HiredMerchantTask.java b/src/main/java/net/server/task/HiredMerchantTask.java index 41f624bf75..ca7b31eeb9 100644 --- a/src/main/java/net/server/task/HiredMerchantTask.java +++ b/src/main/java/net/server/task/HiredMerchantTask.java @@ -25,12 +25,12 @@ import net.server.world.World; * @author Ronan */ public class HiredMerchantTask extends BaseTask implements Runnable { - + @Override public void run() { wserv.runHiredMerchantSchedule(); } - + public HiredMerchantTask(World world) { super(world); } diff --git a/src/main/java/net/server/task/InvitationTask.java b/src/main/java/net/server/task/InvitationTask.java index c41cd0d1c6..1d1ea4fbbb 100644 --- a/src/main/java/net/server/task/InvitationTask.java +++ b/src/main/java/net/server/task/InvitationTask.java @@ -25,7 +25,7 @@ import net.server.coordinator.world.InviteCoordinator; * @author Ronan */ public class InvitationTask implements Runnable { - + @Override public void run() { InviteCoordinator.runTimeoutSchedule(); diff --git a/src/main/java/net/server/task/LoginCoordinatorTask.java b/src/main/java/net/server/task/LoginCoordinatorTask.java index 7f37434d62..74b343bdd1 100644 --- a/src/main/java/net/server/task/LoginCoordinatorTask.java +++ b/src/main/java/net/server/task/LoginCoordinatorTask.java @@ -22,11 +22,10 @@ package net.server.task; import net.server.coordinator.session.SessionCoordinator; /** - * * @author Ronan */ public class LoginCoordinatorTask implements Runnable { - + @Override public void run() { SessionCoordinator.getInstance().clearExpiredHwidHistory(); diff --git a/src/main/java/net/server/task/LoginStorageTask.java b/src/main/java/net/server/task/LoginStorageTask.java index 28c061d341..aadd3a3616 100644 --- a/src/main/java/net/server/task/LoginStorageTask.java +++ b/src/main/java/net/server/task/LoginStorageTask.java @@ -23,11 +23,10 @@ import net.server.coordinator.login.LoginBypassCoordinator; import net.server.coordinator.session.SessionCoordinator; /** - * * @author Ronan */ public class LoginStorageTask implements Runnable { - + @Override public void run() { SessionCoordinator.getInstance().runUpdateLoginHistory(); diff --git a/src/main/java/net/server/task/MapOwnershipTask.java b/src/main/java/net/server/task/MapOwnershipTask.java index 8b0db7cc45..5c8ea1b8b8 100644 --- a/src/main/java/net/server/task/MapOwnershipTask.java +++ b/src/main/java/net/server/task/MapOwnershipTask.java @@ -19,21 +19,21 @@ */ package net.server.task; -import net.server.world.World; import net.server.channel.Channel; +import net.server.world.World; /** * @author Ronan */ public class MapOwnershipTask extends BaseTask implements Runnable { - + @Override public void run() { for (Channel ch : wserv.getChannels()) { ch.runCheckOwnedMapsSchedule(); } } - + public MapOwnershipTask(World world) { super(world); } diff --git a/src/main/java/net/server/task/MountTirednessTask.java b/src/main/java/net/server/task/MountTirednessTask.java index 9bc7de66a3..548ba4d4f6 100644 --- a/src/main/java/net/server/task/MountTirednessTask.java +++ b/src/main/java/net/server/task/MountTirednessTask.java @@ -25,12 +25,12 @@ import net.server.world.World; * @author Ronan */ public class MountTirednessTask extends BaseTask implements Runnable { - + @Override public void run() { wserv.runMountSchedule(); } - + public MountTirednessTask(World world) { super(world); } diff --git a/src/main/java/net/server/task/PartySearchTask.java b/src/main/java/net/server/task/PartySearchTask.java index 64784ea2dd..124414e8c3 100644 --- a/src/main/java/net/server/task/PartySearchTask.java +++ b/src/main/java/net/server/task/PartySearchTask.java @@ -22,16 +22,15 @@ package net.server.task; import net.server.world.World; /** - * * @author Ronan */ public class PartySearchTask extends BaseTask implements Runnable { - + @Override public void run() { wserv.runPartySearchUpdateSchedule(); } - + public PartySearchTask(World world) { super(world); } diff --git a/src/main/java/net/server/task/PetFullnessTask.java b/src/main/java/net/server/task/PetFullnessTask.java index 9652201f0c..2c1f51cf82 100644 --- a/src/main/java/net/server/task/PetFullnessTask.java +++ b/src/main/java/net/server/task/PetFullnessTask.java @@ -25,12 +25,12 @@ import net.server.world.World; * @author Ronan */ public class PetFullnessTask extends BaseTask implements Runnable { - + @Override public void run() { wserv.runPetSchedule(); } - + public PetFullnessTask(World world) { super(world); } diff --git a/src/main/java/net/server/task/RankingCommandTask.java b/src/main/java/net/server/task/RankingCommandTask.java index b5f95fdb52..e15b406105 100644 --- a/src/main/java/net/server/task/RankingCommandTask.java +++ b/src/main/java/net/server/task/RankingCommandTask.java @@ -22,11 +22,10 @@ package net.server.task; import net.server.Server; /** - * * @author Ronan */ public class RankingCommandTask implements Runnable { - + @Override public void run() { Server.getInstance().updateWorldPlayerRanking(); diff --git a/src/main/java/net/server/task/RankingLoginTask.java b/src/main/java/net/server/task/RankingLoginTask.java index 45a891d634..254538c7ef 100644 --- a/src/main/java/net/server/task/RankingLoginTask.java +++ b/src/main/java/net/server/task/RankingLoginTask.java @@ -38,7 +38,7 @@ import java.sql.SQLException; */ public class RankingLoginTask implements Runnable { private long lastUpdate = System.currentTimeMillis(); - + private void resetMoveRank(boolean job) throws SQLException { String query = "UPDATE characters SET " + (job ? "jobRankMove = 0" : "rankMove = 0"); try (Connection con = DatabaseConnection.getConnection()) { @@ -82,7 +82,7 @@ public class RankingLoginTask implements Runnable { } } } - + @Override public void run() { try (Connection con = DatabaseConnection.getConnection()) { diff --git a/src/main/java/net/server/task/ReleaseLockTask.java b/src/main/java/net/server/task/ReleaseLockTask.java index 7a54ec264c..af9d075d4b 100644 --- a/src/main/java/net/server/task/ReleaseLockTask.java +++ b/src/main/java/net/server/task/ReleaseLockTask.java @@ -23,7 +23,7 @@ import net.server.audit.LockCollector; /** * @author Ronan - * @info Thread responsible for expiring locks signalized for dispose. + * @info Thread responsible for expiring locks signalized for dispose. */ public class ReleaseLockTask implements Runnable { @Override diff --git a/src/main/java/net/server/task/RespawnTask.java b/src/main/java/net/server/task/RespawnTask.java index 647634ca90..a497fe48f3 100644 --- a/src/main/java/net/server/task/RespawnTask.java +++ b/src/main/java/net/server/task/RespawnTask.java @@ -9,7 +9,7 @@ import server.maps.MapManager; * @author Resinate */ public class RespawnTask implements Runnable { - + @Override public void run() { for (Channel ch : Server.getInstance().getAllChannels()) { diff --git a/src/main/java/net/server/task/ServerMessageTask.java b/src/main/java/net/server/task/ServerMessageTask.java index 06982ba19a..acfd45598c 100644 --- a/src/main/java/net/server/task/ServerMessageTask.java +++ b/src/main/java/net/server/task/ServerMessageTask.java @@ -25,15 +25,15 @@ import net.server.world.World; * @author Ronan */ public class ServerMessageTask extends BaseTask implements Runnable { - + @Override public void run() { // It's purpose is for tracking whether the player client currently displays a boss HPBar and, if so, // temporarily disable the server message for that player. - + wserv.runDisabledServerMessagesSchedule(); } - + public ServerMessageTask(World world) { super(world); } diff --git a/src/main/java/net/server/task/TimedMapObjectTask.java b/src/main/java/net/server/task/TimedMapObjectTask.java index 7c5f9f75e6..35e420762e 100644 --- a/src/main/java/net/server/task/TimedMapObjectTask.java +++ b/src/main/java/net/server/task/TimedMapObjectTask.java @@ -25,12 +25,12 @@ import net.server.world.World; * @author Ronan */ public class TimedMapObjectTask extends BaseTask implements Runnable { - + @Override public void run() { wserv.runTimedMapObjectSchedule(); } - + public TimedMapObjectTask(World world) { super(world); } diff --git a/src/main/java/net/server/task/TimeoutTask.java b/src/main/java/net/server/task/TimeoutTask.java index 856a192111..9843f9ce20 100644 --- a/src/main/java/net/server/task/TimeoutTask.java +++ b/src/main/java/net/server/task/TimeoutTask.java @@ -8,7 +8,6 @@ import tools.FilePrinter; import java.util.Collection; /** - * * @author Shavit */ public class TimeoutTask extends BaseTask implements Runnable { @@ -16,8 +15,8 @@ public class TimeoutTask extends BaseTask implements Runnable { public void run() { long time = System.currentTimeMillis(); Collection chars = wserv.getPlayerStorage().getAllCharacters(); - for(Character chr : chars) { - if(time - chr.getClient().getLastPacket() > YamlConfig.config.server.TIMEOUT_DURATION) { + for (Character chr : chars) { + if (time - chr.getClient().getLastPacket() > YamlConfig.config.server.TIMEOUT_DURATION) { FilePrinter.print(FilePrinter.DCS + chr.getClient().getAccountName(), chr.getName() + " auto-disconnected due to inactivity."); chr.getClient().disconnect(true, chr.getCashShop().isOpened()); } diff --git a/src/main/java/net/server/task/WeddingReservationTask.java b/src/main/java/net/server/task/WeddingReservationTask.java index b7a9b0bcf0..8264ccafbc 100644 --- a/src/main/java/net/server/task/WeddingReservationTask.java +++ b/src/main/java/net/server/task/WeddingReservationTask.java @@ -19,37 +19,38 @@ */ package net.server.task; -import java.util.Set; -import net.server.world.World; import net.server.channel.Channel; +import net.server.world.World; import tools.Pair; +import java.util.Set; + /** * @author Ronan */ public class WeddingReservationTask extends BaseTask implements Runnable { - + @Override public void run() { - for(Channel ch : wserv.getChannels()) { + for (Channel ch : wserv.getChannels()) { Pair>> wedding; - + wedding = ch.getNextWeddingReservation(true); // start cathedral - if(wedding != null) { + if (wedding != null) { ch.setOngoingWedding(true, wedding.getLeft(), wedding.getRight().getLeft(), wedding.getRight().getRight()); } else { ch.setOngoingWedding(true, null, null, null); } - + wedding = ch.getNextWeddingReservation(false); // start chapel - if(wedding != null) { + if (wedding != null) { ch.setOngoingWedding(false, wedding.getLeft(), wedding.getRight().getLeft(), wedding.getRight().getRight()); } else { ch.setOngoingWedding(false, null, null, null); } } } - + public WeddingReservationTask(World world) { super(world); } diff --git a/src/main/java/net/server/world/MessengerCharacter.java b/src/main/java/net/server/world/MessengerCharacter.java index c17de186ed..706c19be5c 100644 --- a/src/main/java/net/server/world/MessengerCharacter.java +++ b/src/main/java/net/server/world/MessengerCharacter.java @@ -84,6 +84,8 @@ public class MessengerCharacter { final MessengerCharacter other = (MessengerCharacter) obj; if (name == null) { return other.name == null; - } else return name.equals(other.name); + } else { + return name.equals(other.name); + } } } diff --git a/src/main/java/net/server/world/PartyCharacter.java b/src/main/java/net/server/world/PartyCharacter.java index 1e310d147e..03fea2ca8d 100644 --- a/src/main/java/net/server/world/PartyCharacter.java +++ b/src/main/java/net/server/world/PartyCharacter.java @@ -133,7 +133,9 @@ public class PartyCharacter { final PartyCharacter other = (PartyCharacter) obj; if (name == null) { return other.name == null; - } else return name.equals(other.name); + } else { + return name.equals(other.name); + } } public int getWorld() { diff --git a/src/main/java/net/server/world/World.java b/src/main/java/net/server/world/World.java index bc547bceea..2c29cfa7e9 100644 --- a/src/main/java/net/server/world/World.java +++ b/src/main/java/net/server/world/World.java @@ -69,86 +69,93 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.atomic.AtomicInteger; /** - * * @author kevintjuh93 * @author Ronan - thread-oriented (world schedules + guild queue + marriages + party chars) */ public class World { - private int id, flag, exprate, droprate, bossdroprate, mesorate, questrate, travelrate, fishingrate; - private String eventmsg; - private List channels = new ArrayList<>(); - private Map pnpcStep = new HashMap<>(); - private Map pnpcPodium = new HashMap<>(); - private Map messengers = new HashMap<>(); - private AtomicInteger runningMessengerId = new AtomicInteger(); - private Map families = new LinkedHashMap<>(); - private Map relationships = new HashMap<>(); - private Map> relationshipCouples = new HashMap<>(); - private Map gsStore = new HashMap<>(); + private final int id; + private int flag; + private int exprate; + private int droprate; + private int bossdroprate; + private int mesorate; + private int questrate; + private int travelrate; + private int fishingrate; + private final String eventmsg; + private final List channels = new ArrayList<>(); + private final Map pnpcStep = new HashMap<>(); + private final Map pnpcPodium = new HashMap<>(); + private final Map messengers = new HashMap<>(); + private final AtomicInteger runningMessengerId = new AtomicInteger(); + private final Map families = new LinkedHashMap<>(); + private final Map relationships = new HashMap<>(); + private final Map> relationshipCouples = new HashMap<>(); + private final Map gsStore = new HashMap<>(); private PlayerStorage players = new PlayerStorage(); - private ServicesManager services = new ServicesManager(WorldServices.SAVE_CHARACTER); - private MatchCheckerCoordinator matchChecker = new MatchCheckerCoordinator(); - private PartySearchCoordinator partySearch = new PartySearchCoordinator(); - + private final ServicesManager services = new ServicesManager(WorldServices.SAVE_CHARACTER); + private final MatchCheckerCoordinator matchChecker = new MatchCheckerCoordinator(); + private final PartySearchCoordinator partySearch = new PartySearchCoordinator(); + private final MonitoredReentrantReadWriteLock chnLock = new MonitoredReentrantReadWriteLock(MonitoredLockType.WORLD_CHANNELS, true); - private MonitoredReadLock chnRLock = MonitoredReadLockFactory.createLock(chnLock); - private MonitoredWriteLock chnWLock = MonitoredWriteLockFactory.createLock(chnLock); - - private Map> accountChars = new HashMap<>(); - private Map accountStorages = new HashMap<>(); + private final MonitoredReadLock chnRLock = MonitoredReadLockFactory.createLock(chnLock); + private final MonitoredWriteLock chnWLock = MonitoredWriteLockFactory.createLock(chnLock); + + private final Map> accountChars = new HashMap<>(); + private final Map accountStorages = new HashMap<>(); private MonitoredReentrantLock accountCharsLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.WORLD_CHARS, true); - - private Set queuedGuilds = new HashSet<>(); - private Map, Pair>> queuedMarriages = new HashMap<>(); - private Map> marriageGuests = new ConcurrentHashMap<>(); - - private Map partyChars = new HashMap<>(); - private Map parties = new HashMap<>(); - private AtomicInteger runningPartyId = new AtomicInteger(); + + private final Set queuedGuilds = new HashSet<>(); + private final Map, Pair>> queuedMarriages = new HashMap<>(); + private final Map> marriageGuests = new ConcurrentHashMap<>(); + + private final Map partyChars = new HashMap<>(); + private final Map parties = new HashMap<>(); + private final AtomicInteger runningPartyId = new AtomicInteger(); private MonitoredReentrantLock partyLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.WORLD_PARTY, true); - - private Map owlSearched = new LinkedHashMap<>(); - private List> cashItemBought = new ArrayList<>(9); + + private final Map owlSearched = new LinkedHashMap<>(); + private final List> cashItemBought = new ArrayList<>(9); private final MonitoredReentrantReadWriteLock suggestLock = new MonitoredReentrantReadWriteLock(MonitoredLockType.WORLD_SUGGEST, true); - private MonitoredReadLock suggestRLock = MonitoredReadLockFactory.createLock(suggestLock); - private MonitoredWriteLock suggestWLock = MonitoredWriteLockFactory.createLock(suggestLock); - - private Map disabledServerMessages = new HashMap<>(); // reuse owl lock + private final MonitoredReadLock suggestRLock = MonitoredReadLockFactory.createLock(suggestLock); + private final MonitoredWriteLock suggestWLock = MonitoredWriteLockFactory.createLock(suggestLock); + + private final Map disabledServerMessages = new HashMap<>(); // reuse owl lock private MonitoredReentrantLock srvMessagesLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.WORLD_SRVMESSAGES); private ScheduledFuture srvMessagesSchedule; - + private MonitoredReentrantLock activePetsLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.WORLD_PETS, true); - private Map activePets = new LinkedHashMap<>(); + private final Map activePets = new LinkedHashMap<>(); private ScheduledFuture petsSchedule; private long petUpdate; - + private MonitoredReentrantLock activeMountsLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.WORLD_MOUNTS, true); - private Map activeMounts = new LinkedHashMap<>(); + private final Map activeMounts = new LinkedHashMap<>(); private ScheduledFuture mountsSchedule; private long mountUpdate; - + private MonitoredReentrantLock activePlayerShopsLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.WORLD_PSHOPS, true); - private Map activePlayerShops = new LinkedHashMap<>(); - + private final Map activePlayerShops = new LinkedHashMap<>(); + private MonitoredReentrantLock activeMerchantsLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.WORLD_MERCHS, true); - private Map> activeMerchants = new LinkedHashMap<>(); + private final Map> activeMerchants = new LinkedHashMap<>(); private ScheduledFuture merchantSchedule; private long merchantUpdate; - - private Map registeredTimedMapObjects = new LinkedHashMap<>(); + + private final Map registeredTimedMapObjects = new LinkedHashMap<>(); private ScheduledFuture timedMapObjectsSchedule; private MonitoredReentrantLock timedMapObjectLock = MonitoredReentrantLockFactory.createLock(MonitoredLockType.WORLD_MAPOBJS, true); - - private Map fishingAttempters = Collections.synchronizedMap(new WeakHashMap<>()); - + + private final Map fishingAttempters = Collections.synchronizedMap(new WeakHashMap<>()); + private ScheduledFuture charactersSchedule; private ScheduledFuture marriagesSchedule; private ScheduledFuture mapOwnershipSchedule; private ScheduledFuture fishingSchedule; private ScheduledFuture partySearchSchedule; private ScheduledFuture timeoutSchedule; - + public World(int world, int flag, String eventmsg, int exprate, int droprate, int bossdroprate, int mesorate, int questrate, int travelrate, int fishingrate) { this.id = world; this.flag = flag; @@ -162,14 +169,14 @@ public class World { this.fishingrate = fishingrate; runningPartyId.set(1000000001); // partyid must not clash with charid to solve update item looting issues, found thanks to Vcoc runningMessengerId.set(1); - + petUpdate = Server.getInstance().getCurrentTime(); mountUpdate = petUpdate; - + for (int i = 0; i < 9; i++) { cashItemBought.add(new LinkedHashMap<>()); } - + TimerManager tman = TimerManager.getInstance(); petsSchedule = tman.register(new PetFullnessTask(this), 60 * 1000, 60 * 1000); srvMessagesSchedule = tman.register(new ServerMessageTask(this), 10 * 1000, 10 * 1000); @@ -182,8 +189,8 @@ public class World { fishingSchedule = tman.register(new FishingTask(this), 10 * 1000, 10 * 1000); partySearchSchedule = tman.register(new PartySearchTask(this), 10 * 1000, 10 * 1000); timeoutSchedule = tman.register(new TimeoutTask(this), 10 * 1000, 10 * 1000); - - if(YamlConfig.config.server.USE_FAMILY_SYSTEM) { + + if (YamlConfig.config.server.USE_FAMILY_SYSTEM) { long timeLeft = Server.getTimeLeftForNextDay(); FamilyDailyResetTask.resetEntitlementUsage(this); tman.register(new FamilyDailyResetTask(this), 24 * 60 * 60 * 1000, timeLeft); @@ -198,7 +205,7 @@ public class World { chnRLock.unlock(); } } - + public List getChannels() { chnRLock.lock(); try { @@ -238,26 +245,26 @@ public class World { public int removeChannel() { Channel ch; int chIdx; - + chnRLock.lock(); try { chIdx = channels.size() - 1; - if(chIdx < 0) { + if (chIdx < 0) { return -1; } - + ch = channels.get(chIdx); } finally { chnRLock.unlock(); } - - if(ch == null || !ch.canUninstall()) { + + if (ch == null || !ch.canUninstall()) { return -1; } - + chnWLock.lock(); try { - if(chIdx == channels.size() - 1) { + if (chIdx == channels.size() - 1) { channels.remove(chIdx); } else { return -1; @@ -265,23 +272,25 @@ public class World { } finally { chnWLock.unlock(); } - + ch.shutdown(); return ch.getId(); } public boolean canUninstall() { - if(players.getSize() > 0) return false; - - for(Channel ch : this.getChannels()) { - if(!ch.canUninstall()) { + if (players.getSize() > 0) { + return false; + } + + for (Channel ch : this.getChannels()) { + if (!ch.canUninstall()) { return false; } } - + return true; } - + public void setFlag(byte b) { this.flag = b; } @@ -293,21 +302,25 @@ public class World { public String getEventMessage() { return eventmsg; } - + public int getExpRate() { return exprate; } public void setExpRate(int exp) { Collection list = getPlayerStorage().getAllCharacters(); - - for(Character chr : list) { - if(!chr.isLoggedin()) continue; + + for (Character chr : list) { + if (!chr.isLoggedin()) { + continue; + } chr.revertWorldRates(); - } + } this.exprate = exp; - for(Character chr : list) { - if(!chr.isLoggedin()) continue; + for (Character chr : list) { + if (!chr.isLoggedin()) { + continue; + } chr.setWorldRates(); } } @@ -318,22 +331,26 @@ public class World { public void setDropRate(int drop) { Collection list = getPlayerStorage().getAllCharacters(); - - for(Character chr : list) { - if(!chr.isLoggedin()) continue; + + for (Character chr : list) { + if (!chr.isLoggedin()) { + continue; + } chr.revertWorldRates(); - } + } this.droprate = drop; - for(Character chr : list) { - if(!chr.isLoggedin()) continue; + for (Character chr : list) { + if (!chr.isLoggedin()) { + continue; + } chr.setWorldRates(); } } - + public int getBossDropRate() { // boss rate concept thanks to Lapeiro return bossdroprate; } - + public void setBossDropRate(int bossdrop) { bossdroprate = bossdrop; } @@ -345,13 +362,17 @@ public class World { public void setMesoRate(int meso) { Collection list = getPlayerStorage().getAllCharacters(); - for(Character chr : list) { - if(!chr.isLoggedin()) continue; + for (Character chr : list) { + if (!chr.isLoggedin()) { + continue; + } chr.revertWorldRates(); - } + } this.mesorate = meso; - for(Character chr : list) { - if(!chr.isLoggedin()) continue; + for (Character chr : list) { + if (!chr.isLoggedin()) { + continue; + } chr.setWorldRates(); } } @@ -359,37 +380,37 @@ public class World { public int getQuestRate() { return questrate; } - + public void setQuestRate(int quest) { this.questrate = quest; } - + public int getTravelRate() { return travelrate; } - + public void setTravelRate(int travel) { this.travelrate = travel; } - + public int getTransportationTime(int travelTime) { return (int) Math.ceil(travelTime / travelrate); } - + public int getFishingRate() { return fishingrate; } - + public void setFishingRate(int quest) { this.fishingrate = quest; } - + public void loadAccountCharactersView(Integer accountId, List chars) { SortedMap charsMap = new TreeMap<>(); - for(Character chr : chars) { + for (Character chr : chars) { charsMap.put(chr.getId(), chr); } - + accountCharsLock.lock(); // accountCharsLock should be used after server's lgnWLock for compliance try { accountChars.put(accountId, charsMap); @@ -397,7 +418,7 @@ public class World { accountCharsLock.unlock(); } } - + public void registerAccountCharacterView(Integer accountId, Character chr) { accountCharsLock.lock(); try { @@ -406,7 +427,7 @@ public class World { accountCharsLock.unlock(); } } - + public void unregisterAccountCharacterView(Integer accountId, Integer chrId) { accountCharsLock.lock(); try { @@ -415,7 +436,7 @@ public class World { accountCharsLock.unlock(); } } - + public void clearAccountCharacterView(Integer accountId) { accountCharsLock.lock(); try { @@ -427,13 +448,13 @@ public class World { accountCharsLock.unlock(); } } - + public void loadAccountStorage(Integer accountId) { if (getAccountStorage(accountId) == null) { registerAccountStorage(accountId); } } - + private void registerAccountStorage(Integer accountId) { Storage storage = Storage.loadOrCreateFromDB(accountId, this.id); accountCharsLock.lock(); @@ -443,7 +464,7 @@ public class World { accountCharsLock.unlock(); } } - + public void unregisterAccountStorage(Integer accountId) { accountCharsLock.lock(); try { @@ -452,51 +473,51 @@ public class World { accountCharsLock.unlock(); } } - + public Storage getAccountStorage(Integer accountId) { return accountStorages.get(accountId); } - + private static List>> getSortedAccountCharacterView(Map> map) { List>> list = new ArrayList<>(map.size()); list.addAll(map.entrySet()); - + list.sort((o1, o2) -> o1.getKey() - o2.getKey()); - + return list; } - + public List loadAndGetAllCharactersView() { Server.getInstance().loadAllAccountsCharactersView(); return getAllCharactersView(); } - + public List getAllCharactersView() { // sorting by accountid, charid List chrList = new LinkedList<>(); Map> accChars; - + accountCharsLock.lock(); try { accChars = new HashMap<>(accountChars); } finally { accountCharsLock.unlock(); } - + for (Entry> e : getSortedAccountCharacterView(accChars)) { chrList.addAll(e.getValue().values()); } - + return chrList; } - + public List getAccountCharactersView(Integer accountId) { List chrList; - + accountCharsLock.lock(); try { SortedMap accChars = accountChars.get(accountId); - - if(accChars != null) { + + if (accChars != null) { chrList = new LinkedList<>(accChars.values()); } else { accountChars.put(accountId, new TreeMap<>()); @@ -505,44 +526,44 @@ public class World { } finally { accountCharsLock.unlock(); } - + return chrList; } - + public PlayerStorage getPlayerStorage() { return players; } - + public MatchCheckerCoordinator getMatchCheckerCoordinator() { return matchChecker; } - + public PartySearchCoordinator getPartySearchCoordinator() { return partySearch; } - + public void addPlayer(Character chr) { players.addPlayer(chr); } - + public void removePlayer(Character chr) { Channel cserv = chr.getClient().getChannelServer(); - - if(cserv != null) { - if(!cserv.removePlayer(chr)) { + + if (cserv != null) { + if (!cserv.removePlayer(chr)) { // oy the player is not where they should be, find this mf - for(Channel ch : getChannels()) { - if(ch.removePlayer(chr)) { + for (Channel ch : getChannels()) { + if (ch.removePlayer(chr)) { break; } } } } - + players.removePlayer(chr.getId()); } - + public int getId() { return id; } @@ -554,7 +575,7 @@ public class World { } } } - + public void removeFamily(int id) { synchronized (families) { families.remove(id); @@ -569,16 +590,18 @@ public class World { return null; } } - + public Collection getFamilies() { - synchronized(families) { + synchronized (families) { return Collections.unmodifiableCollection(families.values()); } } public Guild getGuild(GuildCharacter mgc) { - if(mgc == null) return null; - + if (mgc == null) { + return null; + } + int gid = mgc.getGuildId(); Guild g = Server.getInstance().getGuild(gid, mgc.getWorld(), mgc.getCharacter()); if (gsStore.get(gid) == null) { @@ -590,11 +613,11 @@ public class World { public boolean isWorldCapacityFull() { return getWorldCapacityStatus() == 2; } - + public int getWorldCapacityStatus() { int worldCap = getChannelsSize() * YamlConfig.config.server.CHANNEL_LOAD; int num = players.getSize(); - + int status; if (num >= worldCap) { status = 2; @@ -603,10 +626,10 @@ public class World { } else { status = 0; } - + return status; } - + public GuildSummary getGuildSummary(int gid, int wid) { if (gsStore.containsKey(gid)) { return gsStore.get(gid); @@ -668,9 +691,11 @@ public class World { bDifferentGuild = guildid != mc.getGuildId(); mc.getMGC().setGuildId(guildid); mc.getMGC().setGuildRank(rank); - - if(bDifferentGuild) mc.getMGC().setAllianceRank(5); - + + if (bDifferentGuild) { + mc.getMGC().setAllianceRank(5); + } + mc.saveGuildStatus(); } if (bDifferentGuild) { @@ -689,7 +714,7 @@ public class World { public void changeEmblem(int gid, List affectedPlayers, GuildSummary mgs) { updateGuildSummary(gid, mgs); sendPacket(affectedPlayers, GuildPackets.guildEmblemChange(gid, mgs.getLogoBG(), mgs.getLogoBGColor(), mgs.getLogo(), mgs.getLogoColor()), -1); - setGuildAndRank(affectedPlayers, -1, -1, -1); //respawn player + setGuildAndRank(affectedPlayers, -1, -1, -1); //respawn player } public void sendPacket(List targetIds, Packet packet, int exception) { @@ -708,83 +733,85 @@ public class World { public boolean isGuildQueued(int guildId) { return queuedGuilds.contains(guildId); } - + public void putGuildQueued(int guildId) { queuedGuilds.add(guildId); } - + public void removeGuildQueued(int guildId) { queuedGuilds.remove(guildId); } - + public boolean isMarriageQueued(int marriageId) { return queuedMarriages.containsKey(marriageId); } - + public Pair getMarriageQueuedLocation(int marriageId) { Pair, Pair> qm = queuedMarriages.get(marriageId); return (qm != null) ? qm.getLeft() : null; } - + public Pair getMarriageQueuedCouple(int marriageId) { Pair, Pair> qm = queuedMarriages.get(marriageId); return (qm != null) ? qm.getRight() : null; } - + public void putMarriageQueued(int marriageId, boolean cathedral, boolean premium, int groomId, int brideId) { queuedMarriages.put(marriageId, new Pair<>(new Pair<>(cathedral, premium), new Pair<>(groomId, brideId))); marriageGuests.put(marriageId, new HashSet()); } - + public Pair> removeMarriageQueued(int marriageId) { Boolean type = queuedMarriages.remove(marriageId).getLeft().getRight(); Set guests = marriageGuests.remove(marriageId); - + return new Pair<>(type, guests); } - + public boolean addMarriageGuest(int marriageId, int playerId) { Set guests = marriageGuests.get(marriageId); - if(guests != null) { - if(guests.contains(playerId)) return false; - + if (guests != null) { + if (guests.contains(playerId)) { + return false; + } + guests.add(playerId); return true; } - + return false; } - + public Pair getWeddingCoupleForGuest(int guestId, Boolean cathedral) { - for(Channel ch : getChannels()) { + for (Channel ch : getChannels()) { Pair p = ch.getWeddingCoupleForGuest(guestId, cathedral); - if(p != null) { + if (p != null) { return p; } } - + List possibleWeddings = new LinkedList<>(); - for(Entry> mg : new HashSet<>(marriageGuests.entrySet())) { - if(mg.getValue().contains(guestId)) { + for (Entry> mg : new HashSet<>(marriageGuests.entrySet())) { + if (mg.getValue().contains(guestId)) { Pair loc = getMarriageQueuedLocation(mg.getKey()); - if(loc != null && cathedral.equals(loc.getLeft())) { + if (loc != null && cathedral.equals(loc.getLeft())) { possibleWeddings.add(mg.getKey()); } } } - + int pwSize = possibleWeddings.size(); - if(pwSize == 0) { + if (pwSize == 0) { return null; - } else if(pwSize > 1) { + } else if (pwSize > 1) { int selectedPw = -1; int selectedPos = Integer.MAX_VALUE; - - for(Integer pw : possibleWeddings) { - for(Channel ch : getChannels()) { + + for (Integer pw : possibleWeddings) { + for (Channel ch : getChannels()) { int pos = ch.getWeddingReservationStatus(pw, cathedral); - if(pos != -1) { - if(pos < selectedPos) { + if (pos != -1) { + if (pos < selectedPos) { selectedPos = pos; selectedPw = pw; break; @@ -792,21 +819,23 @@ public class World { } } } - - if(selectedPw == -1) return null; - + + if (selectedPw == -1) { + return null; + } + possibleWeddings.clear(); possibleWeddings.add(selectedPw); } - + return getMarriageQueuedCouple(possibleWeddings.get(0)); } - + public void debugMarriageStatus() { System.out.println("Queued marriages: " + queuedMarriages); System.out.println("Guest list: " + marriageGuests); } - + private void registerCharacterParty(Integer chrid, Integer partyid) { partyLock.lock(); try { @@ -815,11 +844,11 @@ public class World { partyLock.unlock(); } } - + private void unregisterCharacterPartyInternal(Integer chrid) { partyChars.remove(chrid); } - + private void unregisterCharacterParty(Integer chrid) { partyLock.lock(); try { @@ -828,7 +857,7 @@ public class World { partyLock.unlock(); } } - + public Integer getCharacterPartyid(Integer chrid) { partyLock.lock(); try { @@ -837,11 +866,11 @@ public class World { partyLock.unlock(); } } - + public Party createParty(PartyCharacter chrfor) { int partyid = runningPartyId.getAndIncrement(); Party party = new Party(partyid, chrfor); - + partyLock.lock(); try { parties.put(party.getId(), party); @@ -849,7 +878,7 @@ public class World { } finally { partyLock.unlock(); } - + party.addMember(chrfor); return party; } @@ -871,18 +900,18 @@ public class World { partyLock.unlock(); } } - + private void updateCharacterParty(Party party, PartyOperation operation, PartyCharacter target, Collection partyMembers) { switch (operation) { case JOIN: registerCharacterParty(target.getId(), party.getId()); break; - + case LEAVE: case EXPEL: unregisterCharacterParty(target.getId()); break; - + case DISBAND: partyLock.lock(); try { @@ -893,16 +922,16 @@ public class World { partyLock.unlock(); } break; - + default: break; } } - + private void updateParty(Party party, PartyOperation operation, PartyCharacter target) { Collection partyMembers = party.getMembers(); updateCharacterParty(party, operation, target, partyMembers); - + for (PartyCharacter partychar : partyMembers) { Character chr = getPlayerStorage().getCharacterById(partychar.getId()); if (chr != null) { @@ -955,7 +984,7 @@ public class World { if (mc != null) { EventInstanceManager eim = mc.getEventInstance(); - if(eim != null && eim.isEventLeader(mc)) { + if (eim != null && eim.isEventLeader(mc)) { eim.changedLeader(target); } else { int oldLeaderMapid = mc.getMapId(); @@ -963,7 +992,7 @@ public class World { if (MiniDungeonInfo.isDungeonMap(oldLeaderMapid)) { if (oldLeaderMapid != target.getMapId()) { MiniDungeon mmd = mc.getClient().getChannelServer().getMiniDungeon(oldLeaderMapid); - if(mmd != null) { + if (mmd != null) { mmd.close(); } } @@ -980,19 +1009,21 @@ public class World { public void removeMapPartyMembers(int partyid) { Party party = getParty(partyid); - if(party == null) return; - - for(PartyCharacter mpc : party.getMembers()) { + if (party == null) { + return; + } + + for (PartyCharacter mpc : party.getMembers()) { Character mc = mpc.getPlayer(); - if(mc != null) { + if (mc != null) { MapleMap map = mc.getMap(); - if(map != null) { + if (map != null) { map.removeParty(partyid); } } } } - + public int find(String name) { int channel = -1; Character chr = getPlayerStorage().getCharacterByName(name); @@ -1082,19 +1113,19 @@ public class World { } public void addMessengerPlayer(Messenger messenger, String namefrom, int fromchannel, int position) { - for (MessengerCharacter messengerchar : messenger.getMembers()) { - Character chr = getPlayerStorage().getCharacterByName(messengerchar.getName()); - if(chr == null){ - continue; - } - if (!messengerchar.getName().equals(namefrom)) { - Character from = getChannel(fromchannel).getPlayerStorage().getCharacterByName(namefrom); - chr.sendPacket(PacketCreator.addMessengerPlayer(namefrom, from, position, (byte) (fromchannel - 1))); - from.sendPacket(PacketCreator.addMessengerPlayer(chr.getName(), chr, messengerchar.getPosition(), (byte) (messengerchar.getChannel() - 1))); - } else { - chr.sendPacket(PacketCreator.joinMessenger(messengerchar.getPosition())); - } - } + for (MessengerCharacter messengerchar : messenger.getMembers()) { + Character chr = getPlayerStorage().getCharacterByName(messengerchar.getName()); + if (chr == null) { + continue; + } + if (!messengerchar.getName().equals(namefrom)) { + Character from = getChannel(fromchannel).getPlayerStorage().getCharacterByName(namefrom); + chr.sendPacket(PacketCreator.addMessengerPlayer(namefrom, from, position, (byte) (fromchannel - 1))); + from.sendPacket(PacketCreator.addMessengerPlayer(chr.getName(), chr, messengerchar.getPosition(), (byte) (messengerchar.getChannel() - 1))); + } else { + chr.sendPacket(PacketCreator.joinMessenger(messengerchar.getPosition())); + } + } } public void removeMessengerPlayer(Messenger messenger, int position) { @@ -1107,22 +1138,22 @@ public class World { } public void messengerChat(Messenger messenger, String chattext, String namefrom) { - String from = ""; - String to1 = ""; - String to2 = ""; + String from = ""; + String to1 = ""; + String to2 = ""; for (MessengerCharacter messengerchar : messenger.getMembers()) { if (!(messengerchar.getName().equals(namefrom))) { Character chr = getPlayerStorage().getCharacterByName(messengerchar.getName()); if (chr != null) { chr.sendPacket(PacketCreator.messengerChat(chattext)); - if (to1.equals("")){ - to1 = messengerchar.getName(); - } else if (to2.equals("")){ - to2 = messengerchar.getName(); - } + if (to1.equals("")) { + to1 = messengerchar.getName(); + } else if (to2.equals("")) { + to2 = messengerchar.getName(); + } } } else { - from = messengerchar.getName(); + from = messengerchar.getName(); } } } @@ -1258,16 +1289,16 @@ public class World { } } } - + private static Integer getPetKey(Character chr, byte petSlot) { // assuming max 3 pets return (chr.getId() << 2) + petSlot; } - + public void addOwlItemSearch(Integer itemid) { suggestWLock.lock(); try { Integer cur = owlSearched.get(itemid); - if(cur != null) { + if (cur != null) { owlSearched.put(itemid, cur + 1); } else { owlSearched.put(itemid, 1); @@ -1276,31 +1307,31 @@ public class World { suggestWLock.unlock(); } } - + public List> getOwlSearchedItems() { - if(YamlConfig.config.server.USE_ENFORCE_ITEM_SUGGESTION) { + if (YamlConfig.config.server.USE_ENFORCE_ITEM_SUGGESTION) { return new ArrayList<>(0); } - + suggestRLock.lock(); try { List> searchCounts = new ArrayList<>(owlSearched.size()); - - for(Entry e : owlSearched.entrySet()) { + + for (Entry e : owlSearched.entrySet()) { searchCounts.add(new Pair<>(e.getKey(), e.getValue())); } - + return searchCounts; } finally { suggestRLock.unlock(); } } - + public void addCashItemBought(Integer snid) { suggestWLock.lock(); try { Map tabItemBought = cashItemBought.get(snid / 10000000); - + Integer cur = tabItemBought.get(snid); if (cur != null) { tabItemBought.put(snid, cur + 1); @@ -1311,39 +1342,39 @@ public class World { suggestWLock.unlock(); } } - + private List>> getBoughtCashItems() { if (YamlConfig.config.server.USE_ENFORCE_ITEM_SUGGESTION) { List>> boughtCounts = new ArrayList<>(9); - + // thanks GabrielSin for pointing out an issue here for (int i = 0; i < 9; i++) { List> tabCounts = new ArrayList<>(0); boughtCounts.add(tabCounts); } - + return boughtCounts; } - + suggestRLock.lock(); try { List>> boughtCounts = new ArrayList<>(cashItemBought.size()); - + for (Map tab : cashItemBought) { List> tabItems = new LinkedList<>(); boughtCounts.add(tabItems); - + for (Entry e : tab.entrySet()) { tabItems.add(new Pair<>(e.getKey(), e.getValue())); } } - + return boughtCounts; } finally { suggestRLock.unlock(); } } - + private List getMostSellerOnTab(List> tabSellers) { List tabLeaderboards; @@ -1354,33 +1385,33 @@ public class World { queue.addAll(tabSellers); tabLeaderboards = new LinkedList<>(); - for(int i = 0; i < Math.min(tabSellers.size(), 5); i++) { + for (int i = 0; i < Math.min(tabSellers.size(), 5); i++) { tabLeaderboards.add(queue.remove().getLeft()); } - + return tabLeaderboards; } - + public List> getMostSellerCashItems() { List>> mostSellers = this.getBoughtCashItems(); List> cashLeaderboards = new ArrayList<>(9); List tabLeaderboards; List allLeaderboards = null; - - for(List> tabSellers : mostSellers) { + + for (List> tabSellers : mostSellers) { if (tabSellers.size() < 5) { if (allLeaderboards == null) { List> allSellers = new LinkedList<>(); for (List> tabItems : mostSellers) { allSellers.addAll(tabItems); } - + allLeaderboards = getMostSellerOnTab(allSellers); } - + tabLeaderboards = new LinkedList<>(); if (allLeaderboards.size() < 5) { - for(int i : GameConstants.CASH_DATA) { + for (int i : GameConstants.CASH_DATA) { tabLeaderboards.add(i); } } else { @@ -1389,35 +1420,38 @@ public class World { } else { tabLeaderboards = getMostSellerOnTab(tabSellers); } - + cashLeaderboards.add(tabLeaderboards); } - + return cashLeaderboards; } - + public void registerPetHunger(Character chr, byte petSlot) { - if(chr.isGM() && YamlConfig.config.server.GM_PETS_NEVER_HUNGRY || YamlConfig.config.server.PETS_NEVER_HUNGRY) { + if (chr.isGM() && YamlConfig.config.server.GM_PETS_NEVER_HUNGRY || YamlConfig.config.server.PETS_NEVER_HUNGRY) { return; } - + Integer key = getPetKey(chr, petSlot); - + activePetsLock.lock(); try { int initProc; - if(Server.getInstance().getCurrentTime() - petUpdate > 55000) initProc = YamlConfig.config.server.PET_EXHAUST_COUNT - 2; - else initProc = YamlConfig.config.server.PET_EXHAUST_COUNT - 1; - + if (Server.getInstance().getCurrentTime() - petUpdate > 55000) { + initProc = YamlConfig.config.server.PET_EXHAUST_COUNT - 2; + } else { + initProc = YamlConfig.config.server.PET_EXHAUST_COUNT - 1; + } + activePets.put(key, initProc); } finally { activePetsLock.unlock(); } } - + public void unregisterPetHunger(Character chr, byte petSlot) { Integer key = getPetKey(chr, petSlot); - + activePetsLock.lock(); try { activePets.remove(key); @@ -1425,10 +1459,10 @@ public class World { activePetsLock.unlock(); } } - + public void runPetSchedule() { Map deployedPets; - + activePetsLock.lock(); try { petUpdate = Server.getInstance().getCurrentTime(); @@ -1436,17 +1470,19 @@ public class World { } finally { activePetsLock.unlock(); } - - for(Map.Entry dp: deployedPets.entrySet()) { + + for (Map.Entry dp : deployedPets.entrySet()) { Character chr = this.getPlayerStorage().getCharacterById(dp.getKey() / 4); - if(chr == null || !chr.isLoggedinWorld()) continue; - + if (chr == null || !chr.isLoggedinWorld()) { + continue; + } + int dpVal = dp.getValue() + 1; - if(dpVal == YamlConfig.config.server.PET_EXHAUST_COUNT) { + if (dpVal == YamlConfig.config.server.PET_EXHAUST_COUNT) { chr.runFullnessSchedule(dp.getKey() % 4); dpVal = 0; } - + activePetsLock.lock(); try { activePets.put(dp.getKey(), dpVal); @@ -1455,28 +1491,31 @@ public class World { } } } - + public void registerMountHunger(Character chr) { - if(chr.isGM() && YamlConfig.config.server.GM_PETS_NEVER_HUNGRY || YamlConfig.config.server.PETS_NEVER_HUNGRY) { + if (chr.isGM() && YamlConfig.config.server.GM_PETS_NEVER_HUNGRY || YamlConfig.config.server.PETS_NEVER_HUNGRY) { return; } - + Integer key = chr.getId(); activeMountsLock.lock(); try { int initProc; - if(Server.getInstance().getCurrentTime() - mountUpdate > 45000) initProc = YamlConfig.config.server.MOUNT_EXHAUST_COUNT - 2; - else initProc = YamlConfig.config.server.MOUNT_EXHAUST_COUNT - 1; - + if (Server.getInstance().getCurrentTime() - mountUpdate > 45000) { + initProc = YamlConfig.config.server.MOUNT_EXHAUST_COUNT - 2; + } else { + initProc = YamlConfig.config.server.MOUNT_EXHAUST_COUNT - 1; + } + activeMounts.put(key, initProc); } finally { activeMountsLock.unlock(); } } - + public void unregisterMountHunger(Character chr) { Integer key = chr.getId(); - + activeMountsLock.lock(); try { activeMounts.remove(key); @@ -1484,7 +1523,7 @@ public class World { activeMountsLock.unlock(); } } - + public void runMountSchedule() { Map deployedMounts; activeMountsLock.lock(); @@ -1494,19 +1533,21 @@ public class World { } finally { activeMountsLock.unlock(); } - - for(Map.Entry dp: deployedMounts.entrySet()) { + + for (Map.Entry dp : deployedMounts.entrySet()) { Character chr = this.getPlayerStorage().getCharacterById(dp.getKey()); - if(chr == null || !chr.isLoggedinWorld()) continue; - + if (chr == null || !chr.isLoggedinWorld()) { + continue; + } + int dpVal = dp.getValue() + 1; - if(dpVal == YamlConfig.config.server.MOUNT_EXHAUST_COUNT) { + if (dpVal == YamlConfig.config.server.MOUNT_EXHAUST_COUNT) { if (!chr.runTirednessSchedule()) { continue; } dpVal = 0; } - + activeMountsLock.lock(); try { activeMounts.put(dp.getKey(), dpVal); @@ -1515,7 +1556,7 @@ public class World { } } } - + public void registerPlayerShop(PlayerShop ps) { activePlayerShopsLock.lock(); try { @@ -1524,7 +1565,7 @@ public class World { activePlayerShopsLock.unlock(); } } - + public void unregisterPlayerShop(PlayerShop ps) { activePlayerShopsLock.lock(); try { @@ -1533,19 +1574,19 @@ public class World { activePlayerShopsLock.unlock(); } } - + public List getActivePlayerShops() { List psList = new ArrayList<>(); activePlayerShopsLock.lock(); try { psList.addAll(activePlayerShops.values()); - + return psList; } finally { activePlayerShopsLock.unlock(); } } - + public PlayerShop getPlayerShop(int ownerid) { activePlayerShopsLock.lock(); try { @@ -1554,20 +1595,23 @@ public class World { activePlayerShopsLock.unlock(); } } - + public void registerHiredMerchant(HiredMerchant hm) { activeMerchantsLock.lock(); try { int initProc; - if(Server.getInstance().getCurrentTime() - merchantUpdate > 5 * 60 * 1000) initProc = 1; - else initProc = 0; - + if (Server.getInstance().getCurrentTime() - merchantUpdate > 5 * 60 * 1000) { + initProc = 1; + } else { + initProc = 0; + } + activeMerchants.put(hm.getOwnerId(), new Pair<>(hm, initProc)); } finally { activeMerchantsLock.unlock(); } } - + public void unregisterHiredMerchant(HiredMerchant hm) { activeMerchantsLock.lock(); try { @@ -1576,19 +1620,19 @@ public class World { activeMerchantsLock.unlock(); } } - + public void runHiredMerchantSchedule() { Map> deployedMerchants; activeMerchantsLock.lock(); try { merchantUpdate = Server.getInstance().getCurrentTime(); deployedMerchants = new LinkedHashMap<>(activeMerchants); - - for(Map.Entry> dm: deployedMerchants.entrySet()) { + + for (Map.Entry> dm : deployedMerchants.entrySet()) { int timeOn = dm.getValue().getRight(); HiredMerchant hm = dm.getValue().getLeft(); - - if(timeOn <= 144) { // 1440 minutes == 24hrs + + if (timeOn <= 144) { // 1440 minutes == 24hrs activeMerchants.put(hm.getOwnerId(), new Pair<>(dm.getValue().getLeft(), timeOn + 1)); } else { hm.forceClose(); @@ -1601,37 +1645,37 @@ public class World { activeMerchantsLock.unlock(); } } - + public List getActiveMerchants() { List hmList = new ArrayList<>(); activeMerchantsLock.lock(); try { - for(Pair hmp : activeMerchants.values()) { + for (Pair hmp : activeMerchants.values()) { HiredMerchant hm = hmp.getLeft(); - if(hm.isOpen()) { + if (hm.isOpen()) { hmList.add(hm); } } - + return hmList; } finally { activeMerchantsLock.unlock(); } } - + public HiredMerchant getHiredMerchant(int ownerid) { activeMerchantsLock.lock(); try { - if(activeMerchants.containsKey(ownerid)) { + if (activeMerchants.containsKey(ownerid)) { return activeMerchants.get(ownerid).getLeft(); } - + return null; } finally { activeMerchantsLock.unlock(); } } - + public void registerTimedMapObject(Runnable r, long duration) { timedMapObjectLock.lock(); try { @@ -1641,32 +1685,32 @@ public class World { timedMapObjectLock.unlock(); } } - + public void runTimedMapObjectSchedule() { List toRemove = new LinkedList<>(); - + timedMapObjectLock.lock(); try { long timeNow = Server.getInstance().getCurrentTime(); - - for(Entry rtmo : registeredTimedMapObjects.entrySet()) { - if(rtmo.getValue() <= timeNow) { + + for (Entry rtmo : registeredTimedMapObjects.entrySet()) { + if (rtmo.getValue() <= timeNow) { toRemove.add(rtmo.getKey()); } } - - for(Runnable r : toRemove) { + + for (Runnable r : toRemove) { registeredTimedMapObjects.remove(r); } } finally { timedMapObjectLock.unlock(); } - - for(Runnable r : toRemove) { + + for (Runnable r : toRemove) { r.run(); } } - + public void resetDisabledServerMessages() { srvMessagesLock.lock(); try { @@ -1675,19 +1719,19 @@ public class World { srvMessagesLock.unlock(); } } - + public boolean registerDisabledServerMessage(int chrid) { srvMessagesLock.lock(); try { boolean alreadyDisabled = disabledServerMessages.containsKey(chrid); disabledServerMessages.put(chrid, 0); - + return alreadyDisabled; } finally { srvMessagesLock.unlock(); } } - + public boolean unregisterDisabledServerMessage(int chrid) { srvMessagesLock.lock(); try { @@ -1696,51 +1740,51 @@ public class World { srvMessagesLock.unlock(); } } - + public void runDisabledServerMessagesSchedule() { List toRemove = new LinkedList<>(); - + srvMessagesLock.lock(); try { - for(Entry dsm : disabledServerMessages.entrySet()) { + for (Entry dsm : disabledServerMessages.entrySet()) { int b = dsm.getValue(); - if(b >= 4) { // ~35sec duration, 10sec update + if (b >= 4) { // ~35sec duration, 10sec update toRemove.add(dsm.getKey()); } else { disabledServerMessages.put(dsm.getKey(), ++b); } } - - for(Integer chrid : toRemove) { + + for (Integer chrid : toRemove) { disabledServerMessages.remove(chrid); } } finally { srvMessagesLock.unlock(); } - - if(!toRemove.isEmpty()) { - for(Integer chrid : toRemove) { + + if (!toRemove.isEmpty()) { + for (Integer chrid : toRemove) { Character chr = players.getCharacterById(chrid); - if(chr != null && chr.isLoggedinWorld()) { + if (chr != null && chr.isLoggedinWorld()) { chr.sendPacket(PacketCreator.serverMessage(chr.getClient().getChannelServer().getServerMessage())); } } } } - + public void setPlayerNpcMapStep(int mapid, int step) { setPlayerNpcMapData(mapid, step, -1, false); } - + public void setPlayerNpcMapPodiumData(int mapid, int podium) { setPlayerNpcMapData(mapid, -1, podium, false); } - + public void setPlayerNpcMapData(int mapid, int step, int podium) { setPlayerNpcMapData(mapid, step, podium, true); } - + private static void executePlayerNpcMapDataUpdate(Connection con, boolean isPodium, Map pnpcData, int value, int worldid, int mapid) throws SQLException { final String query; if (pnpcData.containsKey(mapid)) { @@ -1756,7 +1800,7 @@ public class World { ps.executeUpdate(); } } - + private void setPlayerNpcMapData(int mapid, int step, int podium, boolean silent) { if (!silent) { try (Connection con = DatabaseConnection.getConnection()) { @@ -1779,7 +1823,7 @@ public class World { pnpcPodium.put(mapid, (short) podium); } } - + public int getPlayerNpcMapStep(int mapid) { try { return pnpcStep.get(mapid); @@ -1787,7 +1831,7 @@ public class World { return 0; } } - + public int getPlayerNpcMapPodiumData(int mapid) { try { return pnpcPodium.get(mapid); @@ -1795,12 +1839,12 @@ public class World { return 1; } } - + public void resetPlayerNpcMapData() { pnpcStep.clear(); pnpcPodium.clear(); } - + public void setServerMessage(String msg) { for (Channel ch : getChannels()) { ch.setServerMessage(msg); @@ -1819,7 +1863,7 @@ public class World { for (HiredMerchant hm : getActiveMerchants()) { List itemBundles = hm.sendAvailableBundles(itemid); - for(PlayerShopItem mpsi : itemBundles) { + for (PlayerShopItem mpsi : itemBundles) { hmsAvailable.add(new Pair<>(mpsi, hm)); } } @@ -1827,7 +1871,7 @@ public class World { for (PlayerShop ps : getActivePlayerShops()) { List itemBundles = ps.sendAvailableBundles(itemid); - for(PlayerShopItem mpsi : itemBundles) { + for (PlayerShopItem mpsi : itemBundles) { hmsAvailable.add(new Pair<>(mpsi, ps)); } } @@ -1837,42 +1881,46 @@ public class World { hmsAvailable.subList(0, Math.min(hmsAvailable.size(), 200)); //truncates the list to have up to 200 elements return hmsAvailable; } - + private void pushRelationshipCouple(Pair> couple) { int mid = couple.getLeft(), hid = couple.getRight().getLeft(), wid = couple.getRight().getRight(); relationshipCouples.put(mid, couple.getRight()); relationships.put(hid, mid); relationships.put(wid, mid); } - + public Pair getRelationshipCouple(int relationshipId) { Pair rc = relationshipCouples.get(relationshipId); - - if(rc == null) { + + if (rc == null) { Pair> couple = getRelationshipCoupleFromDb(relationshipId, true); - if(couple == null) return null; - + if (couple == null) { + return null; + } + pushRelationshipCouple(couple); rc = couple.getRight(); } - + return rc; } - + public int getRelationshipId(int playerId) { Integer ret = relationships.get(playerId); - - if(ret == null) { + + if (ret == null) { Pair> couple = getRelationshipCoupleFromDb(playerId, false); - if(couple == null) return -1; - + if (couple == null) { + return -1; + } + pushRelationshipCouple(couple); ret = couple.getLeft(); } - + return ret; } - + private static Pair> getRelationshipCoupleFromDb(int id, boolean usingMarriageId) { try (Connection con = DatabaseConnection.getConnection()) { Integer mid = null, hid = null, wid = null; @@ -1903,14 +1951,14 @@ public class World { return null; } } - + public int createRelationship(int groomId, int brideId) { int ret = addRelationshipToDb(groomId, brideId); - + pushRelationshipCouple(new Pair<>(ret, new Pair<>(groomId, brideId))); return ret; } - + private static int addRelationshipToDb(int groomId, int brideId) { try (Connection con = DatabaseConnection.getConnection(); PreparedStatement ps = con.prepareStatement("INSERT INTO marriages (husbandid, wifeid) VALUES (?, ?)", Statement.RETURN_GENERATED_KEYS)) { @@ -1928,16 +1976,16 @@ public class World { return -1; } } - + public void deleteRelationship(int playerId, int partnerId) { int relationshipId = relationships.get(playerId); deleteRelationshipFromDb(relationshipId); - + relationshipCouples.remove(relationshipId); relationships.remove(playerId); relationships.remove(partnerId); } - + private static void deleteRelationshipFromDb(int playerId) { try (Connection con = DatabaseConnection.getConnection(); PreparedStatement ps = con.prepareStatement("DELETE FROM marriages WHERE marriageid = ?")) { @@ -1947,13 +1995,13 @@ public class World { se.printStackTrace(); } } - + public void dropMessage(int type, String message) { for (Character player : getPlayerStorage().getAllCharacters()) { player.dropMessage(type, message); } } - + public boolean registerFisherPlayer(Character chr, int baitLevel) { synchronized (fishingAttempters) { if (fishingAttempters.containsKey(chr)) { @@ -1964,7 +2012,7 @@ public class World { return true; } } - + public int unregisterFisherPlayer(Character chr) { Integer baitLevel = fishingAttempters.remove(chr); if (baitLevel != null) { @@ -1973,38 +2021,38 @@ public class World { return 0; } } - + public void runCheckFishingSchedule() { double[] fishingLikelihoods = Fishing.fetchFishingLikelihood(); double yearLikelihood = fishingLikelihoods[0], timeLikelihood = fishingLikelihoods[1]; - + if (!fishingAttempters.isEmpty()) { List fishingAttemptersList; - + synchronized (fishingAttempters) { fishingAttemptersList = new ArrayList<>(fishingAttempters.keySet()); } - + for (Character chr : fishingAttemptersList) { int baitLevel = unregisterFisherPlayer(chr); Fishing.doFishing(chr, baitLevel, yearLikelihood, timeLikelihood); } } } - + public void runPartySearchUpdateSchedule() { partySearch.updatePartySearchStorage(); partySearch.runPartySearch(); } - + public BaseService getServiceAccess(WorldServices sv) { return services.getAccess(sv).getService(); } - + private void closeWorldServices() { services.shutdown(); } - + private void clearWorldData() { List pList; partyLock.lock(); @@ -2013,19 +2061,19 @@ public class World { } finally { partyLock.unlock(); } - - for(Party p : pList) { + + for (Party p : pList) { p.disposeLocks(); } - + closeWorldServices(); disposeLocks(); } - + private void disposeLocks() { LockCollector.getInstance().registerDisposeAction(() -> emptyLocks()); } - + private void emptyLocks() { accountCharsLock = accountCharsLock.dispose(); partyLock = partyLock.dispose(); @@ -2036,70 +2084,70 @@ public class World { activeMerchantsLock = activeMerchantsLock.dispose(); timedMapObjectLock = timedMapObjectLock.dispose(); } - + public final void shutdown() { for (Channel ch : getChannels()) { ch.shutdown(); } - - if(petsSchedule != null) { + + if (petsSchedule != null) { petsSchedule.cancel(false); petsSchedule = null; } - - if(srvMessagesSchedule != null) { + + if (srvMessagesSchedule != null) { srvMessagesSchedule.cancel(false); srvMessagesSchedule = null; } - - if(mountsSchedule != null) { + + if (mountsSchedule != null) { mountsSchedule.cancel(false); mountsSchedule = null; } - - if(merchantSchedule != null) { + + if (merchantSchedule != null) { merchantSchedule.cancel(false); merchantSchedule = null; } - - if(timedMapObjectsSchedule != null) { + + if (timedMapObjectsSchedule != null) { timedMapObjectsSchedule.cancel(false); timedMapObjectsSchedule = null; } - - if(charactersSchedule != null) { + + if (charactersSchedule != null) { charactersSchedule.cancel(false); charactersSchedule = null; } - - if(marriagesSchedule != null) { + + if (marriagesSchedule != null) { marriagesSchedule.cancel(false); marriagesSchedule = null; } - - if(mapOwnershipSchedule != null) { + + if (mapOwnershipSchedule != null) { mapOwnershipSchedule.cancel(false); mapOwnershipSchedule = null; } - - if(fishingSchedule != null) { + + if (fishingSchedule != null) { fishingSchedule.cancel(false); fishingSchedule = null; } - - if(partySearchSchedule != null) { + + if (partySearchSchedule != null) { partySearchSchedule.cancel(false); partySearchSchedule = null; } - - if(timeoutSchedule != null) { + + if (timeoutSchedule != null) { timeoutSchedule.cancel(false); timeoutSchedule = null; } - + players.disconnectAll(); players = null; - + clearWorldData(); System.out.println("Finished shutting down world " + id + "\r\n"); }