aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-12-28 12:14:58 +0100
committerOvahlord <dreadkiller@gmx.de>2024-12-29 22:19:27 +0100
commit97538946b4524e4f33c066cb3c032f08af8e95e4 (patch)
treee0164592c100ec1a3b44b9545a7e2a89e405d793
parent34bd46ae5c01f4d7f3fcb9aa08ad68350bdeaae3 (diff)
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
-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 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::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 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<Player>
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;