aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Achievements/CriteriaHandler.cpp5
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp3
-rw-r--r--src/server/game/Entities/Player/Player.cpp14
-rw-r--r--src/server/game/Entities/Player/Player.h1
4 files changed, 18 insertions, 5 deletions
diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp
index f8da019f3da..68bda62f0e9 100644
--- a/src/server/game/Achievements/CriteriaHandler.cpp
+++ b/src/server/game/Achievements/CriteriaHandler.cpp
@@ -2290,9 +2290,8 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6
break;
}
case ModifierTreeType::PlayerHasCompletedQuest: // 110
- if (uint32 questBit = sDB2Manager.GetQuestUniqueBitFlag(reqValue))
- if (!(referencePlayer->m_activePlayerData->QuestCompleted[((questBit - 1) >> 6)] & (UI64LIT(1) << ((questBit - 1) & 63))))
- return false;
+ if (!referencePlayer->IsQuestCompletedBitSet(reqValue))
+ return false;
break;
case ModifierTreeType::PlayerIsReadyToTurnInQuest: // 111
if (referencePlayer->GetQuestStatus(reqValue) != QUEST_STATUS_COMPLETE)
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index 60018c25803..91fd824f713 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -3004,8 +3004,7 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditio
std::array<bool, std::tuple_size_v<decltype(condition->PrevQuestID)>> results;
results.fill(true);
for (std::size_t i = 0; i < condition->PrevQuestID.size(); ++i)
- if (uint32 questBit = sDB2Manager.GetQuestUniqueBitFlag(condition->PrevQuestID[i]))
- results[i] = (player->m_activePlayerData->QuestCompleted[((questBit - 1) >> 6)] & (UI64LIT(1) << ((questBit - 1) & 63))) != 0;
+ results[i] = player->IsQuestCompletedBitSet(condition->PrevQuestID[i]);
if (!PlayerConditionLogic(condition->PrevQuestLogic, results))
return false;
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 373b4b42ed5..5e264b49a8e 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -16548,6 +16548,20 @@ void Player::RemoveQuestSlotObjectiveFlag(uint16 slot, int8 objectiveIndex)
.ModifyValue(&UF::QuestLog::ObjectiveFlags), 1 << objectiveIndex);
}
+bool Player::IsQuestCompletedBitSet(uint32 questId) const
+{
+ uint32 questBit = sDB2Manager.GetQuestUniqueBitFlag(questId);
+ if (!questBit)
+ return false;
+
+ uint32 fieldOffset = (questBit - 1) / QUESTS_COMPLETED_BITS_PER_BLOCK;
+ if (fieldOffset >= m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_CHARACTER_QUEST_COMPLETED_INDEX].Values.size())
+ return false;
+
+ uint64 flag = UI64LIT(1) << ((questBit - 1) % QUESTS_COMPLETED_BITS_PER_BLOCK);
+ return (m_activePlayerData->BitVectors->Values[PLAYER_DATA_FLAG_CHARACTER_QUEST_COMPLETED_INDEX].Values[fieldOffset] & flag) != 0;
+}
+
void Player::SetQuestCompletedBit(uint32 questBit, bool completed)
{
if (!questBit)
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index e19b492d2f1..246da1c4310 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1709,6 +1709,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player>
void SetQuestSlotEndTime(uint16 slot, time_t endTime);
void SetQuestSlotObjectiveFlag(uint16 slot, int8 objectiveIndex);
void RemoveQuestSlotObjectiveFlag(uint16 slot, int8 objectiveIndex);
+ bool IsQuestCompletedBitSet(uint32 questId) const;
void SetQuestCompletedBit(uint32 questBit, bool completed);
uint16 GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry) const;