public void ProcessState() { // Nothing to salvage in stations if (Cache.Instance.InStation) return; var cargo = Cache.Instance.DirectEve.GetShipsCargo(); switch (State) { case SalvageState.TargetWrecks: TargetWrecks(); // Next state State = SalvageState.LootWrecks; break; case SalvageState.LootWrecks: LootWrecks(); State = SalvageState.SalvageWrecks; break; case SalvageState.SalvageWrecks: ActivateTractorBeams(); ActivateSalvagers(); // Default action State = SalvageState.TargetWrecks; if (cargo.IsReady && cargo.Items.Any() && _nextSalvageAction < DateTime.Now) { // Check if there are actually duplicates var duplicates = cargo.Items.Where(i => i.Quantity > 0).GroupBy(i => i.TypeId).Any(t => t.Count() > 1); if (duplicates) State = SalvageState.StackItems; else _nextSalvageAction = DateTime.Now.AddSeconds((int)Time.SalvageStackItems_seconds); } break; case SalvageState.StackItems: Logging.Log("Salvage: Stacking items"); if (cargo.IsReady) cargo.StackAll(); _nextSalvageAction = DateTime.Now.AddSeconds((int)Time.SalvageStackItemsDelayBeforeResuming_seconds); State = SalvageState.WaitForStacking; break; case SalvageState.WaitForStacking: // Wait 5 seconds after stacking if (_nextSalvageAction > DateTime.Now) break; if (Cache.Instance.DirectEve.GetLockedItems().Count == 0) { Logging.Log("Salvage: Done stacking"); State = SalvageState.TargetWrecks; break; } if (DateTime.Now.Subtract(_nextSalvageAction).TotalSeconds > 120) { Logging.Log("Salvage: Stacking items timed out, clearing item locks"); Cache.Instance.DirectEve.UnlockItems(); Logging.Log("Salvage: Done stacking"); State = SalvageState.TargetWrecks; break; } break; default: // Unknown state, goto first state State = SalvageState.TargetWrecks; break; } }
/// <summary> /// Activates tractorbeam on targeted wrecks /// </summary> private void ActivateTractorBeams() { if (_nextSalvageAction > DateTime.Now) return; var tractorBeams = Cache.Instance.Modules.Where(m => TractorBeams.Contains(m.TypeId)).ToList(); if (tractorBeams.Count == 0) return; var tractorBeamRange = tractorBeams.Min(t => t.OptimalRange); var wrecks = Cache.Instance.Targets.Where(t => (t.GroupId == (int)Group.Wreck || t.GroupId == (int)Group.CargoContainer) && t.Distance < tractorBeamRange).ToList(); Logging.Log(Cache.Instance.DirectEve.ActiveShip.Entity.Mode.ToString()); if (wrecks.FirstOrDefault() == null) { var wrecksFar = Cache.Instance.Entities.Where(t => (t.GroupId == (int)Group.Wreck || t.GroupId == (int)Group.CargoContainer) && t.Distance > tractorBeamRange).ToList(); if (wrecksFar.Count > 0) if (Cache.Instance.DirectEve.ActiveShip.Entity.Mode != 1) { if (_nextApproachAction < DateTime.Now) { _nextApproachAction = DateTime.Now.AddSeconds((int)Time.ApproachDelay_seconds); wrecksFar.FirstOrDefault().Approach(); } } State = SalvageState.TargetWrecks; return; }; for (var i = tractorBeams.Count - 1; i >= 0; i--) { var tractorBeam = tractorBeams[i]; if (!tractorBeam.IsActive && !tractorBeam.IsDeactivating) continue; var wreck = wrecks.FirstOrDefault(w => w.Id == tractorBeam.TargetId); // If the wreck no longer exists, or its within loot range then disable the tractor beam if (tractorBeam.IsActive && (wreck == null || wreck.Distance <= (int)Distance.SafeScoopRange)) { tractorBeam.Deactivate(); _nextSalvageAction = DateTime.Now.AddMilliseconds((int)Time.SalvageDelayBetweenActions_miliseconds); return; //More human behaviour //System.Threading.Thread.Sleep(333); } // Remove the tractor beam as a possible beam to activate tractorBeams.RemoveAt(i); wrecks.RemoveAll(w => w.Id == tractorBeam.TargetId); } foreach (var wreck in wrecks) { // This velocity check solves some bugs where velocity showed up as 150000000m/s if (wreck.Velocity != 0 && wreck.Velocity < (int)Distance.SafeScoopRange) continue; // Is this wreck within range? if (wreck.Distance < (int)Distance.SafeScoopRange) continue; if (tractorBeams.Count == 0) return; var tractorBeam = tractorBeams[0]; tractorBeams.RemoveAt(0); tractorBeam.Activate(wreck.Id); Logging.Log("Salvage: Activating tractorbeam [" + tractorBeam.ItemId + "] on [" + wreck.Name + "][" + wreck.Id + "]"); //More human behaviour //System.Threading.Thread.Sleep(333); _nextSalvageAction = DateTime.Now.AddMilliseconds((int)Time.SalvageDelayBetweenActions_miliseconds); return; } }
public void ProcessState() { // Nothing to salvage in stations if (Cache.Instance.InStation) { return; } var cargo = Cache.Instance.DirectEve.GetShipsCargo(); switch (State) { case SalvageState.TargetWrecks: TargetWrecks(); // Next state State = SalvageState.LootWrecks; break; case SalvageState.LootWrecks: LootWrecks(); State = SalvageState.SalvageWrecks; break; case SalvageState.SalvageWrecks: ActivateTractorBeams(); ActivateSalvagers(); // Default action State = SalvageState.TargetWrecks; if (cargo.IsReady && cargo.Items.Any() && _nextAction < DateTime.Now) { // Check if there are actually duplicates var duplicates = cargo.Items.Where(i => i.Quantity > 0).GroupBy(i => i.TypeId).Any(t => t.Count() > 1); if (duplicates) { State = SalvageState.StackItems; } else { _nextAction = DateTime.Now.AddSeconds(150); } } break; case SalvageState.StackItems: Logging.Log("Salvage: Stacking items"); if (cargo.IsReady) { cargo.StackAll(); } _nextAction = DateTime.Now.AddSeconds(5); State = SalvageState.WaitForStacking; break; case SalvageState.WaitForStacking: // Wait 5 seconds after stacking if (_nextAction > DateTime.Now) { break; } if (Cache.Instance.DirectEve.GetLockedItems().Count == 0) { Logging.Log("Salvage: Done stacking"); State = SalvageState.TargetWrecks; break; } if (DateTime.Now.Subtract(_nextAction).TotalSeconds > 120) { Logging.Log("Salvage: Stacking items timed out, clearing item locks"); Cache.Instance.DirectEve.UnlockItems(); Logging.Log("Salvage: Done stacking"); State = SalvageState.TargetWrecks; break; } break; default: // Unknown state, goto first state State = SalvageState.TargetWrecks; break; } }
/// <summary> /// Activates tractorbeam on targeted wrecks /// </summary> private void ActivateTractorBeams() { if (_nextSalvageAction > DateTime.Now) { return; } var tractorBeams = Cache.Instance.Modules.Where(m => TractorBeams.Contains(m.TypeId)).ToList(); if (tractorBeams.Count == 0) { return; } var tractorBeamRange = tractorBeams.Min(t => t.OptimalRange); var wrecks = Cache.Instance.Targets.Where(t => (t.GroupId == (int)Group.Wreck || t.GroupId == (int)Group.CargoContainer) && t.Distance < tractorBeamRange).ToList(); Logging.Log(Cache.Instance.DirectEve.ActiveShip.Entity.Mode.ToString()); if (wrecks.FirstOrDefault() == null) { var wrecksFar = Cache.Instance.Entities.Where(t => (t.GroupId == (int)Group.Wreck || t.GroupId == (int)Group.CargoContainer) && t.Distance > tractorBeamRange).ToList(); if (wrecksFar.Count > 0) { if (Cache.Instance.DirectEve.ActiveShip.Entity.Mode != 1) { if (_nextApproachAction < DateTime.Now) { _nextApproachAction = DateTime.Now.AddSeconds((int)Time.ApproachDelay_seconds); wrecksFar.FirstOrDefault().Approach(); } } } State = SalvageState.TargetWrecks; return; } ; for (var i = tractorBeams.Count - 1; i >= 0; i--) { var tractorBeam = tractorBeams[i]; if (!tractorBeam.IsActive && !tractorBeam.IsDeactivating) { continue; } var wreck = wrecks.FirstOrDefault(w => w.Id == tractorBeam.TargetId); // If the wreck no longer exists, or its within loot range then disable the tractor beam if (tractorBeam.IsActive && (wreck == null || wreck.Distance <= (int)Distance.SafeScoopRange)) { tractorBeam.Deactivate(); _nextSalvageAction = DateTime.Now.AddMilliseconds((int)Time.SalvageDelayBetweenActions_miliseconds); return; //More human behaviour //System.Threading.Thread.Sleep(333); } // Remove the tractor beam as a possible beam to activate tractorBeams.RemoveAt(i); wrecks.RemoveAll(w => w.Id == tractorBeam.TargetId); } foreach (var wreck in wrecks) { // This velocity check solves some bugs where velocity showed up as 150000000m/s if (wreck.Velocity != 0 && wreck.Velocity < (int)Distance.SafeScoopRange) { continue; } // Is this wreck within range? if (wreck.Distance < (int)Distance.SafeScoopRange) { continue; } if (tractorBeams.Count == 0) { return; } var tractorBeam = tractorBeams[0]; tractorBeams.RemoveAt(0); tractorBeam.Activate(wreck.Id); Logging.Log("Salvage: Activating tractorbeam [" + tractorBeam.ItemId + "] on [" + wreck.Name + "][" + wreck.Id + "]"); //More human behaviour //System.Threading.Thread.Sleep(333); _nextSalvageAction = DateTime.Now.AddMilliseconds((int)Time.SalvageDelayBetweenActions_miliseconds); return; } }