/* * This file is part of aion-emu <aion-emu.com>. * * aion-emu 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. * * aion-emu 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 aion-emu. If not, see <http://www.gnu.org/licenses/>. */ package com.aionemu.gameserver.network.aion; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import com.aionemu.gameserver.network.aion.serverpackets.*; import com.aionemu.gameserver.network.aion.serverpackets.unk.SM_UNK5E; /** * This class is holding opcodes for all server packets. It's used only to have all opcodes in one place * * @author Luno * @author alexa026 * @author ATracer * @author avol * @author orz */ public class ServerPacketsOpcodes { private static Map<Class<? extends AionServerPacket>, Integer> opcodes = new HashMap<Class<? extends AionServerPacket>, Integer>(); static { Set<Integer> idSet = new HashSet<Integer>(); addPacketOpcode(SM_VERSION_CHECK.class, 0x00, idSet); addPacketOpcode(SM_STATS_INFO.class, 0x01, idSet); addPacketOpcode(SM_SET_BIND_POINT.class, 0x03, idSet); addPacketOpcode(SM_RIFT_ANNOUNCE.class, 0x04, idSet); addPacketOpcode(SM_ABYSS_RANK.class, 0x05, idSet); addPacketOpcode(SM_MACRO_LIST.class, 0x07, idSet); addPacketOpcode(SM_MACRO_RESULT.class, 0x08, idSet); addPacketOpcode(SM_NICKNAME_CHECK_RESPONSE.class, 0x09, idSet); addPacketOpcode(SM_FLY_TIME.class, 0x0C, idSet); addPacketOpcode(SM_FRIEND_UPDATE.class, 0x10, idSet); addPacketOpcode(SM_LEARN_RECIPE.class, 0x11, idSet); addPacketOpcode(SM_INVENTORY_INFO.class, 0x12, idSet); addPacketOpcode(SM_INVENTORY_UPDATE.class, 0x13, idSet); addPacketOpcode(SM_DELETE_ITEM.class, 0x14, idSet); addPacketOpcode(SM_UPDATE_ITEM.class, 0x15, idSet); addPacketOpcode(SM_DELETE.class, 0x16, idSet); addPacketOpcode(SM_LOGIN_QUEUE.class, 0x17, idSet); addPacketOpcode(SM_MESSAGE.class, 0x18, idSet); addPacketOpcode(SM_SYSTEM_MESSAGE.class, 0x19, idSet); addPacketOpcode(SM_GATHER_STATUS.class, 0x1A, idSet); addPacketOpcode(SM_GATHER_UPDATE.class, 0x1B, idSet); addPacketOpcode(SM_UPDATE_PLAYER_APPEARANCE.class, 0x1C, idSet); addPacketOpcode(SM_EMOTION.class, 0x1D, idSet); addPacketOpcode(SM_UI_SETTINGS.class, 0x1E, idSet); addPacketOpcode(SM_PLAYER_INFO.class, 0x20, idSet); addPacketOpcode(SM_CASTSPELL.class, 0x21, idSet); addPacketOpcode(SM_LEGION_UPDATE_NICKNAME.class, 0x23, idSet); addPacketOpcode(SM_LEGION_TABS.class, 0x24, idSet); addPacketOpcode(SM_ENTER_WORLD_CHECK.class, 0x25, idSet); addPacketOpcode(SM_STATUPDATE_DP.class, 0x26, idSet); addPacketOpcode(SM_STATUPDATE_EXP.class, 0x28, idSet); addPacketOpcode(SM_DP_INFO.class, 0x29, idSet); addPacketOpcode(SM_TELEPORT_LOC.class, 0x2C, idSet); addPacketOpcode(SM_NPC_INFO.class, 0x2E, idSet); addPacketOpcode(SM_PLAYER_SPAWN.class, 0x2F, idSet); addPacketOpcode(SM_GATHERABLE_INFO.class, 0x31, idSet); addPacketOpcode(SM_TRANSFORM.class, 0x32, idSet); addPacketOpcode(SM_DIALOG_WINDOW.class, 0x34, idSet); addPacketOpcode(SM_ATTACK.class, 0x36, idSet); addPacketOpcode(SM_MOVE.class, 0x37, idSet); addPacketOpcode(SM_WEATHER.class, 0x3B, idSet); addPacketOpcode(SM_PLAYER_STATE.class, 0x3C, idSet); addPacketOpcode(SM_SELL_ITEM.class, 0x3E, idSet); addPacketOpcode(SM_VIEW_PLAYER_DETAILS.class, 0x41, idSet); addPacketOpcode(SM_SKILL_CANCEL.class, 0x42, idSet); addPacketOpcode(SM_CASTSPELL_END.class, 0x43, idSet); addPacketOpcode(SM_SKILL_LIST.class, 0x44, idSet); addPacketOpcode(SM_GAME_TIME.class, 0x46, idSet); addPacketOpcode(SM_TIME_CHECK.class, 0x47, idSet); addPacketOpcode(SM_LOOKATOBJECT.class, 0x48, idSet); addPacketOpcode(SM_TARGET_SELECTED.class, 0x49, idSet); addPacketOpcode(SM_ABNORMAL_EFFECT.class, 0x4A, idSet); addPacketOpcode(SM_QUESTION_WINDOW.class, 0x4C, idSet); addPacketOpcode(SM_SKILL_ACTIVATION.class, 0x4E, idSet); addPacketOpcode(SM_ABNORMAL_STATE.class, 0x51, idSet); addPacketOpcode(SM_GROUP_INFO.class, 0x52, idSet); addPacketOpcode(SM_GROUP_MEMBER_INFO.class, 0x53, idSet); addPacketOpcode(SM_SHOW_NPC_ON_MAP.class, 0x59, idSet); addPacketOpcode(SM_QUIT_RESPONSE.class, 0x5A, idSet); addPacketOpcode(SM_EXCHANGE_REQUEST.class, 0x62, idSet); addPacketOpcode(SM_EXCHANGE_ADD_ITEM.class, 0x63, idSet); addPacketOpcode(SM_EXCHANGE_ADD_KINAH.class, 0x65, idSet); addPacketOpcode(SM_LEVEL_UPDATE.class, 0x66, idSet); addPacketOpcode(SM_KEY.class, 0x68, idSet); addPacketOpcode(SM_INFLUENCE_RATIO.class, 0x6D, idSet); addPacketOpcode(SM_EXCHANGE_CONFIRMATION.class, 0x6E, idSet); addPacketOpcode(SM_EMOTION_LIST.class, 0x6F, idSet); addPacketOpcode(SM_TARGET_UPDATE.class, 0x71, idSet); addPacketOpcode(SM_QUEST_LIST.class, 0x73, idSet); addPacketOpcode(SM_QUEST_ACCEPTED.class, 0x74, idSet); addPacketOpcode(SM_QUEST_STEP.class, 0x75, idSet); addPacketOpcode(SM_LEGION_UPDATE_SELF_INTRO.class, 0x77, idSet); addPacketOpcode(SM_CUBE_UPDATE.class, 0x7A, idSet); addPacketOpcode(SM_FRIEND_LIST.class, 0x7C, idSet); addPacketOpcode(SM_QUEST_DELETE.class, 0x7E, idSet); addPacketOpcode(SM_NEARBY_QUESTS.class, 0x7F, idSet); addPacketOpcode(SM_PING_RESPONSE.class, 0x80, idSet); addPacketOpcode(SM_UNK5E.class, 0x87, idSet); addPacketOpcode(SM_UPDATE_NOTE.class, 0x88, idSet); addPacketOpcode(SM_PLAY_MOVIE.class, 0x89, idSet); addPacketOpcode(SM_LEGION_UPDATE_TITLE.class, 0x8A, idSet); addPacketOpcode(SM_LEGION_INFO.class, 0x8E, idSet); addPacketOpcode(SM_LEGION_ADD_MEMBER.class, 0x8F, idSet); addPacketOpcode(SM_LEGION_LEAVE_MEMBER.class, 0x90, idSet); addPacketOpcode(SM_LEGION_UPDATE_MEMBER.class, 0x91, idSet); addPacketOpcode(SM_LEGION_MEMBERLIST.class, 0x95, idSet); addPacketOpcode(SM_LEGION_EDIT.class, 0x9E, idSet); addPacketOpcode(SM_MAIL_SERVICE.class, 0xA1, idSet); addPacketOpcode(SM_RIFT_STATUS.class, 0xA4, idSet); addPacketOpcode(SM_PLAYER_ID.class, 0xA5, idSet); addPacketOpcode(SM_PRIVATE_STORE.class, 0xA6, idSet); addPacketOpcode(SM_ABYSS_RANK_UPDATE.class, 0xA8, idSet); addPacketOpcode(SM_MAY_LOGIN_INTO_GAME.class, 0xA9, idSet); addPacketOpcode(SM_PONG.class, 0xAE, idSet); addPacketOpcode(SM_PRIVATE_STORE_NAME.class, 0xB1, idSet); addPacketOpcode(SM_ITEM_USAGE_ANIMATION.class, 0xB7, idSet); addPacketOpcode(SM_CUSTOM_SETTINGS.class, 0xB8, idSet); addPacketOpcode(SM_DUEL.class, 0xB9, idSet); addPacketOpcode(SM_RESURRECT.class, 0xBA, idSet); addPacketOpcode(SM_FORCED_MOVE.class, 0xBB, idSet); addPacketOpcode(SM_TELEPORT_MAP.class, 0xBC, idSet); addPacketOpcode(SM_USE_OBJECT.class, 0xBD, idSet); addPacketOpcode(SM_DIE.class, 0xC1, idSet); addPacketOpcode(SM_DELETE_WAREHOUSE_ITEM.class, 0xC2, idSet); addPacketOpcode(SM_UPDATE_WAREHOUSE_ITEM.class, 0xC3, idSet); addPacketOpcode(SM_WAREHOUSE_INFO.class, 0xC8, idSet); addPacketOpcode(SM_WAREHOUSE_UPDATE.class, 0xC9, idSet); addPacketOpcode(SM_TITLE_UPDATE.class, 0xCB, idSet); addPacketOpcode(SM_CRAFT_ANIMATION.class, 0xCC, idSet); addPacketOpcode(SM_CRAFT_UPDATE.class, 0xCD, idSet); addPacketOpcode(SM_TITLE_LIST.class, 0xD0, idSet); addPacketOpcode(SM_TITLE_SET.class, 0xD1, idSet); addPacketOpcode(SM_LEGION_UPDATE_EMBLEM.class, 0xD7, idSet); addPacketOpcode(SM_CHANNEL_INFO.class, 0xDD, idSet); addPacketOpcode(SM_FRIEND_RESPONSE.class, 0xDE, idSet); addPacketOpcode(SM_BLOCK_RESPONSE.class, 0xDF, idSet); addPacketOpcode(SM_BLOCK_LIST.class, 0xE0, idSet); addPacketOpcode(SM_FRIEND_NOTIFY.class, 0xE1, idSet); addPacketOpcode(SM_DELETE_CHARACTER.class, 0xE2, idSet); addPacketOpcode(SM_RESTORE_CHARACTER.class, 0xE3, idSet); addPacketOpcode(SM_TARGET_IMMOBILIZE.class, 0xE4, idSet); addPacketOpcode(SM_LOOT_STATUS.class, 0xE5, idSet); addPacketOpcode(SM_L2AUTH_LOGIN_CHECK.class, 0xE7, idSet); addPacketOpcode(SM_CHARACTER_LIST.class, 0xE8, idSet); addPacketOpcode(SM_CREATE_CHARACTER.class, 0xE9, idSet); addPacketOpcode(SM_PLAYER_SEARCH.class, 0xEB, idSet); addPacketOpcode(SM_LEGION_SEND_EMBLEM.class, 0xED, idSet); addPacketOpcode(SM_LOOT_ITEMLIST.class, 0xEE, idSet); addPacketOpcode(SM_RECIPE_LIST.class, 0xEF, idSet); addPacketOpcode(SM_MANTRA_EFFECT.class, 0xF0, idSet); addPacketOpcode(SM_PRICES.class, 0xF4, idSet); addPacketOpcode(SM_TRADELIST.class, 0xF5, idSet); addPacketOpcode(SM_LEAVE_GROUP_MEMBER.class, 0xF7, idSet); addPacketOpcode(SM_SHOW_BRAND.class, 0xF9, idSet); addPacketOpcode(SM_STATUPDATE_HP.class, 0xFB, idSet); addPacketOpcode(SM_STATUPDATE_MP.class, 0xFC, idSet); addPacketOpcode(SM_ATTACK_STATUS.class, 0xFD, idSet); addPacketOpcode(SM_RECONNECT_KEY.class, 0xFF, idSet); addPacketOpcode(SM_CUSTOM_PACKET.class, 99999, idSet); // fake packet addPacketOpcode(SM_SUMMON_PANEL.class, 0x99, idSet); addPacketOpcode(SM_SUMMON_PANEL_REMOVE.class, 0x92, idSet); addPacketOpcode(SM_SUMMON_UPDATE.class, 0x93, idSet); addPacketOpcode(SM_SUMMON_OWNER_REMOVE.class, 0x94, idSet); // Unrecognized Opcodes from 1.5.4: // addPacketOpcode(SM_BUY_LIST.class, 0x7E, idSet); // Unrecognized Opcodes from 1.5.0: // addPacketOpcode(SM_VIRTUAL_AUTH.class, 0xE4, idSet); // addPacketOpcode(SM_WAITING_LIST.class, 0x18, idSet); } static int getOpcode(Class<? extends AionServerPacket> packetClass) { Integer opcode = opcodes.get(packetClass); if(opcode == null) throw new IllegalArgumentException("There is no opcode for " + packetClass + " defined."); return opcode; } private static void addPacketOpcode(Class<? extends AionServerPacket> packetClass, int opcode, Set<Integer> idSet) { if(opcode < 0) return; if(idSet.contains(opcode)) throw new IllegalArgumentException(String.format("There already exists another packet with id 0x%02X", opcode)); idSet.add(opcode); opcodes.put(packetClass, opcode); } }