package com.aionemu.gameserver.network.aion;

import java.util.HashMap;
import java.util.Map;

import com.aionemu.gameserver.network.aion.serverpackets.*;

/**
 * This class is holding opcodes for all server packets. It's used only to have all opcodes in one place
 *
 * @author Luno, alexa026, ATracer, avol, orz, cura
 */
public class ServerPacketsOpcodes {

	private static Map<Class<? extends AionServerPacket>, Integer> opcodes = new HashMap<>();

	static {
		addPacketOpcode(0, SM_VERSION_CHECK.class); // [S_VERSION_CHECK]
		addPacketOpcode(1, SM_STATS_INFO.class); // [S_STATUS]
		addPacketOpcode(2, SM_GM_SHOW_PLAYER_STATUS.class); // [S_STATUS_OTHER]
		addPacketOpcode(3, SM_STATUPDATE_HP.class); // [S_HIT_POINT]
		addPacketOpcode(4, SM_STATUPDATE_MP.class); // [S_MANA_POINT]
		addPacketOpcode(5, SM_ATTACK_STATUS.class); // [S_HIT_POINT_OTHER]
		addPacketOpcode(6, SM_STATUPDATE_DP.class); // [S_DP]
		addPacketOpcode(7, SM_DP_INFO.class); // [S_DP_USER]
		addPacketOpcode(8, SM_STATUPDATE_EXP.class); // [S_EXP]
		// addPacketOpcode(9, ); // [S_LOGIN_CHECK]
		addPacketOpcode(10, SM_NPC_ASSEMBLER.class); // [S_CUTSCENE_NPC_INFO]
		addPacketOpcode(11, SM_LEGION_UPDATE_NICKNAME.class); // [S_CHANGE_GUILD_MEMBER_NICKNAME]
		addPacketOpcode(12, SM_LEGION_HISTORY.class); // [S_GUILD_HISTORY]
		addPacketOpcode(13, SM_ENTER_WORLD_CHECK.class); // [S_ENTER_WORLD_CHECK]
		addPacketOpcode(14, SM_NPC_INFO.class); // [S_PUT_NPC]
		addPacketOpcode(15, SM_PLAYER_SPAWN.class); // [S_WORLD]
		// addPacketOpcode(16, ); // [S_DUMMY_PACKET]
		addPacketOpcode(17, SM_GATHERABLE_INFO.class); // [S_PUT_OBJECT]
		// addPacketOpcode(18, ); // [S_PUT_VEHICLE]
		addPacketOpcode(19, SM_GM_SEARCH.class); // [S_BUILDER_RESULT]
		addPacketOpcode(20, SM_TELEPORT_LOC.class); // [S_REQUEST_TELEPORT]
		addPacketOpcode(21, SM_POSITION_SELF.class); // [S_BLINK]
		addPacketOpcode(22, SM_DELETE.class); // [S_REMOVE_OBJECT]
		addPacketOpcode(23, SM_LOGIN_QUEUE.class); // [S_WAIT_LIST]
		addPacketOpcode(24, SM_MESSAGE.class); // [S_MESSAGE]
		addPacketOpcode(25, SM_SYSTEM_MESSAGE.class); // [S_MESSAGE_CODE]
		addPacketOpcode(26, SM_INVENTORY_INFO.class); // [S_LOAD_INVENTORY]
		addPacketOpcode(27, SM_INVENTORY_ADD_ITEM.class); // [S_ADD_INVENTORY]
		addPacketOpcode(28, SM_DELETE_ITEM.class); // [S_REMOVE_INVENTORY]
		addPacketOpcode(29, SM_INVENTORY_UPDATE_ITEM.class); // [S_CHANGE_ITEM_DESC]
		addPacketOpcode(30, SM_UI_SETTINGS.class); // [S_LOAD_CLIENT_SETTINGS]
		addPacketOpcode(31, SM_PLAYER_STANCE.class); // [S_CHANGE_STANCE]
		addPacketOpcode(32, SM_PLAYER_INFO.class); // [S_PUT_USER]
		addPacketOpcode(33, SM_CASTSPELL.class); // [S_USE_SKILL]
		addPacketOpcode(34, SM_GATHER_ANIMATION.class); // [S_GATHER_OTHER]
		addPacketOpcode(35, SM_GATHER_UPDATE.class); // [S_GATHER]
		addPacketOpcode(36, SM_UPDATE_PLAYER_APPEARANCE.class); // [S_WIELD]
		addPacketOpcode(37, SM_EMOTION.class); // [S_ACTION]
		addPacketOpcode(38, SM_GAME_TIME.class); // [S_TIME]
		addPacketOpcode(39, SM_TIME_CHECK.class); // [S_SYNC_TIME]
		addPacketOpcode(40, SM_LOOKATOBJECT.class); // [S_NPC_CHANGED_TARGET]
		addPacketOpcode(41, SM_TARGET_SELECTED.class); // [S_TARGET_INFO]
		addPacketOpcode(42, SM_SKILL_CANCEL.class); // [S_SKILL_CANCELED]
		addPacketOpcode(43, SM_CASTSPELL_RESULT.class); // [S_SKILL_SUCCEDED]
		addPacketOpcode(44, SM_SKILL_LIST.class); // [S_ADD_SKILL]
		addPacketOpcode(45, SM_SKILL_REMOVE.class); // [S_DELETE_SKILL]
		addPacketOpcode(46, SM_SKILL_ACTIVATION.class); // [S_TOGGLE_SKILL_ON_OFF]
		// addPacketOpcode(47, ); // [S_ADD_MAINTAIN_SKILL]
		// addPacketOpcode(48, ); // [S_DELETE_MAINTAIN_SKILL]
		addPacketOpcode(49, SM_ABNORMAL_STATE.class); // [S_ABNORMAL_STATUS]
		addPacketOpcode(50, SM_ABNORMAL_EFFECT.class); // [S_ABNORMAL_STATUS_OTHER]
		addPacketOpcode(51, SM_SKILL_COOLDOWN.class); // [S_LOAD_SKILL_COOLTIME]
		addPacketOpcode(52, SM_QUESTION_WINDOW.class); // [S_ASK]
		addPacketOpcode(53, SM_CLOSE_QUESTION_WINDOW.class); // [S_CANCEL_ASK]
		addPacketOpcode(54, SM_ATTACK.class); // [S_ATTACK]
		addPacketOpcode(55, SM_MOVE.class); // [S_MOVE_NEW]
		// addPacketOpcode(56, ); // [S_MOVE_OBJECT]
		addPacketOpcode(57, SM_HEADING_UPDATE.class); // [S_CHANGE_DIRECTION]
		addPacketOpcode(58, SM_TRANSFORM.class); // [S_POLYMORPH]
		addPacketOpcode(59, SM_GM_SHOW_PLAYER_SKILLS.class); // [S_SKILL_OTHER]
		addPacketOpcode(60, SM_DIALOG_WINDOW.class); // [S_NPC_HTML_MESSAGE]
		addPacketOpcode(61, SM_HOUSE_UPDATE.class); // [S_PUT_BUILDINGS]
		addPacketOpcode(62, SM_SELL_ITEM.class); // [S_STORE_PURCHASE_INFO]
		addPacketOpcode(63, SM_GM_SHOW_LEGION_INFO.class); // [S_GUILD_OTHER_INFO]
		addPacketOpcode(64, SM_GM_BOOKMARK_ADD.class); // [S_ADD_BOOKMARK]
		addPacketOpcode(65, SM_VIEW_PLAYER_DETAILS.class); // [S_ITEM_LIST]
		addPacketOpcode(66, SM_GM_SHOW_LEGION_MEMBERLIST.class); // [S_GUILD_OTHER_MEMBER_INFO]
		addPacketOpcode(67, SM_WEATHER.class); // [S_WEATHER]
		addPacketOpcode(68, SM_PLAYER_STATE.class); // [S_INVISIBLE_LEVEL]
		// addPacketOpcode(69, ); // [S_RECALLED_BY_OTHER] SM_SUMMON_TELEPORT_REQUEST some teleport/summon dialog. response when accepting/declining the dialog is CM_SUMMON_TELEPORT_RESPONSE (opcode 195). first D in SM and CM packets is identical (dialog ID?) //fsc 69 cshh unk name skill_id time_seconds
		addPacketOpcode(70, SM_ACTION_ANIMATION.class); // [S_EFFECT]
		addPacketOpcode(71, SM_QUEST_LIST.class); // [S_LOAD_WORKINGQUEST]
		addPacketOpcode(72, SM_KEY.class); // [S_KEY]
		addPacketOpcode(73, SM_SUMMON_PANEL_REMOVE.class); // [S_RESET_SKILL_COOLING_TIME]
		addPacketOpcode(74, SM_EXCHANGE_REQUEST.class); // [S_XCHG_START]
		addPacketOpcode(75, SM_EXCHANGE_ADD_ITEM.class); // [S_ADD_XCHG]
		// addPacketOpcode(76, ); // [S_REMOVE_XCHG]
		addPacketOpcode(77, SM_EXCHANGE_ADD_KINAH.class); // [S_XCHG_GOLD]
		addPacketOpcode(78, SM_EXCHANGE_CONFIRMATION.class); // [S_XCHG_RESULT]
		addPacketOpcode(79, SM_EMOTION_LIST.class); // [S_ADDREMOVE_SOCIAL]
		// addPacketOpcode(80, ); // [S_CHECK_MESSAGE] client answers with C_CHECK_MESSAGE (opcode 190)
		addPacketOpcode(81, SM_TARGET_UPDATE.class); // [S_USER_CHANGED_TARGET]
		addPacketOpcode(82, SM_HOUSE_EDIT.class); // [S_HOUSING_OBJECT_CMD]
		addPacketOpcode(83, SM_PLASTIC_SURGERY.class); // [S_EDIT_CHARACTER]
		addPacketOpcode(84, SM_CONQUEROR_PROTECTOR.class); // [S_SERIAL_KILLER_LIST]
		addPacketOpcode(85, SM_INFLUENCE_RATIO.class); // [S_ABYSS_NEXT_PVP_CHANGE_TIME]
		addPacketOpcode(86, SM_FORTRESS_STATUS.class); // [S_ABYSS_CHANGE_NEXT_PVP_STATUS]
		addPacketOpcode(87, SM_CAPTCHA.class); // [S_CAPTCHA]
		addPacketOpcode(88, SM_RENAME.class); // [S_ADDED_SERVICE_CHANGE]
		addPacketOpcode(89, SM_SHOW_NPC_ON_MAP.class); // [S_FIND_NPC_POS_RESULT]
		addPacketOpcode(90, SM_GROUP_INFO.class); // [S_PARTY_INFO]
		addPacketOpcode(91, SM_GROUP_MEMBER_INFO.class); // [S_PARTY_MEMBER_INFO]
		addPacketOpcode(92, SM_RIDE_ROBOT.class); // [S_RIDE_ROBOT]
		// addPacketOpcode(93, ); // [S_USE_CP_STATUS]
		// addPacketOpcode(94, ); // [S_UPDATE_USE_CP_RESULT]
		// addPacketOpcode(95, ); // [S_USE_CP_RESET_COST_ACK]
		// addPacketOpcode(96, ); // [S_ENCHANT_EVENT_LIST]
		// addPacketOpcode(97, ); // [S_GGAUTH_CHECK_QUERY]
		addPacketOpcode(98, SM_QUIT_RESPONSE.class); // [S_ASK_QUIT_RESULT]
		addPacketOpcode(99, SM_CHAT_WINDOW.class); // [S_ASK_INFO_RESULT] 2.1
		// addPacketOpcode(100, ); // [S_FATIGUE_INFO]
		addPacketOpcode(101, SM_PET.class); // [S_FUNCTIONAL_PET] 2.7
		// addPacketOpcode(102, ); // [S_QUERY_NUMBER]
		addPacketOpcode(103, SM_ITEM_COOLDOWN.class); // [S_LOAD_ITEM_COOLTIME] 2.7
		addPacketOpcode(104, SM_UPDATE_NOTE.class); // [S_TODAY_WORDS]
		addPacketOpcode(105, SM_PLAY_MOVIE.class); // [S_PLAY_CUTSCENE]
		// addPacketOpcode(106, ); // [S_GET_ON_VEHICLE]
		// addPacketOpcode(107, ); // [S_GET_OFF_VEHICLE]
		// addPacketOpcode(108, ); // [S_HOUSING_OBJECT_LIST]
		// addPacketOpcode(109, ); // [S_KICK] sends error message boxes like "Authorization error" (//fsc 109 c 1) or "Unknown error" (//fsc 109 c 2). clicking ok closes the client
		addPacketOpcode(110, SM_LEGION_INFO.class); // [S_GUILD_INFO] 2.7
		addPacketOpcode(111, SM_LEGION_ADD_MEMBER.class); // [S_ADD_GUILD_MEMBER]
		addPacketOpcode(112, SM_LEGION_LEAVE_MEMBER.class); // [S_DELETE_GUILD_MEMBER]
		addPacketOpcode(113, SM_LEGION_UPDATE_MEMBER.class); // [S_CHANGE_GUILD_MEMBER_INFO]
		addPacketOpcode(114, SM_LEGION_UPDATE_TITLE.class); // [S_CHANGE_GUILD_OTHER]
		addPacketOpcode(115, SM_ATTACK_RESPONSE.class); // [S_ATTACK_RESULT]
		addPacketOpcode(116, SM_HOUSE_REGISTRY.class); // [S_HOUSING_CONTAINER_LIST]
		// addPacketOpcode(117, ); // [S_DYNCODE_DATA]
		// addPacketOpcode(118, ); // [S_SNDC_CHECK_MESSAGE]
		addPacketOpcode(119, SM_LEGION_UPDATE_SELF_INTRO.class); // [S_CHANGE_GUILD_MEMBER_INTRO]
		// addPacketOpcode(120, SM_RIFT_STATUS.class); // [S_WANTED_LOGIN] 1.9
		addPacketOpcode(121, SM_INSTANCE_SCORE.class); // [S_INSTANT_DUNGEON_INFO]
		addPacketOpcode(122, SM_AUTO_GROUP.class); // [S_MATCHMAKER_INFO]
		addPacketOpcode(123, SM_QUEST_COMPLETED_LIST.class); // [S_LOAD_FINISHEDQUEST]
		addPacketOpcode(124, SM_QUEST_ACTION.class); // [S_QUEST]
		addPacketOpcode(125, SM_GAMEGUARD.class); // [S_NCGUARD]
		// addPacketOpcode(126, SM_BUY_LIST.class); // [S_UNUSED_NEW_2] 1.5.4
		addPacketOpcode(127, SM_NEARBY_QUESTS.class); // [S_UPDATE_ZONE_QUEST]
		addPacketOpcode(128, SM_PING_RESPONSE.class); // [S_PING]
		// addPacketOpcode(129, ); // [S_SHOP_RESULT]
		addPacketOpcode(130, SM_CUBE_UPDATE.class); // [S_EVENT]
		addPacketOpcode(131, SM_HOUSE_SCRIPTS.class); // [S_HOUSE_SCRIPT]
		addPacketOpcode(132, SM_FRIEND_LIST.class); // [S_BUDDY_LIST]
		// addPacketOpcode(133, ); // [S_BOOK_LIST]
		addPacketOpcode(134, SM_PRIVATE_STORE.class); // [S_SHOP_SELL_LIST]
		addPacketOpcode(135, SM_GROUP_LOOT.class); // [S_GROUP_ITEM_DIST]
		addPacketOpcode(136, SM_ABYSS_RANK_UPDATE.class); // [S_ETC_STATUS]
		addPacketOpcode(137, SM_MAY_LOGIN_INTO_GAME.class); // [S_SA_ACCOUNT_ITEM_NOTI]
		addPacketOpcode(138, SM_ABYSS_RANKING_PLAYERS.class); // [S_ABYSS_RANKER_INFOS]
		addPacketOpcode(139, SM_ABYSS_RANKING_LEGIONS.class); // [S_ABYSS_GUILD_INFOS]
		addPacketOpcode(140, SM_INSTANCE_STAGE_INFO.class); // [S_WORLD_SCENE_STATUS]
		addPacketOpcode(141, SM_INSTANCE_INFO.class); // [S_INSTANCE_DUNGEON_COOLTIMES]
		addPacketOpcode(142, SM_PONG.class); // [S_ALIVE]
		// addPacketOpcode(143, ); // [S_DEBUG_PUT_BEACON]
		addPacketOpcode(144, SM_KISK_UPDATE.class); // [S_PLACEABLE_BINDSTONE_INFO]
		addPacketOpcode(145, SM_PRIVATE_STORE_NAME.class); // [S_PERSONAL_SHOP]
		addPacketOpcode(146, SM_BROKER_SERVICE.class); // [S_VENDOR]
		addPacketOpcode(147, SM_INSTANCE_COUNT_INFO.class); // [S_ENTER_WORLD_NOTIFY]
		addPacketOpcode(148, SM_MOTION.class); // [S_CUSTOM_ANIM]
		// addPacketOpcode(149, SM_BROKER_SETTLED_LIST.class); // [S_SHOPAGENT2] Systemfehler später erneut versuchen ??
		addPacketOpcode(150, SM_UNK_3_5_1.class); // [S_RESULT_PASSPORT]
		addPacketOpcode(151, SM_TRADE_IN_LIST.class); // [S_TRADE_IN]
		addPacketOpcode(152, SM_SECURITY_TOKEN.class); // [S_REP_WEB_SESSIONKEY]
		addPacketOpcode(153, SM_SUMMON_PANEL.class); // [S_ADD_PET]
		addPacketOpcode(154, SM_SUMMON_OWNER_REMOVE.class); // [S_REMOVE_PET]
		addPacketOpcode(155, SM_SUMMON_UPDATE.class); // [S_CHANGE_PET_STATUS]
		addPacketOpcode(156, SM_TRANSFORM_IN_SUMMON.class); // [S_CHANGE_MASTER]
		addPacketOpcode(157, SM_LEGION_MEMBERLIST.class); // [S_GUILD_MEMBER_INFO]
		addPacketOpcode(158, SM_LEGION_EDIT.class); // [S_CHANGE_GUILD_INFO]
		addPacketOpcode(159, SM_TOLL_INFO.class); // [S_SHOP_POINT_INFO]
		// addPacketOpcode(160, ); // [S_CHANGE_NPC_STATUS]
		addPacketOpcode(161, SM_MAIL_SERVICE.class); // [S_MAIL]
		addPacketOpcode(162, SM_SUMMON_USESKILL.class); // [S_ALLOW_PET_USE_SKILL]
		addPacketOpcode(163, SM_WINDSTREAM.class); // [S_WIND_PATH_RESULT]
		addPacketOpcode(164, SM_WINDSTREAM_ANNOUNCE.class); // [S_WIND_STATE_INFO]
		addPacketOpcode(165, SM_RECIPE_COOLDOWN.class); // [S_LOAD_GATHERCOMBINE_COOLTIME]
		addPacketOpcode(166, SM_FIND_GROUP.class); // [S_PARTY_MATCH]
		addPacketOpcode(167, SM_REPURCHASE.class); // [S_USER_SELL_HISTORY_LIST]
		addPacketOpcode(168, SM_WAREHOUSE_INFO.class); // [S_LOAD_WAREHOUSE]
		addPacketOpcode(169, SM_WAREHOUSE_ADD_ITEM.class); // [S_ADD_WAREHOUSE]
		addPacketOpcode(170, SM_DELETE_WAREHOUSE_ITEM.class); // [S_REMOVE_WAREHOUSE]
		addPacketOpcode(171, SM_WAREHOUSE_UPDATE_ITEM.class); // [S_CHANGE_WAREHOUSE_ITEM_DESC]
		addPacketOpcode(172, SM_IN_GAME_SHOP_CATEGORY_LIST.class); // [S_SHOP_CATEGORY_INFO]
		addPacketOpcode(173, SM_IN_GAME_SHOP_LIST.class); // [S_SHOP_GOODS_LIST]
		addPacketOpcode(174, SM_IN_GAME_SHOP_ITEM.class); // [S_SHOP_GOODS_INFO]
		addPacketOpcode(175, SM_ICON_INFO.class); // [S_CONDITIONAL_BONUS_ATTR]
		addPacketOpcode(176, SM_TITLE_INFO.class); // [S_TITLE]
		addPacketOpcode(177, SM_CHARACTER_SELECT.class); // [S_2ND_PASSWORD]
		addPacketOpcode(178, SM_GROUP_DATA_EXCHANGE.class); // [S_CLIENT_BROADCAST]
		// addPacketOpcode(179, SM_BROKER_REGISTERED_LIST.class); // [S_FATIGUE_KOREA]
		addPacketOpcode(180, SM_CRAFT_ANIMATION.class); // [S_COMBINE_OTHER]
		addPacketOpcode(181, SM_CRAFT_UPDATE.class); // [S_COMBINE]
		addPacketOpcode(182, SM_ASCENSION_MORPH.class); // [S_PLAY_MODE]
		addPacketOpcode(183, SM_ITEM_USAGE_ANIMATION.class); // [S_USE_ITEM]
		addPacketOpcode(184, SM_CUSTOM_SETTINGS.class); // [S_CHANGE_FLAG]
		addPacketOpcode(185, SM_DUEL.class); // [S_DUEL]
		// addPacketOpcode(186, ); // [S_CLIENTSIDE_NPC_BLINK] client answers with C_CLIENTSIDE_NPC_BLINK (opcode 204). first D in CM and SM is identical (//fsc 186 d 1)
		addPacketOpcode(187, SM_PET_EMOTE.class); // [S_FUNCTIONAL_PET_MOVE]
		// addPacketOpcode(188, ); // [S_RECONNECT_OTHER_SERVER] destroy your ui & get kicked!
		// addPacketOpcode(189, ); // [S_LOAD_PVP_ENV]
		// addPacketOpcode(190, ); // [S_CHANGE_PVP_ENV]
		addPacketOpcode(191, SM_QUESTIONNAIRE.class); // [S_POLL_CONTENTS]
		// addPacketOpcode(192, ); // [S_GM_COMMENT] format: ddsdhs ?
		addPacketOpcode(193, SM_DIE.class); // [S_RESURRECT_INFO]
		addPacketOpcode(194, SM_RESURRECT.class); // [S_RESURRECT_BY_OTHER]
		addPacketOpcode(195, SM_FORCED_MOVE.class); // [S_MOVEBACK]
		addPacketOpcode(196, SM_TELEPORT_MAP.class); // [S_ROUTEMAP_INFO]
		addPacketOpcode(197, SM_USE_OBJECT.class); // [S_GAUGE]
		// addPacketOpcode(198, ); // [S_SHOW_NPC_MOTION] format: d - oid, cdd - smth related to SM_NPC_INFO
		addPacketOpcode(199, SM_L2AUTH_LOGIN_CHECK.class); // [S_L2AUTH_LOGIN_CHECK]
		addPacketOpcode(200, SM_CHARACTER_LIST.class); // [S_CHARACTER_LIST]
		addPacketOpcode(201, SM_CREATE_CHARACTER.class); // [S_CREATE_CHARACTER]
		addPacketOpcode(202, SM_DELETE_CHARACTER.class); // [S_DELETE_CHARACTER]
		addPacketOpcode(203, SM_RESTORE_CHARACTER.class); // [S_RESTORE_CHARACTER]
		addPacketOpcode(204, SM_POSITION.class); // [S_FORCE_BLINK]
		addPacketOpcode(205, SM_LOOT_STATUS.class); // [S_LOOT]
		addPacketOpcode(206, SM_LOOT_ITEMLIST.class); // [S_LOOT_ITEMLIST]
		addPacketOpcode(207, SM_RECIPE_LIST.class); // [S_RECIPE_LIST]
		addPacketOpcode(208, SM_MANTRA_EFFECT.class); // [S_SKILL_ACTIVATED]
		addPacketOpcode(209, SM_SIEGE_LOCATION_INFO.class); // [S_ABYSS_INFO]
		addPacketOpcode(210, SM_SIEGE_LOCATION_STATE.class); // [S_CHANGE_ABYSS_PVP_STATUS]
		addPacketOpcode(211, SM_PLAYER_SEARCH.class); // [S_SEARCH_USER_RESULT]
		// addPacketOpcode(212, ); // [S_GUILD_EMBLEM_UPLOAD_RESULT] TODO: Legion Wappen format: c 0 = successful 1 = already uploaded
		addPacketOpcode(213, SM_LEGION_SEND_EMBLEM.class); // [S_GUILD_EMBLEM_IMG_BEGIN]
		addPacketOpcode(214, SM_LEGION_SEND_EMBLEM_DATA.class); // [S_GUILD_EMBLEM_IMG_DATA]
		addPacketOpcode(215, SM_LEGION_UPDATE_EMBLEM.class); // [S_GUILD_EMBLEM_UPDATED]
		// addPacketOpcode(216, ); // [S_SKILL_PENALTY_STATUS] skill related //fsc 216 cccdd 1 0 0 15000 1000 (first d: icon timer, last d: skill lock timer)
		addPacketOpcode(217, SM_PLAYER_REGION.class); // [S_SKILL_PENALTY_STATUS_OTHER]
		addPacketOpcode(218, SM_SHIELD_EFFECT.class); // [S_ABYSS_SHIELD_INFO]
		// addPacketOpcode(219, ); // [S_SPECTATOR_MODE] format: d 5 -> switches UI to something unk and client responds with opcode 182 packet, 6 switches back to normal
		addPacketOpcode(220, SM_ABYSS_ARTIFACT_INFO3.class); // [S_ARTIFACT_INFO]
		addPacketOpcode(221, SM_HOUSE_TELEPORT.class); // [S_RETURN_TO_HOUSEGATE_INFO]
		addPacketOpcode(222, SM_FRIEND_RESPONSE.class); // [S_BUDDY_RESULT]
		addPacketOpcode(223, SM_BLOCK_RESPONSE.class); // [S_BLOCK_RESULT]
		addPacketOpcode(224, SM_BLOCK_LIST.class); // [S_BLOCK_LIST]
		addPacketOpcode(225, SM_FRIEND_NOTIFY.class); // [S_NOTIFY_BUDDY]
		addPacketOpcode(226, SM_TOWNS_LIST.class); // [S_TOWN_INFO_LIST]
		addPacketOpcode(227, SM_FRIEND_STATUS.class); // [S_CUR_STATUS]
		// addPacketOpcode(228, SM_VIRTUAL_AUTH.class); // [S_VIRTUAL_AUTH] 1.5.0 - client answers with CM_MAC_ADDRESS and CM_L2AUTH_LOGIN_CHECK
		addPacketOpcode(229, SM_CHANNEL_INFO.class); // [S_CHANGE_CHANNEL]
		addPacketOpcode(230, SM_CHAT_INIT.class); // [S_SIGN_CLIENT]
		addPacketOpcode(231, SM_MACRO_LIST.class); // [S_LOAD_MACRO]
		addPacketOpcode(232, SM_MACRO_RESULT.class); // [S_MACRO_RESULT]
		addPacketOpcode(233, SM_NICKNAME_CHECK_RESPONSE.class); // [S_EXIST_RESULT]
		// addPacketOpcode(234, ); // [S_EXTRA_ITEM_CHANGE_CONTEXT]
		addPacketOpcode(235, SM_BIND_POINT_INFO.class); // [S_RESURRECT_LOC_INFO]
		addPacketOpcode(236, SM_RIFT_ANNOUNCE.class); // [S_WORLD_INFO]
		addPacketOpcode(237, SM_ABYSS_RANK.class); // [S_ABYSS_POINT]
		addPacketOpcode(238, SM_ACCOUNT_PROPERTIES.class); // [S_BUILDER_LEVEL]
		// addPacketOpcode(239, ); // [S_PETITION_STATUS] petition/support - //fsc 239 cdhsdccd 1 0 42 TestNo. 1 127 100 5
		addPacketOpcode(240, SM_FRIEND_UPDATE.class); // [S_BUDDY_DATA]
		addPacketOpcode(241, SM_LEARN_RECIPE.class); // [S_ADD_RECIPE]
		addPacketOpcode(242, SM_RECIPE_DELETE.class); // [S_REMOVE_RECIPE]
		addPacketOpcode(243, SM_FORTRESS_INFO.class); // [S_CHANGE_ABYSS_TELEPORTER_STATUS]
		addPacketOpcode(244, SM_FLY_TIME.class); // [S_FLIGHT_POINT]
		addPacketOpcode(245, SM_ALLIANCE_INFO.class); // [S_ALLIANCE_INFO]
		addPacketOpcode(246, SM_ALLIANCE_MEMBER_INFO.class); // [S_ALLIANCE_MEMBER_INFO]
		addPacketOpcode(247, SM_LEAVE_GROUP_MEMBER.class); // [S_GROUP_INFO]
		// addPacketOpcode(248, ); // [S_GROUP_MEMBER_INFO]
		addPacketOpcode(249, SM_SHOW_BRAND.class); // [S_TACTICS_SIGN]
		addPacketOpcode(250, SM_ALLIANCE_READY_CHECK.class); // [S_GROUP_READY]
		// addPacketOpcode(251, ); // [S_CHAR_BM_PACK_LIST] first c or h must be size or type since nonzero leads to a client crash, because of incorrect following data
		addPacketOpcode(252, SM_PRICES.class); // [S_TAX_INFO]
		addPacketOpcode(253, SM_TRADELIST.class); // [S_STORE_SALE_INFO]
		// addPacketOpcode(254, ); // [S_INVINCIBLE_TIME]
		addPacketOpcode(255, SM_RECONNECT_KEY.class); // [S_RECONNECT_KEY]
		addPacketOpcode(256, SM_HOUSE_BIDS.class); // [S_AUCTION_LIST]
		// addPacketOpcode(257, ); // [S_AUCTION_REGISTER] TODO: Format: d "Unknown Error d"
		// addPacketOpcode(258, ); // [S_AUCTION_CANCEL]
		addPacketOpcode(259, SM_RECEIVE_BIDS.class); // [S_AUCTION_BET]
		// addPacketOpcode(260, ); // [S_WEB_NOTI]
		// addPacketOpcode(261, ); // [S_RESULT_PASSPORT_FIRST] FastTrack not available
		addPacketOpcode(262, SM_HOUSE_PAY_RENT.class); // [S_HOUSING_CHARGE_FEE]
		addPacketOpcode(263, SM_HOUSE_OWNER_INFO.class); // [S_HOUSE_INFO]
		addPacketOpcode(264, SM_OBJECT_USE_UPDATE.class); // [S_USE_HOUSING_OBJECT_RESULT]
		// addPacketOpcode(265, ); // [S_VITAL_POINT]
		addPacketOpcode(266, SM_PACKAGE_INFO_NOTIFY.class); // [S_BM_PACK_LIST]
		// addPacketOpcode(267, ); // [S_SERVER_VERTEX_LIST]
		addPacketOpcode(268, SM_HOUSE_OBJECT.class); // [S_SEE_HOUSING_OBJECT]
		addPacketOpcode(269, SM_DELETE_HOUSE_OBJECT.class); // [S_DONTSEE_HOUSING_OBJECT]
		addPacketOpcode(270, SM_HOUSE_OBJECTS.class); // [S_HOUSING_MY_OBJECT_LIST]
		addPacketOpcode(271, SM_HOUSE_RENDER.class); // [S_SEE_HOUSE]
		addPacketOpcode(272, SM_DELETE_HOUSE.class); // [S_DONTSEE_HOUSE]
		// addPacketOpcode(273, ); // [S_HOUSING_REFRESH_TOKEN_RES]
		addPacketOpcode(274, SM_GF_WEBSHOP_TOKEN_RESPONSE.class); // [S_GF_WEBSHOP_TOKEN_RES]
		addPacketOpcode(275, SM_HOUSE_ACQUIRE.class); // [S_CHANGE_GUILD_MEMBER_HOUSE]
		addPacketOpcode(276, SM_STATS_STATUS_UNK.class); // [S_SERVER_AVAILABLE_NOTIFY]
		// addPacketOpcode(277, ); // [S_LITE_CLIENT_ERROR] download parts, "client is restricted, you have to download part 1 first"
		// addPacketOpcode(278, ); // [S_NPC_EXT_INFO]
		addPacketOpcode(279, SM_MARK_FRIENDLIST.class); // [S_OFFLINE_BUDDY_LIST]
		addPacketOpcode(280, SM_CHALLENGE_LIST.class); // [S_CHALLENGE_TASK]
		// addPacketOpcode(281, ); // [S_MGSERVER_CONNECT_INFO]
		// addPacketOpcode(282, ); // [S_USER_EXPERIENCE_LV] shows buff icon + symbols next to players name //fsc 282 dd playerObjId iconId (2 = Reward for new user, 3 = reward for returning user, 10 benefits for special user)
		// addPacketOpcode(283, SM_DISPUTE_LAND.class); // [S_SPVP_STATUS]
		addPacketOpcode(284, SM_FIRST_SHOW_DECOMPOSABLE.class); // [S_DISASSEMBLY_ITEMLIST]
		addPacketOpcode(285, SM_MEGAPHONE.class); // [S_MEGAPHONE]
		addPacketOpcode(286, SM_SECONDARY_SHOW_DECOMPOSABLE.class); // [S_SELECT_DISASSEMBLY_ITEM_RESULT]
		// addPacketOpcode(287, ); // [S_RUN_EVENT_MC_MACRO]
		addPacketOpcode(288, SM_TUNE_RESULT.class); // [S_REIDENTIFY_PREVIEW]
		addPacketOpcode(289, SM_UNWRAP_ITEM.class); // [S_UNPACK_ITEM]
		addPacketOpcode(290, SM_QUEST_REPEAT.class); // [S_RESET_REPEAT_QUEST]
		// addPacketOpcode(291, SM_UNK_4_5.class); // [S_REPLY_NP_LOGIN_GAMESVR]
		addPacketOpcode(292, SM_AFTER_TIME_CHECK_4_7_5.class); // [S_LAUNCHER_ARGS]
		addPacketOpcode(293, SM_AFTER_SIEGE_LOCINFO_475.class); // [S_ABYSS_INFO_GAB1_SPEC]
		// addPacketOpcode(294, ); // [S_REPLY_NP_CONSUME_TOKEN_RESULT]
		// addPacketOpcode(295, ); // [S_REPLY_NP_AUTH_TOKEN]
		addPacketOpcode(296, SM_BIND_POINT_TELEPORT.class); // [S_HOTSPOT]
		// addPacketOpcode(297, ); // [S_CHAT_ACCUSE]
		addPacketOpcode(298, SM_UPGRADE_ARCADE.class); // [S_GOTCHA_NOTIFY]
		addPacketOpcode(299, SM_ATREIAN_PASSPORT.class); // [S_LOGIN_EVENT_LIST]
		// addPacketOpcode(300, ); // [S_PROC_BREAK_NOTI]
		// addPacketOpcode(301, ); // [S_REP_REGISTER_MONEY_TRADE]
		addPacketOpcode(302, SM_LEGION_DOMINION_RANK.class); // [S_LEGION_DOMINION_RANKING]
		addPacketOpcode(303, SM_LEGION_DOMINION_LOC_INFO.class); // [S_LEGION_DOMINION_OWNERSHIP_INFO]
	}

	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(int opcode, Class<? extends AionServerPacket> packetClass) {
		if (opcode < 0)
			return;

		if (opcodes.values().contains(opcode))
			throw new IllegalArgumentException(String.format("There already exists another packet with id 0x%02X", opcode));

		opcodes.put(packetClass, opcode);
	}

}
