Exemple #1
0
        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();
                    }
                }
            }
        }