Core/Players: Defined all avg item level slots

Port From (https://github.com/TrinityCore/TrinityCore/commit/3f85fa7470789dbaedac5f3d74d00e1095e24ad1)
This commit is contained in:
Hondacrx
2024-08-25 14:05:11 -04:00
parent d1c25fbf05
commit edb6934082
7 changed files with 42 additions and 15 deletions
+10
View File
@@ -793,6 +793,16 @@ namespace Framework.Constants
CorruptedLoot = 19 CorruptedLoot = 19
} }
public enum AvgItemLevelCategory
{
Base = 0,
EquippedBase = 1,
EquippedEffective = 2,
Pvp = 3,
PvpWeighted = 4,
EquippedEffectiveWeighted = 5
}
[Flags] [Flags]
public enum CurrencyDbFlags public enum CurrencyDbFlags
{ {
+5 -5
View File
@@ -2915,11 +2915,11 @@ namespace Game.Entities
int scalingLevelMax = m_unitData.ScalingLevelMax; int scalingLevelMax = m_unitData.ScalingLevelMax;
int scalingLevelDelta = m_unitData.ScalingLevelDelta; int scalingLevelDelta = m_unitData.ScalingLevelDelta;
int scalingFactionGroup = m_unitData.ScalingFactionGroup; int scalingFactionGroup = m_unitData.ScalingFactionGroup;
int targetLevel = unitTarget.m_unitData.EffectiveLevel; uint targetLevel = unitTarget.m_unitData.EffectiveLevel;
if (targetLevel == 0) if (targetLevel == 0)
targetLevel = (int)unitTarget.GetLevel(); targetLevel = unitTarget.GetLevel();
int targetLevelDelta = 0; uint targetLevelDelta = 0;
Player playerTarget = target.ToPlayer(); Player playerTarget = target.ToPlayer();
if (playerTarget != null) if (playerTarget != null)
@@ -2928,10 +2928,10 @@ namespace Game.Entities
scalingLevelMin = scalingLevelMax; scalingLevelMin = scalingLevelMax;
int maxCreatureScalingLevel = playerTarget.m_activePlayerData.MaxCreatureScalingLevel; int maxCreatureScalingLevel = playerTarget.m_activePlayerData.MaxCreatureScalingLevel;
targetLevelDelta = Math.Min(maxCreatureScalingLevel > 0 ? maxCreatureScalingLevel - targetLevel : 0, playerTarget.m_activePlayerData.ScalingPlayerLevelDelta); targetLevelDelta = (uint)Math.Min(maxCreatureScalingLevel > 0 ? maxCreatureScalingLevel - targetLevel : 0, playerTarget.m_activePlayerData.ScalingPlayerLevelDelta);
} }
int levelWithDelta = targetLevel + targetLevelDelta; int levelWithDelta = (int)(targetLevel + targetLevelDelta);
int level = MathFunctions.RoundToInterval(ref levelWithDelta, scalingLevelMin, scalingLevelMax) + scalingLevelDelta; int level = MathFunctions.RoundToInterval(ref levelWithDelta, scalingLevelMin, scalingLevelMax) + scalingLevelDelta;
return (uint)MathFunctions.RoundToInterval(ref level, 1, SharedConst.MaxLevel + 3); return (uint)MathFunctions.RoundToInterval(ref level, 1, SharedConst.MaxLevel + 3);
} }
+1 -1
View File
@@ -1791,8 +1791,8 @@ namespace Game.Entities
ItemTemplate itemTemplate = GetTemplate(); ItemTemplate itemTemplate = GetTemplate();
uint minItemLevel = owner.m_unitData.MinItemLevel; uint minItemLevel = owner.m_unitData.MinItemLevel;
uint minItemLevelCutoff = owner.m_unitData.MinItemLevelCutoff; uint minItemLevelCutoff = owner.m_unitData.MinItemLevelCutoff;
uint maxItemLevel = itemTemplate.HasFlag(ItemFlags3.IgnoreItemLevelCapInPvp) ? 0u : owner.m_unitData.MaxItemLevel;
bool pvpBonus = owner.IsUsingPvpItemLevels(); bool pvpBonus = owner.IsUsingPvpItemLevels();
uint maxItemLevel = pvpBonus && itemTemplate.HasFlag(ItemFlags3.IgnoreItemLevelCapInPvp) ? 0u : owner.m_unitData.MaxItemLevel;
uint azeriteLevel = 0; uint azeriteLevel = 0;
AzeriteItem azeriteItem = ToAzeriteItem(); AzeriteItem azeriteItem = ToAzeriteItem();
@@ -1165,7 +1165,7 @@ namespace Game.Entities
public UpdateField<ulong> Health = new(0, 31); public UpdateField<ulong> Health = new(0, 31);
public UpdateField<ulong> MaxHealth = new(32, 33); public UpdateField<ulong> MaxHealth = new(32, 33);
public UpdateField<uint> Level = new(32, 34); public UpdateField<uint> Level = new(32, 34);
public UpdateField<int> EffectiveLevel = new(32, 35); public UpdateField<uint> EffectiveLevel = new(32, 35);
public UpdateField<uint> ContentTuningID = new(32, 36); public UpdateField<uint> ContentTuningID = new(32, 36);
public UpdateField<int> ScalingLevelMin = new(32, 37); public UpdateField<int> ScalingLevelMin = new(32, 37);
public UpdateField<int> ScalingLevelMax = new(32, 38); public UpdateField<int> ScalingLevelMax = new(32, 38);
@@ -1325,7 +1325,7 @@ namespace Game.Entities
} }
data.WriteUInt64(MaxHealth); data.WriteUInt64(MaxHealth);
data.WriteUInt32(Level); data.WriteUInt32(Level);
data.WriteInt32(EffectiveLevel); data.WriteUInt32(EffectiveLevel);
data.WriteUInt32(ContentTuningID); data.WriteUInt32(ContentTuningID);
data.WriteInt32(ScalingLevelMin); data.WriteInt32(ScalingLevelMin);
data.WriteInt32(ScalingLevelMax); data.WriteInt32(ScalingLevelMax);
@@ -1691,7 +1691,7 @@ namespace Game.Entities
} }
if (changesMask[35]) if (changesMask[35])
{ {
data.WriteInt32(EffectiveLevel); data.WriteUInt32(EffectiveLevel);
} }
if (changesMask[36]) if (changesMask[36])
{ {
+18 -4
View File
@@ -6551,7 +6551,7 @@ namespace Game.Entities
public void UpdateAverageItemLevelTotal() public void UpdateAverageItemLevelTotal()
{ {
(InventoryType inventoryType, uint itemLevel, ObjectGuid guid)[] bestItemLevels = new (InventoryType inventoryType, uint itemLevel, ObjectGuid guid)[EquipmentSlot.End]; var bestItemLevels = new (InventoryType inventoryType, uint itemLevel, ObjectGuid guid)[EquipmentSlot.End];
float sum = 0; float sum = 0;
ForEachItem(ItemSearchLocation.Everywhere, item => ForEachItem(ItemSearchLocation.Everywhere, item =>
@@ -6602,26 +6602,40 @@ namespace Game.Entities
sum += mainHand.itemLevel; sum += mainHand.itemLevel;
sum /= 16.0f; sum /= 16.0f;
SetAverageItemLevelTotal(sum); SetAverageItemLevel(sum, AvgItemLevelCategory.Base);
} }
public void UpdateAverageItemLevelEquipped() public void UpdateAverageItemLevelEquipped()
{ {
float totalItemLevel = 0; float totalItemLevel = 0;
float totalItemLevelEffective = 0;
for (byte i = EquipmentSlot.Start; i < EquipmentSlot.End; i++) for (byte i = EquipmentSlot.Start; i < EquipmentSlot.End; i++)
{ {
Item item = GetItemByPos(InventorySlots.Bag0, i); Item item = GetItemByPos(InventorySlots.Bag0, i);
if (item != null) if (item != null)
{ {
uint itemLevel = item.GetItemLevel(this); uint azeriteLevel = 0;
AzeriteItem azeriteItem = item.ToAzeriteItem();
if (azeriteItem != null)
azeriteLevel = azeriteItem.GetEffectiveLevel();
uint itemLevel = Item.GetItemLevel(item.GetTemplate(), item.GetBonus(), GetLevel(), item.GetModifier(ItemModifier.TimewalkerLevel), 0, 0, 0, false, azeriteLevel);
uint itemLevelEffective = Item.GetItemLevel(item.GetTemplate(), item.GetBonus(), GetEffectiveLevel(), item.GetModifier(ItemModifier.TimewalkerLevel), m_unitData.MinItemLevel,
m_unitData.MinItemLevelCutoff, IsUsingPvpItemLevels() && item.GetTemplate().HasFlag(ItemFlags3.IgnoreItemLevelCapInPvp) ? 0 : m_unitData.MaxItemLevel, IsUsingPvpItemLevels(), azeriteLevel);
totalItemLevel += itemLevel; totalItemLevel += itemLevel;
totalItemLevelEffective += itemLevelEffective;
if (!m_canTitanGrip && i == EquipmentSlot.MainHand && item.GetTemplate().GetInventoryType() == InventoryType.Weapon2Hand) // 2h weapon counts twice if (!m_canTitanGrip && i == EquipmentSlot.MainHand && item.GetTemplate().GetInventoryType() == InventoryType.Weapon2Hand) // 2h weapon counts twice
{
totalItemLevel += itemLevel; totalItemLevel += itemLevel;
totalItemLevelEffective += itemLevelEffective;
}
} }
} }
totalItemLevel /= 16.0f; totalItemLevel /= 16.0f;
SetAverageItemLevelEquipped(totalItemLevel); totalItemLevelEffective /= 16.0f;
SetAverageItemLevel(totalItemLevel, AvgItemLevelCategory.EquippedBase);
SetAverageItemLevel(totalItemLevelEffective, AvgItemLevelCategory.EquippedEffective);
} }
} }
} }
+1 -2
View File
@@ -7670,8 +7670,7 @@ namespace Game.Entities
public void RemovePlayerFlagEx(PlayerFlagsEx flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PlayerFlagsEx), (uint)flags); } public void RemovePlayerFlagEx(PlayerFlagsEx flags) { RemoveUpdateFieldFlagValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PlayerFlagsEx), (uint)flags); }
public void ReplaceAllPlayerFlagsEx(PlayerFlagsEx flags) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PlayerFlagsEx), (uint)flags); } public void ReplaceAllPlayerFlagsEx(PlayerFlagsEx flags) { SetUpdateFieldValue(m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.PlayerFlagsEx), (uint)flags); }
public void SetAverageItemLevelTotal(float newItemLevel) { SetUpdateFieldValue(ref m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.AvgItemLevel, 0), newItemLevel); } public void SetAverageItemLevel(float newItemLevel, AvgItemLevelCategory category) { SetUpdateFieldValue(ref m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.AvgItemLevel, (int)category), newItemLevel); }
public void SetAverageItemLevelEquipped(float newItemLevel) { SetUpdateFieldValue(ref m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.AvgItemLevel, 1), newItemLevel); }
public uint GetCustomizationChoice(uint chrCustomizationOptionId) public uint GetCustomizationChoice(uint chrCustomizationOptionId)
{ {
+4
View File
@@ -1921,7 +1921,11 @@ namespace Game.Entities
Global.CharacterCacheStorage.UpdateCharacterLevel(ToPlayer().GetGUID(), (byte)lvl); Global.CharacterCacheStorage.UpdateCharacterLevel(ToPlayer().GetGUID(), (byte)lvl);
} }
} }
public uint GetLevel() { return m_unitData.Level; } public uint GetLevel() { return m_unitData.Level; }
public byte GetEffectiveLevel() { return (byte)(m_unitData.EffectiveLevel != 0 ? m_unitData.EffectiveLevel : m_unitData.Level); }
public override uint GetLevelForTarget(WorldObject target) { return GetLevel(); } public override uint GetLevelForTarget(WorldObject target) { return GetLevel(); }
public Race GetRace() { return (Race)(byte)m_unitData.Race; } public Race GetRace() { return (Race)(byte)m_unitData.Race; }