Core/Transmog: Support new transmog modifiers (secondary appearance)
Port From (https://github.com/TrinityCore/TrinityCore/commit/78f77dbd4150a5eef5864f0189fda566107a83f0)
This commit is contained in:
@@ -81,11 +81,11 @@ namespace Framework.Constants
|
|||||||
ItemModifier.TransmogAppearanceSpec4
|
ItemModifier.TransmogAppearanceSpec4
|
||||||
};
|
};
|
||||||
|
|
||||||
public const uint AppearanceModifierMaskSpecSpecific =
|
public const ulong AppearanceModifierMaskSpecSpecific =
|
||||||
(1 << (int)ItemModifier.TransmogAppearanceSpec1) |
|
(1ul << (int)ItemModifier.TransmogAppearanceSpec1) |
|
||||||
(1 << (int)ItemModifier.TransmogAppearanceSpec2) |
|
(1ul << (int)ItemModifier.TransmogAppearanceSpec2) |
|
||||||
(1 << (int)ItemModifier.TransmogAppearanceSpec3) |
|
(1ul << (int)ItemModifier.TransmogAppearanceSpec3) |
|
||||||
(1 << (int)ItemModifier.TransmogAppearanceSpec4);
|
(1ul << (int)ItemModifier.TransmogAppearanceSpec4);
|
||||||
|
|
||||||
public static ItemModifier[] IllusionModifierSlotBySpec =
|
public static ItemModifier[] IllusionModifierSlotBySpec =
|
||||||
{
|
{
|
||||||
@@ -95,11 +95,25 @@ namespace Framework.Constants
|
|||||||
ItemModifier.EnchantIllusionSpec4
|
ItemModifier.EnchantIllusionSpec4
|
||||||
};
|
};
|
||||||
|
|
||||||
public const uint IllusionModifierMaskSpecSpecific =
|
public const ulong IllusionModifierMaskSpecSpecific =
|
||||||
(1 << (int)ItemModifier.EnchantIllusionSpec1) |
|
(1ul << (int)ItemModifier.EnchantIllusionSpec1) |
|
||||||
(1 << (int)ItemModifier.EnchantIllusionSpec2) |
|
(1ul << (int)ItemModifier.EnchantIllusionSpec2) |
|
||||||
(1 << (int)ItemModifier.EnchantIllusionSpec3) |
|
(1ul << (int)ItemModifier.EnchantIllusionSpec3) |
|
||||||
(1 << (int)ItemModifier.EnchantIllusionSpec4);
|
(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
|
public struct InventorySlots
|
||||||
|
|||||||
@@ -40,13 +40,63 @@ namespace Game
|
|||||||
}
|
}
|
||||||
|
|
||||||
long cost = 0;
|
long cost = 0;
|
||||||
Dictionary<Item, uint> transmogItems = new Dictionary<Item, uint>();
|
Dictionary<Item, uint[]> transmogItems = new Dictionary<Item, uint[]>();// new Dictionary<Item, Tuple<uint, uint>>();
|
||||||
Dictionary<Item, uint> illusionItems = new Dictionary<Item, uint>();
|
Dictionary<Item, uint> illusionItems = new Dictionary<Item, uint>();
|
||||||
|
|
||||||
List<Item> resetAppearanceItems = new List<Item>();
|
List<Item> resetAppearanceItems = new List<Item>();
|
||||||
List<Item> resetIllusionItems = new List<Item>();
|
List<Item> resetIllusionItems = new List<Item>();
|
||||||
List<uint> bindAppearances = new List<uint>();
|
List<uint> bindAppearances = new List<uint>();
|
||||||
|
|
||||||
|
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)
|
foreach (TransmogrifyItem transmogItem in transmogrifyItems.Items)
|
||||||
{
|
{
|
||||||
// slot of the transmogrified item
|
// slot of the transmogrified item
|
||||||
@@ -64,38 +114,13 @@ namespace Game
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (transmogItem.ItemModifiedAppearanceID != 0)
|
if (transmogItem.ItemModifiedAppearanceID != 0 || transmogItem.SecondaryItemModifiedAppearanceID != 0)
|
||||||
{
|
{
|
||||||
ItemModifiedAppearanceRecord itemModifiedAppearance = CliDB.ItemModifiedAppearanceStorage.LookupByKey(transmogItem.ItemModifiedAppearanceID);
|
if (!validateAndStoreTransmogItem(itemTransmogrified, (uint)transmogItem.ItemModifiedAppearanceID, false))
|
||||||
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);
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
var pairValue = GetCollectionMgr().HasItemAppearance((uint)transmogItem.ItemModifiedAppearanceID);
|
if (!validateAndStoreTransmogItem(itemTransmogrified, (uint)transmogItem.SecondaryItemModifiedAppearanceID, true))
|
||||||
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);
|
|
||||||
return;
|
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
|
// add cost
|
||||||
cost += itemTransmogrified.GetSellPrice(_player);
|
cost += itemTransmogrified.GetSellPrice(_player);
|
||||||
@@ -162,11 +187,17 @@ namespace Game
|
|||||||
|
|
||||||
if (!transmogrifyItems.CurrentSpecOnly)
|
if (!transmogrifyItems.CurrentSpecOnly)
|
||||||
{
|
{
|
||||||
transmogrified.SetModifier(ItemModifier.TransmogAppearanceAllSpecs, transmogPair.Value);
|
transmogrified.SetModifier(ItemModifier.TransmogAppearanceAllSpecs, transmogPair.Value[0]);
|
||||||
transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec1, 0);
|
transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec1, 0);
|
||||||
transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec2, 0);
|
transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec2, 0);
|
||||||
transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec3, 0);
|
transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec3, 0);
|
||||||
transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec4, 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
|
else
|
||||||
{
|
{
|
||||||
@@ -178,7 +209,18 @@ namespace Game
|
|||||||
transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec3, transmogrified.GetModifier(ItemModifier.TransmogAppearanceAllSpecs));
|
transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec3, transmogrified.GetModifier(ItemModifier.TransmogAppearanceAllSpecs));
|
||||||
if (transmogrified.GetModifier(ItemModifier.TransmogAppearanceSpec4) == 0)
|
if (transmogrified.GetModifier(ItemModifier.TransmogAppearanceSpec4) == 0)
|
||||||
transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec4, transmogrified.GetModifier(ItemModifier.TransmogAppearanceAllSpecs));
|
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);
|
player.SetVisibleItemSlot(transmogrified.GetSlot(), transmogrified);
|
||||||
@@ -229,6 +271,12 @@ namespace Game
|
|||||||
item.SetModifier(ItemModifier.TransmogAppearanceSpec2, 0);
|
item.SetModifier(ItemModifier.TransmogAppearanceSpec2, 0);
|
||||||
item.SetModifier(ItemModifier.TransmogAppearanceSpec3, 0);
|
item.SetModifier(ItemModifier.TransmogAppearanceSpec3, 0);
|
||||||
item.SetModifier(ItemModifier.TransmogAppearanceSpec4, 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
|
else
|
||||||
{
|
{
|
||||||
@@ -240,7 +288,18 @@ namespace Game
|
|||||||
item.SetModifier(ItemModifier.TransmogAppearanceSpec3, item.GetModifier(ItemModifier.TransmogAppearanceAllSpecs));
|
item.SetModifier(ItemModifier.TransmogAppearanceSpec3, item.GetModifier(ItemModifier.TransmogAppearanceAllSpecs));
|
||||||
if (item.GetModifier(ItemModifier.TransmogAppearanceSpec4) == 0)
|
if (item.GetModifier(ItemModifier.TransmogAppearanceSpec4) == 0)
|
||||||
item.SetModifier(ItemModifier.TransmogAppearanceSpec4, item.GetModifier(ItemModifier.TransmogAppearanceAllSpecs));
|
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.AppearanceModifierSlotBySpec[player.GetActiveTalentGroup()], 0);
|
||||||
|
item.SetModifier(ItemConst.SecondaryAppearanceModifierSlotBySpec[player.GetActiveTalentGroup()], 0);
|
||||||
item.SetModifier(ItemModifier.EnchantIllusionAllSpecs, 0);
|
item.SetModifier(ItemModifier.EnchantIllusionAllSpecs, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,6 +327,7 @@ namespace Game
|
|||||||
item.SetModifier(ItemModifier.EnchantIllusionSpec3, item.GetModifier(ItemModifier.EnchantIllusionAllSpecs));
|
item.SetModifier(ItemModifier.EnchantIllusionSpec3, item.GetModifier(ItemModifier.EnchantIllusionAllSpecs));
|
||||||
if (item.GetModifier(ItemModifier.EnchantIllusionSpec4) == 0)
|
if (item.GetModifier(ItemModifier.EnchantIllusionSpec4) == 0)
|
||||||
item.SetModifier(ItemModifier.EnchantIllusionSpec4, item.GetModifier(ItemModifier.EnchantIllusionAllSpecs));
|
item.SetModifier(ItemModifier.EnchantIllusionSpec4, item.GetModifier(ItemModifier.EnchantIllusionAllSpecs));
|
||||||
|
|
||||||
item.SetModifier(ItemConst.IllusionModifierSlotBySpec[player.GetActiveTalentGroup()], 0);
|
item.SetModifier(ItemConst.IllusionModifierSlotBySpec[player.GetActiveTalentGroup()], 0);
|
||||||
item.SetModifier(ItemModifier.TransmogAppearanceAllSpecs, 0);
|
item.SetModifier(ItemModifier.TransmogAppearanceAllSpecs, 0);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user