package handling;
import client.MapleClient;
import constants.ServerConstants;
import handling.cashshop.CashShopServer;
import handling.cashshop.handler.BuyCashItemHandler;
import handling.cashshop.handler.CashShopOperation;
import handling.cashshop.handler.CouponCodeHandler;
import handling.channel.ChannelServer;
import handling.channel.handler.*;
import handling.login.LoginServer;
import handling.login.LoginWorker;
import handling.login.handler.*;
import handling.mina.MaplePacketDecoder;
import handling.world.World;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import javax.swing.table.DefaultTableModel;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.transport.socket.SocketSessionConfig;
import scripting.npc.NPCScriptManager;
import server.ManagerSin;
import tools.FileoutputUtil;
import tools.HexTool;
import tools.MapleAESOFB;
import tools.MaplePacketCreator;
import tools.Pair;
import tools.data.input.ByteArrayByteStream;
import tools.data.input.GenericSeekableLittleEndianAccessor;
import tools.data.input.SeekableLittleEndianAccessor;
import tools.packet.LoginPacket;
import tools.packet.UIPacket;
public class MapleServerHandler extends IoHandlerAdapter {
private final int channel;
public final static int CASH_SHOP_SERVER = -10;
public final static int LOGIN_SERVER = 0;
private static final boolean show = false;
private final List<String> BlockIPList = new ArrayList();
private final Map<String, Pair<Long, Byte>> tracker = new ConcurrentHashMap();
public MapleServerHandler(int channel) {
this.channel = channel;
}
@Override
public void sessionCreated(IoSession session) throws Exception {
SocketSessionConfig cfg = (SocketSessionConfig) session.getConfig();
cfg.setReceiveBufferSize(2 * 1024 * 1024);
cfg.setReadBufferSize(2 * 1024 * 1024);
cfg.setKeepAlive(true);
cfg.setSoLinger(0);
}
@Override
public void exceptionCaught(IoSession session, Throwable cause) { //异常捕获
if (cause.getMessage() != null) {
System.err.println("[异常信息] " + cause.getMessage());
cause.getLocalizedMessage();
FileoutputUtil.printError(FileoutputUtil.发现异常, cause.getMessage());
}
if ((!(cause instanceof IOException))) {
MapleClient client = (MapleClient) session.getAttribute(MapleClient.CLIENT_KEY);
if ((client != null) && (client.getPlayer() != null)) {
client.getPlayer().saveToDB(false, channel == MapleServerHandler.CASH_SHOP_SERVER);
FileoutputUtil.printError(FileoutputUtil.发现异常, cause, "发现异常 by: 玩家:" + client.getPlayer().getName() + " 职业:" + client.getPlayer().getJob() + " 地图:" + client.getPlayer().getMap().getMapName() + " - " + client.getPlayer().getMapId());
}
}
}
@Override
public void sessionOpened(IoSession session) throws Exception {
// 起始 IP 检查
String address = session.getRemoteAddress().toString().split(":")[0];
FileoutputUtil.log("[登陆服务] " + address + " 已连接");
if (BlockIPList.contains(address)) {
session.close(true);
return;
}
Pair track = (Pair) tracker.get(address);
byte count;
if (track == null) {
count = 1;
} else {
count = (Byte) track.right;
long difference = System.currentTimeMillis() - (Long) track.left;
if (difference < 2000L) {// 小于2秒
count = (byte) (count + 1);
} else if (difference > 20000L) {// 超过2秒
count = 1;
}
if (count > 10) {
BlockIPList.add(address);
tracker.remove(address);// 清理
session.close(true);
return;
}
}
tracker.put(address, new Pair(System.currentTimeMillis(), count));
// 结束 ID 检查
String IP = address.substring(address.indexOf('/') + 1, address.length());
if (channel == MapleServerHandler.CASH_SHOP_SERVER) {
if (CashShopServer.isShutdown()) {
session.close(true);
return;
}
} else if (channel == MapleServerHandler.LOGIN_SERVER) {
if (LoginServer.isShutdown()) {
session.close(true);
return;
}
} else if (this.channel > MapleServerHandler.LOGIN_SERVER) {
if (ChannelServer.getInstance(this.channel).isShutdown()) {
session.close(true);
return;
}
if (!LoginServer.containsIPAuth(IP)) {
session.close(true);
return;
}
} else {
FileoutputUtil.log("[連結錯誤] 未知類型: " + channel);
session.close(true);
return;
}
LoginServer.removeIPAuth(IP);
byte[] ivRecv = {70, 114, 122, 82};
byte[] ivSend = {82, 48, 120, 115};
ivRecv[3] = (byte) (int) (Math.random() * 255.0);
ivSend[3] = (byte) (int) (Math.random() * 255.0);
MapleAESOFB sendCypher = new MapleAESOFB(ivSend, 0xFFFF - ServerConstants.MAPLE_VERSION, false);
MapleAESOFB recvCypher = new MapleAESOFB(ivRecv, ServerConstants.MAPLE_VERSION, false);
MapleClient client = new MapleClient(sendCypher, recvCypher, session);
client.setChannel(channel);
MaplePacketDecoder.DecoderState decoderState = new MaplePacketDecoder.DecoderState();
session.setAttribute(MaplePacketDecoder.DECODER_STATE_KEY, decoderState);
byte[] handShakePacket = LoginPacket.getHello(ServerConstants.MAPLE_VERSION, ivSend, ivRecv);
session.write(handShakePacket);
byte[] hp = new byte[handShakePacket.length + 2];
hp[0] = (byte) 0xFF;
hp[1] = (byte) 0xFF;
for (int i = 2; i < handShakePacket.length + 2; i++) {
hp[i] = handShakePacket[i - 2];
}
FileoutputUtil.log("[登陆服务] " + address + ", 发送握手包成功!");
Random r = new Random();
client.setSessionId(r.nextLong()); // Generates a random session id.
session.setAttribute(MapleClient.CLIENT_KEY, client);
World.Client.addClient(client);
}
@Override
public void sessionClosed(final IoSession session) throws Exception {
MapleClient client = (MapleClient) session.getAttribute(MapleClient.CLIENT_KEY);
if (client != null) {
try {
int countRows = ManagerSin.jTable1.getRowCount();//获取当前表格总行数
for (int i = 0; i < countRows; i++) {
int AID = (Integer) ManagerSin.jTable1.getValueAt(i, 0);
if (AID == client.getAccID()) {
((DefaultTableModel) ManagerSin.jTable1.getModel()).removeRow(i);
break;
}
}
} catch (Exception e) {
FileoutputUtil.outputFileError(FileoutputUtil.GUI_Ex_Log, e);
}
try {
client.disconnect(true, (channel == MapleServerHandler.CASH_SHOP_SERVER));
} finally {
World.Client.removeClient(client);
session.close(true);
session.removeAttribute(MapleClient.CLIENT_KEY);
session.removeAttribute(MaplePacketDecoder.DECODER_STATE_KEY);
}
}
super.sessionClosed(session);
}
@Override
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
MapleClient client = (MapleClient) session.getAttribute(MapleClient.CLIENT_KEY);
if (client != null) {
//client.sendPing();
}
super.sessionIdle(session, status);
}
@Override
public void messageReceived(IoSession session, Object message) {
if (message == null || session == null) {
return;
}
SeekableLittleEndianAccessor slea = new GenericSeekableLittleEndianAccessor(new ByteArrayByteStream((byte[]) message));
if (slea.available() < 1) {
FileoutputUtil.log("数据包长度异常:" + slea.toString());
return;
}
MapleClient client = (MapleClient) session.getAttribute(MapleClient.CLIENT_KEY);
if (client == null || !client.isReceiving()) {
return;
}
short packetId = slea.readByte();
for (RecvPacketOpcode recv : RecvPacketOpcode.values()) {
if (recv.getValue() == packetId) {
if (recv.NeedsChecking() && !client.isLoggedIn()) {
FileoutputUtil.log("客户端没有登录,丢弃包!");
return;
}
try {
handlePacket(recv, slea, client);
} catch (InterruptedException e) {
FileoutputUtil.log(FileoutputUtil.Packet_Ex, new StringBuilder().append("封包: ").append(lookupRecv(packetId)).append("\r\n").append(slea.toString(true)).toString());
FileoutputUtil.outputFileError(FileoutputUtil.Packet_Ex, e);
}
return;
}
}
}
private String lookupRecv(short header) {
for (RecvPacketOpcode recv : RecvPacketOpcode.values()) {
if (recv.getValue() == header) {
return recv.name();
}
}
return "UNKNOWN";
}
public static void handlePacket(final RecvPacketOpcode header, final SeekableLittleEndianAccessor slea, final MapleClient c) throws InterruptedException {
switch (header) {
case ENTER:
final byte switchs = slea.readByte();
if (switchs == 1) {
c.getSession().write(MaplePacketCreator.enableActions());
}
break;
case STRANGE_DATA:
c.getSession().write(MaplePacketCreator.enableActions());
break;
case PONG:
c.pongReceived();
break;
case CLIENT_ERROR:
ClientErrorLogHandler.handlePacket(slea, c);
break;
case PACKET_ERROR:
PacketErrorHandler.handlePacket(slea, c);
break;
case LOGIN_PASSWORD:
LoginPasswordHandler.handlePacket(slea, c);
break;
case UPDATE_CHANNEL:
LoginWorker.updateChannel(c);
break;
case LICENSE_REQUEST:
LicenseRequestHandler.handlePacket(slea, c);
break;
case SET_GENDER:
SetGenderHandler.handlePacket(slea, c);
break;
case SET_ACC_CASH:
ShowAccCash.handlePacket(slea, c);
break;
case QUICK_BUY_CS_ITEM:
PlayerHandler.quickBuyCashShopItem(slea, c, c.getPlayer());
break;
case VIEW_SERVERLIST:
if (slea.readByte() == 0) {
ServerlistRequestHandler.handlePacket(c, false);
}
break;
case REDISPLAY_SERVERLIST:
case SERVERLIST_REQUEST:
ServerlistRequestHandler.handlePacket(c, true);
break;
case CLIENT_HELLO:
MapLoginHandler.handlePacket(slea, c);
break;
case GET_SERVER:
c.getSession().write(LoginPacket.getLoginAUTH());
break;
case CHARLIST_REQUEST:
CharlistRequestHandler.handlePacket(slea, c);
break;
case SERVERSTATUS_REQUEST:
ServerStatusRequestHandler.handlePacket(slea, c);
break;
case CHECK_REGISTER_ACCOUNT:
RegisterAccountHandler.handlePacket(slea,c);
break;
case CHECK_ACCOUNT:
RegisterAccountHandler.CheckAccount(slea,c);
break;
case REGISTER_ACCOUNT:
RegisterAccountHandler.RegisterAccount(slea,c);
break;
case CHECK_CHAR_NAME:
CheckCharNameHandler.handlePacket(slea, c);
break;
case CREATE_CHAR:
CreateCharHandler.handlePacket(slea, c);
break;
case DELETE_CHAR:
DeleteCharHandler.handlePacket(slea, c);
break;
case VIEW_ALL_CHAR:
ViewCharHandler.handlePacket(slea, c);
break;
case PICK_ALL_CHAR:
WithoutSecondPasswordHandler.handlePacket(slea, c, false, true);
break;
case CHAR_SELECT_NO_PIC:
WithoutSecondPasswordHandler.handlePacket(slea, c, false, false);
break;
case VIEW_REGISTER_PIC:
WithoutSecondPasswordHandler.handlePacket(slea, c, true, true);
break;
case CHAR_SELECT:
CharSelectedHandler.handlePacket(slea, c);
break;
case VIEW_SELECT_PIC:
WithSecondPasswordHandler.handlePacket(slea, c, true);
break;
case AUTH_SECOND_PASSWORD:
WithSecondPasswordHandler.handlePacket(slea, c, false);
break;
case CHANGE_CHANNEL:
InterServerHandler.ChangeChannel(slea, c, c.getPlayer());
break;
case PLAYER_LOGGEDIN://TODO 需要获取正确的世界
// c.setWorld(slea.readInt());
final int playerid = slea.readInt();
InterServerHandler.Loggedin(playerid, c);
break;
case ENTER_CASH_SHOP:
InterServerHandler.EnterCS(c, c.getPlayer());
break;
case MOVE_PLAYER:
PlayerHandler.MovePlayer(slea, c, c.getPlayer());
break;
case CHAR_INFO_REQUEST:
PlayerHandler.CharInfoRequest(slea.readInt(), c, c.getPlayer());
break;
case DAMAGE_SUMMON:
SummonHandler.DamageSummon(slea, c.getPlayer());
break;
case MOVE_SUMMON:
SummonHandler.MoveSummon(slea, c.getPlayer());
break;
case SUMMON_ATTACK:
case CLOSE_RANGE_ATTACK:
case RANGED_ATTACK:
case MAGIC_ATTACK:
case PASSIVE_ATTACK:
case MIST_ATTACK:
case SPECIAL_MAGIC_ATTACK:
PlayerHandler.攻击处理(slea, c, header);
break;
case SPECIAL_SKILL:
PlayerHandler.SpecialSkill(slea, c, c.getPlayer());
break;
case AFTER_SKILL:
PlayerHandler.AfterSkill(slea, c, c.getPlayer());
break;
case CHANGE_SET:
PlayersHandler.ChangeSet(slea, c, c.getPlayer());
break;
case MAKE_EXTRACTOR:
ItemMakerHandler.MakeExtractor(slea, c, c.getPlayer());
break;
case USE_FAMILIAR:
MobHandler.UseFamiliar(slea, c, c.getPlayer());
break;
case SPAWN_FAMILIAR:
MobHandler.SpawnFamiliar(slea, c, c.getPlayer());
break;
case RENAME_FAMILIAR:
MobHandler.RenameFamiliar(slea, c, c.getPlayer());
break;
case MOVE_FAMILIAR:
MobHandler.MoveFamiliar(slea, c, c.getPlayer());
break;
case ATTACK_FAMILIAR:
MobHandler.AttackFamiliar(slea, c, c.getPlayer());
break;
case TOUCH_FAMILIAR:
MobHandler.TouchFamiliar(slea, c, c.getPlayer());
break;
case USE_RECIPE:
ItemMakerHandler.UseRecipe(slea, c, c.getPlayer());
break;
case FACE_EXPRESSION:
PlayerHandler.ChangeEmotion(slea.readInt(), c.getPlayer());
break;
case TAKE_DAMAGE:
TakeDamageHandler.TakeDamage(slea, c, c.getPlayer());
break;
case HEAL_OVER_TIME:
PlayerHandler.Heal(slea, c.getPlayer());
break;
case CANCEL_BUFF:
PlayerHandler.CancelBuffHandler(slea.readInt(), c.getPlayer());
break;
case MECH_CANCEL:
PlayerHandler.CancelMech(slea, c.getPlayer());
break;
case USE_HOLY_FOUNTAIN:
PlayersHandler.UseHolyFountain(slea, c, c.getPlayer());
break;
case CANCEL_ITEM_EFFECT:
PlayerHandler.CancelItemEffect(slea.readInt(), c.getPlayer());
break;
case USE_CHAIR:
PlayerHandler.UseChair(slea.readShort(), c, c.getPlayer());
break;
case CANCEL_CHAIR:
PlayerHandler.CancelChair(slea.readShort(), c, c.getPlayer());
break;
case USE_ITEM_EFFECT:
PlayerHandler.UseItemEffect(slea.readInt(), c, c.getPlayer());
break;
case USE_TITLE_EFFECT:
PlayerHandler.UseTitleEffect(slea.readInt(), c, c.getPlayer());
break;
case SKILL_EFFECT:
PlayerHandler.SkillEffect(slea, c.getPlayer());
break;
case QUICK_SLOT:
PlayerHandler.QuickSlot(slea, c.getPlayer());
break;
case MESO_DROP:
PlayerHandler.DropMeso(slea.readInt(), c.getPlayer());
break;
case CHANGE_KEYMAP:
PlayerHandler.ChangeKeymap(slea, c.getPlayer());
break;
case CHANGE_MAP:
//if (type == ServerType.商城服务器) {
if (c.getPlayer().getMap() == null) {
CashShopOperation.LeaveCS(slea, c, c.getPlayer());
} else {
PlayerHandler.ChangeMap(slea, c, c.getPlayer());
}
break;
case CHANGE_MAP_SPECIAL:
PlayerHandler.ChangeMapSpecial(slea.readMapleAsciiString(), c, c.getPlayer());
break;
case USE_INNER_PORTAL:
slea.skip(1);
PlayerHandler.InnerPortal(slea, c, c.getPlayer());
break;
case TROCK_ADD_MAP:
PlayerHandler.TrockAddMap(slea, c, c.getPlayer());
break;
case SPECIAL_ATTACK:
PlayerHandler.specialAttack(slea, c, c.getPlayer());
break;
case GIVE_FAME:
PlayersHandler.GiveFame(slea, c, c.getPlayer());
break;
case TRANSFORM_PLAYER:
PlayersHandler.TransformPlayer(slea, c, c.getPlayer());
break;
case NOTE_ACTION:
PlayersHandler.Note(slea, c.getPlayer());
break;
case USE_DOOR:
PlayersHandler.UseDoor(slea, c.getPlayer());
break;
case USE_MECH_DOOR:
PlayersHandler.UseMechDoor(slea, c.getPlayer());
break;
case DAMAGE_REACTOR:
PlayersHandler.HitReactor(slea, c);
break;
case CLICK_REACTOR://重新领取勋章
case TOUCH_REACTOR://双击反应堆
PlayersHandler.TouchReactor(slea, c);
break;
case CLOSE_CHALKBOARD:
c.getPlayer().setChalkboard(null);
break;
case ITEM_MOVE:
InventoryHandler.ItemMove(slea, c);
break;
case MOVE_BAG:
InventoryHandler.MoveBag(slea, c);
break;
case SWITCH_BAG:
InventoryHandler.SwitchBag(slea, c);
break;
case ITEM_PICKUP:
InventoryHandler.PlayerPickupItem(slea, c, c.getPlayer());
break;
case USE_CASH_ITEM:
UseCashItemHandler.handlePacket(slea, c, c.getPlayer());
break;
case USE_ADDITIONAL_ITEM:
InventoryHandler.UseAdditionalItem(slea, c, c.getPlayer());
break;
case USE_ITEM:
InventoryHandler.UseItem(slea, c, c.getPlayer());
break;
case USE_COSMETIC:
InventoryHandler.UseCosmetic(slea, c, c.getPlayer());
break;
case USE_REDUCER:
InventoryHandler.UseReducer(slea, c, c.getPlayer());
break;
case USE_CARVED_SEAL:
InventoryHandler.UseCarvedSeal(slea, c, c.getPlayer());
break;
case USE_SCRIPTED_NPC_ITEM:
InventoryHandler.UseScriptedNPCItem(slea, c, c.getPlayer());
break;
case USE_RETURN_SCROLL:
InventoryHandler.UseReturnScroll(slea, c, c.getPlayer());
break;
case USE_UPGRADE_SCROLL:
ItemScrollHandler.handlePacket(slea, c, c.getPlayer(), false);
break;
case USE_FLAG_SCROLL:
ItemScrollHandler.handlePacket(slea, c, c.getPlayer(), true);
break;
case USE_POTENTIAL_ADD_SCROLL:
case USE_POTENTIAL_SCROLL:
case USE_EQUIP_SCROLL:
ItemScrollHandler.handlePacket(slea, c, c.getPlayer(), false);
break;
case USE_SUMMON_BAG:
InventoryHandler.UseSummonBag(slea, c, c.getPlayer());
break;
case USE_CATCH_ITEM:
InventoryHandler.UseCatchItem(slea, c, c.getPlayer());
break;
case USE_MOUNT_FOOD:
InventoryHandler.UseMountFood(slea, c, c.getPlayer());
break;
case REWARD_ITEM:
InventoryHandler.UseRewardItem((byte) slea.readShort(), slea.readInt(), c, c.getPlayer());
break;
case HYPNOTIZE_DMG:
MobHandler.HypnotizeDmg(slea, c.getPlayer());
break;
case MOB_NODE:
MobHandler.MobNode(slea, c.getPlayer());
break;
case DISPLAY_NODE:
MobHandler.DisplayNode(slea, c.getPlayer());
break;
case MOVE_LIFE:
MobHandler.MoveMonster(slea, c, c.getPlayer());
break;
case AUTO_AGGRO:
MobHandler.AutoAggro(slea.readInt(), c.getPlayer(), slea);
break;
case FRIENDLY_DAMAGE:
MobHandler.FriendlyDamage(slea, c.getPlayer());
break;
case MONSTER_BOMB:
MobHandler.MonsterBomb(slea.readInt(), c.getPlayer());
break;
case MOB_BOMB:
MobHandler.MobBomb(slea, c.getPlayer());
break;
case NPC_SHOP:
NPCHandler.NPCShop(slea, c, c.getPlayer());
break;
case NPC_TALK:
NPCHandler.NPCTalk(slea, c, c.getPlayer());
break;
case NPC_TALK_MORE:
NPCHandler.NPCMoreTalk(slea, c);
break;
case NPC_ACTION:
NPCHandler.NPCAnimation(slea, c);
break;
case QUEST_ACTION:
NPCHandler.QuestAction(slea, c, c.getPlayer());
break;
case REISSUE_MEDAL:
PlayerHandler.ReIssueMedal(slea, c, c.getPlayer());
break;
case STORAGE:
NPCHandler.Storage(slea, c, c.getPlayer());
break;
case GENERAL_CHAT:
if ((c.getPlayer() == null) || (c.getPlayer().getMap() == null)) {
break;
}
ChatHandler.GeneralChat(slea.readMapleAsciiString(), (byte)0, c, c.getPlayer());
break;
case PARTYCHAT:
ChatHandler.Others(slea, c, c.getPlayer());
break;
case WHISPER:
ChatHandler.Whisper_Find(slea, c);
break;
case MESSENGER:
ChatHandler.Messenger(slea, c);
break;
case SHOW_LOVE_RANK:
ChatHandler.ShowLoveRank(slea, c);
break;
case DISTRIBUTE_AP:
StatsHandling.DistributeAP(slea, c, c.getPlayer());
break;
case DISTRIBUTE_SP:
StatsHandling.DistributeSP(slea, c, c.getPlayer());
break;
case PLAYER_INTERACTION:
PlayerInteractionHandler.PlayerInteraction(slea, c, c.getPlayer());
break;
case GUILD_OPERATION:
GuildHandler.Guild(slea, c);
break;
case DENY_GUILD_REQUEST:
slea.skip(1);
GuildHandler.DenyGuildRequest(slea.readMapleAsciiString(), c);
break;
case JOIN_GUILD_REQUEST:
GuildHandler.JoinGuildRequest(slea.readInt(), c);
break;
case JOIN_GUILD_CANCEL:
GuildHandler.JoinGuildCancel(c);
break;
case ALLOW_GUILD_JOIN:
GuildHandler.AddGuildMember(slea, c);
break;
case DENY_GUILD_JOIN:
GuildHandler.DenyGuildJoin(slea, c);
break;
case BBS_OPERATION:
BBSHandler.BBSOperation(slea, c);
break;
case PARTY_OPERATION:
PartyHandler.PartyOperation(slea, c);
break;
case DENY_PARTY_REQUEST:
PartyHandler.DenyPartyRequest(slea, c);
break;
case ALLOW_PARTY_INVITE:
PartyHandler.AllowPartyInvite(slea, c);
break;
case SIDEKICK_OPERATION:
PartyHandler.SidekickOperation(slea, c);
break;
case DENY_SIDEKICK_REQUEST:
PartyHandler.DenySidekickRequest(slea, c);
break;
case BUDDYLIST_MODIFY:
BuddyListHandler.BuddyOperation(slea, c);
break;
case CYGNUS_SUMMON:
UserInterfaceHandler.CygnusSummon_NPCRequest(c);
break;
case SHIP_OBJECT:
UserInterfaceHandler.ShipObjectRequest(slea.readInt(), c);
break;
case BUY_CS_ITEM: // 购买商城道具
BuyCashItemHandler.BuyCashItem(slea, c, c.getPlayer());
break;
case COUPON_CODE:
CouponCodeHandler.handlePacket(slea, c, c.getPlayer());
break;
case CS_UPDATE:
CashShopOperation.CSUpdate(c);
break;
case SEND_CS_GIFI:
BuyCashItemHandler.商城送礼(slea, c, c.getPlayer());
break;
case SUB_SUMMON:
SummonHandler.SubSummon(slea, c.getPlayer());
break;
case REMOVE_SUMMON:
SummonHandler.RemoveSummon(slea, c);
break;
case SPAWN_PET:
PetHandler.SpawnPet(slea, c, c.getPlayer());
break;
case MOVE_PET:
PetHandler.MovePet(slea, c.getPlayer());
break;
case PET_CHAT:
PetHandler.PetChat(slea, c, c.getPlayer());
break;
case PET_COMMAND:
PetHandler.PetCommand(slea, c, c.getPlayer());
break;
case PET_FOOD:
PetHandler.PetFood(slea, c, c.getPlayer());
break;
case PET_LOOT:
InventoryHandler.Pickup_Pet(slea, c, c.getPlayer());
break;
case PET_AUTO_POT:
PetHandler.Pet_AutoPotion(slea, c, c.getPlayer());
break;
case PET_EXCEPTION_LIST:
PetHandler.PetExcludeItems(slea, c, c.getPlayer());
break;
case PET_AOTO_EAT:
slea.skip(4);
PetHandler.PetFood(slea, c, c.getPlayer());
break;
case ALLOW_PET_LOOT:
PetHandler.AllowPetLoot(slea, c, c.getPlayer());
break;
case ALLOW_PET_AOTO_EAT:
PetHandler.AllowPetAutoEat(slea, c, c.getPlayer());
break;
case USE_HIRED_MERCHANT:
HiredMerchantHandler.UseHiredMerchant(c, true);
break;
case MERCH_ITEM_STORE:
HiredMerchantHandler.MerchantItemStore(slea, c);
break;
case CANCEL_DEBUFF:
break;
case MAPLETV:
break;
case LEFT_KNOCK_BACK:
PlayerHandler.leftKnockBack(slea, c);
break;
case SNOWBALL:
PlayerHandler.snowBall(slea, c);
break;
case COCONUT:
PlayersHandler.hitCoconut(slea, c);
break;
case GAME_POLL:
UserInterfaceHandler.InGame_Poll(slea, c);
break;
case OWL:
InventoryHandler.Owl(slea, c);
break;
case OWL_WARP:
InventoryHandler.OwlWarp(slea, c);
break;
case USE_OWL_MINERVA:
InventoryHandler.OwlMinerva(slea, c);
break;
case RPS_GAME:
NPCHandler.RPSGame(slea, c);
break;
case UPDATE_QUEST:
NPCHandler.UpdateQuest(slea, c);
break;
case USE_ITEM_QUEST:
NPCHandler.UseItemQuest(slea, c);
break;
case FOLLOW_REQUEST:
PlayersHandler.FollowRequest(slea, c);
break;
case AUTO_FOLLOW_REPLY:
case FOLLOW_REPLY:
PlayersHandler.FollowReply(slea, c);
break;
case RING_ACTION:
PlayersHandler.RingAction(slea, c);
break;
case SOLOMON:
PlayersHandler.Solomon(slea, c);
break;
case GACH_EXP:
PlayersHandler.GachExp(slea, c);
break;
case PARTY_MEMBER_SEARCH:
PartyHandler.MemberSearch(slea, c);
break;
case PARTY_SEARCH:
PartyHandler.PartySearch(slea, c);
break;
case USE_TELE_ROCK:
InventoryHandler.TeleRock(slea, c);
break;
case PAM_SONG:
InventoryHandler.PamSong(slea, c);
break;
case REMOTE_STORE:
HiredMerchantHandler.RemoteStore(slea, c);
break;
case LOAD_PLAYER_SCCUCESS:
PlayerHandler.LoadPlayerSuccess(c, c.getPlayer());
break;
case PLAYER_UPDATE:
PlayerHandler.PlayerUpdate(c.getPlayer());
break;
case CHANGE_MARKET_MAP:
PlayerHandler.ChangeMarketMap(slea, c, c.getPlayer());
break;
case SET_CHAR_CASH:
PlayerHandler.showPlayerCash(slea, c);
break;
case OPEN_ROOT_NPC:
NPCScriptManager.getInstance().dispose(c);
// NPCScriptManager.getInstance().start(c, 1064026, 1);
break;
case GUIDE_TRANSFER:
PlayerHandler.GUIDE_TRANSFER(slea, c, c.getPlayer());//游戏向导
break;
case EXIT_GAME:
c.getSession().write(MaplePacketCreator.exitGame());
break;
case ARROWS_TURRET_ATTACK:
PlayerHandler.ArrowsTurretAttack(slea, c, c.getPlayer());
break;
case SPAWN_ARROWS_TURRET:
PlayerHandler.SpawnArrowsTurret(slea, c, c.getPlayer());
break;
case GETMONOID:
//PlayerHandler.getMonoid(slea, c.getPlayer());
break;
case UPDATE_MAC_SKILL:
PlayerHandler.UpdateMacrSkill(slea, c.getPlayer());
break;
case OPEN_MAP:
c.getSession().write(UIPacket.openMap());
break;
default:
FileoutputUtil.log(new StringBuilder().append("[未处理封包] Recv ").append(header.toString()).append(" [").append(HexTool.getOpcodeToString(header.getValue())).append("]").toString());
break;
}
}
}