Merged with released L2J-Unity files.

This commit is contained in:
mobiusdev
2016-06-12 01:34:09 +00:00
parent e003e87887
commit 635557f5da
18352 changed files with 3245113 additions and 2892959 deletions

View File

@ -0,0 +1,69 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.l2jmobius.gameserver.network.client;
import com.l2jmobius.commons.util.Rnd;
/**
* Blowfish keygen for GameServer client connections.
* @author KenM
*/
public class BlowFishKeygen
{
private static final int CRYPT_KEYS_SIZE = 20;
private static final byte[][] CRYPT_KEYS = new byte[CRYPT_KEYS_SIZE][16];
static
{
// init the GS encryption keys on class load
for (int i = 0; i < CRYPT_KEYS_SIZE; i++)
{
// randomize the 8 first bytes
for (int j = 0; j < CRYPT_KEYS[i].length; j++)
{
CRYPT_KEYS[i][j] = (byte) Rnd.get(255);
}
// the last 8 bytes are static
CRYPT_KEYS[i][8] = (byte) 0xc8;
CRYPT_KEYS[i][9] = (byte) 0x27;
CRYPT_KEYS[i][10] = (byte) 0x93;
CRYPT_KEYS[i][11] = (byte) 0x01;
CRYPT_KEYS[i][12] = (byte) 0xa1;
CRYPT_KEYS[i][13] = (byte) 0x6c;
CRYPT_KEYS[i][14] = (byte) 0x31;
CRYPT_KEYS[i][15] = (byte) 0x97;
}
}
// block instantiation
private BlowFishKeygen()
{
}
/**
* Returns a key from this keygen pool, the logical ownership is retained by this keygen.<BR>
* Thus when getting a key with interests other then read-only a copy must be performed.<BR>
* @return A key from this keygen pool.
*/
public static byte[] getRandomKey()
{
return CRYPT_KEYS[Rnd.get(CRYPT_KEYS_SIZE)];
}
}

View File

@ -0,0 +1,50 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.l2jmobius.gameserver.network.client;
import java.nio.ByteOrder;
import com.l2jmobius.commons.network.codecs.CryptCodec;
import com.l2jmobius.commons.network.codecs.LengthFieldBasedFrameEncoder;
import com.l2jmobius.commons.network.codecs.PacketDecoder;
import com.l2jmobius.commons.network.codecs.PacketEncoder;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
/**
* @author Nos
*/
public class ClientInitializer extends ChannelInitializer<SocketChannel>
{
private static final LengthFieldBasedFrameEncoder LENGTH_ENCODER = new LengthFieldBasedFrameEncoder();
private static final PacketEncoder PACKET_ENCODER = new PacketEncoder(ByteOrder.LITTLE_ENDIAN, 0x8000 - 2);
@Override
protected void initChannel(SocketChannel ch)
{
final L2GameClient client = new L2GameClient();
ch.pipeline().addLast("length-decoder", new LengthFieldBasedFrameDecoder(ByteOrder.LITTLE_ENDIAN, 0x8000 - 2, 0, 2, -2, 2, false));
ch.pipeline().addLast("length-encoder", LENGTH_ENCODER);
ch.pipeline().addLast("crypt-codec", new CryptCodec(client.getCrypt()));
// ch.pipeline().addLast(new LoggingHandler(LogLevel.INFO));
ch.pipeline().addLast("packet-decoder", new PacketDecoder<>(ByteOrder.LITTLE_ENDIAN, IncomingPackets.PACKET_ARRAY, client));
ch.pipeline().addLast("packet-encoder", PACKET_ENCODER);
ch.pipeline().addLast(client);
}
}

View File

@ -0,0 +1,42 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.l2jmobius.gameserver.network.client;
import com.l2jmobius.Config;
import com.l2jmobius.commons.network.NetworkManager;
import com.l2jmobius.gameserver.network.EventLoopGroupManager;
/**
* @author Nos
*/
public class ClientNetworkManager extends NetworkManager
{
protected ClientNetworkManager()
{
super(EventLoopGroupManager.getInstance().getBossGroup(), EventLoopGroupManager.getInstance().getWorkerGroup(), new ClientInitializer(), Config.GAMESERVER_HOSTNAME, Config.PORT_GAME);
}
public static ClientNetworkManager getInstance()
{
return SingletonHolder._instance;
}
private static class SingletonHolder
{
protected static final ClientNetworkManager _instance = new ClientNetworkManager();
}
}

View File

@ -0,0 +1,31 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.l2jmobius.gameserver.network.client;
import com.l2jmobius.commons.network.IConnectionState;
/**
* @author Nos
*/
public enum ConnectionState implements IConnectionState
{
CONNECTED,
DISCONNECTED,
CLOSING,
AUTHENTICATED,
IN_GAME
}

View File

@ -0,0 +1,120 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.l2jmobius.gameserver.network.client;
import com.l2jmobius.commons.network.ICrypt;
import com.l2jmobius.gameserver.model.events.EventDispatcher;
import com.l2jmobius.gameserver.model.events.impl.server.OnPacketReceived;
import com.l2jmobius.gameserver.model.events.impl.server.OnPacketSent;
import io.netty.buffer.ByteBuf;
/**
* @author UnAfraid, Nos
*/
public class Crypt implements ICrypt
{
private final L2GameClient _client;
private final byte[] _inKey = new byte[16];
private final byte[] _outKey = new byte[16];
private boolean _isEnabled;
public Crypt(L2GameClient client)
{
_client = client;
}
public void setKey(byte[] key)
{
System.arraycopy(key, 0, _inKey, 0, 16);
System.arraycopy(key, 0, _outKey, 0, 16);
}
@Override
public void encrypt(ByteBuf buf)
{
if (!_isEnabled)
{
_isEnabled = true;
onPacketSent(buf);
return;
}
onPacketSent(buf);
int a = 0;
while (buf.isReadable())
{
final int b = buf.readByte() & 0xFF;
a = b ^ _outKey[(buf.readerIndex() - 1) & 15] ^ a;
buf.setByte(buf.readerIndex() - 1, a);
}
shiftKey(_outKey, buf.writerIndex());
}
@Override
public void decrypt(ByteBuf buf)
{
if (!_isEnabled)
{
onPacketReceive(buf);
return;
}
int a = 0;
while (buf.isReadable())
{
final int b = buf.readByte() & 0xFF;
buf.setByte(buf.readerIndex() - 1, b ^ _inKey[(buf.readerIndex() - 1) & 15] ^ a);
a = b;
}
shiftKey(_inKey, buf.writerIndex());
onPacketReceive(buf);
}
private void onPacketSent(ByteBuf buf)
{
final byte[] data = new byte[buf.writerIndex()];
buf.getBytes(0, data);
EventDispatcher.getInstance().notifyEvent(new OnPacketSent(_client, data));
}
private void onPacketReceive(ByteBuf buf)
{
final byte[] data = new byte[buf.writerIndex()];
buf.getBytes(0, data);
EventDispatcher.getInstance().notifyEvent(new OnPacketReceived(_client, data));
}
private void shiftKey(byte[] key, int size)
{
int old = key[8] & 0xff;
old |= (key[9] << 8) & 0xff00;
old |= (key[10] << 0x10) & 0xff0000;
old |= (key[11] << 0x18) & 0xff000000;
old += size;
key[8] = (byte) (old & 0xff);
key[9] = (byte) ((old >> 0x08) & 0xff);
key[10] = (byte) ((old >> 0x10) & 0xff);
key[11] = (byte) ((old >> 0x18) & 0xff);
}
}

View File

@ -0,0 +1,406 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.l2jmobius.gameserver.network.client;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Supplier;
import com.l2jmobius.commons.network.IConnectionState;
import com.l2jmobius.commons.network.IIncomingPacket;
import com.l2jmobius.commons.network.IIncomingPackets;
import com.l2jmobius.gameserver.network.clientpackets.*;
import com.l2jmobius.gameserver.network.clientpackets.ability.RequestAbilityList;
import com.l2jmobius.gameserver.network.clientpackets.ability.RequestAbilityWndClose;
import com.l2jmobius.gameserver.network.clientpackets.ability.RequestAbilityWndOpen;
import com.l2jmobius.gameserver.network.clientpackets.ability.RequestAcquireAbilityList;
import com.l2jmobius.gameserver.network.clientpackets.ability.RequestChangeAbilityPoint;
import com.l2jmobius.gameserver.network.clientpackets.ability.RequestResetAbilityPoint;
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.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.awakening.RequestCallToChangeClass;
import com.l2jmobius.gameserver.network.clientpackets.ceremonyofchaos.RequestCancelCuriousHouse;
import com.l2jmobius.gameserver.network.clientpackets.ceremonyofchaos.RequestCuriousHouseHtml;
import com.l2jmobius.gameserver.network.clientpackets.ceremonyofchaos.RequestJoinCuriousHouse;
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.ensoul.RequestItemEnsoul;
import com.l2jmobius.gameserver.network.clientpackets.friend.RequestFriendDetailInfo;
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.onedayreward.RequestOneDayRewardReceive;
import com.l2jmobius.gameserver.network.clientpackets.onedayreward.RequestTodoList;
import com.l2jmobius.gameserver.network.clientpackets.pledgebonus.RequestPledgeBonusOpen;
import com.l2jmobius.gameserver.network.clientpackets.pledgebonus.RequestPledgeBonusReward;
import com.l2jmobius.gameserver.network.clientpackets.pledgebonus.RequestPledgeBonusRewardList;
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.sayune.RequestFlyMove;
import com.l2jmobius.gameserver.network.clientpackets.sayune.RequestFlyMoveStart;
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;
/**
* @author Sdw
*/
public enum ExIncomingPackets implements IIncomingPackets<L2GameClient>
{
REQUEST_GOTO_LOBBY(0x33, RequestGotoLobby::new, ConnectionState.AUTHENTICATED),
REQUEST_EX_2ND_PASSWORD_CHECK(0xA6, RequestEx2ndPasswordCheck::new, ConnectionState.AUTHENTICATED),
REQUEST_EX_2ND_PASSWORD_VERIFY(0xA7, RequestEx2ndPasswordVerify::new, ConnectionState.AUTHENTICATED),
REQUEST_EX_2ND_PASSWORD_REQ(0xA8, RequestEx2ndPasswordReq::new, ConnectionState.AUTHENTICATED),
REQUEST_CHARACTER_NAME_CREATABLE(0xA9, RequestCharacterNameCreatable::new, ConnectionState.AUTHENTICATED),
REQUEST_MANOR_LIST(0x01, RequestManorList::new, ConnectionState.IN_GAME),
REQUEST_PROCEDURE_CROP_LIST(0x02, RequestProcureCropList::new, ConnectionState.IN_GAME),
REQUEST_SET_SEED(0x03, RequestSetSeed::new, ConnectionState.IN_GAME),
REQUEST_SET_CROP(0x04, RequestSetCrop::new, ConnectionState.IN_GAME),
REQUEST_WRITE_HERO_WORDS(0x05, RequestWriteHeroWords::new, ConnectionState.IN_GAME),
REQUEST_EX_ASK_JOIN_MPCC(0x06, RequestExAskJoinMPCC::new, ConnectionState.IN_GAME),
REQUEST_EX_ACCEPT_JOIN_MPCC(0x07, RequestExAcceptJoinMPCC::new, ConnectionState.IN_GAME),
REQUEST_EX_OUST_FROM_MPCC(0x08, RequestExOustFromMPCC::new, ConnectionState.IN_GAME),
REQUEST_OUST_FROM_PARTY_ROOM(0x09, RequestOustFromPartyRoom::new, ConnectionState.IN_GAME),
REQUEST_DISMISS_PARTY_ROOM(0x0A, RequestDismissPartyRoom::new, ConnectionState.IN_GAME),
REQUEST_WITHDRAW_PARTY_ROOM(0x0B, RequestWithdrawPartyRoom::new, ConnectionState.IN_GAME),
REQUEST_CHANGE_PARTY_LEADER(0x0C, RequestChangePartyLeader::new, ConnectionState.IN_GAME),
REQUEST_AUTO_SOULSHOT(0x0D, RequestAutoSoulShot::new, ConnectionState.IN_GAME),
REQUEST_EX_ENCHANT_SKILL_INFO(0x0E, RequestExEnchantSkillInfo::new, ConnectionState.IN_GAME),
REQUEST_EX_ENCHANT_SKILL(0x0F, RequestExEnchantSkill::new, ConnectionState.IN_GAME),
REQUEST_EX_PLEDGE_CREST_LARGE(0x10, RequestExPledgeCrestLarge::new, ConnectionState.IN_GAME),
REQUEST_EX_SET_PLEDGE_CREST_LARGE(0x11, RequestExSetPledgeCrestLarge::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_SET_ACADEMY_MASTER(0x12, RequestPledgeSetAcademyMaster::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_POWER_GRADE_LIST(0x13, RequestPledgePowerGradeList::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_MEMBER_POWER_INFO(0x14, RequestPledgeMemberPowerInfo::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_SET_MEMBER_POWER_GRADE(0x15, RequestPledgeSetMemberPowerGrade::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_MEMBER_INFO(0x16, RequestPledgeMemberInfo::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_WAR_LIST(0x17, RequestPledgeWarList::new, ConnectionState.IN_GAME),
REQUEST_EX_FISH_RANKING(0x18, RequestExFishRanking::new, ConnectionState.IN_GAME),
REQUEST_PCCAFE_COUPON_USE(0x19, RequestPCCafeCouponUse::new, ConnectionState.IN_GAME),
REQUEST_SERVER_LOGIN(0x1A, null, ConnectionState.IN_GAME),
REQUEST_DUEL_START(0x1B, RequestDuelStart::new, ConnectionState.IN_GAME),
REQUEST_DUAL_ANSWER_START(0x1C, RequestDuelAnswerStart::new, ConnectionState.IN_GAME),
REQUEST_EX_SET_TUTORIAL(0x1D, null, ConnectionState.IN_GAME),
REQUEST_EX_RQ_ITEM_LINK(0x1E, RequestExRqItemLink::new, ConnectionState.IN_GAME),
CANNOT_MOVE_ANYMORE_AIR_SHIP(0x1F, null, ConnectionState.IN_GAME),
MOVE_TO_LOCATION_IN_AIR_SHIP(0x20, MoveToLocationInAirShip::new, ConnectionState.IN_GAME),
REQUEST_KEY_MAPPING(0x21, RequestKeyMapping::new, ConnectionState.IN_GAME),
REQUEST_SAVE_KEY_MAPPING(0x22, RequestSaveKeyMapping::new, ConnectionState.IN_GAME),
REQUEST_EX_REMOVE_ITEM_ATTRIBUTE(0x23, RequestExRemoveItemAttribute::new, ConnectionState.IN_GAME),
REQUEST_SAVE_INVENTORY_ORDER(0x24, RequestSaveInventoryOrder::new, ConnectionState.IN_GAME),
REQUEST_EXIT_PARTY_MATCHING_WAITING_ROOM(0x25, RequestExitPartyMatchingWaitingRoom::new, ConnectionState.IN_GAME),
REQUEST_CONFIRM_TARGET_ITEM(0x26, RequestConfirmTargetItem::new, ConnectionState.IN_GAME),
REQUEST_CONFIRM_REFINER_ITEM(0x27, RequestConfirmRefinerItem::new, ConnectionState.IN_GAME),
REQUEST_CONFIRM_GEMSTONE(0x28, RequestConfirmGemStone::new, ConnectionState.IN_GAME),
REQUEST_OLYMPIAD_OBSERVER_END(0x29, RequestOlympiadObserverEnd::new, ConnectionState.IN_GAME),
REQUEST_CURSED_WEAPON_LIST(0x2A, RequestCursedWeaponList::new, ConnectionState.IN_GAME),
REQUEST_CURSED_WEAPON_LOCATION(0x2B, RequestCursedWeaponLocation::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_REORGANIZE_MEMBER(0x2C, RequestPledgeReorganizeMember::new, ConnectionState.IN_GAME),
REQUEST_EX_MPCC_SHOW_PARTY_MEMBERS_INFO(0x2D, RequestExMPCCShowPartyMembersInfo::new, ConnectionState.IN_GAME),
REQUEST_OLYMPIAD_MATCH_LIST(0x2E, RequestOlympiadMatchList::new, ConnectionState.IN_GAME),
REQUEST_ASK_JOIN_PARTY_ROOM(0x2F, RequestAskJoinPartyRoom::new, ConnectionState.IN_GAME),
ANSWER_JOIN_PARTY_ROOM(0x30, AnswerJoinPartyRoom::new, ConnectionState.IN_GAME),
REQUEST_LIST_PARTY_MATCHING_WAITING_ROOM(0x31, RequestListPartyMatchingWaitingRoom::new, ConnectionState.IN_GAME),
REQUEST_EX_ENCHANT_ITEM_ATTRIBUTE(0x32, RequestExEnchantItemAttribute::new, ConnectionState.IN_GAME),
MOVE_TO_LOCATION_AIR_SHIP(0x35, MoveToLocationAirShip::new, ConnectionState.IN_GAME),
REQUEST_BID_ITEM_AUCTION(0x36, RequestBidItemAuction::new, ConnectionState.IN_GAME),
REQUEST_INFO_ITEM_AUCTION(0x37, RequestInfoItemAuction::new, ConnectionState.IN_GAME),
REQUEST_EX_CHANGE_NAME(0x38, RequestExChangeName::new, ConnectionState.IN_GAME),
REQUEST_ALL_CASTLE_INFO(0x39, RequestAllCastleInfo::new, ConnectionState.IN_GAME),
REQUEST_ALL_FORTRESS_INFO(0x3A, RequestAllFortressInfo::new, ConnectionState.IN_GAME),
REQUEST_ALL_AGIT_INGO(0x3B, RequestAllAgitInfo::new, ConnectionState.IN_GAME),
REQUEST_FORTRESS_SIEGE_INFO(0x3C, RequestFortressSiegeInfo::new, ConnectionState.IN_GAME),
REQUEST_GET_BOSS_RECORD(0x3D, RequestGetBossRecord::new, ConnectionState.IN_GAME),
REQUEST_REFINE(0x3E, RequestRefine::new, ConnectionState.IN_GAME),
REQUEST_CONFIRM_CANCEL_ITEM(0x3F, RequestConfirmCancelItem::new, ConnectionState.IN_GAME),
REQUEST_REFINE_CANCEL(0x40, RequestRefineCancel::new, ConnectionState.IN_GAME),
REQUEST_EX_MAGIC_SKILL_USE_GROUND(0x41, RequestExMagicSkillUseGround::new, ConnectionState.IN_GAME),
REQUEST_DUEL_SURRENDER(0x42, RequestDuelSurrender::new, ConnectionState.IN_GAME),
REQUEST_EX_ENCHANT_SKILL_INFO_DETAIL(0x43, RequestExEnchantSkillInfoDetail::new, ConnectionState.IN_GAME),
REQUEST_FORTRESS_MAP_INFO(0x45, RequestFortressMapInfo::new, ConnectionState.IN_GAME),
REQUEST_PVP_MATCH_RECORD(0x46, RequestPVPMatchRecord::new, ConnectionState.IN_GAME),
SET_PRIVATE_STORE_WHOLE_MSG(0x47, SetPrivateStoreWholeMsg::new, ConnectionState.IN_GAME),
REQUEST_DISPEL(0x48, RequestDispel::new, ConnectionState.IN_GAME),
REQUEST_EX_TRY_TO_PUT_ENCHANT_TARGET_ITEM(0x49, RequestExTryToPutEnchantTargetItem::new, ConnectionState.IN_GAME),
REQUEST_EX_TRY_TO_PUT_ENCHANT_SUPPORT_ITEM(0x4A, RequestExTryToPutEnchantSupportItem::new, ConnectionState.IN_GAME),
REQUEST_EX_CANCEL_ENCHANT_ITEM(0x4B, RequestExCancelEnchantItem::new, ConnectionState.IN_GAME),
REQUEST_CHANGE_NICKNAME_COLOR(0x4C, RequestChangeNicknameColor::new, ConnectionState.IN_GAME),
REQUEST_RESET_NICKNAME(0x4D, RequestResetNickname::new, ConnectionState.IN_GAME),
EX_BOOKMARK_PACKET(0x4E, ExBookmarkPacket::new, ConnectionState.IN_GAME),
REQUEST_WITHDRAW_PREMIUM_ITEM(0x4F, RequestWithDrawPremiumItem::new, ConnectionState.IN_GAME),
REQUEST_EX_JUMP(0x50, null, ConnectionState.IN_GAME),
REQUEST_EX_START_SHOW_CRATAE_CUBE_RANK(0x51, null, ConnectionState.IN_GAME),
REQUEST_EX_STOP_SHOW_CRATAE_CUBE_RANK(0x52, null, ConnectionState.IN_GAME),
NOTIFY_START_MINI_GAME(0x53, null, ConnectionState.IN_GAME),
REQUEST_EX_JOIN_DOMINION_WAR(0x54, null, ConnectionState.IN_GAME),
REQUEST_EX_DOMINION_INFO(0x55, null, ConnectionState.IN_GAME),
REQUEST_EX_CLEFT_ENTER(0x56, null, ConnectionState.IN_GAME),
REQUEST_EX_CUBE_GAME_CHANGE_TEAM(0x57, RequestExCubeGameChangeTeam::new, ConnectionState.IN_GAME),
END_SCENE_PLAYER(0x58, EndScenePlayer::new, ConnectionState.IN_GAME),
REQUEST_EX_CUBE_GAME_READY_ANSWER(0x59, RequestExCubeGameReadyAnswer::new, ConnectionState.IN_GAME),
REQUEST_EX_LIST_MPCC_WAITING(0x5A, RequestExListMpccWaiting::new, ConnectionState.IN_GAME),
REQUEST_EX_MANAGE_MPCC_ROOM(0x5B, RequestExManageMpccRoom::new, ConnectionState.IN_GAME),
REQUEST_EX_JOIN_MPCC_ROOM(0x5C, RequestExJoinMpccRoom::new, ConnectionState.IN_GAME),
REQUEST_EX_OUST_FROM_MPCC_ROOM(0x5D, RequestExOustFromMpccRoom::new, ConnectionState.IN_GAME),
REQUEST_EX_DISMISS_MPCC_ROOM(0x5E, RequestExDismissMpccRoom::new, ConnectionState.IN_GAME),
REQUEST_EX_WITHDRAW_MPCC_ROOM(0x5F, RequestExWithdrawMpccRoom::new, ConnectionState.IN_GAME),
REQUEST_SEED_PHASE(0x60, RequestSeedPhase::new, ConnectionState.IN_GAME),
REQUEST_EX_MPCC_PARTYMASTER_LIST(0x61, RequestExMpccPartymasterList::new, ConnectionState.IN_GAME),
REQUEST_POST_ITEM_LIST(0x62, RequestPostItemList::new, ConnectionState.IN_GAME),
REQUEST_SEND_POST(0x63, RequestSendPost::new, ConnectionState.IN_GAME),
REQUEST_RECEIVED_POST_LIST(0x64, RequestReceivedPostList::new, ConnectionState.IN_GAME),
REQUEST_DELETE_RECEIVED_POST(0x65, RequestDeleteReceivedPost::new, ConnectionState.IN_GAME),
REQUEST_RECEIVED_POST(0x66, RequestReceivedPost::new, ConnectionState.IN_GAME),
REQUEST_POST_ATTACHMENT(0x67, RequestPostAttachment::new, ConnectionState.IN_GAME),
REQUEST_REJECT_POST_ATTACHMENT(0x68, RequestRejectPostAttachment::new, ConnectionState.IN_GAME),
REQUEST_SENT_POST_LIST(0x69, RequestSentPostList::new, ConnectionState.IN_GAME),
REQUEST_DELETE_SENT_POST(0x6A, RequestDeleteSentPost::new, ConnectionState.IN_GAME),
REQUEST_SENT_POST(0x6B, RequestSentPost::new, ConnectionState.IN_GAME),
REQUEST_CANCEL_POST_ATTACHMENT(0x6C, RequestCancelPostAttachment::new, ConnectionState.IN_GAME),
REQUEST_SHOW_NEW_USER_PETITION(0x6D, null, ConnectionState.IN_GAME),
REQUEST_SHOW_STEP_TWO(0x6E, null, ConnectionState.IN_GAME),
REQUEST_SHOW_STEP_THREE(0x6F, null, ConnectionState.IN_GAME),
EX_CONNECT_TO_RAID_SERVER(0x70, null, ConnectionState.IN_GAME),
EX_RETURN_FROM_RAID_SERVER(0x71, null, ConnectionState.IN_GAME),
REQUEST_REFUND_ITEM(0x72, RequestRefundItem::new, ConnectionState.IN_GAME),
REQUEST_BUI_SELL_UI_CLOSE(0x73, RequestBuySellUIClose::new, ConnectionState.IN_GAME),
REQUEST_EX_EVENT_MATCH_OBSERVER_END(0x74, null, ConnectionState.IN_GAME),
REQUEST_PARTY_LOOT_MODIFICATION(0x75, RequestPartyLootModification::new, ConnectionState.IN_GAME),
ANSWER_PARTY_LOOT_MODIFICATION(0x76, AnswerPartyLootModification::new, ConnectionState.IN_GAME),
ANSWER_COUPLE_ACTION(0x77, AnswerCoupleAction::new, ConnectionState.IN_GAME),
BR_EVENT_RANKER_LIST(0x78, BrEventRankerList::new, ConnectionState.IN_GAME),
REQUEST_ASK_MEMBER_SHIP(0x79, null, ConnectionState.IN_GAME),
REQUEST_ADD_EXPAND_QUEST_ALARM(0x7A, RequestAddExpandQuestAlarm::new, ConnectionState.IN_GAME),
REQUEST_VOTE_NEW(0x7B, RequestVoteNew::new, ConnectionState.IN_GAME),
REQUEST_SHUTTLE_GET_ON(0x7C, RequestShuttleGetOn::new, ConnectionState.IN_GAME),
REQUEST_SHUTTLE_GET_OFF(0x7D, RequestShuttleGetOff::new, ConnectionState.IN_GAME),
MOVE_TO_LOCATION_IN_SHUTTLE(0x7E, MoveToLocationInShuttle::new, ConnectionState.IN_GAME),
CANNOT_MORE_ANYMORE_IN_SHUTTLE(0x7F, CannotMoveAnymoreInShuttle::new, ConnectionState.IN_GAME),
REQUEST_AGIT_ACTION(0x80, null, ConnectionState.IN_GAME), // TODO: Implement / HANDLE SWITCH
REQUEST_EX_ADD_CONTACT_TO_CONTACT_LIST(0x81, RequestExAddContactToContactList::new, ConnectionState.IN_GAME),
REQUEST_EX_DELETE_CONTACT_FROM_CONTACT_LIST(0x82, RequestExDeleteContactFromContactList::new, ConnectionState.IN_GAME),
REQUEST_EX_SHOW_CONTACT_LIST(0x83, RequestExShowContactList::new, ConnectionState.IN_GAME),
REQUEST_EX_FRIEND_LIST_EXTENDED(0x84, RequestExFriendListExtended::new, ConnectionState.IN_GAME),
REQUEST_EX_OLYMPIAD_MATCH_LIST_REFRESH(0x85, RequestExOlympiadMatchListRefresh::new, ConnectionState.IN_GAME),
REQUEST_BR_GAME_POINT(0x86, RequestBRGamePoint::new, ConnectionState.IN_GAME),
REQUEST_BR_PRODUCT_LIST(0x87, RequestBRProductList::new, ConnectionState.IN_GAME),
REQUEST_BR_PRODUCT_INFO(0x88, RequestBRProductInfo::new, ConnectionState.IN_GAME),
REQUEST_BR_BUI_PRODUCT(0x89, RequestBRBuyProduct::new, ConnectionState.IN_GAME),
REQUEST_BR_RECENT_PRODUCT_LIST(0x8A, RequestBRRecentProductList::new, ConnectionState.IN_GAME),
REQUEST_BR_MINI_GAME_LOAD_SCORES(0x8B, null, ConnectionState.IN_GAME),
REQUEST_BR_MINI_GAME_INSERT_SCORE(0x8C, null, ConnectionState.IN_GAME),
REQUEST_EX_BR_LECTURE_MARK(0x8D, null, ConnectionState.IN_GAME),
REQUEST_CRYSTALLIZE_ESTIMATE(0x8E, RequestCrystallizeEstimate::new, ConnectionState.IN_GAME),
REQUEST_CRYSTALLIZE_ITEM_CANCEL(0x8F, RequestCrystallizeItemCancel::new, ConnectionState.IN_GAME),
REQUEST_SCENE_EX_ESCAPE_SCENE(0x90, RequestExEscapeScene::new, ConnectionState.IN_GAME),
REQUEST_FLY_MOVE(0x91, RequestFlyMove::new, ConnectionState.IN_GAME),
REQUEST_SURRENDER_PLEDGE_WAR_EX(0x92, null, ConnectionState.IN_GAME),
REQUEST_DYNAMIC_QUEST_ACTION(0x93, null, ConnectionState.IN_GAME), // TODO: Implement / HANDLE SWITCH
REQUEST_FRIEND_DETAIL_INFO(0x94, RequestFriendDetailInfo::new, ConnectionState.IN_GAME),
REQUEST_UPDATE_FRIEND_MEMO(0x95, null, ConnectionState.IN_GAME),
REQUEST_UPDATE_BLOCK_MEMO(0x96, null, ConnectionState.IN_GAME),
REQUEST_INZONE_PARTY_INFO_HISTORY(0x97, null, ConnectionState.IN_GAME),
REQUEST_COMMISSION_REGISTRABLE_ITEM_LIST(0x98, RequestCommissionRegistrableItemList::new, ConnectionState.IN_GAME),
REQUEST_COMMISSION_INFO(0x99, RequestCommissionInfo::new, ConnectionState.IN_GAME),
REQUEST_COMMISSION_REGISTER(0x9A, RequestCommissionRegister::new, ConnectionState.IN_GAME),
REQUEST_COMMISSION_CANCEL(0x9B, RequestCommissionCancel::new, ConnectionState.IN_GAME),
REQUEST_COMMISSION_DELETE(0x9C, RequestCommissionDelete::new, ConnectionState.IN_GAME),
REQUEST_COMMISSION_LIST(0x9D, RequestCommissionList::new, ConnectionState.IN_GAME),
REQUEST_COMMISSION_BUY_INFO(0x9E, RequestCommissionBuyInfo::new, ConnectionState.IN_GAME),
REQUEST_COMMISSION_BUY_ITEM(0x9F, RequestCommissionBuyItem::new, ConnectionState.IN_GAME),
REQUEST_COMMISSION_REGISTERED_ITEM(0xA0, RequestCommissionRegisteredItem::new, ConnectionState.IN_GAME),
REQUEST_CALL_TO_CHANGE_CLASS(0xA1, RequestCallToChangeClass::new, ConnectionState.IN_GAME),
REQUEST_CHANGE_TO_AWAKENED_CLASS(0xA2, RequestChangeToAwakenedClass::new, ConnectionState.IN_GAME),
REQUEST_WORLD_STATISTICS(0xA3, null, ConnectionState.IN_GAME),
REQUEST_USER_STATISTICS(0xA4, null, ConnectionState.IN_GAME),
REQUEST_24HZ_SESSION_ID(0xA5, null, ConnectionState.IN_GAME),
REQUEST_GOODS_INVENTORY_INFO(0xAA, null, ConnectionState.IN_GAME),
REQUEST_GOODS_INVENTORY_ITEM(0xAB, null, ConnectionState.IN_GAME),
REQUEST_FIRST_PLAY_START(0xAC, null, ConnectionState.IN_GAME),
REQUEST_FLY_MOVE_START(0xAD, RequestFlyMoveStart::new, ConnectionState.IN_GAME),
REQUEST_HARDWARE_INFO(0xAE, null, ConnectionState.IN_GAME),
SEND_CHANGE_ATTRIBUTE_TARGET_ITEM(0xB0, null, ConnectionState.IN_GAME),
REQUEST_CHANGE_ATTRIBUTE_ITEM(0xB1, null, ConnectionState.IN_GAME),
REQUEST_CHANGE_ATTRIBUTE_CANCEL(0xB2, null, ConnectionState.IN_GAME),
REQUEST_BR_PRESENT_BUY_PRODUCT(0xB3, null, ConnectionState.IN_GAME),
CONFIRM_MENTEE_ADD(0xB4, ConfirmMenteeAdd::new, ConnectionState.IN_GAME),
REQUEST_MENTOR_CANCEL(0xB5, RequestMentorCancel::new, ConnectionState.IN_GAME),
REQUEST_MENTOR_LIST(0xB6, RequestMentorList::new, ConnectionState.IN_GAME),
REQUEST_MENTEE_ADD(0xB7, RequestMenteeAdd::new, ConnectionState.IN_GAME),
REQUEST_MENTEE_WAITING_LIST(0xB8, RequestMenteeWaitingList::new, ConnectionState.IN_GAME),
REQUEST_CLAN_ASK_JOIN_BY_NAME(0xB9, null, ConnectionState.IN_GAME),
REQUEST_IN_ZONE_WAITING_TIME(0xBA, RequestInzoneWaitingTime::new, ConnectionState.IN_GAME),
REQUEST_JOIN_CURIOUS_HOUSE(0xBB, RequestJoinCuriousHouse::new, ConnectionState.IN_GAME),
REQUEST_CANCEL_CURIOUS_HOUSE(0xBC, RequestCancelCuriousHouse::new, ConnectionState.IN_GAME),
REQUEST_LEAVE_CURIOUS_HOUSE(0xBD, null, ConnectionState.IN_GAME),
REQUEST_OBSERVING_LIST_CURIOUS_HOUSE(0xBE, null, ConnectionState.IN_GAME),
REQUEST_OBSERVING_CURIOUS_HOUSE(0xBF, null, ConnectionState.IN_GAME),
REQUEST_LEAVE_OBSERVING_CURIOUS_HOUSE(0xC0, null, ConnectionState.IN_GAME),
REQUEST_CURIOUS_HOUSE_HTML(0xC1, RequestCuriousHouseHtml::new, ConnectionState.IN_GAME),
REQUEST_CURIOUS_HOUSE_RECORD(0xC2, null, ConnectionState.IN_GAME),
EX_SYSSTRING(0xC3, null, ConnectionState.IN_GAME),
REQUEST_EX_TRY_TO_ĂśT_SHAPE_SHIFTING_TARGET_ITEM(0xC4, RequestExTryToPutShapeShiftingTargetItem::new, ConnectionState.IN_GAME),
REQUEST_EX_TRY_TO_PUT_SHAPE_SHIFTING_ENCHANT_SUPPORT_ITEM(0xC5, RequestExTryToPutShapeShiftingEnchantSupportItem::new, ConnectionState.IN_GAME),
REQUEST_EX_CANCEL_SHAPE_SHIFTING_ITEM(0xC6, RequestExCancelShape_Shifting_Item::new, ConnectionState.IN_GAME),
REQUEST_SHAPE_SHIFTING_ITEM(0xC7, RequestShapeShiftingItem::new, ConnectionState.IN_GAME),
NC_GUARD_SEND_DATA_TO_SERVER(0xC8, null, ConnectionState.IN_GAME),
REQUEST_EVENT_KALIE_TOKEN(0xC9, null, ConnectionState.IN_GAME),
REQUEST_SHOW_BEAUTY_LIST(0xCA, RequestShowBeautyList::new, ConnectionState.IN_GAME),
REQUEST_REGIST_BEAUTY(0xCB, RequestRegistBeauty::new, ConnectionState.IN_GAME),
REQUEST_SHOW_RESET_SHOP_LIST(0xCD, RequestShowResetShopList::new, ConnectionState.IN_GAME),
NET_PING(0xCE, null, ConnectionState.IN_GAME),
REQUEST_BR_ADD_BASKET_PRODUCT_INFO(0xCF, null, ConnectionState.IN_GAME),
REQUEST_BR_DELETE_BASKET_PRODUCT_INFO(0xD0, null, ConnectionState.IN_GAME),
REQUEST_EX_EVENT_CAMPAIGN_INFO(0xD2, null, ConnectionState.IN_GAME),
REQUEST_PLEDGE_RECRUIT_INFO(0xD3, RequestPledgeRecruitInfo::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_RECRUIT_BOARD_SEARCH(0xD4, RequestPledgeRecruitBoardSearch::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_RECRUIT_BOARD_ACCESS(0xD5, RequestPledgeRecruitBoardAccess::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_RECRUIT_BOARD_DETAIL(0xD6, RequestPledgeRecruitBoardDetail::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_WAITING_APPLY(0xD7, RequestPledgeWaitingApply::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_WAITING_APPLIED(0xD8, RequestPledgeWaitingApplied::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_WAITING_LIST(0xD9, RequestPledgeWaitingList::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_WAITING_USER(0xDA, RequestPledgeWaitingUser::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_WAITING_USER_ACCEPT(0xDB, RequestPledgeWaitingUserAccept::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_DRAFT_LIST_SEARCH(0xDC, RequestPledgeDraftListSearch::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_DRAFT_LIST_APPLY(0xDD, RequestPledgeDraftListApply::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_RECRUIT_APPLY_INFO(0xDE, RequestPledgeRecruitApplyInfo::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_JOIN_SYS(0xDF, null, ConnectionState.IN_GAME),
RESPONSE_PETITION_ALARM(0xE0, null, ConnectionState.IN_GAME),
NOTIFY_EXIT_BEAUTY_SHOP(0xE1, NotifyExitBeautyShop::new, ConnectionState.IN_GAME),
REQUEST_REGISTER_XMAS_WISH_CARD(0xE2, null, ConnectionState.IN_GAME),
REQUEST_EX_ADD_ENCHANT_SCROLL_ITEM(0xE3, RequestExAddEnchantScrollItem::new, ConnectionState.IN_GAME),
REQUEST_EX_REMOVE_ENCHANT_SUPPORT_ITEM(0xE4, RequestExRemoveEnchantSupportItem::new, ConnectionState.IN_GAME),
REQUEST_CARD_REWARD(0xE5, null, ConnectionState.IN_GAME),
REQUEST_DIVIDE_ADENA_START(0xE6, RequestDivideAdenaStart::new, ConnectionState.IN_GAME),
REQUEST_DIVIDE_ADENA_CANCEL(0xE7, RequestDivideAdenaCancel::new, ConnectionState.IN_GAME),
REQUEST_DIVIDE_ADENA(0xE8, RequestDivideAdena::new, ConnectionState.IN_GAME),
REQUEST_ACQUIRE_ABILITY_LIST(0xE9, RequestAcquireAbilityList::new, ConnectionState.IN_GAME),
REQUEST_ABILITY_LIST(0xEA, RequestAbilityList::new, ConnectionState.IN_GAME),
REQUEST_RESET_ABILITY_POINT(0xEB, RequestResetAbilityPoint::new, ConnectionState.IN_GAME),
REQUEST_CHANGE_ABILITY_POINT(0xEC, RequestChangeAbilityPoint::new, ConnectionState.IN_GAME),
REQUEST_STOP_MOVE(0xED, null, ConnectionState.IN_GAME),
REQUEST_ABILITY_WND_OPEN(0xEE, RequestAbilityWndOpen::new, ConnectionState.IN_GAME),
REQUEST_ABILITY_WND_CLOSE(0xEF, RequestAbilityWndClose::new, ConnectionState.IN_GAME),
EX_PC_CAFE_REQUEST_OPEN_WINDOW_WITHOUT_NPC(0xF0, null, ConnectionState.IN_GAME),
REQUEST_LUCKY_GAME_PLAY(0xF2, null, ConnectionState.IN_GAME),
NOTIFY_TRAINING_ROOM_END(0xF3, null, ConnectionState.IN_GAME),
REQUEST_NEW_ENCHANT_PUSH_ONE(0xF4, RequestNewEnchantPushOne::new, ConnectionState.IN_GAME),
REQUEST_NEW_ENCHANT_REMOVE_ONE(0xF5, RequestNewEnchantRemoveOne::new, ConnectionState.IN_GAME),
REQUEST_NEW_ENCHANT_PUSH_TWO(0xF6, RequestNewEnchantPushTwo::new, ConnectionState.IN_GAME),
REQUEST_NEW_ENCHANT_REMOVE_TWO(0xF7, RequestNewEnchantRemoveTwo::new, ConnectionState.IN_GAME),
REQUEST_NEW_ENCHANT_CLOSE(0xF8, RequestNewEnchantClose::new, ConnectionState.IN_GAME),
REQUEST_NEW_ENCHANT_TRY(0xF9, RequestNewEnchantTry::new, ConnectionState.IN_GAME),
EX_SEND_SELECTED_QUEST_ZONE_ID(0xFE, ExSendSelectedQuestZoneID::new, ConnectionState.IN_GAME),
REQUEST_ALCHEMY_SKILL_LIST(0xFF, RequestAlchemySkillList::new, ConnectionState.IN_GAME),
REQUEST_ALCHEMY_TRY_MIX_CUBE(0x100, RequestAlchemyTryMixCube::new, ConnectionState.IN_GAME),
REQUEST_ALCHEMY_CONVERSION(0x101, RequestAlchemyConversion::new, ConnectionState.IN_GAME),
SEND_EXECUTED_UI_EVENTS_COUNT(0x102, null, ConnectionState.IN_GAME),
EX_SEND_CLIENT_INI(0x103, null, ConnectionState.IN_GAME),
REQUEST_EX_AUTO_FISH(0x104, ExRequestAutoFish::new, ConnectionState.IN_GAME),
REQUEST_VIP_ATTENDANCE_ITEM_LIST(0x105, null, ConnectionState.IN_GAME),
REQUEST_VIP_ATTENDANCE_CHECK(0x106, null, ConnectionState.IN_GAME),
REQUEST_ITEM_ENSOUL(0x107, RequestItemEnsoul::new, ConnectionState.IN_GAME),
REQUEST_VIP_PRODUCT_LIST(0x108, null, ConnectionState.IN_GAME),
REQUEST_VIP_LUCKY_GAME_INFO(0x109, null, ConnectionState.IN_GAME),
REQUEST_VIP_LUCKY_GAME_ITEM_LIST(0x10A, null, ConnectionState.IN_GAME),
REQUEST_VIP_LUCKY_GAME_BONUS(0x10B, null, ConnectionState.IN_GAME),
EXREQUEST_VIPINFO(0x10C, null, ConnectionState.IN_GAME),
REQUEST_CAPTCHA_ANSWER(0x10D, null, ConnectionState.IN_GAME),
REQUEST_REFRESH_CAPTCHA_IMAGE(0x10E, null, ConnectionState.IN_GAME),
REQUEST_TODO_LIST(0x10F, RequestTodoList::new, ConnectionState.IN_GAME),
REQUEST_TODO_LIST_HTML(0x110, null, ConnectionState.IN_GAME),
REQUEST_ONE_DAY_REWARD_RECEIVE(0x111, RequestOneDayRewardReceive::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_BONUS_OPEN(0x112, RequestPledgeBonusOpen::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_BONUS_REWARD_LIST(0x113, RequestPledgeBonusRewardList::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_BONUS_REWARD(0x114, RequestPledgeBonusReward::new, ConnectionState.IN_GAME),
REQUEST_SSO_AUTHN_TOKEN(0x115, null, ConnectionState.IN_GAME);
public static final ExIncomingPackets[] PACKET_ARRAY;
static
{
final short maxPacketId = (short) Arrays.stream(values()).mapToInt(IIncomingPackets::getPacketId).max().orElse(0);
PACKET_ARRAY = new ExIncomingPackets[maxPacketId + 1];
for (ExIncomingPackets incomingPacket : values())
{
PACKET_ARRAY[incomingPacket.getPacketId()] = incomingPacket;
}
}
private int _packetId;
private Supplier<IIncomingPacket<L2GameClient>> _incomingPacketFactory;
private Set<IConnectionState> _connectionStates;
ExIncomingPackets(int packetId, Supplier<IIncomingPacket<L2GameClient>> incomingPacketFactory, IConnectionState... connectionStates)
{
// packetId is an unsigned short
if (packetId > 0xFFFF)
{
throw new IllegalArgumentException("packetId must not be bigger than 0xFFFF");
}
_packetId = packetId;
_incomingPacketFactory = incomingPacketFactory != null ? incomingPacketFactory : () -> null;
_connectionStates = new HashSet<>(Arrays.asList(connectionStates));
}
@Override
public int getPacketId()
{
return _packetId;
}
@Override
public IIncomingPacket<L2GameClient> newIncomingPacket()
{
return _incomingPacketFactory.get();
}
@Override
public Set<IConnectionState> getConnectionStates()
{
return _connectionStates;
}
}

View File

@ -0,0 +1,255 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.l2jmobius.gameserver.network.client;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Supplier;
import com.l2jmobius.commons.network.IConnectionState;
import com.l2jmobius.commons.network.IIncomingPacket;
import com.l2jmobius.commons.network.IIncomingPackets;
import com.l2jmobius.gameserver.network.clientpackets.*;
import com.l2jmobius.gameserver.network.clientpackets.friend.RequestAnswerFriendInvite;
import com.l2jmobius.gameserver.network.clientpackets.friend.RequestFriendDel;
import com.l2jmobius.gameserver.network.clientpackets.friend.RequestFriendList;
import com.l2jmobius.gameserver.network.clientpackets.friend.RequestSendFriendMsg;
/**
* @author UnAfraid
*/
public enum IncomingPackets implements IIncomingPackets<L2GameClient>
{
LOGOUT(0x00, Logout::new, ConnectionState.AUTHENTICATED, ConnectionState.IN_GAME),
ATTACK(0x01, Attack::new, ConnectionState.IN_GAME),
REQUEST_START_PLEDGE_WAR(0x03, RequestStartPledgeWar::new, ConnectionState.IN_GAME),
REQUEST_REPLY_START_PLEDGE(0x04, RequestReplyStartPledgeWar::new, ConnectionState.IN_GAME),
REQUEST_STOP_PLEDGE_WAR(0x05, RequestStopPledgeWar::new, ConnectionState.IN_GAME),
REQUEST_REPLY_STOP_PLEDGE_WAR(0x06, RequestReplyStopPledgeWar::new, ConnectionState.IN_GAME),
REQUEST_SURRENDER_PLEDGE_WAR(0x07, RequestSurrenderPledgeWar::new, ConnectionState.IN_GAME),
REQUEST_REPLY_SURRENDER_PLEDGE_WAR(0x08, RequestReplySurrenderPledgeWar::new, ConnectionState.IN_GAME),
REQUEST_SET_PLEDGE_CREST(0x09, RequestSetPledgeCrest::new, ConnectionState.IN_GAME),
REQUEST_GIVE_NICK_NAME(0x0B, RequestGiveNickName::new, ConnectionState.IN_GAME),
CHARACTER_CREATE(0x0C, CharacterCreate::new, ConnectionState.AUTHENTICATED),
CHARACTER_DELETE(0x0D, CharacterDelete::new, ConnectionState.AUTHENTICATED),
PROTOCOL_VERSION(0x0E, ProtocolVersion::new, ConnectionState.CONNECTED),
MOVE_BACKWARD_TO_LOCATION(0x0F, MoveBackwardToLocation::new, ConnectionState.IN_GAME),
ENTER_WORLD(0x11, EnterWorld::new, ConnectionState.IN_GAME),
CHARACTER_SELECT(0x12, CharacterSelect::new, ConnectionState.AUTHENTICATED),
NEW_CHARACTER(0x13, NewCharacter::new, ConnectionState.AUTHENTICATED),
REQUEST_ITEM_LIST(0x14, RequestItemList::new, ConnectionState.IN_GAME),
REQUEST_UN_EQUIP_ITEM(0x16, RequestUnEquipItem::new, ConnectionState.IN_GAME),
REQUEST_DROP_ITEM(0x17, RequestDropItem::new, ConnectionState.IN_GAME),
USE_ITEM(0x19, UseItem::new, ConnectionState.IN_GAME),
TRADE_REQUEST(0x1A, TradeRequest::new, ConnectionState.IN_GAME),
ADD_TRADE_ITEM(0x1B, AddTradeItem::new, ConnectionState.IN_GAME),
TRADE_DONE(0x1C, TradeDone::new, ConnectionState.IN_GAME),
ACTION(0x1F, Action::new, ConnectionState.IN_GAME),
REQUEST_LINK_HTML(0x22, RequestLinkHtml::new, ConnectionState.IN_GAME),
REQUEST_BYPASS_TO_SERVER(0x23, RequestBypassToServer::new, ConnectionState.IN_GAME),
REQUEST_BBS_WRITE(0x24, RequestBBSwrite::new, ConnectionState.IN_GAME),
REQUEST_JOIN_PLEDGE(0x26, RequestJoinPledge::new, ConnectionState.IN_GAME),
REQUEST_ANSWER_JOIN_PLEDGE(0x27, RequestAnswerJoinPledge::new, ConnectionState.IN_GAME),
REQUEST_WITHDRAWAL_PLEDGE(0x28, RequestWithdrawalPledge::new, ConnectionState.IN_GAME),
REQUEST_OUST_PLEDGE_MEMBER(0x29, RequestOustPledgeMember::new, ConnectionState.IN_GAME),
AUTH_LOGIN(0x2B, AuthLogin::new, ConnectionState.CONNECTED),
REQUEST_GET_ITEM_FROM_PET(0x2C, RequestGetItemFromPet::new, ConnectionState.IN_GAME),
REQUEST_ALLY_INFO(0x2E, RequestAllyInfo::new, ConnectionState.IN_GAME),
REQUEST_CRYSTALLIZE_ITEM(0x2F, RequestCrystallizeItem::new, ConnectionState.IN_GAME),
REQUEST_PRIVATE_STORE_MANAGE_SELL(0x30, RequestPrivateStoreManageSell::new, ConnectionState.IN_GAME),
SET_PRIVATE_STORE_LIST_SELL(0x31, SetPrivateStoreListSell::new, ConnectionState.IN_GAME),
ATTACK_REQUEST(0x32, AttackRequest::new, ConnectionState.IN_GAME),
REQUEST_TELEPORT(0x33, null, ConnectionState.IN_GAME),
SOCIAL_ACTION(0x34, null, ConnectionState.IN_GAME),
CHANGE_MOVE_TYPE(0x35, null, ConnectionState.IN_GAME),
CHANGE_WAIT_TYPE(0x36, null, ConnectionState.IN_GAME),
REQUEST_SELL_ITEM(0x37, RequestSellItem::new, ConnectionState.IN_GAME),
REQUEST_MAGIC_SKILL_LIST(0x38, RequestMagicSkillList::new, ConnectionState.IN_GAME),
REQUEST_MAGIC_SKILL_USE(0x39, RequestMagicSkillUse::new, ConnectionState.IN_GAME),
APPEARING(0x3A, Appearing::new, ConnectionState.IN_GAME),
SEND_WARE_HOUSE_DEPOSIT_LIST(0x3B, SendWareHouseDepositList::new, ConnectionState.IN_GAME),
SEND_WARE_HOUSE_WITH_DRAW_LIST(0x3C, SendWareHouseWithDrawList::new, ConnectionState.IN_GAME),
REQUEST_SHORT_CUT_REG(0x3D, RequestShortCutReg::new, ConnectionState.IN_GAME),
REQUEST_SHORT_CUT_DEL(0x3F, RequestShortCutDel::new, ConnectionState.IN_GAME),
REQUEST_BUY_ITEM(0x40, RequestBuyItem::new, ConnectionState.IN_GAME),
REQUEST_JOIN_PARTY(0x42, RequestJoinParty::new, ConnectionState.IN_GAME),
REQUEST_ANSWER_JOIN_PARTY(0x43, RequestAnswerJoinParty::new, ConnectionState.IN_GAME),
REQUEST_WITH_DRAWAL_PARTY(0x44, RequestWithDrawalParty::new, ConnectionState.IN_GAME),
REQUEST_OUST_PARTY_MEMBER(0x45, RequestOustPartyMember::new, ConnectionState.IN_GAME),
CANNOT_MOVE_ANYMORE(0x47, CannotMoveAnymore::new, ConnectionState.IN_GAME),
REQUEST_TARGET_CANCELD(0x48, RequestTargetCanceld::new, ConnectionState.IN_GAME),
SAY2(0x49, Say2::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_MEMBER_LIST(0x4D, RequestPledgeMemberList::new, ConnectionState.IN_GAME),
REQUEST_MAGIC_LIST(0x4F, null, ConnectionState.IN_GAME),
REQUEST_SKILL_LIST(0x50, RequestSkillList::new, ConnectionState.IN_GAME),
MOVE_WITH_DELTA(0x52, MoveWithDelta::new, ConnectionState.IN_GAME),
REQUEST_GET_ON_VEHICLE(0x53, RequestGetOnVehicle::new, ConnectionState.IN_GAME),
REQUEST_GET_OFF_VEHICLE(0x54, RequestGetOffVehicle::new, ConnectionState.IN_GAME),
ANSWER_TRADE_REQUEST(0x55, AnswerTradeRequest::new, ConnectionState.IN_GAME),
REQUEST_ACTION_USE(0x56, RequestActionUse::new, ConnectionState.IN_GAME),
REQUEST_RESTART(0x57, RequestRestart::new, ConnectionState.IN_GAME),
VALIDATE_POSITION(0x59, ValidatePosition::new, ConnectionState.IN_GAME),
START_ROTATING(0x5B, StartRotating::new, ConnectionState.IN_GAME),
FINISH_ROTATING(0x5C, FinishRotating::new, ConnectionState.IN_GAME),
REQUEST_SHOW_BOARD(0x5E, RequestShowBoard::new, ConnectionState.IN_GAME),
REQUEST_ENCHANT_ITEM(0x5F, RequestEnchantItem::new, ConnectionState.IN_GAME),
REQUEST_DESTROY_ITEM(0x60, RequestDestroyItem::new, ConnectionState.IN_GAME),
REQUEST_QUEST_LIST(0x62, RequestQuestList::new, ConnectionState.IN_GAME),
REQUEST_QUEST_ABORT(0x63, RequestQuestAbort::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_INFO(0x65, RequestPledgeInfo::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_EXTENDED_INFO(0x66, RequestPledgeExtendedInfo::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_CREST(0x67, RequestPledgeCrest::new, ConnectionState.IN_GAME),
REQUEST_SEND_FRIEND_MSG(0x6B, RequestSendFriendMsg::new, ConnectionState.IN_GAME),
REQUEST_SHOW_MINI_MAP(0x6C, RequestShowMiniMap::new, ConnectionState.IN_GAME),
REQUEST_RECORD_INFO(0x6E, RequestRecordInfo::new, ConnectionState.IN_GAME),
REQUEST_HENNA_EQUIP(0x6F, RequestHennaEquip::new, ConnectionState.IN_GAME),
REQUEST_HENNA_REMOVE_LIST(0x70, RequestHennaRemoveList::new, ConnectionState.IN_GAME),
REQUEST_HENNA_ITEM_REMOVE_INFO(0x71, RequestHennaItemRemoveInfo::new, ConnectionState.IN_GAME),
REQUEST_HENNA_REMOVE(0x72, RequestHennaRemove::new, ConnectionState.IN_GAME),
REQUEST_ACQUIRE_SKILL_INFO(0x73, RequestAcquireSkillInfo::new, ConnectionState.IN_GAME),
SEND_BYPASS_BUILD_CMD(0x74, SendBypassBuildCmd::new, ConnectionState.IN_GAME),
REQUEST_MOVE_TO_LOCATION_IN_VEHICLE(0x75, RequestMoveToLocationInVehicle::new, ConnectionState.IN_GAME),
CANNOT_MOVE_ANYMORE_IN_VEHICLE(0x76, CannotMoveAnymoreInVehicle::new, ConnectionState.IN_GAME),
REQUEST_FRIEND_INVITE(0x77, RequestFriendInvite::new, ConnectionState.IN_GAME),
REQUEST_ANSWER_FRIEND_INVITE(0x78, RequestAnswerFriendInvite::new, ConnectionState.IN_GAME),
REQUEST_FRIEND_LIST(0x79, RequestFriendList::new, ConnectionState.IN_GAME),
REQUEST_FRIEND_DEL(0x7A, RequestFriendDel::new, ConnectionState.IN_GAME),
CHARACTER_RESTORE(0x7B, CharacterRestore::new, ConnectionState.AUTHENTICATED),
REQUEST_ACQUIRE_SKILL(0x7C, RequestAcquireSkill::new, ConnectionState.IN_GAME),
REQUEST_RESTART_POINT(0x7D, RequestRestartPoint::new, ConnectionState.IN_GAME),
REQUEST_GM_COMMAND(0x7E, RequestGMCommand::new, ConnectionState.IN_GAME),
REQUEST_PARTY_MATCH_CONFIG(0x7F, RequestPartyMatchConfig::new, ConnectionState.IN_GAME),
REQUEST_PARTY_MATCH_LIST(0x80, RequestPartyMatchList::new, ConnectionState.IN_GAME),
REQUEST_PARTY_MATCH_DETAIL(0x81, RequestPartyMatchDetail::new, ConnectionState.IN_GAME),
REQUEST_PRIVATE_STORE_BUY(0x83, RequestPrivateStoreBuy::new, ConnectionState.IN_GAME),
REQUEST_TUTORIAL_LINK_HTML(0x85, RequestTutorialLinkHtml::new, ConnectionState.IN_GAME),
REQUEST_TUTORIAL_PASS_CMD_TO_SERVER(0x86, RequestTutorialPassCmdToServer::new, ConnectionState.IN_GAME),
REQUEST_TUTORIAL_QUESTION_MARK(0x87, RequestTutorialQuestionMark::new, ConnectionState.IN_GAME),
REQUEST_TUTORIAL_CLIENT_EVENT(0x88, RequestTutorialClientEvent::new, ConnectionState.IN_GAME),
REQUEST_PETITION(0x89, RequestPetition::new, ConnectionState.IN_GAME),
REQUEST_PETITION_CANCEL(0x8A, RequestPetitionCancel::new, ConnectionState.IN_GAME),
REQUEST_GM_LIST(0x8B, RequestGmList::new, ConnectionState.IN_GAME),
REQUEST_JOIN_ALLY(0x8C, RequestJoinAlly::new, ConnectionState.IN_GAME),
REQUEST_ANSWER_JOIN_ALLY(0x8D, RequestAnswerJoinAlly::new, ConnectionState.IN_GAME),
ALLY_LEAVE(0x8E, AllyLeave::new, ConnectionState.IN_GAME),
ALLY_DISMISS(0x8F, AllyDismiss::new, ConnectionState.IN_GAME),
REQUEST_DISMISS_ALLY(0x90, RequestDismissAlly::new, ConnectionState.IN_GAME),
REQUEST_SET_ALLY_CREST(0x91, RequestSetAllyCrest::new, ConnectionState.IN_GAME),
REQUEST_ALLY_CREST(0x92, RequestAllyCrest::new, ConnectionState.IN_GAME),
REQUEST_CHANGE_PET_NAME(0x93, RequestChangePetName::new, ConnectionState.IN_GAME),
REQUEST_PET_USE_ITEM(0x94, RequestPetUseItem::new, ConnectionState.IN_GAME),
REQUEST_GIVE_ITEM_TO_PET(0x95, RequestGiveItemToPet::new, ConnectionState.IN_GAME),
REQUEST_PRIVATE_STORE_QUIT_SELL(0x96, RequestPrivateStoreQuitSell::new, ConnectionState.IN_GAME),
SET_PRIVATE_STORE_MSG_SELL(0x97, SetPrivateStoreMsgSell::new, ConnectionState.IN_GAME),
REQUEST_PET_GET_ITEM(0x98, RequestPetGetItem::new, ConnectionState.IN_GAME),
REQUEST_PRIVATE_STORE_MANAGE_BUY(0x99, RequestPrivateStoreManageBuy::new, ConnectionState.IN_GAME),
SET_PRIVATE_STORE_LIST_BUY(0x9A, SetPrivateStoreListBuy::new, ConnectionState.IN_GAME),
REQUEST_PRIVATE_STORE_QUIT_BUY(0x9C, RequestPrivateStoreQuitBuy::new, ConnectionState.IN_GAME),
SET_PRIVATE_STORE_MSG_BUY(0x9D, SetPrivateStoreMsgBuy::new, ConnectionState.IN_GAME),
REQUEST_PRIVATE_STORE_SELL(0x9F, RequestPrivateStoreSell::new, ConnectionState.IN_GAME),
SEND_TIME_CHECK_PACKET(0xA0, null, ConnectionState.IN_GAME),
REQUEST_SKILL_COOL_TIME(0xA6, null, ConnectionState.IN_GAME),
REQUEST_PACKAGE_SENDABLE_ITEM_LIST(0xA7, RequestPackageSendableItemList::new, ConnectionState.IN_GAME),
REQUEST_PACKAGE_SEND(0xA8, RequestPackageSend::new, ConnectionState.IN_GAME),
REQUEST_BLOCK(0xA9, RequestBlock::new, ConnectionState.IN_GAME),
REQUEST_SIEGE_INFO(0xAA, RequestSiegeInfo::new, ConnectionState.IN_GAME),
REQUEST_SIEGE_ATTACKER_LIST(0xAB, RequestSiegeAttackerList::new, ConnectionState.IN_GAME),
REQUEST_SIEGE_DEFENDER_LIST(0xAC, RequestSiegeDefenderList::new, ConnectionState.IN_GAME),
REQUEST_JOIN_SIEGE(0xAD, RequestJoinSiege::new, ConnectionState.IN_GAME),
REQUEST_CONFIRM_SIEGE_WAITING_LIST(0xAE, RequestConfirmSiegeWaitingList::new, ConnectionState.IN_GAME),
REQUEST_SET_CASTLE_SIEGE_TIME(0xAF, RequestSetCastleSiegeTime::new, ConnectionState.IN_GAME),
MULTI_SELL_CHOOSE(0xB0, MultiSellChoose::new, ConnectionState.IN_GAME),
NET_PING(0xB1, null, ConnectionState.IN_GAME),
REQUEST_REMAIN_TIME(0xB2, null, ConnectionState.IN_GAME),
BYPASS_USER_CMD(0xB3, BypassUserCmd::new, ConnectionState.IN_GAME),
SNOOP_QUIT(0xB4, SnoopQuit::new, ConnectionState.IN_GAME),
REQUEST_RECIPE_BOOK_OPEN(0xB5, RequestRecipeBookOpen::new, ConnectionState.IN_GAME),
REQUEST_RECIPE_BOOK_DESTROY(0xB6, RequestRecipeBookDestroy::new, ConnectionState.IN_GAME),
REQUEST_RECIPE_ITEM_MAKE_INFO(0xB7, RequestRecipeItemMakeInfo::new, ConnectionState.IN_GAME),
REQUEST_RECIPE_ITEM_MAKE_SELF(0xB8, RequestRecipeItemMakeSelf::new, ConnectionState.IN_GAME),
REQUEST_RECIPE_SHOP_MANAGE_LIST(0xB9, null, ConnectionState.IN_GAME),
REQUEST_RECIPE_SHOP_MESSAGE_SET(0xBA, RequestRecipeShopMessageSet::new, ConnectionState.IN_GAME),
REQUEST_RECIPE_SHOP_LIST_SET(0xBB, RequestRecipeShopListSet::new, ConnectionState.IN_GAME),
REQUEST_RECIPE_SHOP_MANAGE_QUIT(0xBC, RequestRecipeShopManageQuit::new, ConnectionState.IN_GAME),
REQUEST_RECIPE_SHOP_MANAGE_CANCEL(0xBD, null, ConnectionState.IN_GAME),
REQUEST_RECIPE_SHOP_MAKE_INFO(0xBE, RequestRecipeShopMakeInfo::new, ConnectionState.IN_GAME),
REQUEST_RECIPE_SHOP_MAKE_ITEM(0xBF, RequestRecipeShopMakeItem::new, ConnectionState.IN_GAME),
REQUEST_RECIPE_SHOP_MANAGE_PREV(0xC0, RequestRecipeShopManagePrev::new, ConnectionState.IN_GAME),
OBSERVER_RETURN(0xC1, ObserverReturn::new, ConnectionState.IN_GAME),
REQUEST_EVALUATE(0xC2, null, ConnectionState.IN_GAME),
REQUEST_HENNA_ITEM_LIST(0xC3, RequestHennaItemList::new, ConnectionState.IN_GAME),
REQUEST_HENNA_ITEM_INFO(0xC4, RequestHennaItemInfo::new, ConnectionState.IN_GAME),
REQUEST_BUY_SEED(0xC5, RequestBuySeed::new, ConnectionState.IN_GAME),
DLG_ANSWER(0xC6, DlgAnswer::new, ConnectionState.IN_GAME),
REQUEST_PREVIEW_ITEM(0xC7, RequestPreviewItem::new, ConnectionState.IN_GAME),
REQUEST_SSQ_STATUS(0xC8, null, ConnectionState.IN_GAME),
REQUEST_PETITION_FEEDBACK(0xC9, RequestPetitionFeedback::new, ConnectionState.IN_GAME),
GAME_GUARD_REPLY(0xCB, GameGuardReply::new, ConnectionState.IN_GAME),
REQUEST_PLEDGE_POWER(0xCC, RequestPledgePower::new, ConnectionState.IN_GAME),
REQUEST_MAKE_MACRO(0xCD, RequestMakeMacro::new, ConnectionState.IN_GAME),
REQUEST_DELETE_MACRO(0xCE, RequestDeleteMacro::new, ConnectionState.IN_GAME),
REQUEST_BUY_PROCURE(0xCF, null, ConnectionState.IN_GAME),
EX_PACKET(0xD0, ExPacket::new, ConnectionState.values()); // This packet has its own connection state checking so we allow all of them
public static final IncomingPackets[] PACKET_ARRAY;
static
{
final short maxPacketId = (short) Arrays.stream(values()).mapToInt(IIncomingPackets::getPacketId).max().orElse(0);
PACKET_ARRAY = new IncomingPackets[maxPacketId + 1];
for (IncomingPackets incomingPacket : values())
{
PACKET_ARRAY[incomingPacket.getPacketId()] = incomingPacket;
}
}
private short _packetId;
private Supplier<IIncomingPacket<L2GameClient>> _incomingPacketFactory;
private Set<IConnectionState> _connectionStates;
IncomingPackets(int packetId, Supplier<IIncomingPacket<L2GameClient>> incomingPacketFactory, IConnectionState... connectionStates)
{
// packetId is an unsigned byte
if (packetId > 0xFF)
{
throw new IllegalArgumentException("packetId must not be bigger than 0xFF");
}
_packetId = (short) packetId;
_incomingPacketFactory = incomingPacketFactory != null ? incomingPacketFactory : () -> null;
_connectionStates = new HashSet<>(Arrays.asList(connectionStates));
}
@Override
public int getPacketId()
{
return _packetId;
}
@Override
public IIncomingPacket<L2GameClient> newIncomingPacket()
{
return _incomingPacketFactory.get();
}
@Override
public Set<IConnectionState> getConnectionStates()
{
return _connectionStates;
}
}

View File

@ -0,0 +1,944 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.l2jmobius.gameserver.network.client;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.concurrent.Future;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.l2jmobius.Config;
import com.l2jmobius.commons.database.DatabaseFactory;
import com.l2jmobius.commons.network.ChannelInboundHandler;
import com.l2jmobius.commons.network.ICrypt;
import com.l2jmobius.commons.network.IIncomingPacket;
import com.l2jmobius.commons.network.IOutgoingPacket;
import com.l2jmobius.gameserver.LoginServerThread;
import com.l2jmobius.gameserver.LoginServerThread.SessionKey;
import com.l2jmobius.gameserver.ThreadPoolManager;
import com.l2jmobius.gameserver.data.sql.impl.CharNameTable;
import com.l2jmobius.gameserver.data.sql.impl.ClanTable;
import com.l2jmobius.gameserver.data.sql.impl.OfflineTradersTable;
import com.l2jmobius.gameserver.data.xml.impl.SecondaryAuthData;
import com.l2jmobius.gameserver.enums.CharacterDeleteFailType;
import com.l2jmobius.gameserver.idfactory.IdFactory;
import com.l2jmobius.gameserver.instancemanager.AntiFeedManager;
import com.l2jmobius.gameserver.instancemanager.CommissionManager;
import com.l2jmobius.gameserver.instancemanager.MailManager;
import com.l2jmobius.gameserver.instancemanager.MentorManager;
import com.l2jmobius.gameserver.model.CharSelectInfoPackage;
import com.l2jmobius.gameserver.model.L2Clan;
import com.l2jmobius.gameserver.model.L2World;
import com.l2jmobius.gameserver.model.actor.L2Summon;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.entity.L2Event;
import com.l2jmobius.gameserver.model.olympiad.OlympiadManager;
import com.l2jmobius.gameserver.model.zone.ZoneId;
import com.l2jmobius.gameserver.network.SystemMessageId;
import com.l2jmobius.gameserver.network.serverpackets.ActionFailed;
import com.l2jmobius.gameserver.network.serverpackets.IClientOutgoingPacket;
import com.l2jmobius.gameserver.network.serverpackets.ServerClose;
import com.l2jmobius.gameserver.network.serverpackets.SystemMessage;
import com.l2jmobius.gameserver.security.SecondaryPasswordAuth;
import com.l2jmobius.gameserver.util.FloodProtectors;
import com.l2jmobius.gameserver.util.Util;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
/**
* Represents a client connected on Game Server.
* @author KenM
*/
public final class L2GameClient extends ChannelInboundHandler<L2GameClient>
{
protected static final Logger LOGGER = Logger.getLogger(L2GameClient.class.getName());
protected static final Logger _logAccounting = Logger.getLogger("accounting");
private final int _objectId;
// Info
private InetAddress _addr;
private Channel _channel;
private String _accountName;
private SessionKey _sessionId;
private L2PcInstance _activeChar;
private final ReentrantLock _activeCharLock = new ReentrantLock();
private SecondaryPasswordAuth _secondaryAuth;
private boolean _isAuthedGG;
private final long _connectionStartTime = System.currentTimeMillis();
private CharSelectInfoPackage[] _charSlotMapping = null;
// flood protectors
private final FloodProtectors _floodProtectors = new FloodProtectors(this);
// Task
protected final ScheduledFuture<?> _autoSaveInDB;
protected ScheduledFuture<?> _cleanupTask = null;
// Crypt
private final Crypt _crypt;
private boolean _isDetached = false;
private boolean _protocol;
private int[][] trace;
public L2GameClient()
{
_objectId = IdFactory.getInstance().getNextId();
_crypt = new Crypt(this);
if (Config.CHAR_DATA_STORE_INTERVAL > 0)
{
_autoSaveInDB = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new AutoSaveTask(), 300000L, Config.CHAR_DATA_STORE_INTERVAL);
}
else
{
_autoSaveInDB = null;
}
}
public int getObjectId()
{
return _objectId;
}
@Override
public void channelActive(ChannelHandlerContext ctx)
{
super.channelActive(ctx);
setConnectionState(ConnectionState.CONNECTED);
final InetSocketAddress address = (InetSocketAddress) ctx.channel().remoteAddress();
_addr = address.getAddress();
_channel = ctx.channel();
LOGGER.finer("Client Connected: " + ctx.channel());
}
@Override
public void channelInactive(ChannelHandlerContext ctx)
{
LOGGER.finer("Client Disconnected: " + ctx.channel());
// no long running tasks here, do it async
try
{
ThreadPoolManager.getInstance().executeGeneral(new DisconnectTask());
}
catch (RejectedExecutionException e)
{
// server is closing
}
}
@Override
protected void messageReceived(ChannelHandlerContext ctx, IIncomingPacket<L2GameClient> packet)
{
try
{
packet.run(this);
}
catch (Exception e)
{
LOGGER.log(Level.WARNING, "Exception for: " + toString() + " on packet.run: " + packet.getClass().getSimpleName(), e);
}
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
{
if (Config.DEBUG)
{
LOGGER.log(Level.WARNING, "Network exception caught for: " + toString(), cause);
}
}
public Channel getChannel()
{
return _channel;
}
public byte[] enableCrypt()
{
final byte[] key = BlowFishKeygen.getRandomKey();
_crypt.setKey(key);
return key;
}
/**
* For loaded offline traders returns localhost address.
* @return cached connection IP address, for checking detached clients.
*/
public InetAddress getConnectionAddress()
{
return _addr;
}
public long getConnectionStartTime()
{
return _connectionStartTime;
}
public L2PcInstance getActiveChar()
{
return _activeChar;
}
public void setActiveChar(L2PcInstance pActiveChar)
{
_activeChar = pActiveChar;
}
public ReentrantLock getActiveCharLock()
{
return _activeCharLock;
}
public FloodProtectors getFloodProtectors()
{
return _floodProtectors;
}
public void setGameGuardOk(boolean val)
{
_isAuthedGG = val;
}
public boolean isAuthedGG()
{
return _isAuthedGG;
}
public void setAccountName(String pAccountName)
{
_accountName = pAccountName;
if (SecondaryAuthData.getInstance().isEnabled())
{
_secondaryAuth = new SecondaryPasswordAuth(this);
}
}
public String getAccountName()
{
return _accountName;
}
public void setSessionId(SessionKey sk)
{
_sessionId = sk;
}
public SessionKey getSessionId()
{
return _sessionId;
}
public void sendPacket(IClientOutgoingPacket packet)
{
if (_isDetached || (packet == null))
{
return;
}
// Write into the channel.
_channel.writeAndFlush(packet);
// Run packet implementation.
packet.runImpl(getActiveChar());
}
/**
* @param smId
*/
public void sendPacket(SystemMessageId smId)
{
sendPacket(SystemMessage.getSystemMessage(smId));
}
public boolean isDetached()
{
return _isDetached;
}
public void setDetached(boolean b)
{
_isDetached = b;
}
/**
* Method to handle character deletion
* @param charslot
* @return a byte:
* <li>-1: Error: No char was found for such charslot, caught exception, etc...
* <li>0: character is not member of any clan, proceed with deletion
* <li>1: character is member of a clan, but not clan leader
* <li>2: character is clan leader
*/
public CharacterDeleteFailType markToDeleteChar(int charslot)
{
final int objectId = getObjectIdForSlot(charslot);
if (objectId < 0)
{
return CharacterDeleteFailType.UNKNOWN;
}
if (MentorManager.getInstance().isMentor(objectId))
{
return CharacterDeleteFailType.MENTOR;
}
else if (MentorManager.getInstance().isMentee(objectId))
{
return CharacterDeleteFailType.MENTEE;
}
else if (CommissionManager.getInstance().hasCommissionItems(objectId))
{
return CharacterDeleteFailType.COMMISSION;
}
else if (MailManager.getInstance().getMailsInProgress(objectId) > 0)
{
return CharacterDeleteFailType.MAIL;
}
else
{
final int clanId = CharNameTable.getInstance().getClassIdById(objectId);
if (clanId > 0)
{
final L2Clan clan = ClanTable.getInstance().getClan(clanId);
if (clan != null)
{
if (clan.getLeaderId() == objectId)
{
return CharacterDeleteFailType.PLEDGE_MASTER;
}
return CharacterDeleteFailType.PLEDGE_MEMBER;
}
}
}
if (Config.DELETE_DAYS == 0)
{
deleteCharByObjId(objectId);
}
else
{
try (Connection con = DatabaseFactory.getInstance().getConnection();
PreparedStatement ps2 = con.prepareStatement("UPDATE characters SET deletetime=? WHERE charId=?"))
{
ps2.setLong(1, System.currentTimeMillis() + (Config.DELETE_DAYS * 86400000L)); // 24*60*60*1000 = 86400000
ps2.setInt(2, objectId);
ps2.execute();
}
catch (SQLException e)
{
LOGGER.log(Level.WARNING, "Failed to update char delete time: ", e);
}
}
_logAccounting.info("Delete, " + objectId + ", " + this);
return CharacterDeleteFailType.NONE;
}
/**
* Save the L2PcInstance to the database.
*/
public void saveCharToDisk()
{
try
{
if (getActiveChar() != null)
{
getActiveChar().storeMe();
getActiveChar().storeRecommendations();
if (Config.UPDATE_ITEMS_ON_CHAR_STORE)
{
getActiveChar().getInventory().updateDatabase();
getActiveChar().getWarehouse().updateDatabase();
}
}
}
catch (Exception e)
{
LOGGER.log(Level.SEVERE, "Error saving character..", e);
}
}
public void markRestoredChar(int charslot)
{
final int objid = getObjectIdForSlot(charslot);
if (objid < 0)
{
return;
}
try (Connection con = DatabaseFactory.getInstance().getConnection();
PreparedStatement statement = con.prepareStatement("UPDATE characters SET deletetime=0 WHERE charId=?"))
{
statement.setInt(1, objid);
statement.execute();
}
catch (Exception e)
{
LOGGER.log(Level.SEVERE, "Error restoring character.", e);
}
_logAccounting.info("Restore, " + objid + ", " + this);
}
public static void deleteCharByObjId(int objid)
{
if (objid < 0)
{
return;
}
CharNameTable.getInstance().removeName(objid);
try (Connection con = DatabaseFactory.getInstance().getConnection())
{
try (PreparedStatement ps = con.prepareStatement("DELETE FROM character_contacts WHERE charId=? OR contactId=?"))
{
ps.setInt(1, objid);
ps.setInt(2, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM character_friends WHERE charId=? OR friendId=?"))
{
ps.setInt(1, objid);
ps.setInt(2, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM character_hennas WHERE charId=?"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM character_macroses WHERE charId=?"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM character_quests WHERE charId=?"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM character_recipebook WHERE charId=?"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM character_shortcuts WHERE charId=?"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM character_skills WHERE charId=?"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM character_skills_save WHERE charId=?"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM character_subclasses WHERE charId=?"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM heroes WHERE charId=?"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM olympiad_nobles WHERE charId=?"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM pets WHERE item_obj_id IN (SELECT object_id FROM items WHERE items.owner_id=?)"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM item_attributes WHERE itemId IN (SELECT object_id FROM items WHERE items.owner_id=?)"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM item_special_abilities WHERE objectId IN (SELECT object_id FROM items WHERE items.owner_id=?)"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM item_variables WHERE id IN (SELECT object_id FROM items WHERE items.owner_id=?)"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM items WHERE owner_id=?"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM merchant_lease WHERE player_id=?"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM character_reco_bonus WHERE charId=?"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM character_instance_time WHERE charId=?"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM character_variables WHERE charId=?"))
{
ps.setInt(1, objid);
ps.execute();
}
try (PreparedStatement ps = con.prepareStatement("DELETE FROM characters WHERE charId=?"))
{
ps.setInt(1, objid);
ps.execute();
}
}
catch (Exception e)
{
LOGGER.log(Level.SEVERE, "Error deleting character.", e);
}
}
public L2PcInstance loadCharFromDisk(int charslot)
{
final int objId = getObjectIdForSlot(charslot);
if (objId < 0)
{
return null;
}
L2PcInstance character = L2World.getInstance().getPlayer(objId);
if (character != null)
{
// exploit prevention, should not happens in normal way
LOGGER.severe("Attempt of double login: " + character.getName() + "(" + objId + ") " + getAccountName());
if (character.getClient() != null)
{
character.getClient().closeNow();
}
else
{
character.deleteMe();
}
return null;
}
character = L2PcInstance.load(objId);
if (character == null)
{
LOGGER.severe("could not restore in slot: " + charslot);
}
// setCharacter(character);
return character;
}
/**
* @param chars
*/
public void setCharSelection(CharSelectInfoPackage[] chars)
{
_charSlotMapping = chars;
}
public CharSelectInfoPackage getCharSelection(int charslot)
{
if ((_charSlotMapping == null) || (charslot < 0) || (charslot >= _charSlotMapping.length))
{
return null;
}
return _charSlotMapping[charslot];
}
public SecondaryPasswordAuth getSecondaryAuth()
{
return _secondaryAuth;
}
public void close(IOutgoingPacket packet)
{
if (packet != null)
{
_channel.writeAndFlush(packet);
}
_channel.close();
}
/**
* @param charslot
* @return
*/
private int getObjectIdForSlot(int charslot)
{
final CharSelectInfoPackage info = getCharSelection(charslot);
if (info == null)
{
LOGGER.warning(toString() + " tried to delete Character in slot " + charslot + " but no characters exits at that slot.");
return -1;
}
return info.getObjectId();
}
/**
* Close client connection with {@link ServerClose} packet
*/
public void closeNow()
{
_isDetached = true; // prevents more packets execution
close(ServerClose.STATIC_PACKET);
synchronized (this)
{
if (_cleanupTask != null)
{
cancelCleanup();
}
_cleanupTask = ThreadPoolManager.getInstance().scheduleGeneral(new CleanupTask(), 0); // instant
}
}
/**
* Produces the best possible string representation of this client.
*/
@Override
public String toString()
{
try
{
final InetAddress address = _addr;
final ConnectionState state = (ConnectionState) getConnectionState();
switch (state)
{
case CONNECTED:
return "[IP: " + (address == null ? "disconnected" : address.getHostAddress()) + "]";
case AUTHENTICATED:
return "[Account: " + getAccountName() + " - IP: " + (address == null ? "disconnected" : address.getHostAddress()) + "]";
case IN_GAME:
return "[Character: " + (getActiveChar() == null ? "disconnected" : getActiveChar().getName() + "[" + getActiveChar().getObjectId() + "]") + " - Account: " + getAccountName() + " - IP: " + (address == null ? "disconnected" : address.getHostAddress()) + "]";
default:
throw new IllegalStateException("Missing state on switch");
}
}
catch (NullPointerException e)
{
return "[Character read failed due to disconnect]";
}
}
protected class DisconnectTask implements Runnable
{
@Override
public void run()
{
boolean fast = true;
try
{
if ((getActiveChar() != null) && !isDetached())
{
setDetached(true);
if (offlineMode(getActiveChar()))
{
getActiveChar().leaveParty();
OlympiadManager.getInstance().unRegisterNoble(getActiveChar());
// If the L2PcInstance has Pet, unsummon it
L2Summon pet = getActiveChar().getPet();
if (pet != null)
{
pet.setRestoreSummon(true);
pet.unSummon(getActiveChar());
pet = getActiveChar().getPet();
// Dead pet wasn't unsummoned, broadcast npcinfo changes (pet will be without owner name - means owner offline)
if (pet != null)
{
pet.broadcastNpcInfo(0);
}
}
getActiveChar().getServitors().values().forEach(s ->
{
s.setRestoreSummon(true);
s.unSummon(getActiveChar());
});
if (Config.OFFLINE_SET_NAME_COLOR)
{
getActiveChar().getAppearance().setNameColor(Config.OFFLINE_NAME_COLOR);
getActiveChar().broadcastUserInfo();
}
if (getActiveChar().getOfflineStartTime() == 0)
{
getActiveChar().setOfflineStartTime(System.currentTimeMillis());
}
// Store trade on exit, if realtime saving is enabled.
if (Config.STORE_OFFLINE_TRADE_IN_REALTIME)
{
OfflineTradersTable.onTransaction(getActiveChar(), false, true);
}
_logAccounting.info("Entering offline mode, " + L2GameClient.this);
return;
}
fast = !getActiveChar().isInCombat() && !getActiveChar().isLocked();
}
cleanMe(fast);
}
catch (Exception e1)
{
LOGGER.log(Level.WARNING, "Error while disconnecting client.", e1);
}
IdFactory.getInstance().releaseId(getObjectId());
}
}
/**
* @param player the player to be check.
* @return {@code true} if the player is allowed to remain as off-line shop.
*/
protected boolean offlineMode(L2PcInstance player)
{
if (player.isInOlympiadMode() || player.isBlockedFromExit() || player.isJailed() || (player.getVehicle() != null))
{
return false;
}
boolean canSetShop = false;
switch (player.getPrivateStoreType())
{
case SELL:
case PACKAGE_SELL:
case BUY:
{
canSetShop = Config.OFFLINE_TRADE_ENABLE;
break;
}
case MANUFACTURE:
{
canSetShop = Config.OFFLINE_TRADE_ENABLE;
break;
}
default:
{
canSetShop = Config.OFFLINE_CRAFT_ENABLE && player.isInCraftMode();
break;
}
}
if (Config.OFFLINE_MODE_IN_PEACE_ZONE && !player.isInsideZone(ZoneId.PEACE))
{
canSetShop = false;
}
return canSetShop;
}
public void cleanMe(boolean fast)
{
try
{
synchronized (this)
{
if (_cleanupTask == null)
{
_cleanupTask = ThreadPoolManager.getInstance().scheduleGeneral(new CleanupTask(), fast ? 5 : 15000L);
}
}
}
catch (Exception e1)
{
LOGGER.log(Level.WARNING, "Error during cleanup.", e1);
}
}
protected class CleanupTask implements Runnable
{
@Override
public void run()
{
try
{
// we are going to manually save the char bellow thus we can force the cancel
if (_autoSaveInDB != null)
{
_autoSaveInDB.cancel(true);
// ThreadPoolManager.getInstance().removeGeneral((Runnable) _autoSaveInDB);
}
if (getActiveChar() != null) // this should only happen on connection loss
{
if (getActiveChar().isLocked())
{
LOGGER.warning("Player " + getActiveChar().getName() + " still performing subclass actions during disconnect.");
}
// we store all data from players who are disconnected while in an event in order to restore it in the next login
if (L2Event.isParticipant(getActiveChar()))
{
L2Event.savePlayerEventStatus(getActiveChar());
}
if (getActiveChar().isOnline())
{
getActiveChar().deleteMe();
AntiFeedManager.getInstance().onDisconnect(L2GameClient.this);
}
// prevent closing again
getActiveChar().setClient(null);
}
setActiveChar(null);
}
catch (Exception e1)
{
LOGGER.log(Level.WARNING, "Error while cleanup client.", e1);
}
finally
{
LoginServerThread.getInstance().sendLogout(getAccountName());
}
}
}
protected class AutoSaveTask implements Runnable
{
@Override
public void run()
{
try
{
final L2PcInstance player = getActiveChar();
if ((player != null) && player.isOnline()) // safety precaution
{
saveCharToDisk();
final L2Summon pet = player.getPet();
if (pet != null)
{
pet.storeMe();
}
player.getServitors().values().forEach(L2Summon::storeMe);
}
}
catch (Exception e)
{
LOGGER.log(Level.SEVERE, "Error on AutoSaveTask.", e);
}
}
}
public boolean isProtocolOk()
{
return _protocol;
}
public void setProtocolOk(boolean b)
{
_protocol = b;
}
public boolean handleCheat(String punishment)
{
if (_activeChar != null)
{
Util.handleIllegalPlayerAction(_activeChar, toString() + ": " + punishment, Config.DEFAULT_PUNISH);
return true;
}
final Logger logAudit = Logger.getLogger("audit");
logAudit.info("AUDIT: Client " + toString() + " kicked for reason: " + punishment);
closeNow();
return false;
}
public void setClientTracert(int[][] tracert)
{
trace = tracert;
}
public int[][] getTrace()
{
return trace;
}
private boolean cancelCleanup()
{
final Future<?> task = _cleanupTask;
if (task != null)
{
_cleanupTask = null;
return task.cancel(true);
}
return false;
}
public void sendActionFailed()
{
sendPacket(ActionFailed.STATIC_PACKET);
}
public ICrypt getCrypt()
{
return _crypt;
}
}

View File

@ -0,0 +1,730 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package com.l2jmobius.gameserver.network.client;
import com.l2jmobius.commons.network.PacketWriter;
/**
* @author UnAfraid
*/
public enum OutgoingPackets
{
// Packets
DIE(0x00),
REVIVE(0x01),
ATTACK_OUT_OF_RANGE(0x02),
ATTACKIN_COOL_TIME(0x03),
ATTACK_DEAD_TARGET(0x04),
SPAWN_ITEM(0x05),
SELL_LIST(0x06),
BUY_LIST(0x07),
DELETE_OBJECT(0x08),
CHARACTER_SELECTION_INFO(0x09),
LOGIN_FAIL(0x0A),
CHARACTER_SELECTED(0x0B),
NPC_INFO(0x0C),
NEW_CHARACTER_SUCCESS(0x0D),
NEW_CHARACTER_FAIL(0x0E),
CHARACTER_CREATE_SUCCESS(0x0F),
CHARACTER_CREATE_FAIL(0x10),
ITEM_LIST(0x11),
SUN_RISE(0x12),
SUN_SET(0x13),
TRADE_START(0x14),
TRADE_START_OK(0x15),
DROP_ITEM(0x16),
GET_ITEM(0x17),
STATUS_UPDATE(0x18),
NPC_HTML_MESSAGE(0x19),
TRADE_OWN_ADD(0x1A),
TRADE_OTHER_ADD(0x1B),
TRADE_DONE(0x1C),
CHARACTER_DELETE_SUCCESS(0x1D),
CHARACTER_DELETE_FAIL(0x1E),
ACTION_FAIL(0x1F),
SEVER_CLOSE(0x20),
INVENTORY_UPDATE(0x21),
TELEPORT_TO_LOCATION(0x22),
TARGET_SELECTED(0x23),
TARGET_UNSELECTED(0x24),
AUTO_ATTACK_START(0x25),
AUTO_ATTACK_STOP(0x26),
SOCIAL_ACTION(0x27),
CHANGE_MOVE_TYPE(0x28),
CHANGE_WAIT_TYPE(0x29),
MANAGE_PLEDGE_POWER(0x2A),
CREATE_PLEDGE(0x2B),
ASK_JOIN_PLEDGE(0x2C),
JOIN_PLEDGE(0x2D),
VERSION_CHECK(0x2E),
MOVE_TO_LOCATION(0x2F),
NPC_SAY(0x30),
CHAR_INFO(0x31),
USER_INFO(0x32),
ATTACK(0x33),
WITHDRAWAL_PLEDGE(0x34),
OUST_PLEDGE_MEMBER(0x35),
SET_OUST_PLEDGE_MEMBER(0x36),
DISMISS_PLEDGE(0x37),
SET_DISMISS_PLEDGE(0x38),
ASK_JOIN_PARTY(0x39),
JOIN_PARTY(0x3A),
WITHDRAWAL_PARTY(0x3B),
OUST_PARTY_MEMBER(0x3C),
SET_OUST_PARTY_MEMBER(0x3D),
DISMISS_PARTY(0x3E),
SET_DISMISS_PARTY(0x3F),
MAGIC_AND_SKILL_LIST(0x40),
WAREHOUSE_DEPOSIT_LIST(0x41),
WAREHOUSE_WITHDRAW_LIST(0x42),
WAREHOUSE_DONE(0x43),
SHORT_CUT_REGISTER(0x44),
SHORT_CUT_INIT(0x45),
SHORT_CUT_DELETE(0x46),
STOP_MOVE(0x47),
MAGIC_SKILL_USE(0x48),
MAGIC_SKILL_CANCELED(0x49),
SAY2(0x4A),
NPC_INFO_ABNORMAL_VISUAL_EFFECT(0x4B),
DOOR_INFO(0x4C),
DOOR_STATUS_UPDATE(0x4D),
PARTY_SMALL_WINDOW_ALL(0x4E),
PARTY_SMALL_WINDOW_ADD(0x4F),
PARTY_SMALL_WINDOW_DELETE_ALL(0x50),
PARTY_SMALL_WINDOW_DELETE(0x51),
PARTY_SMALL_WINDOW_UPDATE(0x52),
TRADE_PRESS_OWN_OK(0x53),
MAGIC_SKILL_LAUNCHED(0x54),
FRIEND_ADD_REQUEST_RESULT(0x55),
FRIEND_ADD(0x56),
FRIEND_REMOVE(0x57),
FRIEND_LIST(0x58),
FRIEND_STATUS(0x59),
PLEDGE_SHOW_MEMBER_LIST_ALL(0x5A),
PLEDGE_SHOW_MEMBER_LIST_UPDATE(0x5B),
PLEDGE_SHOW_MEMBER_LIST_ADD(0x5C),
PLEDGE_SHOW_MEMBER_LIST_DELETE(0x5D),
MAGIC_LIST(0x5E),
SKILL_LIST(0x5F),
VEHICLE_INFO(0x60),
FINISH_ROTATING(0x61),
SYSTEM_MESSAGE(0x62),
START_PLEDGE_WAR(0x63),
REPLY_START_PLEDGE_WAR(0x64),
STOP_PLEDGE_WAR(0x65),
REPLY_STOP_PLEDGE_WAR(0x66),
SURRENDER_PLEDGE_WAR(0x67),
REPLY_SURRENDER_PLEDGE_WAR(0x68),
SET_PLEDGE_CREST(0x69),
PLEDGE_CREST(0x6A),
SETUP_GAUGE(0x6B),
VEHICLE_DEPARTURE(0x6C),
VEHICLE_CHECK_LOCATION(0x6D),
GET_ON_VEHICLE(0x6E),
GET_OFF_VEHICLE(0x6F),
TRADE_REQUEST(0x70),
RESTART_RESPONSE(0x71),
MOVE_TO_PAWN(0x72),
SSQ_INFO(0x73),
GAME_GUARD_QUERY(0x74),
L2_FRIEND_LIST(0x75),
L2_FRIEND(0x76),
L2_FRIEND_STATUS(0x77),
L2_FRIEND_SAY(0x78),
VALIDATE_LOCATION(0x79),
START_ROTATING(0x7A),
SHOW_BOARD(0x7B),
CHOOSE_INVENTORY_ITEM(0x7C),
DUMMY(0x7D),
MOVE_TO_LOCATION_IN_VEHICLE(0x7E),
STOP_MOVE_IN_VEHICLE(0x7F),
VALIDATE_LOCATION_IN_VEHICLE(0x80),
TRADE_UPDATE(0x81),
TRADE_PRESS_OTHER_OK(0x82),
FRIEND_ADD_REQUEST(0x83),
LOG_OUT_OK(0x84),
ABNORMAL_STATUS_UPDATE(0x85),
QUEST_LIST(0x86),
ENCHANT_RESULT(0x87),
PLEDGE_SHOW_MEMBER_LIST_DELETE_ALL(0x88),
PLEDGE_INFO(0x89),
PLEDGE_EXTENDED_INFO(0x8A),
SUMMON_INFO(0x8B),
RIDE(0x8C),
DUMMY2(0x8D),
PLEDGE_SHOW_INFO_UPDATE(0x8E),
CLIENT_ACTION(0x8F),
ACQUIRE_SKILL_LIST(0x90),
ACQUIRE_SKILL_INFO(0x91),
SERVER_OBJECT_INFO(0x92),
GM_HIDE(0x93),
ACQUIRE_SKILL_DONE(0x94),
GM_VIEW_CHARACTER_INFO(0x95),
GM_VIEW_PLEDGE_INFO(0x96),
GM_VIEW_SKILL_INFO(0x97),
GM_VIEW_MAGIC_INFO(0x98),
GM_VIEW_QUEST_INFO(0x99),
GM_VIEW_ITEM_LIST(0x9A),
GM_VIEW_WAREHOUSE_WITHDRAW_LIST(0x9B),
LIST_PARTY_WATING(0x9C),
PARTY_ROOM_INFO(0x9D),
PLAY_SOUND(0x9E),
STATIC_OBJECT(0x9F),
PRIVATE_STORE_MANAGE_LIST(0xA0),
PRIVATE_STORE_LIST(0xA1),
PRIVATE_STORE_MSG(0xA2),
SHOW_MINIMAP(0xA3),
REVIVE_REQUEST(0xA4),
ABNORMAL_VISUAL_EFFECT(0xA5),
TUTORIAL_SHOW_HTML(0xA6),
TUTORIAL_SHOW_QUESTION_MARK(0xA7),
TUTORIAL_ENABLE_CLIENT_EVENT(0xA8),
TUTORIAL_CLOSE_HTML(0xA9),
SHOW_RADAR(0xAA),
WITHDRAW_ALLIANCE(0xAB),
OUST_ALLIANCE_MEMBER_PLEDGE(0xAC),
DISMISS_ALLIANCE(0xAD),
SET_ALLIANCE_CREST(0xAE),
ALLIANCE_CREST(0xAF),
SERVER_CLOSE_SOCKET(0xB0),
PET_STATUS_SHOW(0xB1),
PET_INFO(0xB2),
PET_ITEM_LIST(0xB3),
PET_INVENTORY_UPDATE(0xB4),
ALLIANCE_INFO(0xB5),
PET_STATUS_UPDATE(0xB6),
PET_DELETE(0xB7),
DELETE_RADAR(0xB8),
MY_TARGET_SELECTED(0xB9),
PARTY_MEMBER_POSITION(0xBA),
ASK_JOIN_ALLIANCE(0xBB),
JOIN_ALLIANCE(0xBC),
PRIVATE_STORE_BUY_MANAGE_LIST(0xBD),
PRIVATE_STORE_BUY_LIST(0xBE),
PRIVATE_STORE_BUY_MSG(0xBF),
VEHICLE_START(0xC0),
NPC_INFO_STATE(0xC1),
START_ALLIANCE_WAR(0xC2),
REPLY_START_ALLIANCE_WAR(0xC3),
STOP_ALLIANCE_WAR(0xC4),
REPLY_STOP_ALLIANCE_WAR(0xC5),
SURRENDER_ALLIANCE_WAR(0xC6),
SKILL_COOL_TIME(0xC7),
PACKAGE_TO_LIST(0xC8),
CASTLE_SIEGE_INFO(0xC9),
CASTLE_SIEGE_ATTACKER_LIST(0xCA),
CASTLE_SIEGE_DEFENDER_LIST(0xCB),
NICK_NAME_CHANGED(0xCC),
PLEDGE_STATUS_CHANGED(0xCD),
RELATION_CHANGED(0xCE),
EVENT_TRIGGER(0xCF),
MULTI_SELL_LIST(0xD0),
SET_SUMMON_REMAIN_TIME(0xD1),
PACKAGE_SENDABLE_LIST(0xD2),
EARTHQUAKE(0xD3),
FLY_TO_LOCATION(0xD4),
BLOCK_LIST(0xD5),
SPECIAL_CAMERA(0xD6),
NORMAL_CAMERA(0xD7),
SKILL_REMAIN_SEC(0xD8),
NET_PING(0xD9),
DICE(0xDA),
SNOOP(0xDB),
RECIPE_BOOK_ITEM_LIST(0xDC),
RECIPE_ITEM_MAKE_INFO(0xDD),
RECIPE_SHOP_MANAGE_LIST(0xDE),
RECIPE_SHOP_SELL_LIST(0xDF),
RECIPE_SHOP_ITEM_INFO(0xE0),
RECIPE_SHOP_MSG(0xE1),
SHOW_CALC(0xE2),
MON_RACE_INFO(0xE3),
HENNA_ITEM_INFO(0xE4),
HENNA_INFO(0xE5),
HENNA_UNEQUIP_LIST(0xE6),
HENNA_UNEQUIP_INFO(0xE7),
MACRO_LIST(0xE8),
BUY_LIST_SEED(0xE9),
SHOW_TOWN_MAP(0xEA),
OBSERVER_START(0xEB),
OBSERVER_END(0xEC),
CHAIR_SIT(0xED),
HENNA_EQUIP_LIST(0xEE),
SELL_LIST_PROCURE(0xEF),
GMHENNA_INFO(0xF0),
RADAR_CONTROL(0xF1),
CLIENT_SET_TIME(0xF2),
CONFIRM_DLG(0xF3),
PARTY_SPELLED(0xF4),
SHOP_PREVIEW_LIST(0xF5),
SHOP_PREVIEW_INFO(0xF6),
CAMERA_MODE(0xF7),
SHOW_XMAS_SEAL(0xF8),
ETC_STATUS_UPDATE(0xF9),
SHORT_BUFF_STATUS_UPDATE(0xFA),
SSQ_STATUS(0xFB),
PETITION_VOTE(0xFC),
AGIT_DECO_INFO(0xFD),
DUMMY3(0xFE),
// ExPackets
EX_DUMMY(0xFE, 0x00),
EX_REGEN_MAX(0xFE, 0x01),
EX_EVENT_MATCH_USER_INFO(0xFE, 0x02),
EX_COLOSSEUM_FENCE_INFO(0xFE, 0x03),
EX_EVENT_MATCH_SPELLED_INFO(0xFE, 0x04),
EX_EVENT_MATCH_FIRECRACKER(0xFE, 0x05),
EX_EVENT_MATCH_TEAM_UNLOCKED(0xFE, 0x06),
EX_EVENT_MATCH_GMTEST(0xFE, 0x07),
EX_PARTY_ROOM_MEMBER(0xFE, 0x08),
EX_CLOSE_PARTY_ROOM(0xFE, 0x09),
EX_MANAGE_PARTY_ROOM_MEMBER(0xFE, 0x0A),
EX_EVENT_MATCH_LOCK_RESULT(0xFE, 0x0B),
EX_AUTO_SOUL_SHOT(0xFE, 0x0C),
EX_EVENT_MATCH_LIST(0xFE, 0x0D),
EX_EVENT_MATCH_OBSERVER(0xFE, 0x0E),
EX_EVENT_MATCH_MESSAGE(0xFE, 0x0F),
EX_EVENT_MATCH_SCORE(0xFE, 0x10),
EX_SERVER_PRIMITIVE(0xFE, 0x11),
EX_OPEN_MPCC(0xFE, 0x12),
EX_CLOSE_MPCC(0xFE, 0x13),
EX_SHOW_CASTLE_INFO(0xFE, 0x14),
EX_SHOW_FORTRESS_INFO(0xFE, 0x15),
EX_SHOW_AGIT_INFO(0xFE, 0x16),
EX_SHOW_FORTRESS_SIEGE_INFO(0xFE, 0x17),
EX_PARTY_PET_WINDOW_ADD(0xFE, 0x18),
EX_PARTY_PET_WINDOW_UPDATE(0xFE, 0x19),
EX_ASK_JOIN_MPCC(0xFE, 0x1A),
EX_PLEDGE_EMBLEM(0xFE, 0x1B),
EX_EVENT_MATCH_TEAM_INFO(0xFE, 0x1C),
EX_EVENT_MATCH_CREATE(0xFE, 0x1D),
EX_FISHING_START(0xFE, 0x1E),
EX_FISHING_END(0xFE, 0x1F),
EX_SHOW_QUEST_INFO(0xFE, 0x20),
EX_SHOW_QUEST_MARK(0xFE, 0x21),
EX_SEND_MANOR_LIST(0xFE, 0x22),
EX_SHOW_SEED_INFO(0xFE, 0x23),
EX_SHOW_CROP_INFO(0xFE, 0x24),
EX_SHOW_MANOR_DEFAULT_INFO(0xFE, 0x25),
EX_SHOW_SEED_SETTING(0xFE, 0x26),
EX_FISHING_START_COMBAT(0xFE, 0x27),
EX_FISHING_HP_REGEN(0xFE, 0x28),
EX_ENCHANT_SKILL_LIST(0xFE, 0x29),
EX_ENCHANT_SKILL_INFO(0xFE, 0x2A),
EX_SHOW_CROP_SETTING(0xFE, 0x2B),
EX_SHOW_SELL_CROP_LIST(0xFE, 0x2C),
EX_OLYMPIAD_MATCH_END(0xFE, 0x2D),
EX_MAIL_ARRIVED(0xFE, 0x2E),
EX_STORAGE_MAX_COUNT(0xFE, 0x2F),
EX_EVENT_MATCH_MANAGE(0xFE, 0x30),
EX_MULTI_PARTY_COMMAND_CHANNEL_INFO(0xFE, 0x31),
EX_PCCAFE_POINT_INFO(0xFE, 0x32),
EX_SET_COMPASS_ZONE_CODE(0xFE, 0x33),
EX_GET_BOSS_RECORD(0xFE, 0x34),
EX_ASK_JOIN_PARTY_ROOM(0xFE, 0x35),
EX_LIST_PARTY_MATCHING_WAITING_ROOM(0xFE, 0x36),
EX_SET_MPCC_ROUTING(0xFE, 0x37),
EX_SHOW_ADVENTURER_GUIDE_BOOK(0xFE, 0x38),
EX_SHOW_SCREEN_MESSAGE(0xFE, 0x39),
PLEDGE_SKILL_LIST(0xFE, 0x3A),
PLEDGE_SKILL_LIST_ADD(0xFE, 0x3B),
PLEDGE_SKILL_LIST_REMOVE(0xFE, 0x3C),
PLEDGE_POWER_GRADE_LIST(0xFE, 0x3D),
PLEDGE_RECEIVE_POWER_INFO(0xFE, 0x3E),
PLEDGE_RECEIVE_MEMBER_INFO(0xFE, 0x3F),
PLEDGE_RECEIVE_WAR_LIST(0xFE, 0x40),
PLEDGE_RECEIVE_SUB_PLEDGE_CREATED(0xFE, 0x41),
EX_RED_SKY(0xFE, 0x42),
PLEDGE_RECEIVE_UPDATE_POWER(0xFE, 0x43),
FLY_SELF_DESTINATION(0xFE, 0x44),
SHOW_PCCAFE_COUPON_SHOW_UI(0xFE, 0x45),
EX_SEARCH_ORC(0xFE, 0x46),
EX_CURSED_WEAPON_LIST(0xFE, 0x47),
EX_CURSED_WEAPON_LOCATION(0xFE, 0x48),
EX_RESTART_CLIENT(0xFE, 0x49),
EX_REQUEST_HACK_SHIELD(0xFE, 0x4A),
EX_USE_SHARED_GROUP_ITEM(0xFE, 0x4B),
EX_MPCCSHOW_PARTY_MEMBER_INFO(0xFE, 0x4C),
EX_DUEL_ASK_START(0xFE, 0x4D),
EX_DUEL_READY(0xFE, 0x4E),
EX_DUEL_START(0xFE, 0x4F),
EX_DUEL_END(0xFE, 0x50),
EX_DUEL_UPDATE_USER_INFO(0xFE, 0x51),
EX_SHOW_VARIATION_MAKE_WINDOW(0xFE, 0x52),
EX_SHOW_VARIATION_CANCEL_WINDOW(0xFE, 0x53),
EX_PUT_ITEM_RESULT_FOR_VARIATION_MAKE(0xFE, 0x54),
EX_PUT_INTENSIVE_RESULT_FOR_VARIATION_MAKE(0xFE, 0x55),
EX_PUT_COMMISSION_RESULT_FOR_VARIATION_MAKE(0xFE, 0x56),
EX_VARIATION_RESULT(0xFE, 0x57),
EX_PUT_ITEM_RESULT_FOR_VARIATION_CANCEL(0xFE, 0x58),
EX_VARIATION_CANCEL_RESULT(0xFE, 0x59),
EX_DUEL_ENEMY_RELATION(0xFE, 0x5A),
EX_PLAY_ANIMATION(0xFE, 0x5B),
EX_MPCCPARTY_INFO_UPDATE(0xFE, 0x5C),
EX_PLAY_SCENE(0xFE, 0x5D),
EX_SPAWN_EMITTER(0xFE, 0x5E),
EX_ENCHANT_SKILL_INFO_DETAIL(0xFE, 0x5F),
EX_BASIC_ACTION_LIST(0xFE, 0x60),
EX_AIR_SHIP_INFO(0xFE, 0x61),
EX_ATTRIBUTE_ENCHANT_RESULT(0xFE, 0x62),
EX_CHOOSE_INVENTORY_ATTRIBUTE_ITEM(0xFE, 0x63),
EX_GET_ON_AIR_SHIP(0xFE, 0x64),
EX_GET_OFF_AIR_SHIP(0xFE, 0x65),
EX_MOVE_TO_LOCATION_AIR_SHIP(0xFE, 0x66),
EX_STOP_MOVE_AIR_SHIP(0xFE, 0x67),
EX_SHOW_TRACE(0xFE, 0x68),
EX_ITEM_AUCTION_INFO(0xFE, 0x69),
EX_NEED_TO_CHANGE_NAME(0xFE, 0x6A),
EX_PARTY_PET_WINDOW_DELETE(0xFE, 0x6B),
EX_TUTORIAL_LIST(0xFE, 0x6C),
EX_RP_ITEM_LINK(0xFE, 0x6D),
EX_MOVE_TO_LOCATION_IN_AIR_SHIP(0xFE, 0x6E),
EX_STOP_MOVE_IN_AIR_SHIP(0xFE, 0x6F),
EX_VALIDATE_LOCATION_IN_AIR_SHIP(0xFE, 0x70),
EX_UI_SETTING(0xFE, 0x71),
EX_MOVE_TO_TARGET_IN_AIR_SHIP(0xFE, 0x72),
EX_ATTACK_IN_AIR_SHIP(0xFE, 0x73),
EX_MAGIC_SKILL_USE_IN_AIR_SHIP(0xFE, 0x74),
EX_SHOW_BASE_ATTRIBUTE_CANCEL_WINDOW(0xFE, 0x75),
EX_BASE_ATTRIBUTE_CANCEL_RESULT(0xFE, 0x76),
EX_SUB_PLEDGET_SKILL_ADD(0xFE, 0x77),
EX_RESPONSE_FREE_SERVER(0xFE, 0x78),
EX_SHOW_PROCURE_CROP_DETAIL(0xFE, 0x79),
EX_HERO_LIST(0xFE, 0x7A),
EX_OLYMPIAD_USER_INFO(0xFE, 0x7B),
EX_OLYMPIAD_SPELLED_INFO(0xFE, 0x7C),
EX_OLYMPIAD_MODE(0xFE, 0x7D),
EX_SHOW_FORTRESS_MAP_INFO(0xFE, 0x7E),
EX_PVP_MATCH_RECORD(0xFE, 0x7F),
EX_PVP_MATCH_USER_DIE(0xFE, 0x80),
EX_PRIVATE_STORE_WHOLE_MSG(0xFE, 0x81),
EX_PUT_ENCHANT_TARGET_ITEM_RESULT(0xFE, 0x82),
EX_PUT_ENCHANT_SUPPORT_ITEM_RESULT(0xFE, 0x83),
EX_CHANGE_NICKNAME_NCOLOR(0xFE, 0x84),
EX_GET_BOOK_MARK_INFO(0xFE, 0x85),
EX_NOTIFY_PREMIUM_ITEM(0xFE, 0x86),
EX_GET_PREMIUM_ITEM_LIST(0xFE, 0x87),
EX_PERIODIC_ITEM_LIST(0xFE, 0x88),
EX_JUMP_TO_LOCATION(0xFE, 0x89),
EX_PVP_MATCH_CCRECORD(0xFE, 0x8A),
EX_PVP_MATCH_CCMY_RECORD(0xFE, 0x8B),
EX_PVP_MATCH_CCRETIRE(0xFE, 0x8C),
EX_SHOW_TERRITORY(0xFE, 0x8D),
EX_NPC_QUEST_HTML_MESSAGE(0xFE, 0x8E),
EX_SEND_UIEVENT(0xFE, 0x8F),
EX_NOTIFY_BIRTH_DAY(0xFE, 0x90),
EX_SHOW_DOMINION_REGISTRY(0xFE, 0x91),
EX_REPLY_REGISTER_DOMINION(0xFE, 0x92),
EX_REPLY_DOMINION_INFO(0xFE, 0x93),
EX_SHOW_OWNTHING_POS(0xFE, 0x94),
EX_CLEFT_LIST(0xFE, 0x95),
EX_CLEFT_STATE(0xFE, 0x96),
EX_DOMINION_CHANNEL_SET(0xFE, 0x97),
EX_BLOCK_UP_SET_LIST(0xFE, 0x98),
EX_BLOCK_UP_SET_STATE(0xFE, 0x99),
EX_START_SCENE_PLAYER(0xFE, 0x9A),
EX_AIR_SHIP_TELEPORT_LIST(0xFE, 0x9B),
EX_MPCC_ROOM_INFO(0xFE, 0x9C),
EX_LIST_MPCC_WAITING(0xFE, 0x9D),
EX_DISSMISS_MPCC_ROOM(0xFE, 0x9E),
EX_MANAGE_MPCC_ROOM_MEMBER(0xFE, 0x9F),
EX_MPCC_ROOM_MEMBER(0xFE, 0xA0),
EX_VITALITY_POINT_INFO(0xFE, 0xA1),
EX_SHOW_SEED_MAP_INFO(0xFE, 0xA2),
EX_MPCC_PARTYMASTER_LIST(0xFE, 0xA3),
EX_DOMINION_WAR_START(0xFE, 0xA4),
EX_DOMINION_WAR_END(0xFE, 0xA5),
EX_SHOW_LINES(0xFE, 0xA6),
EX_PARTY_MEMBER_RENAMED(0xFE, 0xA7),
EX_ENCHANT_SKILL_RESULT(0xFE, 0xA8),
EX_REFUND_LIST(0xFE, 0xA9),
EX_NOTICE_POST_ARRIVED(0xFE, 0xAA),
EX_SHOW_RECEIVED_POST_LIST(0xFE, 0xAB),
EX_REPLY_RECEIVED_POST(0xFE, 0xAC),
EX_SHOW_SENT_POST_LIST(0xFE, 0xAD),
EX_REPLY_SENT_POST(0xFE, 0xAE),
EX_RESPONSE_SHOW_STEP_ONE(0xFE, 0xAF),
EX_RESPONSE_SHOW_STEP_TWO(0xFE, 0xB0),
EX_RESPONSE_SHOW_CONTENTS(0xFE, 0xB1),
EX_SHOW_PETITION_HTML(0xFE, 0xB2),
EX_REPLY_POST_ITEM_LIST(0xFE, 0xB3),
EX_CHANGE_POST_STATE(0xFE, 0xB4),
EX_REPLY_WRITE_POST(0xFE, 0xB5),
EX_INITIALIZE_SEED(0xFE, 0xB6),
EX_RAID_RESERVE_RESULT(0xFE, 0xB7),
EX_BUY_SELL_LIST(0xFE, 0xB8),
EX_CLOSE_RAID_SOCKET(0xFE, 0xB9),
EX_PRIVATE_MARKET_LIST(0xFE, 0xBA),
EX_RAID_CHARACTER_SELECTED(0xFE, 0xBB),
EX_ASK_COUPLE_ACTION(0xFE, 0xBC),
EX_BR_BROADCAST_EVENT_STATE(0xFE, 0xBD),
EX_BR_LOAD_EVENT_TOP_RANKERS(0xFE, 0xBE),
EX_CHANGE_NPC_STATE(0xFE, 0xBF),
EX_ASK_MODIFY_PARTY_LOOTING(0xFE, 0xC0),
EX_SET_PARTY_LOOTING(0xFE, 0xC1),
EX_ROTATION(0xFE, 0xC2),
EX_CHANGE_CLIENT_EFFECT_INFO(0xFE, 0xC3),
EX_MEMBERSHIP_INFO(0xFE, 0xC4),
EX_REPLY_HAND_OVER_PARTY_MASTER(0xFE, 0xC5),
EX_QUEST_NPC_LOG_LIST(0xFE, 0xC6),
EX_QUEST_ITEM_LIST(0xFE, 0xC7),
EX_GM_VIEW_QUEST_ITEM_LIST(0xFE, 0xC8),
EX_RESTART_RESPONSE(0xFE, 0xC9),
EX_VOTE_SYSTEM_INFO(0xFE, 0xCA),
EX_SHUTTLE_INFO(0xFE, 0xCB),
EX_SUTTLE_GET_ON(0xFE, 0xCC),
EX_SUTTLE_GET_OFF(0xFE, 0xCD),
EX_SUTTLE_MOVE(0xFE, 0xCE),
EX_MOVE_TO_LOCATION_IN_SUTTLE(0xFE, 0xCF),
EX_STOP_MOVE_IN_SHUTTLE(0xFE, 0xD0),
EX_VALIDATE_LOCATION_IN_SHUTTLE(0xFE, 0xD1),
EX_AGIT_AUCTION_CMD(0xFE, 0xD2),
EX_CONFIRM_ADDING_POST_FRIEND(0xFE, 0xD3),
EX_RECEIVE_SHOW_POST_FRIEND(0xFE, 0xD4),
EX_RECEIVE_OLYMPIAD(0xFE, 0xD5),
EX_BR_GAME_POINT(0xFE, 0xD6),
EX_BR_PRODUCT_LIST(0xFE, 0xD7),
EX_BR_PRODUCT_INFO(0xFE, 0xD8),
EX_BR_BUY_PRODUCT(0xFE, 0xD9),
EX_BR_PREMIUM_STATE(0xFE, 0xDA),
EX_BR_EXTRA_USER_INFO(0xFE, 0xDB),
EX_BR_BUFF_EVENT_STATE(0xFE, 0xDC),
EX_BR_RECENT_PRODUCT_LIST(0xFE, 0xDD),
EX_BR_MINIGAME_LOAD_SCORES(0xFE, 0xDE),
EX_BR_AGATHION_ENERGY_INFO(0xFE, 0xDF),
EX_SHOW_CHANNELING_EFFECT(0xFE, 0xE0),
EX_GET_CRYSTALIZING_ESTIMATION(0xFE, 0xE1),
EX_GET_CRYSTALIZING_FAIL(0xFE, 0xE2),
EX_NAVIT_ADVENT_POINT_INFO(0xFE, 0xE3),
EX_NAVIT_ADVENT_EFFECT(0xFE, 0xE4),
EX_NAVIT_ADVENT_TIME_CHANGE(0xFE, 0xE5),
EX_ABNORMAL_STATUS_UPDATE_FROM_TARGET(0xFE, 0xE6),
EX_STOP_SCENE_PLAYER(0xFE, 0xE7),
EX_FLY_MOVE(0xFE, 0xE8),
EX_DYNAMIC_QUEST(0xFE, 0xE9),
EX_SUBJOB_INFO(0xFE, 0xEA),
EX_CHANGE_MPCOST(0xFE, 0xEB),
EX_FRIEND_DETAIL_INFO(0xFE, 0xEC),
EX_BLOCK_ADD_RESULT(0xFE, 0xED),
EX_BLOCK_REMOVE_RESULT(0xFE, 0xEE),
EX_BLOCK_DEFAIL_INFO(0xFE, 0xEF),
EX_LOAD_INZONE_PARTY_HISTORY(0xFE, 0xF0),
EX_FRIEND_NOTIFY_NAME_CHANGE(0xFE, 0xF1),
EX_SHOW_COMMISSION(0xFE, 0xF2),
EX_RESPONSE_COMMISSION_ITEM_LIST(0xFE, 0xF3),
EX_RESPONSE_COMMISSION_INFO(0xFE, 0xF4),
EX_RESPONSE_COMMISSION_REGISTER(0xFE, 0xF5),
EX_RESPONSE_COMMISSION_DELETE(0xFE, 0xF6),
EX_RESPONSE_COMMISSION_LIST(0xFE, 0xF7),
EX_RESPONSE_COMMISSION_BUY_INFO(0xFE, 0xF8),
EX_RESPONSE_COMMISSION_BUY_ITEM(0xFE, 0xF9),
EX_ACQUIRABLE_SKILL_LIST_BY_CLASS(0xFE, 0xFA),
EX_MAGIC_ATTACK_INFO(0xFE, 0xFB),
EX_ACQUIRE_SKILL_INFO(0xFE, 0xFC),
EX_NEW_SKILL_TO_LEARN_BY_LEVEL_UP(0xFE, 0xFD),
EX_CALL_TO_CHANGE_CLASS(0xFE, 0xFE),
EX_CHANGE_TO_AWAKENED_CLASS(0xFE, 0xFF),
EX_TACTICAL_SIGN(0xFE, 0x100),
EX_LOAD_STAT_WORLD_RANK(0xFE, 0x101),
EX_LOAD_STAT_USER(0xFE, 0x102),
EX_LOAD_STAT_HOT_LINK(0xFE, 0x103),
EX_GET_WEB_SESSION_ID(0xFE, 0x104),
EX_2ND_PASSWORD_CHECK(0xFE, 0x105),
EX_2ND_PASSWORD_VERIFY(0xFE, 0x106),
EX_2ND_PASSWORD_ACK(0xFE, 0x107),
EX_FLY_MOVE_BROADCAST(0xFE, 0x108),
EX_SHOW_USM(0xFE, 0x109),
EX_SHOW_STAT_PAGE(0xFE, 0x10A),
EX_IS_CHAR_NAME_CREATABLE(0xFE, 0x10B),
EX_GOODS_INVENTORY_CHANGED_NOTI(0xFE, 0x10C),
EX_GOODS_INVENTORY_INFO(0xFE, 0x10D),
EX_GOODS_INVENTORY_RESULT(0xFE, 0x10E),
EX_ALTER_SKILL_REQUEST(0xFE, 0x10F),
EX_NOTIFY_FLY_MOVE_START(0xFE, 0x110),
EX_DUMMY2(0xFE, 0x111),
EX_CLOSE_COMMISSION(0xFE, 0x112),
EX_CHANGE_ATTRIBUTE_ITEM_LIST(0xFE, 0x113),
EX_CHANGE_ATTRIBUTE_INFO(0xFE, 0x114),
EX_CHANGE_ATTRIBUTE_OK(0xFE, 0x115),
EX_CHANGE_ATTRIBUTE_FAIL(0xFE, 0x116),
EX_LIGHTING_CANDLE_EVENT(0xFE, 0x117),
EX_VITALITY_EFFECT_INFO(0xFE, 0x118),
EX_LOGIN_VITALITY_EFFECT_INFO(0xFE, 0x119),
EX_BR_PRESENT_BUY_PRODUCT(0xFE, 0x11A),
EX_MENTOR_LIST(0xFE, 0x11B),
EX_MENTOR_ADD(0xFE, 0x11C),
LIST_MENTEE_WAITING(0xFE, 0x11D),
EX_INZONE_WAITING_INFO(0xFE, 0x11E),
EX_CURIOUS_HOUSE_STATE(0xFE, 0x11F),
EX_CURIOUS_HOUSE_ENTER(0xFE, 0x120),
EX_CURIOUS_HOUSE_LEAVE(0xFE, 0x121),
EX_CURIOUS_HOUSE_MEMBER_LIST(0xFE, 0x122),
EX_CURIOUS_HOUSE_MEMBER_UPDATE(0xFE, 0x123),
EX_CURIOUS_HOUSE_REMAIN_TIME(0xFE, 0x124),
EX_CURIOUS_HOUSE_RESULT(0xFE, 0x125),
EX_CURIOUS_HOUSE_OBSERVE_LIST(0xFE, 0x126),
EX_CURIOUS_HOUSE_OBSERVE_MODE(0xFE, 0x127),
EX_SYSSTRING(0xFE, 0x128),
EX_CHOOSE_SHAPE_SHIFTING_ITEM(0xFE, 0x129),
EX_PUT_SHAPE_SHIFTING_TARGET_ITEM_RESULT(0xFE, 0x12A),
EX_PUT_SHAPE_SHIFTING_EXTRACTION_ITEM_RESULT(0xFE, 0x12B),
EX_SHAPE_SHIFTING_RESULT(0xFE, 0x12C),
EX_CASTLE_STATE(0xFE, 0x12D),
EX_NCGUARD_RECEIVE_DATA_FROM_SERVER(0xFE, 0x12E),
EX_KALIE_EVENT(0xFE, 0x12F),
EX_KALIE_EVENT_JACKPOT_USER(0xFE, 0x130),
EX_ABNORMAL_VISUAL_EFFECT_INFO(0xFE, 0x131),
EX_NPC_INFO_SPEED(0xFE, 0x132),
EX_SET_PLEDGE_EMBLEM_ACK(0xFE, 0x133),
EX_SHOW_BEAUTY_MENU(0xFE, 0x134),
EX_RESPONSE_BEAUTY_LIST(0xFE, 0x135),
EX_RESPONSE_BEAUTY_REGIST_RESET(0xFE, 0x136),
EX_RESPONSE_RESET_LIST(0xFE, 0x137),
EX_SHUFFLE_SEED_AND_PUBLIC_KEY(0xFE, 0x138),
EX_CHECK_SPEED_HACK(0xFE, 0x139),
EX_BR_NEW_ICON_CASH_BTN_WND(0xFE, 0x13A),
EX_EVENT_CAMPAIGN_INFO(0xFE, 0x13B),
EX_UN_READ_MAIL_COUNT(0xFE, 0x13C),
EX_PLEDGE_COUNT(0xFE, 0x13D),
EX_ADENA_INVEN_COUNT(0xFE, 0x13E),
EX_PLEDGE_RECRUIT_INFO(0xFE, 0x13F),
EX_PLEDGE_RECRUIT_APPLY_INFO(0xFE, 0x140),
EX_PLEDGE_RECRUIT_BOARD_SEARCH(0xFE, 0x141),
EX_PLEDGE_RECRUIT_BOARD_DETAIL(0xFE, 0x142),
EX_PLEDGE_WAITING_LIST_APPLIED(0xFE, 0x143),
EX_PLEDGE_WAITING_LIST(0xFE, 0x144),
EX_PLEDGE_WAITING_USER(0xFE, 0x145),
EX_PLEDGE_DRAFT_LIST_SEARCH(0xFE, 0x146),
EX_PLEDGE_WAITING_LIST_ALARM(0xFE, 0x147),
EX_VALIDATE_ACTIVE_CHARACTER(0xFE, 0x148),
EX_CLOSE_COMMISSION_REGISTER(0xFE, 0x149),
EX_TELEPORT_TO_LOCATION_ACTIVATE(0xFE, 0x14A),
EX_NOTIFY_WEB_PETITION_REPLY_ALARM(0xFE, 0x14B),
EX_EVENT_SHOW_XMAS_WISH_CARD(0xFE, 0x14C),
EX_INVITATION_EVENT_UI_SETTING(0xFE, 0x14D),
EX_INVITATION_EVENT_INK_ENERGY(0xFE, 0x14E),
EX_CHECK_ABUSING(0xFE, 0x14F),
EX_GMVITALITY_EFFECT_INFO(0xFE, 0x150),
EX_PATH_TO_AWAKENING_ALARM(0xFE, 0x151),
EX_PUT_ENCHANT_SCROLL_ITEM_RESULT(0xFE, 0x152),
EX_REMOVE_ENCHANT_SUPPORT_ITEM_RESULT(0xFE, 0x153),
EX_SHOW_CARD_REWARD_LIST(0xFE, 0x154),
EX_GM_VIEW_CHARACTER_INFO(0xFE, 0x155),
EX_USER_INFO_EQUIP_SLOT(0xFE, 0x156),
EX_USER_INFO_CUBIC(0xFE, 0x157),
EX_USER_INFO_ABNORMAL_VISUAL_EFFECT(0xFE, 0x158),
EX_USER_INFO_FISHING(0xFE, 0x159),
EX_PARTY_SPELLED_INFO_UPDATE(0xFE, 0x15A),
EX_DIVIDE_ADENA_START(0xFE, 0x15B),
EX_DIVIDE_ADENA_CANCEL(0xFE, 0x15C),
EX_DIVIDE_ADENA_DONE(0xFE, 0x15D),
EX_PET_INFO(0xFE, 0x15E),
EX_ACQUIRE_AP_SKILL_LIST(0xFE, 0x15F),
EX_START_LUCKY_GAME(0xFE, 0x160),
EX_BETTING_LUCKY_GAME_RESULT(0xFE, 0x161),
EX_TRAINING_ZONE_ADMISSION(0xFE, 0x162),
EX_TRAINING_ZONE_LEAVING(0xFE, 0x163),
EX_PERIODIC_HENNA(0xFE, 0x164),
EX_SHOW_AP_LIST_WND(0xFE, 0x165),
EX_USER_INFO_INVEN_WEIGHT(0xFE, 0x166),
EX_CLOSE_AP_LIST_WND(0xFE, 0x167),
EX_ENCHANT_ONE_OK(0xFE, 0x168),
EX_ENCHANT_ONE_FAIL(0xFE, 0x169),
EX_ENCHANT_ONE_REMOVE_OK(0xFE, 0x16A),
EX_ENCHANT_ONE_REMOVE_FAIL(0xFE, 0x16B),
EX_ENCHANT_TWO_OK(0xFE, 0x16C),
EX_ENCHANT_TWO_FAIL(0xFE, 0x16D),
EX_ENCHANT_TWO_REMOVE_OK(0xFE, 0x16E),
EX_ENCHANT_TWO_REMOVE_FAIL(0xFE, 0x16F),
EX_ENCHANT_SUCESS(0xFE, 0x170),
EX_ENCHANT_FAIL(0xFE, 0x171),
EX_ACCOUNT_ATTENDANCE_INFO(0xFE, 0x172),
EX_WORLD_CHAT_CNT(0xFE, 0x173),
EX_ALCHEMY_SKILL_LIST(0xFE, 0x174),
EX_TRY_MIX_CUBE(0xFE, 0x175),
EX_ALCHEMY_CONVERSION(0xFE, 0x176),
EX_BEAUTY_ITEM_LIST(0xFE, 0x177),
EX_RECEIVE_CLIENT_INI(0xFE, 0x178),
EX_AUTO_FISH_AVAILABLE(0xFE, 0x179),
EX_CHANNEL_CHAT_ENTER_WORLD(0xFE, 0x17A),
EX_CHANNEL_CHAT_PLEGE_INFO(0xFE, 0x17B),
EX_VIP_ATTENDANCE_ITEM_LIST(0xFE, 0x17C),
EX_CONFIRM_VIP_ATTENDANCE_CHECK(0xFE, 0x17D),
EX_SHOW_ENSOUL_WINDOW(0xFE, 0x17E),
EX_ENSOUL_RESULT(0xFE, 0x17F),
RECIVE_VIP_PRODUCT_LIST(0xFE, 0x180),
RECIVE_VIP_LUCKY_GAME_INFO(0xFE, 0x181),
RECIVE_VIP_LUCKY_GAME_ITEM_LIST(0xFE, 0x182),
RECIVE_VIP_LUCKY_GAME_RESULT(0xFE, 0x183),
RECIVE_VIP_INFO(0xFE, 0x184),
RECIVE_VIP_INFO_REMAIN_TIME(0xFE, 0x185),
RECEIVE_VIP_BOT_CAPTCHA_IMAGE(0xFE, 0x186),
RECEIVE_VIP_BOT_CAPTCHA_ANSWER_RESULT(0xFE, 0x187),
EX_ONE_DAY_RECEIVE_REWARD_LIST(0xFE, 0x188),
EX_CONNECTED_TIME_AND_GETTABLE_REWARD(0xFE, 0x189),
EX_TODO_LIST_RECOMMAND(0xFE, 0x18A),
EX_TODO_LIST_INZONE(0xFE, 0x18B),
EX_TODO_LIST_HTML(0xFE, 0x18C),
EX_PLEDGE_BONUS_OPEN(0xFE, 0x18D),
EX_PLEDGE_BONUS_LIST(0xFE, 0x18E),
EX_PLEDGE_BONUS_MARK_RESET(0xFE, 0x18F),
EX_PLEDGE_BONUS_UPDATE(0xFE, 0x190),
EX_SSO_AUTH_TOKEN(0xFE, 0x191);
private final int _id1;
private final int _id2;
OutgoingPackets(int id1)
{
this(id1, -1);
}
OutgoingPackets(int id1, int id2)
{
_id1 = id1;
_id2 = id2;
}
public int getId1()
{
return _id1;
}
public int getId2()
{
return _id2;
}
public void writeId(PacketWriter packet)
{
packet.writeC(_id1);
if (_id2 > 0)
{
packet.writeH(_id2);
}
}
public static OutgoingPackets getPacket(int id1, int id2)
{
for (OutgoingPackets packet : values())
{
if ((packet.getId1() == id1) && (packet.getId2() == id2))
{
return packet;
}
}
return null;
}
}