From a1411aef9408a7a58daed8364f0c3377ace01cf0 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Fri, 28 Jan 2022 17:33:49 -0500 Subject: [PATCH] Core/Items: Fixed heirloom items counting for item set bonuses past their max scaling level and implemented new heirloom upgrade levels Port From (https://github.com/TrinityCore/TrinityCore/commit/3c12a189e430b1b6e0a452f272860f58b2dca7bd) --- Source/Framework/Constants/PlayerConst.cs | 10 +-- Source/Game/DataStorage/DB2Manager.cs | 9 +++ Source/Game/Entities/Item/Item.cs | 34 ++++++++--- .../Game/Entities/Player/CollectionManager.cs | 61 +++++-------------- Source/Game/Entities/Player/Player.Items.cs | 19 +++--- 5 files changed, 66 insertions(+), 67 deletions(-) diff --git a/Source/Framework/Constants/PlayerConst.cs b/Source/Framework/Constants/PlayerConst.cs index 5d7291628..7cb92d028 100644 --- a/Source/Framework/Constants/PlayerConst.cs +++ b/Source/Framework/Constants/PlayerConst.cs @@ -721,10 +721,12 @@ namespace Framework.Constants public enum HeirloomPlayerFlags { None = 0x00, - BonusLevel90 = 0x01, - BonusLevel100 = 0x02, - BonusLevel110 = 0x04, - BonusLevel120 = 0x08 + UpgradeLevel1 = 0x01, + UpgradeLevel2 = 0x02, + UpgradeLevel3 = 0x04, + UpgradeLevel4 = 0x08, + UpgradeLevel5 = 0x10, + UpgradeLevel6 = 0x20, } public enum HeirloomItemFlags diff --git a/Source/Game/DataStorage/DB2Manager.cs b/Source/Game/DataStorage/DB2Manager.cs index 28b212a9a..3ad2ed0a5 100644 --- a/Source/Game/DataStorage/DB2Manager.cs +++ b/Source/Game/DataStorage/DB2Manager.cs @@ -1092,6 +1092,15 @@ namespace Game.DataStorage return null; } + public Tuple GetCurveXAxisRange(uint curveId) + { + var points = _curvePoints.LookupByKey(curveId); + if (!points.Empty()) + return Tuple.Create(points.First().Pos.X, points.Last().Pos.X); + + return Tuple.Create(0.0f, 0.0f); + } + static CurveInterpolationMode DetermineCurveType(CurveRecord curve, List points) { switch (curve.Type) diff --git a/Source/Game/Entities/Item/Item.cs b/Source/Game/Entities/Item/Item.cs index 9f668e608..b705b4ea9 100644 --- a/Source/Game/Entities/Item/Item.cs +++ b/Source/Game/Entities/Item/Item.cs @@ -2382,6 +2382,22 @@ namespace Game.Entities if (set.SetFlags.HasAnyFlag(ItemSetFlags.LegacyInactive)) return; + // Check player level for heirlooms + if (Global.DB2Mgr.GetHeirloomByItemId(item.GetEntry()) != null) + { + if (item.GetBonus().PlayerLevelToItemLevelCurveId != 0) + { + uint maxLevel = (uint)Global.DB2Mgr.GetCurveXAxisRange(item.GetBonus().PlayerLevelToItemLevelCurveId).Item2; + + var contentTuning = Global.DB2Mgr.GetContentTuningData(item.GetBonus().ContentTuningId, player.m_playerData.CtrOptions._value.ContentTuningConditionMask, true); + if (contentTuning.HasValue) + maxLevel = Math.Min(maxLevel, (uint)contentTuning.Value.MaxLevel); + + if (player.GetLevel() > maxLevel) + return; + } + } + ItemSetEffect eff = null; for (int x = 0; x < player.ItemSetEff.Count; ++x) { @@ -2408,13 +2424,13 @@ namespace Game.Entities player.ItemSetEff.Add(eff); } - ++eff.EquippedItemCount; + eff.EquippedItems.Add(item); List itemSetSpells = Global.DB2Mgr.GetItemSetSpells(setid); foreach (var itemSetSpell in itemSetSpells) { //not enough for spell - if (itemSetSpell.Threshold > eff.EquippedItemCount) + if (itemSetSpell.Threshold > eff.EquippedItems.Count) continue; if (eff.SetBonuses.Contains(itemSetSpell)) @@ -2434,14 +2450,14 @@ namespace Game.Entities } } - public static void RemoveItemsSetItem(Player player, ItemTemplate proto) + public static void RemoveItemsSetItem(Player player, Item item) { - uint setid = proto.GetItemSet(); + uint setid = item.GetTemplate().GetItemSet(); ItemSetRecord set = CliDB.ItemSetStorage.LookupByKey(setid); if (set == null) { - Log.outError(LogFilter.Sql, "Item set {0} for item {1} not found, mods not removed.", setid, proto.GetId()); + Log.outError(LogFilter.Sql, $"Item set {setid} for item {item.GetEntry()} not found, mods not removed."); return; } @@ -2460,13 +2476,13 @@ namespace Game.Entities if (eff == null) return; - --eff.EquippedItemCount; + eff.EquippedItems.Remove(item); List itemSetSpells = Global.DB2Mgr.GetItemSetSpells(setid); foreach (ItemSetSpellRecord itemSetSpell in itemSetSpells) { // enough for spell - if (itemSetSpell.Threshold <= eff.EquippedItemCount) + if (itemSetSpell.Threshold <= eff.EquippedItems.Count) continue; if (!eff.SetBonuses.Contains(itemSetSpell)) @@ -2476,7 +2492,7 @@ namespace Game.Entities eff.SetBonuses.Remove(itemSetSpell); } - if (eff.EquippedItemCount == 0) //all items of a set were removed + if (eff.EquippedItems.Empty()) //all items of a set were removed { Cypher.Assert(eff == player.ItemSetEff[setindex]); player.ItemSetEff[setindex] = null; @@ -2739,7 +2755,7 @@ namespace Game.Entities public class ItemSetEffect { public uint ItemSetID; - public uint EquippedItemCount; + public List EquippedItems = new(); public List SetBonuses = new(); } diff --git a/Source/Game/Entities/Player/CollectionManager.cs b/Source/Game/Entities/Player/CollectionManager.cs index 4830b7694..d5afcd0fd 100644 --- a/Source/Game/Entities/Player/CollectionManager.cs +++ b/Source/Game/Entities/Player/CollectionManager.cs @@ -185,14 +185,14 @@ namespace Game.Entities uint bonusId = 0; - if (flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel120)) - bonusId = heirloom.UpgradeItemBonusListID[3]; - else if (flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel110)) - bonusId = heirloom.UpgradeItemBonusListID[2]; - else if (flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel100)) - bonusId = heirloom.UpgradeItemBonusListID[1]; - else if (flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel90)) - bonusId = heirloom.UpgradeItemBonusListID[0]; + for (int upgradeLevel = heirloom.UpgradeItemID.Length - 1; upgradeLevel >= 0; --upgradeLevel) + { + if (((int)flags & (1 << upgradeLevel)) != 0) + { + bonusId = heirloom.UpgradeItemBonusListID[upgradeLevel]; + break; + } + } _heirlooms[itemId] = new HeirloomData(flags, bonusId); } while (result.NextRow()); @@ -258,25 +258,13 @@ namespace Game.Entities HeirloomPlayerFlags flags = data.flags; uint bonusId = 0; - if (heirloom.UpgradeItemID[0] == castItem) + for (int upgradeLevel = 0; upgradeLevel < heirloom.UpgradeItemID.Length; ++upgradeLevel) { - flags |= HeirloomPlayerFlags.BonusLevel90; - bonusId = heirloom.UpgradeItemBonusListID[0]; - } - if (heirloom.UpgradeItemID[1] == castItem) - { - flags |= HeirloomPlayerFlags.BonusLevel100; - bonusId = heirloom.UpgradeItemBonusListID[1]; - } - if (heirloom.UpgradeItemID[2] == castItem) - { - flags |= HeirloomPlayerFlags.BonusLevel110; - bonusId = heirloom.UpgradeItemBonusListID[2]; - } - if (heirloom.UpgradeItemID[3] == castItem) - { - flags |= HeirloomPlayerFlags.BonusLevel120; - bonusId = heirloom.UpgradeItemBonusListID[3]; + if (heirloom.UpgradeItemID[upgradeLevel] == castItem) + { + flags |= (HeirloomPlayerFlags)(1 << upgradeLevel); + bonusId = heirloom.UpgradeItemBonusListID[upgradeLevel]; + } } foreach (Item item in player.GetItemListByEntry(itemId, true)) @@ -353,27 +341,6 @@ namespace Game.Entities } } - public bool CanApplyHeirloomXpBonus(uint itemId, uint level) - { - if (Global.DB2Mgr.GetHeirloomByItemId(itemId) == null) - return false; - - var data = _heirlooms.LookupByKey(itemId); - if (data == null) - return false; - - if (data.flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel120)) - return level <= 120; - if (data.flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel110)) - return level <= 110; - if (data.flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel100)) - return level <= 100; - if (data.flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel90)) - return level <= 90; - - return level <= 60; - } - public void LoadMounts() { foreach (var m in _mounts.ToList()) diff --git a/Source/Game/Entities/Player/Player.Items.cs b/Source/Game/Entities/Player/Player.Items.cs index 7e411c3a5..28da391d2 100644 --- a/Source/Game/Entities/Player/Player.Items.cs +++ b/Source/Game/Entities/Player/Player.Items.cs @@ -1869,7 +1869,7 @@ namespace Game.Entities // item set bonuses applied only at equip and removed at unequip, and still active for broken items ItemTemplate pProto = pItem.GetTemplate(); if (pProto != null && pProto.GetItemSet() != 0) - Item.RemoveItemsSetItem(this, pProto); + Item.RemoveItemsSetItem(this, pItem); _ApplyItemMods(pItem, slot, false, update); @@ -3826,10 +3826,6 @@ namespace Game.Entities if (spellproto == null) continue; - if (spellproto.HasAura(AuraType.ModXpPct) && !GetSession().GetCollectionMgr().CanApplyHeirloomXpBonus(item.GetEntry(), GetLevel()) - && Global.DB2Mgr.GetHeirloomByItemId(item.GetEntry()) != null) - continue; - if (effectData.ChrSpecializationID != 0 && effectData.ChrSpecializationID != GetPrimarySpecialization()) continue; @@ -3939,7 +3935,7 @@ namespace Game.Entities // item set bonuses not dependent from item broken state if (proto.GetItemSet() != 0) - Item.RemoveItemsSetItem(this, proto); + Item.RemoveItemsSetItem(this, m_items[i]); if (m_items[i].IsBroken() || !CanUseAttackType(GetAttackBySlot(i, m_items[i].GetTemplate().GetInventoryType()))) continue; @@ -4019,6 +4015,15 @@ namespace Game.Entities continue; _ApplyItemMods(m_items[i], i, apply); + + // Update item sets for heirlooms + if (Global.DB2Mgr.GetHeirloomByItemId(m_items[i].GetEntry()) != null && m_items[i].GetTemplate().GetItemSet() != 0) + { + if (apply) + Item.AddItemsSetItem(this, m_items[i]); + else + Item.RemoveItemsSetItem(this, m_items[i]); + } } } } @@ -5459,7 +5464,7 @@ namespace Game.Entities { // item set bonuses applied only at equip and removed at unequip, and still active for broken items if (pProto != null && pProto.GetItemSet() != 0) - Item.RemoveItemsSetItem(this, pProto); + Item.RemoveItemsSetItem(this, pItem); _ApplyItemMods(pItem, slot, false); }