Example #1
0
		public static void FlyUnit(Unit unit, bool startFlight, LinkedListNode<PathVertex> startNode)
		{
			if (unit.TaxiPaths.Count < 1)
			{
				throw new InvalidOperationException("Tried to fly Unit without Path given.");
			}

			var path = unit.TaxiPaths.Peek();

			// Stop combat
			unit.IsInCombat = false;

			// Cannot be invisible when flying
			unit.Stealthed = 0;

			if (startFlight)
			{
				// Regulators, Mount Up!
				var mount = NPCMgr.GetEntry(unit.Faction.IsAlliance ? path.From.AllianceMountId : path.From.HordeMountId);
				if (mount != null)
				{
					var mountId = mount.GetRandomModel().DisplayId;
					unit.Mount(mountId);
					if (unit is Character)
					{
						unit.PushFieldUpdateToPlayer((Character)unit, UnitFields.MOUNTDISPLAYID, mountId);
					}
				}

				unit.OnTaxiStart();
			}

			unit.LatestTaxiPathNode = startNode ?? path.Nodes.First;
			//var next = unit.LatestPathNode.Next.Value;
			if (unit.LatestTaxiPathNode == path.Nodes.First)
			{
				// new flight
				unit.taxiTime = 0;
				MovementHandler.SendMoveToPacket(unit, path.PathTime, MonsterMoveFlags.Fly, path.Nodes);
			}
			else
			{
				// continue:
				// set time to the amount that it takes to get this far along the path
				// ReSharper disable PossibleNullReferenceException
				unit.taxiTime = startNode.Previous.Value.TimeFromStart +
					(int)((1000 * startNode.Value.Pos.GetDistance(unit.Position)) / AirSpeed);
				// ReSharper restore PossibleNullReferenceException
				MovementHandler.SendMoveToPacket(unit, AirSpeed, MonsterMoveFlags.Fly, startNode);
			}
		}