diff options
-rw-r--r-- | sql/updates/world/master/2025_09_23_01_world.sql | 16 | ||||
-rw-r--r-- | src/server/game/Events/GameEventMgr.cpp | 36 | ||||
-rw-r--r-- | src/server/game/Events/GameEventMgr.h | 2 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 6 |
4 files changed, 46 insertions, 14 deletions
diff --git a/sql/updates/world/master/2025_09_23_01_world.sql b/sql/updates/world/master/2025_09_23_01_world.sql new file mode 100644 index 00000000000..bf337bfd5cc --- /dev/null +++ b/sql/updates/world/master/2025_09_23_01_world.sql @@ -0,0 +1,16 @@ +ALTER TABLE `game_event` ADD `WorldStateId` INT DEFAULT NULL AFTER `holidayStage`; + +DELETE FROM `world_state` WHERE `ID` IN (521, 522, 523, 524); +INSERT INTO `world_state` (`ID`, `DefaultValue`, `MapIDs`, `AreaIDs`, `ScriptName`, `Comment`) VALUES +(521, 0, NULL, NULL, '', 'Season - Spring'), +(522, 0, NULL, NULL, '', 'Season - Summer'), +(523, 0, NULL, NULL, '', 'Season - Fall'), +(524, 0, NULL, NULL, '', 'Season - Winter'); + +SET @EENTRY := 90; +DELETE FROM `game_event` WHERE `eventEntry` BETWEEN @EENTRY+0 AND @EENTRY+3; +INSERT INTO `game_event` (`eventEntry`,`start_time`,`end_time`,`occurence`,`length`,`holiday`,`holidayStage`,`WorldStateId`,`description`,`world_event`,`announce`) VALUES +(@EENTRY+0, '2025-03-19 23:59:59', '2035-06-21 00:00:00', 525600, 133920, 0, 0, 521, 'Season - Spring', 0, 2), +(@EENTRY+1, '2025-06-20 23:59:59', '2035-09-22 00:00:00', 525600, 133920, 0, 0, 522, 'Season - Summer', 0, 2), +(@EENTRY+2, '2025-09-21 23:59:59', '2035-12-21 00:00:00', 525600, 131040, 0, 0, 523, 'Season - Fall', 0, 2), +(@EENTRY+3, '2025-12-20 23:59:59', '2036-03-20 00:00:00', 525600, 128160, 0, 0, 524, 'Season - Winter', 0, 2); 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(); |