diff --git a/Source/Framework/Constants/AchievementConst.cs b/Source/Framework/Constants/AchievementConst.cs
index 440c9f448..465c0851d 100644
--- a/Source/Framework/Constants/AchievementConst.cs
+++ b/Source/Framework/Constants/AchievementConst.cs
@@ -701,7 +701,7 @@ namespace Framework.Constants
// 227 - 0 Criterias
ApplyConduit = 228,
ConvertItemsToCurrency = 229,
- TotalTypes = 230
+ TotalTypes = 232
}
public enum CriteriaDataType
diff --git a/Source/Framework/Constants/PlayerConst.cs b/Source/Framework/Constants/PlayerConst.cs
index 1c6223ebf..fea650cbd 100644
--- a/Source/Framework/Constants/PlayerConst.cs
+++ b/Source/Framework/Constants/PlayerConst.cs
@@ -45,7 +45,7 @@ namespace Framework.Constants
public const uint infinityCooldownDelayCheck = Time.Month / 2;
public const int MaxPlayerSummonDelay = 2 * Time.Minute;
- public const int TaxiMaskSize = 337;
+ public const int TaxiMaskSize = 338;
// corpse reclaim times
public const int DeathExpireStep = (5 * Time.Minute);
diff --git a/Source/Framework/Constants/SharedConst.cs b/Source/Framework/Constants/SharedConst.cs
index 9db3e827f..b9ca6ec38 100644
--- a/Source/Framework/Constants/SharedConst.cs
+++ b/Source/Framework/Constants/SharedConst.cs
@@ -49,7 +49,7 @@ namespace Framework.Constants
///
/// BattlePets Const
///
- public const int MaxBattlePetSpeciesId = 3084;
+ public const int MaxBattlePetSpeciesId = 3159;
public const int MaxPetBattleSlots = 3;
public const int MaxBattlePetsPerSpecies = 3;
public const int BattlePetCageItemId = 82800;
diff --git a/Source/Framework/Constants/Spells/SpellAuraConst.cs b/Source/Framework/Constants/Spells/SpellAuraConst.cs
index 6b8afc7f4..78fff0daf 100644
--- a/Source/Framework/Constants/Spells/SpellAuraConst.cs
+++ b/Source/Framework/Constants/Spells/SpellAuraConst.cs
@@ -525,6 +525,8 @@ namespace Framework.Constants
ModCriticalDamageTakenFromCaster = 501,
ModVersatilityDamageDoneBenefit = 502, // NYI
ModVersatilityHealingDoneBenefit = 503, // NYI
+ ModHealingTakenFromCaster = 504,
+ ModPlayerChoiceRerolls = 505, // NYI
Total
}
diff --git a/Source/Framework/Constants/Spells/SpellConst.cs b/Source/Framework/Constants/Spells/SpellConst.cs
index ece9b9a3b..13537f33a 100644
--- a/Source/Framework/Constants/Spells/SpellConst.cs
+++ b/Source/Framework/Constants/Spells/SpellConst.cs
@@ -2369,6 +2369,8 @@ namespace Framework.Constants
LearnSoulbindConduit = 281,
ConvertItemsToCurrency = 282,
CompleteCampaign = 283, // Flags all quests as completed that are assigned to campaign (MiscValueA)
+ SendChatMessage = 284, // MiscValue[0] = BroadcastTextID, MiscValue[1] = ChatType
+ ModifyKeystone2 = 285,
TotalSpellEffects
}
diff --git a/Source/Framework/Database/Databases/HotfixDatabase.cs b/Source/Framework/Database/Databases/HotfixDatabase.cs
index b9cf6258a..f46f5fceb 100644
--- a/Source/Framework/Database/Databases/HotfixDatabase.cs
+++ b/Source/Framework/Database/Databases/HotfixDatabase.cs
@@ -118,7 +118,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_AZERITE_EMPOWERED_ITEM, "SELECT ID, ItemID, AzeriteTierUnlockSetID, AzeritePowerSetID FROM azerite_empowered_item");
// AzeriteEssence.db2
- PrepareStatement(HotfixStatements.SEL_AZERITE_ESSENCE, "SELECT Name, Description, ID, SpecSetID FROM azerite_essence");
+ PrepareStatement(HotfixStatements.SEL_AZERITE_ESSENCE, "SELECT ID, Name, Description, SpecSetID FROM azerite_essence");
PrepareStatement(HotfixStatements.SEL_AZERITE_ESSENCE_LOCALE, "SELECT ID, Name_lang, Description_lang FROM azerite_essence_locale WHERE locale = ?");
// AzeriteEssencePower.db2
@@ -161,7 +161,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_BANNED_ADDONS, "SELECT ID, Name, Version, Flags FROM banned_addons");
// BarberShopStyle.db2
- PrepareStatement(HotfixStatements.SEL_BARBER_SHOP_STYLE, "SELECT DisplayName, Description, ID, Type, CostModifier, Race, Sex, Data FROM barber_shop_style");
+ PrepareStatement(HotfixStatements.SEL_BARBER_SHOP_STYLE, "SELECT ID, DisplayName, Description, Type, CostModifier, Race, Sex, Data FROM barber_shop_style");
PrepareStatement(HotfixStatements.SEL_BARBER_SHOP_STYLE_LOCALE, "SELECT ID, DisplayName_lang, Description_lang FROM barber_shop_style_locale WHERE locale = ?");
// BattlePetBreedQuality.db2
@@ -199,13 +199,13 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_CHAR_TITLES_LOCALE, "SELECT ID, Name_lang, Name1_lang FROM char_titles_locale WHERE locale = ?");
// CharacterLoadout.db2
- PrepareStatement(HotfixStatements.SEL_CHARACTER_LOADOUT, "SELECT RaceMask, ID, ChrClassID, Purpose FROM character_loadout");
+ PrepareStatement(HotfixStatements.SEL_CHARACTER_LOADOUT, "SELECT ID, RaceMask, ChrClassID, Purpose FROM character_loadout");
// CharacterLoadoutItem.db2
PrepareStatement(HotfixStatements.SEL_CHARACTER_LOADOUT_ITEM, "SELECT ID, CharacterLoadoutID, ItemID FROM character_loadout_item");
// ChatChannels.db2
- PrepareStatement(HotfixStatements.SEL_CHAT_CHANNELS, "SELECT Name, Shortcut, ID, Flags, FactionGroup, Ruleset FROM chat_channels");
+ PrepareStatement(HotfixStatements.SEL_CHAT_CHANNELS, "SELECT ID, Name, Shortcut, Flags, FactionGroup, Ruleset FROM chat_channels");
PrepareStatement(HotfixStatements.SEL_CHAT_CHANNELS_LOCALE, "SELECT ID, Name_lang, Shortcut_lang FROM chat_channels_locale WHERE locale = ?");
// ChrClassUiDisplay.db2
@@ -226,8 +226,8 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_CHR_CLASSES_X_POWER_TYPES, "SELECT ID, PowerType, ClassID FROM chr_classes_x_power_types");
// ChrCustomizationChoice.db2
- PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_CHOICE, "SELECT Name, ID, ChrCustomizationOptionID, ChrCustomizationReqID, SortOrder, SwatchColor1, " +
- "SwatchColor2, UiOrderIndex, Flags FROM chr_customization_choice");
+ PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_CHOICE, "SELECT Name, ID, ChrCustomizationOptionID, ChrCustomizationReqID, SortOrder, UiOrderIndex, " +
+ "Flags, SwatchColor1, SwatchColor2 FROM chr_customization_choice");
PrepareStatement(HotfixStatements.SEL_CHR_CUSTOMIZATION_CHOICE_LOCALE, "SELECT ID, Name_lang FROM chr_customization_choice_locale WHERE locale = ?");
// ChrCustomizationDisplayInfo.db2
@@ -254,22 +254,23 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_CHR_MODEL, "SELECT FaceCustomizationOffset1, FaceCustomizationOffset2, FaceCustomizationOffset3, CustomizeOffset1, " +
"CustomizeOffset2, CustomizeOffset3, ID, Sex, DisplayID, CharComponentTextureLayoutID, Flags, SkeletonFileDataID, ModelFallbackChrModelID, " +
"TextureFallbackChrModelID, HelmVisFallbackChrModelID, CustomizeScale, CustomizeFacing, CameraDistanceOffset, BarberShopCameraOffsetScale, " +
- "BarberShopCameraRotationOffset FROM chr_model");
+ "BarberShopCameraHeightOffsetScale, BarberShopCameraRotationOffset FROM chr_model");
// ChrRaceXChrModel.db2
PrepareStatement(HotfixStatements.SEL_CHR_RACE_X_CHR_MODEL, "SELECT ID, ChrRacesID, ChrModelID FROM chr_race_x_chr_model");
// ChrRaces.db2
- PrepareStatement(HotfixStatements.SEL_CHR_RACES, "SELECT ClientPrefix, ClientFileString, Name, NameFemale, NameLowercase, NameFemaleLowercase, NameS, " +
- "NameFemaleS, NameLowercaseS, NameFemaleLowercaseS, RaceFantasyDescription, NameL, NameFemaleL, NameLowercaseL, NameFemaleLowercaseL, ID, " +
- "Flags, BaseLanguage, ResSicknessSpellID, SplashSoundID, CreateScreenFileDataID, SelectScreenFileDataID, LowResScreenFileDataID, " +
- "AlteredFormStartVisualKitID1, AlteredFormStartVisualKitID2, AlteredFormStartVisualKitID3, AlteredFormFinishVisualKitID1, " +
- "AlteredFormFinishVisualKitID2, AlteredFormFinishVisualKitID3, HeritageArmorAchievementID, StartingLevel, UiDisplayOrder, PlayableRaceBit, " +
- "HelmetAnimScalingRaceID, TransmogrifyDisabledSlotMask, AlteredFormCustomizeOffsetFallback1, AlteredFormCustomizeOffsetFallback2, " +
- "AlteredFormCustomizeOffsetFallback3, AlteredFormCustomizeRotationFallback, FactionID, CinematicSequenceID, CreatureType, Alliance, " +
- "RaceRelated, UnalteredVisualRaceID, DefaultClassID, NeutralRaceID, MaleModelFallbackRaceID, MaleModelFallbackSex, FemaleModelFallbackRaceID, " +
- "FemaleModelFallbackSex, MaleTextureFallbackRaceID, MaleTextureFallbackSex, FemaleTextureFallbackRaceID, FemaleTextureFallbackSex, " +
- "UnalteredVisualCustomizationRaceID FROM chr_races");
+ PrepareStatement(HotfixStatements.SEL_CHR_RACES, "SELECT ID, ClientPrefix, ClientFileString, Name, NameFemale, NameLowercase, NameFemaleLowercase, NameS, " +
+ "NameFemaleS, NameLowercaseS, NameFemaleLowercaseS, RaceFantasyDescription, NameL, NameFemaleL, NameLowercaseL, NameFemaleLowercaseL, Flags, " +
+ "FactionID, CinematicSequenceID, ResSicknessSpellID, SplashSoundID, Alliance, RaceRelated, UnalteredVisualRaceID, DefaultClassID, " +
+ "CreateScreenFileDataID, SelectScreenFileDataID, NeutralRaceID, LowResScreenFileDataID, AlteredFormStartVisualKitID1, " +
+ "AlteredFormStartVisualKitID2, AlteredFormStartVisualKitID3, AlteredFormFinishVisualKitID1, AlteredFormFinishVisualKitID2, " +
+ "AlteredFormFinishVisualKitID3, HeritageArmorAchievementID, StartingLevel, UiDisplayOrder, MaleModelFallbackRaceID, " +
+ "FemaleModelFallbackRaceID, MaleTextureFallbackRaceID, FemaleTextureFallbackRaceID, PlayableRaceBit, HelmetAnimScalingRaceID, " +
+ "TransmogrifyDisabledSlotMask, UnalteredVisualCustomizationRaceID, AlteredFormCustomizeOffsetFallback1, AlteredFormCustomizeOffsetFallback2, " +
+ "AlteredFormCustomizeOffsetFallback3, AlteredFormCustomizeRotationFallback, Unknown910_11, Unknown910_12, Unknown910_13, Unknown910_21, " +
+ "Unknown910_22, Unknown910_23, BaseLanguage, CreatureType, MaleModelFallbackSex, FemaleModelFallbackSex, MaleTextureFallbackSex, " +
+ "FemaleTextureFallbackSex FROM chr_races");
PrepareStatement(HotfixStatements.SEL_CHR_RACES_LOCALE, "SELECT ID, Name_lang, NameFemale_lang, NameLowercase_lang, NameFemaleLowercase_lang, NameS_lang, " +
"NameFemaleS_lang, NameLowercaseS_lang, NameFemaleLowercaseS_lang, RaceFantasyDescription_lang, NameL_lang, NameFemaleL_lang, " +
"NameLowercaseL_lang, NameFemaleLowercaseL_lang FROM chr_races_locale WHERE locale = ?");
@@ -291,8 +292,8 @@ namespace Framework.Database
"TargetLevelMaxDelta, TargetLevelMin, TargetLevelMax, MinItemLevel FROM content_tuning");
// ContentTuningXExpected.db2
- PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING_X_EXPECTED, "SELECT ID, ExpectedStatModID, MythicPlusSeasonID, ContentTuningID" +
- " FROM content_tuning_x_expected");
+ PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING_X_EXPECTED, "SELECT ID, ExpectedStatModID, MinMythicPlusSeasonID, MaxMythicPlusSeasonID, " +
+ "ContentTuningID FROM content_tuning_x_expected");
// ConversationLine.db2
PrepareStatement(HotfixStatements.SEL_CONVERSATION_LINE, "SELECT ID, BroadcastTextID, SpellVisualKitID, AdditionalDuration, NextConversationLineID, " +
@@ -394,8 +395,8 @@ namespace Framework.Database
"PlayerManaMod, PlayerPrimaryStatMod, PlayerSecondaryStatMod, ArmorConstantMod, CreatureSpellDamageMod FROM expected_stat_mod");
// Faction.db2
- PrepareStatement(HotfixStatements.SEL_FACTION, "SELECT ReputationRaceMask1, ReputationRaceMask2, ReputationRaceMask3, ReputationRaceMask4, Name, " +
- "Description, ID, ReputationIndex, ParentFactionID, Expansion, FriendshipRepID, Flags, ParagonFactionID, ReputationClassMask1, " +
+ PrepareStatement(HotfixStatements.SEL_FACTION, "SELECT ID, ReputationRaceMask1, ReputationRaceMask2, ReputationRaceMask3, ReputationRaceMask4, Name, " +
+ "Description, 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");
@@ -425,7 +426,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_GAMEOBJECTS_LOCALE, "SELECT ID, Name_lang FROM gameobjects_locale WHERE locale = ?");
// GarrAbility.db2
- PrepareStatement(HotfixStatements.SEL_GARR_ABILITY, "SELECT Name, Description, ID, GarrAbilityCategoryID, GarrFollowerTypeID, IconFileDataID, " +
+ PrepareStatement(HotfixStatements.SEL_GARR_ABILITY, "SELECT ID, Name, Description, GarrAbilityCategoryID, GarrFollowerTypeID, IconFileDataID, " +
"FactionChangeGarrAbilityID, Flags FROM garr_ability");
PrepareStatement(HotfixStatements.SEL_GARR_ABILITY_LOCALE, "SELECT ID, Name_lang, Description_lang FROM garr_ability_locale WHERE locale = ?");
@@ -442,13 +443,13 @@ namespace Framework.Database
"UiTextureAtlasMemberID FROM garr_building_plot_inst");
// GarrClassSpec.db2
- PrepareStatement(HotfixStatements.SEL_GARR_CLASS_SPEC, "SELECT ClassSpec, ClassSpecMale, ClassSpecFemale, ID, UiTextureAtlasMemberID, GarrFollItemSetID, " +
+ PrepareStatement(HotfixStatements.SEL_GARR_CLASS_SPEC, "SELECT ID, ClassSpec, ClassSpecMale, ClassSpecFemale, UiTextureAtlasMemberID, GarrFollItemSetID, " +
"FollowerClassLimit, Flags FROM garr_class_spec");
PrepareStatement(HotfixStatements.SEL_GARR_CLASS_SPEC_LOCALE, "SELECT ID, ClassSpec_lang, ClassSpecMale_lang, ClassSpecFemale_lang FROM garr_class_spec_locale" +
" WHERE locale = ?");
// GarrFollower.db2
- PrepareStatement(HotfixStatements.SEL_GARR_FOLLOWER, "SELECT HordeSourceText, AllianceSourceText, TitleName, ID, GarrTypeID, GarrFollowerTypeID, " +
+ PrepareStatement(HotfixStatements.SEL_GARR_FOLLOWER, "SELECT ID, HordeSourceText, AllianceSourceText, TitleName, GarrTypeID, GarrFollowerTypeID, " +
"HordeCreatureID, AllianceCreatureID, HordeGarrFollRaceID, AllianceGarrFollRaceID, HordeGarrClassSpecID, AllianceGarrClassSpecID, Quality, " +
"FollowerLevel, ItemLevelWeapon, ItemLevelArmor, HordeSourceTypeEnum, AllianceSourceTypeEnum, HordeIconFileDataID, AllianceIconFileDataID, " +
"HordeGarrFollItemSetID, AllianceGarrFollItemSetID, HordeUITextureKitID, AllianceUITextureKitID, Vitality, HordeFlavorGarrStringID, " +
@@ -598,7 +599,7 @@ namespace Framework.Database
// ItemEffect.db2
PrepareStatement(HotfixStatements.SEL_ITEM_EFFECT, "SELECT ID, LegacySlotIndex, TriggerType, Charges, CoolDownMSec, CategoryCoolDownMSec, SpellCategoryID, " +
- "SpellID, ChrSpecializationID, ParentItemID FROM item_effect");
+ "SpellID, ChrSpecializationID FROM item_effect");
// ItemExtendedCost.db2
PrepareStatement(HotfixStatements.SEL_ITEM_EXTENDED_COST, "SELECT ID, RequiredArenaRating, ArenaBracket, Flags, MinFactionID, MinReputation, " +
@@ -641,7 +642,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_ITEM_PRICE_BASE, "SELECT ID, ItemLevel, Armor, Weapon FROM item_price_base");
// ItemSearchName.db2
- PrepareStatement(HotfixStatements.SEL_ITEM_SEARCH_NAME, "SELECT AllowableRace, Display, ID, OverallQualityID, ExpansionID, MinFactionID, MinReputation, " +
+ PrepareStatement(HotfixStatements.SEL_ITEM_SEARCH_NAME, "SELECT ID, AllowableRace, Display, OverallQualityID, ExpansionID, MinFactionID, MinReputation, " +
"AllowableClass, RequiredLevel, RequiredSkill, RequiredSkillRank, RequiredAbility, ItemLevel, Flags1, Flags2, Flags3, Flags4" +
" FROM item_search_name");
PrepareStatement(HotfixStatements.SEL_ITEM_SEARCH_NAME_LOCALE, "SELECT ID, Display_lang FROM item_search_name_locale WHERE locale = ?");
@@ -655,20 +656,19 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_ITEM_SET_SPELL, "SELECT ID, ChrSpecID, SpellID, Threshold, ItemSetID FROM item_set_spell");
// ItemSparse.db2
- PrepareStatement(HotfixStatements.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, ModifiedCraftingReagentItemID, ContentTuningID, PlayerLevelToItemLevelCurveID, ItemNameDescriptionID, " +
- "RequiredTransmogHoliday, RequiredHoliday, LimitCategory, GemProperties, SocketMatchEnchantmentId, TotemCategoryID, InstanceBound, " +
- "ZoneBound1, ZoneBound2, ItemSet, LockID, StartQuestID, PageID, ItemDelay, 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");
+ PrepareStatement(HotfixStatements.SEL_ITEM_SPARSE, "SELECT ID, AllowableRace, Description, Display3, Display2, Display1, Display, ExpansionID, DmgVariance, " +
+ "InstanceBound, 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, ModifiedCraftingReagentItemID, ContentTuningID, PlayerLevelToItemLevelCurveID, ItemNameDescriptionID, " +
+ "RequiredTransmogHoliday, RequiredHoliday, LimitCategory, GemProperties, SocketMatchEnchantmentId, TotemCategoryID, ZoneBound1, ZoneBound2, " +
+ "ItemSet, LockID, StartQuestID, PageID, ItemDelay, MinFactionID, RequiredSkillRank, RequiredSkill, ItemLevel, AllowableClass, 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");
PrepareStatement(HotfixStatements.SEL_ITEM_SPARSE_LOCALE, "SELECT ID, Description_lang, Display3_lang, Display2_lang, Display1_lang, Display_lang" +
" FROM item_sparse_locale WHERE locale = ?");
@@ -681,6 +681,9 @@ namespace Framework.Database
// ItemXBonusTree.db2
PrepareStatement(HotfixStatements.SEL_ITEM_X_BONUS_TREE, "SELECT ID, ItemBonusTreeID, ItemID FROM item_x_bonus_tree");
+ // ItemXItemEffect.db2
+ PrepareStatement(HotfixStatements.SEL_ITEM_X_ITEM_EFFECT, "SELECT ID, ItemEffectID, ItemID FROM item_x_item_effect");
+
// Keychain.db2
PrepareStatement(HotfixStatements.SEL_KEYCHAIN, "SELECT ID, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9, Key10, Key11, Key12, Key13, Key14, Key15, " +
"Key16, Key17, Key18, Key19, Key20, Key21, Key22, Key23, Key24, Key25, Key26, Key27, Key28, Key29, Key30, Key31, Key32 FROM keychain");
@@ -689,7 +692,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_LANGUAGE_WORDS, "SELECT ID, Word, LanguageID FROM language_words");
// Languages.db2
- PrepareStatement(HotfixStatements.SEL_LANGUAGES, "SELECT Name, ID FROM languages");
+ PrepareStatement(HotfixStatements.SEL_LANGUAGES, "SELECT ID, Name FROM languages");
PrepareStatement(HotfixStatements.SEL_LANGUAGES_LOCALE, "SELECT ID, Name_lang FROM languages_locale WHERE locale = ?");
// LfgDungeons.db2
@@ -721,9 +724,9 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_MAIL_TEMPLATE_LOCALE, "SELECT ID, Body_lang FROM mail_template_locale WHERE locale = ?");
// Map.db2
- PrepareStatement(HotfixStatements.SEL_MAP, "SELECT ID, Directory, MapName, InternalName, MapDescription0, MapDescription1, PvpShortDescription, " +
- "PvpLongDescription, CorpseX, CorpseY, MapType, InstanceType, ExpansionID, AreaTableID, LoadingScreenID, TimeOfDayOverride, ParentMapID, " +
- "CosmeticParentMapID, TimeOffset, MinimapIconScale, CorpseMapID, MaxPlayers, WindSettingsID, ZmpFileDataID, WdtFileDataID, Flags1, Flags2 FROM map");
+ PrepareStatement(HotfixStatements.SEL_MAP, "SELECT ID, Directory, MapName, MapDescription0, MapDescription1, PvpShortDescription, PvpLongDescription, " +
+ "CorpseX, CorpseY, MapType, InstanceType, ExpansionID, AreaTableID, LoadingScreenID, TimeOfDayOverride, ParentMapID, CosmeticParentMapID, " +
+ "TimeOffset, MinimapIconScale, CorpseMapID, MaxPlayers, WindSettingsID, ZmpFileDataID, WdtFileDataID, Flags1, Flags2 FROM map");
PrepareStatement(HotfixStatements.SEL_MAP_LOCALE, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang, PvpShortDescription_lang, " +
"PvpLongDescription_lang FROM map_locale WHERE locale = ?");
@@ -787,7 +790,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_PHASE_X_PHASE_GROUP, "SELECT ID, PhaseID, PhaseGroupID FROM phase_x_phase_group");
// PlayerCondition.db2
- PrepareStatement(HotfixStatements.SEL_PLAYER_CONDITION, "SELECT RaceMask, FailureDescription, ID, ClassMask, SkillLogic, LanguageID, MinLanguage, " +
+ PrepareStatement(HotfixStatements.SEL_PLAYER_CONDITION, "SELECT ID, RaceMask, FailureDescription, 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, " +
@@ -971,8 +974,8 @@ namespace Framework.Database
// SpellEffect.db2
PrepareStatement(HotfixStatements.SEL_SPELL_EFFECT, "SELECT ID, EffectAura, DifficultyID, EffectIndex, Effect, EffectAmplitude, EffectAttributes, " +
"EffectAuraPeriod, EffectBonusCoefficient, EffectChainAmplitude, EffectChainTargets, EffectItemType, EffectMechanic, EffectPointsPerResource, " +
- "EffectPosFacing, EffectRealPointsPerLevel, EffectTriggerSpell, BonusCoefficientFromAP, PvpMultiplier, Coefficient, Variance, " +
- "ResourceCoefficient, GroupSizeBasePointsCoefficient, EffectBasePoints, EffectMiscValue1, EffectMiscValue2, EffectRadiusIndex1, " +
+ "EffectPosFacing, EffectRealPointsPerLevel, EffectTriggerSpell, BonusCoefficientFromAP, PvpMultiplier, Coefficient, Variance, " +
+ "ResourceCoefficient, GroupSizeBasePointsCoefficient, EffectBasePoints, ScalingClass, EffectMiscValue1, EffectMiscValue2, EffectRadiusIndex1, " +
"EffectRadiusIndex2, EffectSpellClassMask1, EffectSpellClassMask2, EffectSpellClassMask3, EffectSpellClassMask4, ImplicitTarget1, " +
"ImplicitTarget2, SpellID FROM spell_effect");
@@ -989,7 +992,7 @@ namespace Framework.Database
"ChannelInterruptFlags1, ChannelInterruptFlags2, SpellID FROM spell_interrupts");
// SpellItemEnchantment.db2
- PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT, "SELECT Name, HordeName, ID, EffectArg1, EffectArg2, EffectArg3, EffectScalingPoints1, " +
+ PrepareStatement(HotfixStatements.SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name, HordeName, EffectArg1, EffectArg2, EffectArg3, EffectScalingPoints1, " +
"EffectScalingPoints2, EffectScalingPoints3, IconFileDataID, MinItemLevel, MaxItemLevel, TransmogUseConditionID, TransmogCost, " +
"EffectPointsMin1, EffectPointsMin2, EffectPointsMin3, ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, " +
"Effect2, Effect3, ScalingClass, ScalingClassRestricted, ConditionID, MinLevel, MaxLevel FROM spell_item_enchantment");
@@ -1046,7 +1049,7 @@ namespace Framework.Database
"ReagentCount1, ReagentCount2, ReagentCount3, ReagentCount4, ReagentCount5, ReagentCount6, ReagentCount7, ReagentCount8 FROM spell_reagents");
// SpellScaling.db2
- PrepareStatement(HotfixStatements.SEL_SPELL_SCALING, "SELECT ID, SpellID, Class, MinScalingLevel, MaxScalingLevel, ScalesFromItemLevel FROM spell_scaling");
+ PrepareStatement(HotfixStatements.SEL_SPELL_SCALING, "SELECT ID, SpellID, MinScalingLevel, MaxScalingLevel, ScalesFromItemLevel FROM spell_scaling");
// SpellShapeshift.db2
PrepareStatement(HotfixStatements.SEL_SPELL_SHAPESHIFT, "SELECT ID, SpellID, StanceBarOrder, ShapeshiftExclude1, ShapeshiftExclude2, ShapeshiftMask1, " +
@@ -1120,7 +1123,7 @@ namespace Framework.Database
PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET_LOCALE, "SELECT ID, Name_lang FROM transmog_set_locale WHERE locale = ?");
// TransmogSetGroup.db2
- PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET_GROUP, "SELECT Name, ID FROM transmog_set_group");
+ PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET_GROUP, "SELECT ID, Name FROM transmog_set_group");
PrepareStatement(HotfixStatements.SEL_TRANSMOG_SET_GROUP_LOCALE, "SELECT ID, Name_lang FROM transmog_set_group_locale WHERE locale = ?");
// TransmogSetItem.db2
@@ -1548,6 +1551,8 @@ namespace Framework.Database
SEL_ITEM_X_BONUS_TREE,
+ SEL_ITEM_X_ITEM_EFFECT,
+
SEL_KEYCHAIN,
SEL_LANGUAGE_WORDS,
diff --git a/Source/Game/DataStorage/CliDB.cs b/Source/Game/DataStorage/CliDB.cs
index 1ab306311..86a0d107c 100644
--- a/Source/Game/DataStorage/CliDB.cs
+++ b/Source/Game/DataStorage/CliDB.cs
@@ -205,6 +205,7 @@ namespace Game.DataStorage
ItemSpecStorage = ReadDB2("ItemSpec.db2", HotfixStatements.SEL_ITEM_SPEC);
ItemSpecOverrideStorage = ReadDB2("ItemSpecOverride.db2", HotfixStatements.SEL_ITEM_SPEC_OVERRIDE);
ItemXBonusTreeStorage = ReadDB2("ItemXBonusTree.db2", HotfixStatements.SEL_ITEM_X_BONUS_TREE);
+ ItemXItemEffectStorage = ReadDB2("ItemXItemEffect.db2", HotfixStatements.SEL_ITEM_X_ITEM_EFFECT);
//KeyChainStorage = ReadDB2("KeyChain.db2", HotfixStatements.SEL_KEYCHAIN);
LanguageWordsStorage = ReadDB2("LanguageWords.db2", HotfixStatements.SEL_LANGUAGE_WORDS);
LanguagesStorage = ReadDB2("Languages.db2", HotfixStatements.SEL_LANGUAGES, HotfixStatements.SEL_LANGUAGES_LOCALE);
@@ -576,6 +577,7 @@ namespace Game.DataStorage
public static DB6Storage ItemSpecStorage;
public static DB6Storage ItemSpecOverrideStorage;
public static DB6Storage ItemXBonusTreeStorage;
+ public static DB6Storage ItemXItemEffectStorage;
//public static DB6Storage KeyChainStorage;
public static DB6Storage LanguageWordsStorage;
public static DB6Storage LanguagesStorage;
diff --git a/Source/Game/DataStorage/DB2Manager.cs b/Source/Game/DataStorage/DB2Manager.cs
index 485392fa2..cea86cece 100644
--- a/Source/Game/DataStorage/DB2Manager.cs
+++ b/Source/Game/DataStorage/DB2Manager.cs
@@ -241,9 +241,8 @@ namespace Game.DataStorage
foreach (ContentTuningXExpectedRecord contentTuningXExpectedStat in ContentTuningXExpectedStorage.Values)
{
- ExpectedStatModRecord expectedStatMod = ExpectedStatModStorage.LookupByKey(contentTuningXExpectedStat.ExpectedStatModID);
- if (expectedStatMod != null)
- _expectedStatModsByContentTuning.Add(contentTuningXExpectedStat.ContentTuningID, expectedStatMod);
+ if (ExpectedStatModStorage.ContainsKey(contentTuningXExpectedStat.ExpectedStatModID))
+ _expectedStatModsByContentTuning.Add(contentTuningXExpectedStat.ContentTuningID, contentTuningXExpectedStat);
}
foreach (CurvePointRecord curvePoint in CurvePointStorage.Values)
@@ -1214,6 +1213,49 @@ namespace Game.DataStorage
return null;
}
+ float ExpectedStatModReducer(float mod, ContentTuningXExpectedRecord contentTuningXExpected, ExpectedStatType stat)
+ {
+ if (contentTuningXExpected == null)
+ return mod;
+
+ //if (contentTuningXExpected->MinMythicPlusSeasonID)
+ // if (MythicPlusSeasonEntry const* mythicPlusSeason = sMythicPlusSeasonStore.LookupEntry(contentTuningXExpected->MinMythicPlusSeasonID))
+ // if (MythicPlusSubSeason < mythicPlusSeason->SubSeason)
+ // return mod;
+
+ //if (contentTuningXExpected->MaxMythicPlusSeasonID)
+ // if (MythicPlusSeasonEntry const* mythicPlusSeason = sMythicPlusSeasonStore.LookupEntry(contentTuningXExpected->MaxMythicPlusSeasonID))
+ // if (MythicPlusSubSeason >= mythicPlusSeason->SubSeason)
+ // return mod;
+
+ var expectedStatMod = ExpectedStatModStorage.LookupByKey(contentTuningXExpected.ExpectedStatModID);
+ switch (stat)
+ {
+ case ExpectedStatType.CreatureHealth:
+ return mod * expectedStatMod.CreatureHealthMod;
+ case ExpectedStatType.PlayerHealth:
+ return mod * expectedStatMod.PlayerHealthMod;
+ case ExpectedStatType.CreatureAutoAttackDps:
+ return mod * expectedStatMod.CreatureAutoAttackDPSMod;
+ case ExpectedStatType.CreatureArmor:
+ return mod * expectedStatMod.CreatureArmorMod;
+ case ExpectedStatType.PlayerMana:
+ return mod * expectedStatMod.PlayerManaMod;
+ case ExpectedStatType.PlayerPrimaryStat:
+ return mod * expectedStatMod.PlayerPrimaryStatMod;
+ case ExpectedStatType.PlayerSecondaryStat:
+ return mod * expectedStatMod.PlayerSecondaryStatMod;
+ case ExpectedStatType.ArmorConstant:
+ return mod * expectedStatMod.ArmorConstantMod;
+ case ExpectedStatType.CreatureSpellDamage:
+ return mod * expectedStatMod.CreatureSpellDamageMod;
+ }
+
+ return mod;
+
+ // int32 MythicPlusSubSeason = 0;
+ }
+
public float EvaluateExpectedStat(ExpectedStatType stat, uint level, int expansion, uint contentTuningId, Class unitClass)
{
var expectedStatRecord = _expectedStatsByLevel.LookupByKey(Tuple.Create(level, expansion));
@@ -1241,63 +1283,63 @@ namespace Game.DataStorage
break;
}
- List contentTuningMods = _expectedStatModsByContentTuning.LookupByKey(contentTuningId);
+ List contentTuningMods = _expectedStatModsByContentTuning.LookupByKey(contentTuningId);
float value = 0.0f;
switch (stat)
{
case ExpectedStatType.CreatureHealth:
value = expectedStatRecord.CreatureHealth;
if (!contentTuningMods.Empty())
- value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.CreatureHealthMod : 1.0f);
+ value *= contentTuningMods.Sum(expectedStatMod => ExpectedStatModReducer(1.0f, expectedStatMod, stat));
if (classMod != null)
value *= classMod.CreatureHealthMod;
break;
case ExpectedStatType.PlayerHealth:
value = expectedStatRecord.PlayerHealth;
if (!contentTuningMods.Empty())
- value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.PlayerHealthMod : 1.0f);
+ value *= contentTuningMods.Sum(expectedStatMod => ExpectedStatModReducer(1.0f, expectedStatMod, stat));
if (classMod != null)
value *= classMod.PlayerHealthMod;
break;
case ExpectedStatType.CreatureAutoAttackDps:
value = expectedStatRecord.CreatureAutoAttackDps;
if (!contentTuningMods.Empty())
- value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.CreatureAutoAttackDPSMod : 1.0f);
+ value *= contentTuningMods.Sum(expectedStatMod => ExpectedStatModReducer(1.0f, expectedStatMod, stat));
if (classMod != null)
value *= classMod.CreatureAutoAttackDPSMod;
break;
case ExpectedStatType.CreatureArmor:
value = expectedStatRecord.CreatureArmor;
if (!contentTuningMods.Empty())
- value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.CreatureArmorMod : 1.0f);
+ value *= contentTuningMods.Sum(expectedStatMod => ExpectedStatModReducer(1.0f, expectedStatMod, stat));
if (classMod != null)
value *= classMod.CreatureArmorMod;
break;
case ExpectedStatType.PlayerMana:
value = expectedStatRecord.PlayerMana;
if (!contentTuningMods.Empty())
- value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.PlayerManaMod : 1.0f);
+ value *= contentTuningMods.Sum(expectedStatMod => ExpectedStatModReducer(1.0f, expectedStatMod, stat));
if (classMod != null)
value *= classMod.PlayerManaMod;
break;
case ExpectedStatType.PlayerPrimaryStat:
value = expectedStatRecord.PlayerPrimaryStat;
if (!contentTuningMods.Empty())
- value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.PlayerPrimaryStatMod : 1.0f);
+ value *= contentTuningMods.Sum(expectedStatMod => ExpectedStatModReducer(1.0f, expectedStatMod, stat));
if (classMod != null)
value *= classMod.PlayerPrimaryStatMod;
break;
case ExpectedStatType.PlayerSecondaryStat:
value = expectedStatRecord.PlayerSecondaryStat;
if (!contentTuningMods.Empty())
- value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.PlayerSecondaryStatMod : 1.0f);
+ value *= contentTuningMods.Sum(expectedStatMod => ExpectedStatModReducer(1.0f, expectedStatMod, stat));
if (classMod != null)
value *= classMod.PlayerSecondaryStatMod;
break;
case ExpectedStatType.ArmorConstant:
value = expectedStatRecord.ArmorConstant;
if (!contentTuningMods.Empty())
- value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.ArmorConstantMod : 1.0f);
+ value *= contentTuningMods.Sum(expectedStatMod => ExpectedStatModReducer(1.0f, expectedStatMod, stat));
if (classMod != null)
value *= classMod.ArmorConstantMod;
break;
@@ -1306,7 +1348,7 @@ namespace Game.DataStorage
case ExpectedStatType.CreatureSpellDamage:
value = expectedStatRecord.CreatureSpellDamage;
if (!contentTuningMods.Empty())
- value *= contentTuningMods.Sum(expectedStatMod => expectedStatMod != null ? expectedStatMod.CreatureSpellDamageMod : 1.0f);
+ value *= contentTuningMods.Sum(expectedStatMod => ExpectedStatModReducer(1.0f, expectedStatMod, stat));
if (classMod != null)
value *= classMod.CreatureSpellDamageMod;
break;
@@ -2275,7 +2317,7 @@ namespace Game.DataStorage
MultiMap _curvePoints = new();
Dictionary, EmotesTextSoundRecord> _emoteTextSounds = new();
Dictionary, ExpectedStatRecord> _expectedStatsByLevel = new();
- MultiMap _expectedStatModsByContentTuning = new();
+ MultiMap _expectedStatModsByContentTuning = new();
MultiMap _factionTeams = new();
MultiMap _friendshipRepReactions = new();
Dictionary _heirlooms = new();
diff --git a/Source/Game/DataStorage/Structs/A_Records.cs b/Source/Game/DataStorage/Structs/A_Records.cs
index cfcc946fb..cfbb70cd1 100644
--- a/Source/Game/DataStorage/Structs/A_Records.cs
+++ b/Source/Game/DataStorage/Structs/A_Records.cs
@@ -329,9 +329,9 @@ namespace Game.DataStorage
public sealed class AzeriteEssenceRecord
{
+ public uint Id;
public string Name;
public string Description;
- public uint Id;
public int SpecSetID;
}
diff --git a/Source/Game/DataStorage/Structs/B_Records.cs b/Source/Game/DataStorage/Structs/B_Records.cs
index c9dffff8e..30883d46a 100644
--- a/Source/Game/DataStorage/Structs/B_Records.cs
+++ b/Source/Game/DataStorage/Structs/B_Records.cs
@@ -34,9 +34,9 @@ namespace Game.DataStorage
public sealed class BarberShopStyleRecord
{
+ public uint Id;
public string DisplayName;
public string Description;
- public uint Id;
public byte Type; // value 0 . hair, value 2 . facialhair
public float CostModifier;
public byte Race;
@@ -48,7 +48,7 @@ namespace Game.DataStorage
{
public uint Id;
public float StateMultiplier;
- public byte QualityEnum;
+ public sbyte QualityEnum;
}
public sealed class BattlePetBreedStateRecord
@@ -67,7 +67,7 @@ namespace Game.DataStorage
public uint CreatureID;
public uint SummonSpellID;
public int IconFileDataID;
- public byte PetTypeEnum;
+ public sbyte PetTypeEnum;
public ushort Flags;
public sbyte SourceTypeEnum;
public int CardUIModelSceneID;
diff --git a/Source/Game/DataStorage/Structs/C_Records.cs b/Source/Game/DataStorage/Structs/C_Records.cs
index d9cc059a6..cb705b9cb 100644
--- a/Source/Game/DataStorage/Structs/C_Records.cs
+++ b/Source/Game/DataStorage/Structs/C_Records.cs
@@ -41,10 +41,11 @@ namespace Game.DataStorage
public sealed class CharacterLoadoutRecord
{
- public long RaceMask;
public uint Id;
+ public long RaceMask;
public sbyte ChrClassID;
public sbyte Purpose;
+ public sbyte Unused910;
public bool IsForNewCharacter() { return Purpose == 9; }
}
@@ -58,9 +59,9 @@ namespace Game.DataStorage
public sealed class ChatChannelsRecord
{
- public LocalizedString Name;
- public string Shortcut;
public uint Id;
+ public LocalizedString Name;
+ public string Shortcut;
public ChannelDBCFlags Flags;
public sbyte FactionGroup;
public int Ruleset;
@@ -131,10 +132,9 @@ namespace Game.DataStorage
public uint ChrCustomizationOptionID;
public uint ChrCustomizationReqID;
public ushort SortOrder;
- public int SwatchColor1;
- public int SwatchColor2;
public ushort UiOrderIndex;
public int Flags;
+ public int[] SwatchColor = new int[2];
}
public sealed class ChrCustomizationDisplayInfoRecord
@@ -212,6 +212,7 @@ namespace Game.DataStorage
public float CustomizeFacing;
public float CameraDistanceOffset;
public float BarberShopCameraOffsetScale;
+ public float BarberShopCameraHeightOffsetScale; // applied after BarberShopCameraOffsetScale
public float BarberShopCameraRotationOffset;
}
@@ -221,9 +222,10 @@ namespace Game.DataStorage
public int ChrRacesID;
public int ChrModelID;
}
-
+
public sealed class ChrRacesRecord
{
+ public uint Id;
public string ClientPrefix;
public string ClientFileString;
public LocalizedString Name;
@@ -239,44 +241,45 @@ namespace Game.DataStorage
public string NameFemaleL;
public string NameLowercaseL;
public string NameFemaleLowercaseL;
- public uint Id;
public int Flags;
- public int BaseLanguage;
+ public int FactionID;
+ public uint CinematicSequenceID;
public int ResSicknessSpellID;
public int SplashSoundID;
+ public int Alliance;
+ public int RaceRelated;
+ public int UnalteredVisualRaceID;
+ public int DefaultClassID;
public int CreateScreenFileDataID;
public int SelectScreenFileDataID;
+ public int NeutralRaceID;
public int LowResScreenFileDataID;
- public uint[] AlteredFormStartVisualKitID = new uint[3];
- public uint[] AlteredFormFinishVisualKitID = new uint[3];
+ public int[] AlteredFormStartVisualKitID = new int[3];
+ public int[] AlteredFormFinishVisualKitID = new int[3];
public int HeritageArmorAchievementID;
public int StartingLevel;
public int UiDisplayOrder;
+ public int MaleModelFallbackRaceID;
+ public int FemaleModelFallbackRaceID;
+ public int MaleTextureFallbackRaceID;
+ public int FemaleTextureFallbackRaceID;
public int PlayableRaceBit;
public int HelmetAnimScalingRaceID;
public int TransmogrifyDisabledSlotMask;
+ public int UnalteredVisualCustomizationRaceID;
public float[] AlteredFormCustomizeOffsetFallback = new float[3];
public float AlteredFormCustomizeRotationFallback;
- public ushort FactionID;
- public ushort CinematicSequenceID;
+ public float[] Unknown910_1 = new float[3];
+ public float[] Unknown910_2 = new float[3];
+ public sbyte BaseLanguage;
public sbyte CreatureType;
- public sbyte Alliance;
- public sbyte RaceRelated;
- public sbyte UnalteredVisualRaceID;
- public sbyte DefaultClassID;
- public sbyte NeutralRaceID;
- public sbyte MaleModelFallbackRaceID;
public sbyte MaleModelFallbackSex;
- public sbyte FemaleModelFallbackRaceID;
public sbyte FemaleModelFallbackSex;
- public sbyte MaleTextureFallbackRaceID;
public sbyte MaleTextureFallbackSex;
- public sbyte FemaleTextureFallbackRaceID;
public sbyte FemaleTextureFallbackSex;
- public sbyte UnalteredVisualCustomizationRaceID;
public ChrRacesFlag GetFlags() { return (ChrRacesFlag)Flags; }
-}
+ }
public sealed class ChrSpecializationRecord
{
@@ -350,7 +353,8 @@ namespace Game.DataStorage
{
public uint Id;
public int ExpectedStatModID;
- public int MythicPlusSeasonID;
+ public int MinMythicPlusSeasonID;
+ public int MaxMythicPlusSeasonID;
public uint ContentTuningID;
}
diff --git a/Source/Game/DataStorage/Structs/D_Records.cs b/Source/Game/DataStorage/Structs/D_Records.cs
index 8a4b3ec67..22a922d7e 100644
--- a/Source/Game/DataStorage/Structs/D_Records.cs
+++ b/Source/Game/DataStorage/Structs/D_Records.cs
@@ -74,7 +74,7 @@ namespace Game.DataStorage
public int CompleteWorldStateID;
public sbyte Bit;
public int CreatureDisplayID;
- public byte Flags;
+ public int Flags;
public int SpellIconFileID;
public int Faction;
}
diff --git a/Source/Game/DataStorage/Structs/F_Records.cs b/Source/Game/DataStorage/Structs/F_Records.cs
index fccb89095..110f41cc5 100644
--- a/Source/Game/DataStorage/Structs/F_Records.cs
+++ b/Source/Game/DataStorage/Structs/F_Records.cs
@@ -21,10 +21,10 @@ namespace Game.DataStorage
{
public sealed class FactionRecord
{
+ public uint Id;
public long[] ReputationRaceMask = new long[4];
public LocalizedString Name;
public string Description;
- public uint Id;
public short ReputationIndex;
public ushort ParentFactionID;
public byte Expansion;
diff --git a/Source/Game/DataStorage/Structs/G_Records.cs b/Source/Game/DataStorage/Structs/G_Records.cs
index 042845aaf..e31f0afb7 100644
--- a/Source/Game/DataStorage/Structs/G_Records.cs
+++ b/Source/Game/DataStorage/Structs/G_Records.cs
@@ -59,9 +59,9 @@ namespace Game.DataStorage
public sealed class GarrAbilityRecord
{
+ public uint Id;
public string Name;
public string Description;
- public uint Id;
public byte GarrAbilityCategoryID;
public byte GarrFollowerTypeID;
public int IconFileDataID;
@@ -109,10 +109,10 @@ namespace Game.DataStorage
public sealed class GarrClassSpecRecord
{
+ public uint Id;
public string ClassSpec;
public string ClassSpecMale;
public string ClassSpecFemale;
- public uint Id;
public ushort UiTextureAtlasMemberID;
public ushort GarrFollItemSetID;
public byte FollowerClassLimit;
@@ -121,10 +121,10 @@ namespace Game.DataStorage
public sealed class GarrFollowerRecord
{
+ public uint Id;
public string HordeSourceText;
public string AllianceSourceText;
public string TitleName;
- public uint Id;
public byte GarrTypeID;
public byte GarrFollowerTypeID;
public int HordeCreatureID;
diff --git a/Source/Game/DataStorage/Structs/I_Records.cs b/Source/Game/DataStorage/Structs/I_Records.cs
index fc7d1f622..3abf39ef4 100644
--- a/Source/Game/DataStorage/Structs/I_Records.cs
+++ b/Source/Game/DataStorage/Structs/I_Records.cs
@@ -205,7 +205,6 @@ namespace Game.DataStorage
public ushort SpellCategoryID;
public int SpellID;
public ushort ChrSpecializationID;
- public uint ParentItemID;
}
public sealed class ItemExtendedCostRecord
@@ -299,11 +298,11 @@ namespace Game.DataStorage
public sealed class ItemSearchNameRecord
{
+ public uint Id;
public long AllowableRace;
public string Display;
- public uint Id;
public byte OverallQualityID;
- public byte ExpansionID;
+ public int ExpansionID;
public ushort MinFactionID;
public byte MinReputation;
public int AllowableClass;
@@ -343,7 +342,9 @@ namespace Game.DataStorage
public string Display2;
public string Display1;
public LocalizedString Display;
+ public int ExpansionID;
public float DmgVariance;
+ public uint InstanceBound;
public uint DurationInInventory;
public float QualityModifier;
public uint BagFamily;
@@ -370,7 +371,6 @@ namespace Game.DataStorage
public ushort GemProperties;
public ushort SocketMatchEnchantmentId;
public ushort TotemCategoryID;
- public ushort InstanceBound;
public ushort[] ZoneBound = new ushort[2];
public ushort ItemSet;
public ushort LockID;
@@ -382,7 +382,6 @@ namespace Game.DataStorage
public ushort RequiredSkill;
public ushort ItemLevel;
public short AllowableClass;
- public byte ExpansionID;
public byte ArtifactID;
public byte SpellWeight;
public byte SpellWeightCategory;
@@ -427,4 +426,11 @@ namespace Game.DataStorage
public ushort ItemBonusTreeID;
public uint ItemID;
}
+
+ public sealed class ItemXItemEffectRecord
+ {
+ public uint Id;
+ public int ItemEffectID;
+ public uint ItemID;
+ }
}
diff --git a/Source/Game/DataStorage/Structs/L_Records.cs b/Source/Game/DataStorage/Structs/L_Records.cs
index 84d3c8510..c2e87c8dd 100644
--- a/Source/Game/DataStorage/Structs/L_Records.cs
+++ b/Source/Game/DataStorage/Structs/L_Records.cs
@@ -29,8 +29,8 @@ namespace Game.DataStorage
public sealed class LanguagesRecord
{
- public LocalizedString Name;
public uint Id;
+ public LocalizedString Name;
}
public sealed class LFGDungeonsRecord
diff --git a/Source/Game/DataStorage/Structs/M_Records.cs b/Source/Game/DataStorage/Structs/M_Records.cs
index 3a9cc12cd..cdbbbf00c 100644
--- a/Source/Game/DataStorage/Structs/M_Records.cs
+++ b/Source/Game/DataStorage/Structs/M_Records.cs
@@ -30,7 +30,6 @@ namespace Game.DataStorage
public uint Id;
public string Directory;
public LocalizedString MapName;
- public string InternalName;
public string MapDescription0; // Horde
public string MapDescription1; // Alliance
public string PvpShortDescription;
@@ -134,7 +133,7 @@ namespace Game.DataStorage
public uint Type;
public uint Asset;
public int SecondaryAsset;
- public sbyte TertiaryAsset;
+ public int TertiaryAsset;
}
public sealed class MountRecord
diff --git a/Source/Game/DataStorage/Structs/P_Records.cs b/Source/Game/DataStorage/Structs/P_Records.cs
index 18af4cc72..9b85a6ddf 100644
--- a/Source/Game/DataStorage/Structs/P_Records.cs
+++ b/Source/Game/DataStorage/Structs/P_Records.cs
@@ -42,9 +42,9 @@ namespace Game.DataStorage
public sealed class PlayerConditionRecord
{
+ public uint Id;
public long RaceMask;
public string FailureDescription;
- public uint Id;
public int ClassMask;
public uint SkillLogic;
public int LanguageID;
diff --git a/Source/Game/DataStorage/Structs/S_Records.cs b/Source/Game/DataStorage/Structs/S_Records.cs
index d3be3b79d..d369edd68 100644
--- a/Source/Game/DataStorage/Structs/S_Records.cs
+++ b/Source/Game/DataStorage/Structs/S_Records.cs
@@ -289,6 +289,7 @@ namespace Game.DataStorage
public float ResourceCoefficient;
public float GroupSizeBasePointsCoefficient;
public float EffectBasePoints;
+ public int ScalingClass;
public int[] EffectMiscValue = new int[2];
public uint[] EffectRadiusIndex = new uint[2];
public FlagArray128 EffectSpellClassMask;
@@ -323,9 +324,9 @@ namespace Game.DataStorage
public sealed class SpellItemEnchantmentRecord
{
+ public uint Id;
public string Name;
public string HordeName;
- public uint Id;
public uint[] EffectArg = new uint[ItemConst.MaxItemEnchantmentEffects];
public float[] EffectScalingPoints = new float[ItemConst.MaxItemEnchantmentEffects];
public uint IconFileDataID;
@@ -485,7 +486,6 @@ namespace Game.DataStorage
{
public uint Id;
public uint SpellID;
- public int Class;
public uint MinScalingLevel;
public uint MaxScalingLevel;
public ushort ScalesFromItemLevel;
@@ -552,7 +552,7 @@ namespace Game.DataStorage
public byte DifficultyID;
public uint SpellVisualID;
public float Probability;
- public byte Priority;
+ public int Priority;
public int SpellIconFileID;
public int ActiveIconFileID;
public ushort ViewerUnitConditionID;
diff --git a/Source/Game/DataStorage/Structs/T_Records.cs b/Source/Game/DataStorage/Structs/T_Records.cs
index c57e6d19a..6f9e48420 100644
--- a/Source/Game/DataStorage/Structs/T_Records.cs
+++ b/Source/Game/DataStorage/Structs/T_Records.cs
@@ -131,8 +131,8 @@ namespace Game.DataStorage
public sealed class TransmogSetGroupRecord
{
- public string Name;
public uint Id;
+ public string Name;
}
public sealed class TransmogSetItemRecord
diff --git a/Source/Game/Entities/Item/ItemTemplate.cs b/Source/Game/Entities/Item/ItemTemplate.cs
index a77205778..d7d2f519a 100644
--- a/Source/Game/Entities/Item/ItemTemplate.cs
+++ b/Source/Game/Entities/Item/ItemTemplate.cs
@@ -307,7 +307,7 @@ namespace Game.Entities
public HolidayIds GetHolidayID() { return (HolidayIds)ExtendedData.RequiredHoliday; }
public float GetDmgVariance() { return ExtendedData.DmgVariance; }
public byte GetArtifactID() { return ExtendedData.ArtifactID; }
- public byte GetRequiredExpansion() { return ExtendedData.ExpansionID; }
+ public byte GetRequiredExpansion() { return (byte)ExtendedData.ExpansionID; }
public bool IsCurrencyToken() { return (GetBagFamily() & BagFamilyMask.CurrencyTokens) != 0; }
diff --git a/Source/Game/Entities/Unit/Unit.Spells.cs b/Source/Game/Entities/Unit/Unit.Spells.cs
index e0445166b..1ba657826 100644
--- a/Source/Game/Entities/Unit/Unit.Spells.cs
+++ b/Source/Game/Entities/Unit/Unit.Spells.cs
@@ -593,6 +593,11 @@ namespace Game.Entities
return true;
return false;
});
+
+ TakenTotalMod *= GetTotalAuraMultiplier(AuraType.ModHealingTakenFromCaster, aurEff =>
+ {
+ return aurEff.GetCasterGUID() == caster.GetGUID();
+ });
}
float heal = healamount * TakenTotalMod;
diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs
index 85d2b5b25..4595892ab 100644
--- a/Source/Game/Globals/ObjectManager.cs
+++ b/Source/Game/Globals/ObjectManager.cs
@@ -4549,13 +4549,15 @@ namespace Game
}
// Load item effects (spells)
- foreach (var effectEntry in CliDB.ItemEffectStorage.Values)
+ foreach (var effectEntry in CliDB.ItemXItemEffectStorage.Values)
{
- var itemTemplate = ItemTemplateStorage.LookupByKey(effectEntry.ParentItemID);
- if (itemTemplate == null)
- continue;
-
- itemTemplate.Effects.Add(effectEntry);
+ var item = ItemTemplateStorage.LookupByKey(effectEntry.ItemID);
+ if (item != null)
+ {
+ var effect = CliDB.ItemEffectStorage.LookupByKey(effectEntry.ItemEffectID);
+ if (effect != null)
+ item.Effects.Add(effect);
+ }
}
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} item templates in {1} ms", sparseCount, Time.GetMSTimeDiffToNow(oldMSTime));
diff --git a/Source/Game/Spells/SpellEffects.cs b/Source/Game/Spells/SpellEffects.cs
index c851da968..b9a94711b 100644
--- a/Source/Game/Spells/SpellEffects.cs
+++ b/Source/Game/Spells/SpellEffects.cs
@@ -5689,6 +5689,20 @@ namespace Game.Spells
Conversation.CreateConversation((uint)effectInfo.MiscValue, GetCaster(), unitTarget.GetPosition(), new List() { unitTarget.GetGUID() }, GetSpellInfo());
}
+
+ [SpellEffectHandler(SpellEffectName.SendChatMessage)]
+ void EffectSendChatMessage(uint effIndex)
+ {
+ if (effectHandleMode != SpellEffectHandleMode.Hit)
+ return;
+
+ uint broadcastTextId = (uint)effectInfo.MiscValue;
+ if (!CliDB.BroadcastTextStorage.ContainsKey(broadcastTextId))
+ return;
+
+ ChatMsg chatType = (ChatMsg)effectInfo.MiscValueB;
+ unitTarget.Talk(broadcastTextId, chatType, Global.CreatureTextMgr.GetRangeForChatType(chatType), unitTarget);
+ }
}
public class DispelableAura
diff --git a/Source/Game/Spells/SpellInfo.cs b/Source/Game/Spells/SpellInfo.cs
index d15b0cce8..14a48fded 100644
--- a/Source/Game/Spells/SpellInfo.cs
+++ b/Source/Game/Spells/SpellInfo.cs
@@ -83,7 +83,6 @@ namespace Game.Spells
SpellScalingRecord _scaling = data.Scaling;
if (_scaling != null)
{
- Scaling._Class = _scaling.Class;
Scaling.MinScalingLevel = _scaling.MinScalingLevel;
Scaling.MaxScalingLevel = _scaling.MaxScalingLevel;
Scaling.ScalesFromItemLevel = _scaling.ScalesFromItemLevel;
@@ -3750,7 +3749,6 @@ namespace Game.Spells
public struct ScalingInfo
{
- public int _Class { get; set; }
public uint MinScalingLevel;
public uint MaxScalingLevel;
public uint ScalesFromItemLevel;
@@ -3785,6 +3783,7 @@ namespace Game.Spells
TriggerSpell = effect.EffectTriggerSpell;
SpellClassMask = effect.EffectSpellClassMask;
BonusCoefficientFromAP = effect.BonusCoefficientFromAP;
+ Scaling.Class = effect.ScalingClass;
Scaling.Coefficient = effect.Coefficient;
Scaling.Variance = effect.Variance;
Scaling.ResourceCoefficient = effect.ResourceCoefficient;
@@ -3933,7 +3932,7 @@ namespace Game.Spells
float tempValue = 0.0f;
if (level > 0)
{
- if (_spellInfo.Scaling._Class == 0)
+ if (Scaling.Class == 0)
return 0;
uint effectiveItemLevel = itemLevel != -1 ? (uint)itemLevel : 1u;
@@ -3942,21 +3941,21 @@ namespace Game.Spells
if (_spellInfo.Scaling.ScalesFromItemLevel != 0)
effectiveItemLevel = _spellInfo.Scaling.ScalesFromItemLevel;
- if (_spellInfo.Scaling._Class == -8 || _spellInfo.Scaling._Class == -9)
+ if (Scaling.Class == -8 || Scaling.Class == -9)
{
RandPropPointsRecord randPropPoints = CliDB.RandPropPointsStorage.LookupByKey(effectiveItemLevel);
if (randPropPoints == null)
randPropPoints = CliDB.RandPropPointsStorage.LookupByKey(CliDB.RandPropPointsStorage.Count - 1);
- tempValue = _spellInfo.Scaling._Class == -8 ? randPropPoints.DamageReplaceStatF : randPropPoints.DamageSecondaryF;
+ tempValue = Scaling.Class == -8 ? randPropPoints.DamageReplaceStatF : randPropPoints.DamageSecondaryF;
}
else
tempValue = ItemEnchantmentManager.GetRandomPropertyPoints(effectiveItemLevel, ItemQuality.Rare, InventoryType.Chest, 0);
}
else
- tempValue = CliDB.GetSpellScalingColumnForClass(CliDB.SpellScalingGameTable.GetRow(level), _spellInfo.Scaling._Class);
+ tempValue = CliDB.GetSpellScalingColumnForClass(CliDB.SpellScalingGameTable.GetRow(level), Scaling.Class);
- if (_spellInfo.Scaling._Class == -7)
+ if (Scaling.Class == -7)
{
GtGenericMultByILvlRecord ratingMult = CliDB.CombatRatingsMultByILvlGameTable.GetRow(effectiveItemLevel);
if (ratingMult != null)
@@ -4503,6 +4502,8 @@ namespace Game.Spells
new StaticData(SpellEffectImplicitTargetTypes.Explicit, SpellTargetObjectTypes.Unit), // 281 SPELL_EFFECT_LEARN_SOULBIND_CONDUIT
new StaticData(SpellEffectImplicitTargetTypes.Explicit, SpellTargetObjectTypes.Unit), // 282 SPELL_EFFECT_CONVERT_ITEMS_TO_CURRENCY
new StaticData(SpellEffectImplicitTargetTypes.Explicit, SpellTargetObjectTypes.Unit), // 283 SPELL_EFFECT_COMPLETE_CAMPAIGN
+ new StaticData(SpellEffectImplicitTargetTypes.Explicit, SpellTargetObjectTypes.Unit), // 284 SPELL_EFFECT_SEND_CHAT_MESSAGE
+ new StaticData(SpellEffectImplicitTargetTypes.Explicit, SpellTargetObjectTypes.Unit), // 285 SPELL_EFFECT_MODIFY_KEYSTONE_2
};
#region Fields
@@ -4540,6 +4541,7 @@ namespace Game.Spells
public struct ScalingInfo
{
+ public int Class;
public float Coefficient;
public float Variance;
public float ResourceCoefficient;
diff --git a/Source/Game/Text/CreatureTextManager.cs b/Source/Game/Text/CreatureTextManager.cs
index 45fea6ed9..bface75d3 100644
--- a/Source/Game/Text/CreatureTextManager.cs
+++ b/Source/Game/Text/CreatureTextManager.cs
@@ -237,7 +237,7 @@ namespace Game
return textEntry.duration;
}
- float GetRangeForChatType(ChatMsg msgType)
+ public float GetRangeForChatType(ChatMsg msgType)
{
float dist = WorldConfig.GetFloatValue(WorldCfg.ListenRangeSay);
switch (msgType)
diff --git a/sql/updates/hotfixes/master/2021_08_07_00_hotfixes.sql b/sql/updates/hotfixes/master/2021_08_07_00_hotfixes.sql
new file mode 100644
index 000000000..2ed9cf3f3
--- /dev/null
+++ b/sql/updates/hotfixes/master/2021_08_07_00_hotfixes.sql
@@ -0,0 +1,104 @@
+ALTER TABLE `azerite_essence` MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST;
+
+ALTER TABLE `barber_shop_style` MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST;
+
+ALTER TABLE `battle_pet_breed_quality` MODIFY `QualityEnum` tinyint(11) NOT NULL DEFAULT '0' AFTER `StateMultiplier`;
+
+ALTER TABLE `battle_pet_species` MODIFY `PetTypeEnum` tinyint(11) NOT NULL DEFAULT '0' AFTER `IconFileDataID`;
+
+ALTER TABLE `character_loadout` ADD `Unused910` tinyint(11) NOT NULL DEFAULT '0' AFTER `Purpose`;
+ALTER TABLE `character_loadout` MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST;
+
+ALTER TABLE `chat_channels` MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST;
+
+ALTER TABLE `chr_customization_choice` MODIFY `SwatchColor1` int(11) NOT NULL DEFAULT '0' AFTER `Flags`;
+ALTER TABLE `chr_customization_choice` MODIFY `SwatchColor2` int(11) NOT NULL DEFAULT '0' AFTER `SwatchColor1`;
+
+ALTER TABLE `chr_model` ADD `BarberShopCameraHeightOffsetScale` float NOT NULL DEFAULT '0' AFTER `BarberShopCameraOffsetScale`;
+
+ALTER TABLE `chr_races` ADD `Unknown910_11` float NOT NULL DEFAULT '0' AFTER `AlteredFormCustomizeRotationFallback`;
+ALTER TABLE `chr_races` ADD `Unknown910_12` float NOT NULL DEFAULT '0' AFTER `Unknown910_11`;
+ALTER TABLE `chr_races` ADD `Unknown910_13` float NOT NULL DEFAULT '0' AFTER `Unknown910_12`;
+ALTER TABLE `chr_races` ADD `Unknown910_21` float NOT NULL DEFAULT '0' AFTER `Unknown910_13`;
+ALTER TABLE `chr_races` ADD `Unknown910_22` float NOT NULL DEFAULT '0' AFTER `Unknown910_21`;
+ALTER TABLE `chr_races` ADD `Unknown910_23` float NOT NULL DEFAULT '0' AFTER `Unknown910_22`;
+ALTER TABLE `chr_races` MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST;
+ALTER TABLE `chr_races` MODIFY `FactionID` int(11) NOT NULL DEFAULT '0' AFTER `Flags`;
+ALTER TABLE `chr_races` MODIFY `CinematicSequenceID` int(11) NOT NULL DEFAULT '0' AFTER `FactionID`;
+ALTER TABLE `chr_races` MODIFY `Alliance` int(11) NOT NULL DEFAULT '0' AFTER `SplashSoundID`;
+ALTER TABLE `chr_races` MODIFY `RaceRelated` int(11) NOT NULL DEFAULT '0' AFTER `Alliance`;
+ALTER TABLE `chr_races` MODIFY `UnalteredVisualRaceID` int(11) NOT NULL DEFAULT '0' AFTER `RaceRelated`;
+ALTER TABLE `chr_races` MODIFY `DefaultClassID` int(11) NOT NULL DEFAULT '0' AFTER `UnalteredVisualRaceID`;
+ALTER TABLE `chr_races` MODIFY `NeutralRaceID` int(11) NOT NULL DEFAULT '0' AFTER `SelectScreenFileDataID`;
+ALTER TABLE `chr_races` MODIFY `AlteredFormStartVisualKitID1` int(11) NOT NULL DEFAULT '0' AFTER `LowResScreenFileDataID`;
+ALTER TABLE `chr_races` MODIFY `AlteredFormStartVisualKitID2` int(11) NOT NULL DEFAULT '0' AFTER `AlteredFormStartVisualKitID1`;
+ALTER TABLE `chr_races` MODIFY `AlteredFormStartVisualKitID3` int(11) NOT NULL DEFAULT '0' AFTER `AlteredFormStartVisualKitID2`;
+ALTER TABLE `chr_races` MODIFY `AlteredFormFinishVisualKitID1` int(11) NOT NULL DEFAULT '0' AFTER `AlteredFormStartVisualKitID3`;
+ALTER TABLE `chr_races` MODIFY `AlteredFormFinishVisualKitID2` int(11) NOT NULL DEFAULT '0' AFTER `AlteredFormFinishVisualKitID1`;
+ALTER TABLE `chr_races` MODIFY `AlteredFormFinishVisualKitID3` int(11) NOT NULL DEFAULT '0' AFTER `AlteredFormFinishVisualKitID2`;
+ALTER TABLE `chr_races` MODIFY `MaleModelFallbackRaceID` int(11) NOT NULL DEFAULT '0' AFTER `UiDisplayOrder`;
+ALTER TABLE `chr_races` MODIFY `FemaleModelFallbackRaceID` int(11) NOT NULL DEFAULT '0' AFTER `MaleModelFallbackRaceID`;
+ALTER TABLE `chr_races` MODIFY `MaleTextureFallbackRaceID` int(11) NOT NULL DEFAULT '0' AFTER `FemaleModelFallbackRaceID`;
+ALTER TABLE `chr_races` MODIFY `FemaleTextureFallbackRaceID` int(11) NOT NULL DEFAULT '0' AFTER `MaleTextureFallbackRaceID`;
+ALTER TABLE `chr_races` MODIFY `PlayableRaceBit` int(11) NOT NULL DEFAULT '0' AFTER `FemaleTextureFallbackRaceID`;
+ALTER TABLE `chr_races` MODIFY `UnalteredVisualCustomizationRaceID` int(11) NOT NULL DEFAULT '0' AFTER `TransmogrifyDisabledSlotMask`;
+ALTER TABLE `chr_races` MODIFY `BaseLanguage` tinyint(11) NOT NULL DEFAULT '0' AFTER `Unknown910_23`;
+
+ALTER TABLE `content_tuning_x_expected` ADD `MinMythicPlusSeasonID` int(11) NOT NULL DEFAULT '0' AFTER `ExpectedStatModID`;
+ALTER TABLE `content_tuning_x_expected` ADD `MaxMythicPlusSeasonID` int(11) NOT NULL DEFAULT '0' AFTER `MinMythicPlusSeasonID`;
+ALTER TABLE `content_tuning_x_expected` DROP `MythicPlusSeasonID`;
+
+ALTER TABLE `dungeon_encounter` MODIFY `Flags` int(11) NOT NULL DEFAULT '0' AFTER `CreatureDisplayID`;
+
+ALTER TABLE `faction` MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST;
+
+ALTER TABLE `garr_ability` MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST;
+
+ALTER TABLE `garr_class_spec` MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST;
+
+ALTER TABLE `garr_follower` MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST;
+
+ALTER TABLE `item_effect` DROP `ParentItemID`;
+
+ALTER TABLE `item_search_name` MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST;
+ALTER TABLE `item_search_name` MODIFY `ExpansionID` int(11) NOT NULL DEFAULT '0' AFTER `OverallQualityID`;
+
+ALTER TABLE `item_sparse` MODIFY `ExpansionID` int(11) NOT NULL DEFAULT '0' AFTER `Display`;
+ALTER TABLE `item_sparse` MODIFY `InstanceBound` int(11) NOT NULL DEFAULT '0' AFTER `DmgVariance`;
+
+CREATE TABLE `item_x_item_effect` (
+ `ID` int(10) unsigned NOT NULL DEFAULT '0',
+ `ItemEffectID` int(11) NOT NULL DEFAULT '0',
+ `ItemID` int(10) unsigned NOT NULL DEFAULT '0',
+ `VerifiedBuild` int(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`ID`, `VerifiedBuild`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+
+ALTER TABLE `languages` MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST;
+
+ALTER TABLE `map` DROP `InternalName`;
+
+ALTER TABLE `modifier_tree` MODIFY `TertiaryAsset` int(11) NOT NULL DEFAULT '0' AFTER `SecondaryAsset`;
+
+ALTER TABLE `paragon_reputation` MODIFY `FactionID` int(11) NOT NULL DEFAULT '0' AFTER `ID`;
+
+ALTER TABLE `player_condition` MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST;
+
+ALTER TABLE `rand_prop_points` MODIFY `GoodF4` float NOT NULL DEFAULT '0' AFTER `GoodF3`;
+ALTER TABLE `rand_prop_points` MODIFY `GoodF5` float NOT NULL DEFAULT '0' AFTER `GoodF4`;
+ALTER TABLE `rand_prop_points` MODIFY `Epic1` int(10) unsigned NOT NULL DEFAULT '0' AFTER `GoodF5`;
+ALTER TABLE `rand_prop_points` MODIFY `Epic2` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Epic1`;
+ALTER TABLE `rand_prop_points` MODIFY `Epic3` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Epic2`;
+ALTER TABLE `rand_prop_points` MODIFY `Epic4` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Epic3`;
+ALTER TABLE `rand_prop_points` MODIFY `Epic5` int(10) unsigned NOT NULL DEFAULT '0' AFTER `Epic4`;
+
+ALTER TABLE `spell_effect` ADD `ScalingClass` int(11) NOT NULL DEFAULT '0' AFTER `EffectBasePoints`;
+
+ALTER TABLE `spell_item_enchantment` MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST;
+ALTER TABLE `spell_item_enchantment` MODIFY `TransmogCost` int(10) unsigned NOT NULL DEFAULT '0' AFTER `TransmogUseConditionID`;
+
+ALTER TABLE `spell_scaling` DROP `Class`;
+
+ALTER TABLE `spell_x_spell_visual` MODIFY `Priority` int(11) NOT NULL DEFAULT '0' AFTER `Probability`;
+
+ALTER TABLE `transmog_set_group` MODIFY `ID` int(10) unsigned NOT NULL DEFAULT '0' FIRST;
diff --git a/sql/updates/world/master/2021_07_27_00_world.sql b/sql/updates/world/master/2021_07_27_00_world.sql
new file mode 100644
index 000000000..7f8bd4134
--- /dev/null
+++ b/sql/updates/world/master/2021_07_27_00_world.sql
@@ -0,0 +1,6 @@
+ALTER TABLE `creature_template` ADD `CreatureDifficultyID` int(11) NOT NULL DEFAULT '0' AFTER `movementId`;
+ALTER TABLE `creature_template_scaling` DROP `LevelScalingMin`, DROP `LevelScalingMax`;
+ALTER TABLE `points_of_interest` ADD `PositionZ` float NOT NULL DEFAULT '0' AFTER `PositionY`;
+ALTER TABLE `quest_template` ADD `PortraitGiverModelSceneID` int(11) NOT NULL DEFAULT '0' AFTER `PortraitGiverMount`;
+
+DELETE FROM `creature_template_scaling` WHERE `ContentTuningID`=0;