void UpdatePassengerPositions(HashSet <WorldObject> passengers) { foreach (var passenger in passengers) { // transport teleported but passenger not yet (can happen for players) if (passenger.GetMap() != GetMap()) { continue; } // if passenger is on vehicle we have to assume the vehicle is also on transport // and its the vehicle that will be updating its passengers Unit unit = passenger.ToUnit(); if (unit) { if (unit.GetVehicle() != null) { continue; } } // Do not use Unit.UpdatePosition here, we don't want to remove auras // as if regular movement occurred float x, y, z, o; passenger.m_movementInfo.transport.pos.GetPosition(out x, out y, out z, out o); CalculatePassengerPosition(ref x, ref y, ref z, ref o); switch (passenger.GetTypeId()) { case TypeId.Unit: { Creature creature = passenger.ToCreature(); GetMap().CreatureRelocation(creature, x, y, z, o, false); creature.GetTransportHomePosition(out x, out y, out z, out o); CalculatePassengerPosition(ref x, ref y, ref z, ref o); creature.SetHomePosition(x, y, z, o); break; } case TypeId.Player: if (passenger.IsInWorld) { GetMap().PlayerRelocation(passenger.ToPlayer(), x, y, z, o); } break; case TypeId.GameObject: GetMap().GameObjectRelocation(passenger.ToGameObject(), x, y, z, o, false); passenger.ToGameObject().RelocateStationaryPosition(x, y, z, o); break; case TypeId.DynamicObject: GetMap().DynamicObjectRelocation(passenger.ToDynamicObject(), x, y, z, o); break; case TypeId.AreaTrigger: GetMap().AreaTriggerRelocation(passenger.ToAreaTrigger(), x, y, z, o); break; default: break; } if (unit != null) { Vehicle vehicle = unit.GetVehicleKit(); if (vehicle != null) { vehicle.RelocatePassengers(); } } } }