Core/Players: Defined all avg item level slots
Port From (https://github.com/TrinityCore/TrinityCore/commit/3f85fa7470789dbaedac5f3d74d00e1095e24ad1)
This commit is contained in:
@@ -793,6 +793,16 @@ namespace Framework.Constants
|
||||
CorruptedLoot = 19
|
||||
}
|
||||
|
||||
public enum AvgItemLevelCategory
|
||||
{
|
||||
Base = 0,
|
||||
EquippedBase = 1,
|
||||
EquippedEffective = 2,
|
||||
Pvp = 3,
|
||||
PvpWeighted = 4,
|
||||
EquippedEffectiveWeighted = 5
|
||||
}
|
||||
|
||||
[Flags]
|
||||
public enum CurrencyDbFlags
|
||||
{
|
||||
|
||||
@@ -2915,11 +2915,11 @@ namespace Game.Entities
|
||||
int scalingLevelMax = m_unitData.ScalingLevelMax;
|
||||
int scalingLevelDelta = m_unitData.ScalingLevelDelta;
|
||||
int scalingFactionGroup = m_unitData.ScalingFactionGroup;
|
||||
int targetLevel = unitTarget.m_unitData.EffectiveLevel;
|
||||
uint targetLevel = unitTarget.m_unitData.EffectiveLevel;
|
||||
if (targetLevel == 0)
|
||||
targetLevel = (int)unitTarget.GetLevel();
|
||||
targetLevel = unitTarget.GetLevel();
|
||||
|
||||
int targetLevelDelta = 0;
|
||||
uint targetLevelDelta = 0;
|
||||
|
||||
Player playerTarget = target.ToPlayer();
|
||||
if (playerTarget != null)
|
||||
@@ -2928,10 +2928,10 @@ namespace Game.Entities
|
||||
scalingLevelMin = scalingLevelMax;
|
||||
|
||||
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;
|
||||
return (uint)MathFunctions.RoundToInterval(ref level, 1, SharedConst.MaxLevel + 3);
|
||||
}
|
||||
|
||||
@@ -1791,8 +1791,8 @@ namespace Game.Entities
|
||||
ItemTemplate itemTemplate = GetTemplate();
|
||||
uint minItemLevel = owner.m_unitData.MinItemLevel;
|
||||
uint minItemLevelCutoff = owner.m_unitData.MinItemLevelCutoff;
|
||||
uint maxItemLevel = itemTemplate.HasFlag(ItemFlags3.IgnoreItemLevelCapInPvp) ? 0u : owner.m_unitData.MaxItemLevel;
|
||||
bool pvpBonus = owner.IsUsingPvpItemLevels();
|
||||
uint maxItemLevel = pvpBonus && itemTemplate.HasFlag(ItemFlags3.IgnoreItemLevelCapInPvp) ? 0u : owner.m_unitData.MaxItemLevel;
|
||||
|
||||
uint azeriteLevel = 0;
|
||||
AzeriteItem azeriteItem = ToAzeriteItem();
|
||||
|
||||
@@ -1165,7 +1165,7 @@ namespace Game.Entities
|
||||
public UpdateField<ulong> Health = new(0, 31);
|
||||
public UpdateField<ulong> MaxHealth = new(32, 33);
|
||||
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<int> ScalingLevelMin = new(32, 37);
|
||||
public UpdateField<int> ScalingLevelMax = new(32, 38);
|
||||
@@ -1325,7 +1325,7 @@ namespace Game.Entities
|
||||
}
|
||||
data.WriteUInt64(MaxHealth);
|
||||
data.WriteUInt32(Level);
|
||||
data.WriteInt32(EffectiveLevel);
|
||||
data.WriteUInt32(EffectiveLevel);
|
||||
data.WriteUInt32(ContentTuningID);
|
||||
data.WriteInt32(ScalingLevelMin);
|
||||
data.WriteInt32(ScalingLevelMax);
|
||||
@@ -1691,7 +1691,7 @@ namespace Game.Entities
|
||||
}
|
||||
if (changesMask[35])
|
||||
{
|
||||
data.WriteInt32(EffectiveLevel);
|
||||
data.WriteUInt32(EffectiveLevel);
|
||||
}
|
||||
if (changesMask[36])
|
||||
{
|
||||
|
||||
@@ -6551,7 +6551,7 @@ namespace Game.Entities
|
||||
|
||||
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;
|
||||
|
||||
ForEachItem(ItemSearchLocation.Everywhere, item =>
|
||||
@@ -6602,26 +6602,40 @@ namespace Game.Entities
|
||||
sum += mainHand.itemLevel;
|
||||
|
||||
sum /= 16.0f;
|
||||
SetAverageItemLevelTotal(sum);
|
||||
SetAverageItemLevel(sum, AvgItemLevelCategory.Base);
|
||||
}
|
||||
|
||||
public void UpdateAverageItemLevelEquipped()
|
||||
{
|
||||
float totalItemLevel = 0;
|
||||
float totalItemLevelEffective = 0;
|
||||
for (byte i = EquipmentSlot.Start; i < EquipmentSlot.End; i++)
|
||||
{
|
||||
Item item = GetItemByPos(InventorySlots.Bag0, i);
|
||||
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;
|
||||
totalItemLevelEffective += itemLevelEffective;
|
||||
if (!m_canTitanGrip && i == EquipmentSlot.MainHand && item.GetTemplate().GetInventoryType() == InventoryType.Weapon2Hand) // 2h weapon counts twice
|
||||
{
|
||||
totalItemLevel += itemLevel;
|
||||
totalItemLevelEffective += itemLevelEffective;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
totalItemLevel /= 16.0f;
|
||||
SetAverageItemLevelEquipped(totalItemLevel);
|
||||
totalItemLevelEffective /= 16.0f;
|
||||
SetAverageItemLevel(totalItemLevel, AvgItemLevelCategory.EquippedBase);
|
||||
SetAverageItemLevel(totalItemLevelEffective, AvgItemLevelCategory.EquippedEffective);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 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 SetAverageItemLevelEquipped(float newItemLevel) { SetUpdateFieldValue(ref m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.AvgItemLevel, 1), newItemLevel); }
|
||||
public void SetAverageItemLevel(float newItemLevel, AvgItemLevelCategory category) { SetUpdateFieldValue(ref m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.AvgItemLevel, (int)category), newItemLevel); }
|
||||
|
||||
public uint GetCustomizationChoice(uint chrCustomizationOptionId)
|
||||
{
|
||||
|
||||
@@ -1921,7 +1921,11 @@ namespace Game.Entities
|
||||
Global.CharacterCacheStorage.UpdateCharacterLevel(ToPlayer().GetGUID(), (byte)lvl);
|
||||
}
|
||||
}
|
||||
|
||||
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 Race GetRace() { return (Race)(byte)m_unitData.Race; }
|
||||
|
||||
Reference in New Issue
Block a user