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)
This commit is contained in:
@@ -721,10 +721,12 @@ namespace Framework.Constants
|
|||||||
public enum HeirloomPlayerFlags
|
public enum HeirloomPlayerFlags
|
||||||
{
|
{
|
||||||
None = 0x00,
|
None = 0x00,
|
||||||
BonusLevel90 = 0x01,
|
UpgradeLevel1 = 0x01,
|
||||||
BonusLevel100 = 0x02,
|
UpgradeLevel2 = 0x02,
|
||||||
BonusLevel110 = 0x04,
|
UpgradeLevel3 = 0x04,
|
||||||
BonusLevel120 = 0x08
|
UpgradeLevel4 = 0x08,
|
||||||
|
UpgradeLevel5 = 0x10,
|
||||||
|
UpgradeLevel6 = 0x20,
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum HeirloomItemFlags
|
public enum HeirloomItemFlags
|
||||||
|
|||||||
@@ -1092,6 +1092,15 @@ namespace Game.DataStorage
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Tuple<float, float> 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<CurvePointRecord> points)
|
static CurveInterpolationMode DetermineCurveType(CurveRecord curve, List<CurvePointRecord> points)
|
||||||
{
|
{
|
||||||
switch (curve.Type)
|
switch (curve.Type)
|
||||||
|
|||||||
@@ -2382,6 +2382,22 @@ namespace Game.Entities
|
|||||||
if (set.SetFlags.HasAnyFlag(ItemSetFlags.LegacyInactive))
|
if (set.SetFlags.HasAnyFlag(ItemSetFlags.LegacyInactive))
|
||||||
return;
|
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;
|
ItemSetEffect eff = null;
|
||||||
for (int x = 0; x < player.ItemSetEff.Count; ++x)
|
for (int x = 0; x < player.ItemSetEff.Count; ++x)
|
||||||
{
|
{
|
||||||
@@ -2408,13 +2424,13 @@ namespace Game.Entities
|
|||||||
player.ItemSetEff.Add(eff);
|
player.ItemSetEff.Add(eff);
|
||||||
}
|
}
|
||||||
|
|
||||||
++eff.EquippedItemCount;
|
eff.EquippedItems.Add(item);
|
||||||
|
|
||||||
List<ItemSetSpellRecord> itemSetSpells = Global.DB2Mgr.GetItemSetSpells(setid);
|
List<ItemSetSpellRecord> itemSetSpells = Global.DB2Mgr.GetItemSetSpells(setid);
|
||||||
foreach (var itemSetSpell in itemSetSpells)
|
foreach (var itemSetSpell in itemSetSpells)
|
||||||
{
|
{
|
||||||
//not enough for spell
|
//not enough for spell
|
||||||
if (itemSetSpell.Threshold > eff.EquippedItemCount)
|
if (itemSetSpell.Threshold > eff.EquippedItems.Count)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (eff.SetBonuses.Contains(itemSetSpell))
|
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);
|
ItemSetRecord set = CliDB.ItemSetStorage.LookupByKey(setid);
|
||||||
if (set == null)
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2460,13 +2476,13 @@ namespace Game.Entities
|
|||||||
if (eff == null)
|
if (eff == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
--eff.EquippedItemCount;
|
eff.EquippedItems.Remove(item);
|
||||||
|
|
||||||
List<ItemSetSpellRecord> itemSetSpells = Global.DB2Mgr.GetItemSetSpells(setid);
|
List<ItemSetSpellRecord> itemSetSpells = Global.DB2Mgr.GetItemSetSpells(setid);
|
||||||
foreach (ItemSetSpellRecord itemSetSpell in itemSetSpells)
|
foreach (ItemSetSpellRecord itemSetSpell in itemSetSpells)
|
||||||
{
|
{
|
||||||
// enough for spell
|
// enough for spell
|
||||||
if (itemSetSpell.Threshold <= eff.EquippedItemCount)
|
if (itemSetSpell.Threshold <= eff.EquippedItems.Count)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!eff.SetBonuses.Contains(itemSetSpell))
|
if (!eff.SetBonuses.Contains(itemSetSpell))
|
||||||
@@ -2476,7 +2492,7 @@ namespace Game.Entities
|
|||||||
eff.SetBonuses.Remove(itemSetSpell);
|
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]);
|
Cypher.Assert(eff == player.ItemSetEff[setindex]);
|
||||||
player.ItemSetEff[setindex] = null;
|
player.ItemSetEff[setindex] = null;
|
||||||
@@ -2739,7 +2755,7 @@ namespace Game.Entities
|
|||||||
public class ItemSetEffect
|
public class ItemSetEffect
|
||||||
{
|
{
|
||||||
public uint ItemSetID;
|
public uint ItemSetID;
|
||||||
public uint EquippedItemCount;
|
public List<Item> EquippedItems = new();
|
||||||
public List<ItemSetSpellRecord> SetBonuses = new();
|
public List<ItemSetSpellRecord> SetBonuses = new();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -185,14 +185,14 @@ namespace Game.Entities
|
|||||||
|
|
||||||
uint bonusId = 0;
|
uint bonusId = 0;
|
||||||
|
|
||||||
if (flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel120))
|
for (int upgradeLevel = heirloom.UpgradeItemID.Length - 1; upgradeLevel >= 0; --upgradeLevel)
|
||||||
bonusId = heirloom.UpgradeItemBonusListID[3];
|
{
|
||||||
else if (flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel110))
|
if (((int)flags & (1 << upgradeLevel)) != 0)
|
||||||
bonusId = heirloom.UpgradeItemBonusListID[2];
|
{
|
||||||
else if (flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel100))
|
bonusId = heirloom.UpgradeItemBonusListID[upgradeLevel];
|
||||||
bonusId = heirloom.UpgradeItemBonusListID[1];
|
break;
|
||||||
else if (flags.HasAnyFlag(HeirloomPlayerFlags.BonusLevel90))
|
}
|
||||||
bonusId = heirloom.UpgradeItemBonusListID[0];
|
}
|
||||||
|
|
||||||
_heirlooms[itemId] = new HeirloomData(flags, bonusId);
|
_heirlooms[itemId] = new HeirloomData(flags, bonusId);
|
||||||
} while (result.NextRow());
|
} while (result.NextRow());
|
||||||
@@ -258,25 +258,13 @@ namespace Game.Entities
|
|||||||
HeirloomPlayerFlags flags = data.flags;
|
HeirloomPlayerFlags flags = data.flags;
|
||||||
uint bonusId = 0;
|
uint bonusId = 0;
|
||||||
|
|
||||||
if (heirloom.UpgradeItemID[0] == castItem)
|
for (int upgradeLevel = 0; upgradeLevel < heirloom.UpgradeItemID.Length; ++upgradeLevel)
|
||||||
{
|
{
|
||||||
flags |= HeirloomPlayerFlags.BonusLevel90;
|
if (heirloom.UpgradeItemID[upgradeLevel] == castItem)
|
||||||
bonusId = heirloom.UpgradeItemBonusListID[0];
|
{
|
||||||
}
|
flags |= (HeirloomPlayerFlags)(1 << upgradeLevel);
|
||||||
if (heirloom.UpgradeItemID[1] == castItem)
|
bonusId = heirloom.UpgradeItemBonusListID[upgradeLevel];
|
||||||
{
|
}
|
||||||
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];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (Item item in player.GetItemListByEntry(itemId, true))
|
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()
|
public void LoadMounts()
|
||||||
{
|
{
|
||||||
foreach (var m in _mounts.ToList())
|
foreach (var m in _mounts.ToList())
|
||||||
|
|||||||
@@ -1869,7 +1869,7 @@ namespace Game.Entities
|
|||||||
// item set bonuses applied only at equip and removed at unequip, and still active for broken items
|
// item set bonuses applied only at equip and removed at unequip, and still active for broken items
|
||||||
ItemTemplate pProto = pItem.GetTemplate();
|
ItemTemplate pProto = pItem.GetTemplate();
|
||||||
if (pProto != null && pProto.GetItemSet() != 0)
|
if (pProto != null && pProto.GetItemSet() != 0)
|
||||||
Item.RemoveItemsSetItem(this, pProto);
|
Item.RemoveItemsSetItem(this, pItem);
|
||||||
|
|
||||||
_ApplyItemMods(pItem, slot, false, update);
|
_ApplyItemMods(pItem, slot, false, update);
|
||||||
|
|
||||||
@@ -3826,10 +3826,6 @@ namespace Game.Entities
|
|||||||
if (spellproto == null)
|
if (spellproto == null)
|
||||||
continue;
|
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())
|
if (effectData.ChrSpecializationID != 0 && effectData.ChrSpecializationID != GetPrimarySpecialization())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -3939,7 +3935,7 @@ namespace Game.Entities
|
|||||||
|
|
||||||
// item set bonuses not dependent from item broken state
|
// item set bonuses not dependent from item broken state
|
||||||
if (proto.GetItemSet() != 0)
|
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())))
|
if (m_items[i].IsBroken() || !CanUseAttackType(GetAttackBySlot(i, m_items[i].GetTemplate().GetInventoryType())))
|
||||||
continue;
|
continue;
|
||||||
@@ -4019,6 +4015,15 @@ namespace Game.Entities
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
_ApplyItemMods(m_items[i], i, apply);
|
_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
|
// item set bonuses applied only at equip and removed at unequip, and still active for broken items
|
||||||
if (pProto != null && pProto.GetItemSet() != 0)
|
if (pProto != null && pProto.GetItemSet() != 0)
|
||||||
Item.RemoveItemsSetItem(this, pProto);
|
Item.RemoveItemsSetItem(this, pItem);
|
||||||
|
|
||||||
_ApplyItemMods(pItem, slot, false);
|
_ApplyItemMods(pItem, slot, false);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user