Core/Players: Added helper function to check quest completion using QuestV2 bits
Port From (https://github.com/TrinityCore/TrinityCore/commit/d78c3bb33afeb319ef0cf09171aabd8952a928fa)
This commit is contained in:
@@ -1848,10 +1848,8 @@ namespace Game.Achievements
|
||||
break;
|
||||
}
|
||||
case ModifierTreeType.PlayerHasCompletedQuest: // 110
|
||||
uint questBit = Global.DB2Mgr.GetQuestUniqueBitFlag(reqValue);
|
||||
if (questBit != 0)
|
||||
if ((referencePlayer.m_activePlayerData.QuestCompleted[((int)questBit - 1) >> 6] & (1ul << (((int)questBit - 1) & 63))) == 0)
|
||||
return false;
|
||||
if (!referencePlayer.IsQuestCompletedBitSet(reqValue))
|
||||
return false;
|
||||
break;
|
||||
case ModifierTreeType.PlayerIsReadyToTurnInQuest: // 111
|
||||
if (referencePlayer.GetQuestStatus(reqValue) != QuestStatus.Complete)
|
||||
|
||||
@@ -2066,11 +2066,7 @@ namespace Game
|
||||
results[i] = true;
|
||||
|
||||
for (var i = 0; i < condition.PrevQuestID.Length; ++i)
|
||||
{
|
||||
uint questBit = Global.DB2Mgr.GetQuestUniqueBitFlag(condition.PrevQuestID[i]);
|
||||
if (questBit != 0)
|
||||
results[i] = (player.m_activePlayerData.QuestCompleted[((int)questBit - 1) >> 6] & (1ul << (((int)questBit - 1) & 63))) != 0;
|
||||
}
|
||||
results[i] = player.IsQuestCompletedBitSet(condition.PrevQuestID[i]);
|
||||
|
||||
if (!PlayerConditionLogic(condition.PrevQuestLogic, results))
|
||||
return false;
|
||||
|
||||
@@ -2415,6 +2415,20 @@ namespace Game.Entities
|
||||
RemoveUpdateFieldFlagValue(questLog.ModifyValue(questLog.ObjectiveFlags), 1u << objectiveIndex);
|
||||
}
|
||||
|
||||
public bool IsQuestCompletedBitSet(uint questId)
|
||||
{
|
||||
uint questBit = Global.DB2Mgr.GetQuestUniqueBitFlag(questId);
|
||||
if (questBit == 0)
|
||||
return false;
|
||||
|
||||
int fieldOffset = (int)(questBit - 1) / ActivePlayerData.QuestCompletedBitsPerBlock;
|
||||
if (fieldOffset >= m_activePlayerData.BitVectors.GetValue().Values[(int)PlayerDataFlag.CharacterQuestCompletedIndex].Values.Size())
|
||||
return false;
|
||||
|
||||
ulong flag = 1ul << (((int)questBit - 1) % ActivePlayerData.QuestCompletedBitsPerBlock);
|
||||
return (m_activePlayerData.BitVectors.GetValue().Values[(int)PlayerDataFlag.CharacterQuestCompletedIndex].Values[fieldOffset] & flag) != 0;
|
||||
}
|
||||
|
||||
void SetQuestCompletedBit(uint questBit, bool completed)
|
||||
{
|
||||
if (questBit == 0)
|
||||
@@ -2425,7 +2439,7 @@ namespace Game.Entities
|
||||
if (fieldOffset < ActivePlayerData.QuestCompletedBitsSize)
|
||||
{
|
||||
if (completed)
|
||||
SetUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.QuestCompleted,fieldOffset), flag);
|
||||
SetUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.QuestCompleted, fieldOffset), flag);
|
||||
else
|
||||
RemoveUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.QuestCompleted, fieldOffset), flag);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user