aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2016-10-09 16:54:11 +0200
committerShauren <shauren.trinity@gmail.com>2016-10-09 16:54:11 +0200
commitd34020da7f34943e9cc84482ce19f829154334bd (patch)
tree97a0ca5879bf3cdb6c9c6dd59a5e732b8c4531bf /src
parent8fba569cb93e8497b639056fc07fd3f049bac959 (diff)
Core/DataStores: Fixed loading signed db2 fields
Diffstat (limited to 'src')
-rw-r--r--src/common/DataStores/DB2Meta.cpp5
-rw-r--r--src/common/DataStores/DB2Meta.h9
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.cpp8
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp2
-rw-r--r--src/server/game/Battlegrounds/Battleground.h4
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.cpp2
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.h2
-rw-r--r--src/server/game/Battlegrounds/BattlegroundQueue.cpp4
-rw-r--r--src/server/game/Battlegrounds/BattlegroundQueue.h2
-rw-r--r--src/server/game/DataStores/DB2LoadInfo.h4683
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp446
-rw-r--r--src/server/game/DataStores/DB2Stores.h4
-rw-r--r--src/server/game/DataStores/DB2Structure.h48
-rw-r--r--src/server/game/Groups/Group.cpp4
-rw-r--r--src/server/game/Handlers/BattleGroundHandler.cpp8
-rw-r--r--src/server/shared/DataStores/DB2StorageLoader.cpp298
-rw-r--r--src/server/shared/DataStores/DB2StorageLoader.h22
-rw-r--r--src/server/shared/DataStores/DB2Store.h31
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); }