fix(Core/Events): Prevent seasonal quests from resetting at server re… (#9708)

* fix(Core/Events): Prevent seasonal quests from resetting at server restart. Source: TrinityCore.

Fixes #6973

* Update.

* Update.

* Update.
This commit is contained in:
UltraNix
2022-01-17 04:25:17 +01:00
committed by GitHub
parent e842119605
commit 0f2c092df7
3 changed files with 29 additions and 3 deletions
+21 -2
View File
@@ -153,6 +153,13 @@ bool GameEventMgr::StartEvent(uint16 event_id, bool overwrite)
if (IsActiveEvent(event_id)) if (IsActiveEvent(event_id))
sScriptMgr->OnGameEventStart(event_id); sScriptMgr->OnGameEventStart(event_id);
// When event is started, set its worldstate to current time
auto itr = _gameEventSeasonalQuestsMap.find(event_id);
if (itr != _gameEventSeasonalQuestsMap.end() && !itr->second.empty())
{
sWorld->setWorldState(event_id, sWorld->GetGameTime());
}
return false; return false;
} }
else else
@@ -191,6 +198,9 @@ void GameEventMgr::StopEvent(uint16 event_id, bool overwrite)
RemoveActiveEvent(event_id); RemoveActiveEvent(event_id);
UnApplyEvent(event_id); UnApplyEvent(event_id);
// When event is stopped, clean up its worldstate
sWorld->setWorldState(event_id, 0);
if (overwrite && !serverwide_evt) if (overwrite && !serverwide_evt)
{ {
data.start = time(nullptr) - data.length * MINUTE; data.start = time(nullptr) - data.length * MINUTE;
@@ -832,6 +842,7 @@ void GameEventMgr::LoadFromDB()
} }
questTemplate->SetEventIdForQuest((uint16)eventEntry); questTemplate->SetEventIdForQuest((uint16)eventEntry);
_gameEventSeasonalQuestsMap[eventEntry].push_back(questId);
++count; ++count;
} while (result->NextRow()); } while (result->NextRow());
@@ -1150,6 +1161,9 @@ uint32 GameEventMgr::Update() // return the next e
} }
else else
{ {
// If event is inactive, periodically clean up its worldstate
sWorld->setWorldState(itr, 0);
if (IsActiveEvent(itr)) if (IsActiveEvent(itr))
{ {
// Xinef: do not deactivate internal events on whim // Xinef: do not deactivate internal events on whim
@@ -1207,8 +1221,6 @@ void GameEventMgr::UnApplyEvent(uint16 event_id)
UpdateEventNPCVendor(event_id, false); UpdateEventNPCVendor(event_id, false);
// update bg holiday // update bg holiday
UpdateBattlegroundSettings(); UpdateBattlegroundSettings();
// check for seasonal quest reset.
sWorld->ResetEventSeasonalQuests(event_id);
} }
void GameEventMgr::ApplyNewEvent(uint16 event_id) void GameEventMgr::ApplyNewEvent(uint16 event_id)
@@ -1238,6 +1250,13 @@ void GameEventMgr::ApplyNewEvent(uint16 event_id)
UpdateEventNPCVendor(event_id, true); UpdateEventNPCVendor(event_id, true);
// update bg holiday // update bg holiday
UpdateBattlegroundSettings(); UpdateBattlegroundSettings();
// If event's worldstate is 0, it means the event hasn't been started yet. In that case, reset seasonal quests.
// When event ends (if it expires or if it's stopped via commands) worldstate will be set to 0 again, ready for another seasonal quest reset.
if (sWorld->getWorldState(event_id) == 0)
{
sWorld->ResetEventSeasonalQuests(event_id);
}
} }
void GameEventMgr::UpdateEventNPCFlags(uint16 event_id) void GameEventMgr::UpdateEventNPCFlags(uint16 event_id)
+2
View File
@@ -161,6 +161,7 @@ private:
typedef std::list<GuidNPCFlagPair> NPCFlagList; typedef std::list<GuidNPCFlagPair> NPCFlagList;
typedef std::vector<NPCFlagList> GameEventNPCFlagMap; typedef std::vector<NPCFlagList> GameEventNPCFlagMap;
typedef std::vector<uint32> GameEventBitmask; typedef std::vector<uint32> GameEventBitmask;
typedef std::unordered_map<uint32, std::vector<uint32>> GameEventSeasonalQuestsMap;
GameEventQuestMap mGameEventCreatureQuests; GameEventQuestMap mGameEventCreatureQuests;
GameEventQuestMap mGameEventGameObjectQuests; GameEventQuestMap mGameEventGameObjectQuests;
GameEventNPCVendorMap mGameEventVendors; GameEventNPCVendorMap mGameEventVendors;
@@ -174,6 +175,7 @@ private:
GameEventNPCFlagMap mGameEventNPCFlags; GameEventNPCFlagMap mGameEventNPCFlags;
ActiveEvents m_ActiveEvents; ActiveEvents m_ActiveEvents;
bool isSystemInit; bool isSystemInit;
GameEventSeasonalQuestsMap _gameEventSeasonalQuestsMap;
public: public:
GameEventGuidMap mGameEventCreatureGuids; GameEventGuidMap mGameEventCreatureGuids;
GameEventGuidMap mGameEventGameobjectGuids; GameEventGuidMap mGameEventGameobjectGuids;
+6 -1
View File
@@ -219,6 +219,8 @@ enum riggleBassbait
QUEST_MASTER_ANGLER = 8193, QUEST_MASTER_ANGLER = 8193,
DATA_ANGLER_FINISHED = 1, DATA_ANGLER_FINISHED = 1,
GAME_EVENT_FISHING = 62
}; };
class npc_riggle_bassbait : public CreatureScript class npc_riggle_bassbait : public CreatureScript
@@ -232,7 +234,7 @@ public:
{ {
events.Reset(); events.Reset();
events.ScheduleEvent(EVENT_RIGGLE_ANNOUNCE, 1000, 1, 0); events.ScheduleEvent(EVENT_RIGGLE_ANNOUNCE, 1000, 1, 0);
finished = false; finished = sWorld->getWorldState(GAME_EVENT_FISHING) == 1;
startWarning = false; startWarning = false;
finishWarning = false; finishWarning = false;
} }
@@ -253,7 +255,10 @@ public:
void DoAction(int32 param) override void DoAction(int32 param) override
{ {
if (param == DATA_ANGLER_FINISHED) if (param == DATA_ANGLER_FINISHED)
{
finished = true; finished = true;
sWorld->setWorldState(GAME_EVENT_FISHING, 1);
}
} }
void UpdateAI(uint32 diff) override void UpdateAI(uint32 diff) override