aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMeji <alvaro.megias@outlook.com>2025-09-23 15:48:58 +0200
committerGitHub <noreply@github.com>2025-09-23 15:48:58 +0200
commitc575b397c591e7051c325046204da61086a0dbb9 (patch)
tree05d2cc4f088e51888b3e533c7ae54bc9fbade255 /src
parentfa9cb13cc1b2337104999b9f369b348f7b12a942 (diff)
Core/GameEvents: Added holiday/event world state field (#31284)
Closes #30622
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Events/GameEventMgr.cpp36
-rw-r--r--src/server/game/Events/GameEventMgr.h2
-rw-r--r--src/server/game/World/World.cpp6
3 files changed, 30 insertions, 14 deletions
diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp
index 5f94a2a026f..1ac1222387a 100644
--- a/src/server/game/Events/GameEventMgr.cpp
+++ b/src/server/game/Events/GameEventMgr.cpp
@@ -217,8 +217,8 @@ void GameEventMgr::LoadFromDB()
{
{
uint32 oldMSTime = getMSTime();
- // 0 1 2 3 4 5 6 7 8 9
- QueryResult result = WorldDatabase.Query("SELECT eventEntry, UNIX_TIMESTAMP(start_time), UNIX_TIMESTAMP(end_time), occurence, length, holiday, holidayStage, description, world_event, announce FROM game_event");
+ // 0 1 2 3 4 5 6 7 8 9 10
+ QueryResult result = WorldDatabase.Query("SELECT eventEntry, UNIX_TIMESTAMP(start_time), UNIX_TIMESTAMP(end_time), occurence, length, holiday, holidayStage, WorldStateId, description, world_event, announce FROM game_event");
if (!result)
{
mGameEvent.clear();
@@ -247,9 +247,10 @@ void GameEventMgr::LoadFromDB()
pGameEvent.length = fields[4].GetUInt64();
pGameEvent.holiday_id = HolidayIds(fields[5].GetUInt32());
pGameEvent.holidayStage = fields[6].GetUInt8();
- pGameEvent.description = fields[7].GetString();
- pGameEvent.state = (GameEventState)(fields[8].GetUInt8());
- pGameEvent.announce = fields[9].GetUInt8();
+ pGameEvent.WorldStateId = fields[7].GetInt32OrNull();
+ pGameEvent.description = fields[8].GetString();
+ pGameEvent.state = (GameEventState)(fields[9].GetUInt8());
+ pGameEvent.announce = fields[10].GetUInt8();
pGameEvent.nextstart = 0;
++count;
@@ -275,9 +276,25 @@ void GameEventMgr::LoadFromDB()
continue;
}
+ if (BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(BattlegroundMgr::WeekendHolidayIdToBGType(pGameEvent.holiday_id)))
+ {
+ if (bl->HolidayWorldState)
+ {
+ if (pGameEvent.WorldStateId && *pGameEvent.WorldStateId != bl->HolidayWorldState)
+ TC_LOG_ERROR("sql.sql", "`game_event` game event id ({}) has world state id set, but holiday {} is linked to battleground, set to battlemaster world state id {}", event_id, pGameEvent.holiday_id, bl->HolidayWorldState);
+ pGameEvent.WorldStateId = bl->HolidayWorldState;
+ }
+ }
+
SetHolidayEventTime(pGameEvent);
}
+ if (pGameEvent.WorldStateId && !sWorldStateMgr->GetWorldStateTemplate(*pGameEvent.WorldStateId))
+ {
+ TC_LOG_ERROR("sql.sql", "`game_event` game event id ({}) has an invalid world state Id {}, set to 0.", event_id, *pGameEvent.WorldStateId);
+ pGameEvent.WorldStateId.reset();
+ }
+
}
while (result->NextRow());
@@ -1091,7 +1108,7 @@ void GameEventMgr::ApplyNewEvent(uint16 event_id)
TC_LOG_INFO("gameevent", "GameEvent {} \"{}\" started.", event_id, mGameEvent[event_id].description);
- // spawn positive event tagget objects
+ // spawn positive event tagged objects
GameEventSpawn(event_id);
// un-spawn negative event tagged objects
int16 event_nid = (-1) * event_id;
@@ -1501,11 +1518,8 @@ void GameEventMgr::UpdateEventQuests(uint16 event_id, bool activate)
void GameEventMgr::UpdateWorldStates(uint16 event_id, bool Activate)
{
- GameEventData const& event = mGameEvent[event_id];
- if (event.holiday_id != HOLIDAY_NONE)
- if (BattlemasterListEntry const* bl = sBattlemasterListStore.LookupEntry(BattlegroundMgr::WeekendHolidayIdToBGType(event.holiday_id)))
- if (bl->HolidayWorldState)
- sWorldStateMgr->SetValue(bl->HolidayWorldState, Activate ? 1 : 0, false, nullptr);
+ if (Optional<int32> worldStateId = mGameEvent[event_id].WorldStateId)
+ sWorldStateMgr->SetValue(*worldStateId, Activate ? 1 : 0, false, nullptr);
}
GameEventMgr::GameEventMgr() : isSystemInit(false)
diff --git a/src/server/game/Events/GameEventMgr.h b/src/server/game/Events/GameEventMgr.h
index 5354f0b87ce..94eccce91fb 100644
--- a/src/server/game/Events/GameEventMgr.h
+++ b/src/server/game/Events/GameEventMgr.h
@@ -22,6 +22,7 @@
#include "SharedDefines.h"
#include "Define.h"
#include "ObjectGuid.h"
+#include "Optional.h"
#include <list>
#include <map>
#include <set>
@@ -68,6 +69,7 @@ struct GameEventData
uint32 length; // length of the event (minutes) after finishing all conditions
HolidayIds holiday_id;
uint8 holidayStage;
+ Optional<int32> WorldStateId;
GameEventState state; // state of the game event, these are saved into the game_event table on change!
GameEventConditionMap conditions; // conditions to finish
std::set<uint16 /*gameevent id*/> prerequisite_events; // events that must be completed before starting this event
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 29cfd080ae1..2776b10628e 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1610,6 +1610,9 @@ bool World::SetInitialWorldSettings()
TC_LOG_INFO("server.loading", "Loading Quest Pooling Data...");
sQuestPoolMgr->LoadFromDB(); // must be after quest templates
+ TC_LOG_INFO("server.loading", "Loading World State templates...");
+ sWorldStateMgr->LoadFromDB(); // must be loaded before battleground, outdoor PvP, game events and conditions
+
TC_LOG_INFO("server.loading", "Loading Game Event Data..."); // must be after loading pools fully
sGameEventMgr->LoadFromDB();
@@ -1842,9 +1845,6 @@ bool World::SetInitialWorldSettings()
TC_LOG_INFO("server.loading", "Loading Creature Formations...");
sFormationMgr->LoadCreatureFormations();
- TC_LOG_INFO("server.loading", "Loading World State templates...");
- sWorldStateMgr->LoadFromDB(); // must be loaded before battleground, outdoor PvP and conditions
-
TC_LOG_INFO("server.loading", "Loading Persistend World Variables...");
LoadPersistentWorldVariables();