diff options
author | Matan Shukry <matanshukry@gmail.com> | 2021-01-29 11:50:02 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-29 10:50:02 +0100 |
commit | db6eb694656c58a817a965e2f5c85874e9c92d12 (patch) | |
tree | 34a0bec2ebf23ae6522e61d9b6bade821aefc94c /src | |
parent | d4ad9870105ca149cf6f41563ea26d5faf246fa9 (diff) |
Core/Quests: Automatically add quests with AUTO_PUSH flag to player (#25938)
* Removed check for world quests on criteria tree reset
* Quests are currently filtered by their tag to only allow untagged or tag == 0 quests (other types are unsupported)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 23 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 2 | ||||
-rw-r--r-- | src/server/game/Quests/QuestDef.h | 6 |
5 files changed, 33 insertions, 3 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index d1887e61763..a4db0980f70 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2378,6 +2378,8 @@ void Player::GiveLevel(uint8 level) UpdateCriteria(CRITERIA_TYPE_REACH_LEVEL); + PushQuests(); + sScriptMgr->OnPlayerLevelChanged(this, oldLevel); } @@ -7083,6 +7085,8 @@ void Player::UpdateArea(uint32 newArea) else _restMgr->RemoveRestFlag(REST_FLAG_IN_FACTION_AREA); + PushQuests(); + UpdateCriteria(CRITERIA_TYPE_TRAVELLED_TO_AREA, newArea); } @@ -15454,8 +15458,7 @@ void Player::AddQuest(Quest const* quest, Object* questGiver) GetReputationMgr().SetVisible(factionEntry); break; case QUEST_OBJECTIVE_CRITERIA_TREE: - if (quest->HasFlagEx(QUEST_FLAGS_EX_IS_WORLD_QUEST)) - m_questObjectiveCriteriaMgr->ResetCriteriaTree(obj.ObjectID); + m_questObjectiveCriteriaMgr->ResetCriteriaTree(obj.ObjectID); break; default: break; @@ -18756,9 +18759,23 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder) m_achievementMgr->CheckAllAchievementCriteria(this); m_questObjectiveCriteriaMgr->CheckAllQuestObjectiveCriteria(this); + + PushQuests(); return true; } +void Player::PushQuests() +{ + for (Quest const* quest : sObjectMgr->GetQuestTemplatesAutoPush()) + { + if (quest->GetQuestTag() && quest->GetQuestTag() != QuestTagType::Tag) + continue; + + if (!quest->IsUnavailable() && CanTakeQuest(quest, false)) + AddQuestAndCheckCompletion(quest, nullptr); + } +} + void Player::_LoadCUFProfiles(PreparedQueryResult result) { if (!result) @@ -19569,7 +19586,7 @@ void Player::_LoadQuestStatus(PreparedQueryResult result) uint16 slot = 0; //// 0 1 2 - //QueryResult* result = CharacterDatabase.PQuery("SELECT quest, status, timer WHERE guid = '%u'", GetGUIDLow()); + //QueryResult* result = CharacterDatabase.PQuery("SELECT quest, status, timer WHERE guid = '%u' AND status <> 0", GetGUIDLow()); if (result) { diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index feda7a0cb2c..17beaaeec1c 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2576,6 +2576,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> /*** QUEST SYSTEM ***/ /*********************************************************/ + void PushQuests(); + //We allow only one timed quest active at the same time. Below can then be simple value instead of set. typedef std::set<uint32> QuestSet; typedef std::set<uint32> SeasonalQuestSet; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 71aac285dd8..d4eb2f3ff61 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -4163,6 +4163,7 @@ void ObjectMgr::LoadQuests() for (auto itr = _questTemplates.begin(); itr != _questTemplates.end(); ++itr) delete itr->second; _questTemplates.clear(); + _questTemplatesAutoPush.clear(); _questObjectives.clear(); _exclusiveQuestGroups.clear(); @@ -4214,6 +4215,8 @@ void ObjectMgr::LoadQuests() Quest* newQuest = new Quest(fields); _questTemplates[newQuest->GetQuestId()] = newQuest; + if (newQuest->IsAutoPush()) + _questTemplatesAutoPush.push_back(newQuest); } while (result->NextRow()); struct QuestLoaderHelper diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 7e1750847cd..5ac3b87fff5 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1098,6 +1098,7 @@ class TC_GAME_API ObjectMgr } QuestMap const& GetQuestTemplates() const { return _questTemplates; } + std::vector<Quest const*> const& GetQuestTemplatesAutoPush() const { return _questTemplatesAutoPush; } QuestObjective const* GetQuestObjective(uint32 questObjectiveId) const { @@ -1701,6 +1702,7 @@ class TC_GAME_API ObjectMgr std::map<HighGuid, std::unique_ptr<ObjectGuidGeneratorBase>> _guidGenerators; QuestMap _questTemplates; + std::vector<Quest const*> _questTemplatesAutoPush; QuestObjectivesByIdContainer _questObjectives; typedef std::unordered_map<uint32, NpcText> NpcTextContainer; diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h index 945a874f4b4..2fb49a684e5 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -437,6 +437,12 @@ class TC_GAME_API Quest bool HasSpecialFlag(uint32 flag) const { return (_specialFlags & flag) != 0; } void SetSpecialFlag(uint32 flag) { _specialFlags |= flag; } + bool IsAutoPush() const { return HasFlagEx(QUEST_FLAGS_EX_AUTO_PUSH); } + bool IsWorldQuest() const { return HasFlagEx(QUEST_FLAGS_EX_IS_WORLD_QUEST); } + + // Possibly deprecated flag + bool IsUnavailable() const { return HasFlag(QUEST_FLAGS_UNAVAILABLE); } + // table data accessors: uint32 GetQuestId() const { return _id; } uint32 GetQuestType() const { return _type; } |