Skip to content

Commit e8eb984

Browse files
NyeriahShaurenclaude
authored
fix(Core/Transports): Force transport passengers into legacy spawn group (azerothcore#25508)
Co-authored-by: Shauren <shauren.trinity@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 687ceee commit e8eb984

3 files changed

Lines changed: 29 additions & 12 deletions

File tree

src/server/game/Entities/Transport/Transport.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,9 @@ void MotionTransport::RemovePassenger(WorldObject* passenger, bool withAll)
318318
Creature* MotionTransport::CreateNPCPassenger(ObjectGuid::LowType guid, CreatureData const* data)
319319
{
320320
Map* map = GetMap();
321+
if (map->GetCreatureRespawnTime(guid))
322+
return nullptr;
323+
321324
Creature* creature = new Creature();
322325

323326
if (!creature->LoadCreatureFromDB(guid, map, false))
@@ -366,6 +369,9 @@ Creature* MotionTransport::CreateNPCPassenger(ObjectGuid::LowType guid, Creature
366369
GameObject* MotionTransport::CreateGOPassenger(ObjectGuid::LowType guid, GameObjectData const* data)
367370
{
368371
Map* map = GetMap();
372+
if (map->GetGORespawnTime(guid))
373+
return nullptr;
374+
369375
GameObject* go = new GameObject();
370376
ASSERT(!sObjectMgr->IsGameObjectStaticTransport(data->id));
371377

src/server/game/Globals/ObjectMgr.cpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2422,9 +2422,14 @@ void ObjectMgr::LoadCreatures()
24222422
data.spawntimesecs = 14 * DAY;
24232423

24242424
// Skip spawnMask check for transport maps
2425-
if (!_transportMaps.count(data.mapid) && data.spawnMask & ~spawnMasks[data.mapid])
2426-
LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {}) that have wrong spawn mask {} including not supported difficulty modes for map (Id: {}).",
2427-
spawnId, data.spawnMask, data.mapid);
2425+
if (!_transportMaps.count(data.mapid))
2426+
{
2427+
if (data.spawnMask & ~spawnMasks[data.mapid])
2428+
LOG_ERROR("sql.sql", "Table `creature` have creature (SpawnId: {}) that have wrong spawn mask {} including not supported difficulty modes for map (Id: {}).",
2429+
spawnId, data.spawnMask, data.mapid);
2430+
}
2431+
else
2432+
data.spawnGroupId = 1; // force compatibility group for transport spawns
24282433

24292434
bool ok = true;
24302435
for (uint32 diff = 0; diff < MAX_DIFFICULTY - 1 && ok; ++diff)
@@ -2955,8 +2960,13 @@ void ObjectMgr::LoadGameobjects()
29552960

29562961
data.spawnMask = fields[14].Get<uint8>();
29572962

2958-
if (!_transportMaps.count(data.mapid) && data.spawnMask & ~spawnMasks[data.mapid])
2959-
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);
2963+
if (!_transportMaps.count(data.mapid))
2964+
{
2965+
if (data.spawnMask & ~spawnMasks[data.mapid])
2966+
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);
2967+
}
2968+
else
2969+
data.spawnGroupId = 1; // force compatibility group for transport spawns
29602970

29612971
data.phaseMask = fields[15].Get<uint32>();
29622972
int16 gameEvent = fields[16].Get<int16>();
@@ -8771,11 +8781,12 @@ void ObjectMgr::LoadSpawnGroups()
87718781
uint32 oldMSTime = getMSTime();
87728782

87738783
// Reset prior state for hot-reload support
8784+
// Preserve the forced legacy group for spawns on transport maps (set in LoadCreatures/LoadGameobjects).
87748785
_spawnGroupMapStore.clear();
87758786
for (auto& [id, data] : _creatureDataStore)
8776-
data.spawnGroupId = 0;
8787+
data.spawnGroupId = _transportMaps.count(data.mapid) ? 1 : 0;
87778788
for (auto& [id, data] : _gameObjectDataStore)
8778-
data.spawnGroupId = 0;
8789+
data.spawnGroupId = _transportMaps.count(data.mapid) ? 1 : 0;
87798790

87808791
// 0 1 2
87818792
QueryResult result = WorldDatabase.Query("SELECT groupId, spawnType, spawnId FROM spawn_group");

src/server/scripts/Commands/cs_npc.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -235,11 +235,11 @@ class npc_commandscript : public CommandScript
235235
data.posZ = chr->GetTransOffsetZ();
236236
data.orientation = chr->GetTransOffsetO();
237237

238-
Creature* creature = trans->CreateNPCPassenger(guid, &data);
239-
240-
creature->SaveToDB(trans->GetGOInfo()->moTransport.mapID, 1 << map->GetSpawnMode(), chr->GetPhaseMaskForSpawn());
241-
242-
sObjectMgr->AddCreatureToGrid(guid, &data);
238+
if (Creature* creature = trans->CreateNPCPassenger(guid, &data))
239+
{
240+
creature->SaveToDB(trans->GetGOInfo()->moTransport.mapID, 1 << map->GetSpawnMode(), chr->GetPhaseMaskForSpawn());
241+
sObjectMgr->AddCreatureToGrid(guid, &data);
242+
}
243243
return true;
244244
}
245245

0 commit comments

Comments
 (0)