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;
|
break;
|
||||||
}
|
}
|
||||||
case ModifierTreeType.PlayerHasCompletedQuest: // 110
|
case ModifierTreeType.PlayerHasCompletedQuest: // 110
|
||||||
uint questBit = Global.DB2Mgr.GetQuestUniqueBitFlag(reqValue);
|
if (!referencePlayer.IsQuestCompletedBitSet(reqValue))
|
||||||
if (questBit != 0)
|
return false;
|
||||||
if ((referencePlayer.m_activePlayerData.QuestCompleted[((int)questBit - 1) >> 6] & (1ul << (((int)questBit - 1) & 63))) == 0)
|
|
||||||
return false;
|
|
||||||
break;
|
break;
|
||||||
case ModifierTreeType.PlayerIsReadyToTurnInQuest: // 111
|
case ModifierTreeType.PlayerIsReadyToTurnInQuest: // 111
|
||||||
if (referencePlayer.GetQuestStatus(reqValue) != QuestStatus.Complete)
|
if (referencePlayer.GetQuestStatus(reqValue) != QuestStatus.Complete)
|
||||||
|
|||||||
@@ -2066,11 +2066,7 @@ namespace Game
|
|||||||
results[i] = true;
|
results[i] = true;
|
||||||
|
|
||||||
for (var i = 0; i < condition.PrevQuestID.Length; ++i)
|
for (var i = 0; i < condition.PrevQuestID.Length; ++i)
|
||||||
{
|
results[i] = player.IsQuestCompletedBitSet(condition.PrevQuestID[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;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!PlayerConditionLogic(condition.PrevQuestLogic, results))
|
if (!PlayerConditionLogic(condition.PrevQuestLogic, results))
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -2415,6 +2415,20 @@ namespace Game.Entities
|
|||||||
RemoveUpdateFieldFlagValue(questLog.ModifyValue(questLog.ObjectiveFlags), 1u << objectiveIndex);
|
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)
|
void SetQuestCompletedBit(uint questBit, bool completed)
|
||||||
{
|
{
|
||||||
if (questBit == 0)
|
if (questBit == 0)
|
||||||
@@ -2425,7 +2439,7 @@ namespace Game.Entities
|
|||||||
if (fieldOffset < ActivePlayerData.QuestCompletedBitsSize)
|
if (fieldOffset < ActivePlayerData.QuestCompletedBitsSize)
|
||||||
{
|
{
|
||||||
if (completed)
|
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
|
else
|
||||||
RemoveUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.QuestCompleted, fieldOffset), flag);
|
RemoveUpdateFieldFlagValue(ref m_values.ModifyValue(m_activePlayerData).ModifyValue(m_activePlayerData.QuestCompleted, fieldOffset), flag);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user