diff --git a/Source/Framework/Constants/AchievementConst.cs b/Source/Framework/Constants/AchievementConst.cs index 5d03f78e6..956a386cd 100644 --- a/Source/Framework/Constants/AchievementConst.cs +++ b/Source/Framework/Constants/AchievementConst.cs @@ -26,7 +26,7 @@ namespace Framework.Constants Any = -1, } - public enum CriteriaTreeFlags : ushort + public enum CriteriaTreeFlags { ProgressBar = 0x0001, ProgressIsDate = 0x0004, diff --git a/Source/Framework/Constants/PlayerConst.cs b/Source/Framework/Constants/PlayerConst.cs index 557b0f1a1..e660c8ed7 100644 --- a/Source/Framework/Constants/PlayerConst.cs +++ b/Source/Framework/Constants/PlayerConst.cs @@ -42,7 +42,7 @@ namespace Framework.Constants public const uint infinityCooldownDelayCheck = Time.Month / 2; public const int MaxPlayerSummonDelay = 2 * Time.Minute; - public const int TaxiMaskSize = 311; + public const int TaxiMaskSize = 319; // corpse reclaim times public const int DeathExpireStep = (5 * Time.Minute); @@ -542,7 +542,7 @@ namespace Framework.Constants // first slot for item stored (in any way in player items data) Start = 0, // last+1 slot for item stored (in any way in player items data) - End = 195, + End = 199, Count = (End - Start) } diff --git a/Source/Framework/Constants/SharedConst.cs b/Source/Framework/Constants/SharedConst.cs index 9453078dd..c439e1219 100644 --- a/Source/Framework/Constants/SharedConst.cs +++ b/Source/Framework/Constants/SharedConst.cs @@ -41,7 +41,7 @@ namespace Framework.Constants public const int MaxMountCapabilities = 24; public const int MaxLockCase = 8; public const int MaxAzeriteEmpoweredTier = 5; - public const int MaxAzeriteEssenceSlot = 3; + public const int MaxAzeriteEssenceSlot = 4; public const int MaxAzeriteEssenceRank = 4; /// @@ -582,6 +582,8 @@ namespace Framework.Constants BattleForAzeroth = 7, Max, + ShadowLands = 8, + MaxAccountExpansions } public enum PowerType : sbyte @@ -762,7 +764,8 @@ namespace Framework.Constants HeroicWarfront = 149, LFR15thAnniversary = 151, - Max + VisionsOfNzoth = 152, + TeemingIsland = 153 } public enum DifficultyFlags : ushort diff --git a/Source/Framework/Database/Databases/CharacterDatabase.cs b/Source/Framework/Database/Databases/CharacterDatabase.cs index 23811969d..05f4d68f5 100644 --- a/Source/Framework/Database/Databases/CharacterDatabase.cs +++ b/Source/Framework/Database/Databases/CharacterDatabase.cs @@ -144,10 +144,10 @@ namespace Framework.Database PrepareStatement(CharStatements.SEL_MAILITEMS, "SELECT " + SelectItemInstanceContent + ", ii.owner_guid, m.id FROM mail_items mi INNER JOIN mail m ON mi.mail_id = m.id LEFT JOIN item_instance ii ON mi.item_guid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid LEFT JOIN item_instance_transmog iit ON ii.guid = iit.itemGuid LEFT JOIN item_instance_modifiers im ON ii.guid = im.itemGuid WHERE m.receiver = ?"); PrepareStatement(CharStatements.SEL_MAILITEMS_ARTIFACT, "SELECT a.itemGuid, a.xp, a.artifactAppearanceId, a.artifactTierId, ap.artifactPowerId, ap.purchasedRank FROM item_instance_artifact_powers ap LEFT JOIN item_instance_artifact a ON ap.itemGuid = a.itemGuid INNER JOIN mail_items mi ON a.itemGuid = mi.item_guid INNER JOIN mail m ON mi.mail_id = m.id WHERE m.receiver = ?"); PrepareStatement(CharStatements.SEL_MAILITEMS_AZERITE, "SELECT iz.itemGuid, iz.xp, iz.level, iz.knowledgeLevel, " + - "iz.selectedAzeriteEssences1specId, iz.selectedAzeriteEssences1azeriteEssenceId1, iz.selectedAzeriteEssences1azeriteEssenceId2, iz.selectedAzeriteEssences1azeriteEssenceId3, " + - "iz.selectedAzeriteEssences2specId, iz.selectedAzeriteEssences2azeriteEssenceId1, iz.selectedAzeriteEssences2azeriteEssenceId2, iz.selectedAzeriteEssences2azeriteEssenceId3, " + - "iz.selectedAzeriteEssences3specId, iz.selectedAzeriteEssences3azeriteEssenceId1, iz.selectedAzeriteEssences3azeriteEssenceId2, iz.selectedAzeriteEssences3azeriteEssenceId3, " + - "iz.selectedAzeriteEssences4specId, iz.selectedAzeriteEssences4azeriteEssenceId1, iz.selectedAzeriteEssences4azeriteEssenceId2, iz.selectedAzeriteEssences4azeriteEssenceId3 " + + "iz.selectedAzeriteEssences1specId, iz.selectedAzeriteEssences1azeriteEssenceId1, iz.selectedAzeriteEssences1azeriteEssenceId2, iz.selectedAzeriteEssences1azeriteEssenceId3, iz.selectedAzeriteEssences1azeriteEssenceId4, " + + "iz.selectedAzeriteEssences2specId, iz.selectedAzeriteEssences2azeriteEssenceId1, iz.selectedAzeriteEssences2azeriteEssenceId2, iz.selectedAzeriteEssences2azeriteEssenceId3, iz.selectedAzeriteEssences2azeriteEssenceId4, " + + "iz.selectedAzeriteEssences3specId, iz.selectedAzeriteEssences3azeriteEssenceId1, iz.selectedAzeriteEssences3azeriteEssenceId2, iz.selectedAzeriteEssences3azeriteEssenceId3, iz.selectedAzeriteEssences3azeriteEssenceId4, " + + "iz.selectedAzeriteEssences4specId, iz.selectedAzeriteEssences4azeriteEssenceId1, iz.selectedAzeriteEssences4azeriteEssenceId2, iz.selectedAzeriteEssences4azeriteEssenceId3, iz.selectedAzeriteEssences4azeriteEssenceId4 " + "FROM item_instance_azerite iz INNER JOIN mail_items mi ON iz.itemGuid = mi.item_guid INNER JOIN mail m ON mi.mail_id = m.id WHERE m.receiver = ?"); PrepareStatement(CharStatements.SEL_MAILITEMS_AZERITE_MILESTONE_POWER, "SELECT iamp.itemGuid, iamp.azeriteItemMilestonePowerId FROM item_instance_azerite_milestone_power iamp INNER JOIN mail_items mi ON iamp.itemGuid = mi.item_guid INNER JOIN mail m ON mi.mail_id = m.id WHERE m.receiver = ?"); PrepareStatement(CharStatements.SEL_MAILITEMS_AZERITE_UNLOCKED_ESSENCE, "SELECT iaue.itemGuid, iaue.azeriteEssenceId, iaue.`rank` FROM item_instance_azerite_unlocked_essence iaue INNER JOIN mail_items mi ON iaue.itemGuid = mi.item_guid INNER JOIN mail m ON mi.mail_id = m.id WHERE m.receiver = ?"); @@ -197,14 +197,15 @@ namespace Framework.Database PrepareStatement(CharStatements.DEL_ITEM_INSTANCE_MODIFIERS, "DELETE FROM item_instance_modifiers WHERE itemGuid = ?"); PrepareStatement(CharStatements.DEL_ITEM_INSTANCE_MODIFIERS_BY_OWNER, "DELETE im FROM item_instance_modifiers im LEFT JOIN item_instance ii ON im.itemGuid = ii.guid WHERE ii.owner_guid = ?"); PrepareStatement(CharStatements.SEL_ITEM_INSTANCE_AZERITE, "SELECT iz.itemGuid, iz.xp, iz.level, iz.knowledgeLevel, " + - "iz.selectedAzeriteEssences1specId, iz.selectedAzeriteEssences1azeriteEssenceId1, iz.selectedAzeriteEssences1azeriteEssenceId2, iz.selectedAzeriteEssences1azeriteEssenceId3, " + - "iz.selectedAzeriteEssences2specId, iz.selectedAzeriteEssences2azeriteEssenceId1, iz.selectedAzeriteEssences2azeriteEssenceId2, iz.selectedAzeriteEssences2azeriteEssenceId3, " + - "iz.selectedAzeriteEssences3specId, iz.selectedAzeriteEssences3azeriteEssenceId1, iz.selectedAzeriteEssences3azeriteEssenceId2, iz.selectedAzeriteEssences3azeriteEssenceId3, " + - "iz.selectedAzeriteEssences4specId, iz.selectedAzeriteEssences4azeriteEssenceId1, iz.selectedAzeriteEssences4azeriteEssenceId2, iz.selectedAzeriteEssences4azeriteEssenceId3 " + + "iz.selectedAzeriteEssences1specId, iz.selectedAzeriteEssences1azeriteEssenceId1, iz.selectedAzeriteEssences1azeriteEssenceId2, iz.selectedAzeriteEssences1azeriteEssenceId3, iz.selectedAzeriteEssences1azeriteEssenceId4, " + + "iz.selectedAzeriteEssences2specId, iz.selectedAzeriteEssences2azeriteEssenceId1, iz.selectedAzeriteEssences2azeriteEssenceId2, iz.selectedAzeriteEssences2azeriteEssenceId3, iz.selectedAzeriteEssences2azeriteEssenceId4, " + + "iz.selectedAzeriteEssences3specId, iz.selectedAzeriteEssences3azeriteEssenceId1, iz.selectedAzeriteEssences3azeriteEssenceId2, iz.selectedAzeriteEssences3azeriteEssenceId3, iz.selectedAzeriteEssences3azeriteEssenceId4, " + + "iz.selectedAzeriteEssences4specId, iz.selectedAzeriteEssences4azeriteEssenceId1, iz.selectedAzeriteEssences4azeriteEssenceId2, iz.selectedAzeriteEssences4azeriteEssenceId3, iz.selectedAzeriteEssences4azeriteEssenceId4 " + "FROM item_instance_azerite iz INNER JOIN character_inventory ci ON iz.itemGuid = ci.item WHERE ci.guid = ?"); - PrepareStatement(CharStatements.INS_ITEM_INSTANCE_AZERITE, "INSERT INTO item_instance_azerite (itemGuid, xp, level, knowledgeLevel, selectedAzeriteEssences1specId, selectedAzeriteEssences1azeriteEssenceId1, selectedAzeriteEssences1azeriteEssenceId2, selectedAzeriteEssences1azeriteEssenceId3, " + - "selectedAzeriteEssences2specId, selectedAzeriteEssences2azeriteEssenceId1, selectedAzeriteEssences2azeriteEssenceId2, selectedAzeriteEssences2azeriteEssenceId3, selectedAzeriteEssences3specId, selectedAzeriteEssences3azeriteEssenceId1, selectedAzeriteEssences3azeriteEssenceId2, selectedAzeriteEssences3azeriteEssenceId3, " + - "selectedAzeriteEssences4specId, selectedAzeriteEssences4azeriteEssenceId1, selectedAzeriteEssences4azeriteEssenceId2, selectedAzeriteEssences4azeriteEssenceId3) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + PrepareStatement(CharStatements.INS_ITEM_INSTANCE_AZERITE, "INSERT INTO item_instance_azerite (itemGuid, xp, level, knowledgeLevel, selectedAzeriteEssences1specId, selectedAzeriteEssences1azeriteEssenceId1, selectedAzeriteEssences1azeriteEssenceId2, selectedAzeriteEssences1azeriteEssenceId3, selectedAzeriteEssences1azeriteEssenceId4, " + + "selectedAzeriteEssences2specId, selectedAzeriteEssences2azeriteEssenceId1, selectedAzeriteEssences2azeriteEssenceId2, selectedAzeriteEssences2azeriteEssenceId3, selectedAzeriteEssences2azeriteEssenceId4, " + + "selectedAzeriteEssences3specId, selectedAzeriteEssences3azeriteEssenceId1, selectedAzeriteEssences3azeriteEssenceId2, selectedAzeriteEssences3azeriteEssenceId3, selectedAzeriteEssences3azeriteEssenceId4, " + + "selectedAzeriteEssences4specId, selectedAzeriteEssences4azeriteEssenceId1, selectedAzeriteEssences4azeriteEssenceId2, selectedAzeriteEssences4azeriteEssenceId3, selectedAzeriteEssences4azeriteEssenceId4) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(CharStatements.UPD_ITEM_INSTANCE_AZERITE_ON_LOAD, "UPDATE item_instance_azerite SET xp = ?, knowledgeLevel = ? WHERE itemGuid = ?"); PrepareStatement(CharStatements.DEL_ITEM_INSTANCE_AZERITE, "DELETE FROM item_instance_azerite WHERE itemGuid = ?"); PrepareStatement(CharStatements.DEL_ITEM_INSTANCE_AZERITE_BY_OWNER, "DELETE iz FROM item_instance_azerite iz LEFT JOIN item_instance ii ON iz.itemGuid = ii.guid WHERE ii.owner_guid = ?"); diff --git a/Source/Framework/Database/Databases/HotfixDatabase.cs b/Source/Framework/Database/Databases/HotfixDatabase.cs index e7ebc5062..2019044eb 100644 --- a/Source/Framework/Database/Databases/HotfixDatabase.cs +++ b/Source/Framework/Database/Databases/HotfixDatabase.cs @@ -223,12 +223,12 @@ namespace Framework.Database "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"); + "AlteredFormFinishVisualKitID1, AlteredFormFinishVisualKitID2, AlteredFormFinishVisualKitID3, HeritageArmorAchievementID, StartingLevel, " + + "UiDisplayOrder, FemaleSkeletonFileDataID, MaleSkeletonFileDataID, HelmVisFallbackRaceID, TransmogrifyDisabledSlotMask, 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"); PrepareStatement(HotfixStatements.SEL_CHR_RACES_LOCALE, "SELECT ID, Name_lang, NameFemale_lang, NameLowercase_lang, NameFemaleLowercase_lang" + " FROM chr_races_locale WHERE locale = ?"); @@ -250,8 +250,8 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING, "SELECT ID, MinLevel, MaxLevel, Flags, ExpansionID FROM content_tuning ORDER BY ID DESC"); // ContentTuningXExpected.db2 - PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING_X_EXPECTED, "SELECT ID, ExpectedStatModID, ContentTuningID FROM content_tuning_x_expected" + - " ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_CONTENT_TUNING_X_EXPECTED, "SELECT ID, ExpectedStatModID, MythicPlusSeasonID, ContentTuningID" + + " FROM content_tuning_x_expected ORDER BY ID DESC"); // ConversationLine.db2 PrepareStatement(HotfixStatements.SEL_CONVERSATION_LINE, "SELECT ID, BroadcastTextID, SpellVisualKitID, AdditionalDuration, NextConversationLineID, " + @@ -296,8 +296,9 @@ namespace Framework.Database PrepareStatement(HotfixStatements.SEL_CRITERIA_TREE_LOCALE, "SELECT ID, Description_lang FROM criteria_tree_locale WHERE locale = ?"); // CurrencyTypes.db2 - PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES, "SELECT ID, Name, Description, CategoryID, InventoryIconFileID, SpellWeight, SpellCategory, MaxQty, " + - "MaxEarnablePerWeek, Flags, Quality, FactionID, ItemGroupSoundsID FROM currency_types ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES, "SELECT ID, Name, Description, CategoryID, InventoryIconFileID, SpellWeight, SpellCategory, MaxQty, " + + "MaxEarnablePerWeek, Flags, Quality, FactionID, ItemGroupSoundsID, ConvertToPlayerExperience, PlayerConditionID FROM currency_types" + + " ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_CURRENCY_TYPES_LOCALE, "SELECT ID, Name_lang, Description_lang FROM currency_types_locale WHERE locale = ?"); // Curve.db2 @@ -487,8 +488,8 @@ namespace Framework.Database "ItemGroupSoundsID FROM item ORDER BY ID DESC"); // ItemAppearance.db2 - PrepareStatement(HotfixStatements.SEL_ITEM_APPEARANCE, "SELECT ID, DisplayType, SubclassID, ItemDisplayInfoID, DefaultIconFileDataID, UiOrder" + - " FROM item_appearance ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_ITEM_APPEARANCE, "SELECT ID, DisplayType, ItemDisplayInfoID, DefaultIconFileDataID, UiOrder FROM item_appearance" + + " ORDER BY ID DESC"); // ItemArmorQuality.db2 PrepareStatement(HotfixStatements.SEL_ITEM_ARMOR_QUALITY, "SELECT ID, Qualitymod1, Qualitymod2, Qualitymod3, Qualitymod4, Qualitymod5, Qualitymod6, " + @@ -680,8 +681,8 @@ namespace Framework.Database " ORDER BY ID DESC"); // Mount.db2 - PrepareStatement(HotfixStatements.SEL_MOUNT, "SELECT Name, SourceText, Description, ID, MountTypeID, Flags, SourceTypeEnum, SourceSpellID, " + - "PlayerConditionID, MountFlyRideHeight, UiModelSceneID FROM mount ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_MOUNT, "SELECT Name, SourceText, Description, ID, MountTypeID, Flags, SourceTypeEnum, SourceSpellID, " + + "PlayerConditionID, MountFlyRideHeight, UiModelSceneID, MountSpecialRiderAnimKitID, MountSpecialSpellVisualKitID FROM mount ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_MOUNT_LOCALE, "SELECT ID, Name_lang, SourceText_lang, Description_lang FROM mount_locale WHERE locale = ?"); // MountCapability.db2 @@ -1000,7 +1001,7 @@ namespace Framework.Database " FROM spell_totems ORDER BY ID DESC"); // SpellVisualKit.db2 - PrepareStatement(HotfixStatements.SEL_SPELL_VISUAL_KIT, "SELECT ID, Flags, FallbackPriority, FallbackSpellVisualKitId, DelayMin, DelayMax" + + PrepareStatement(HotfixStatements.SEL_SPELL_VISUAL_KIT, "SELECT ID, FallbackPriority, FallbackSpellVisualKitId, DelayMin, DelayMax, Flags1, Flags2" + " FROM spell_visual_kit ORDER BY ID DESC"); // SpellXSpellVisual.db2 @@ -1065,8 +1066,8 @@ namespace Framework.Database " ORDER BY ID DESC"); // UiMap.db2 - PrepareStatement(HotfixStatements.SEL_UI_MAP, "SELECT Name, ID, ParentUiMapID, Flags, System, Type, LevelRangeMin, LevelRangeMax, BountySetID, " + - "BountyDisplayLocation, VisibilityPlayerConditionID, HelpTextPosition, BkgAtlasID FROM ui_map ORDER BY ID DESC"); + PrepareStatement(HotfixStatements.SEL_UI_MAP, "SELECT Name, ID, ParentUiMapID, Flags, System, Type, LevelRangeMin, LevelRangeMax, BountySetID, " + + "BountyDisplayLocation, VisibilityPlayerConditionID, HelpTextPosition, BkgAtlasID, AlternateUiMapGroup FROM ui_map ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_UI_MAP_LOCALE, "SELECT ID, Name_lang FROM ui_map_locale WHERE locale = ?"); // UiMapAssignment.db2 diff --git a/Source/Game/Chat/Commands/DebugCommands.cs b/Source/Game/Chat/Commands/DebugCommands.cs index a700e5c65..7b6ffe136 100644 --- a/Source/Game/Chat/Commands/DebugCommands.cs +++ b/Source/Game/Chat/Commands/DebugCommands.cs @@ -653,15 +653,15 @@ namespace Game.Chat if (!int.TryParse(difficulty_str, out int difficulty)) difficulty = -1; - if (difficulty >= (int)Difficulty.Max || difficulty < -1) + if (CliDB.DifficultyStorage.HasRecord((uint)difficulty) || difficulty < -1) return false; if (difficulty == -1) { - for (byte diff = 0; diff < (int)Difficulty.Max; ++diff) + foreach (var diffRecord in CliDB.DifficultyStorage.Values) { - if (Global.DB2Mgr.GetMapDifficultyData((uint)map, (Difficulty)diff) != null) - Global.InstanceSaveMgr.ForceGlobalReset((uint)map, (Difficulty)diff); + if (Global.DB2Mgr.GetMapDifficultyData((uint)map, (Difficulty)diffRecord.Id) != null) + Global.InstanceSaveMgr.ForceGlobalReset((uint)map, (Difficulty)diffRecord.Id); } } else diff --git a/Source/Game/Chat/Commands/InstanceCommands.cs b/Source/Game/Chat/Commands/InstanceCommands.cs index 052274514..5ec98eac3 100644 --- a/Source/Game/Chat/Commands/InstanceCommands.cs +++ b/Source/Game/Chat/Commands/InstanceCommands.cs @@ -20,6 +20,7 @@ using Framework.IO; using Game.Entities; using Game.Groups; using Game.Maps; +using Game.DataStorage; namespace Game.Chat { @@ -36,9 +37,9 @@ namespace Game.Chat string format = "map: {0} inst: {1} perm: {2} diff: {3} canReset: {4} TTR: {5}"; uint counter = 0; - for (byte i = 0; i < (int)Difficulty.Max; ++i) + foreach (var difficulty in CliDB.DifficultyStorage.Values) { - var binds = player.GetBoundInstances((Difficulty)i); + var binds = player.GetBoundInstances((Difficulty)difficulty.Id); foreach (var pair in binds) { InstanceSave save = pair.Value.save; @@ -53,9 +54,9 @@ namespace Game.Chat Group group = player.GetGroup(); if (group) { - for (byte i = 0; i < (int)Difficulty.Max; ++i) + foreach (var difficulty in CliDB.DifficultyStorage.Values) { - var binds = group.GetBoundInstances((Difficulty)i); + var binds = group.GetBoundInstances((Difficulty)difficulty.Id); foreach (var pair in binds) { InstanceSave save = pair.Value.save; @@ -93,9 +94,9 @@ namespace Game.Chat return false; } - for (byte i = 0; i < (int)Difficulty.Max; ++i) + foreach (var difficulty in CliDB.DifficultyStorage.Values) { - var binds = player.GetBoundInstances((Difficulty)i); + var binds = player.GetBoundInstances((Difficulty)difficulty.Id); foreach (var pair in binds) { InstanceSave save = pair.Value.save; @@ -104,7 +105,7 @@ namespace Game.Chat string timeleft = Time.GetTimeString(save.GetResetTime() - Time.UnixTime); handler.SendSysMessage("unbinding map: {0} inst: {1} perm: {2} diff: {3} canReset: {4} TTR: {5}", pair.Key, save.GetInstanceId(), pair.Value.perm ? "yes" : "no", save.GetDifficultyID(), save.CanReset() ? "yes" : "no", timeleft); - player.UnbindInstance(pair.Key, (Difficulty)i); + player.UnbindInstance(pair.Key, (Difficulty)difficulty.Id); counter++; } } diff --git a/Source/Game/DataStorage/Structs/C_Records.cs b/Source/Game/DataStorage/Structs/C_Records.cs index e0987ae03..115e6d3ae 100644 --- a/Source/Game/DataStorage/Structs/C_Records.cs +++ b/Source/Game/DataStorage/Structs/C_Records.cs @@ -148,6 +148,7 @@ namespace Game.DataStorage public int FemaleSkeletonFileDataID; public int MaleSkeletonFileDataID; public int HelmVisFallbackRaceID; + public int TransmogrifyDisabledSlotMask; public ushort FactionID; public ushort CinematicSequenceID; public short ResSicknessSpellID; @@ -222,6 +223,7 @@ namespace Game.DataStorage { public uint Id; public int ExpectedStatModID; + public int MythicPlusSeasonID; public uint ContentTuningID; } @@ -384,6 +386,8 @@ namespace Game.DataStorage public sbyte Quality; public int FactionID; public int ItemGroupSoundsID; + public int ConvertToPlayerExperience; + public int PlayerConditionID; } public sealed class CurveRecord diff --git a/Source/Game/DataStorage/Structs/I_Records.cs b/Source/Game/DataStorage/Structs/I_Records.cs index 7273b8e01..6ace726df 100644 --- a/Source/Game/DataStorage/Structs/I_Records.cs +++ b/Source/Game/DataStorage/Structs/I_Records.cs @@ -63,7 +63,6 @@ namespace Game.DataStorage { public uint Id; public byte DisplayType; - public int SubclassID; public uint ItemDisplayInfoID; public int DefaultIconFileDataID; public int UiOrder; diff --git a/Source/Game/DataStorage/Structs/M_Records.cs b/Source/Game/DataStorage/Structs/M_Records.cs index 93a0ba56d..6cb47cb17 100644 --- a/Source/Game/DataStorage/Structs/M_Records.cs +++ b/Source/Game/DataStorage/Structs/M_Records.cs @@ -140,6 +140,8 @@ namespace Game.DataStorage public uint PlayerConditionID; public float MountFlyRideHeight; public int UiModelSceneID; + public int MountSpecialRiderAnimKitID; + public int MountSpecialSpellVisualKitID; public bool IsSelfMount() { return (Flags & MountFlags.SelfMount) != 0; } } diff --git a/Source/Game/DataStorage/Structs/S_Records.cs b/Source/Game/DataStorage/Structs/S_Records.cs index a708acdff..f3ce57485 100644 --- a/Source/Game/DataStorage/Structs/S_Records.cs +++ b/Source/Game/DataStorage/Structs/S_Records.cs @@ -537,11 +537,11 @@ namespace Game.DataStorage public sealed class SpellVisualKitRecord { public uint Id; - public int Flags; public sbyte FallbackPriority; - public uint FallbackSpellVisualKitId; + public int FallbackSpellVisualKitId; public ushort DelayMin; public ushort DelayMax; + public int[] Flags = new int[2]; } public sealed class SpellXSpellVisualRecord diff --git a/Source/Game/DataStorage/Structs/U_Records.cs b/Source/Game/DataStorage/Structs/U_Records.cs index e86834c1e..8e8ff08d0 100644 --- a/Source/Game/DataStorage/Structs/U_Records.cs +++ b/Source/Game/DataStorage/Structs/U_Records.cs @@ -34,6 +34,7 @@ namespace Game.DataStorage public int VisibilityPlayerConditionID; public sbyte HelpTextPosition; public int BkgAtlasID; + public int AlternateUiMapGroup; } public sealed class UiMapAssignmentRecord diff --git a/Source/Game/Entities/Item/AzeriteItem.cs b/Source/Game/Entities/Item/AzeriteItem.cs index 62d2a59cf..37990ed64 100644 --- a/Source/Game/Entities/Item/AzeriteItem.cs +++ b/Source/Game/Entities/Item/AzeriteItem.cs @@ -78,15 +78,15 @@ namespace Game.Entities int specIndex = 0; for (; specIndex < m_azeriteItemData.SelectedEssences.Size(); ++specIndex) { - stmt.AddValue(4 + specIndex * 4, m_azeriteItemData.SelectedEssences[specIndex].SpecializationID); + stmt.AddValue(4 + specIndex * 5, m_azeriteItemData.SelectedEssences[specIndex].SpecializationID); for (int j = 0; j < SharedConst.MaxAzeriteEssenceSlot; ++j) - stmt.AddValue(5 + specIndex * 4 + j, m_azeriteItemData.SelectedEssences[specIndex].AzeriteEssenceID[j]); + stmt.AddValue(5 + specIndex * 5 + j, m_azeriteItemData.SelectedEssences[specIndex].AzeriteEssenceID[j]); } for (; specIndex < PlayerConst.MaxSpecializations; ++specIndex) { - stmt.AddValue(4 + specIndex * 4, 0); + stmt.AddValue(4 + specIndex * 5, 0); for (int j = 0; j < SharedConst.MaxAzeriteEssenceSlot; ++j) - stmt.AddValue(5 + specIndex * 4 + j, 0); + stmt.AddValue(5 + specIndex * 5 + j, 0); } trans.Append(stmt); diff --git a/Source/Game/Entities/Item/Item.cs b/Source/Game/Entities/Item/Item.cs index c2d0cdbfb..e8bf001e3 100644 --- a/Source/Game/Entities/Item/Item.cs +++ b/Source/Game/Entities/Item/Item.cs @@ -3100,7 +3100,7 @@ namespace Game.Entities info.AzeriteItem.SelectedAzeriteEssences[i].SpecializationId = specializationId; for (int j = 0; j < SharedConst.MaxAzeriteEssenceSlot; ++j) { - AzeriteEssenceRecord azeriteEssence = CliDB.AzeriteEssenceStorage.LookupByKey(azeriteItemResult.Read(5 + i * 4 + j)); + AzeriteEssenceRecord azeriteEssence = CliDB.AzeriteEssenceStorage.LookupByKey(azeriteItemResult.Read(5 + i * 5 + j)); if (azeriteEssence == null || !Global.DB2Mgr.IsSpecSetMember(azeriteEssence.SpecSetID, specializationId)) continue; diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index 3e8e79991..949097384 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -1047,7 +1047,7 @@ namespace Game.Entities Log.outError(LogFilter.Player, "_LoadBoundInstances: player {0}({1}) has bind to not existed or not dungeon map {2} ({3})", GetName(), GetGUID().ToString(), mapId, mapname); deleteInstance = true; } - else if (difficulty >= (int)Difficulty.Max) + else if (CliDB.DifficultyStorage.HasRecord(difficulty)) { Log.outError(LogFilter.Player, "_LoadBoundInstances: player {0}({1}) has bind to not existed difficulty {2} instance for map {3} ({4})", GetName(), GetGUID().ToString(), difficulty, mapId, mapname); deleteInstance = true; diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index 1abf93bfa..2c6002a34 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -5280,10 +5280,10 @@ namespace Game if (dungeonEncounter.DifficultyID == 0) { - for (uint i = 0; i < (int)Difficulty.Max; ++i) + foreach (var difficulty in CliDB.DifficultyStorage.Values) { - if (Global.DB2Mgr.GetMapDifficultyData((uint)dungeonEncounter.MapID, (Difficulty)i) != null) - _dungeonEncounterStorage.Add(MathFunctions.MakePair64((uint)dungeonEncounter.MapID, i), new DungeonEncounter(dungeonEncounter, creditType, creditEntry, lastEncounterDungeon)); + if (Global.DB2Mgr.GetMapDifficultyData((uint)dungeonEncounter.MapID, (Difficulty)difficulty.Id) != null) + _dungeonEncounterStorage.Add(MathFunctions.MakePair64((uint)dungeonEncounter.MapID, difficulty.Id), new DungeonEncounter(dungeonEncounter, creditType, creditEntry, lastEncounterDungeon)); } } else diff --git a/Source/Game/Handlers/CalendarHandler.cs b/Source/Game/Handlers/CalendarHandler.cs index 2043a056a..a85104d74 100644 --- a/Source/Game/Handlers/CalendarHandler.cs +++ b/Source/Game/Handlers/CalendarHandler.cs @@ -24,6 +24,7 @@ using Game.Maps; using Game.Network; using Game.Network.Packets; using System; +using Game.DataStorage; namespace Game { @@ -71,9 +72,9 @@ namespace Game packet.Events.Add(eventInfo); } - for (Difficulty i = 0; i < Difficulty.Max; ++i) + foreach (var difficulty in CliDB.DifficultyStorage.Values) { - var boundInstances = _player.GetBoundInstances(i); + var boundInstances = _player.GetBoundInstances((Difficulty)difficulty.Id); if (boundInstances != null) { foreach (var boundInstance in boundInstances.Values) diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index 67f7d5531..5e8d47955 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -2873,18 +2873,22 @@ CREATE TABLE `item_instance_azerite` ( `selectedAzeriteEssences1azeriteEssenceId1` int(10) unsigned NULL DEFAULT '0', `selectedAzeriteEssences1azeriteEssenceId2` int(10) unsigned NULL DEFAULT '0', `selectedAzeriteEssences1azeriteEssenceId3` int(10) unsigned NULL DEFAULT '0', + `selectedAzeriteEssences1azeriteEssenceId4` int(10) unsigned NULL DEFAULT '0', `selectedAzeriteEssences2specId` int(10) unsigned NULL DEFAULT '0', `selectedAzeriteEssences2azeriteEssenceId1` int(10) unsigned NULL DEFAULT '0', `selectedAzeriteEssences2azeriteEssenceId2` int(10) unsigned NULL DEFAULT '0', `selectedAzeriteEssences2azeriteEssenceId3` int(10) unsigned NULL DEFAULT '0', + `selectedAzeriteEssences2azeriteEssenceId4` int(10) unsigned NULL DEFAULT '0', `selectedAzeriteEssences3specId` int(10) unsigned NULL DEFAULT '0', `selectedAzeriteEssences3azeriteEssenceId1` int(10) unsigned NULL DEFAULT '0', `selectedAzeriteEssences3azeriteEssenceId2` int(10) unsigned NULL DEFAULT '0', `selectedAzeriteEssences3azeriteEssenceId3` int(10) unsigned NULL DEFAULT '0', + `selectedAzeriteEssences3azeriteEssenceId4` int(10) unsigned NULL DEFAULT '0', `selectedAzeriteEssences4specId` int(10) unsigned NULL DEFAULT '0', `selectedAzeriteEssences4azeriteEssenceId1` int(10) unsigned NULL DEFAULT '0', `selectedAzeriteEssences4azeriteEssenceId2` int(10) unsigned NULL DEFAULT '0', `selectedAzeriteEssences4azeriteEssenceId3` int(10) unsigned NULL DEFAULT '0', + `selectedAzeriteEssences4azeriteEssenceId4` int(10) unsigned NULL DEFAULT '0', PRIMARY KEY (`itemGuid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; @@ -3691,7 +3695,8 @@ INSERT INTO `updates` VALUES ('2019_11_12_00_characters.sql','D4C642B4D48DAE9F56329BDE51C258323A132A91','RELEASED','2019-11-12 16:31:29',0), ('2019_11_22_00_characters.sql','95DFA71DBD75542C098CD86E9C0051C9690902F0','RELEASED','2019-11-20 15:10:12',0), ('2019_11_30_00_characters.sql','D0678E62B651AECA60C2DD6989BF80BD999AD12B','RELEASED','2019-11-29 22:42:01',0), -('2019_12_05_00_characters.sql','EA381C9634A5646A3168F15DF4E06A708A622762','RELEASED','2019-12-05 20:56:58',0); +('2019_12_05_00_characters.sql','EA381C9634A5646A3168F15DF4E06A708A622762','RELEASED','2019-12-05 20:56:58',0), +('2020_02_17_00_characters.sql','E1519A81D35F19B48B3C75A83A270CB4BA0B84F2','RELEASED','2020-02-17 21:55:17',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/hotfixes/master/2020_02_17_00_hotfixes.sql b/sql/updates/hotfixes/master/2020_02_17_00_hotfixes.sql new file mode 100644 index 000000000..d7505bd0e --- /dev/null +++ b/sql/updates/hotfixes/master/2020_02_17_00_hotfixes.sql @@ -0,0 +1,21 @@ +ALTER TABLE `chr_races` ADD `TransmogrifyDisabledSlotMask` int(11) NOT NULL DEFAULT '0' AFTER `HelmVisFallbackRaceID`; + +ALTER TABLE `content_tuning_x_expected` ADD `MythicPlusSeasonID` int(11) NOT NULL DEFAULT '0' AFTER `ExpectedStatModID`; + +ALTER TABLE `criteria_tree` MODIFY `Flags` int(11) NOT NULL DEFAULT '0' AFTER `OrderIndex`; + +ALTER TABLE `currency_types` + ADD `ConvertToPlayerExperience` int(11) NOT NULL DEFAULT '0' AFTER `ItemGroupSoundsID`, + ADD `PlayerConditionID` int(11) NOT NULL DEFAULT '0' AFTER `ConvertToPlayerExperience`; + +ALTER TABLE `item_appearance` DROP `SubclassID`; + +ALTER TABLE `mount` + ADD `MountSpecialRiderAnimKitID` int(11) NOT NULL DEFAULT '0' AFTER `UiModelSceneID`, + ADD `MountSpecialSpellVisualKitID` int(11) NOT NULL DEFAULT '0' AFTER `MountSpecialRiderAnimKitID`; + +ALTER TABLE `spell_visual_kit` CHANGE `Flags` `Flags1` int(11) NOT NULL DEFAULT '0' AFTER `DelayMax`; +ALTER TABLE `spell_visual_kit` ADD `Flags2` int(11) NOT NULL DEFAULT '0' AFTER `Flags1`; +ALTER TABLE `spell_visual_kit` MODIFY `FallbackSpellVisualKitId` int(11) NOT NULL DEFAULT '0' AFTER `FallbackPriority`; + +ALTER TABLE `ui_map` ADD `AlternateUiMapGroup` int(11) NOT NULL DEFAULT '0' AFTER `BkgAtlasID`;