public LineScriptTimer(
					IPoint3D from, IPoint3D to, Map map, UberScriptItem scriptSpot, TriggerObject trigObject, TimeSpan delay)
					: base(TimeSpan.Zero, TimeSpan.Zero)
				{
					if (from.X == to.X && from.Y == to.Y)
					{
						throw new UberScriptException("LineScriptTimer cannot have same from and to point!");
					}

					Priority = TimerPriority.TenMS;

					From = from;
					To = to;
					Map = map;
					ScriptSpot = scriptSpot;
					DirectionVector = new Point3D(to.X - from.X, to.Y - from.Y, to.Z - from.Z);

					double magnitude =
						Math.Sqrt(
							DirectionVector.X * DirectionVector.X + DirectionVector.Y * DirectionVector.Y +
							DirectionVector.Z * DirectionVector.Z);

					NormalizedDirectionVectorX = DirectionVector.X / magnitude;
					NormalizedDirectionVectorY = DirectionVector.Y / magnitude;
					NormalizedDirectionVectorZ = DirectionVector.Z / magnitude;

					CurrentX = from.X;
					CurrentY = from.Y;
					CurrentZ = from.Z;

					TrigObj = trigObject;
					DelayPerTick = delay;
					LastExecuted = DateTime.UtcNow;
				}
			public static void LINESCRIPT(
				TriggerObject trigObject, IPoint3D from, IPoint3D to, string scriptFile, TimeSpan delay, Map map)
			{
				if (from == null || to == null || scriptFile == null || map == null || map == Map.Internal)
				{
					return;
				}

				UberScriptItem scriptSpot = new UberScriptItem();
				XmlScript newScript = new XmlScript(scriptFile)
				{
					Name = "line"
				};

				scriptSpot.MoveToWorld(new Point3D(from), map);

				XmlAttach.AttachTo(scriptSpot, newScript);

				if (from.X == to.X && from.Y == to.Y)
				{
					newScript.Execute(trigObject, false);
					scriptSpot.Delete();
					return;
				}

				LineScriptTimer timer = new LineScriptTimer(from, to, map, scriptSpot, trigObject, delay);
				timer.Start();

				AllLineScriptTimers.Add(timer);
			}