diff options
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 107 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.h | 1004 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Server/WorldSocket.cpp | 4 |
4 files changed, 559 insertions, 567 deletions
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 5cc3df7c86e..8a37c7fbc83 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -20,20 +20,17 @@ #include "WorldSession.h" #include "Packets/AllPackets.h" -template<class PacketClass, void(WorldSession::*HandlerFunction)(PacketClass&)> -class PacketHandler : public ClientOpcodeHandler +namespace { -public: - PacketHandler(char const* name, SessionStatus status, PacketProcessing processing) : ClientOpcodeHandler(name, status, processing) { } - - void Call(WorldSession* session, WorldPacket& packet) const override - { - std::remove_cv_t<PacketClass> nicePacket(std::move(packet)); - nicePacket.Read(); - (session->*HandlerFunction)(nicePacket); - session->LogUnprocessedTail(nicePacket.GetRawPacket()); - } -}; +template<class PacketClass, void(WorldSession::* HandlerFunction)(PacketClass&)> +void CallHandlerWrapper(WorldSession* session, WorldPacket& packet) +{ + std::remove_cv_t<PacketClass> nicePacket(std::move(packet)); + nicePacket.Read(); + (session->*HandlerFunction)(nicePacket); + session->LogUnprocessedTail(nicePacket.GetRawPacket()); +} +} OpcodeTable opcodeTable; @@ -48,93 +45,100 @@ struct get_packet_class<void(WorldSession::*)(PacketClass&)> using type = PacketClass; }; -OpcodeTable::OpcodeTable() -{ - memset(_internalTableClient, 0, sizeof(_internalTableClient)); - memset(_internalTableServer, 0, sizeof(_internalTableServer)); -} +OpcodeTable::OpcodeTable() = default; -OpcodeTable::~OpcodeTable() -{ - for (uint16 i = 0; i < NUM_OPCODE_HANDLERS; ++i) - { - delete _internalTableClient[i]; - delete _internalTableServer[i]; - } -} +OpcodeTable::~OpcodeTable() = default; bool OpcodeTable::ValidateClientOpcode(OpcodeClient opcode, char const* name) const { - if (uint32(opcode) == NULL_OPCODE) + if (opcode == UNKNOWN_OPCODE) { TC_LOG_ERROR("network", "Opcode {} does not have a value", name); return false; } - if (uint32(opcode) >= NUM_OPCODE_HANDLERS) + if (opcode < MIN_CMSG_OPCODE_NUMBER || opcode > MAX_CMSG_OPCODE_NUMBER) { TC_LOG_ERROR("network", "Tried to set handler for an invalid opcode {}", opcode); return false; } - if (_internalTableClient[opcode] != nullptr) + if ((*this)[opcode] != nullptr) { - TC_LOG_ERROR("network", "Tried to override client handler of {} with {} (opcode {})", _internalTableClient[opcode]->Name, name, opcode); + TC_LOG_ERROR("network", "Tried to override client handler of {} with {} (opcode {})", (*this)[opcode]->Name, name, opcode); return false; } return true; } -template<typename Handler, Handler HandlerFunction> -void OpcodeTable::ValidateAndSetClientOpcode(OpcodeClient opcode, char const* name, SessionStatus status, PacketProcessing processing) +void OpcodeTable::ValidateAndSetClientOpcode(OpcodeClient opcode, char const* name, SessionStatus status, ClientOpcodeHandler::HandlerFunction call, PacketProcessing processing) { if (!ValidateClientOpcode(opcode, name)) return; - _internalTableClient[opcode] = new PacketHandler<typename get_packet_class<Handler>::type, HandlerFunction>(name, status, processing); + _internalTableClient[opcode - MIN_CMSG_OPCODE_NUMBER].reset(new ClientOpcodeHandler{ + .Name = name, + .Status = status, + .Call = call, + .ProcessingPlace = processing + }); } -void OpcodeTable::ValidateAndSetServerOpcode(OpcodeServer opcode, char const* name, SessionStatus status, ConnectionType conIdx) +bool OpcodeTable::ValidateServerOpcode(OpcodeServer opcode, char const* name, ConnectionType conIdx) const { - if (uint32(opcode) == NULL_OPCODE) + if (opcode == UNKNOWN_OPCODE) { TC_LOG_ERROR("network", "Opcode {} does not have a value", name); - return; + return false; } - if (uint32(opcode) >= NUM_OPCODE_HANDLERS) + if (opcode < MIN_SMSG_OPCODE_NUMBER || opcode > MAX_SMSG_OPCODE_NUMBER) { TC_LOG_ERROR("network", "Tried to set handler for an invalid opcode {}", opcode); - return; + return false; } if (conIdx >= MAX_CONNECTION_TYPES) { TC_LOG_ERROR("network", "Tried to set invalid connection type {} for opcode {}", conIdx, name); - return; + return false; } if (IsInstanceOnlyOpcode(opcode) && conIdx != CONNECTION_TYPE_INSTANCE) { TC_LOG_ERROR("network", "Tried to set invalid connection type {} for instance only opcode {}", conIdx, name); - return; + return false; } - if (_internalTableServer[opcode] != nullptr) + if ((*this)[opcode] != nullptr) { - TC_LOG_ERROR("network", "Tried to override server handler of {} with {} (opcode {})", opcodeTable[opcode]->Name, name, opcode); - return; + TC_LOG_ERROR("network", "Tried to override server handler of {} with {} (opcode {})", (*this)[opcode]->Name, name, opcode); + return false; } - _internalTableServer[opcode] = new ServerOpcodeHandler(name, status, conIdx); + return true; +} + +void OpcodeTable::ValidateAndSetServerOpcode(OpcodeServer opcode, char const* name, SessionStatus status, ConnectionType conIdx) +{ + if (!ValidateServerOpcode(opcode, name, conIdx)) + return; + + _internalTableServer[opcode - MIN_SMSG_OPCODE_NUMBER].reset(new ServerOpcodeHandler{ .Name = name, .Status = status, .ConnectionIndex = conIdx }); } /// Correspondence between opcodes and their names void OpcodeTable::Initialize() { + InitializeClientOpcodes(); + InitializeServerOpcodes(); +} + +void OpcodeTable::InitializeClientOpcodes() +{ #define DEFINE_HANDLER(opcode, status, processing, handler) \ - ValidateAndSetClientOpcode<decltype(handler), handler>(opcode, #opcode, status, processing) + ValidateAndSetClientOpcode(opcode, #opcode, status, &CallHandlerWrapper<typename get_packet_class<decltype(handler)>::type, handler>, processing) DEFINE_HANDLER(CMSG_ABANDON_NPE_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ACCEPT_GUILD_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildAcceptInvite); @@ -993,7 +997,10 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_WRAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleWrapItem); #undef DEFINE_HANDLER +} +void OpcodeTable::InitializeServerOpcodes() +{ #define DEFINE_SERVER_OPCODE_HANDLER(opcode, status, con) \ static_assert((status) == STATUS_NEVER || (status) == STATUS_UNHANDLED, "Invalid status for server opcode"); \ ValidateAndSetServerOpcode(opcode, #opcode, status, con) @@ -2218,15 +2225,15 @@ void OpcodeTable::Initialize() #undef DEFINE_SERVER_OPCODE_HANDLER } -template<typename T> +template<std::size_t MIN_OPCODE, std::size_t MAX_OPCODE, typename T> inline std::string GetOpcodeNameForLoggingImpl(T id) { uint32 opcode = uint32(id); char const* name = nullptr; - if (opcode < NUM_OPCODE_HANDLERS) + if (opcode >= MIN_OPCODE && opcode <= MAX_OPCODE) { - if (OpcodeHandler const* handler = opcodeTable[id]) + if (auto const* handler = opcodeTable[id]) name = handler->Name; else name = "UNKNOWN OPCODE"; @@ -2239,10 +2246,10 @@ inline std::string GetOpcodeNameForLoggingImpl(T id) std::string GetOpcodeNameForLogging(OpcodeClient opcode) { - return GetOpcodeNameForLoggingImpl(opcode); + return GetOpcodeNameForLoggingImpl<MIN_CMSG_OPCODE_NUMBER, MAX_CMSG_OPCODE_NUMBER>(opcode); } std::string GetOpcodeNameForLogging(OpcodeServer opcode) { - return GetOpcodeNameForLoggingImpl(opcode); + return GetOpcodeNameForLoggingImpl<MIN_SMSG_OPCODE_NUMBER, MAX_SMSG_OPCODE_NUMBER>(opcode); } diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 765d61926d2..30b5d2e64bb 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -23,6 +23,8 @@ #define _OPCODES_H #include "Define.h" +#include <array> +#include <memory> #include <string> enum ConnectionType : int8 @@ -34,13 +36,15 @@ enum ConnectionType : int8 CONNECTION_TYPE_DEFAULT = -1 }; -enum OpcodeMisc : uint16 -{ - MAX_OPCODE = 0x3FFF, - NUM_OPCODE_HANDLERS = (MAX_OPCODE + 1), - UNKNOWN_OPCODE = 0xFFFF, - NULL_OPCODE = 0xBADD -}; +constexpr std::size_t MIN_CMSG_OPCODE_NUMBER = 0x305C; +constexpr std::size_t MAX_CMSG_OPCODE_NUMBER = 0x3A63; +constexpr std::size_t NUM_CMSG_OPCODES = MAX_CMSG_OPCODE_NUMBER - MIN_CMSG_OPCODE_NUMBER + 1; + +constexpr std::size_t MIN_SMSG_OPCODE_NUMBER = 0x256C; +constexpr std::size_t MAX_SMSG_OPCODE_NUMBER = 0x3052; +constexpr std::size_t NUM_SMSG_OPCODES = MAX_SMSG_OPCODE_NUMBER - MIN_SMSG_OPCODE_NUMBER + 1; + +constexpr uint16 UNKNOWN_OPCODE = 0xBADD; // special marker value for uninitialized WorldPackets enum OpcodeClient : uint16 { @@ -735,199 +739,199 @@ enum OpcodeClient : uint16 CMSG_WRAP_ITEM = 0x3994, // Deleted opcodes, here only to allow compile - CMSG_ABANDON_NPE_RESPONSE = 0xBADD, - CMSG_ACCEPT_RETURNING_PLAYER_PROMPT = 0xBADD, - CMSG_ACTIVATE_SOULBIND = 0xBADD, - CMSG_ADD_ACCOUNT_COSMETIC = 0xBADD, - CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0xBADD, - CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS = 0xBADD, - CMSG_ARTIFACT_ADD_POWER = 0xBADD, - CMSG_ARTIFACT_SET_APPEARANCE = 0xBADD, - CMSG_AUCTION_BROWSE_QUERY = 0xBADD, - CMSG_AUCTION_CANCEL_COMMODITIES_PURCHASE = 0xBADD, - CMSG_AUCTION_CONFIRM_COMMODITIES_PURCHASE = 0xBADD, - CMSG_AUCTION_GET_COMMODITY_QUOTE = 0xBADD, - CMSG_AUCTION_LIST_BIDDED_ITEMS = 0xBADD, - CMSG_AUCTION_LIST_BUCKETS_BY_BUCKET_KEYS = 0xBADD, - CMSG_AUCTION_LIST_ITEMS_BY_BUCKET_KEY = 0xBADD, - CMSG_AUCTION_LIST_ITEMS_BY_ITEM_ID = 0xBADD, - CMSG_AUCTION_LIST_OWNED_ITEMS = 0xBADD, - CMSG_AUCTION_REQUEST_FAVORITE_LIST = 0xBADD, - CMSG_AUCTION_SELL_COMMODITY = 0xBADD, - CMSG_AUCTION_SET_FAVORITE_ITEM = 0xBADD, - CMSG_AUTOBANK_REAGENT = 0xBADD, - CMSG_AUTOSTORE_BANK_REAGENT = 0xBADD, - CMSG_BATTLE_PET_DELETE_PET = 0xBADD, - CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0xBADD, - CMSG_BATTLE_PET_MODIFY_NAME = 0xBADD, - CMSG_BATTLEMASTER_JOIN_BRAWL = 0xBADD, - CMSG_BATTLEMASTER_JOIN_RATED_SOLO_SHUFFLE = 0xBADD, - CMSG_BLACK_MARKET_BID_ON_ITEM = 0xBADD, - CMSG_BLACK_MARKET_REQUEST_ITEMS = 0xBADD, - CMSG_BONUS_ROLL = 0xBADD, - CMSG_BUY_REAGENT_BANK = 0xBADD, - CMSG_CAGE_BATTLE_PET = 0xBADD, - CMSG_CANCEL_CHANNELLING = 0xBADD, - CMSG_CANCEL_MASTER_LOOT_ROLL = 0xBADD, - CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0xBADD, - CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0xBADD, - CMSG_CHANGE_BANK_BAG_SLOT_FLAG = 0xBADD, - CMSG_CHANGE_MONUMENT_APPEARANCE = 0xBADD, - CMSG_CHAT_CAN_LOCAL_WHISPER_TARGET_REQUEST = 0xBADD, - CMSG_CHECK_CHARACTER_NAME_AVAILABILITY = 0xBADD, - CMSG_CHOICE_RESPONSE = 0xBADD, - CMSG_CHROMIE_TIME_SELECT_EXPANSION = 0xBADD, - CMSG_CLAIM_WEEKLY_REWARD = 0xBADD, - CMSG_CLASS_TALENTS_DELETE_CONFIG = 0xBADD, - CMSG_CLASS_TALENTS_NOTIFY_EMPTY_CONFIG = 0xBADD, - CMSG_CLASS_TALENTS_NOTIFY_VALIDATION_FAILED = 0xBADD, - CMSG_CLASS_TALENTS_RENAME_CONFIG = 0xBADD, - CMSG_CLASS_TALENTS_REQUEST_NEW_CONFIG = 0xBADD, - CMSG_CLASS_TALENTS_SET_STARTER_BUILD_ACTIVE = 0xBADD, - CMSG_CLASS_TALENTS_SET_USES_SHARED_ACTION_BARS = 0xBADD, - CMSG_CLOSE_RUNEFORGE_INTERACTION = 0xBADD, - CMSG_COMMENTATOR_SPECTATE = 0xBADD, - CMSG_CONFIRM_ARTIFACT_RESPEC = 0xBADD, - CMSG_CONTENT_TRACKING_START_TRACKING = 0xBADD, - CMSG_CONTENT_TRACKING_STOP_TRACKING = 0xBADD, - CMSG_CONTRIBUTION_CONTRIBUTE = 0xBADD, - CMSG_CONVERSATION_CINEMATIC_READY = 0xBADD, - CMSG_COVENANT_RENOWN_REQUEST_CATCHUP_STATE = 0xBADD, - CMSG_CRAFTING_ORDER_CANCEL = 0xBADD, - CMSG_CRAFTING_ORDER_CLAIM = 0xBADD, - CMSG_CRAFTING_ORDER_CREATE = 0xBADD, - CMSG_CRAFTING_ORDER_FULFILL = 0xBADD, - CMSG_CRAFTING_ORDER_LIST_CRAFTER_ORDERS = 0xBADD, - CMSG_CRAFTING_ORDER_LIST_MY_ORDERS = 0xBADD, - CMSG_CRAFTING_ORDER_REJECT = 0xBADD, - CMSG_CRAFTING_ORDER_RELEASE = 0xBADD, - CMSG_CRAFTING_ORDER_REPORT_PLAYER = 0xBADD, - CMSG_CRAFTING_ORDER_UPDATE_IGNORE_LIST = 0xBADD, - CMSG_CREATE_SHIPMENT = 0xBADD, - CMSG_DEPOSIT_REAGENT_BANK = 0xBADD, - CMSG_DF_CONFIRM_EXPAND_SEARCH = 0xBADD, - CMSG_DO_MASTER_LOOT_ROLL = 0xBADD, - CMSG_GARRISON_ADD_FOLLOWER_HEALTH = 0xBADD, - CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0xBADD, - CMSG_GARRISON_CANCEL_CONSTRUCTION = 0xBADD, - CMSG_GARRISON_CHECK_UPGRADEABLE = 0xBADD, - CMSG_GARRISON_COMPLETE_MISSION = 0xBADD, - CMSG_GARRISON_FULLY_HEAL_ALL_FOLLOWERS = 0xBADD, - CMSG_GARRISON_GENERATE_RECRUITS = 0xBADD, - CMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO = 0xBADD, - CMSG_GARRISON_GET_MAP_DATA = 0xBADD, - CMSG_GARRISON_GET_MISSION_REWARD = 0xBADD, - CMSG_GARRISON_LEARN_TALENT = 0xBADD, - CMSG_GARRISON_MISSION_BONUS_ROLL = 0xBADD, - CMSG_GARRISON_PURCHASE_BUILDING = 0xBADD, - CMSG_GARRISON_RECRUIT_FOLLOWER = 0xBADD, - CMSG_GARRISON_REMOVE_FOLLOWER = 0xBADD, - CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0xBADD, - CMSG_GARRISON_RENAME_FOLLOWER = 0xBADD, - CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0xBADD, - CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0xBADD, - CMSG_GARRISON_RESEARCH_TALENT = 0xBADD, - CMSG_GARRISON_SET_BUILDING_ACTIVE = 0xBADD, - CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0xBADD, - CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0xBADD, - CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0xBADD, - CMSG_GARRISON_SOCKET_TALENT = 0xBADD, - CMSG_GARRISON_START_MISSION = 0xBADD, - CMSG_GARRISON_SWAP_BUILDINGS = 0xBADD, - CMSG_GET_GARRISON_INFO = 0xBADD, - CMSG_GET_LANDING_PAGE_SHIPMENTS = 0xBADD, - CMSG_GET_RAF_ACCOUNT_INFO = 0xBADD, - CMSG_GET_TROPHY_LIST = 0xBADD, - CMSG_GOSSIP_REFRESH_OPTIONS = 0xBADD, - CMSG_HIDE_QUEST_CHOICE = 0xBADD, - CMSG_ISLAND_QUEUE = 0xBADD, - CMSG_JOIN_PET_BATTLE_QUEUE = 0xBADD, - CMSG_LEARN_PVP_TALENTS = 0xBADD, - CMSG_LEARN_TALENTS = 0xBADD, - CMSG_LEAVE_PET_BATTLE_QUEUE = 0xBADD, - CMSG_LIVE_REGION_KEY_BINDINGS_COPY = 0xBADD, - CMSG_LOAD_SELECTED_TROPHY = 0xBADD, - CMSG_MOVE_SET_TURN_RATE_CHEAT = 0xBADD, - CMSG_MYTHIC_PLUS_REQUEST_MAP_STATS = 0xBADD, - CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0xBADD, - CMSG_OPEN_MISSION_NPC = 0xBADD, - CMSG_OPEN_SHIPMENT_NPC = 0xBADD, - CMSG_OPEN_TRADESKILL_NPC = 0xBADD, - CMSG_PERFORM_ITEM_INTERACTION = 0xBADD, - CMSG_PERKS_PROGRAM_REQUEST_PENDING_REWARDS = 0xBADD, - CMSG_PERKS_PROGRAM_REQUEST_PURCHASE = 0xBADD, - CMSG_PERKS_PROGRAM_REQUEST_REFUND = 0xBADD, - CMSG_PERKS_PROGRAM_SET_FROZEN_VENDOR_ITEM = 0xBADD, - CMSG_PERKS_PROGRAM_STATUS_REQUEST = 0xBADD, - CMSG_PET_BATTLE_FINAL_NOTIFY = 0xBADD, - CMSG_PET_BATTLE_INPUT = 0xBADD, - CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0xBADD, - CMSG_PET_BATTLE_QUIT_NOTIFY = 0xBADD, - CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0xBADD, - CMSG_PET_BATTLE_REQUEST_PVP = 0xBADD, - CMSG_PET_BATTLE_REQUEST_UPDATE = 0xBADD, - CMSG_PET_BATTLE_REQUEST_WILD = 0xBADD, - CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0xBADD, - CMSG_PET_BATTLE_WILD_LOCATION_FAIL = 0xBADD, - CMSG_QUERY_GARRISON_PET_NAME = 0xBADD, - CMSG_QUERY_SCENARIO_POI = 0xBADD, - CMSG_QUEST_SESSION_BEGIN_RESPONSE = 0xBADD, - CMSG_QUEST_SESSION_REQUEST_START = 0xBADD, - CMSG_QUEST_SESSION_REQUEST_STOP = 0xBADD, - CMSG_QUICK_JOIN_REQUEST_INVITE_WITH_CONFIRMATION = 0xBADD, - CMSG_QUICK_JOIN_SIGNAL_TOAST_DISPLAYED = 0xBADD, - CMSG_RAF_CLAIM_ACTIVITY_REWARD = 0xBADD, - CMSG_RAF_CLAIM_NEXT_REWARD = 0xBADD, - CMSG_RAF_GENERATE_RECRUITMENT_LINK = 0xBADD, - CMSG_RAF_UPDATE_RECRUITMENT_INFO = 0xBADD, - CMSG_REMOVE_RAF_RECRUIT = 0xBADD, - CMSG_REPLACE_TROPHY = 0xBADD, - CMSG_REPORT_STUCK_IN_COMBAT = 0xBADD, - CMSG_REQUEST_CHARACTER_GUILD_FOLLOW_INFO = 0xBADD, - CMSG_REQUEST_COVENANT_CALLINGS = 0xBADD, - CMSG_REQUEST_GARRISON_TALENT_WORLD_QUEST_UNLOCKS = 0xBADD, - CMSG_REQUEST_LATEST_SPLASH_SCREEN = 0xBADD, - CMSG_REQUEST_MYTHIC_PLUS_AFFIXES = 0xBADD, - CMSG_REQUEST_MYTHIC_PLUS_SEASON_DATA = 0xBADD, - CMSG_REQUEST_REALM_GUILD_MASTER_INFO = 0xBADD, - CMSG_REQUEST_WEEKLY_REWARDS = 0xBADD, - CMSG_RESET_CHALLENGE_MODE = 0xBADD, - CMSG_RESET_CHALLENGE_MODE_CHEAT = 0xBADD, - CMSG_REVERT_MONUMENT_APPEARANCE = 0xBADD, - CMSG_RPE_RESET_CHARACTER = 0xBADD, - CMSG_SAVE_PERSONAL_EMBLEM = 0xBADD, - CMSG_SELL_ALL_JUNK_ITEMS = 0xBADD, - CMSG_SEND_CHARACTER_CLUB_INVITATION = 0xBADD, - CMSG_SEND_PING_UNIT = 0xBADD, - CMSG_SEND_PING_WORLD_POINT = 0xBADD, - CMSG_SET_ACHIEVEMENTS_HIDDEN = 0xBADD, - CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0xBADD, - CMSG_SET_BACKPACK_SELL_JUNK_DISABLED = 0xBADD, - CMSG_SET_BANK_AUTOSORT_DISABLED = 0xBADD, - CMSG_SET_EMPOWER_MIN_HOLD_STAGE_PERCENT = 0xBADD, - CMSG_SET_EXCLUDED_CHAT_CENSOR_SOURCES = 0xBADD, - CMSG_SET_LOOT_SPECIALIZATION = 0xBADD, - CMSG_SET_RESTRICT_PINGS_TO_ASSISTANTS = 0xBADD, - CMSG_SET_SAVED_INSTANCE_EXTEND = 0xBADD, - CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0xBADD, - CMSG_SET_TRADE_CURRENCY = 0xBADD, - CMSG_SET_USING_PARTY_GARRISON = 0xBADD, - CMSG_SET_WAR_MODE = 0xBADD, - CMSG_SORT_BAGS = 0xBADD, - CMSG_SORT_BANK_BAGS = 0xBADD, - CMSG_SORT_REAGENT_BANK_BAGS = 0xBADD, - CMSG_SPELL_EMPOWER_RELEASE = 0xBADD, - CMSG_SPELL_EMPOWER_RESTART = 0xBADD, - CMSG_START_CHALLENGE_MODE = 0xBADD, - CMSG_SUBSCRIPTION_INTERSTITIAL_RESPONSE = 0xBADD, - CMSG_SURRENDER_ARENA = 0xBADD, - CMSG_TRADE_SKILL_SET_FAVORITE = 0xBADD, - CMSG_TRAITS_TALENT_TEST_UNLEARN_SPELLS = 0xBADD, - CMSG_UI_MAP_QUEST_LINES_REQUEST = 0xBADD, - CMSG_UNLEARN_SPECIALIZATION = 0xBADD, - CMSG_UPDATE_CRAFTING_NPC_RECIPES = 0xBADD, - CMSG_UPGRADE_GARRISON = 0xBADD, - CMSG_UPGRADE_RUNEFORGE_LEGENDARY = 0xBADD, + CMSG_ABANDON_NPE_RESPONSE = UNKNOWN_OPCODE, + CMSG_ACCEPT_RETURNING_PLAYER_PROMPT = UNKNOWN_OPCODE, + CMSG_ACTIVATE_SOULBIND = UNKNOWN_OPCODE, + CMSG_ADD_ACCOUNT_COSMETIC = UNKNOWN_OPCODE, + CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = UNKNOWN_OPCODE, + CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS = UNKNOWN_OPCODE, + CMSG_ARTIFACT_ADD_POWER = UNKNOWN_OPCODE, + CMSG_ARTIFACT_SET_APPEARANCE = UNKNOWN_OPCODE, + CMSG_AUCTION_BROWSE_QUERY = UNKNOWN_OPCODE, + CMSG_AUCTION_CANCEL_COMMODITIES_PURCHASE = UNKNOWN_OPCODE, + CMSG_AUCTION_CONFIRM_COMMODITIES_PURCHASE = UNKNOWN_OPCODE, + CMSG_AUCTION_GET_COMMODITY_QUOTE = UNKNOWN_OPCODE, + CMSG_AUCTION_LIST_BIDDED_ITEMS = UNKNOWN_OPCODE, + CMSG_AUCTION_LIST_BUCKETS_BY_BUCKET_KEYS = UNKNOWN_OPCODE, + CMSG_AUCTION_LIST_ITEMS_BY_BUCKET_KEY = UNKNOWN_OPCODE, + CMSG_AUCTION_LIST_ITEMS_BY_ITEM_ID = UNKNOWN_OPCODE, + CMSG_AUCTION_LIST_OWNED_ITEMS = UNKNOWN_OPCODE, + CMSG_AUCTION_REQUEST_FAVORITE_LIST = UNKNOWN_OPCODE, + CMSG_AUCTION_SELL_COMMODITY = UNKNOWN_OPCODE, + CMSG_AUCTION_SET_FAVORITE_ITEM = UNKNOWN_OPCODE, + CMSG_AUTOBANK_REAGENT = UNKNOWN_OPCODE, + CMSG_AUTOSTORE_BANK_REAGENT = UNKNOWN_OPCODE, + CMSG_BATTLE_PET_DELETE_PET = UNKNOWN_OPCODE, + CMSG_BATTLE_PET_DELETE_PET_CHEAT = UNKNOWN_OPCODE, + CMSG_BATTLE_PET_MODIFY_NAME = UNKNOWN_OPCODE, + CMSG_BATTLEMASTER_JOIN_BRAWL = UNKNOWN_OPCODE, + CMSG_BATTLEMASTER_JOIN_RATED_SOLO_SHUFFLE = UNKNOWN_OPCODE, + CMSG_BLACK_MARKET_BID_ON_ITEM = UNKNOWN_OPCODE, + CMSG_BLACK_MARKET_REQUEST_ITEMS = UNKNOWN_OPCODE, + CMSG_BONUS_ROLL = UNKNOWN_OPCODE, + CMSG_BUY_REAGENT_BANK = UNKNOWN_OPCODE, + CMSG_CAGE_BATTLE_PET = UNKNOWN_OPCODE, + CMSG_CANCEL_CHANNELLING = UNKNOWN_OPCODE, + CMSG_CANCEL_MASTER_LOOT_ROLL = UNKNOWN_OPCODE, + CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = UNKNOWN_OPCODE, + CMSG_CHALLENGE_MODE_REQUEST_LEADERS = UNKNOWN_OPCODE, + CMSG_CHANGE_BANK_BAG_SLOT_FLAG = UNKNOWN_OPCODE, + CMSG_CHANGE_MONUMENT_APPEARANCE = UNKNOWN_OPCODE, + CMSG_CHAT_CAN_LOCAL_WHISPER_TARGET_REQUEST = UNKNOWN_OPCODE, + CMSG_CHECK_CHARACTER_NAME_AVAILABILITY = UNKNOWN_OPCODE, + CMSG_CHOICE_RESPONSE = UNKNOWN_OPCODE, + CMSG_CHROMIE_TIME_SELECT_EXPANSION = UNKNOWN_OPCODE, + CMSG_CLAIM_WEEKLY_REWARD = UNKNOWN_OPCODE, + CMSG_CLASS_TALENTS_DELETE_CONFIG = UNKNOWN_OPCODE, + CMSG_CLASS_TALENTS_NOTIFY_EMPTY_CONFIG = UNKNOWN_OPCODE, + CMSG_CLASS_TALENTS_NOTIFY_VALIDATION_FAILED = UNKNOWN_OPCODE, + CMSG_CLASS_TALENTS_RENAME_CONFIG = UNKNOWN_OPCODE, + CMSG_CLASS_TALENTS_REQUEST_NEW_CONFIG = UNKNOWN_OPCODE, + CMSG_CLASS_TALENTS_SET_STARTER_BUILD_ACTIVE = UNKNOWN_OPCODE, + CMSG_CLASS_TALENTS_SET_USES_SHARED_ACTION_BARS = UNKNOWN_OPCODE, + CMSG_CLOSE_RUNEFORGE_INTERACTION = UNKNOWN_OPCODE, + CMSG_COMMENTATOR_SPECTATE = UNKNOWN_OPCODE, + CMSG_CONFIRM_ARTIFACT_RESPEC = UNKNOWN_OPCODE, + CMSG_CONTENT_TRACKING_START_TRACKING = UNKNOWN_OPCODE, + CMSG_CONTENT_TRACKING_STOP_TRACKING = UNKNOWN_OPCODE, + CMSG_CONTRIBUTION_CONTRIBUTE = UNKNOWN_OPCODE, + CMSG_CONVERSATION_CINEMATIC_READY = UNKNOWN_OPCODE, + CMSG_COVENANT_RENOWN_REQUEST_CATCHUP_STATE = UNKNOWN_OPCODE, + CMSG_CRAFTING_ORDER_CANCEL = UNKNOWN_OPCODE, + CMSG_CRAFTING_ORDER_CLAIM = UNKNOWN_OPCODE, + CMSG_CRAFTING_ORDER_CREATE = UNKNOWN_OPCODE, + CMSG_CRAFTING_ORDER_FULFILL = UNKNOWN_OPCODE, + CMSG_CRAFTING_ORDER_LIST_CRAFTER_ORDERS = UNKNOWN_OPCODE, + CMSG_CRAFTING_ORDER_LIST_MY_ORDERS = UNKNOWN_OPCODE, + CMSG_CRAFTING_ORDER_REJECT = UNKNOWN_OPCODE, + CMSG_CRAFTING_ORDER_RELEASE = UNKNOWN_OPCODE, + CMSG_CRAFTING_ORDER_REPORT_PLAYER = UNKNOWN_OPCODE, + CMSG_CRAFTING_ORDER_UPDATE_IGNORE_LIST = UNKNOWN_OPCODE, + CMSG_CREATE_SHIPMENT = UNKNOWN_OPCODE, + CMSG_DEPOSIT_REAGENT_BANK = UNKNOWN_OPCODE, + CMSG_DF_CONFIRM_EXPAND_SEARCH = UNKNOWN_OPCODE, + CMSG_DO_MASTER_LOOT_ROLL = UNKNOWN_OPCODE, + CMSG_GARRISON_ADD_FOLLOWER_HEALTH = UNKNOWN_OPCODE, + CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = UNKNOWN_OPCODE, + CMSG_GARRISON_CANCEL_CONSTRUCTION = UNKNOWN_OPCODE, + CMSG_GARRISON_CHECK_UPGRADEABLE = UNKNOWN_OPCODE, + CMSG_GARRISON_COMPLETE_MISSION = UNKNOWN_OPCODE, + CMSG_GARRISON_FULLY_HEAL_ALL_FOLLOWERS = UNKNOWN_OPCODE, + CMSG_GARRISON_GENERATE_RECRUITS = UNKNOWN_OPCODE, + CMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO = UNKNOWN_OPCODE, + CMSG_GARRISON_GET_MAP_DATA = UNKNOWN_OPCODE, + CMSG_GARRISON_GET_MISSION_REWARD = UNKNOWN_OPCODE, + CMSG_GARRISON_LEARN_TALENT = UNKNOWN_OPCODE, + CMSG_GARRISON_MISSION_BONUS_ROLL = UNKNOWN_OPCODE, + CMSG_GARRISON_PURCHASE_BUILDING = UNKNOWN_OPCODE, + CMSG_GARRISON_RECRUIT_FOLLOWER = UNKNOWN_OPCODE, + CMSG_GARRISON_REMOVE_FOLLOWER = UNKNOWN_OPCODE, + CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = UNKNOWN_OPCODE, + CMSG_GARRISON_RENAME_FOLLOWER = UNKNOWN_OPCODE, + CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = UNKNOWN_OPCODE, + CMSG_GARRISON_REQUEST_SHIPMENT_INFO = UNKNOWN_OPCODE, + CMSG_GARRISON_RESEARCH_TALENT = UNKNOWN_OPCODE, + CMSG_GARRISON_SET_BUILDING_ACTIVE = UNKNOWN_OPCODE, + CMSG_GARRISON_SET_FOLLOWER_FAVORITE = UNKNOWN_OPCODE, + CMSG_GARRISON_SET_FOLLOWER_INACTIVE = UNKNOWN_OPCODE, + CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = UNKNOWN_OPCODE, + CMSG_GARRISON_SOCKET_TALENT = UNKNOWN_OPCODE, + CMSG_GARRISON_START_MISSION = UNKNOWN_OPCODE, + CMSG_GARRISON_SWAP_BUILDINGS = UNKNOWN_OPCODE, + CMSG_GET_GARRISON_INFO = UNKNOWN_OPCODE, + CMSG_GET_LANDING_PAGE_SHIPMENTS = UNKNOWN_OPCODE, + CMSG_GET_RAF_ACCOUNT_INFO = UNKNOWN_OPCODE, + CMSG_GET_TROPHY_LIST = UNKNOWN_OPCODE, + CMSG_GOSSIP_REFRESH_OPTIONS = UNKNOWN_OPCODE, + CMSG_HIDE_QUEST_CHOICE = UNKNOWN_OPCODE, + CMSG_ISLAND_QUEUE = UNKNOWN_OPCODE, + CMSG_JOIN_PET_BATTLE_QUEUE = UNKNOWN_OPCODE, + CMSG_LEARN_PVP_TALENTS = UNKNOWN_OPCODE, + CMSG_LEARN_TALENTS = UNKNOWN_OPCODE, + CMSG_LEAVE_PET_BATTLE_QUEUE = UNKNOWN_OPCODE, + CMSG_LIVE_REGION_KEY_BINDINGS_COPY = UNKNOWN_OPCODE, + CMSG_LOAD_SELECTED_TROPHY = UNKNOWN_OPCODE, + CMSG_MOVE_SET_TURN_RATE_CHEAT = UNKNOWN_OPCODE, + CMSG_MYTHIC_PLUS_REQUEST_MAP_STATS = UNKNOWN_OPCODE, + CMSG_NEUTRAL_PLAYER_SELECT_FACTION = UNKNOWN_OPCODE, + CMSG_OPEN_MISSION_NPC = UNKNOWN_OPCODE, + CMSG_OPEN_SHIPMENT_NPC = UNKNOWN_OPCODE, + CMSG_OPEN_TRADESKILL_NPC = UNKNOWN_OPCODE, + CMSG_PERFORM_ITEM_INTERACTION = UNKNOWN_OPCODE, + CMSG_PERKS_PROGRAM_REQUEST_PENDING_REWARDS = UNKNOWN_OPCODE, + CMSG_PERKS_PROGRAM_REQUEST_PURCHASE = UNKNOWN_OPCODE, + CMSG_PERKS_PROGRAM_REQUEST_REFUND = UNKNOWN_OPCODE, + CMSG_PERKS_PROGRAM_SET_FROZEN_VENDOR_ITEM = UNKNOWN_OPCODE, + CMSG_PERKS_PROGRAM_STATUS_REQUEST = UNKNOWN_OPCODE, + CMSG_PET_BATTLE_FINAL_NOTIFY = UNKNOWN_OPCODE, + CMSG_PET_BATTLE_INPUT = UNKNOWN_OPCODE, + CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = UNKNOWN_OPCODE, + CMSG_PET_BATTLE_QUIT_NOTIFY = UNKNOWN_OPCODE, + CMSG_PET_BATTLE_REPLACE_FRONT_PET = UNKNOWN_OPCODE, + CMSG_PET_BATTLE_REQUEST_PVP = UNKNOWN_OPCODE, + CMSG_PET_BATTLE_REQUEST_UPDATE = UNKNOWN_OPCODE, + CMSG_PET_BATTLE_REQUEST_WILD = UNKNOWN_OPCODE, + CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = UNKNOWN_OPCODE, + CMSG_PET_BATTLE_WILD_LOCATION_FAIL = UNKNOWN_OPCODE, + CMSG_QUERY_GARRISON_PET_NAME = UNKNOWN_OPCODE, + CMSG_QUERY_SCENARIO_POI = UNKNOWN_OPCODE, + CMSG_QUEST_SESSION_BEGIN_RESPONSE = UNKNOWN_OPCODE, + CMSG_QUEST_SESSION_REQUEST_START = UNKNOWN_OPCODE, + CMSG_QUEST_SESSION_REQUEST_STOP = UNKNOWN_OPCODE, + CMSG_QUICK_JOIN_REQUEST_INVITE_WITH_CONFIRMATION = UNKNOWN_OPCODE, + CMSG_QUICK_JOIN_SIGNAL_TOAST_DISPLAYED = UNKNOWN_OPCODE, + CMSG_RAF_CLAIM_ACTIVITY_REWARD = UNKNOWN_OPCODE, + CMSG_RAF_CLAIM_NEXT_REWARD = UNKNOWN_OPCODE, + CMSG_RAF_GENERATE_RECRUITMENT_LINK = UNKNOWN_OPCODE, + CMSG_RAF_UPDATE_RECRUITMENT_INFO = UNKNOWN_OPCODE, + CMSG_REMOVE_RAF_RECRUIT = UNKNOWN_OPCODE, + CMSG_REPLACE_TROPHY = UNKNOWN_OPCODE, + CMSG_REPORT_STUCK_IN_COMBAT = UNKNOWN_OPCODE, + CMSG_REQUEST_CHARACTER_GUILD_FOLLOW_INFO = UNKNOWN_OPCODE, + CMSG_REQUEST_COVENANT_CALLINGS = UNKNOWN_OPCODE, + CMSG_REQUEST_GARRISON_TALENT_WORLD_QUEST_UNLOCKS = UNKNOWN_OPCODE, + CMSG_REQUEST_LATEST_SPLASH_SCREEN = UNKNOWN_OPCODE, + CMSG_REQUEST_MYTHIC_PLUS_AFFIXES = UNKNOWN_OPCODE, + CMSG_REQUEST_MYTHIC_PLUS_SEASON_DATA = UNKNOWN_OPCODE, + CMSG_REQUEST_REALM_GUILD_MASTER_INFO = UNKNOWN_OPCODE, + CMSG_REQUEST_WEEKLY_REWARDS = UNKNOWN_OPCODE, + CMSG_RESET_CHALLENGE_MODE = UNKNOWN_OPCODE, + CMSG_RESET_CHALLENGE_MODE_CHEAT = UNKNOWN_OPCODE, + CMSG_REVERT_MONUMENT_APPEARANCE = UNKNOWN_OPCODE, + CMSG_RPE_RESET_CHARACTER = UNKNOWN_OPCODE, + CMSG_SAVE_PERSONAL_EMBLEM = UNKNOWN_OPCODE, + CMSG_SELL_ALL_JUNK_ITEMS = UNKNOWN_OPCODE, + CMSG_SEND_CHARACTER_CLUB_INVITATION = UNKNOWN_OPCODE, + CMSG_SEND_PING_UNIT = UNKNOWN_OPCODE, + CMSG_SEND_PING_WORLD_POINT = UNKNOWN_OPCODE, + CMSG_SET_ACHIEVEMENTS_HIDDEN = UNKNOWN_OPCODE, + CMSG_SET_BACKPACK_AUTOSORT_DISABLED = UNKNOWN_OPCODE, + CMSG_SET_BACKPACK_SELL_JUNK_DISABLED = UNKNOWN_OPCODE, + CMSG_SET_BANK_AUTOSORT_DISABLED = UNKNOWN_OPCODE, + CMSG_SET_EMPOWER_MIN_HOLD_STAGE_PERCENT = UNKNOWN_OPCODE, + CMSG_SET_EXCLUDED_CHAT_CENSOR_SOURCES = UNKNOWN_OPCODE, + CMSG_SET_LOOT_SPECIALIZATION = UNKNOWN_OPCODE, + CMSG_SET_RESTRICT_PINGS_TO_ASSISTANTS = UNKNOWN_OPCODE, + CMSG_SET_SAVED_INSTANCE_EXTEND = UNKNOWN_OPCODE, + CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = UNKNOWN_OPCODE, + CMSG_SET_TRADE_CURRENCY = UNKNOWN_OPCODE, + CMSG_SET_USING_PARTY_GARRISON = UNKNOWN_OPCODE, + CMSG_SET_WAR_MODE = UNKNOWN_OPCODE, + CMSG_SORT_BAGS = UNKNOWN_OPCODE, + CMSG_SORT_BANK_BAGS = UNKNOWN_OPCODE, + CMSG_SORT_REAGENT_BANK_BAGS = UNKNOWN_OPCODE, + CMSG_SPELL_EMPOWER_RELEASE = UNKNOWN_OPCODE, + CMSG_SPELL_EMPOWER_RESTART = UNKNOWN_OPCODE, + CMSG_START_CHALLENGE_MODE = UNKNOWN_OPCODE, + CMSG_SUBSCRIPTION_INTERSTITIAL_RESPONSE = UNKNOWN_OPCODE, + CMSG_SURRENDER_ARENA = UNKNOWN_OPCODE, + CMSG_TRADE_SKILL_SET_FAVORITE = UNKNOWN_OPCODE, + CMSG_TRAITS_TALENT_TEST_UNLEARN_SPELLS = UNKNOWN_OPCODE, + CMSG_UI_MAP_QUEST_LINES_REQUEST = UNKNOWN_OPCODE, + CMSG_UNLEARN_SPECIALIZATION = UNKNOWN_OPCODE, + CMSG_UPDATE_CRAFTING_NPC_RECIPES = UNKNOWN_OPCODE, + CMSG_UPGRADE_GARRISON = UNKNOWN_OPCODE, + CMSG_UPGRADE_RUNEFORGE_LEGENDARY = UNKNOWN_OPCODE, }; enum OpcodeServer : uint16 @@ -1888,274 +1892,274 @@ enum OpcodeServer : uint16 SMSG_MULTIPLE_PACKETS = 0x3051, // Deleted opcodes, here only to allow compile - SMSG_ACCOUNT_COSMETIC_ADDED = 0xBADD, - SMSG_ACCOUNT_TRANSMOG_SET_FAVORITES_UPDATE = 0xBADD, - SMSG_ACCOUNT_TRANSMOG_UPDATE = 0xBADD, - SMSG_ACTIVATE_ESSENCE_FAILED = 0xBADD, - SMSG_ACTIVATE_SOULBIND_FAILED = 0xBADD, - SMSG_ACTIVE_SCHEDULED_WORLD_STATE_INFO = 0xBADD, - SMSG_ADVANCED_COMBAT_LOG = 0xBADD, - SMSG_ADVENTURE_JOURNAL_DATA_RESPONSE = 0xBADD, - SMSG_APPLY_MOUNT_EQUIPMENT_RESULT = 0xBADD, - SMSG_AREA_TRIGGER_PLAY_SPELL_VISUAL = 0xBADD, - SMSG_AREA_TRIGGER_UPDATE_DECAL_PROPERTIES = 0xBADD, - SMSG_ARENA_CLEAR_OPPONENTS = 0xBADD, - SMSG_ARTIFACT_ENDGAME_POWERS_REFUNDED = 0xBADD, - SMSG_ARTIFACT_FORGE_ERROR = 0xBADD, - SMSG_ARTIFACT_RESPEC_PROMPT = 0xBADD, - SMSG_ARTIFACT_XP_GAIN = 0xBADD, - SMSG_AUCTION_DISABLE_NEW_POSTINGS = 0xBADD, - SMSG_AUCTION_FAVORITE_LIST = 0xBADD, - SMSG_AUCTION_GET_COMMODITY_QUOTE_RESULT = 0xBADD, - SMSG_AUCTION_LIST_BIDDED_ITEMS_RESULT = 0xBADD, - SMSG_AUCTION_LIST_BUCKETS_RESULT = 0xBADD, - SMSG_AUCTION_LIST_OWNED_ITEMS_RESULT = 0xBADD, - SMSG_BACKPACK_DEFAULT_SIZE_CHANGED = 0xBADD, - SMSG_BATTLEFIELD_STATUS_GROUP_PROPOSAL_FAILED = 0xBADD, - SMSG_BROADCAST_SUMMON_CAST = 0xBADD, - SMSG_BROADCAST_SUMMON_RESPONSE = 0xBADD, - SMSG_CANCEL_PING_PIN = 0xBADD, - SMSG_CAPTURE_POINT_REMOVED = 0xBADD, - SMSG_CHAIN_MISSILE_BOUNCE = 0xBADD, - SMSG_CHALLENGE_MODE_COMPLETE = 0xBADD, - SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0xBADD, - SMSG_CHALLENGE_MODE_RESET = 0xBADD, - SMSG_CHALLENGE_MODE_START = 0xBADD, - SMSG_CHALLENGE_MODE_UPDATE_DEATH_COUNT = 0xBADD, - SMSG_CHAT_CAN_LOCAL_WHISPER_TARGET_RESPONSE = 0xBADD, - SMSG_CHAT_REGIONAL_SERVICE_STATUS = 0xBADD, - SMSG_CHECK_ABANDON_NPE = 0xBADD, - SMSG_CHECK_CHARACTER_NAME_AVAILABILITY_RESULT = 0xBADD, - SMSG_CHROMIE_TIME_SELECT_EXPANSION_SUCCESS = 0xBADD, - SMSG_CLAIM_RAF_REWARD_RESPONSE = 0xBADD, - SMSG_CLEAR_RESURRECT = 0xBADD, - SMSG_CLEAR_TREASURE_PICKER_CACHE = 0xBADD, - SMSG_CLOSE_ARTIFACT_FORGE = 0xBADD, - SMSG_CLUB_FINDER_ERROR_MESSAGE = 0xBADD, - SMSG_CLUB_FINDER_GET_CLUB_POSTING_IDS_RESPONSE = 0xBADD, - SMSG_CLUB_FINDER_LOOKUP_CLUB_POSTINGS_LIST = 0xBADD, - SMSG_CLUB_FINDER_RESPONSE_CHARACTER_APPLICATION_LIST = 0xBADD, - SMSG_CLUB_FINDER_RESPONSE_POST_RECRUITMENT_MESSAGE = 0xBADD, - SMSG_CLUB_FINDER_UPDATE_APPLICATIONS = 0xBADD, - SMSG_CLUB_FINDER_WHISPER_APPLICANT_RESPONSE = 0xBADD, - SMSG_COMPLETE_SHIPMENT_RESPONSE = 0xBADD, - SMSG_CONVERT_ITEMS_TO_CURRENCY_VALUE = 0xBADD, - SMSG_COVENANT_CALLINGS_AVAILABILITY_RESPONSE = 0xBADD, - SMSG_COVENANT_PREVIEW_OPEN_NPC = 0xBADD, - SMSG_COVENANT_RENOWN_SEND_CATCHUP_STATE = 0xBADD, - SMSG_CRAFTING_HOUSE_HELLO_RESPONSE = 0xBADD, - SMSG_CRAFTING_ORDER_CANCEL_RESULT = 0xBADD, - SMSG_CRAFTING_ORDER_CLAIM_RESULT = 0xBADD, - SMSG_CRAFTING_ORDER_CRAFT_RESULT = 0xBADD, - SMSG_CRAFTING_ORDER_CREATE_RESULT = 0xBADD, - SMSG_CRAFTING_ORDER_FULFILL_RESULT = 0xBADD, - SMSG_CRAFTING_ORDER_LIST_ORDERS_RESPONSE = 0xBADD, - SMSG_CRAFTING_ORDER_REJECT_RESULT = 0xBADD, - SMSG_CRAFTING_ORDER_RELEASE_RESULT = 0xBADD, - SMSG_CRAFTING_ORDER_UPDATE_STATE = 0xBADD, - SMSG_CRAFT_ENCHANT_RESULT = 0xBADD, - SMSG_CREATE_SHIPMENT_RESPONSE = 0xBADD, - SMSG_CREATOR_VISUALS_OVERRIDE = 0xBADD, - SMSG_DELETE_EXPIRED_MISSIONS_RESULT = 0xBADD, - SMSG_DISPLAY_SOULBIND_UPDATE_MESSAGE = 0xBADD, - SMSG_DISPLAY_WORLD_TEXT = 0xBADD, - SMSG_DISPLAY_WORLD_TEXT_ON_TARGET = 0xBADD, - SMSG_EXTERNAL_TRANSACTION_ID_GENERATED = 0xBADD, - SMSG_FLUSH_COMBAT_LOG_FILE = 0xBADD, - SMSG_FORCE_ANIMATIONS = 0xBADD, - SMSG_FORCE_RANDOM_TRANSMOG_TOAST = 0xBADD, - SMSG_GAIN_MAW_POWER = 0xBADD, - SMSG_GARRISON_ACTIVATE_MISSION_BONUS_ABILITY = 0xBADD, - SMSG_GARRISON_ADD_EVENT = 0xBADD, - SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0xBADD, - SMSG_GARRISON_ADD_MISSION_RESULT = 0xBADD, - SMSG_GARRISON_ADD_SPEC_GROUPS = 0xBADD, - SMSG_GARRISON_APPLY_TALENT_SOCKET_DATA_CHANGES = 0xBADD, - SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0xBADD, - SMSG_GARRISON_AUTO_TROOP_MIN_LEVEL_UPDATE_RESULT = 0xBADD, - SMSG_GARRISON_BUILDING_ACTIVATED = 0xBADD, - SMSG_GARRISON_BUILDING_REMOVED = 0xBADD, - SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0xBADD, - SMSG_GARRISON_CHANGE_MISSION_START_TIME_RESULT = 0xBADD, - SMSG_GARRISON_CLEAR_COLLECTION = 0xBADD, - SMSG_GARRISON_CLEAR_EVENT_LIST = 0xBADD, - SMSG_GARRISON_CLEAR_SPEC_GROUPS = 0xBADD, - SMSG_GARRISON_COLLECTION_REMOVE_ENTRY = 0xBADD, - SMSG_GARRISON_COLLECTION_UPDATE_ENTRY = 0xBADD, - SMSG_GARRISON_COMPLETE_BUILDING_CONSTRUCTION_RESULT = 0xBADD, - SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0xBADD, - SMSG_GARRISON_CREATE_RESULT = 0xBADD, - SMSG_GARRISON_DELETE_MISSION_RESULT = 0xBADD, - SMSG_GARRISON_DELETE_RESULT = 0xBADD, - SMSG_GARRISON_FOLLOWER_ACTIVATIONS_SET = 0xBADD, - SMSG_GARRISON_FOLLOWER_CHANGED_FLAGS = 0xBADD, - SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0xBADD, - SMSG_GARRISON_FOLLOWER_CHANGED_QUALITY = 0xBADD, - SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0xBADD, - SMSG_GARRISON_FOLLOWER_FATIGUE_CLEARED = 0xBADD, - SMSG_GARRISON_GENERATE_FOLLOWERS_RESULT = 0xBADD, - SMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO_RESULT = 0xBADD, - SMSG_GARRISON_GET_RECALL_PORTAL_LAST_USED_TIME_RESULT = 0xBADD, - SMSG_GARRISON_IS_UPGRADEABLE_RESPONSE = 0xBADD, - SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0xBADD, - SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0xBADD, - SMSG_GARRISON_LIST_COMPLETED_MISSIONS_CHEAT_RESULT = 0xBADD, - SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0xBADD, - SMSG_GARRISON_MAP_DATA_RESPONSE = 0xBADD, - SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0xBADD, - SMSG_GARRISON_MISSION_REQUEST_REWARD_INFO_RESPONSE = 0xBADD, - SMSG_GARRISON_MISSION_START_CONDITION_UPDATE = 0xBADD, - SMSG_GARRISON_OPEN_CRAFTER = 0xBADD, - SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0xBADD, - SMSG_GARRISON_PLACE_BUILDING_RESULT = 0xBADD, - SMSG_GARRISON_PLOT_PLACED = 0xBADD, - SMSG_GARRISON_PLOT_REMOVED = 0xBADD, - SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0xBADD, - SMSG_GARRISON_REMOTE_INFO = 0xBADD, - SMSG_GARRISON_REMOVE_EVENT = 0xBADD, - SMSG_GARRISON_REMOVE_FOLLOWER_ABILITY_RESULT = 0xBADD, - SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0xBADD, - SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0xBADD, - SMSG_GARRISON_RENAME_FOLLOWER_RESULT = 0xBADD, - SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0xBADD, - SMSG_GARRISON_RESEARCH_TALENT_RESULT = 0xBADD, - SMSG_GARRISON_RESET_TALENT_TREE = 0xBADD, - SMSG_GARRISON_RESET_TALENT_TREE_SOCKET_DATA = 0xBADD, - SMSG_GARRISON_START_MISSION_RESULT = 0xBADD, - SMSG_GARRISON_SWAP_BUILDINGS_RESPONSE = 0xBADD, - SMSG_GARRISON_SWITCH_TALENT_TREE_BRANCH = 0xBADD, - SMSG_GARRISON_TALENT_COMPLETED = 0xBADD, - SMSG_GARRISON_TALENT_REMOVED = 0xBADD, - SMSG_GARRISON_TALENT_REMOVE_SOCKET_DATA = 0xBADD, - SMSG_GARRISON_TALENT_UPDATE_SOCKET_DATA = 0xBADD, - SMSG_GARRISON_TALENT_WORLD_QUEST_UNLOCKS_RESPONSE = 0xBADD, - SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0xBADD, - SMSG_GARRISON_UPDATE_FOLLOWER = 0xBADD, - SMSG_GARRISON_UPDATE_GARRISON_MONUMENT_SELECTIONS = 0xBADD, - SMSG_GARRISON_UPDATE_MISSION_CHEAT_RESULT = 0xBADD, - SMSG_GARRISON_UPGRADE_RESULT = 0xBADD, - SMSG_GARRISON_USE_RECALL_PORTAL_RESULT = 0xBADD, - SMSG_GET_GARRISON_INFO_RESULT = 0xBADD, - SMSG_GET_LANDING_PAGE_SHIPMENTS_RESPONSE = 0xBADD, - SMSG_GET_SELECTED_TROPHY_ID_RESPONSE = 0xBADD, - SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0xBADD, - SMSG_GET_SHIPMENT_INFO_RESPONSE = 0xBADD, - SMSG_GET_TROPHY_LIST_RESPONSE = 0xBADD, - SMSG_GOSSIP_REFRESH_OPTIONS = 0xBADD, - SMSG_GUILD_EVENT_STATUS_CHANGE = 0xBADD, - SMSG_ITEM_INTERACTION_COMPLETE = 0xBADD, - SMSG_LEVEL_LINKING_RESULT = 0xBADD, - SMSG_LIVE_REGION_KEY_BINDINGS_COPY_RESULT = 0xBADD, - SMSG_MEETING_STONE_FAILED = 0xBADD, - SMSG_MOVE_ADD_IMPULSE = 0xBADD, - SMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED = 0xBADD, - SMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION = 0xBADD, - SMSG_MOVE_SET_ADV_FLYING_BANKING_RATE = 0xBADD, - SMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD = 0xBADD, - SMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT = 0xBADD, - SMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT = 0xBADD, - SMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT = 0xBADD, - SMSG_MOVE_SET_ADV_FLYING_MAX_VEL = 0xBADD, - SMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION = 0xBADD, - SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN = 0xBADD, - SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP = 0xBADD, - SMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION = 0xBADD, - SMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD = 0xBADD, - SMSG_MOVE_SET_CAN_ADV_FLY = 0xBADD, - SMSG_MOVE_UNSET_CAN_ADV_FLY = 0xBADD, - SMSG_MOVE_UPDATE_ADD_IMPULSE = 0xBADD, - SMSG_MULTI_FLOOR_LEAVE_FLOOR = 0xBADD, - SMSG_MULTI_FLOOR_NEW_FLOOR = 0xBADD, - SMSG_MYTHIC_PLUS_ALL_MAP_STATS = 0xBADD, - SMSG_MYTHIC_PLUS_CURRENT_AFFIXES = 0xBADD, - SMSG_MYTHIC_PLUS_NEW_WEEK_RECORD = 0xBADD, - SMSG_MYTHIC_PLUS_SEASON_DATA = 0xBADD, - SMSG_OPEN_ARTIFACT_FORGE = 0xBADD, - SMSG_OPEN_SHIPMENT_NPC_RESULT = 0xBADD, - SMSG_PAST_TIME_EVENTS = 0xBADD, - SMSG_PERKS_PROGRAM_ACTIVITY_COMPLETE = 0xBADD, - SMSG_PERKS_PROGRAM_ACTIVITY_UPDATE = 0xBADD, - SMSG_PERKS_PROGRAM_DISABLED = 0xBADD, - SMSG_PERKS_PROGRAM_RESULT = 0xBADD, - SMSG_PERKS_PROGRAM_VENDOR_UPDATE = 0xBADD, - SMSG_PET_BATTLE_CHAT_RESTRICTED = 0xBADD, - SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0xBADD, - SMSG_PET_BATTLE_FINALIZE_LOCATION = 0xBADD, - SMSG_PET_BATTLE_FINAL_ROUND = 0xBADD, - SMSG_PET_BATTLE_FINISHED = 0xBADD, - SMSG_PET_BATTLE_FIRST_ROUND = 0xBADD, - SMSG_PET_BATTLE_INITIAL_UPDATE = 0xBADD, - SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0xBADD, - SMSG_PET_BATTLE_PVP_CHALLENGE = 0xBADD, - SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0xBADD, - SMSG_PET_BATTLE_QUEUE_STATUS = 0xBADD, - SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0xBADD, - SMSG_PET_BATTLE_REQUEST_FAILED = 0xBADD, - SMSG_PET_BATTLE_ROUND_RESULT = 0xBADD, - SMSG_PLAYER_AZERITE_ITEM_EQUIPPED_STATUS_CHANGED = 0xBADD, - SMSG_PLAYER_AZERITE_ITEM_GAINS = 0xBADD, - SMSG_PLAYER_CHOICE_CLEAR = 0xBADD, - SMSG_PLAYER_CHOICE_DISPLAY_ERROR = 0xBADD, - SMSG_PLAYER_OPEN_SUBSCRIPTION_INTERSTITIAL = 0xBADD, - SMSG_PLAYER_SAVE_PERSONAL_EMBLEM = 0xBADD, - SMSG_PLAYER_SHOW_PARTY_POSE_UI = 0xBADD, - SMSG_PLAYER_SHOW_UI_EVENT_TOAST = 0xBADD, - SMSG_PLAY_TIME_WARNING = 0xBADD, - SMSG_PROFESSION_GOSSIP = 0xBADD, - SMSG_PVP_MATCH_COMPLETE = 0xBADD, - SMSG_PVP_MATCH_SET_STATE = 0xBADD, - SMSG_PVP_MATCH_STATISTICS = 0xBADD, - SMSG_PVP_TIER_RECORD = 0xBADD, - SMSG_QUERY_GARRISON_PET_NAME_RESPONSE = 0xBADD, - SMSG_QUERY_GUILD_FOLLOW_INFO_RESPONSE = 0xBADD, - SMSG_QUERY_REALM_GUILD_MASTER_INFO_RESPONSE = 0xBADD, - SMSG_QUEST_SESSION_INFO_RESPONSE = 0xBADD, - SMSG_QUEST_SESSION_READY_CHECK = 0xBADD, - SMSG_QUEST_SESSION_READY_CHECK_RESPONSE = 0xBADD, - SMSG_QUEST_SESSION_RESULT = 0xBADD, - SMSG_RAF_ACCOUNT_INFO = 0xBADD, - SMSG_RAF_ACTIVITY_STATE_CHANGED = 0xBADD, - SMSG_RAF_DEBUG_FRIEND_MONTHS = 0xBADD, - SMSG_RECEIVE_PING_UNIT = 0xBADD, - SMSG_RECEIVE_PING_WORLD_POINT = 0xBADD, - SMSG_RECRAFT_ITEM_RESULT = 0xBADD, - SMSG_REMOVE_SPELL_FROM_ACTION_BAR = 0xBADD, - SMSG_REPLACE_TROPHY_RESPONSE = 0xBADD, - SMSG_RESET_LAST_LOADED_CONFIG_CVARS = 0xBADD, - SMSG_RESPONSE_PERK_PENDING_REWARDS = 0xBADD, - SMSG_RESPONSE_PERK_RECENT_PURCHASES = 0xBADD, - SMSG_RESTART_GLOBAL_COOLDOWN = 0xBADD, - SMSG_RESTRICTED_ACCOUNT_WARNING = 0xBADD, - SMSG_RETURNING_PLAYER_PROMPT = 0xBADD, - SMSG_RETURN_APPLICANT_LIST = 0xBADD, - SMSG_RETURN_RECRUITING_CLUBS = 0xBADD, - SMSG_RUNEFORGE_LEGENDARY_CRAFTING_OPEN_NPC = 0xBADD, - SMSG_SEASON_INFO = 0xBADD, - SMSG_SETUP_COMBAT_LOG_FILE_FLUSH = 0xBADD, - SMSG_SET_QUEST_REPLAY_COOLDOWN_OVERRIDE = 0xBADD, - SMSG_SET_SHIPMENT_READY_RESPONSE = 0xBADD, - SMSG_SHADOWLANDS_CAPACITANCE_UPDATE = 0xBADD, - SMSG_SHIPMENT_FACTION_UPDATE_RESULT = 0xBADD, - SMSG_SPELL_EMPOWER_SET_STAGE = 0xBADD, - SMSG_SPELL_EMPOWER_START = 0xBADD, - SMSG_SPELL_EMPOWER_UPDATE = 0xBADD, - SMSG_SPLASH_SCREEN_SHOW_LATEST = 0xBADD, - SMSG_STARTER_BUILD_ACTIVATE_FAILED = 0xBADD, - SMSG_STOP_TIMER = 0xBADD, - SMSG_TOTEM_DURATION_CHANGED = 0xBADD, - SMSG_TOTEM_REMOVED = 0xBADD, - SMSG_UI_MAP_QUEST_LINES_RESPONSE = 0xBADD, - SMSG_UPDATE_CAPTURE_POINT = 0xBADD, - SMSG_UPDATE_CRAFTING_NPC_RECIPES = 0xBADD, - SMSG_UPDATE_DAILY_MISSION_COUNTER = 0xBADD, - SMSG_UPDATE_RECENT_PLAYER_GUIDS = 0xBADD, - SMSG_WEEKLY_REWARDS_PROGRESS_RESULT = 0xBADD, - SMSG_WEEKLY_REWARDS_RESULT = 0xBADD, - SMSG_WEEKLY_REWARD_CLAIM_RESULT = 0xBADD, - SMSG_XP_AWARDED_FROM_CURRENCY = 0xBADD + SMSG_ACCOUNT_COSMETIC_ADDED = UNKNOWN_OPCODE, + SMSG_ACCOUNT_TRANSMOG_SET_FAVORITES_UPDATE = UNKNOWN_OPCODE, + SMSG_ACCOUNT_TRANSMOG_UPDATE = UNKNOWN_OPCODE, + SMSG_ACTIVATE_ESSENCE_FAILED = UNKNOWN_OPCODE, + SMSG_ACTIVATE_SOULBIND_FAILED = UNKNOWN_OPCODE, + SMSG_ACTIVE_SCHEDULED_WORLD_STATE_INFO = UNKNOWN_OPCODE, + SMSG_ADVANCED_COMBAT_LOG = UNKNOWN_OPCODE, + SMSG_ADVENTURE_JOURNAL_DATA_RESPONSE = UNKNOWN_OPCODE, + SMSG_APPLY_MOUNT_EQUIPMENT_RESULT = UNKNOWN_OPCODE, + SMSG_AREA_TRIGGER_PLAY_SPELL_VISUAL = UNKNOWN_OPCODE, + SMSG_AREA_TRIGGER_UPDATE_DECAL_PROPERTIES = UNKNOWN_OPCODE, + SMSG_ARENA_CLEAR_OPPONENTS = UNKNOWN_OPCODE, + SMSG_ARTIFACT_ENDGAME_POWERS_REFUNDED = UNKNOWN_OPCODE, + SMSG_ARTIFACT_FORGE_ERROR = UNKNOWN_OPCODE, + SMSG_ARTIFACT_RESPEC_PROMPT = UNKNOWN_OPCODE, + SMSG_ARTIFACT_XP_GAIN = UNKNOWN_OPCODE, + SMSG_AUCTION_DISABLE_NEW_POSTINGS = UNKNOWN_OPCODE, + SMSG_AUCTION_FAVORITE_LIST = UNKNOWN_OPCODE, + SMSG_AUCTION_GET_COMMODITY_QUOTE_RESULT = UNKNOWN_OPCODE, + SMSG_AUCTION_LIST_BIDDED_ITEMS_RESULT = UNKNOWN_OPCODE, + SMSG_AUCTION_LIST_BUCKETS_RESULT = UNKNOWN_OPCODE, + SMSG_AUCTION_LIST_OWNED_ITEMS_RESULT = UNKNOWN_OPCODE, + SMSG_BACKPACK_DEFAULT_SIZE_CHANGED = UNKNOWN_OPCODE, + SMSG_BATTLEFIELD_STATUS_GROUP_PROPOSAL_FAILED = UNKNOWN_OPCODE, + SMSG_BROADCAST_SUMMON_CAST = UNKNOWN_OPCODE, + SMSG_BROADCAST_SUMMON_RESPONSE = UNKNOWN_OPCODE, + SMSG_CANCEL_PING_PIN = UNKNOWN_OPCODE, + SMSG_CAPTURE_POINT_REMOVED = UNKNOWN_OPCODE, + SMSG_CHAIN_MISSILE_BOUNCE = UNKNOWN_OPCODE, + SMSG_CHALLENGE_MODE_COMPLETE = UNKNOWN_OPCODE, + SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = UNKNOWN_OPCODE, + SMSG_CHALLENGE_MODE_RESET = UNKNOWN_OPCODE, + SMSG_CHALLENGE_MODE_START = UNKNOWN_OPCODE, + SMSG_CHALLENGE_MODE_UPDATE_DEATH_COUNT = UNKNOWN_OPCODE, + SMSG_CHAT_CAN_LOCAL_WHISPER_TARGET_RESPONSE = UNKNOWN_OPCODE, + SMSG_CHAT_REGIONAL_SERVICE_STATUS = UNKNOWN_OPCODE, + SMSG_CHECK_ABANDON_NPE = UNKNOWN_OPCODE, + SMSG_CHECK_CHARACTER_NAME_AVAILABILITY_RESULT = UNKNOWN_OPCODE, + SMSG_CHROMIE_TIME_SELECT_EXPANSION_SUCCESS = UNKNOWN_OPCODE, + SMSG_CLAIM_RAF_REWARD_RESPONSE = UNKNOWN_OPCODE, + SMSG_CLEAR_RESURRECT = UNKNOWN_OPCODE, + SMSG_CLEAR_TREASURE_PICKER_CACHE = UNKNOWN_OPCODE, + SMSG_CLOSE_ARTIFACT_FORGE = UNKNOWN_OPCODE, + SMSG_CLUB_FINDER_ERROR_MESSAGE = UNKNOWN_OPCODE, + SMSG_CLUB_FINDER_GET_CLUB_POSTING_IDS_RESPONSE = UNKNOWN_OPCODE, + SMSG_CLUB_FINDER_LOOKUP_CLUB_POSTINGS_LIST = UNKNOWN_OPCODE, + SMSG_CLUB_FINDER_RESPONSE_CHARACTER_APPLICATION_LIST = UNKNOWN_OPCODE, + SMSG_CLUB_FINDER_RESPONSE_POST_RECRUITMENT_MESSAGE = UNKNOWN_OPCODE, + SMSG_CLUB_FINDER_UPDATE_APPLICATIONS = UNKNOWN_OPCODE, + SMSG_CLUB_FINDER_WHISPER_APPLICANT_RESPONSE = UNKNOWN_OPCODE, + SMSG_COMPLETE_SHIPMENT_RESPONSE = UNKNOWN_OPCODE, + SMSG_CONVERT_ITEMS_TO_CURRENCY_VALUE = UNKNOWN_OPCODE, + SMSG_COVENANT_CALLINGS_AVAILABILITY_RESPONSE = UNKNOWN_OPCODE, + SMSG_COVENANT_PREVIEW_OPEN_NPC = UNKNOWN_OPCODE, + SMSG_COVENANT_RENOWN_SEND_CATCHUP_STATE = UNKNOWN_OPCODE, + SMSG_CRAFTING_HOUSE_HELLO_RESPONSE = UNKNOWN_OPCODE, + SMSG_CRAFTING_ORDER_CANCEL_RESULT = UNKNOWN_OPCODE, + SMSG_CRAFTING_ORDER_CLAIM_RESULT = UNKNOWN_OPCODE, + SMSG_CRAFTING_ORDER_CRAFT_RESULT = UNKNOWN_OPCODE, + SMSG_CRAFTING_ORDER_CREATE_RESULT = UNKNOWN_OPCODE, + SMSG_CRAFTING_ORDER_FULFILL_RESULT = UNKNOWN_OPCODE, + SMSG_CRAFTING_ORDER_LIST_ORDERS_RESPONSE = UNKNOWN_OPCODE, + SMSG_CRAFTING_ORDER_REJECT_RESULT = UNKNOWN_OPCODE, + SMSG_CRAFTING_ORDER_RELEASE_RESULT = UNKNOWN_OPCODE, + SMSG_CRAFTING_ORDER_UPDATE_STATE = UNKNOWN_OPCODE, + SMSG_CRAFT_ENCHANT_RESULT = UNKNOWN_OPCODE, + SMSG_CREATE_SHIPMENT_RESPONSE = UNKNOWN_OPCODE, + SMSG_CREATOR_VISUALS_OVERRIDE = UNKNOWN_OPCODE, + SMSG_DELETE_EXPIRED_MISSIONS_RESULT = UNKNOWN_OPCODE, + SMSG_DISPLAY_SOULBIND_UPDATE_MESSAGE = UNKNOWN_OPCODE, + SMSG_DISPLAY_WORLD_TEXT = UNKNOWN_OPCODE, + SMSG_DISPLAY_WORLD_TEXT_ON_TARGET = UNKNOWN_OPCODE, + SMSG_EXTERNAL_TRANSACTION_ID_GENERATED = UNKNOWN_OPCODE, + SMSG_FLUSH_COMBAT_LOG_FILE = UNKNOWN_OPCODE, + SMSG_FORCE_ANIMATIONS = UNKNOWN_OPCODE, + SMSG_FORCE_RANDOM_TRANSMOG_TOAST = UNKNOWN_OPCODE, + SMSG_GAIN_MAW_POWER = UNKNOWN_OPCODE, + SMSG_GARRISON_ACTIVATE_MISSION_BONUS_ABILITY = UNKNOWN_OPCODE, + SMSG_GARRISON_ADD_EVENT = UNKNOWN_OPCODE, + SMSG_GARRISON_ADD_FOLLOWER_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_ADD_MISSION_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_ADD_SPEC_GROUPS = UNKNOWN_OPCODE, + SMSG_GARRISON_APPLY_TALENT_SOCKET_DATA_CHANGES = UNKNOWN_OPCODE, + SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_AUTO_TROOP_MIN_LEVEL_UPDATE_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_BUILDING_ACTIVATED = UNKNOWN_OPCODE, + SMSG_GARRISON_BUILDING_REMOVED = UNKNOWN_OPCODE, + SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_CHANGE_MISSION_START_TIME_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_CLEAR_COLLECTION = UNKNOWN_OPCODE, + SMSG_GARRISON_CLEAR_EVENT_LIST = UNKNOWN_OPCODE, + SMSG_GARRISON_CLEAR_SPEC_GROUPS = UNKNOWN_OPCODE, + SMSG_GARRISON_COLLECTION_REMOVE_ENTRY = UNKNOWN_OPCODE, + SMSG_GARRISON_COLLECTION_UPDATE_ENTRY = UNKNOWN_OPCODE, + SMSG_GARRISON_COMPLETE_BUILDING_CONSTRUCTION_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_COMPLETE_MISSION_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_CREATE_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_DELETE_MISSION_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_DELETE_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_FOLLOWER_ACTIVATIONS_SET = UNKNOWN_OPCODE, + SMSG_GARRISON_FOLLOWER_CHANGED_FLAGS = UNKNOWN_OPCODE, + SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = UNKNOWN_OPCODE, + SMSG_GARRISON_FOLLOWER_CHANGED_QUALITY = UNKNOWN_OPCODE, + SMSG_GARRISON_FOLLOWER_CHANGED_XP = UNKNOWN_OPCODE, + SMSG_GARRISON_FOLLOWER_FATIGUE_CLEARED = UNKNOWN_OPCODE, + SMSG_GARRISON_GENERATE_FOLLOWERS_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_GET_RECALL_PORTAL_LAST_USED_TIME_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_IS_UPGRADEABLE_RESPONSE = UNKNOWN_OPCODE, + SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_LIST_COMPLETED_MISSIONS_CHEAT_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_MAP_DATA_RESPONSE = UNKNOWN_OPCODE, + SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_MISSION_REQUEST_REWARD_INFO_RESPONSE = UNKNOWN_OPCODE, + SMSG_GARRISON_MISSION_START_CONDITION_UPDATE = UNKNOWN_OPCODE, + SMSG_GARRISON_OPEN_CRAFTER = UNKNOWN_OPCODE, + SMSG_GARRISON_OPEN_RECRUITMENT_NPC = UNKNOWN_OPCODE, + SMSG_GARRISON_PLACE_BUILDING_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_PLOT_PLACED = UNKNOWN_OPCODE, + SMSG_GARRISON_PLOT_REMOVED = UNKNOWN_OPCODE, + SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_REMOTE_INFO = UNKNOWN_OPCODE, + SMSG_GARRISON_REMOVE_EVENT = UNKNOWN_OPCODE, + SMSG_GARRISON_REMOVE_FOLLOWER_ABILITY_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_RENAME_FOLLOWER_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_RESEARCH_TALENT_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_RESET_TALENT_TREE = UNKNOWN_OPCODE, + SMSG_GARRISON_RESET_TALENT_TREE_SOCKET_DATA = UNKNOWN_OPCODE, + SMSG_GARRISON_START_MISSION_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_SWAP_BUILDINGS_RESPONSE = UNKNOWN_OPCODE, + SMSG_GARRISON_SWITCH_TALENT_TREE_BRANCH = UNKNOWN_OPCODE, + SMSG_GARRISON_TALENT_COMPLETED = UNKNOWN_OPCODE, + SMSG_GARRISON_TALENT_REMOVED = UNKNOWN_OPCODE, + SMSG_GARRISON_TALENT_REMOVE_SOCKET_DATA = UNKNOWN_OPCODE, + SMSG_GARRISON_TALENT_UPDATE_SOCKET_DATA = UNKNOWN_OPCODE, + SMSG_GARRISON_TALENT_WORLD_QUEST_UNLOCKS_RESPONSE = UNKNOWN_OPCODE, + SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_UPDATE_FOLLOWER = UNKNOWN_OPCODE, + SMSG_GARRISON_UPDATE_GARRISON_MONUMENT_SELECTIONS = UNKNOWN_OPCODE, + SMSG_GARRISON_UPDATE_MISSION_CHEAT_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_UPGRADE_RESULT = UNKNOWN_OPCODE, + SMSG_GARRISON_USE_RECALL_PORTAL_RESULT = UNKNOWN_OPCODE, + SMSG_GET_GARRISON_INFO_RESULT = UNKNOWN_OPCODE, + SMSG_GET_LANDING_PAGE_SHIPMENTS_RESPONSE = UNKNOWN_OPCODE, + SMSG_GET_SELECTED_TROPHY_ID_RESPONSE = UNKNOWN_OPCODE, + SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = UNKNOWN_OPCODE, + SMSG_GET_SHIPMENT_INFO_RESPONSE = UNKNOWN_OPCODE, + SMSG_GET_TROPHY_LIST_RESPONSE = UNKNOWN_OPCODE, + SMSG_GOSSIP_REFRESH_OPTIONS = UNKNOWN_OPCODE, + SMSG_GUILD_EVENT_STATUS_CHANGE = UNKNOWN_OPCODE, + SMSG_ITEM_INTERACTION_COMPLETE = UNKNOWN_OPCODE, + SMSG_LEVEL_LINKING_RESULT = UNKNOWN_OPCODE, + SMSG_LIVE_REGION_KEY_BINDINGS_COPY_RESULT = UNKNOWN_OPCODE, + SMSG_MEETING_STONE_FAILED = UNKNOWN_OPCODE, + SMSG_MOVE_ADD_IMPULSE = UNKNOWN_OPCODE, + SMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED = UNKNOWN_OPCODE, + SMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION = UNKNOWN_OPCODE, + SMSG_MOVE_SET_ADV_FLYING_BANKING_RATE = UNKNOWN_OPCODE, + SMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD = UNKNOWN_OPCODE, + SMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT = UNKNOWN_OPCODE, + SMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT = UNKNOWN_OPCODE, + SMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT = UNKNOWN_OPCODE, + SMSG_MOVE_SET_ADV_FLYING_MAX_VEL = UNKNOWN_OPCODE, + SMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION = UNKNOWN_OPCODE, + SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN = UNKNOWN_OPCODE, + SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP = UNKNOWN_OPCODE, + SMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION = UNKNOWN_OPCODE, + SMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD = UNKNOWN_OPCODE, + SMSG_MOVE_SET_CAN_ADV_FLY = UNKNOWN_OPCODE, + SMSG_MOVE_UNSET_CAN_ADV_FLY = UNKNOWN_OPCODE, + SMSG_MOVE_UPDATE_ADD_IMPULSE = UNKNOWN_OPCODE, + SMSG_MULTI_FLOOR_LEAVE_FLOOR = UNKNOWN_OPCODE, + SMSG_MULTI_FLOOR_NEW_FLOOR = UNKNOWN_OPCODE, + SMSG_MYTHIC_PLUS_ALL_MAP_STATS = UNKNOWN_OPCODE, + SMSG_MYTHIC_PLUS_CURRENT_AFFIXES = UNKNOWN_OPCODE, + SMSG_MYTHIC_PLUS_NEW_WEEK_RECORD = UNKNOWN_OPCODE, + SMSG_MYTHIC_PLUS_SEASON_DATA = UNKNOWN_OPCODE, + SMSG_OPEN_ARTIFACT_FORGE = UNKNOWN_OPCODE, + SMSG_OPEN_SHIPMENT_NPC_RESULT = UNKNOWN_OPCODE, + SMSG_PAST_TIME_EVENTS = UNKNOWN_OPCODE, + SMSG_PERKS_PROGRAM_ACTIVITY_COMPLETE = UNKNOWN_OPCODE, + SMSG_PERKS_PROGRAM_ACTIVITY_UPDATE = UNKNOWN_OPCODE, + SMSG_PERKS_PROGRAM_DISABLED = UNKNOWN_OPCODE, + SMSG_PERKS_PROGRAM_RESULT = UNKNOWN_OPCODE, + SMSG_PERKS_PROGRAM_VENDOR_UPDATE = UNKNOWN_OPCODE, + SMSG_PET_BATTLE_CHAT_RESTRICTED = UNKNOWN_OPCODE, + SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = UNKNOWN_OPCODE, + SMSG_PET_BATTLE_FINALIZE_LOCATION = UNKNOWN_OPCODE, + SMSG_PET_BATTLE_FINAL_ROUND = UNKNOWN_OPCODE, + SMSG_PET_BATTLE_FINISHED = UNKNOWN_OPCODE, + SMSG_PET_BATTLE_FIRST_ROUND = UNKNOWN_OPCODE, + SMSG_PET_BATTLE_INITIAL_UPDATE = UNKNOWN_OPCODE, + SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = UNKNOWN_OPCODE, + SMSG_PET_BATTLE_PVP_CHALLENGE = UNKNOWN_OPCODE, + SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = UNKNOWN_OPCODE, + SMSG_PET_BATTLE_QUEUE_STATUS = UNKNOWN_OPCODE, + SMSG_PET_BATTLE_REPLACEMENTS_MADE = UNKNOWN_OPCODE, + SMSG_PET_BATTLE_REQUEST_FAILED = UNKNOWN_OPCODE, + SMSG_PET_BATTLE_ROUND_RESULT = UNKNOWN_OPCODE, + SMSG_PLAYER_AZERITE_ITEM_EQUIPPED_STATUS_CHANGED = UNKNOWN_OPCODE, + SMSG_PLAYER_AZERITE_ITEM_GAINS = UNKNOWN_OPCODE, + SMSG_PLAYER_CHOICE_CLEAR = UNKNOWN_OPCODE, + SMSG_PLAYER_CHOICE_DISPLAY_ERROR = UNKNOWN_OPCODE, + SMSG_PLAYER_OPEN_SUBSCRIPTION_INTERSTITIAL = UNKNOWN_OPCODE, + SMSG_PLAYER_SAVE_PERSONAL_EMBLEM = UNKNOWN_OPCODE, + SMSG_PLAYER_SHOW_PARTY_POSE_UI = UNKNOWN_OPCODE, + SMSG_PLAYER_SHOW_UI_EVENT_TOAST = UNKNOWN_OPCODE, + SMSG_PLAY_TIME_WARNING = UNKNOWN_OPCODE, + SMSG_PROFESSION_GOSSIP = UNKNOWN_OPCODE, + SMSG_PVP_MATCH_COMPLETE = UNKNOWN_OPCODE, + SMSG_PVP_MATCH_SET_STATE = UNKNOWN_OPCODE, + SMSG_PVP_MATCH_STATISTICS = UNKNOWN_OPCODE, + SMSG_PVP_TIER_RECORD = UNKNOWN_OPCODE, + SMSG_QUERY_GARRISON_PET_NAME_RESPONSE = UNKNOWN_OPCODE, + SMSG_QUERY_GUILD_FOLLOW_INFO_RESPONSE = UNKNOWN_OPCODE, + SMSG_QUERY_REALM_GUILD_MASTER_INFO_RESPONSE = UNKNOWN_OPCODE, + SMSG_QUEST_SESSION_INFO_RESPONSE = UNKNOWN_OPCODE, + SMSG_QUEST_SESSION_READY_CHECK = UNKNOWN_OPCODE, + SMSG_QUEST_SESSION_READY_CHECK_RESPONSE = UNKNOWN_OPCODE, + SMSG_QUEST_SESSION_RESULT = UNKNOWN_OPCODE, + SMSG_RAF_ACCOUNT_INFO = UNKNOWN_OPCODE, + SMSG_RAF_ACTIVITY_STATE_CHANGED = UNKNOWN_OPCODE, + SMSG_RAF_DEBUG_FRIEND_MONTHS = UNKNOWN_OPCODE, + SMSG_RECEIVE_PING_UNIT = UNKNOWN_OPCODE, + SMSG_RECEIVE_PING_WORLD_POINT = UNKNOWN_OPCODE, + SMSG_RECRAFT_ITEM_RESULT = UNKNOWN_OPCODE, + SMSG_REMOVE_SPELL_FROM_ACTION_BAR = UNKNOWN_OPCODE, + SMSG_REPLACE_TROPHY_RESPONSE = UNKNOWN_OPCODE, + SMSG_RESET_LAST_LOADED_CONFIG_CVARS = UNKNOWN_OPCODE, + SMSG_RESPONSE_PERK_PENDING_REWARDS = UNKNOWN_OPCODE, + SMSG_RESPONSE_PERK_RECENT_PURCHASES = UNKNOWN_OPCODE, + SMSG_RESTART_GLOBAL_COOLDOWN = UNKNOWN_OPCODE, + SMSG_RESTRICTED_ACCOUNT_WARNING = UNKNOWN_OPCODE, + SMSG_RETURNING_PLAYER_PROMPT = UNKNOWN_OPCODE, + SMSG_RETURN_APPLICANT_LIST = UNKNOWN_OPCODE, + SMSG_RETURN_RECRUITING_CLUBS = UNKNOWN_OPCODE, + SMSG_RUNEFORGE_LEGENDARY_CRAFTING_OPEN_NPC = UNKNOWN_OPCODE, + SMSG_SEASON_INFO = UNKNOWN_OPCODE, + SMSG_SETUP_COMBAT_LOG_FILE_FLUSH = UNKNOWN_OPCODE, + SMSG_SET_QUEST_REPLAY_COOLDOWN_OVERRIDE = UNKNOWN_OPCODE, + SMSG_SET_SHIPMENT_READY_RESPONSE = UNKNOWN_OPCODE, + SMSG_SHADOWLANDS_CAPACITANCE_UPDATE = UNKNOWN_OPCODE, + SMSG_SHIPMENT_FACTION_UPDATE_RESULT = UNKNOWN_OPCODE, + SMSG_SPELL_EMPOWER_SET_STAGE = UNKNOWN_OPCODE, + SMSG_SPELL_EMPOWER_START = UNKNOWN_OPCODE, + SMSG_SPELL_EMPOWER_UPDATE = UNKNOWN_OPCODE, + SMSG_SPLASH_SCREEN_SHOW_LATEST = UNKNOWN_OPCODE, + SMSG_STARTER_BUILD_ACTIVATE_FAILED = UNKNOWN_OPCODE, + SMSG_STOP_TIMER = UNKNOWN_OPCODE, + SMSG_TOTEM_DURATION_CHANGED = UNKNOWN_OPCODE, + SMSG_TOTEM_REMOVED = UNKNOWN_OPCODE, + SMSG_UI_MAP_QUEST_LINES_RESPONSE = UNKNOWN_OPCODE, + SMSG_UPDATE_CAPTURE_POINT = UNKNOWN_OPCODE, + SMSG_UPDATE_CRAFTING_NPC_RECIPES = UNKNOWN_OPCODE, + SMSG_UPDATE_DAILY_MISSION_COUNTER = UNKNOWN_OPCODE, + SMSG_UPDATE_RECENT_PLAYER_GUIDS = UNKNOWN_OPCODE, + SMSG_WEEKLY_REWARDS_PROGRESS_RESULT = UNKNOWN_OPCODE, + SMSG_WEEKLY_REWARDS_RESULT = UNKNOWN_OPCODE, + SMSG_WEEKLY_REWARD_CLAIM_RESULT = UNKNOWN_OPCODE, + SMSG_XP_AWARDED_FROM_CURRENCY = UNKNOWN_OPCODE }; -inline bool IsInstanceOnlyOpcode(uint32 opcode) +constexpr bool IsInstanceOnlyOpcode(uint32 opcode) { switch (opcode) { @@ -2196,67 +2200,53 @@ enum PacketProcessing class WorldPacket; class WorldSession; -class OpcodeHandler +struct ClientOpcodeHandler final { -public: - OpcodeHandler(char const* name, SessionStatus status) : Name(name), Status(status) { } - virtual ~OpcodeHandler() { } + using HandlerFunction = void (*)(WorldSession* session, WorldPacket& packet); char const* Name; SessionStatus Status; -}; - -class ClientOpcodeHandler : public OpcodeHandler -{ -public: - ClientOpcodeHandler(char const* name, SessionStatus status, PacketProcessing processing) - : OpcodeHandler(name, status), ProcessingPlace(processing) { } - - virtual void Call(WorldSession* session, WorldPacket& packet) const = 0; - + HandlerFunction Call; PacketProcessing ProcessingPlace; }; -class ServerOpcodeHandler : public OpcodeHandler +struct ServerOpcodeHandler final { -public: - ServerOpcodeHandler(char const* name, SessionStatus status, ConnectionType conIdx) - : OpcodeHandler(name, status), ConnectionIndex(conIdx) { } - + char const* Name; + SessionStatus Status; ConnectionType ConnectionIndex; }; class OpcodeTable { - public: - OpcodeTable(); - - OpcodeTable(OpcodeTable const&) = delete; - OpcodeTable& operator=(OpcodeTable const&) = delete; +public: + OpcodeTable(); + ~OpcodeTable(); - ~OpcodeTable(); + void Initialize(); - void Initialize(); + ClientOpcodeHandler const* operator[](OpcodeClient index) const + { + return _internalTableClient[index - MIN_CMSG_OPCODE_NUMBER].get(); + } - ClientOpcodeHandler const* operator[](OpcodeClient index) const - { - return _internalTableClient[index]; - } + ServerOpcodeHandler const* operator[](OpcodeServer index) const + { + return _internalTableServer[index - MIN_SMSG_OPCODE_NUMBER].get(); + } - ServerOpcodeHandler const* operator[](OpcodeServer index) const - { - return _internalTableServer[index]; - } +private: + bool ValidateClientOpcode(OpcodeClient opcode, char const* name) const; + void ValidateAndSetClientOpcode(OpcodeClient opcode, char const* name, SessionStatus status, ClientOpcodeHandler::HandlerFunction call, PacketProcessing processing); - private: - bool ValidateClientOpcode(OpcodeClient opcode, char const* name) const; - template<typename Handler, Handler HandlerFunction> - void ValidateAndSetClientOpcode(OpcodeClient opcode, char const* name, SessionStatus status, PacketProcessing processing); + bool ValidateServerOpcode(OpcodeServer opcode, char const* name, ConnectionType conIdx) const; + void ValidateAndSetServerOpcode(OpcodeServer opcode, char const* name, SessionStatus status, ConnectionType conIdx); - void ValidateAndSetServerOpcode(OpcodeServer opcode, char const* name, SessionStatus status, ConnectionType conIdx); + void InitializeClientOpcodes(); + void InitializeServerOpcodes(); - ClientOpcodeHandler* _internalTableClient[NUM_OPCODE_HANDLERS]; - ServerOpcodeHandler* _internalTableServer[NUM_OPCODE_HANDLERS]; + std::array<std::unique_ptr<ClientOpcodeHandler>, NUM_CMSG_OPCODES> _internalTableClient; + std::array<std::unique_ptr<ServerOpcodeHandler>, NUM_SMSG_OPCODES> _internalTableServer; }; extern OpcodeTable opcodeTable; diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 42d28130601..d8c4d2839c9 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -210,19 +210,14 @@ std::string WorldSession::GetPlayerInfo() const /// Send a packet to the client void WorldSession::SendPacket(WorldPacket const* packet, bool forced /*= false*/) { - if (packet->GetOpcode() == NULL_OPCODE) + if (packet->GetOpcode() < MIN_SMSG_OPCODE_NUMBER || packet->GetOpcode() > MAX_SMSG_OPCODE_NUMBER) { - TC_LOG_ERROR("network.opcode", "Prevented sending of NULL_OPCODE to {}", GetPlayerInfo()); - return; - } - else if (packet->GetOpcode() == UNKNOWN_OPCODE) - { - TC_LOG_ERROR("network.opcode", "Prevented sending of UNKNOWN_OPCODE to {}", GetPlayerInfo()); + char const* specialName = packet->GetOpcode() == UNKNOWN_OPCODE ? "UNKNOWN_OPCODE" : "INVALID_OPCODE"; + TC_LOG_ERROR("network.opcode", "Prevented sending of {} (0x{:04X}) to {}", specialName, packet->GetOpcode(), GetPlayerInfo()); return; } ServerOpcodeHandler const* handler = opcodeTable[static_cast<OpcodeServer>(packet->GetOpcode())]; - if (!handler) { TC_LOG_ERROR("network.opcode", "Prevented sending of opcode {} with non existing handler to {}", packet->GetOpcode(), GetPlayerInfo()); diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index 7a3a1841853..6aa746ebef7 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -362,7 +362,7 @@ WorldSocket::ReadDataHandlerResult WorldSocket::ReadDataHandler() WorldPacket packet(std::move(_packetBuffer), GetConnectionType()); OpcodeClient opcode = packet.read<OpcodeClient>(); - if (uint32(opcode) >= uint32(NUM_OPCODE_HANDLERS)) + if (opcode < MIN_CMSG_OPCODE_NUMBER || opcode > MAX_CMSG_OPCODE_NUMBER) { TC_LOG_ERROR("network", "WorldSocket::ReadHeaderHandler(): client {} sent wrong opcode (opcode: {})", GetRemoteIpAddress().to_string(), uint32(opcode)); @@ -485,7 +485,7 @@ WorldSocket::ReadDataHandlerResult WorldSocket::ReadDataHandler() return ReadDataHandlerResult::Error; } - OpcodeHandler const* handler = opcodeTable[opcode]; + ClientOpcodeHandler const* handler = opcodeTable[opcode]; if (!handler) { TC_LOG_ERROR("network.opcode", "No defined handler for opcode {} sent by {}", GetOpcodeNameForLogging(static_cast<OpcodeClient>(packet.GetOpcode())), _worldSession->GetPlayerInfo()); |