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