From d78c3bb33afeb319ef0cf09171aabd8952a928fa 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 --- src/server/game/Entities/Player/Player.cpp | 14 ++++++++++++++ src/server/game/Entities/Player/Player.h | 1 + 2 files changed, 15 insertions(+) (limited to 'src/server/game/Entities/Player') 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 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; -- cgit v1.2.3