diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/database/Database/Implementation/HotfixDatabase.cpp | 697 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/HotfixDatabase.h | 34 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2LoadInfo.h | 1690 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.cpp | 557 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.h | 8 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Structure.h | 49 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 30 | ||||
-rw-r--r-- | src/server/game/DataStores/GameTables.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Taxi/TaxiPathGraph.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 15 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 4 | ||||
-rw-r--r-- | src/server/game/Phasing/PhaseShift.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Phasing/PhaseShift.h | 14 | ||||
-rw-r--r-- | src/server/game/Phasing/PhasingHandler.cpp | 41 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MiscPackets.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MiscPackets.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 27 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_debug.cpp | 2 |
18 files changed, 1902 insertions, 1313 deletions
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index 8c1bb487363..a0646a0b1c1 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -32,9 +32,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() m_stmts.resize(MAX_HOTFIXDATABASE_STATEMENTS); // Achievement.db2 - PrepareStatement(HOTFIX_SEL_ACHIEVEMENT, "SELECT Title, Description, Reward, Flags, InstanceID, Supercedes, Category, UiOrder, SharesCriteria, " - "Faction, Points, MinimumCriteria, ID, IconFileID, CriteriaTree FROM achievement ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_ACHIEVEMENT, "SELECT ID, Title_lang, Description_lang, Reward_lang FROM achievement_locale WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ACHIEVEMENT, "SELECT Description, Title, Reward, ID, InstanceID, Faction, Supercedes, Category, MinimumCriteria, " + "Points, Flags, UiOrder, IconFileID, CriteriaTree, SharesCriteria FROM achievement ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_ACHIEVEMENT, "SELECT ID, Description_lang, Title_lang, Reward_lang FROM achievement_locale WHERE locale = ?", CONNECTION_SYNCH); // AnimKit.db2 PrepareStatement(HOTFIX_SEL_ANIM_KIT, "SELECT ID, OneShotDuration, OneShotStopAnimKitID, LowDefAnimKitID FROM anim_kit ORDER BY ID DESC", CONNECTION_SYNCH); @@ -43,34 +43,34 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_AREA_GROUP_MEMBER, "SELECT ID, AreaID, AreaGroupID FROM area_group_member ORDER BY ID DESC", CONNECTION_SYNCH); // AreaTable.db2 - PrepareStatement(HOTFIX_SEL_AREA_TABLE, "SELECT ID, ZoneName, AreaName, Flags1, Flags2, AmbientMultiplier, ContinentID, ParentAreaID, AreaBit, " - "AmbienceID, ZoneMusic, IntroSound, LiquidTypeID1, LiquidTypeID2, LiquidTypeID3, LiquidTypeID4, UwZoneMusic, UwAmbience, " - "PvpCombatWorldStateID, SoundProviderPref, SoundProviderPrefUnderwater, ExplorationLevel, FactionGroupMask, MountFlags, " - "WildBattlePetLevelMin, WildBattlePetLevelMax, WindSettingsID, UwIntroSound FROM area_table ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_AREA_TABLE, "SELECT ID, ZoneName, AreaName, ContinentID, ParentAreaID, AreaBit, SoundProviderPref, " + "SoundProviderPrefUnderwater, AmbienceID, UwAmbience, ZoneMusic, UwZoneMusic, ExplorationLevel, IntroSound, UwIntroSound, FactionGroupMask, " + "AmbientMultiplier, MountFlags, PvpCombatWorldStateID, WildBattlePetLevelMin, WildBattlePetLevelMax, WindSettingsID, Flags1, Flags2, " + "LiquidTypeID1, LiquidTypeID2, LiquidTypeID3, LiquidTypeID4 FROM area_table ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_AREA_TABLE, "SELECT ID, AreaName_lang FROM area_table_locale WHERE locale = ?", CONNECTION_SYNCH); // AreaTrigger.db2 - PrepareStatement(HOTFIX_SEL_AREA_TRIGGER, "SELECT PosX, PosY, PosZ, Radius, BoxLength, BoxWidth, BoxHeight, BoxYaw, ContinentID, PhaseID, " - "PhaseGroupID, ShapeID, AreaTriggerActionSetID, PhaseUseFlags, ShapeType, Flags, ID FROM area_trigger ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_AREA_TRIGGER, "SELECT PosX, PosY, PosZ, ID, ContinentID, PhaseUseFlags, PhaseID, PhaseGroupID, Radius, BoxLength, " + "BoxWidth, BoxHeight, BoxYaw, ShapeType, ShapeID, AreaTriggerActionSetID, Flags FROM area_trigger ORDER BY ID DESC", CONNECTION_SYNCH); // ArmorLocation.db2 PrepareStatement(HOTFIX_SEL_ARMOR_LOCATION, "SELECT ID, Clothmodifier, Leathermodifier, Chainmodifier, Platemodifier, Modifier FROM armor_location" " ORDER BY ID DESC", CONNECTION_SYNCH); // Artifact.db2 - PrepareStatement(HOTFIX_SEL_ARTIFACT, "SELECT ID, Name, UiBarOverlayColor, UiBarBackgroundColor, UiNameColor, UiTextureKitID, " - "ChrSpecializationID, ArtifactCategoryID, Flags, UiModelSceneID, SpellVisualKitID FROM artifact ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ARTIFACT, "SELECT Name, ID, UiTextureKitID, UiNameColor, UiBarOverlayColor, UiBarBackgroundColor, " + "ChrSpecializationID, Flags, ArtifactCategoryID, UiModelSceneID, SpellVisualKitID FROM artifact ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ARTIFACT, "SELECT ID, Name_lang FROM artifact_locale WHERE locale = ?", CONNECTION_SYNCH); // ArtifactAppearance.db2 - PrepareStatement(HOTFIX_SEL_ARTIFACT_APPEARANCE, "SELECT Name, UiSwatchColor, UiModelSaturation, UiModelOpacity, OverrideShapeshiftDisplayID, " - "ArtifactAppearanceSetID, UiCameraID, DisplayIndex, ItemAppearanceModifierID, Flags, OverrideShapeshiftFormID, ID, UnlockPlayerConditionID, " - "UiItemAppearanceID, UiAltItemAppearanceID FROM artifact_appearance ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ARTIFACT_APPEARANCE, "SELECT Name, ID, ArtifactAppearanceSetID, DisplayIndex, UnlockPlayerConditionID, " + "ItemAppearanceModifierID, UiSwatchColor, UiModelSaturation, UiModelOpacity, OverrideShapeshiftFormID, OverrideShapeshiftDisplayID, " + "UiItemAppearanceID, UiAltItemAppearanceID, Flags, UiCameraID FROM artifact_appearance ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ARTIFACT_APPEARANCE, "SELECT ID, Name_lang FROM artifact_appearance_locale WHERE locale = ?", CONNECTION_SYNCH); // ArtifactAppearanceSet.db2 - PrepareStatement(HOTFIX_SEL_ARTIFACT_APPEARANCE_SET, "SELECT Name, Description, UiCameraID, AltHandUICameraID, DisplayIndex, " - "ForgeAttachmentOverride, Flags, ID, ArtifactID FROM artifact_appearance_set ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ARTIFACT_APPEARANCE_SET, "SELECT Name, Description, ID, DisplayIndex, UiCameraID, AltHandUICameraID, " + "ForgeAttachmentOverride, Flags, ArtifactID FROM artifact_appearance_set ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ARTIFACT_APPEARANCE_SET, "SELECT ID, Name_lang, Description_lang FROM artifact_appearance_set_locale" " WHERE locale = ?", CONNECTION_SYNCH); @@ -78,8 +78,8 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_ARTIFACT_CATEGORY, "SELECT ID, XpMultCurrencyID, XpMultCurveID FROM artifact_category ORDER BY ID DESC", CONNECTION_SYNCH); // ArtifactPower.db2 - PrepareStatement(HOTFIX_SEL_ARTIFACT_POWER, "SELECT PosX, PosY, ArtifactID, Flags, MaxPurchasableRank, Tier, ID, Label FROM artifact_power" - " ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ARTIFACT_POWER, "SELECT DisplayPosX, DisplayPosY, ID, ArtifactID, MaxPurchasableRank, Label, Flags, Tier" + " FROM artifact_power ORDER BY ID DESC", CONNECTION_SYNCH); // ArtifactPowerLink.db2 PrepareStatement(HOTFIX_SEL_ARTIFACT_POWER_LINK, "SELECT ID, PowerA, PowerB FROM artifact_power_link ORDER BY ID DESC", CONNECTION_SYNCH); @@ -88,7 +88,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_ARTIFACT_POWER_PICKER, "SELECT ID, PlayerConditionID FROM artifact_power_picker ORDER BY ID DESC", CONNECTION_SYNCH); // ArtifactPowerRank.db2 - PrepareStatement(HOTFIX_SEL_ARTIFACT_POWER_RANK, "SELECT ID, SpellID, AuraPointsOverride, ItemBonusListID, RankIndex, ArtifactPowerID" + PrepareStatement(HOTFIX_SEL_ARTIFACT_POWER_RANK, "SELECT ID, RankIndex, SpellID, ItemBonusListID, AuraPointsOverride, ArtifactPowerID" " FROM artifact_power_rank ORDER BY ID DESC", CONNECTION_SYNCH); // ArtifactQuestXp.db2 @@ -100,7 +100,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() "MinimumEmpowerKnowledge FROM artifact_tier ORDER BY ID DESC", CONNECTION_SYNCH); // ArtifactUnlock.db2 - PrepareStatement(HOTFIX_SEL_ARTIFACT_UNLOCK, "SELECT ID, ItemBonusListID, PowerRank, PowerID, PlayerConditionID, ArtifactID FROM artifact_unlock" + PrepareStatement(HOTFIX_SEL_ARTIFACT_UNLOCK, "SELECT ID, PowerID, PowerRank, ItemBonusListID, PlayerConditionID, ArtifactID FROM artifact_unlock" " ORDER BY ID DESC", CONNECTION_SYNCH); // AuctionHouse.db2 @@ -114,7 +114,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_BANNED_ADDONS, "SELECT ID, Name, Version, Flags FROM banned_addons ORDER BY ID DESC", CONNECTION_SYNCH); // BarberShopStyle.db2 - PrepareStatement(HOTFIX_SEL_BARBER_SHOP_STYLE, "SELECT DisplayName, Description, CostModifier, Type, Race, Sex, Data, ID FROM barber_shop_style" + PrepareStatement(HOTFIX_SEL_BARBER_SHOP_STYLE, "SELECT DisplayName, Description, ID, Type, CostModifier, Race, Sex, Data FROM barber_shop_style" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_BARBER_SHOP_STYLE, "SELECT ID, DisplayName_lang, Description_lang FROM barber_shop_style_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -122,50 +122,50 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_BATTLE_PET_BREED_QUALITY, "SELECT ID, StateMultiplier, QualityEnum FROM battle_pet_breed_quality ORDER BY ID DESC", CONNECTION_SYNCH); // BattlePetBreedState.db2 - PrepareStatement(HOTFIX_SEL_BATTLE_PET_BREED_STATE, "SELECT ID, Value, BattlePetStateID, BattlePetBreedID FROM battle_pet_breed_state" + PrepareStatement(HOTFIX_SEL_BATTLE_PET_BREED_STATE, "SELECT ID, BattlePetStateID, Value, BattlePetBreedID FROM battle_pet_breed_state" " ORDER BY ID DESC", CONNECTION_SYNCH); // BattlePetSpecies.db2 - PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT SourceText, Description, CreatureID, IconFileDataID, SummonSpellID, Flags, PetTypeEnum, " - "SourceTypeEnum, ID, CardUIModelSceneID, LoadoutUIModelSceneID FROM battle_pet_species ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT ID, SourceText_lang, Description_lang FROM battle_pet_species_locale WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT Description, SourceText, ID, CreatureID, SummonSpellID, IconFileDataID, PetTypeEnum, " + "Flags, SourceTypeEnum, CardUIModelSceneID, LoadoutUIModelSceneID FROM battle_pet_species ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_BATTLE_PET_SPECIES, "SELECT ID, Description_lang, SourceText_lang FROM battle_pet_species_locale WHERE locale = ?", CONNECTION_SYNCH); // BattlePetSpeciesState.db2 - PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES_STATE, "SELECT ID, Value, BattlePetStateID, BattlePetSpeciesID FROM battle_pet_species_state" + PrepareStatement(HOTFIX_SEL_BATTLE_PET_SPECIES_STATE, "SELECT ID, BattlePetStateID, Value, BattlePetSpeciesID FROM battle_pet_species_state" " ORDER BY ID DESC", CONNECTION_SYNCH); // BattlemasterList.db2 - PrepareStatement(HOTFIX_SEL_BATTLEMASTER_LIST, "SELECT ID, Name, GameType, ShortDescription, LongDescription, IconFileDataID, MapID1, MapID2, " - "MapID3, MapID4, MapID5, MapID6, MapID7, MapID8, MapID9, MapID10, MapID11, MapID12, MapID13, MapID14, MapID15, MapID16, HolidayWorldState, " - "RequiredPlayerConditionID, InstanceType, GroupsAllowed, MaxGroupSize, MinLevel, MaxLevel, RatedPlayers, MinPlayers, MaxPlayers, Flags" + PrepareStatement(HOTFIX_SEL_BATTLEMASTER_LIST, "SELECT ID, Name, GameType, ShortDescription, LongDescription, InstanceType, MinLevel, MaxLevel, " + "RatedPlayers, MinPlayers, MaxPlayers, GroupsAllowed, MaxGroupSize, HolidayWorldState, Flags, IconFileDataID, RequiredPlayerConditionID, " + "MapID1, MapID2, MapID3, MapID4, MapID5, MapID6, MapID7, MapID8, MapID9, MapID10, MapID11, MapID12, MapID13, MapID14, MapID15, MapID16" " FROM battlemaster_list ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_BATTLEMASTER_LIST, "SELECT ID, Name_lang, GameType_lang, ShortDescription_lang, LongDescription_lang" " FROM battlemaster_list_locale WHERE locale = ?", CONNECTION_SYNCH); // BroadcastText.db2 - PrepareStatement(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, Text, Text1, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, EmoteDelay3, " - "EmotesID, LanguageID, Flags, ConditionID, SoundEntriesID1, SoundEntriesID2 FROM broadcast_text ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_BROADCAST_TEXT, "SELECT Text, Text1, ID, LanguageID, ConditionID, EmotesID, Flags, ChatBubbleDurationMs, " + "SoundEntriesID1, SoundEntriesID2, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, EmoteDelay3 FROM broadcast_text ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, Text_lang, Text1_lang FROM broadcast_text_locale WHERE locale = ?", CONNECTION_SYNCH); // CfgRegions.db2 - PrepareStatement(HOTFIX_SEL_CFG_REGIONS, "SELECT ID, Tag, Raidorigin, ChallengeOrigin, RegionID, RegionGroupMask FROM cfg_regions ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CFG_REGIONS, "SELECT ID, Tag, RegionID, Raidorigin, RegionGroupMask, ChallengeOrigin FROM cfg_regions ORDER BY ID DESC", CONNECTION_SYNCH); // CharacterFacialHairStyles.db2 PrepareStatement(HOTFIX_SEL_CHARACTER_FACIAL_HAIR_STYLES, "SELECT ID, Geoset1, Geoset2, Geoset3, Geoset4, Geoset5, RaceID, SexID, VariationID" " FROM character_facial_hair_styles ORDER BY ID DESC", CONNECTION_SYNCH); // CharBaseSection.db2 - PrepareStatement(HOTFIX_SEL_CHAR_BASE_SECTION, "SELECT ID, VariationEnum, ResolutionVariationEnum, LayoutResType FROM char_base_section" + PrepareStatement(HOTFIX_SEL_CHAR_BASE_SECTION, "SELECT ID, LayoutResType, VariationEnum, ResolutionVariationEnum FROM char_base_section" " ORDER BY ID DESC", CONNECTION_SYNCH); // CharSections.db2 - PrepareStatement(HOTFIX_SEL_CHAR_SECTIONS, "SELECT ID, MaterialResourcesID1, MaterialResourcesID2, MaterialResourcesID3, Flags, RaceID, SexID, " - "BaseSection, VariationIndex, ColorIndex FROM char_sections ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CHAR_SECTIONS, "SELECT ID, RaceID, SexID, BaseSection, VariationIndex, ColorIndex, Flags, MaterialResourcesID1, " + "MaterialResourcesID2, MaterialResourcesID3 FROM char_sections ORDER BY ID DESC", CONNECTION_SYNCH); // CharStartOutfit.db2 - PrepareStatement(HOTFIX_SEL_CHAR_START_OUTFIT, "SELECT ID, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, " - "ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, ItemID18, ItemID19, ItemID20, ItemID21, ItemID22, ItemID23, " - "ItemID24, PetDisplayID, ClassID, SexID, OutfitID, PetFamilyID, RaceID FROM char_start_outfit ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CHAR_START_OUTFIT, "SELECT ID, ClassID, SexID, OutfitID, PetDisplayID, PetFamilyID, ItemID1, ItemID2, ItemID3, " + "ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, " + "ItemID18, ItemID19, ItemID20, ItemID21, ItemID22, ItemID23, ItemID24, RaceID FROM char_start_outfit ORDER BY ID DESC", CONNECTION_SYNCH); // CharTitles.db2 PrepareStatement(HOTFIX_SEL_CHAR_TITLES, "SELECT ID, Name, Name1, MaskID, Flags FROM char_titles ORDER BY ID DESC", CONNECTION_SYNCH); @@ -176,85 +176,90 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_CHAT_CHANNELS, "SELECT ID, Name_lang, Shortcut_lang FROM chat_channels_locale WHERE locale = ?", CONNECTION_SYNCH); // ChrClasses.db2 - PrepareStatement(HOTFIX_SEL_CHR_CLASSES, "SELECT PetNameToken, Name, NameFemale, NameMale, Filename, CreateScreenFileDataID, " - "SelectScreenFileDataID, LowResScreenFileDataID, IconFileDataID, StartingLevel, Flags, CinematicSequenceID, DefaultSpec, DisplayPower, " - "SpellClassSet, AttackPowerPerStrength, AttackPowerPerAgility, RangedAttackPowerPerAgility, PrimaryStatPriority, ID FROM chr_classes" - " ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_CLASSES, "SELECT ID, Name_lang, NameFemale_lang, NameMale_lang FROM chr_classes_locale WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CHR_CLASSES, "SELECT Name, Filename, NameMale, NameFemale, PetNameToken, ID, CreateScreenFileDataID, " + "SelectScreenFileDataID, IconFileDataID, LowResScreenFileDataID, StartingLevel, Flags, CinematicSequenceID, DefaultSpec, PrimaryStatPriority, " + "DisplayPower, RangedAttackPowerPerAgility, AttackPowerPerAgility, AttackPowerPerStrength, SpellClassSet FROM chr_classes ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_CLASSES, "SELECT ID, Name_lang, NameMale_lang, NameFemale_lang FROM chr_classes_locale WHERE locale = ?", CONNECTION_SYNCH); // ChrClassesXPowerTypes.db2 PrepareStatement(HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES, "SELECT ID, PowerType, ClassID FROM chr_classes_x_power_types ORDER BY ID DESC", CONNECTION_SYNCH); // ChrRaces.db2 - PrepareStatement(HOTFIX_SEL_CHR_RACES, "SELECT ClientPrefix, ClientFileString, Name, NameFemale, NameLowercase, NameFemaleLowercase, Flags, " - "MaleDisplayId, FemaleDisplayId, CreateScreenFileDataID, SelectScreenFileDataID, MaleCustomizeOffset1, MaleCustomizeOffset2, " - "MaleCustomizeOffset3, FemaleCustomizeOffset1, FemaleCustomizeOffset2, FemaleCustomizeOffset3, LowResScreenFileDataID, StartingLevel, " - "UiDisplayOrder, FactionID, ResSicknessSpellID, SplashSoundID, CinematicSequenceID, BaseLanguage, CreatureType, Alliance, RaceRelated, " - "UnalteredVisualRaceID, CharComponentTextureLayoutID, DefaultClassID, NeutralRaceID, DisplayRaceID, CharComponentTexLayoutHiResID, ID, " - "HighResMaleDisplayId, HighResFemaleDisplayId, HeritageArmorAchievementID, MaleSkeletonFileDataID, FemaleSkeletonFileDataID, " - "AlteredFormStartVisualKitID1, AlteredFormStartVisualKitID2, AlteredFormStartVisualKitID3, AlteredFormFinishVisualKitID1, " - "AlteredFormFinishVisualKitID2, AlteredFormFinishVisualKitID3 FROM chr_races ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CHR_RACES, "SELECT ClientPrefix, ClientFileString, Name, NameFemale, NameLowercase, NameFemaleLowercase, ID, Flags, " + "MaleDisplayId, FemaleDisplayId, HighResMaleDisplayId, HighResFemaleDisplayId, CreateScreenFileDataID, SelectScreenFileDataID, " + "MaleCustomizeOffset1, MaleCustomizeOffset2, MaleCustomizeOffset3, FemaleCustomizeOffset1, FemaleCustomizeOffset2, FemaleCustomizeOffset3, " + "LowResScreenFileDataID, AlteredFormStartVisualKitID1, AlteredFormStartVisualKitID2, AlteredFormStartVisualKitID3, " + "AlteredFormFinishVisualKitID1, AlteredFormFinishVisualKitID2, AlteredFormFinishVisualKitID3, HeritageArmorAchievementID, StartingLevel, " + "UiDisplayOrder, FemaleSkeletonFileDataID, MaleSkeletonFileDataID, HelmVisFallbackRaceID, FactionID, CinematicSequenceID, ResSicknessSpellID, " + "SplashSoundID, BaseLanguage, CreatureType, Alliance, RaceRelated, UnalteredVisualRaceID, CharComponentTextureLayoutID, " + "CharComponentTexLayoutHiResID, DefaultClassID, NeutralRaceID, MaleModelFallbackRaceID, MaleModelFallbackSex, FemaleModelFallbackRaceID, " + "FemaleModelFallbackSex, MaleTextureFallbackRaceID, MaleTextureFallbackSex, FemaleTextureFallbackRaceID, FemaleTextureFallbackSex" + " FROM chr_races ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_RACES, "SELECT ID, Name_lang, NameFemale_lang, NameLowercase_lang, NameFemaleLowercase_lang" " FROM chr_races_locale WHERE locale = ?", CONNECTION_SYNCH); // ChrSpecialization.db2 - PrepareStatement(HOTFIX_SEL_CHR_SPECIALIZATION, "SELECT Name, FemaleName, Description, MasterySpellID1, MasterySpellID2, ClassID, OrderIndex, " - "PetTalentType, Role, PrimaryStatPriority, ID, SpellIconFileID, Flags, AnimReplacements FROM chr_specialization ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CHR_SPECIALIZATION, "SELECT Name, FemaleName, Description, ID, ClassID, OrderIndex, PetTalentType, Role, Flags, " + "SpellIconFileID, PrimaryStatPriority, AnimReplacements, MasterySpellID1, MasterySpellID2 FROM chr_specialization ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_SPECIALIZATION, "SELECT ID, Name_lang, FemaleName_lang, Description_lang FROM chr_specialization_locale" " WHERE locale = ?", CONNECTION_SYNCH); // CinematicCamera.db2 - PrepareStatement(HOTFIX_SEL_CINEMATIC_CAMERA, "SELECT ID, SoundID, OriginX, OriginY, OriginZ, OriginFacing, FileDataID FROM cinematic_camera" + PrepareStatement(HOTFIX_SEL_CINEMATIC_CAMERA, "SELECT ID, OriginX, OriginY, OriginZ, SoundID, OriginFacing, FileDataID FROM cinematic_camera" " ORDER BY ID DESC", CONNECTION_SYNCH); // CinematicSequences.db2 PrepareStatement(HOTFIX_SEL_CINEMATIC_SEQUENCES, "SELECT ID, SoundID, Camera1, Camera2, Camera3, Camera4, Camera5, Camera6, Camera7, Camera8" " FROM cinematic_sequences ORDER BY ID DESC", CONNECTION_SYNCH); + // ContentTuning.db2 + PrepareStatement(HOTFIX_SEL_CONTENT_TUNING, "SELECT ID, MinLevel, MaxLevel, Flags, ExpectedStatModID, DifficultyESMID FROM content_tuning" + " ORDER BY ID DESC", CONNECTION_SYNCH); + // ConversationLine.db2 PrepareStatement(HOTFIX_SEL_CONVERSATION_LINE, "SELECT ID, BroadcastTextID, SpellVisualKitID, AdditionalDuration, NextConversationLineID, " "AnimKitID, SpeechType, StartAnimation, EndAnimation FROM conversation_line ORDER BY ID DESC", CONNECTION_SYNCH); // CreatureDisplayInfo.db2 - PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO, "SELECT ID, CreatureModelScale, ModelID, NPCSoundID, SizeClass, Flags, Gender, " - "ExtendedDisplayInfoID, PortraitTextureFileDataID, CreatureModelAlpha, SoundID, PlayerOverrideScale, PortraitCreatureDisplayInfoID, BloodID, " - "ParticleColorID, CreatureGeosetData, ObjectEffectPackageID, AnimReplacementSetID, UnarmedWeaponType, StateSpellVisualKitID, " - "PetInstanceScale, MountPoofSpellVisualKitID, TextureVariationFileDataID1, TextureVariationFileDataID2, TextureVariationFileDataID3" - " FROM creature_display_info ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO, "SELECT ID, ModelID, SoundID, SizeClass, CreatureModelScale, CreatureModelAlpha, BloodID, " + "ExtendedDisplayInfoID, NPCSoundID, ParticleColorID, PortraitCreatureDisplayInfoID, PortraitTextureFileDataID, ObjectEffectPackageID, " + "AnimReplacementSetID, Flags, StateSpellVisualKitID, PlayerOverrideScale, PetInstanceScale, UnarmedWeaponType, MountPoofSpellVisualKitID, " + "DissolveEffectID, Gender, DissolveOutEffectID, CreatureModelMinLod, TextureVariationFileDataID1, TextureVariationFileDataID2, " + "TextureVariationFileDataID3 FROM creature_display_info ORDER BY ID DESC", CONNECTION_SYNCH); // CreatureDisplayInfoExtra.db2 - PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, BakeMaterialResourcesID, HDBakeMaterialResourcesID, DisplayRaceID, " - "DisplaySexID, DisplayClassID, SkinID, FaceID, HairStyleID, HairColorID, FacialHairID, CustomDisplayOption1, CustomDisplayOption2, " - "CustomDisplayOption3, Flags FROM creature_display_info_extra ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO_EXTRA, "SELECT ID, DisplayRaceID, DisplaySexID, DisplayClassID, SkinID, FaceID, HairStyleID, " + "HairColorID, FacialHairID, Flags, BakeMaterialResourcesID, HDBakeMaterialResourcesID, CustomDisplayOption1, CustomDisplayOption2, " + "CustomDisplayOption3 FROM creature_display_info_extra ORDER BY ID DESC", CONNECTION_SYNCH); // CreatureFamily.db2 - PrepareStatement(HOTFIX_SEL_CREATURE_FAMILY, "SELECT ID, Name, MinScale, MaxScale, IconFileID, SkillLine1, SkillLine2, PetFoodMask, " - "MinScaleLevel, MaxScaleLevel, PetTalentType FROM creature_family ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CREATURE_FAMILY, "SELECT ID, Name, MinScale, MinScaleLevel, MaxScale, MaxScaleLevel, PetFoodMask, PetTalentType, " + "IconFileID, SkillLine1, SkillLine2 FROM creature_family ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_FAMILY, "SELECT ID, Name_lang FROM creature_family_locale WHERE locale = ?", CONNECTION_SYNCH); // CreatureModelData.db2 - PrepareStatement(HOTFIX_SEL_CREATURE_MODEL_DATA, "SELECT ID, ModelScale, FootprintTextureLength, FootprintTextureWidth, FootprintParticleScale, " - "CollisionWidth, CollisionHeight, MountHeight, GeoBox1, GeoBox2, GeoBox3, GeoBox4, GeoBox5, GeoBox6, WorldEffectScale, AttachedEffectScale, " - "MissileCollisionRadius, MissileCollisionPush, MissileCollisionRaise, OverrideLootEffectScale, OverrideNameScale, OverrideSelectionRadius, " - "TamedPetBaseScale, HoverHeight, Flags, FileDataID, SizeClass, BloodID, FootprintTextureID, FoleyMaterialID, FootstepCameraEffectID, " - "DeathThudCameraEffectID, SoundID, CreatureGeosetDataID FROM creature_model_data ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CREATURE_MODEL_DATA, "SELECT ID, GeoBox1, GeoBox2, GeoBox3, GeoBox4, GeoBox5, GeoBox6, Flags, FileDataID, BloodID, " + "FootprintTextureID, FootprintTextureLength, FootprintTextureWidth, FootprintParticleScale, FoleyMaterialID, FootstepCameraEffectID, " + "DeathThudCameraEffectID, SoundID, SizeClass, CollisionWidth, CollisionHeight, WorldEffectScale, CreatureGeosetDataID, HoverHeight, " + "AttachedEffectScale, ModelScale, MissileCollisionRadius, MissileCollisionPush, MissileCollisionRaise, MountHeight, OverrideLootEffectScale, " + "OverrideNameScale, OverrideSelectionRadius, TamedPetBaseScale FROM creature_model_data ORDER BY ID DESC", CONNECTION_SYNCH); // CreatureType.db2 PrepareStatement(HOTFIX_SEL_CREATURE_TYPE, "SELECT ID, Name, Flags FROM creature_type ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_TYPE, "SELECT ID, Name_lang FROM creature_type_locale WHERE locale = ?", CONNECTION_SYNCH); // Criteria.db2 - PrepareStatement(HOTFIX_SEL_CRITERIA, "SELECT ID, Asset, StartAsset, FailAsset, ModifierTreeId, StartTimer, EligibilityWorldStateID, Type, " - "StartEvent, FailEvent, Flags, EligibilityWorldStateValue FROM criteria ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CRITERIA, "SELECT ID, Type, Asset, ModifierTreeId, StartEvent, StartAsset, StartTimer, FailEvent, FailAsset, Flags, " + "EligibilityWorldStateID, EligibilityWorldStateValue FROM criteria ORDER BY ID DESC", CONNECTION_SYNCH); // CriteriaTree.db2 - PrepareStatement(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, Description, Amount, Flags, Operator, CriteriaID, Parent, OrderIndex FROM criteria_tree" + PrepareStatement(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, Description, Parent, Amount, Operator, CriteriaID, OrderIndex, Flags FROM criteria_tree" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CRITERIA_TREE, "SELECT ID, Description_lang FROM criteria_tree_locale WHERE locale = ?", CONNECTION_SYNCH); // CurrencyTypes.db2 - PrepareStatement(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, Name, Description, MaxQty, MaxEarnablePerWeek, Flags, CategoryID, SpellCategory, Quality, " - "InventoryIconFileID, SpellWeight FROM currency_types ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, Name, Description, CategoryID, InventoryIconFileID, SpellWeight, SpellCategory, MaxQty, " + "MaxEarnablePerWeek, Flags, Quality, FactionID FROM currency_types ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, Name_lang, Description_lang FROM currency_types_locale WHERE locale = ?", CONNECTION_SYNCH); // Curve.db2 @@ -264,20 +269,20 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_CURVE_POINT, "SELECT ID, PosX, PosY, CurveID, OrderIndex FROM curve_point ORDER BY ID DESC", CONNECTION_SYNCH); // DestructibleModelData.db2 - PrepareStatement(HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA, "SELECT ID, State0Wmo, State1Wmo, State2Wmo, State3Wmo, HealEffectSpeed, " - "State0ImpactEffectDoodadSet, State0AmbientDoodadSet, State0NameSet, State1DestructionDoodadSet, State1ImpactEffectDoodadSet, " - "State1AmbientDoodadSet, State1NameSet, State2DestructionDoodadSet, State2ImpactEffectDoodadSet, State2AmbientDoodadSet, State2NameSet, " - "State3InitDoodadSet, State3AmbientDoodadSet, State3NameSet, EjectDirection, DoNotHighlight, HealEffect FROM destructible_model_data" + PrepareStatement(HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA, "SELECT ID, State0ImpactEffectDoodadSet, State0AmbientDoodadSet, State1Wmo, " + "State1DestructionDoodadSet, State1ImpactEffectDoodadSet, State1AmbientDoodadSet, State2Wmo, State2DestructionDoodadSet, " + "State2ImpactEffectDoodadSet, State2AmbientDoodadSet, State3Wmo, State3InitDoodadSet, State3AmbientDoodadSet, EjectDirection, DoNotHighlight, " + "State0Wmo, HealEffect, HealEffectSpeed, State0NameSet, State1NameSet, State2NameSet, State3NameSet FROM destructible_model_data" " ORDER BY ID DESC", CONNECTION_SYNCH); // Difficulty.db2 - PrepareStatement(HOTFIX_SEL_DIFFICULTY, "SELECT ID, Name, GroupSizeHealthCurveID, GroupSizeDmgCurveID, GroupSizeSpellPointsCurveID, " - "FallbackDifficultyID, InstanceType, MinPlayers, MaxPlayers, OldEnumValue, Flags, ToggleDifficultyID, ItemContext, OrderIndex FROM difficulty" + PrepareStatement(HOTFIX_SEL_DIFFICULTY, "SELECT ID, Name, InstanceType, OrderIndex, OldEnumValue, FallbackDifficultyID, MinPlayers, MaxPlayers, " + "Flags, ItemContext, ToggleDifficultyID, GroupSizeHealthCurveID, GroupSizeDmgCurveID, GroupSizeSpellPointsCurveID FROM difficulty" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_DIFFICULTY, "SELECT ID, Name_lang FROM difficulty_locale WHERE locale = ?", CONNECTION_SYNCH); // DungeonEncounter.db2 - PrepareStatement(HOTFIX_SEL_DUNGEON_ENCOUNTER, "SELECT Name, CreatureDisplayID, MapID, DifficultyID, Bit, Flags, ID, OrderIndex, SpellIconFileID" + PrepareStatement(HOTFIX_SEL_DUNGEON_ENCOUNTER, "SELECT Name, ID, MapID, DifficultyID, OrderIndex, Bit, CreatureDisplayID, Flags, SpellIconFileID" " FROM dungeon_encounter ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_DUNGEON_ENCOUNTER, "SELECT ID, Name_lang FROM dungeon_encounter_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -293,78 +298,85 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_DURABILITY_QUALITY, "SELECT ID, Data FROM durability_quality ORDER BY ID DESC", CONNECTION_SYNCH); // Emotes.db2 - PrepareStatement(HOTFIX_SEL_EMOTES, "SELECT ID, RaceMask, EmoteSlashCommand, EmoteFlags, SpellVisualKitID, AnimID, EmoteSpecProc, ClassMask, " - "EmoteSpecProcParam, EventSoundID FROM emotes ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_EMOTES, "SELECT ID, RaceMask, EmoteSlashCommand, AnimID, EmoteFlags, EmoteSpecProc, EmoteSpecProcParam, EventSoundID, " + "SpellVisualKitID, ClassMask FROM emotes ORDER BY ID DESC", CONNECTION_SYNCH); // EmotesText.db2 PrepareStatement(HOTFIX_SEL_EMOTES_TEXT, "SELECT ID, Name, EmoteID FROM emotes_text ORDER BY ID DESC", CONNECTION_SYNCH); // EmotesTextSound.db2 - PrepareStatement(HOTFIX_SEL_EMOTES_TEXT_SOUND, "SELECT ID, RaceID, SexID, ClassID, SoundID, EmotesTextID FROM emotes_text_sound ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_EMOTES_TEXT_SOUND, "SELECT ID, RaceID, ClassID, SexID, SoundID, EmotesTextID FROM emotes_text_sound ORDER BY ID DESC", CONNECTION_SYNCH); + + // ExpectedStat.db2 + PrepareStatement(HOTFIX_SEL_EXPECTED_STAT, "SELECT ID, ExpansionID, CreatureHealth, PlayerHealth, CreatureAutoAttackDps, CreatureArmor, " + "PlayerMana, PlayerPrimaryStat, PlayerSecondaryStat, ArmorConstant, CreatureSpellDamage, Lvl FROM expected_stat ORDER BY ID DESC", CONNECTION_SYNCH); + + // ExpectedStatMod.db2 + PrepareStatement(HOTFIX_SEL_EXPECTED_STAT_MOD, "SELECT ID, CreatureHealthMod, PlayerHealthMod, CreatureAutoAttackDPSMod, CreatureArmorMod, " + "PlayerManaMod, PlayerPrimaryStatMod, PlayerSecondaryStatMod, ArmorConstantMod, CreatureSpellDamageMod FROM expected_stat_mod ORDER BY ID DESC", CONNECTION_SYNCH); // Faction.db2 PrepareStatement(HOTFIX_SEL_FACTION, "SELECT ReputationRaceMask1, ReputationRaceMask2, ReputationRaceMask3, ReputationRaceMask4, Name, " - "Description, ID, ReputationBase1, ReputationBase2, ReputationBase3, ReputationBase4, ParentFactionMod1, ParentFactionMod2, ReputationMax1, " - "ReputationMax2, ReputationMax3, ReputationMax4, ReputationIndex, ReputationClassMask1, ReputationClassMask2, ReputationClassMask3, " - "ReputationClassMask4, ReputationFlags1, ReputationFlags2, ReputationFlags3, ReputationFlags4, ParentFactionID, ParagonFactionID, " - "ParentFactionCap1, ParentFactionCap2, Expansion, Flags, FriendshipRepID FROM faction ORDER BY ID DESC", CONNECTION_SYNCH); + "Description, ID, ReputationIndex, ParentFactionID, Expansion, FriendshipRepID, Flags, ParagonFactionID, ReputationClassMask1, " + "ReputationClassMask2, ReputationClassMask3, ReputationClassMask4, ReputationFlags1, ReputationFlags2, ReputationFlags3, ReputationFlags4, " + "ReputationBase1, ReputationBase2, ReputationBase3, ReputationBase4, ReputationMax1, ReputationMax2, ReputationMax3, ReputationMax4, " + "ParentFactionMod1, ParentFactionMod2, ParentFactionCap1, ParentFactionCap2 FROM faction ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_FACTION, "SELECT ID, Name_lang, Description_lang FROM faction_locale WHERE locale = ?", CONNECTION_SYNCH); // FactionTemplate.db2 - PrepareStatement(HOTFIX_SEL_FACTION_TEMPLATE, "SELECT ID, Faction, Flags, Enemies1, Enemies2, Enemies3, Enemies4, Friend1, Friend2, Friend3, " - "Friend4, FactionGroup, FriendGroup, EnemyGroup FROM faction_template ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_FACTION_TEMPLATE, "SELECT ID, Faction, Flags, FactionGroup, FriendGroup, EnemyGroup, Enemies1, Enemies2, Enemies3, " + "Enemies4, Friend1, Friend2, Friend3, Friend4 FROM faction_template ORDER BY ID DESC", CONNECTION_SYNCH); // GameobjectDisplayInfo.db2 - PrepareStatement(HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO, "SELECT ID, FileDataID, GeoBoxMinX, GeoBoxMinY, GeoBoxMinZ, GeoBoxMaxX, GeoBoxMaxY, " - "GeoBoxMaxZ, OverrideLootEffectScale, OverrideNameScale, ObjectEffectPackageID FROM gameobject_display_info ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GAMEOBJECT_DISPLAY_INFO, "SELECT ID, GeoBoxMinX, GeoBoxMinY, GeoBoxMinZ, GeoBoxMaxX, GeoBoxMaxY, GeoBoxMaxZ, " + "FileDataID, ObjectEffectPackageID, OverrideLootEffectScale, OverrideNameScale FROM gameobject_display_info ORDER BY ID DESC", CONNECTION_SYNCH); // Gameobjects.db2 - PrepareStatement(HOTFIX_SEL_GAMEOBJECTS, "SELECT Name, PosX, PosY, PosZ, Rot1, Rot2, Rot3, Rot4, Scale, PropValue1, PropValue2, PropValue3, " - "PropValue4, PropValue5, PropValue6, PropValue7, PropValue8, OwnerID, DisplayID, PhaseID, PhaseGroupID, PhaseUseFlags, TypeID, ID" + PrepareStatement(HOTFIX_SEL_GAMEOBJECTS, "SELECT Name, PosX, PosY, PosZ, Rot1, Rot2, Rot3, Rot4, ID, OwnerID, DisplayID, Scale, TypeID, " + "PhaseUseFlags, PhaseID, PhaseGroupID, PropValue1, PropValue2, PropValue3, PropValue4, PropValue5, PropValue6, PropValue7, PropValue8" " FROM gameobjects ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GAMEOBJECTS, "SELECT ID, Name_lang FROM gameobjects_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrAbility.db2 - PrepareStatement(HOTFIX_SEL_GARR_ABILITY, "SELECT Name, Description, IconFileDataID, Flags, FactionChangeGarrAbilityID, GarrAbilityCategoryID, " - "GarrFollowerTypeID, ID FROM garr_ability ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_ABILITY, "SELECT Name, Description, ID, GarrAbilityCategoryID, GarrFollowerTypeID, IconFileDataID, " + "FactionChangeGarrAbilityID, Flags FROM garr_ability ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Name_lang, Description_lang FROM garr_ability_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrBuilding.db2 - PrepareStatement(HOTFIX_SEL_GARR_BUILDING, "SELECT ID, AllianceName, HordeName, Description, Tooltip, HordeGameObjectID, AllianceGameObjectID, " - "IconFileDataID, CurrencyTypeID, HordeUiTextureKitID, AllianceUiTextureKitID, AllianceSceneScriptPackageID, HordeSceneScriptPackageID, " - "GarrAbilityID, BonusGarrAbilityID, GoldCost, GarrSiteID, BuildingType, UpgradeLevel, Flags, ShipmentCapacity, GarrTypeID, BuildSeconds, " - "CurrencyQty, MaxAssignments FROM garr_building ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_BUILDING, "SELECT ID, AllianceName_lang, HordeName_lang, Description_lang, Tooltip_lang" + PrepareStatement(HOTFIX_SEL_GARR_BUILDING, "SELECT ID, HordeName, AllianceName, Description, Tooltip, GarrTypeID, BuildingType, " + "HordeGameObjectID, AllianceGameObjectID, GarrSiteID, UpgradeLevel, BuildSeconds, CurrencyTypeID, CurrencyQty, HordeUiTextureKitID, " + "AllianceUiTextureKitID, IconFileDataID, AllianceSceneScriptPackageID, HordeSceneScriptPackageID, MaxAssignments, ShipmentCapacity, " + "GarrAbilityID, BonusGarrAbilityID, GoldCost, Flags FROM garr_building ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_BUILDING, "SELECT ID, HordeName_lang, AllianceName_lang, Description_lang, Tooltip_lang" " FROM garr_building_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrBuildingPlotInst.db2 - PrepareStatement(HOTFIX_SEL_GARR_BUILDING_PLOT_INST, "SELECT MapOffsetX, MapOffsetY, UiTextureAtlasMemberID, GarrSiteLevelPlotInstID, " - "GarrBuildingID, ID FROM garr_building_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_BUILDING_PLOT_INST, "SELECT MapOffsetX, MapOffsetY, ID, GarrBuildingID, GarrSiteLevelPlotInstID, " + "UiTextureAtlasMemberID FROM garr_building_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); // GarrClassSpec.db2 - PrepareStatement(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ClassSpec, ClassSpecMale, ClassSpecFemale, UiTextureAtlasMemberID, GarrFollItemSetID, " - "FollowerClassLimit, Flags, ID FROM garr_class_spec ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ClassSpec, ClassSpecMale, ClassSpecFemale, ID, UiTextureAtlasMemberID, GarrFollItemSetID, " + "FollowerClassLimit, Flags FROM garr_class_spec ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, ClassSpec_lang, ClassSpecMale_lang, ClassSpecFemale_lang FROM garr_class_spec_locale" " WHERE locale = ?", CONNECTION_SYNCH); // GarrFollower.db2 - PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER, "SELECT HordeSourceText, AllianceSourceText, TitleName, HordeCreatureID, AllianceCreatureID, " - "HordeIconFileDataID, AllianceIconFileDataID, HordeSlottingBroadcastTextID, AllySlottingBroadcastTextID, HordeGarrFollItemSetID, " - "AllianceGarrFollItemSetID, ItemLevelWeapon, ItemLevelArmor, HordeUITextureKitID, AllianceUITextureKitID, GarrFollowerTypeID, " - "HordeGarrFollRaceID, AllianceGarrFollRaceID, Quality, HordeGarrClassSpecID, AllianceGarrClassSpecID, FollowerLevel, Gender, Flags, " - "HordeSourceTypeEnum, AllianceSourceTypeEnum, GarrTypeID, Vitality, ChrClassID, HordeFlavorGarrStringID, AllianceFlavorGarrStringID, ID" - " FROM garr_follower ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER, "SELECT HordeSourceText, AllianceSourceText, TitleName, ID, GarrTypeID, GarrFollowerTypeID, " + "HordeCreatureID, AllianceCreatureID, HordeGarrFollRaceID, AllianceGarrFollRaceID, HordeGarrClassSpecID, AllianceGarrClassSpecID, Quality, " + "FollowerLevel, ItemLevelWeapon, ItemLevelArmor, HordeSourceTypeEnum, AllianceSourceTypeEnum, HordeIconFileDataID, AllianceIconFileDataID, " + "HordeGarrFollItemSetID, AllianceGarrFollItemSetID, HordeUITextureKitID, AllianceUITextureKitID, Vitality, HordeFlavorGarrStringID, " + "AllianceFlavorGarrStringID, HordeSlottingBroadcastTextID, AllySlottingBroadcastTextID, ChrClassID, Flags, Gender FROM garr_follower" + " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, HordeSourceText_lang, AllianceSourceText_lang, TitleName_lang FROM garr_follower_locale" " WHERE locale = ?", CONNECTION_SYNCH); // GarrFollowerXAbility.db2 - PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY, "SELECT ID, GarrAbilityID, FactionIndex, GarrFollowerID FROM garr_follower_x_ability" - " ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY, "SELECT ID, OrderIndex, FactionIndex, GarrAbilityID, GarrFollowerID" + " FROM garr_follower_x_ability ORDER BY ID DESC", CONNECTION_SYNCH); // GarrPlot.db2 - PrepareStatement(HOTFIX_SEL_GARR_PLOT, "SELECT ID, Name, AllianceConstructObjID, HordeConstructObjID, UiCategoryID, PlotType, Flags, " + PrepareStatement(HOTFIX_SEL_GARR_PLOT, "SELECT ID, Name, PlotType, HordeConstructObjID, AllianceConstructObjID, Flags, UiCategoryID, " "UpgradeRequirement1, UpgradeRequirement2 FROM garr_plot ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_PLOT, "SELECT ID, Name_lang FROM garr_plot_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrPlotBuilding.db2 PrepareStatement(HOTFIX_SEL_GARR_PLOT_BUILDING, "SELECT ID, GarrPlotID, GarrBuildingID FROM garr_plot_building ORDER BY ID DESC", CONNECTION_SYNCH); @@ -373,15 +385,15 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_GARR_PLOT_INSTANCE, "SELECT ID, Name, GarrPlotID FROM garr_plot_instance ORDER BY ID DESC", CONNECTION_SYNCH); // GarrSiteLevel.db2 - PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL, "SELECT ID, TownHallUiPosX, TownHallUiPosY, MapID, UiTextureKitID, UpgradeMovieID, UpgradeCost, " - "UpgradeGoldCost, GarrLevel, GarrSiteID, MaxBuildingLevel FROM garr_site_level ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL, "SELECT ID, TownHallUiPosX, TownHallUiPosY, GarrSiteID, GarrLevel, MapID, UpgradeMovieID, " + "UiTextureKitID, MaxBuildingLevel, UpgradeCost, UpgradeGoldCost FROM garr_site_level ORDER BY ID DESC", CONNECTION_SYNCH); // GarrSiteLevelPlotInst.db2 PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST, "SELECT ID, UiMarkerPosX, UiMarkerPosY, GarrSiteLevelID, GarrPlotInstanceID, UiMarkerSize" " FROM garr_site_level_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); // GemProperties.db2 - PrepareStatement(HOTFIX_SEL_GEM_PROPERTIES, "SELECT ID, Type, EnchantId, MinItemLevel FROM gem_properties ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GEM_PROPERTIES, "SELECT ID, EnchantId, Type, MinItemLevel FROM gem_properties ORDER BY ID DESC", CONNECTION_SYNCH); // GlyphBindableSpell.db2 PrepareStatement(HOTFIX_SEL_GLYPH_BINDABLE_SPELL, "SELECT ID, SpellID, GlyphPropertiesID FROM glyph_bindable_spell ORDER BY ID DESC", CONNECTION_SYNCH); @@ -394,29 +406,29 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_GLYPH_REQUIRED_SPEC, "SELECT ID, ChrSpecializationID, GlyphPropertiesID FROM glyph_required_spec ORDER BY ID DESC", CONNECTION_SYNCH); // GuildColorBackground.db2 - PrepareStatement(HOTFIX_SEL_GUILD_COLOR_BACKGROUND, "SELECT ID, Red, Green, Blue FROM guild_color_background ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GUILD_COLOR_BACKGROUND, "SELECT ID, Red, Blue, Green FROM guild_color_background ORDER BY ID DESC", CONNECTION_SYNCH); // GuildColorBorder.db2 - PrepareStatement(HOTFIX_SEL_GUILD_COLOR_BORDER, "SELECT ID, Red, Green, Blue FROM guild_color_border ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GUILD_COLOR_BORDER, "SELECT ID, Red, Blue, Green FROM guild_color_border ORDER BY ID DESC", CONNECTION_SYNCH); // GuildColorEmblem.db2 - PrepareStatement(HOTFIX_SEL_GUILD_COLOR_EMBLEM, "SELECT ID, Red, Green, Blue FROM guild_color_emblem ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GUILD_COLOR_EMBLEM, "SELECT ID, Red, Blue, Green FROM guild_color_emblem ORDER BY ID DESC", CONNECTION_SYNCH); // GuildPerkSpells.db2 PrepareStatement(HOTFIX_SEL_GUILD_PERK_SPELLS, "SELECT ID, SpellID FROM guild_perk_spells ORDER BY ID DESC", CONNECTION_SYNCH); // Heirloom.db2 - PrepareStatement(HOTFIX_SEL_HEIRLOOM, "SELECT SourceText, ItemID, LegacyItemID, LegacyUpgradedItemID, StaticUpgradedItemID, UpgradeItemID1, " - "UpgradeItemID2, UpgradeItemID3, UpgradeItemBonusListID1, UpgradeItemBonusListID2, UpgradeItemBonusListID3, Flags, SourceTypeEnum, ID" + PrepareStatement(HOTFIX_SEL_HEIRLOOM, "SELECT SourceText, ID, ItemID, LegacyUpgradedItemID, StaticUpgradedItemID, SourceTypeEnum, Flags, " + "LegacyItemID, UpgradeItemID1, UpgradeItemID2, UpgradeItemID3, UpgradeItemBonusListID1, UpgradeItemBonusListID2, UpgradeItemBonusListID3" " FROM heirloom ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_HEIRLOOM, "SELECT ID, SourceText_lang FROM heirloom_locale WHERE locale = ?", CONNECTION_SYNCH); // Holidays.db2 - PrepareStatement(HOTFIX_SEL_HOLIDAYS, "SELECT ID, Date1, Date2, Date3, Date4, Date5, Date6, Date7, Date8, Date9, Date10, Date11, Date12, Date13, " - "Date14, Date15, Date16, Duration1, Duration2, Duration3, Duration4, Duration5, Duration6, Duration7, Duration8, Duration9, Duration10, " - "Region, Looping, CalendarFlags1, CalendarFlags2, CalendarFlags3, CalendarFlags4, CalendarFlags5, CalendarFlags6, CalendarFlags7, " - "CalendarFlags8, CalendarFlags9, CalendarFlags10, Priority, CalendarFilterType, Flags, HolidayNameID, HolidayDescriptionID, " - "TextureFileDataID1, TextureFileDataID2, TextureFileDataID3 FROM holidays ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_HOLIDAYS, "SELECT ID, Region, Looping, HolidayNameID, HolidayDescriptionID, Priority, CalendarFilterType, Flags, " + "Duration1, Duration2, Duration3, Duration4, Duration5, Duration6, Duration7, Duration8, Duration9, Duration10, Date1, Date2, Date3, Date4, " + "Date5, Date6, Date7, Date8, Date9, Date10, Date11, Date12, Date13, Date14, Date15, Date16, CalendarFlags1, CalendarFlags2, CalendarFlags3, " + "CalendarFlags4, CalendarFlags5, CalendarFlags6, CalendarFlags7, CalendarFlags8, CalendarFlags9, CalendarFlags10, TextureFileDataID1, " + "TextureFileDataID2, TextureFileDataID3 FROM holidays ORDER BY ID DESC", CONNECTION_SYNCH); // ImportPriceArmor.db2 PrepareStatement(HOTFIX_SEL_IMPORT_PRICE_ARMOR, "SELECT ID, ClothModifier, LeatherModifier, ChainModifier, PlateModifier FROM import_price_armor" @@ -432,23 +444,23 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_IMPORT_PRICE_WEAPON, "SELECT ID, Data FROM import_price_weapon ORDER BY ID DESC", CONNECTION_SYNCH); // Item.db2 - PrepareStatement(HOTFIX_SEL_ITEM, "SELECT ID, IconFileDataID, ClassID, SubclassID, SoundOverrideSubclassID, Material, InventoryType, SheatheType, " + PrepareStatement(HOTFIX_SEL_ITEM, "SELECT ID, ClassID, SubclassID, Material, InventoryType, SheatheType, SoundOverrideSubclassID, IconFileDataID, " "ItemGroupSoundsID FROM item ORDER BY ID DESC", CONNECTION_SYNCH); // ItemAppearance.db2 - PrepareStatement(HOTFIX_SEL_ITEM_APPEARANCE, "SELECT ID, ItemDisplayInfoID, DefaultIconFileDataID, UiOrder, DisplayType FROM item_appearance" + PrepareStatement(HOTFIX_SEL_ITEM_APPEARANCE, "SELECT ID, DisplayType, ItemDisplayInfoID, DefaultIconFileDataID, UiOrder FROM item_appearance" " ORDER BY ID DESC", CONNECTION_SYNCH); // ItemArmorQuality.db2 PrepareStatement(HOTFIX_SEL_ITEM_ARMOR_QUALITY, "SELECT ID, Qualitymod1, Qualitymod2, Qualitymod3, Qualitymod4, Qualitymod5, Qualitymod6, " - "Qualitymod7, ItemLevel FROM item_armor_quality ORDER BY ID DESC", CONNECTION_SYNCH); + "Qualitymod7 FROM item_armor_quality ORDER BY ID DESC", CONNECTION_SYNCH); // ItemArmorShield.db2 PrepareStatement(HOTFIX_SEL_ITEM_ARMOR_SHIELD, "SELECT ID, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7, ItemLevel" " FROM item_armor_shield ORDER BY ID DESC", CONNECTION_SYNCH); // ItemArmorTotal.db2 - PrepareStatement(HOTFIX_SEL_ITEM_ARMOR_TOTAL, "SELECT ID, Cloth, Leather, Mail, Plate, ItemLevel FROM item_armor_total ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_ARMOR_TOTAL, "SELECT ID, ItemLevel, Cloth, Leather, Mail, Plate FROM item_armor_total ORDER BY ID DESC", CONNECTION_SYNCH); // ItemBagFamily.db2 PrepareStatement(HOTFIX_SEL_ITEM_BAG_FAMILY, "SELECT ID, Name FROM item_bag_family ORDER BY ID DESC", CONNECTION_SYNCH); @@ -462,7 +474,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_ITEM_BONUS_LIST_LEVEL_DELTA, "SELECT ItemLevelDelta, ID FROM item_bonus_list_level_delta ORDER BY ID DESC", CONNECTION_SYNCH); // ItemBonusTreeNode.db2 - PrepareStatement(HOTFIX_SEL_ITEM_BONUS_TREE_NODE, "SELECT ID, ChildItemBonusTreeID, ChildItemBonusListID, ChildItemLevelSelectorID, ItemContext, " + PrepareStatement(HOTFIX_SEL_ITEM_BONUS_TREE_NODE, "SELECT ID, ItemContext, ChildItemBonusTreeID, ChildItemBonusListID, ChildItemLevelSelectorID, " "ParentItemBonusTreeID FROM item_bonus_tree_node ORDER BY ID DESC", CONNECTION_SYNCH); // ItemChildEquipment.db2 @@ -470,44 +482,44 @@ void HotfixDatabaseConnection::DoPrepareStatements() " ORDER BY ID DESC", CONNECTION_SYNCH); // ItemClass.db2 - PrepareStatement(HOTFIX_SEL_ITEM_CLASS, "SELECT ID, ClassName, PriceModifier, ClassID, Flags FROM item_class ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_CLASS, "SELECT ID, ClassName, ClassID, PriceModifier, Flags FROM item_class ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_CLASS, "SELECT ID, ClassName_lang FROM item_class_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemCurrencyCost.db2 PrepareStatement(HOTFIX_SEL_ITEM_CURRENCY_COST, "SELECT ID, ItemID FROM item_currency_cost ORDER BY ID DESC", CONNECTION_SYNCH); // ItemDamageAmmo.db2 - PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_AMMO, "SELECT ID, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7, ItemLevel" + PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_AMMO, "SELECT ID, ItemLevel, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7" " FROM item_damage_ammo ORDER BY ID DESC", CONNECTION_SYNCH); // ItemDamageOneHand.db2 - PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND, "SELECT ID, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7, ItemLevel" + PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND, "SELECT ID, ItemLevel, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7" " FROM item_damage_one_hand ORDER BY ID DESC", CONNECTION_SYNCH); // ItemDamageOneHandCaster.db2 - PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER, "SELECT ID, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7, " - "ItemLevel FROM item_damage_one_hand_caster ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_ONE_HAND_CASTER, "SELECT ID, ItemLevel, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, " + "Quality7 FROM item_damage_one_hand_caster ORDER BY ID DESC", CONNECTION_SYNCH); // ItemDamageTwoHand.db2 - PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND, "SELECT ID, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7, ItemLevel" + PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND, "SELECT ID, ItemLevel, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7" " FROM item_damage_two_hand ORDER BY ID DESC", CONNECTION_SYNCH); // ItemDamageTwoHandCaster.db2 - PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER, "SELECT ID, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, Quality7, " - "ItemLevel FROM item_damage_two_hand_caster ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_DAMAGE_TWO_HAND_CASTER, "SELECT ID, ItemLevel, Quality1, Quality2, Quality3, Quality4, Quality5, Quality6, " + "Quality7 FROM item_damage_two_hand_caster ORDER BY ID DESC", CONNECTION_SYNCH); // ItemDisenchantLoot.db2 - PrepareStatement(HOTFIX_SEL_ITEM_DISENCHANT_LOOT, "SELECT ID, MinLevel, MaxLevel, SkillRequired, Subclass, Quality, ExpansionID, Class" + PrepareStatement(HOTFIX_SEL_ITEM_DISENCHANT_LOOT, "SELECT ID, Subclass, Quality, MinLevel, MaxLevel, SkillRequired, ExpansionID, Class" " FROM item_disenchant_loot ORDER BY ID DESC", CONNECTION_SYNCH); // ItemEffect.db2 - PrepareStatement(HOTFIX_SEL_ITEM_EFFECT, "SELECT ID, SpellID, CoolDownMSec, CategoryCoolDownMSec, Charges, SpellCategoryID, ChrSpecializationID, " - "LegacySlotIndex, TriggerType, ParentItemID FROM item_effect ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_EFFECT, "SELECT ID, LegacySlotIndex, TriggerType, Charges, CoolDownMSec, CategoryCoolDownMSec, SpellCategoryID, " + "SpellID, ChrSpecializationID, ParentItemID FROM item_effect ORDER BY ID DESC", CONNECTION_SYNCH); // ItemExtendedCost.db2 - PrepareStatement(HOTFIX_SEL_ITEM_EXTENDED_COST, "SELECT ID, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, CurrencyCount1, CurrencyCount2, " - "CurrencyCount3, CurrencyCount4, CurrencyCount5, ItemCount1, ItemCount2, ItemCount3, ItemCount4, ItemCount5, RequiredArenaRating, " - "CurrencyID1, CurrencyID2, CurrencyID3, CurrencyID4, CurrencyID5, ArenaBracket, MinFactionID, MinReputation, Flags, RequiredAchievement" + PrepareStatement(HOTFIX_SEL_ITEM_EXTENDED_COST, "SELECT ID, RequiredArenaRating, ArenaBracket, Flags, MinFactionID, MinReputation, " + "RequiredAchievement, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemCount1, ItemCount2, ItemCount3, ItemCount4, ItemCount5, CurrencyID1, " + "CurrencyID2, CurrencyID3, CurrencyID4, CurrencyID5, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, CurrencyCount5" " FROM item_extended_cost ORDER BY ID DESC", CONNECTION_SYNCH); // ItemLevelSelector.db2 @@ -529,11 +541,11 @@ void HotfixDatabaseConnection::DoPrepareStatements() " FROM item_limit_category_condition ORDER BY ID DESC", CONNECTION_SYNCH); // ItemModifiedAppearance.db2 - PrepareStatement(HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ItemID, ID, ItemAppearanceModifierID, ItemAppearanceID, OrderIndex, " + PrepareStatement(HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ID, ItemID, ItemAppearanceModifierID, ItemAppearanceID, OrderIndex, " "TransmogSourceTypeEnum FROM item_modified_appearance ORDER BY ID DESC", CONNECTION_SYNCH); // ItemPriceBase.db2 - PrepareStatement(HOTFIX_SEL_ITEM_PRICE_BASE, "SELECT ID, Armor, Weapon, ItemLevel FROM item_price_base ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_PRICE_BASE, "SELECT ID, ItemLevel, Armor, Weapon FROM item_price_base ORDER BY ID DESC", CONNECTION_SYNCH); // ItemRandomProperties.db2 PrepareStatement(HOTFIX_SEL_ITEM_RANDOM_PROPERTIES, "SELECT ID, Name, Enchantment1, Enchantment2, Enchantment3, Enchantment4, Enchantment5" @@ -546,47 +558,46 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name_lang FROM item_random_suffix_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemSearchName.db2 - PrepareStatement(HOTFIX_SEL_ITEM_SEARCH_NAME, "SELECT AllowableRace, Display, ID, Flags1, Flags2, Flags3, ItemLevel, OverallQualityID, " - "ExpansionID, RequiredLevel, MinFactionID, MinReputation, AllowableClass, RequiredSkill, RequiredSkillRank, RequiredAbility" + PrepareStatement(HOTFIX_SEL_ITEM_SEARCH_NAME, "SELECT AllowableRace, Display, ID, OverallQualityID, ExpansionID, MinFactionID, MinReputation, " + "AllowableClass, RequiredLevel, RequiredSkill, RequiredSkillRank, RequiredAbility, ItemLevel, Flags1, Flags2, Flags3, Flags4" " FROM item_search_name ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SEARCH_NAME, "SELECT ID, Display_lang FROM item_search_name_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemSet.db2 - PrepareStatement(HOTFIX_SEL_ITEM_SET, "SELECT ID, Name, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, ItemID6, ItemID7, ItemID8, ItemID9, " - "ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, RequiredSkillRank, RequiredSkill, SetFlags FROM item_set" + PrepareStatement(HOTFIX_SEL_ITEM_SET, "SELECT ID, Name, SetFlags, RequiredSkill, RequiredSkillRank, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, " + "ItemID6, ItemID7, ItemID8, ItemID9, ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17 FROM item_set" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SET, "SELECT ID, Name_lang FROM item_set_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemSetSpell.db2 - PrepareStatement(HOTFIX_SEL_ITEM_SET_SPELL, "SELECT ID, SpellID, ChrSpecID, Threshold, ItemSetID FROM item_set_spell ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_SET_SPELL, "SELECT ID, ChrSpecID, SpellID, Threshold, ItemSetID FROM item_set_spell ORDER BY ID DESC", CONNECTION_SYNCH); // ItemSparse.db2 - PrepareStatement(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, AllowableRace, Display, Display1, Display2, Display3, Description, Flags1, Flags2, Flags3, " - "Flags4, PriceRandomValue, PriceVariance, VendorStackCount, BuyPrice, SellPrice, RequiredAbility, MaxCount, Stackable, StatPercentEditor1, " - "StatPercentEditor2, StatPercentEditor3, StatPercentEditor4, StatPercentEditor5, StatPercentEditor6, StatPercentEditor7, StatPercentEditor8, " - "StatPercentEditor9, StatPercentEditor10, StatPercentageOfSocket1, StatPercentageOfSocket2, StatPercentageOfSocket3, StatPercentageOfSocket4, " - "StatPercentageOfSocket5, StatPercentageOfSocket6, StatPercentageOfSocket7, StatPercentageOfSocket8, StatPercentageOfSocket9, " - "StatPercentageOfSocket10, ItemRange, BagFamily, QualityModifier, DurationInInventory, DmgVariance, AllowableClass, ItemLevel, RequiredSkill, " - "RequiredSkillRank, MinFactionID, ItemStatValue1, ItemStatValue2, ItemStatValue3, ItemStatValue4, ItemStatValue5, ItemStatValue6, " - "ItemStatValue7, ItemStatValue8, ItemStatValue9, ItemStatValue10, ScalingStatDistributionID, ItemDelay, PageID, StartQuestID, LockID, " - "RandomSelect, ItemRandomSuffixGroupID, ItemSet, ZoneBound, InstanceBound, TotemCategoryID, SocketMatchEnchantmentId, GemProperties, " - "LimitCategory, RequiredHoliday, RequiredTransmogHoliday, ItemNameDescriptionID, OverallQualityID, InventoryType, RequiredLevel, " - "RequiredPVPRank, RequiredPVPMedal, MinReputation, ContainerSlots, StatModifierBonusStat1, StatModifierBonusStat2, StatModifierBonusStat3, " - "StatModifierBonusStat4, StatModifierBonusStat5, StatModifierBonusStat6, StatModifierBonusStat7, StatModifierBonusStat8, " - "StatModifierBonusStat9, StatModifierBonusStat10, DamageDamageType, Bonding, LanguageID, PageMaterialID, Material, SheatheType, SocketType1, " - "SocketType2, SocketType3, SpellWeightCategory, SpellWeight, ArtifactID, ExpansionID FROM item_sparse ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Display_lang, Display1_lang, Display2_lang, Display3_lang, Description_lang" + PrepareStatement(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, AllowableRace, Description, Display3, Display2, Display1, Display, DmgVariance, " + "DurationInInventory, QualityModifier, BagFamily, ItemRange, StatPercentageOfSocket1, StatPercentageOfSocket2, StatPercentageOfSocket3, " + "StatPercentageOfSocket4, StatPercentageOfSocket5, StatPercentageOfSocket6, StatPercentageOfSocket7, StatPercentageOfSocket8, " + "StatPercentageOfSocket9, StatPercentageOfSocket10, StatPercentEditor1, StatPercentEditor2, StatPercentEditor3, StatPercentEditor4, " + "StatPercentEditor5, StatPercentEditor6, StatPercentEditor7, StatPercentEditor8, StatPercentEditor9, StatPercentEditor10, Stackable, " + "MaxCount, RequiredAbility, SellPrice, BuyPrice, VendorStackCount, PriceVariance, PriceRandomValue, Flags1, Flags2, Flags3, Flags4, " + "FactionRelated, ItemNameDescriptionID, RequiredTransmogHoliday, RequiredHoliday, LimitCategory, GemProperties, SocketMatchEnchantmentId, " + "TotemCategoryID, InstanceBound, ZoneBound, ItemSet, ItemRandomSuffixGroupID, RandomSelect, LockID, StartQuestID, PageID, ItemDelay, " + "ScalingStatDistributionID, MinFactionID, RequiredSkillRank, RequiredSkill, ItemLevel, AllowableClass, ExpansionID, ArtifactID, SpellWeight, " + "SpellWeightCategory, SocketType1, SocketType2, SocketType3, SheatheType, Material, PageMaterialID, LanguageID, Bonding, DamageDamageType, " + "StatModifierBonusStat1, StatModifierBonusStat2, StatModifierBonusStat3, StatModifierBonusStat4, StatModifierBonusStat5, " + "StatModifierBonusStat6, StatModifierBonusStat7, StatModifierBonusStat8, StatModifierBonusStat9, StatModifierBonusStat10, ContainerSlots, " + "MinReputation, RequiredPVPMedal, RequiredPVPRank, RequiredLevel, InventoryType, OverallQualityID FROM item_sparse ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Description_lang, Display3_lang, Display2_lang, Display1_lang, Display_lang" " FROM item_sparse_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemSpec.db2 - PrepareStatement(HOTFIX_SEL_ITEM_SPEC, "SELECT ID, SpecializationID, MinLevel, MaxLevel, ItemType, PrimaryStat, SecondaryStat FROM item_spec" + PrepareStatement(HOTFIX_SEL_ITEM_SPEC, "SELECT ID, MinLevel, MaxLevel, ItemType, PrimaryStat, SecondaryStat, SpecializationID FROM item_spec" " ORDER BY ID DESC", CONNECTION_SYNCH); // ItemSpecOverride.db2 PrepareStatement(HOTFIX_SEL_ITEM_SPEC_OVERRIDE, "SELECT ID, SpecID, ItemID FROM item_spec_override ORDER BY ID DESC", CONNECTION_SYNCH); // ItemUpgrade.db2 - PrepareStatement(HOTFIX_SEL_ITEM_UPGRADE, "SELECT ID, CurrencyAmount, PrerequisiteID, CurrencyType, ItemUpgradePathID, ItemLevelIncrement" + PrepareStatement(HOTFIX_SEL_ITEM_UPGRADE, "SELECT ID, ItemUpgradePathID, ItemLevelIncrement, PrerequisiteID, CurrencyType, CurrencyAmount" " FROM item_upgrade ORDER BY ID DESC", CONNECTION_SYNCH); // ItemXBonusTree.db2 @@ -598,10 +609,10 @@ void HotfixDatabaseConnection::DoPrepareStatements() " ORDER BY ID DESC", CONNECTION_SYNCH); // LfgDungeons.db2 - PrepareStatement(HOTFIX_SEL_LFG_DUNGEONS, "SELECT ID, Name, Description, Flags, MinGear, MaxLevel, TargetLevelMax, MapID, RandomID, ScenarioID, " - "FinalEncounterID, BonusReputationAmount, MentorItemLevel, RequiredPlayerConditionId, MinLevel, TargetLevel, TargetLevelMin, DifficultyID, " - "TypeID, Faction, ExpansionLevel, OrderIndex, GroupID, CountTank, CountHealer, CountDamage, MinCountTank, MinCountHealer, MinCountDamage, " - "Subtype, MentorCharLevel, IconTextureFileID, RewardsBgTextureFileID, PopupBgTextureFileID FROM lfg_dungeons ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_LFG_DUNGEONS, "SELECT ID, Name, Description, MinLevel, MaxLevel, TypeID, Subtype, Faction, IconTextureFileID, " + "RewardsBgTextureFileID, PopupBgTextureFileID, ExpansionLevel, MapID, DifficultyID, MinGear, GroupID, OrderIndex, RequiredPlayerConditionId, " + "TargetLevel, TargetLevelMin, TargetLevelMax, RandomID, ScenarioID, FinalEncounterID, CountTank, CountHealer, CountDamage, MinCountTank, " + "MinCountHealer, MinCountDamage, BonusReputationAmount, MentorItemLevel, MentorCharLevel, Flags1, Flags2 FROM lfg_dungeons ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_LFG_DUNGEONS, "SELECT ID, Name_lang, Description_lang FROM lfg_dungeons_locale WHERE locale = ?", CONNECTION_SYNCH); // Light.db2 @@ -610,11 +621,12 @@ void HotfixDatabaseConnection::DoPrepareStatements() " ORDER BY ID DESC", CONNECTION_SYNCH); // LiquidType.db2 - PrepareStatement(HOTFIX_SEL_LIQUID_TYPE, "SELECT ID, Name, Texture1, Texture2, Texture3, Texture4, Texture5, Texture6, SpellID, MaxDarkenDepth, " - "FogDarkenIntensity, AmbDarkenIntensity, DirDarkenIntensity, ParticleScale, Color1, Color2, Float1, Float2, Float3, `Float4`, Float5, Float6, " - "Float7, `Float8`, Float9, Float10, Float11, Float12, Float13, Float14, Float15, Float16, Float17, Float18, `Int1`, `Int2`, `Int3`, `Int4`, " - "Flags, LightID, SoundBank, ParticleMovement, ParticleTexSlots, MaterialID, FrameCountTexture1, FrameCountTexture2, FrameCountTexture3, " - "FrameCountTexture4, FrameCountTexture5, FrameCountTexture6, SoundID FROM liquid_type ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_LIQUID_TYPE, "SELECT ID, Name, Texture1, Texture2, Texture3, Texture4, Texture5, Texture6, Flags, SoundBank, SoundID, " + "SpellID, MaxDarkenDepth, FogDarkenIntensity, AmbDarkenIntensity, DirDarkenIntensity, LightID, ParticleScale, ParticleMovement, " + "ParticleTexSlots, MaterialID, MinimapStaticCol, FrameCountTexture1, FrameCountTexture2, FrameCountTexture3, FrameCountTexture4, " + "FrameCountTexture5, FrameCountTexture6, Color1, Color2, Float1, Float2, Float3, `Float4`, Float5, Float6, Float7, `Float8`, Float9, Float10, " + "Float11, Float12, Float13, Float14, Float15, Float16, Float17, Float18, `Int1`, `Int2`, `Int3`, `Int4`, Coefficient1, Coefficient2, " + "Coefficient3, Coefficient4 FROM liquid_type ORDER BY ID DESC", CONNECTION_SYNCH); // Lock.db2 PrepareStatement(HOTFIX_SEL_LOCK, "SELECT ID, Index1, Index2, Index3, Index4, Index5, Index6, Index7, Index8, Skill1, Skill2, Skill3, Skill4, " @@ -627,28 +639,28 @@ void HotfixDatabaseConnection::DoPrepareStatements() // Map.db2 PrepareStatement(HOTFIX_SEL_MAP, "SELECT ID, Directory, MapName, MapDescription0, MapDescription1, PvpShortDescription, PvpLongDescription, " - "Flags1, Flags2, MinimapIconScale, CorpseX, CorpseY, AreaTableID, LoadingScreenID, CorpseMapID, TimeOfDayOverride, ParentMapID, " - "CosmeticParentMapID, WindSettingsID, InstanceType, MapType, ExpansionID, MaxPlayers, TimeOffset FROM map ORDER BY ID DESC", CONNECTION_SYNCH); + "CorpseX, CorpseY, MapType, InstanceType, ExpansionID, AreaTableID, LoadingScreenID, TimeOfDayOverride, ParentMapID, CosmeticParentMapID, " + "TimeOffset, MinimapIconScale, CorpseMapID, MaxPlayers, WindSettingsID, ZmpFileDataID, Flags1, Flags2 FROM map ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_MAP, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang, PvpShortDescription_lang, " "PvpLongDescription_lang FROM map_locale WHERE locale = ?", CONNECTION_SYNCH); // MapDifficulty.db2 - PrepareStatement(HOTFIX_SEL_MAP_DIFFICULTY, "SELECT ID, Message, DifficultyID, ResetInterval, MaxPlayers, LockID, Flags, ItemContext, " - "ItemContextPickerID, MapID FROM map_difficulty ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MAP_DIFFICULTY, "SELECT ID, Message, ItemContextPickerID, ContentTuningID, DifficultyID, LockID, ResetInterval, " + "MaxPlayers, ItemContext, Flags, MapID FROM map_difficulty ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_MAP_DIFFICULTY, "SELECT ID, Message_lang FROM map_difficulty_locale WHERE locale = ?", CONNECTION_SYNCH); // ModifierTree.db2 - PrepareStatement(HOTFIX_SEL_MODIFIER_TREE, "SELECT ID, Asset, SecondaryAsset, Parent, Type, TertiaryAsset, Operator, Amount FROM modifier_tree" + PrepareStatement(HOTFIX_SEL_MODIFIER_TREE, "SELECT ID, Parent, Operator, Amount, Type, Asset, SecondaryAsset, TertiaryAsset FROM modifier_tree" " ORDER BY ID DESC", CONNECTION_SYNCH); // Mount.db2 - PrepareStatement(HOTFIX_SEL_MOUNT, "SELECT Name, Description, SourceText, SourceSpellID, MountFlyRideHeight, MountTypeID, Flags, SourceTypeEnum, " - "ID, PlayerConditionID, UiModelSceneID FROM mount ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_MOUNT, "SELECT ID, Name_lang, Description_lang, SourceText_lang FROM mount_locale WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MOUNT, "SELECT Name, SourceText, Description, ID, MountTypeID, Flags, SourceTypeEnum, SourceSpellID, " + "PlayerConditionID, MountFlyRideHeight, UiModelSceneID FROM mount ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_MOUNT, "SELECT ID, Name_lang, SourceText_lang, Description_lang FROM mount_locale WHERE locale = ?", CONNECTION_SYNCH); // MountCapability.db2 - PrepareStatement(HOTFIX_SEL_MOUNT_CAPABILITY, "SELECT ReqSpellKnownID, ModSpellAuraID, ReqRidingSkill, ReqAreaID, ReqMapID, Flags, ID, " - "ReqSpellAuraID FROM mount_capability ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MOUNT_CAPABILITY, "SELECT ID, Flags, ReqRidingSkill, ReqAreaID, ReqSpellAuraID, ReqSpellKnownID, ModSpellAuraID, " + "ReqMapID FROM mount_capability ORDER BY ID DESC", CONNECTION_SYNCH); // MountTypeXCapability.db2 PrepareStatement(HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, MountCapabilityID, OrderIndex FROM mount_type_x_capability" @@ -658,7 +670,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_MOUNT_X_DISPLAY, "SELECT ID, CreatureDisplayInfoID, PlayerConditionID, MountID FROM mount_x_display ORDER BY ID DESC", CONNECTION_SYNCH); // Movie.db2 - PrepareStatement(HOTFIX_SEL_MOVIE, "SELECT ID, AudioFileDataID, SubtitleFileDataID, Volume, KeyID FROM movie ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MOVIE, "SELECT ID, Volume, KeyID, AudioFileDataID, SubtitleFileDataID FROM movie ORDER BY ID DESC", CONNECTION_SYNCH); // NameGen.db2 PrepareStatement(HOTFIX_SEL_NAME_GEN, "SELECT ID, Name, RaceID, Sex FROM name_gen ORDER BY ID DESC", CONNECTION_SYNCH); @@ -683,35 +695,35 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_PHASE_X_PHASE_GROUP, "SELECT ID, PhaseID, PhaseGroupID FROM phase_x_phase_group ORDER BY ID DESC", CONNECTION_SYNCH); // PlayerCondition.db2 - PrepareStatement(HOTFIX_SEL_PLAYER_CONDITION, "SELECT RaceMask, FailureDescription, ID, Flags, MinLevel, MaxLevel, ClassMask, Gender, " - "NativeGender, SkillLogic, LanguageID, MinLanguage, MaxLanguage, MaxFactionID, MaxReputation, ReputationLogic, CurrentPvpFaction, MinPVPRank, " - "MaxPVPRank, PvpMedal, PrevQuestLogic, CurrQuestLogic, CurrentCompletedQuestLogic, SpellLogic, ItemLogic, ItemFlags, AuraSpellLogic, " - "WorldStateExpressionID, WeatherID, PartyStatus, LifetimeMaxPVPRank, AchievementLogic, LfgLogic, AreaLogic, CurrencyLogic, QuestKillID, " - "QuestKillLogic, MinExpansionLevel, MaxExpansionLevel, MinExpansionTier, MaxExpansionTier, MinGuildLevel, MaxGuildLevel, PhaseUseFlags, " - "PhaseID, PhaseGroupID, MinAvgItemLevel, MaxAvgItemLevel, MinAvgEquippedItemLevel, MaxAvgEquippedItemLevel, ChrSpecializationIndex, " - "ChrSpecializationRole, PowerType, PowerTypeComp, PowerTypeValue, ModifierTreeID, WeaponSubclassMask, SkillID1, SkillID2, SkillID3, SkillID4, " - "MinSkill1, MinSkill2, MinSkill3, MinSkill4, MaxSkill1, MaxSkill2, MaxSkill3, MaxSkill4, MinFactionID1, MinFactionID2, MinFactionID3, " - "MinReputation1, MinReputation2, MinReputation3, PrevQuestID1, PrevQuestID2, PrevQuestID3, PrevQuestID4, CurrQuestID1, CurrQuestID2, " - "CurrQuestID3, CurrQuestID4, CurrentCompletedQuestID1, CurrentCompletedQuestID2, CurrentCompletedQuestID3, CurrentCompletedQuestID4, " - "SpellID1, SpellID2, SpellID3, SpellID4, ItemID1, ItemID2, ItemID3, ItemID4, ItemCount1, ItemCount2, ItemCount3, ItemCount4, Explored1, " - "Explored2, Time1, Time2, AuraSpellID1, AuraSpellID2, AuraSpellID3, AuraSpellID4, AuraStacks1, AuraStacks2, AuraStacks3, AuraStacks4, " - "Achievement1, Achievement2, Achievement3, Achievement4, LfgStatus1, LfgStatus2, LfgStatus3, LfgStatus4, LfgCompare1, LfgCompare2, " - "LfgCompare3, LfgCompare4, LfgValue1, LfgValue2, LfgValue3, LfgValue4, AreaID1, AreaID2, AreaID3, AreaID4, CurrencyID1, CurrencyID2, " - "CurrencyID3, CurrencyID4, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, QuestKillMonster1, QuestKillMonster2, " - "QuestKillMonster3, QuestKillMonster4, QuestKillMonster5, QuestKillMonster6, MovementFlags1, MovementFlags2 FROM player_condition" - " ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_PLAYER_CONDITION, "SELECT RaceMask, FailureDescription, ID, MinLevel, MaxLevel, ClassMask, SkillLogic, LanguageID, " + "MinLanguage, MaxLanguage, MaxFactionID, MaxReputation, ReputationLogic, CurrentPvpFaction, PvpMedal, PrevQuestLogic, CurrQuestLogic, " + "CurrentCompletedQuestLogic, SpellLogic, ItemLogic, ItemFlags, AuraSpellLogic, WorldStateExpressionID, WeatherID, PartyStatus, " + "LifetimeMaxPVPRank, AchievementLogic, Gender, NativeGender, AreaLogic, LfgLogic, CurrencyLogic, QuestKillID, QuestKillLogic, " + "MinExpansionLevel, MaxExpansionLevel, MinAvgItemLevel, MaxAvgItemLevel, MinAvgEquippedItemLevel, MaxAvgEquippedItemLevel, PhaseUseFlags, " + "PhaseID, PhaseGroupID, Flags, ChrSpecializationIndex, ChrSpecializationRole, ModifierTreeID, PowerType, PowerTypeComp, PowerTypeValue, " + "WeaponSubclassMask, MaxGuildLevel, MinGuildLevel, MaxExpansionTier, MinExpansionTier, MinPVPRank, MaxPVPRank, SkillID1, SkillID2, SkillID3, " + "SkillID4, MinSkill1, MinSkill2, MinSkill3, MinSkill4, MaxSkill1, MaxSkill2, MaxSkill3, MaxSkill4, MinFactionID1, MinFactionID2, " + "MinFactionID3, MinReputation1, MinReputation2, MinReputation3, PrevQuestID1, PrevQuestID2, PrevQuestID3, PrevQuestID4, CurrQuestID1, " + "CurrQuestID2, CurrQuestID3, CurrQuestID4, CurrentCompletedQuestID1, CurrentCompletedQuestID2, CurrentCompletedQuestID3, " + "CurrentCompletedQuestID4, SpellID1, SpellID2, SpellID3, SpellID4, ItemID1, ItemID2, ItemID3, ItemID4, ItemCount1, ItemCount2, ItemCount3, " + "ItemCount4, Explored1, Explored2, Time1, Time2, AuraSpellID1, AuraSpellID2, AuraSpellID3, AuraSpellID4, AuraStacks1, AuraStacks2, " + "AuraStacks3, AuraStacks4, Achievement1, Achievement2, Achievement3, Achievement4, AreaID1, AreaID2, AreaID3, AreaID4, LfgStatus1, " + "LfgStatus2, LfgStatus3, LfgStatus4, LfgCompare1, LfgCompare2, LfgCompare3, LfgCompare4, LfgValue1, LfgValue2, LfgValue3, LfgValue4, " + "CurrencyID1, CurrencyID2, CurrencyID3, CurrencyID4, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, QuestKillMonster1, " + "QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, QuestKillMonster5, QuestKillMonster6, MovementFlags1, MovementFlags2" + " FROM player_condition ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_PLAYER_CONDITION, "SELECT ID, FailureDescription_lang FROM player_condition_locale WHERE locale = ?", CONNECTION_SYNCH); // PowerDisplay.db2 PrepareStatement(HOTFIX_SEL_POWER_DISPLAY, "SELECT ID, GlobalStringBaseTag, ActualType, Red, Green, Blue FROM power_display ORDER BY ID DESC", CONNECTION_SYNCH); // PowerType.db2 - PrepareStatement(HOTFIX_SEL_POWER_TYPE, "SELECT ID, NameGlobalStringTag, CostGlobalStringTag, RegenPeace, RegenCombat, MaxBasePower, " - "RegenInterruptTimeMS, Flags, PowerTypeEnum, MinPower, CenterPower, DefaultPower, DisplayModifier FROM power_type ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_POWER_TYPE, "SELECT ID, NameGlobalStringTag, CostGlobalStringTag, PowerTypeEnum, MinPower, MaxBasePower, CenterPower, " + "DefaultPower, DisplayModifier, RegenInterruptTimeMS, RegenPeace, RegenCombat, Flags FROM power_type ORDER BY ID DESC", CONNECTION_SYNCH); // PrestigeLevelInfo.db2 - PrepareStatement(HOTFIX_SEL_PRESTIGE_LEVEL_INFO, "SELECT ID, Name, BadgeTextureFileDataID, PrestigeLevel, Flags FROM prestige_level_info" - " ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_PRESTIGE_LEVEL_INFO, "SELECT ID, Name, PrestigeLevel, BadgeTextureFileDataID, Flags, AwardedAchievementID" + " FROM prestige_level_info ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_PRESTIGE_LEVEL_INFO, "SELECT ID, Name_lang FROM prestige_level_info_locale WHERE locale = ?", CONNECTION_SYNCH); // PvpDifficulty.db2 @@ -720,16 +732,17 @@ void HotfixDatabaseConnection::DoPrepareStatements() // PvpItem.db2 PrepareStatement(HOTFIX_SEL_PVP_ITEM, "SELECT ID, ItemID, ItemLevelDelta FROM pvp_item ORDER BY ID DESC", CONNECTION_SYNCH); - // PvpReward.db2 - PrepareStatement(HOTFIX_SEL_PVP_REWARD, "SELECT ID, HonorLevel, PrestigeLevel, RewardPackID FROM pvp_reward ORDER BY ID DESC", CONNECTION_SYNCH); - // PvpTalent.db2 - PrepareStatement(HOTFIX_SEL_PVP_TALENT, "SELECT ID, Description, SpellID, OverridesSpellID, ActionBarSpellID, TierID, ColumnIndex, Flags, " - "ClassID, SpecID, Role FROM pvp_talent ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_PVP_TALENT, "SELECT Description, ID, SpecID, SpellID, OverridesSpellID, Flags, ActionBarSpellID, PvpTalentCategoryID, " + "LevelRequired FROM pvp_talent ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_PVP_TALENT, "SELECT ID, Description_lang FROM pvp_talent_locale WHERE locale = ?", CONNECTION_SYNCH); - // PvpTalentUnlock.db2 - PrepareStatement(HOTFIX_SEL_PVP_TALENT_UNLOCK, "SELECT ID, TierID, ColumnIndex, HonorLevel FROM pvp_talent_unlock ORDER BY ID DESC", CONNECTION_SYNCH); + // PvpTalentCategory.db2 + PrepareStatement(HOTFIX_SEL_PVP_TALENT_CATEGORY, "SELECT ID, TalentSlotMask FROM pvp_talent_category ORDER BY ID DESC", CONNECTION_SYNCH); + + // PvpTalentSlotUnlock.db2 + PrepareStatement(HOTFIX_SEL_PVP_TALENT_SLOT_UNLOCK, "SELECT ID, Slot, LevelRequired, DeathKnightLevelRequired, DemonHunterLevelRequired" + " FROM pvp_talent_slot_unlock ORDER BY ID DESC", CONNECTION_SYNCH); // QuestFactionReward.db2 PrepareStatement(HOTFIX_SEL_QUEST_FACTION_REWARD, "SELECT ID, Difficulty1, Difficulty2, Difficulty3, Difficulty4, Difficulty5, Difficulty6, " @@ -740,7 +753,7 @@ void HotfixDatabaseConnection::DoPrepareStatements() "Difficulty7, Difficulty8, Difficulty9, Difficulty10 FROM quest_money_reward ORDER BY ID DESC", CONNECTION_SYNCH); // QuestPackageItem.db2 - PrepareStatement(HOTFIX_SEL_QUEST_PACKAGE_ITEM, "SELECT ID, ItemID, PackageID, DisplayType, ItemQuantity FROM quest_package_item ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_QUEST_PACKAGE_ITEM, "SELECT ID, PackageID, ItemID, ItemQuantity, DisplayType FROM quest_package_item ORDER BY ID DESC", CONNECTION_SYNCH); // QuestSort.db2 PrepareStatement(HOTFIX_SEL_QUEST_SORT, "SELECT ID, SortName, UiOrderIndex FROM quest_sort ORDER BY ID DESC", CONNECTION_SYNCH); @@ -754,11 +767,11 @@ void HotfixDatabaseConnection::DoPrepareStatements() "Difficulty8, Difficulty9, Difficulty10 FROM quest_xp ORDER BY ID DESC", CONNECTION_SYNCH); // RandPropPoints.db2 - PrepareStatement(HOTFIX_SEL_RAND_PROP_POINTS, "SELECT ID, Epic1, Epic2, Epic3, Epic4, Epic5, Superior1, Superior2, Superior3, Superior4, " - "Superior5, Good1, Good2, Good3, Good4, Good5 FROM rand_prop_points ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_RAND_PROP_POINTS, "SELECT ID, DamageReplaceStat, Epic1, Epic2, Epic3, Epic4, Epic5, Superior1, Superior2, Superior3, " + "Superior4, Superior5, Good1, Good2, Good3, Good4, Good5 FROM rand_prop_points ORDER BY ID DESC", CONNECTION_SYNCH); // RewardPack.db2 - PrepareStatement(HOTFIX_SEL_REWARD_PACK, "SELECT ID, Money, ArtifactXPMultiplier, ArtifactXPDifficulty, ArtifactXPCategoryID, CharTitleID, " + PrepareStatement(HOTFIX_SEL_REWARD_PACK, "SELECT ID, CharTitleID, Money, ArtifactXPDifficulty, ArtifactXPMultiplier, ArtifactXPCategoryID, " "TreasurePickerID FROM reward_pack ORDER BY ID DESC", CONNECTION_SYNCH); // RewardPackXCurrencyType.db2 @@ -771,20 +784,17 @@ void HotfixDatabaseConnection::DoPrepareStatements() // RulesetItemUpgrade.db2 PrepareStatement(HOTFIX_SEL_RULESET_ITEM_UPGRADE, "SELECT ID, ItemID, ItemUpgradeID FROM ruleset_item_upgrade ORDER BY ID DESC", CONNECTION_SYNCH); - // SandboxScaling.db2 - PrepareStatement(HOTFIX_SEL_SANDBOX_SCALING, "SELECT ID, MinLevel, MaxLevel, Flags FROM sandbox_scaling ORDER BY ID DESC", CONNECTION_SYNCH); - // ScalingStatDistribution.db2 PrepareStatement(HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, "SELECT ID, PlayerLevelToItemLevelCurveID, MinLevel, MaxLevel" " FROM scaling_stat_distribution ORDER BY ID DESC", CONNECTION_SYNCH); // Scenario.db2 - PrepareStatement(HOTFIX_SEL_SCENARIO, "SELECT ID, Name, AreaTableID, Flags, Type FROM scenario ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SCENARIO, "SELECT ID, Name, AreaTableID, Type, Flags, UiTextureKitID FROM scenario ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SCENARIO, "SELECT ID, Name_lang FROM scenario_locale WHERE locale = ?", CONNECTION_SYNCH); // ScenarioStep.db2 - PrepareStatement(HOTFIX_SEL_SCENARIO_STEP, "SELECT ID, Description, Title, ScenarioID, Supersedes, RewardQuestID, OrderIndex, Flags, " - "Criteriatreeid, RelatedStep FROM scenario_step ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SCENARIO_STEP, "SELECT ID, Description, Title, ScenarioID, Criteriatreeid, RewardQuestID, RelatedStep, Supersedes, " + "OrderIndex, Flags, VisibilityPlayerConditionID, WidgetSetID FROM scenario_step ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SCENARIO_STEP, "SELECT ID, Description_lang, Title_lang FROM scenario_step_locale WHERE locale = ?", CONNECTION_SYNCH); // SceneScript.db2 @@ -800,81 +810,76 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_SCENE_SCRIPT_TEXT, "SELECT ID, Name, Script FROM scene_script_text ORDER BY ID DESC", CONNECTION_SYNCH); // SkillLine.db2 - PrepareStatement(HOTFIX_SEL_SKILL_LINE, "SELECT ID, DisplayName, Description, AlternateVerb, Flags, CategoryID, CanLink, SpellIconFileID, " - "ParentSkillLineID FROM skill_line ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_SKILL_LINE, "SELECT ID, DisplayName_lang, Description_lang, AlternateVerb_lang FROM skill_line_locale" - " WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SKILL_LINE, "SELECT DisplayName, AlternateVerb, Description, HordeDisplayName, OverrideSourceInfoDisplayName, ID, " + "CategoryID, SpellIconFileID, CanLink, ParentSkillLineID, ParentTierIndex, Flags, SpellBookSpellID FROM skill_line ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SKILL_LINE, "SELECT ID, DisplayName_lang, AlternateVerb_lang, Description_lang, HordeDisplayName_lang" + " FROM skill_line_locale WHERE locale = ?", CONNECTION_SYNCH); // SkillLineAbility.db2 - PrepareStatement(HOTFIX_SEL_SKILL_LINE_ABILITY, "SELECT RaceMask, ID, Spell, SupercedesSpell, SkillLine, TrivialSkillLineRankHigh, " - "TrivialSkillLineRankLow, UniqueBit, TradeSkillCategoryID, NumSkillUps, ClassMask, MinSkillLineRank, AcquireMethod, Flags" + PrepareStatement(HOTFIX_SEL_SKILL_LINE_ABILITY, "SELECT RaceMask, ID, SkillLine, Spell, MinSkillLineRank, ClassMask, SupercedesSpell, " + "AcquireMethod, TrivialSkillLineRankHigh, TrivialSkillLineRankLow, Flags, NumSkillUps, UniqueBit, TradeSkillCategoryID, SkillupSkillLineID" " FROM skill_line_ability ORDER BY ID DESC", CONNECTION_SYNCH); // SkillRaceClassInfo.db2 - PrepareStatement(HOTFIX_SEL_SKILL_RACE_CLASS_INFO, "SELECT ID, RaceMask, SkillID, Flags, SkillTierID, Availability, MinLevel, ClassMask" + PrepareStatement(HOTFIX_SEL_SKILL_RACE_CLASS_INFO, "SELECT ID, RaceMask, SkillID, ClassMask, Flags, Availability, MinLevel, SkillTierID" " FROM skill_race_class_info ORDER BY ID DESC", CONNECTION_SYNCH); // SoundKit.db2 - PrepareStatement(HOTFIX_SEL_SOUND_KIT, "SELECT ID, VolumeFloat, MinDistance, DistanceCutoff, Flags, SoundEntriesAdvancedID, SoundType, " - "DialogType, EAXDef, VolumeVariationPlus, VolumeVariationMinus, PitchVariationPlus, PitchVariationMinus, PitchAdjust, BusOverwriteID, " - "MaxInstances FROM sound_kit ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SOUND_KIT, "SELECT ID, SoundType, VolumeFloat, Flags, MinDistance, DistanceCutoff, EAXDef, SoundKitAdvancedID, " + "VolumeVariationPlus, VolumeVariationMinus, PitchVariationPlus, PitchVariationMinus, DialogType, PitchAdjust, BusOverwriteID, MaxInstances" + " FROM sound_kit ORDER BY ID DESC", CONNECTION_SYNCH); // SpecializationSpells.db2 - PrepareStatement(HOTFIX_SEL_SPECIALIZATION_SPELLS, "SELECT Description, SpellID, OverridesSpellID, SpecID, DisplayOrder, ID" + PrepareStatement(HOTFIX_SEL_SPECIALIZATION_SPELLS, "SELECT Description, ID, SpecID, SpellID, OverridesSpellID, DisplayOrder" " FROM specialization_spells ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SPECIALIZATION_SPELLS, "SELECT ID, Description_lang FROM specialization_spells_locale WHERE locale = ?", CONNECTION_SYNCH); - // Spell.db2 - PrepareStatement(HOTFIX_SEL_SPELL, "SELECT ID, Name, NameSubtext, Description, AuraDescription FROM spell ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL, "SELECT ID, Name_lang, NameSubtext_lang, Description_lang, AuraDescription_lang FROM spell_locale" - " WHERE locale = ?", CONNECTION_SYNCH); - // SpellAuraOptions.db2 - PrepareStatement(HOTFIX_SEL_SPELL_AURA_OPTIONS, "SELECT ID, ProcCharges, ProcTypeMask, ProcCategoryRecovery, CumulativeAura, " - "SpellProcsPerMinuteID, DifficultyID, ProcChance, SpellID FROM spell_aura_options ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_AURA_OPTIONS, "SELECT ID, DifficultyID, CumulativeAura, ProcCategoryRecovery, ProcChance, ProcCharges, " + "SpellProcsPerMinuteID, ProcTypeMask1, ProcTypeMask2, SpellID FROM spell_aura_options ORDER BY ID DESC", CONNECTION_SYNCH); // SpellAuraRestrictions.db2 - PrepareStatement(HOTFIX_SEL_SPELL_AURA_RESTRICTIONS, "SELECT ID, CasterAuraSpell, TargetAuraSpell, ExcludeCasterAuraSpell, " - "ExcludeTargetAuraSpell, DifficultyID, CasterAuraState, TargetAuraState, ExcludeCasterAuraState, ExcludeTargetAuraState, SpellID" + PrepareStatement(HOTFIX_SEL_SPELL_AURA_RESTRICTIONS, "SELECT ID, DifficultyID, CasterAuraState, TargetAuraState, ExcludeCasterAuraState, " + "ExcludeTargetAuraState, CasterAuraSpell, TargetAuraSpell, ExcludeCasterAuraSpell, ExcludeTargetAuraSpell, SpellID" " FROM spell_aura_restrictions ORDER BY ID DESC", CONNECTION_SYNCH); // SpellCastTimes.db2 - PrepareStatement(HOTFIX_SEL_SPELL_CAST_TIMES, "SELECT ID, Base, Minimum, PerLevel FROM spell_cast_times ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_CAST_TIMES, "SELECT ID, Base, PerLevel, Minimum FROM spell_cast_times ORDER BY ID DESC", CONNECTION_SYNCH); // SpellCastingRequirements.db2 - PrepareStatement(HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS, "SELECT ID, SpellID, MinFactionID, RequiredAreasID, RequiresSpellFocus, " - "FacingCasterFlags, MinReputation, RequiredAuraVision FROM spell_casting_requirements ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS, "SELECT ID, SpellID, FacingCasterFlags, MinFactionID, MinReputation, RequiredAreasID, " + "RequiredAuraVision, RequiresSpellFocus FROM spell_casting_requirements ORDER BY ID DESC", CONNECTION_SYNCH); // SpellCategories.db2 - PrepareStatement(HOTFIX_SEL_SPELL_CATEGORIES, "SELECT ID, Category, StartRecoveryCategory, ChargeCategory, DifficultyID, DefenseType, DispelType, " - "Mechanic, PreventionType, SpellID FROM spell_categories ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_CATEGORIES, "SELECT ID, DifficultyID, Category, DefenseType, DispelType, Mechanic, PreventionType, " + "StartRecoveryCategory, ChargeCategory, SpellID FROM spell_categories ORDER BY ID DESC", CONNECTION_SYNCH); // SpellCategory.db2 - PrepareStatement(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name, ChargeRecoveryTime, Flags, UsesPerWeek, MaxCharges, TypeMask FROM spell_category" + PrepareStatement(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name, Flags, UsesPerWeek, MaxCharges, ChargeRecoveryTime, TypeMask FROM spell_category" " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_CATEGORY, "SELECT ID, Name_lang FROM spell_category_locale WHERE locale = ?", CONNECTION_SYNCH); // SpellClassOptions.db2 - PrepareStatement(HOTFIX_SEL_SPELL_CLASS_OPTIONS, "SELECT ID, SpellID, SpellClassMask1, SpellClassMask2, SpellClassMask3, SpellClassMask4, " - "SpellClassSet, ModalNextSpell FROM spell_class_options ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_CLASS_OPTIONS, "SELECT ID, SpellID, ModalNextSpell, SpellClassSet, SpellClassMask1, SpellClassMask2, " + "SpellClassMask3, SpellClassMask4 FROM spell_class_options ORDER BY ID DESC", CONNECTION_SYNCH); // SpellCooldowns.db2 - PrepareStatement(HOTFIX_SEL_SPELL_COOLDOWNS, "SELECT ID, CategoryRecoveryTime, RecoveryTime, StartRecoveryTime, DifficultyID, SpellID" + PrepareStatement(HOTFIX_SEL_SPELL_COOLDOWNS, "SELECT ID, DifficultyID, CategoryRecoveryTime, RecoveryTime, StartRecoveryTime, SpellID" " FROM spell_cooldowns ORDER BY ID DESC", CONNECTION_SYNCH); // SpellDuration.db2 - PrepareStatement(HOTFIX_SEL_SPELL_DURATION, "SELECT ID, Duration, MaxDuration, DurationPerLevel FROM spell_duration ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_DURATION, "SELECT ID, Duration, DurationPerLevel, MaxDuration FROM spell_duration ORDER BY ID DESC", CONNECTION_SYNCH); // SpellEffect.db2 - PrepareStatement(HOTFIX_SEL_SPELL_EFFECT, "SELECT ID, Effect, EffectBasePoints, EffectIndex, EffectAura, DifficultyID, EffectAmplitude, " - "EffectAuraPeriod, EffectBonusCoefficient, EffectChainAmplitude, EffectChainTargets, EffectDieSides, EffectItemType, EffectMechanic, " - "EffectPointsPerResource, EffectRealPointsPerLevel, EffectTriggerSpell, EffectPosFacing, EffectAttributes, BonusCoefficientFromAP, " - "PvpMultiplier, Coefficient, Variance, ResourceCoefficient, GroupSizeBasePointsCoefficient, EffectSpellClassMask1, EffectSpellClassMask2, " - "EffectSpellClassMask3, EffectSpellClassMask4, EffectMiscValue1, EffectMiscValue2, EffectRadiusIndex1, EffectRadiusIndex2, ImplicitTarget1, " + PrepareStatement(HOTFIX_SEL_SPELL_EFFECT, "SELECT ID, DifficultyID, EffectIndex, Effect, EffectAmplitude, EffectAttributes, EffectAura, " + "EffectAuraPeriod, EffectBonusCoefficient, EffectChainAmplitude, EffectChainTargets, EffectItemType, EffectMechanic, EffectPointsPerResource, " + "EffectPosFacing, EffectRealPointsPerLevel, EffectTriggerSpell, BonusCoefficientFromAP, PvpMultiplier, Coefficient, Variance, " + "ResourceCoefficient, GroupSizeBasePointsCoefficient, EffectBasePoints, EffectMiscValue1, EffectMiscValue2, EffectRadiusIndex1, " + "EffectRadiusIndex2, EffectSpellClassMask1, EffectSpellClassMask2, EffectSpellClassMask3, EffectSpellClassMask4, ImplicitTarget1, " "ImplicitTarget2, SpellID FROM spell_effect ORDER BY ID DESC", CONNECTION_SYNCH); // SpellEquippedItems.db2 - PrepareStatement(HOTFIX_SEL_SPELL_EQUIPPED_ITEMS, "SELECT ID, SpellID, EquippedItemInvTypes, EquippedItemSubclass, EquippedItemClass" + PrepareStatement(HOTFIX_SEL_SPELL_EQUIPPED_ITEMS, "SELECT ID, SpellID, EquippedItemClass, EquippedItemInvTypes, EquippedItemSubclass" " FROM spell_equipped_items ORDER BY ID DESC", CONNECTION_SYNCH); // SpellFocusObject.db2 @@ -886,15 +891,15 @@ void HotfixDatabaseConnection::DoPrepareStatements() "ChannelInterruptFlags1, ChannelInterruptFlags2, SpellID FROM spell_interrupts ORDER BY ID DESC", CONNECTION_SYNCH); // SpellItemEnchantment.db2 - PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name, EffectArg1, EffectArg2, EffectArg3, EffectScalingPoints1, " - "EffectScalingPoints2, EffectScalingPoints3, TransmogCost, IconFileDataID, EffectPointsMin1, EffectPointsMin2, EffectPointsMin3, ItemVisual, " - "Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, Effect2, Effect3, ConditionID, MinLevel, MaxLevel, ScalingClass, " - "ScalingClassRestricted, TransmogPlayerConditionID FROM spell_item_enchantment ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name_lang FROM spell_item_enchantment_locale WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name, HordeName, EffectArg1, EffectArg2, EffectArg3, EffectScalingPoints1, " + "EffectScalingPoints2, EffectScalingPoints3, TransmogCost, IconFileDataID, TransmogPlayerConditionID, EffectPointsMin1, EffectPointsMin2, " + "EffectPointsMin3, ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, Effect2, Effect3, ScalingClass, " + "ScalingClassRestricted, ConditionID, MinLevel, MaxLevel FROM spell_item_enchantment ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name_lang, HordeName_lang FROM spell_item_enchantment_locale WHERE locale = ?", CONNECTION_SYNCH); // SpellItemEnchantmentCondition.db2 - PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION, "SELECT ID, LtOperand1, LtOperand2, LtOperand3, LtOperand4, LtOperand5, " - "LtOperandType1, LtOperandType2, LtOperandType3, LtOperandType4, LtOperandType5, Operator1, Operator2, Operator3, Operator4, Operator5, " + PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION, "SELECT ID, LtOperandType1, LtOperandType2, LtOperandType3, LtOperandType4, " + "LtOperandType5, LtOperand1, LtOperand2, LtOperand3, LtOperand4, LtOperand5, Operator1, Operator2, Operator3, Operator4, Operator5, " "RtOperandType1, RtOperandType2, RtOperandType3, RtOperandType4, RtOperandType5, RtOperand1, RtOperand2, RtOperand3, RtOperand4, RtOperand5, " "Logic1, Logic2, Logic3, Logic4, Logic5 FROM spell_item_enchantment_condition ORDER BY ID DESC", CONNECTION_SYNCH); @@ -902,33 +907,38 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_SPELL_LEARN_SPELL, "SELECT ID, SpellID, LearnSpellID, OverridesSpellID FROM spell_learn_spell ORDER BY ID DESC", CONNECTION_SYNCH); // SpellLevels.db2 - PrepareStatement(HOTFIX_SEL_SPELL_LEVELS, "SELECT ID, BaseLevel, MaxLevel, SpellLevel, DifficultyID, MaxPassiveAuraLevel, SpellID" + PrepareStatement(HOTFIX_SEL_SPELL_LEVELS, "SELECT ID, DifficultyID, BaseLevel, MaxLevel, SpellLevel, MaxPassiveAuraLevel, SpellID" " FROM spell_levels ORDER BY ID DESC", CONNECTION_SYNCH); // SpellMisc.db2 - PrepareStatement(HOTFIX_SEL_SPELL_MISC, "SELECT ID, CastingTimeIndex, DurationIndex, RangeIndex, SchoolMask, SpellIconFileDataID, Speed, " - "ActiveIconFileDataID, LaunchDelay, DifficultyID, Attributes1, Attributes2, Attributes3, Attributes4, Attributes5, Attributes6, Attributes7, " - "Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, SpellID FROM spell_misc ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_MISC, "SELECT ID, DifficultyID, CastingTimeIndex, DurationIndex, RangeIndex, SchoolMask, Speed, LaunchDelay, " + "MinDuration, SpellIconFileDataID, ActiveIconFileDataID, Attributes1, Attributes2, Attributes3, Attributes4, Attributes5, Attributes6, " + "Attributes7, Attributes8, Attributes9, Attributes10, Attributes11, Attributes12, Attributes13, Attributes14, SpellID FROM spell_misc" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellName.db2 + PrepareStatement(HOTFIX_SEL_SPELL_NAME, "SELECT ID, Name FROM spell_name ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_NAME, "SELECT ID, Name_lang FROM spell_name_locale WHERE locale = ?", CONNECTION_SYNCH); // SpellPower.db2 - PrepareStatement(HOTFIX_SEL_SPELL_POWER, "SELECT ManaCost, PowerCostPct, PowerPctPerSecond, RequiredAuraSpellID, PowerCostMaxPct, OrderIndex, " - "PowerType, ID, ManaCostPerLevel, ManaPerSecond, OptionalCost, PowerDisplayID, AltPowerBarID, SpellID FROM spell_power ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_POWER, "SELECT ID, OrderIndex, ManaCost, ManaCostPerLevel, ManaPerSecond, PowerDisplayID, AltPowerBarID, " + "PowerCostPct, PowerCostMaxPct, PowerPctPerSecond, PowerType, RequiredAuraSpellID, OptionalCost, SpellID FROM spell_power ORDER BY ID DESC", CONNECTION_SYNCH); // SpellPowerDifficulty.db2 - PrepareStatement(HOTFIX_SEL_SPELL_POWER_DIFFICULTY, "SELECT DifficultyID, OrderIndex, ID FROM spell_power_difficulty ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_POWER_DIFFICULTY, "SELECT ID, DifficultyID, OrderIndex FROM spell_power_difficulty ORDER BY ID DESC", CONNECTION_SYNCH); // SpellProcsPerMinute.db2 PrepareStatement(HOTFIX_SEL_SPELL_PROCS_PER_MINUTE, "SELECT ID, BaseProcRate, Flags FROM spell_procs_per_minute ORDER BY ID DESC", CONNECTION_SYNCH); // SpellProcsPerMinuteMod.db2 - PrepareStatement(HOTFIX_SEL_SPELL_PROCS_PER_MINUTE_MOD, "SELECT ID, Coeff, Param, Type, SpellProcsPerMinuteID FROM spell_procs_per_minute_mod" + PrepareStatement(HOTFIX_SEL_SPELL_PROCS_PER_MINUTE_MOD, "SELECT ID, Type, Param, Coeff, SpellProcsPerMinuteID FROM spell_procs_per_minute_mod" " ORDER BY ID DESC", CONNECTION_SYNCH); // SpellRadius.db2 PrepareStatement(HOTFIX_SEL_SPELL_RADIUS, "SELECT ID, Radius, RadiusPerLevel, RadiusMin, RadiusMax FROM spell_radius ORDER BY ID DESC", CONNECTION_SYNCH); // SpellRange.db2 - PrepareStatement(HOTFIX_SEL_SPELL_RANGE, "SELECT ID, DisplayName, DisplayNameShort, RangeMin1, RangeMin2, RangeMax1, RangeMax2, Flags" + PrepareStatement(HOTFIX_SEL_SPELL_RANGE, "SELECT ID, DisplayName, DisplayNameShort, Flags, RangeMin1, RangeMin2, RangeMax1, RangeMax2" " FROM spell_range ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_RANGE, "SELECT ID, DisplayName_lang, DisplayNameShort_lang FROM spell_range_locale WHERE locale = ?", CONNECTION_SYNCH); @@ -938,72 +948,71 @@ void HotfixDatabaseConnection::DoPrepareStatements() " ORDER BY ID DESC", CONNECTION_SYNCH); // SpellScaling.db2 - PrepareStatement(HOTFIX_SEL_SPELL_SCALING, "SELECT ID, SpellID, ScalesFromItemLevel, Class, MinScalingLevel, MaxScalingLevel FROM spell_scaling" + PrepareStatement(HOTFIX_SEL_SPELL_SCALING, "SELECT ID, SpellID, Class, MinScalingLevel, MaxScalingLevel, ScalesFromItemLevel FROM spell_scaling" " ORDER BY ID DESC", CONNECTION_SYNCH); // SpellShapeshift.db2 - PrepareStatement(HOTFIX_SEL_SPELL_SHAPESHIFT, "SELECT ID, SpellID, ShapeshiftExclude1, ShapeshiftExclude2, ShapeshiftMask1, ShapeshiftMask2, " - "StanceBarOrder FROM spell_shapeshift ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_SHAPESHIFT, "SELECT ID, SpellID, StanceBarOrder, ShapeshiftExclude1, ShapeshiftExclude2, ShapeshiftMask1, " + "ShapeshiftMask2 FROM spell_shapeshift ORDER BY ID DESC", CONNECTION_SYNCH); // SpellShapeshiftForm.db2 - PrepareStatement(HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name, DamageVariance, Flags, CombatRoundTime, MountTypeID, CreatureType, " - "BonusActionBar, AttackIconFileID, CreatureDisplayID1, CreatureDisplayID2, CreatureDisplayID3, CreatureDisplayID4, PresetSpellID1, " - "PresetSpellID2, PresetSpellID3, PresetSpellID4, PresetSpellID5, PresetSpellID6, PresetSpellID7, PresetSpellID8 FROM spell_shapeshift_form" - " ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name, CreatureType, Flags, AttackIconFileID, BonusActionBar, CombatRoundTime, " + "DamageVariance, MountTypeID, CreatureDisplayID1, CreatureDisplayID2, CreatureDisplayID3, CreatureDisplayID4, PresetSpellID1, PresetSpellID2, " + "PresetSpellID3, PresetSpellID4, PresetSpellID5, PresetSpellID6, PresetSpellID7, PresetSpellID8 FROM spell_shapeshift_form ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_SHAPESHIFT_FORM, "SELECT ID, Name_lang FROM spell_shapeshift_form_locale WHERE locale = ?", CONNECTION_SYNCH); // SpellTargetRestrictions.db2 - PrepareStatement(HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS, "SELECT ID, ConeDegrees, Width, Targets, TargetCreatureType, DifficultyID, MaxTargets, " - "MaxTargetLevel, SpellID FROM spell_target_restrictions ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_TARGET_RESTRICTIONS, "SELECT ID, DifficultyID, ConeDegrees, MaxTargets, MaxTargetLevel, TargetCreatureType, " + "Targets, Width, SpellID FROM spell_target_restrictions ORDER BY ID DESC", CONNECTION_SYNCH); // SpellTotems.db2 - PrepareStatement(HOTFIX_SEL_SPELL_TOTEMS, "SELECT ID, SpellID, Totem1, Totem2, RequiredTotemCategoryID1, RequiredTotemCategoryID2" + PrepareStatement(HOTFIX_SEL_SPELL_TOTEMS, "SELECT ID, SpellID, RequiredTotemCategoryID1, RequiredTotemCategoryID2, Totem1, Totem2" " FROM spell_totems ORDER BY ID DESC", CONNECTION_SYNCH); // SpellXSpellVisual.db2 - PrepareStatement(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT SpellVisualID, ID, Probability, CasterPlayerConditionID, CasterUnitConditionID, " - "ViewerPlayerConditionID, ViewerUnitConditionID, SpellIconFileID, ActiveIconFileID, Flags, DifficultyID, Priority, SpellID" + PrepareStatement(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, DifficultyID, SpellVisualID, Probability, Flags, Priority, SpellIconFileID, " + "ActiveIconFileID, ViewerUnitConditionID, ViewerPlayerConditionID, CasterUnitConditionID, CasterPlayerConditionID, SpellID" " FROM spell_x_spell_visual ORDER BY ID DESC", CONNECTION_SYNCH); // SummonProperties.db2 - PrepareStatement(HOTFIX_SEL_SUMMON_PROPERTIES, "SELECT ID, Flags, Control, Faction, Title, Slot FROM summon_properties ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SUMMON_PROPERTIES, "SELECT ID, Control, Faction, Title, Slot, Flags FROM summon_properties ORDER BY ID DESC", CONNECTION_SYNCH); // TactKey.db2 PrepareStatement(HOTFIX_SEL_TACT_KEY, "SELECT ID, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9, Key10, Key11, Key12, Key13, Key14, Key15, " "Key16 FROM tact_key ORDER BY ID DESC", CONNECTION_SYNCH); // Talent.db2 - PrepareStatement(HOTFIX_SEL_TALENT, "SELECT ID, Description, SpellID, OverridesSpellID, SpecID, TierID, ColumnIndex, Flags, CategoryMask1, " - "CategoryMask2, ClassID FROM talent ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TALENT, "SELECT ID, Description, TierID, Flags, ColumnIndex, ClassID, SpecID, SpellID, OverridesSpellID, " + "CategoryMask1, CategoryMask2 FROM talent ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_TALENT, "SELECT ID, Description_lang FROM talent_locale WHERE locale = ?", CONNECTION_SYNCH); // TaxiNodes.db2 - PrepareStatement(HOTFIX_SEL_TAXI_NODES, "SELECT ID, Name, PosX, PosY, PosZ, MountCreatureID1, MountCreatureID2, MapOffsetX, MapOffsetY, Facing, " - "FlightMapOffsetX, FlightMapOffsetY, ContinentID, ConditionID, CharacterBitNumber, Flags, UiTextureKitID, SpecialIconConditionID" - " FROM taxi_nodes ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TAXI_NODES, "SELECT Name, PosX, PosY, PosZ, MapOffsetX, MapOffsetY, FlightMapOffsetX, FlightMapOffsetY, ID, " + "ContinentID, ConditionID, CharacterBitNumber, Flags, UiTextureKitID, Facing, SpecialIconConditionID, VisibilityConditionID, " + "MountCreatureID1, MountCreatureID2 FROM taxi_nodes ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_TAXI_NODES, "SELECT ID, Name_lang FROM taxi_nodes_locale WHERE locale = ?", CONNECTION_SYNCH); // TaxiPath.db2 - PrepareStatement(HOTFIX_SEL_TAXI_PATH, "SELECT FromTaxiNode, ToTaxiNode, ID, Cost FROM taxi_path ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TAXI_PATH, "SELECT ID, FromTaxiNode, ToTaxiNode, Cost FROM taxi_path ORDER BY ID DESC", CONNECTION_SYNCH); // TaxiPathNode.db2 - PrepareStatement(HOTFIX_SEL_TAXI_PATH_NODE, "SELECT LocX, LocY, LocZ, PathID, ContinentID, NodeIndex, ID, Flags, Delay, ArrivalEventID, " + PrepareStatement(HOTFIX_SEL_TAXI_PATH_NODE, "SELECT LocX, LocY, LocZ, ID, PathID, NodeIndex, ContinentID, Flags, Delay, ArrivalEventID, " "DepartureEventID FROM taxi_path_node ORDER BY ID DESC", CONNECTION_SYNCH); // TotemCategory.db2 - PrepareStatement(HOTFIX_SEL_TOTEM_CATEGORY, "SELECT ID, Name, TotemCategoryMask, TotemCategoryType FROM totem_category ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TOTEM_CATEGORY, "SELECT ID, Name, TotemCategoryType, TotemCategoryMask FROM totem_category ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_TOTEM_CATEGORY, "SELECT ID, Name_lang FROM totem_category_locale WHERE locale = ?", CONNECTION_SYNCH); // Toy.db2 - PrepareStatement(HOTFIX_SEL_TOY, "SELECT SourceText, ItemID, Flags, SourceTypeEnum, ID FROM toy ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TOY, "SELECT SourceText, ID, ItemID, Flags, SourceTypeEnum FROM toy ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_TOY, "SELECT ID, SourceText_lang FROM toy_locale WHERE locale = ?", CONNECTION_SYNCH); // TransmogHoliday.db2 PrepareStatement(HOTFIX_SEL_TRANSMOG_HOLIDAY, "SELECT ID, RequiredTransmogHoliday FROM transmog_holiday ORDER BY ID DESC", CONNECTION_SYNCH); // TransmogSet.db2 - PrepareStatement(HOTFIX_SEL_TRANSMOG_SET, "SELECT Name, ParentTransmogSetID, UiOrder, ExpansionID, ID, Flags, TrackingQuestID, ClassMask, " - "ItemNameDescriptionID, TransmogSetGroupID FROM transmog_set ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TRANSMOG_SET, "SELECT Name, ID, ClassMask, TrackingQuestID, Flags, TransmogSetGroupID, ItemNameDescriptionID, " + "ParentTransmogSetID, ExpansionID, UiOrder FROM transmog_set ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_TRANSMOG_SET, "SELECT ID, Name_lang FROM transmog_set_locale WHERE locale = ?", CONNECTION_SYNCH); // TransmogSetGroup.db2 @@ -1014,64 +1023,68 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_TRANSMOG_SET_ITEM, "SELECT ID, TransmogSetID, ItemModifiedAppearanceID, Flags FROM transmog_set_item ORDER BY ID DESC", CONNECTION_SYNCH); // TransportAnimation.db2 - PrepareStatement(HOTFIX_SEL_TRANSPORT_ANIMATION, "SELECT ID, TimeIndex, PosX, PosY, PosZ, SequenceID, TransportID FROM transport_animation" + PrepareStatement(HOTFIX_SEL_TRANSPORT_ANIMATION, "SELECT ID, PosX, PosY, PosZ, SequenceID, TimeIndex, TransportID FROM transport_animation" " ORDER BY ID DESC", CONNECTION_SYNCH); // TransportRotation.db2 - PrepareStatement(HOTFIX_SEL_TRANSPORT_ROTATION, "SELECT ID, TimeIndex, Rot1, Rot2, Rot3, Rot4, GameObjectsID FROM transport_rotation" + PrepareStatement(HOTFIX_SEL_TRANSPORT_ROTATION, "SELECT ID, Rot1, Rot2, Rot3, Rot4, TimeIndex, GameObjectsID FROM transport_rotation" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // UiMap.db2 + PrepareStatement(HOTFIX_SEL_UI_MAP, "SELECT Name, ID, ParentUiMapID, Flags, System, Type, LevelRangeMin, LevelRangeMax, BountySetID, " + "BountyDisplayLocation, VisibilityPlayerConditionID, HelpTextPosition, BkgAtlasID FROM ui_map ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_UI_MAP, "SELECT ID, Name_lang FROM ui_map_locale WHERE locale = ?", CONNECTION_SYNCH); + + // UiMapAssignment.db2 + PrepareStatement(HOTFIX_SEL_UI_MAP_ASSIGNMENT, "SELECT UiMinX, UiMinY, UiMaxX, UiMaxY, Region1X, Region1Y, Region1Z, Region2X, Region2Y, " + "Region2Z, ID, UiMapID, OrderIndex, MapID, AreaID, WmoDoodadPlacementID, WmoGroupID FROM ui_map_assignment ORDER BY ID DESC", CONNECTION_SYNCH); + + // UiMapLink.db2 + PrepareStatement(HOTFIX_SEL_UI_MAP_LINK, "SELECT UiMinX, UiMinY, UiMaxX, UiMaxY, ID, ParentUiMapID, OrderIndex, ChildUiMapID FROM ui_map_link" " ORDER BY ID DESC", CONNECTION_SYNCH); + // UiMapXMapArt.db2 + PrepareStatement(HOTFIX_SEL_UI_MAP_X_MAP_ART, "SELECT ID, PhaseID, UiMapArtID, UiMapID FROM ui_map_x_map_art ORDER BY ID DESC", CONNECTION_SYNCH); + // UnitPowerBar.db2 - PrepareStatement(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, Name, Cost, OutOfError, ToolTip, RegenerationPeace, RegenerationCombat, FileDataID1, " - "FileDataID2, FileDataID3, FileDataID4, FileDataID5, FileDataID6, Color1, Color2, Color3, Color4, Color5, Color6, StartInset, EndInset, " - "StartPower, Flags, CenterPower, BarType, MinPower, MaxPower FROM unit_power_bar ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, Name, Cost, OutOfError, ToolTip, MinPower, MaxPower, StartPower, CenterPower, " + "RegenerationPeace, RegenerationCombat, BarType, Flags, StartInset, EndInset, FileDataID1, FileDataID2, FileDataID3, FileDataID4, " + "FileDataID5, FileDataID6, Color1, Color2, Color3, Color4, Color5, Color6 FROM unit_power_bar ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, Name_lang, Cost_lang, OutOfError_lang, ToolTip_lang FROM unit_power_bar_locale" " WHERE locale = ?", CONNECTION_SYNCH); // Vehicle.db2 - PrepareStatement(HOTFIX_SEL_VEHICLE, "SELECT ID, Flags, TurnSpeed, PitchSpeed, PitchMin, PitchMax, MouseLookOffsetPitch, CameraFadeDistScalarMin, " - "CameraFadeDistScalarMax, CameraPitchOffset, FacingLimitRight, FacingLimitLeft, CameraYawOffset, SeatID1, SeatID2, SeatID3, SeatID4, SeatID5, " - "SeatID6, SeatID7, SeatID8, VehicleUIIndicatorID, PowerDisplayID1, PowerDisplayID2, PowerDisplayID3, FlagsB, UiLocomotionType, " - "MissileTargetingID FROM vehicle ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_VEHICLE, "SELECT ID, Flags, FlagsB, TurnSpeed, PitchSpeed, PitchMin, PitchMax, MouseLookOffsetPitch, " + "CameraFadeDistScalarMin, CameraFadeDistScalarMax, CameraPitchOffset, FacingLimitRight, FacingLimitLeft, CameraYawOffset, UiLocomotionType, " + "VehicleUIIndicatorID, MissileTargetingID, SeatID1, SeatID2, SeatID3, SeatID4, SeatID5, SeatID6, SeatID7, SeatID8, PowerDisplayID1, " + "PowerDisplayID2, PowerDisplayID3 FROM vehicle ORDER BY ID DESC", CONNECTION_SYNCH); // VehicleSeat.db2 - PrepareStatement(HOTFIX_SEL_VEHICLE_SEAT, "SELECT ID, Flags, FlagsB, FlagsC, AttachmentOffsetX, AttachmentOffsetY, AttachmentOffsetZ, " - "EnterPreDelay, EnterSpeed, EnterGravity, EnterMinDuration, EnterMaxDuration, EnterMinArcHeight, EnterMaxArcHeight, ExitPreDelay, ExitSpeed, " - "ExitGravity, ExitMinDuration, ExitMaxDuration, ExitMinArcHeight, ExitMaxArcHeight, PassengerYaw, PassengerPitch, PassengerRoll, " - "VehicleEnterAnimDelay, VehicleExitAnimDelay, CameraEnteringDelay, CameraEnteringDuration, CameraExitingDelay, CameraExitingDuration, " - "CameraOffsetX, CameraOffsetY, CameraOffsetZ, CameraPosChaseRate, CameraFacingChaseRate, CameraEnteringZoom, CameraSeatZoomMin, " - "CameraSeatZoomMax, UiSkinFileDataID, EnterAnimStart, EnterAnimLoop, RideAnimStart, RideAnimLoop, RideUpperAnimStart, RideUpperAnimLoop, " - "ExitAnimStart, ExitAnimLoop, ExitAnimEnd, VehicleEnterAnim, VehicleExitAnim, VehicleRideAnimLoop, EnterAnimKitID, RideAnimKitID, " - "ExitAnimKitID, VehicleEnterAnimKitID, VehicleRideAnimKitID, VehicleExitAnimKitID, CameraModeID, AttachmentID, PassengerAttachmentID, " - "VehicleEnterAnimBone, VehicleExitAnimBone, VehicleRideAnimLoopBone, VehicleAbilityDisplay, EnterUISoundID, ExitUISoundID FROM vehicle_seat" - " ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_VEHICLE_SEAT, "SELECT ID, AttachmentOffsetX, AttachmentOffsetY, AttachmentOffsetZ, CameraOffsetX, CameraOffsetY, " + "CameraOffsetZ, Flags, FlagsB, FlagsC, AttachmentID, EnterPreDelay, EnterSpeed, EnterGravity, EnterMinDuration, EnterMaxDuration, " + "EnterMinArcHeight, EnterMaxArcHeight, EnterAnimStart, EnterAnimLoop, RideAnimStart, RideAnimLoop, RideUpperAnimStart, RideUpperAnimLoop, " + "ExitPreDelay, ExitSpeed, ExitGravity, ExitMinDuration, ExitMaxDuration, ExitMinArcHeight, ExitMaxArcHeight, ExitAnimStart, ExitAnimLoop, " + "ExitAnimEnd, VehicleEnterAnim, VehicleEnterAnimBone, VehicleExitAnim, VehicleExitAnimBone, VehicleRideAnimLoop, VehicleRideAnimLoopBone, " + "PassengerAttachmentID, PassengerYaw, PassengerPitch, PassengerRoll, VehicleEnterAnimDelay, VehicleExitAnimDelay, VehicleAbilityDisplay, " + "EnterUISoundID, ExitUISoundID, UiSkinFileDataID, CameraEnteringDelay, CameraEnteringDuration, CameraExitingDelay, CameraExitingDuration, " + "CameraPosChaseRate, CameraFacingChaseRate, CameraEnteringZoom, CameraSeatZoomMin, CameraSeatZoomMax, EnterAnimKitID, RideAnimKitID, " + "ExitAnimKitID, VehicleEnterAnimKitID, VehicleRideAnimKitID, VehicleExitAnimKitID, CameraModeID FROM vehicle_seat ORDER BY ID DESC", CONNECTION_SYNCH); // WmoAreaTable.db2 - PrepareStatement(HOTFIX_SEL_WMO_AREA_TABLE, "SELECT AreaName, WmoGroupID, AmbienceID, ZoneMusic, IntroSound, AreaTableID, UwIntroSound, " - "UwAmbience, NameSetID, SoundProviderPref, SoundProviderPrefUnderwater, Flags, ID, UwZoneMusic, WmoID FROM wmo_area_table ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_WMO_AREA_TABLE, "SELECT AreaName, ID, WmoID, NameSetID, WmoGroupID, SoundProviderPref, SoundProviderPrefUnderwater, " + "AmbienceID, UwAmbience, ZoneMusic, UwZoneMusic, IntroSound, UwIntroSound, AreaTableID, Flags FROM wmo_area_table ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_WMO_AREA_TABLE, "SELECT ID, AreaName_lang FROM wmo_area_table_locale WHERE locale = ?", CONNECTION_SYNCH); // WorldEffect.db2 - PrepareStatement(HOTFIX_SEL_WORLD_EFFECT, "SELECT ID, TargetAsset, CombatConditionID, TargetType, WhenToDisplay, QuestFeedbackEffectID, " - "PlayerConditionID FROM world_effect ORDER BY ID DESC", CONNECTION_SYNCH); - - // WorldMapArea.db2 - PrepareStatement(HOTFIX_SEL_WORLD_MAP_AREA, "SELECT AreaName, LocLeft, LocRight, LocTop, LocBottom, Flags, MapID, AreaID, DisplayMapID, " - "DefaultDungeonFloor, ParentWorldMapID, LevelRangeMin, LevelRangeMax, BountySetID, BountyDisplayLocation, ID, VisibilityPlayerConditionID" - " FROM world_map_area ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_WORLD_EFFECT, "SELECT ID, QuestFeedbackEffectID, WhenToDisplay, TargetType, TargetAsset, PlayerConditionID, " + "CombatConditionID FROM world_effect ORDER BY ID DESC", CONNECTION_SYNCH); // WorldMapOverlay.db2 - PrepareStatement(HOTFIX_SEL_WORLD_MAP_OVERLAY, "SELECT TextureName, ID, TextureWidth, TextureHeight, MapAreaID, OffsetX, OffsetY, HitRectTop, " - "HitRectLeft, HitRectBottom, HitRectRight, PlayerConditionID, Flags, AreaID1, AreaID2, AreaID3, AreaID4 FROM world_map_overlay" - " ORDER BY ID DESC", CONNECTION_SYNCH); - - // WorldMapTransforms.db2 - PrepareStatement(HOTFIX_SEL_WORLD_MAP_TRANSFORMS, "SELECT ID, RegionMinX, RegionMinY, RegionMinZ, RegionMaxX, RegionMaxY, RegionMaxZ, " - "RegionOffsetX, RegionOffsetY, RegionScale, MapID, AreaID, NewMapID, NewDungeonMapID, NewAreaID, Flags, Priority FROM world_map_transforms" - " ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_WORLD_MAP_OVERLAY, "SELECT ID, UiMapArtID, TextureWidth, TextureHeight, OffsetX, OffsetY, HitRectTop, HitRectBottom, " + "HitRectLeft, HitRectRight, PlayerConditionID, Flags, AreaID1, AreaID2, AreaID3, AreaID4 FROM world_map_overlay ORDER BY ID DESC", CONNECTION_SYNCH); // WorldSafeLocs.db2 - PrepareStatement(HOTFIX_SEL_WORLD_SAFE_LOCS, "SELECT ID, AreaName, LocX, LocY, LocZ, Facing, MapID FROM world_safe_locs ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_WORLD_SAFE_LOCS, "SELECT ID, AreaName, LocX, LocY, LocZ, MapID, Facing FROM world_safe_locs ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_WORLD_SAFE_LOCS, "SELECT ID, AreaName_lang FROM world_safe_locs_locale WHERE locale = ?", CONNECTION_SYNCH); } diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index 77f3600ff39..655cdc376a6 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -126,6 +126,8 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_CINEMATIC_SEQUENCES, + HOTFIX_SEL_CONTENT_TUNING, + HOTFIX_SEL_CONVERSATION_LINE, HOTFIX_SEL_CREATURE_DISPLAY_INFO, @@ -170,6 +172,10 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_EMOTES_TEXT_SOUND, + HOTFIX_SEL_EXPECTED_STAT, + + HOTFIX_SEL_EXPECTED_STAT_MOD, + HOTFIX_SEL_FACTION, HOTFIX_SEL_FACTION_LOCALE, @@ -197,7 +203,6 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY, HOTFIX_SEL_GARR_PLOT, - HOTFIX_SEL_GARR_PLOT_LOCALE, HOTFIX_SEL_GARR_PLOT_BUILDING, @@ -379,12 +384,12 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_PVP_ITEM, - HOTFIX_SEL_PVP_REWARD, - HOTFIX_SEL_PVP_TALENT, HOTFIX_SEL_PVP_TALENT_LOCALE, - HOTFIX_SEL_PVP_TALENT_UNLOCK, + HOTFIX_SEL_PVP_TALENT_CATEGORY, + + HOTFIX_SEL_PVP_TALENT_SLOT_UNLOCK, HOTFIX_SEL_QUEST_FACTION_REWARD, @@ -409,8 +414,6 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_RULESET_ITEM_UPGRADE, - HOTFIX_SEL_SANDBOX_SCALING, - HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, HOTFIX_SEL_SCENARIO, @@ -439,9 +442,6 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_SPECIALIZATION_SPELLS, HOTFIX_SEL_SPECIALIZATION_SPELLS_LOCALE, - HOTFIX_SEL_SPELL, - HOTFIX_SEL_SPELL_LOCALE, - HOTFIX_SEL_SPELL_AURA_OPTIONS, HOTFIX_SEL_SPELL_AURA_RESTRICTIONS, @@ -481,6 +481,9 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_SPELL_MISC, + HOTFIX_SEL_SPELL_NAME, + HOTFIX_SEL_SPELL_NAME_LOCALE, + HOTFIX_SEL_SPELL_POWER, HOTFIX_SEL_SPELL_POWER_DIFFICULTY, @@ -543,6 +546,15 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_TRANSPORT_ROTATION, + HOTFIX_SEL_UI_MAP, + HOTFIX_SEL_UI_MAP_LOCALE, + + HOTFIX_SEL_UI_MAP_ASSIGNMENT, + + HOTFIX_SEL_UI_MAP_LINK, + + HOTFIX_SEL_UI_MAP_X_MAP_ART, + HOTFIX_SEL_UNIT_POWER_BAR, HOTFIX_SEL_UNIT_POWER_BAR_LOCALE, @@ -555,12 +567,8 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_WORLD_EFFECT, - HOTFIX_SEL_WORLD_MAP_AREA, - HOTFIX_SEL_WORLD_MAP_OVERLAY, - HOTFIX_SEL_WORLD_MAP_TRANSFORMS, - HOTFIX_SEL_WORLD_SAFE_LOCS, HOTFIX_SEL_WORLD_SAFE_LOCS_LOCALE, 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 diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index f29a12eb029..ef9007bac85 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -985,7 +985,7 @@ public: if (m) if (uint32 um = (uint32)atoi(m)) - phaseShift.AddUiWorldMapAreaIdSwap(um); + phaseShift.AddUiMapPhaseId(um); PhasingHandler::SendToPlayer(handler->GetSession()->GetPlayer(), phaseShift); return true; |