Example #1
0
        public DockTaskGenerator(MyGridProgram program, IAutopilot autopilot, IDockingSubsystem ds)
        {
            Program          = program;
            Autopilot        = autopilot;
            DockingSubsystem = ds;

            holdTask     = new WaypointTask(Program, Autopilot, new Waypoint(), WaypointTask.AvoidObstacleMode.Avoid, DockingSubsystem.Connector);
            approachTask = new WaypointTask(Program, Autopilot, new Waypoint(), WaypointTask.AvoidObstacleMode.SmartEnter, DockingSubsystem.Connector);
            enterTask    = new WaypointTask(Program, Autopilot, new Waypoint(), WaypointTask.AvoidObstacleMode.DoNotAvoid, DockingSubsystem.Connector);
            closeTask    = new WaypointTask(Program, Autopilot, new Waypoint(), WaypointTask.AvoidObstacleMode.DoNotAvoid, DockingSubsystem.Connector);
            dockTask     = new DockTask(DockingSubsystem);
            Task         = new MoveToAndDockTask();
            Task.Reset(holdTask, approachTask, enterTask, closeTask, dockTask, MyTuple.Create(IntelItemType.NONE, (long)1234), Program, MyCubeSize.Small, DockingSubsystem.Connector, DockingSubsystem.DirectionIndicator);
            Task.Do(new Dictionary <MyTuple <IntelItemType, long>, IFleetIntelligence>(), TimeSpan.FromSeconds(1), null);
            dockTask.Do(new Dictionary <MyTuple <IntelItemType, long>, IFleetIntelligence>(), TimeSpan.Zero, null);
            holdTask.Do(new Dictionary <MyTuple <IntelItemType, long>, IFleetIntelligence>(), TimeSpan.Zero, null);
            new WaitTask().Do(new Dictionary <MyTuple <IntelItemType, long>, IFleetIntelligence>(), TimeSpan.Zero, null);
        }
Example #2
0
        public override void Do(Dictionary <MyTuple <IntelItemType, long>, IFleetIntelligence> IntelItems, TimeSpan canonicalTime, Profiler profiler)
        {
            if (!IntelItems.ContainsKey(IntelKey))
            {
                Aborted = true;
                TaskQueue.Clear();
                return;
            }

            DockIntel dock = (DockIntel)IntelItems[IntelKey];

            Vector3D dockPosition = dock.GetPositionFromCanonicalTime(canonicalTime);

            Vector3 approachPoint = dock.WorldMatrix.Forward * dock.UndockFar + dockPosition;
            Vector3 entryPoint    = dock.WorldMatrix.Forward * (dock.UndockNear + (DockSize == MyCubeSize.Large ? 1.25f : 0.5f) + 1) + dockPosition;
            Vector3 closePoint    = dock.WorldMatrix.Forward * (dock.UndockNear + (DockSize == MyCubeSize.Large ? 1f : 0.25f)) + dockPosition;

            Vector3 dockDirection = dock.WorldMatrix.Backward;

            Vector3D dockToMeDir  = Program.Me.WorldMatrix.Translation - dockPosition;
            double   dockToMeDist = dockToMeDir.Length();

            ApproachEntrance.Destination.Direction = dockDirection;
            if (dockToMeDist < 250 && dockToMeDist > 150)
            {
                EnterHoldingPattern.Destination.Position = Vector3D.Zero;
            }
            else
            {
                dockToMeDir.Normalize();
                Vector3 holdPoint = dockToMeDir * 200 + dockPosition;
                EnterHoldingPattern.Destination.Position = holdPoint;
                EnterHoldingPattern.Destination.Velocity = dock.GetVelocity();
            }

            ApproachEntrance.Destination.Direction = dockDirection;
            ApproachEntrance.Destination.Position  = approachPoint;
            ApproachEntrance.Destination.Velocity  = dock.GetVelocity();

            ApproachDock.Destination.Direction = dockDirection;
            ApproachDock.Destination.Position  = entryPoint;
            ApproachDock.Destination.Velocity  = dock.GetVelocity();

            FinalAdjustToDock.Destination.Direction = dockDirection;
            FinalAdjustToDock.Destination.Position  = closePoint;
            FinalAdjustToDock.Destination.Velocity  = dock.GetVelocity();

            if (Indicator != null && dock.IndicatorDir != Vector3D.Zero)
            {
                //Matrix.CreateWorld(Connector.WorldMatrix.Translation, Connector.WorldMatrix.Forward, Indicator.WorldMatrix.Forward);

                var tDir = Vector3D.TransformNormal(Vector3D.TransformNormal(dock.IndicatorDir, MatrixD.Transpose(MatrixD.CreateFromDir(Connector.WorldMatrix.Forward, Indicator.WorldMatrix.Forward))), Connector.WorldMatrix);
                ApproachEntrance.Destination.DirectionUp  = tDir;
                ApproachDock.Destination.DirectionUp      = tDir;
                FinalAdjustToDock.Destination.DirectionUp = tDir;
            }

            if (TaskQueue.Count < 6)
            {
                Program.IGC.SendBroadcastMessage(dock.HangarChannelTag, MyTuple.Create(Program.Me.CubeGrid.EntityId, dock.ID, (int)HangarRequest.RequestDock));
                Program.IGC.SendBroadcastMessage(dock.HangarChannelTag, MyTuple.Create(Program.Me.CubeGrid.EntityId, dock.ID, (int)HangarRequest.Reserve));
                if (dock.OwnerID == Program.Me.CubeGrid.EntityId && (dock.Status & HangarStatus.Docking) != 0)
                {
                    WaitForClearance.Status = TaskStatus.Complete;
                }
            }

            if (TaskQueue.Count == 4 && (ApproachEntrance.Autopilot.Reference.GetPosition() - approachPoint).LengthSquared() < 1)
            {
                TaskQueue.Dequeue();
            }

            if (TaskQueue.Count == 3 && (ApproachDock.Autopilot.Reference.GetPosition() - entryPoint).LengthSquared() < 0.5)
            {
                TaskQueue.Dequeue();
            }

            if (TaskQueue.Count < 3)
            {
                if (DockTask.DockingSubsystem.Connector.Status == MyShipConnectorStatus.Connectable)
                {
                    FinalAdjustToDock.Autopilot.Clear();
                    DockTask.Do(IntelItems, canonicalTime, profiler);
                    TaskQueue.Clear();
                }
            }

            base.Do(IntelItems, canonicalTime, profiler);
        }