aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/DataStores/DB2LoadInfo.h1690
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp557
-rw-r--r--src/server/game/DataStores/DB2Stores.h8
-rw-r--r--src/server/game/DataStores/DB2Structure.h49
-rw-r--r--src/server/game/DataStores/DBCEnums.h30
-rw-r--r--src/server/game/DataStores/GameTables.cpp2
-rw-r--r--src/server/game/Entities/Taxi/TaxiPathGraph.cpp19
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp15
-rw-r--r--src/server/game/Globals/ObjectMgr.h4
-rw-r--r--src/server/game/Phasing/PhaseShift.cpp16
-rw-r--r--src/server/game/Phasing/PhaseShift.h14
-rw-r--r--src/server/game/Phasing/PhasingHandler.cpp41
-rw-r--r--src/server/game/Server/Packets/MiscPackets.cpp8
-rw-r--r--src/server/game/Server/Packets/MiscPackets.h2
-rw-r--r--src/server/game/Spells/SpellInfo.cpp27
15 files changed, 1525 insertions, 957 deletions
diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h
index a6b4c1c0426..bf831521cba 100644
--- a/src/server/game/DataStores/DB2LoadInfo.h
+++ b/src/server/game/DataStores/DB2LoadInfo.h
@@ -30,21 +30,21 @@ struct AchievementLoadInfo
{
static DB2FieldMeta const fields[] =
{
- { false, FT_STRING, "Title" },
{ false, FT_STRING, "Description" },
+ { false, FT_STRING, "Title" },
{ false, FT_STRING, "Reward" },
- { true, FT_INT, "Flags" },
+ { false, FT_INT, "ID" },
{ true, FT_SHORT, "InstanceID" },
+ { true, FT_BYTE, "Faction" },
{ true, FT_SHORT, "Supercedes" },
{ true, FT_SHORT, "Category" },
- { true, FT_SHORT, "UiOrder" },
- { true, FT_SHORT, "SharesCriteria" },
- { true, FT_BYTE, "Faction" },
- { true, FT_BYTE, "Points" },
{ true, FT_BYTE, "MinimumCriteria" },
- { false, FT_INT, "ID" },
+ { true, FT_BYTE, "Points" },
+ { true, FT_INT, "Flags" },
+ { true, FT_SHORT, "UiOrder" },
{ true, FT_INT, "IconFileID" },
{ false, FT_INT, "CriteriaTree" },
+ { true, FT_SHORT, "SharesCriteria" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, AchievementMeta::Instance(), HOTFIX_SEL_ACHIEVEMENT);
return &loadInfo;
@@ -91,31 +91,31 @@ struct AreaTableLoadInfo
{ false, FT_INT, "ID" },
{ false, FT_STRING_NOT_LOCALIZED, "ZoneName" },
{ false, FT_STRING, "AreaName" },
- { true, FT_INT, "Flags1" },
- { true, FT_INT, "Flags2" },
- { false, FT_FLOAT, "AmbientMultiplier" },
{ false, FT_SHORT, "ContinentID" },
{ false, FT_SHORT, "ParentAreaID" },
{ true, FT_SHORT, "AreaBit" },
+ { false, FT_BYTE, "SoundProviderPref" },
+ { false, FT_BYTE, "SoundProviderPrefUnderwater" },
{ false, FT_SHORT, "AmbienceID" },
+ { false, FT_SHORT, "UwAmbience" },
{ 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" },
- { true, FT_SHORT, "PvpCombatWorldStateID" },
- { false, FT_BYTE, "SoundProviderPref" },
- { false, FT_BYTE, "SoundProviderPrefUnderwater" },
{ true, FT_BYTE, "ExplorationLevel" },
+ { false, FT_SHORT, "IntroSound" },
+ { false, FT_INT, "UwIntroSound" },
{ false, FT_BYTE, "FactionGroupMask" },
+ { false, FT_FLOAT, "AmbientMultiplier" },
{ false, FT_BYTE, "MountFlags" },
+ { true, FT_SHORT, "PvpCombatWorldStateID" },
{ false, FT_BYTE, "WildBattlePetLevelMin" },
{ false, FT_BYTE, "WildBattlePetLevelMax" },
{ false, FT_BYTE, "WindSettingsID" },
- { false, FT_INT, "UwIntroSound" },
+ { true, FT_INT, "Flags1" },
+ { true, FT_INT, "Flags2" },
+ { false, FT_SHORT, "LiquidTypeID1" },
+ { false, FT_SHORT, "LiquidTypeID2" },
+ { false, FT_SHORT, "LiquidTypeID3" },
+ { false, FT_SHORT, "LiquidTypeID4" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, AreaTableMeta::Instance(), HOTFIX_SEL_AREA_TABLE);
return &loadInfo;
@@ -131,20 +131,20 @@ struct AreaTriggerLoadInfo
{ false, FT_FLOAT, "PosX" },
{ false, FT_FLOAT, "PosY" },
{ false, FT_FLOAT, "PosZ" },
+ { false, FT_INT, "ID" },
+ { true, FT_SHORT, "ContinentID" },
+ { true, FT_BYTE, "PhaseUseFlags" },
+ { true, FT_SHORT, "PhaseID" },
+ { true, FT_SHORT, "PhaseGroupID" },
{ false, FT_FLOAT, "Radius" },
{ false, FT_FLOAT, "BoxLength" },
{ false, FT_FLOAT, "BoxWidth" },
{ false, FT_FLOAT, "BoxHeight" },
{ false, FT_FLOAT, "BoxYaw" },
- { true, FT_SHORT, "ContinentID" },
- { true, FT_SHORT, "PhaseID" },
- { true, FT_SHORT, "PhaseGroupID" },
+ { true, FT_BYTE, "ShapeType" },
{ true, FT_SHORT, "ShapeID" },
{ true, FT_SHORT, "AreaTriggerActionSetID" },
- { true, FT_BYTE, "PhaseUseFlags" },
- { true, FT_BYTE, "ShapeType" },
{ true, FT_BYTE, "Flags" },
- { false, FT_INT, "ID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, AreaTriggerMeta::Instance(), HOTFIX_SEL_AREA_TRIGGER);
return &loadInfo;
@@ -175,15 +175,15 @@ struct ArtifactLoadInfo
{
static DB2FieldMeta const fields[] =
{
- { false, FT_INT, "ID" },
{ false, FT_STRING, "Name" },
+ { false, FT_INT, "ID" },
+ { false, FT_SHORT, "UiTextureKitID" },
+ { true, FT_INT, "UiNameColor" },
{ true, FT_INT, "UiBarOverlayColor" },
{ true, FT_INT, "UiBarBackgroundColor" },
- { true, FT_INT, "UiNameColor" },
- { false, FT_SHORT, "UiTextureKitID" },
{ false, FT_SHORT, "ChrSpecializationID" },
- { false, FT_BYTE, "ArtifactCategoryID" },
{ false, FT_BYTE, "Flags" },
+ { false, FT_BYTE, "ArtifactCategoryID" },
{ false, FT_INT, "UiModelSceneID" },
{ false, FT_INT, "SpellVisualKitID" },
};
@@ -199,20 +199,20 @@ struct ArtifactAppearanceLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_STRING, "Name" },
- { true, FT_INT, "UiSwatchColor" },
- { false, FT_FLOAT, "UiModelSaturation" },
- { false, FT_FLOAT, "UiModelOpacity" },
- { false, FT_INT, "OverrideShapeshiftDisplayID" },
+ { false, FT_INT, "ID" },
{ false, FT_SHORT, "ArtifactAppearanceSetID" },
- { false, FT_SHORT, "UiCameraID" },
{ false, FT_BYTE, "DisplayIndex" },
+ { false, FT_INT, "UnlockPlayerConditionID" },
{ false, FT_BYTE, "ItemAppearanceModifierID" },
- { false, FT_BYTE, "Flags" },
+ { true, FT_INT, "UiSwatchColor" },
+ { false, FT_FLOAT, "UiModelSaturation" },
+ { false, FT_FLOAT, "UiModelOpacity" },
{ false, FT_BYTE, "OverrideShapeshiftFormID" },
- { false, FT_INT, "ID" },
- { false, FT_INT, "UnlockPlayerConditionID" },
+ { false, FT_INT, "OverrideShapeshiftDisplayID" },
{ false, FT_INT, "UiItemAppearanceID" },
{ false, FT_INT, "UiAltItemAppearanceID" },
+ { false, FT_BYTE, "Flags" },
+ { false, FT_SHORT, "UiCameraID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ArtifactAppearanceMeta::Instance(), HOTFIX_SEL_ARTIFACT_APPEARANCE);
return &loadInfo;
@@ -227,12 +227,12 @@ struct ArtifactAppearanceSetLoadInfo
{
{ false, FT_STRING, "Name" },
{ false, FT_STRING, "Description" },
+ { false, FT_INT, "ID" },
+ { false, FT_BYTE, "DisplayIndex" },
{ false, FT_SHORT, "UiCameraID" },
{ false, FT_SHORT, "AltHandUICameraID" },
- { false, FT_BYTE, "DisplayIndex" },
{ true, FT_BYTE, "ForgeAttachmentOverride" },
{ false, FT_BYTE, "Flags" },
- { false, FT_INT, "ID" },
{ false, FT_BYTE, "ArtifactID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ArtifactAppearanceSetMeta::Instance(), HOTFIX_SEL_ARTIFACT_APPEARANCE_SET);
@@ -261,14 +261,14 @@ struct ArtifactPowerLoadInfo
{
static DB2FieldMeta const fields[] =
{
- { false, FT_FLOAT, "PosX" },
- { false, FT_FLOAT, "PosY" },
+ { false, FT_FLOAT, "DisplayPosX" },
+ { false, FT_FLOAT, "DisplayPosY" },
+ { false, FT_INT, "ID" },
{ false, FT_BYTE, "ArtifactID" },
- { false, FT_BYTE, "Flags" },
{ false, FT_BYTE, "MaxPurchasableRank" },
- { false, FT_BYTE, "Tier" },
- { false, FT_INT, "ID" },
{ true, FT_INT, "Label" },
+ { false, FT_BYTE, "Flags" },
+ { false, FT_BYTE, "Tier" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ArtifactPowerMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER);
return &loadInfo;
@@ -311,10 +311,10 @@ struct ArtifactPowerRankLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_BYTE, "RankIndex" },
{ true, FT_INT, "SpellID" },
- { false, FT_FLOAT, "AuraPointsOverride" },
{ false, FT_SHORT, "ItemBonusListID" },
- { false, FT_BYTE, "RankIndex" },
+ { false, FT_FLOAT, "AuraPointsOverride" },
{ false, FT_SHORT, "ArtifactPowerID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ArtifactPowerRankMeta::Instance(), HOTFIX_SEL_ARTIFACT_POWER_RANK);
@@ -370,9 +370,9 @@ struct ArtifactUnlockLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_SHORT, "ItemBonusListID" },
- { false, FT_BYTE, "PowerRank" },
{ false, FT_INT, "PowerID" },
+ { false, FT_BYTE, "PowerRank" },
+ { false, FT_SHORT, "ItemBonusListID" },
{ false, FT_INT, "PlayerConditionID" },
{ false, FT_BYTE, "ArtifactID" },
};
@@ -436,12 +436,12 @@ struct BarberShopStyleLoadInfo
{
{ false, FT_STRING, "DisplayName" },
{ false, FT_STRING, "Description" },
- { false, FT_FLOAT, "CostModifier" },
+ { false, FT_INT, "ID" },
{ false, FT_BYTE, "Type" },
+ { false, FT_FLOAT, "CostModifier" },
{ false, FT_BYTE, "Race" },
{ false, FT_BYTE, "Sex" },
{ false, FT_BYTE, "Data" },
- { false, FT_INT, "ID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, BarberShopStyleMeta::Instance(), HOTFIX_SEL_BARBER_SHOP_STYLE);
return &loadInfo;
@@ -470,8 +470,8 @@ struct BattlePetBreedStateLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_SHORT, "Value" },
{ false, FT_BYTE, "BattlePetStateID" },
+ { false, FT_SHORT, "Value" },
{ false, FT_BYTE, "BattlePetBreedID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, BattlePetBreedStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_BREED_STATE);
@@ -485,15 +485,15 @@ struct BattlePetSpeciesLoadInfo
{
static DB2FieldMeta const fields[] =
{
- { false, FT_STRING, "SourceText" },
{ false, FT_STRING, "Description" },
+ { false, FT_STRING, "SourceText" },
+ { false, FT_INT, "ID" },
{ true, FT_INT, "CreatureID" },
- { true, FT_INT, "IconFileDataID" },
{ true, FT_INT, "SummonSpellID" },
- { false, FT_SHORT, "Flags" },
+ { true, FT_INT, "IconFileDataID" },
{ false, FT_BYTE, "PetTypeEnum" },
+ { false, FT_SHORT, "Flags" },
{ true, FT_BYTE, "SourceTypeEnum" },
- { false, FT_INT, "ID" },
{ true, FT_INT, "CardUIModelSceneID" },
{ true, FT_INT, "LoadoutUIModelSceneID" },
};
@@ -509,8 +509,8 @@ struct BattlePetSpeciesStateLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { true, FT_INT, "Value" },
{ false, FT_BYTE, "BattlePetStateID" },
+ { true, FT_INT, "Value" },
{ false, FT_SHORT, "BattlePetSpeciesID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, BattlePetSpeciesStateMeta::Instance(), HOTFIX_SEL_BATTLE_PET_SPECIES_STATE);
@@ -529,7 +529,18 @@ struct BattlemasterListLoadInfo
{ false, FT_STRING, "GameType" },
{ false, FT_STRING, "ShortDescription" },
{ false, FT_STRING, "LongDescription" },
+ { true, FT_BYTE, "InstanceType" },
+ { true, FT_BYTE, "MinLevel" },
+ { true, FT_BYTE, "MaxLevel" },
+ { true, FT_BYTE, "RatedPlayers" },
+ { true, FT_BYTE, "MinPlayers" },
+ { true, FT_BYTE, "MaxPlayers" },
+ { true, FT_BYTE, "GroupsAllowed" },
+ { true, FT_BYTE, "MaxGroupSize" },
+ { true, FT_SHORT, "HolidayWorldState" },
+ { true, FT_BYTE, "Flags" },
{ true, FT_INT, "IconFileDataID" },
+ { true, FT_SHORT, "RequiredPlayerConditionID" },
{ true, FT_SHORT, "MapID1" },
{ true, FT_SHORT, "MapID2" },
{ true, FT_SHORT, "MapID3" },
@@ -546,17 +557,6 @@ struct BattlemasterListLoadInfo
{ true, FT_SHORT, "MapID14" },
{ true, FT_SHORT, "MapID15" },
{ true, FT_SHORT, "MapID16" },
- { true, FT_SHORT, "HolidayWorldState" },
- { true, FT_SHORT, "RequiredPlayerConditionID" },
- { true, FT_BYTE, "InstanceType" },
- { true, FT_BYTE, "GroupsAllowed" },
- { true, FT_BYTE, "MaxGroupSize" },
- { true, FT_BYTE, "MinLevel" },
- { true, FT_BYTE, "MaxLevel" },
- { true, FT_BYTE, "RatedPlayers" },
- { true, FT_BYTE, "MinPlayers" },
- { true, FT_BYTE, "MaxPlayers" },
- { true, FT_BYTE, "Flags" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, BattlemasterListMeta::Instance(), HOTFIX_SEL_BATTLEMASTER_LIST);
return &loadInfo;
@@ -569,21 +569,22 @@ struct BroadcastTextLoadInfo
{
static DB2FieldMeta const fields[] =
{
- { false, FT_INT, "ID" },
{ false, FT_STRING, "Text" },
{ false, FT_STRING, "Text1" },
+ { false, FT_INT, "ID" },
+ { false, FT_BYTE, "LanguageID" },
+ { true, FT_INT, "ConditionID" },
+ { false, FT_SHORT, "EmotesID" },
+ { false, FT_BYTE, "Flags" },
+ { false, FT_INT, "ChatBubbleDurationMs" },
+ { false, FT_INT, "SoundEntriesID1" },
+ { false, FT_INT, "SoundEntriesID2" },
{ 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, "EmotesID" },
- { false, FT_BYTE, "LanguageID" },
- { false, FT_BYTE, "Flags" },
- { true, FT_INT, "ConditionID" },
- { false, FT_INT, "SoundEntriesID1" },
- { false, FT_INT, "SoundEntriesID2" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, BroadcastTextMeta::Instance(), HOTFIX_SEL_BROADCAST_TEXT);
return &loadInfo;
@@ -598,10 +599,10 @@ struct CfgRegionsLoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_STRING_NOT_LOCALIZED, "Tag" },
- { false, FT_INT, "Raidorigin" },
- { false, FT_INT, "ChallengeOrigin" },
{ false, FT_SHORT, "RegionID" },
+ { false, FT_INT, "Raidorigin" },
{ false, FT_BYTE, "RegionGroupMask" },
+ { false, FT_INT, "ChallengeOrigin" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, Cfg_RegionsMeta::Instance(), HOTFIX_SEL_CFG_REGIONS);
return &loadInfo;
@@ -636,9 +637,9 @@ struct CharBaseSectionLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_BYTE, "LayoutResType" },
{ false, FT_BYTE, "VariationEnum" },
{ false, FT_BYTE, "ResolutionVariationEnum" },
- { false, FT_BYTE, "LayoutResType" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CharBaseSectionMeta::Instance(), HOTFIX_SEL_CHAR_BASE_SECTION);
return &loadInfo;
@@ -652,15 +653,15 @@ struct CharSectionsLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { true, FT_INT, "MaterialResourcesID1" },
- { true, FT_INT, "MaterialResourcesID2" },
- { true, FT_INT, "MaterialResourcesID3" },
- { true, FT_SHORT, "Flags" },
{ true, FT_BYTE, "RaceID" },
{ true, FT_BYTE, "SexID" },
{ true, FT_BYTE, "BaseSection" },
{ true, FT_BYTE, "VariationIndex" },
{ true, FT_BYTE, "ColorIndex" },
+ { true, FT_SHORT, "Flags" },
+ { true, FT_INT, "MaterialResourcesID1" },
+ { true, FT_INT, "MaterialResourcesID2" },
+ { true, FT_INT, "MaterialResourcesID3" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CharSectionsMeta::Instance(), HOTFIX_SEL_CHAR_SECTIONS);
return &loadInfo;
@@ -674,6 +675,11 @@ struct CharStartOutfitLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_BYTE, "ClassID" },
+ { false, FT_BYTE, "SexID" },
+ { false, FT_BYTE, "OutfitID" },
+ { false, FT_INT, "PetDisplayID" },
+ { false, FT_BYTE, "PetFamilyID" },
{ true, FT_INT, "ItemID1" },
{ true, FT_INT, "ItemID2" },
{ true, FT_INT, "ItemID3" },
@@ -698,11 +704,6 @@ struct CharStartOutfitLoadInfo
{ true, FT_INT, "ItemID22" },
{ true, FT_INT, "ItemID23" },
{ true, FT_INT, "ItemID24" },
- { false, FT_INT, "PetDisplayID" },
- { false, FT_BYTE, "ClassID" },
- { false, FT_BYTE, "SexID" },
- { false, FT_BYTE, "OutfitID" },
- { false, FT_BYTE, "PetFamilyID" },
{ false, FT_BYTE, "RaceID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CharStartOutfitMeta::Instance(), HOTFIX_SEL_CHAR_START_OUTFIT);
@@ -750,26 +751,26 @@ struct ChrClassesLoadInfo
{
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_STRING, "NameMale" },
+ { false, FT_STRING, "NameFemale" },
+ { false, FT_STRING_NOT_LOCALIZED, "PetNameToken" },
+ { false, FT_INT, "ID" },
{ false, FT_INT, "CreateScreenFileDataID" },
{ false, FT_INT, "SelectScreenFileDataID" },
- { false, FT_INT, "LowResScreenFileDataID" },
{ false, FT_INT, "IconFileDataID" },
+ { false, FT_INT, "LowResScreenFileDataID" },
{ true, FT_INT, "StartingLevel" },
{ false, FT_SHORT, "Flags" },
{ false, FT_SHORT, "CinematicSequenceID" },
{ false, FT_SHORT, "DefaultSpec" },
+ { false, FT_BYTE, "PrimaryStatPriority" },
{ false, FT_BYTE, "DisplayPower" },
- { false, FT_BYTE, "SpellClassSet" },
- { false, FT_BYTE, "AttackPowerPerStrength" },
- { false, FT_BYTE, "AttackPowerPerAgility" },
{ false, FT_BYTE, "RangedAttackPowerPerAgility" },
- { false, FT_BYTE, "PrimaryStatPriority" },
- { false, FT_INT, "ID" },
+ { false, FT_BYTE, "AttackPowerPerAgility" },
+ { false, FT_BYTE, "AttackPowerPerStrength" },
+ { false, FT_BYTE, "SpellClassSet" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrClassesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES);
return &loadInfo;
@@ -783,7 +784,7 @@ struct ChrClassesXPowerTypesLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_BYTE, "PowerType" },
+ { true, FT_BYTE, "PowerType" },
{ false, FT_BYTE, "ClassID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrClassesXPowerTypesMeta::Instance(), HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES);
@@ -803,9 +804,12 @@ struct ChrRacesLoadInfo
{ false, FT_STRING, "NameFemale" },
{ false, FT_STRING, "NameLowercase" },
{ false, FT_STRING, "NameFemaleLowercase" },
+ { false, FT_INT, "ID" },
{ true, FT_INT, "Flags" },
{ false, FT_INT, "MaleDisplayId" },
{ false, FT_INT, "FemaleDisplayId" },
+ { false, FT_INT, "HighResMaleDisplayId" },
+ { false, FT_INT, "HighResFemaleDisplayId" },
{ true, FT_INT, "CreateScreenFileDataID" },
{ true, FT_INT, "SelectScreenFileDataID" },
{ false, FT_FLOAT, "MaleCustomizeOffset1" },
@@ -815,34 +819,39 @@ struct ChrRacesLoadInfo
{ false, FT_FLOAT, "FemaleCustomizeOffset2" },
{ false, FT_FLOAT, "FemaleCustomizeOffset3" },
{ true, FT_INT, "LowResScreenFileDataID" },
+ { false, FT_INT, "AlteredFormStartVisualKitID1" },
+ { false, FT_INT, "AlteredFormStartVisualKitID2" },
+ { false, FT_INT, "AlteredFormStartVisualKitID3" },
+ { false, FT_INT, "AlteredFormFinishVisualKitID1" },
+ { false, FT_INT, "AlteredFormFinishVisualKitID2" },
+ { false, FT_INT, "AlteredFormFinishVisualKitID3" },
+ { true, FT_INT, "HeritageArmorAchievementID" },
{ true, FT_INT, "StartingLevel" },
{ true, FT_INT, "UiDisplayOrder" },
+ { true, FT_INT, "FemaleSkeletonFileDataID" },
+ { true, FT_INT, "MaleSkeletonFileDataID" },
+ { true, FT_INT, "HelmVisFallbackRaceID" },
{ true, FT_SHORT, "FactionID" },
+ { true, FT_SHORT, "CinematicSequenceID" },
{ true, FT_SHORT, "ResSicknessSpellID" },
{ true, FT_SHORT, "SplashSoundID" },
- { true, FT_SHORT, "CinematicSequenceID" },
{ true, FT_BYTE, "BaseLanguage" },
{ true, FT_BYTE, "CreatureType" },
{ true, FT_BYTE, "Alliance" },
{ true, FT_BYTE, "RaceRelated" },
{ true, FT_BYTE, "UnalteredVisualRaceID" },
{ true, FT_BYTE, "CharComponentTextureLayoutID" },
+ { true, FT_BYTE, "CharComponentTexLayoutHiResID" },
{ true, FT_BYTE, "DefaultClassID" },
{ true, FT_BYTE, "NeutralRaceID" },
- { true, FT_BYTE, "DisplayRaceID" },
- { true, FT_BYTE, "CharComponentTexLayoutHiResID" },
- { false, FT_INT, "ID" },
- { false, FT_INT, "HighResMaleDisplayId" },
- { false, FT_INT, "HighResFemaleDisplayId" },
- { true, FT_INT, "HeritageArmorAchievementID" },
- { true, FT_INT, "MaleSkeletonFileDataID" },
- { true, FT_INT, "FemaleSkeletonFileDataID" },
- { false, FT_INT, "AlteredFormStartVisualKitID1" },
- { false, FT_INT, "AlteredFormStartVisualKitID2" },
- { false, FT_INT, "AlteredFormStartVisualKitID3" },
- { false, FT_INT, "AlteredFormFinishVisualKitID1" },
- { false, FT_INT, "AlteredFormFinishVisualKitID2" },
- { false, FT_INT, "AlteredFormFinishVisualKitID3" },
+ { true, FT_BYTE, "MaleModelFallbackRaceID" },
+ { true, FT_BYTE, "MaleModelFallbackSex" },
+ { true, FT_BYTE, "FemaleModelFallbackRaceID" },
+ { true, FT_BYTE, "FemaleModelFallbackSex" },
+ { true, FT_BYTE, "MaleTextureFallbackRaceID" },
+ { true, FT_BYTE, "MaleTextureFallbackSex" },
+ { true, FT_BYTE, "FemaleTextureFallbackRaceID" },
+ { true, FT_BYTE, "FemaleTextureFallbackSex" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrRacesMeta::Instance(), HOTFIX_SEL_CHR_RACES);
return &loadInfo;
@@ -858,17 +867,17 @@ struct ChrSpecializationLoadInfo
{ false, FT_STRING, "Name" },
{ false, FT_STRING, "FemaleName" },
{ false, FT_STRING, "Description" },
- { true, FT_INT, "MasterySpellID1" },
- { true, FT_INT, "MasterySpellID2" },
+ { false, FT_INT, "ID" },
{ true, FT_BYTE, "ClassID" },
{ true, FT_BYTE, "OrderIndex" },
{ true, FT_BYTE, "PetTalentType" },
{ true, FT_BYTE, "Role" },
- { true, FT_BYTE, "PrimaryStatPriority" },
- { false, FT_INT, "ID" },
- { true, FT_INT, "SpellIconFileID" },
{ false, FT_INT, "Flags" },
+ { true, FT_INT, "SpellIconFileID" },
+ { true, FT_BYTE, "PrimaryStatPriority" },
{ true, FT_INT, "AnimReplacements" },
+ { true, FT_INT, "MasterySpellID1" },
+ { true, FT_INT, "MasterySpellID2" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ChrSpecializationMeta::Instance(), HOTFIX_SEL_CHR_SPECIALIZATION);
return &loadInfo;
@@ -882,10 +891,10 @@ struct CinematicCameraLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_INT, "SoundID" },
{ false, FT_FLOAT, "OriginX" },
{ false, FT_FLOAT, "OriginY" },
{ false, FT_FLOAT, "OriginZ" },
+ { false, FT_INT, "SoundID" },
{ false, FT_FLOAT, "OriginFacing" },
{ false, FT_INT, "FileDataID" },
};
@@ -916,6 +925,24 @@ struct CinematicSequencesLoadInfo
}
};
+struct ContentTuningLoadInfo
+{
+ static DB2LoadInfo const* Instance()
+ {
+ static DB2FieldMeta const fields[] =
+ {
+ { false, FT_INT, "ID" },
+ { true, FT_INT, "MinLevel" },
+ { true, FT_INT, "MaxLevel" },
+ { true, FT_INT, "Flags" },
+ { true, FT_INT, "ExpectedStatModID" },
+ { true, FT_INT, "DifficultyESMID" },
+ };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ContentTuningMeta::Instance(), HOTFIX_SEL_CONTENT_TUNING);
+ return &loadInfo;
+ }
+};
+
struct ConversationLineLoadInfo
{
static DB2LoadInfo const* Instance()
@@ -944,27 +971,29 @@ struct CreatureDisplayInfoLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_FLOAT, "CreatureModelScale" },
{ false, FT_SHORT, "ModelID" },
- { false, FT_SHORT, "NPCSoundID" },
+ { false, FT_SHORT, "SoundID" },
{ true, FT_BYTE, "SizeClass" },
- { false, FT_BYTE, "Flags" },
- { true, FT_BYTE, "Gender" },
- { true, FT_INT, "ExtendedDisplayInfoID" },
- { true, FT_INT, "PortraitTextureFileDataID" },
+ { false, FT_FLOAT, "CreatureModelScale" },
{ false, FT_BYTE, "CreatureModelAlpha" },
- { false, FT_SHORT, "SoundID" },
- { false, FT_FLOAT, "PlayerOverrideScale" },
- { true, FT_INT, "PortraitCreatureDisplayInfoID" },
{ false, FT_BYTE, "BloodID" },
+ { true, FT_INT, "ExtendedDisplayInfoID" },
+ { false, FT_SHORT, "NPCSoundID" },
{ false, FT_SHORT, "ParticleColorID" },
- { false, FT_INT, "CreatureGeosetData" },
+ { true, FT_INT, "PortraitCreatureDisplayInfoID" },
+ { true, FT_INT, "PortraitTextureFileDataID" },
{ false, FT_SHORT, "ObjectEffectPackageID" },
{ false, FT_SHORT, "AnimReplacementSetID" },
- { true, FT_BYTE, "UnarmedWeaponType" },
+ { false, FT_BYTE, "Flags" },
{ true, FT_INT, "StateSpellVisualKitID" },
+ { false, FT_FLOAT, "PlayerOverrideScale" },
{ false, FT_FLOAT, "PetInstanceScale" },
+ { true, FT_BYTE, "UnarmedWeaponType" },
{ true, FT_INT, "MountPoofSpellVisualKitID" },
+ { true, FT_INT, "DissolveEffectID" },
+ { true, FT_BYTE, "Gender" },
+ { true, FT_INT, "DissolveOutEffectID" },
+ { true, FT_BYTE, "CreatureModelMinLod" },
{ true, FT_INT, "TextureVariationFileDataID1" },
{ true, FT_INT, "TextureVariationFileDataID2" },
{ true, FT_INT, "TextureVariationFileDataID3" },
@@ -981,8 +1010,6 @@ struct CreatureDisplayInfoExtraLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { true, FT_INT, "BakeMaterialResourcesID" },
- { true, FT_INT, "HDBakeMaterialResourcesID" },
{ true, FT_BYTE, "DisplayRaceID" },
{ true, FT_BYTE, "DisplaySexID" },
{ true, FT_BYTE, "DisplayClassID" },
@@ -991,10 +1018,12 @@ struct CreatureDisplayInfoExtraLoadInfo
{ true, FT_BYTE, "HairStyleID" },
{ true, FT_BYTE, "HairColorID" },
{ true, FT_BYTE, "FacialHairID" },
+ { true, FT_BYTE, "Flags" },
+ { true, FT_INT, "BakeMaterialResourcesID" },
+ { true, FT_INT, "HDBakeMaterialResourcesID" },
{ false, FT_BYTE, "CustomDisplayOption1" },
{ false, FT_BYTE, "CustomDisplayOption2" },
{ false, FT_BYTE, "CustomDisplayOption3" },
- { true, FT_BYTE, "Flags" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CreatureDisplayInfoExtraMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA);
return &loadInfo;
@@ -1010,14 +1039,14 @@ struct CreatureFamilyLoadInfo
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Name" },
{ false, FT_FLOAT, "MinScale" },
+ { true, FT_BYTE, "MinScaleLevel" },
{ false, FT_FLOAT, "MaxScale" },
+ { true, FT_BYTE, "MaxScaleLevel" },
+ { true, FT_SHORT, "PetFoodMask" },
+ { true, FT_BYTE, "PetTalentType" },
{ true, FT_INT, "IconFileID" },
{ true, FT_SHORT, "SkillLine1" },
{ true, FT_SHORT, "SkillLine2" },
- { true, FT_SHORT, "PetFoodMask" },
- { true, FT_BYTE, "MinScaleLevel" },
- { true, FT_BYTE, "MaxScaleLevel" },
- { true, FT_BYTE, "PetTalentType" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CreatureFamilyMeta::Instance(), HOTFIX_SEL_CREATURE_FAMILY);
return &loadInfo;
@@ -1031,39 +1060,39 @@ struct CreatureModelDataLoadInfo
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, "GeoBox1" },
{ false, FT_FLOAT, "GeoBox2" },
{ false, FT_FLOAT, "GeoBox3" },
{ false, FT_FLOAT, "GeoBox4" },
{ false, FT_FLOAT, "GeoBox5" },
{ false, FT_FLOAT, "GeoBox6" },
- { 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_FLOAT, "FootprintTextureLength" },
+ { false, FT_FLOAT, "FootprintTextureWidth" },
+ { false, FT_FLOAT, "FootprintParticleScale" },
{ false, FT_INT, "FoleyMaterialID" },
{ false, FT_INT, "FootstepCameraEffectID" },
{ false, FT_INT, "DeathThudCameraEffectID" },
{ false, FT_INT, "SoundID" },
+ { false, FT_INT, "SizeClass" },
+ { false, FT_FLOAT, "CollisionWidth" },
+ { false, FT_FLOAT, "CollisionHeight" },
+ { false, FT_FLOAT, "WorldEffectScale" },
{ false, FT_INT, "CreatureGeosetDataID" },
+ { false, FT_FLOAT, "HoverHeight" },
+ { false, FT_FLOAT, "AttachedEffectScale" },
+ { false, FT_FLOAT, "ModelScale" },
+ { false, FT_FLOAT, "MissileCollisionRadius" },
+ { false, FT_FLOAT, "MissileCollisionPush" },
+ { false, FT_FLOAT, "MissileCollisionRaise" },
+ { false, FT_FLOAT, "MountHeight" },
+ { false, FT_FLOAT, "OverrideLootEffectScale" },
+ { false, FT_FLOAT, "OverrideNameScale" },
+ { false, FT_FLOAT, "OverrideSelectionRadius" },
+ { false, FT_FLOAT, "TamedPetBaseScale" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CreatureModelDataMeta::Instance(), HOTFIX_SEL_CREATURE_MODEL_DATA);
return &loadInfo;
@@ -1092,16 +1121,16 @@ struct CriteriaLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_INT, "Asset" },
- { true, FT_INT, "StartAsset" },
- { true, FT_INT, "FailAsset" },
+ { true, FT_SHORT, "Type" },
+ { true, FT_INT, "Asset" },
{ false, FT_INT, "ModifierTreeId" },
- { false, FT_SHORT, "StartTimer" },
- { true, FT_SHORT, "EligibilityWorldStateID" },
- { false, FT_BYTE, "Type" },
{ false, FT_BYTE, "StartEvent" },
+ { true, FT_INT, "StartAsset" },
+ { false, FT_SHORT, "StartTimer" },
{ false, FT_BYTE, "FailEvent" },
+ { true, FT_INT, "FailAsset" },
{ false, FT_BYTE, "Flags" },
+ { true, FT_SHORT, "EligibilityWorldStateID" },
{ true, FT_BYTE, "EligibilityWorldStateValue" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CriteriaMeta::Instance(), HOTFIX_SEL_CRITERIA);
@@ -1117,12 +1146,12 @@ struct CriteriaTreeLoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Description" },
- { true, FT_INT, "Amount" },
- { true, FT_SHORT, "Flags" },
+ { false, FT_INT, "Parent" },
+ { false, FT_INT, "Amount" },
{ true, FT_BYTE, "Operator" },
{ false, FT_INT, "CriteriaID" },
- { false, FT_INT, "Parent" },
{ true, FT_INT, "OrderIndex" },
+ { true, FT_SHORT, "Flags" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CriteriaTreeMeta::Instance(), HOTFIX_SEL_CRITERIA_TREE);
return &loadInfo;
@@ -1138,14 +1167,15 @@ struct CurrencyTypesLoadInfo
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Name" },
{ false, FT_STRING, "Description" },
- { false, FT_INT, "MaxQty" },
- { false, FT_INT, "MaxEarnablePerWeek" },
- { false, FT_INT, "Flags" },
{ false, FT_BYTE, "CategoryID" },
- { false, FT_BYTE, "SpellCategory" },
- { false, FT_BYTE, "Quality" },
{ true, FT_INT, "InventoryIconFileID" },
{ false, FT_INT, "SpellWeight" },
+ { false, FT_BYTE, "SpellCategory" },
+ { false, FT_INT, "MaxQty" },
+ { false, FT_INT, "MaxEarnablePerWeek" },
+ { false, FT_INT, "Flags" },
+ { true, FT_BYTE, "Quality" },
+ { true, FT_INT, "FactionID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, CurrencyTypesMeta::Instance(), HOTFIX_SEL_CURRENCY_TYPES);
return &loadInfo;
@@ -1191,28 +1221,28 @@ struct DestructibleModelDataLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_SHORT, "State0Wmo" },
- { false, FT_SHORT, "State1Wmo" },
- { false, FT_SHORT, "State2Wmo" },
- { false, FT_SHORT, "State3Wmo" },
- { false, FT_SHORT, "HealEffectSpeed" },
{ true, FT_BYTE, "State0ImpactEffectDoodadSet" },
{ false, FT_BYTE, "State0AmbientDoodadSet" },
- { true, FT_BYTE, "State0NameSet" },
+ { false, FT_SHORT, "State1Wmo" },
{ true, FT_BYTE, "State1DestructionDoodadSet" },
{ true, FT_BYTE, "State1ImpactEffectDoodadSet" },
{ false, FT_BYTE, "State1AmbientDoodadSet" },
- { true, FT_BYTE, "State1NameSet" },
+ { false, FT_SHORT, "State2Wmo" },
{ true, FT_BYTE, "State2DestructionDoodadSet" },
{ true, FT_BYTE, "State2ImpactEffectDoodadSet" },
{ false, FT_BYTE, "State2AmbientDoodadSet" },
- { true, FT_BYTE, "State2NameSet" },
+ { false, FT_SHORT, "State3Wmo" },
{ false, FT_BYTE, "State3InitDoodadSet" },
{ false, FT_BYTE, "State3AmbientDoodadSet" },
- { true, FT_BYTE, "State3NameSet" },
{ false, FT_BYTE, "EjectDirection" },
{ false, FT_BYTE, "DoNotHighlight" },
+ { false, FT_SHORT, "State0Wmo" },
{ false, FT_BYTE, "HealEffect" },
+ { false, FT_SHORT, "HealEffectSpeed" },
+ { true, FT_BYTE, "State0NameSet" },
+ { true, FT_BYTE, "State1NameSet" },
+ { true, FT_BYTE, "State2NameSet" },
+ { true, FT_BYTE, "State3NameSet" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, DestructibleModelDataMeta::Instance(), HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA);
return &loadInfo;
@@ -1227,18 +1257,18 @@ struct DifficultyLoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Name" },
- { false, FT_SHORT, "GroupSizeHealthCurveID" },
- { false, FT_SHORT, "GroupSizeDmgCurveID" },
- { false, FT_SHORT, "GroupSizeSpellPointsCurveID" },
- { false, FT_BYTE, "FallbackDifficultyID" },
{ false, FT_BYTE, "InstanceType" },
+ { false, FT_BYTE, "OrderIndex" },
+ { true, FT_BYTE, "OldEnumValue" },
+ { false, FT_BYTE, "FallbackDifficultyID" },
{ false, FT_BYTE, "MinPlayers" },
{ false, FT_BYTE, "MaxPlayers" },
- { true, FT_BYTE, "OldEnumValue" },
{ false, FT_BYTE, "Flags" },
- { false, FT_BYTE, "ToggleDifficultyID" },
{ false, FT_BYTE, "ItemContext" },
- { false, FT_BYTE, "OrderIndex" },
+ { false, FT_BYTE, "ToggleDifficultyID" },
+ { false, FT_SHORT, "GroupSizeHealthCurveID" },
+ { false, FT_SHORT, "GroupSizeDmgCurveID" },
+ { false, FT_SHORT, "GroupSizeSpellPointsCurveID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, DifficultyMeta::Instance(), HOTFIX_SEL_DIFFICULTY);
return &loadInfo;
@@ -1252,13 +1282,13 @@ struct DungeonEncounterLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_STRING, "Name" },
- { true, FT_INT, "CreatureDisplayID" },
+ { false, FT_INT, "ID" },
{ true, FT_SHORT, "MapID" },
{ true, FT_BYTE, "DifficultyID" },
+ { true, FT_INT, "OrderIndex" },
{ true, FT_BYTE, "Bit" },
+ { true, FT_INT, "CreatureDisplayID" },
{ false, FT_BYTE, "Flags" },
- { false, FT_INT, "ID" },
- { true, FT_INT, "OrderIndex" },
{ true, FT_INT, "SpellIconFileID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, DungeonEncounterMeta::Instance(), HOTFIX_SEL_DUNGEON_ENCOUNTER);
@@ -1331,13 +1361,13 @@ struct EmotesLoadInfo
{ false, FT_INT, "ID" },
{ true, FT_LONG, "RaceMask" },
{ false, FT_STRING_NOT_LOCALIZED, "EmoteSlashCommand" },
+ { true, FT_INT, "AnimID" },
{ false, FT_INT, "EmoteFlags" },
- { false, FT_INT, "SpellVisualKitID" },
- { true, FT_SHORT, "AnimID" },
{ false, FT_BYTE, "EmoteSpecProc" },
- { true, FT_INT, "ClassMask" },
{ false, FT_INT, "EmoteSpecProcParam" },
{ false, FT_INT, "EventSoundID" },
+ { false, FT_INT, "SpellVisualKitID" },
+ { true, FT_INT, "ClassMask" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, EmotesMeta::Instance(), HOTFIX_SEL_EMOTES);
return &loadInfo;
@@ -1367,8 +1397,8 @@ struct EmotesTextSoundLoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_BYTE, "RaceID" },
- { false, FT_BYTE, "SexID" },
{ false, FT_BYTE, "ClassID" },
+ { false, FT_BYTE, "SexID" },
{ false, FT_INT, "SoundID" },
{ false, FT_SHORT, "EmotesTextID" },
};
@@ -1377,6 +1407,52 @@ struct EmotesTextSoundLoadInfo
}
};
+struct ExpectedStatLoadInfo
+{
+ static DB2LoadInfo const* Instance()
+ {
+ static DB2FieldMeta const fields[] =
+ {
+ { false, FT_INT, "ID" },
+ { true, FT_INT, "ExpansionID" },
+ { false, FT_FLOAT, "CreatureHealth" },
+ { false, FT_FLOAT, "PlayerHealth" },
+ { false, FT_FLOAT, "CreatureAutoAttackDps" },
+ { false, FT_FLOAT, "CreatureArmor" },
+ { false, FT_FLOAT, "PlayerMana" },
+ { false, FT_FLOAT, "PlayerPrimaryStat" },
+ { false, FT_FLOAT, "PlayerSecondaryStat" },
+ { false, FT_FLOAT, "ArmorConstant" },
+ { false, FT_FLOAT, "CreatureSpellDamage" },
+ { true, FT_INT, "Lvl" },
+ };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ExpectedStatMeta::Instance(), HOTFIX_SEL_EXPECTED_STAT);
+ return &loadInfo;
+ }
+};
+
+struct ExpectedStatModLoadInfo
+{
+ static DB2LoadInfo const* Instance()
+ {
+ static DB2FieldMeta const fields[] =
+ {
+ { false, FT_INT, "ID" },
+ { false, FT_FLOAT, "CreatureHealthMod" },
+ { false, FT_FLOAT, "PlayerHealthMod" },
+ { false, FT_FLOAT, "CreatureAutoAttackDPSMod" },
+ { false, FT_FLOAT, "CreatureArmorMod" },
+ { false, FT_FLOAT, "PlayerManaMod" },
+ { false, FT_FLOAT, "PlayerPrimaryStatMod" },
+ { false, FT_FLOAT, "PlayerSecondaryStatMod" },
+ { false, FT_FLOAT, "ArmorConstantMod" },
+ { false, FT_FLOAT, "CreatureSpellDamageMod" },
+ };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ExpectedStatModMeta::Instance(), HOTFIX_SEL_EXPECTED_STAT_MOD);
+ return &loadInfo;
+ }
+};
+
struct FactionLoadInfo
{
static DB2LoadInfo const* Instance()
@@ -1390,17 +1466,12 @@ struct FactionLoadInfo
{ false, FT_STRING, "Name" },
{ false, FT_STRING, "Description" },
{ false, FT_INT, "ID" },
- { true, FT_INT, "ReputationBase1" },
- { true, FT_INT, "ReputationBase2" },
- { true, FT_INT, "ReputationBase3" },
- { true, FT_INT, "ReputationBase4" },
- { false, FT_FLOAT, "ParentFactionMod1" },
- { false, FT_FLOAT, "ParentFactionMod2" },
- { true, FT_INT, "ReputationMax1" },
- { true, FT_INT, "ReputationMax2" },
- { true, FT_INT, "ReputationMax3" },
- { true, FT_INT, "ReputationMax4" },
{ true, FT_SHORT, "ReputationIndex" },
+ { false, FT_SHORT, "ParentFactionID" },
+ { false, FT_BYTE, "Expansion" },
+ { false, FT_BYTE, "FriendshipRepID" },
+ { false, FT_BYTE, "Flags" },
+ { false, FT_SHORT, "ParagonFactionID" },
{ true, FT_SHORT, "ReputationClassMask1" },
{ true, FT_SHORT, "ReputationClassMask2" },
{ true, FT_SHORT, "ReputationClassMask3" },
@@ -1409,13 +1480,18 @@ struct FactionLoadInfo
{ false, FT_SHORT, "ReputationFlags2" },
{ false, FT_SHORT, "ReputationFlags3" },
{ false, FT_SHORT, "ReputationFlags4" },
- { false, FT_SHORT, "ParentFactionID" },
- { false, FT_SHORT, "ParagonFactionID" },
+ { true, FT_INT, "ReputationBase1" },
+ { true, FT_INT, "ReputationBase2" },
+ { true, FT_INT, "ReputationBase3" },
+ { true, FT_INT, "ReputationBase4" },
+ { true, FT_INT, "ReputationMax1" },
+ { true, FT_INT, "ReputationMax2" },
+ { true, FT_INT, "ReputationMax3" },
+ { true, FT_INT, "ReputationMax4" },
+ { false, FT_FLOAT, "ParentFactionMod1" },
+ { false, FT_FLOAT, "ParentFactionMod2" },
{ false, FT_BYTE, "ParentFactionCap1" },
{ false, FT_BYTE, "ParentFactionCap2" },
- { false, FT_BYTE, "Expansion" },
- { false, FT_BYTE, "Flags" },
- { false, FT_BYTE, "FriendshipRepID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, FactionMeta::Instance(), HOTFIX_SEL_FACTION);
return &loadInfo;
@@ -1431,6 +1507,9 @@ struct FactionTemplateLoadInfo
{ false, FT_INT, "ID" },
{ false, FT_SHORT, "Faction" },
{ false, FT_SHORT, "Flags" },
+ { false, FT_BYTE, "FactionGroup" },
+ { false, FT_BYTE, "FriendGroup" },
+ { false, FT_BYTE, "EnemyGroup" },
{ false, FT_SHORT, "Enemies1" },
{ false, FT_SHORT, "Enemies2" },
{ false, FT_SHORT, "Enemies3" },
@@ -1439,9 +1518,6 @@ struct FactionTemplateLoadInfo
{ false, FT_SHORT, "Friend2" },
{ false, FT_SHORT, "Friend3" },
{ false, FT_SHORT, "Friend4" },
- { false, FT_BYTE, "FactionGroup" },
- { false, FT_BYTE, "FriendGroup" },
- { false, FT_BYTE, "EnemyGroup" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, FactionTemplateMeta::Instance(), HOTFIX_SEL_FACTION_TEMPLATE);
return &loadInfo;
@@ -1455,16 +1531,16 @@ struct GameobjectDisplayInfoLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { true, 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" },
+ { true, FT_INT, "FileDataID" },
+ { true, FT_SHORT, "ObjectEffectPackageID" },
{ false, FT_FLOAT, "OverrideLootEffectScale" },
{ false, FT_FLOAT, "OverrideNameScale" },
- { true, FT_SHORT, "ObjectEffectPackageID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GameObjectDisplayInfoMeta::Instance(), HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO);
return &loadInfo;
@@ -1485,7 +1561,14 @@ struct GameobjectsLoadInfo
{ false, FT_FLOAT, "Rot2" },
{ false, FT_FLOAT, "Rot3" },
{ false, FT_FLOAT, "Rot4" },
+ { false, FT_INT, "ID" },
+ { false, FT_SHORT, "OwnerID" },
+ { false, FT_SHORT, "DisplayID" },
{ false, FT_FLOAT, "Scale" },
+ { false, FT_BYTE, "TypeID" },
+ { false, FT_BYTE, "PhaseUseFlags" },
+ { false, FT_SHORT, "PhaseID" },
+ { false, FT_SHORT, "PhaseGroupID" },
{ true, FT_INT, "PropValue1" },
{ true, FT_INT, "PropValue2" },
{ true, FT_INT, "PropValue3" },
@@ -1494,13 +1577,6 @@ struct GameobjectsLoadInfo
{ true, FT_INT, "PropValue6" },
{ true, FT_INT, "PropValue7" },
{ true, FT_INT, "PropValue8" },
- { false, FT_SHORT, "OwnerID" },
- { false, FT_SHORT, "DisplayID" },
- { false, FT_SHORT, "PhaseID" },
- { false, FT_SHORT, "PhaseGroupID" },
- { false, FT_BYTE, "PhaseUseFlags" },
- { false, FT_BYTE, "TypeID" },
- { false, FT_INT, "ID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GameObjectsMeta::Instance(), HOTFIX_SEL_GAMEOBJECTS);
return &loadInfo;
@@ -1515,12 +1591,12 @@ struct GarrAbilityLoadInfo
{
{ false, FT_STRING, "Name" },
{ false, FT_STRING, "Description" },
- { true, FT_INT, "IconFileDataID" },
- { false, FT_SHORT, "Flags" },
- { false, FT_SHORT, "FactionChangeGarrAbilityID" },
+ { false, FT_INT, "ID" },
{ false, FT_BYTE, "GarrAbilityCategoryID" },
{ false, FT_BYTE, "GarrFollowerTypeID" },
- { false, FT_INT, "ID" },
+ { true, FT_INT, "IconFileDataID" },
+ { false, FT_SHORT, "FactionChangeGarrAbilityID" },
+ { false, FT_SHORT, "Flags" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrAbilityMeta::Instance(), HOTFIX_SEL_GARR_ABILITY);
return &loadInfo;
@@ -1534,30 +1610,30 @@ struct GarrBuildingLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_STRING, "AllianceName" },
{ false, FT_STRING, "HordeName" },
+ { false, FT_STRING, "AllianceName" },
{ false, FT_STRING, "Description" },
{ false, FT_STRING, "Tooltip" },
+ { false, FT_BYTE, "GarrTypeID" },
+ { false, FT_BYTE, "BuildingType" },
{ true, FT_INT, "HordeGameObjectID" },
{ true, FT_INT, "AllianceGameObjectID" },
- { true, FT_INT, "IconFileDataID" },
+ { false, FT_BYTE, "GarrSiteID" },
+ { false, FT_BYTE, "UpgradeLevel" },
+ { true, FT_INT, "BuildSeconds" },
{ false, FT_SHORT, "CurrencyTypeID" },
+ { true, FT_INT, "CurrencyQty" },
{ false, FT_SHORT, "HordeUiTextureKitID" },
{ false, FT_SHORT, "AllianceUiTextureKitID" },
+ { true, FT_INT, "IconFileDataID" },
{ false, FT_SHORT, "AllianceSceneScriptPackageID" },
{ false, FT_SHORT, "HordeSceneScriptPackageID" },
+ { true, FT_INT, "MaxAssignments" },
+ { false, FT_BYTE, "ShipmentCapacity" },
{ false, FT_SHORT, "GarrAbilityID" },
{ false, FT_SHORT, "BonusGarrAbilityID" },
{ false, FT_SHORT, "GoldCost" },
- { false, FT_BYTE, "GarrSiteID" },
- { false, FT_BYTE, "BuildingType" },
- { false, FT_BYTE, "UpgradeLevel" },
{ false, FT_BYTE, "Flags" },
- { false, FT_BYTE, "ShipmentCapacity" },
- { false, FT_BYTE, "GarrTypeID" },
- { true, FT_INT, "BuildSeconds" },
- { true, FT_INT, "CurrencyQty" },
- { true, FT_INT, "MaxAssignments" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrBuildingMeta::Instance(), HOTFIX_SEL_GARR_BUILDING);
return &loadInfo;
@@ -1572,10 +1648,10 @@ struct GarrBuildingPlotInstLoadInfo
{
{ false, FT_FLOAT, "MapOffsetX" },
{ false, FT_FLOAT, "MapOffsetY" },
- { false, FT_SHORT, "UiTextureAtlasMemberID" },
- { false, FT_SHORT, "GarrSiteLevelPlotInstID" },
- { false, FT_BYTE, "GarrBuildingID" },
{ false, FT_INT, "ID" },
+ { false, FT_BYTE, "GarrBuildingID" },
+ { false, FT_SHORT, "GarrSiteLevelPlotInstID" },
+ { false, FT_SHORT, "UiTextureAtlasMemberID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrBuildingPlotInstMeta::Instance(), HOTFIX_SEL_GARR_BUILDING_PLOT_INST);
return &loadInfo;
@@ -1591,11 +1667,11 @@ struct GarrClassSpecLoadInfo
{ false, FT_STRING, "ClassSpec" },
{ false, FT_STRING, "ClassSpecMale" },
{ false, FT_STRING, "ClassSpecFemale" },
+ { false, FT_INT, "ID" },
{ false, FT_SHORT, "UiTextureAtlasMemberID" },
{ false, FT_SHORT, "GarrFollItemSetID" },
{ false, FT_BYTE, "FollowerClassLimit" },
{ false, FT_BYTE, "Flags" },
- { false, FT_INT, "ID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrClassSpecMeta::Instance(), HOTFIX_SEL_GARR_CLASS_SPEC);
return &loadInfo;
@@ -1611,35 +1687,35 @@ struct GarrFollowerLoadInfo
{ false, FT_STRING, "HordeSourceText" },
{ false, FT_STRING, "AllianceSourceText" },
{ false, FT_STRING, "TitleName" },
+ { false, FT_INT, "ID" },
+ { false, FT_BYTE, "GarrTypeID" },
+ { false, FT_BYTE, "GarrFollowerTypeID" },
{ true, FT_INT, "HordeCreatureID" },
{ true, FT_INT, "AllianceCreatureID" },
- { true, FT_INT, "HordeIconFileDataID" },
- { true, FT_INT, "AllianceIconFileDataID" },
- { false, FT_INT, "HordeSlottingBroadcastTextID" },
- { false, FT_INT, "AllySlottingBroadcastTextID" },
- { false, FT_SHORT, "HordeGarrFollItemSetID" },
- { false, FT_SHORT, "AllianceGarrFollItemSetID" },
- { false, FT_SHORT, "ItemLevelWeapon" },
- { false, FT_SHORT, "ItemLevelArmor" },
- { false, FT_SHORT, "HordeUITextureKitID" },
- { false, FT_SHORT, "AllianceUITextureKitID" },
- { false, FT_BYTE, "GarrFollowerTypeID" },
{ false, FT_BYTE, "HordeGarrFollRaceID" },
{ false, FT_BYTE, "AllianceGarrFollRaceID" },
- { false, FT_BYTE, "Quality" },
{ false, FT_BYTE, "HordeGarrClassSpecID" },
{ false, FT_BYTE, "AllianceGarrClassSpecID" },
+ { false, FT_BYTE, "Quality" },
{ false, FT_BYTE, "FollowerLevel" },
- { false, FT_BYTE, "Gender" },
- { false, FT_BYTE, "Flags" },
+ { false, FT_SHORT, "ItemLevelWeapon" },
+ { false, FT_SHORT, "ItemLevelArmor" },
{ true, FT_BYTE, "HordeSourceTypeEnum" },
{ true, FT_BYTE, "AllianceSourceTypeEnum" },
- { false, FT_BYTE, "GarrTypeID" },
+ { true, FT_INT, "HordeIconFileDataID" },
+ { true, FT_INT, "AllianceIconFileDataID" },
+ { false, FT_SHORT, "HordeGarrFollItemSetID" },
+ { false, FT_SHORT, "AllianceGarrFollItemSetID" },
+ { false, FT_SHORT, "HordeUITextureKitID" },
+ { false, FT_SHORT, "AllianceUITextureKitID" },
{ false, FT_BYTE, "Vitality" },
- { false, FT_BYTE, "ChrClassID" },
{ false, FT_BYTE, "HordeFlavorGarrStringID" },
{ false, FT_BYTE, "AllianceFlavorGarrStringID" },
- { false, FT_INT, "ID" },
+ { false, FT_INT, "HordeSlottingBroadcastTextID" },
+ { false, FT_INT, "AllySlottingBroadcastTextID" },
+ { false, FT_BYTE, "ChrClassID" },
+ { false, FT_BYTE, "Flags" },
+ { false, FT_BYTE, "Gender" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrFollowerMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER);
return &loadInfo;
@@ -1653,8 +1729,9 @@ struct GarrFollowerXAbilityLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_SHORT, "GarrAbilityID" },
+ { false, FT_BYTE, "OrderIndex" },
{ false, FT_BYTE, "FactionIndex" },
+ { false, FT_SHORT, "GarrAbilityID" },
{ false, FT_SHORT, "GarrFollowerID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrFollowerXAbilityMeta::Instance(), HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY);
@@ -1669,12 +1746,12 @@ struct GarrPlotLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_STRING, "Name" },
- { true, FT_INT, "AllianceConstructObjID" },
- { true, FT_INT, "HordeConstructObjID" },
- { false, FT_BYTE, "UiCategoryID" },
+ { false, FT_STRING_NOT_LOCALIZED, "Name" },
{ false, FT_BYTE, "PlotType" },
+ { true, FT_INT, "HordeConstructObjID" },
+ { true, FT_INT, "AllianceConstructObjID" },
{ false, FT_BYTE, "Flags" },
+ { false, FT_BYTE, "UiCategoryID" },
{ false, FT_INT, "UpgradeRequirement1" },
{ false, FT_INT, "UpgradeRequirement2" },
};
@@ -1722,14 +1799,14 @@ struct GarrSiteLevelLoadInfo
{ false, FT_INT, "ID" },
{ false, FT_FLOAT, "TownHallUiPosX" },
{ false, FT_FLOAT, "TownHallUiPosY" },
+ { false, FT_INT, "GarrSiteID" },
+ { false, FT_BYTE, "GarrLevel" },
{ false, FT_SHORT, "MapID" },
- { false, FT_SHORT, "UiTextureKitID" },
{ false, FT_SHORT, "UpgradeMovieID" },
+ { false, FT_SHORT, "UiTextureKitID" },
+ { false, FT_BYTE, "MaxBuildingLevel" },
{ false, FT_SHORT, "UpgradeCost" },
{ false, FT_SHORT, "UpgradeGoldCost" },
- { false, FT_BYTE, "GarrLevel" },
- { false, FT_BYTE, "GarrSiteID" },
- { false, FT_BYTE, "MaxBuildingLevel" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GarrSiteLevelMeta::Instance(), HOTFIX_SEL_GARR_SITE_LEVEL);
return &loadInfo;
@@ -1761,8 +1838,8 @@ struct GemPropertiesLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_INT, "Type" },
{ false, FT_SHORT, "EnchantId" },
+ { true, FT_INT, "Type" },
{ false, FT_SHORT, "MinItemLevel" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GemPropertiesMeta::Instance(), HOTFIX_SEL_GEM_PROPERTIES);
@@ -1825,8 +1902,8 @@ struct GuildColorBackgroundLoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_BYTE, "Red" },
- { false, FT_BYTE, "Green" },
{ false, FT_BYTE, "Blue" },
+ { false, FT_BYTE, "Green" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GuildColorBackgroundMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BACKGROUND);
return &loadInfo;
@@ -1841,8 +1918,8 @@ struct GuildColorBorderLoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_BYTE, "Red" },
- { false, FT_BYTE, "Green" },
{ false, FT_BYTE, "Blue" },
+ { false, FT_BYTE, "Green" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GuildColorBorderMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_BORDER);
return &loadInfo;
@@ -1857,8 +1934,8 @@ struct GuildColorEmblemLoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_BYTE, "Red" },
- { false, FT_BYTE, "Green" },
{ false, FT_BYTE, "Blue" },
+ { false, FT_BYTE, "Green" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, GuildColorEmblemMeta::Instance(), HOTFIX_SEL_GUILD_COLOR_EMBLEM);
return &loadInfo;
@@ -1886,19 +1963,19 @@ struct HeirloomLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_STRING, "SourceText" },
+ { false, FT_INT, "ID" },
{ true, FT_INT, "ItemID" },
- { true, FT_INT, "LegacyItemID" },
{ true, FT_INT, "LegacyUpgradedItemID" },
{ true, FT_INT, "StaticUpgradedItemID" },
+ { true, FT_BYTE, "SourceTypeEnum" },
+ { false, FT_BYTE, "Flags" },
+ { true, FT_INT, "LegacyItemID" },
{ true, FT_INT, "UpgradeItemID1" },
{ true, FT_INT, "UpgradeItemID2" },
{ true, FT_INT, "UpgradeItemID3" },
{ false, FT_SHORT, "UpgradeItemBonusListID1" },
{ false, FT_SHORT, "UpgradeItemBonusListID2" },
{ false, FT_SHORT, "UpgradeItemBonusListID3" },
- { false, FT_BYTE, "Flags" },
- { true, FT_BYTE, "SourceTypeEnum" },
- { false, FT_INT, "ID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, HeirloomMeta::Instance(), HOTFIX_SEL_HEIRLOOM);
return &loadInfo;
@@ -1912,6 +1989,23 @@ struct HolidaysLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_SHORT, "Region" },
+ { false, FT_BYTE, "Looping" },
+ { false, FT_INT, "HolidayNameID" },
+ { false, FT_INT, "HolidayDescriptionID" },
+ { false, FT_BYTE, "Priority" },
+ { true, FT_BYTE, "CalendarFilterType" },
+ { false, FT_BYTE, "Flags" },
+ { 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_INT, "Date1" },
{ false, FT_INT, "Date2" },
{ false, FT_INT, "Date3" },
@@ -1928,18 +2022,6 @@ struct HolidaysLoadInfo
{ false, FT_INT, "Date14" },
{ false, FT_INT, "Date15" },
{ false, FT_INT, "Date16" },
- { 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" },
@@ -1950,11 +2032,6 @@ struct HolidaysLoadInfo
{ false, FT_BYTE, "CalendarFlags8" },
{ false, FT_BYTE, "CalendarFlags9" },
{ false, FT_BYTE, "CalendarFlags10" },
- { false, FT_BYTE, "Priority" },
- { true, FT_BYTE, "CalendarFilterType" },
- { false, FT_BYTE, "Flags" },
- { false, FT_INT, "HolidayNameID" },
- { false, FT_INT, "HolidayDescriptionID" },
{ true, FT_INT, "TextureFileDataID1" },
{ true, FT_INT, "TextureFileDataID2" },
{ true, FT_INT, "TextureFileDataID3" },
@@ -2030,13 +2107,13 @@ struct ItemLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { true, FT_INT, "IconFileDataID" },
{ false, FT_BYTE, "ClassID" },
{ false, FT_BYTE, "SubclassID" },
- { true, FT_BYTE, "SoundOverrideSubclassID" },
{ false, FT_BYTE, "Material" },
- { false, FT_BYTE, "InventoryType" },
+ { true, FT_BYTE, "InventoryType" },
{ false, FT_BYTE, "SheatheType" },
+ { true, FT_BYTE, "SoundOverrideSubclassID" },
+ { true, FT_INT, "IconFileDataID" },
{ false, FT_BYTE, "ItemGroupSoundsID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemMeta::Instance(), HOTFIX_SEL_ITEM);
@@ -2051,10 +2128,10 @@ struct ItemAppearanceLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_BYTE, "DisplayType" },
{ true, FT_INT, "ItemDisplayInfoID" },
{ true, FT_INT, "DefaultIconFileDataID" },
{ true, FT_INT, "UiOrder" },
- { false, FT_BYTE, "DisplayType" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemAppearanceMeta::Instance(), HOTFIX_SEL_ITEM_APPEARANCE);
return &loadInfo;
@@ -2075,7 +2152,6 @@ struct ItemArmorQualityLoadInfo
{ false, FT_FLOAT, "Qualitymod5" },
{ false, FT_FLOAT, "Qualitymod6" },
{ false, FT_FLOAT, "Qualitymod7" },
- { true, FT_SHORT, "ItemLevel" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemArmorQualityMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_QUALITY);
return &loadInfo;
@@ -2110,11 +2186,11 @@ struct ItemArmorTotalLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { true, FT_SHORT, "ItemLevel" },
{ false, FT_FLOAT, "Cloth" },
{ false, FT_FLOAT, "Leather" },
{ false, FT_FLOAT, "Mail" },
{ false, FT_FLOAT, "Plate" },
- { true, FT_SHORT, "ItemLevel" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemArmorTotalMeta::Instance(), HOTFIX_SEL_ITEM_ARMOR_TOTAL);
return &loadInfo;
@@ -2175,10 +2251,10 @@ struct ItemBonusTreeNodeLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_BYTE, "ItemContext" },
{ false, FT_SHORT, "ChildItemBonusTreeID" },
{ false, FT_SHORT, "ChildItemBonusListID" },
{ false, FT_SHORT, "ChildItemLevelSelectorID" },
- { false, FT_BYTE, "ItemContext" },
{ false, FT_SHORT, "ParentItemBonusTreeID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemBonusTreeNodeMeta::Instance(), HOTFIX_SEL_ITEM_BONUS_TREE_NODE);
@@ -2210,8 +2286,8 @@ struct ItemClassLoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_STRING, "ClassName" },
- { false, FT_FLOAT, "PriceModifier" },
{ true, FT_BYTE, "ClassID" },
+ { false, FT_FLOAT, "PriceModifier" },
{ false, FT_BYTE, "Flags" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemClassMeta::Instance(), HOTFIX_SEL_ITEM_CLASS);
@@ -2240,6 +2316,7 @@ struct ItemDamageAmmoLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_SHORT, "ItemLevel" },
{ false, FT_FLOAT, "Quality1" },
{ false, FT_FLOAT, "Quality2" },
{ false, FT_FLOAT, "Quality3" },
@@ -2247,7 +2324,6 @@ struct ItemDamageAmmoLoadInfo
{ false, FT_FLOAT, "Quality5" },
{ false, FT_FLOAT, "Quality6" },
{ false, FT_FLOAT, "Quality7" },
- { false, FT_SHORT, "ItemLevel" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemDamageAmmoMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_AMMO);
return &loadInfo;
@@ -2261,6 +2337,7 @@ struct ItemDamageOneHandLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_SHORT, "ItemLevel" },
{ false, FT_FLOAT, "Quality1" },
{ false, FT_FLOAT, "Quality2" },
{ false, FT_FLOAT, "Quality3" },
@@ -2268,7 +2345,6 @@ struct ItemDamageOneHandLoadInfo
{ false, FT_FLOAT, "Quality5" },
{ false, FT_FLOAT, "Quality6" },
{ false, FT_FLOAT, "Quality7" },
- { false, FT_SHORT, "ItemLevel" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemDamageOneHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND);
return &loadInfo;
@@ -2282,6 +2358,7 @@ struct ItemDamageOneHandCasterLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_SHORT, "ItemLevel" },
{ false, FT_FLOAT, "Quality1" },
{ false, FT_FLOAT, "Quality2" },
{ false, FT_FLOAT, "Quality3" },
@@ -2289,7 +2366,6 @@ struct ItemDamageOneHandCasterLoadInfo
{ false, FT_FLOAT, "Quality5" },
{ false, FT_FLOAT, "Quality6" },
{ false, FT_FLOAT, "Quality7" },
- { false, FT_SHORT, "ItemLevel" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemDamageOneHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER);
return &loadInfo;
@@ -2303,6 +2379,7 @@ struct ItemDamageTwoHandLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_SHORT, "ItemLevel" },
{ false, FT_FLOAT, "Quality1" },
{ false, FT_FLOAT, "Quality2" },
{ false, FT_FLOAT, "Quality3" },
@@ -2310,7 +2387,6 @@ struct ItemDamageTwoHandLoadInfo
{ false, FT_FLOAT, "Quality5" },
{ false, FT_FLOAT, "Quality6" },
{ false, FT_FLOAT, "Quality7" },
- { false, FT_SHORT, "ItemLevel" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemDamageTwoHandMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND);
return &loadInfo;
@@ -2324,6 +2400,7 @@ struct ItemDamageTwoHandCasterLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_SHORT, "ItemLevel" },
{ false, FT_FLOAT, "Quality1" },
{ false, FT_FLOAT, "Quality2" },
{ false, FT_FLOAT, "Quality3" },
@@ -2331,7 +2408,6 @@ struct ItemDamageTwoHandCasterLoadInfo
{ false, FT_FLOAT, "Quality5" },
{ false, FT_FLOAT, "Quality6" },
{ false, FT_FLOAT, "Quality7" },
- { false, FT_SHORT, "ItemLevel" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemDamageTwoHandCasterMeta::Instance(), HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER);
return &loadInfo;
@@ -2345,11 +2421,11 @@ struct ItemDisenchantLootLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { true, FT_BYTE, "Subclass" },
+ { false, FT_BYTE, "Quality" },
{ false, FT_SHORT, "MinLevel" },
{ false, FT_SHORT, "MaxLevel" },
{ false, FT_SHORT, "SkillRequired" },
- { true, FT_BYTE, "Subclass" },
- { false, FT_BYTE, "Quality" },
{ true, FT_BYTE, "ExpansionID" },
{ false, FT_BYTE, "Class" },
};
@@ -2365,14 +2441,14 @@ struct ItemEffectLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { true, FT_INT, "SpellID" },
+ { false, FT_BYTE, "LegacySlotIndex" },
+ { true, FT_BYTE, "TriggerType" },
+ { true, FT_SHORT, "Charges" },
{ true, FT_INT, "CoolDownMSec" },
{ true, FT_INT, "CategoryCoolDownMSec" },
- { true, FT_SHORT, "Charges" },
{ false, FT_SHORT, "SpellCategoryID" },
+ { true, FT_INT, "SpellID" },
{ false, FT_SHORT, "ChrSpecializationID" },
- { false, FT_BYTE, "LegacySlotIndex" },
- { true, FT_BYTE, "TriggerType" },
{ true, FT_INT, "ParentItemID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemEffectMeta::Instance(), HOTFIX_SEL_ITEM_EFFECT);
@@ -2387,32 +2463,32 @@ struct ItemExtendedCostLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_SHORT, "RequiredArenaRating" },
+ { true, FT_BYTE, "ArenaBracket" },
+ { false, FT_BYTE, "Flags" },
+ { false, FT_BYTE, "MinFactionID" },
+ { false, FT_BYTE, "MinReputation" },
+ { false, FT_BYTE, "RequiredAchievement" },
{ true, FT_INT, "ItemID1" },
{ true, FT_INT, "ItemID2" },
{ true, FT_INT, "ItemID3" },
{ true, FT_INT, "ItemID4" },
{ true, FT_INT, "ItemID5" },
- { false, FT_INT, "CurrencyCount1" },
- { false, FT_INT, "CurrencyCount2" },
- { false, FT_INT, "CurrencyCount3" },
- { false, FT_INT, "CurrencyCount4" },
- { false, FT_INT, "CurrencyCount5" },
{ false, FT_SHORT, "ItemCount1" },
{ false, FT_SHORT, "ItemCount2" },
{ false, FT_SHORT, "ItemCount3" },
{ false, FT_SHORT, "ItemCount4" },
{ false, FT_SHORT, "ItemCount5" },
- { false, FT_SHORT, "RequiredArenaRating" },
{ false, FT_SHORT, "CurrencyID1" },
{ false, FT_SHORT, "CurrencyID2" },
{ false, FT_SHORT, "CurrencyID3" },
{ false, FT_SHORT, "CurrencyID4" },
{ false, FT_SHORT, "CurrencyID5" },
- { false, FT_BYTE, "ArenaBracket" },
- { false, FT_BYTE, "MinFactionID" },
- { false, FT_BYTE, "MinReputation" },
- { false, FT_BYTE, "Flags" },
- { false, FT_BYTE, "RequiredAchievement" },
+ { false, FT_INT, "CurrencyCount1" },
+ { false, FT_INT, "CurrencyCount2" },
+ { false, FT_INT, "CurrencyCount3" },
+ { false, FT_INT, "CurrencyCount4" },
+ { false, FT_INT, "CurrencyCount5" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemExtendedCostMeta::Instance(), HOTFIX_SEL_ITEM_EXTENDED_COST);
return &loadInfo;
@@ -2503,8 +2579,8 @@ struct ItemModifiedAppearanceLoadInfo
{
static DB2FieldMeta const fields[] =
{
- { true, FT_INT, "ItemID" },
{ false, FT_INT, "ID" },
+ { true, FT_INT, "ItemID" },
{ false, FT_BYTE, "ItemAppearanceModifierID" },
{ false, FT_SHORT, "ItemAppearanceID" },
{ false, FT_BYTE, "OrderIndex" },
@@ -2522,9 +2598,9 @@ struct ItemPriceBaseLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_SHORT, "ItemLevel" },
{ false, FT_FLOAT, "Armor" },
{ false, FT_FLOAT, "Weapon" },
- { false, FT_SHORT, "ItemLevel" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemPriceBaseMeta::Instance(), HOTFIX_SEL_ITEM_PRICE_BASE);
return &loadInfo;
@@ -2583,19 +2659,20 @@ struct ItemSearchNameLoadInfo
{ true, FT_LONG, "AllowableRace" },
{ false, FT_STRING, "Display" },
{ false, FT_INT, "ID" },
- { true, FT_INT, "Flags1" },
- { true, FT_INT, "Flags2" },
- { true, FT_INT, "Flags3" },
- { false, FT_SHORT, "ItemLevel" },
{ false, FT_BYTE, "OverallQualityID" },
{ false, FT_BYTE, "ExpansionID" },
- { true, FT_BYTE, "RequiredLevel" },
{ false, FT_SHORT, "MinFactionID" },
{ false, FT_BYTE, "MinReputation" },
{ true, FT_INT, "AllowableClass" },
+ { true, FT_BYTE, "RequiredLevel" },
{ false, FT_SHORT, "RequiredSkill" },
{ false, FT_SHORT, "RequiredSkillRank" },
{ false, FT_INT, "RequiredAbility" },
+ { false, FT_SHORT, "ItemLevel" },
+ { true, FT_INT, "Flags1" },
+ { true, FT_INT, "Flags2" },
+ { true, FT_INT, "Flags3" },
+ { true, FT_INT, "Flags4" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemSearchNameMeta::Instance(), HOTFIX_SEL_ITEM_SEARCH_NAME);
return &loadInfo;
@@ -2610,6 +2687,9 @@ struct ItemSetLoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Name" },
+ { false, FT_INT, "SetFlags" },
+ { false, FT_INT, "RequiredSkill" },
+ { false, FT_SHORT, "RequiredSkillRank" },
{ false, FT_INT, "ItemID1" },
{ false, FT_INT, "ItemID2" },
{ false, FT_INT, "ItemID3" },
@@ -2627,9 +2707,6 @@ struct ItemSetLoadInfo
{ false, FT_INT, "ItemID15" },
{ false, FT_INT, "ItemID16" },
{ false, FT_INT, "ItemID17" },
- { false, FT_SHORT, "RequiredSkillRank" },
- { false, FT_INT, "RequiredSkill" },
- { false, FT_INT, "SetFlags" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemSetMeta::Instance(), HOTFIX_SEL_ITEM_SET);
return &loadInfo;
@@ -2643,8 +2720,8 @@ struct ItemSetSpellLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_INT, "SpellID" },
{ false, FT_SHORT, "ChrSpecID" },
+ { false, FT_INT, "SpellID" },
{ false, FT_BYTE, "Threshold" },
{ false, FT_SHORT, "ItemSetID" },
};
@@ -2661,33 +2738,16 @@ struct ItemSparseLoadInfo
{
{ false, FT_INT, "ID" },
{ true, FT_LONG, "AllowableRace" },
- { false, FT_STRING, "Display" },
- { false, FT_STRING, "Display1" },
- { false, FT_STRING, "Display2" },
- { false, FT_STRING, "Display3" },
{ false, FT_STRING, "Description" },
- { true, FT_INT, "Flags1" },
- { true, FT_INT, "Flags2" },
- { true, FT_INT, "Flags3" },
- { true, FT_INT, "Flags4" },
- { false, FT_FLOAT, "PriceRandomValue" },
- { false, FT_FLOAT, "PriceVariance" },
- { false, FT_INT, "VendorStackCount" },
- { false, FT_INT, "BuyPrice" },
- { false, FT_INT, "SellPrice" },
- { false, FT_INT, "RequiredAbility" },
- { true, FT_INT, "MaxCount" },
- { true, FT_INT, "Stackable" },
- { true, FT_INT, "StatPercentEditor1" },
- { true, FT_INT, "StatPercentEditor2" },
- { true, FT_INT, "StatPercentEditor3" },
- { true, FT_INT, "StatPercentEditor4" },
- { true, FT_INT, "StatPercentEditor5" },
- { true, FT_INT, "StatPercentEditor6" },
- { true, FT_INT, "StatPercentEditor7" },
- { true, FT_INT, "StatPercentEditor8" },
- { true, FT_INT, "StatPercentEditor9" },
- { true, FT_INT, "StatPercentEditor10" },
+ { false, FT_STRING, "Display3" },
+ { false, FT_STRING, "Display2" },
+ { false, FT_STRING, "Display1" },
+ { false, FT_STRING, "Display" },
+ { false, FT_FLOAT, "DmgVariance" },
+ { false, FT_INT, "DurationInInventory" },
+ { false, FT_FLOAT, "QualityModifier" },
+ { false, FT_INT, "BagFamily" },
+ { false, FT_FLOAT, "ItemRange" },
{ false, FT_FLOAT, "StatPercentageOfSocket1" },
{ false, FT_FLOAT, "StatPercentageOfSocket2" },
{ false, FT_FLOAT, "StatPercentageOfSocket3" },
@@ -2698,50 +2758,64 @@ struct ItemSparseLoadInfo
{ false, FT_FLOAT, "StatPercentageOfSocket8" },
{ false, FT_FLOAT, "StatPercentageOfSocket9" },
{ false, FT_FLOAT, "StatPercentageOfSocket10" },
- { false, FT_FLOAT, "ItemRange" },
- { false, FT_INT, "BagFamily" },
- { false, FT_FLOAT, "QualityModifier" },
- { false, FT_INT, "DurationInInventory" },
- { false, FT_FLOAT, "DmgVariance" },
- { true, FT_SHORT, "AllowableClass" },
- { false, FT_SHORT, "ItemLevel" },
- { false, FT_SHORT, "RequiredSkill" },
- { false, FT_SHORT, "RequiredSkillRank" },
- { false, FT_SHORT, "MinFactionID" },
- { 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, "ScalingStatDistributionID" },
- { false, FT_SHORT, "ItemDelay" },
- { false, FT_SHORT, "PageID" },
- { false, FT_SHORT, "StartQuestID" },
- { false, FT_SHORT, "LockID" },
- { false, FT_SHORT, "RandomSelect" },
- { false, FT_SHORT, "ItemRandomSuffixGroupID" },
- { false, FT_SHORT, "ItemSet" },
- { false, FT_SHORT, "ZoneBound" },
- { false, FT_SHORT, "InstanceBound" },
- { false, FT_SHORT, "TotemCategoryID" },
- { false, FT_SHORT, "SocketMatchEnchantmentId" },
- { false, FT_SHORT, "GemProperties" },
- { false, FT_SHORT, "LimitCategory" },
- { false, FT_SHORT, "RequiredHoliday" },
- { false, FT_SHORT, "RequiredTransmogHoliday" },
+ { true, FT_INT, "StatPercentEditor1" },
+ { true, FT_INT, "StatPercentEditor2" },
+ { true, FT_INT, "StatPercentEditor3" },
+ { true, FT_INT, "StatPercentEditor4" },
+ { true, FT_INT, "StatPercentEditor5" },
+ { true, FT_INT, "StatPercentEditor6" },
+ { true, FT_INT, "StatPercentEditor7" },
+ { true, FT_INT, "StatPercentEditor8" },
+ { true, FT_INT, "StatPercentEditor9" },
+ { true, FT_INT, "StatPercentEditor10" },
+ { true, FT_INT, "Stackable" },
+ { true, FT_INT, "MaxCount" },
+ { false, FT_INT, "RequiredAbility" },
+ { false, FT_INT, "SellPrice" },
+ { false, FT_INT, "BuyPrice" },
+ { false, FT_INT, "VendorStackCount" },
+ { false, FT_FLOAT, "PriceVariance" },
+ { false, FT_FLOAT, "PriceRandomValue" },
+ { true, FT_INT, "Flags1" },
+ { true, FT_INT, "Flags2" },
+ { true, FT_INT, "Flags3" },
+ { true, FT_INT, "Flags4" },
+ { true, FT_INT, "FactionRelated" },
{ false, FT_SHORT, "ItemNameDescriptionID" },
- { false, FT_BYTE, "OverallQualityID" },
- { false, FT_BYTE, "InventoryType" },
- { true, FT_BYTE, "RequiredLevel" },
- { false, FT_BYTE, "RequiredPVPRank" },
- { false, FT_BYTE, "RequiredPVPMedal" },
- { false, FT_BYTE, "MinReputation" },
- { false, FT_BYTE, "ContainerSlots" },
+ { false, FT_SHORT, "RequiredTransmogHoliday" },
+ { false, FT_SHORT, "RequiredHoliday" },
+ { false, FT_SHORT, "LimitCategory" },
+ { false, FT_SHORT, "GemProperties" },
+ { false, FT_SHORT, "SocketMatchEnchantmentId" },
+ { false, FT_SHORT, "TotemCategoryID" },
+ { false, FT_SHORT, "InstanceBound" },
+ { false, FT_SHORT, "ZoneBound" },
+ { false, FT_SHORT, "ItemSet" },
+ { false, FT_SHORT, "ItemRandomSuffixGroupID" },
+ { false, FT_SHORT, "RandomSelect" },
+ { false, FT_SHORT, "LockID" },
+ { false, FT_SHORT, "StartQuestID" },
+ { false, FT_SHORT, "PageID" },
+ { false, FT_SHORT, "ItemDelay" },
+ { false, FT_SHORT, "ScalingStatDistributionID" },
+ { false, FT_SHORT, "MinFactionID" },
+ { false, FT_SHORT, "RequiredSkillRank" },
+ { false, FT_SHORT, "RequiredSkill" },
+ { false, FT_SHORT, "ItemLevel" },
+ { true, FT_SHORT, "AllowableClass" },
+ { false, FT_BYTE, "ExpansionID" },
+ { false, FT_BYTE, "ArtifactID" },
+ { false, FT_BYTE, "SpellWeight" },
+ { false, FT_BYTE, "SpellWeightCategory" },
+ { false, FT_BYTE, "SocketType1" },
+ { false, FT_BYTE, "SocketType2" },
+ { false, FT_BYTE, "SocketType3" },
+ { false, FT_BYTE, "SheatheType" },
+ { false, FT_BYTE, "Material" },
+ { false, FT_BYTE, "PageMaterialID" },
+ { false, FT_BYTE, "LanguageID" },
+ { false, FT_BYTE, "Bonding" },
+ { false, FT_BYTE, "DamageDamageType" },
{ true, FT_BYTE, "StatModifierBonusStat1" },
{ true, FT_BYTE, "StatModifierBonusStat2" },
{ true, FT_BYTE, "StatModifierBonusStat3" },
@@ -2752,19 +2826,13 @@ struct ItemSparseLoadInfo
{ true, FT_BYTE, "StatModifierBonusStat8" },
{ true, FT_BYTE, "StatModifierBonusStat9" },
{ true, FT_BYTE, "StatModifierBonusStat10" },
- { false, FT_BYTE, "DamageDamageType" },
- { false, FT_BYTE, "Bonding" },
- { false, FT_BYTE, "LanguageID" },
- { false, FT_BYTE, "PageMaterialID" },
- { false, FT_BYTE, "Material" },
- { false, FT_BYTE, "SheatheType" },
- { false, FT_BYTE, "SocketType1" },
- { false, FT_BYTE, "SocketType2" },
- { false, FT_BYTE, "SocketType3" },
- { false, FT_BYTE, "SpellWeightCategory" },
- { false, FT_BYTE, "SpellWeight" },
- { false, FT_BYTE, "ArtifactID" },
- { false, FT_BYTE, "ExpansionID" },
+ { false, FT_BYTE, "ContainerSlots" },
+ { false, FT_BYTE, "MinReputation" },
+ { false, FT_BYTE, "RequiredPVPMedal" },
+ { false, FT_BYTE, "RequiredPVPRank" },
+ { true, FT_BYTE, "RequiredLevel" },
+ { false, FT_BYTE, "InventoryType" },
+ { false, FT_BYTE, "OverallQualityID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemSparseMeta::Instance(), HOTFIX_SEL_ITEM_SPARSE);
return &loadInfo;
@@ -2778,12 +2846,12 @@ struct ItemSpecLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_SHORT, "SpecializationID" },
{ false, FT_BYTE, "MinLevel" },
{ false, FT_BYTE, "MaxLevel" },
{ false, FT_BYTE, "ItemType" },
{ false, FT_BYTE, "PrimaryStat" },
{ false, FT_BYTE, "SecondaryStat" },
+ { false, FT_SHORT, "SpecializationID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemSpecMeta::Instance(), HOTFIX_SEL_ITEM_SPEC);
return &loadInfo;
@@ -2812,11 +2880,11 @@ struct ItemUpgradeLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_INT, "CurrencyAmount" },
- { false, FT_SHORT, "PrerequisiteID" },
- { false, FT_SHORT, "CurrencyType" },
{ false, FT_BYTE, "ItemUpgradePathID" },
{ false, FT_BYTE, "ItemLevelIncrement" },
+ { false, FT_SHORT, "PrerequisiteID" },
+ { false, FT_SHORT, "CurrencyType" },
+ { false, FT_INT, "CurrencyAmount" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemUpgradeMeta::Instance(), HOTFIX_SEL_ITEM_UPGRADE);
return &loadInfo;
@@ -2892,37 +2960,38 @@ struct LfgDungeonsLoadInfo
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Name" },
{ false, FT_STRING, "Description" },
- { true, FT_INT, "Flags" },
- { false, FT_FLOAT, "MinGear" },
- { false, FT_SHORT, "MaxLevel" },
- { false, FT_SHORT, "TargetLevelMax" },
- { true, FT_SHORT, "MapID" },
- { false, FT_SHORT, "RandomID" },
- { false, FT_SHORT, "ScenarioID" },
- { false, FT_SHORT, "FinalEncounterID" },
- { false, FT_SHORT, "BonusReputationAmount" },
- { false, FT_SHORT, "MentorItemLevel" },
- { false, FT_SHORT, "RequiredPlayerConditionId" },
{ false, FT_BYTE, "MinLevel" },
- { false, FT_BYTE, "TargetLevel" },
- { false, FT_BYTE, "TargetLevelMin" },
- { false, FT_BYTE, "DifficultyID" },
+ { false, FT_SHORT, "MaxLevel" },
{ false, FT_BYTE, "TypeID" },
+ { false, FT_BYTE, "Subtype" },
{ true, FT_BYTE, "Faction" },
+ { true, FT_INT, "IconTextureFileID" },
+ { true, FT_INT, "RewardsBgTextureFileID" },
+ { true, FT_INT, "PopupBgTextureFileID" },
{ false, FT_BYTE, "ExpansionLevel" },
- { false, FT_BYTE, "OrderIndex" },
+ { true, FT_SHORT, "MapID" },
+ { false, FT_BYTE, "DifficultyID" },
+ { false, FT_FLOAT, "MinGear" },
{ false, FT_BYTE, "GroupID" },
+ { false, FT_BYTE, "OrderIndex" },
+ { false, FT_INT, "RequiredPlayerConditionId" },
+ { false, FT_BYTE, "TargetLevel" },
+ { false, FT_BYTE, "TargetLevelMin" },
+ { false, FT_SHORT, "TargetLevelMax" },
+ { false, FT_SHORT, "RandomID" },
+ { false, FT_SHORT, "ScenarioID" },
+ { false, FT_SHORT, "FinalEncounterID" },
{ 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_SHORT, "BonusReputationAmount" },
+ { false, FT_SHORT, "MentorItemLevel" },
{ false, FT_BYTE, "MentorCharLevel" },
- { true, FT_INT, "IconTextureFileID" },
- { true, FT_INT, "RewardsBgTextureFileID" },
- { true, FT_INT, "PopupBgTextureFileID" },
+ { true, FT_INT, "Flags1" },
+ { true, FT_INT, "Flags2" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, LFGDungeonsMeta::Instance(), HOTFIX_SEL_LFG_DUNGEONS);
return &loadInfo;
@@ -2970,12 +3039,26 @@ struct LiquidTypeLoadInfo
{ false, FT_STRING_NOT_LOCALIZED, "Texture4" },
{ false, FT_STRING_NOT_LOCALIZED, "Texture5" },
{ false, FT_STRING_NOT_LOCALIZED, "Texture6" },
+ { false, FT_SHORT, "Flags" },
+ { false, FT_BYTE, "SoundBank" },
+ { false, FT_INT, "SoundID" },
{ false, FT_INT, "SpellID" },
{ false, FT_FLOAT, "MaxDarkenDepth" },
{ false, FT_FLOAT, "FogDarkenIntensity" },
{ false, FT_FLOAT, "AmbDarkenIntensity" },
{ false, FT_FLOAT, "DirDarkenIntensity" },
+ { false, FT_SHORT, "LightID" },
{ false, FT_FLOAT, "ParticleScale" },
+ { false, FT_BYTE, "ParticleMovement" },
+ { false, FT_BYTE, "ParticleTexSlots" },
+ { false, FT_BYTE, "MaterialID" },
+ { true, FT_INT, "MinimapStaticCol" },
+ { false, FT_BYTE, "FrameCountTexture1" },
+ { false, FT_BYTE, "FrameCountTexture2" },
+ { false, FT_BYTE, "FrameCountTexture3" },
+ { false, FT_BYTE, "FrameCountTexture4" },
+ { false, FT_BYTE, "FrameCountTexture5" },
+ { false, FT_BYTE, "FrameCountTexture6" },
{ true, FT_INT, "Color1" },
{ true, FT_INT, "Color2" },
{ false, FT_FLOAT, "Float1" },
@@ -3000,19 +3083,10 @@ struct LiquidTypeLoadInfo
{ false, FT_INT, "Int2" },
{ false, FT_INT, "Int3" },
{ false, FT_INT, "Int4" },
- { false, FT_SHORT, "Flags" },
- { false, FT_SHORT, "LightID" },
- { false, FT_BYTE, "SoundBank" },
- { false, FT_BYTE, "ParticleMovement" },
- { false, FT_BYTE, "ParticleTexSlots" },
- { false, FT_BYTE, "MaterialID" },
- { false, FT_BYTE, "FrameCountTexture1" },
- { false, FT_BYTE, "FrameCountTexture2" },
- { false, FT_BYTE, "FrameCountTexture3" },
- { false, FT_BYTE, "FrameCountTexture4" },
- { false, FT_BYTE, "FrameCountTexture5" },
- { false, FT_BYTE, "FrameCountTexture6" },
- { false, FT_INT, "SoundID" },
+ { false, FT_FLOAT, "Coefficient1" },
+ { false, FT_FLOAT, "Coefficient2" },
+ { false, FT_FLOAT, "Coefficient3" },
+ { false, FT_FLOAT, "Coefficient4" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, LiquidTypeMeta::Instance(), HOTFIX_SEL_LIQUID_TYPE);
return &loadInfo;
@@ -3091,23 +3165,24 @@ struct MapLoadInfo
{ false, FT_STRING, "MapDescription1" },
{ false, FT_STRING, "PvpShortDescription" },
{ false, FT_STRING, "PvpLongDescription" },
- { true, FT_INT, "Flags1" },
- { true, FT_INT, "Flags2" },
- { false, FT_FLOAT, "MinimapIconScale" },
{ false, FT_FLOAT, "CorpseX" },
{ false, FT_FLOAT, "CorpseY" },
+ { false, FT_BYTE, "MapType" },
+ { true, FT_BYTE, "InstanceType" },
+ { false, FT_BYTE, "ExpansionID" },
{ false, FT_SHORT, "AreaTableID" },
{ true, FT_SHORT, "LoadingScreenID" },
- { true, FT_SHORT, "CorpseMapID" },
{ true, FT_SHORT, "TimeOfDayOverride" },
{ true, FT_SHORT, "ParentMapID" },
{ true, FT_SHORT, "CosmeticParentMapID" },
- { true, FT_SHORT, "WindSettingsID" },
- { false, FT_BYTE, "InstanceType" },
- { false, FT_BYTE, "MapType" },
- { false, FT_BYTE, "ExpansionID" },
- { false, FT_BYTE, "MaxPlayers" },
{ false, FT_BYTE, "TimeOffset" },
+ { false, FT_FLOAT, "MinimapIconScale" },
+ { true, FT_SHORT, "CorpseMapID" },
+ { false, FT_BYTE, "MaxPlayers" },
+ { true, FT_SHORT, "WindSettingsID" },
+ { true, FT_INT, "ZmpFileDataID" },
+ { true, FT_INT, "Flags1" },
+ { true, FT_INT, "Flags2" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, MapMeta::Instance(), HOTFIX_SEL_MAP);
return &loadInfo;
@@ -3122,13 +3197,14 @@ struct MapDifficultyLoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Message" },
+ { false, FT_INT, "ItemContextPickerID" },
+ { true, FT_INT, "ContentTuningID" },
{ false, FT_BYTE, "DifficultyID" },
+ { false, FT_BYTE, "LockID" },
{ false, FT_BYTE, "ResetInterval" },
{ false, FT_BYTE, "MaxPlayers" },
- { false, FT_BYTE, "LockID" },
- { false, FT_BYTE, "Flags" },
{ false, FT_BYTE, "ItemContext" },
- { false, FT_INT, "ItemContextPickerID" },
+ { false, FT_BYTE, "Flags" },
{ false, FT_SHORT, "MapID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, MapDifficultyMeta::Instance(), HOTFIX_SEL_MAP_DIFFICULTY);
@@ -3143,13 +3219,13 @@ struct ModifierTreeLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { true, FT_INT, "Asset" },
- { true, FT_INT, "SecondaryAsset" },
{ false, FT_INT, "Parent" },
- { false, FT_BYTE, "Type" },
- { true, FT_BYTE, "TertiaryAsset" },
{ true, FT_BYTE, "Operator" },
{ true, FT_BYTE, "Amount" },
+ { false, FT_BYTE, "Type" },
+ { true, FT_INT, "Asset" },
+ { true, FT_INT, "SecondaryAsset" },
+ { true, FT_BYTE, "TertiaryAsset" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ModifierTreeMeta::Instance(), HOTFIX_SEL_MODIFIER_TREE);
return &loadInfo;
@@ -3163,15 +3239,15 @@ struct MountLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_STRING, "Name" },
- { false, FT_STRING, "Description" },
{ false, FT_STRING, "SourceText" },
- { true, FT_INT, "SourceSpellID" },
- { false, FT_FLOAT, "MountFlyRideHeight" },
+ { false, FT_STRING, "Description" },
+ { false, FT_INT, "ID" },
{ false, FT_SHORT, "MountTypeID" },
{ false, FT_SHORT, "Flags" },
{ true, FT_BYTE, "SourceTypeEnum" },
- { false, FT_INT, "ID" },
+ { true, FT_INT, "SourceSpellID" },
{ false, FT_INT, "PlayerConditionID" },
+ { false, FT_FLOAT, "MountFlyRideHeight" },
{ true, FT_INT, "UiModelSceneID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, MountMeta::Instance(), HOTFIX_SEL_MOUNT);
@@ -3185,14 +3261,14 @@ struct MountCapabilityLoadInfo
{
static DB2FieldMeta const fields[] =
{
- { true, FT_INT, "ReqSpellKnownID" },
- { true, FT_INT, "ModSpellAuraID" },
+ { false, FT_INT, "ID" },
+ { false, FT_BYTE, "Flags" },
{ false, FT_SHORT, "ReqRidingSkill" },
{ false, FT_SHORT, "ReqAreaID" },
- { true, FT_SHORT, "ReqMapID" },
- { false, FT_BYTE, "Flags" },
- { false, FT_INT, "ID" },
{ false, FT_INT, "ReqSpellAuraID" },
+ { true, FT_INT, "ReqSpellKnownID" },
+ { true, FT_INT, "ModSpellAuraID" },
+ { true, FT_SHORT, "ReqMapID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, MountCapabilityMeta::Instance(), HOTFIX_SEL_MOUNT_CAPABILITY);
return &loadInfo;
@@ -3238,10 +3314,10 @@ struct MovieLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_INT, "AudioFileDataID" },
- { false, FT_INT, "SubtitleFileDataID" },
{ false, FT_BYTE, "Volume" },
{ false, FT_BYTE, "KeyID" },
+ { false, FT_INT, "AudioFileDataID" },
+ { false, FT_INT, "SubtitleFileDataID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, MovieMeta::Instance(), HOTFIX_SEL_MOVIE);
return &loadInfo;
@@ -3371,12 +3447,9 @@ struct PlayerConditionLoadInfo
{ true, FT_LONG, "RaceMask" },
{ false, FT_STRING, "FailureDescription" },
{ false, FT_INT, "ID" },
- { false, FT_BYTE, "Flags" },
{ false, FT_SHORT, "MinLevel" },
{ false, FT_SHORT, "MaxLevel" },
{ true, FT_INT, "ClassMask" },
- { true, FT_BYTE, "Gender" },
- { true, FT_BYTE, "NativeGender" },
{ false, FT_INT, "SkillLogic" },
{ false, FT_BYTE, "LanguageID" },
{ false, FT_BYTE, "MinLanguage" },
@@ -3385,8 +3458,6 @@ struct PlayerConditionLoadInfo
{ false, FT_BYTE, "MaxReputation" },
{ false, FT_INT, "ReputationLogic" },
{ true, FT_BYTE, "CurrentPvpFaction" },
- { false, FT_BYTE, "MinPVPRank" },
- { false, FT_BYTE, "MaxPVPRank" },
{ false, FT_BYTE, "PvpMedal" },
{ false, FT_INT, "PrevQuestLogic" },
{ false, FT_INT, "CurrQuestLogic" },
@@ -3400,31 +3471,36 @@ struct PlayerConditionLoadInfo
{ false, FT_BYTE, "PartyStatus" },
{ false, FT_BYTE, "LifetimeMaxPVPRank" },
{ false, FT_INT, "AchievementLogic" },
- { false, FT_INT, "LfgLogic" },
+ { true, FT_BYTE, "Gender" },
+ { true, FT_BYTE, "NativeGender" },
{ false, FT_INT, "AreaLogic" },
+ { false, FT_INT, "LfgLogic" },
{ false, FT_INT, "CurrencyLogic" },
{ false, FT_SHORT, "QuestKillID" },
{ false, FT_INT, "QuestKillLogic" },
{ 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" },
- { false, FT_SHORT, "PhaseID" },
- { false, FT_INT, "PhaseGroupID" },
{ true, FT_INT, "MinAvgItemLevel" },
{ true, FT_INT, "MaxAvgItemLevel" },
{ false, FT_SHORT, "MinAvgEquippedItemLevel" },
{ false, FT_SHORT, "MaxAvgEquippedItemLevel" },
+ { false, FT_BYTE, "PhaseUseFlags" },
+ { false, FT_SHORT, "PhaseID" },
+ { false, FT_INT, "PhaseGroupID" },
+ { false, FT_BYTE, "Flags" },
{ true, FT_BYTE, "ChrSpecializationIndex" },
{ true, FT_BYTE, "ChrSpecializationRole" },
+ { false, FT_INT, "ModifierTreeID" },
{ true, FT_BYTE, "PowerType" },
{ false, FT_BYTE, "PowerTypeComp" },
{ false, FT_BYTE, "PowerTypeValue" },
- { false, FT_INT, "ModifierTreeID" },
{ true, FT_INT, "WeaponSubclassMask" },
+ { false, FT_BYTE, "MaxGuildLevel" },
+ { false, FT_BYTE, "MinGuildLevel" },
+ { true, FT_BYTE, "MaxExpansionTier" },
+ { true, FT_BYTE, "MinExpansionTier" },
+ { false, FT_BYTE, "MinPVPRank" },
+ { false, FT_BYTE, "MaxPVPRank" },
{ false, FT_SHORT, "SkillID1" },
{ false, FT_SHORT, "SkillID2" },
{ false, FT_SHORT, "SkillID3" },
@@ -3483,6 +3559,10 @@ struct PlayerConditionLoadInfo
{ 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_BYTE, "LfgStatus1" },
{ false, FT_BYTE, "LfgStatus2" },
{ false, FT_BYTE, "LfgStatus3" },
@@ -3495,10 +3575,6 @@ struct PlayerConditionLoadInfo
{ false, FT_INT, "LfgValue2" },
{ false, FT_INT, "LfgValue3" },
{ false, FT_INT, "LfgValue4" },
- { false, FT_SHORT, "AreaID1" },
- { false, FT_SHORT, "AreaID2" },
- { false, FT_SHORT, "AreaID3" },
- { false, FT_SHORT, "AreaID4" },
{ false, FT_INT, "CurrencyID1" },
{ false, FT_INT, "CurrencyID2" },
{ false, FT_INT, "CurrencyID3" },
@@ -3548,16 +3624,16 @@ struct PowerTypeLoadInfo
{ false, FT_INT, "ID" },
{ false, FT_STRING_NOT_LOCALIZED, "NameGlobalStringTag" },
{ false, FT_STRING_NOT_LOCALIZED, "CostGlobalStringTag" },
- { false, FT_FLOAT, "RegenPeace" },
- { false, FT_FLOAT, "RegenCombat" },
- { true, FT_SHORT, "MaxBasePower" },
- { true, FT_SHORT, "RegenInterruptTimeMS" },
- { true, FT_SHORT, "Flags" },
{ true, FT_BYTE, "PowerTypeEnum" },
{ true, FT_BYTE, "MinPower" },
+ { true, FT_SHORT, "MaxBasePower" },
{ true, FT_BYTE, "CenterPower" },
{ true, FT_BYTE, "DefaultPower" },
{ true, FT_BYTE, "DisplayModifier" },
+ { true, FT_SHORT, "RegenInterruptTimeMS" },
+ { false, FT_FLOAT, "RegenPeace" },
+ { false, FT_FLOAT, "RegenCombat" },
+ { true, FT_SHORT, "Flags" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, PowerTypeMeta::Instance(), HOTFIX_SEL_POWER_TYPE);
return &loadInfo;
@@ -3572,9 +3648,10 @@ struct PrestigeLevelInfoLoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Name" },
+ { true, FT_INT, "PrestigeLevel" },
{ true, FT_INT, "BadgeTextureFileDataID" },
- { false, FT_BYTE, "PrestigeLevel" },
{ false, FT_BYTE, "Flags" },
+ { true, FT_INT, "AwardedAchievementID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, PrestigeLevelInfoMeta::Instance(), HOTFIX_SEL_PRESTIGE_LEVEL_INFO);
return &loadInfo;
@@ -3613,57 +3690,54 @@ struct PvpItemLoadInfo
}
};
-struct PvpRewardLoadInfo
+struct PvpTalentLoadInfo
{
static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
+ { false, FT_STRING, "Description" },
{ false, FT_INT, "ID" },
- { true, FT_INT, "HonorLevel" },
- { true, FT_INT, "PrestigeLevel" },
- { true, FT_INT, "RewardPackID" },
+ { true, FT_INT, "SpecID" },
+ { true, FT_INT, "SpellID" },
+ { true, FT_INT, "OverridesSpellID" },
+ { true, FT_INT, "Flags" },
+ { true, FT_INT, "ActionBarSpellID" },
+ { true, FT_INT, "PvpTalentCategoryID" },
+ { true, FT_INT, "LevelRequired" },
};
- static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, PvpRewardMeta::Instance(), HOTFIX_SEL_PVP_REWARD);
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, PvpTalentMeta::Instance(), HOTFIX_SEL_PVP_TALENT);
return &loadInfo;
}
};
-struct PvpTalentLoadInfo
+struct PvpTalentCategoryLoadInfo
{
static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_STRING, "Description" },
- { true, FT_INT, "SpellID" },
- { true, FT_INT, "OverridesSpellID" },
- { true, FT_INT, "ActionBarSpellID" },
- { true, FT_INT, "TierID" },
- { true, FT_INT, "ColumnIndex" },
- { true, FT_INT, "Flags" },
- { true, FT_INT, "ClassID" },
- { true, FT_INT, "SpecID" },
- { true, FT_INT, "Role" },
+ { false, FT_BYTE, "TalentSlotMask" },
};
- static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, PvpTalentMeta::Instance(), HOTFIX_SEL_PVP_TALENT);
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, PvpTalentCategoryMeta::Instance(), HOTFIX_SEL_PVP_TALENT_CATEGORY);
return &loadInfo;
}
};
-struct PvpTalentUnlockLoadInfo
+struct PvpTalentSlotUnlockLoadInfo
{
static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { true, FT_INT, "TierID" },
- { true, FT_INT, "ColumnIndex" },
- { true, FT_INT, "HonorLevel" },
+ { true, FT_BYTE, "Slot" },
+ { true, FT_INT, "LevelRequired" },
+ { true, FT_INT, "DeathKnightLevelRequired" },
+ { true, FT_INT, "DemonHunterLevelRequired" },
};
- static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, PvpTalentUnlockMeta::Instance(), HOTFIX_SEL_PVP_TALENT_UNLOCK);
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, PvpTalentSlotUnlockMeta::Instance(), HOTFIX_SEL_PVP_TALENT_SLOT_UNLOCK);
return &loadInfo;
}
};
@@ -3721,10 +3795,10 @@ struct QuestPackageItemLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { true, FT_INT, "ItemID" },
{ false, FT_SHORT, "PackageID" },
- { false, FT_BYTE, "DisplayType" },
+ { true, FT_INT, "ItemID" },
{ false, FT_INT, "ItemQuantity" },
+ { false, FT_BYTE, "DisplayType" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, QuestPackageItemMeta::Instance(), HOTFIX_SEL_QUEST_PACKAGE_ITEM);
return &loadInfo;
@@ -3790,6 +3864,7 @@ struct RandPropPointsLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { true, FT_INT, "DamageReplaceStat" },
{ false, FT_INT, "Epic1" },
{ false, FT_INT, "Epic2" },
{ false, FT_INT, "Epic3" },
@@ -3818,11 +3893,11 @@ struct RewardPackLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { true, FT_INT, "CharTitleID" },
{ false, FT_INT, "Money" },
- { false, FT_FLOAT, "ArtifactXPMultiplier" },
{ true, FT_BYTE, "ArtifactXPDifficulty" },
+ { false, FT_FLOAT, "ArtifactXPMultiplier" },
{ false, FT_BYTE, "ArtifactXPCategoryID" },
- { true, FT_INT, "CharTitleID" },
{ false, FT_INT, "TreasurePickerID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, RewardPackMeta::Instance(), HOTFIX_SEL_REWARD_PACK);
@@ -3877,22 +3952,6 @@ struct RulesetItemUpgradeLoadInfo
}
};
-struct SandboxScalingLoadInfo
-{
- static DB2LoadInfo const* Instance()
- {
- static DB2FieldMeta const fields[] =
- {
- { false, FT_INT, "ID" },
- { true, FT_INT, "MinLevel" },
- { true, FT_INT, "MaxLevel" },
- { true, FT_INT, "Flags" },
- };
- static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SandboxScalingMeta::Instance(), HOTFIX_SEL_SANDBOX_SCALING);
- return &loadInfo;
- }
-};
-
struct ScalingStatDistributionLoadInfo
{
static DB2LoadInfo const* Instance()
@@ -3918,8 +3977,9 @@ struct ScenarioLoadInfo
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Name" },
{ false, FT_SHORT, "AreaTableID" },
- { false, FT_BYTE, "Flags" },
{ false, FT_BYTE, "Type" },
+ { false, FT_BYTE, "Flags" },
+ { false, FT_INT, "UiTextureKitID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ScenarioMeta::Instance(), HOTFIX_SEL_SCENARIO);
return &loadInfo;
@@ -3936,12 +3996,14 @@ struct ScenarioStepLoadInfo
{ false, FT_STRING, "Description" },
{ false, FT_STRING, "Title" },
{ false, FT_SHORT, "ScenarioID" },
- { false, FT_SHORT, "Supersedes" },
+ { false, FT_INT, "Criteriatreeid" },
{ false, FT_SHORT, "RewardQuestID" },
+ { true, FT_INT, "RelatedStep" },
+ { false, FT_SHORT, "Supersedes" },
{ false, FT_BYTE, "OrderIndex" },
{ false, FT_BYTE, "Flags" },
- { false, FT_INT, "Criteriatreeid" },
- { true, FT_INT, "RelatedStep" },
+ { false, FT_INT, "VisibilityPlayerConditionID" },
+ { false, FT_SHORT, "WidgetSetID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ScenarioStepMeta::Instance(), HOTFIX_SEL_SCENARIO_STEP);
return &loadInfo;
@@ -4013,15 +4075,19 @@ struct SkillLineLoadInfo
{
static DB2FieldMeta const fields[] =
{
- { false, FT_INT, "ID" },
{ false, FT_STRING, "DisplayName" },
- { false, FT_STRING, "Description" },
{ false, FT_STRING, "AlternateVerb" },
- { false, FT_SHORT, "Flags" },
+ { false, FT_STRING, "Description" },
+ { false, FT_STRING, "HordeDisplayName" },
+ { false, FT_STRING_NOT_LOCALIZED, "OverrideSourceInfoDisplayName" },
+ { false, FT_INT, "ID" },
{ true, FT_BYTE, "CategoryID" },
- { true, FT_BYTE, "CanLink" },
{ true, FT_INT, "SpellIconFileID" },
+ { true, FT_BYTE, "CanLink" },
{ false, FT_INT, "ParentSkillLineID" },
+ { true, FT_INT, "ParentTierIndex" },
+ { false, FT_SHORT, "Flags" },
+ { true, FT_INT, "SpellBookSpellID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SkillLineMeta::Instance(), HOTFIX_SEL_SKILL_LINE);
return &loadInfo;
@@ -4036,18 +4102,19 @@ struct SkillLineAbilityLoadInfo
{
{ true, FT_LONG, "RaceMask" },
{ false, FT_INT, "ID" },
+ { true, FT_SHORT, "SkillLine" },
{ true, FT_INT, "Spell" },
+ { true, FT_SHORT, "MinSkillLineRank" },
+ { true, FT_INT, "ClassMask" },
{ true, FT_INT, "SupercedesSpell" },
- { true, FT_SHORT, "SkillLine" },
+ { true, FT_BYTE, "AcquireMethod" },
{ true, FT_SHORT, "TrivialSkillLineRankHigh" },
{ true, FT_SHORT, "TrivialSkillLineRankLow" },
+ { true, FT_BYTE, "Flags" },
+ { true, FT_BYTE, "NumSkillUps" },
{ true, FT_SHORT, "UniqueBit" },
{ true, FT_SHORT, "TradeSkillCategoryID" },
- { true, FT_BYTE, "NumSkillUps" },
- { true, FT_INT, "ClassMask" },
- { true, FT_SHORT, "MinSkillLineRank" },
- { true, FT_BYTE, "AcquireMethod" },
- { true, FT_BYTE, "Flags" },
+ { true, FT_SHORT, "SkillupSkillLineID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SkillLineAbilityMeta::Instance(), HOTFIX_SEL_SKILL_LINE_ABILITY);
return &loadInfo;
@@ -4063,11 +4130,11 @@ struct SkillRaceClassInfoLoadInfo
{ false, FT_INT, "ID" },
{ true, FT_LONG, "RaceMask" },
{ true, FT_SHORT, "SkillID" },
+ { true, FT_INT, "ClassMask" },
{ false, FT_SHORT, "Flags" },
- { true, FT_SHORT, "SkillTierID" },
{ true, FT_BYTE, "Availability" },
{ true, FT_BYTE, "MinLevel" },
- { true, FT_INT, "ClassMask" },
+ { true, FT_SHORT, "SkillTierID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SkillRaceClassInfoMeta::Instance(), HOTFIX_SEL_SKILL_RACE_CLASS_INFO);
return &loadInfo;
@@ -4081,18 +4148,18 @@ struct SoundKitLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_BYTE, "SoundType" },
{ false, FT_FLOAT, "VolumeFloat" },
+ { false, FT_SHORT, "Flags" },
{ false, FT_FLOAT, "MinDistance" },
{ false, FT_FLOAT, "DistanceCutoff" },
- { false, FT_SHORT, "Flags" },
- { false, FT_SHORT, "SoundEntriesAdvancedID" },
- { false, FT_BYTE, "SoundType" },
- { false, FT_BYTE, "DialogType" },
{ false, FT_BYTE, "EAXDef" },
+ { false, FT_INT, "SoundKitAdvancedID" },
{ false, FT_FLOAT, "VolumeVariationPlus" },
{ false, FT_FLOAT, "VolumeVariationMinus" },
{ false, FT_FLOAT, "PitchVariationPlus" },
{ false, FT_FLOAT, "PitchVariationMinus" },
+ { true, FT_BYTE, "DialogType" },
{ false, FT_FLOAT, "PitchAdjust" },
{ false, FT_SHORT, "BusOverwriteID" },
{ false, FT_BYTE, "MaxInstances" },
@@ -4109,34 +4176,17 @@ struct SpecializationSpellsLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_STRING, "Description" },
+ { false, FT_INT, "ID" },
+ { false, FT_SHORT, "SpecID" },
{ true, FT_INT, "SpellID" },
{ true, FT_INT, "OverridesSpellID" },
- { false, FT_SHORT, "SpecID" },
{ false, FT_BYTE, "DisplayOrder" },
- { false, FT_INT, "ID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpecializationSpellsMeta::Instance(), HOTFIX_SEL_SPECIALIZATION_SPELLS);
return &loadInfo;
}
};
-struct SpellLoadInfo
-{
- static DB2LoadInfo const* Instance()
- {
- static DB2FieldMeta const fields[] =
- {
- { false, FT_INT, "ID" },
- { false, FT_STRING, "Name" },
- { false, FT_STRING, "NameSubtext" },
- { false, FT_STRING, "Description" },
- { false, FT_STRING, "AuraDescription" },
- };
- static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellMeta::Instance(), HOTFIX_SEL_SPELL);
- return &loadInfo;
- }
-};
-
struct SpellAuraOptionsLoadInfo
{
static DB2LoadInfo const* Instance()
@@ -4144,13 +4194,14 @@ struct SpellAuraOptionsLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { true, FT_INT, "ProcCharges" },
- { true, FT_INT, "ProcTypeMask" },
- { true, FT_INT, "ProcCategoryRecovery" },
- { false, FT_SHORT, "CumulativeAura" },
- { false, FT_SHORT, "SpellProcsPerMinuteID" },
{ false, FT_BYTE, "DifficultyID" },
+ { false, FT_SHORT, "CumulativeAura" },
+ { true, FT_INT, "ProcCategoryRecovery" },
{ false, FT_BYTE, "ProcChance" },
+ { true, FT_INT, "ProcCharges" },
+ { false, FT_SHORT, "SpellProcsPerMinuteID" },
+ { true, FT_INT, "ProcTypeMask1" },
+ { true, FT_INT, "ProcTypeMask2" },
{ true, FT_INT, "SpellID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellAuraOptionsMeta::Instance(), HOTFIX_SEL_SPELL_AURA_OPTIONS);
@@ -4165,15 +4216,15 @@ struct SpellAuraRestrictionsLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { true, FT_INT, "CasterAuraSpell" },
- { true, FT_INT, "TargetAuraSpell" },
- { true, FT_INT, "ExcludeCasterAuraSpell" },
- { true, FT_INT, "ExcludeTargetAuraSpell" },
{ false, FT_BYTE, "DifficultyID" },
{ false, FT_BYTE, "CasterAuraState" },
{ false, FT_BYTE, "TargetAuraState" },
{ false, FT_BYTE, "ExcludeCasterAuraState" },
{ false, FT_BYTE, "ExcludeTargetAuraState" },
+ { true, FT_INT, "CasterAuraSpell" },
+ { true, FT_INT, "TargetAuraSpell" },
+ { true, FT_INT, "ExcludeCasterAuraSpell" },
+ { true, FT_INT, "ExcludeTargetAuraSpell" },
{ true, FT_INT, "SpellID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellAuraRestrictionsMeta::Instance(), HOTFIX_SEL_SPELL_AURA_RESTRICTIONS);
@@ -4189,8 +4240,8 @@ struct SpellCastTimesLoadInfo
{
{ false, FT_INT, "ID" },
{ true, FT_INT, "Base" },
- { true, FT_INT, "Minimum" },
{ true, FT_SHORT, "PerLevel" },
+ { true, FT_INT, "Minimum" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellCastTimesMeta::Instance(), HOTFIX_SEL_SPELL_CAST_TIMES);
return &loadInfo;
@@ -4205,12 +4256,12 @@ struct SpellCastingRequirementsLoadInfo
{
{ false, FT_INT, "ID" },
{ true, FT_INT, "SpellID" },
- { false, FT_SHORT, "MinFactionID" },
- { false, FT_SHORT, "RequiredAreasID" },
- { false, FT_SHORT, "RequiresSpellFocus" },
{ false, FT_BYTE, "FacingCasterFlags" },
+ { false, FT_SHORT, "MinFactionID" },
{ true, FT_BYTE, "MinReputation" },
+ { false, FT_SHORT, "RequiredAreasID" },
{ false, FT_BYTE, "RequiredAuraVision" },
+ { false, FT_SHORT, "RequiresSpellFocus" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellCastingRequirementsMeta::Instance(), HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS);
return &loadInfo;
@@ -4224,14 +4275,14 @@ struct SpellCategoriesLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { true, FT_SHORT, "Category" },
- { true, FT_SHORT, "StartRecoveryCategory" },
- { true, FT_SHORT, "ChargeCategory" },
{ false, FT_BYTE, "DifficultyID" },
+ { true, FT_SHORT, "Category" },
{ true, FT_BYTE, "DefenseType" },
{ true, FT_BYTE, "DispelType" },
{ true, FT_BYTE, "Mechanic" },
{ true, FT_BYTE, "PreventionType" },
+ { true, FT_SHORT, "StartRecoveryCategory" },
+ { true, FT_SHORT, "ChargeCategory" },
{ true, FT_INT, "SpellID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellCategoriesMeta::Instance(), HOTFIX_SEL_SPELL_CATEGORIES);
@@ -4247,10 +4298,10 @@ struct SpellCategoryLoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Name" },
- { true, FT_INT, "ChargeRecoveryTime" },
{ true, FT_BYTE, "Flags" },
{ false, FT_BYTE, "UsesPerWeek" },
{ true, FT_BYTE, "MaxCharges" },
+ { true, FT_INT, "ChargeRecoveryTime" },
{ true, FT_INT, "TypeMask" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellCategoryMeta::Instance(), HOTFIX_SEL_SPELL_CATEGORY);
@@ -4266,12 +4317,12 @@ struct SpellClassOptionsLoadInfo
{
{ false, FT_INT, "ID" },
{ true, 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" },
+ { false, FT_BYTE, "SpellClassSet" },
+ { true, FT_INT, "SpellClassMask1" },
+ { true, FT_INT, "SpellClassMask2" },
+ { true, FT_INT, "SpellClassMask3" },
+ { true, FT_INT, "SpellClassMask4" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellClassOptionsMeta::Instance(), HOTFIX_SEL_SPELL_CLASS_OPTIONS);
return &loadInfo;
@@ -4285,10 +4336,10 @@ struct SpellCooldownsLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_BYTE, "DifficultyID" },
{ true, FT_INT, "CategoryRecoveryTime" },
{ true, FT_INT, "RecoveryTime" },
{ true, FT_INT, "StartRecoveryTime" },
- { false, FT_BYTE, "DifficultyID" },
{ true, FT_INT, "SpellID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellCooldownsMeta::Instance(), HOTFIX_SEL_SPELL_COOLDOWNS);
@@ -4304,8 +4355,8 @@ struct SpellDurationLoadInfo
{
{ false, FT_INT, "ID" },
{ true, FT_INT, "Duration" },
- { true, FT_INT, "MaxDuration" },
{ false, FT_INT, "DurationPerLevel" },
+ { true, FT_INT, "MaxDuration" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellDurationMeta::Instance(), HOTFIX_SEL_SPELL_DURATION);
return &loadInfo;
@@ -4319,40 +4370,39 @@ struct SpellEffectLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_INT, "Effect" },
- { true, FT_INT, "EffectBasePoints" },
- { true, FT_INT, "EffectIndex" },
- { true, FT_INT, "EffectAura" },
{ true, FT_INT, "DifficultyID" },
+ { true, FT_INT, "EffectIndex" },
+ { false, FT_INT, "Effect" },
{ false, FT_FLOAT, "EffectAmplitude" },
+ { true, FT_INT, "EffectAttributes" },
+ { true, FT_SHORT, "EffectAura" },
{ true, FT_INT, "EffectAuraPeriod" },
{ false, FT_FLOAT, "EffectBonusCoefficient" },
{ false, FT_FLOAT, "EffectChainAmplitude" },
{ true, FT_INT, "EffectChainTargets" },
- { true, FT_INT, "EffectDieSides" },
{ true, FT_INT, "EffectItemType" },
{ true, FT_INT, "EffectMechanic" },
{ false, FT_FLOAT, "EffectPointsPerResource" },
+ { false, FT_FLOAT, "EffectPosFacing" },
{ false, FT_FLOAT, "EffectRealPointsPerLevel" },
{ true, FT_INT, "EffectTriggerSpell" },
- { false, FT_FLOAT, "EffectPosFacing" },
- { true, FT_INT, "EffectAttributes" },
{ false, FT_FLOAT, "BonusCoefficientFromAP" },
{ false, FT_FLOAT, "PvpMultiplier" },
{ false, FT_FLOAT, "Coefficient" },
{ false, FT_FLOAT, "Variance" },
{ false, FT_FLOAT, "ResourceCoefficient" },
{ false, FT_FLOAT, "GroupSizeBasePointsCoefficient" },
- { false, FT_INT, "EffectSpellClassMask1" },
- { false, FT_INT, "EffectSpellClassMask2" },
- { false, FT_INT, "EffectSpellClassMask3" },
- { false, FT_INT, "EffectSpellClassMask4" },
+ { false, FT_FLOAT, "EffectBasePoints" },
{ true, FT_INT, "EffectMiscValue1" },
{ true, FT_INT, "EffectMiscValue2" },
{ false, FT_INT, "EffectRadiusIndex1" },
{ false, FT_INT, "EffectRadiusIndex2" },
- { false, FT_INT, "ImplicitTarget1" },
- { false, FT_INT, "ImplicitTarget2" },
+ { true, FT_INT, "EffectSpellClassMask1" },
+ { true, FT_INT, "EffectSpellClassMask2" },
+ { true, FT_INT, "EffectSpellClassMask3" },
+ { true, FT_INT, "EffectSpellClassMask4" },
+ { true, FT_SHORT, "ImplicitTarget1" },
+ { true, FT_SHORT, "ImplicitTarget2" },
{ true, FT_INT, "SpellID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellEffectMeta::Instance(), HOTFIX_SEL_SPELL_EFFECT);
@@ -4368,9 +4418,9 @@ struct SpellEquippedItemsLoadInfo
{
{ false, FT_INT, "ID" },
{ true, FT_INT, "SpellID" },
+ { true, FT_BYTE, "EquippedItemClass" },
{ true, FT_INT, "EquippedItemInvTypes" },
{ true, FT_INT, "EquippedItemSubclass" },
- { true, FT_BYTE, "EquippedItemClass" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellEquippedItemsMeta::Instance(), HOTFIX_SEL_SPELL_EQUIPPED_ITEMS);
return &loadInfo;
@@ -4419,6 +4469,7 @@ struct SpellItemEnchantmentLoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Name" },
+ { false, FT_STRING, "HordeName" },
{ false, FT_INT, "EffectArg1" },
{ false, FT_INT, "EffectArg2" },
{ false, FT_INT, "EffectArg3" },
@@ -4427,6 +4478,7 @@ struct SpellItemEnchantmentLoadInfo
{ false, FT_FLOAT, "EffectScalingPoints3" },
{ false, FT_INT, "TransmogCost" },
{ false, FT_INT, "IconFileDataID" },
+ { false, FT_INT, "TransmogPlayerConditionID" },
{ true, FT_SHORT, "EffectPointsMin1" },
{ true, FT_SHORT, "EffectPointsMin2" },
{ true, FT_SHORT, "EffectPointsMin3" },
@@ -4439,12 +4491,11 @@ struct SpellItemEnchantmentLoadInfo
{ false, FT_BYTE, "Effect1" },
{ false, FT_BYTE, "Effect2" },
{ false, FT_BYTE, "Effect3" },
+ { true, FT_BYTE, "ScalingClass" },
+ { true, FT_BYTE, "ScalingClassRestricted" },
{ false, FT_BYTE, "ConditionID" },
{ false, FT_BYTE, "MinLevel" },
{ false, FT_BYTE, "MaxLevel" },
- { true, FT_BYTE, "ScalingClass" },
- { true, FT_BYTE, "ScalingClassRestricted" },
- { false, FT_INT, "TransmogPlayerConditionID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellItemEnchantmentMeta::Instance(), HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT);
return &loadInfo;
@@ -4458,16 +4509,16 @@ struct SpellItemEnchantmentConditionLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_INT, "LtOperand1" },
- { false, FT_INT, "LtOperand2" },
- { false, FT_INT, "LtOperand3" },
- { false, FT_INT, "LtOperand4" },
- { false, FT_INT, "LtOperand5" },
{ false, FT_BYTE, "LtOperandType1" },
{ false, FT_BYTE, "LtOperandType2" },
{ false, FT_BYTE, "LtOperandType3" },
{ false, FT_BYTE, "LtOperandType4" },
{ false, FT_BYTE, "LtOperandType5" },
+ { false, FT_INT, "LtOperand1" },
+ { false, FT_INT, "LtOperand2" },
+ { false, FT_INT, "LtOperand3" },
+ { false, FT_INT, "LtOperand4" },
+ { false, FT_INT, "LtOperand5" },
{ false, FT_BYTE, "Operator1" },
{ false, FT_BYTE, "Operator2" },
{ false, FT_BYTE, "Operator3" },
@@ -4517,10 +4568,10 @@ struct SpellLevelsLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_BYTE, "DifficultyID" },
{ true, FT_SHORT, "BaseLevel" },
{ true, FT_SHORT, "MaxLevel" },
{ true, FT_SHORT, "SpellLevel" },
- { false, FT_BYTE, "DifficultyID" },
{ false, FT_BYTE, "MaxPassiveAuraLevel" },
{ true, FT_INT, "SpellID" },
};
@@ -4536,15 +4587,16 @@ struct SpellMiscLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_BYTE, "DifficultyID" },
{ false, FT_SHORT, "CastingTimeIndex" },
{ false, FT_SHORT, "DurationIndex" },
{ false, FT_SHORT, "RangeIndex" },
{ false, FT_BYTE, "SchoolMask" },
- { true, FT_INT, "SpellIconFileDataID" },
{ false, FT_FLOAT, "Speed" },
- { true, FT_INT, "ActiveIconFileDataID" },
{ false, FT_FLOAT, "LaunchDelay" },
- { false, FT_BYTE, "DifficultyID" },
+ { false, FT_FLOAT, "MinDuration" },
+ { true, FT_INT, "SpellIconFileDataID" },
+ { true, FT_INT, "ActiveIconFileDataID" },
{ true, FT_INT, "Attributes1" },
{ true, FT_INT, "Attributes2" },
{ true, FT_INT, "Attributes3" },
@@ -4566,25 +4618,39 @@ struct SpellMiscLoadInfo
}
};
+struct SpellNameLoadInfo
+{
+ static DB2LoadInfo const* Instance()
+ {
+ static DB2FieldMeta const fields[] =
+ {
+ { false, FT_INT, "ID" },
+ { false, FT_STRING, "Name" },
+ };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellNameMeta::Instance(), HOTFIX_SEL_SPELL_NAME);
+ return &loadInfo;
+ }
+};
+
struct SpellPowerLoadInfo
{
static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
- { true, FT_INT, "ManaCost" },
- { false, FT_FLOAT, "PowerCostPct" },
- { false, FT_FLOAT, "PowerPctPerSecond" },
- { true, FT_INT, "RequiredAuraSpellID" },
- { false, FT_FLOAT, "PowerCostMaxPct" },
- { false, FT_BYTE, "OrderIndex" },
- { true, FT_BYTE, "PowerType" },
{ false, FT_INT, "ID" },
+ { false, FT_BYTE, "OrderIndex" },
+ { true, FT_INT, "ManaCost" },
{ true, FT_INT, "ManaCostPerLevel" },
{ true, FT_INT, "ManaPerSecond" },
- { false, FT_INT, "OptionalCost" },
{ false, FT_INT, "PowerDisplayID" },
{ true, FT_INT, "AltPowerBarID" },
+ { false, FT_FLOAT, "PowerCostPct" },
+ { false, FT_FLOAT, "PowerCostMaxPct" },
+ { false, FT_FLOAT, "PowerPctPerSecond" },
+ { true, FT_BYTE, "PowerType" },
+ { true, FT_INT, "RequiredAuraSpellID" },
+ { false, FT_INT, "OptionalCost" },
{ true, FT_INT, "SpellID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellPowerMeta::Instance(), HOTFIX_SEL_SPELL_POWER);
@@ -4598,9 +4664,9 @@ struct SpellPowerDifficultyLoadInfo
{
static DB2FieldMeta const fields[] =
{
+ { false, FT_INT, "ID" },
{ false, FT_BYTE, "DifficultyID" },
{ false, FT_BYTE, "OrderIndex" },
- { false, FT_INT, "ID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellPowerDifficultyMeta::Instance(), HOTFIX_SEL_SPELL_POWER_DIFFICULTY);
return &loadInfo;
@@ -4629,9 +4695,9 @@ struct SpellProcsPerMinuteModLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_FLOAT, "Coeff" },
- { true, FT_SHORT, "Param" },
{ false, FT_BYTE, "Type" },
+ { true, FT_SHORT, "Param" },
+ { false, FT_FLOAT, "Coeff" },
{ false, FT_SHORT, "SpellProcsPerMinuteID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellProcsPerMinuteModMeta::Instance(), HOTFIX_SEL_SPELL_PROCS_PER_MINUTE_MOD);
@@ -4665,11 +4731,11 @@ struct SpellRangeLoadInfo
{ false, FT_INT, "ID" },
{ false, FT_STRING, "DisplayName" },
{ false, FT_STRING, "DisplayNameShort" },
+ { false, FT_BYTE, "Flags" },
{ false, FT_FLOAT, "RangeMin1" },
{ false, FT_FLOAT, "RangeMin2" },
{ false, FT_FLOAT, "RangeMax1" },
{ false, FT_FLOAT, "RangeMax2" },
- { false, FT_BYTE, "Flags" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellRangeMeta::Instance(), HOTFIX_SEL_SPELL_RANGE);
return &loadInfo;
@@ -4714,10 +4780,10 @@ struct SpellScalingLoadInfo
{
{ false, FT_INT, "ID" },
{ true, FT_INT, "SpellID" },
- { true, FT_SHORT, "ScalesFromItemLevel" },
{ true, FT_INT, "Class" },
{ false, FT_INT, "MinScalingLevel" },
{ false, FT_INT, "MaxScalingLevel" },
+ { true, FT_SHORT, "ScalesFromItemLevel" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellScalingMeta::Instance(), HOTFIX_SEL_SPELL_SCALING);
return &loadInfo;
@@ -4732,11 +4798,11 @@ struct SpellShapeshiftLoadInfo
{
{ false, FT_INT, "ID" },
{ true, FT_INT, "SpellID" },
+ { true, FT_BYTE, "StanceBarOrder" },
{ true, FT_INT, "ShapeshiftExclude1" },
{ true, FT_INT, "ShapeshiftExclude2" },
{ true, FT_INT, "ShapeshiftMask1" },
{ true, FT_INT, "ShapeshiftMask2" },
- { true, FT_BYTE, "StanceBarOrder" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellShapeshiftMeta::Instance(), HOTFIX_SEL_SPELL_SHAPESHIFT);
return &loadInfo;
@@ -4751,13 +4817,13 @@ struct SpellShapeshiftFormLoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Name" },
- { false, FT_FLOAT, "DamageVariance" },
+ { true, FT_BYTE, "CreatureType" },
{ true, FT_INT, "Flags" },
+ { true, FT_INT, "AttackIconFileID" },
+ { true, FT_BYTE, "BonusActionBar" },
{ true, FT_SHORT, "CombatRoundTime" },
+ { false, FT_FLOAT, "DamageVariance" },
{ false, FT_SHORT, "MountTypeID" },
- { true, FT_BYTE, "CreatureType" },
- { true, FT_BYTE, "BonusActionBar" },
- { true, FT_INT, "AttackIconFileID" },
{ false, FT_INT, "CreatureDisplayID1" },
{ false, FT_INT, "CreatureDisplayID2" },
{ false, FT_INT, "CreatureDisplayID3" },
@@ -4783,13 +4849,13 @@ struct SpellTargetRestrictionsLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_FLOAT, "ConeDegrees" },
- { false, FT_FLOAT, "Width" },
- { true, FT_INT, "Targets" },
- { true, FT_SHORT, "TargetCreatureType" },
{ false, FT_BYTE, "DifficultyID" },
+ { false, FT_FLOAT, "ConeDegrees" },
{ false, FT_BYTE, "MaxTargets" },
{ false, FT_INT, "MaxTargetLevel" },
+ { true, FT_SHORT, "TargetCreatureType" },
+ { true, FT_INT, "Targets" },
+ { false, FT_FLOAT, "Width" },
{ true, FT_INT, "SpellID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellTargetRestrictionsMeta::Instance(), HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS);
@@ -4805,10 +4871,10 @@ struct SpellTotemsLoadInfo
{
{ false, FT_INT, "ID" },
{ true, FT_INT, "SpellID" },
- { true, FT_INT, "Totem1" },
- { true, FT_INT, "Totem2" },
{ false, FT_SHORT, "RequiredTotemCategoryID1" },
{ false, FT_SHORT, "RequiredTotemCategoryID2" },
+ { true, FT_INT, "Totem1" },
+ { true, FT_INT, "Totem2" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellTotemsMeta::Instance(), HOTFIX_SEL_SPELL_TOTEMS);
return &loadInfo;
@@ -4821,18 +4887,18 @@ struct SpellXSpellVisualLoadInfo
{
static DB2FieldMeta const fields[] =
{
- { false, FT_INT, "SpellVisualID" },
{ false, FT_INT, "ID" },
+ { false, FT_BYTE, "DifficultyID" },
+ { false, FT_INT, "SpellVisualID" },
{ false, FT_FLOAT, "Probability" },
- { false, FT_SHORT, "CasterPlayerConditionID" },
- { false, FT_SHORT, "CasterUnitConditionID" },
- { false, FT_SHORT, "ViewerPlayerConditionID" },
- { false, FT_SHORT, "ViewerUnitConditionID" },
- { true, FT_INT, "SpellIconFileID" },
- { true, FT_INT, "ActiveIconFileID" },
{ false, FT_BYTE, "Flags" },
- { false, FT_BYTE, "DifficultyID" },
{ false, FT_BYTE, "Priority" },
+ { true, FT_INT, "SpellIconFileID" },
+ { true, FT_INT, "ActiveIconFileID" },
+ { false, FT_SHORT, "ViewerUnitConditionID" },
+ { false, FT_INT, "ViewerPlayerConditionID" },
+ { false, FT_SHORT, "CasterUnitConditionID" },
+ { false, FT_INT, "CasterPlayerConditionID" },
{ true, FT_INT, "SpellID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SpellXSpellVisualMeta::Instance(), HOTFIX_SEL_SPELL_X_SPELL_VISUAL);
@@ -4847,11 +4913,11 @@ struct SummonPropertiesLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { true, FT_INT, "Flags" },
{ true, FT_INT, "Control" },
{ true, FT_INT, "Faction" },
{ true, FT_INT, "Title" },
{ true, FT_INT, "Slot" },
+ { true, FT_INT, "Flags" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, SummonPropertiesMeta::Instance(), HOTFIX_SEL_SUMMON_PROPERTIES);
return &loadInfo;
@@ -4895,15 +4961,15 @@ struct TalentLoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Description" },
- { false, FT_INT, "SpellID" },
- { false, FT_INT, "OverridesSpellID" },
- { false, FT_SHORT, "SpecID" },
{ false, FT_BYTE, "TierID" },
- { false, FT_BYTE, "ColumnIndex" },
{ false, FT_BYTE, "Flags" },
+ { false, FT_BYTE, "ColumnIndex" },
+ { false, FT_BYTE, "ClassID" },
+ { false, FT_SHORT, "SpecID" },
+ { false, FT_INT, "SpellID" },
+ { false, FT_INT, "OverridesSpellID" },
{ false, FT_BYTE, "CategoryMask1" },
{ false, FT_BYTE, "CategoryMask2" },
- { false, FT_BYTE, "ClassID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TalentMeta::Instance(), HOTFIX_SEL_TALENT);
return &loadInfo;
@@ -4916,24 +4982,25 @@ struct TaxiNodesLoadInfo
{
static DB2FieldMeta const fields[] =
{
- { false, FT_INT, "ID" },
{ false, FT_STRING, "Name" },
{ false, FT_FLOAT, "PosX" },
{ false, FT_FLOAT, "PosY" },
{ false, FT_FLOAT, "PosZ" },
- { true, FT_INT, "MountCreatureID1" },
- { true, FT_INT, "MountCreatureID2" },
{ false, FT_FLOAT, "MapOffsetX" },
{ false, FT_FLOAT, "MapOffsetY" },
- { false, FT_FLOAT, "Facing" },
{ false, FT_FLOAT, "FlightMapOffsetX" },
{ false, FT_FLOAT, "FlightMapOffsetY" },
+ { false, FT_INT, "ID" },
{ false, FT_SHORT, "ContinentID" },
{ false, FT_SHORT, "ConditionID" },
{ false, FT_SHORT, "CharacterBitNumber" },
{ false, FT_BYTE, "Flags" },
{ true, FT_INT, "UiTextureKitID" },
+ { false, FT_FLOAT, "Facing" },
{ false, FT_INT, "SpecialIconConditionID" },
+ { false, FT_INT, "VisibilityConditionID" },
+ { true, FT_INT, "MountCreatureID1" },
+ { true, FT_INT, "MountCreatureID2" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TaxiNodesMeta::Instance(), HOTFIX_SEL_TAXI_NODES);
return &loadInfo;
@@ -4946,9 +5013,9 @@ struct TaxiPathLoadInfo
{
static DB2FieldMeta const fields[] =
{
+ { false, FT_INT, "ID" },
{ false, FT_SHORT, "FromTaxiNode" },
{ false, FT_SHORT, "ToTaxiNode" },
- { false, FT_INT, "ID" },
{ false, FT_INT, "Cost" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TaxiPathMeta::Instance(), HOTFIX_SEL_TAXI_PATH);
@@ -4965,10 +5032,10 @@ struct TaxiPathNodeLoadInfo
{ false, FT_FLOAT, "LocX" },
{ false, FT_FLOAT, "LocY" },
{ false, FT_FLOAT, "LocZ" },
+ { false, FT_INT, "ID" },
{ false, FT_SHORT, "PathID" },
+ { true, FT_INT, "NodeIndex" },
{ false, FT_SHORT, "ContinentID" },
- { false, FT_BYTE, "NodeIndex" },
- { false, FT_INT, "ID" },
{ false, FT_BYTE, "Flags" },
{ false, FT_INT, "Delay" },
{ false, FT_SHORT, "ArrivalEventID" },
@@ -4987,8 +5054,8 @@ struct TotemCategoryLoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Name" },
- { true, FT_INT, "TotemCategoryMask" },
{ false, FT_BYTE, "TotemCategoryType" },
+ { true, FT_INT, "TotemCategoryMask" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TotemCategoryMeta::Instance(), HOTFIX_SEL_TOTEM_CATEGORY);
return &loadInfo;
@@ -5002,10 +5069,10 @@ struct ToyLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_STRING, "SourceText" },
+ { false, FT_INT, "ID" },
{ true, FT_INT, "ItemID" },
{ false, FT_BYTE, "Flags" },
{ true, FT_BYTE, "SourceTypeEnum" },
- { false, FT_INT, "ID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ToyMeta::Instance(), HOTFIX_SEL_TOY);
return &loadInfo;
@@ -5033,15 +5100,15 @@ struct TransmogSetLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_STRING, "Name" },
- { false, FT_SHORT, "ParentTransmogSetID" },
- { true, FT_SHORT, "UiOrder" },
- { false, FT_BYTE, "ExpansionID" },
{ false, FT_INT, "ID" },
- { true, FT_INT, "Flags" },
- { false, FT_INT, "TrackingQuestID" },
{ true, FT_INT, "ClassMask" },
- { true, FT_INT, "ItemNameDescriptionID" },
+ { false, FT_INT, "TrackingQuestID" },
+ { true, FT_INT, "Flags" },
{ false, FT_INT, "TransmogSetGroupID" },
+ { true, FT_INT, "ItemNameDescriptionID" },
+ { false, FT_SHORT, "ParentTransmogSetID" },
+ { false, FT_BYTE, "ExpansionID" },
+ { true, FT_SHORT, "UiOrder" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TransmogSetMeta::Instance(), HOTFIX_SEL_TRANSMOG_SET);
return &loadInfo;
@@ -5085,11 +5152,11 @@ struct TransportAnimationLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_INT, "TimeIndex" },
{ false, FT_FLOAT, "PosX" },
{ false, FT_FLOAT, "PosY" },
{ false, FT_FLOAT, "PosZ" },
{ false, FT_BYTE, "SequenceID" },
+ { false, FT_INT, "TimeIndex" },
{ true, FT_INT, "TransportID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TransportAnimationMeta::Instance(), HOTFIX_SEL_TRANSPORT_ANIMATION);
@@ -5104,11 +5171,11 @@ struct TransportRotationLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_INT, "TimeIndex" },
{ false, FT_FLOAT, "Rot1" },
{ false, FT_FLOAT, "Rot2" },
{ false, FT_FLOAT, "Rot3" },
{ false, FT_FLOAT, "Rot4" },
+ { false, FT_INT, "TimeIndex" },
{ true, FT_INT, "GameObjectsID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, TransportRotationMeta::Instance(), HOTFIX_SEL_TRANSPORT_ROTATION);
@@ -5116,6 +5183,96 @@ struct TransportRotationLoadInfo
}
};
+struct UiMapLoadInfo
+{
+ static DB2LoadInfo const* Instance()
+ {
+ static DB2FieldMeta const fields[] =
+ {
+ { false, FT_STRING, "Name" },
+ { false, FT_INT, "ID" },
+ { true, FT_INT, "ParentUiMapID" },
+ { true, FT_INT, "Flags" },
+ { true, FT_INT, "System" },
+ { true, FT_INT, "Type" },
+ { false, FT_INT, "LevelRangeMin" },
+ { false, FT_INT, "LevelRangeMax" },
+ { true, FT_INT, "BountySetID" },
+ { false, FT_INT, "BountyDisplayLocation" },
+ { true, FT_INT, "VisibilityPlayerConditionID" },
+ { true, FT_BYTE, "HelpTextPosition" },
+ { true, FT_INT, "BkgAtlasID" },
+ };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, UiMapMeta::Instance(), HOTFIX_SEL_UI_MAP);
+ return &loadInfo;
+ }
+};
+
+struct UiMapAssignmentLoadInfo
+{
+ static DB2LoadInfo const* Instance()
+ {
+ static DB2FieldMeta const fields[] =
+ {
+ { false, FT_FLOAT, "UiMinX" },
+ { false, FT_FLOAT, "UiMinY" },
+ { false, FT_FLOAT, "UiMaxX" },
+ { false, FT_FLOAT, "UiMaxY" },
+ { false, FT_FLOAT, "Region1X" },
+ { false, FT_FLOAT, "Region1Y" },
+ { false, FT_FLOAT, "Region1Z" },
+ { false, FT_FLOAT, "Region2X" },
+ { false, FT_FLOAT, "Region2Y" },
+ { false, FT_FLOAT, "Region2Z" },
+ { false, FT_INT, "ID" },
+ { true, FT_INT, "UiMapID" },
+ { true, FT_INT, "OrderIndex" },
+ { true, FT_INT, "MapID" },
+ { true, FT_INT, "AreaID" },
+ { true, FT_INT, "WmoDoodadPlacementID" },
+ { true, FT_INT, "WmoGroupID" },
+ };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, UiMapAssignmentMeta::Instance(), HOTFIX_SEL_UI_MAP_ASSIGNMENT);
+ return &loadInfo;
+ }
+};
+
+struct UiMapLinkLoadInfo
+{
+ static DB2LoadInfo const* Instance()
+ {
+ static DB2FieldMeta const fields[] =
+ {
+ { false, FT_FLOAT, "UiMinX" },
+ { false, FT_FLOAT, "UiMinY" },
+ { false, FT_FLOAT, "UiMaxX" },
+ { false, FT_FLOAT, "UiMaxY" },
+ { false, FT_INT, "ID" },
+ { true, FT_INT, "ParentUiMapID" },
+ { true, FT_INT, "OrderIndex" },
+ { true, FT_INT, "ChildUiMapID" },
+ };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, UiMapLinkMeta::Instance(), HOTFIX_SEL_UI_MAP_LINK);
+ return &loadInfo;
+ }
+};
+
+struct UiMapXMapArtLoadInfo
+{
+ static DB2LoadInfo const* Instance()
+ {
+ static DB2FieldMeta const fields[] =
+ {
+ { false, FT_INT, "ID" },
+ { true, FT_INT, "PhaseID" },
+ { true, FT_INT, "UiMapArtID" },
+ { true, FT_INT, "UiMapID" },
+ };
+ static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, UiMapXMapArtMeta::Instance(), HOTFIX_SEL_UI_MAP_X_MAP_ART);
+ return &loadInfo;
+ }
+};
+
struct UnitPowerBarLoadInfo
{
static DB2LoadInfo const* Instance()
@@ -5127,8 +5284,16 @@ struct UnitPowerBarLoadInfo
{ false, FT_STRING, "Cost" },
{ false, FT_STRING, "OutOfError" },
{ false, FT_STRING, "ToolTip" },
+ { false, FT_INT, "MinPower" },
+ { false, FT_INT, "MaxPower" },
+ { false, FT_SHORT, "StartPower" },
+ { false, FT_BYTE, "CenterPower" },
{ false, FT_FLOAT, "RegenerationPeace" },
{ false, FT_FLOAT, "RegenerationCombat" },
+ { false, FT_BYTE, "BarType" },
+ { false, FT_SHORT, "Flags" },
+ { false, FT_FLOAT, "StartInset" },
+ { false, FT_FLOAT, "EndInset" },
{ true, FT_INT, "FileDataID1" },
{ true, FT_INT, "FileDataID2" },
{ true, FT_INT, "FileDataID3" },
@@ -5141,14 +5306,6 @@ struct UnitPowerBarLoadInfo
{ true, FT_INT, "Color4" },
{ true, FT_INT, "Color5" },
{ true, FT_INT, "Color6" },
- { 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" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, UnitPowerBarMeta::Instance(), HOTFIX_SEL_UNIT_POWER_BAR);
return &loadInfo;
@@ -5163,6 +5320,7 @@ struct VehicleLoadInfo
{
{ false, FT_INT, "ID" },
{ true, FT_INT, "Flags" },
+ { false, FT_BYTE, "FlagsB" },
{ false, FT_FLOAT, "TurnSpeed" },
{ false, FT_FLOAT, "PitchSpeed" },
{ false, FT_FLOAT, "PitchMin" },
@@ -5174,6 +5332,9 @@ struct VehicleLoadInfo
{ false, FT_FLOAT, "FacingLimitRight" },
{ false, FT_FLOAT, "FacingLimitLeft" },
{ false, FT_FLOAT, "CameraYawOffset" },
+ { false, FT_BYTE, "UiLocomotionType" },
+ { false, FT_SHORT, "VehicleUIIndicatorID" },
+ { true, FT_INT, "MissileTargetingID" },
{ false, FT_SHORT, "SeatID1" },
{ false, FT_SHORT, "SeatID2" },
{ false, FT_SHORT, "SeatID3" },
@@ -5182,13 +5343,9 @@ struct VehicleLoadInfo
{ 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" },
- { true, FT_INT, "MissileTargetingID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, VehicleMeta::Instance(), HOTFIX_SEL_VEHICLE);
return &loadInfo;
@@ -5202,12 +5359,16 @@ struct VehicleSeatLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { true, FT_INT, "Flags" },
- { true, FT_INT, "FlagsB" },
- { true, FT_INT, "FlagsC" },
{ false, FT_FLOAT, "AttachmentOffsetX" },
{ false, FT_FLOAT, "AttachmentOffsetY" },
{ false, FT_FLOAT, "AttachmentOffsetZ" },
+ { false, FT_FLOAT, "CameraOffsetX" },
+ { false, FT_FLOAT, "CameraOffsetY" },
+ { false, FT_FLOAT, "CameraOffsetZ" },
+ { true, FT_INT, "Flags" },
+ { true, FT_INT, "FlagsB" },
+ { true, FT_INT, "FlagsC" },
+ { true, FT_BYTE, "AttachmentID" },
{ false, FT_FLOAT, "EnterPreDelay" },
{ false, FT_FLOAT, "EnterSpeed" },
{ false, FT_FLOAT, "EnterGravity" },
@@ -5215,6 +5376,12 @@ struct VehicleSeatLoadInfo
{ false, FT_FLOAT, "EnterMaxDuration" },
{ false, FT_FLOAT, "EnterMinArcHeight" },
{ false, FT_FLOAT, "EnterMaxArcHeight" },
+ { true, FT_INT, "EnterAnimStart" },
+ { true, FT_INT, "EnterAnimLoop" },
+ { true, FT_INT, "RideAnimStart" },
+ { true, FT_INT, "RideAnimLoop" },
+ { true, FT_INT, "RideUpperAnimStart" },
+ { true, FT_INT, "RideUpperAnimLoop" },
{ false, FT_FLOAT, "ExitPreDelay" },
{ false, FT_FLOAT, "ExitSpeed" },
{ false, FT_FLOAT, "ExitGravity" },
@@ -5222,36 +5389,34 @@ struct VehicleSeatLoadInfo
{ false, FT_FLOAT, "ExitMaxDuration" },
{ false, FT_FLOAT, "ExitMinArcHeight" },
{ false, FT_FLOAT, "ExitMaxArcHeight" },
+ { true, FT_INT, "ExitAnimStart" },
+ { true, FT_INT, "ExitAnimLoop" },
+ { true, FT_INT, "ExitAnimEnd" },
+ { true, FT_SHORT, "VehicleEnterAnim" },
+ { true, FT_BYTE, "VehicleEnterAnimBone" },
+ { true, FT_SHORT, "VehicleExitAnim" },
+ { true, FT_BYTE, "VehicleExitAnimBone" },
+ { true, FT_SHORT, "VehicleRideAnimLoop" },
+ { true, FT_BYTE, "VehicleRideAnimLoopBone" },
+ { true, FT_BYTE, "PassengerAttachmentID" },
{ false, FT_FLOAT, "PassengerYaw" },
{ false, FT_FLOAT, "PassengerPitch" },
{ false, FT_FLOAT, "PassengerRoll" },
{ false, FT_FLOAT, "VehicleEnterAnimDelay" },
{ false, FT_FLOAT, "VehicleExitAnimDelay" },
+ { true, FT_BYTE, "VehicleAbilityDisplay" },
+ { false, FT_INT, "EnterUISoundID" },
+ { false, FT_INT, "ExitUISoundID" },
+ { true, FT_INT, "UiSkinFileDataID" },
{ 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" },
- { true, 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" },
{ true, FT_SHORT, "EnterAnimKitID" },
{ true, FT_SHORT, "RideAnimKitID" },
{ true, FT_SHORT, "ExitAnimKitID" },
@@ -5259,14 +5424,6 @@ struct VehicleSeatLoadInfo
{ true, FT_SHORT, "VehicleRideAnimKitID" },
{ true, FT_SHORT, "VehicleExitAnimKitID" },
{ true, FT_SHORT, "CameraModeID" },
- { true, FT_BYTE, "AttachmentID" },
- { true, FT_BYTE, "PassengerAttachmentID" },
- { true, FT_BYTE, "VehicleEnterAnimBone" },
- { true, FT_BYTE, "VehicleExitAnimBone" },
- { true, FT_BYTE, "VehicleRideAnimLoopBone" },
- { true, FT_BYTE, "VehicleAbilityDisplay" },
- { false, FT_INT, "EnterUISoundID" },
- { false, FT_INT, "ExitUISoundID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, VehicleSeatMeta::Instance(), HOTFIX_SEL_VEHICLE_SEAT);
return &loadInfo;
@@ -5280,20 +5437,20 @@ struct WmoAreaTableLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_STRING, "AreaName" },
+ { false, FT_INT, "ID" },
+ { false, FT_SHORT, "WmoID" },
+ { false, FT_BYTE, "NameSetID" },
{ true, FT_INT, "WmoGroupID" },
+ { false, FT_BYTE, "SoundProviderPref" },
+ { false, FT_BYTE, "SoundProviderPrefUnderwater" },
{ false, FT_SHORT, "AmbienceID" },
+ { false, FT_SHORT, "UwAmbience" },
{ false, FT_SHORT, "ZoneMusic" },
+ { false, FT_INT, "UwZoneMusic" },
{ false, FT_SHORT, "IntroSound" },
- { false, FT_SHORT, "AreaTableID" },
{ false, FT_SHORT, "UwIntroSound" },
- { false, FT_SHORT, "UwAmbience" },
- { false, FT_BYTE, "NameSetID" },
- { false, FT_BYTE, "SoundProviderPref" },
- { false, FT_BYTE, "SoundProviderPrefUnderwater" },
+ { false, FT_SHORT, "AreaTableID" },
{ false, FT_BYTE, "Flags" },
- { false, FT_INT, "ID" },
- { false, FT_INT, "UwZoneMusic" },
- { false, FT_SHORT, "WmoID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, WMOAreaTableMeta::Instance(), HOTFIX_SEL_WMO_AREA_TABLE);
return &loadInfo;
@@ -5307,63 +5464,33 @@ struct WorldEffectLoadInfo
static DB2FieldMeta const fields[] =
{
{ false, FT_INT, "ID" },
- { true, FT_INT, "TargetAsset" },
- { false, FT_SHORT, "CombatConditionID" },
- { false, FT_BYTE, "TargetType" },
- { false, FT_BYTE, "WhenToDisplay" },
{ false, FT_INT, "QuestFeedbackEffectID" },
+ { false, FT_BYTE, "WhenToDisplay" },
+ { false, FT_BYTE, "TargetType" },
+ { true, FT_INT, "TargetAsset" },
{ false, FT_INT, "PlayerConditionID" },
+ { false, FT_SHORT, "CombatConditionID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, WorldEffectMeta::Instance(), HOTFIX_SEL_WORLD_EFFECT);
return &loadInfo;
}
};
-struct WorldMapAreaLoadInfo
-{
- static DB2LoadInfo const* 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_INT, "Flags" },
- { true, FT_SHORT, "MapID" },
- { false, FT_SHORT, "AreaID" },
- { true, FT_SHORT, "DisplayMapID" },
- { false, FT_SHORT, "DefaultDungeonFloor" },
- { false, FT_SHORT, "ParentWorldMapID" },
- { false, FT_BYTE, "LevelRangeMin" },
- { false, FT_BYTE, "LevelRangeMax" },
- { false, FT_BYTE, "BountySetID" },
- { false, FT_BYTE, "BountyDisplayLocation" },
- { false, FT_INT, "ID" },
- { false, FT_INT, "VisibilityPlayerConditionID" },
- };
- static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, WorldMapAreaMeta::Instance(), HOTFIX_SEL_WORLD_MAP_AREA);
- return &loadInfo;
- }
-};
-
struct WorldMapOverlayLoadInfo
{
static DB2LoadInfo const* Instance()
{
static DB2FieldMeta const fields[] =
{
- { false, FT_STRING_NOT_LOCALIZED, "TextureName" },
{ false, FT_INT, "ID" },
+ { false, FT_INT, "UiMapArtID" },
{ false, FT_SHORT, "TextureWidth" },
{ false, FT_SHORT, "TextureHeight" },
- { false, FT_INT, "MapAreaID" },
{ true, FT_INT, "OffsetX" },
{ true, FT_INT, "OffsetY" },
{ true, FT_INT, "HitRectTop" },
- { true, FT_INT, "HitRectLeft" },
{ true, FT_INT, "HitRectBottom" },
+ { true, FT_INT, "HitRectLeft" },
{ true, FT_INT, "HitRectRight" },
{ false, FT_INT, "PlayerConditionID" },
{ false, FT_INT, "Flags" },
@@ -5377,35 +5504,6 @@ struct WorldMapOverlayLoadInfo
}
};
-struct WorldMapTransformsLoadInfo
-{
- static DB2LoadInfo const* 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" },
- { true, FT_INT, "Priority" },
- };
- static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, WorldMapTransformsMeta::Instance(), HOTFIX_SEL_WORLD_MAP_TRANSFORMS);
- return &loadInfo;
- }
-};
-
struct WorldSafeLocsLoadInfo
{
static DB2LoadInfo const* Instance()
@@ -5417,8 +5515,8 @@ struct WorldSafeLocsLoadInfo
{ false, FT_FLOAT, "LocX" },
{ false, FT_FLOAT, "LocY" },
{ false, FT_FLOAT, "LocZ" },
- { false, FT_FLOAT, "Facing" },
{ false, FT_SHORT, "MapID" },
+ { false, FT_FLOAT, "Facing" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, WorldSafeLocsMeta::Instance(), HOTFIX_SEL_WORLD_SAFE_LOCS);
return &loadInfo;
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp
index b233f53324b..52ae4deaa2f 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -263,14 +263,16 @@ DB2Storage<TransmogSetGroupEntry> sTransmogSetGroupStore("Transmog
DB2Storage<TransmogSetItemEntry> sTransmogSetItemStore("TransmogSetItem.db2", TransmogSetItemLoadInfo::Instance());
DB2Storage<TransportAnimationEntry> sTransportAnimationStore("TransportAnimation.db2", TransportAnimationLoadInfo::Instance());
DB2Storage<TransportRotationEntry> sTransportRotationStore("TransportRotation.db2", TransportRotationLoadInfo::Instance());
+DB2Storage<UiMapEntry> sUiMapStore("UiMap.db2", UiMapLoadInfo::Instance());
+DB2Storage<UiMapAssignmentEntry> sUiMapAssignmentStore("UiMapAssignment.db2", UiMapAssignmentLoadInfo::Instance());
+DB2Storage<UiMapLinkEntry> sUiMapLinkStore("UiMapLink.db2", UiMapLinkLoadInfo::Instance());
+DB2Storage<UiMapXMapArtEntry> sUiMapXMapArtStore("UiMapXMapArt.db2", UiMapXMapArtLoadInfo::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<WorldEffectEntry> sWorldEffectStore("WorldEffect.db2", WorldEffectLoadInfo::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;
@@ -331,10 +333,17 @@ typedef std::vector<TalentEntry const*> TalentsByPosition[MAX_CLASSES][MAX_TALEN
typedef std::unordered_set<uint32> ToyItemIdsContainer;
typedef std::tuple<uint16, uint8, int32> WMOAreaTableKey;
typedef std::map<WMOAreaTableKey, WMOAreaTableEntry const*> WMOAreaTableLookupContainer;
-typedef std::unordered_map<uint32, WorldMapAreaEntry const*> WorldMapAreaByAreaIDContainer;
namespace
{
+ struct UiMapBounds
+ {
+ // these coords are mixed when calculated and used... its a mess
+ float Bounds[4];
+ bool IsUiAssignment;
+ bool IsUiLink;
+ };
+
StorageMap _stores;
std::map<uint64, int32> _hotfixData;
@@ -391,8 +400,13 @@ namespace
ToyItemIdsContainer _toys;
std::unordered_map<uint32, std::vector<TransmogSetEntry const*>> _transmogSetsByItemModifiedAppearance;
std::unordered_map<uint32, std::vector<TransmogSetItemEntry const*>> _transmogSetItemsByTransmogSet;
+ std::unordered_map<int32, UiMapBounds> _uiMapBounds;
+ std::unordered_multimap<int32, UiMapAssignmentEntry const*> _uiMapAssignmentByMap[MAX_UI_MAP_SYSTEM];
+ std::unordered_multimap<int32, UiMapAssignmentEntry const*> _uiMapAssignmentByArea[MAX_UI_MAP_SYSTEM];
+ std::unordered_multimap<int32, UiMapAssignmentEntry const*> _uiMapAssignmentByWmoDoodadPlacement[MAX_UI_MAP_SYSTEM];
+ std::unordered_multimap<int32, UiMapAssignmentEntry const*> _uiMapAssignmentByWmoGroup[MAX_UI_MAP_SYSTEM];
+ std::unordered_set<int32> _uiMapPhases;
WMOAreaTableLookupContainer _wmoAreaTableLookup;
- WorldMapAreaByAreaIDContainer _worldMapAreaByAreaID;
}
template<class T, template<class> class DB2>
@@ -421,7 +435,7 @@ inline void LoadDB2(uint32& availableDb2Locales, std::vector<std::string>& errli
if (storage->Load(db2Path + localeNames[defaultLocale] + '/', defaultLocale))
{
- storage->LoadFromDB();
+ storage->LoadFromDB();
// LoadFromDB() always loads strings into enUS locale, other locales are expected to have data in corresponding _locale tables
// so we need to make additional call to load that data in case said locale is set as default by worldserver.conf (and we do not want to load all this data from .db2 file again)
if (defaultLocale != LOCALE_enUS)
@@ -629,7 +643,6 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sPrestigeLevelInfoStore);
LOAD_DB2(sPVPDifficultyStore);
LOAD_DB2(sPVPItemStore);
- //LOAD_DB2(sPvpRewardStore);
LOAD_DB2(sPvpTalentStore);
LOAD_DB2(sPvpTalentCategoryStore);
LOAD_DB2(sPvpTalentSlotUnlockStore);
@@ -702,14 +715,16 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
LOAD_DB2(sTransmogSetItemStore);
LOAD_DB2(sTransportAnimationStore);
LOAD_DB2(sTransportRotationStore);
+ LOAD_DB2(sUiMapStore);
+ LOAD_DB2(sUiMapAssignmentStore);
+ LOAD_DB2(sUiMapLinkStore);
+ LOAD_DB2(sUiMapXMapArtStore);
LOAD_DB2(sUnitPowerBarStore);
LOAD_DB2(sVehicleStore);
LOAD_DB2(sVehicleSeatStore);
LOAD_DB2(sWMOAreaTableStore);
LOAD_DB2(sWorldEffectStore);
- LOAD_DB2(sWorldMapAreaStore);
LOAD_DB2(sWorldMapOverlayStore);
- LOAD_DB2(sWorldMapTransformsStore);
LOAD_DB2(sWorldSafeLocsStore);
#undef LOAD_DB2
@@ -1067,6 +1082,118 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
for (TaxiPathNodeEntry const* entry : sTaxiPathNodeStore)
sTaxiPathNodesByPath[entry->PathID][entry->NodeIndex] = entry;
+ for (ToyEntry const* toy : sToyStore)
+ _toys.insert(toy->ItemID);
+
+ for (TransmogSetItemEntry const* transmogSetItem : sTransmogSetItemStore)
+ {
+ TransmogSetEntry const* set = sTransmogSetStore.LookupEntry(transmogSetItem->TransmogSetID);
+ if (!set)
+ continue;
+
+ _transmogSetsByItemModifiedAppearance[transmogSetItem->ItemModifiedAppearanceID].push_back(set);
+ _transmogSetItemsByTransmogSet[transmogSetItem->TransmogSetID].push_back(transmogSetItem);
+ }
+
+ std::unordered_multimap<int32, UiMapAssignmentEntry const*> uiMapAssignmentByUiMap;
+ for (UiMapAssignmentEntry const* uiMapAssignment : sUiMapAssignmentStore)
+ {
+ uiMapAssignmentByUiMap.emplace(uiMapAssignment->UiMapID, uiMapAssignment);
+ if (UiMapEntry const* uiMap = sUiMapStore.LookupEntry(uiMapAssignment->UiMapID))
+ {
+ ASSERT(uiMap->System < MAX_UI_MAP_SYSTEM, "MAX_TALENT_TIERS must be at least %u", uiMap->System + 1);
+ if (uiMapAssignment->MapID >= 0)
+ _uiMapAssignmentByMap[uiMap->System].emplace(uiMapAssignment->MapID, uiMapAssignment);
+ if (uiMapAssignment->AreaID)
+ _uiMapAssignmentByArea[uiMap->System].emplace(uiMapAssignment->AreaID, uiMapAssignment);
+ if (uiMapAssignment->WmoDoodadPlacementID)
+ _uiMapAssignmentByWmoDoodadPlacement[uiMap->System].emplace(uiMapAssignment->WmoDoodadPlacementID, uiMapAssignment);
+ if (uiMapAssignment->WmoGroupID)
+ _uiMapAssignmentByWmoGroup[uiMap->System].emplace(uiMapAssignment->WmoGroupID, uiMapAssignment);
+ }
+ }
+
+ std::unordered_map<std::pair<int32, uint32>, UiMapLinkEntry const*> uiMapLinks;
+ for (UiMapLinkEntry const* uiMapLink : sUiMapLinkStore)
+ uiMapLinks[std::make_pair(uiMapLink->ParentUiMapID, uint32(uiMapLink->ChildUiMapID))] = uiMapLink;
+
+ for (UiMapEntry const* uiMap : sUiMapStore)
+ {
+ UiMapBounds& bounds = _uiMapBounds[uiMap->ID];
+ memset(&bounds, 0, sizeof(bounds));
+ if (UiMapEntry const* parentUiMap = sUiMapStore.LookupEntry(uiMap->ParentUiMapID))
+ {
+ if (parentUiMap->Flags & 0x80)
+ continue;
+
+ UiMapAssignmentEntry const* uiMapAssignment = nullptr;
+ UiMapAssignmentEntry const* parentUiMapAssignment = nullptr;
+ for (auto uiMapAssignmentForMap : Trinity::Containers::MapEqualRange(uiMapAssignmentByUiMap, uiMap->ID))
+ {
+ if (uiMapAssignmentForMap.second->MapID >= 0 &&
+ uiMapAssignmentForMap.second->Region[1].X - uiMapAssignmentForMap.second->Region[0].X > 0 &&
+ uiMapAssignmentForMap.second->Region[1].Y - uiMapAssignmentForMap.second->Region[0].Y > 0)
+ {
+ uiMapAssignment = uiMapAssignmentForMap.second;
+ break;
+ }
+ }
+
+ if (!uiMapAssignment)
+ continue;
+
+ for (auto uiMapAssignmentForMap : Trinity::Containers::MapEqualRange(uiMapAssignmentByUiMap, uiMap->ParentUiMapID))
+ {
+ if (uiMapAssignmentForMap.second->MapID == uiMapAssignment->MapID &&
+ uiMapAssignmentForMap.second->Region[1].X - uiMapAssignmentForMap.second->Region[0].X > 0 &&
+ uiMapAssignmentForMap.second->Region[1].Y - uiMapAssignmentForMap.second->Region[0].Y > 0)
+ {
+ parentUiMapAssignment = uiMapAssignmentForMap.second;
+ break;
+ }
+ }
+
+ if (!parentUiMapAssignment)
+ continue;
+
+ float parentXsize = parentUiMapAssignment->Region[1].X - parentUiMapAssignment->Region[0].X;
+ float parentYsize = parentUiMapAssignment->Region[1].Y - parentUiMapAssignment->Region[0].Y;
+ float bound0scale = (uiMapAssignment->Region[1].X - parentUiMapAssignment->Region[0].X) / parentXsize;
+ float bound0 = ((1.0f - bound0scale) * parentUiMapAssignment->UiMax.Y) + (bound0scale * parentUiMapAssignment->UiMin.Y);
+ float bound2scale = (uiMapAssignment->Region[0].X - parentUiMapAssignment->Region[0].X) / parentXsize;
+ float bound2 = ((1.0f - bound2scale) * parentUiMapAssignment->UiMax.Y) + (bound2scale * parentUiMapAssignment->UiMin.Y);
+ float bound1scale = (uiMapAssignment->Region[1].Y - parentUiMapAssignment->Region[0].Y) / parentYsize;
+ float bound1 = ((1.0f - bound1scale) * parentUiMapAssignment->UiMax.X) + (bound1scale * parentUiMapAssignment->UiMin.X);
+ float bound3scale = (uiMapAssignment->Region[0].Y - parentUiMapAssignment->Region[0].Y) / parentYsize;
+ float bound3 = ((1.0f - bound3scale) * parentUiMapAssignment->UiMax.X) + (bound3scale * parentUiMapAssignment->UiMin.X);
+ if ((bound3 - bound1) > 0.0f || (bound2 - bound0) > 0.0f)
+ {
+ bounds.Bounds[0] = bound0;
+ bounds.Bounds[1] = bound1;
+ bounds.Bounds[2] = bound2;
+ bounds.Bounds[3] = bound3;
+ bounds.IsUiAssignment = true;
+ }
+ }
+
+ if (UiMapLinkEntry const* uiMapLink = Trinity::Containers::MapGetValuePtr(uiMapLinks, std::make_pair(uiMap->ParentUiMapID, uiMap->ID)))
+ {
+ bounds.IsUiAssignment = false;
+ bounds.IsUiLink = true;
+ bounds.Bounds[0] = uiMapLink->UiMin.Y;
+ bounds.Bounds[1] = uiMapLink->UiMin.X;
+ bounds.Bounds[2] = uiMapLink->UiMax.Y;
+ bounds.Bounds[3] = uiMapLink->UiMax.X;
+ }
+ }
+
+ for (UiMapXMapArtEntry const* uiMapArt : sUiMapXMapArtStore)
+ if (uiMapArt->PhaseID)
+ _uiMapPhases.insert(uiMapArt->PhaseID);
+
+ for (WMOAreaTableEntry const* entry : sWMOAreaTableStore)
+ _wmoAreaTableLookup[WMOAreaTableKey(entry->WmoID, entry->NameSetID, entry->WmoGroupID)] = entry;
+
// Initialize global taxinodes mask
// include existed nodes that have at least single not spell base (scripted) path
{
@@ -1096,32 +1223,20 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale)
if (node->Flags & TAXI_NODE_FLAG_ALLIANCE)
sAllianceTaxiNodesMask[field] |= submask;
- uint32 nodeMap;
- DeterminaAlternateMapPosition(node->ContinentID, node->Pos.X, node->Pos.Y, node->Pos.Z, &nodeMap);
- if (nodeMap < 2)
- sOldContinentsNodesMask[field] |= submask;
- }
- }
+ int32 uiMapId = -1;
+ if (!GetUiMapPosition(node->Pos.X, node->Pos.Y, node->Pos.Z, node->ContinentID, 0, 0, 0, UI_MAP_SYSTEM_ADVENTURE, false, &uiMapId))
+ GetUiMapPosition(node->Pos.X, node->Pos.Y, node->Pos.Z, node->ContinentID, 0, 0, 0, UI_MAP_SYSTEM_TAXI, false, &uiMapId);
- for (ToyEntry const* toy : sToyStore)
- _toys.insert(toy->ItemID);
-
- for (TransmogSetItemEntry const* transmogSetItem : sTransmogSetItemStore)
- {
- TransmogSetEntry const* set = sTransmogSetStore.LookupEntry(transmogSetItem->TransmogSetID);
- if (!set)
- continue;
+ if (uiMapId != -1)
+ {
+ TC_LOG_INFO(LOGGER_ROOT, "%s %d %f %f %f %d", node->Name->Str[0], node->ConditionID, node->Pos.X, node->Pos.Y, node->Pos.Z, uiMapId);
+ }
- _transmogSetsByItemModifiedAppearance[transmogSetItem->ItemModifiedAppearanceID].push_back(set);
- _transmogSetItemsByTransmogSet[transmogSetItem->TransmogSetID].push_back(transmogSetItem);
+ if (uiMapId == 985 || uiMapId == 986)
+ sOldContinentsNodesMask[field] |= submask;
+ }
}
- for (WMOAreaTableEntry const* entry : sWMOAreaTableStore)
- _wmoAreaTableLookup[WMOAreaTableKey(entry->WmoID, entry->NameSetID, entry->WmoGroupID)] = entry;
-
- for (WorldMapAreaEntry const* worldMapArea : sWorldMapAreaStore)
- _worldMapAreaByAreaID[worldMapArea->AreaID] = worldMapArea;
-
// error checks
if (bad_db2_files.size() == _stores.size())
{
@@ -2253,99 +2368,355 @@ std::vector<TransmogSetItemEntry const*> const* DB2Manager::GetTransmogSetItems(
return Trinity::Containers::MapGetValuePtr(_transmogSetItemsByTransmogSet, transmogSetId);
}
-WMOAreaTableEntry const* DB2Manager::GetWMOAreaTable(int32 rootId, int32 adtId, int32 groupId) const
+struct UiMapAssignmentStatus
{
- auto i = _wmoAreaTableLookup.find(WMOAreaTableKey(int16(rootId), int8(adtId), groupId));
- if (i != _wmoAreaTableLookup.end())
- return i->second;
+ UiMapAssignmentEntry const* UiMapAssignment = nullptr;
+ // distances if inside
+ struct
+ {
+ float DistanceToRegionCenterSquared = std::numeric_limits<float>::max();
+ float DistanceToRegionBottom = std::numeric_limits<float>::max();
+ } Inside;
- return nullptr;
-}
+ // distances if outside
+ struct
+ {
+ float DistanceToRegionEdgeSquared = std::numeric_limits<float>::max();
+ float DistanceToRegionTop = std::numeric_limits<float>::max();
+ float DistanceToRegionBottom = std::numeric_limits<float>::max();
+ } Outside;
-uint32 DB2Manager::GetVirtualMapForMapAndZone(uint32 mapId, uint32 zoneId) const
+ int8 MapPriority = 3;
+ int8 AreaPriority = -1;
+ int8 WmoPriority = 3;
+
+ bool IsInside() const
+ {
+ return Outside.DistanceToRegionEdgeSquared < std::numeric_limits<float>::epsilon() &&
+ std::abs(Outside.DistanceToRegionTop) < std::numeric_limits<float>::epsilon() &&
+ std::abs(Outside.DistanceToRegionBottom) < std::numeric_limits<float>::epsilon();
+ }
+};
+
+static bool operator<(UiMapAssignmentStatus const& left, UiMapAssignmentStatus const& right)
{
- if (mapId != 530 && mapId != 571 && mapId != 732) // speed for most cases
- return mapId;
+ bool leftInside = left.IsInside();
+ bool rightInside = right.IsInside();
+ if (leftInside != rightInside)
+ return leftInside;
+
+ if (left.UiMapAssignment && right.UiMapAssignment &&
+ left.UiMapAssignment->UiMapID == right.UiMapAssignment->UiMapID &&
+ left.UiMapAssignment->OrderIndex != right.UiMapAssignment->OrderIndex)
+ return left.UiMapAssignment->OrderIndex < right.UiMapAssignment->OrderIndex;
+
+ if (left.WmoPriority != right.WmoPriority)
+ return left.WmoPriority < right.WmoPriority;
+
+ if (left.AreaPriority != right.AreaPriority)
+ return left.AreaPriority < right.AreaPriority;
+
+ if (left.MapPriority != right.MapPriority)
+ return left.MapPriority < right.MapPriority;
+
+ if (leftInside)
+ {
+ if (left.Inside.DistanceToRegionBottom != right.Inside.DistanceToRegionBottom)
+ return left.Inside.DistanceToRegionBottom < right.Inside.DistanceToRegionBottom;
+
+ float leftUiSizeX = left.UiMapAssignment ? (left.UiMapAssignment->UiMax.X - left.UiMapAssignment->UiMin.X) : 0.0f;
+ float rightUiSizeX = right.UiMapAssignment ? (right.UiMapAssignment->UiMax.X - right.UiMapAssignment->UiMin.X) : 0.0f;
+
+ if (leftUiSizeX > std::numeric_limits<float>::epsilon() && rightUiSizeX > std::numeric_limits<float>::epsilon())
+ {
+ float leftScale = (left.UiMapAssignment->Region[1].X - left.UiMapAssignment->Region[0].X) / leftUiSizeX;
+ float rightScale = (right.UiMapAssignment->Region[1].X - right.UiMapAssignment->Region[0].X) / rightUiSizeX;
+ if (leftScale != rightScale)
+ return leftScale < rightScale;
+ }
- auto itr = _worldMapAreaByAreaID.find(zoneId);
- if (itr != _worldMapAreaByAreaID.end())
- return itr->second->DisplayMapID >= 0 ? itr->second->DisplayMapID : itr->second->MapID;
+ if (left.Inside.DistanceToRegionCenterSquared != right.Inside.DistanceToRegionCenterSquared)
+ return left.Inside.DistanceToRegionCenterSquared < right.Inside.DistanceToRegionCenterSquared;
+ }
+ else
+ {
+ if (left.Outside.DistanceToRegionTop != right.Outside.DistanceToRegionTop)
+ return left.Outside.DistanceToRegionTop < right.Outside.DistanceToRegionTop;
+
+ if (left.Outside.DistanceToRegionBottom != right.Outside.DistanceToRegionBottom)
+ return left.Outside.DistanceToRegionBottom < right.Outside.DistanceToRegionBottom;
- return mapId;
+ if (left.Outside.DistanceToRegionEdgeSquared != right.Outside.DistanceToRegionEdgeSquared)
+ return left.Outside.DistanceToRegionEdgeSquared < right.Outside.DistanceToRegionEdgeSquared;
+ }
+
+ return true;
}
-void DB2Manager::Zone2MapCoordinates(uint32 areaId, float& x, float& y) const
+static bool CheckUiMapAssignmentStatus(float x, float y, float z, int32 mapId, int32 areaId, int32 wmoDoodadPlacementId, int32 wmoGroupId,
+ UiMapAssignmentEntry const* uiMapAssignment, UiMapAssignmentStatus* status)
{
- auto itr = _worldMapAreaByAreaID.find(areaId);
- if (itr == _worldMapAreaByAreaID.end())
- return;
+ status->UiMapAssignment = uiMapAssignment;
+ // x,y not in region
+ if (x < uiMapAssignment->Region[0].X || x > uiMapAssignment->Region[1].X || y < uiMapAssignment->Region[0].Y || y > uiMapAssignment->Region[1].Y)
+ {
+ float xDiff, yDiff;
+ if (x >= uiMapAssignment->Region[0].X)
+ {
+ xDiff = 0.0f;
+ if (x > uiMapAssignment->Region[1].X)
+ xDiff = x - uiMapAssignment->Region[0].X;
+ }
+ else
+ xDiff = uiMapAssignment->Region[0].X - x;
+
+ if (y >= uiMapAssignment->Region[0].Y)
+ {
+ yDiff = 0.0f;
+ if (y > uiMapAssignment->Region[1].Y)
+ yDiff = y - uiMapAssignment->Region[0].Y;
+ }
+ else
+ yDiff = uiMapAssignment->Region[0].Y - y;
+
+ status->Outside.DistanceToRegionEdgeSquared = xDiff * xDiff + yDiff * yDiff;
+ }
+ else
+ {
+ status->Inside.DistanceToRegionCenterSquared =
+ (x - (uiMapAssignment->Region[0].X + uiMapAssignment->Region[1].X) * 0.5f) * (x - (uiMapAssignment->Region[0].X + uiMapAssignment->Region[1].X) * 0.5f)
+ + (y - (uiMapAssignment->Region[0].Y + uiMapAssignment->Region[1].Y) * 0.5f) * (y - (uiMapAssignment->Region[0].Y + uiMapAssignment->Region[1].Y) * 0.5f);
+ status->Outside.DistanceToRegionEdgeSquared = 0.0f;
+ }
- std::swap(x, y); // at client map coords swapped
- x = x*((itr->second->LocBottom - itr->second->LocTop) / 100) + itr->second->LocTop;
- y = y*((itr->second->LocRight - itr->second->LocLeft) / 100) + itr->second->LocLeft; // client y coord from top to down
+ // z not in region
+ if (z < uiMapAssignment->Region[0].Z || z > uiMapAssignment->Region[1].Z)
+ {
+ if (z < uiMapAssignment->Region[1].Z)
+ {
+ if (z < uiMapAssignment->Region[0].Z)
+ status->Outside.DistanceToRegionBottom = std::min(uiMapAssignment->Region[0].Z - z, 10000.0f);
+ }
+ else
+ status->Outside.DistanceToRegionTop = std::min(z - uiMapAssignment->Region[1].Z, 10000.0f);
+ }
+ else
+ {
+ status->Outside.DistanceToRegionTop = 0.0f;
+ status->Outside.DistanceToRegionBottom = 0.0f;
+ status->Inside.DistanceToRegionBottom = std::min(uiMapAssignment->Region[0].Z - z, 10000.0f);
+ }
+
+ if (areaId && uiMapAssignment->AreaID)
+ {
+ int8 areaPriority = 0;
+ if (areaId)
+ {
+ while (areaId != uiMapAssignment->AreaID)
+ {
+ if (AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId))
+ {
+ areaId = areaEntry->ParentAreaID;
+ ++areaPriority;
+ }
+ else
+ return false;
+ }
+ }
+ else
+ return false;
+
+ status->AreaPriority = areaPriority;
+ }
+
+ if (mapId >= 0 && uiMapAssignment->MapID >= 0)
+ {
+ if (mapId != uiMapAssignment->MapID)
+ {
+ if (MapEntry const* mapEntry = sMapStore.LookupEntry(mapId))
+ {
+ if (mapEntry->ParentMapID == uiMapAssignment->MapID)
+ status->MapPriority = 1;
+ else if (mapEntry->CosmeticParentMapID == uiMapAssignment->MapID)
+ status->MapPriority = 2;
+ else
+ return false;
+ }
+ else
+ return false;
+ }
+ else
+ status->MapPriority = 0;
+ }
+
+ if (wmoGroupId || wmoDoodadPlacementId)
+ {
+ if (uiMapAssignment->WmoGroupID || uiMapAssignment->WmoDoodadPlacementID)
+ {
+ bool hasDoodadPlacement = false;
+ if (wmoDoodadPlacementId && uiMapAssignment->WmoDoodadPlacementID)
+ {
+ if (wmoDoodadPlacementId != uiMapAssignment->WmoDoodadPlacementID)
+ return false;
+
+ hasDoodadPlacement = true;
+ }
+
+ if (wmoGroupId && uiMapAssignment->WmoGroupID)
+ {
+ if (wmoGroupId != uiMapAssignment->WmoGroupID)
+ return false;
+
+ if (hasDoodadPlacement)
+ status->WmoPriority = 0;
+ else
+ status->WmoPriority = 2;
+ }
+ else if (hasDoodadPlacement)
+ status->WmoPriority = 1;
+ }
+ }
+
+ return true;
}
-void DB2Manager::Map2ZoneCoordinates(uint32 areaId, float& x, float& y) const
+static UiMapAssignmentEntry const* FindNearestMapAssignment(float x, float y, float z, int32 mapId, int32 areaId, int32 wmoDoodadPlacementId, int32 wmoGroupId, UiMapSystem system)
{
- auto itr = _worldMapAreaByAreaID.find(areaId);
- if (itr == _worldMapAreaByAreaID.end())
- return;
+ UiMapAssignmentStatus nearestMapAssignment;
+ auto iterateUiMapAssignments = [&](std::unordered_multimap<int32, UiMapAssignmentEntry const*> const& assignments, int32 id)
+ {
+ for (auto assignment : Trinity::Containers::MapEqualRange(assignments, id))
+ {
+ UiMapAssignmentStatus status;
+ if (CheckUiMapAssignmentStatus(x, y, z, mapId, areaId, wmoDoodadPlacementId, wmoGroupId, assignment.second, &status))
+ if (status < nearestMapAssignment)
+ nearestMapAssignment = status;
+ }
+ };
- x = (x - itr->second->LocTop) / ((itr->second->LocBottom - itr->second->LocTop) / 100);
- y = (y - itr->second->LocLeft) / ((itr->second->LocRight - itr->second->LocLeft) / 100); // client y coord from top to down
- std::swap(x, y); // client have map coords swapped
+ iterateUiMapAssignments(_uiMapAssignmentByWmoGroup[system], wmoGroupId);
+ iterateUiMapAssignments(_uiMapAssignmentByWmoDoodadPlacement[system], wmoDoodadPlacementId);
+
+ AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
+ while (areaEntry)
+ {
+ iterateUiMapAssignments(_uiMapAssignmentByArea[system], areaEntry->ID);
+ areaEntry = sAreaTableStore.LookupEntry(areaEntry->ParentAreaID);
+ }
+
+ if (MapEntry const* mapEntry = sMapStore.LookupEntry(mapId))
+ {
+ iterateUiMapAssignments(_uiMapAssignmentByMap[system], mapEntry->ID);
+ if (mapEntry->ParentMapID >= 0)
+ iterateUiMapAssignments(_uiMapAssignmentByMap[system], mapEntry->ParentMapID);
+ if (mapEntry->CosmeticParentMapID >= 0)
+ iterateUiMapAssignments(_uiMapAssignmentByMap[system], mapEntry->CosmeticParentMapID);
+ }
+
+ return nearestMapAssignment.UiMapAssignment;
}
-void DB2Manager::DeterminaAlternateMapPosition(uint32 mapId, float x, float y, float z, uint32* newMapId /*= nullptr*/, DBCPosition2D* newPos /*= nullptr*/)
+static DBCPosition2D CalculateGlobalUiMapPosition(int32 uiMapID, DBCPosition2D uiPosition)
{
- ASSERT(newMapId || newPos);
- WorldMapTransformsEntry const* transformation = nullptr;
- for (WorldMapTransformsEntry const* transform : sWorldMapTransformsStore)
+ UiMapEntry const* uiMap = sUiMapStore.LookupEntry(uiMapID);
+ while (uiMap)
{
- if (transform->MapID != mapId)
- continue;
- if (transform->AreaID)
- continue;
- if (transform->Flags & WORLD_MAP_TRANSFORMS_FLAG_DUNGEON)
- continue;
- if (transform->RegionMin.X > x || transform->RegionMax.X < x)
- continue;
- if (transform->RegionMin.Y > y || transform->RegionMax.Y < y)
- continue;
- if (transform->RegionMin.Z > z || transform->RegionMax.Z < z)
- continue;
+ if (uiMap->Type <= UI_MAP_TYPE_CONTINENT)
+ break;
- if (!transformation || transformation->Priority < transform->Priority)
- transformation = transform;
+ UiMapBounds const* bounds = Trinity::Containers::MapGetValuePtr(_uiMapBounds, uiMap->ID);
+ if (!bounds || !bounds->IsUiAssignment)
+ break;
+
+ uiPosition.X = ((1.0 - uiPosition.X) * bounds->Bounds[1]) + (bounds->Bounds[3] * uiPosition.X);
+ uiPosition.Y = ((1.0 - uiPosition.Y) * bounds->Bounds[0]) + (bounds->Bounds[2] * uiPosition.Y);
+
+ uiMap = sUiMapStore.LookupEntry(uiMap->ParentUiMapID);
}
- if (!transformation)
- {
- if (newMapId)
- *newMapId = mapId;
+ return uiPosition;
+}
- if (newPos)
- {
- newPos->X = x;
- newPos->Y = y;
- }
- return;
+bool DB2Manager::GetUiMapPosition(float x, float y, float z, int32 mapId, int32 areaId, int32 wmoDoodadPlacementId, int32 wmoGroupId, UiMapSystem system, bool local,
+ int32* uiMapId /*= nullptr*/, DBCPosition2D* newPos /*= nullptr*/)
+{
+ if (uiMapId)
+ *uiMapId = -1;
+
+ if (newPos)
+ {
+ newPos->X = 0.0f;
+ newPos->Y = 0.0f;
}
- if (newMapId)
- *newMapId = transformation->NewMapID;
+ UiMapAssignmentEntry const* uiMapAssignment = FindNearestMapAssignment(x, y, z, mapId, areaId, wmoDoodadPlacementId, wmoGroupId, system);
+ if (!uiMapAssignment)
+ return false;
+
+ if (uiMapId)
+ *uiMapId = uiMapAssignment->UiMapID;
+
+ DBCPosition2D relativePosition{ 0.5f, 0.5f };
+ DBCPosition2D regionSize{ uiMapAssignment->Region[1].X - uiMapAssignment->Region[0].X, uiMapAssignment->Region[1].Y - uiMapAssignment->Region[0].Y };
+ if (regionSize.X > 0.0f)
+ relativePosition.X = (x - uiMapAssignment->Region[0].X) / regionSize.X;
+ if (regionSize.Y > 0.0f)
+ relativePosition.Y = (y - uiMapAssignment->Region[0].Y) / regionSize.Y;
+
+ DBCPosition2D uiPosition
+ {
+ // x any y are swapped
+ ((1.0f - (1.0f - relativePosition.Y)) * uiMapAssignment->UiMin.X) + ((1.0f - relativePosition.Y) * uiMapAssignment->UiMax.X),
+ ((1.0f - (1.0f - relativePosition.X)) * uiMapAssignment->UiMin.Y) + ((1.0f - relativePosition.X) * uiMapAssignment->UiMax.Y)
+ };
+
+ if (!local)
+ uiPosition = CalculateGlobalUiMapPosition(uiMapAssignment->UiMapID, uiPosition);
- if (!newPos)
+ if (newPos)
+ *newPos = uiPosition;
+
+ return true;
+}
+
+void DB2Manager::Zone2MapCoordinates(uint32 areaId, float& x, float& y) const
+{
+ AreaTableEntry const* areaEntry = sAreaTableStore.LookupEntry(areaId);
+ if (!areaEntry)
return;
- if (std::abs(transformation->RegionScale - 1.0f) > 0.001f)
+ int32 uiMapId = -1;
+ for (auto assignment : Trinity::Containers::MapEqualRange(_uiMapAssignmentByArea[UI_MAP_SYSTEM_WORLD], areaId))
{
- x = (x - transformation->RegionMin.X) * transformation->RegionScale + transformation->RegionMin.X;
- y = (y - transformation->RegionMin.Y) * transformation->RegionScale + transformation->RegionMin.Y;
+ if (assignment.second->MapID >= 0 && assignment.second->MapID != areaEntry->ContinentID)
+ continue;
+
+ float tmpY = 1.0 - ((y - assignment.second->UiMin.Y) / (assignment.second->UiMax.Y - assignment.second->UiMin.Y));
+ float tmpX = 1.0 - ((x - assignment.second->UiMin.X) / (assignment.second->UiMax.X - assignment.second->UiMin.X));
+ y = ((1.0 - tmpY) * assignment.second->Region[0].X) + (tmpY * assignment.second->Region[1].X);
+ x = ((1.0 - tmpX) * assignment.second->Region[0].Y) + (tmpX * assignment.second->Region[1].Y);
+ break;
}
+}
- newPos->X = x + transformation->RegionOffset.X;
- newPos->Y = y + transformation->RegionOffset.Y;
+void DB2Manager::Map2ZoneCoordinates(uint32 areaId, float& x, float& y) const
+{
+ DBCPosition2D zoneCoords;
+ if (!GetUiMapPosition(x, y, 0.0f, -1, areaId, 0, 0, UI_MAP_SYSTEM_WORLD, true, nullptr, &zoneCoords))
+ return;
+
+ x = zoneCoords.Y * 100.0f;
+ y = zoneCoords.X * 100.0f;
+}
+
+bool DB2Manager::IsUiMapPhase(uint32 phaseId) const
+{
+ return _uiMapPhases.find(phaseId) != _uiMapPhases.end();
+}
+
+WMOAreaTableEntry const* DB2Manager::GetWMOAreaTable(int32 rootId, int32 adtId, int32 groupId) const
+{
+ return Trinity::Containers::MapGetValuePtr(_wmoAreaTableLookup, WMOAreaTableKey(int16(rootId), int8(adtId), groupId));
}
bool ChrClassesXPowerTypesEntryComparator::Compare(ChrClassesXPowerTypesEntry const* left, ChrClassesXPowerTypesEntry const* right)
diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h
index 2517433b58b..46a0dee2095 100644
--- a/src/server/game/DataStores/DB2Stores.h
+++ b/src/server/game/DataStores/DB2Stores.h
@@ -209,7 +209,6 @@ TC_GAME_API extern DB2Storage<UnitPowerBarEntry> sUnitPowerBa
TC_GAME_API extern DB2Storage<VehicleEntry> sVehicleStore;
TC_GAME_API extern DB2Storage<VehicleSeatEntry> sVehicleSeatStore;
TC_GAME_API extern DB2Storage<WorldEffectEntry> sWorldEffectStore;
-TC_GAME_API extern DB2Storage<WorldMapAreaEntry> sWorldMapAreaStore;
TC_GAME_API extern DB2Storage<WorldMapOverlayEntry> sWorldMapOverlayStore;
TC_GAME_API extern DB2Storage<WorldSafeLocsEntry> sWorldSafeLocsStore;
@@ -331,11 +330,12 @@ public:
bool IsToyItem(uint32 toy) const;
std::vector<TransmogSetEntry const*> const* GetTransmogSetsForItemModifiedAppearance(uint32 itemModifiedAppearanceId) const;
std::vector<TransmogSetItemEntry const*> const* GetTransmogSetItems(uint32 transmogSetId) const;
- WMOAreaTableEntry const* GetWMOAreaTable(int32 rootId, int32 adtId, int32 groupId) const;
- uint32 GetVirtualMapForMapAndZone(uint32 mapId, uint32 zoneId) const;
+ static bool GetUiMapPosition(float x, float y, float z, int32 mapId, int32 areaId, int32 wmoDoodadPlacementId, int32 wmoGroupId, UiMapSystem system, bool local,
+ int32* uiMapId = nullptr, DBCPosition2D* newPos = nullptr);
void Zone2MapCoordinates(uint32 areaId, float& x, float& y) const;
void Map2ZoneCoordinates(uint32 areaId, float& x, float& y) const;
- static void DeterminaAlternateMapPosition(uint32 mapId, float x, float y, float z, uint32* newMapId = nullptr, DBCPosition2D* newPos = nullptr);
+ bool IsUiMapPhase(uint32 phaseId) const;
+ WMOAreaTableEntry const* GetWMOAreaTable(int32 rootId, int32 adtId, int32 groupId) const;
private:
friend class DB2HotfixGeneratorBase;
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index 7fca60b7fbc..f6e1c93f563 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -2992,6 +2992,55 @@ struct TransportRotationEntry
int32 GameObjectsID;
};
+struct UiMapEntry
+{
+ LocalizedString* Name;
+ uint32 ID;
+ int32 ParentUiMapID;
+ int32 Flags;
+ int32 System;
+ int32 Type;
+ uint32 LevelRangeMin;
+ uint32 LevelRangeMax;
+ int32 BountySetID;
+ uint32 BountyDisplayLocation;
+ int32 VisibilityPlayerConditionID;
+ int8 HelpTextPosition;
+ int32 BkgAtlasID;
+};
+
+struct UiMapAssignmentEntry
+{
+ DBCPosition2D UiMin;
+ DBCPosition2D UiMax;
+ DBCPosition3D Region[2];
+ uint32 ID;
+ int32 UiMapID;
+ int32 OrderIndex;
+ int32 MapID;
+ int32 AreaID;
+ int32 WmoDoodadPlacementID;
+ int32 WmoGroupID;
+};
+
+struct UiMapLinkEntry
+{
+ DBCPosition2D UiMin;
+ DBCPosition2D UiMax;
+ uint32 ID;
+ int32 ParentUiMapID;
+ int32 OrderIndex;
+ int32 ChildUiMapID;
+};
+
+struct UiMapXMapArtEntry
+{
+ uint32 ID;
+ int32 PhaseID;
+ int32 UiMapArtID;
+ int32 UiMapID;
+};
+
struct UnitPowerBarEntry
{
uint32 ID;
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index dfcdc2756af..1eba72590f7 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -58,7 +58,7 @@ enum LevelLimit
enum BattlegroundBracketId // bracketId for level ranges
{
BG_BRACKET_ID_FIRST = 0,
- BG_BRACKET_ID_LAST = 11,
+ BG_BRACKET_ID_LAST = 12,
// must be max value in PvPDificulty slot + 1
MAX_BATTLEGROUND_BRACKETS
@@ -166,7 +166,7 @@ enum ArtifactPowerFlag : uint8
#define MAX_ARTIFACT_TIER 1
-#define BATTLE_PET_SPECIES_MAX_ID 2164
+#define BATTLE_PET_SPECIES_MAX_ID 2480
enum ChrSpecializationFlag
{
@@ -608,6 +608,11 @@ enum Difficulty : uint8
DIFFICULTY_WORLD_PVP_SCENARIO_2 = 32,
DIFFICULTY_TIMEWALKING_RAID = 33,
DIFFICULTY_PVP = 34,
+ DIFFICULTY_NORMAL_ISLAND = 38,
+ DIFFICULTY_HEROIC_ISLAND = 39,
+ DIFFICULTY_MYTHIC_ISLAND = 40,
+ DIFFICULTY_PVP_ISLAND = 45,
+ DIFFICULTY_NORMAL_WARFRONT = 147,
MAX_DIFFICULTY
};
@@ -993,7 +998,7 @@ enum SpellShapeshiftFormFlags
SHAPESHIFT_FORM_PREVENT_EMOTE_SOUNDS = 0x1000
};
-#define TaxiMaskSize 258
+#define TaxiMaskSize 286
typedef std::array<uint8, TaxiMaskSize> TaxiMask;
enum TotemCategoryType
@@ -1080,6 +1085,25 @@ enum TaxiPathNodeFlags
TAXI_PATH_NODE_FLAG_STOP = 0x2
};
+enum UiMapSystem : int8
+{
+ UI_MAP_SYSTEM_WORLD = 0,
+ UI_MAP_SYSTEM_TAXI = 1,
+ UI_MAP_SYSTEM_ADVENTURE = 2,
+ MAX_UI_MAP_SYSTEM = 3
+};
+
+enum UiMapType : int8
+{
+ UI_MAP_TYPE_COSMIC = 0,
+ UI_MAP_TYPE_WORLD = 1,
+ UI_MAP_TYPE_CONTINENT = 2,
+ UI_MAP_TYPE_ZONE = 3,
+ UI_MAP_TYPE_DUNGEON = 4,
+ UI_MAP_TYPE_MICRO = 5,
+ UI_MAP_TYPE_ORPHAN = 6,
+};
+
enum VehicleSeatFlags
{
VEHICLE_SEAT_FLAG_HAS_LOWER_ANIM_FOR_ENTER = 0x00000001,
diff --git a/src/server/game/DataStores/GameTables.cpp b/src/server/game/DataStores/GameTables.cpp
index 0dd01aa3930..d6142ccf065 100644
--- a/src/server/game/DataStores/GameTables.cpp
+++ b/src/server/game/DataStores/GameTables.cpp
@@ -127,6 +127,7 @@ void LoadGameTables(std::string const& dataPath)
LOAD_GT(sNpcDamageByClassGameTable[4], "NpcDamageByClassExp4.txt");
LOAD_GT(sNpcDamageByClassGameTable[5], "NpcDamageByClassExp5.txt");
LOAD_GT(sNpcDamageByClassGameTable[6], "NpcDamageByClassExp6.txt");
+ LOAD_GT(sNpcDamageByClassGameTable[7], "NpcDamageByClassExp7.txt");
LOAD_GT(sNpcManaCostScalerGameTable, "NPCManaCostScaler.txt");
LOAD_GT(sNpcTotalHpGameTable[0], "NpcTotalHp.txt");
LOAD_GT(sNpcTotalHpGameTable[1], "NpcTotalHpExp1.txt");
@@ -135,6 +136,7 @@ void LoadGameTables(std::string const& dataPath)
LOAD_GT(sNpcTotalHpGameTable[4], "NpcTotalHpExp4.txt");
LOAD_GT(sNpcTotalHpGameTable[5], "NpcTotalHpExp5.txt");
LOAD_GT(sNpcTotalHpGameTable[6], "NpcTotalHpExp6.txt");
+ LOAD_GT(sNpcTotalHpGameTable[7], "NpcTotalHpExp7.txt");
LOAD_GT(sSpellScalingGameTable, "SpellScaling.txt");
LOAD_GT(sXpGameTable, "xp.txt");
diff --git a/src/server/game/Entities/Taxi/TaxiPathGraph.cpp b/src/server/game/Entities/Taxi/TaxiPathGraph.cpp
index 3ec90f577a7..b60c1780fd3 100644
--- a/src/server/game/Entities/Taxi/TaxiPathGraph.cpp
+++ b/src/server/game/Entities/Taxi/TaxiPathGraph.cpp
@@ -76,6 +76,12 @@ std::size_t TaxiPathGraph::GetVertexCount()
return std::max(boost::num_vertices(m_graph), m_vertices.size());
}
+void GetTaxiMapPosition(DBCPosition3D const& position, int32 mapId, DBCPosition2D* uiMapPosition, int32* uiMapId)
+{
+ if (!DB2Manager::GetUiMapPosition(position.X, position.Y, position.Z, mapId, 0, 0, 0, UI_MAP_SYSTEM_ADVENTURE, false, uiMapId, uiMapPosition))
+ DB2Manager::GetUiMapPosition(position.X, position.Y, position.Z, mapId, 0, 0, 0, UI_MAP_SYSTEM_TAXI, false, uiMapId, uiMapPosition);
+}
+
void TaxiPathGraph::AddVerticeAndEdgeFromNodeInfo(TaxiNodesEntry const* from, TaxiNodesEntry const* to, uint32 pathId, std::vector<std::pair<edge, EdgeCost>>& edges)
{
if (from != to)
@@ -104,22 +110,21 @@ void TaxiPathGraph::AddVerticeAndEdgeFromNodeInfo(TaxiNodesEntry const* from, Ta
if (nodes[i - 1]->Flags & TAXI_PATH_NODE_FLAG_TELEPORT)
continue;
- uint32 map1, map2;
+ int32 uiMap1, uiMap2;
DBCPosition2D pos1, pos2;
- DB2Manager::DeterminaAlternateMapPosition(nodes[i - 1]->ContinentID, nodes[i - 1]->Loc.X, nodes[i - 1]->Loc.Y, nodes[i - 1]->Loc.Z, &map1, &pos1);
- DB2Manager::DeterminaAlternateMapPosition(nodes[i]->ContinentID, nodes[i]->Loc.X, nodes[i]->Loc.Y, nodes[i]->Loc.Z, &map2, &pos2);
+ GetTaxiMapPosition(nodes[i - 1]->Loc, nodes[i - 1]->ContinentID, &pos1, &uiMap1);
+ GetTaxiMapPosition(nodes[i]->Loc, nodes[i]->ContinentID, &pos2, &uiMap2);
- if (map1 != map2)
+ if (uiMap1 != uiMap2)
continue;
totalDist += std::sqrt(
std::pow(pos2.X - pos1.X, 2) +
- std::pow(pos2.Y - pos1.Y, 2) +
- std::pow(nodes[i]->Loc.Z - nodes[i - 1]->Loc.Z, 2));
+ std::pow(pos2.Y - pos1.Y, 2));
}
- uint32 dist = uint32(totalDist);
+ uint32 dist = uint32(totalDist * 32767.0f);
if (dist > 0xFFFF)
dist = 0xFFFF;
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 746782fa1ec..53dbcb38f33 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -9581,7 +9581,7 @@ void ObjectMgr::LoadTerrainWorldMaps()
uint32 oldMSTime = getMSTime();
// 0 1
- QueryResult result = WorldDatabase.Query("SELECT TerrainSwapMap, WorldMapArea FROM `terrain_worldmap`");
+ QueryResult result = WorldDatabase.Query("SELECT TerrainSwapMap, UiMapPhaseId FROM `terrain_worldmap`");
if (!result)
{
@@ -9595,7 +9595,7 @@ void ObjectMgr::LoadTerrainWorldMaps()
Field* fields = result->Fetch();
uint32 mapId = fields[0].GetUInt32();
- uint32 worldMapArea = fields[1].GetUInt32();
+ uint32 uiMapPhaseId = fields[1].GetUInt32();
if (!sMapStore.LookupEntry(mapId))
{
@@ -9603,15 +9603,15 @@ void ObjectMgr::LoadTerrainWorldMaps()
continue;
}
- if (!sWorldMapAreaStore.LookupEntry(worldMapArea))
+ if (!sDB2Manager.IsUiMapPhase(uiMapPhaseId))
{
- TC_LOG_ERROR("sql.sql", "WorldMapArea %u defined in `terrain_worldmap` does not exist, skipped.", worldMapArea);
+ TC_LOG_ERROR("sql.sql", "Phase %u defined in `terrain_worldmap` is not a valid terrain swap phase, skipped.", uiMapPhaseId);
continue;
}
TerrainSwapInfo* terrainSwapInfo = &_terrainSwapInfoById[mapId];
terrainSwapInfo->Id = mapId;
- terrainSwapInfo->UiWorldMapAreaIDSwaps.push_back(worldMapArea);
+ terrainSwapInfo->UiMapPhaseIDs.push_back(uiMapPhaseId);
++count;
} while (result->NextRow());
@@ -9758,11 +9758,6 @@ TerrainSwapInfo const* ObjectMgr::GetTerrainSwapInfo(uint32 terrainSwapId) const
return Trinity::Containers::MapGetValuePtr(_terrainSwapInfoById, terrainSwapId);
}
-std::vector<TerrainSwapInfo*> const* ObjectMgr::GetTerrainSwapsForMap(uint32 mapId) const
-{
- return Trinity::Containers::MapGetValuePtr(_terrainSwapInfoByMap, mapId);
-}
-
GameObjectTemplate const* ObjectMgr::GetGameObjectTemplate(uint32 entry) const
{
GameObjectTemplateContainer::const_iterator itr = _gameObjectTemplateStore.find(entry);
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index d8a667210c1..51cbe07bcee 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -885,7 +885,7 @@ typedef std::unordered_map<uint64, DungeonEncounterList> DungeonEncounterContain
struct TerrainSwapInfo
{
uint32 Id;
- std::vector<uint32> UiWorldMapAreaIDSwaps;
+ std::vector<uint32> UiMapPhaseIDs;
};
struct PhaseInfoStruct
@@ -1666,7 +1666,7 @@ class TC_GAME_API ObjectMgr
PhaseInfoStruct const* GetPhaseInfo(uint32 phaseId) const;
std::vector<PhaseAreaInfo> const* GetPhasesForArea(uint32 areaId) const;
TerrainSwapInfo const* GetTerrainSwapInfo(uint32 terrainSwapId) const;
- std::vector<TerrainSwapInfo*> const* GetTerrainSwapsForMap(uint32 mapId) const;
+ std::unordered_map<uint32, std::vector<TerrainSwapInfo*>> const& GetTerrainSwaps() const { return _terrainSwapInfoByMap; }
private:
std::unordered_map<uint32, PhaseInfoStruct> _phaseInfoById;
diff --git a/src/server/game/Phasing/PhaseShift.cpp b/src/server/game/Phasing/PhaseShift.cpp
index b2885ae15bb..b7df2e5cd13 100644
--- a/src/server/game/Phasing/PhaseShift.cpp
+++ b/src/server/game/Phasing/PhaseShift.cpp
@@ -60,23 +60,23 @@ PhaseShift::EraseResult<PhaseShift::VisibleMapIdContainer> PhaseShift::RemoveVis
return { VisibleMapIds.end(), false };
}
-bool PhaseShift::AddUiWorldMapAreaIdSwap(uint32 uiWorldMapAreaId, int32 references /*= 1*/)
+bool PhaseShift::AddUiMapPhaseId(uint32 uiMapPhaseId, int32 references /*= 1*/)
{
- auto insertResult = UiWorldMapAreaIdSwaps.emplace(uiWorldMapAreaId, UiWorldMapAreaIdSwapRef{ 0 });
+ auto insertResult = UiMapPhaseIds.emplace(uiMapPhaseId, UiMapPhaseIdRef{ 0 });
insertResult.first->second.References += references;
return insertResult.second;
}
-PhaseShift::EraseResult<PhaseShift::UiWorldMapAreaIdSwapContainer> PhaseShift::RemoveUiWorldMapAreaIdSwap(uint32 uiWorldMapAreaId)
+PhaseShift::EraseResult<PhaseShift::UiMapPhaseIdContainer> PhaseShift::RemoveUiMapPhaseId(uint32 uiMapPhaseId)
{
- auto itr = UiWorldMapAreaIdSwaps.find(uiWorldMapAreaId);
- if (itr != UiWorldMapAreaIdSwaps.end())
+ auto itr = UiMapPhaseIds.find(uiMapPhaseId);
+ if (itr != UiMapPhaseIds.end())
{
if (!--itr->second.References)
- return { UiWorldMapAreaIdSwaps.erase(itr), true };
+ return { UiMapPhaseIds.erase(itr), true };
return { itr, false };
}
- return { UiWorldMapAreaIdSwaps.end(), false };
+ return { UiMapPhaseIds.end(), false };
}
void PhaseShift::Clear()
@@ -84,7 +84,7 @@ void PhaseShift::Clear()
ClearPhases();
PersonalGuid.Clear();
VisibleMapIds.clear();
- UiWorldMapAreaIdSwaps.clear();
+ UiMapPhaseIds.clear();
}
void PhaseShift::ClearPhases()
diff --git a/src/server/game/Phasing/PhaseShift.h b/src/server/game/Phasing/PhaseShift.h
index f1929168613..c15bf4100a2 100644
--- a/src/server/game/Phasing/PhaseShift.h
+++ b/src/server/game/Phasing/PhaseShift.h
@@ -68,7 +68,7 @@ public:
int32 References = 0;
TerrainSwapInfo const* VisibleMapInfo = nullptr;
};
- struct UiWorldMapAreaIdSwapRef
+ struct UiMapPhaseIdRef
{
int32 References = 0;
};
@@ -80,7 +80,7 @@ public:
};
typedef boost::container::flat_set<PhaseRef> PhaseContainer;
typedef std::map<uint32, VisibleMapIdRef> VisibleMapIdContainer;
- typedef std::map<uint32, UiWorldMapAreaIdSwapRef> UiWorldMapAreaIdSwapContainer;
+ typedef std::map<uint32, UiMapPhaseIdRef> UiMapPhaseIdContainer;
PhaseShift() : Flags(PhaseShiftFlags::Unphased), NonCosmeticReferences(0), CosmeticReferences(0), DefaultReferences(0), IsDbPhaseShift(false) { }
@@ -94,10 +94,10 @@ public:
bool HasVisibleMapId(uint32 visibleMapId) const { return VisibleMapIds.find(visibleMapId) != VisibleMapIds.end(); }
VisibleMapIdContainer const& GetVisibleMapIds() const { return VisibleMapIds; }
- bool AddUiWorldMapAreaIdSwap(uint32 uiWorldMapAreaId, int32 references = 1);
- EraseResult<UiWorldMapAreaIdSwapContainer> RemoveUiWorldMapAreaIdSwap(uint32 uiWorldMapAreaId);
- bool HasUiWorldMapAreaIdSwap(uint32 uiWorldMapAreaId) const { return UiWorldMapAreaIdSwaps.find(uiWorldMapAreaId) != UiWorldMapAreaIdSwaps.end(); }
- UiWorldMapAreaIdSwapContainer const& GetUiWorldMapAreaIdSwaps() const { return UiWorldMapAreaIdSwaps; }
+ bool AddUiMapPhaseId(uint32 uiMapPhaseId, int32 references = 1);
+ EraseResult<UiMapPhaseIdContainer> RemoveUiMapPhaseId(uint32 uiMapPhaseId);
+ bool HasUiMapPhaseId(uint32 uiMapPhaseId) const { return UiMapPhaseIds.find(uiMapPhaseId) != UiMapPhaseIds.end(); }
+ UiMapPhaseIdContainer const& GetUiWorldMapAreaIdSwaps() const { return UiMapPhaseIds; }
void Clear();
void ClearPhases();
@@ -111,7 +111,7 @@ protected:
ObjectGuid PersonalGuid;
PhaseContainer Phases;
VisibleMapIdContainer VisibleMapIds;
- UiWorldMapAreaIdSwapContainer UiWorldMapAreaIdSwaps;
+ UiMapPhaseIdContainer UiMapPhaseIds;
void ModifyPhasesReferences(PhaseContainer::iterator itr, int32 references);
void UpdateUnphasedFlag();
diff --git a/src/server/game/Phasing/PhasingHandler.cpp b/src/server/game/Phasing/PhasingHandler.cpp
index e60c87b4816..1cce3361654 100644
--- a/src/server/game/Phasing/PhasingHandler.cpp
+++ b/src/server/game/Phasing/PhasingHandler.cpp
@@ -146,8 +146,8 @@ void PhasingHandler::AddVisibleMapId(WorldObject* object, uint32 visibleMapId)
TerrainSwapInfo const* terrainSwapInfo = sObjectMgr->GetTerrainSwapInfo(visibleMapId);
bool changed = object->GetPhaseShift().AddVisibleMapId(visibleMapId, terrainSwapInfo);
- for (uint32 uiWorldMapAreaIDSwap : terrainSwapInfo->UiWorldMapAreaIDSwaps)
- changed = object->GetPhaseShift().AddUiWorldMapAreaIdSwap(uiWorldMapAreaIDSwap) || changed;
+ for (uint32 uiMapPhaseId : terrainSwapInfo->UiMapPhaseIDs)
+ changed = object->GetPhaseShift().AddUiMapPhaseId(uiMapPhaseId) || changed;
if (Unit* unit = object->ToUnit())
{
@@ -165,8 +165,8 @@ void PhasingHandler::RemoveVisibleMapId(WorldObject* object, uint32 visibleMapId
TerrainSwapInfo const* terrainSwapInfo = sObjectMgr->GetTerrainSwapInfo(visibleMapId);
bool changed = object->GetPhaseShift().RemoveVisibleMapId(visibleMapId).Erased;
- for (uint32 uiWorldMapAreaIDSwap : terrainSwapInfo->UiWorldMapAreaIDSwaps)
- changed = object->GetPhaseShift().RemoveUiWorldMapAreaIdSwap(uiWorldMapAreaIDSwap).Erased || changed;
+ for (uint32 uiWorldMapAreaIDSwap : terrainSwapInfo->UiMapPhaseIDs)
+ changed = object->GetPhaseShift().RemoveUiMapPhaseId(uiWorldMapAreaIDSwap).Erased || changed;
if (Unit* unit = object->ToUnit())
{
@@ -198,18 +198,21 @@ void PhasingHandler::OnMapChange(WorldObject* object)
ConditionSourceInfo srcInfo = ConditionSourceInfo(object);
object->GetPhaseShift().VisibleMapIds.clear();
- object->GetPhaseShift().UiWorldMapAreaIdSwaps.clear();
+ object->GetPhaseShift().UiMapPhaseIds.clear();
object->GetSuppressedPhaseShift().VisibleMapIds.clear();
- if (std::vector<TerrainSwapInfo*> const* visibleMapIds = sObjectMgr->GetTerrainSwapsForMap(object->GetMapId()))
+ for (auto visibleMapPair : sObjectMgr->GetTerrainSwaps())
{
- for (TerrainSwapInfo const* visibleMapInfo : *visibleMapIds)
+ for (TerrainSwapInfo const* visibleMapInfo : visibleMapPair.second)
{
if (sConditionMgr->IsObjectMeetingNotGroupedConditions(CONDITION_SOURCE_TYPE_TERRAIN_SWAP, visibleMapInfo->Id, srcInfo))
{
- phaseShift.AddVisibleMapId(visibleMapInfo->Id, visibleMapInfo);
- for (uint32 uiWorldMapAreaIdSwap : visibleMapInfo->UiWorldMapAreaIDSwaps)
- phaseShift.AddUiWorldMapAreaIdSwap(uiWorldMapAreaIdSwap);
+ if (visibleMapPair.first == object->GetMapId())
+ phaseShift.AddVisibleMapId(visibleMapInfo->Id, visibleMapInfo);
+
+ // ui map is visible on all maps
+ for (uint32 uiMapPhaseId : visibleMapInfo->UiMapPhaseIDs)
+ phaseShift.AddUiMapPhaseId(uiMapPhaseId);
}
else
suppressedPhaseShift.AddVisibleMapId(visibleMapInfo->Id, visibleMapInfo);
@@ -317,8 +320,8 @@ void PhasingHandler::OnConditionChange(WorldObject* object)
if (!sConditionMgr->IsObjectMeetingNotGroupedConditions(CONDITION_SOURCE_TYPE_TERRAIN_SWAP, itr->first, srcInfo))
{
newSuppressions.AddVisibleMapId(itr->first, itr->second.VisibleMapInfo, itr->second.References);
- for (uint32 uiWorldMapAreaIdSwap : itr->second.VisibleMapInfo->UiWorldMapAreaIDSwaps)
- changed = phaseShift.RemoveUiWorldMapAreaIdSwap(uiWorldMapAreaIdSwap).Erased || changed;
+ for (uint32 uiMapPhaseId : itr->second.VisibleMapInfo->UiMapPhaseIDs)
+ changed = phaseShift.RemoveUiMapPhaseId(uiMapPhaseId).Erased || changed;
itr = phaseShift.VisibleMapIds.erase(itr);
}
@@ -331,8 +334,8 @@ void PhasingHandler::OnConditionChange(WorldObject* object)
if (sConditionMgr->IsObjectMeetingNotGroupedConditions(CONDITION_SOURCE_TYPE_TERRAIN_SWAP, itr->first, srcInfo))
{
changed = phaseShift.AddVisibleMapId(itr->first, itr->second.VisibleMapInfo, itr->second.References) || changed;
- for (uint32 uiWorldMapAreaIdSwap : itr->second.VisibleMapInfo->UiWorldMapAreaIDSwaps)
- changed = phaseShift.AddUiWorldMapAreaIdSwap(uiWorldMapAreaIdSwap) || changed;
+ for (uint32 uiMapPhaseId : itr->second.VisibleMapInfo->UiMapPhaseIDs)
+ changed = phaseShift.AddUiMapPhaseId(uiMapPhaseId) || changed;
itr = suppressedPhaseShift.VisibleMapIds.erase(itr);
}
@@ -403,9 +406,9 @@ void PhasingHandler::SendToPlayer(Player const* player, PhaseShift const& phaseS
phaseShiftChange.VisibleMapIDs.reserve(phaseShift.VisibleMapIds.size());
std::transform(phaseShift.VisibleMapIds.begin(), phaseShift.VisibleMapIds.end(), std::back_inserter(phaseShiftChange.VisibleMapIDs),
[](PhaseShift::VisibleMapIdContainer::value_type const& visibleMapId) { return visibleMapId.first; });
- phaseShiftChange.UiWorldMapAreaIDSwaps.reserve(phaseShift.UiWorldMapAreaIdSwaps.size());
- std::transform(phaseShift.UiWorldMapAreaIdSwaps.begin(), phaseShift.UiWorldMapAreaIdSwaps.end(), std::back_inserter(phaseShiftChange.UiWorldMapAreaIDSwaps),
- [](PhaseShift::UiWorldMapAreaIdSwapContainer::value_type const& uiWorldMapAreaIdSwap) { return uiWorldMapAreaIdSwap.first; });
+ phaseShiftChange.UiMapPhaseIDs.reserve(phaseShift.UiMapPhaseIds.size());
+ std::transform(phaseShift.UiMapPhaseIds.begin(), phaseShift.UiMapPhaseIds.end(), std::back_inserter(phaseShiftChange.UiMapPhaseIDs),
+ [](PhaseShift::UiMapPhaseIdContainer::value_type const& uiWorldMapAreaIdSwap) { return uiWorldMapAreaIdSwap.first; });
player->SendDirectMessage(phaseShiftChange.Write());
}
@@ -545,10 +548,10 @@ void PhasingHandler::PrintToChat(ChatHandler* chat, PhaseShift const& phaseShift
chat->PSendSysMessage(LANG_PHASESHIFT_VISIBLE_MAP_IDS, visibleMapIds.str().c_str());
}
- if (!phaseShift.UiWorldMapAreaIdSwaps.empty())
+ if (!phaseShift.UiMapPhaseIds.empty())
{
std::ostringstream uiWorldMapAreaIdSwaps;
- for (PhaseShift::UiWorldMapAreaIdSwapContainer::value_type const& uiWorldMapAreaIdSwap : phaseShift.UiWorldMapAreaIdSwaps)
+ for (PhaseShift::UiMapPhaseIdContainer::value_type const& uiWorldMapAreaIdSwap : phaseShift.UiMapPhaseIds)
uiWorldMapAreaIdSwaps << uiWorldMapAreaIdSwap.first << ',' << ' ';
chat->PSendSysMessage(LANG_PHASESHIFT_UI_WORLD_MAP_AREA_SWAPS, uiWorldMapAreaIdSwaps.str().c_str());
diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp
index a03f1ff35fc..4399b0d3924 100644
--- a/src/server/game/Server/Packets/MiscPackets.cpp
+++ b/src/server/game/Server/Packets/MiscPackets.cpp
@@ -404,11 +404,11 @@ WorldPacket const* WorldPackets::Misc::PhaseShiftChange::Write()
_worldPacket << uint32(PreloadMapIDs.size() * 2); // size in bytes
for (uint16 preloadMapId : PreloadMapIDs)
- _worldPacket << uint16(preloadMapId); // Inactive terrain swap map id
+ _worldPacket << uint16(preloadMapId); // Inactive terrain swap map id
- _worldPacket << uint32(UiWorldMapAreaIDSwaps.size() * 2); // size in bytes
- for (uint16 uiWorldMapAreaIDSwap : UiWorldMapAreaIDSwaps)
- _worldPacket << uint16(uiWorldMapAreaIDSwap); // UI map id, WorldMapArea.db2, controls map display
+ _worldPacket << uint32(UiMapPhaseIDs.size() * 2); // size in bytes
+ for (uint16 uiMapPhaseId : UiMapPhaseIDs)
+ _worldPacket << uint16(uiMapPhaseId); // phase id, controls only map display (visible on all maps)
return &_worldPacket;
}
diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h
index 26affbaf934..d6ab86d5e2f 100644
--- a/src/server/game/Server/Packets/MiscPackets.h
+++ b/src/server/game/Server/Packets/MiscPackets.h
@@ -551,7 +551,7 @@ namespace WorldPackets
ObjectGuid Client;
PhaseShiftData Phaseshift;
std::vector<uint16> PreloadMapIDs;
- std::vector<uint16> UiWorldMapAreaIDSwaps;
+ std::vector<uint16> UiMapPhaseIDs;
std::vector<uint16> VisibleMapIDs;
};
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 4a8695a60f5..1c935e62bd5 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -1879,10 +1879,31 @@ SpellCastResult SpellInfo::CheckLocation(uint32 map_id, uint32 zone_id, uint32 a
// continent limitation (virtual continent)
if (HasAttribute(SPELL_ATTR4_CAST_ONLY_IN_OUTLAND))
{
- uint32 v_map = sDB2Manager.GetVirtualMapForMapAndZone(map_id, zone_id);
- MapEntry const* mapEntry = sMapStore.LookupEntry(v_map);
- if (!mapEntry || mapEntry->ExpansionID < 1 || !mapEntry->IsContinent())
+ uint32 mountFlags = 0;
+ if (player && player->HasAuraType(SPELL_AURA_MOUNT_RESTRICTIONS))
+ {
+ for (AuraEffect const* auraEffect : player->GetAuraEffectsByType(SPELL_AURA_MOUNT_RESTRICTIONS))
+ mountFlags |= auraEffect->GetMiscValue();
+ }
+ else if (AreaTableEntry const* areaTable = sAreaTableStore.LookupEntry(area_id))
+ mountFlags = areaTable->MountFlags;
+
+ if (!(mountFlags & AREA_MOUNT_FLAG_FLYING_ALLOWED))
return SPELL_FAILED_INCORRECT_AREA;
+
+ if (player)
+ {
+ uint32 mapToCheck = map_id;
+ if (MapEntry const* mapEntry = sMapStore.LookupEntry(map_id))
+ mapToCheck = mapEntry->CosmeticParentMapID;
+
+ if ((mapToCheck == 1116 || mapToCheck == 1464) && !player->HasSpell(191645)) // Draenor Pathfinder
+ return SPELL_FAILED_INCORRECT_AREA;
+ else if (mapToCheck == 1220 && !player->HasSpell(233368)) // Broken Isles Pathfinder
+ return SPELL_FAILED_INCORRECT_AREA;
+ else if ((mapToCheck == 1642 || mapToCheck == 1643) && !player->HasSpell(278833)) // Battle for Azeroth Pathfinder
+ return SPELL_FAILED_INCORRECT_AREA;
+ }
}
// raid instance limitation