From e8eb9843dd8705dc59293cb92d679ee832046fb5 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 19 Apr 2026 21:22:02 -0300 Subject: [PATCH] fix(Core/Transports): Force transport passengers into legacy spawn group (#25508) Co-authored-by: Shauren Co-authored-by: Claude Opus 4.6 --- .../game/Entities/Transport/Transport.cpp | 6 +++++ src/server/game/Globals/ObjectMgr.cpp | 25 +++++++++++++------ src/server/scripts/Commands/cs_npc.cpp | 10 ++++---- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index ec12d2572..0bbe0fae6 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -318,6 +318,9 @@ void MotionTransport::RemovePassenger(WorldObject* passenger, bool withAll) Creature* MotionTransport::CreateNPCPassenger(ObjectGuid::LowType guid, CreatureData const* data) { Map* map = GetMap(); + if (map->GetCreatureRespawnTime(guid)) + return nullptr; + Creature* creature = new Creature(); if (!creature->LoadCreatureFromDB(guid, map, false)) @@ -366,6 +369,9 @@ Creature* MotionTransport::CreateNPCPassenger(ObjectGuid::LowType guid, Creature GameObject* MotionTransport::CreateGOPassenger(ObjectGuid::LowType guid, GameObjectData const* data) { Map* map = GetMap(); + if (map->GetGORespawnTime(guid)) + return nullptr; + GameObject* go = new GameObject(); ASSERT(!sObjectMgr->IsGameObjectStaticTransport(data->id)); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 9319a50d4..ded80406b 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2422,9 +2422,14 @@ void ObjectMgr::LoadCreatures() data.spawntimesecs = 14 * DAY; // Skip spawnMask check for transport maps - if (!_transportMaps.count(data.mapid) && data.spawnMask & ~spawnMasks[data.mapid]) - LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {}) that have wrong spawn mask {} including not supported difficulty modes for map (Id: {}).", - spawnId, data.spawnMask, data.mapid); + if (!_transportMaps.count(data.mapid)) + { + if (data.spawnMask & ~spawnMasks[data.mapid]) + LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {}) that have wrong spawn mask {} including not supported difficulty modes for map (Id: {}).", + spawnId, data.spawnMask, data.mapid); + } + else + data.spawnGroupId = 1; // force compatibility group for transport spawns bool ok = true; for (uint32 diff = 0; diff < MAX_DIFFICULTY - 1 && ok; ++diff) @@ -2955,8 +2960,13 @@ void ObjectMgr::LoadGameobjects() data.spawnMask = fields[14].Get(); - if (!_transportMaps.count(data.mapid) && data.spawnMask & ~spawnMasks[data.mapid]) - LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) that has wrong spawn mask {} including not supported difficulty modes for map (Id: {}), skip", guid, data.id, data.spawnMask, data.mapid); + if (!_transportMaps.count(data.mapid)) + { + if (data.spawnMask & ~spawnMasks[data.mapid]) + LOG_ERROR("sql.sql", "Table `gameobject` has gameobject (GUID: {} Entry: {}) that has wrong spawn mask {} including not supported difficulty modes for map (Id: {}), skip", guid, data.id, data.spawnMask, data.mapid); + } + else + data.spawnGroupId = 1; // force compatibility group for transport spawns data.phaseMask = fields[15].Get(); int16 gameEvent = fields[16].Get(); @@ -8771,11 +8781,12 @@ void ObjectMgr::LoadSpawnGroups() uint32 oldMSTime = getMSTime(); // Reset prior state for hot-reload support + // Preserve the forced legacy group for spawns on transport maps (set in LoadCreatures/LoadGameobjects). _spawnGroupMapStore.clear(); for (auto& [id, data] : _creatureDataStore) - data.spawnGroupId = 0; + data.spawnGroupId = _transportMaps.count(data.mapid) ? 1 : 0; for (auto& [id, data] : _gameObjectDataStore) - data.spawnGroupId = 0; + data.spawnGroupId = _transportMaps.count(data.mapid) ? 1 : 0; // 0 1 2 QueryResult result = WorldDatabase.Query("SELECT groupId, spawnType, spawnId FROM spawn_group"); diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index ce70b772e..84b5f430b 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -235,11 +235,11 @@ public: data.posZ = chr->GetTransOffsetZ(); data.orientation = chr->GetTransOffsetO(); - Creature* creature = trans->CreateNPCPassenger(guid, &data); - - creature->SaveToDB(trans->GetGOInfo()->moTransport.mapID, 1 << map->GetSpawnMode(), chr->GetPhaseMaskForSpawn()); - - sObjectMgr->AddCreatureToGrid(guid, &data); + if (Creature* creature = trans->CreateNPCPassenger(guid, &data)) + { + creature->SaveToDB(trans->GetGOInfo()->moTransport.mapID, 1 << map->GetSpawnMode(), chr->GetPhaseMaskForSpawn()); + sObjectMgr->AddCreatureToGrid(guid, &data); + } return true; }