From 8a64eb05f71c14079fc788307de1889316edaea5 Mon Sep 17 00:00:00 2001 From: zeb139 <37308742+zeb139@users.noreply.github.com> Date: Fri, 10 Oct 2025 16:55:59 -0400 Subject: [PATCH] fix(Core): Deeprun Tram Subway timer/syncronization by loading grid (#23009) --- src/server/game/Maps/TransportMgr.cpp | 42 ++++++++++++++++++--------- src/server/game/Maps/TransportMgr.h | 2 ++ 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/server/game/Maps/TransportMgr.cpp b/src/server/game/Maps/TransportMgr.cpp index f065ccf56..a024a02b9 100644 --- a/src/server/game/Maps/TransportMgr.cpp +++ b/src/server/game/Maps/TransportMgr.cpp @@ -448,31 +448,45 @@ void TransportMgr::SpawnContinentTransports() LOG_INFO("server.loading", ">> Spawned {} continent motion transports in {} ms", count, GetMSTimeDiffToNow(oldMSTime)); } + // Preloads Deeprun Tram to fix issues with Subway carts syncronization + /// @todo: This is a temporary workaround. Consider removing TransportMgr::PreloadGridsFromQuery() as part of fix. + /** + Takenbacon: "In the long run the most likely ideal fix would be to always spawn all transport types (and thus loading their grid) on map creation" + See https://github.com/azerothcore/azerothcore-wotlk/pull/23009 for more details. + */ + PreloadGridsFromQuery("SELECT map, position_x, position_y FROM gameobject g JOIN gameobject_template t ON g.id = t.entry WHERE t.type = 11 AND g.map = 369", count); + if (sWorld->getBoolConfig(CONFIG_ENABLE_CONTINENT_TRANSPORT_PRELOADING)) { // pussywizard: preload grids for continent static transports - QueryResult result2 = WorldDatabase.Query("SELECT map, position_x, position_y FROM gameobject g JOIN gameobject_template t ON g.id = t.entry WHERE t.type = 11"); + PreloadGridsFromQuery("SELECT map, position_x, position_y FROM gameobject g JOIN gameobject_template t ON g.id = t.entry WHERE t.type = 11 AND g.map != 369", count); + LOG_INFO("server.loading", ">> Preloaded grids for {} continent static transports in {} ms", count, GetMSTimeDiffToNow(oldMSTime)); + } +} - if (result2) +void TransportMgr::PreloadGridsFromQuery(std::string const& query, uint32& count) +{ + if (QueryResult result = WorldDatabase.Query(query)) + { + do { - do - { - Field* fields = result2->Fetch(); - uint16 mapId = fields[0].Get(); - float x = fields[1].Get(); - float y = fields[2].Get(); + Field* fields = result->Fetch(); + uint16 mapId = fields[0].Get(); + float x = fields[1].Get(); + float y = fields[2].Get(); - MapEntry const* mapEntry = sMapStore.LookupEntry(mapId); - if (mapEntry && !mapEntry->Instanceable()) + if (MapEntry const* mapEntry = sMapStore.LookupEntry(mapId)) + { + if (!mapEntry->Instanceable()) + { if (Map* map = sMapMgr->CreateBaseMap(mapId)) { map->LoadGrid(x, y); ++count; } - } while (result2->NextRow()); - } - - LOG_INFO("server.loading", ">> Preloaded grids for {} continent static transports in {} ms", count, GetMSTimeDiffToNow(oldMSTime)); + } + } + } while (result->NextRow()); } } diff --git a/src/server/game/Maps/TransportMgr.h b/src/server/game/Maps/TransportMgr.h index 9767ab335..6f712657e 100644 --- a/src/server/game/Maps/TransportMgr.h +++ b/src/server/game/Maps/TransportMgr.h @@ -158,6 +158,8 @@ private: TransportInstanceMap _instanceTransports; TransportAnimationContainer _transportAnimations; + + void PreloadGridsFromQuery(std::string const& query, uint32& count); }; #define sTransportMgr TransportMgr::instance()