diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-12-28 12:14:58 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-12-28 12:14:58 +0100 |
commit | d78c3bb33afeb319ef0cf09171aabd8952a928fa (patch) | |
tree | f29f6a767463b85cdd32790b87e0a4d5ec30d449 | |
parent | 28d3c1bc2366d5b19c065c6203e2c9b2504a4b38 (diff) |
Core/Players: Added helper function to check quest completion using QuestV2 bits
-rw-r--r-- | src/server/game/Achievements/CriteriaHandler.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Conditions/ConditionMgr.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 1 |
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; |