/* * This file is part of the L2J Mobius project. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package com.l2jmobius.gameserver.network; import java.nio.ByteBuffer; import java.util.logging.Logger; import com.l2jmobius.Config; import com.l2jmobius.commons.mmocore.IClientFactory; import com.l2jmobius.commons.mmocore.IMMOExecutor; import com.l2jmobius.commons.mmocore.IPacketHandler; import com.l2jmobius.commons.mmocore.MMOConnection; import com.l2jmobius.commons.mmocore.ReceivablePacket; import com.l2jmobius.gameserver.network.L2GameClient.GameClientState; import com.l2jmobius.gameserver.network.clientpackets.*; import com.l2jmobius.gameserver.network.clientpackets.adenadistribution.RequestDivideAdena; import com.l2jmobius.gameserver.network.clientpackets.adenadistribution.RequestDivideAdenaCancel; import com.l2jmobius.gameserver.network.clientpackets.adenadistribution.RequestDivideAdenaStart; import com.l2jmobius.gameserver.network.clientpackets.alchemy.RequestAlchemyConversion; import com.l2jmobius.gameserver.network.clientpackets.alchemy.RequestAlchemySkillList; import com.l2jmobius.gameserver.network.clientpackets.alchemy.RequestAlchemyTryMixCube; import com.l2jmobius.gameserver.network.clientpackets.appearance.RequestExCancelShape_Shifting_Item; import com.l2jmobius.gameserver.network.clientpackets.appearance.RequestExTryToPutShapeShiftingEnchantSupportItem; import com.l2jmobius.gameserver.network.clientpackets.appearance.RequestExTryToPutShapeShiftingTargetItem; import com.l2jmobius.gameserver.network.clientpackets.appearance.RequestShapeShiftingItem; import com.l2jmobius.gameserver.network.clientpackets.commission.RequestCommissionBuyInfo; import com.l2jmobius.gameserver.network.clientpackets.commission.RequestCommissionBuyItem; import com.l2jmobius.gameserver.network.clientpackets.commission.RequestCommissionCancel; import com.l2jmobius.gameserver.network.clientpackets.commission.RequestCommissionDelete; import com.l2jmobius.gameserver.network.clientpackets.commission.RequestCommissionInfo; import com.l2jmobius.gameserver.network.clientpackets.commission.RequestCommissionList; import com.l2jmobius.gameserver.network.clientpackets.commission.RequestCommissionRegister; import com.l2jmobius.gameserver.network.clientpackets.commission.RequestCommissionRegisteredItem; import com.l2jmobius.gameserver.network.clientpackets.commission.RequestCommissionRegistrableItemList; import com.l2jmobius.gameserver.network.clientpackets.compound.RequestNewEnchantClose; import com.l2jmobius.gameserver.network.clientpackets.compound.RequestNewEnchantPushOne; import com.l2jmobius.gameserver.network.clientpackets.compound.RequestNewEnchantPushTwo; import com.l2jmobius.gameserver.network.clientpackets.compound.RequestNewEnchantRemoveOne; import com.l2jmobius.gameserver.network.clientpackets.compound.RequestNewEnchantRemoveTwo; import com.l2jmobius.gameserver.network.clientpackets.compound.RequestNewEnchantTry; import com.l2jmobius.gameserver.network.clientpackets.crystalization.RequestCrystallizeEstimate; import com.l2jmobius.gameserver.network.clientpackets.crystalization.RequestCrystallizeItemCancel; import com.l2jmobius.gameserver.network.clientpackets.dailymission.RequestOneDayRewardReceive; import com.l2jmobius.gameserver.network.clientpackets.dailymission.RequestTodoList; import com.l2jmobius.gameserver.network.clientpackets.dailymission.RequestTodoListHTML; import com.l2jmobius.gameserver.network.clientpackets.ensoul.RequestItemEnsoul; import com.l2jmobius.gameserver.network.clientpackets.friend.RequestAnswerFriendInvite; import com.l2jmobius.gameserver.network.clientpackets.friend.RequestFriendDel; import com.l2jmobius.gameserver.network.clientpackets.friend.RequestFriendDetailInfo; import com.l2jmobius.gameserver.network.clientpackets.friend.RequestFriendInvite; import com.l2jmobius.gameserver.network.clientpackets.friend.RequestFriendList; import com.l2jmobius.gameserver.network.clientpackets.friend.RequestSendFriendMsg; import com.l2jmobius.gameserver.network.clientpackets.friend.RequestUpdateBlockMemo; import com.l2jmobius.gameserver.network.clientpackets.friend.RequestUpdateFriendMemo; import com.l2jmobius.gameserver.network.clientpackets.luckygame.RequestLuckyGamePlay; import com.l2jmobius.gameserver.network.clientpackets.mentoring.ConfirmMenteeAdd; import com.l2jmobius.gameserver.network.clientpackets.mentoring.RequestMenteeAdd; import com.l2jmobius.gameserver.network.clientpackets.mentoring.RequestMenteeWaitingList; import com.l2jmobius.gameserver.network.clientpackets.mentoring.RequestMentorCancel; import com.l2jmobius.gameserver.network.clientpackets.mentoring.RequestMentorList; import com.l2jmobius.gameserver.network.clientpackets.primeshop.RequestBRBuyProduct; import com.l2jmobius.gameserver.network.clientpackets.primeshop.RequestBRGamePoint; import com.l2jmobius.gameserver.network.clientpackets.primeshop.RequestBRProductInfo; import com.l2jmobius.gameserver.network.clientpackets.primeshop.RequestBRProductList; import com.l2jmobius.gameserver.network.clientpackets.primeshop.RequestBRRecentProductList; import com.l2jmobius.gameserver.network.clientpackets.shuttle.CannotMoveAnymoreInShuttle; import com.l2jmobius.gameserver.network.clientpackets.shuttle.MoveToLocationInShuttle; import com.l2jmobius.gameserver.network.clientpackets.shuttle.RequestShuttleGetOff; import com.l2jmobius.gameserver.network.clientpackets.shuttle.RequestShuttleGetOn; import com.l2jmobius.util.Util; /** * Stateful Packet Handler
* The Stateful approach prevents the server from handling inconsistent packets, examples:
* * Note: If for a given exception a packet needs to be handled on more then one state, then it should be added to all these states. * @author KenM */ public final class L2GamePacketHandler implements IPacketHandler, IClientFactory, IMMOExecutor { private static final Logger _log = Logger.getLogger(L2GamePacketHandler.class.getName()); // implementation @Override public ReceivablePacket handlePacket(ByteBuffer buf, L2GameClient client) { if (client.dropPacket()) { return null; } final int opcode = buf.get() & 0xFF; ReceivablePacket msg = null; final GameClientState state = client.getState(); switch (state) { case CONNECTED: { switch (opcode) { case 0x0e: { msg = new ProtocolVersion(); break; } case 0x2b: { msg = new AuthLogin(); break; } default: { printDebug(opcode, buf, state, client); break; } } break; } case AUTHED: { switch (opcode) { case 0x00: { msg = new Logout(); break; } case 0x0c: { msg = new CharacterCreate(); break; } case 0x0d: { msg = new CharacterDelete(); break; } case 0x12: { msg = new CharacterSelect(); break; } case 0x13: { msg = new NewCharacter(); break; } case 0x7b: { msg = new CharacterRestore(); break; } case 0xd0: { int id2 = -1; if (buf.remaining() >= 2) { id2 = buf.getShort() & 0xffff; } else { if (Config.PACKET_HANDLER_DEBUG) { _log.warning("Client: " + client.toString() + " sent a 0xd0 without the second opcode."); } break; } switch (id2) { case 0x33: { msg = new RequestGotoLobby(); break; } case 0xA6: { msg = new RequestEx2ndPasswordCheck(); break; } case 0xA7: { msg = new RequestEx2ndPasswordVerify(); break; } case 0xA8: { msg = new RequestEx2ndPasswordReq(); break; } case 0xA9: { msg = new RequestCharacterNameCreatable(); break; } default: { printDebugDoubleOpcode(opcode, id2, buf, state, client); } } break; } default: { printDebug(opcode, buf, state, client); break; } } break; } case IN_GAME: { switch (opcode) { case 0x00: { msg = new Logout(); break; } case 0x01: { msg = new Attack(); break; } case 0x03: { msg = new RequestStartPledgeWar(); break; } case 0x04: { msg = new RequestReplyStartPledgeWar(); break; } case 0x05: { msg = new RequestStopPledgeWar(); break; } case 0x06: // RequestSCCheck { msg = new RequestReplyStopPledgeWar(); break; } case 0x07: { msg = new RequestSurrenderPledgeWar(); break; } case 0x08: { msg = new RequestReplySurrenderPledgeWar(); break; } case 0x09: { msg = new RequestSetPledgeCrest(); break; } case 0x0b: { msg = new RequestGiveNickName(); break; } case 0x0f: { msg = new MoveBackwardToLocation(); break; } case 0x10: { // Say break; } case 0x11: { msg = new EnterWorld(); break; } case 0x12: { // CharacterSelect, in case of player spam clicks on loginscreen break; } case 0x14: { msg = new RequestItemList(); break; } case 0x15: { // RequestEquipItem client.handleCheat("Used obsolete RequestEquipItem packet!"); break; } case 0x16: { msg = new RequestUnEquipItem(); break; } case 0x17: { msg = new RequestDropItem(); break; } case 0x19: { msg = new UseItem(); break; } case 0x1a: { msg = new TradeRequest(); break; } case 0x1b: { msg = new AddTradeItem(); break; } case 0x1c: { msg = new TradeDone(); break; } case 0x1f: { msg = new Action(); break; } case 0x22: { msg = new RequestLinkHtml(); break; } case 0x23: { msg = new RequestBypassToServer(); break; } case 0x24: { msg = new RequestBBSwrite(); break; } case 0x25: { // RequestCreatePledge break; } case 0x26: { msg = new RequestJoinPledge(); break; } case 0x27: { msg = new RequestAnswerJoinPledge(); break; } case 0x28: { msg = new RequestWithdrawalPledge(); break; } case 0x29: { msg = new RequestOustPledgeMember(); break; } case 0x2c: { msg = new RequestGetItemFromPet(); break; } case 0x2e: { msg = new RequestAllyInfo(); break; } case 0x2f: { msg = new RequestCrystallizeItem(); break; } case 0x30: { msg = new RequestPrivateStoreManageSell(); break; } case 0x31: { msg = new SetPrivateStoreListSell(); break; } case 0x32: { msg = new AttackRequest(); break; } case 0x33: { // RequestTeleportPacket break; } case 0x34: { // msg = new RequestSocialAction(); client.handleCheat("Used obsolete RequestSocialAction packet"); break; } case 0x35: { // msg = new ChangeMoveType2(); client.handleCheat("Used obsolete ChangeMoveType packet"); break; } case 0x36: { // msg = new ChangeWaitType2(); client.handleCheat("Used obsolete ChangeWaitType packet"); break; } case 0x37: { msg = new RequestSellItem(); break; } case 0x38: { // RequestMagicSkillList break; } case 0x39: { msg = new RequestMagicSkillUse(); break; } case 0x3a: // SendApperingPacket { msg = new Appearing(); break; } case 0x3b: { if (Config.ALLOW_WAREHOUSE) { msg = new SendWareHouseDepositList(); } break; } case 0x3c: { msg = new SendWareHouseWithDrawList(); break; } case 0x3d: { msg = new RequestShortCutReg(); break; } case 0x3f: { msg = new RequestShortCutDel(); break; } case 0x40: { msg = new RequestBuyItem(); break; } case 0x41: { // RequestDismissPledge break; } case 0x42: { msg = new RequestJoinParty(); break; } case 0x43: { msg = new RequestAnswerJoinParty(); break; } case 0x44: { msg = new RequestWithDrawalParty(); break; } case 0x45: { msg = new RequestOustPartyMember(); break; } case 0x46: { // RequestDismissParty break; } case 0x47: { msg = new CannotMoveAnymore(); break; } case 0x48: { msg = new RequestTargetCanceld(); break; } case 0x49: { msg = new Say2(); break; } case 0x4a: { int id_2 = -1; if (buf.remaining() >= 2) { id_2 = buf.getShort() & 0xffff; } else { if (Config.PACKET_HANDLER_DEBUG) { _log.warning("Client: " + client.toString() + " sent a 0x4a without the second opcode."); } break; } switch (id_2) { case 0x00: { // SuperCmdCharacterInfo break; } case 0x01: { // SuperCmdSummonCmd break; } case 0x02: { // SuperCmdServerStatus break; } case 0x03: { // SendL2ParamSetting break; } default: { printDebugDoubleOpcode(opcode, id_2, buf, state, client); break; } } break; } case 0x4d: { msg = new RequestPledgeMemberList(); break; } case 0x4f: { // RequestMagicList break; } case 0x50: { msg = new RequestSkillList(); break; } case 0x52: { msg = new MoveWithDelta(); break; } case 0x53: { msg = new RequestGetOnVehicle(); break; } case 0x54: { msg = new RequestGetOffVehicle(); break; } case 0x55: { msg = new AnswerTradeRequest(); break; } case 0x56: { msg = new RequestActionUse(); break; } case 0x57: { msg = new RequestRestart(); break; } case 0x58: { msg = new RequestSiegeInfo(); break; } case 0x59: { msg = new ValidatePosition(); break; } case 0x5a: { // RequestSEKCustom break; } case 0x5b: { msg = new StartRotating(); break; } case 0x5c: { msg = new FinishRotating(); break; } case 0x5e: { msg = new RequestShowBoard(); break; } case 0x5f: { msg = new RequestEnchantItem(); break; } case 0x60: { msg = new RequestDestroyItem(); break; } case 0x62: { msg = new RequestQuestList(); break; } case 0x63: { // RequestDestroyQuest msg = new RequestQuestAbort(); break; } case 0x65: { msg = new RequestPledgeInfo(); break; } case 0x66: { msg = new RequestPledgeExtendedInfo(); break; } case 0x67: { msg = new RequestPledgeCrest(); break; } case 0x6a: { // New Request Friend List break; } case 0x6b: { // RequestSendL2FriendSay msg = new RequestSendFriendMsg(); break; } case 0x6c: { msg = new RequestShowMiniMap(); break; } case 0x6d: { // RequestSendMsnChatLog break; } case 0x6e: { // RequestReload msg = new RequestRecordInfo(); break; } case 0x6f: { msg = new RequestHennaEquip(); break; } case 0x70: { msg = new RequestHennaRemoveList(); break; } case 0x71: { msg = new RequestHennaItemRemoveInfo(); break; } case 0x72: { msg = new RequestHennaRemove(); break; } case 0x73: { msg = new RequestAcquireSkillInfo(); break; } case 0x74: { msg = new SendBypassBuildCmd(); break; } case 0x75: { msg = new RequestMoveToLocationInVehicle(); break; } case 0x76: { msg = new CannotMoveAnymoreInVehicle(); break; } case 0x77: { msg = new RequestFriendInvite(); break; } case 0x78: { msg = new RequestAnswerFriendInvite(); break; } case 0x79: { msg = new RequestFriendList(); break; } case 0x7a: { msg = new RequestFriendDel(); break; } case 0x7c: { msg = new RequestAcquireSkill(); break; } case 0x7d: { msg = new RequestRestartPoint(); break; } case 0x7e: { msg = new RequestGMCommand(); break; } case 0x7f: { msg = new RequestPartyMatchConfig(); break; } case 0x80: { msg = new RequestPartyMatchList(); break; } case 0x81: { msg = new RequestPartyMatchDetail(); break; } case 0x83: { // SendPrivateStoreBuyList msg = new RequestPrivateStoreBuy(); break; } case 0x85: { msg = new RequestTutorialLinkHtml(); break; } case 0x86: { msg = new RequestTutorialPassCmdToServer(); break; } case 0x87: { msg = new RequestTutorialQuestionMark(); break; } case 0x88: { msg = new RequestTutorialClientEvent(); break; } case 0x89: { msg = new RequestPetition(); break; } case 0x8a: { msg = new RequestPetitionCancel(); break; } case 0x8b: { msg = new RequestGmList(); break; } case 0x8c: { msg = new RequestJoinAlly(); break; } case 0x8d: { msg = new RequestAnswerJoinAlly(); break; } case 0x8e: { // RequestWithdrawAlly msg = new AllyLeave(); break; } case 0x8f: { // RequestOustAlly msg = new AllyDismiss(); break; } case 0x90: { msg = new RequestDismissAlly(); break; } case 0x91: { msg = new RequestSetAllyCrest(); break; } case 0x92: { msg = new RequestAllyCrest(); break; } case 0x93: { msg = new RequestChangePetName(); break; } case 0x94: { msg = new RequestPetUseItem(); break; } case 0x95: { msg = new RequestGiveItemToPet(); break; } case 0x96: { msg = new RequestPrivateStoreQuitSell(); break; } case 0x97: { msg = new SetPrivateStoreMsgSell(); break; } case 0x98: { msg = new RequestPetGetItem(); break; } case 0x99: { msg = new RequestPrivateStoreManageBuy(); break; } case 0x9a: { // SetPrivateStoreList msg = new SetPrivateStoreListBuy(); break; } case 0x9c: { msg = new RequestPrivateStoreQuitBuy(); break; } case 0x9d: { msg = new SetPrivateStoreMsgBuy(); break; } case 0x9f: { // SendPrivateStoreBuyList msg = new RequestPrivateStoreSell(); break; } case 0xa0: { // SendTimeCheckPacket break; } case 0xa6: { // msg = new RequestSkillCoolTime(); break; } case 0xa7: { msg = new RequestPackageSendableItemList(); break; } case 0xa8: { msg = new RequestPackageSend(); break; } case 0xa9: { msg = new RequestBlock(); break; } case 0xaa: { msg = new RequestSiegeInfo(); break; } case 0xab: { // RequestCastleSiegeAttackerList msg = new RequestSiegeAttackerList(); break; } case 0xac: { msg = new RequestSiegeDefenderList(); break; } case 0xad: { // RequestJoinCastleSiege msg = new RequestJoinSiege(); break; } case 0xae: { // RequestConfirmCastleSiegeWaitingList msg = new RequestConfirmSiegeWaitingList(); break; } case 0xAF: { msg = new RequestSetCastleSiegeTime(); break; } case 0xb0: { msg = new MultiSellChoose(); break; } case 0xb1: { // NetPing break; } case 0xb2: { // RequestRemainTime break; } case 0xb3: { msg = new BypassUserCmd(); break; } case 0xb4: { msg = new SnoopQuit(); break; } case 0xb5: { msg = new RequestRecipeBookOpen(); break; } case 0xb6: { // RequestRecipeItemDelete msg = new RequestRecipeBookDestroy(); break; } case 0xb7: { msg = new RequestRecipeItemMakeInfo(); break; } case 0xb8: { msg = new RequestRecipeItemMakeSelf(); break; } case 0xb9: { // RequestRecipeShopManageList break; } case 0xba: { msg = new RequestRecipeShopMessageSet(); break; } case 0xbb: { msg = new RequestRecipeShopListSet(); break; } case 0xbc: { msg = new RequestRecipeShopManageQuit(); break; } case 0xbd: { // RequestRecipeShopManageCancel break; } case 0xbe: { msg = new RequestRecipeShopMakeInfo(); break; } case 0xbf: { // RequestRecipeShopMakeDo msg = new RequestRecipeShopMakeItem(); break; } case 0xc0: { // RequestRecipeShopSellList msg = new RequestRecipeShopManagePrev(); break; } case 0xc1: { // RequestObserverEndPacket msg = new ObserverReturn(); break; } case 0xc2: { // Unused (RequestEvaluate/VoteSociality) break; } case 0xc3: { msg = new RequestHennaItemList(); break; } case 0xc4: { msg = new RequestHennaItemInfo(); break; } case 0xc5: { msg = new RequestBuySeed(); break; } case 0xc6: { // ConfirmDlg msg = new DlgAnswer(); break; } case 0xc7: { msg = new RequestPreviewItem(); break; } case 0xc8: { // msg = new RequestSSQStatus(); break; } case 0xc9: { msg = new RequestPetitionFeedback(); break; } case 0xcb: { msg = new GameGuardReply(); break; } case 0xcc: { msg = new RequestPledgePower(); break; } case 0xcd: { msg = new RequestMakeMacro(); break; } case 0xce: { msg = new RequestDeleteMacro(); break; } case 0xcf: { // RequestProcureCrop // msg = new RequestBuyProcure(); break; } case 0xd0: { int id2 = -1; if (buf.remaining() >= 2) { id2 = buf.getShort() & 0xffff; } else { if (Config.PACKET_HANDLER_DEBUG) { _log.warning("Client: " + client.toString() + " sent a 0xd0 without the second opcode."); } break; } switch (id2) { case 0x00: { break; } case 0x01: { msg = new RequestManorList(); break; } case 0x02: { msg = new RequestProcureCropList(); break; } case 0x03: { msg = new RequestSetSeed(); break; } case 0x04: { msg = new RequestSetCrop(); break; } case 0x05: { msg = new RequestWriteHeroWords(); break; } case 0x06: { msg = new RequestExAskJoinMPCC(); break; } case 0x07: { msg = new RequestExAcceptJoinMPCC(); break; } case 0x08: { msg = new RequestExOustFromMPCC(); break; } case 0x09: { msg = new RequestOustFromPartyRoom(); break; } case 0x0a: { msg = new RequestDismissPartyRoom(); break; } case 0x0b: { msg = new RequestWithdrawPartyRoom(); break; } case 0x0c: { msg = new RequestChangePartyLeader(); // RequestHandOverPartyMaster ? break; } case 0x0d: { msg = new RequestAutoSoulShot(); break; } case 0x0e: { msg = new RequestExEnchantSkillInfo(); break; } case 0x0f: { msg = new RequestExEnchantSkill(); break; } case 0x10: { msg = new RequestExPledgeCrestLarge(); break; } case 0x11: { final int id9 = buf.getInt(); switch (id9) { // @TODO: : RequestExSetPledgeCrestLarge is now chunked, each case is a different chunk case 0x00: { msg = new RequestExSetPledgeCrestLarge(); // 0 break; } case 0x01: { msg = new RequestExSetPledgeCrestLarge(); // 1 break; } case 0x02: { msg = new RequestExSetPledgeCrestLarge(); // 2 break; } case 0x03: { msg = new RequestExSetPledgeCrestLarge(); // 3 break; } case 0x04: { msg = new RequestExSetPledgeCrestLarge(); // 4 break; } default: { printDebugDoubleOpcode(opcode, id9, buf, state, client); } } break; } case 0x12: { msg = new RequestPledgeSetAcademyMaster(); break; } case 0x13: { msg = new RequestPledgePowerGradeList(); break; } case 0x14: { msg = new RequestPledgeMemberPowerInfo(); break; } case 0x15: { msg = new RequestPledgeSetMemberPowerGrade(); break; } case 0x16: { msg = new RequestPledgeMemberInfo(); break; } case 0x17: { msg = new RequestPledgeWarList(); break; } case 0x18: { msg = new RequestExFishRanking(); break; } case 0x19: { msg = new RequestPCCafeCouponUse(); break; } case 0x1b: { msg = new RequestDuelStart(); break; } case 0x1c: { msg = new RequestDuelAnswerStart(); break; } case 0x1d: { // RequestExSetTutorial break; } case 0x1e: { msg = new RequestExRqItemLink(); break; } case 0x1f: { // CanNotMoveAnymoreAirShip break; } case 0x20: { msg = new MoveToLocationInAirShip(); break; } case 0x21: { msg = new RequestKeyMapping(); break; } case 0x22: { msg = new RequestSaveKeyMapping(); break; } case 0x23: { msg = new RequestExRemoveItemAttribute(); break; } case 0x24: { msg = new RequestSaveInventoryOrder(); break; } case 0x25: { msg = new RequestExitPartyMatchingWaitingRoom(); break; } case 0x26: { msg = new RequestConfirmTargetItem(); break; } case 0x27: { msg = new RequestConfirmRefinerItem(); break; } case 0x28: { msg = new RequestConfirmGemStone(); break; } case 0x29: { msg = new RequestOlympiadObserverEnd(); break; } case 0x2a: { msg = new RequestCursedWeaponList(); break; } case 0x2b: { msg = new RequestCursedWeaponLocation(); break; } case 0x2c: { msg = new RequestPledgeReorganizeMember(); break; } case 0x2d: { msg = new RequestExMPCCShowPartyMembersInfo(); break; } case 0x2e: { msg = new RequestOlympiadMatchList(); break; } case 0x2f: { msg = new RequestAskJoinPartyRoom(); break; } case 0x30: { msg = new AnswerJoinPartyRoom(); break; } case 0x31: { msg = new RequestListPartyMatchingWaitingRoom(); break; } case 0x32: { msg = new RequestExEnchantItemAttribute(); break; } case 0x33: { // already in AUTHED break; } case 0x35: { msg = new MoveToLocationAirShip(); break; } case 0x36: { msg = new RequestBidItemAuction(); break; } case 0x37: { msg = new RequestInfoItemAuction(); break; } case 0x38: { msg = new RequestExChangeName(); break; } case 0x39: { msg = new RequestAllCastleInfo(); break; } case 0x3a: { msg = new RequestAllFortressInfo(); break; } case 0x3b: { msg = new RequestAllAgitInfo(); break; } case 0x3c: { msg = new RequestFortressSiegeInfo(); break; } case 0x3d: { // Unused // msg = new RequestGetBossRecord(); break; } case 0x3e: { msg = new RequestRefine(); break; } case 0x3f: { msg = new RequestConfirmCancelItem(); break; } case 0x40: { msg = new RequestRefineCancel(); break; } case 0x41: { msg = new RequestExMagicSkillUseGround(); break; } case 0x42: { msg = new RequestDuelSurrender(); break; } case 0x43: { msg = new RequestExEnchantSkillInfoDetail(); break; } case 0x44: { // already in 0x41 break; } case 0x45: { msg = new RequestFortressMapInfo(); break; } case 0x46: { msg = new RequestPVPMatchRecord(); break; } case 0x47: { msg = new SetPrivateStoreWholeMsg(); break; } case 0x48: { msg = new RequestDispel(); break; } case 0x49: { msg = new RequestExTryToPutEnchantTargetItem(); break; } case 0x4a: { msg = new RequestExTryToPutEnchantSupportItem(); break; } case 0x4b: { msg = new RequestExCancelEnchantItem(); break; } case 0x4c: { msg = new RequestChangeNicknameColor(); break; } case 0x4d: { msg = new RequestResetNickname(); break; } case 0x4e: { final int id4 = buf.getInt(); switch (id4) { case 0x00: { msg = new RequestBookMarkSlotInfo(); break; } case 0x01: { msg = new RequestSaveBookMarkSlot(); break; } case 0x02: { msg = new RequestModifyBookMarkSlot(); break; } case 0x03: { msg = new RequestDeleteBookMarkSlot(); break; } case 0x04: { msg = new RequestTeleportBookMark(); break; } case 0x05: { msg = new RequestChangeBookMarkSlot(); break; } } break; } case 0x4f: { msg = new RequestWithDrawPremiumItem(); break; } case 0x50: { // @TODO: msg = new RequestExJump(); break; } case 0x51: { // @TODO: msg = new RequestExStartShowCrataeCubeRank(); break; } case 0x52: { // @TODO: msg = new RequestExStopShowCrataeCubeRank(); break; } case 0x53: { // @TODO: msg = new NotifyStartMiniGame(); break; } case 0x54: { // @TODO: msg = new RequestExJoinDominionWar(); break; } case 0x55: { // @TODO: msg = new RequestExDominionInfo(); break; } case 0x56: { // @TODO: msg = new RequestExCleftEnter(); break; } case 0x57: { msg = new RequestExCubeGameChangeTeam(); break; } case 0x58: { msg = new EndScenePlayer(); break; } case 0x59: { msg = new RequestExCubeGameReadyAnswer(); break; } case 0x5A: { // @TODO:msg = new RequestExListMpccWaiting(); break; } case 0x5B: { // @TODO:msg = new RequestExManageMpccRoom(); break; } case 0x5C: { // @TODO:msg = new RequestExJoinMpccRoom(); break; } case 0x5D: { // TODO: RequestExOustFromMpccRoom chddd break; } case 0x5E: { // TODO: RequestExDismissMpccRoom chdddddS break; } case 0x5F: { // TODO: RequestExWithdrawMpccRoom chdd break; } case 0x60: { msg = new RequestSeedPhase(); break; } case 0x61: { // TODO: msg = new RequestExMpccPartymasterList(); break; } case 0x62: { msg = new RequestPostItemList(); break; } case 0x63: { msg = new RequestSendPost(); break; } case 0x64: { msg = new RequestReceivedPostList(); break; } case 0x65: { msg = new RequestDeleteReceivedPost(); break; } case 0x66: { msg = new RequestReceivedPost(); break; } case 0x67: { msg = new RequestPostAttachment(); break; } case 0x68: { msg = new RequestRejectPostAttachment(); break; } case 0x69: { msg = new RequestSentPostList(); break; } case 0x6a: { msg = new RequestDeleteSentPost(); break; } case 0x6b: { msg = new RequestSentPost(); break; } case 0x6c: { msg = new RequestCancelPostAttachment(); break; } case 0x6d: { // @TODO: RequestShowNewUserPetition break; } case 0x6e: { // @TODO: RequestShowStepTwo break; } case 0x6f: { // @TODO: RequestShowStepThree break; } case 0x70: { // msg = new ExConnectToRaidServer(); (chddd) break; } case 0x71: { // msg = new ExReturnFromRaidServer(); (chd) break; } case 0x72: { msg = new RequestRefundItem(); break; } case 0x73: { msg = new RequestBuySellUIClose(); break; } case 0x75: { msg = new RequestPartyLootModification(); break; } case 0x76: { msg = new AnswerPartyLootModification(); break; } case 0x77: { msg = new AnswerCoupleAction(); break; } case 0x78: { msg = new BrEventRankerList(); break; } case 0x79: { // msg = new RequestAskMemberShip(); break; } case 0x7a: { msg = new RequestAddExpandQuestAlarm(); break; } case 0x7b: { msg = new RequestVoteNew(); break; } case 0x7c: { msg = new RequestShuttleGetOn(); break; } case 0x7d: { msg = new RequestShuttleGetOff(); break; } case 0x7e: { msg = new MoveToLocationInShuttle(); break; } case 0x7F: { msg = new CannotMoveAnymoreInShuttle(); break; } case 0x80: { final int id5 = buf.getInt(); switch (id5) { case 0x01: { // msg = new RequestExAgitInitialize chd 0x01 break; } case 0x02: { // msg = new RequestExAgitDetailInfo chdcd 0x02 break; } case 0x03: { // msg = new RequestExMyAgitState chd 0x03 break; } case 0x04: { // msg = new RequestExRegisterAgitForBidStep1 chd 0x04 break; } case 0x05: { // msg = new RequestExRegisterAgitForBidStep2 chddQd } case 0x06: { // msg = new RequestExRegisterAgitForBidStep3 // chddQd 0x05 -no error? 0x05 break; } case 0x07: { // msg = new RequestExConfirmCancelRegisteringAgit chd 0x07 break; } case 0x08: { // msg = new RequestExProceedCancelRegisteringAgit chd 0x08 break; } case 0x09: { // msg = new RequestExConfirmCancelAgitBid chdd 0x09 break; } case 0x10: { // msg = new RequestExReBid chdd 0x10 break; } case 0x11: { // msg = new RequestExAgitListForLot chd 0x11 break; } case 0x12: { // msg = new RequestExApplyForAgitLotStep1 chdc 0x12 break; } case 0x13: { // msg = new RequestExApplyForAgitLotStep2 chdc 0x13 break; } case 0x14: { // msg = new RequestExAgitListForBid chdd 0x14 break; } case 0x0D: { // msg = new RequestExApplyForBidStep1 chdd 0x0D break; } case 0x0E: { // msg = new RequestExApplyForBidStep2 chddQ 0x0E break; } case 0x0F: { // msg = new RequestExApplyForBidStep3 chddQ 0x0F break; } case 0x0A: { // msg = new RequestExProceedCancelAgitLot chdc 0x0A break; } default: { printDebugDoubleOpcode(opcode, id5, buf, state, client); } } break; } case 0x81: { msg = new RequestExAddContactToContactList(); // RequestExAddPostFriendForPostBox break; } case 0x82: { msg = new RequestExDeleteContactFromContactList(); // RequestExDeletePostFriendForPostBox break; } case 0x83: { msg = new RequestExShowContactList(); // RequestExShowPostFriendListForPostBox break; } case 0x84: { msg = new RequestExFriendListExtended(); // RequestExFriendListForPostBox break; } case 0x85: { msg = new RequestExOlympiadMatchListRefresh(); // RequestOlympiadMatchList break; } case 0x86: { msg = new RequestBRGamePoint(); break; } case 0x87: { msg = new RequestBRProductList(); break; } case 0x88: { msg = new RequestBRProductInfo(); break; } case 0x89: { msg = new RequestBRBuyProduct(); break; } case 0x8A: { msg = new RequestBRRecentProductList(); break; } case 0x8B: { // @ msg = new RequestBR_MiniGameLoadScores(); break; } case 0x8C: { // @ msg = new RequestBR_MiniGameInsertScore(); break; } case 0x8D: { // @ msg = new RequestExBR_LectureMark(); break; } case 0x8E: { msg = new RequestCrystallizeEstimate(); break; } case 0x8F: { msg = new RequestCrystallizeItemCancel(); break; } case 0x90: { // @ msg = new RequestExEscapeScene(); break; } case 0x91: { msg = new RequestFlyMove(); break; } case 0x92: { // msg = new RequestSurrenderPledgeWarEX(); (chS) break; } case 0x93: { final int id6 = buf.getInt(); switch (id6) { case 0x02: { // msg = new RequestDynamicQuestProgressInfo() break; } case 0x03: { // msg = new RequestDynamicQuestScoreBoard(); break; } case 0x04: { // msg = new RequestDynamicQuestHTML(); break; } default: { printDebugDoubleOpcode(opcode, id6, buf, state, client); break; } } break; } case 0x94: { msg = new RequestFriendDetailInfo(); break; } case 0x95: { msg = new RequestUpdateFriendMemo(); break; } case 0x96: { msg = new RequestUpdateBlockMemo(); break; } case 0x97: { // msg = new RequestInzonePartyInfoHistory(); break; } case 0x98: { msg = new RequestCommissionRegistrableItemList(); break; } case 0x99: { msg = new RequestCommissionInfo(); break; } case 0x9A: { msg = new RequestCommissionRegister(); break; } case 0x9B: { msg = new RequestCommissionCancel(); break; } case 0x9C: { msg = new RequestCommissionDelete(); break; } case 0x9D: { msg = new RequestCommissionList(); break; } case 0x9E: { msg = new RequestCommissionBuyInfo(); break; } case 0x9F: { msg = new RequestCommissionBuyItem(); break; } case 0xA0: { msg = new RequestCommissionRegisteredItem(); break; } case 0xA1: { // msg = new RequestCallToChangeClass(); break; } case 0xA2: { msg = new RequestChangeToAwakenedClass(); break; } case 0xA3: { // msg = new RequestWorldStatistics(); break; } case 0xA4: { // msg = new RequestUserStatistics(); break; } case 0xA5: { // msg = new Request24HzSessionID(); break; } case 0xAA: { // msg = new RequestGoodsInventoryInfo(); break; } case 0xAB: { // msg = new RequestUseGoodsInventoryItem(); break; } case 0xAC: { // msg = new RequestFirstPlayStart(); break; } case 0xAD: { msg = new RequestFlyMoveStart(); break; } case 0xAE: { break; } case 0xAF: { // msg = new RequestHardWareInfo(); (SddddddSddddddddddSS) break; } case 0xB0: { msg = new SendChangeAttributeTargetItem(); break; } case 0xB1: { msg = new RequestChangeAttributeItem(); break; } case 0xB2: { msg = new RequestChangeAttributeCancel(); break; } case 0xB3: { // msg = new RequestBR_PresentBuyProduct(); break; } case 0xB4: { msg = new ConfirmMenteeAdd(); break; } case 0xB5: { msg = new RequestMentorCancel(); break; } case 0xB6: { msg = new RequestMentorList(); break; } case 0xB7: { msg = new RequestMenteeAdd(); break; } case 0xB8: { msg = new RequestMenteeWaitingList(); break; } case 0xB9: { // msg = new RequestClanAskJoinByName(); break; } case 0xBA: { msg = new RequestInzoneWaitingTime(); break; } case 0xBB: { // msg = new RequestJoinCuriousHouse(); // (ch) break; } case 0xBC: { // msg = new RequestCancelCuriousHouse(); // (ch) break; } case 0xBD: { // msg = new RequestLeaveCuriousHouse(); // (ch) break; } case 0xBE: { // msg = new RequestObservingListCuriousHouse(); // (ch) break; } case 0xBF: { // msg = new RequestObservingCuriousHouse(); // (chd) break; } case 0xC0: { // msg = new RequestLeaveObservingCuriousHouse(); // (ch) break; } case 0xC1: { // msg = new RequestCuriousHouseHtml(); // (ch) break; } case 0xC2: { // msg = new RequestCuriousHouseRecord(); // (ch) break; } case 0xC3: { // msg = new ExSysstring(); (chdS) break; } case 0xC4: { msg = new RequestExTryToPutShapeShiftingTargetItem(); break; } case 0xC5: { msg = new RequestExTryToPutShapeShiftingEnchantSupportItem(); break; } case 0xC6: { msg = new RequestExCancelShape_Shifting_Item(); break; } case 0xC7: { msg = new RequestShapeShiftingItem(); break; } case 0xC8: { // msg = new NCGuardSendDataToServer(); // (chdb) break; } case 0xC9: { // msg = new RequestEventKalieToken(); // (d) break; } case 0xCA: { msg = new RequestShowBeautyList(); break; } case 0xCB: { msg = new RequestRegistBeauty(); break; } case 0xCC: { break; } case 0xCD: { msg = new RequestShowResetShopList(); break; } case 0xCE: { // NetPing break; } case 0xCF: { // RequestBR_AddBasketProductInfo break; } case 0xD0: { // RequestBR_DeleteBasketProductInfo break; } case 0xD1: { break; } case 0xD2: { // RequestExEvent_Campaign_Info break; } case 0xD3: { msg = new RequestPledgeRecruitInfo(); break; } case 0xD4: { msg = new RequestPledgeRecruitBoardSearch(); break; } case 0xD5: { msg = new RequestPledgeRecruitBoardAccess(); break; } case 0xD6: { msg = new RequestPledgeRecruitBoardDetail(); break; } case 0xD7: { msg = new RequestPledgeWaitingApply(); break; } case 0xD8: { msg = new RequestPledgeWaitingApplied(); break; } case 0xD9: { msg = new RequestPledgeWaitingList(); break; } case 0xDA: { msg = new RequestPledgeWaitingUser(); break; } case 0xDB: { msg = new RequestPledgeWaitingUserAccept(); break; } case 0xDC: { msg = new RequestPledgeDraftListSearch(); break; } case 0xDD: { msg = new RequestPledgeDraftListApply(); break; } case 0xDE: { msg = new RequestPledgeRecruitApplyInfo(); break; } case 0xDF: { // msg = new RequestPledgeJoinSys(); break; } case 0xE0: { // ResponsePetitionAlarm break; } case 0xE1: { msg = new NotifyExitBeautyShop(); break; } case 0xE2: { // RequestRegisterXMasWishCard break; } case 0xE3: { msg = new RequestExAddEnchantScrollItem(); break; } case 0xE4: { msg = new RequestExRemoveEnchantSupportItem(); break; } case 0xE5: { // msg = new RequestCardReward(); break; } case 0xE6: { msg = new RequestDivideAdenaStart(); break; } case 0xE7: { msg = new RequestDivideAdenaCancel(); break; } case 0xE8: { msg = new RequestDivideAdena(); break; } case 0xE9: { msg = new RequestAcquireAbilityList(); break; } case 0xEA: { msg = new RequestAbilityList(); break; } case 0xEB: { msg = new RequestResetAbilityPoint(); break; } case 0xEC: { msg = new RequestChangeAbilityPoint(); break; } case 0xED: { // msg = new RequestStopMove(); break; } case 0xEE: { msg = new RequestAbilityWndOpen(); break; } case 0xEF: { msg = new RequestAbilityWndClose(); break; } case 0xF0: { msg = new ExPCCafeRequestOpenWindowWithoutNPC(); break; } case 0xF2: { msg = new RequestLuckyGamePlay(); break; } case 0xF3: { // msg = new NotifyTrainingRoomEnd(); break; } case 0xF4: { msg = new RequestNewEnchantPushOne(); break; } case 0xF5: { msg = new RequestNewEnchantRemoveOne(); break; } case 0xF6: { msg = new RequestNewEnchantPushTwo(); break; } case 0xF7: { msg = new RequestNewEnchantRemoveTwo(); break; } case 0xF8: { msg = new RequestNewEnchantClose(); break; } case 0xF9: { msg = new RequestNewEnchantTry(); break; } case 0xFE: { // msg = new ExSendSelectedQuestZoneID(); break; } case 0xFF: { msg = new RequestAlchemySkillList(); break; } case 0x100: { msg = new RequestAlchemyTryMixCube(); break; } case 0x101: { msg = new RequestAlchemyConversion(); break; } case 0x102: { // msg = new SendExecutedUIEventsCount(); break; } case 0x103: { // msg = new ExSendClientINI(); break; } case 0x104: { msg = new RequestExAutoFish(); break; } case 0x105: { // msg = new RequestVipAttendanceItemList(); break; } case 0x106: { // msg = new RequestVipAttendanceCheck(); break; } case 0x107: { msg = new RequestItemEnsoul(); break; } case 0x108: { // msg = new RequestVipProductList(); break; } case 0x109: { // msg = new RequestVipLuckyGameInfo(); break; } case 0x10A: { // msg = new RequestVipLuckyGameItemList(); break; } case 0x10B: { // msg = new RequestVipLuckyGameBonus(); break; } case 0x10C: { // msg = new ExRequestVipInfo(); break; } case 0x10D: { // msg = new RequestCaptchaAnswer(); break; } case 0x10E: { // msg = new RequestRefreshCaptchaImage(); break; } case 0x10F: { msg = new RequestTodoList(); break; } case 0x110: { msg = new RequestTodoListHTML(); break; } case 0x111: { msg = new RequestOneDayRewardReceive(); break; } case 0x112: { // msg = new RequestPledgeBonusOpen(); break; } case 0x113: { // msg = new RequestPledgeBonusRewardList(); break; } case 0x114: { // msg = new RequestPledgeBonusReward(); break; } case 0x115: { // msg = new RequestSSOAuthnToken(); break; } default: { printDebugDoubleOpcode(opcode, id2, buf, state, client); break; } } break; } default: { printDebug(opcode, buf, state, client); break; } } break; } } return msg; } private void printDebug(int opcode, ByteBuffer buf, GameClientState state, L2GameClient client) { client.onUnknownPacket(); if (!Config.PACKET_HANDLER_DEBUG) { return; } final int size = buf.remaining(); _log.warning("Unknown Packet: 0x" + Integer.toHexString(opcode) + " on State: " + state.name() + " Client: " + client.toString()); final byte[] array = new byte[size]; buf.get(array); _log.warning(Util.printData(array, size)); } private void printDebugDoubleOpcode(int opcode, int id2, ByteBuffer buf, GameClientState state, L2GameClient client) { client.onUnknownPacket(); if (!Config.PACKET_HANDLER_DEBUG) { return; } final int size = buf.remaining(); _log.warning("Unknown Packet: 0x" + Integer.toHexString(opcode) + ":0x" + Integer.toHexString(id2) + " on State: " + state.name() + " Client: " + client.toString()); final byte[] array = new byte[size]; buf.get(array); _log.warning(Util.printData(array, size)); } // impl @Override public L2GameClient create(MMOConnection con) { return new L2GameClient(con); } @Override public void execute(ReceivablePacket rp) { rp.getClient().execute(rp); } }