diff options
| author | Treeston <treeston.mmoc@gmail.com> | 2019-08-04 12:22:57 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-08-04 12:22:57 +0200 |
| commit | a5e73e41c0e813e674bb0a644e0052052435494e (patch) | |
| tree | cabbeadc1e07635f1a8fc53599895613cbe61723 /src/server/game/Entities/Player | |
| parent | 15e85f882fdb7b5d1d48302907e76c993ee4e923 (diff) | |
Core/Pooling: Quest pooling rewrite: (PR#23627)
- Split quest pooling from PoolMgr (into QuestPoolMgr)
- Proper saving/restoring on server restart
- No more hacking into sObjectMgr to insert/remove available quests
Diffstat (limited to 'src/server/game/Entities/Player')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 51 |
1 files changed, 22 insertions, 29 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 392514a2f93..85346522d2d 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -74,6 +74,7 @@ #include "PoolMgr.h" #include "QueryHolder.h" #include "QuestDef.h" +#include "QuestPools.h" #include "Realm.h" #include "ReputationMgr.h" #include "SkillDiscovery.h" @@ -14486,15 +14487,15 @@ uint32 Player::GetDefaultGossipMenuForSource(WorldObject* source) void Player::PrepareQuestMenu(ObjectGuid guid) { - QuestRelationBounds objectQR; - QuestRelationBounds objectQIR; + QuestRelationResult objectQR; + QuestRelationResult objectQIR; // pets also can have quests Creature* creature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, guid); if (creature) { - objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry()); - objectQIR = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(creature->GetEntry()); + objectQR = sObjectMgr->GetCreatureQuestRelations(creature->GetEntry()); + objectQIR = sObjectMgr->GetCreatureQuestInvolvedRelations(creature->GetEntry()); } else { @@ -14505,8 +14506,8 @@ void Player::PrepareQuestMenu(ObjectGuid guid) GameObject* pGameObject = _map->GetGameObject(guid); if (pGameObject) { - objectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry()); - objectQIR = sObjectMgr->GetGOQuestInvolvedRelationBounds(pGameObject->GetEntry()); + objectQR = sObjectMgr->GetGOQuestRelations(pGameObject->GetEntry()); + objectQIR = sObjectMgr->GetGOQuestInvolvedRelations(pGameObject->GetEntry()); } else return; @@ -14515,9 +14516,8 @@ void Player::PrepareQuestMenu(ObjectGuid guid) QuestMenu &qm = PlayerTalkClass->GetQuestMenu(); qm.ClearMenu(); - for (QuestRelations::const_iterator i = objectQIR.first; i != objectQIR.second; ++i) + for (uint32 quest_id : objectQIR) { - uint32 quest_id = i->second; QuestStatus status = GetQuestStatus(quest_id); if (status == QUEST_STATUS_COMPLETE) qm.AddMenuItem(quest_id, 4); @@ -14527,9 +14527,8 @@ void Player::PrepareQuestMenu(ObjectGuid guid) // qm.AddMenuItem(quest_id, 2); } - for (QuestRelations::const_iterator i = objectQR.first; i != objectQR.second; ++i) + for (uint32 quest_id : objectQR) { - uint32 quest_id = i->second; Quest const* quest = sObjectMgr->GetQuestTemplate(quest_id); if (!quest) continue; @@ -14639,11 +14638,11 @@ bool Player::IsActiveQuest(uint32 quest_id) const Quest const* Player::GetNextQuest(ObjectGuid guid, Quest const* quest) const { - QuestRelationBounds objectQR; + QuestRelationResult quests; Creature* creature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, guid); if (creature) - objectQR = sObjectMgr->GetCreatureQuestRelationBounds(creature->GetEntry()); + quests = sObjectMgr->GetCreatureQuestRelations(creature->GetEntry()); else { //we should obtain map pointer from GetMap() in 99% of cases. Special case @@ -14652,17 +14651,14 @@ Quest const* Player::GetNextQuest(ObjectGuid guid, Quest const* quest) const ASSERT(_map); GameObject* pGameObject = _map->GetGameObject(guid); if (pGameObject) - objectQR = sObjectMgr->GetGOQuestRelationBounds(pGameObject->GetEntry()); + quests = sObjectMgr->GetGOQuestRelations(pGameObject->GetEntry()); else return nullptr; } - uint32 nextQuestID = quest->GetNextQuestInChain(); - for (QuestRelations::const_iterator itr = objectQR.first; itr != objectQR.second; ++itr) - { - if (itr->second == nextQuestID) + if (uint32 nextQuestID = quest->GetNextQuestInChain()) + if (quests.HasQuest(nextQuestID)) return sObjectMgr->GetQuestTemplate(nextQuestID); - } return nullptr; } @@ -15891,7 +15887,7 @@ bool Player::CanShareQuest(uint32 quest_id) const if (itr != m_QuestStatus.end()) { // in pool and not currently available (wintergrasp weekly, dalaran weekly) - can't share - if (sPoolMgr->IsPartOfAPool<Quest>(quest_id) && !sPoolMgr->IsSpawnedObject<Quest>(quest_id)) + if (sQuestPoolMgr->IsQuestActive(quest_id)) { SendPushToPartyResponse(this, QUEST_PARTY_MSG_CANT_BE_SHARED_TODAY); return false; @@ -15982,8 +15978,7 @@ void Player::SendQuestUpdate(uint32 questId) QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver) { - QuestRelationBounds qr; - QuestRelationBounds qir; + QuestRelationResult qr, qir; switch (questgiver->GetTypeId()) { @@ -15992,8 +15987,8 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver) if (auto ai = questgiver->ToGameObject()->AI()) if (auto questStatus = ai->GetDialogStatus(this)) return *questStatus; - qr = sObjectMgr->GetGOQuestRelationBounds(questgiver->GetEntry()); - qir = sObjectMgr->GetGOQuestInvolvedRelationBounds(questgiver->GetEntry()); + qr = sObjectMgr->GetGOQuestRelations(questgiver->GetEntry()); + qir = sObjectMgr->GetGOQuestInvolvedRelations(questgiver->GetEntry()); break; } case TYPEID_UNIT: @@ -16001,8 +15996,8 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver) if (auto ai = questgiver->ToCreature()->AI()) if (auto questStatus = ai->GetDialogStatus(this)) return *questStatus; - qr = sObjectMgr->GetCreatureQuestRelationBounds(questgiver->GetEntry()); - qir = sObjectMgr->GetCreatureQuestInvolvedRelationBounds(questgiver->GetEntry()); + qr = sObjectMgr->GetCreatureQuestRelations(questgiver->GetEntry()); + qir = sObjectMgr->GetCreatureQuestInvolvedRelations(questgiver->GetEntry()); break; } default: @@ -16013,10 +16008,9 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver) QuestGiverStatus result = DIALOG_STATUS_NONE; - for (QuestRelations::const_iterator i = qir.first; i != qir.second; ++i) + for (uint32 questId : qir) { QuestGiverStatus result2 = DIALOG_STATUS_NONE; - uint32 questId = i->second; Quest const* quest = sObjectMgr->GetQuestTemplate(questId); if (!quest) continue; @@ -16034,10 +16028,9 @@ QuestGiverStatus Player::GetQuestDialogStatus(Object* questgiver) result = result2; } - for (QuestRelations::const_iterator i = qr.first; i != qr.second; ++i) + for (uint32 questId : qr) { QuestGiverStatus result2 = DIALOG_STATUS_NONE; - uint32 questId = i->second; Quest const* quest = sObjectMgr->GetQuestTemplate(questId); if (!quest) continue; |
