void HandleSocketGems(SocketGems socketGems) { if (socketGems.ItemGuid.IsEmpty()) { return; } //cheat . tried to socket same gem multiple times if ((!socketGems.GemItem[0].IsEmpty() && (socketGems.GemItem[0] == socketGems.GemItem[1] || socketGems.GemItem[0] == socketGems.GemItem[2])) || (!socketGems.GemItem[1].IsEmpty() && (socketGems.GemItem[1] == socketGems.GemItem[2]))) { return; } Item itemTarget = GetPlayer().GetItemByGuid(socketGems.ItemGuid); if (!itemTarget) //missing item to socket { return; } ItemTemplate itemProto = itemTarget.GetTemplate(); if (itemProto == null) { return; } //this slot is excepted when applying / removing meta gem bonus byte slot = itemTarget.IsEquipped() ? itemTarget.GetSlot() : ItemConst.NullSlot; Item[] gems = new Item[ItemConst.MaxGemSockets]; ItemDynamicFieldGems[] gemData = new ItemDynamicFieldGems[ItemConst.MaxGemSockets]; GemPropertiesRecord[] gemProperties = new GemPropertiesRecord[ItemConst.MaxGemSockets]; SocketedGem[] oldGemData = new SocketedGem[ItemConst.MaxGemSockets]; for (int i = 0; i < ItemConst.MaxGemSockets; ++i) { Item gem = _player.GetItemByGuid(socketGems.GemItem[i]); if (gem) { gems[i] = gem; gemData[i].ItemId = gem.GetEntry(); gemData[i].Context = (byte)gem.m_itemData.Context; for (int b = 0; b < ((List <uint>)gem.m_itemData.BonusListIDs).Count && b < 16; ++b) { gemData[i].BonusListIDs[b] = (ushort)((List <uint>)gem.m_itemData.BonusListIDs)[b]; } gemProperties[i] = CliDB.GemPropertiesStorage.LookupByKey(gem.GetTemplate().GetGemProperties()); } oldGemData[i] = itemTarget.GetGem((ushort)i); } // Find first prismatic socket uint firstPrismatic = 0; while (firstPrismatic < ItemConst.MaxGemSockets && itemTarget.GetSocketColor(firstPrismatic) != 0) { ++firstPrismatic; } for (uint i = 0; i < ItemConst.MaxGemSockets; ++i) //check for hack maybe { if (gemProperties[i] == null) { continue; } // tried to put gem in socket where no socket exists (take care about prismatic sockets) if (itemTarget.GetSocketColor(i) == 0) { // no prismatic socket if (itemTarget.GetEnchantmentId(EnchantmentSlot.Prismatic) == 0) { return; } if (i != firstPrismatic) { return; } } // Gem must match socket color if (ItemConst.SocketColorToGemTypeMask[(int)itemTarget.GetSocketColor(i)] != gemProperties[i].Type) { // unless its red, blue, yellow or prismatic if (!ItemConst.SocketColorToGemTypeMask[(int)itemTarget.GetSocketColor(i)].HasAnyFlag(SocketColor.Prismatic) || !gemProperties[i].Type.HasAnyFlag(SocketColor.Prismatic)) { return; } } } // check unique-equipped conditions for (int i = 0; i < ItemConst.MaxGemSockets; ++i) { if (!gems[i]) { continue; } // continue check for case when attempt add 2 similar unique equipped gems in one item. ItemTemplate iGemProto = gems[i].GetTemplate(); // unique item (for new and already placed bit removed enchantments if (iGemProto.HasFlag(ItemFlags.UniqueEquippable)) { for (int j = 0; j < ItemConst.MaxGemSockets; ++j) { if (i == j) // skip self { continue; } if (gems[j]) { if (iGemProto.GetId() == gems[j].GetEntry()) { GetPlayer().SendEquipError(InventoryResult.ItemUniqueEquippableSocketed, itemTarget); return; } } else if (oldGemData[j] != null) { if (iGemProto.GetId() == oldGemData[j].ItemId) { GetPlayer().SendEquipError(InventoryResult.ItemUniqueEquippableSocketed, itemTarget); return; } } } } // unique limit type item int limit_newcount = 0; if (iGemProto.GetItemLimitCategory() != 0) { ItemLimitCategoryRecord limitEntry = CliDB.ItemLimitCategoryStorage.LookupByKey(iGemProto.GetItemLimitCategory()); if (limitEntry != null) { // NOTE: limitEntry.mode is not checked because if item has limit then it is applied in equip case for (int j = 0; j < ItemConst.MaxGemSockets; ++j) { if (gems[j]) { // new gem if (iGemProto.GetItemLimitCategory() == gems[j].GetTemplate().GetItemLimitCategory()) { ++limit_newcount; } } else if (oldGemData[j] != null) { // existing gem ItemTemplate jProto = Global.ObjectMgr.GetItemTemplate(oldGemData[j].ItemId); if (jProto != null) { if (iGemProto.GetItemLimitCategory() == jProto.GetItemLimitCategory()) { ++limit_newcount; } } } } if (limit_newcount > 0 && limit_newcount > _player.GetItemLimitCategoryQuantity(limitEntry)) { GetPlayer().SendEquipError(InventoryResult.ItemUniqueEquippableSocketed, itemTarget); return; } } } // for equipped item check all equipment for duplicate equipped gems if (itemTarget.IsEquipped()) { InventoryResult res = GetPlayer().CanEquipUniqueItem(gems[i], slot, (uint)Math.Max(limit_newcount, 0)); if (res != 0) { GetPlayer().SendEquipError(res, itemTarget); return; } } } bool SocketBonusActivated = itemTarget.GemsFitSockets(); //save state of socketbonus GetPlayer().ToggleMetaGemsActive(slot, false); //turn off all metagems (except for the target item) //if a meta gem is being equipped, all information has to be written to the item before testing if the conditions for the gem are met //remove ALL mods - gem can change item level if (itemTarget.IsEquipped()) { _player._ApplyItemMods(itemTarget, itemTarget.GetSlot(), false); } for (ushort i = 0; i < ItemConst.MaxGemSockets; ++i) { if (gems[i]) { uint gemScalingLevel = _player.GetLevel(); uint fixedLevel = gems[i].GetModifier(ItemModifier.TimewalkerLevel); if (fixedLevel != 0) { gemScalingLevel = fixedLevel; } itemTarget.SetGem(i, gemData[i], gemScalingLevel); if (gemProperties[i] != null && gemProperties[i].EnchantId != 0) { itemTarget.SetEnchantment(EnchantmentSlot.Sock1 + i, gemProperties[i].EnchantId, 0, 0, GetPlayer().GetGUID()); } uint gemCount = 1; GetPlayer().DestroyItemCount(gems[i], ref gemCount, true); } } if (itemTarget.IsEquipped()) { _player._ApplyItemMods(itemTarget, itemTarget.GetSlot(), true); } Item childItem = _player.GetChildItemByGuid(itemTarget.GetChildItem()); if (childItem) { if (childItem.IsEquipped()) { _player._ApplyItemMods(childItem, childItem.GetSlot(), false); } childItem.CopyArtifactDataFromParent(itemTarget); if (childItem.IsEquipped()) { _player._ApplyItemMods(childItem, childItem.GetSlot(), true); } } bool SocketBonusToBeActivated = itemTarget.GemsFitSockets(); //current socketbonus state if (SocketBonusActivated ^ SocketBonusToBeActivated) //if there was a change... { GetPlayer().ApplyEnchantment(itemTarget, EnchantmentSlot.Bonus, false); itemTarget.SetEnchantment(EnchantmentSlot.Bonus, SocketBonusToBeActivated ? itemTarget.GetTemplate().GetSocketBonus() : 0, 0, 0, GetPlayer().GetGUID()); GetPlayer().ApplyEnchantment(itemTarget, EnchantmentSlot.Bonus, true); //it is not displayed, client has an inbuilt system to determine if the bonus is activated } GetPlayer().ToggleMetaGemsActive(slot, true); //turn on all metagems (except for target item) GetPlayer().RemoveTradeableItem(itemTarget); itemTarget.ClearSoulboundTradeable(GetPlayer()); // clear tradeable flag itemTarget.SendUpdateSockets(); }
void HandleTransmogrifyItems(TransmogrifyItems transmogrifyItems) { Player player = GetPlayer(); // Validate if (!player.GetNPCIfCanInteractWith(transmogrifyItems.Npc, NPCFlags.Transmogrifier, NPCFlags2.None)) { Log.outDebug(LogFilter.Network, "WORLD: HandleTransmogrifyItems - Unit (GUID: {0}) not found or player can't interact with it.", transmogrifyItems.ToString()); return; } long cost = 0; Dictionary <Item, uint[]> transmogItems = new();// new Dictionary<Item, Tuple<uint, uint>>(); Dictionary <Item, uint> illusionItems = new(); List <Item> resetAppearanceItems = new(); List <Item> resetIllusionItems = new(); List <uint> bindAppearances = new(); 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 if (transmogItem.Slot >= EquipmentSlot.End) { Log.outDebug(LogFilter.Network, "WORLD: HandleTransmogrifyItems - Player ({0}, name: {1}) tried to transmogrify wrong slot {2} when transmogrifying items.", player.GetGUID().ToString(), player.GetName(), transmogItem.Slot); return; } // transmogrified item Item itemTransmogrified = player.GetItemByPos(InventorySlots.Bag0, (byte)transmogItem.Slot); if (!itemTransmogrified) { Log.outDebug(LogFilter.Network, "WORLD: HandleTransmogrifyItems - Player (GUID: {0}, name: {1}) tried to transmogrify an invalid item in a valid slot (slot: {2}).", player.GetGUID().ToString(), player.GetName(), transmogItem.Slot); return; } if (transmogItem.ItemModifiedAppearanceID != 0 || transmogItem.SecondaryItemModifiedAppearanceID != 0) { if (!validateAndStoreTransmogItem(itemTransmogrified, (uint)transmogItem.ItemModifiedAppearanceID, false)) { return; } if (!validateAndStoreTransmogItem(itemTransmogrified, (uint)transmogItem.SecondaryItemModifiedAppearanceID, true)) { return; } // add cost cost += itemTransmogrified.GetSellPrice(_player); } else { resetAppearanceItems.Add(itemTransmogrified); } if (transmogItem.SpellItemEnchantmentID != 0) { if (transmogItem.Slot != EquipmentSlot.MainHand && transmogItem.Slot != EquipmentSlot.OffHand) { Log.outDebug(LogFilter.Network, "WORLD: HandleTransmogrifyItems - {0}, Name: {1} tried to transmogrify illusion into non-weapon slot ({2}).", player.GetGUID().ToString(), player.GetName(), transmogItem.Slot); return; } SpellItemEnchantmentRecord illusion = CliDB.SpellItemEnchantmentStorage.LookupByKey(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.Flags.HasAnyFlag(EnchantmentSlotMask.Collectable)) { 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); if (condition != null) { if (!ConditionManager.IsPlayerMeetingCondition(player, condition)) { 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; } } 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; } else { resetIllusionItems.Add(itemTransmogrified); } } if (!player.HasAuraType(AuraType.RemoveTransmogCost) && cost != 0) // 0 cost if reverting look { if (!player.HasEnoughMoney(cost)) { return; } player.ModifyMoney(-cost); } // Everything is fine, proceed foreach (var transmogPair in transmogItems) { Item transmogrified = transmogPair.Key; if (!transmogrifyItems.CurrentSpecOnly) { 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 { if (transmogrified.GetModifier(ItemModifier.TransmogAppearanceSpec1) == 0) { transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec1, transmogrified.GetModifier(ItemModifier.TransmogAppearanceAllSpecs)); } if (transmogrified.GetModifier(ItemModifier.TransmogAppearanceSpec2) == 0) { transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec2, transmogrified.GetModifier(ItemModifier.TransmogAppearanceAllSpecs)); } if (transmogrified.GetModifier(ItemModifier.TransmogAppearanceSpec3) == 0) { transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec3, transmogrified.GetModifier(ItemModifier.TransmogAppearanceAllSpecs)); } if (transmogrified.GetModifier(ItemModifier.TransmogAppearanceSpec4) == 0) { transmogrified.SetModifier(ItemModifier.TransmogAppearanceSpec4, transmogrified.GetModifier(ItemModifier.TransmogAppearanceAllSpecs)); } 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); transmogrified.SetNotRefundable(player); transmogrified.ClearSoulboundTradeable(player); transmogrified.SetState(ItemUpdateState.Changed, player); } foreach (var illusionPair in illusionItems) { Item transmogrified = illusionPair.Key; if (!transmogrifyItems.CurrentSpecOnly) { transmogrified.SetModifier(ItemModifier.EnchantIllusionAllSpecs, illusionPair.Value); transmogrified.SetModifier(ItemModifier.EnchantIllusionSpec1, 0); transmogrified.SetModifier(ItemModifier.EnchantIllusionSpec2, 0); transmogrified.SetModifier(ItemModifier.EnchantIllusionSpec3, 0); transmogrified.SetModifier(ItemModifier.EnchantIllusionSpec4, 0); } else { if (transmogrified.GetModifier(ItemModifier.EnchantIllusionSpec1) == 0) { transmogrified.SetModifier(ItemModifier.EnchantIllusionSpec1, transmogrified.GetModifier(ItemModifier.EnchantIllusionAllSpecs)); } if (transmogrified.GetModifier(ItemModifier.EnchantIllusionSpec2) == 0) { transmogrified.SetModifier(ItemModifier.EnchantIllusionSpec2, transmogrified.GetModifier(ItemModifier.EnchantIllusionAllSpecs)); } if (transmogrified.GetModifier(ItemModifier.EnchantIllusionSpec3) == 0) { transmogrified.SetModifier(ItemModifier.EnchantIllusionSpec3, transmogrified.GetModifier(ItemModifier.EnchantIllusionAllSpecs)); } if (transmogrified.GetModifier(ItemModifier.EnchantIllusionSpec4) == 0) { transmogrified.SetModifier(ItemModifier.EnchantIllusionSpec4, transmogrified.GetModifier(ItemModifier.EnchantIllusionAllSpecs)); } transmogrified.SetModifier(ItemConst.IllusionModifierSlotBySpec[player.GetActiveTalentGroup()], illusionPair.Value); } player.SetVisibleItemSlot(transmogrified.GetSlot(), transmogrified); transmogrified.SetNotRefundable(player); transmogrified.ClearSoulboundTradeable(player); transmogrified.SetState(ItemUpdateState.Changed, player); } foreach (Item item in resetAppearanceItems) { if (!transmogrifyItems.CurrentSpecOnly) { item.SetModifier(ItemModifier.TransmogAppearanceAllSpecs, 0); item.SetModifier(ItemModifier.TransmogAppearanceSpec1, 0); 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 { if (item.GetModifier(ItemModifier.TransmogAppearanceSpec1) == 0) { item.SetModifier(ItemModifier.TransmogAppearanceSpec1, item.GetModifier(ItemModifier.TransmogAppearanceAllSpecs)); } if (item.GetModifier(ItemModifier.TransmogAppearanceSpec2) == 0) { item.SetModifier(ItemModifier.TransmogAppearanceSpec2, item.GetModifier(ItemModifier.TransmogAppearanceAllSpecs)); } if (item.GetModifier(ItemModifier.TransmogAppearanceSpec2) == 0) { 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); } item.SetState(ItemUpdateState.Changed, player); player.SetVisibleItemSlot(item.GetSlot(), item); } foreach (Item item in resetIllusionItems) { if (!transmogrifyItems.CurrentSpecOnly) { item.SetModifier(ItemModifier.EnchantIllusionAllSpecs, 0); item.SetModifier(ItemModifier.EnchantIllusionSpec1, 0); item.SetModifier(ItemModifier.EnchantIllusionSpec2, 0); item.SetModifier(ItemModifier.EnchantIllusionSpec3, 0); item.SetModifier(ItemModifier.EnchantIllusionSpec4, 0); } else { if (item.GetModifier(ItemModifier.EnchantIllusionSpec1) == 0) { item.SetModifier(ItemModifier.EnchantIllusionSpec1, item.GetModifier(ItemModifier.EnchantIllusionAllSpecs)); } if (item.GetModifier(ItemModifier.EnchantIllusionSpec2) == 0) { item.SetModifier(ItemModifier.EnchantIllusionSpec2, item.GetModifier(ItemModifier.EnchantIllusionAllSpecs)); } if (item.GetModifier(ItemModifier.EnchantIllusionSpec3) == 0) { 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); } item.SetState(ItemUpdateState.Changed, player); player.SetVisibleItemSlot(item.GetSlot(), item); } foreach (uint itemModifedAppearanceId in bindAppearances) { var itemsProvidingAppearance = GetCollectionMgr().GetItemsProvidingTemporaryAppearance(itemModifedAppearanceId); foreach (ObjectGuid itemGuid in itemsProvidingAppearance) { Item item = player.GetItemByGuid(itemGuid); if (item) { item.SetNotRefundable(player); item.ClearSoulboundTradeable(player); GetCollectionMgr().AddItemAppearance(item); } } } }