diff --git a/include/game/opcode_table.hpp b/include/game/opcode_table.hpp index f2ed140b..274c15c5 100644 --- a/include/game/opcode_table.hpp +++ b/include/game/opcode_table.hpp @@ -465,9 +465,6 @@ public: */ bool loadFromJson(const std::string& path); - /** Load built-in WotLK defaults (hardcoded fallback). */ - void loadWotlkDefaults(); - /** LogicalOpcode → wire value for sending packets. Returns 0xFFFF if unknown. */ uint16_t toWire(LogicalOpcode op) const; diff --git a/include/game/update_field_table.hpp b/include/game/update_field_table.hpp index e735d9d3..b841925e 100644 --- a/include/game/update_field_table.hpp +++ b/include/game/update_field_table.hpp @@ -72,9 +72,6 @@ public: /** Load from JSON file. Returns true if successful. */ bool loadFromJson(const std::string& path); - /** Load built-in WotLK 3.3.5a defaults. */ - void loadWotlkDefaults(); - /** Get the wire index for a logical field. Returns 0xFFFF if unknown. */ uint16_t index(UF field) const; diff --git a/include/pipeline/dbc_layout.hpp b/include/pipeline/dbc_layout.hpp index bea88c91..154aef08 100644 --- a/include/pipeline/dbc_layout.hpp +++ b/include/pipeline/dbc_layout.hpp @@ -33,9 +33,6 @@ public: /** Load from JSON file. Returns true if successful. */ bool loadFromJson(const std::string& path); - /** Load built-in WotLK 3.3.5a defaults. */ - void loadWotlkDefaults(); - /** Get the field map for a DBC file. Returns nullptr if unknown. */ const DBCFieldMap* getLayout(const std::string& dbcName) const; diff --git a/src/core/application.cpp b/src/core/application.cpp index ec5d9c61..9668e6f3 100644 --- a/src/core/application.cpp +++ b/src/core/application.cpp @@ -146,16 +146,14 @@ bool Application::initialize() { if (profile) { std::string opcodesPath = profile->dataPath + "/opcodes.json"; if (!gameHandler->getOpcodeTable().loadFromJson(opcodesPath)) { - gameHandler->getOpcodeTable().loadWotlkDefaults(); - LOG_INFO("Using built-in WotLK opcode defaults"); + LOG_ERROR("Failed to load opcodes from ", opcodesPath); } game::setActiveOpcodeTable(&gameHandler->getOpcodeTable()); // Load expansion-specific update field table std::string updateFieldsPath = profile->dataPath + "/update_fields.json"; if (!gameHandler->getUpdateFieldTable().loadFromJson(updateFieldsPath)) { - gameHandler->getUpdateFieldTable().loadWotlkDefaults(); - LOG_INFO("Using built-in WotLK update field defaults"); + LOG_ERROR("Failed to load update fields from ", updateFieldsPath); } game::setActiveUpdateFieldTable(&gameHandler->getUpdateFieldTable()); @@ -166,8 +164,7 @@ bool Application::initialize() { if (dbcLayout_) { std::string dbcLayoutsPath = profile->dataPath + "/dbc_layouts.json"; if (!dbcLayout_->loadFromJson(dbcLayoutsPath)) { - dbcLayout_->loadWotlkDefaults(); - LOG_INFO("Using built-in WotLK DBC layout defaults"); + LOG_ERROR("Failed to load DBC layouts from ", dbcLayoutsPath); } pipeline::setActiveDBCLayout(dbcLayout_.get()); } @@ -457,13 +454,13 @@ void Application::reloadExpansionData() { std::string opcodesPath = profile->dataPath + "/opcodes.json"; if (!gameHandler->getOpcodeTable().loadFromJson(opcodesPath)) { - gameHandler->getOpcodeTable().loadWotlkDefaults(); + LOG_ERROR("Failed to load opcodes from ", opcodesPath); } game::setActiveOpcodeTable(&gameHandler->getOpcodeTable()); std::string updateFieldsPath = profile->dataPath + "/update_fields.json"; if (!gameHandler->getUpdateFieldTable().loadFromJson(updateFieldsPath)) { - gameHandler->getUpdateFieldTable().loadWotlkDefaults(); + LOG_ERROR("Failed to load update fields from ", updateFieldsPath); } game::setActiveUpdateFieldTable(&gameHandler->getUpdateFieldTable()); @@ -472,7 +469,7 @@ void Application::reloadExpansionData() { if (dbcLayout_) { std::string dbcLayoutsPath = profile->dataPath + "/dbc_layouts.json"; if (!dbcLayout_->loadFromJson(dbcLayoutsPath)) { - dbcLayout_->loadWotlkDefaults(); + LOG_ERROR("Failed to load DBC layouts from ", dbcLayoutsPath); } pipeline::setActiveDBCLayout(dbcLayout_.get()); } diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index 105e5b48..8f4a6df3 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -242,12 +242,7 @@ QuestQueryTextCandidate pickBestQuestQueryTexts(const std::vector& data GameHandler::GameHandler() { LOG_DEBUG("GameHandler created"); - // Initialize opcode table with WotLK defaults (may be overridden from JSON later) - opcodeTable_.loadWotlkDefaults(); setActiveOpcodeTable(&opcodeTable_); - - // Initialize update field table with WotLK defaults (may be overridden from JSON later) - updateFieldTable_.loadWotlkDefaults(); setActiveUpdateFieldTable(&updateFieldTable_); // Initialize packet parsers (WotLK default, may be replaced for other expansions) diff --git a/src/game/opcode_table.cpp b/src/game/opcode_table.cpp index 77f9fb30..d62a4256 100644 --- a/src/game/opcode_table.cpp +++ b/src/game/opcode_table.cpp @@ -385,354 +385,6 @@ const char* OpcodeTable::logicalToName(LogicalOpcode op) { return "UNKNOWN"; } -void OpcodeTable::loadWotlkDefaults() { - // WotLK 3.3.5a wire values — matches the original hardcoded Opcode enum - struct { LogicalOpcode op; uint16_t wire; } defaults[] = { - {LogicalOpcode::CMSG_PING, 0x1DC}, - {LogicalOpcode::CMSG_AUTH_SESSION, 0x1ED}, - {LogicalOpcode::CMSG_CHAR_CREATE, 0x036}, - {LogicalOpcode::CMSG_CHAR_ENUM, 0x037}, - {LogicalOpcode::CMSG_CHAR_DELETE, 0x038}, - {LogicalOpcode::CMSG_PLAYER_LOGIN, 0x03D}, - {LogicalOpcode::CMSG_MOVE_START_FORWARD, 0x0B5}, - {LogicalOpcode::CMSG_MOVE_START_BACKWARD, 0x0B6}, - {LogicalOpcode::CMSG_MOVE_STOP, 0x0B7}, - {LogicalOpcode::CMSG_MOVE_START_STRAFE_LEFT, 0x0B8}, - {LogicalOpcode::CMSG_MOVE_START_STRAFE_RIGHT, 0x0B9}, - {LogicalOpcode::CMSG_MOVE_STOP_STRAFE, 0x0BA}, - {LogicalOpcode::CMSG_MOVE_JUMP, 0x0BB}, - {LogicalOpcode::CMSG_MOVE_START_TURN_LEFT, 0x0BC}, - {LogicalOpcode::CMSG_MOVE_START_TURN_RIGHT, 0x0BD}, - {LogicalOpcode::CMSG_MOVE_STOP_TURN, 0x0BE}, - {LogicalOpcode::CMSG_MOVE_SET_FACING, 0x0DA}, - {LogicalOpcode::CMSG_MOVE_FALL_LAND, 0x0C9}, - {LogicalOpcode::CMSG_MOVE_START_SWIM, 0x0CA}, - {LogicalOpcode::CMSG_MOVE_STOP_SWIM, 0x0CB}, - {LogicalOpcode::CMSG_MOVE_HEARTBEAT, 0x0EE}, - {LogicalOpcode::SMSG_AUTH_CHALLENGE, 0x1EC}, - {LogicalOpcode::SMSG_AUTH_RESPONSE, 0x1EE}, - {LogicalOpcode::SMSG_CHAR_CREATE, 0x03A}, - {LogicalOpcode::SMSG_CHAR_ENUM, 0x03B}, - {LogicalOpcode::SMSG_CHAR_DELETE, 0x03C}, - {LogicalOpcode::SMSG_CHARACTER_LOGIN_FAILED, 0x041}, - {LogicalOpcode::SMSG_PONG, 0x1DD}, - {LogicalOpcode::SMSG_LOGIN_VERIFY_WORLD, 0x236}, - {LogicalOpcode::SMSG_INIT_WORLD_STATES, 0x2C2}, - {LogicalOpcode::SMSG_LOGIN_SETTIMESPEED, 0x042}, - {LogicalOpcode::SMSG_TUTORIAL_FLAGS, 0x0FD}, - {LogicalOpcode::SMSG_INITIALIZE_FACTIONS, 0x122}, - {LogicalOpcode::SMSG_WARDEN_DATA, 0x2E6}, - {LogicalOpcode::CMSG_WARDEN_DATA, 0x2E7}, - {LogicalOpcode::SMSG_ACCOUNT_DATA_TIMES, 0x209}, - {LogicalOpcode::SMSG_CLIENTCACHE_VERSION, 0x4AB}, - {LogicalOpcode::SMSG_FEATURE_SYSTEM_STATUS, 0x3C9}, - {LogicalOpcode::SMSG_MOTD, 0x33D}, - {LogicalOpcode::SMSG_UPDATE_OBJECT, 0x0A9}, - {LogicalOpcode::SMSG_COMPRESSED_UPDATE_OBJECT, 0x1F6}, - {LogicalOpcode::SMSG_MONSTER_MOVE_TRANSPORT, 0x2AE}, - {LogicalOpcode::SMSG_SPLINE_MOVE_SET_WALK_MODE, 0x30D}, - {LogicalOpcode::SMSG_SPLINE_MOVE_SET_RUN_MODE, 0x30E}, - {LogicalOpcode::SMSG_SPLINE_MOVE_SET_RUN_SPEED, 0x2FE}, - {LogicalOpcode::SMSG_SPLINE_MOVE_SET_RUN_BACK_SPEED, 0x2FF}, - {LogicalOpcode::SMSG_SPLINE_MOVE_SET_SWIM_SPEED, 0x300}, - {LogicalOpcode::SMSG_DESTROY_OBJECT, 0x0AA}, - {LogicalOpcode::CMSG_MESSAGECHAT, 0x095}, - {LogicalOpcode::SMSG_MESSAGECHAT, 0x096}, - {LogicalOpcode::CMSG_WHO, 0x062}, - {LogicalOpcode::SMSG_WHO, 0x063}, - {LogicalOpcode::CMSG_REQUEST_PLAYED_TIME, 0x1CC}, - {LogicalOpcode::SMSG_PLAYED_TIME, 0x1CD}, - {LogicalOpcode::CMSG_QUERY_TIME, 0x1CE}, - {LogicalOpcode::SMSG_QUERY_TIME_RESPONSE, 0x1CF}, - {LogicalOpcode::SMSG_FRIEND_STATUS, 0x068}, - {LogicalOpcode::SMSG_CONTACT_LIST, 0x067}, - {LogicalOpcode::CMSG_ADD_FRIEND, 0x069}, - {LogicalOpcode::CMSG_DEL_FRIEND, 0x06A}, - {LogicalOpcode::CMSG_SET_CONTACT_NOTES, 0x06B}, - {LogicalOpcode::CMSG_ADD_IGNORE, 0x06C}, - {LogicalOpcode::CMSG_DEL_IGNORE, 0x06D}, - {LogicalOpcode::CMSG_PLAYER_LOGOUT, 0x04A}, - {LogicalOpcode::CMSG_LOGOUT_REQUEST, 0x04B}, - {LogicalOpcode::CMSG_LOGOUT_CANCEL, 0x04E}, - {LogicalOpcode::SMSG_LOGOUT_RESPONSE, 0x04C}, - {LogicalOpcode::SMSG_LOGOUT_COMPLETE, 0x04D}, - {LogicalOpcode::CMSG_STAND_STATE_CHANGE, 0x101}, - {LogicalOpcode::CMSG_SHOWING_HELM, 0x2B9}, - {LogicalOpcode::CMSG_SHOWING_CLOAK, 0x2BA}, - {LogicalOpcode::CMSG_TOGGLE_PVP, 0x253}, - {LogicalOpcode::CMSG_GUILD_INVITE, 0x082}, - {LogicalOpcode::CMSG_GUILD_ACCEPT, 0x084}, - {LogicalOpcode::CMSG_GUILD_DECLINE_INVITATION, 0x085}, - {LogicalOpcode::CMSG_GUILD_INFO, 0x087}, - {LogicalOpcode::CMSG_GUILD_GET_ROSTER, 0x089}, - {LogicalOpcode::CMSG_GUILD_PROMOTE_MEMBER, 0x08B}, - {LogicalOpcode::CMSG_GUILD_DEMOTE_MEMBER, 0x08C}, - {LogicalOpcode::CMSG_GUILD_LEAVE, 0x08D}, - {LogicalOpcode::CMSG_GUILD_MOTD, 0x091}, - {LogicalOpcode::SMSG_GUILD_INFO, 0x088}, - {LogicalOpcode::SMSG_GUILD_ROSTER, 0x08A}, - {LogicalOpcode::CMSG_GUILD_QUERY, 0x054}, - {LogicalOpcode::SMSG_GUILD_QUERY_RESPONSE, 0x055}, - {LogicalOpcode::SMSG_GUILD_INVITE, 0x083}, - {LogicalOpcode::CMSG_GUILD_REMOVE, 0x08E}, - {LogicalOpcode::CMSG_GUILD_DISBAND, 0x08F}, - {LogicalOpcode::CMSG_GUILD_LEADER, 0x090}, - {LogicalOpcode::CMSG_GUILD_SET_PUBLIC_NOTE, 0x234}, - {LogicalOpcode::CMSG_GUILD_SET_OFFICER_NOTE, 0x235}, - {LogicalOpcode::SMSG_GUILD_EVENT, 0x092}, - {LogicalOpcode::SMSG_GUILD_COMMAND_RESULT, 0x093}, - {LogicalOpcode::MSG_RAID_READY_CHECK, 0x322}, - {LogicalOpcode::MSG_RAID_READY_CHECK_CONFIRM, 0x3AE}, - {LogicalOpcode::CMSG_DUEL_PROPOSED, 0x166}, - {LogicalOpcode::CMSG_DUEL_ACCEPTED, 0x16C}, - {LogicalOpcode::CMSG_DUEL_CANCELLED, 0x16D}, - {LogicalOpcode::SMSG_DUEL_REQUESTED, 0x167}, - {LogicalOpcode::CMSG_INITIATE_TRADE, 0x116}, - {LogicalOpcode::MSG_RANDOM_ROLL, 0x1FB}, - {LogicalOpcode::CMSG_SET_SELECTION, 0x13D}, - {LogicalOpcode::CMSG_NAME_QUERY, 0x050}, - {LogicalOpcode::SMSG_NAME_QUERY_RESPONSE, 0x051}, - {LogicalOpcode::CMSG_CREATURE_QUERY, 0x060}, - {LogicalOpcode::SMSG_CREATURE_QUERY_RESPONSE, 0x061}, - {LogicalOpcode::CMSG_GAMEOBJECT_QUERY, 0x05E}, - {LogicalOpcode::SMSG_GAMEOBJECT_QUERY_RESPONSE, 0x05F}, - {LogicalOpcode::CMSG_SET_ACTIVE_MOVER, 0x26A}, - {LogicalOpcode::CMSG_BINDER_ACTIVATE, 0x1B5}, - {LogicalOpcode::SMSG_LOG_XPGAIN, 0x1D0}, - {LogicalOpcode::SMSG_MONSTER_MOVE, 0x0DD}, - {LogicalOpcode::CMSG_ATTACKSWING, 0x141}, - {LogicalOpcode::CMSG_ATTACKSTOP, 0x142}, - {LogicalOpcode::SMSG_ATTACKSTART, 0x143}, - {LogicalOpcode::SMSG_ATTACKSTOP, 0x144}, - {LogicalOpcode::SMSG_ATTACKERSTATEUPDATE, 0x14A}, - {LogicalOpcode::SMSG_AI_REACTION, 0x13C}, - {LogicalOpcode::SMSG_SPELLNONMELEEDAMAGELOG, 0x250}, - {LogicalOpcode::SMSG_PLAY_SPELL_VISUAL, 0x1F3}, - {LogicalOpcode::SMSG_SPELLHEALLOG, 0x150}, - {LogicalOpcode::SMSG_SPELLENERGIZELOG, 0x151}, - {LogicalOpcode::SMSG_PERIODICAURALOG, 0x24E}, - {LogicalOpcode::SMSG_ENVIRONMENTALDAMAGELOG, 0x1FC}, - {LogicalOpcode::CMSG_CAST_SPELL, 0x12E}, - {LogicalOpcode::CMSG_CANCEL_CAST, 0x12F}, - {LogicalOpcode::CMSG_CANCEL_AURA, 0x136}, - {LogicalOpcode::SMSG_CAST_FAILED, 0x130}, - {LogicalOpcode::SMSG_SPELL_START, 0x131}, - {LogicalOpcode::SMSG_SPELL_GO, 0x132}, - {LogicalOpcode::SMSG_SPELL_FAILURE, 0x133}, - {LogicalOpcode::SMSG_SPELL_COOLDOWN, 0x134}, - {LogicalOpcode::SMSG_COOLDOWN_EVENT, 0x135}, - {LogicalOpcode::SMSG_UPDATE_AURA_DURATION, 0x137}, - {LogicalOpcode::SMSG_INITIAL_SPELLS, 0x12A}, - {LogicalOpcode::SMSG_LEARNED_SPELL, 0x12B}, - {LogicalOpcode::SMSG_SUPERCEDED_SPELL, 0x12C}, - {LogicalOpcode::SMSG_REMOVED_SPELL, 0x203}, - {LogicalOpcode::SMSG_SEND_UNLEARN_SPELLS, 0x41E}, - {LogicalOpcode::SMSG_SPELL_DELAYED, 0x1E2}, - {LogicalOpcode::SMSG_CANCEL_AUTO_REPEAT, 0x06B}, - {LogicalOpcode::SMSG_AURA_UPDATE, 0x496}, - {LogicalOpcode::SMSG_AURA_UPDATE_ALL, 0x495}, - {LogicalOpcode::SMSG_SET_FLAT_SPELL_MODIFIER, 0x266}, - {LogicalOpcode::SMSG_SET_PCT_SPELL_MODIFIER, 0x267}, - {LogicalOpcode::SMSG_TALENTS_INFO, 0x4C0}, - {LogicalOpcode::CMSG_LEARN_TALENT, 0x251}, - {LogicalOpcode::MSG_TALENT_WIPE_CONFIRM, 0x2AA}, - {LogicalOpcode::CMSG_GROUP_INVITE, 0x06E}, - {LogicalOpcode::SMSG_GROUP_INVITE, 0x06F}, - {LogicalOpcode::CMSG_GROUP_ACCEPT, 0x072}, - {LogicalOpcode::CMSG_GROUP_DECLINE, 0x073}, - {LogicalOpcode::SMSG_GROUP_DECLINE, 0x074}, - {LogicalOpcode::CMSG_GROUP_UNINVITE_GUID, 0x076}, - {LogicalOpcode::SMSG_GROUP_UNINVITE, 0x077}, - {LogicalOpcode::CMSG_GROUP_SET_LEADER, 0x078}, - {LogicalOpcode::SMSG_GROUP_SET_LEADER, 0x079}, - {LogicalOpcode::CMSG_GROUP_DISBAND, 0x07B}, - {LogicalOpcode::SMSG_GROUP_LIST, 0x07D}, - {LogicalOpcode::SMSG_PARTY_COMMAND_RESULT, 0x07F}, - {LogicalOpcode::MSG_RAID_TARGET_UPDATE, 0x321}, - {LogicalOpcode::CMSG_REQUEST_RAID_INFO, 0x2CD}, - {LogicalOpcode::SMSG_RAID_INSTANCE_INFO, 0x2CC}, - {LogicalOpcode::CMSG_AUTOSTORE_LOOT_ITEM, 0x108}, - {LogicalOpcode::CMSG_LOOT, 0x15D}, - {LogicalOpcode::CMSG_LOOT_MONEY, 0x15E}, - {LogicalOpcode::CMSG_LOOT_RELEASE, 0x15F}, - {LogicalOpcode::SMSG_LOOT_RESPONSE, 0x160}, - {LogicalOpcode::SMSG_LOOT_RELEASE_RESPONSE, 0x161}, - {LogicalOpcode::SMSG_LOOT_REMOVED, 0x162}, - {LogicalOpcode::SMSG_LOOT_MONEY_NOTIFY, 0x163}, - {LogicalOpcode::SMSG_LOOT_CLEAR_MONEY, 0x165}, - {LogicalOpcode::CMSG_ACTIVATETAXI, 0x1AD}, - {LogicalOpcode::CMSG_GOSSIP_HELLO, 0x17B}, - {LogicalOpcode::CMSG_GOSSIP_SELECT_OPTION, 0x17C}, - {LogicalOpcode::SMSG_GOSSIP_MESSAGE, 0x17D}, - {LogicalOpcode::SMSG_GOSSIP_COMPLETE, 0x17E}, - {LogicalOpcode::SMSG_NPC_TEXT_UPDATE, 0x180}, - {LogicalOpcode::CMSG_GAMEOBJECT_USE, 0x0B1}, - {LogicalOpcode::CMSG_QUESTGIVER_STATUS_QUERY, 0x182}, - {LogicalOpcode::SMSG_QUESTGIVER_STATUS, 0x183}, - {LogicalOpcode::SMSG_QUESTGIVER_STATUS_MULTIPLE, 0x418}, - {LogicalOpcode::CMSG_QUESTGIVER_HELLO, 0x184}, - {LogicalOpcode::SMSG_QUESTGIVER_QUEST_LIST, 0x185}, - {LogicalOpcode::CMSG_QUESTGIVER_QUERY_QUEST, 0x186}, - {LogicalOpcode::SMSG_QUESTGIVER_QUEST_DETAILS, 0x188}, - {LogicalOpcode::CMSG_QUESTGIVER_ACCEPT_QUEST, 0x189}, - {LogicalOpcode::CMSG_QUESTGIVER_COMPLETE_QUEST, 0x18A}, - {LogicalOpcode::SMSG_QUESTGIVER_REQUEST_ITEMS, 0x18B}, - {LogicalOpcode::CMSG_QUESTGIVER_REQUEST_REWARD, 0x18C}, - {LogicalOpcode::SMSG_QUESTGIVER_OFFER_REWARD, 0x18D}, - {LogicalOpcode::CMSG_QUESTGIVER_CHOOSE_REWARD, 0x18E}, - {LogicalOpcode::SMSG_QUESTGIVER_QUEST_INVALID, 0x18F}, - {LogicalOpcode::SMSG_QUESTGIVER_QUEST_COMPLETE, 0x191}, - {LogicalOpcode::CMSG_QUESTLOG_REMOVE_QUEST, 0x194}, - {LogicalOpcode::SMSG_QUESTUPDATE_ADD_KILL, 0x199}, - {LogicalOpcode::SMSG_QUESTUPDATE_ADD_ITEM, 0x197}, - {LogicalOpcode::SMSG_QUESTUPDATE_COMPLETE, 0x198}, - {LogicalOpcode::SMSG_QUEST_FORCE_REMOVE, 0x21E}, - {LogicalOpcode::CMSG_QUEST_QUERY, 0x05C}, - {LogicalOpcode::SMSG_QUEST_QUERY_RESPONSE, 0x05D}, - {LogicalOpcode::SMSG_QUESTLOG_FULL, 0x195}, - {LogicalOpcode::CMSG_LIST_INVENTORY, 0x19E}, - {LogicalOpcode::SMSG_LIST_INVENTORY, 0x19F}, - {LogicalOpcode::CMSG_SELL_ITEM, 0x1A0}, - {LogicalOpcode::SMSG_SELL_ITEM, 0x1A1}, - {LogicalOpcode::CMSG_BUY_ITEM, 0x1A2}, - {LogicalOpcode::CMSG_BUYBACK_ITEM, 0x290}, - {LogicalOpcode::SMSG_BUY_FAILED, 0x1A5}, - {LogicalOpcode::CMSG_TRAINER_LIST, 0x01B0}, - {LogicalOpcode::SMSG_TRAINER_LIST, 0x01B1}, - {LogicalOpcode::CMSG_TRAINER_BUY_SPELL, 0x01B2}, - {LogicalOpcode::SMSG_TRAINER_BUY_FAILED, 0x01B4}, - {LogicalOpcode::CMSG_ITEM_QUERY_SINGLE, 0x056}, - {LogicalOpcode::SMSG_ITEM_QUERY_SINGLE_RESPONSE, 0x058}, - {LogicalOpcode::CMSG_USE_ITEM, 0x00AB}, - {LogicalOpcode::CMSG_AUTOEQUIP_ITEM, 0x10A}, - {LogicalOpcode::CMSG_SWAP_ITEM, 0x10C}, - {LogicalOpcode::CMSG_SWAP_INV_ITEM, 0x10D}, - {LogicalOpcode::SMSG_INVENTORY_CHANGE_FAILURE, 0x112}, - {LogicalOpcode::CMSG_INSPECT, 0x114}, - {LogicalOpcode::SMSG_INSPECT_RESULTS, 0x115}, - {LogicalOpcode::CMSG_REPOP_REQUEST, 0x015A}, - {LogicalOpcode::SMSG_RESURRECT_REQUEST, 0x015B}, - {LogicalOpcode::CMSG_RESURRECT_RESPONSE, 0x015C}, - {LogicalOpcode::CMSG_SPIRIT_HEALER_ACTIVATE, 0x021C}, - {LogicalOpcode::SMSG_SPIRIT_HEALER_CONFIRM, 0x0222}, - {LogicalOpcode::SMSG_RESURRECT_CANCEL, 0x0390}, - {LogicalOpcode::MSG_MOVE_TELEPORT_ACK, 0x0C7}, - {LogicalOpcode::SMSG_TRANSFER_PENDING, 0x003F}, - {LogicalOpcode::SMSG_NEW_WORLD, 0x003E}, - {LogicalOpcode::MSG_MOVE_WORLDPORT_ACK, 0x00DC}, - {LogicalOpcode::SMSG_TRANSFER_ABORTED, 0x0040}, - {LogicalOpcode::SMSG_FORCE_RUN_SPEED_CHANGE, 0x00E2}, - {LogicalOpcode::SMSG_CLIENT_CONTROL_UPDATE, 0x0159}, - {LogicalOpcode::CMSG_FORCE_RUN_SPEED_CHANGE_ACK, 0x00E3}, - {LogicalOpcode::CMSG_CANCEL_MOUNT_AURA, 0x0375}, - {LogicalOpcode::SMSG_SHOWTAXINODES, 0x01A9}, - {LogicalOpcode::SMSG_ACTIVATETAXIREPLY, 0x01AE}, - {LogicalOpcode::SMSG_ACTIVATETAXIREPLY_ALT, 0x029D}, - {LogicalOpcode::SMSG_NEW_TAXI_PATH, 0x01AF}, - {LogicalOpcode::CMSG_ACTIVATETAXIEXPRESS, 0x0312}, - {LogicalOpcode::SMSG_BATTLEFIELD_PORT_DENIED, 0x014B}, - {LogicalOpcode::SMSG_REMOVED_FROM_PVP_QUEUE, 0x0170}, - {LogicalOpcode::SMSG_TRAINER_BUY_SUCCEEDED, 0x01B3}, - {LogicalOpcode::SMSG_BINDPOINTUPDATE, 0x0155}, - {LogicalOpcode::CMSG_BATTLEFIELD_LIST, 0x023C}, - {LogicalOpcode::SMSG_BATTLEFIELD_LIST, 0x023D}, - {LogicalOpcode::CMSG_BATTLEFIELD_JOIN, 0x023E}, - {LogicalOpcode::CMSG_BATTLEFIELD_STATUS, 0x02D3}, - {LogicalOpcode::SMSG_BATTLEFIELD_STATUS, 0x02D4}, - {LogicalOpcode::CMSG_BATTLEFIELD_PORT, 0x02D5}, - {LogicalOpcode::CMSG_BATTLEMASTER_HELLO, 0x02D7}, - {LogicalOpcode::MSG_PVP_LOG_DATA, 0x02E0}, - {LogicalOpcode::CMSG_LEAVE_BATTLEFIELD, 0x02E1}, - {LogicalOpcode::SMSG_GROUP_JOINED_BATTLEGROUND, 0x02E8}, - {LogicalOpcode::MSG_BATTLEGROUND_PLAYER_POSITIONS, 0x02E9}, - {LogicalOpcode::SMSG_BATTLEGROUND_PLAYER_JOINED, 0x02EC}, - {LogicalOpcode::SMSG_BATTLEGROUND_PLAYER_LEFT, 0x02ED}, - {LogicalOpcode::CMSG_BATTLEMASTER_JOIN, 0x02EE}, - {LogicalOpcode::SMSG_JOINED_BATTLEGROUND_QUEUE, 0x038A}, - {LogicalOpcode::CMSG_ARENA_TEAM_CREATE, 0x0348}, - {LogicalOpcode::SMSG_ARENA_TEAM_COMMAND_RESULT, 0x0349}, - {LogicalOpcode::CMSG_ARENA_TEAM_QUERY, 0x034B}, - {LogicalOpcode::SMSG_ARENA_TEAM_QUERY_RESPONSE, 0x034C}, - {LogicalOpcode::CMSG_ARENA_TEAM_ROSTER, 0x034D}, - {LogicalOpcode::SMSG_ARENA_TEAM_ROSTER, 0x034E}, - {LogicalOpcode::CMSG_ARENA_TEAM_INVITE, 0x034F}, - {LogicalOpcode::SMSG_ARENA_TEAM_INVITE, 0x0350}, - {LogicalOpcode::CMSG_ARENA_TEAM_ACCEPT, 0x0351}, - {LogicalOpcode::CMSG_ARENA_TEAM_DECLINE, 0x0352}, - {LogicalOpcode::CMSG_ARENA_TEAM_LEAVE, 0x0353}, - {LogicalOpcode::CMSG_ARENA_TEAM_REMOVE, 0x0354}, - {LogicalOpcode::CMSG_ARENA_TEAM_DISBAND, 0x0355}, - {LogicalOpcode::CMSG_ARENA_TEAM_LEADER, 0x0356}, - {LogicalOpcode::SMSG_ARENA_TEAM_EVENT, 0x0357}, - {LogicalOpcode::CMSG_BATTLEMASTER_JOIN_ARENA, 0x0358}, - {LogicalOpcode::SMSG_ARENA_TEAM_STATS, 0x035B}, - {LogicalOpcode::SMSG_ARENA_ERROR, 0x0376}, - {LogicalOpcode::MSG_INSPECT_ARENA_TEAMS, 0x0377}, - {LogicalOpcode::SMSG_WEATHER, 0x2F4}, - {LogicalOpcode::CMSG_EMOTE, 0x102}, - {LogicalOpcode::SMSG_EMOTE, 0x103}, - {LogicalOpcode::CMSG_TEXT_EMOTE, 0x104}, - {LogicalOpcode::SMSG_TEXT_EMOTE, 0x105}, - {LogicalOpcode::CMSG_JOIN_CHANNEL, 0x097}, - {LogicalOpcode::CMSG_LEAVE_CHANNEL, 0x098}, - {LogicalOpcode::SMSG_CHANNEL_NOTIFY, 0x099}, - {LogicalOpcode::CMSG_CHANNEL_LIST, 0x09A}, - {LogicalOpcode::SMSG_CHANNEL_LIST, 0x09B}, - {LogicalOpcode::SMSG_INSPECT_TALENT, 0x3F4}, - // Mail - {LogicalOpcode::SMSG_SHOW_MAILBOX, 0x297}, - {LogicalOpcode::CMSG_GET_MAIL_LIST, 0x23A}, - {LogicalOpcode::SMSG_MAIL_LIST_RESULT, 0x23B}, - {LogicalOpcode::CMSG_SEND_MAIL, 0x238}, - {LogicalOpcode::SMSG_SEND_MAIL_RESULT, 0x239}, - {LogicalOpcode::CMSG_MAIL_TAKE_MONEY, 0x245}, - {LogicalOpcode::CMSG_MAIL_TAKE_ITEM, 0x246}, - {LogicalOpcode::CMSG_MAIL_DELETE, 0x249}, - {LogicalOpcode::CMSG_MAIL_MARK_AS_READ, 0x247}, - {LogicalOpcode::SMSG_RECEIVED_MAIL, 0x285}, - {LogicalOpcode::MSG_QUERY_NEXT_MAIL_TIME, 0x284}, - // Bank - {LogicalOpcode::CMSG_BANKER_ACTIVATE, 0x1B7}, - {LogicalOpcode::SMSG_SHOW_BANK, 0x1B8}, - {LogicalOpcode::CMSG_BUY_BANK_SLOT, 0x1B9}, - {LogicalOpcode::SMSG_BUY_BANK_SLOT_RESULT, 0x1BA}, - {LogicalOpcode::CMSG_AUTOBANK_ITEM, 0x283}, - {LogicalOpcode::CMSG_AUTOSTORE_BANK_ITEM, 0x282}, - // Guild Bank - {LogicalOpcode::CMSG_GUILD_BANKER_ACTIVATE, 0x3E6}, - {LogicalOpcode::CMSG_GUILD_BANK_QUERY_TAB, 0x3E7}, - {LogicalOpcode::SMSG_GUILD_BANK_LIST, 0x3E8}, - {LogicalOpcode::CMSG_GUILD_BANK_SWAP_ITEMS, 0x3E9}, - {LogicalOpcode::CMSG_GUILD_BANK_BUY_TAB, 0x3EA}, - {LogicalOpcode::CMSG_GUILD_BANK_UPDATE_TAB, 0x3EB}, - {LogicalOpcode::CMSG_GUILD_BANK_DEPOSIT_MONEY, 0x3EC}, - {LogicalOpcode::CMSG_GUILD_BANK_WITHDRAW_MONEY, 0x3ED}, - // Auction House - {LogicalOpcode::MSG_AUCTION_HELLO, 0x255}, - {LogicalOpcode::CMSG_AUCTION_SELL_ITEM, 0x256}, - {LogicalOpcode::CMSG_AUCTION_REMOVE_ITEM, 0x257}, - {LogicalOpcode::CMSG_AUCTION_LIST_ITEMS, 0x258}, - {LogicalOpcode::CMSG_AUCTION_LIST_OWNER_ITEMS, 0x259}, - {LogicalOpcode::CMSG_AUCTION_PLACE_BID, 0x25A}, - {LogicalOpcode::SMSG_AUCTION_COMMAND_RESULT, 0x25B}, - {LogicalOpcode::SMSG_AUCTION_LIST_RESULT, 0x25C}, - {LogicalOpcode::SMSG_AUCTION_OWNER_LIST_RESULT, 0x25D}, - {LogicalOpcode::SMSG_AUCTION_BIDDER_LIST_RESULT, 0x265}, - {LogicalOpcode::SMSG_AUCTION_OWNER_NOTIFICATION, 0x25E}, - {LogicalOpcode::SMSG_AUCTION_BIDDER_NOTIFICATION, 0x260}, - {LogicalOpcode::CMSG_AUCTION_LIST_BIDDER_ITEMS, 0x264}, - }; - - logicalToWire_.clear(); - wireToLogical_.clear(); - for (auto& d : defaults) { - uint16_t logIdx = static_cast(d.op); - logicalToWire_[logIdx] = d.wire; - wireToLogical_[d.wire] = logIdx; - } - LOG_INFO("OpcodeTable: loaded ", logicalToWire_.size(), " WotLK default opcodes"); -} - bool OpcodeTable::loadFromJson(const std::string& path) { std::ifstream f(path); if (!f.is_open()) { @@ -742,11 +394,9 @@ bool OpcodeTable::loadFromJson(const std::string& path) { std::string json((std::istreambuf_iterator(f)), std::istreambuf_iterator()); - // Merge/patch on top of existing table (WotLK defaults must be loaded first). - // Opcodes NOT in the JSON keep their current mapping, so expansion-specific - // JSONs only need to list entries that differ from the WotLK baseline. - auto savedLogicalToWire = logicalToWire_; - auto savedWireToLogical = wireToLogical_; + // Start fresh — JSON is the single source of truth for opcode mappings. + logicalToWire_.clear(); + wireToLogical_.clear(); // Parse simple JSON: { "NAME": "0xHEX", ... } or { "NAME": 123, ... } size_t pos = 0; @@ -789,11 +439,6 @@ bool OpcodeTable::loadFromJson(const std::string& path) { auto logOp = nameToLogical(key); if (logOp) { uint16_t logIdx = static_cast(*logOp); - // Remove stale reverse-mapping for this logical opcode's old wire value - auto oldIt = logicalToWire_.find(logIdx); - if (oldIt != logicalToWire_.end()) { - wireToLogical_.erase(oldIt->second); - } logicalToWire_[logIdx] = wire; wireToLogical_[wire] = logIdx; ++loaded; @@ -803,9 +448,7 @@ bool OpcodeTable::loadFromJson(const std::string& path) { } if (loaded == 0) { - LOG_WARNING("OpcodeTable: no opcodes loaded from ", path, ", restoring previous tables"); - logicalToWire_ = std::move(savedLogicalToWire); - wireToLogical_ = std::move(savedWireToLogical); + LOG_WARNING("OpcodeTable: no opcodes loaded from ", path); return false; } diff --git a/src/game/update_field_table.cpp b/src/game/update_field_table.cpp index 1c072bbc..505b86e6 100644 --- a/src/game/update_field_table.cpp +++ b/src/game/update_field_table.cpp @@ -58,51 +58,6 @@ static const UFNameEntry kUFNames[] = { static constexpr size_t kUFNameCount = sizeof(kUFNames) / sizeof(kUFNames[0]); -void UpdateFieldTable::loadWotlkDefaults() { - fieldMap_.clear(); - struct { UF field; uint16_t idx; } defaults[] = { - {UF::OBJECT_FIELD_ENTRY, 3}, - {UF::UNIT_FIELD_TARGET_LO, 6}, - {UF::UNIT_FIELD_TARGET_HI, 7}, - {UF::UNIT_FIELD_BYTES_0, 23}, - {UF::UNIT_FIELD_HEALTH, 24}, - {UF::UNIT_FIELD_POWER1, 25}, - {UF::UNIT_FIELD_MAXHEALTH, 32}, - {UF::UNIT_FIELD_MAXPOWER1, 33}, - {UF::UNIT_FIELD_LEVEL, 54}, - {UF::UNIT_FIELD_FACTIONTEMPLATE, 55}, - {UF::UNIT_FIELD_FLAGS, 59}, - {UF::UNIT_FIELD_FLAGS_2, 60}, - {UF::UNIT_FIELD_DISPLAYID, 67}, - {UF::UNIT_FIELD_MOUNTDISPLAYID, 69}, - {UF::UNIT_NPC_FLAGS, 82}, - {UF::UNIT_DYNAMIC_FLAGS, 147}, - {UF::UNIT_FIELD_RESISTANCES, 99}, - {UF::UNIT_END, 148}, - {UF::PLAYER_FLAGS, 150}, - {UF::PLAYER_BYTES, 151}, - {UF::PLAYER_BYTES_2, 152}, - {UF::PLAYER_XP, 634}, - {UF::PLAYER_NEXT_LEVEL_XP, 635}, - {UF::PLAYER_FIELD_COINAGE, 1170}, - {UF::PLAYER_QUEST_LOG_START, 158}, - {UF::PLAYER_FIELD_INV_SLOT_HEAD, 324}, - {UF::PLAYER_FIELD_PACK_SLOT_1, 370}, - {UF::PLAYER_FIELD_BANK_SLOT_1, 402}, - {UF::PLAYER_FIELD_BANKBAG_SLOT_1, 458}, - {UF::PLAYER_SKILL_INFO_START, 636}, - {UF::PLAYER_EXPLORED_ZONES_START, 1041}, - {UF::GAMEOBJECT_DISPLAYID, 8}, - {UF::ITEM_FIELD_STACK_COUNT, 14}, - {UF::CONTAINER_FIELD_NUM_SLOTS, 64}, // ITEM_END + 0 for WotLK - {UF::CONTAINER_FIELD_SLOT_1, 66}, // ITEM_END + 2 for WotLK - }; - for (auto& d : defaults) { - fieldMap_[static_cast(d.field)] = d.idx; - } - LOG_INFO("UpdateFieldTable: loaded ", fieldMap_.size(), " WotLK default fields"); -} - bool UpdateFieldTable::loadFromJson(const std::string& path) { std::ifstream f(path); if (!f.is_open()) { @@ -112,7 +67,6 @@ bool UpdateFieldTable::loadFromJson(const std::string& path) { std::string json((std::istreambuf_iterator(f)), std::istreambuf_iterator()); - auto savedFieldMap = fieldMap_; fieldMap_.clear(); size_t loaded = 0; size_t pos = 0; @@ -158,8 +112,7 @@ bool UpdateFieldTable::loadFromJson(const std::string& path) { } if (loaded == 0) { - LOG_WARNING("UpdateFieldTable: no fields loaded from ", path, ", restoring previous table"); - fieldMap_ = std::move(savedFieldMap); + LOG_WARNING("UpdateFieldTable: no fields loaded from ", path); return false; } diff --git a/src/pipeline/dbc_layout.cpp b/src/pipeline/dbc_layout.cpp index 7dc1f1af..08730536 100644 --- a/src/pipeline/dbc_layout.cpp +++ b/src/pipeline/dbc_layout.cpp @@ -11,139 +11,6 @@ static const DBCLayout* g_activeDBCLayout = nullptr; void setActiveDBCLayout(const DBCLayout* layout) { g_activeDBCLayout = layout; } const DBCLayout* getActiveDBCLayout() { return g_activeDBCLayout; } -void DBCLayout::loadWotlkDefaults() { - layouts_.clear(); - - // Spell.dbc - layouts_["Spell"] = {{{ "ID", 0 }, { "Attributes", 4 }, { "IconID", 133 }, - { "Name", 136 }, { "Tooltip", 139 }, { "Rank", 153 }}}; - - // ItemDisplayInfo.dbc - layouts_["ItemDisplayInfo"] = {{{ "ID", 0 }, { "LeftModel", 1 }, { "LeftModelTexture", 3 }, - { "InventoryIcon", 5 }, { "GeosetGroup1", 7 }, { "GeosetGroup3", 9 }}}; - - // CharSections.dbc - // Binary layout: ID(0) Race(1) Sex(2) Section(3) Variation(4) Color(5) Tex1(6) Tex2(7) Tex3(8) Flags(9) - layouts_["CharSections"] = {{{ "RaceID", 1 }, { "SexID", 2 }, { "BaseSection", 3 }, - { "VariationIndex", 4 }, { "ColorIndex", 5 }, - { "Texture1", 6 }, { "Texture2", 7 }, { "Texture3", 8 }, - { "Flags", 9 }}}; - - // SpellIcon.dbc (Icon.dbc in code but actually SpellIcon) - layouts_["SpellIcon"] = {{{ "ID", 0 }, { "Path", 1 }}}; - - // FactionTemplate.dbc - layouts_["FactionTemplate"] = {{{ "ID", 0 }, { "Faction", 1 }, { "FactionGroup", 3 }, - { "FriendGroup", 4 }, { "EnemyGroup", 5 }, - { "Enemy0", 6 }, { "Enemy1", 7 }, { "Enemy2", 8 }, { "Enemy3", 9 }}}; - - // Faction.dbc - layouts_["Faction"] = {{{ "ID", 0 }, { "ReputationRaceMask0", 2 }, { "ReputationRaceMask1", 3 }, - { "ReputationRaceMask2", 4 }, { "ReputationRaceMask3", 5 }, - { "ReputationBase0", 10 }, { "ReputationBase1", 11 }, - { "ReputationBase2", 12 }, { "ReputationBase3", 13 }}}; - - // AreaTable.dbc - layouts_["AreaTable"] = {{{ "ID", 0 }, { "ExploreFlag", 3 }}}; - - // CreatureDisplayInfoExtra.dbc - layouts_["CreatureDisplayInfoExtra"] = {{{ "ID", 0 }, { "RaceID", 1 }, { "SexID", 2 }, - { "SkinID", 3 }, { "FaceID", 4 }, { "HairStyleID", 5 }, { "HairColorID", 6 }, - { "FacialHairID", 7 }, { "EquipDisplay0", 8 }, { "EquipDisplay1", 9 }, - { "EquipDisplay2", 10 }, { "EquipDisplay3", 11 }, { "EquipDisplay4", 12 }, - { "EquipDisplay5", 13 }, { "EquipDisplay6", 14 }, { "EquipDisplay7", 15 }, - { "EquipDisplay8", 16 }, { "EquipDisplay9", 17 }, { "EquipDisplay10", 18 }, - { "BakeName", 20 }}}; - - // CreatureDisplayInfo.dbc - layouts_["CreatureDisplayInfo"] = {{{ "ID", 0 }, { "ModelID", 1 }, { "ExtraDisplayId", 3 }, - { "Skin1", 6 }, { "Skin2", 7 }, { "Skin3", 8 }}}; - - // TaxiNodes.dbc - layouts_["TaxiNodes"] = {{{ "ID", 0 }, { "MapID", 1 }, { "X", 2 }, { "Y", 3 }, { "Z", 4 }, - { "Name", 5 }, { "MountDisplayIdAllianceFallback", 20 }, - { "MountDisplayIdHordeFallback", 21 }, - { "MountDisplayIdAlliance", 22 }, { "MountDisplayIdHorde", 23 }}}; - - // TaxiPath.dbc - layouts_["TaxiPath"] = {{{ "ID", 0 }, { "FromNode", 1 }, { "ToNode", 2 }, { "Cost", 3 }}}; - - // TaxiPathNode.dbc - layouts_["TaxiPathNode"] = {{{ "ID", 0 }, { "PathID", 1 }, { "NodeIndex", 2 }, - { "MapID", 3 }, { "X", 4 }, { "Y", 5 }, { "Z", 6 }}}; - - // TalentTab.dbc - layouts_["TalentTab"] = {{{ "ID", 0 }, { "Name", 1 }, { "ClassMask", 20 }, - { "OrderIndex", 22 }, { "BackgroundFile", 23 }}}; - - // Talent.dbc - layouts_["Talent"] = {{{ "ID", 0 }, { "TabID", 1 }, { "Row", 2 }, { "Column", 3 }, - { "RankSpell0", 4 }, { "PrereqTalent0", 9 }, { "PrereqRank0", 12 }}}; - - // SkillLineAbility.dbc - layouts_["SkillLineAbility"] = {{{ "SkillLineID", 1 }, { "SpellID", 2 }}}; - - // SkillLine.dbc - layouts_["SkillLine"] = {{{ "ID", 0 }, { "Category", 1 }, { "Name", 3 }}}; - - // Map.dbc - layouts_["Map"] = {{{ "ID", 0 }, { "InternalName", 1 }}}; - - // CreatureModelData.dbc - layouts_["CreatureModelData"] = {{{ "ID", 0 }, { "ModelPath", 2 }}}; - - // CharHairGeosets.dbc - layouts_["CharHairGeosets"] = {{{ "RaceID", 1 }, { "SexID", 2 }, - { "Variation", 3 }, { "GeosetID", 4 }}}; - - // CharacterFacialHairStyles.dbc - layouts_["CharacterFacialHairStyles"] = {{{ "RaceID", 0 }, { "SexID", 1 }, - { "Variation", 2 }, { "Geoset100", 3 }, { "Geoset300", 4 }, { "Geoset200", 5 }}}; - - // GameObjectDisplayInfo.dbc - layouts_["GameObjectDisplayInfo"] = {{{ "ID", 0 }, { "ModelName", 1 }}}; - - // Emotes.dbc - layouts_["Emotes"] = {{{ "ID", 0 }, { "AnimID", 2 }}}; - - // EmotesText.dbc - // Fields 3-18 are 16 EmotesTextData refs: [others+target, target+target, sender+target, ?, - // others+notarget, ?, sender+notarget, ?, female variants...] - layouts_["EmotesText"] = {{{ "ID", 0 }, { "Command", 1 }, { "EmoteRef", 2 }, - { "OthersTargetTextID", 3 }, { "SenderTargetTextID", 5 }, - { "OthersNoTargetTextID", 7 }, { "SenderNoTargetTextID", 9 }}}; - - // EmotesTextData.dbc - layouts_["EmotesTextData"] = {{{ "ID", 0 }, { "Text", 1 }}}; - - // Light.dbc - layouts_["Light"] = {{{ "ID", 0 }, { "MapID", 1 }, { "X", 2 }, { "Z", 3 }, { "Y", 4 }, - { "InnerRadius", 5 }, { "OuterRadius", 6 }, { "LightParamsID", 7 }, - { "LightParamsIDRain", 8 }, { "LightParamsIDUnderwater", 9 }}}; - - // LightParams.dbc - layouts_["LightParams"] = {{{ "LightParamsID", 0 }}}; - - // LightParamsBands.dbc (custom split from LightIntBand/LightFloatBand) - layouts_["LightParamsBands"] = {{{ "BlockIndex", 1 }, { "NumKeyframes", 2 }, - { "TimeKey0", 3 }, { "Value0", 19 }}}; - - // LightIntBand.dbc (same structure as LightParamsBands) - layouts_["LightIntBand"] = {{{ "BlockIndex", 1 }, { "NumKeyframes", 2 }, - { "TimeKey0", 3 }, { "Value0", 19 }}}; - - // LightFloatBand.dbc - layouts_["LightFloatBand"] = {{{ "BlockIndex", 1 }, { "NumKeyframes", 2 }, - { "TimeKey0", 3 }, { "Value0", 19 }}}; - - // WorldMapArea.dbc - layouts_["WorldMapArea"] = {{{ "ID", 0 }, { "MapID", 1 }, { "AreaID", 2 }, - { "AreaName", 3 }, { "LocLeft", 4 }, { "LocRight", 5 }, { "LocTop", 6 }, - { "LocBottom", 7 }, { "DisplayMapID", 8 }, { "ParentWorldMapID", 10 }}}; - - LOG_INFO("DBCLayout: loaded ", layouts_.size(), " WotLK default layouts"); -} - bool DBCLayout::loadFromJson(const std::string& path) { std::ifstream f(path); if (!f.is_open()) {