diff --git a/Source/Game/Achievements/CriteriaHandler.cs b/Source/Game/Achievements/CriteriaHandler.cs index 31b4b69bf..75c13d20a 100644 --- a/Source/Game/Achievements/CriteriaHandler.cs +++ b/Source/Game/Achievements/CriteriaHandler.cs @@ -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) diff --git a/Source/Game/Conditions/ConditionManager.cs b/Source/Game/Conditions/ConditionManager.cs index c0c5738bf..7c29540b1 100644 --- a/Source/Game/Conditions/ConditionManager.cs +++ b/Source/Game/Conditions/ConditionManager.cs @@ -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; diff --git a/Source/Game/Entities/Player/Player.Quest.cs b/Source/Game/Entities/Player/Player.Quest.cs index 4d185a6ba..2c024f6ac 100644 --- a/Source/Game/Entities/Player/Player.Quest.cs +++ b/Source/Game/Entities/Player/Player.Quest.cs @@ -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); }