mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-03-22 23:30:14 +00:00
Remove hardcoded WotLK defaults, use JSON as single source of truth for opcodes/fields/DBC layouts
This commit is contained in:
parent
9b6731d3ce
commit
68896b5233
8 changed files with 11 additions and 565 deletions
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -242,12 +242,7 @@ QuestQueryTextCandidate pickBestQuestQueryTexts(const std::vector<uint8_t>& 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)
|
||||
|
|
|
|||
|
|
@ -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<uint16_t>(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<char>(f)), std::istreambuf_iterator<char>());
|
||||
|
||||
// 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<uint16_t>(*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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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<uint16_t>(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<char>(f)), std::istreambuf_iterator<char>());
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue