private bool MakeTask(string name)
        {
            if (!UI.MiningTasks.ContainsKey(name))
            {
                return(false);
            }


            mineTask = UI.MiningTasks[name];

            if (mineTask == null || !gps.Load(mineTask.MiningZone))
            {
                return(false);
            }


            foreach (var vein in mineTask.IgnoreVeins)
            {
                mining.AddIgnorePhases(MiningNodes.GetPhasesByName(vein));
            }


            if ((stats == null) || (stats.ZoneName != mineTask.MiningZone) || UI.ResetStats())
            {
                stats                  = new Statistics(UI);
                stats.ZoneName         = mineTask.MiningZone;
                stats.LaborStartedWith = Host.me.laborPoints;
            }


            return(mineTask != null && stats != null);
        }
Example #2
0
        private void LoadTask(string name)
        {
            if (!miningTasks.ContainsKey(name))
            {
                return;
            }


            MineTask mineTask = null;

            try
            {
                mineTask = miningTasks[name];
            }
            catch
            {
                return;
            }

            // Lock events
            isLoadingTask = true;


            Utils.InvokeOn(this, () =>
            {
                if (mineTask.MiningZone != string.Empty)
                {
                    int index = cmbox_ZonesList.Items.IndexOf(mineTask.MiningZone);

                    if (index != -1)
                    {
                        cmbox_ZonesList.SelectedIndex = index;
                    }
                }

                foreach (var item in chklbox_IgnoreVeins.Items.OfType <string>().ToArray())
                {
                    int index = chklbox_IgnoreVeins.Items.IndexOf(item);

                    chklbox_IgnoreVeins.SetItemChecked(index, (mineTask.IgnoreVeins.Contains(item)));
                }

                num_TaskTime.Value         = mineTask.TaskTime;
                chkbox_UseTaskTIme.Checked = mineTask.UseTaskTime;

                // ...
            });

            // Unlock events
            isLoadingTask = false;
        }
Example #3
0
        public MineTask GetTask()
        {
            var task = new MineTask();

            Utils.InvokeOn(this, () =>
            {
                task.Name        = lbox_MiningTasks.GetItemText(lbox_MiningTasks.SelectedItem);
                task.MiningZone  = cmbox_ZonesList.GetItemText(cmbox_ZonesList.SelectedItem);
                task.IgnoreVeins = chklbox_IgnoreVeins.CheckedItems.OfType <string>().ToList();
                task.TaskTime    = (int)num_TaskTime.Value;
                task.UseTaskTime = chkbox_UseTaskTIme.Checked;
            });

            return(task);
        }
        private void InputHistory_InputAdded()
        {
            HistoricalInput last = InputHistory.History.Last();

            if (last.ActionSelected == ActionSelected.Mine)
            {
                foreach (MagicalLifeAPI.GUI.Selectable item in last.Selected)
                {
                    Tile tile = World.GetTile(RenderInfo.Dimension, item.MapLocation.X, item.MapLocation.Y);

                    if (tile.Resources != null && tile.ImpendingAction == ActionSelected.None)
                    {
                        MineTask task = new MineTask(tile.MapLocation, Guid.NewGuid());
                        tile.ImpendingAction = ActionSelected.Mine;
                        TaskManager.Manager.AddTask(task);
                    }
                }
            }
        }
        public void Do(Dictionary <MyTuple <IntelItemType, long>, IFleetIntelligence> IntelItems, TimeSpan canonicalTime, Profiler profiler)
        {
            if (canonicalTime == TimeSpan.Zero)
            {
                return;
            }
            if (MiningSystem.Recalling > 0 || currentPosition > 120)
            {
                Recalling = true;
            }
            if (Recalling && state < 3)
            {
                state = 3;
            }
            if (state == 1) // Diving to surface of asteroid
            {
                MineTask.Do(IntelItems, canonicalTime, profiler);
                MineTask.Destination.MaxSpeed = Autopilot.GetMaxSpeedFromBrakingDistance(kFarSensorDist);

                if (MineTask.Status == TaskStatus.Complete || !MiningSystem.SensorsFarClear())
                {
                    EntryPoint = Autopilot.Reference.WorldMatrix.Translation + MineTask.Destination.Direction * (kFarSensorDist - 10);
                    MineTask.Destination.MaxSpeed = 1f;
                    state = 2;
                }
            }
            else if (state == 2) // Boring tunnel
            {
                bool   sampleHome      = false;
                double distToMiningEnd = (Autopilot.Reference.WorldMatrix.Translation - MiningEnd).Length();
                if (MiningSystem.SensorsClear())
                {
                    MineTask.Destination.Position = MiningEnd;
                }
                else if (MiningSystem.SensorsBack())
                {
                    MineTask.Destination.Position = EntryPoint;
                }
                else
                {
                    MineTask.Destination.Position = Vector3D.Zero;
                    if (SampleCount <= 0)
                    {
                        SampleCount = kSampleFrequency;
                        var cargoPercentage = MonitorSubsystem.GetPercentage(MonitorOptions.Cargo);
                        if (LastSampleCargoPercentages.Count >= kMaxSampleCount)
                        {
                            LastSampleCargoPercentages.Enqueue(cargoPercentage);

                            var sampleGreater     = 0;
                            var sampleLesser      = 0;
                            var comparePercentage = LastSampleCargoPercentages.Dequeue() + 0.00001;
                            foreach (var percentage in LastSampleCargoPercentages)
                            {
                                if (percentage > comparePercentage)
                                {
                                    sampleGreater++;
                                }
                                else
                                {
                                    sampleLesser++;
                                }
                            }

                            if (sampleGreater > sampleLesser)
                            {
                                if (!HitOre)
                                {
                                    HitOre = true;
                                    var currentCoords = GetMiningPosition(currentPosition);
                                    miningMatrix[currentCoords.X + 5, currentCoords.Y + 5] = 1;
                                }
                                if (LowestExpectedOreDist == -1)
                                {
                                    LowestExpectedOreDist = (float)distToMiningEnd - 5;
                                }
                            }
                            else
                            {
                                if (HitOre || distToMiningEnd < LowestExpectedOreDist)
                                {
                                    sampleHome = true;

                                    if (!HitOre)
                                    {
                                        var currentCoords = GetMiningPosition(currentPosition);
                                        miningMatrix[currentCoords.X + 5, currentCoords.Y + 5] = 2;
                                    }
                                }
                            }
                        }
                        else
                        {
                            LastSampleCargoPercentages.Enqueue(cargoPercentage);
                        }
                    }
                    else
                    {
                        SampleCount--;
                    }
                }

                MiningSystem.Drill();
                MineTask.Do(IntelItems, canonicalTime, profiler);

                if (GoHomeCheck() || MiningSystem.SensorsFarClear() || distToMiningEnd < 4 || sampleHome)
                {
                    if (MiningSystem.SensorsFarClear() || distToMiningEnd < 4 || sampleHome)
                    {
                        UpdateMiningMatrix(currentPosition);
                        IncrementCurrentPosition();
                        HitOre = false;
                    }
                    state = 3;
                    MineTask.Destination.MaxSpeed = 2;
                    LastSampleCargoPercentages.Clear();
                }
            }
            else if (state == 3) // Exiting tunnel
            {
                MiningSystem.StopDrill();
                if (MineTask.Destination.Position != ExitPoint)
                {
                    MineTask.Destination.Position = EntryPoint;
                }
                MineTask.Do(IntelItems, canonicalTime, profiler);
                if (MineTask.Status == TaskStatus.Complete)
                {
                    if (MineTask.Destination.Position == EntryPoint)
                    {
                        MineTask.Destination.Position = ExitPoint;
                        MineTask.Destination.MaxSpeed = 100;
                    }
                    else
                    {
                        state = 10;
                    }
                }
            }
            else if (state == 10) // Resuming to approach point
            {
                if (GoHomeCheck() || Recalling)
                {
                    state = 4;
                }
                else
                {
                    LeadTask.Destination.Position = ApproachPoint;
                    LeadTask.Do(IntelItems, canonicalTime, profiler);
                    if (LeadTask.Status == TaskStatus.Complete)
                    {
                        var position = GetMiningPosition(currentPosition);
                        LeadTask.Destination.Position = ApproachPoint + (Perpendicular * position.X * MiningSystem.OffsetDist + Perpendicular.Cross(MineTask.Destination.Direction) * position.Y * MiningSystem.OffsetDist);
                        LeadTask.Destination.MaxSpeed = 10;
                        ExitPoint = LeadTask.Destination.Position;
                        state     = 11;
                    }
                }
            }
            else if (state == 11) // Search for the digging spot
            {
                if (GoHomeCheck() || Recalling)
                {
                    state = 4;
                }
                else
                {
                    LeadTask.Do(IntelItems, canonicalTime, profiler);
                    if (LeadTask.Status == TaskStatus.Complete)
                    {
                        state = 1;
                        MiningSystem.SensorsOn();
                        var position = GetMiningPosition(currentPosition);
                        MineTask.Destination.Position = SurfacePoint + (Perpendicular * position.X * MiningSystem.OffsetDist + Perpendicular.Cross(MineTask.Destination.Direction) * position.Y * MiningSystem.OffsetDist) - MineTask.Destination.Direction * MiningSystem.CloseDist;
                        MiningEnd = SurfacePoint + (Perpendicular * position.X * MiningSystem.OffsetDist + Perpendicular.Cross(MineTask.Destination.Direction) * position.Y * MiningSystem.OffsetDist) + MineTask.Destination.Direction * MiningDepth;
                    }
                }
            }
            else if (state == 4) // Going home
            {
                if (DockingSubsystem == null || DockingSubsystem.HomeID == -1 || DockTaskGenerator == null || UndockTaskGenerator == null)
                {
                    state = 9999;
                }
                else
                {
                    if (HomeTask == null)
                    {
                        HomeTask = DockTaskGenerator.GenerateMoveToAndDockTask(MyTuple.Create(IntelItemType.NONE, (long)0), IntelItems, 40);
                    }
                    HomeTask.Do(IntelItems, canonicalTime, profiler);
                    if (HomeTask.Status != TaskStatus.Incomplete)
                    {
                        HomeTask  = null;
                        homeCheck = false;
                        state     = 5;
                    }
                }
            }
            else if (state == 5) // Waiting for refuel/unload
            {
                if (Recalling)
                {
                    state = 9999;
                }
                if ((Program.Me.WorldMatrix.Translation - EntryPoint).LengthSquared() > MiningSystem.CancelDist * MiningSystem.CancelDist)
                {
                    state = 9999;
                }
                if (LeaveHomeCheck())
                {
                    state = 6;
                }
            }
            else if (state == 6) // Undocking
            {
                if (DockingSubsystem != null && DockingSubsystem.Connector.Status == MyShipConnectorStatus.Connected)
                {
                    if (UndockTask == null)
                    {
                        UndockTask = UndockTaskGenerator.GenerateUndockTask(canonicalTime);
                    }
                }

                if (UndockTask != null)
                {
                    UndockTask.Do(IntelItems, canonicalTime, profiler);
                    if (UndockTask.Status != TaskStatus.Incomplete)
                    {
                        UndockTask = null;
                        state      = 10;
                    }
                }
                else
                {
                    state = 10;
                }
            }
            else if (state == 9999)
            {
                Status = TaskStatus.Complete;
            }
        }