Core/Players: Implemented PlayerDataElementAccount, PlayerDataElementCharacter, PlayerDataFlagAccount and PlayerDataFlagCharacter

Port From (https://github.com/TrinityCore/TrinityCore/commit/60400d25f5fff2dabd4aa74bbdbc0d2370360a35)
This commit is contained in:
Hondacrx
2025-08-19 16:29:13 -04:00
parent df197587a3
commit a9fc9f454f
18 changed files with 710 additions and 26 deletions
+171 -1
View File
@@ -5027,7 +5027,7 @@ namespace Game.Entities
reward.Money = playerChoiceResponseTemplate.Reward.Money;
reward.Xp = playerChoiceResponseTemplate.Reward.Xp;
void fillRewardItems<T>(List<T> src, List<Networking.Packets.PlayerChoiceResponseRewardEntry> dest)
void fillRewardItems<T>(List<T> src, List<Networking.Packets.PlayerChoiceResponseRewardEntry> dest)
{
for (var j = 0; j < src.Count; ++j)
{
@@ -5077,6 +5077,176 @@ namespace Game.Entities
return ConditionManager.IsPlayerMeetingCondition(this, conditionId);
}
public dynamic GetDataElementAccount(uint dataElementId)
{
var entry = CliDB.PlayerDataElementAccountStorage.LookupByKey(dataElementId);
if (entry == null)
return 0L;
switch (entry.GetElementType())
{
case PlayerDataElementType.Int64:
if (entry.StorageIndex < m_activePlayerData.AccountDataElements.Size())
return m_activePlayerData.AccountDataElements[entry.StorageIndex].Int64Value;
return 0L;
case PlayerDataElementType.Float:
if (entry.StorageIndex < m_activePlayerData.AccountDataElements.Size())
return (0, m_activePlayerData.AccountDataElements[entry.StorageIndex].FloatValue);
return 0.0f;
default:
break;
}
return 0L;
}
public void SetDataElementAccount(uint dataElementId, dynamic value)
{
var entry = CliDB.PlayerDataElementAccountStorage.LookupByKey(dataElementId);
if (entry == null)
return;
PlayerDataElement elementSetter = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.AccountDataElements, entry.StorageIndex);
SetUpdateFieldValue(ref elementSetter.Type, (uint)entry.Type);
switch (entry.GetElementType())
{
case PlayerDataElementType.Int64:
{
long int64Value = value;
SetUpdateFieldValue(ref elementSetter.Int64Value, int64Value);
GetSession().SetPlayerDataElementAccount(dataElementId, int64Value);
break;
}
case PlayerDataElementType.Float:
{
float floatValue = value;
SetUpdateFieldValue(ref elementSetter.FloatValue, floatValue);
GetSession().SetPlayerDataElementAccount(dataElementId, floatValue);
break;
}
default:
break;
}
}
public dynamic GetDataElementCharacter(uint dataElementId)
{
var entry = CliDB.PlayerDataElementCharacterStorage.LookupByKey(dataElementId);
if (entry == null)
return 0L;
switch (entry.GetElementType())
{
case PlayerDataElementType.Int64:
if (entry.StorageIndex < m_activePlayerData.CharacterDataElements.Size())
return m_activePlayerData.CharacterDataElements[entry.StorageIndex].Int64Value;
return 0L;
case PlayerDataElementType.Float:
if (entry.StorageIndex < m_activePlayerData.CharacterDataElements.Size())
return m_activePlayerData.CharacterDataElements[entry.StorageIndex].FloatValue;
return 0.0f;
default:
break;
}
return 0L;
}
public void SetDataElementCharacter(uint dataElementId, dynamic value)
{
var entry = CliDB.PlayerDataElementCharacterStorage.LookupByKey(dataElementId);
if (entry == null)
return;
PlayerDataElement elementSetter = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.CharacterDataElements, entry.StorageIndex);
SetUpdateFieldValue(ref elementSetter.Type, (uint)entry.Type);
switch (entry.GetElementType())
{
case PlayerDataElementType.Int64:
SetUpdateFieldValue(ref elementSetter.Int64Value, value);
break;
case PlayerDataElementType.Float:
SetUpdateFieldValue(ref elementSetter.FloatValue, value);
break;
default:
break;
}
_playerDataElementsNeedSave.Add(dataElementId);
}
public bool HasDataFlagAccount(uint dataFlagId)
{
var entry = CliDB.PlayerDataFlagAccountStorage.LookupByKey(dataFlagId);
if (entry == null)
return false;
int fieldOffset = entry.StorageIndex / PlayerConst.DataFlagValueBits;
ulong flag = 1UL << (entry.StorageIndex % PlayerConst.DataFlagValueBits);
if (fieldOffset >= m_activePlayerData.BitVectors.GetValue().Values[(int)PlayerDataFlag.AccountDataIndex].Values.Size())
return false;
return (m_activePlayerData.BitVectors.GetValue().Values[(int)PlayerDataFlag.AccountDataIndex].Values[fieldOffset] & flag) != 0;
}
public void SetDataFlagAccount(uint dataFlagId, bool on)
{
var entry = CliDB.PlayerDataFlagAccountStorage.LookupByKey(dataFlagId);
if (entry == null)
return;
int fieldOffset = entry.StorageIndex / PlayerConst.DataFlagValueBits;
ulong flag = 1UL << (entry.StorageIndex % PlayerConst.DataFlagValueBits);
BitVectors bitVectors = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BitVectors);
BitVector bitVector = bitVectors.ModifyValue(bitVectors.Values, (int)PlayerDataFlag.AccountDataIndex);
if (on)
SetUpdateFieldFlagValue(bitVector.ModifyValue(bitVector.Values, fieldOffset), flag);
else
RemoveUpdateFieldFlagValue(bitVector.ModifyValue(bitVector.Values, fieldOffset), flag);
GetSession().SetPlayerDataFlagAccount(dataFlagId, on);
}
public bool HasDataFlagCharacter(uint dataFlagId)
{
var entry = CliDB.PlayerDataFlagCharacterStorage.LookupByKey(dataFlagId);
if (entry == null)
return false;
int fieldOffset = entry.StorageIndex / PlayerConst.DataFlagValueBits;
ulong flag = 1UL << (entry.StorageIndex % PlayerConst.DataFlagValueBits);
if (fieldOffset >= m_activePlayerData.BitVectors.GetValue().Values[(int)PlayerDataFlag.CharacterDataIndex].Values.Size())
return false;
return (m_activePlayerData.BitVectors.GetValue().Values[(int)PlayerDataFlag.CharacterDataIndex].Values[fieldOffset] & flag) != 0;
}
public void SetDataFlagCharacter(uint dataFlagId, bool on)
{
var entry = CliDB.PlayerDataFlagCharacterStorage.LookupByKey(dataFlagId);
if (entry == null)
return;
int fieldOffset = entry.StorageIndex / PlayerConst.DataFlagValueBits;
ulong flag = 1UL << (entry.StorageIndex % PlayerConst.DataFlagValueBits);
BitVectors bitVectors = m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.BitVectors);
BitVector bitVector = bitVectors.ModifyValue(bitVectors.Values, (int)PlayerDataFlag.CharacterDataIndex);
if (on)
SetUpdateFieldFlagValue(bitVector.ModifyValue(bitVector.Values, fieldOffset), flag);
else
RemoveUpdateFieldFlagValue(bitVector.ModifyValue(bitVector.Values, fieldOffset), flag);
_playerDataFlagsNeedSave.Add((uint)fieldOffset);
}
bool IsInFriendlyArea()
{
var areaEntry = CliDB.AreaTableStorage.LookupByKey(GetAreaId());