Merged with released L2J-Unity files.
This commit is contained in:
@ -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)];
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
120
trunk/java/com/l2jmobius/gameserver/network/client/Crypt.java
Normal file
120
trunk/java/com/l2jmobius/gameserver/network/client/Crypt.java
Normal 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);
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user