aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp23
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp3
-rw-r--r--src/server/game/Globals/ObjectMgr.h2
-rw-r--r--src/server/game/Quests/QuestDef.h6
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; }