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); }
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); } }
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); }
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(); } } } }