From c60fa1d1a32d8fdbff6c2f246bb6e48c76469ea1 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 14 Jun 2022 23:15:49 -0400 Subject: [PATCH] Core/Transmog: Implemented TransmogIllusionFlags::PlayerConditionGrantsOnLogin and fixed transmog illusion validation when transmogging items Port From (https://github.com/TrinityCore/TrinityCore/commit/f820ff178decf7d844b7c398b79be7269feeb53e) --- Source/Framework/Constants/CliDBConst.cs | 7 +++++++ Source/Game/DataStorage/Structs/T_Records.cs | 2 ++ .../Game/Entities/Player/CollectionManager.cs | 19 ++++++++++++------- Source/Game/Entities/Player/Player.DB.cs | 19 ++++++++++++++++++- .../Handlers/TransmogrificationHandler.cs | 16 ++-------------- Source/Game/Spells/SpellEffects.cs | 6 +++++- 6 files changed, 46 insertions(+), 23 deletions(-) diff --git a/Source/Framework/Constants/CliDBConst.cs b/Source/Framework/Constants/CliDBConst.cs index 4a003266d..0c202a81c 100644 --- a/Source/Framework/Constants/CliDBConst.cs +++ b/Source/Framework/Constants/CliDBConst.cs @@ -2448,4 +2448,11 @@ namespace Framework.Constants UnitItemOffHandIgnoreDisarmed = 9, UnitItemRangedIgnoreDisarmed = 10 } + + [Flags] + public enum TransmogIllusionFlags + { + HideUntilCollected = 0x1, + PlayerConditionGrantsOnLogin = 0x2, + } } diff --git a/Source/Game/DataStorage/Structs/T_Records.cs b/Source/Game/DataStorage/Structs/T_Records.cs index 411d65c95..3cfe6e96c 100644 --- a/Source/Game/DataStorage/Structs/T_Records.cs +++ b/Source/Game/DataStorage/Structs/T_Records.cs @@ -110,6 +110,8 @@ namespace Game.DataStorage public int TransmogCost; public int SpellItemEnchantmentID; public int Flags; + + public TransmogIllusionFlags GetFlags() { return (TransmogIllusionFlags)Flags; } } public sealed class TransmogSetRecord diff --git a/Source/Game/Entities/Player/CollectionManager.cs b/Source/Game/Entities/Player/CollectionManager.cs index 9ae42d0a6..5c934555a 100644 --- a/Source/Game/Entities/Player/CollectionManager.cs +++ b/Source/Game/Entities/Player/CollectionManager.cs @@ -909,25 +909,30 @@ namespace Game.Entities } } - public void AddTransmogIllusion(ushort illusionId) + public void AddTransmogIllusion(uint transmogIllusionId) { Player owner = _owner.GetPlayer(); - if (_transmogIllusions.Count <= illusionId) + if (_transmogIllusions.Count <= transmogIllusionId) { uint numBlocks = (uint)(_transmogIllusions.Count << 2); - _transmogIllusions.Length = illusionId + 1; + _transmogIllusions.Length = (int)transmogIllusionId + 1; numBlocks = (uint)(_transmogIllusions.Count << 2) - numBlocks; while (numBlocks-- != 0) owner.AddIllusionBlock(0); } - _transmogIllusions.Set(illusionId, true); - int blockIndex = illusionId / 32; - int bitIndex = illusionId % 32; + _transmogIllusions.Set((int)transmogIllusionId, true); + uint blockIndex = transmogIllusionId / 32; + uint bitIndex = transmogIllusionId % 32; - owner.AddIllusionFlag(blockIndex, (uint)(1 << bitIndex)); + owner.AddIllusionFlag((int)blockIndex, (uint)(1 << (int)bitIndex)); } + public bool HasTransmogIllusion(uint transmogIllusionId) + { + return transmogIllusionId < _transmogIllusions.Count && _transmogIllusions.Get((int)transmogIllusionId); + } + public bool HasToy(uint itemId) { return _toys.ContainsKey(itemId); } public Dictionary GetAccountToys() { return _toys; } public Dictionary GetAccountHeirlooms() { return _heirlooms; } diff --git a/Source/Game/Entities/Player/Player.DB.cs b/Source/Game/Entities/Player/Player.DB.cs index 38934229b..ad7ae88dc 100644 --- a/Source/Game/Entities/Player/Player.DB.cs +++ b/Source/Game/Entities/Player/Player.DB.cs @@ -2785,7 +2785,7 @@ namespace Game.Entities mapId = homebind.GetMapId(); instance_id = 0; Relocate(homebind); - }); + }); _LoadGroup(holder.GetResult(PlayerLoginQueryLoad.Group)); @@ -3354,6 +3354,23 @@ namespace Game.Entities m_questObjectiveCriteriaMgr.CheckAllQuestObjectiveCriteria(this); PushQuests(); + + foreach (var transmogIllusion in CliDB.TransmogIllusionStorage.Values) + { + if (!transmogIllusion.GetFlags().HasFlag(TransmogIllusionFlags.PlayerConditionGrantsOnLogin)) + continue; + + if (GetSession().GetCollectionMgr().HasTransmogIllusion(transmogIllusion.Id)) + continue; + + var playerCondition = CliDB.PlayerConditionStorage.LookupByKey(transmogIllusion.UnlockConditionID); + if (playerCondition != null) + if (!ConditionManager.IsPlayerMeetingCondition(this, playerCondition)) + continue; + + GetSession().GetCollectionMgr().AddTransmogIllusion(transmogIllusion.Id); + } + return true; } diff --git a/Source/Game/Handlers/TransmogrificationHandler.cs b/Source/Game/Handlers/TransmogrificationHandler.cs index e12d86300..c688ae92b 100644 --- a/Source/Game/Handlers/TransmogrificationHandler.cs +++ b/Source/Game/Handlers/TransmogrificationHandler.cs @@ -136,20 +136,14 @@ namespace Game return; } - SpellItemEnchantmentRecord illusion = CliDB.SpellItemEnchantmentStorage.LookupByKey(transmogItem.SpellItemEnchantmentID); + TransmogIllusionRecord illusion = Global.DB2Mgr.GetTransmogIllusionForEnchantment((uint)transmogItem.SpellItemEnchantmentID); if (illusion == null) { Log.outDebug(LogFilter.Network, "WORLD: HandleTransmogrifyItems - {0}, Name: {1} tried to transmogrify illusion using invalid enchant ({2}).", player.GetGUID().ToString(), player.GetName(), transmogItem.SpellItemEnchantmentID); return; } - if (illusion.ItemVisual == 0 || !illusion.GetFlags().HasFlag(SpellItemEnchantmentFlags.AllowTransmog)) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleTransmogrifyItems - {0}, Name: {1} tried to transmogrify illusion using not allowed enchant ({2}).", player.GetGUID().ToString(), player.GetName(), transmogItem.SpellItemEnchantmentID); - return; - } - - PlayerConditionRecord condition = CliDB.PlayerConditionStorage.LookupByKey(illusion.TransmogUseConditionID); + var condition = CliDB.PlayerConditionStorage.LookupByKey(illusion.UnlockConditionID); if (condition != null) { if (!ConditionManager.IsPlayerMeetingCondition(player, condition)) @@ -159,12 +153,6 @@ namespace Game } } - if (illusion.ScalingClassRestricted > 0 && illusion.ScalingClassRestricted != (byte)player.GetClass()) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleTransmogrifyItems - {0}, Name: {1} tried to transmogrify illusion using not allowed class enchant ({2}).", player.GetGUID().ToString(), player.GetName(), transmogItem.SpellItemEnchantmentID); - return; - } - illusionItems[itemTransmogrified] = (uint)transmogItem.SpellItemEnchantmentID; cost += illusion.TransmogCost; } diff --git a/Source/Game/Spells/SpellEffects.cs b/Source/Game/Spells/SpellEffects.cs index e74bafa9b..d5b1090f4 100644 --- a/Source/Game/Spells/SpellEffects.cs +++ b/Source/Game/Spells/SpellEffects.cs @@ -5666,7 +5666,11 @@ namespace Game.Spells if (player == null) return; - player.GetSession().GetCollectionMgr().AddTransmogIllusion((ushort)effectInfo.MiscValue); + uint illusionId = (uint)effectInfo.MiscValue; + if (!CliDB.TransmogIllusionStorage.ContainsKey(illusionId)) + return; + + player.GetSession().GetCollectionMgr().AddTransmogIllusion(illusionId); } }