diff options
author | Shauren <shauren.trinity@gmail.com> | 2016-10-09 16:54:11 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-10-09 16:54:11 +0200 |
commit | d34020da7f34943e9cc84482ce19f829154334bd (patch) | |
tree | 97a0ca5879bf3cdb6c9c6dd59a5e732b8c4531bf /src | |
parent | 8fba569cb93e8497b639056fc07fd3f049bac959 (diff) |
Core/DataStores: Fixed loading signed db2 fields
Diffstat (limited to 'src')
18 files changed, 5144 insertions, 438 deletions
diff --git a/src/common/DataStores/DB2Meta.cpp b/src/common/DataStores/DB2Meta.cpp index bf119b52150..819ce20f821 100644 --- a/src/common/DataStores/DB2Meta.cpp +++ b/src/common/DataStores/DB2Meta.cpp @@ -99,3 +99,8 @@ uint32 DB2Meta::GetStringFieldCount(bool localizedOnly) const return stringFields; } + +DB2FieldMeta::DB2FieldMeta(bool isSigned, DBCFormer type, char const* name) + : IsSigned(isSigned), Type(type), Name(name) +{ +} diff --git a/src/common/DataStores/DB2Meta.h b/src/common/DataStores/DB2Meta.h index e99981cf094..a8b4074d05b 100644 --- a/src/common/DataStores/DB2Meta.h +++ b/src/common/DataStores/DB2Meta.h @@ -44,4 +44,13 @@ struct TC_COMMON_API DB2Meta uint8 const* ArraySizes; }; +struct TC_COMMON_API DB2FieldMeta +{ + DB2FieldMeta(bool isSigned, DBCFormer type, char const* name); + + bool IsSigned; + DBCFormer Type; + char const* Name; +}; + #endif // DB2Meta_h__ diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index a5099a8c7f5..9b459f29907 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -204,8 +204,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_TYPE, "SELECT ID, Name_lang FROM creature_type_locale WHERE locale = ?", CONNECTION_SYNCH); // Criteria.db2 - PrepareStatement(HOTFIX_SEL_CRITERIA, "SELECT ID, StartAsset, FailAsset, StartTimer, ModifierTreeId, EligibilityWorldStateID, Type, StartEvent, " - "FailEvent, Flags, EligibilityWorldStateValue FROM criteria ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CRITERIA, "SELECT ID, Asset, StartAsset, FailAsset, StartTimer, ModifierTreeId, EligibilityWorldStateID, Type, " + "StartEvent, FailEvent, Flags, EligibilityWorldStateValue FROM criteria ORDER BY ID DESC", CONNECTION_SYNCH); // CriteriaTree.db2 PrepareStatement(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, CriteriaID, Amount, Description, Parent, Flags, Operator, OrderIndex FROM criteria_tree" @@ -746,8 +746,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() "DispelType, Mechanic, PreventionType FROM spell_categories ORDER BY ID DESC", CONNECTION_SYNCH); // SpellCategory.db2 - PrepareStatement(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name, ChargeRecoveryTime, Flags, UsesPerWeek, MaxCharges, Unk703 FROM spell_category" - " ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name, ChargeRecoveryTime, Flags, UsesPerWeek, MaxCharges, ChargeCategoryType" + " FROM spell_category ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name_lang FROM spell_category_locale WHERE locale = ?", CONNECTION_SYNCH); // SpellClassOptions.db2 diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index a910df7b0a9..f8844ea925d 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -1910,7 +1910,7 @@ void Battleground::StartCriteriaTimer(CriteriaTimedTypes type, uint32 entry) player->StartCriteriaTimer(type, entry); } -void Battleground::SetBracket(PvPDifficultyEntry const* bracketEntry) +void Battleground::SetBracket(PvpDifficultyEntry const* bracketEntry) { m_BracketId = bracketEntry->GetBracketId(); SetLevelRange(bracketEntry->MinLevel, bracketEntry->MaxLevel); diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index 4d2f5da1a24..c574285a239 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -39,7 +39,7 @@ class WorldObject; class WorldPacket; class BattlegroundMap; -struct PvPDifficultyEntry; +struct PvpDifficultyEntry; struct WorldSafeLocsEntry; enum BattlegroundCriteriaId @@ -290,7 +290,7 @@ class TC_GAME_API Battleground void SetTypeID(BattlegroundTypeId TypeID) { m_TypeID = TypeID; } void SetRandomTypeID(BattlegroundTypeId TypeID) { m_RandomTypeID = TypeID; } //here we can count minlevel and maxlevel for players - void SetBracket(PvPDifficultyEntry const* bracketEntry); + void SetBracket(PvpDifficultyEntry const* bracketEntry); void SetInstanceID(uint32 InstanceID) { m_InstanceID = InstanceID; } void SetStatus(BattlegroundStatus Status) { m_Status = Status; } void SetClientInstanceID(uint32 InstanceID) { m_ClientInstanceID = InstanceID; } diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index 8585aa42a03..469447b127e 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -281,7 +281,7 @@ uint32 BattlegroundMgr::CreateClientVisibleInstanceId(BattlegroundTypeId bgTypeI } // create a new battleground that will really be used to play -Battleground* BattlegroundMgr::CreateNewBattleground(BattlegroundTypeId originalBgTypeId, PvPDifficultyEntry const* bracketEntry, uint8 arenaType, bool isRated) +Battleground* BattlegroundMgr::CreateNewBattleground(BattlegroundTypeId originalBgTypeId, PvpDifficultyEntry const* bracketEntry, uint8 arenaType, bool isRated) { BattlegroundTypeId bgTypeId = GetRandomBG(originalBgTypeId); diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.h b/src/server/game/Battlegrounds/BattlegroundMgr.h index d35b239a725..0ef0d04f5fb 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.h +++ b/src/server/game/Battlegrounds/BattlegroundMgr.h @@ -91,7 +91,7 @@ class TC_GAME_API BattlegroundMgr /* Battlegrounds */ Battleground* GetBattleground(uint32 InstanceID, BattlegroundTypeId bgTypeId); Battleground* GetBattlegroundTemplate(BattlegroundTypeId bgTypeId); - Battleground* CreateNewBattleground(BattlegroundTypeId bgTypeId, PvPDifficultyEntry const* bracketEntry, uint8 arenaType, bool isRated); + Battleground* CreateNewBattleground(BattlegroundTypeId bgTypeId, PvpDifficultyEntry const* bracketEntry, uint8 arenaType, bool isRated); void AddBattleground(Battleground* bg); void RemoveBattleground(BattlegroundTypeId bgTypeId, uint32 instanceId); diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index bb4aea1a22c..134e9cf9e67 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -126,7 +126,7 @@ bool BattlegroundQueue::SelectionPool::AddGroup(GroupQueueInfo* ginfo, uint32 de /*********************************************************/ // add group or player (grp == NULL) to bg queue with the given leader and bg specifications -GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, BattlegroundTypeId BgTypeId, PvPDifficultyEntry const* bracketEntry, uint8 ArenaType, bool isRated, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 arenateamid) +GroupQueueInfo* BattlegroundQueue::AddGroup(Player* leader, Group* grp, BattlegroundTypeId BgTypeId, PvpDifficultyEntry const* bracketEntry, uint8 ArenaType, bool isRated, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 arenateamid) { BattlegroundBracketId bracketId = bracketEntry->GetBracketId(); @@ -814,7 +814,7 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundTyp return; } - PvPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketById(bg_template->GetMapId(), bracket_id); + PvpDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketById(bg_template->GetMapId(), bracket_id); if (!bracketEntry) { TC_LOG_ERROR("bg.battleground", "Battleground: Update: bg bracket entry not found for map %u bracket id %u", bg_template->GetMapId(), bracket_id); diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.h b/src/server/game/Battlegrounds/BattlegroundQueue.h index 5eac6a8f51a..c98b388010f 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.h +++ b/src/server/game/Battlegrounds/BattlegroundQueue.h @@ -85,7 +85,7 @@ class TC_GAME_API BattlegroundQueue bool CheckPremadeMatch(BattlegroundBracketId bracket_id, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam); bool CheckNormalMatch(Battleground* bg_template, BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers); bool CheckSkirmishForSameFaction(BattlegroundBracketId bracket_id, uint32 minPlayersPerTeam); - GroupQueueInfo* AddGroup(Player* leader, Group* group, BattlegroundTypeId bgTypeId, PvPDifficultyEntry const* bracketEntry, uint8 ArenaType, bool isRated, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 ArenaTeamId = 0); + GroupQueueInfo* AddGroup(Player* leader, Group* group, BattlegroundTypeId bgTypeId, PvpDifficultyEntry const* bracketEntry, uint8 ArenaType, bool isRated, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 ArenaTeamId = 0); void RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount); bool IsPlayerInvited(ObjectGuid pl_guid, const uint32 bgInstanceGuid, const uint32 removeTime); bool GetPlayerGroupInfoData(ObjectGuid guid, GroupQueueInfo* ginfo); diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h new file mode 100644 index 00000000000..7ad3813c6a6 --- /dev/null +++ b/src/server/game/DataStores/DB2LoadInfo.h @@ -0,0 +1,4683 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +// DO NOT EDIT! +// Autogenerated from DB2Structure.h + +#ifndef DB2LoadInfo_h__ +#define DB2LoadInfo_h__ + +#include "DB2StorageLoader.h" +#include "DB2Metadata.h" + +struct AchievementLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_STRING, "Title" }, + { false, FT_STRING, "Description" }, + { false, FT_INT, "Flags" }, + { false, FT_STRING, "Reward" }, + { true, FT_SHORT, "MapID" }, + { false, FT_SHORT, "Supercedes" }, + { false, FT_SHORT, "Category" }, + { false, FT_SHORT, "UIOrder" }, + { false, FT_SHORT, "IconID" }, + { false, FT_SHORT, "SharesCriteria" }, + { false, FT_SHORT, "CriteriaTree" }, + { true, FT_BYTE, "Faction" }, + { false, FT_BYTE, "Points" }, + { false, FT_BYTE, "MinimumCriteria" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, AchievementMeta::Instance(), HOTFIX_SEL_ACHIEVEMENT }; + } +}; + +struct AnimKitLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "OneShotDuration" }, + { false, FT_SHORT, "OneShotStopAnimKitID" }, + { false, FT_SHORT, "LowDefAnimKitID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, AnimKitMeta::Instance(), HOTFIX_SEL_ANIM_KIT }; + } +}; + +struct AreaGroupMemberLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "AreaGroupID" }, + { false, FT_SHORT, "AreaID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, AreaGroupMemberMeta::Instance(), HOTFIX_SEL_AREA_GROUP_MEMBER }; + } +}; + +struct AreaTableLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "Flags1" }, + { false, FT_INT, "Flags2" }, + { false, FT_STRING_NOT_LOCALIZED, "ZoneName" }, + { false, FT_FLOAT, "AmbientMultiplier" }, + { false, FT_STRING, "AreaName" }, + { false, FT_SHORT, "MapID" }, + { false, FT_SHORT, "ParentAreaID" }, + { true, FT_SHORT, "AreaBit" }, + { false, FT_SHORT, "AmbienceID" }, + { false, FT_SHORT, "ZoneMusic" }, + { false, FT_SHORT, "IntroSound" }, + { false, FT_SHORT, "LiquidTypeID1" }, + { false, FT_SHORT, "LiquidTypeID2" }, + { false, FT_SHORT, "LiquidTypeID3" }, + { false, FT_SHORT, "LiquidTypeID4" }, + { false, FT_SHORT, "UWZoneMusic" }, + { false, FT_SHORT, "UWAmbience" }, + { false, FT_SHORT, "PvPCombatWorldStateID" }, + { false, FT_BYTE, "SoundProviderPref" }, + { false, FT_BYTE, "SoundProviderPrefUnderwater" }, + { false, FT_BYTE, "ExplorationLevel" }, + { false, FT_BYTE, "FactionGroupMask" }, + { false, FT_BYTE, "MountFlags" }, + { false, FT_BYTE, "WildBattlePetLevelMin" }, + { false, FT_BYTE, "WildBattlePetLevelMax" }, + { false, FT_BYTE, "WindSettingsID" }, + { false, FT_INT, "UWIntroSound" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, AreaTableMeta::Instance(), HOTFIX_SEL_AREA_TABLE }; + } +}; + +struct AreaTriggerLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_FLOAT, "PosX" }, + { false, FT_FLOAT, "PosY" }, + { false, FT_FLOAT, "PosZ" }, + { false, FT_FLOAT, "Radius" }, + { false, FT_FLOAT, "BoxLength" }, + { false, FT_FLOAT, "BoxWidth" }, + { false, FT_FLOAT, "BoxHeight" }, + { false, FT_FLOAT, "BoxYaw" }, + { false, FT_SHORT, "MapID" }, + { false, FT_SHORT, "PhaseID" }, + { false, FT_SHORT, "PhaseGroupID" }, + { false, FT_SHORT, "ShapeID" }, + { false, FT_SHORT, "AreaTriggerActionSetID" }, + { false, FT_BYTE, "PhaseUseFlags" }, + { false, FT_BYTE, "ShapeType" }, + { false, FT_BYTE, "Flag" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, AreaTriggerMeta::Instance(), HOTFIX_SEL_AREA_TRIGGER }; + } +}; + +struct ArmorLocationLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "Modifier1" }, + { false, FT_FLOAT, "Modifier2" }, + { false, FT_FLOAT, "Modifier3" }, + { false, FT_FLOAT, "Modifier4" }, + { false, FT_FLOAT, "Modifier5" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ArmorLocationMeta::Instance(), HOTFIX_SEL_ARMOR_LOCATION }; + } +}; + +struct ArtifactLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_INT, "BarConnectedColor" }, + { false, FT_INT, "BarDisconnectedColor" }, + { false, FT_INT, "TitleColor" }, + { false, FT_SHORT, "ClassUiTextureKitID" }, + { false, FT_SHORT, "SpecID" }, + { false, FT_BYTE, "ArtifactCategoryID" }, + { false, FT_BYTE, "Flags" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ArtifactMeta::Instance(), HOTFIX_SEL_ARTIFACT }; + } +}; + +struct ArtifactAppearanceLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_STRING, "Name" }, + { false, FT_INT, "SwatchColor" }, + { false, FT_FLOAT, "ModelDesaturation" }, + { false, FT_FLOAT, "ModelAlpha" }, + { false, FT_INT, "ShapeshiftDisplayID" }, + { false, FT_SHORT, "ArtifactAppearanceSetID" }, + { false, FT_SHORT, "PlayerConditionID" }, + { false, FT_SHORT, "Unknown" }, + { false, FT_BYTE, "DisplayIndex" }, + { false, FT_BYTE, "AppearanceModID" }, + { false, FT_BYTE, "Flags" }, + { false, FT_BYTE, "ModifiesShapeshiftFormDisplay" }, + { false, FT_INT, "ID" }, + { false, FT_INT, "ItemAppearanceID" }, + { false, FT_INT, "AltItemAppearanceID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ArtifactAppearanceMeta::Instance(), HOTFIX_SEL_ARTIFACT_APPEARANCE }; + } +}; + +struct ArtifactAppearanceSetLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_STRING, "Name" }, + { false, FT_STRING, "Name2" }, + { false, FT_SHORT, "UiCameraID" }, + { false, FT_SHORT, "AltHandUICameraID" }, + { false, FT_BYTE, "ArtifactID" }, + { false, FT_BYTE, "DisplayIndex" }, + { false, FT_BYTE, "AttachmentPoint" }, + { false, FT_BYTE, "Flags" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ArtifactAppearanceSetMeta::Instance(), HOTFIX_SEL_ARTIFACT_APPEARANCE_SET }; + } +}; + +struct ArtifactCategoryLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "ArtifactKnowledgeCurrencyID" }, + { false, FT_SHORT, "ArtifactKnowledgeMultiplierCurveID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ArtifactCategoryMeta::Instance(), HOTFIX_SEL_ARTIFACT_CATEGORY }; + } +}; + +struct ArtifactPowerLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_FLOAT, "PosX" }, + { false, FT_FLOAT, "PosY" }, + { false, FT_BYTE, "ArtifactID" }, + { false, FT_BYTE, "Flags" }, + { false, FT_BYTE, "MaxRank" }, + { false, FT_INT, "ID" }, + { true, FT_INT, "RelicType" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ArtifactPowerMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER }; + } +}; + +struct ArtifactPowerLinkLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "FromArtifactPowerID" }, + { false, FT_SHORT, "ToArtifactPowerID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ArtifactPowerLinkMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER_LINK }; + } +}; + +struct ArtifactPowerRankLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_FLOAT, "Value" }, + { false, FT_SHORT, "ArtifactPowerID" }, + { false, FT_SHORT, "Unknown" }, + { false, FT_BYTE, "Rank" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ArtifactPowerRankMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER_RANK }; + } +}; + +struct ArtifactQuestXpLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "Exp1" }, + { false, FT_INT, "Exp2" }, + { false, FT_INT, "Exp3" }, + { false, FT_INT, "Exp4" }, + { false, FT_INT, "Exp5" }, + { false, FT_INT, "Exp6" }, + { false, FT_INT, "Exp7" }, + { false, FT_INT, "Exp8" }, + { false, FT_INT, "Exp9" }, + { false, FT_INT, "Exp10" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ArtifactQuestXPMeta::Instance(), HOTFIX_SEL_ARTIFACT_QUEST_XP }; + } +}; + +struct AuctionHouseLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_SHORT, "FactionID" }, + { false, FT_BYTE, "DepositRate" }, + { false, FT_BYTE, "ConsignmentRate" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, AuctionHouseMeta::Instance(), HOTFIX_SEL_AUCTION_HOUSE }; + } +}; + +struct BankBagSlotPricesLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "Cost" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, BankBagSlotPricesMeta::Instance(), HOTFIX_SEL_BANK_BAG_SLOT_PRICES }; + } +}; + +struct BannedAddonsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING_NOT_LOCALIZED, "Name" }, + { false, FT_STRING_NOT_LOCALIZED, "Version" }, + { false, FT_BYTE, "Flags" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, BannedAddOnsMeta::Instance(), HOTFIX_SEL_BANNED_ADDONS }; + } +}; + +struct BarberShopStyleLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_STRING, "DisplayName" }, + { false, FT_STRING, "Description" }, + { false, FT_FLOAT, "CostModifier" }, + { false, FT_BYTE, "Type" }, + { false, FT_BYTE, "Race" }, + { false, FT_BYTE, "Sex" }, + { false, FT_BYTE, "Data" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, BarberShopStyleMeta::Instance(), HOTFIX_SEL_BARBER_SHOP_STYLE }; + } +}; + +struct BattlePetBreedQualityLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "Modifier" }, + { false, FT_BYTE, "Quality" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, BattlePetBreedQualityMeta::Instance(), HOTFIX_SEL_BATTLE_PET_BREED_QUALITY }; + } +}; + +struct BattlePetBreedStateLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { true, FT_SHORT, "Value" }, + { false, FT_BYTE, "BreedID" }, + { false, FT_BYTE, "State" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, BattlePetBreedStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_BREED_STATE }; + } +}; + +struct BattlePetSpeciesLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "CreatureID" }, + { false, FT_INT, "IconFileID" }, + { false, FT_INT, "SummonSpellID" }, + { false, FT_STRING, "SourceText" }, + { false, FT_STRING, "Description" }, + { false, FT_SHORT, "Flags" }, + { false, FT_BYTE, "PetType" }, + { true, FT_BYTE, "Source" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, BattlePetSpeciesMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES }; + } +}; + +struct BattlePetSpeciesStateLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { true, FT_INT, "Value" }, + { false, FT_SHORT, "SpeciesID" }, + { false, FT_BYTE, "State" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, BattlePetSpeciesStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES_STATE }; + } +}; + +struct BattlemasterListLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_INT, "IconFileDataID" }, + { false, FT_STRING, "GameType" }, + { true, FT_SHORT, "MapID1" }, + { true, FT_SHORT, "MapID2" }, + { true, FT_SHORT, "MapID3" }, + { true, FT_SHORT, "MapID4" }, + { true, FT_SHORT, "MapID5" }, + { true, FT_SHORT, "MapID6" }, + { true, FT_SHORT, "MapID7" }, + { true, FT_SHORT, "MapID8" }, + { true, FT_SHORT, "MapID9" }, + { true, FT_SHORT, "MapID10" }, + { true, FT_SHORT, "MapID11" }, + { true, FT_SHORT, "MapID12" }, + { true, FT_SHORT, "MapID13" }, + { true, FT_SHORT, "MapID14" }, + { true, FT_SHORT, "MapID15" }, + { true, FT_SHORT, "MapID16" }, + { false, FT_SHORT, "HolidayWorldState" }, + { false, FT_SHORT, "PlayerConditionID" }, + { false, FT_BYTE, "InstanceType" }, + { false, FT_BYTE, "GroupsAllowed" }, + { false, FT_BYTE, "MaxGroupSize" }, + { false, FT_BYTE, "MinLevel" }, + { false, FT_BYTE, "MaxLevel" }, + { false, FT_BYTE, "RatedPlayers" }, + { false, FT_BYTE, "MinPlayers" }, + { false, FT_BYTE, "MaxPlayers" }, + { false, FT_BYTE, "Flags" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, BattlemasterListMeta::Instance(), HOTFIX_SEL_BATTLEMASTER_LIST }; + } +}; + +struct BroadcastTextLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "MaleText" }, + { false, FT_STRING, "FemaleText" }, + { false, FT_SHORT, "EmoteID1" }, + { false, FT_SHORT, "EmoteID2" }, + { false, FT_SHORT, "EmoteID3" }, + { false, FT_SHORT, "EmoteDelay1" }, + { false, FT_SHORT, "EmoteDelay2" }, + { false, FT_SHORT, "EmoteDelay3" }, + { false, FT_SHORT, "UnkEmoteID" }, + { false, FT_BYTE, "Language" }, + { false, FT_BYTE, "Type" }, + { false, FT_INT, "SoundID1" }, + { false, FT_INT, "SoundID2" }, + { false, FT_INT, "PlayerConditionID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, BroadcastTextMeta::Instance(), HOTFIX_SEL_BROADCAST_TEXT }; + } +}; + +struct CharSectionsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "TextureFileDataID1" }, + { false, FT_INT, "TextureFileDataID2" }, + { false, FT_INT, "TextureFileDataID3" }, + { false, FT_SHORT, "Flags" }, + { false, FT_BYTE, "Race" }, + { false, FT_BYTE, "Gender" }, + { false, FT_BYTE, "GenType" }, + { false, FT_BYTE, "Type" }, + { false, FT_BYTE, "Color" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, CharSectionsMeta::Instance(), HOTFIX_SEL_CHAR_SECTIONS }; + } +}; + +struct CharStartOutfitLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { true, FT_INT, "ItemID1" }, + { true, FT_INT, "ItemID2" }, + { true, FT_INT, "ItemID3" }, + { true, FT_INT, "ItemID4" }, + { true, FT_INT, "ItemID5" }, + { true, FT_INT, "ItemID6" }, + { true, FT_INT, "ItemID7" }, + { true, FT_INT, "ItemID8" }, + { true, FT_INT, "ItemID9" }, + { true, FT_INT, "ItemID10" }, + { true, FT_INT, "ItemID11" }, + { true, FT_INT, "ItemID12" }, + { true, FT_INT, "ItemID13" }, + { true, FT_INT, "ItemID14" }, + { true, FT_INT, "ItemID15" }, + { true, FT_INT, "ItemID16" }, + { true, FT_INT, "ItemID17" }, + { true, FT_INT, "ItemID18" }, + { true, FT_INT, "ItemID19" }, + { true, FT_INT, "ItemID20" }, + { true, FT_INT, "ItemID21" }, + { true, FT_INT, "ItemID22" }, + { true, FT_INT, "ItemID23" }, + { true, FT_INT, "ItemID24" }, + { false, FT_INT, "PetDisplayID" }, + { false, FT_BYTE, "RaceID" }, + { false, FT_BYTE, "ClassID" }, + { false, FT_BYTE, "GenderID" }, + { false, FT_BYTE, "OutfitID" }, + { false, FT_BYTE, "PetFamilyID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, CharStartOutfitMeta::Instance(), HOTFIX_SEL_CHAR_START_OUTFIT }; + } +}; + +struct CharTitlesLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "NameMale" }, + { false, FT_STRING, "NameFemale" }, + { false, FT_SHORT, "MaskID" }, + { false, FT_BYTE, "Flags" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, CharTitlesMeta::Instance(), HOTFIX_SEL_CHAR_TITLES }; + } +}; + +struct ChatChannelsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "Flags" }, + { false, FT_STRING, "Name" }, + { false, FT_STRING, "Shortcut" }, + { false, FT_BYTE, "FactionGroup" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ChatChannelsMeta::Instance(), HOTFIX_SEL_CHAT_CHANNELS }; + } +}; + +struct ChrClassesLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_STRING_NOT_LOCALIZED, "PetNameToken" }, + { false, FT_STRING, "Name" }, + { false, FT_STRING, "NameFemale" }, + { false, FT_STRING, "NameMale" }, + { false, FT_STRING_NOT_LOCALIZED, "Filename" }, + { false, FT_INT, "CreateScreenFileDataID" }, + { false, FT_INT, "SelectScreenFileDataID" }, + { false, FT_INT, "LowResScreenFileDataID" }, + { false, FT_SHORT, "Flags" }, + { false, FT_SHORT, "CinematicSequenceID" }, + { false, FT_SHORT, "DefaultSpec" }, + { false, FT_BYTE, "PowerType" }, + { false, FT_BYTE, "SpellClassSet" }, + { false, FT_BYTE, "AttackPowerPerStrength" }, + { false, FT_BYTE, "AttackPowerPerAgility" }, + { false, FT_BYTE, "RangedAttackPowerPerAgility" }, + { false, FT_BYTE, "IconFileDataID" }, + { false, FT_BYTE, "Unk1" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ChrClassesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES }; + } +}; + +struct ChrClassesXPowerTypesLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_BYTE, "ClassID" }, + { false, FT_BYTE, "PowerType" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ChrClassesXPowerTypesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES }; + } +}; + +struct ChrRacesLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "Flags" }, + { false, FT_STRING_NOT_LOCALIZED, "ClientPrefix" }, + { false, FT_STRING_NOT_LOCALIZED, "ClientFileString" }, + { false, FT_STRING, "Name" }, + { false, FT_STRING, "NameFemale" }, + { false, FT_STRING, "NameMale" }, + { false, FT_STRING_NOT_LOCALIZED, "FacialHairCustomization1" }, + { false, FT_STRING_NOT_LOCALIZED, "FacialHairCustomization2" }, + { false, FT_STRING_NOT_LOCALIZED, "HairCustomization" }, + { false, FT_INT, "CreateScreenFileDataID" }, + { false, FT_INT, "SelectScreenFileDataID" }, + { false, FT_FLOAT, "MaleCustomizeOffset1" }, + { false, FT_FLOAT, "MaleCustomizeOffset2" }, + { false, FT_FLOAT, "MaleCustomizeOffset3" }, + { false, FT_FLOAT, "FemaleCustomizeOffset1" }, + { false, FT_FLOAT, "FemaleCustomizeOffset2" }, + { false, FT_FLOAT, "FemaleCustomizeOffset3" }, + { false, FT_INT, "LowResScreenFileDataID" }, + { false, FT_SHORT, "FactionID" }, + { false, FT_SHORT, "ExplorationSoundID" }, + { false, FT_SHORT, "MaleDisplayID" }, + { false, FT_SHORT, "FemaleDisplayID" }, + { false, FT_SHORT, "ResSicknessSpellID" }, + { false, FT_SHORT, "SplashSoundID" }, + { false, FT_SHORT, "CinematicSequenceID" }, + { false, FT_SHORT, "UAMaleCreatureSoundDataID" }, + { false, FT_SHORT, "UAFemaleCreatureSoundDataID" }, + { false, FT_BYTE, "BaseLanguage" }, + { false, FT_BYTE, "CreatureType" }, + { false, FT_BYTE, "TeamID" }, + { false, FT_BYTE, "RaceRelated" }, + { false, FT_BYTE, "UnalteredVisualRaceID" }, + { false, FT_BYTE, "CharComponentTextureLayoutID" }, + { false, FT_BYTE, "DefaultClassID" }, + { false, FT_BYTE, "NeutralRaceID" }, + { false, FT_BYTE, "ItemAppearanceFrameRaceID" }, + { false, FT_BYTE, "CharComponentTexLayoutHiResID" }, + { false, FT_INT, "HighResMaleDisplayID" }, + { false, FT_INT, "HighResFemaleDisplayID" }, + { false, FT_INT, "Unk1" }, + { false, FT_INT, "Unk2" }, + { false, FT_INT, "Unk3" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ChrRacesMeta::Instance(), HOTFIX_SEL_CHR_RACES }; + } +}; + +struct ChrSpecializationLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "MasterySpellID1" }, + { false, FT_INT, "MasterySpellID2" }, + { false, FT_STRING, "Name" }, + { false, FT_STRING, "Name2" }, + { false, FT_STRING, "Description" }, + { false, FT_STRING_NOT_LOCALIZED, "BackgroundFile" }, + { false, FT_SHORT, "SpellIconID" }, + { false, FT_BYTE, "ClassID" }, + { false, FT_BYTE, "OrderIndex" }, + { false, FT_BYTE, "PetTalentType" }, + { false, FT_BYTE, "Role" }, + { false, FT_BYTE, "PrimaryStatOrder" }, + { false, FT_INT, "ID" }, + { false, FT_INT, "Flags" }, + { false, FT_INT, "AnimReplacementSetID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ChrSpecializationMeta::Instance(), HOTFIX_SEL_CHR_SPECIALIZATION }; + } +}; + +struct CinematicSequencesLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "SoundID" }, + { false, FT_SHORT, "Camera1" }, + { false, FT_SHORT, "Camera2" }, + { false, FT_SHORT, "Camera3" }, + { false, FT_SHORT, "Camera4" }, + { false, FT_SHORT, "Camera5" }, + { false, FT_SHORT, "Camera6" }, + { false, FT_SHORT, "Camera7" }, + { false, FT_SHORT, "Camera8" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, CinematicSequencesMeta::Instance(), HOTFIX_SEL_CINEMATIC_SEQUENCES }; + } +}; + +struct CreatureDisplayInfoLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "ExtendedDisplayInfoID" }, + { false, FT_FLOAT, "CreatureModelScale" }, + { false, FT_FLOAT, "PlayerModelScale" }, + { false, FT_INT, "TextureVariation1" }, + { false, FT_INT, "TextureVariation2" }, + { false, FT_INT, "TextureVariation3" }, + { false, FT_STRING_NOT_LOCALIZED, "PortraitTextureName" }, + { false, FT_INT, "PortraitCreatureDisplayInfoID" }, + { false, FT_INT, "CreatureGeosetData" }, + { false, FT_INT, "StateSpellVisualKitID" }, + { false, FT_FLOAT, "InstanceOtherPlayerPetScale" }, + { false, FT_SHORT, "ModelID" }, + { false, FT_SHORT, "SoundID" }, + { false, FT_SHORT, "NPCSoundID" }, + { false, FT_SHORT, "ParticleColorID" }, + { false, FT_SHORT, "ObjectEffectPackageID" }, + { false, FT_SHORT, "AnimReplacementSetID" }, + { false, FT_BYTE, "CreatureModelAlpha" }, + { false, FT_BYTE, "SizeClass" }, + { false, FT_BYTE, "BloodID" }, + { false, FT_BYTE, "Flags" }, + { true, FT_BYTE, "Gender" }, + { true, FT_BYTE, "Unk700" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, CreatureDisplayInfoMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO }; + } +}; + +struct CreatureDisplayInfoExtraLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "FileDataID" }, + { false, FT_INT, "HDFileDataID" }, + { false, FT_BYTE, "DisplayRaceID" }, + { false, FT_BYTE, "DisplaySexID" }, + { false, FT_BYTE, "DisplayClassID" }, + { false, FT_BYTE, "SkinID" }, + { false, FT_BYTE, "FaceID" }, + { false, FT_BYTE, "HairStyleID" }, + { false, FT_BYTE, "HairColorID" }, + { false, FT_BYTE, "FacialHairID" }, + { false, FT_BYTE, "CustomDisplayOption1" }, + { false, FT_BYTE, "CustomDisplayOption2" }, + { false, FT_BYTE, "CustomDisplayOption3" }, + { false, FT_BYTE, "Flags" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, CreatureDisplayInfoExtraMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA }; + } +}; + +struct CreatureFamilyLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "MinScale" }, + { false, FT_FLOAT, "MaxScale" }, + { false, FT_STRING, "Name" }, + { false, FT_STRING_NOT_LOCALIZED, "IconFile" }, + { false, FT_SHORT, "SkillLine1" }, + { false, FT_SHORT, "SkillLine2" }, + { false, FT_SHORT, "PetFoodMask" }, + { false, FT_BYTE, "MinScaleLevel" }, + { false, FT_BYTE, "MaxScaleLevel" }, + { false, FT_BYTE, "PetTalentType" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, CreatureFamilyMeta::Instance(), HOTFIX_SEL_CREATURE_FAMILY }; + } +}; + +struct CreatureModelDataLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "ModelScale" }, + { false, FT_FLOAT, "FootprintTextureLength" }, + { false, FT_FLOAT, "FootprintTextureWidth" }, + { false, FT_FLOAT, "FootprintParticleScale" }, + { false, FT_FLOAT, "CollisionWidth" }, + { false, FT_FLOAT, "CollisionHeight" }, + { false, FT_FLOAT, "MountHeight" }, + { false, FT_FLOAT, "GeoBoxMin1" }, + { false, FT_FLOAT, "GeoBoxMin2" }, + { false, FT_FLOAT, "GeoBoxMin3" }, + { false, FT_FLOAT, "GeoBoxMax1" }, + { false, FT_FLOAT, "GeoBoxMax2" }, + { false, FT_FLOAT, "GeoBoxMax3" }, + { false, FT_FLOAT, "WorldEffectScale" }, + { false, FT_FLOAT, "AttachedEffectScale" }, + { false, FT_FLOAT, "MissileCollisionRadius" }, + { false, FT_FLOAT, "MissileCollisionPush" }, + { false, FT_FLOAT, "MissileCollisionRaise" }, + { false, FT_FLOAT, "OverrideLootEffectScale" }, + { false, FT_FLOAT, "OverrideNameScale" }, + { false, FT_FLOAT, "OverrideSelectionRadius" }, + { false, FT_FLOAT, "TamedPetBaseScale" }, + { false, FT_FLOAT, "HoverHeight" }, + { false, FT_INT, "Flags" }, + { false, FT_INT, "FileDataID" }, + { false, FT_INT, "SizeClass" }, + { false, FT_INT, "BloodID" }, + { false, FT_INT, "FootprintTextureID" }, + { false, FT_INT, "FoleyMaterialID" }, + { false, FT_INT, "FootstepEffectID" }, + { false, FT_INT, "DeathThudEffectID" }, + { false, FT_INT, "FootstepShakeSize" }, + { false, FT_INT, "DeathThudShakeSize" }, + { false, FT_INT, "SoundID" }, + { false, FT_INT, "CreatureGeosetDataID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, CreatureModelDataMeta::Instance(), HOTFIX_SEL_CREATURE_MODEL_DATA }; + } +}; + +struct CreatureTypeLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_BYTE, "Flags" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, CreatureTypeMeta::Instance(), HOTFIX_SEL_CREATURE_TYPE }; + } +}; + +struct CriteriaLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "Asset" }, + { false, FT_INT, "StartAsset" }, + { false, FT_INT, "FailAsset" }, + { false, FT_SHORT, "StartTimer" }, + { false, FT_SHORT, "ModifierTreeId" }, + { false, FT_SHORT, "EligibilityWorldStateID" }, + { false, FT_BYTE, "Type" }, + { false, FT_BYTE, "StartEvent" }, + { false, FT_BYTE, "FailEvent" }, + { false, FT_BYTE, "Flags" }, + { false, FT_BYTE, "EligibilityWorldStateValue" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, CriteriaMeta::Instance(), HOTFIX_SEL_CRITERIA }; + } +}; + +struct CriteriaTreeLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "CriteriaID" }, + { false, FT_INT, "Amount" }, + { false, FT_STRING, "Description" }, + { false, FT_SHORT, "Parent" }, + { false, FT_SHORT, "Flags" }, + { false, FT_BYTE, "Operator" }, + { true, FT_INT, "OrderIndex" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, CriteriaTreeMeta::Instance(), HOTFIX_SEL_CRITERIA_TREE }; + } +}; + +struct CurrencyTypesLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_STRING_NOT_LOCALIZED, "InventoryIcon1" }, + { false, FT_STRING_NOT_LOCALIZED, "InventoryIcon2" }, + { false, FT_INT, "MaxQty" }, + { false, FT_INT, "MaxEarnablePerWeek" }, + { false, FT_INT, "Flags" }, + { false, FT_STRING, "Description" }, + { false, FT_BYTE, "CategoryID" }, + { false, FT_BYTE, "SpellCategory" }, + { false, FT_BYTE, "Quality" }, + { false, FT_INT, "SpellWeight" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, CurrencyTypesMeta::Instance(), HOTFIX_SEL_CURRENCY_TYPES }; + } +}; + +struct CurveLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_BYTE, "Type" }, + { false, FT_BYTE, "Unused" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, CurveMeta::Instance(), HOTFIX_SEL_CURVE }; + } +}; + +struct CurvePointLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "X" }, + { false, FT_FLOAT, "Y" }, + { false, FT_SHORT, "CurveID" }, + { false, FT_BYTE, "Index" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, CurvePointMeta::Instance(), HOTFIX_SEL_CURVE_POINT }; + } +}; + +struct DestructibleModelDataLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "StateDamagedDisplayID" }, + { false, FT_SHORT, "StateDestroyedDisplayID" }, + { false, FT_SHORT, "StateRebuildingDisplayID" }, + { false, FT_SHORT, "StateSmokeDisplayID" }, + { false, FT_SHORT, "HealEffectSpeed" }, + { false, FT_BYTE, "StateDamagedImpactEffectDoodadSet" }, + { false, FT_BYTE, "StateDamagedAmbientDoodadSet" }, + { false, FT_BYTE, "StateDamagedNameSet" }, + { false, FT_BYTE, "StateDestroyedDestructionDoodadSet" }, + { false, FT_BYTE, "StateDestroyedImpactEffectDoodadSet" }, + { false, FT_BYTE, "StateDestroyedAmbientDoodadSet" }, + { false, FT_BYTE, "StateDestroyedNameSet" }, + { false, FT_BYTE, "StateRebuildingDestructionDoodadSet" }, + { false, FT_BYTE, "StateRebuildingImpactEffectDoodadSet" }, + { false, FT_BYTE, "StateRebuildingAmbientDoodadSet" }, + { false, FT_BYTE, "StateRebuildingNameSet" }, + { false, FT_BYTE, "StateSmokeInitDoodadSet" }, + { false, FT_BYTE, "StateSmokeAmbientDoodadSet" }, + { false, FT_BYTE, "StateSmokeNameSet" }, + { false, FT_BYTE, "EjectDirection" }, + { false, FT_BYTE, "DoNotHighlight" }, + { false, FT_BYTE, "HealEffect" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, DestructibleModelDataMeta::Instance(), HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA }; + } +}; + +struct DifficultyLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_BYTE, "FallbackDifficultyID" }, + { false, FT_BYTE, "InstanceType" }, + { false, FT_BYTE, "MinPlayers" }, + { false, FT_BYTE, "MaxPlayers" }, + { true, FT_BYTE, "OldEnumValue" }, + { false, FT_BYTE, "Flags" }, + { false, FT_BYTE, "ToggleDifficultyID" }, + { false, FT_BYTE, "GroupSizeHealthCurveID" }, + { false, FT_BYTE, "GroupSizeDmgCurveID" }, + { false, FT_BYTE, "GroupSizeSpellPointsCurveID" }, + { false, FT_BYTE, "ItemBonusTreeModID" }, + { false, FT_BYTE, "OrderIndex" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, DifficultyMeta::Instance(), HOTFIX_SEL_DIFFICULTY }; + } +}; + +struct DungeonEncounterLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_INT, "CreatureDisplayID" }, + { false, FT_SHORT, "MapID" }, + { false, FT_SHORT, "SpellIconID" }, + { false, FT_BYTE, "DifficultyID" }, + { false, FT_BYTE, "Bit" }, + { false, FT_BYTE, "Flags" }, + { true, FT_INT, "OrderIndex" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, DungeonEncounterMeta::Instance(), HOTFIX_SEL_DUNGEON_ENCOUNTER }; + } +}; + +struct DurabilityCostsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "WeaponSubClassCost1" }, + { false, FT_SHORT, "WeaponSubClassCost2" }, + { false, FT_SHORT, "WeaponSubClassCost3" }, + { false, FT_SHORT, "WeaponSubClassCost4" }, + { false, FT_SHORT, "WeaponSubClassCost5" }, + { false, FT_SHORT, "WeaponSubClassCost6" }, + { false, FT_SHORT, "WeaponSubClassCost7" }, + { false, FT_SHORT, "WeaponSubClassCost8" }, + { false, FT_SHORT, "WeaponSubClassCost9" }, + { false, FT_SHORT, "WeaponSubClassCost10" }, + { false, FT_SHORT, "WeaponSubClassCost11" }, + { false, FT_SHORT, "WeaponSubClassCost12" }, + { false, FT_SHORT, "WeaponSubClassCost13" }, + { false, FT_SHORT, "WeaponSubClassCost14" }, + { false, FT_SHORT, "WeaponSubClassCost15" }, + { false, FT_SHORT, "WeaponSubClassCost16" }, + { false, FT_SHORT, "WeaponSubClassCost17" }, + { false, FT_SHORT, "WeaponSubClassCost18" }, + { false, FT_SHORT, "WeaponSubClassCost19" }, + { false, FT_SHORT, "WeaponSubClassCost20" }, + { false, FT_SHORT, "WeaponSubClassCost21" }, + { false, FT_SHORT, "ArmorSubClassCost1" }, + { false, FT_SHORT, "ArmorSubClassCost2" }, + { false, FT_SHORT, "ArmorSubClassCost3" }, + { false, FT_SHORT, "ArmorSubClassCost4" }, + { false, FT_SHORT, "ArmorSubClassCost5" }, + { false, FT_SHORT, "ArmorSubClassCost6" }, + { false, FT_SHORT, "ArmorSubClassCost7" }, + { false, FT_SHORT, "ArmorSubClassCost8" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, DurabilityCostsMeta::Instance(), HOTFIX_SEL_DURABILITY_COSTS }; + } +}; + +struct DurabilityQualityLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "QualityMod" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, DurabilityQualityMeta::Instance(), HOTFIX_SEL_DURABILITY_QUALITY }; + } +}; + +struct EmotesLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING_NOT_LOCALIZED, "EmoteSlashCommand" }, + { false, FT_INT, "SpellVisualKitID" }, + { false, FT_INT, "EmoteFlags" }, + { false, FT_SHORT, "AnimID" }, + { false, FT_BYTE, "EmoteSpecProc" }, + { false, FT_INT, "EmoteSpecProcParam" }, + { false, FT_INT, "EmoteSoundID" }, + { true, FT_INT, "ClassMask" }, + { true, FT_INT, "RaceMask" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, EmotesMeta::Instance(), HOTFIX_SEL_EMOTES }; + } +}; + +struct EmotesTextLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_SHORT, "EmoteID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, EmotesTextMeta::Instance(), HOTFIX_SEL_EMOTES_TEXT }; + } +}; + +struct EmotesTextSoundLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "EmotesTextId" }, + { false, FT_BYTE, "RaceId" }, + { false, FT_BYTE, "SexId" }, + { false, FT_BYTE, "ClassId" }, + { false, FT_INT, "SoundId" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, EmotesTextSoundMeta::Instance(), HOTFIX_SEL_EMOTES_TEXT_SOUND }; + } +}; + +struct FactionLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "ReputationRaceMask1" }, + { false, FT_INT, "ReputationRaceMask2" }, + { false, FT_INT, "ReputationRaceMask3" }, + { false, FT_INT, "ReputationRaceMask4" }, + { true, FT_INT, "ReputationBase1" }, + { true, FT_INT, "ReputationBase2" }, + { true, FT_INT, "ReputationBase3" }, + { true, FT_INT, "ReputationBase4" }, + { false, FT_FLOAT, "ParentFactionModIn" }, + { false, FT_FLOAT, "ParentFactionModOut" }, + { false, FT_STRING, "Name" }, + { false, FT_STRING, "Description" }, + { false, FT_INT, "ReputationMax1" }, + { false, FT_INT, "ReputationMax2" }, + { false, FT_INT, "ReputationMax3" }, + { false, FT_INT, "ReputationMax4" }, + { true, FT_SHORT, "ReputationIndex" }, + { false, FT_SHORT, "ReputationClassMask1" }, + { false, FT_SHORT, "ReputationClassMask2" }, + { false, FT_SHORT, "ReputationClassMask3" }, + { false, FT_SHORT, "ReputationClassMask4" }, + { false, FT_SHORT, "ReputationFlags1" }, + { false, FT_SHORT, "ReputationFlags2" }, + { false, FT_SHORT, "ReputationFlags3" }, + { false, FT_SHORT, "ReputationFlags4" }, + { false, FT_SHORT, "ParentFactionID" }, + { false, FT_BYTE, "ParentFactionCapIn" }, + { false, FT_BYTE, "ParentFactionCapOut" }, + { false, FT_BYTE, "Expansion" }, + { false, FT_BYTE, "Flags" }, + { false, FT_BYTE, "FriendshipRepID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, FactionMeta::Instance(), HOTFIX_SEL_FACTION }; + } +}; + +struct FactionTemplateLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "Faction" }, + { false, FT_SHORT, "Flags" }, + { false, FT_SHORT, "Enemies1" }, + { false, FT_SHORT, "Enemies2" }, + { false, FT_SHORT, "Enemies3" }, + { false, FT_SHORT, "Enemies4" }, + { false, FT_SHORT, "Friends1" }, + { false, FT_SHORT, "Friends2" }, + { false, FT_SHORT, "Friends3" }, + { false, FT_SHORT, "Friends4" }, + { false, FT_BYTE, "Mask" }, + { false, FT_BYTE, "FriendMask" }, + { false, FT_BYTE, "EnemyMask" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, FactionTemplateMeta::Instance(), HOTFIX_SEL_FACTION_TEMPLATE }; + } +}; + +struct GameobjectsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_FLOAT, "PositionX" }, + { false, FT_FLOAT, "PositionY" }, + { false, FT_FLOAT, "PositionZ" }, + { false, FT_FLOAT, "RotationX" }, + { false, FT_FLOAT, "RotationY" }, + { false, FT_FLOAT, "RotationZ" }, + { false, FT_FLOAT, "RotationW" }, + { false, FT_FLOAT, "Size" }, + { true, FT_INT, "Data1" }, + { true, FT_INT, "Data2" }, + { true, FT_INT, "Data3" }, + { true, FT_INT, "Data4" }, + { true, FT_INT, "Data5" }, + { true, FT_INT, "Data6" }, + { true, FT_INT, "Data7" }, + { true, FT_INT, "Data8" }, + { false, FT_STRING, "Name" }, + { false, FT_SHORT, "MapID" }, + { false, FT_SHORT, "DisplayID" }, + { false, FT_SHORT, "PhaseID" }, + { false, FT_SHORT, "PhaseGroupID" }, + { false, FT_BYTE, "PhaseUseFlags" }, + { false, FT_BYTE, "Type" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GameObjectsMeta::Instance(), HOTFIX_SEL_GAMEOBJECTS }; + } +}; + +struct GameobjectDisplayInfoLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "FileDataID" }, + { false, FT_FLOAT, "GeoBoxMinX" }, + { false, FT_FLOAT, "GeoBoxMinY" }, + { false, FT_FLOAT, "GeoBoxMinZ" }, + { false, FT_FLOAT, "GeoBoxMaxX" }, + { false, FT_FLOAT, "GeoBoxMaxY" }, + { false, FT_FLOAT, "GeoBoxMaxZ" }, + { false, FT_FLOAT, "OverrideLootEffectScale" }, + { false, FT_FLOAT, "OverrideNameScale" }, + { false, FT_SHORT, "ObjectEffectPackageID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GameObjectDisplayInfoMeta::Instance(), HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO }; + } +}; + +struct GarrAbilityLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_STRING, "Name" }, + { false, FT_STRING, "Description" }, + { false, FT_INT, "IconFileDataID" }, + { false, FT_SHORT, "Flags" }, + { false, FT_SHORT, "OtherFactionGarrAbilityID" }, + { false, FT_BYTE, "GarrAbilityCategoryID" }, + { false, FT_BYTE, "FollowerTypeID" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GarrAbilityMeta::Instance(), HOTFIX_SEL_GARR_ABILITY }; + } +}; + +struct GarrBuildingLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "HordeGameObjectID" }, + { false, FT_INT, "AllianceGameObjectID" }, + { false, FT_STRING, "NameAlliance" }, + { false, FT_STRING, "NameHorde" }, + { false, FT_STRING, "Description" }, + { false, FT_STRING, "Tooltip" }, + { false, FT_INT, "IconFileDataID" }, + { false, FT_SHORT, "CostCurrencyID" }, + { false, FT_SHORT, "HordeTexPrefixKitID" }, + { false, FT_SHORT, "AllianceTexPrefixKitID" }, + { false, FT_SHORT, "AllianceActivationScenePackageID" }, + { false, FT_SHORT, "HordeActivationScenePackageID" }, + { false, FT_SHORT, "FollowerRequiredGarrAbilityID" }, + { false, FT_SHORT, "FollowerGarrAbilityEffectID" }, + { true, FT_SHORT, "CostMoney" }, + { false, FT_BYTE, "Unknown" }, + { false, FT_BYTE, "Type" }, + { false, FT_BYTE, "Level" }, + { false, FT_BYTE, "Flags" }, + { false, FT_BYTE, "MaxShipments" }, + { false, FT_BYTE, "GarrTypeID" }, + { true, FT_INT, "BuildDuration" }, + { true, FT_INT, "CostCurrencyAmount" }, + { true, FT_INT, "BonusAmount" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GarrBuildingMeta::Instance(), HOTFIX_SEL_GARR_BUILDING }; + } +}; + +struct GarrBuildingPlotInstLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_FLOAT, "LandmarkOffsetX" }, + { false, FT_FLOAT, "LandmarkOffsetY" }, + { false, FT_SHORT, "UiTextureAtlasMemberID" }, + { false, FT_SHORT, "GarrSiteLevelPlotInstID" }, + { false, FT_BYTE, "GarrBuildingID" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GarrBuildingPlotInstMeta::Instance(), HOTFIX_SEL_GARR_BUILDING_PLOT_INST }; + } +}; + +struct GarrClassSpecLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_STRING, "NameMale" }, + { false, FT_STRING, "NameFemale" }, + { false, FT_STRING, "NameGenderless" }, + { false, FT_SHORT, "ClassAtlasID" }, + { false, FT_BYTE, "GarrFollItemSetID" }, + { false, FT_BYTE, "Limit" }, + { false, FT_BYTE, "Flags" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GarrClassSpecMeta::Instance(), HOTFIX_SEL_GARR_CLASS_SPEC }; + } +}; + +struct GarrFollowerLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "HordeCreatureID" }, + { false, FT_INT, "AllianceCreatureID" }, + { false, FT_STRING, "HordeSourceText" }, + { false, FT_STRING, "AllianceSourceText" }, + { false, FT_INT, "HordePortraitIconID" }, + { false, FT_INT, "AlliancePortraitIconID" }, + { false, FT_INT, "HordeAddedBroadcastTextID" }, + { false, FT_INT, "AllianceAddedBroadcastTextID" }, + { false, FT_SHORT, "HordeGarrFollItemSetID" }, + { false, FT_SHORT, "AllianceGarrFollItemSetID" }, + { false, FT_SHORT, "ItemLevelWeapon" }, + { false, FT_SHORT, "ItemLevelArmor" }, + { false, FT_SHORT, "HordeListPortraitTextureKitID" }, + { false, FT_SHORT, "AllianceListPortraitTextureKitID" }, + { false, FT_BYTE, "FollowerTypeID" }, + { false, FT_BYTE, "HordeUiAnimRaceInfoID" }, + { false, FT_BYTE, "AllianceUiAnimRaceInfoID" }, + { false, FT_BYTE, "Quality" }, + { false, FT_BYTE, "HordeGarrClassSpecID" }, + { false, FT_BYTE, "AllianceGarrClassSpecID" }, + { false, FT_BYTE, "Level" }, + { false, FT_BYTE, "Unknown1" }, + { false, FT_BYTE, "Flags" }, + { true, FT_BYTE, "Unknown2" }, + { true, FT_BYTE, "Unknown3" }, + { false, FT_BYTE, "GarrTypeID" }, + { false, FT_BYTE, "MaxDurability" }, + { false, FT_BYTE, "Class" }, + { false, FT_BYTE, "HordeFlavorTextGarrStringID" }, + { false, FT_BYTE, "AllianceFlavorTextGarrStringID" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GarrFollowerMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER }; + } +}; + +struct GarrFollowerXAbilityLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "GarrFollowerID" }, + { false, FT_SHORT, "GarrAbilityID" }, + { false, FT_BYTE, "FactionIndex" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GarrFollowerXAbilityMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY }; + } +}; + +struct GarrPlotLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_INT, "AllianceConstructionGameObjectID" }, + { false, FT_INT, "HordeConstructionGameObjectID" }, + { false, FT_BYTE, "GarrPlotUICategoryID" }, + { false, FT_BYTE, "PlotType" }, + { false, FT_BYTE, "Flags" }, + { false, FT_INT, "MinCount" }, + { false, FT_INT, "MaxCount" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GarrPlotMeta::Instance(), HOTFIX_SEL_GARR_PLOT }; + } +}; + +struct GarrPlotBuildingLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_BYTE, "GarrPlotID" }, + { false, FT_BYTE, "GarrBuildingID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GarrPlotBuildingMeta::Instance(), HOTFIX_SEL_GARR_PLOT_BUILDING }; + } +}; + +struct GarrPlotInstanceLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_BYTE, "GarrPlotID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GarrPlotInstanceMeta::Instance(), HOTFIX_SEL_GARR_PLOT_INSTANCE }; + } +}; + +struct GarrSiteLevelLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "TownHallX" }, + { false, FT_FLOAT, "TownHallY" }, + { false, FT_SHORT, "MapID" }, + { false, FT_SHORT, "SiteID" }, + { false, FT_SHORT, "UpgradeResourceCost" }, + { false, FT_SHORT, "UpgradeMoneyCost" }, + { false, FT_BYTE, "Level" }, + { false, FT_BYTE, "UITextureKitID" }, + { false, FT_BYTE, "MovieID" }, + { false, FT_BYTE, "Level2" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GarrSiteLevelMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL }; + } +}; + +struct GarrSiteLevelPlotInstLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "LandmarkX" }, + { false, FT_FLOAT, "LandmarkY" }, + { false, FT_SHORT, "GarrSiteLevelID" }, + { false, FT_BYTE, "GarrPlotInstanceID" }, + { false, FT_BYTE, "Unknown" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GarrSiteLevelPlotInstMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST }; + } +}; + +struct GemPropertiesLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "Type" }, + { false, FT_SHORT, "EnchantID" }, + { false, FT_SHORT, "MinItemLevel" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GemPropertiesMeta::Instance(), HOTFIX_SEL_GEM_PROPERTIES }; + } +}; + +struct GlyphBindableSpellLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_SHORT, "GlyphPropertiesID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GlyphBindableSpellMeta::Instance(), HOTFIX_SEL_GLYPH_BINDABLE_SPELL }; + } +}; + +struct GlyphPropertiesLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_SHORT, "SpellIconID" }, + { false, FT_BYTE, "Type" }, + { false, FT_BYTE, "GlyphExclusiveCategoryID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GlyphPropertiesMeta::Instance(), HOTFIX_SEL_GLYPH_PROPERTIES }; + } +}; + +struct GlyphRequiredSpecLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "GlyphPropertiesID" }, + { false, FT_SHORT, "ChrSpecializationID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GlyphRequiredSpecMeta::Instance(), HOTFIX_SEL_GLYPH_REQUIRED_SPEC }; + } +}; + +struct GuildColorBackgroundLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_BYTE, "Red" }, + { false, FT_BYTE, "Green" }, + { false, FT_BYTE, "Blue" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GuildColorBackgroundMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BACKGROUND }; + } +}; + +struct GuildColorBorderLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_BYTE, "Red" }, + { false, FT_BYTE, "Green" }, + { false, FT_BYTE, "Blue" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GuildColorBorderMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BORDER }; + } +}; + +struct GuildColorEmblemLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_BYTE, "Red" }, + { false, FT_BYTE, "Green" }, + { false, FT_BYTE, "Blue" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GuildColorEmblemMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_EMBLEM }; + } +}; + +struct GuildPerkSpellsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, GuildPerkSpellsMeta::Instance(), HOTFIX_SEL_GUILD_PERK_SPELLS }; + } +}; + +struct HeirloomLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ItemID" }, + { false, FT_STRING, "SourceText" }, + { false, FT_INT, "OldItem1" }, + { false, FT_INT, "OldItem2" }, + { false, FT_INT, "NextDifficultyItemID" }, + { false, FT_INT, "UpgradeItemID1" }, + { false, FT_INT, "UpgradeItemID2" }, + { false, FT_SHORT, "ItemBonusListID1" }, + { false, FT_SHORT, "ItemBonusListID2" }, + { false, FT_BYTE, "Flags" }, + { false, FT_BYTE, "Source" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, HeirloomMeta::Instance(), HOTFIX_SEL_HEIRLOOM }; + } +}; + +struct HolidaysLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "Date1" }, + { false, FT_INT, "Date2" }, + { false, FT_INT, "Date3" }, + { false, FT_INT, "Date4" }, + { false, FT_INT, "Date5" }, + { false, FT_INT, "Date6" }, + { false, FT_INT, "Date7" }, + { false, FT_INT, "Date8" }, + { false, FT_INT, "Date9" }, + { false, FT_INT, "Date10" }, + { false, FT_INT, "Date11" }, + { false, FT_INT, "Date12" }, + { false, FT_INT, "Date13" }, + { false, FT_INT, "Date14" }, + { false, FT_INT, "Date15" }, + { false, FT_INT, "Date16" }, + { false, FT_STRING_NOT_LOCALIZED, "TextureFilename" }, + { false, FT_SHORT, "Duration1" }, + { false, FT_SHORT, "Duration2" }, + { false, FT_SHORT, "Duration3" }, + { false, FT_SHORT, "Duration4" }, + { false, FT_SHORT, "Duration5" }, + { false, FT_SHORT, "Duration6" }, + { false, FT_SHORT, "Duration7" }, + { false, FT_SHORT, "Duration8" }, + { false, FT_SHORT, "Duration9" }, + { false, FT_SHORT, "Duration10" }, + { false, FT_SHORT, "Region" }, + { false, FT_BYTE, "Looping" }, + { false, FT_BYTE, "CalendarFlags1" }, + { false, FT_BYTE, "CalendarFlags2" }, + { false, FT_BYTE, "CalendarFlags3" }, + { false, FT_BYTE, "CalendarFlags4" }, + { false, FT_BYTE, "CalendarFlags5" }, + { false, FT_BYTE, "CalendarFlags6" }, + { false, FT_BYTE, "CalendarFlags7" }, + { false, FT_BYTE, "CalendarFlags8" }, + { false, FT_BYTE, "CalendarFlags9" }, + { false, FT_BYTE, "CalendarFlags10" }, + { false, FT_BYTE, "HolidayNameID" }, + { false, FT_BYTE, "HolidayDescriptionID" }, + { false, FT_BYTE, "Priority" }, + { true, FT_BYTE, "CalendarFilterType" }, + { false, FT_BYTE, "Flags" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, HolidaysMeta::Instance(), HOTFIX_SEL_HOLIDAYS }; + } +}; + +struct ImportPriceArmorLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "ClothFactor" }, + { false, FT_FLOAT, "LeatherFactor" }, + { false, FT_FLOAT, "MailFactor" }, + { false, FT_FLOAT, "PlateFactor" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ImportPriceArmorMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_ARMOR }; + } +}; + +struct ImportPriceQualityLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "Factor" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ImportPriceQualityMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_QUALITY }; + } +}; + +struct ImportPriceShieldLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "Factor" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ImportPriceShieldMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_SHIELD }; + } +}; + +struct ImportPriceWeaponLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "Factor" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ImportPriceWeaponMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_WEAPON }; + } +}; + +struct ItemLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "FileDataID" }, + { false, FT_BYTE, "Class" }, + { false, FT_BYTE, "SubClass" }, + { true, FT_BYTE, "SoundOverrideSubclass" }, + { true, FT_BYTE, "Material" }, + { false, FT_BYTE, "InventoryType" }, + { false, FT_BYTE, "Sheath" }, + { false, FT_BYTE, "GroupSoundsID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemMeta::Instance(), HOTFIX_SEL_ITEM }; + } +}; + +struct ItemAppearanceLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "DisplayID" }, + { false, FT_INT, "IconFileDataID" }, + { false, FT_INT, "UIOrder" }, + { false, FT_BYTE, "ObjectComponentSlot" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_APPEARANCE }; + } +}; + +struct ItemArmorQualityLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "QualityMod1" }, + { false, FT_FLOAT, "QualityMod2" }, + { false, FT_FLOAT, "QualityMod3" }, + { false, FT_FLOAT, "QualityMod4" }, + { false, FT_FLOAT, "QualityMod5" }, + { false, FT_FLOAT, "QualityMod6" }, + { false, FT_FLOAT, "QualityMod7" }, + { false, FT_SHORT, "ItemLevel" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemArmorQualityMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_QUALITY }; + } +}; + +struct ItemArmorShieldLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "Quality1" }, + { false, FT_FLOAT, "Quality2" }, + { false, FT_FLOAT, "Quality3" }, + { false, FT_FLOAT, "Quality4" }, + { false, FT_FLOAT, "Quality5" }, + { false, FT_FLOAT, "Quality6" }, + { false, FT_FLOAT, "Quality7" }, + { false, FT_SHORT, "ItemLevel" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemArmorShieldMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_SHIELD }; + } +}; + +struct ItemArmorTotalLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "Value1" }, + { false, FT_FLOAT, "Value2" }, + { false, FT_FLOAT, "Value3" }, + { false, FT_FLOAT, "Value4" }, + { false, FT_SHORT, "ItemLevel" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemArmorTotalMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_TOTAL }; + } +}; + +struct ItemBagFamilyLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemBagFamilyMeta::Instance(), HOTFIX_SEL_ITEM_BAG_FAMILY }; + } +}; + +struct ItemBonusLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { true, FT_INT, "Value1" }, + { true, FT_INT, "Value2" }, + { false, FT_SHORT, "BonusListID" }, + { false, FT_BYTE, "Type" }, + { false, FT_BYTE, "Index" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemBonusMeta::Instance(), HOTFIX_SEL_ITEM_BONUS }; + } +}; + +struct ItemBonusListLevelDeltaLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { true, FT_SHORT, "Delta" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemBonusListLevelDeltaMeta::Instance(), HOTFIX_SEL_ITEM_BONUS_LIST_LEVEL_DELTA }; + } +}; + +struct ItemBonusTreeNodeLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "BonusTreeID" }, + { false, FT_SHORT, "SubTreeID" }, + { false, FT_SHORT, "BonusListID" }, + { false, FT_BYTE, "BonusTreeModID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemBonusTreeNodeMeta::Instance(), HOTFIX_SEL_ITEM_BONUS_TREE_NODE }; + } +}; + +struct ItemChildEquipmentLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "ItemID" }, + { false, FT_INT, "AltItemID" }, + { false, FT_BYTE, "AltEquipmentSlot" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemChildEquipmentMeta::Instance(), HOTFIX_SEL_ITEM_CHILD_EQUIPMENT }; + } +}; + +struct ItemClassLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "PriceMod" }, + { false, FT_STRING, "Name" }, + { false, FT_BYTE, "Flags" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemClassMeta::Instance(), HOTFIX_SEL_ITEM_CLASS }; + } +}; + +struct ItemCurrencyCostLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "ItemId" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemCurrencyCostMeta::Instance(), HOTFIX_SEL_ITEM_CURRENCY_COST }; + } +}; + +struct ItemDamageAmmoLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "DPS1" }, + { false, FT_FLOAT, "DPS2" }, + { false, FT_FLOAT, "DPS3" }, + { false, FT_FLOAT, "DPS4" }, + { false, FT_FLOAT, "DPS5" }, + { false, FT_FLOAT, "DPS6" }, + { false, FT_FLOAT, "DPS7" }, + { false, FT_SHORT, "ItemLevel" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemDamageAmmoMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_AMMO }; + } +}; + +struct ItemDamageOneHandLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "DPS1" }, + { false, FT_FLOAT, "DPS2" }, + { false, FT_FLOAT, "DPS3" }, + { false, FT_FLOAT, "DPS4" }, + { false, FT_FLOAT, "DPS5" }, + { false, FT_FLOAT, "DPS6" }, + { false, FT_FLOAT, "DPS7" }, + { false, FT_SHORT, "ItemLevel" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemDamageOneHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND }; + } +}; + +struct ItemDamageOneHandCasterLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "DPS1" }, + { false, FT_FLOAT, "DPS2" }, + { false, FT_FLOAT, "DPS3" }, + { false, FT_FLOAT, "DPS4" }, + { false, FT_FLOAT, "DPS5" }, + { false, FT_FLOAT, "DPS6" }, + { false, FT_FLOAT, "DPS7" }, + { false, FT_SHORT, "ItemLevel" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemDamageOneHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER }; + } +}; + +struct ItemDamageTwoHandLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "DPS1" }, + { false, FT_FLOAT, "DPS2" }, + { false, FT_FLOAT, "DPS3" }, + { false, FT_FLOAT, "DPS4" }, + { false, FT_FLOAT, "DPS5" }, + { false, FT_FLOAT, "DPS6" }, + { false, FT_FLOAT, "DPS7" }, + { false, FT_SHORT, "ItemLevel" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemDamageTwoHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND }; + } +}; + +struct ItemDamageTwoHandCasterLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "DPS1" }, + { false, FT_FLOAT, "DPS2" }, + { false, FT_FLOAT, "DPS3" }, + { false, FT_FLOAT, "DPS4" }, + { false, FT_FLOAT, "DPS5" }, + { false, FT_FLOAT, "DPS6" }, + { false, FT_FLOAT, "DPS7" }, + { false, FT_SHORT, "ItemLevel" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemDamageTwoHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER }; + } +}; + +struct ItemDisenchantLootLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "MinItemLevel" }, + { false, FT_SHORT, "MaxItemLevel" }, + { false, FT_SHORT, "RequiredDisenchantSkill" }, + { false, FT_BYTE, "ItemClass" }, + { true, FT_BYTE, "ItemSubClass" }, + { false, FT_BYTE, "ItemQuality" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemDisenchantLootMeta::Instance(), HOTFIX_SEL_ITEM_DISENCHANT_LOOT }; + } +}; + +struct ItemEffectLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "ItemID" }, + { false, FT_INT, "SpellID" }, + { true, FT_INT, "Cooldown" }, + { true, FT_INT, "CategoryCooldown" }, + { true, FT_SHORT, "Charges" }, + { false, FT_SHORT, "Category" }, + { false, FT_SHORT, "ChrSpecializationID" }, + { false, FT_BYTE, "OrderIndex" }, + { false, FT_BYTE, "Trigger" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemEffectMeta::Instance(), HOTFIX_SEL_ITEM_EFFECT }; + } +}; + +struct ItemExtendedCostLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "RequiredItem1" }, + { false, FT_INT, "RequiredItem2" }, + { false, FT_INT, "RequiredItem3" }, + { false, FT_INT, "RequiredItem4" }, + { false, FT_INT, "RequiredItem5" }, + { false, FT_INT, "RequiredCurrencyCount1" }, + { false, FT_INT, "RequiredCurrencyCount2" }, + { false, FT_INT, "RequiredCurrencyCount3" }, + { false, FT_INT, "RequiredCurrencyCount4" }, + { false, FT_INT, "RequiredCurrencyCount5" }, + { false, FT_SHORT, "RequiredItemCount1" }, + { false, FT_SHORT, "RequiredItemCount2" }, + { false, FT_SHORT, "RequiredItemCount3" }, + { false, FT_SHORT, "RequiredItemCount4" }, + { false, FT_SHORT, "RequiredItemCount5" }, + { false, FT_SHORT, "RequiredPersonalArenaRating" }, + { false, FT_SHORT, "RequiredCurrency1" }, + { false, FT_SHORT, "RequiredCurrency2" }, + { false, FT_SHORT, "RequiredCurrency3" }, + { false, FT_SHORT, "RequiredCurrency4" }, + { false, FT_SHORT, "RequiredCurrency5" }, + { false, FT_BYTE, "RequiredArenaSlot" }, + { false, FT_BYTE, "RequiredFactionId" }, + { false, FT_BYTE, "RequiredFactionStanding" }, + { false, FT_BYTE, "RequirementFlags" }, + { false, FT_BYTE, "RequiredAchievement" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemExtendedCostMeta::Instance(), HOTFIX_SEL_ITEM_EXTENDED_COST }; + } +}; + +struct ItemLimitCategoryLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_BYTE, "Quantity" }, + { false, FT_BYTE, "Flags" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemLimitCategoryMeta::Instance(), HOTFIX_SEL_ITEM_LIMIT_CATEGORY }; + } +}; + +struct ItemModifiedAppearanceLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ItemID" }, + { false, FT_SHORT, "AppearanceID" }, + { false, FT_BYTE, "AppearanceModID" }, + { false, FT_BYTE, "Index" }, + { false, FT_BYTE, "SourceType" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemModifiedAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE }; + } +}; + +struct ItemPriceBaseLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "ArmorFactor" }, + { false, FT_FLOAT, "WeaponFactor" }, + { false, FT_SHORT, "ItemLevel" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemPriceBaseMeta::Instance(), HOTFIX_SEL_ITEM_PRICE_BASE }; + } +}; + +struct ItemRandomPropertiesLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_SHORT, "Enchantment1" }, + { false, FT_SHORT, "Enchantment2" }, + { false, FT_SHORT, "Enchantment3" }, + { false, FT_SHORT, "Enchantment4" }, + { false, FT_SHORT, "Enchantment5" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemRandomPropertiesMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_PROPERTIES }; + } +}; + +struct ItemRandomSuffixLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_SHORT, "Enchantment1" }, + { false, FT_SHORT, "Enchantment2" }, + { false, FT_SHORT, "Enchantment3" }, + { false, FT_SHORT, "Enchantment4" }, + { false, FT_SHORT, "Enchantment5" }, + { false, FT_SHORT, "AllocationPct1" }, + { false, FT_SHORT, "AllocationPct2" }, + { false, FT_SHORT, "AllocationPct3" }, + { false, FT_SHORT, "AllocationPct4" }, + { false, FT_SHORT, "AllocationPct5" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemRandomSuffixMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_SUFFIX }; + } +}; + +struct ItemSearchNameLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_INT, "Flags1" }, + { false, FT_INT, "Flags2" }, + { false, FT_INT, "Flags3" }, + { false, FT_INT, "AllowableRace" }, + { false, FT_INT, "RequiredSpell" }, + { false, FT_SHORT, "RequiredReputationFaction" }, + { false, FT_SHORT, "RequiredSkill" }, + { false, FT_SHORT, "RequiredSkillRank" }, + { false, FT_SHORT, "ItemLevel" }, + { false, FT_BYTE, "Quality" }, + { false, FT_BYTE, "RequiredExpansion" }, + { false, FT_BYTE, "RequiredReputationRank" }, + { false, FT_BYTE, "RequiredLevel" }, + { true, FT_INT, "AllowableClass" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemSearchNameMeta::Instance(), HOTFIX_SEL_ITEM_SEARCH_NAME }; + } +}; + +struct ItemSetLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_INT, "ItemID1" }, + { false, FT_INT, "ItemID2" }, + { false, FT_INT, "ItemID3" }, + { false, FT_INT, "ItemID4" }, + { false, FT_INT, "ItemID5" }, + { false, FT_INT, "ItemID6" }, + { false, FT_INT, "ItemID7" }, + { false, FT_INT, "ItemID8" }, + { false, FT_INT, "ItemID9" }, + { false, FT_INT, "ItemID10" }, + { false, FT_INT, "ItemID11" }, + { false, FT_INT, "ItemID12" }, + { false, FT_INT, "ItemID13" }, + { false, FT_INT, "ItemID14" }, + { false, FT_INT, "ItemID15" }, + { false, FT_INT, "ItemID16" }, + { false, FT_INT, "ItemID17" }, + { false, FT_SHORT, "RequiredSkillRank" }, + { false, FT_INT, "RequiredSkill" }, + { false, FT_INT, "Flags" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemSetMeta::Instance(), HOTFIX_SEL_ITEM_SET }; + } +}; + +struct ItemSetSpellLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_SHORT, "ItemSetID" }, + { false, FT_SHORT, "ChrSpecID" }, + { false, FT_BYTE, "Threshold" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemSetSpellMeta::Instance(), HOTFIX_SEL_ITEM_SET_SPELL }; + } +}; + +struct ItemSparseLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "Flags1" }, + { false, FT_INT, "Flags2" }, + { false, FT_INT, "Flags3" }, + { false, FT_FLOAT, "Unk1" }, + { false, FT_FLOAT, "Unk2" }, + { false, FT_INT, "BuyPrice" }, + { false, FT_INT, "SellPrice" }, + { true, FT_INT, "AllowableClass" }, + { true, FT_INT, "AllowableRace" }, + { false, FT_INT, "RequiredSpell" }, + { false, FT_INT, "MaxCount" }, + { false, FT_INT, "Stackable" }, + { true, FT_INT, "ItemStatAllocation1" }, + { true, FT_INT, "ItemStatAllocation2" }, + { true, FT_INT, "ItemStatAllocation3" }, + { true, FT_INT, "ItemStatAllocation4" }, + { true, FT_INT, "ItemStatAllocation5" }, + { true, FT_INT, "ItemStatAllocation6" }, + { true, FT_INT, "ItemStatAllocation7" }, + { true, FT_INT, "ItemStatAllocation8" }, + { true, FT_INT, "ItemStatAllocation9" }, + { true, FT_INT, "ItemStatAllocation10" }, + { false, FT_FLOAT, "ItemStatSocketCostMultiplier1" }, + { false, FT_FLOAT, "ItemStatSocketCostMultiplier2" }, + { false, FT_FLOAT, "ItemStatSocketCostMultiplier3" }, + { false, FT_FLOAT, "ItemStatSocketCostMultiplier4" }, + { false, FT_FLOAT, "ItemStatSocketCostMultiplier5" }, + { false, FT_FLOAT, "ItemStatSocketCostMultiplier6" }, + { false, FT_FLOAT, "ItemStatSocketCostMultiplier7" }, + { false, FT_FLOAT, "ItemStatSocketCostMultiplier8" }, + { false, FT_FLOAT, "ItemStatSocketCostMultiplier9" }, + { false, FT_FLOAT, "ItemStatSocketCostMultiplier10" }, + { false, FT_FLOAT, "RangedModRange" }, + { false, FT_STRING, "Name" }, + { false, FT_STRING, "Name2" }, + { false, FT_STRING, "Name3" }, + { false, FT_STRING, "Name4" }, + { false, FT_STRING, "Description" }, + { false, FT_INT, "BagFamily" }, + { false, FT_FLOAT, "ArmorDamageModifier" }, + { false, FT_INT, "Duration" }, + { false, FT_FLOAT, "StatScalingFactor" }, + { false, FT_SHORT, "ItemLevel" }, + { false, FT_SHORT, "RequiredSkill" }, + { false, FT_SHORT, "RequiredSkillRank" }, + { false, FT_SHORT, "RequiredReputationFaction" }, + { true, FT_SHORT, "ItemStatValue1" }, + { true, FT_SHORT, "ItemStatValue2" }, + { true, FT_SHORT, "ItemStatValue3" }, + { true, FT_SHORT, "ItemStatValue4" }, + { true, FT_SHORT, "ItemStatValue5" }, + { true, FT_SHORT, "ItemStatValue6" }, + { true, FT_SHORT, "ItemStatValue7" }, + { true, FT_SHORT, "ItemStatValue8" }, + { true, FT_SHORT, "ItemStatValue9" }, + { true, FT_SHORT, "ItemStatValue10" }, + { false, FT_SHORT, "ScalingStatDistribution" }, + { false, FT_SHORT, "Delay" }, + { false, FT_SHORT, "PageText" }, + { false, FT_SHORT, "StartQuest" }, + { false, FT_SHORT, "LockID" }, + { false, FT_SHORT, "RandomProperty" }, + { false, FT_SHORT, "RandomSuffix" }, + { false, FT_SHORT, "ItemSet" }, + { false, FT_SHORT, "Area" }, + { false, FT_SHORT, "Map" }, + { false, FT_SHORT, "SocketBonus" }, + { false, FT_SHORT, "GemProperties" }, + { false, FT_SHORT, "ItemLimitCategory" }, + { false, FT_SHORT, "HolidayID" }, + { false, FT_SHORT, "ItemNameDescriptionID" }, + { false, FT_BYTE, "Quality" }, + { false, FT_BYTE, "BuyCount" }, + { false, FT_BYTE, "InventoryType" }, + { true, FT_BYTE, "RequiredLevel" }, + { false, FT_BYTE, "RequiredHonorRank" }, + { false, FT_BYTE, "RequiredCityRank" }, + { false, FT_BYTE, "RequiredReputationRank" }, + { false, FT_BYTE, "ContainerSlots" }, + { true, FT_BYTE, "ItemStatType1" }, + { true, FT_BYTE, "ItemStatType2" }, + { true, FT_BYTE, "ItemStatType3" }, + { true, FT_BYTE, "ItemStatType4" }, + { true, FT_BYTE, "ItemStatType5" }, + { true, FT_BYTE, "ItemStatType6" }, + { true, FT_BYTE, "ItemStatType7" }, + { true, FT_BYTE, "ItemStatType8" }, + { true, FT_BYTE, "ItemStatType9" }, + { true, FT_BYTE, "ItemStatType10" }, + { false, FT_BYTE, "DamageType" }, + { false, FT_BYTE, "Bonding" }, + { false, FT_BYTE, "LanguageID" }, + { false, FT_BYTE, "PageMaterial" }, + { true, FT_BYTE, "Material" }, + { false, FT_BYTE, "Sheath" }, + { false, FT_BYTE, "TotemCategory" }, + { false, FT_BYTE, "SocketColor1" }, + { false, FT_BYTE, "SocketColor2" }, + { false, FT_BYTE, "SocketColor3" }, + { false, FT_BYTE, "CurrencySubstitutionID" }, + { false, FT_BYTE, "CurrencySubstitutionCount" }, + { false, FT_BYTE, "ArtifactID" }, + { false, FT_BYTE, "RequiredExpansion" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemSparseMeta::Instance(), HOTFIX_SEL_ITEM_SPARSE }; + } +}; + +struct ItemSpecLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "SpecID" }, + { false, FT_BYTE, "MinLevel" }, + { false, FT_BYTE, "MaxLevel" }, + { false, FT_BYTE, "ItemType" }, + { false, FT_BYTE, "PrimaryStat" }, + { false, FT_BYTE, "SecondaryStat" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemSpecMeta::Instance(), HOTFIX_SEL_ITEM_SPEC }; + } +}; + +struct ItemSpecOverrideLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "ItemID" }, + { false, FT_SHORT, "SpecID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemSpecOverrideMeta::Instance(), HOTFIX_SEL_ITEM_SPEC_OVERRIDE }; + } +}; + +struct ItemUpgradeLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "CurrencyCost" }, + { false, FT_SHORT, "PrevItemUpgradeID" }, + { false, FT_SHORT, "CurrencyID" }, + { false, FT_BYTE, "ItemUpgradePathID" }, + { false, FT_BYTE, "ItemLevelBonus" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemUpgradeMeta::Instance(), HOTFIX_SEL_ITEM_UPGRADE }; + } +}; + +struct ItemXBonusTreeLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "ItemID" }, + { false, FT_SHORT, "BonusTreeID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ItemXBonusTreeMeta::Instance(), HOTFIX_SEL_ITEM_X_BONUS_TREE }; + } +}; + +struct KeyChainLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_BYTE, "Key1" }, + { false, FT_BYTE, "Key2" }, + { false, FT_BYTE, "Key3" }, + { false, FT_BYTE, "Key4" }, + { false, FT_BYTE, "Key5" }, + { false, FT_BYTE, "Key6" }, + { false, FT_BYTE, "Key7" }, + { false, FT_BYTE, "Key8" }, + { false, FT_BYTE, "Key9" }, + { false, FT_BYTE, "Key10" }, + { false, FT_BYTE, "Key11" }, + { false, FT_BYTE, "Key12" }, + { false, FT_BYTE, "Key13" }, + { false, FT_BYTE, "Key14" }, + { false, FT_BYTE, "Key15" }, + { false, FT_BYTE, "Key16" }, + { false, FT_BYTE, "Key17" }, + { false, FT_BYTE, "Key18" }, + { false, FT_BYTE, "Key19" }, + { false, FT_BYTE, "Key20" }, + { false, FT_BYTE, "Key21" }, + { false, FT_BYTE, "Key22" }, + { false, FT_BYTE, "Key23" }, + { false, FT_BYTE, "Key24" }, + { false, FT_BYTE, "Key25" }, + { false, FT_BYTE, "Key26" }, + { false, FT_BYTE, "Key27" }, + { false, FT_BYTE, "Key28" }, + { false, FT_BYTE, "Key29" }, + { false, FT_BYTE, "Key30" }, + { false, FT_BYTE, "Key31" }, + { false, FT_BYTE, "Key32" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, KeyChainMeta::Instance(), HOTFIX_SEL_KEY_CHAIN }; + } +}; + +struct LfgDungeonsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_STRING, "Name" }, + { false, FT_INT, "Flags" }, + { false, FT_STRING_NOT_LOCALIZED, "TextureFilename" }, + { false, FT_STRING, "Description" }, + { false, FT_INT, "PlayerConditionID" }, + { false, FT_SHORT, "MaxLevel" }, + { false, FT_SHORT, "TargetLevelMax" }, + { true, FT_SHORT, "MapID" }, + { false, FT_SHORT, "RandomID" }, + { false, FT_SHORT, "ScenarioID" }, + { false, FT_SHORT, "LastBossJournalEncounterID" }, + { false, FT_SHORT, "BonusReputationAmount" }, + { false, FT_SHORT, "MentorItemLevel" }, + { false, FT_BYTE, "MinLevel" }, + { false, FT_BYTE, "TargetLevel" }, + { false, FT_BYTE, "TargetLevelMin" }, + { false, FT_BYTE, "DifficultyID" }, + { false, FT_BYTE, "Type" }, + { false, FT_BYTE, "Faction" }, + { false, FT_BYTE, "Expansion" }, + { false, FT_BYTE, "OrderIndex" }, + { false, FT_BYTE, "GroupID" }, + { false, FT_BYTE, "CountTank" }, + { false, FT_BYTE, "CountHealer" }, + { false, FT_BYTE, "CountDamage" }, + { false, FT_BYTE, "MinCountTank" }, + { false, FT_BYTE, "MinCountHealer" }, + { false, FT_BYTE, "MinCountDamage" }, + { false, FT_BYTE, "SubType" }, + { false, FT_BYTE, "MentorCharLevel" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, LfgDungeonsMeta::Instance(), HOTFIX_SEL_LFG_DUNGEONS }; + } +}; + +struct LightLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "PosX" }, + { false, FT_FLOAT, "PosY" }, + { false, FT_FLOAT, "PosZ" }, + { false, FT_FLOAT, "FalloffStart" }, + { false, FT_FLOAT, "FalloffEnd" }, + { false, FT_SHORT, "MapID" }, + { false, FT_SHORT, "LightParamsID1" }, + { false, FT_SHORT, "LightParamsID2" }, + { false, FT_SHORT, "LightParamsID3" }, + { false, FT_SHORT, "LightParamsID4" }, + { false, FT_SHORT, "LightParamsID5" }, + { false, FT_SHORT, "LightParamsID6" }, + { false, FT_SHORT, "LightParamsID7" }, + { false, FT_SHORT, "LightParamsID8" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, LightMeta::Instance(), HOTFIX_SEL_LIGHT }; + } +}; + +struct LiquidTypeLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_INT, "SpellID" }, + { false, FT_FLOAT, "MaxDarkenDepth" }, + { false, FT_FLOAT, "FogDarkenIntensity" }, + { false, FT_FLOAT, "AmbDarkenIntensity" }, + { false, FT_FLOAT, "DirDarkenIntensity" }, + { false, FT_FLOAT, "ParticleScale" }, + { false, FT_STRING_NOT_LOCALIZED, "Texture1" }, + { false, FT_STRING_NOT_LOCALIZED, "Texture2" }, + { false, FT_STRING_NOT_LOCALIZED, "Texture3" }, + { false, FT_STRING_NOT_LOCALIZED, "Texture4" }, + { false, FT_STRING_NOT_LOCALIZED, "Texture5" }, + { false, FT_STRING_NOT_LOCALIZED, "Texture6" }, + { false, FT_INT, "Color1" }, + { false, FT_INT, "Color2" }, + { false, FT_FLOAT, "Float1" }, + { false, FT_FLOAT, "Float2" }, + { false, FT_FLOAT, "Float3" }, + { false, FT_FLOAT, "Float4" }, + { false, FT_FLOAT, "Float5" }, + { false, FT_FLOAT, "Float6" }, + { false, FT_FLOAT, "Float7" }, + { false, FT_FLOAT, "Float8" }, + { false, FT_FLOAT, "Float9" }, + { false, FT_FLOAT, "Float10" }, + { false, FT_FLOAT, "Float11" }, + { false, FT_FLOAT, "Float12" }, + { false, FT_FLOAT, "Float13" }, + { false, FT_FLOAT, "Float14" }, + { false, FT_FLOAT, "Float15" }, + { false, FT_FLOAT, "Float16" }, + { false, FT_FLOAT, "Float17" }, + { false, FT_FLOAT, "Float18" }, + { false, FT_INT, "Int1" }, + { false, FT_INT, "Int2" }, + { false, FT_INT, "Int3" }, + { false, FT_INT, "Int4" }, + { false, FT_SHORT, "Flags" }, + { false, FT_SHORT, "LightID" }, + { false, FT_BYTE, "Type" }, + { false, FT_BYTE, "ParticleMovement" }, + { false, FT_BYTE, "ParticleTexSlots" }, + { false, FT_BYTE, "MaterialID" }, + { false, FT_BYTE, "DepthTexCount1" }, + { false, FT_BYTE, "DepthTexCount2" }, + { false, FT_BYTE, "DepthTexCount3" }, + { false, FT_BYTE, "DepthTexCount4" }, + { false, FT_BYTE, "DepthTexCount5" }, + { false, FT_BYTE, "DepthTexCount6" }, + { false, FT_INT, "SoundID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, LiquidTypeMeta::Instance(), HOTFIX_SEL_LIQUID_TYPE }; + } +}; + +struct LockLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "Index1" }, + { false, FT_INT, "Index2" }, + { false, FT_INT, "Index3" }, + { false, FT_INT, "Index4" }, + { false, FT_INT, "Index5" }, + { false, FT_INT, "Index6" }, + { false, FT_INT, "Index7" }, + { false, FT_INT, "Index8" }, + { false, FT_SHORT, "Skill1" }, + { false, FT_SHORT, "Skill2" }, + { false, FT_SHORT, "Skill3" }, + { false, FT_SHORT, "Skill4" }, + { false, FT_SHORT, "Skill5" }, + { false, FT_SHORT, "Skill6" }, + { false, FT_SHORT, "Skill7" }, + { false, FT_SHORT, "Skill8" }, + { false, FT_BYTE, "Type1" }, + { false, FT_BYTE, "Type2" }, + { false, FT_BYTE, "Type3" }, + { false, FT_BYTE, "Type4" }, + { false, FT_BYTE, "Type5" }, + { false, FT_BYTE, "Type6" }, + { false, FT_BYTE, "Type7" }, + { false, FT_BYTE, "Type8" }, + { false, FT_BYTE, "Action1" }, + { false, FT_BYTE, "Action2" }, + { false, FT_BYTE, "Action3" }, + { false, FT_BYTE, "Action4" }, + { false, FT_BYTE, "Action5" }, + { false, FT_BYTE, "Action6" }, + { false, FT_BYTE, "Action7" }, + { false, FT_BYTE, "Action8" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, LockMeta::Instance(), HOTFIX_SEL_LOCK }; + } +}; + +struct MailTemplateLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Body" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, MailTemplateMeta::Instance(), HOTFIX_SEL_MAIL_TEMPLATE }; + } +}; + +struct MapLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING_NOT_LOCALIZED, "Directory" }, + { false, FT_INT, "Flags1" }, + { false, FT_INT, "Flags2" }, + { false, FT_FLOAT, "MinimapIconScale" }, + { false, FT_FLOAT, "CorpsePosX" }, + { false, FT_FLOAT, "CorpsePosY" }, + { false, FT_STRING, "MapName" }, + { false, FT_STRING, "MapDescription0" }, + { false, FT_STRING, "MapDescription1" }, + { false, FT_SHORT, "AreaTableID" }, + { false, FT_SHORT, "LoadingScreenID" }, + { true, FT_SHORT, "CorpseMapID" }, + { false, FT_SHORT, "TimeOfDayOverride" }, + { true, FT_SHORT, "ParentMapID" }, + { true, FT_SHORT, "CosmeticParentMapID" }, + { false, FT_SHORT, "WindSettingsID" }, + { false, FT_BYTE, "InstanceType" }, + { false, FT_BYTE, "unk5" }, + { false, FT_BYTE, "ExpansionID" }, + { false, FT_BYTE, "MaxPlayers" }, + { false, FT_BYTE, "TimeOffset" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, MapMeta::Instance(), HOTFIX_SEL_MAP }; + } +}; + +struct MapDifficultyLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Message" }, + { false, FT_SHORT, "MapID" }, + { false, FT_BYTE, "DifficultyID" }, + { false, FT_BYTE, "RaidDurationType" }, + { false, FT_BYTE, "MaxPlayers" }, + { false, FT_BYTE, "LockID" }, + { false, FT_BYTE, "ItemBonusTreeModID" }, + { false, FT_INT, "Context" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, MapDifficultyMeta::Instance(), HOTFIX_SEL_MAP_DIFFICULTY }; + } +}; + +struct ModifierTreeLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "Asset1" }, + { false, FT_INT, "Asset2" }, + { false, FT_SHORT, "Parent" }, + { false, FT_BYTE, "Type" }, + { false, FT_BYTE, "Unk700" }, + { false, FT_BYTE, "Operator" }, + { false, FT_BYTE, "Amount" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ModifierTreeMeta::Instance(), HOTFIX_SEL_MODIFIER_TREE }; + } +}; + +struct MountLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "SpellId" }, + { false, FT_INT, "DisplayId" }, + { false, FT_STRING, "Name" }, + { false, FT_STRING, "Description" }, + { false, FT_STRING, "SourceDescription" }, + { false, FT_FLOAT, "CameraPivotMultiplier" }, + { false, FT_SHORT, "MountTypeId" }, + { false, FT_SHORT, "Flags" }, + { false, FT_SHORT, "PlayerConditionId" }, + { false, FT_BYTE, "Source" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, MountMeta::Instance(), HOTFIX_SEL_MOUNT }; + } +}; + +struct MountCapabilityLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "RequiredSpell" }, + { false, FT_INT, "SpeedModSpell" }, + { false, FT_SHORT, "RequiredRidingSkill" }, + { false, FT_SHORT, "RequiredArea" }, + { true, FT_SHORT, "RequiredMap" }, + { false, FT_BYTE, "Flags" }, + { false, FT_INT, "ID" }, + { false, FT_INT, "RequiredAura" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, MountCapabilityMeta::Instance(), HOTFIX_SEL_MOUNT_CAPABILITY }; + } +}; + +struct MountTypeXCapabilityLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "MountTypeID" }, + { false, FT_SHORT, "MountCapabilityID" }, + { false, FT_BYTE, "OrderIndex" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, MountTypeXCapabilityMeta::Instance(), HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY }; + } +}; + +struct MovieLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "AudioFileDataID" }, + { false, FT_INT, "SubtitleFileDataID" }, + { false, FT_BYTE, "Volume" }, + { false, FT_BYTE, "KeyID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, MovieMeta::Instance(), HOTFIX_SEL_MOVIE }; + } +}; + +struct NameGenLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_BYTE, "Race" }, + { false, FT_BYTE, "Sex" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, NameGenMeta::Instance(), HOTFIX_SEL_NAME_GEN }; + } +}; + +struct NamesProfanityLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING_NOT_LOCALIZED, "Name" }, + { true, FT_BYTE, "Language" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, NamesProfanityMeta::Instance(), HOTFIX_SEL_NAMES_PROFANITY }; + } +}; + +struct NamesReservedLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING_NOT_LOCALIZED, "Name" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, NamesReservedMeta::Instance(), HOTFIX_SEL_NAMES_RESERVED }; + } +}; + +struct NamesReservedLocaleLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING_NOT_LOCALIZED, "Name" }, + { false, FT_BYTE, "LocaleMask" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, NamesReservedLocaleMeta::Instance(), HOTFIX_SEL_NAMES_RESERVED }; + } +}; + +struct OverrideSpellDataLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID1" }, + { false, FT_INT, "SpellID2" }, + { false, FT_INT, "SpellID3" }, + { false, FT_INT, "SpellID4" }, + { false, FT_INT, "SpellID5" }, + { false, FT_INT, "SpellID6" }, + { false, FT_INT, "SpellID7" }, + { false, FT_INT, "SpellID8" }, + { false, FT_INT, "SpellID9" }, + { false, FT_INT, "SpellID10" }, + { false, FT_INT, "PlayerActionbarFileDataID" }, + { false, FT_BYTE, "Flags" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, OverrideSpellDataMeta::Instance(), HOTFIX_SEL_OVERRIDE_SPELL_DATA }; + } +}; + +struct PhaseLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "Flags" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, PhaseMeta::Instance(), HOTFIX_SEL_PHASE }; + } +}; + +struct PhaseXPhaseGroupLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "PhaseID" }, + { false, FT_SHORT, "PhaseGroupID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, PhaseXPhaseGroupMeta::Instance(), HOTFIX_SEL_PHASE_X_PHASE_GROUP }; + } +}; + +struct PlayerConditionLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "RaceMask" }, + { false, FT_INT, "SkillLogic" }, + { false, FT_INT, "ReputationLogic" }, + { false, FT_INT, "PrevQuestLogic" }, + { false, FT_INT, "CurrQuestLogic" }, + { false, FT_INT, "CurrentCompletedQuestLogic" }, + { false, FT_INT, "SpellLogic" }, + { false, FT_INT, "ItemLogic" }, + { false, FT_INT, "Time1" }, + { false, FT_INT, "Time2" }, + { false, FT_INT, "AuraSpellLogic" }, + { false, FT_INT, "AuraSpellID1" }, + { false, FT_INT, "AuraSpellID2" }, + { false, FT_INT, "AuraSpellID3" }, + { false, FT_INT, "AuraSpellID4" }, + { false, FT_INT, "AchievementLogic" }, + { false, FT_INT, "AreaLogic" }, + { false, FT_INT, "QuestKillLogic" }, + { false, FT_STRING, "FailureDescription" }, + { false, FT_SHORT, "MinLevel" }, + { false, FT_SHORT, "MaxLevel" }, + { false, FT_SHORT, "SkillID1" }, + { false, FT_SHORT, "SkillID2" }, + { false, FT_SHORT, "SkillID3" }, + { false, FT_SHORT, "SkillID4" }, + { true, FT_SHORT, "MinSkill1" }, + { true, FT_SHORT, "MinSkill2" }, + { true, FT_SHORT, "MinSkill3" }, + { true, FT_SHORT, "MinSkill4" }, + { true, FT_SHORT, "MaxSkill1" }, + { true, FT_SHORT, "MaxSkill2" }, + { true, FT_SHORT, "MaxSkill3" }, + { true, FT_SHORT, "MaxSkill4" }, + { false, FT_SHORT, "MaxFactionID" }, + { false, FT_SHORT, "PrevQuestID1" }, + { false, FT_SHORT, "PrevQuestID2" }, + { false, FT_SHORT, "PrevQuestID3" }, + { false, FT_SHORT, "PrevQuestID4" }, + { false, FT_SHORT, "CurrQuestID1" }, + { false, FT_SHORT, "CurrQuestID2" }, + { false, FT_SHORT, "CurrQuestID3" }, + { false, FT_SHORT, "CurrQuestID4" }, + { false, FT_SHORT, "CurrentCompletedQuestID1" }, + { false, FT_SHORT, "CurrentCompletedQuestID2" }, + { false, FT_SHORT, "CurrentCompletedQuestID3" }, + { false, FT_SHORT, "CurrentCompletedQuestID4" }, + { false, FT_SHORT, "Explored1" }, + { false, FT_SHORT, "Explored2" }, + { false, FT_SHORT, "WorldStateExpressionID" }, + { false, FT_SHORT, "Achievement1" }, + { false, FT_SHORT, "Achievement2" }, + { false, FT_SHORT, "Achievement3" }, + { false, FT_SHORT, "Achievement4" }, + { false, FT_SHORT, "AreaID1" }, + { false, FT_SHORT, "AreaID2" }, + { false, FT_SHORT, "AreaID3" }, + { false, FT_SHORT, "AreaID4" }, + { false, FT_SHORT, "QuestKillID" }, + { false, FT_SHORT, "PhaseID" }, + { false, FT_SHORT, "MinAvgEquippedItemLevel" }, + { false, FT_SHORT, "MaxAvgEquippedItemLevel" }, + { false, FT_SHORT, "ModifierTreeID" }, + { false, FT_BYTE, "Flags" }, + { true, FT_BYTE, "Gender" }, + { true, FT_BYTE, "NativeGender" }, + { false, FT_BYTE, "MinLanguage" }, + { false, FT_BYTE, "MaxLanguage" }, + { false, FT_BYTE, "MinReputation1" }, + { false, FT_BYTE, "MinReputation2" }, + { false, FT_BYTE, "MinReputation3" }, + { false, FT_BYTE, "MaxReputation" }, + { false, FT_BYTE, "Unknown1" }, + { false, FT_BYTE, "MinPVPRank" }, + { false, FT_BYTE, "MaxPVPRank" }, + { false, FT_BYTE, "PvpMedal" }, + { false, FT_BYTE, "ItemFlags" }, + { false, FT_BYTE, "AuraCount1" }, + { false, FT_BYTE, "AuraCount2" }, + { false, FT_BYTE, "AuraCount3" }, + { false, FT_BYTE, "AuraCount4" }, + { false, FT_BYTE, "WeatherID" }, + { false, FT_BYTE, "PartyStatus" }, + { false, FT_BYTE, "LifetimeMaxPVPRank" }, + { false, FT_BYTE, "LfgStatus1" }, + { false, FT_BYTE, "LfgStatus2" }, + { false, FT_BYTE, "LfgStatus3" }, + { false, FT_BYTE, "LfgStatus4" }, + { false, FT_BYTE, "LfgCompare1" }, + { false, FT_BYTE, "LfgCompare2" }, + { false, FT_BYTE, "LfgCompare3" }, + { false, FT_BYTE, "LfgCompare4" }, + { false, FT_BYTE, "CurrencyCount1" }, + { false, FT_BYTE, "CurrencyCount2" }, + { false, FT_BYTE, "CurrencyCount3" }, + { false, FT_BYTE, "CurrencyCount4" }, + { true, FT_BYTE, "MinExpansionLevel" }, + { true, FT_BYTE, "MaxExpansionLevel" }, + { true, FT_BYTE, "MinExpansionTier" }, + { true, FT_BYTE, "MaxExpansionTier" }, + { false, FT_BYTE, "MinGuildLevel" }, + { false, FT_BYTE, "MaxGuildLevel" }, + { false, FT_BYTE, "PhaseUseFlags" }, + { true, FT_BYTE, "ChrSpecializationIndex" }, + { true, FT_BYTE, "ChrSpecializationRole" }, + { true, FT_BYTE, "PowerType" }, + { true, FT_BYTE, "PowerTypeComp" }, + { true, FT_BYTE, "PowerTypeValue" }, + { true, FT_INT, "ClassMask" }, + { false, FT_INT, "LanguageID" }, + { false, FT_INT, "MinFactionID1" }, + { false, FT_INT, "MinFactionID2" }, + { false, FT_INT, "MinFactionID3" }, + { false, FT_INT, "SpellID1" }, + { false, FT_INT, "SpellID2" }, + { false, FT_INT, "SpellID3" }, + { false, FT_INT, "SpellID4" }, + { false, FT_INT, "ItemID1" }, + { false, FT_INT, "ItemID2" }, + { false, FT_INT, "ItemID3" }, + { false, FT_INT, "ItemID4" }, + { false, FT_INT, "ItemCount1" }, + { false, FT_INT, "ItemCount2" }, + { false, FT_INT, "ItemCount3" }, + { false, FT_INT, "ItemCount4" }, + { false, FT_INT, "LfgLogic" }, + { false, FT_INT, "LfgValue1" }, + { false, FT_INT, "LfgValue2" }, + { false, FT_INT, "LfgValue3" }, + { false, FT_INT, "LfgValue4" }, + { false, FT_INT, "CurrencyLogic" }, + { false, FT_INT, "CurrencyID1" }, + { false, FT_INT, "CurrencyID2" }, + { false, FT_INT, "CurrencyID3" }, + { false, FT_INT, "CurrencyID4" }, + { false, FT_INT, "QuestKillMonster1" }, + { false, FT_INT, "QuestKillMonster2" }, + { false, FT_INT, "QuestKillMonster3" }, + { false, FT_INT, "QuestKillMonster4" }, + { false, FT_INT, "QuestKillMonster5" }, + { false, FT_INT, "QuestKillMonster6" }, + { false, FT_INT, "PhaseGroupID" }, + { false, FT_INT, "MinAvgItemLevel" }, + { false, FT_INT, "MaxAvgItemLevel" }, + { true, FT_INT, "Unknown7001" }, + { true, FT_INT, "Unknown7002" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, PlayerConditionMeta::Instance(), HOTFIX_SEL_PLAYER_CONDITION }; + } +}; + +struct PowerDisplayLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING_NOT_LOCALIZED, "GlobalStringBaseTag" }, + { false, FT_BYTE, "PowerType" }, + { false, FT_BYTE, "Red" }, + { false, FT_BYTE, "Green" }, + { false, FT_BYTE, "Blue" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, PowerDisplayMeta::Instance(), HOTFIX_SEL_POWER_DISPLAY }; + } +}; + +struct PowerTypeLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING_NOT_LOCALIZED, "PowerTypeToken" }, + { false, FT_STRING_NOT_LOCALIZED, "PowerCostToken" }, + { false, FT_FLOAT, "RegenerationPeace" }, + { false, FT_FLOAT, "RegenerationCombat" }, + { true, FT_SHORT, "MaxPower" }, + { false, FT_SHORT, "RegenerationDelay" }, + { false, FT_SHORT, "Flags" }, + { false, FT_BYTE, "PowerTypeEnum" }, + { true, FT_BYTE, "RegenerationMin" }, + { true, FT_BYTE, "RegenerationCenter" }, + { true, FT_BYTE, "RegenerationMax" }, + { false, FT_BYTE, "UIModifier" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, PowerTypeMeta::Instance(), HOTFIX_SEL_POWER_TYPE }; + } +}; + +struct PvpDifficultyLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "MapID" }, + { false, FT_BYTE, "BracketID" }, + { false, FT_BYTE, "MinLevel" }, + { false, FT_BYTE, "MaxLevel" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, PvpDifficultyMeta::Instance(), HOTFIX_SEL_PVP_DIFFICULTY }; + } +}; + +struct QuestFactionRewardLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { true, FT_SHORT, "QuestRewFactionValue1" }, + { true, FT_SHORT, "QuestRewFactionValue2" }, + { true, FT_SHORT, "QuestRewFactionValue3" }, + { true, FT_SHORT, "QuestRewFactionValue4" }, + { true, FT_SHORT, "QuestRewFactionValue5" }, + { true, FT_SHORT, "QuestRewFactionValue6" }, + { true, FT_SHORT, "QuestRewFactionValue7" }, + { true, FT_SHORT, "QuestRewFactionValue8" }, + { true, FT_SHORT, "QuestRewFactionValue9" }, + { true, FT_SHORT, "QuestRewFactionValue10" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, QuestFactionRewardMeta::Instance(), HOTFIX_SEL_QUEST_FACTION_REWARD }; + } +}; + +struct QuestMoneyRewardLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "Money1" }, + { false, FT_INT, "Money2" }, + { false, FT_INT, "Money3" }, + { false, FT_INT, "Money4" }, + { false, FT_INT, "Money5" }, + { false, FT_INT, "Money6" }, + { false, FT_INT, "Money7" }, + { false, FT_INT, "Money8" }, + { false, FT_INT, "Money9" }, + { false, FT_INT, "Money10" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, QuestMoneyRewardMeta::Instance(), HOTFIX_SEL_QUEST_MONEY_REWARD }; + } +}; + +struct QuestPackageItemLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "ItemID" }, + { false, FT_SHORT, "QuestPackageID" }, + { false, FT_BYTE, "ItemCount" }, + { false, FT_BYTE, "FilterType" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, QuestPackageItemMeta::Instance(), HOTFIX_SEL_QUEST_PACKAGE_ITEM }; + } +}; + +struct QuestSortLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "SortName" }, + { false, FT_BYTE, "SortOrder" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, QuestSortMeta::Instance(), HOTFIX_SEL_QUEST_SORT }; + } +}; + +struct QuestV2LoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "UniqueBitFlag" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, QuestV2Meta::Instance(), HOTFIX_SEL_QUEST_V2 }; + } +}; + +struct QuestXpLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "Exp1" }, + { false, FT_SHORT, "Exp2" }, + { false, FT_SHORT, "Exp3" }, + { false, FT_SHORT, "Exp4" }, + { false, FT_SHORT, "Exp5" }, + { false, FT_SHORT, "Exp6" }, + { false, FT_SHORT, "Exp7" }, + { false, FT_SHORT, "Exp8" }, + { false, FT_SHORT, "Exp9" }, + { false, FT_SHORT, "Exp10" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, QuestXPMeta::Instance(), HOTFIX_SEL_QUEST_XP }; + } +}; + +struct RandPropPointsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "EpicPropertiesPoints1" }, + { false, FT_INT, "EpicPropertiesPoints2" }, + { false, FT_INT, "EpicPropertiesPoints3" }, + { false, FT_INT, "EpicPropertiesPoints4" }, + { false, FT_INT, "EpicPropertiesPoints5" }, + { false, FT_INT, "RarePropertiesPoints1" }, + { false, FT_INT, "RarePropertiesPoints2" }, + { false, FT_INT, "RarePropertiesPoints3" }, + { false, FT_INT, "RarePropertiesPoints4" }, + { false, FT_INT, "RarePropertiesPoints5" }, + { false, FT_INT, "UncommonPropertiesPoints1" }, + { false, FT_INT, "UncommonPropertiesPoints2" }, + { false, FT_INT, "UncommonPropertiesPoints3" }, + { false, FT_INT, "UncommonPropertiesPoints4" }, + { false, FT_INT, "UncommonPropertiesPoints5" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, RandPropPointsMeta::Instance(), HOTFIX_SEL_RAND_PROP_POINTS }; + } +}; + +struct RulesetItemUpgradeLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "ItemID" }, + { false, FT_SHORT, "ItemUpgradeID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, RulesetItemUpgradeMeta::Instance(), HOTFIX_SEL_RULESET_ITEM_UPGRADE }; + } +}; + +struct ScalingStatDistributionLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "ItemLevelCurveID" }, + { false, FT_INT, "MinLevel" }, + { false, FT_INT, "MaxLevel" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ScalingStatDistributionMeta::Instance(), HOTFIX_SEL_SCALING_STAT_DISTRIBUTION }; + } +}; + +struct SceneScriptLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING_NOT_LOCALIZED, "Name" }, + { false, FT_STRING_NOT_LOCALIZED, "Script" }, + { false, FT_SHORT, "PrevScriptId" }, + { false, FT_SHORT, "NextScriptId" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SceneScriptMeta::Instance(), HOTFIX_SEL_SCENE_SCRIPT }; + } +}; + +struct SceneScriptPackageLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING_NOT_LOCALIZED, "Name" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SceneScriptPackageMeta::Instance(), HOTFIX_SEL_SCENE_SCRIPT_PACKAGE }; + } +}; + +struct SkillLineLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "DisplayName" }, + { false, FT_STRING, "Description" }, + { false, FT_STRING, "AlternateVerb" }, + { false, FT_SHORT, "SpellIconID" }, + { false, FT_SHORT, "Flags" }, + { false, FT_BYTE, "CategoryID" }, + { false, FT_BYTE, "CanLink" }, + { false, FT_INT, "ParentSkillLineID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SkillLineMeta::Instance(), HOTFIX_SEL_SKILL_LINE }; + } +}; + +struct SkillLineAbilityLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_INT, "RaceMask" }, + { false, FT_INT, "SupercedesSpell" }, + { false, FT_INT, "Unknown703" }, + { false, FT_SHORT, "SkillLine" }, + { false, FT_SHORT, "MinSkillLineRank" }, + { false, FT_SHORT, "TrivialSkillLineRankHigh" }, + { false, FT_SHORT, "TrivialSkillLineRankLow" }, + { false, FT_SHORT, "UniqueBit" }, + { false, FT_SHORT, "TradeSkillCategoryID" }, + { false, FT_BYTE, "AcquireMethod" }, + { false, FT_BYTE, "NumSkillUps" }, + { true, FT_INT, "ClassMask" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SkillLineAbilityMeta::Instance(), HOTFIX_SEL_SKILL_LINE_ABILITY }; + } +}; + +struct SkillRaceClassInfoLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { true, FT_INT, "RaceMask" }, + { false, FT_SHORT, "SkillID" }, + { false, FT_SHORT, "Flags" }, + { false, FT_SHORT, "SkillTierID" }, + { false, FT_BYTE, "Availability" }, + { false, FT_BYTE, "MinLevel" }, + { true, FT_INT, "ClassMask" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SkillRaceClassInfoMeta::Instance(), HOTFIX_SEL_SKILL_RACE_CLASS_INFO }; + } +}; + +struct SoundKitLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_STRING, "Name" }, + { false, FT_FLOAT, "VolumeFloat" }, + { false, FT_FLOAT, "MinDistance" }, + { false, FT_FLOAT, "DistanceCutoff" }, + { false, FT_FLOAT, "VolumeVariationPlus" }, + { false, FT_FLOAT, "VolumeVariationMinus" }, + { false, FT_FLOAT, "PitchVariationPlus" }, + { false, FT_FLOAT, "PitchVariationMinus" }, + { false, FT_FLOAT, "PitchAdjust" }, + { false, FT_SHORT, "Flags" }, + { false, FT_SHORT, "SoundEntriesAdvancedID" }, + { false, FT_SHORT, "BusOverwriteID" }, + { false, FT_BYTE, "SoundType" }, + { false, FT_BYTE, "EAXDef" }, + { false, FT_BYTE, "DialogType" }, + { false, FT_BYTE, "Unk700" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SoundKitMeta::Instance(), HOTFIX_SEL_SOUND_KIT }; + } +}; + +struct SpecializationSpellsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "SpellID" }, + { false, FT_INT, "OverridesSpellID" }, + { false, FT_STRING, "Description" }, + { false, FT_SHORT, "SpecID" }, + { false, FT_BYTE, "OrderIndex" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpecializationSpellsMeta::Instance(), HOTFIX_SEL_SPECIALIZATION_SPELLS }; + } +}; + +struct SpellLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_STRING, "Name" }, + { false, FT_STRING, "NameSubtext" }, + { false, FT_STRING, "Description" }, + { false, FT_STRING, "AuraDescription" }, + { false, FT_INT, "MiscID" }, + { false, FT_INT, "ID" }, + { false, FT_INT, "DescriptionVariablesID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellMeta::Instance(), HOTFIX_SEL_SPELL }; + } +}; + +struct SpellAuraOptionsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_INT, "ProcCharges" }, + { false, FT_INT, "ProcTypeMask" }, + { false, FT_INT, "ProcCategoryRecovery" }, + { false, FT_SHORT, "CumulativeAura" }, + { false, FT_BYTE, "DifficultyID" }, + { false, FT_BYTE, "ProcChance" }, + { false, FT_BYTE, "SpellProcsPerMinuteID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellAuraOptionsMeta::Instance(), HOTFIX_SEL_SPELL_AURA_OPTIONS }; + } +}; + +struct SpellAuraRestrictionsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_INT, "CasterAuraSpell" }, + { false, FT_INT, "TargetAuraSpell" }, + { false, FT_INT, "ExcludeCasterAuraSpell" }, + { false, FT_INT, "ExcludeTargetAuraSpell" }, + { false, FT_BYTE, "DifficultyID" }, + { false, FT_BYTE, "CasterAuraState" }, + { false, FT_BYTE, "TargetAuraState" }, + { false, FT_BYTE, "ExcludeCasterAuraState" }, + { false, FT_BYTE, "ExcludeTargetAuraState" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellAuraRestrictionsMeta::Instance(), HOTFIX_SEL_SPELL_AURA_RESTRICTIONS }; + } +}; + +struct SpellCastTimesLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { true, FT_INT, "CastTime" }, + { true, FT_INT, "MinCastTime" }, + { true, FT_SHORT, "CastTimePerLevel" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellCastTimesMeta::Instance(), HOTFIX_SEL_SPELL_CAST_TIMES }; + } +}; + +struct SpellCastingRequirementsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_SHORT, "MinFactionID" }, + { false, FT_SHORT, "RequiredAreasID" }, + { false, FT_SHORT, "RequiresSpellFocus" }, + { false, FT_BYTE, "FacingCasterFlags" }, + { false, FT_BYTE, "MinReputation" }, + { false, FT_BYTE, "RequiredAuraVision" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellCastingRequirementsMeta::Instance(), HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS }; + } +}; + +struct SpellCategoriesLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_SHORT, "Category" }, + { false, FT_SHORT, "StartRecoveryCategory" }, + { false, FT_SHORT, "ChargeCategory" }, + { false, FT_BYTE, "DifficultyID" }, + { false, FT_BYTE, "DefenseType" }, + { false, FT_BYTE, "DispelType" }, + { false, FT_BYTE, "Mechanic" }, + { false, FT_BYTE, "PreventionType" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellCategoriesMeta::Instance(), HOTFIX_SEL_SPELL_CATEGORIES }; + } +}; + +struct SpellCategoryLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { true, FT_INT, "ChargeRecoveryTime" }, + { false, FT_BYTE, "Flags" }, + { false, FT_BYTE, "UsesPerWeek" }, + { false, FT_BYTE, "MaxCharges" }, + { false, FT_INT, "ChargeCategoryType" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellCategoryMeta::Instance(), HOTFIX_SEL_SPELL_CATEGORY }; + } +}; + +struct SpellClassOptionsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_INT, "SpellClassMask1" }, + { false, FT_INT, "SpellClassMask2" }, + { false, FT_INT, "SpellClassMask3" }, + { false, FT_INT, "SpellClassMask4" }, + { false, FT_BYTE, "SpellClassSet" }, + { false, FT_INT, "ModalNextSpell" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellClassOptionsMeta::Instance(), HOTFIX_SEL_SPELL_CLASS_OPTIONS }; + } +}; + +struct SpellCooldownsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_INT, "CategoryRecoveryTime" }, + { false, FT_INT, "RecoveryTime" }, + { false, FT_INT, "StartRecoveryTime" }, + { false, FT_BYTE, "DifficultyID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellCooldownsMeta::Instance(), HOTFIX_SEL_SPELL_COOLDOWNS }; + } +}; + +struct SpellDurationLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { true, FT_INT, "Duration" }, + { true, FT_INT, "MaxDuration" }, + { true, FT_SHORT, "DurationPerLevel" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellDurationMeta::Instance(), HOTFIX_SEL_SPELL_DURATION }; + } +}; + +struct SpellEffectLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_FLOAT, "EffectAmplitude" }, + { false, FT_FLOAT, "EffectBonusCoefficient" }, + { false, FT_FLOAT, "EffectChainAmplitude" }, + { false, FT_FLOAT, "EffectPointsPerResource" }, + { false, FT_FLOAT, "EffectRealPointsPerLevel" }, + { false, FT_INT, "EffectSpellClassMask1" }, + { false, FT_INT, "EffectSpellClassMask2" }, + { false, FT_INT, "EffectSpellClassMask3" }, + { false, FT_INT, "EffectSpellClassMask4" }, + { false, FT_FLOAT, "EffectPosFacing" }, + { false, FT_FLOAT, "BonusCoefficientFromAP" }, + { false, FT_INT, "ID" }, + { false, FT_INT, "DifficultyID" }, + { false, FT_INT, "Effect" }, + { false, FT_INT, "EffectAura" }, + { false, FT_INT, "EffectAuraPeriod" }, + { true, FT_INT, "EffectBasePoints" }, + { false, FT_INT, "EffectChainTargets" }, + { true, FT_INT, "EffectDieSides" }, + { false, FT_INT, "EffectItemType" }, + { false, FT_INT, "EffectMechanic" }, + { true, FT_INT, "EffectMiscValue" }, + { true, FT_INT, "EffectMiscValueB" }, + { false, FT_INT, "EffectRadiusIndex" }, + { false, FT_INT, "EffectRadiusMaxIndex" }, + { false, FT_INT, "EffectTriggerSpell" }, + { false, FT_INT, "ImplicitTarget1" }, + { false, FT_INT, "ImplicitTarget2" }, + { false, FT_INT, "SpellID" }, + { false, FT_INT, "EffectIndex" }, + { false, FT_INT, "EffectAttributes" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellEffectMeta::Instance(), HOTFIX_SEL_SPELL_EFFECT }; + } +}; + +struct SpellEffectScalingLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "Coefficient" }, + { false, FT_FLOAT, "Variance" }, + { false, FT_FLOAT, "ResourceCoefficient" }, + { false, FT_INT, "SpellEffectID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellEffectScalingMeta::Instance(), HOTFIX_SEL_SPELL_EFFECT_SCALING }; + } +}; + +struct SpellEquippedItemsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { true, FT_INT, "EquippedItemInventoryTypeMask" }, + { true, FT_INT, "EquippedItemSubClassMask" }, + { true, FT_BYTE, "EquippedItemClass" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellEquippedItemsMeta::Instance(), HOTFIX_SEL_SPELL_EQUIPPED_ITEMS }; + } +}; + +struct SpellFocusObjectLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellFocusObjectMeta::Instance(), HOTFIX_SEL_SPELL_FOCUS_OBJECT }; + } +}; + +struct SpellInterruptsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_INT, "AuraInterruptFlags1" }, + { false, FT_INT, "AuraInterruptFlags2" }, + { false, FT_INT, "ChannelInterruptFlags1" }, + { false, FT_INT, "ChannelInterruptFlags2" }, + { false, FT_SHORT, "InterruptFlags" }, + { false, FT_BYTE, "DifficultyID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellInterruptsMeta::Instance(), HOTFIX_SEL_SPELL_INTERRUPTS }; + } +}; + +struct SpellItemEnchantmentLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "EffectSpellID1" }, + { false, FT_INT, "EffectSpellID2" }, + { false, FT_INT, "EffectSpellID3" }, + { false, FT_STRING, "Name" }, + { false, FT_FLOAT, "EffectScalingPoints1" }, + { false, FT_FLOAT, "EffectScalingPoints2" }, + { false, FT_FLOAT, "EffectScalingPoints3" }, + { false, FT_INT, "TransmogCost" }, + { false, FT_INT, "TextureFileDataID" }, + { false, FT_SHORT, "EffectPointsMin1" }, + { false, FT_SHORT, "EffectPointsMin2" }, + { false, FT_SHORT, "EffectPointsMin3" }, + { false, FT_SHORT, "ItemVisual" }, + { false, FT_SHORT, "Flags" }, + { false, FT_SHORT, "RequiredSkillID" }, + { false, FT_SHORT, "RequiredSkillRank" }, + { false, FT_SHORT, "ItemLevel" }, + { false, FT_BYTE, "Charges" }, + { false, FT_BYTE, "Effect1" }, + { false, FT_BYTE, "Effect2" }, + { false, FT_BYTE, "Effect3" }, + { false, FT_BYTE, "ConditionID" }, + { false, FT_BYTE, "MinLevel" }, + { false, FT_BYTE, "MaxLevel" }, + { true, FT_BYTE, "ScalingClass" }, + { true, FT_BYTE, "ScalingClassRestricted" }, + { false, FT_INT, "PlayerConditionID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellItemEnchantmentMeta::Instance(), HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT }; + } +}; + +struct SpellItemEnchantmentConditionLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_BYTE, "LTOperandType1" }, + { false, FT_BYTE, "LTOperandType2" }, + { false, FT_BYTE, "LTOperandType3" }, + { false, FT_BYTE, "LTOperandType4" }, + { false, FT_BYTE, "LTOperandType5" }, + { false, FT_BYTE, "Operator1" }, + { false, FT_BYTE, "Operator2" }, + { false, FT_BYTE, "Operator3" }, + { false, FT_BYTE, "Operator4" }, + { false, FT_BYTE, "Operator5" }, + { false, FT_BYTE, "RTOperandType1" }, + { false, FT_BYTE, "RTOperandType2" }, + { false, FT_BYTE, "RTOperandType3" }, + { false, FT_BYTE, "RTOperandType4" }, + { false, FT_BYTE, "RTOperandType5" }, + { false, FT_BYTE, "RTOperand1" }, + { false, FT_BYTE, "RTOperand2" }, + { false, FT_BYTE, "RTOperand3" }, + { false, FT_BYTE, "RTOperand4" }, + { false, FT_BYTE, "RTOperand5" }, + { false, FT_BYTE, "Logic1" }, + { false, FT_BYTE, "Logic2" }, + { false, FT_BYTE, "Logic3" }, + { false, FT_BYTE, "Logic4" }, + { false, FT_BYTE, "Logic5" }, + { false, FT_INT, "LTOperand1" }, + { false, FT_INT, "LTOperand2" }, + { false, FT_INT, "LTOperand3" }, + { false, FT_INT, "LTOperand4" }, + { false, FT_INT, "LTOperand5" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellItemEnchantmentConditionMeta::Instance(), HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION }; + } +}; + +struct SpellLearnSpellLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "LearnSpellID" }, + { false, FT_INT, "SpellID" }, + { false, FT_INT, "OverridesSpellID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellLearnSpellMeta::Instance(), HOTFIX_SEL_SPELL_LEARN_SPELL }; + } +}; + +struct SpellLevelsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_SHORT, "BaseLevel" }, + { false, FT_SHORT, "MaxLevel" }, + { false, FT_SHORT, "SpellLevel" }, + { false, FT_BYTE, "DifficultyID" }, + { false, FT_BYTE, "MaxUsableLevel" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellLevelsMeta::Instance(), HOTFIX_SEL_SPELL_LEVELS }; + } +}; + +struct SpellMiscLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "Attributes" }, + { false, FT_INT, "AttributesEx" }, + { false, FT_INT, "AttributesExB" }, + { false, FT_INT, "AttributesExC" }, + { false, FT_INT, "AttributesExD" }, + { false, FT_INT, "AttributesExE" }, + { false, FT_INT, "AttributesExF" }, + { false, FT_INT, "AttributesExG" }, + { false, FT_INT, "AttributesExH" }, + { false, FT_INT, "AttributesExI" }, + { false, FT_INT, "AttributesExJ" }, + { false, FT_INT, "AttributesExK" }, + { false, FT_INT, "AttributesExL" }, + { false, FT_INT, "AttributesExM" }, + { false, FT_FLOAT, "Speed" }, + { false, FT_FLOAT, "MultistrikeSpeedMod" }, + { false, FT_SHORT, "CastingTimeIndex" }, + { false, FT_SHORT, "DurationIndex" }, + { false, FT_SHORT, "RangeIndex" }, + { false, FT_SHORT, "SpellIconID" }, + { false, FT_SHORT, "ActiveIconID" }, + { false, FT_BYTE, "SchoolMask" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellMiscMeta::Instance(), HOTFIX_SEL_SPELL_MISC }; + } +}; + +struct SpellPowerLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "SpellID" }, + { false, FT_INT, "ManaCost" }, + { false, FT_FLOAT, "ManaCostPercentage" }, + { false, FT_FLOAT, "ManaCostPercentagePerSecond" }, + { false, FT_INT, "RequiredAura" }, + { false, FT_FLOAT, "HealthCostPercentage" }, + { false, FT_BYTE, "PowerIndex" }, + { false, FT_BYTE, "PowerType" }, + { false, FT_INT, "ID" }, + { true, FT_INT, "ManaCostPerLevel" }, + { true, FT_INT, "ManaCostPerSecond" }, + { false, FT_INT, "ManaCostAdditional" }, + { false, FT_INT, "PowerDisplayID" }, + { false, FT_INT, "UnitPowerBarID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellPowerMeta::Instance(), HOTFIX_SEL_SPELL_POWER }; + } +}; + +struct SpellPowerDifficultyLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_BYTE, "DifficultyID" }, + { false, FT_BYTE, "PowerIndex" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellPowerDifficultyMeta::Instance(), HOTFIX_SEL_SPELL_POWER_DIFFICULTY }; + } +}; + +struct SpellProcsPerMinuteLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "BaseProcRate" }, + { false, FT_BYTE, "Flags" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellProcsPerMinuteMeta::Instance(), HOTFIX_SEL_SPELL_PROCS_PER_MINUTE }; + } +}; + +struct SpellProcsPerMinuteModLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "Coeff" }, + { false, FT_SHORT, "Param" }, + { false, FT_BYTE, "Type" }, + { false, FT_BYTE, "SpellProcsPerMinuteID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellProcsPerMinuteModMeta::Instance(), HOTFIX_SEL_SPELL_PROCS_PER_MINUTE_MOD }; + } +}; + +struct SpellRadiusLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "Radius" }, + { false, FT_FLOAT, "RadiusPerLevel" }, + { false, FT_FLOAT, "RadiusMin" }, + { false, FT_FLOAT, "RadiusMax" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellRadiusMeta::Instance(), HOTFIX_SEL_SPELL_RADIUS }; + } +}; + +struct SpellRangeLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "MinRangeHostile" }, + { false, FT_FLOAT, "MinRangeFriend" }, + { false, FT_FLOAT, "MaxRangeHostile" }, + { false, FT_FLOAT, "MaxRangeFriend" }, + { false, FT_STRING, "DisplayName" }, + { false, FT_STRING, "DisplayNameShort" }, + { false, FT_BYTE, "Flags" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellRangeMeta::Instance(), HOTFIX_SEL_SPELL_RANGE }; + } +}; + +struct SpellReagentsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { true, FT_INT, "Reagent1" }, + { true, FT_INT, "Reagent2" }, + { true, FT_INT, "Reagent3" }, + { true, FT_INT, "Reagent4" }, + { true, FT_INT, "Reagent5" }, + { true, FT_INT, "Reagent6" }, + { true, FT_INT, "Reagent7" }, + { true, FT_INT, "Reagent8" }, + { false, FT_SHORT, "ReagentCount1" }, + { false, FT_SHORT, "ReagentCount2" }, + { false, FT_SHORT, "ReagentCount3" }, + { false, FT_SHORT, "ReagentCount4" }, + { false, FT_SHORT, "ReagentCount5" }, + { false, FT_SHORT, "ReagentCount6" }, + { false, FT_SHORT, "ReagentCount7" }, + { false, FT_SHORT, "ReagentCount8" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellReagentsMeta::Instance(), HOTFIX_SEL_SPELL_REAGENTS }; + } +}; + +struct SpellScalingLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_SHORT, "ScalesFromItemLevel" }, + { true, FT_INT, "ScalingClass" }, + { false, FT_INT, "MinScalingLevel" }, + { false, FT_INT, "MaxScalingLevel" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellScalingMeta::Instance(), HOTFIX_SEL_SPELL_SCALING }; + } +}; + +struct SpellShapeshiftLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_INT, "ShapeshiftExclude1" }, + { false, FT_INT, "ShapeshiftExclude2" }, + { false, FT_INT, "ShapeshiftMask1" }, + { false, FT_INT, "ShapeshiftMask2" }, + { false, FT_BYTE, "StanceBarOrder" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellShapeshiftMeta::Instance(), HOTFIX_SEL_SPELL_SHAPESHIFT }; + } +}; + +struct SpellShapeshiftFormLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_FLOAT, "WeaponDamageVariance" }, + { false, FT_INT, "Flags" }, + { false, FT_SHORT, "AttackIconID" }, + { false, FT_SHORT, "CombatRoundTime" }, + { false, FT_SHORT, "CreatureDisplayID1" }, + { false, FT_SHORT, "CreatureDisplayID2" }, + { false, FT_SHORT, "CreatureDisplayID3" }, + { false, FT_SHORT, "CreatureDisplayID4" }, + { false, FT_SHORT, "PresetSpellID1" }, + { false, FT_SHORT, "PresetSpellID2" }, + { false, FT_SHORT, "PresetSpellID3" }, + { false, FT_SHORT, "PresetSpellID4" }, + { false, FT_SHORT, "PresetSpellID5" }, + { false, FT_SHORT, "PresetSpellID6" }, + { false, FT_SHORT, "PresetSpellID7" }, + { false, FT_SHORT, "PresetSpellID8" }, + { false, FT_SHORT, "MountTypeID" }, + { true, FT_BYTE, "CreatureType" }, + { false, FT_BYTE, "BonusActionBar" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellShapeshiftFormMeta::Instance(), HOTFIX_SEL_SPELL_SHAPESHIFT_FORM }; + } +}; + +struct SpellTargetRestrictionsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_FLOAT, "ConeAngle" }, + { false, FT_FLOAT, "Width" }, + { false, FT_INT, "Targets" }, + { false, FT_SHORT, "TargetCreatureType" }, + { false, FT_BYTE, "DifficultyID" }, + { false, FT_BYTE, "MaxAffectedTargets" }, + { false, FT_INT, "MaxTargetLevel" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellTargetRestrictionsMeta::Instance(), HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS }; + } +}; + +struct SpellTotemsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_INT, "Totem1" }, + { false, FT_INT, "Totem2" }, + { false, FT_SHORT, "RequiredTotemCategoryID1" }, + { false, FT_SHORT, "RequiredTotemCategoryID2" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellTotemsMeta::Instance(), HOTFIX_SEL_SPELL_TOTEMS }; + } +}; + +struct SpellXSpellVisualLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "SpellID" }, + { false, FT_FLOAT, "Unk620" }, + { false, FT_SHORT, "SpellVisualID1" }, + { false, FT_SHORT, "SpellVisualID2" }, + { false, FT_SHORT, "PlayerConditionID" }, + { false, FT_BYTE, "DifficultyID" }, + { false, FT_BYTE, "Flags" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SpellXSpellVisualMeta::Instance(), HOTFIX_SEL_SPELL_X_SPELL_VISUAL }; + } +}; + +struct SummonPropertiesLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "Flags" }, + { false, FT_INT, "Category" }, + { false, FT_INT, "Faction" }, + { true, FT_INT, "Type" }, + { true, FT_INT, "Slot" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, SummonPropertiesMeta::Instance(), HOTFIX_SEL_SUMMON_PROPERTIES }; + } +}; + +struct TactKeyLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_BYTE, "Key1" }, + { false, FT_BYTE, "Key2" }, + { false, FT_BYTE, "Key3" }, + { false, FT_BYTE, "Key4" }, + { false, FT_BYTE, "Key5" }, + { false, FT_BYTE, "Key6" }, + { false, FT_BYTE, "Key7" }, + { false, FT_BYTE, "Key8" }, + { false, FT_BYTE, "Key9" }, + { false, FT_BYTE, "Key10" }, + { false, FT_BYTE, "Key11" }, + { false, FT_BYTE, "Key12" }, + { false, FT_BYTE, "Key13" }, + { false, FT_BYTE, "Key14" }, + { false, FT_BYTE, "Key15" }, + { false, FT_BYTE, "Key16" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, TactKeyMeta::Instance(), HOTFIX_SEL_TACT_KEY }; + } +}; + +struct TalentLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "SpellID" }, + { false, FT_INT, "OverridesSpellID" }, + { false, FT_STRING, "Description" }, + { false, FT_SHORT, "SpecID" }, + { false, FT_BYTE, "TierID" }, + { false, FT_BYTE, "ColumnIndex" }, + { false, FT_BYTE, "Flags" }, + { false, FT_BYTE, "CategoryMask1" }, + { false, FT_BYTE, "CategoryMask2" }, + { false, FT_BYTE, "ClassID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, TalentMeta::Instance(), HOTFIX_SEL_TALENT }; + } +}; + +struct TaxiNodesLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_FLOAT, "PosX" }, + { false, FT_FLOAT, "PosY" }, + { false, FT_FLOAT, "PosZ" }, + { false, FT_STRING, "Name" }, + { false, FT_INT, "MountCreatureID1" }, + { false, FT_INT, "MountCreatureID2" }, + { false, FT_FLOAT, "MapOffsetX" }, + { false, FT_FLOAT, "MapOffsetY" }, + { false, FT_SHORT, "MapID" }, + { false, FT_SHORT, "ConditionID" }, + { false, FT_SHORT, "LearnableIndex" }, + { false, FT_BYTE, "Flags" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, TaxiNodesMeta::Instance(), HOTFIX_SEL_TAXI_NODES }; + } +}; + +struct TaxiPathLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_SHORT, "From" }, + { false, FT_SHORT, "To" }, + { false, FT_INT, "ID" }, + { false, FT_INT, "Cost" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, TaxiPathMeta::Instance(), HOTFIX_SEL_TAXI_PATH }; + } +}; + +struct TaxiPathNodeLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_FLOAT, "LocX" }, + { false, FT_FLOAT, "LocY" }, + { false, FT_FLOAT, "LocZ" }, + { false, FT_INT, "Delay" }, + { false, FT_SHORT, "PathID" }, + { false, FT_SHORT, "MapID" }, + { false, FT_SHORT, "ArrivalEventID" }, + { false, FT_SHORT, "DepartureEventID" }, + { false, FT_BYTE, "NodeIndex" }, + { false, FT_BYTE, "Flags" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, TaxiPathNodeMeta::Instance(), HOTFIX_SEL_TAXI_PATH_NODE }; + } +}; + +struct TotemCategoryLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING, "Name" }, + { false, FT_INT, "CategoryMask" }, + { false, FT_BYTE, "CategoryType" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, TotemCategoryMeta::Instance(), HOTFIX_SEL_TOTEM_CATEGORY }; + } +}; + +struct ToyLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ItemID" }, + { false, FT_STRING, "Description" }, + { false, FT_BYTE, "Flags" }, + { false, FT_BYTE, "CategoryFilter" }, + { false, FT_INT, "ID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, ToyMeta::Instance(), HOTFIX_SEL_TOY }; + } +}; + +struct TransportAnimationLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "TransportID" }, + { false, FT_INT, "TimeIndex" }, + { false, FT_FLOAT, "PosX" }, + { false, FT_FLOAT, "PosY" }, + { false, FT_FLOAT, "PosZ" }, + { false, FT_BYTE, "SequenceID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, TransportAnimationMeta::Instance(), HOTFIX_SEL_TRANSPORT_ANIMATION }; + } +}; + +struct TransportRotationLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "TransportID" }, + { false, FT_INT, "TimeIndex" }, + { false, FT_FLOAT, "X" }, + { false, FT_FLOAT, "Y" }, + { false, FT_FLOAT, "Z" }, + { false, FT_FLOAT, "W" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, TransportRotationMeta::Instance(), HOTFIX_SEL_TRANSPORT_ROTATION }; + } +}; + +struct UnitPowerBarLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "RegenerationPeace" }, + { false, FT_FLOAT, "RegenerationCombat" }, + { false, FT_INT, "FileDataID1" }, + { false, FT_INT, "FileDataID2" }, + { false, FT_INT, "FileDataID3" }, + { false, FT_INT, "FileDataID4" }, + { false, FT_INT, "FileDataID5" }, + { false, FT_INT, "FileDataID6" }, + { false, FT_INT, "Color1" }, + { false, FT_INT, "Color2" }, + { false, FT_INT, "Color3" }, + { false, FT_INT, "Color4" }, + { false, FT_INT, "Color5" }, + { false, FT_INT, "Color6" }, + { false, FT_STRING, "Name" }, + { false, FT_STRING, "Cost" }, + { false, FT_STRING, "OutOfError" }, + { false, FT_STRING, "ToolTip" }, + { false, FT_FLOAT, "StartInset" }, + { false, FT_FLOAT, "EndInset" }, + { false, FT_SHORT, "StartPower" }, + { false, FT_SHORT, "Flags" }, + { false, FT_BYTE, "CenterPower" }, + { false, FT_BYTE, "BarType" }, + { false, FT_INT, "MinPower" }, + { false, FT_INT, "MaxPower" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, UnitPowerBarMeta::Instance(), HOTFIX_SEL_UNIT_POWER_BAR }; + } +}; + +struct VehicleLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "Flags" }, + { false, FT_FLOAT, "TurnSpeed" }, + { false, FT_FLOAT, "PitchSpeed" }, + { false, FT_FLOAT, "PitchMin" }, + { false, FT_FLOAT, "PitchMax" }, + { false, FT_FLOAT, "MouseLookOffsetPitch" }, + { false, FT_FLOAT, "CameraFadeDistScalarMin" }, + { false, FT_FLOAT, "CameraFadeDistScalarMax" }, + { false, FT_FLOAT, "CameraPitchOffset" }, + { false, FT_FLOAT, "FacingLimitRight" }, + { false, FT_FLOAT, "FacingLimitLeft" }, + { false, FT_FLOAT, "MsslTrgtTurnLingering" }, + { false, FT_FLOAT, "MsslTrgtPitchLingering" }, + { false, FT_FLOAT, "MsslTrgtMouseLingering" }, + { false, FT_FLOAT, "MsslTrgtEndOpacity" }, + { false, FT_FLOAT, "MsslTrgtArcSpeed" }, + { false, FT_FLOAT, "MsslTrgtArcRepeat" }, + { false, FT_FLOAT, "MsslTrgtArcWidth" }, + { false, FT_FLOAT, "MsslTrgtImpactRadius1" }, + { false, FT_FLOAT, "MsslTrgtImpactRadius2" }, + { false, FT_STRING_NOT_LOCALIZED, "MsslTrgtArcTexture" }, + { false, FT_STRING_NOT_LOCALIZED, "MsslTrgtImpactTexture" }, + { false, FT_STRING_NOT_LOCALIZED, "MsslTrgtImpactModel1" }, + { false, FT_STRING_NOT_LOCALIZED, "MsslTrgtImpactModel2" }, + { false, FT_FLOAT, "CameraYawOffset" }, + { false, FT_FLOAT, "MsslTrgtImpactTexRadius" }, + { false, FT_SHORT, "SeatID1" }, + { false, FT_SHORT, "SeatID2" }, + { false, FT_SHORT, "SeatID3" }, + { false, FT_SHORT, "SeatID4" }, + { false, FT_SHORT, "SeatID5" }, + { false, FT_SHORT, "SeatID6" }, + { false, FT_SHORT, "SeatID7" }, + { false, FT_SHORT, "SeatID8" }, + { false, FT_SHORT, "VehicleUIIndicatorID" }, + { false, FT_SHORT, "PowerDisplayID1" }, + { false, FT_SHORT, "PowerDisplayID2" }, + { false, FT_SHORT, "PowerDisplayID3" }, + { false, FT_BYTE, "FlagsB" }, + { false, FT_BYTE, "UILocomotionType" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, VehicleMeta::Instance(), HOTFIX_SEL_VEHICLE }; + } +}; + +struct VehicleSeatLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_INT, "Flags1" }, + { false, FT_INT, "Flags2" }, + { false, FT_INT, "Flags3" }, + { false, FT_FLOAT, "AttachmentOffsetX" }, + { false, FT_FLOAT, "AttachmentOffsetY" }, + { false, FT_FLOAT, "AttachmentOffsetZ" }, + { false, FT_FLOAT, "EnterPreDelay" }, + { false, FT_FLOAT, "EnterSpeed" }, + { false, FT_FLOAT, "EnterGravity" }, + { false, FT_FLOAT, "EnterMinDuration" }, + { false, FT_FLOAT, "EnterMaxDuration" }, + { false, FT_FLOAT, "EnterMinArcHeight" }, + { false, FT_FLOAT, "EnterMaxArcHeight" }, + { false, FT_FLOAT, "ExitPreDelay" }, + { false, FT_FLOAT, "ExitSpeed" }, + { false, FT_FLOAT, "ExitGravity" }, + { false, FT_FLOAT, "ExitMinDuration" }, + { false, FT_FLOAT, "ExitMaxDuration" }, + { false, FT_FLOAT, "ExitMinArcHeight" }, + { false, FT_FLOAT, "ExitMaxArcHeight" }, + { false, FT_FLOAT, "PassengerYaw" }, + { false, FT_FLOAT, "PassengerPitch" }, + { false, FT_FLOAT, "PassengerRoll" }, + { false, FT_FLOAT, "VehicleEnterAnimDelay" }, + { false, FT_FLOAT, "VehicleExitAnimDelay" }, + { false, FT_FLOAT, "CameraEnteringDelay" }, + { false, FT_FLOAT, "CameraEnteringDuration" }, + { false, FT_FLOAT, "CameraExitingDelay" }, + { false, FT_FLOAT, "CameraExitingDuration" }, + { false, FT_FLOAT, "CameraOffsetX" }, + { false, FT_FLOAT, "CameraOffsetY" }, + { false, FT_FLOAT, "CameraOffsetZ" }, + { false, FT_FLOAT, "CameraPosChaseRate" }, + { false, FT_FLOAT, "CameraFacingChaseRate" }, + { false, FT_FLOAT, "CameraEnteringZoom" }, + { false, FT_FLOAT, "CameraSeatZoomMin" }, + { false, FT_FLOAT, "CameraSeatZoomMax" }, + { false, FT_INT, "UISkinFileDataID" }, + { true, FT_SHORT, "EnterAnimStart" }, + { true, FT_SHORT, "EnterAnimLoop" }, + { true, FT_SHORT, "RideAnimStart" }, + { true, FT_SHORT, "RideAnimLoop" }, + { true, FT_SHORT, "RideUpperAnimStart" }, + { true, FT_SHORT, "RideUpperAnimLoop" }, + { true, FT_SHORT, "ExitAnimStart" }, + { true, FT_SHORT, "ExitAnimLoop" }, + { true, FT_SHORT, "ExitAnimEnd" }, + { true, FT_SHORT, "VehicleEnterAnim" }, + { true, FT_SHORT, "VehicleExitAnim" }, + { true, FT_SHORT, "VehicleRideAnimLoop" }, + { false, FT_SHORT, "EnterAnimKitID" }, + { false, FT_SHORT, "RideAnimKitID" }, + { false, FT_SHORT, "ExitAnimKitID" }, + { false, FT_SHORT, "VehicleEnterAnimKitID" }, + { false, FT_SHORT, "VehicleRideAnimKitID" }, + { false, FT_SHORT, "VehicleExitAnimKitID" }, + { false, FT_SHORT, "CameraModeID" }, + { true, FT_BYTE, "AttachmentID" }, + { true, FT_BYTE, "PassengerAttachmentID" }, + { true, FT_BYTE, "VehicleEnterAnimBone" }, + { true, FT_BYTE, "VehicleExitAnimBone" }, + { true, FT_BYTE, "VehicleRideAnimLoopBone" }, + { false, FT_BYTE, "VehicleAbilityDisplay" }, + { false, FT_INT, "EnterUISoundID" }, + { false, FT_INT, "ExitUISoundID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, VehicleSeatMeta::Instance(), HOTFIX_SEL_VEHICLE_SEAT }; + } +}; + +struct WmoAreaTableLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { true, FT_INT, "WMOGroupID" }, + { false, FT_STRING, "AreaName" }, + { true, FT_SHORT, "WMOID" }, + { false, FT_SHORT, "AmbienceID" }, + { false, FT_SHORT, "ZoneMusic" }, + { false, FT_SHORT, "IntroSound" }, + { false, FT_SHORT, "AreaTableID" }, + { false, FT_SHORT, "UWIntroSound" }, + { false, FT_SHORT, "UWAmbience" }, + { true, FT_BYTE, "NameSet" }, + { false, FT_BYTE, "SoundProviderPref" }, + { false, FT_BYTE, "SoundProviderPrefUnderwater" }, + { false, FT_BYTE, "Flags" }, + { false, FT_INT, "ID" }, + { false, FT_INT, "UWZoneMusic" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, WMOAreaTableMeta::Instance(), HOTFIX_SEL_WMO_AREA_TABLE }; + } +}; + +struct WorldMapAreaLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_STRING_NOT_LOCALIZED, "AreaName" }, + { false, FT_FLOAT, "LocLeft" }, + { false, FT_FLOAT, "LocRight" }, + { false, FT_FLOAT, "LocTop" }, + { false, FT_FLOAT, "LocBottom" }, + { false, FT_SHORT, "MapID" }, + { false, FT_SHORT, "AreaID" }, + { true, FT_SHORT, "DisplayMapID" }, + { true, FT_SHORT, "DefaultDungeonFloor" }, + { false, FT_SHORT, "ParentWorldMapID" }, + { false, FT_SHORT, "Flags" }, + { false, FT_BYTE, "LevelRangeMin" }, + { false, FT_BYTE, "LevelRangeMax" }, + { false, FT_BYTE, "BountySetID" }, + { false, FT_BYTE, "BountyBoardLocation" }, + { false, FT_INT, "ID" }, + { false, FT_INT, "PlayerConditionID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, WorldMapAreaMeta::Instance(), HOTFIX_SEL_WORLD_MAP_AREA }; + } +}; + +struct WorldMapOverlayLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_STRING_NOT_LOCALIZED, "TextureName" }, + { false, FT_SHORT, "TextureWidth" }, + { false, FT_SHORT, "TextureHeight" }, + { false, FT_INT, "MapAreaID" }, + { false, FT_INT, "AreaID1" }, + { false, FT_INT, "AreaID2" }, + { false, FT_INT, "AreaID3" }, + { false, FT_INT, "AreaID4" }, + { true, FT_INT, "OffsetX" }, + { true, FT_INT, "OffsetY" }, + { true, FT_INT, "HitRectTop" }, + { true, FT_INT, "HitRectLeft" }, + { true, FT_INT, "HitRectBottom" }, + { true, FT_INT, "HitRectRight" }, + { false, FT_INT, "PlayerConditionID" }, + { false, FT_INT, "Flags" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, WorldMapOverlayMeta::Instance(), HOTFIX_SEL_WORLD_MAP_OVERLAY }; + } +}; + +struct WorldMapTransformsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "RegionMinX" }, + { false, FT_FLOAT, "RegionMinY" }, + { false, FT_FLOAT, "RegionMinZ" }, + { false, FT_FLOAT, "RegionMaxX" }, + { false, FT_FLOAT, "RegionMaxY" }, + { false, FT_FLOAT, "RegionMaxZ" }, + { false, FT_FLOAT, "RegionOffsetX" }, + { false, FT_FLOAT, "RegionOffsetY" }, + { false, FT_FLOAT, "RegionScale" }, + { false, FT_SHORT, "MapID" }, + { false, FT_SHORT, "AreaID" }, + { false, FT_SHORT, "NewMapID" }, + { false, FT_SHORT, "NewDungeonMapID" }, + { false, FT_SHORT, "NewAreaID" }, + { false, FT_BYTE, "Flags" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, WorldMapTransformsMeta::Instance(), HOTFIX_SEL_WORLD_MAP_TRANSFORMS }; + } +}; + +struct WorldSafeLocsLoadInfo +{ + static DB2LoadInfo Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_FLOAT, "LocX" }, + { false, FT_FLOAT, "LocY" }, + { false, FT_FLOAT, "LocZ" }, + { false, FT_FLOAT, "Facing" }, + { false, FT_STRING, "AreaName" }, + { false, FT_SHORT, "MapID" }, + }; + return { &fields[0], std::extent<decltype(fields)>::value, WorldSafeLocsMeta::Instance(), HOTFIX_SEL_WORLD_SAFE_LOCS }; + } +}; + +#endif DB2LoadInfo_h__ diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 31f4d0e4438..7d45e788cc6 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -19,215 +19,215 @@ #include "Common.h" #include "Containers.h" #include "DatabaseEnv.h" -#include "DB2Metadata.h" +#include "DB2LoadInfo.h" #include "Log.h" #include "TransportMgr.h" #include "World.h" -DB2Storage<AchievementEntry> sAchievementStore("Achievement.db2", AchievementMeta::Instance(), HOTFIX_SEL_ACHIEVEMENT); -DB2Storage<AnimKitEntry> sAnimKitStore("AnimKit.db2", AnimKitMeta::Instance(), HOTFIX_SEL_ANIM_KIT); -DB2Storage<AreaGroupMemberEntry> sAreaGroupMemberStore("AreaGroupMember.db2", AreaGroupMemberMeta::Instance(), HOTFIX_SEL_AREA_GROUP_MEMBER); -DB2Storage<AreaTableEntry> sAreaTableStore("AreaTable.db2", AreaTableMeta::Instance(), HOTFIX_SEL_AREA_TABLE); -DB2Storage<AreaTriggerEntry> sAreaTriggerStore("AreaTrigger.db2", AreaTriggerMeta::Instance(), HOTFIX_SEL_AREA_TRIGGER); -DB2Storage<ArmorLocationEntry> sArmorLocationStore("ArmorLocation.db2", ArmorLocationMeta::Instance(), HOTFIX_SEL_ARMOR_LOCATION); -DB2Storage<ArtifactEntry> sArtifactStore("Artifact.db2", ArtifactMeta::Instance(), HOTFIX_SEL_ARTIFACT); -DB2Storage<ArtifactAppearanceEntry> sArtifactAppearanceStore("ArtifactAppearance.db2", ArtifactAppearanceMeta::Instance(), HOTFIX_SEL_ARTIFACT_APPEARANCE); -DB2Storage<ArtifactAppearanceSetEntry> sArtifactAppearanceSetStore("ArtifactAppearanceSet.db2", ArtifactAppearanceSetMeta::Instance(), HOTFIX_SEL_ARTIFACT_APPEARANCE_SET); -DB2Storage<ArtifactCategoryEntry> sArtifactCategoryStore("ArtifactCategory.db2", ArtifactCategoryMeta::Instance(), HOTFIX_SEL_ARTIFACT_CATEGORY); -DB2Storage<ArtifactPowerEntry> sArtifactPowerStore("ArtifactPower.db2", ArtifactPowerMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER); -DB2Storage<ArtifactPowerLinkEntry> sArtifactPowerLinkStore("ArtifactPowerLink.db2", ArtifactPowerLinkMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER_LINK); -DB2Storage<ArtifactPowerRankEntry> sArtifactPowerRankStore("ArtifactPowerRank.db2", ArtifactPowerRankMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER_RANK); -DB2Storage<ArtifactQuestXPEntry> sArtifactQuestXPStore("ArtifactQuestXP.db2", ArtifactQuestXPMeta::Instance(), HOTFIX_SEL_ARTIFACT_QUEST_XP); -DB2Storage<AuctionHouseEntry> sAuctionHouseStore("AuctionHouse.db2", AuctionHouseMeta::Instance(), HOTFIX_SEL_AUCTION_HOUSE); -DB2Storage<BankBagSlotPricesEntry> sBankBagSlotPricesStore("BankBagSlotPrices.db2", BankBagSlotPricesMeta::Instance(), HOTFIX_SEL_BANK_BAG_SLOT_PRICES); -DB2Storage<BannedAddOnsEntry> sBannedAddOnsStore("BannedAddOns.db2", BannedAddOnsMeta::Instance(), HOTFIX_SEL_BANNED_ADDONS); -DB2Storage<BarberShopStyleEntry> sBarberShopStyleStore("BarberShopStyle.db2", BarberShopStyleMeta::Instance(), HOTFIX_SEL_BARBER_SHOP_STYLE); -DB2Storage<BattlePetBreedQualityEntry> sBattlePetBreedQualityStore("BattlePetBreedQuality.db2", BattlePetBreedQualityMeta::Instance(), HOTFIX_SEL_BATTLE_PET_BREED_QUALITY); -DB2Storage<BattlePetBreedStateEntry> sBattlePetBreedStateStore("BattlePetBreedState.db2", BattlePetBreedStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_BREED_STATE); -DB2Storage<BattlePetSpeciesEntry> sBattlePetSpeciesStore("BattlePetSpecies.db2", BattlePetSpeciesMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES); -DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore("BattlePetSpeciesState.db2", BattlePetSpeciesStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES_STATE); -DB2Storage<BattlemasterListEntry> sBattlemasterListStore("BattlemasterList.db2", BattlemasterListMeta::Instance(), HOTFIX_SEL_BATTLEMASTER_LIST); -DB2Storage<BroadcastTextEntry> sBroadcastTextStore("BroadcastText.db2", BroadcastTextMeta::Instance(), HOTFIX_SEL_BROADCAST_TEXT); -DB2Storage<CharSectionsEntry> sCharSectionsStore("CharSections.db2", CharSectionsMeta::Instance(), HOTFIX_SEL_CHAR_SECTIONS); -DB2Storage<CharStartOutfitEntry> sCharStartOutfitStore("CharStartOutfit.db2", CharStartOutfitMeta::Instance(), HOTFIX_SEL_CHAR_START_OUTFIT); -DB2Storage<CharTitlesEntry> sCharTitlesStore("CharTitles.db2", CharTitlesMeta::Instance(), HOTFIX_SEL_CHAR_TITLES); -DB2Storage<ChatChannelsEntry> sChatChannelsStore("ChatChannels.db2", ChatChannelsMeta::Instance(), HOTFIX_SEL_CHAT_CHANNELS); -DB2Storage<ChrClassesEntry> sChrClassesStore("ChrClasses.db2", ChrClassesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES); -DB2Storage<ChrClassesXPowerTypesEntry> sChrClassesXPowerTypesStore("ChrClassesXPowerTypes.db2", ChrClassesXPowerTypesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES); -DB2Storage<ChrRacesEntry> sChrRacesStore("ChrRaces.db2", ChrRacesMeta::Instance(), HOTFIX_SEL_CHR_RACES); -DB2Storage<ChrSpecializationEntry> sChrSpecializationStore("ChrSpecialization.db2", ChrSpecializationMeta::Instance(), HOTFIX_SEL_CHR_SPECIALIZATION); -DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore("CinematicSequences.db2", CinematicSequencesMeta::Instance(), HOTFIX_SEL_CINEMATIC_SEQUENCES); -DB2Storage<CreatureDisplayInfoEntry> sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", CreatureDisplayInfoMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO); -DB2Storage<CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore("CreatureDisplayInfoExtra.db2", CreatureDisplayInfoExtraMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA); -DB2Storage<CreatureFamilyEntry> sCreatureFamilyStore("CreatureFamily.db2", CreatureFamilyMeta::Instance(), HOTFIX_SEL_CREATURE_FAMILY); -DB2Storage<CreatureModelDataEntry> sCreatureModelDataStore("CreatureModelData.db2", CreatureModelDataMeta::Instance(), HOTFIX_SEL_CREATURE_MODEL_DATA); -DB2Storage<CreatureTypeEntry> sCreatureTypeStore("CreatureType.db2", CreatureTypeMeta::Instance(), HOTFIX_SEL_CREATURE_TYPE); -DB2Storage<CriteriaEntry> sCriteriaStore("Criteria.db2", CriteriaMeta::Instance(), HOTFIX_SEL_CRITERIA); -DB2Storage<CriteriaTreeEntry> sCriteriaTreeStore("CriteriaTree.db2", CriteriaTreeMeta::Instance(), HOTFIX_SEL_CRITERIA_TREE); -DB2Storage<CurrencyTypesEntry> sCurrencyTypesStore("CurrencyTypes.db2", CurrencyTypesMeta::Instance(), HOTFIX_SEL_CURRENCY_TYPES); -DB2Storage<CurveEntry> sCurveStore("Curve.db2", CurveMeta::Instance(), HOTFIX_SEL_CURVE); -DB2Storage<CurvePointEntry> sCurvePointStore("CurvePoint.db2", CurvePointMeta::Instance(), HOTFIX_SEL_CURVE_POINT); -DB2Storage<DestructibleModelDataEntry> sDestructibleModelDataStore("DestructibleModelData.db2", DestructibleModelDataMeta::Instance(), HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA); -DB2Storage<DifficultyEntry> sDifficultyStore("Difficulty.db2", DifficultyMeta::Instance(), HOTFIX_SEL_DIFFICULTY); -DB2Storage<DungeonEncounterEntry> sDungeonEncounterStore("DungeonEncounter.db2", DungeonEncounterMeta::Instance(), HOTFIX_SEL_DUNGEON_ENCOUNTER); -DB2Storage<DurabilityCostsEntry> sDurabilityCostsStore("DurabilityCosts.db2", DurabilityCostsMeta::Instance(), HOTFIX_SEL_DURABILITY_COSTS); -DB2Storage<DurabilityQualityEntry> sDurabilityQualityStore("DurabilityQuality.db2", DurabilityQualityMeta::Instance(), HOTFIX_SEL_DURABILITY_QUALITY); -DB2Storage<EmotesEntry> sEmotesStore("Emotes.db2", EmotesMeta::Instance(), HOTFIX_SEL_EMOTES); -DB2Storage<EmotesTextEntry> sEmotesTextStore("EmotesText.db2", EmotesTextMeta::Instance(), HOTFIX_SEL_EMOTES_TEXT); -DB2Storage<EmotesTextSoundEntry> sEmotesTextSoundStore("EmotesTextSound.db2", EmotesTextSoundMeta::Instance(), HOTFIX_SEL_EMOTES_TEXT_SOUND); -DB2Storage<FactionEntry> sFactionStore("Faction.db2", FactionMeta::Instance(), HOTFIX_SEL_FACTION); -DB2Storage<FactionTemplateEntry> sFactionTemplateStore("FactionTemplate.db2", FactionTemplateMeta::Instance(), HOTFIX_SEL_FACTION_TEMPLATE); -DB2Storage<GameObjectsEntry> sGameObjectsStore("GameObjects.db2", GameObjectsMeta::Instance(), HOTFIX_SEL_GAMEOBJECTS); -DB2Storage<GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore("GameObjectDisplayInfo.db2", GameObjectDisplayInfoMeta::Instance(), HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO); -DB2Storage<GarrAbilityEntry> sGarrAbilityStore("GarrAbility.db2", GarrAbilityMeta::Instance(), HOTFIX_SEL_GARR_ABILITY); -DB2Storage<GarrBuildingEntry> sGarrBuildingStore("GarrBuilding.db2", GarrBuildingMeta::Instance(), HOTFIX_SEL_GARR_BUILDING); -DB2Storage<GarrBuildingPlotInstEntry> sGarrBuildingPlotInstStore("GarrBuildingPlotInst.db2", GarrBuildingPlotInstMeta::Instance(), HOTFIX_SEL_GARR_BUILDING_PLOT_INST); -DB2Storage<GarrClassSpecEntry> sGarrClassSpecStore("GarrClassSpec.db2", GarrClassSpecMeta::Instance(), HOTFIX_SEL_GARR_CLASS_SPEC); -DB2Storage<GarrFollowerEntry> sGarrFollowerStore("GarrFollower.db2", GarrFollowerMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER); -DB2Storage<GarrFollowerXAbilityEntry> sGarrFollowerXAbilityStore("GarrFollowerXAbility.db2", GarrFollowerXAbilityMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY); -DB2Storage<GarrPlotBuildingEntry> sGarrPlotBuildingStore("GarrPlotBuilding.db2", GarrPlotBuildingMeta::Instance(), HOTFIX_SEL_GARR_PLOT_BUILDING); -DB2Storage<GarrPlotEntry> sGarrPlotStore("GarrPlot.db2", GarrPlotMeta::Instance(), HOTFIX_SEL_GARR_PLOT); -DB2Storage<GarrPlotInstanceEntry> sGarrPlotInstanceStore("GarrPlotInstance.db2", GarrPlotInstanceMeta::Instance(), HOTFIX_SEL_GARR_PLOT_INSTANCE); -DB2Storage<GarrSiteLevelEntry> sGarrSiteLevelStore("GarrSiteLevel.db2", GarrSiteLevelMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL); -DB2Storage<GarrSiteLevelPlotInstEntry> sGarrSiteLevelPlotInstStore("GarrSiteLevelPlotInst.db2", GarrSiteLevelPlotInstMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST); -DB2Storage<GemPropertiesEntry> sGemPropertiesStore("GemProperties.db2", GemPropertiesMeta::Instance(), HOTFIX_SEL_GEM_PROPERTIES); -DB2Storage<GlyphBindableSpellEntry> sGlyphBindableSpellStore("GlyphBindableSpell.db2", GlyphBindableSpellMeta::Instance(), HOTFIX_SEL_GLYPH_BINDABLE_SPELL); -DB2Storage<GlyphPropertiesEntry> sGlyphPropertiesStore("GlyphProperties.db2", GlyphPropertiesMeta::Instance(), HOTFIX_SEL_GLYPH_PROPERTIES); -DB2Storage<GlyphRequiredSpecEntry> sGlyphRequiredSpecStore("GlyphRequiredSpec.db2", GlyphRequiredSpecMeta::Instance(), HOTFIX_SEL_GLYPH_REQUIRED_SPEC); -DB2Storage<GuildColorBackgroundEntry> sGuildColorBackgroundStore("GuildColorBackground.db2", GuildColorBackgroundMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BACKGROUND); -DB2Storage<GuildColorBorderEntry> sGuildColorBorderStore("GuildColorBorder.db2", GuildColorBorderMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BORDER); -DB2Storage<GuildColorEmblemEntry> sGuildColorEmblemStore("GuildColorEmblem.db2", GuildColorEmblemMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_EMBLEM); -DB2Storage<GuildPerkSpellsEntry> sGuildPerkSpellsStore("GuildPerkSpells.db2", GuildPerkSpellsMeta::Instance(), HOTFIX_SEL_GUILD_PERK_SPELLS); -DB2Storage<HeirloomEntry> sHeirloomStore("Heirloom.db2", HeirloomMeta::Instance(), HOTFIX_SEL_HEIRLOOM); -DB2Storage<HolidaysEntry> sHolidaysStore("Holidays.db2", HolidaysMeta::Instance(), HOTFIX_SEL_HOLIDAYS); -DB2Storage<ImportPriceArmorEntry> sImportPriceArmorStore("ImportPriceArmor.db2", ImportPriceArmorMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_ARMOR); -DB2Storage<ImportPriceQualityEntry> sImportPriceQualityStore("ImportPriceQuality.db2", ImportPriceQualityMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_QUALITY); -DB2Storage<ImportPriceShieldEntry> sImportPriceShieldStore("ImportPriceShield.db2", ImportPriceShieldMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_SHIELD); -DB2Storage<ImportPriceWeaponEntry> sImportPriceWeaponStore("ImportPriceWeapon.db2", ImportPriceWeaponMeta::Instance(), HOTFIX_SEL_IMPORT_PRICE_WEAPON); -DB2Storage<ItemAppearanceEntry> sItemAppearanceStore("ItemAppearance.db2", ItemAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_APPEARANCE); -DB2Storage<ItemArmorQualityEntry> sItemArmorQualityStore("ItemArmorQuality.db2", ItemArmorQualityMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_QUALITY); -DB2Storage<ItemArmorShieldEntry> sItemArmorShieldStore("ItemArmorShield.db2", ItemArmorShieldMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_SHIELD); -DB2Storage<ItemArmorTotalEntry> sItemArmorTotalStore("ItemArmorTotal.db2", ItemArmorTotalMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_TOTAL); -DB2Storage<ItemBagFamilyEntry> sItemBagFamilyStore("ItemBagFamily.db2", ItemBagFamilyMeta::Instance(), HOTFIX_SEL_ITEM_BAG_FAMILY); -DB2Storage<ItemBonusEntry> sItemBonusStore("ItemBonus.db2", ItemBonusMeta::Instance(), HOTFIX_SEL_ITEM_BONUS); -DB2Storage<ItemBonusListLevelDeltaEntry> sItemBonusListLevelDeltaStore("ItemBonusListLevelDelta.db2", ItemBonusListLevelDeltaMeta::Instance(), HOTFIX_SEL_ITEM_BONUS_LIST_LEVEL_DELTA); -DB2Storage<ItemBonusTreeNodeEntry> sItemBonusTreeNodeStore("ItemBonusTreeNode.db2", ItemBonusTreeNodeMeta::Instance(), HOTFIX_SEL_ITEM_BONUS_TREE_NODE); -DB2Storage<ItemChildEquipmentEntry> sItemChildEquipmentStore("ItemChildEquipment.db2", ItemChildEquipmentMeta::Instance(), HOTFIX_SEL_ITEM_CHILD_EQUIPMENT); -DB2Storage<ItemClassEntry> sItemClassStore("ItemClass.db2", ItemClassMeta::Instance(), HOTFIX_SEL_ITEM_CLASS); -DB2Storage<ItemCurrencyCostEntry> sItemCurrencyCostStore("ItemCurrencyCost.db2", ItemCurrencyCostMeta::Instance(), HOTFIX_SEL_ITEM_CURRENCY_COST); -DB2Storage<ItemDamageAmmoEntry> sItemDamageAmmoStore("ItemDamageAmmo.db2", ItemDamageAmmoMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_AMMO); -DB2Storage<ItemDamageOneHandEntry> sItemDamageOneHandStore("ItemDamageOneHand.db2", ItemDamageOneHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND); -DB2Storage<ItemDamageOneHandCasterEntry> sItemDamageOneHandCasterStore("ItemDamageOneHandCaster.db2", ItemDamageOneHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER); -DB2Storage<ItemDamageTwoHandEntry> sItemDamageTwoHandStore("ItemDamageTwoHand.db2", ItemDamageTwoHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND); -DB2Storage<ItemDamageTwoHandCasterEntry> sItemDamageTwoHandCasterStore("ItemDamageTwoHandCaster.db2", ItemDamageTwoHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER); -DB2Storage<ItemDisenchantLootEntry> sItemDisenchantLootStore("ItemDisenchantLoot.db2", ItemDisenchantLootMeta::Instance(), HOTFIX_SEL_ITEM_DISENCHANT_LOOT); -DB2Storage<ItemEffectEntry> sItemEffectStore("ItemEffect.db2", ItemEffectMeta::Instance(), HOTFIX_SEL_ITEM_EFFECT); -DB2Storage<ItemEntry> sItemStore("Item.db2", ItemMeta::Instance(), HOTFIX_SEL_ITEM); -DB2Storage<ItemExtendedCostEntry> sItemExtendedCostStore("ItemExtendedCost.db2", ItemExtendedCostMeta::Instance(), HOTFIX_SEL_ITEM_EXTENDED_COST); -DB2Storage<ItemLimitCategoryEntry> sItemLimitCategoryStore("ItemLimitCategory.db2", ItemLimitCategoryMeta::Instance(), HOTFIX_SEL_ITEM_LIMIT_CATEGORY); -DB2Storage<ItemModifiedAppearanceEntry> sItemModifiedAppearanceStore("ItemModifiedAppearance.db2", ItemModifiedAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE); -DB2Storage<ItemPriceBaseEntry> sItemPriceBaseStore("ItemPriceBase.db2", ItemPriceBaseMeta::Instance(), HOTFIX_SEL_ITEM_PRICE_BASE); -DB2Storage<ItemRandomPropertiesEntry> sItemRandomPropertiesStore("ItemRandomProperties.db2", ItemRandomPropertiesMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_PROPERTIES); -DB2Storage<ItemRandomSuffixEntry> sItemRandomSuffixStore("ItemRandomSuffix.db2", ItemRandomSuffixMeta::Instance(), HOTFIX_SEL_ITEM_RANDOM_SUFFIX); -DB2Storage<ItemSearchNameEntry> sItemSearchNameStore("ItemSearchName.db2", ItemSearchNameMeta::Instance(), HOTFIX_SEL_ITEM_SEARCH_NAME); -DB2Storage<ItemSetEntry> sItemSetStore("ItemSet.db2", ItemSetMeta::Instance(), HOTFIX_SEL_ITEM_SET); -DB2Storage<ItemSetSpellEntry> sItemSetSpellStore("ItemSetSpell.db2", ItemSetSpellMeta::Instance(), HOTFIX_SEL_ITEM_SET_SPELL); -DB2Storage<ItemSparseEntry> sItemSparseStore("Item-sparse.db2", ItemSparseMeta::Instance(), HOTFIX_SEL_ITEM_SPARSE); -DB2Storage<ItemSpecEntry> sItemSpecStore("ItemSpec.db2", ItemSpecMeta::Instance(), HOTFIX_SEL_ITEM_SPEC); -DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore("ItemSpecOverride.db2", ItemSpecOverrideMeta::Instance(), HOTFIX_SEL_ITEM_SPEC_OVERRIDE); -DB2Storage<ItemUpgradeEntry> sItemUpgradeStore("ItemUpgrade.db2", ItemUpgradeMeta::Instance(), HOTFIX_SEL_ITEM_UPGRADE); -DB2Storage<ItemXBonusTreeEntry> sItemXBonusTreeStore("ItemXBonusTree.db2", ItemXBonusTreeMeta::Instance(), HOTFIX_SEL_ITEM_X_BONUS_TREE); -DB2Storage<KeyChainEntry> sKeyChainStore("KeyChain.db2", KeyChainMeta::Instance(), HOTFIX_SEL_KEY_CHAIN); -DB2Storage<LfgDungeonsEntry> sLfgDungeonsStore("LfgDungeons.db2", LfgDungeonsMeta::Instance(), HOTFIX_SEL_LFG_DUNGEONS); -DB2Storage<LightEntry> sLightStore("Light.db2", LightMeta::Instance(), HOTFIX_SEL_LIGHT); -DB2Storage<LiquidTypeEntry> sLiquidTypeStore("LiquidType.db2", LiquidTypeMeta::Instance(), HOTFIX_SEL_LIQUID_TYPE); -DB2Storage<LockEntry> sLockStore("Lock.db2", LockMeta::Instance(), HOTFIX_SEL_LOCK); -DB2Storage<MailTemplateEntry> sMailTemplateStore("MailTemplate.db2", MailTemplateMeta::Instance(), HOTFIX_SEL_MAIL_TEMPLATE); -DB2Storage<MapEntry> sMapStore("Map.db2", MapMeta::Instance(), HOTFIX_SEL_MAP); -DB2Storage<MapDifficultyEntry> sMapDifficultyStore("MapDifficulty.db2", MapDifficultyMeta::Instance(), HOTFIX_SEL_MAP_DIFFICULTY); -DB2Storage<ModifierTreeEntry> sModifierTreeStore("ModifierTree.db2", ModifierTreeMeta::Instance(), HOTFIX_SEL_MODIFIER_TREE); -DB2Storage<MountCapabilityEntry> sMountCapabilityStore("MountCapability.db2", MountCapabilityMeta::Instance(), HOTFIX_SEL_MOUNT_CAPABILITY); -DB2Storage<MountEntry> sMountStore("Mount.db2", MountMeta::Instance(), HOTFIX_SEL_MOUNT); -DB2Storage<MountTypeXCapabilityEntry> sMountTypeXCapabilityStore("MountTypeXCapability.db2", MountTypeXCapabilityMeta::Instance(), HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY); -DB2Storage<MovieEntry> sMovieStore("Movie.db2", MovieMeta::Instance(), HOTFIX_SEL_MOVIE); -DB2Storage<NameGenEntry> sNameGenStore("NameGen.db2", NameGenMeta::Instance(), HOTFIX_SEL_NAME_GEN); -DB2Storage<NamesProfanityEntry> sNamesProfanityStore("NamesProfanity.db2", NamesProfanityMeta::Instance(), HOTFIX_SEL_NAMES_PROFANITY); -DB2Storage<NamesReservedEntry> sNamesReservedStore("NamesReserved.db2", NamesReservedMeta::Instance(), HOTFIX_SEL_NAMES_RESERVED); -DB2Storage<NamesReservedLocaleEntry> sNamesReservedLocaleStore("NamesReservedLocale.db2", NamesReservedLocaleMeta::Instance(), HOTFIX_SEL_NAMES_RESERVED_LOCALE); -DB2Storage<OverrideSpellDataEntry> sOverrideSpellDataStore("OverrideSpellData.db2", OverrideSpellDataMeta::Instance(), HOTFIX_SEL_OVERRIDE_SPELL_DATA); -DB2Storage<PhaseEntry> sPhaseStore("Phase.db2", PhaseMeta::Instance(), HOTFIX_SEL_PHASE); -DB2Storage<PhaseXPhaseGroupEntry> sPhaseXPhaseGroupStore("PhaseXPhaseGroup.db2", PhaseXPhaseGroupMeta::Instance(), HOTFIX_SEL_PHASE_X_PHASE_GROUP); -DB2Storage<PlayerConditionEntry> sPlayerConditionStore("PlayerCondition.db2", PlayerConditionMeta::Instance(), HOTFIX_SEL_PLAYER_CONDITION); -DB2Storage<PowerDisplayEntry> sPowerDisplayStore("PowerDisplay.db2", PowerDisplayMeta::Instance(), HOTFIX_SEL_POWER_DISPLAY); -DB2Storage<PowerTypeEntry> sPowerTypeStore("PowerType.db2", PowerTypeMeta::Instance(), HOTFIX_SEL_POWER_TYPE); -DB2Storage<PvPDifficultyEntry> sPvpDifficultyStore("PvpDifficulty.db2", PvpDifficultyMeta::Instance(), HOTFIX_SEL_PVP_DIFFICULTY); -DB2Storage<QuestFactionRewardEntry> sQuestFactionRewardStore("QuestFactionReward.db2", QuestFactionRewardMeta::Instance(), HOTFIX_SEL_QUEST_FACTION_REWARD); -DB2Storage<QuestMoneyRewardEntry> sQuestMoneyRewardStore("QuestMoneyReward.db2", QuestMoneyRewardMeta::Instance(), HOTFIX_SEL_QUEST_MONEY_REWARD); -DB2Storage<QuestPackageItemEntry> sQuestPackageItemStore("QuestPackageItem.db2", QuestPackageItemMeta::Instance(), HOTFIX_SEL_QUEST_PACKAGE_ITEM); -DB2Storage<QuestSortEntry> sQuestSortStore("QuestSort.db2", QuestSortMeta::Instance(), HOTFIX_SEL_QUEST_SORT); -DB2Storage<QuestV2Entry> sQuestV2Store("QuestV2.db2", QuestV2Meta::Instance(), HOTFIX_SEL_QUEST_V2); -DB2Storage<QuestXPEntry> sQuestXPStore("QuestXP.db2", QuestXPMeta::Instance(), HOTFIX_SEL_QUEST_XP); -DB2Storage<RandPropPointsEntry> sRandPropPointsStore("RandPropPoints.db2", RandPropPointsMeta::Instance(), HOTFIX_SEL_RAND_PROP_POINTS); -DB2Storage<RulesetItemUpgradeEntry> sRulesetItemUpgradeStore("RulesetItemUpgrade.db2", RulesetItemUpgradeMeta::Instance(), HOTFIX_SEL_RULESET_ITEM_UPGRADE); -DB2Storage<ScalingStatDistributionEntry> sScalingStatDistributionStore("ScalingStatDistribution.db2", ScalingStatDistributionMeta::Instance(), HOTFIX_SEL_SCALING_STAT_DISTRIBUTION); -DB2Storage<SceneScriptEntry> sSceneScriptStore("SceneScript.db2", SceneScriptMeta::Instance(), HOTFIX_SEL_SCENE_SCRIPT); -DB2Storage<SceneScriptPackageEntry> sSceneScriptPackageStore("SceneScriptPackage.db2", SceneScriptPackageMeta::Instance(), HOTFIX_SEL_SCENE_SCRIPT_PACKAGE); -DB2Storage<SkillLineEntry> sSkillLineStore("SkillLine.db2", SkillLineMeta::Instance(), HOTFIX_SEL_SKILL_LINE); -DB2Storage<SkillLineAbilityEntry> sSkillLineAbilityStore("SkillLineAbility.db2", SkillLineAbilityMeta::Instance(), HOTFIX_SEL_SKILL_LINE_ABILITY); -DB2Storage<SkillRaceClassInfoEntry> sSkillRaceClassInfoStore("SkillRaceClassInfo.db2", SkillRaceClassInfoMeta::Instance(), HOTFIX_SEL_SKILL_RACE_CLASS_INFO); -DB2Storage<SoundKitEntry> sSoundKitStore("SoundKit.db2", SoundKitMeta::Instance(), HOTFIX_SEL_SOUND_KIT); -DB2Storage<SpecializationSpellsEntry> sSpecializationSpellsStore("SpecializationSpells.db2", SpecializationSpellsMeta::Instance(), HOTFIX_SEL_SPECIALIZATION_SPELLS); -DB2Storage<SpellEntry> sSpellStore("Spell.db2", SpellMeta::Instance(), HOTFIX_SEL_SPELL); -DB2Storage<SpellAuraOptionsEntry> sSpellAuraOptionsStore("SpellAuraOptions.db2", SpellAuraOptionsMeta::Instance(), HOTFIX_SEL_SPELL_AURA_OPTIONS); -DB2Storage<SpellAuraRestrictionsEntry> sSpellAuraRestrictionsStore("SpellAuraRestrictions.db2", SpellAuraRestrictionsMeta::Instance(), HOTFIX_SEL_SPELL_AURA_RESTRICTIONS); -DB2Storage<SpellCastTimesEntry> sSpellCastTimesStore("SpellCastTimes.db2", SpellCastTimesMeta::Instance(), HOTFIX_SEL_SPELL_CAST_TIMES); -DB2Storage<SpellCastingRequirementsEntry> sSpellCastingRequirementsStore("SpellCastingRequirements.db2", SpellCastingRequirementsMeta::Instance(), HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS); -DB2Storage<SpellCategoriesEntry> sSpellCategoriesStore("SpellCategories.db2", SpellCategoriesMeta::Instance(), HOTFIX_SEL_SPELL_CATEGORIES); -DB2Storage<SpellCategoryEntry> sSpellCategoryStore("SpellCategory.db2", SpellCategoryMeta::Instance(), HOTFIX_SEL_SPELL_CATEGORY); -DB2Storage<SpellClassOptionsEntry> sSpellClassOptionsStore("SpellClassOptions.db2", SpellClassOptionsMeta::Instance(), HOTFIX_SEL_SPELL_CLASS_OPTIONS); -DB2Storage<SpellCooldownsEntry> sSpellCooldownsStore("SpellCooldowns.db2", SpellCooldownsMeta::Instance(), HOTFIX_SEL_SPELL_COOLDOWNS); -DB2Storage<SpellDurationEntry> sSpellDurationStore("SpellDuration.db2", SpellDurationMeta::Instance(), HOTFIX_SEL_SPELL_DURATION); -DB2Storage<SpellEffectEntry> sSpellEffectStore("SpellEffect.db2", SpellEffectMeta::Instance(), HOTFIX_SEL_SPELL_EFFECT); -DB2Storage<SpellEffectScalingEntry> sSpellEffectScalingStore("SpellEffectScaling.db2", SpellEffectScalingMeta::Instance(), HOTFIX_SEL_SPELL_EFFECT_SCALING); -DB2Storage<SpellEquippedItemsEntry> sSpellEquippedItemsStore("SpellEquippedItems.db2", SpellEquippedItemsMeta::Instance(), HOTFIX_SEL_SPELL_EQUIPPED_ITEMS); -DB2Storage<SpellFocusObjectEntry> sSpellFocusObjectStore("SpellFocusObject.db2", SpellFocusObjectMeta::Instance(), HOTFIX_SEL_SPELL_FOCUS_OBJECT); -DB2Storage<SpellInterruptsEntry> sSpellInterruptsStore("SpellInterrupts.db2", SpellInterruptsMeta::Instance(), HOTFIX_SEL_SPELL_INTERRUPTS); -DB2Storage<SpellItemEnchantmentEntry> sSpellItemEnchantmentStore("SpellItemEnchantment.db2", SpellItemEnchantmentMeta::Instance(), HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT); -DB2Storage<SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore("SpellItemEnchantmentCondition.db2", SpellItemEnchantmentConditionMeta::Instance(), HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION); -DB2Storage<SpellLearnSpellEntry> sSpellLearnSpellStore("SpellLearnSpell.db2", SpellLearnSpellMeta::Instance(), HOTFIX_SEL_SPELL_LEARN_SPELL); -DB2Storage<SpellLevelsEntry> sSpellLevelsStore("SpellLevels.db2", SpellLevelsMeta::Instance(), HOTFIX_SEL_SPELL_LEVELS); -DB2Storage<SpellMiscEntry> sSpellMiscStore("SpellMisc.db2", SpellMiscMeta::Instance(), HOTFIX_SEL_SPELL_MISC); -DB2Storage<SpellPowerEntry> sSpellPowerStore("SpellPower.db2", SpellPowerMeta::Instance(), HOTFIX_SEL_SPELL_POWER); -DB2Storage<SpellPowerDifficultyEntry> sSpellPowerDifficultyStore("SpellPowerDifficulty.db2", SpellPowerDifficultyMeta::Instance(), HOTFIX_SEL_SPELL_POWER_DIFFICULTY); -DB2Storage<SpellProcsPerMinuteEntry> sSpellProcsPerMinuteStore("SpellProcsPerMinute.db2", SpellProcsPerMinuteMeta::Instance(), HOTFIX_SEL_SPELL_PROCS_PER_MINUTE); -DB2Storage<SpellProcsPerMinuteModEntry> sSpellProcsPerMinuteModStore("SpellProcsPerMinuteMod.db2", SpellProcsPerMinuteModMeta::Instance(), HOTFIX_SEL_SPELL_PROCS_PER_MINUTE_MOD); -DB2Storage<SpellRadiusEntry> sSpellRadiusStore("SpellRadius.db2", SpellRadiusMeta::Instance(), HOTFIX_SEL_SPELL_RADIUS); -DB2Storage<SpellRangeEntry> sSpellRangeStore("SpellRange.db2", SpellRangeMeta::Instance(), HOTFIX_SEL_SPELL_RANGE); -DB2Storage<SpellReagentsEntry> sSpellReagentsStore("SpellReagents.db2", SpellReagentsMeta::Instance(), HOTFIX_SEL_SPELL_REAGENTS); -DB2Storage<SpellScalingEntry> sSpellScalingStore("SpellScaling.db2", SpellScalingMeta::Instance(), HOTFIX_SEL_SPELL_SCALING); -DB2Storage<SpellShapeshiftEntry> sSpellShapeshiftStore("SpellShapeshift.db2", SpellShapeshiftMeta::Instance(), HOTFIX_SEL_SPELL_SHAPESHIFT); -DB2Storage<SpellShapeshiftFormEntry> sSpellShapeshiftFormStore("SpellShapeshiftForm.db2", SpellShapeshiftFormMeta::Instance(), HOTFIX_SEL_SPELL_SHAPESHIFT_FORM); -DB2Storage<SpellTargetRestrictionsEntry> sSpellTargetRestrictionsStore("SpellTargetRestrictions.db2", SpellTargetRestrictionsMeta::Instance(), HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS); -DB2Storage<SpellTotemsEntry> sSpellTotemsStore("SpellTotems.db2", SpellTotemsMeta::Instance(), HOTFIX_SEL_SPELL_TOTEMS); -DB2Storage<SpellXSpellVisualEntry> sSpellXSpellVisualStore("SpellXSpellVisual.db2", SpellXSpellVisualMeta::Instance(), HOTFIX_SEL_SPELL_X_SPELL_VISUAL); -DB2Storage<SummonPropertiesEntry> sSummonPropertiesStore("SummonProperties.db2", SummonPropertiesMeta::Instance(), HOTFIX_SEL_SUMMON_PROPERTIES); -DB2Storage<TactKeyEntry> sTactKeyStore("TactKey.db2", TactKeyMeta::Instance(), HOTFIX_SEL_TACT_KEY); -DB2Storage<TalentEntry> sTalentStore("Talent.db2", TalentMeta::Instance(), HOTFIX_SEL_TALENT); -DB2Storage<TaxiNodesEntry> sTaxiNodesStore("TaxiNodes.db2", TaxiNodesMeta::Instance(), HOTFIX_SEL_TAXI_NODES); -DB2Storage<TaxiPathEntry> sTaxiPathStore("TaxiPath.db2", TaxiPathMeta::Instance(), HOTFIX_SEL_TAXI_PATH); -DB2Storage<TaxiPathNodeEntry> sTaxiPathNodeStore("TaxiPathNode.db2", TaxiPathNodeMeta::Instance(), HOTFIX_SEL_TAXI_PATH_NODE); -DB2Storage<TotemCategoryEntry> sTotemCategoryStore("TotemCategory.db2", TotemCategoryMeta::Instance(), HOTFIX_SEL_TOTEM_CATEGORY); -DB2Storage<ToyEntry> sToyStore("Toy.db2", ToyMeta::Instance(), HOTFIX_SEL_TOY); -DB2Storage<TransportAnimationEntry> sTransportAnimationStore("TransportAnimation.db2", TransportAnimationMeta::Instance(), HOTFIX_SEL_TRANSPORT_ANIMATION); -DB2Storage<TransportRotationEntry> sTransportRotationStore("TransportRotation.db2", TransportRotationMeta::Instance(), HOTFIX_SEL_TRANSPORT_ROTATION); -DB2Storage<UnitPowerBarEntry> sUnitPowerBarStore("UnitPowerBar.db2", UnitPowerBarMeta::Instance(), HOTFIX_SEL_UNIT_POWER_BAR); -DB2Storage<VehicleEntry> sVehicleStore("Vehicle.db2", VehicleMeta::Instance(), HOTFIX_SEL_VEHICLE); -DB2Storage<VehicleSeatEntry> sVehicleSeatStore("VehicleSeat.db2", VehicleSeatMeta::Instance(), HOTFIX_SEL_VEHICLE_SEAT); -DB2Storage<WMOAreaTableEntry> sWMOAreaTableStore("WMOAreaTable.db2", WMOAreaTableMeta::Instance(), HOTFIX_SEL_WMO_AREA_TABLE); -DB2Storage<WorldMapAreaEntry> sWorldMapAreaStore("WorldMapArea.db2", WorldMapAreaMeta::Instance(), HOTFIX_SEL_WORLD_MAP_AREA); -DB2Storage<WorldMapOverlayEntry> sWorldMapOverlayStore("WorldMapOverlay.db2", WorldMapOverlayMeta::Instance(), HOTFIX_SEL_WORLD_MAP_OVERLAY); -DB2Storage<WorldMapTransformsEntry> sWorldMapTransformsStore("WorldMapTransforms.db2", WorldMapTransformsMeta::Instance(), HOTFIX_SEL_WORLD_MAP_TRANSFORMS); -DB2Storage<WorldSafeLocsEntry> sWorldSafeLocsStore("WorldSafeLocs.db2", WorldSafeLocsMeta::Instance(), HOTFIX_SEL_WORLD_SAFE_LOCS); +DB2Storage<AchievementEntry> sAchievementStore("Achievement.db2", AchievementLoadInfo::Instance()); +DB2Storage<AnimKitEntry> sAnimKitStore("AnimKit.db2", AnimKitLoadInfo::Instance()); +DB2Storage<AreaGroupMemberEntry> sAreaGroupMemberStore("AreaGroupMember.db2", AreaGroupMemberLoadInfo::Instance()); +DB2Storage<AreaTableEntry> sAreaTableStore("AreaTable.db2", AreaTableLoadInfo::Instance()); +DB2Storage<AreaTriggerEntry> sAreaTriggerStore("AreaTrigger.db2", AreaTriggerLoadInfo::Instance()); +DB2Storage<ArmorLocationEntry> sArmorLocationStore("ArmorLocation.db2", ArmorLocationLoadInfo::Instance()); +DB2Storage<ArtifactEntry> sArtifactStore("Artifact.db2", ArtifactLoadInfo::Instance()); +DB2Storage<ArtifactAppearanceEntry> sArtifactAppearanceStore("ArtifactAppearance.db2", ArtifactAppearanceLoadInfo::Instance()); +DB2Storage<ArtifactAppearanceSetEntry> sArtifactAppearanceSetStore("ArtifactAppearanceSet.db2", ArtifactAppearanceSetLoadInfo::Instance()); +DB2Storage<ArtifactCategoryEntry> sArtifactCategoryStore("ArtifactCategory.db2", ArtifactCategoryLoadInfo::Instance()); +DB2Storage<ArtifactPowerEntry> sArtifactPowerStore("ArtifactPower.db2", ArtifactPowerLoadInfo::Instance()); +DB2Storage<ArtifactPowerLinkEntry> sArtifactPowerLinkStore("ArtifactPowerLink.db2", ArtifactPowerLinkLoadInfo::Instance()); +DB2Storage<ArtifactPowerRankEntry> sArtifactPowerRankStore("ArtifactPowerRank.db2", ArtifactPowerRankLoadInfo::Instance()); +DB2Storage<ArtifactQuestXPEntry> sArtifactQuestXPStore("ArtifactQuestXP.db2", ArtifactQuestXpLoadInfo::Instance()); +DB2Storage<AuctionHouseEntry> sAuctionHouseStore("AuctionHouse.db2", AuctionHouseLoadInfo::Instance()); +DB2Storage<BankBagSlotPricesEntry> sBankBagSlotPricesStore("BankBagSlotPrices.db2", BankBagSlotPricesLoadInfo::Instance()); +DB2Storage<BannedAddOnsEntry> sBannedAddOnsStore("BannedAddOns.db2", BannedAddonsLoadInfo::Instance()); +DB2Storage<BarberShopStyleEntry> sBarberShopStyleStore("BarberShopStyle.db2", BarberShopStyleLoadInfo::Instance()); +DB2Storage<BattlePetBreedQualityEntry> sBattlePetBreedQualityStore("BattlePetBreedQuality.db2", BattlePetBreedQualityLoadInfo::Instance()); +DB2Storage<BattlePetBreedStateEntry> sBattlePetBreedStateStore("BattlePetBreedState.db2", BattlePetBreedStateLoadInfo::Instance()); +DB2Storage<BattlePetSpeciesEntry> sBattlePetSpeciesStore("BattlePetSpecies.db2", BattlePetSpeciesLoadInfo::Instance()); +DB2Storage<BattlePetSpeciesStateEntry> sBattlePetSpeciesStateStore("BattlePetSpeciesState.db2", BattlePetSpeciesStateLoadInfo::Instance()); +DB2Storage<BattlemasterListEntry> sBattlemasterListStore("BattlemasterList.db2", BattlemasterListLoadInfo::Instance()); +DB2Storage<BroadcastTextEntry> sBroadcastTextStore("BroadcastText.db2", BroadcastTextLoadInfo::Instance()); +DB2Storage<CharSectionsEntry> sCharSectionsStore("CharSections.db2", CharSectionsLoadInfo::Instance()); +DB2Storage<CharStartOutfitEntry> sCharStartOutfitStore("CharStartOutfit.db2", CharStartOutfitLoadInfo::Instance()); +DB2Storage<CharTitlesEntry> sCharTitlesStore("CharTitles.db2", CharTitlesLoadInfo::Instance()); +DB2Storage<ChatChannelsEntry> sChatChannelsStore("ChatChannels.db2", ChatChannelsLoadInfo::Instance()); +DB2Storage<ChrClassesEntry> sChrClassesStore("ChrClasses.db2", ChrClassesLoadInfo::Instance()); +DB2Storage<ChrClassesXPowerTypesEntry> sChrClassesXPowerTypesStore("ChrClassesXPowerTypes.db2", ChrClassesXPowerTypesLoadInfo::Instance()); +DB2Storage<ChrRacesEntry> sChrRacesStore("ChrRaces.db2", ChrRacesLoadInfo::Instance()); +DB2Storage<ChrSpecializationEntry> sChrSpecializationStore("ChrSpecialization.db2", ChrSpecializationLoadInfo::Instance()); +DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore("CinematicSequences.db2", CinematicSequencesLoadInfo::Instance()); +DB2Storage<CreatureDisplayInfoEntry> sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", CreatureDisplayInfoLoadInfo::Instance()); +DB2Storage<CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore("CreatureDisplayInfoExtra.db2", CreatureDisplayInfoExtraLoadInfo::Instance()); +DB2Storage<CreatureFamilyEntry> sCreatureFamilyStore("CreatureFamily.db2", CreatureFamilyLoadInfo::Instance()); +DB2Storage<CreatureModelDataEntry> sCreatureModelDataStore("CreatureModelData.db2", CreatureModelDataLoadInfo::Instance()); +DB2Storage<CreatureTypeEntry> sCreatureTypeStore("CreatureType.db2", CreatureTypeLoadInfo::Instance()); +DB2Storage<CriteriaEntry> sCriteriaStore("Criteria.db2", CriteriaLoadInfo::Instance()); +DB2Storage<CriteriaTreeEntry> sCriteriaTreeStore("CriteriaTree.db2", CriteriaTreeLoadInfo::Instance()); +DB2Storage<CurrencyTypesEntry> sCurrencyTypesStore("CurrencyTypes.db2", CurrencyTypesLoadInfo::Instance()); +DB2Storage<CurveEntry> sCurveStore("Curve.db2", CurveLoadInfo::Instance()); +DB2Storage<CurvePointEntry> sCurvePointStore("CurvePoint.db2", CurvePointLoadInfo::Instance()); +DB2Storage<DestructibleModelDataEntry> sDestructibleModelDataStore("DestructibleModelData.db2", DestructibleModelDataLoadInfo::Instance()); +DB2Storage<DifficultyEntry> sDifficultyStore("Difficulty.db2", DifficultyLoadInfo::Instance()); +DB2Storage<DungeonEncounterEntry> sDungeonEncounterStore("DungeonEncounter.db2", DungeonEncounterLoadInfo::Instance()); +DB2Storage<DurabilityCostsEntry> sDurabilityCostsStore("DurabilityCosts.db2", DurabilityCostsLoadInfo::Instance()); +DB2Storage<DurabilityQualityEntry> sDurabilityQualityStore("DurabilityQuality.db2", DurabilityQualityLoadInfo::Instance()); +DB2Storage<EmotesEntry> sEmotesStore("Emotes.db2", EmotesLoadInfo::Instance()); +DB2Storage<EmotesTextEntry> sEmotesTextStore("EmotesText.db2", EmotesTextLoadInfo::Instance()); +DB2Storage<EmotesTextSoundEntry> sEmotesTextSoundStore("EmotesTextSound.db2", EmotesTextSoundLoadInfo::Instance()); +DB2Storage<FactionEntry> sFactionStore("Faction.db2", FactionLoadInfo::Instance()); +DB2Storage<FactionTemplateEntry> sFactionTemplateStore("FactionTemplate.db2", FactionTemplateLoadInfo::Instance()); +DB2Storage<GameObjectsEntry> sGameObjectsStore("GameObjects.db2", GameobjectsLoadInfo::Instance()); +DB2Storage<GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore("GameObjectDisplayInfo.db2", GameobjectDisplayInfoLoadInfo::Instance()); +DB2Storage<GarrAbilityEntry> sGarrAbilityStore("GarrAbility.db2", GarrAbilityLoadInfo::Instance()); +DB2Storage<GarrBuildingEntry> sGarrBuildingStore("GarrBuilding.db2", GarrBuildingLoadInfo::Instance()); +DB2Storage<GarrBuildingPlotInstEntry> sGarrBuildingPlotInstStore("GarrBuildingPlotInst.db2", GarrBuildingPlotInstLoadInfo::Instance()); +DB2Storage<GarrClassSpecEntry> sGarrClassSpecStore("GarrClassSpec.db2", GarrClassSpecLoadInfo::Instance()); +DB2Storage<GarrFollowerEntry> sGarrFollowerStore("GarrFollower.db2", GarrFollowerLoadInfo::Instance()); +DB2Storage<GarrFollowerXAbilityEntry> sGarrFollowerXAbilityStore("GarrFollowerXAbility.db2", GarrFollowerXAbilityLoadInfo::Instance()); +DB2Storage<GarrPlotBuildingEntry> sGarrPlotBuildingStore("GarrPlotBuilding.db2", GarrPlotBuildingLoadInfo::Instance()); +DB2Storage<GarrPlotEntry> sGarrPlotStore("GarrPlot.db2", GarrPlotLoadInfo::Instance()); +DB2Storage<GarrPlotInstanceEntry> sGarrPlotInstanceStore("GarrPlotInstance.db2", GarrPlotInstanceLoadInfo::Instance()); +DB2Storage<GarrSiteLevelEntry> sGarrSiteLevelStore("GarrSiteLevel.db2", GarrSiteLevelLoadInfo::Instance()); +DB2Storage<GarrSiteLevelPlotInstEntry> sGarrSiteLevelPlotInstStore("GarrSiteLevelPlotInst.db2", GarrSiteLevelPlotInstLoadInfo::Instance()); +DB2Storage<GemPropertiesEntry> sGemPropertiesStore("GemProperties.db2", GemPropertiesLoadInfo::Instance()); +DB2Storage<GlyphBindableSpellEntry> sGlyphBindableSpellStore("GlyphBindableSpell.db2", GlyphBindableSpellLoadInfo::Instance()); +DB2Storage<GlyphPropertiesEntry> sGlyphPropertiesStore("GlyphProperties.db2", GlyphPropertiesLoadInfo::Instance()); +DB2Storage<GlyphRequiredSpecEntry> sGlyphRequiredSpecStore("GlyphRequiredSpec.db2", GlyphRequiredSpecLoadInfo::Instance()); +DB2Storage<GuildColorBackgroundEntry> sGuildColorBackgroundStore("GuildColorBackground.db2", GuildColorBackgroundLoadInfo::Instance()); +DB2Storage<GuildColorBorderEntry> sGuildColorBorderStore("GuildColorBorder.db2", GuildColorBorderLoadInfo::Instance()); +DB2Storage<GuildColorEmblemEntry> sGuildColorEmblemStore("GuildColorEmblem.db2", GuildColorEmblemLoadInfo::Instance()); +DB2Storage<GuildPerkSpellsEntry> sGuildPerkSpellsStore("GuildPerkSpells.db2", GuildPerkSpellsLoadInfo::Instance()); +DB2Storage<HeirloomEntry> sHeirloomStore("Heirloom.db2", HeirloomLoadInfo::Instance()); +DB2Storage<HolidaysEntry> sHolidaysStore("Holidays.db2", HolidaysLoadInfo::Instance()); +DB2Storage<ImportPriceArmorEntry> sImportPriceArmorStore("ImportPriceArmor.db2", ImportPriceArmorLoadInfo::Instance()); +DB2Storage<ImportPriceQualityEntry> sImportPriceQualityStore("ImportPriceQuality.db2", ImportPriceQualityLoadInfo::Instance()); +DB2Storage<ImportPriceShieldEntry> sImportPriceShieldStore("ImportPriceShield.db2", ImportPriceShieldLoadInfo::Instance()); +DB2Storage<ImportPriceWeaponEntry> sImportPriceWeaponStore("ImportPriceWeapon.db2", ImportPriceWeaponLoadInfo::Instance()); +DB2Storage<ItemAppearanceEntry> sItemAppearanceStore("ItemAppearance.db2", ItemAppearanceLoadInfo::Instance()); +DB2Storage<ItemArmorQualityEntry> sItemArmorQualityStore("ItemArmorQuality.db2", ItemArmorQualityLoadInfo::Instance()); +DB2Storage<ItemArmorShieldEntry> sItemArmorShieldStore("ItemArmorShield.db2", ItemArmorShieldLoadInfo::Instance()); +DB2Storage<ItemArmorTotalEntry> sItemArmorTotalStore("ItemArmorTotal.db2", ItemArmorTotalLoadInfo::Instance()); +DB2Storage<ItemBagFamilyEntry> sItemBagFamilyStore("ItemBagFamily.db2", ItemBagFamilyLoadInfo::Instance()); +DB2Storage<ItemBonusEntry> sItemBonusStore("ItemBonus.db2", ItemBonusLoadInfo::Instance()); +DB2Storage<ItemBonusListLevelDeltaEntry> sItemBonusListLevelDeltaStore("ItemBonusListLevelDelta.db2", ItemBonusListLevelDeltaLoadInfo::Instance()); +DB2Storage<ItemBonusTreeNodeEntry> sItemBonusTreeNodeStore("ItemBonusTreeNode.db2", ItemBonusTreeNodeLoadInfo::Instance()); +DB2Storage<ItemChildEquipmentEntry> sItemChildEquipmentStore("ItemChildEquipment.db2", ItemChildEquipmentLoadInfo::Instance()); +DB2Storage<ItemClassEntry> sItemClassStore("ItemClass.db2", ItemClassLoadInfo::Instance()); +DB2Storage<ItemCurrencyCostEntry> sItemCurrencyCostStore("ItemCurrencyCost.db2", ItemCurrencyCostLoadInfo::Instance()); +DB2Storage<ItemDamageAmmoEntry> sItemDamageAmmoStore("ItemDamageAmmo.db2", ItemDamageAmmoLoadInfo::Instance()); +DB2Storage<ItemDamageOneHandEntry> sItemDamageOneHandStore("ItemDamageOneHand.db2", ItemDamageOneHandLoadInfo::Instance()); +DB2Storage<ItemDamageOneHandCasterEntry> sItemDamageOneHandCasterStore("ItemDamageOneHandCaster.db2", ItemDamageOneHandCasterLoadInfo::Instance()); +DB2Storage<ItemDamageTwoHandEntry> sItemDamageTwoHandStore("ItemDamageTwoHand.db2", ItemDamageTwoHandLoadInfo::Instance()); +DB2Storage<ItemDamageTwoHandCasterEntry> sItemDamageTwoHandCasterStore("ItemDamageTwoHandCaster.db2", ItemDamageTwoHandCasterLoadInfo::Instance()); +DB2Storage<ItemDisenchantLootEntry> sItemDisenchantLootStore("ItemDisenchantLoot.db2", ItemDisenchantLootLoadInfo::Instance()); +DB2Storage<ItemEffectEntry> sItemEffectStore("ItemEffect.db2", ItemEffectLoadInfo::Instance()); +DB2Storage<ItemEntry> sItemStore("Item.db2", ItemLoadInfo::Instance()); +DB2Storage<ItemExtendedCostEntry> sItemExtendedCostStore("ItemExtendedCost.db2", ItemExtendedCostLoadInfo::Instance()); +DB2Storage<ItemLimitCategoryEntry> sItemLimitCategoryStore("ItemLimitCategory.db2", ItemLimitCategoryLoadInfo::Instance()); +DB2Storage<ItemModifiedAppearanceEntry> sItemModifiedAppearanceStore("ItemModifiedAppearance.db2", ItemModifiedAppearanceLoadInfo::Instance()); +DB2Storage<ItemPriceBaseEntry> sItemPriceBaseStore("ItemPriceBase.db2", ItemPriceBaseLoadInfo::Instance()); +DB2Storage<ItemRandomPropertiesEntry> sItemRandomPropertiesStore("ItemRandomProperties.db2", ItemRandomPropertiesLoadInfo::Instance()); +DB2Storage<ItemRandomSuffixEntry> sItemRandomSuffixStore("ItemRandomSuffix.db2", ItemRandomSuffixLoadInfo::Instance()); +DB2Storage<ItemSearchNameEntry> sItemSearchNameStore("ItemSearchName.db2", ItemSearchNameLoadInfo::Instance()); +DB2Storage<ItemSetEntry> sItemSetStore("ItemSet.db2", ItemSetLoadInfo::Instance()); +DB2Storage<ItemSetSpellEntry> sItemSetSpellStore("ItemSetSpell.db2", ItemSetSpellLoadInfo::Instance()); +DB2Storage<ItemSparseEntry> sItemSparseStore("Item-sparse.db2", ItemSparseLoadInfo::Instance()); +DB2Storage<ItemSpecEntry> sItemSpecStore("ItemSpec.db2", ItemSpecLoadInfo::Instance()); +DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore("ItemSpecOverride.db2", ItemSpecOverrideLoadInfo::Instance()); +DB2Storage<ItemUpgradeEntry> sItemUpgradeStore("ItemUpgrade.db2", ItemUpgradeLoadInfo::Instance()); +DB2Storage<ItemXBonusTreeEntry> sItemXBonusTreeStore("ItemXBonusTree.db2", ItemXBonusTreeLoadInfo::Instance()); +DB2Storage<KeyChainEntry> sKeyChainStore("KeyChain.db2", KeyChainLoadInfo::Instance()); +DB2Storage<LfgDungeonsEntry> sLfgDungeonsStore("LfgDungeons.db2", LfgDungeonsLoadInfo::Instance()); +DB2Storage<LightEntry> sLightStore("Light.db2", LightLoadInfo::Instance()); +DB2Storage<LiquidTypeEntry> sLiquidTypeStore("LiquidType.db2", LiquidTypeLoadInfo::Instance()); +DB2Storage<LockEntry> sLockStore("Lock.db2", LockLoadInfo::Instance()); +DB2Storage<MailTemplateEntry> sMailTemplateStore("MailTemplate.db2", MailTemplateLoadInfo::Instance()); +DB2Storage<MapEntry> sMapStore("Map.db2", MapLoadInfo::Instance()); +DB2Storage<MapDifficultyEntry> sMapDifficultyStore("MapDifficulty.db2", MapDifficultyLoadInfo::Instance()); +DB2Storage<ModifierTreeEntry> sModifierTreeStore("ModifierTree.db2", ModifierTreeLoadInfo::Instance()); +DB2Storage<MountCapabilityEntry> sMountCapabilityStore("MountCapability.db2", MountCapabilityLoadInfo::Instance()); +DB2Storage<MountEntry> sMountStore("Mount.db2", MountLoadInfo::Instance()); +DB2Storage<MountTypeXCapabilityEntry> sMountTypeXCapabilityStore("MountTypeXCapability.db2", MountTypeXCapabilityLoadInfo::Instance()); +DB2Storage<MovieEntry> sMovieStore("Movie.db2", MovieLoadInfo::Instance()); +DB2Storage<NameGenEntry> sNameGenStore("NameGen.db2", NameGenLoadInfo::Instance()); +DB2Storage<NamesProfanityEntry> sNamesProfanityStore("NamesProfanity.db2", NamesProfanityLoadInfo::Instance()); +DB2Storage<NamesReservedEntry> sNamesReservedStore("NamesReserved.db2", NamesReservedLoadInfo::Instance()); +DB2Storage<NamesReservedLocaleEntry> sNamesReservedLocaleStore("NamesReservedLocale.db2", NamesReservedLocaleLoadInfo::Instance()); +DB2Storage<OverrideSpellDataEntry> sOverrideSpellDataStore("OverrideSpellData.db2", OverrideSpellDataLoadInfo::Instance()); +DB2Storage<PhaseEntry> sPhaseStore("Phase.db2", PhaseLoadInfo::Instance()); +DB2Storage<PhaseXPhaseGroupEntry> sPhaseXPhaseGroupStore("PhaseXPhaseGroup.db2", PhaseXPhaseGroupLoadInfo::Instance()); +DB2Storage<PlayerConditionEntry> sPlayerConditionStore("PlayerCondition.db2", PlayerConditionLoadInfo::Instance()); +DB2Storage<PowerDisplayEntry> sPowerDisplayStore("PowerDisplay.db2", PowerDisplayLoadInfo::Instance()); +DB2Storage<PowerTypeEntry> sPowerTypeStore("PowerType.db2", PowerTypeLoadInfo::Instance()); +DB2Storage<PvpDifficultyEntry> sPvpDifficultyStore("PvpDifficulty.db2", PvpDifficultyLoadInfo::Instance()); +DB2Storage<QuestFactionRewardEntry> sQuestFactionRewardStore("QuestFactionReward.db2", QuestFactionRewardLoadInfo::Instance()); +DB2Storage<QuestMoneyRewardEntry> sQuestMoneyRewardStore("QuestMoneyReward.db2", QuestMoneyRewardLoadInfo::Instance()); +DB2Storage<QuestPackageItemEntry> sQuestPackageItemStore("QuestPackageItem.db2", QuestPackageItemLoadInfo::Instance()); +DB2Storage<QuestSortEntry> sQuestSortStore("QuestSort.db2", QuestSortLoadInfo::Instance()); +DB2Storage<QuestV2Entry> sQuestV2Store("QuestV2.db2", QuestV2LoadInfo::Instance()); +DB2Storage<QuestXPEntry> sQuestXPStore("QuestXP.db2", QuestXpLoadInfo::Instance()); +DB2Storage<RandPropPointsEntry> sRandPropPointsStore("RandPropPoints.db2", RandPropPointsLoadInfo::Instance()); +DB2Storage<RulesetItemUpgradeEntry> sRulesetItemUpgradeStore("RulesetItemUpgrade.db2", RulesetItemUpgradeLoadInfo::Instance()); +DB2Storage<ScalingStatDistributionEntry> sScalingStatDistributionStore("ScalingStatDistribution.db2", ScalingStatDistributionLoadInfo::Instance()); +DB2Storage<SceneScriptEntry> sSceneScriptStore("SceneScript.db2", SceneScriptLoadInfo::Instance()); +DB2Storage<SceneScriptPackageEntry> sSceneScriptPackageStore("SceneScriptPackage.db2", SceneScriptPackageLoadInfo::Instance()); +DB2Storage<SkillLineEntry> sSkillLineStore("SkillLine.db2", SkillLineLoadInfo::Instance()); +DB2Storage<SkillLineAbilityEntry> sSkillLineAbilityStore("SkillLineAbility.db2", SkillLineAbilityLoadInfo::Instance()); +DB2Storage<SkillRaceClassInfoEntry> sSkillRaceClassInfoStore("SkillRaceClassInfo.db2", SkillRaceClassInfoLoadInfo::Instance()); +DB2Storage<SoundKitEntry> sSoundKitStore("SoundKit.db2", SoundKitLoadInfo::Instance()); +DB2Storage<SpecializationSpellsEntry> sSpecializationSpellsStore("SpecializationSpells.db2", SpecializationSpellsLoadInfo::Instance()); +DB2Storage<SpellEntry> sSpellStore("Spell.db2", SpellLoadInfo::Instance()); +DB2Storage<SpellAuraOptionsEntry> sSpellAuraOptionsStore("SpellAuraOptions.db2", SpellAuraOptionsLoadInfo::Instance()); +DB2Storage<SpellAuraRestrictionsEntry> sSpellAuraRestrictionsStore("SpellAuraRestrictions.db2", SpellAuraRestrictionsLoadInfo::Instance()); +DB2Storage<SpellCastTimesEntry> sSpellCastTimesStore("SpellCastTimes.db2", SpellCastTimesLoadInfo::Instance()); +DB2Storage<SpellCastingRequirementsEntry> sSpellCastingRequirementsStore("SpellCastingRequirements.db2", SpellCastingRequirementsLoadInfo::Instance()); +DB2Storage<SpellCategoriesEntry> sSpellCategoriesStore("SpellCategories.db2", SpellCategoriesLoadInfo::Instance()); +DB2Storage<SpellCategoryEntry> sSpellCategoryStore("SpellCategory.db2", SpellCategoryLoadInfo::Instance()); +DB2Storage<SpellClassOptionsEntry> sSpellClassOptionsStore("SpellClassOptions.db2", SpellClassOptionsLoadInfo::Instance()); +DB2Storage<SpellCooldownsEntry> sSpellCooldownsStore("SpellCooldowns.db2", SpellCooldownsLoadInfo::Instance()); +DB2Storage<SpellDurationEntry> sSpellDurationStore("SpellDuration.db2", SpellDurationLoadInfo::Instance()); +DB2Storage<SpellEffectEntry> sSpellEffectStore("SpellEffect.db2", SpellEffectLoadInfo::Instance()); +DB2Storage<SpellEffectScalingEntry> sSpellEffectScalingStore("SpellEffectScaling.db2", SpellEffectScalingLoadInfo::Instance()); +DB2Storage<SpellEquippedItemsEntry> sSpellEquippedItemsStore("SpellEquippedItems.db2", SpellEquippedItemsLoadInfo::Instance()); +DB2Storage<SpellFocusObjectEntry> sSpellFocusObjectStore("SpellFocusObject.db2", SpellFocusObjectLoadInfo::Instance()); +DB2Storage<SpellInterruptsEntry> sSpellInterruptsStore("SpellInterrupts.db2", SpellInterruptsLoadInfo::Instance()); +DB2Storage<SpellItemEnchantmentEntry> sSpellItemEnchantmentStore("SpellItemEnchantment.db2", SpellItemEnchantmentLoadInfo::Instance()); +DB2Storage<SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore("SpellItemEnchantmentCondition.db2", SpellItemEnchantmentConditionLoadInfo::Instance()); +DB2Storage<SpellLearnSpellEntry> sSpellLearnSpellStore("SpellLearnSpell.db2", SpellLearnSpellLoadInfo::Instance()); +DB2Storage<SpellLevelsEntry> sSpellLevelsStore("SpellLevels.db2", SpellLevelsLoadInfo::Instance()); +DB2Storage<SpellMiscEntry> sSpellMiscStore("SpellMisc.db2", SpellMiscLoadInfo::Instance()); +DB2Storage<SpellPowerEntry> sSpellPowerStore("SpellPower.db2", SpellPowerLoadInfo::Instance()); +DB2Storage<SpellPowerDifficultyEntry> sSpellPowerDifficultyStore("SpellPowerDifficulty.db2", SpellPowerDifficultyLoadInfo::Instance()); +DB2Storage<SpellProcsPerMinuteEntry> sSpellProcsPerMinuteStore("SpellProcsPerMinute.db2", SpellProcsPerMinuteLoadInfo::Instance()); +DB2Storage<SpellProcsPerMinuteModEntry> sSpellProcsPerMinuteModStore("SpellProcsPerMinuteMod.db2", SpellProcsPerMinuteModLoadInfo::Instance()); +DB2Storage<SpellRadiusEntry> sSpellRadiusStore("SpellRadius.db2", SpellRadiusLoadInfo::Instance()); +DB2Storage<SpellRangeEntry> sSpellRangeStore("SpellRange.db2", SpellRangeLoadInfo::Instance()); +DB2Storage<SpellReagentsEntry> sSpellReagentsStore("SpellReagents.db2", SpellReagentsLoadInfo::Instance()); +DB2Storage<SpellScalingEntry> sSpellScalingStore("SpellScaling.db2", SpellScalingLoadInfo::Instance()); +DB2Storage<SpellShapeshiftEntry> sSpellShapeshiftStore("SpellShapeshift.db2", SpellShapeshiftLoadInfo::Instance()); +DB2Storage<SpellShapeshiftFormEntry> sSpellShapeshiftFormStore("SpellShapeshiftForm.db2", SpellShapeshiftFormLoadInfo::Instance()); +DB2Storage<SpellTargetRestrictionsEntry> sSpellTargetRestrictionsStore("SpellTargetRestrictions.db2", SpellTargetRestrictionsLoadInfo::Instance()); +DB2Storage<SpellTotemsEntry> sSpellTotemsStore("SpellTotems.db2", SpellTotemsLoadInfo::Instance()); +DB2Storage<SpellXSpellVisualEntry> sSpellXSpellVisualStore("SpellXSpellVisual.db2", SpellXSpellVisualLoadInfo::Instance()); +DB2Storage<SummonPropertiesEntry> sSummonPropertiesStore("SummonProperties.db2", SummonPropertiesLoadInfo::Instance()); +DB2Storage<TactKeyEntry> sTactKeyStore("TactKey.db2", TactKeyLoadInfo::Instance()); +DB2Storage<TalentEntry> sTalentStore("Talent.db2", TalentLoadInfo::Instance()); +DB2Storage<TaxiNodesEntry> sTaxiNodesStore("TaxiNodes.db2", TaxiNodesLoadInfo::Instance()); +DB2Storage<TaxiPathEntry> sTaxiPathStore("TaxiPath.db2", TaxiPathLoadInfo::Instance()); +DB2Storage<TaxiPathNodeEntry> sTaxiPathNodeStore("TaxiPathNode.db2", TaxiPathNodeLoadInfo::Instance()); +DB2Storage<TotemCategoryEntry> sTotemCategoryStore("TotemCategory.db2", TotemCategoryLoadInfo::Instance()); +DB2Storage<ToyEntry> sToyStore("Toy.db2", ToyLoadInfo::Instance()); +DB2Storage<TransportAnimationEntry> sTransportAnimationStore("TransportAnimation.db2", TransportAnimationLoadInfo::Instance()); +DB2Storage<TransportRotationEntry> sTransportRotationStore("TransportRotation.db2", TransportRotationLoadInfo::Instance()); +DB2Storage<UnitPowerBarEntry> sUnitPowerBarStore("UnitPowerBar.db2", UnitPowerBarLoadInfo::Instance()); +DB2Storage<VehicleEntry> sVehicleStore("Vehicle.db2", VehicleLoadInfo::Instance()); +DB2Storage<VehicleSeatEntry> sVehicleSeatStore("VehicleSeat.db2", VehicleSeatLoadInfo::Instance()); +DB2Storage<WMOAreaTableEntry> sWMOAreaTableStore("WMOAreaTable.db2", WmoAreaTableLoadInfo::Instance()); +DB2Storage<WorldMapAreaEntry> sWorldMapAreaStore("WorldMapArea.db2", WorldMapAreaLoadInfo::Instance()); +DB2Storage<WorldMapOverlayEntry> sWorldMapOverlayStore("WorldMapOverlay.db2", WorldMapOverlayLoadInfo::Instance()); +DB2Storage<WorldMapTransformsEntry> sWorldMapTransformsStore("WorldMapTransforms.db2", WorldMapTransformsLoadInfo::Instance()); +DB2Storage<WorldSafeLocsEntry> sWorldSafeLocsStore("WorldSafeLocs.db2", WorldSafeLocsLoadInfo::Instance()); TaxiMask sTaxiNodesMask; TaxiMask sOldContinentsNodesMask; @@ -243,10 +243,24 @@ uint32 DB2FilesCount = 0; template<class T, template<class> class DB2> inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, DB2Manager::StorageMap& stores, DB2StorageBase* storage, std::string const& db2Path, uint32 defaultLocale, DB2<T> const& /*hint*/) { - // compatibility format and C++ structure sizes - ASSERT(storage->GetMeta()->GetRecordSize() == sizeof(T), - "Size of '%s' set by format string (%u) not equal size of C++ structure (" SZFMTD ").", - storage->GetFileName().c_str(), storage->GetMeta()->GetRecordSize(), sizeof(T)); + // validate structure + DB2LoadInfo const* loadInfo = storage->GetLoadInfo(); + { + std::string clientMetaString, ourMetaString; + for (std::size_t i = 0; i < loadInfo->Meta->FieldCount; ++i) + for (std::size_t j = 0; j < loadInfo->Meta->ArraySizes[i]; ++j) + clientMetaString += loadInfo->Meta->Types[i]; + + for (std::size_t i = loadInfo->Meta->HasIndexFieldInData() ? 0 : 1; i < loadInfo->FieldCount; ++i) + ourMetaString += char(loadInfo->Fields[i].Type); + + ASSERT(clientMetaString == ourMetaString, "C++ structure fields %s do not match generated types from the client %s", ourMetaString.c_str(), clientMetaString.c_str()); + + // compatibility format and C++ structure sizes + ASSERT(loadInfo->Meta->GetRecordSize() == sizeof(T), + "Size of '%s' set by format string (%u) not equal size of C++ structure (" SZFMTD ").", + storage->GetFileName().c_str(), loadInfo->Meta->GetRecordSize(), sizeof(T)); + } ++DB2FilesCount; @@ -276,7 +290,7 @@ inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, D if (FILE* f = fopen((db2Path + localeNames[defaultLocale] + '/' + storage->GetFileName()).c_str(), "rb")) { std::ostringstream stream; - stream << storage->GetFileName() << " exists, and has " << storage->GetFieldCount() << " field(s) (expected " << storage->GetMeta()->FieldCount + stream << storage->GetFileName() << " exists, and has " << storage->GetFieldCount() << " field(s) (expected " << loadInfo->Meta->FieldCount << "). Extracted file might be from wrong client version."; std::string buf = stream.str(); errlist.push_back(buf); @@ -763,7 +777,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) _powerTypes[powerType->PowerTypeEnum] = powerType; } - for (PvPDifficultyEntry const* entry : sPvpDifficultyStore) + for (PvpDifficultyEntry const* entry : sPvpDifficultyStore) { ASSERT(entry->BracketID < MAX_BATTLEGROUND_BRACKETS, "PvpDifficulty bracket (%d) exceeded max allowed value (%d)", entry->BracketID, MAX_BATTLEGROUND_BRACKETS); } @@ -1557,12 +1571,12 @@ ResponseCodes DB2Manager::ValidateName(std::wstring const& name, LocaleConstant return CHAR_NAME_SUCCESS; } -PvPDifficultyEntry const* DB2Manager::GetBattlegroundBracketByLevel(uint32 mapid, uint32 level) +PvpDifficultyEntry const* DB2Manager::GetBattlegroundBracketByLevel(uint32 mapid, uint32 level) { - PvPDifficultyEntry const* maxEntry = NULL; // used for level > max listed level case + PvpDifficultyEntry const* maxEntry = NULL; // used for level > max listed level case for (uint32 i = 0; i < sPvpDifficultyStore.GetNumRows(); ++i) { - if (PvPDifficultyEntry const* entry = sPvpDifficultyStore.LookupEntry(i)) + if (PvpDifficultyEntry const* entry = sPvpDifficultyStore.LookupEntry(i)) { // skip unrelated and too-high brackets if (entry->MapID != mapid || entry->MinLevel > level) @@ -1581,10 +1595,10 @@ PvPDifficultyEntry const* DB2Manager::GetBattlegroundBracketByLevel(uint32 mapid return maxEntry; } -PvPDifficultyEntry const* DB2Manager::GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id) +PvpDifficultyEntry const* DB2Manager::GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id) { for (uint32 i = 0; i < sPvpDifficultyStore.GetNumRows(); ++i) - if (PvPDifficultyEntry const* entry = sPvpDifficultyStore.LookupEntry(i)) + if (PvpDifficultyEntry const* entry = sPvpDifficultyStore.LookupEntry(i)) if (entry->MapID == mapid && entry->GetBracketId() == id) return entry; diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index bad73578f8b..26f34008e03 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -324,8 +324,8 @@ public: ResponseCodes ValidateName(std::wstring const& name, LocaleConstant locale) const; std::set<uint32> GetPhasesForGroup(uint32 group) const; PowerTypeEntry const* GetPowerTypeEntry(Powers power) const; - static PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level); - static PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id); + static PvpDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level); + static PvpDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id); std::vector<QuestPackageItemEntry const*> const* GetQuestPackageItems(uint32 questPackageID) const; uint32 GetQuestUniqueBitFlag(uint32 questId); uint32 GetRulesetItemUpgrade(uint32 itemId) const; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index 7ad5bfe9405..f889b4e5410 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -178,7 +178,7 @@ struct ArtifactPowerEntry uint8 Flags; uint8 MaxRank; uint32 ID; - uint32 RelicType; + int32 RelicType; }; struct ArtifactPowerLinkEntry @@ -695,7 +695,7 @@ struct CriteriaTreeEntry uint16 Parent; uint16 Flags; uint8 Operator; - uint32 OrderIndex; + int32 OrderIndex; }; struct CurrencyTypesEntry @@ -784,7 +784,7 @@ struct DungeonEncounterEntry uint8 DifficultyID; uint8 Bit; uint8 Flags; - uint32 OrderIndex; + int32 OrderIndex; }; struct DurabilityCostsEntry @@ -810,8 +810,8 @@ struct EmotesEntry uint8 EmoteSpecProc; uint32 EmoteSpecProcParam; uint32 EmoteSoundID; - uint32 ClassMask; - uint32 RaceMask; + int32 ClassMask; + int32 RaceMask; }; struct EmotesTextEntry @@ -981,9 +981,9 @@ struct GarrBuildingEntry uint8 Flags; uint8 MaxShipments; uint8 GarrTypeID; - uint32 BuildDuration; + int32 BuildDuration; int32 CostCurrencyAmount; - uint32 BonusAmount; + int32 BonusAmount; }; struct GarrBuildingPlotInstEntry @@ -1452,7 +1452,7 @@ struct ItemSearchNameEntry uint8 RequiredExpansion; uint8 RequiredReputationRank; uint8 RequiredLevel; - uint32 AllowableClass; + int32 AllowableClass; }; #define MAX_ITEM_SET_ITEMS 17 @@ -1930,7 +1930,7 @@ struct PlayerConditionEntry int8 PowerType; int8 PowerTypeComp; int8 PowerTypeValue; - uint32 ClassMask; + int32 ClassMask; uint32 LanguageID; uint32 MinFactionID[3]; uint32 SpellID[4]; @@ -1944,7 +1944,7 @@ struct PlayerConditionEntry uint32 PhaseGroupID; uint32 MinAvgItemLevel; uint32 MaxAvgItemLevel; - uint32 Unknown700[2]; + int32 Unknown700[2]; }; struct PowerDisplayEntry @@ -1974,7 +1974,7 @@ struct PowerTypeEntry uint8 UIModifier; }; -struct PvPDifficultyEntry +struct PvpDifficultyEntry { uint32 ID; uint16 MapID; @@ -2092,7 +2092,7 @@ struct SkillLineAbilityEntry uint16 TradeSkillCategoryID; uint8 AcquireMethod; uint8 NumSkillUps; - uint32 ClassMask; + int32 ClassMask; }; struct SkillRaceClassInfoEntry @@ -2219,7 +2219,7 @@ struct SpellCategoryEntry uint8 Flags; uint8 UsesPerWeek; uint8 MaxCharges; - uint32 Unk703; + uint32 ChargeCategoryType; }; struct SpellClassOptionsEntry @@ -2264,9 +2264,9 @@ struct SpellEffectEntry uint32 Effect; uint32 EffectAura; uint32 EffectAuraPeriod; - uint32 EffectBasePoints; + int32 EffectBasePoints; uint32 EffectChainTargets; - uint32 EffectDieSides; + int32 EffectDieSides; uint32 EffectItemType; uint32 EffectMechanic; int32 EffectMiscValue; @@ -2411,8 +2411,8 @@ struct SpellPowerEntry uint8 PowerIndex; uint8 PowerType; uint32 ID; - uint32 ManaCostPerLevel; - uint32 ManaCostPerSecond; + int32 ManaCostPerLevel; + int32 ManaCostPerSecond; uint32 ManaCostAdditional; // Spell uses [ManaCost, ManaCost+ManaCostAdditional] power - affects tooltip parsing as multiplier on SpellEffectEntry::EffectPointsPerResource // only SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL, SPELL_EFFECT_WEAPON_PERCENT_DAMAGE, SPELL_EFFECT_WEAPON_DAMAGE, SPELL_EFFECT_NORMALIZED_WEAPON_DMG uint32 PowerDisplayID; @@ -2549,7 +2549,7 @@ struct SummonPropertiesEntry uint32 Flags; uint32 Category; uint32 Faction; - uint32 Type; + int32 Type; int32 Slot; }; @@ -2835,12 +2835,12 @@ struct WorldMapOverlayEntry uint16 TextureHeight; uint32 MapAreaID; // idx in WorldMapArea.dbc uint32 AreaID[MAX_WORLD_MAP_OVERLAY_AREA_IDX]; - uint32 OffsetX; - uint32 OffsetY; - uint32 HitRectTop; - uint32 HitRectLeft; - uint32 HitRectBottom; - uint32 HitRectRight; + int32 OffsetX; + int32 OffsetY; + int32 HitRectTop; + int32 HitRectLeft; + int32 HitRectBottom; + int32 HitRectRight; uint32 PlayerConditionID; uint32 Flags; }; diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 7ad9b1e110e..09d5616a13b 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -1783,7 +1783,7 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* if (!reference) return ERR_BATTLEGROUND_JOIN_FAILED; - PvPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bgOrTemplate->GetMapId(), reference->getLevel()); + PvpDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bgOrTemplate->GetMapId(), reference->getLevel()); if (!bracketEntry) return ERR_BATTLEGROUND_JOIN_FAILED; @@ -1807,7 +1807,7 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* return ERR_BATTLEGROUND_JOIN_TIMED_OUT; } // not in the same battleground level braket, don't let join - PvPDifficultyEntry const* memberBracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bracketEntry->MapID, member->getLevel()); + PvpDifficultyEntry const* memberBracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bracketEntry->MapID, member->getLevel()); if (memberBracketEntry != bracketEntry) return ERR_BATTLEGROUND_JOIN_RANGE_INDEX; // don't let join rated matches if the arena team id doesn't match diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 84a6c77bbe2..8c5e72b62fa 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -95,7 +95,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt return; // expected bracket entry - PvPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); + PvpDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); if (!bracketEntry) return; @@ -314,7 +314,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPackets::Battleground::Battl bgTypeId = bg->GetTypeID(); // expected bracket entry - PvPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); + PvpDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); if (!bracketEntry) return; @@ -475,7 +475,7 @@ void WorldSession::HandleRequestBattlefieldStatusOpcode(WorldPackets::Battlegrou continue; // expected bracket entry - PvPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); + PvpDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); if (!bracketEntry) continue; @@ -511,7 +511,7 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPackets::Battleground::Battl BattlegroundTypeId bgTypeId = bg->GetTypeID(); BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, arenatype); - PvPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); + PvpDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bg->GetMapId(), _player->getLevel()); if (!bracketEntry) return; diff --git a/src/server/shared/DataStores/DB2StorageLoader.cpp b/src/server/shared/DataStores/DB2StorageLoader.cpp index cba5e0e524e..09ad198bbb5 100644 --- a/src/server/shared/DataStores/DB2StorageLoader.cpp +++ b/src/server/shared/DataStores/DB2StorageLoader.cpp @@ -20,11 +20,20 @@ #include "DB2Meta.h" #include "Utilities/ByteConverter.h" +DB2LoadInfo::DB2LoadInfo() : Fields(nullptr), FieldCount(0), Meta(nullptr), Statement(MAX_HOTFIXDATABASE_STATEMENTS) +{ +} + +DB2LoadInfo::DB2LoadInfo(DB2FieldMeta const* fields, std::size_t fieldCount, DB2Meta const* meta, HotfixDatabaseStatements statement) + : Fields(fields), FieldCount(fieldCount), Meta(meta), Statement(statement) +{ +} + class DB2FileLoaderImpl { public: virtual ~DB2FileLoaderImpl() { } - virtual bool Load(char const* filename, FILE* file, DB2Meta const* meta, DB2Header const* header) = 0; + virtual bool Load(char const* filename, FILE* file, DB2LoadInfo const& loadInfo, DB2Header const* header) = 0; virtual char* AutoProduceData(uint32& count, char**& indexTable, std::vector<char*>& stringPool) = 0; virtual char* AutoProduceStrings(char* dataTable, uint32 locale) = 0; virtual void AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable) = 0; @@ -36,7 +45,7 @@ public: DB2FileLoaderRegularImpl(); ~DB2FileLoaderRegularImpl(); - bool Load(char const* filename, FILE* file, DB2Meta const* meta, DB2Header const* header) override; + bool Load(char const* filename, FILE* file, DB2LoadInfo const& loadInfo, DB2Header const* header) override; char* AutoProduceData(uint32& count, char**& indexTable, std::vector<char*>& stringPool) override; char* AutoProduceStrings(char* dataTable, uint32 locale) override; void AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable) override; @@ -46,7 +55,7 @@ private: { public: float getFloat(uint32 field, uint32 arrayIndex) const; - uint32 getUInt(uint32 field, uint32 arrayIndex) const; + uint32 getUInt(uint32 field, uint32 arrayIndex, bool isSigned) const; uint8 getUInt8(uint32 field, uint32 arrayIndex) const; uint16 getUInt16(uint32 field, uint32 arrayIndex) const; char const* getString(uint32 field, uint32 arrayIndex) const; @@ -54,7 +63,7 @@ private: private: uint16 GetOffset(uint32 field) const; uint16 GetByteSize(uint32 field) const; - uint32 GetVarInt(uint32 field, uint16 size, uint32 arrayIndex) const; + uint32 GetVarInt(uint32 field, uint32 arrayIndex, bool isSigned) const; Record(DB2FileLoaderRegularImpl &file_, unsigned char *offset_); unsigned char *offset; @@ -75,8 +84,8 @@ private: #pragma pack(pop) char const* fileName; - DB2Meta const* meta; - DB2Header const* header; + DB2LoadInfo _loadInfo; + DB2Header const* _header; unsigned char* data; unsigned char* stringTable; @@ -92,7 +101,7 @@ public: DB2FileLoaderSparseImpl(); ~DB2FileLoaderSparseImpl(); - bool Load(char const* filename, FILE* file, DB2Meta const* meta, DB2Header const* header) override; + bool Load(char const* filename, FILE* file, DB2LoadInfo const& loadInfo, DB2Header const* header) override; char* AutoProduceData(uint32& records, char**& indexTable, std::vector<char*>& stringPool) override; char* AutoProduceStrings(char* dataTable, uint32 locale) override; void AutoProduceRecordCopies(uint32 /*records*/, char** /*indexTable*/, char* /*dataTable*/) override { } @@ -112,8 +121,8 @@ private: #pragma pack(pop) char const* fileName; - DB2Meta const* meta; - DB2Header const* header; + DB2LoadInfo _loadInfo; + DB2Header const* _header; FieldEntry* fields; uint32 dataStart; @@ -123,28 +132,28 @@ private: float DB2FileLoaderRegularImpl::Record::getFloat(uint32 field, uint32 arrayIndex) const { - ASSERT(field < file.header->FieldCount); + ASSERT(field < file._header->FieldCount); float val = *reinterpret_cast<float*>(offset + GetOffset(field) + arrayIndex * sizeof(float)); EndianConvert(val); return val; } -uint32 DB2FileLoaderRegularImpl::Record::getUInt(uint32 field, uint32 arrayIndex) const +uint32 DB2FileLoaderRegularImpl::Record::getUInt(uint32 field, uint32 arrayIndex, bool isSigned) const { - ASSERT(field < file.header->FieldCount); - return GetVarInt(field, GetByteSize(field), arrayIndex); + ASSERT(field < file._header->FieldCount); + return GetVarInt(field, arrayIndex, isSigned); } uint8 DB2FileLoaderRegularImpl::Record::getUInt8(uint32 field, uint32 arrayIndex) const { - ASSERT(field < file.header->FieldCount); + ASSERT(field < file._header->FieldCount); ASSERT(GetByteSize(field) == 1); return *reinterpret_cast<uint8*>(offset + GetOffset(field) + arrayIndex * sizeof(uint8)); } uint16 DB2FileLoaderRegularImpl::Record::getUInt16(uint32 field, uint32 arrayIndex) const { - ASSERT(field < file.header->FieldCount); + ASSERT(field < file._header->FieldCount); ASSERT(GetByteSize(field) == 2); uint16 val = *reinterpret_cast<uint16*>(offset + GetOffset(field) + arrayIndex * sizeof(uint16)); EndianConvert(val); @@ -153,73 +162,45 @@ uint16 DB2FileLoaderRegularImpl::Record::getUInt16(uint32 field, uint32 arrayInd char const* DB2FileLoaderRegularImpl::Record::getString(uint32 field, uint32 arrayIndex) const { - ASSERT(field < file.header->FieldCount); + ASSERT(field < file._header->FieldCount); uint32 stringOffset = *reinterpret_cast<uint32*>(offset + GetOffset(field) + arrayIndex * sizeof(uint32)); EndianConvert(stringOffset); - ASSERT(stringOffset < file.header->StringTableSize); + ASSERT(stringOffset < file._header->StringTableSize); return reinterpret_cast<char*>(file.stringTable + stringOffset); } uint16 DB2FileLoaderRegularImpl::Record::GetOffset(uint32 field) const { - ASSERT(field < file.header->FieldCount); + ASSERT(field < file._header->FieldCount); return file.fields[field].Offset; } uint16 DB2FileLoaderRegularImpl::Record::GetByteSize(uint32 field) const { - ASSERT(field < file.header->FieldCount); + ASSERT(field < file._header->FieldCount); return 4 - file.fields[field].UnusedBits / 8; } -uint32 DB2FileLoaderRegularImpl::Record::GetVarInt(uint32 field, uint16 size, uint32 arrayIndex) const +uint32 DB2FileLoaderRegularImpl::Record::GetVarInt(uint32 field, uint32 arrayIndex, bool isSigned) const { - ASSERT(field < file.header->FieldCount); - switch (size) - { - case 1: - { - return *reinterpret_cast<uint8*>(offset + GetOffset(field) + arrayIndex * sizeof(uint8)); - } - case 2: - { - uint16 val = *reinterpret_cast<uint16*>(offset + GetOffset(field) + arrayIndex * sizeof(uint16)); - EndianConvert(val); - return val; - } - case 3: - { -#pragma pack(push, 1) - struct dbcint24 { uint8 v[3]; }; -#pragma pack(pop) - dbcint24 val = *reinterpret_cast<dbcint24*>(offset + GetOffset(field) + arrayIndex * sizeof(dbcint24)); - EndianConvert(val); - return uint32(val.v[0]) | (uint32(val.v[1]) << 8) | (uint32(val.v[2]) << 16); - } - case 4: - { - uint32 val = *reinterpret_cast<uint32*>(offset + GetOffset(field) + arrayIndex * sizeof(uint32)); - EndianConvert(val); - return val; - } - default: - break; - } + ASSERT(field < file._header->FieldCount); + uint32 val = *reinterpret_cast<uint32*>(offset + GetOffset(field) + arrayIndex * sizeof(uint32)); + EndianConvert(val); + if (isSigned) + return int32(val) << file.fields[field].UnusedBits >> file.fields[field].UnusedBits; - ASSERT(false, "GetByteSize(field) < 4"); - return 0; + return val << file.fields[field].UnusedBits >> file.fields[field].UnusedBits; } DB2FileLoaderRegularImpl::Record::Record(DB2FileLoaderRegularImpl &file_, unsigned char *offset_) : offset(offset_), file(file_) { - } DB2FileLoaderRegularImpl::DB2FileLoaderRegularImpl() { fileName = nullptr; - meta = nullptr; - header = nullptr; + memset(&_loadInfo, 0, sizeof(_loadInfo)); + _header = nullptr; data = nullptr; stringTable = nullptr; idTable = nullptr; @@ -228,18 +209,18 @@ DB2FileLoaderRegularImpl::DB2FileLoaderRegularImpl() fields = nullptr; } -bool DB2FileLoaderRegularImpl::Load(char const* filename, FILE* file, DB2Meta const* meta_, DB2Header const* header_) +bool DB2FileLoaderRegularImpl::Load(char const* filename, FILE* file, DB2LoadInfo const& loadInfo, DB2Header const* header) { - meta = meta_; - header = header_; - ASSERT(meta->IndexField == -1 || meta->IndexField == int32(header->IndexField)); + _loadInfo = loadInfo; + _header = header; + ASSERT(loadInfo.Meta->IndexField == -1 || loadInfo.Meta->IndexField == int32(header->IndexField)); fileName = filename; fields = new FieldEntry[header->FieldCount]; if (fread(fields, header->FieldCount * sizeof(FieldEntry), 1, file) != 1) return false; - if (!meta->HasIndexFieldInData()) + if (!loadInfo.Meta->HasIndexFieldInData()) idTableSize = header->RecordCount * sizeof(uint32); data = new unsigned char[header->RecordSize * header->RecordCount + header->StringTableSize]; @@ -276,34 +257,34 @@ DB2FileLoaderRegularImpl::~DB2FileLoaderRegularImpl() DB2FileLoaderRegularImpl::Record DB2FileLoaderRegularImpl::getRecord(size_t id) { assert(data); - return Record(*this, data + id * header->RecordSize); + return Record(*this, data + id * _header->RecordSize); } static char const* const nullStr = ""; char* DB2FileLoaderRegularImpl::AutoProduceData(uint32& records, char**& indexTable, std::vector<char*>& stringPool) { - if (meta->FieldCount != header->FieldCount) + if (_loadInfo.Meta->FieldCount != _header->FieldCount) return NULL; //get struct size and index pos - uint32 indexField = meta->GetIndexField(); - uint32 recordsize = meta->GetRecordSize(); + uint32 indexField = _loadInfo.Meta->GetIndexField(); + uint32 recordsize = _loadInfo.Meta->GetRecordSize(); uint32 maxi = 0; //find max index if (!idTableSize) { - for (uint32 y = 0; y < header->RecordCount; ++y) + for (uint32 y = 0; y < _header->RecordCount; ++y) { - uint32 ind = getRecord(y).getUInt(indexField, 0); + uint32 ind = getRecord(y).getUInt(indexField, 0, false); if (ind > maxi) maxi = ind; } } else { - for (uint32 y = 0; y < header->RecordCount; ++y) + for (uint32 y = 0; y < _header->RecordCount; ++y) { uint32 ind = ((uint32*)idTable)[y]; if (ind > maxi) @@ -311,7 +292,7 @@ char* DB2FileLoaderRegularImpl::AutoProduceData(uint32& records, char**& indexTa } } - for (uint32 y = 0; y < header->CopyTableSize; y += 8) + for (uint32 y = 0; y < _header->CopyTableSize; y += 8) { uint32 ind = *((uint32*)(copyTable + y)); if (ind > maxi) @@ -325,18 +306,18 @@ char* DB2FileLoaderRegularImpl::AutoProduceData(uint32& records, char**& indexTa indexTable = new index_entry_t[maxi]; memset(indexTable, 0, maxi * sizeof(index_entry_t)); - char* dataTable = new char[(header->RecordCount + (header->CopyTableSize / 8)) * recordsize]; + char* dataTable = new char[(_header->RecordCount + (_header->CopyTableSize / 8)) * recordsize]; // we store flat holders pool as single memory block - std::size_t stringFields = meta->GetStringFieldCount(false); - std::size_t localizedStringFields = meta->GetStringFieldCount(true); + std::size_t stringFields = _loadInfo.Meta->GetStringFieldCount(false); + std::size_t localizedStringFields = _loadInfo.Meta->GetStringFieldCount(true); // each string field at load have array of string for each locale std::size_t stringHoldersRecordPoolSize = localizedStringFields * sizeof(LocalizedString) + (stringFields - localizedStringFields) * sizeof(char*); char* stringHoldersPool = nullptr; if (stringFields) { - std::size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * header->RecordCount; + std::size_t stringHoldersPoolSize = stringHoldersRecordPoolSize * _header->RecordCount; stringHoldersPool = new char[stringHoldersPoolSize]; stringPool.push_back(stringHoldersPool); @@ -348,33 +329,35 @@ char* DB2FileLoaderRegularImpl::AutoProduceData(uint32& records, char**& indexTa uint32 offset = 0; - for (uint32 y = 0; y < header->RecordCount; y++) + for (uint32 y = 0; y < _header->RecordCount; y++) { Record rec = getRecord(y); - uint32 indexVal = meta->HasIndexFieldInData() ? rec.getUInt(indexField, 0) : ((uint32*)idTable)[y]; + uint32 indexVal = _loadInfo.Meta->HasIndexFieldInData() ? rec.getUInt(indexField, 0, _loadInfo.Fields[0].IsSigned) : ((uint32*)idTable)[y]; indexTable[indexVal] = &dataTable[offset]; - if (!meta->HasIndexFieldInData()) + uint32 fieldIndex = 0; + if (!_loadInfo.Meta->HasIndexFieldInData()) { *((uint32*)(&dataTable[offset])) = indexVal; offset += 4; + ++fieldIndex; } uint32 stringFieldOffset = 0; - for (uint32 x = 0; x < header->FieldCount; ++x) + for (uint32 x = 0; x < _header->FieldCount; ++x) { - for (uint32 z = 0; z < meta->ArraySizes[x]; ++z) + for (uint32 z = 0; z < _loadInfo.Meta->ArraySizes[x]; ++z) { - switch (meta->Types[x]) + switch (_loadInfo.Meta->Types[x]) { case FT_FLOAT: *((float*)(&dataTable[offset])) = rec.getFloat(x, z); offset += 4; break; case FT_INT: - *((uint32*)(&dataTable[offset])) = rec.getUInt(x, z); + *((uint32*)(&dataTable[offset])) = rec.getUInt(x, z, _loadInfo.Fields[fieldIndex].IsSigned); offset += 4; break; case FT_BYTE: @@ -391,7 +374,7 @@ char* DB2FileLoaderRegularImpl::AutoProduceData(uint32& records, char**& indexTa // init db2 string field slots by pointers to string holders char const*** slot = (char const***)(&dataTable[offset]); *slot = (char const**)(&stringHoldersPool[stringHoldersRecordPoolSize * y + stringFieldOffset]); - if (meta->Types[x] == FT_STRING) + if (_loadInfo.Meta->Types[x] == FT_STRING) stringFieldOffset += sizeof(LocalizedString); else stringFieldOffset += sizeof(char*); @@ -400,9 +383,10 @@ char* DB2FileLoaderRegularImpl::AutoProduceData(uint32& records, char**& indexTa break; } default: - ASSERT(false, "Unknown format character '%c' found in %s meta", meta->Types[x], fileName); + ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo.Meta->Types[x], fileName); break; } + ++fieldIndex; } } } @@ -412,16 +396,16 @@ char* DB2FileLoaderRegularImpl::AutoProduceData(uint32& records, char**& indexTa char* DB2FileLoaderRegularImpl::AutoProduceStrings(char* dataTable, uint32 locale) { - if (meta->FieldCount != header->FieldCount) + if (_loadInfo.Meta->FieldCount != _header->FieldCount) return nullptr; - if (!(header->Locale & (1 << locale))) + if (!(_header->Locale & (1 << locale))) { char const* sep = ""; std::ostringstream str; for (uint32 i = 0; i < TOTAL_LOCALES; ++i) { - if (header->Locale & (1 << i)) + if (_header->Locale & (1 << i)) { str << sep << localeNames[i]; sep = ", "; @@ -432,21 +416,21 @@ char* DB2FileLoaderRegularImpl::AutoProduceStrings(char* dataTable, uint32 local return nullptr; } - char* stringPool = new char[header->StringTableSize]; - memcpy(stringPool, stringTable, header->StringTableSize); + char* stringPool = new char[_header->StringTableSize]; + memcpy(stringPool, stringTable, _header->StringTableSize); uint32 offset = 0; - for (uint32 y = 0; y < header->RecordCount; y++) + for (uint32 y = 0; y < _header->RecordCount; y++) { - if (!meta->HasIndexFieldInData()) + if (!_loadInfo.Meta->HasIndexFieldInData()) offset += 4; - for (uint32 x = 0; x < header->FieldCount; ++x) + for (uint32 x = 0; x < _header->FieldCount; ++x) { - for (uint32 z = 0; z < meta->ArraySizes[x]; ++z) + for (uint32 z = 0; z < _loadInfo.Meta->ArraySizes[x]; ++z) { - switch (meta->Types[x]) + switch (_loadInfo.Meta->Types[x]) { case FT_FLOAT: case FT_INT: @@ -480,7 +464,7 @@ char* DB2FileLoaderRegularImpl::AutoProduceStrings(char* dataTable, uint32 local break; } default: - ASSERT(false, "Unknown format character '%c' found in %s meta", meta->Types[x], fileName); + ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo.Meta->Types[x], fileName); break; } } @@ -492,10 +476,10 @@ char* DB2FileLoaderRegularImpl::AutoProduceStrings(char* dataTable, uint32 local void DB2FileLoaderRegularImpl::AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable) { - uint32 recordsize = meta->GetRecordSize(); - uint32 offset = header->RecordCount * recordsize; + uint32 recordsize = _loadInfo.Meta->GetRecordSize(); + uint32 offset = _header->RecordCount * recordsize; uint32* copyIds = (uint32*)copyTable; - for (uint32 c = 0; c < header->CopyTableSize / 4; c += 2) + for (uint32 c = 0; c < _header->CopyTableSize / 4; c += 2) { uint32 to = copyIds[c]; uint32 from = copyIds[c + 1]; @@ -505,8 +489,8 @@ void DB2FileLoaderRegularImpl::AutoProduceRecordCopies(uint32 records, char** in indexTable[to] = &dataTable[offset]; memcpy(indexTable[to], indexTable[from], recordsize); - if (meta->HasIndexFieldInData()) - *((uint32*)(&dataTable[offset + fields[meta->GetIndexField()].Offset])) = to; + if (_loadInfo.Meta->HasIndexFieldInData()) + *((uint32*)(&dataTable[offset + fields[_loadInfo.Meta->GetIndexField()].Offset])) = to; else *((uint32*)(&dataTable[offset])) = to; @@ -518,18 +502,18 @@ void DB2FileLoaderRegularImpl::AutoProduceRecordCopies(uint32 records, char** in DB2FileLoaderSparseImpl::DB2FileLoaderSparseImpl() { fileName = nullptr; - meta = nullptr; - header = nullptr; + memset(&_loadInfo, 0, sizeof(_loadInfo)); + _header = nullptr; fields = nullptr; dataStart = 0; data = nullptr; offsets = nullptr; } -bool DB2FileLoaderSparseImpl::Load(char const* filename, FILE* file, DB2Meta const* meta_, DB2Header const* header_) +bool DB2FileLoaderSparseImpl::Load(char const* filename, FILE* file, DB2LoadInfo const& loadInfo, DB2Header const* header) { - meta = meta_; - header = header_; + _loadInfo = loadInfo; + _header = header; fileName = filename; fields = new FieldEntry[header->FieldCount]; @@ -559,13 +543,13 @@ DB2FileLoaderSparseImpl::~DB2FileLoaderSparseImpl() char* DB2FileLoaderSparseImpl::AutoProduceData(uint32& maxId, char**& indexTable, std::vector<char*>& stringPool) { - if (meta->FieldCount != header->FieldCount) + if (_loadInfo.Meta->FieldCount != _header->FieldCount) return NULL; //get struct size and index pos - uint32 recordsize = meta->GetRecordSize(); + uint32 recordsize = _loadInfo.Meta->GetRecordSize(); - uint32 offsetCount = header->MaxId - header->MinId + 1; + uint32 offsetCount = _header->MaxId - _header->MinId + 1; uint32 records = 0; uint32 expandedDataSize = 0; for (uint32 i = 0; i < offsetCount; ++i) @@ -579,15 +563,15 @@ char* DB2FileLoaderSparseImpl::AutoProduceData(uint32& maxId, char**& indexTable using index_entry_t = char*; - maxId = header->MaxId + 1; + maxId = _header->MaxId + 1; indexTable = new index_entry_t[maxId]; memset(indexTable, 0, maxId * sizeof(index_entry_t)); char* dataTable = new char[records * recordsize]; // we store flat holders pool as single memory block - std::size_t stringFields = meta->GetStringFieldCount(false); - std::size_t localizedStringFields = meta->GetStringFieldCount(true); + std::size_t stringFields = _loadInfo.Meta->GetStringFieldCount(false); + std::size_t localizedStringFields = _loadInfo.Meta->GetStringFieldCount(true); // each string field at load have array of string for each locale std::size_t stringHoldersRecordPoolSize = localizedStringFields * sizeof(LocalizedString) + (stringFields - localizedStringFields) * sizeof(char*); @@ -600,8 +584,8 @@ char* DB2FileLoaderSparseImpl::AutoProduceData(uint32& maxId, char**& indexTable for (std::size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i) ((char const**)stringHoldersPool)[i] = nullStr; - char* stringTable = new char[expandedDataSize - records * ((recordsize - (!meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))]; - memset(stringTable, 0, expandedDataSize - records * ((recordsize - (!meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))); + char* stringTable = new char[expandedDataSize - records * ((recordsize - (!_loadInfo.Meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))]; + memset(stringTable, 0, expandedDataSize - records * ((recordsize - (!_loadInfo.Meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))); stringPool.push_back(stringTable); char* stringPtr = stringTable; @@ -612,23 +596,23 @@ char* DB2FileLoaderSparseImpl::AutoProduceData(uint32& maxId, char**& indexTable if (!offsets[y].FileOffset || !offsets[y].RecordSize) continue; - indexTable[y + header->MinId] = &dataTable[offset]; - ASSERT(indexTable[y + header->MinId]); + indexTable[y + _header->MinId] = &dataTable[offset]; + ASSERT(indexTable[y + _header->MinId]); std::size_t fieldOffset = 0; uint32 stringFieldOffset = 0; - if (!meta->HasIndexFieldInData()) + if (!_loadInfo.Meta->HasIndexFieldInData()) { - *((uint32*)(&dataTable[offset])) = y + header->MinId; + *((uint32*)(&dataTable[offset])) = y + _header->MinId; offset += 4; } - for (uint32 x = 0; x < header->FieldCount; ++x) + for (uint32 x = 0; x < _header->FieldCount; ++x) { uint16 fieldBytes = 4 - fields[x].UnusedBits / 8; - for (uint32 z = 0; z < meta->ArraySizes[x]; ++z) + for (uint32 z = 0; z < _loadInfo.Meta->ArraySizes[x]; ++z) { - switch (meta->Types[x]) + switch (_loadInfo.Meta->Types[x]) { case FT_FLOAT: { @@ -700,7 +684,7 @@ char* DB2FileLoaderSparseImpl::AutoProduceData(uint32& maxId, char**& indexTable LocalizedString** slot = (LocalizedString**)(&dataTable[offset]); *slot = (LocalizedString*)(&stringHoldersPool[stringHoldersRecordPoolSize * recordNum + stringFieldOffset]); for (uint32 locale = 0; locale < TOTAL_LOCALES; ++locale) - if (header->Locale & (1 << locale)) + if (_header->Locale & (1 << locale)) (*slot)->Str[locale] = stringPtr; strcpy(stringPtr, (char*)&data[offsets[y].FileOffset - dataStart + fieldOffset]); fieldOffset += strlen(stringPtr) + 1; @@ -722,7 +706,7 @@ char* DB2FileLoaderSparseImpl::AutoProduceData(uint32& maxId, char**& indexTable break; } default: - ASSERT(false, "Unknown format character '%c' found in %s meta", meta->Types[x], fileName); + ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo.Meta->Types[x], fileName); break; } } @@ -736,16 +720,16 @@ char* DB2FileLoaderSparseImpl::AutoProduceData(uint32& maxId, char**& indexTable char* DB2FileLoaderSparseImpl::AutoProduceStrings(char* dataTable, uint32 locale) { - if (meta->FieldCount != header->FieldCount) + if (_loadInfo.Meta->FieldCount != _header->FieldCount) return nullptr; - if (!(header->Locale & (1 << locale))) + if (!(_header->Locale & (1 << locale))) { char const* sep = ""; std::ostringstream str; for (uint32 i = 0; i < TOTAL_LOCALES; ++i) { - if (header->Locale & (1 << i)) + if (_header->Locale & (1 << i)) { str << sep << localeNames[i]; sep = ", "; @@ -756,16 +740,16 @@ char* DB2FileLoaderSparseImpl::AutoProduceStrings(char* dataTable, uint32 locale return nullptr; } - uint32 offsetCount = header->MaxId - header->MinId + 1; + uint32 offsetCount = _header->MaxId - _header->MinId + 1; uint32 records = 0; for (uint32 i = 0; i < offsetCount; ++i) if (offsets[i].FileOffset && offsets[i].RecordSize) ++records; - uint32 recordsize = meta->GetRecordSize(); - std::size_t stringFields = meta->GetStringFieldCount(true); - char* stringTable = new char[header->StringTableSize - dataStart - records * ((recordsize - (!meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))]; - memset(stringTable, 0, header->StringTableSize - dataStart - records * ((recordsize - (!meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))); + uint32 recordsize = _loadInfo.Meta->GetRecordSize(); + std::size_t stringFields = _loadInfo.Meta->GetStringFieldCount(true); + char* stringTable = new char[_header->StringTableSize - dataStart - records * ((recordsize - (!_loadInfo.Meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))]; + memset(stringTable, 0, _header->StringTableSize - dataStart - records * ((recordsize - (!_loadInfo.Meta->HasIndexFieldInData() ? 4 : 0)) - stringFields * sizeof(char*))); char* stringPtr = stringTable; uint32 offset = 0; @@ -775,15 +759,15 @@ char* DB2FileLoaderSparseImpl::AutoProduceStrings(char* dataTable, uint32 locale if (!offsets[y].FileOffset || !offsets[y].RecordSize) continue; - if (!meta->HasIndexFieldInData()) + if (!_loadInfo.Meta->HasIndexFieldInData()) offset += 4; std::size_t fieldOffset = 0; - for (uint32 x = 0; x < header->FieldCount; ++x) + for (uint32 x = 0; x < _header->FieldCount; ++x) { - for (uint32 z = 0; z < meta->ArraySizes[x]; ++z) + for (uint32 z = 0; z < _loadInfo.Meta->ArraySizes[x]; ++z) { - switch (meta->Types[x]) + switch (_loadInfo.Meta->Types[x]) { case FT_FLOAT: offset += 4; @@ -818,7 +802,7 @@ char* DB2FileLoaderSparseImpl::AutoProduceStrings(char* dataTable, uint32 locale break; } default: - ASSERT(false, "Unknown format character '%c' found in %s meta", meta->Types[x], fileName); + ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo.Meta->Types[x], fileName); break; } } @@ -828,23 +812,23 @@ char* DB2FileLoaderSparseImpl::AutoProduceStrings(char* dataTable, uint32 locale return stringTable; } -char* DB2DatabaseLoader::Load(HotfixDatabaseStatements preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::vector<char*>& stringPool) +char* DB2DatabaseLoader::Load(uint32& records, char**& indexTable, char*& stringHolders, std::vector<char*>& stringPool) { // Even though this query is executed only once, prepared statement is used to send data from mysql server in binary format - PreparedQueryResult result = HotfixDatabase.Query(HotfixDatabase.GetPreparedStatement(preparedStatement)); + PreparedQueryResult result = HotfixDatabase.Query(HotfixDatabase.GetPreparedStatement(_loadInfo.Statement)); if (!result) return nullptr; - if (_meta->GetDbFieldCount() != result->GetFieldCount()) + if (_loadInfo.Meta->GetDbFieldCount() != result->GetFieldCount()) return nullptr; // get struct size and index pos - uint32 indexField = _meta->GetDbIndexField(); - uint32 recordSize = _meta->GetRecordSize(); + uint32 indexField = _loadInfo.Meta->GetDbIndexField(); + uint32 recordSize = _loadInfo.Meta->GetRecordSize(); // we store flat holders pool as single memory block - std::size_t stringFields = _meta->GetStringFieldCount(false); - std::size_t localizedStringFields = _meta->GetStringFieldCount(true); + std::size_t stringFields = _loadInfo.Meta->GetStringFieldCount(false); + std::size_t localizedStringFields = _loadInfo.Meta->GetStringFieldCount(true); // each string field at load have array of string for each locale std::size_t stringHoldersRecordPoolSize = localizedStringFields * sizeof(LocalizedString) + (stringFields - localizedStringFields) * sizeof(char*); @@ -898,18 +882,18 @@ char* DB2DatabaseLoader::Load(HotfixDatabaseStatements preparedStatement, uint32 } uint32 f = 0; - if (!_meta->HasIndexFieldInData()) + if (!_loadInfo.Meta->HasIndexFieldInData()) { *((uint32*)(&dataValue[offset])) = indexValue; offset += 4; ++f; } - for (uint32 x = 0; x < _meta->FieldCount; ++x) + for (uint32 x = 0; x < _loadInfo.Meta->FieldCount; ++x) { - for (uint32 z = 0; z < _meta->ArraySizes[x]; ++z) + for (uint32 z = 0; z < _loadInfo.Meta->ArraySizes[x]; ++z) { - switch (_meta->Types[x]) + switch (_loadInfo.Meta->Types[x]) { case FT_FLOAT: *((float*)(&dataValue[offset])) = fields[f].GetFloat(); @@ -956,7 +940,7 @@ char* DB2DatabaseLoader::Load(HotfixDatabaseStatements preparedStatement, uint32 break; } default: - ASSERT(false, "Unknown format character '%c' found in %s meta", _meta->Types[x], _storageName.c_str()); + ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo.Meta->Types[x], _storageName.c_str()); break; } ++f; @@ -990,20 +974,20 @@ char* DB2DatabaseLoader::Load(HotfixDatabaseStatements preparedStatement, uint32 return dataTable; } -void DB2DatabaseLoader::LoadStrings(HotfixDatabaseStatements preparedStatement, uint32 locale, uint32 records, char** indexTable, std::vector<char*>& stringPool) +void DB2DatabaseLoader::LoadStrings(uint32 locale, uint32 records, char** indexTable, std::vector<char*>& stringPool) { - PreparedStatement* stmt = HotfixDatabase.GetPreparedStatement(preparedStatement); + PreparedStatement* stmt = HotfixDatabase.GetPreparedStatement(HotfixDatabaseStatements(_loadInfo.Statement + 1)); stmt->setString(0, localeNames[locale]); PreparedQueryResult result = HotfixDatabase.Query(stmt); if (!result) return; - std::size_t stringFields = _meta->GetStringFieldCount(true); + std::size_t stringFields = _loadInfo.Meta->GetStringFieldCount(true); if (result->GetFieldCount() != stringFields + 1 /*ID*/) return; - uint32 fieldCount = _meta->FieldCount; - uint32 recordSize = _meta->GetRecordSize(); + uint32 fieldCount = _loadInfo.Meta->FieldCount; + uint32 recordSize = _loadInfo.Meta->GetRecordSize(); do { @@ -1018,14 +1002,14 @@ void DB2DatabaseLoader::LoadStrings(HotfixDatabaseStatements preparedStatement, // Attempt to overwrite existing data if (char* dataValue = indexTable[indexValue]) { - if (!_meta->HasIndexFieldInData()) + if (!_loadInfo.Meta->HasIndexFieldInData()) offset += 4; for (uint32 x = 0; x < fieldCount; ++x) { - for (uint32 z = 0; z < _meta->ArraySizes[x]; ++z) + for (uint32 z = 0; z < _loadInfo.Meta->ArraySizes[x]; ++z) { - switch (_meta->Types[x]) + switch (_loadInfo.Meta->Types[x]) { case FT_FLOAT: case FT_INT: @@ -1053,7 +1037,7 @@ void DB2DatabaseLoader::LoadStrings(HotfixDatabaseStatements preparedStatement, offset += sizeof(char*); break; default: - ASSERT(false, "Unknown format character '%c' found in %s meta", _meta->Types[x], _storageName.c_str()); + ASSERT(false, "Unknown format character '%c' found in %s meta", _loadInfo.Meta->Types[x], _storageName.c_str()); break; } } @@ -1102,7 +1086,7 @@ DB2FileLoader::~DB2FileLoader() delete _impl; } -bool DB2FileLoader::Load(char const* filename, DB2Meta const* meta) +bool DB2FileLoader::Load(char const* filename, DB2LoadInfo const& loadInfo) { FILE* f = fopen(filename, "rb"); if (!f) @@ -1170,7 +1154,7 @@ bool DB2FileLoader::Load(char const* filename, DB2Meta const* meta) EndianConvert(_header.LayoutHash); - if (_header.LayoutHash != meta->LayoutHash) + if (_header.LayoutHash != loadInfo.Meta->LayoutHash) { fclose(f); return false; @@ -1221,7 +1205,7 @@ bool DB2FileLoader::Load(char const* filename, DB2Meta const* meta) else _impl = new DB2FileLoaderSparseImpl(); - bool result = _impl->Load(filename, f, meta, &_header); + bool result = _impl->Load(filename, f, loadInfo, &_header); fclose(f); return result; } diff --git a/src/server/shared/DataStores/DB2StorageLoader.h b/src/server/shared/DataStores/DB2StorageLoader.h index 4cf55becc8d..e8a34c7977d 100644 --- a/src/server/shared/DataStores/DB2StorageLoader.h +++ b/src/server/shared/DataStores/DB2StorageLoader.h @@ -23,6 +23,7 @@ class DB2FileLoaderImpl; struct DB2Meta; +struct DB2FieldMeta; #pragma pack(push, 1) struct DB2Header @@ -43,13 +44,24 @@ struct DB2Header }; #pragma pack(pop) +struct TC_SHARED_API DB2LoadInfo +{ + DB2LoadInfo(); + DB2LoadInfo(DB2FieldMeta const* fields, std::size_t fieldCount, DB2Meta const* meta, HotfixDatabaseStatements statement); + + DB2FieldMeta const* Fields; + std::size_t FieldCount; + DB2Meta const* Meta; + HotfixDatabaseStatements Statement; +}; + class TC_SHARED_API DB2FileLoader { public: DB2FileLoader(); ~DB2FileLoader(); - bool Load(char const* filename, DB2Meta const* meta); + bool Load(char const* filename, DB2LoadInfo const& loadInfo); char* AutoProduceData(uint32& count, char**& indexTable, std::vector<char*>& stringPool); char* AutoProduceStrings(char* dataTable, uint32 locale); void AutoProduceRecordCopies(uint32 records, char** indexTable, char* dataTable); @@ -66,15 +78,15 @@ private: class TC_SHARED_API DB2DatabaseLoader { public: - DB2DatabaseLoader(std::string const& storageName, DB2Meta const* meta) : _storageName(storageName), _meta(meta) { } + DB2DatabaseLoader(std::string const& storageName, DB2LoadInfo const& loadInfo) : _storageName(storageName), _loadInfo(loadInfo) { } - char* Load(HotfixDatabaseStatements preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::vector<char*>& stringPool); - void LoadStrings(HotfixDatabaseStatements preparedStatement, uint32 locale, uint32 records, char** indexTable, std::vector<char*>& stringPool); + char* Load(uint32& records, char**& indexTable, char*& stringHolders, std::vector<char*>& stringPool); + void LoadStrings(uint32 locale, uint32 records, char** indexTable, std::vector<char*>& stringPool); static char* AddString(char const** holder, std::string const& value); private: std::string _storageName; - DB2Meta const* _meta; + DB2LoadInfo _loadInfo; }; #endif diff --git a/src/server/shared/DataStores/DB2Store.h b/src/server/shared/DataStores/DB2Store.h index 0c63feba93c..dde7fd1a1b4 100644 --- a/src/server/shared/DataStores/DB2Store.h +++ b/src/server/shared/DataStores/DB2Store.h @@ -28,8 +28,8 @@ class DB2StorageBase { public: - DB2StorageBase(char const* fileName, DB2Meta const* meta, HotfixDatabaseStatements preparedStmtIndex) - : _tableHash(0), _layoutHash(0), _fileName(fileName), _fieldCount(0), _meta(meta), _dataTable(nullptr), _dataTableEx(nullptr), _hotfixStatement(preparedStmtIndex) { } + DB2StorageBase(char const* fileName, DB2LoadInfo loadInfo) + : _tableHash(0), _layoutHash(0), _fileName(fileName), _fieldCount(0), _loadInfo(loadInfo), _dataTable(nullptr), _dataTableEx(nullptr) { } virtual ~DB2StorageBase() { @@ -53,7 +53,7 @@ public: uint32 GetFieldCount() const { return _fieldCount; } - DB2Meta const* GetMeta() const { return _meta; } + DB2LoadInfo const* GetLoadInfo() const { return &_loadInfo; } virtual bool Load(std::string const& path, uint32 locale) = 0; virtual bool LoadStringsFrom(std::string const& path, uint32 locale) = 0; @@ -63,14 +63,14 @@ public: protected: void WriteRecordData(char const* entry, uint32 locale, ByteBuffer& buffer) const { - if (!_meta->HasIndexFieldInData()) + if (!_loadInfo.Meta->HasIndexFieldInData()) entry += 4; - for (uint32 i = 0; i < _meta->FieldCount; ++i) + for (uint32 i = 0; i < _loadInfo.Meta->FieldCount; ++i) { - for (uint32 a = 0; a < _meta->ArraySizes[i]; ++a) + for (uint32 a = 0; a < _loadInfo.Meta->ArraySizes[i]; ++a) { - switch (_meta->Types[i]) + switch (_loadInfo.Meta->Types[i]) { case FT_INT: buffer << *(uint32*)entry; @@ -113,11 +113,10 @@ protected: uint32 _layoutHash; std::string _fileName; uint32 _fieldCount; - DB2Meta const* _meta; + DB2LoadInfo _loadInfo; char* _dataTable; char* _dataTableEx; std::vector<char*> _stringPool; - HotfixDatabaseStatements _hotfixStatement; }; template<class T> @@ -128,7 +127,7 @@ class DB2Storage : public DB2StorageBase public: typedef DBStorageIterator<T> iterator; - DB2Storage(char const* fileName, DB2Meta const* meta, HotfixDatabaseStatements preparedStmtIndex) : DB2StorageBase(fileName, meta, preparedStmtIndex), + DB2Storage(char const* fileName, DB2LoadInfo loadInfo) : DB2StorageBase(fileName, loadInfo), _indexTableSize(0) { _indexTable.AsT = NULL; @@ -155,7 +154,7 @@ public: { DB2FileLoader db2; // Check if load was successful, only then continue - if (!db2.Load((path + _fileName).c_str(), _meta)) + if (!db2.Load((path + _fileName).c_str(), _loadInfo)) return false; _fieldCount = db2.GetCols(); @@ -184,11 +183,11 @@ public: DB2FileLoader db2; // Check if load was successful, only then continue - if (!db2.Load((path + _fileName).c_str(), _meta)) + if (!db2.Load((path + _fileName).c_str(), _loadInfo)) return false; // load strings from another locale db2 data - if (_meta->GetStringFieldCount(true)) + if (_loadInfo.Meta->GetStringFieldCount(true)) if (char* stringBlock = db2.AutoProduceStrings(_dataTable, locale)) _stringPool.push_back(stringBlock); return true; @@ -197,17 +196,17 @@ public: void LoadFromDB() override { char* extraStringHolders = nullptr; - _dataTableEx = DB2DatabaseLoader(_fileName, _meta).Load(_hotfixStatement, _indexTableSize, _indexTable.AsChar, extraStringHolders, _stringPool); + _dataTableEx = DB2DatabaseLoader(_fileName, _loadInfo).Load(_indexTableSize, _indexTable.AsChar, extraStringHolders, _stringPool); if (extraStringHolders) _stringPool.push_back(extraStringHolders); } void LoadStringsFromDB(uint32 locale) override { - if (!_meta->GetStringFieldCount(true)) + if (!_loadInfo.Meta->GetStringFieldCount(true)) return; - DB2DatabaseLoader(_fileName, _meta).LoadStrings(HotfixDatabaseStatements(_hotfixStatement + 1), locale, _indexTableSize, _indexTable.AsChar, _stringPool); + DB2DatabaseLoader(_fileName, _loadInfo).LoadStrings(locale, _indexTableSize, _indexTable.AsChar, _stringPool); } iterator begin() { return iterator(_indexTable.AsT, _indexTableSize); } |