From fc74e0e1fb66ce25c258ce09939f0fd93b095d30 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Thu, 16 Apr 2026 17:15:30 -0300 Subject: [PATCH] fix(Core/Vehicles): defer accessory init to avoid double install (#25486) Co-authored-by: Claude Opus 4.6 (1M context) --- src/server/game/Entities/Creature/Creature.cpp | 14 +++++++++++--- src/server/game/Entities/Creature/Creature.h | 3 +++ src/server/game/Maps/Map.cpp | 5 ----- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index c55af0698..3ef0e2071 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -713,6 +713,13 @@ void Creature::Update(uint32 diff) m_vehicleKit->Reset(); } + if (_triggerVehicleKitInit) + { + _triggerVehicleKitInit = false; + if (m_vehicleKit) + m_vehicleKit->Reset(); + } + switch (m_deathState) { case DeathState::JustRespawned: @@ -1113,9 +1120,10 @@ bool Creature::AIM_Initialize(CreatureAI* ai) IsAIEnabled = true; i_AI->InitializeAI(); - // Xinef: Initialize vehicle if it is not summoned! - if (GetVehicleKit() && m_spawnId) - GetVehicleKit()->Reset(); + // Defer vehicle kit init to the next Creature::Update tick so accessories + // install after visibility sync. + if (GetVehicleKit()) + _triggerVehicleKitInit = true; return true; } diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index c0eb2a753..147435a7d 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -536,6 +536,9 @@ private: // Formation variable CreatureGroup* m_formation; bool TriggerJustRespawned; + // Deferred vehicle init: set in AIM_Initialize, consumed on the next + // Creature::Update tick so accessories install after visibility sync. + bool _triggerVehicleKitInit = false; // Shared timer between mobs who assist another. // Damaging one extends leash range on all of them. diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 57b18d5f4..d75b89a11 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -346,11 +346,6 @@ bool Map::AddToMap(T* obj, bool checkTransport) //also, trigger needs to cast spell, if not update, cannot see visual obj->UpdateObjectVisibility(true); - // Xinef: little hack for vehicles, accessories have to be added after visibility update so they wont fall off the vehicle, moved from Creature::AIM_Initialize - // Initialize vehicle, this is done only for summoned npcs, DB creatures are handled by grid loaders - if (obj->IsCreature()) - if (Vehicle* vehicle = obj->ToCreature()->GetVehicleKit()) - vehicle->Reset(); return true; }