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:
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user