Exemple #1
0
        public Creature CreateNPCPassenger(ulong guid, CreatureData data)
        {
            Map map = GetMap();

            Creature creature = Creature.CreateCreatureFromDB(guid, map, false);

            if (!creature)
            {
                return(null);
            }

            float x = data.posX;
            float y = data.posY;
            float z = data.posZ;
            float o = data.orientation;

            creature.SetTransport(this);
            creature.m_movementInfo.transport.guid = GetGUID();
            creature.m_movementInfo.transport.pos.Relocate(x, y, z, o);
            creature.m_movementInfo.transport.seat = -1;
            CalculatePassengerPosition(ref x, ref y, ref z, ref o);
            creature.Relocate(x, y, z, o);
            creature.SetHomePosition(creature.GetPositionX(), creature.GetPositionY(), creature.GetPositionZ(), creature.GetOrientation());
            creature.SetTransportHomePosition(creature.m_movementInfo.transport.pos);

            // @HACK - transport models are not added to map's dynamic LoS calculations
            //         because the current GameObjectModel cannot be moved without recreating
            creature.AddUnitState(UnitState.IgnorePathfinding);

            if (!creature.IsPositionValid())
            {
                Log.outError(LogFilter.Transport, "Creature (guidlow {0}, entry {1}) not created. Suggested coordinates aren't valid (X: {2} Y: {3})", creature.GetGUID().ToString(), creature.GetEntry(), creature.GetPositionX(), creature.GetPositionY());
                return(null);
            }

            if (data.phaseId != 0)
            {
                creature.SetInPhase(data.phaseId, false, true);
            }
            else if (data.phaseGroup != 0)
            {
                foreach (var phase in Global.DB2Mgr.GetPhasesForGroup(data.phaseGroup))
                {
                    creature.SetInPhase(phase, false, true);
                }
            }
            else
            {
                creature.CopyPhaseFrom(this);
            }

            if (!map.AddToMap(creature))
            {
                return(null);
            }

            _staticPassengers.Add(creature);
            Global.ScriptMgr.OnAddCreaturePassenger(this, creature);
            return(creature);
        }
Exemple #2
0
        public void LeaderMoveTo(float x, float y, float z)
        {
            //! To do: This should probably get its own movement generator or use WaypointMovementGenerator.
            //! If the leader's path is known, member's path can be plotted as well using formation offsets.
            if (!m_leader)
            {
                return;
            }

            float pathangle = (float)Math.Atan2(m_leader.GetPositionY() - y, m_leader.GetPositionX() - x);

            foreach (var pair in m_members)
            {
                Creature member = pair.Key;
                if (member == m_leader || !member.IsAlive() || member.GetVictim() || !pair.Value.groupAI.HasAnyFlag((uint)GroupAIFlags.IdleInFormation))
                {
                    continue;
                }

                if (pair.Value.point_1 != 0)
                {
                    if (m_leader.GetCurrentWaypointID() == pair.Value.point_1 - 1 || m_leader.GetCurrentWaypointID() == pair.Value.point_2 - 1)
                    {
                        pair.Value.follow_angle = (float)Math.PI * 2 - pair.Value.follow_angle;
                    }
                }

                float angle = pair.Value.follow_angle;
                float dist  = pair.Value.follow_dist;

                float dx = x + (float)Math.Cos(angle + pathangle) * dist;
                float dy = y + (float)Math.Sin(angle + pathangle) * dist;
                float dz = z;

                GridDefines.NormalizeMapCoord(ref dx);
                GridDefines.NormalizeMapCoord(ref dy);

                if (!member.IsFlying())
                {
                    member.UpdateGroundPositionZ(dx, dy, ref dz);
                }

                if (member.IsWithinDist(m_leader, dist + 5.0f))
                {
                    member.SetUnitMovementFlags(m_leader.GetUnitMovementFlags());
                }
                else
                {
                    member.SetWalk(false);
                }

                member.GetMotionMaster().MovePoint(0, dx, dy, dz);
                member.SetHomePosition(dx, dy, dz, pathangle);
            }
        }
Exemple #3
0
        public Creature CreateNPCPassenger(ulong guid, CreatureData data)
        {
            Map map = GetMap();

            if (map.GetCreatureRespawnTime(guid) != 0)
            {
                return(null);
            }

            Creature creature = Creature.CreateCreatureFromDB(guid, map, false, true);

            if (!creature)
            {
                return(null);
            }

            float x, y, z, o;

            data.spawnPoint.GetPosition(out x, out y, out z, out o);

            creature.SetTransport(this);
            creature.m_movementInfo.transport.guid = GetGUID();
            creature.m_movementInfo.transport.pos.Relocate(x, y, z, o);
            creature.m_movementInfo.transport.seat = -1;
            CalculatePassengerPosition(ref x, ref y, ref z, ref o);
            creature.Relocate(x, y, z, o);
            creature.SetHomePosition(creature.GetPositionX(), creature.GetPositionY(), creature.GetPositionZ(), creature.GetOrientation());
            creature.SetTransportHomePosition(creature.m_movementInfo.transport.pos);

            // @HACK - transport models are not added to map's dynamic LoS calculations
            //         because the current GameObjectModel cannot be moved without recreating
            creature.AddUnitState(UnitState.IgnorePathfinding);

            if (!creature.IsPositionValid())
            {
                Log.outError(LogFilter.Transport, "Creature (guidlow {0}, entry {1}) not created. Suggested coordinates aren't valid (X: {2} Y: {3})", creature.GetGUID().ToString(), creature.GetEntry(), creature.GetPositionX(), creature.GetPositionY());
                return(null);
            }

            PhasingHandler.InitDbPhaseShift(creature.GetPhaseShift(), data.phaseUseFlags, data.phaseId, data.phaseGroup);
            PhasingHandler.InitDbVisibleMapId(creature.GetPhaseShift(), data.terrainSwapMap);

            if (!map.AddToMap(creature))
            {
                return(null);
            }

            _staticPassengers.Add(creature);
            Global.ScriptMgr.OnAddCreaturePassenger(this, creature);
            return(creature);
        }
Exemple #4
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();
                    }
                }
            }
        }