From 7d392baf2edfebf109c7b458844ca5ba5f3995d1 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Thu, 10 Dec 2020 09:43:39 -0500 Subject: [PATCH] Core/Transmog: Support new transmog modifiers (secondary appearance) Port From (https://github.com/TrinityCore/TrinityCore/commit/78f77dbd4150a5eef5864f0189fda566107a83f0) --- Source/Framework/Constants/ItemConst.cs | 34 +++-- .../Handlers/TransmogrificationHandler.cs | 122 +++++++++++++----- 2 files changed, 115 insertions(+), 41 deletions(-) diff --git a/Source/Framework/Constants/ItemConst.cs b/Source/Framework/Constants/ItemConst.cs index 5e787261f..f0cdd4736 100644 --- a/Source/Framework/Constants/ItemConst.cs +++ b/Source/Framework/Constants/ItemConst.cs @@ -81,11 +81,11 @@ namespace Framework.Constants ItemModifier.TransmogAppearanceSpec4 }; - public const uint AppearanceModifierMaskSpecSpecific = - (1 << (int)ItemModifier.TransmogAppearanceSpec1) | - (1 << (int)ItemModifier.TransmogAppearanceSpec2) | - (1 << (int)ItemModifier.TransmogAppearanceSpec3) | - (1 << (int)ItemModifier.TransmogAppearanceSpec4); + public const ulong AppearanceModifierMaskSpecSpecific = + (1ul << (int)ItemModifier.TransmogAppearanceSpec1) | + (1ul << (int)ItemModifier.TransmogAppearanceSpec2) | + (1ul << (int)ItemModifier.TransmogAppearanceSpec3) | + (1ul << (int)ItemModifier.TransmogAppearanceSpec4); public static ItemModifier[] IllusionModifierSlotBySpec = { @@ -95,11 +95,25 @@ namespace Framework.Constants ItemModifier.EnchantIllusionSpec4 }; - public const uint IllusionModifierMaskSpecSpecific = - (1 << (int)ItemModifier.EnchantIllusionSpec1) | - (1 << (int)ItemModifier.EnchantIllusionSpec2) | - (1 << (int)ItemModifier.EnchantIllusionSpec3) | - (1 << (int)ItemModifier.EnchantIllusionSpec4); + public const ulong IllusionModifierMaskSpecSpecific = + (1ul << (int)ItemModifier.EnchantIllusionSpec1) | + (1ul << (int)ItemModifier.EnchantIllusionSpec2) | + (1ul << (int)ItemModifier.EnchantIllusionSpec3) | + (1ul << (int)ItemModifier.EnchantIllusionSpec4); + + public static ItemModifier[] SecondaryAppearanceModifierSlotBySpec = + { + ItemModifier.TransmogSecondaryAppearanceSpec1, + ItemModifier.TransmogSecondaryAppearanceSpec2, + ItemModifier.TransmogSecondaryAppearanceSpec3, + ItemModifier.TransmogSecondaryAppearanceSpec4 + }; + + public const ulong SecondaryAppearanceModifierMaskSpecSpecific = + (1ul << (int)ItemModifier.TransmogSecondaryAppearanceSpec1) | + (1ul << (int)ItemModifier.TransmogSecondaryAppearanceSpec2) | + (1ul << (int)ItemModifier.TransmogSecondaryAppearanceSpec3) | + (1ul << (int)ItemModifier.TransmogSecondaryAppearanceSpec4); } public struct InventorySlots diff --git a/Source/Game/Handlers/TransmogrificationHandler.cs b/Source/Game/Handlers/TransmogrificationHandler.cs index 3cf8aaeb7..3ee43ca06 100644 --- a/Source/Game/Handlers/TransmogrificationHandler.cs +++ b/Source/Game/Handlers/TransmogrificationHandler.cs @@ -40,13 +40,63 @@ namespace Game } long cost = 0; - Dictionary transmogItems = new Dictionary(); + Dictionary transmogItems = new Dictionary();// new Dictionary>(); Dictionary illusionItems = new Dictionary(); List resetAppearanceItems = new List(); List resetIllusionItems = new List(); List bindAppearances = new List(); + bool validateAndStoreTransmogItem(Item itemTransmogrified, uint itemModifiedAppearanceId, bool isSecondary) + { + var itemModifiedAppearance = CliDB.ItemModifiedAppearanceStorage.LookupByKey(itemModifiedAppearanceId); + if (itemModifiedAppearance == null) + { + Log.outDebug(LogFilter.Network, $"WORLD: HandleTransmogrifyItems - {player.GetGUID()}, Name: {player.GetName()} tried to transmogrify using invalid appearance ({itemModifiedAppearanceId})."); + return false; + } + + if (isSecondary && itemTransmogrified.GetTemplate().GetInventoryType() != InventoryType.Shoulders) + { + Log.outDebug(LogFilter.Network, $"WORLD: HandleTransmogrifyItems - {player.GetGUID()}, Name: {player.GetName()} tried to transmogrify secondary appearance to non-shoulder item."); + return false; + } + + bool hasAppearance, isTemporary; + (hasAppearance, isTemporary) = GetCollectionMgr().HasItemAppearance(itemModifiedAppearanceId); + if (!hasAppearance) + { + Log.outDebug(LogFilter.Network, $"WORLD: HandleTransmogrifyItems - {player.GetGUID()}, Name: {player.GetName()} tried to transmogrify using appearance he has not collected ({itemModifiedAppearanceId})."); + return false; + } + ItemTemplate itemTemplate = Global.ObjectMgr.GetItemTemplate(itemModifiedAppearance.ItemID); + if (player.CanUseItem(itemTemplate) != InventoryResult.Ok) + { + Log.outDebug(LogFilter.Network, $"WORLD: HandleTransmogrifyItems - {player.GetGUID()}, Name: {player.GetName()} tried to transmogrify using appearance he can never use ({itemModifiedAppearanceId})."); + return false; + } + + // validity of the transmogrification items + if (!Item.CanTransmogrifyItemWithItem(itemTransmogrified, itemModifiedAppearance)) + { + Log.outDebug(LogFilter.Network, $"WORLD: HandleTransmogrifyItems - {player.GetGUID()}, Name: {player.GetName()} failed CanTransmogrifyItemWithItem ({itemTransmogrified.GetEntry()} with appearance {itemModifiedAppearanceId})."); + return false; + } + + if (!transmogItems.ContainsKey(itemTransmogrified)) + transmogItems[itemTransmogrified] = new uint[2]; + + if (!isSecondary) + transmogItems[itemTransmogrified][0] = itemModifiedAppearanceId; + else + transmogItems[itemTransmogrified][1] = itemModifiedAppearanceId; + + if (isTemporary) + bindAppearances.Add(itemModifiedAppearanceId); + + return true; + }; + foreach (TransmogrifyItem transmogItem in transmogrifyItems.Items) { // slot of the transmogrified item @@ -64,38 +114,13 @@ namespace Game return; } - if (transmogItem.ItemModifiedAppearanceID != 0) + if (transmogItem.ItemModifiedAppearanceID != 0 || transmogItem.SecondaryItemModifiedAppearanceID != 0) { - ItemModifiedAppearanceRecord itemModifiedAppearance = CliDB.ItemModifiedAppearanceStorage.LookupByKey(transmogItem.ItemModifiedAppearanceID); - if (itemModifiedAppearance == null) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleTransmogrifyItems - {0}, Name: {1} tried to transmogrify using invalid appearance ({2}).", player.GetGUID().ToString(), player.GetName(), transmogItem.ItemModifiedAppearanceID); + if (!validateAndStoreTransmogItem(itemTransmogrified, (uint)transmogItem.ItemModifiedAppearanceID, false)) return; - } - var pairValue = GetCollectionMgr().HasItemAppearance((uint)transmogItem.ItemModifiedAppearanceID); - if (!pairValue.Item1) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleTransmogrifyItems - {0}, Name: {1} tried to transmogrify using appearance he has not collected ({2}).", player.GetGUID().ToString(), player.GetName(), transmogItem.ItemModifiedAppearanceID); + if (!validateAndStoreTransmogItem(itemTransmogrified, (uint)transmogItem.SecondaryItemModifiedAppearanceID, true)) return; - } - ItemTemplate itemTemplate = Global.ObjectMgr.GetItemTemplate(itemModifiedAppearance.ItemID); - if (player.CanUseItem(itemTemplate) != InventoryResult.Ok) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleTransmogrifyItems - {0}, Name: {1} tried to transmogrify using appearance he can never use ({2}).", player.GetGUID().ToString(), player.GetName(), transmogItem.ItemModifiedAppearanceID); - return; - } - - // validity of the transmogrification items - if (!Item.CanTransmogrifyItemWithItem(itemTransmogrified, itemModifiedAppearance)) - { - Log.outDebug(LogFilter.Network, "WORLD: HandleTransmogrifyItems - {0}, Name: {1} failed CanTransmogrifyItemWithItem ({2} with appearance {3}).", player.GetGUID().ToString(), player.GetName(), itemTransmogrified.GetEntry(), transmogItem.ItemModifiedAppearanceID); - return; - } - - transmogItems[itemTransmogrified] = (uint)transmogItem.ItemModifiedAppearanceID; - if (pairValue.Item2) - bindAppearances.Add((uint)transmogItem.ItemModifiedAppearanceID); // add cost cost += itemTransmogrified.GetSellPrice(_player); @@ -162,11 +187,17 @@ namespace Game if (!transmogrifyItems.CurrentSpecOnly) { - transmogrified.SetModifier(ItemModifier.TransmogAppearanceAllSpecs, transmogPair.Value); + transmogrified.SetModifier(ItemModifier.TransmogAppearanceAllSpecs, transmogPair.Value[0]); transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec1, 0); transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec2, 0); transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec3, 0); transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec4, 0); + + transmogrified.SetModifier(ItemModifier.TransmogSecondaryAppearanceAllSpecs, transmogPair.Value[1]); + transmogrified.SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec1, 0); + transmogrified.SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec2, 0); + transmogrified.SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec3, 0); + transmogrified.SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec4, 0); } else { @@ -178,7 +209,18 @@ namespace Game transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec3, transmogrified.GetModifier(ItemModifier.TransmogAppearanceAllSpecs)); if (transmogrified.GetModifier(ItemModifier.TransmogAppearanceSpec4) == 0) transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec4, transmogrified.GetModifier(ItemModifier.TransmogAppearanceAllSpecs)); - transmogrified.SetModifier(ItemConst.AppearanceModifierSlotBySpec[player.GetActiveTalentGroup()], transmogPair.Value); + + if (transmogrified.GetModifier(ItemModifier.TransmogSecondaryAppearanceSpec1) == 0) + transmogrified.SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec1, transmogrified.GetModifier(ItemModifier.TransmogSecondaryAppearanceAllSpecs)); + if (transmogrified.GetModifier(ItemModifier.TransmogSecondaryAppearanceSpec2) == 0) + transmogrified.SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec2, transmogrified.GetModifier(ItemModifier.TransmogSecondaryAppearanceAllSpecs)); + if (transmogrified.GetModifier(ItemModifier.TransmogSecondaryAppearanceSpec3) == 0) + transmogrified.SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec3, transmogrified.GetModifier(ItemModifier.TransmogSecondaryAppearanceAllSpecs)); + if (transmogrified.GetModifier(ItemModifier.TransmogSecondaryAppearanceSpec4) == 0) + transmogrified.SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec4, transmogrified.GetModifier(ItemModifier.TransmogSecondaryAppearanceAllSpecs)); + + transmogrified.SetModifier(ItemConst.AppearanceModifierSlotBySpec[player.GetActiveTalentGroup()], transmogPair.Value[0]); + transmogrified.SetModifier(ItemConst.SecondaryAppearanceModifierSlotBySpec[player.GetActiveTalentGroup()], transmogPair.Value[1]); } player.SetVisibleItemSlot(transmogrified.GetSlot(), transmogrified); @@ -229,6 +271,12 @@ namespace Game item.SetModifier(ItemModifier.TransmogAppearanceSpec2, 0); item.SetModifier(ItemModifier.TransmogAppearanceSpec3, 0); item.SetModifier(ItemModifier.TransmogAppearanceSpec4, 0); + + item.SetModifier(ItemModifier.TransmogSecondaryAppearanceAllSpecs, 0); + item.SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec1, 0); + item.SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec2, 0); + item.SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec3, 0); + item.SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec4, 0); } else { @@ -240,7 +288,18 @@ namespace Game item.SetModifier(ItemModifier.TransmogAppearanceSpec3, item.GetModifier(ItemModifier.TransmogAppearanceAllSpecs)); if (item.GetModifier(ItemModifier.TransmogAppearanceSpec4) == 0) item.SetModifier(ItemModifier.TransmogAppearanceSpec4, item.GetModifier(ItemModifier.TransmogAppearanceAllSpecs)); + + if (item.GetModifier(ItemModifier.TransmogSecondaryAppearanceSpec1) == 0) + item.SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec1, item.GetModifier(ItemModifier.TransmogSecondaryAppearanceAllSpecs)); + if (item.GetModifier(ItemModifier.TransmogSecondaryAppearanceSpec2) == 0) + item.SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec2, item.GetModifier(ItemModifier.TransmogSecondaryAppearanceAllSpecs)); + if (item.GetModifier(ItemModifier.TransmogSecondaryAppearanceSpec3) == 0) + item.SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec3, item.GetModifier(ItemModifier.TransmogSecondaryAppearanceAllSpecs)); + if (item.GetModifier(ItemModifier.TransmogSecondaryAppearanceSpec4) == 0) + item.SetModifier(ItemModifier.TransmogSecondaryAppearanceSpec4, item.GetModifier(ItemModifier.TransmogSecondaryAppearanceAllSpecs)); + item.SetModifier(ItemConst.AppearanceModifierSlotBySpec[player.GetActiveTalentGroup()], 0); + item.SetModifier(ItemConst.SecondaryAppearanceModifierSlotBySpec[player.GetActiveTalentGroup()], 0); item.SetModifier(ItemModifier.EnchantIllusionAllSpecs, 0); } @@ -268,6 +327,7 @@ namespace Game item.SetModifier(ItemModifier.EnchantIllusionSpec3, item.GetModifier(ItemModifier.EnchantIllusionAllSpecs)); if (item.GetModifier(ItemModifier.EnchantIllusionSpec4) == 0) item.SetModifier(ItemModifier.EnchantIllusionSpec4, item.GetModifier(ItemModifier.EnchantIllusionAllSpecs)); + item.SetModifier(ItemConst.IllusionModifierSlotBySpec[player.GetActiveTalentGroup()], 0); item.SetModifier(ItemModifier.TransmogAppearanceAllSpecs, 0); }