From 97538946b4524e4f33c066cb3c032f08af8e95e4 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 28 Dec 2024 12:14:58 +0100 Subject: Core/Players: Added helper function to check quest completion using QuestV2 bits (cherry picked from commit d78c3bb33afeb319ef0cf09171aabd8952a928fa) # Conflicts: # src/server/game/Entities/Player/Player.cpp # src/server/game/Entities/Player/Player.h --- src/server/game/Achievements/CriteriaHandler.cpp | 5 ++--- src/server/game/Conditions/ConditionMgr.cpp | 3 +-- src/server/game/Entities/Player/Player.cpp | 14 ++++++++++++++ src/server/game/Entities/Player/Player.h | 1 + 4 files changed, 18 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index c079579b54e..ce820a80280 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -2285,9 +2285,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 ff64271c59a..cccc57784ae 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -2951,8 +2951,7 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditio std::arrayPrevQuestID)>> 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 659eef44495..9e27d57e2fb 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -15620,6 +15620,20 @@ void Player::SetQuestSlotEndTime(uint16 slot, time_t endTime) .ModifyValue(&UF::QuestLog::EndTime), uint32(endTime)); } +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 >= QUESTS_COMPLETED_BITS_SIZE) + return; + + uint64 flag = UI64LIT(1) << ((questBit - 1) % QUESTS_COMPLETED_BITS_PER_BLOCK); + return (m_activePlayerData->QuestCompleted[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 5ff839e5feb..5ac2565f7da 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1618,6 +1618,7 @@ class TC_GAME_API Player final : public Unit, public GridObject void SetQuestSlotState(uint16 slot, uint32 state); void RemoveQuestSlotState(uint16 slot, uint32 state); void SetQuestSlotEndTime(uint16 slot, time_t endTime); + bool IsQuestCompletedBitSet(uint32 questId) const; void SetQuestCompletedBit(uint32 questBit, bool completed); uint16 GetReqKillOrCastCurrentCount(uint32 quest_id, int32 entry) const; -- cgit v1.2.3