public static void ProcessState()
{
if (DateTime.UtcNow < _lastSalvageProcessState.AddMilliseconds(500) || Settings.Instance.DebugDisableSalvage) //if it has not been 100ms since the last time we ran this ProcessState return. We can't do anything that close together anyway
return;
_lastSalvageProcessState = DateTime.UtcNow;
// Nothing to salvage in stations
if (Cache.Instance.InStation)
{
_States.CurrentSalvageState = SalvageState.Idle;
return;
}
if (!Cache.Instance.InSpace)
{
_States.CurrentSalvageState = SalvageState.Idle;
return;
}
// What? No ship entity?
if (Cache.Instance.ActiveShip.Entity == null)
{
_States.CurrentSalvageState = SalvageState.Idle;
return;
}
// When in warp there's nothing we can do, so ignore everything
if (Cache.Instance.InSpace && Cache.Instance.InWarp)
{
_States.CurrentSalvageState = SalvageState.Idle;
return;
}
// There is no salving when cloaked -
// why not? seems like we might be able to ninja-salvage with a covert-ops hauler with some additional coding (someday?)
if (Cache.Instance.ActiveShip.Entity.IsCloaked)
{
_States.CurrentSalvageState = SalvageState.Idle;
return;
}
if (Settings.Instance.DoNotDoANYSalvagingOutsideMissionActions && !Cache.Instance.CurrentlyShouldBeSalvaging)
{
if (Settings.Instance.DebugSalvage) Logging.Log("Salvage", "DoNotDoANYSalvagingOutsideMissionActions [" + Settings.Instance.DoNotDoANYSalvagingOutsideMissionActions + "] CurrentlyShouldBeSalvaging [" + Cache.Instance.CurrentlyShouldBeSalvaging + "] return;", Logging.Debug);
return;
}
switch (_States.CurrentSalvageState)
{
case SalvageState.TargetWrecks:
if (Settings.Instance.DebugSalvage) Logging.Log("Salvage", "SalvageState.TargetWrecks:", Logging.Debug);
TargetWrecks();
// Next state
_States.CurrentSalvageState = SalvageState.LootWrecks;
break;
case SalvageState.LootWrecks:
if (Settings.Instance.DebugSalvage) Logging.Log("Salvage", "SalvageState.LootWrecks:", Logging.Debug);
LootWrecks();
_States.CurrentSalvageState = SalvageState.SalvageWrecks;
break;
case SalvageState.SalvageWrecks:
if (Settings.Instance.DebugSalvage) Logging.Log("Salvage", "SalvageState.SalvageWrecks:", Logging.Debug);
ActivateTractorBeams();
ActivateSalvagers();
// Default action
_States.CurrentSalvageState = SalvageState.TargetWrecks;
if (Cache.Instance.CurrentShipsCargo.IsValid && Cache.Instance.CurrentShipsCargo.Items.Any() && Cache.Instance.LastStackCargohold.AddMinutes(5) < DateTime.UtcNow)
{
// Check if there are actually duplicates
bool duplicates = Cache.Instance.CurrentShipsCargo.Items.Where(i => i.Quantity > 0).GroupBy(i => i.TypeId).Any(t => t.Count() > 1);
if (duplicates)
{
_States.CurrentSalvageState = SalvageState.StackItems;
}
}
break;
case SalvageState.StackItems:
if (!Cache.Instance.StackCargoHold("Salvage")) return;
Logging.Log("Salvage", "Done stacking", Logging.White);
_States.CurrentSalvageState = SalvageState.TargetWrecks;
break;
case SalvageState.Idle:
if (Cache.Instance.InSpace &&
(Cache.Instance.ActiveShip.Entity != null &&
!Cache.Instance.ActiveShip.Entity.IsCloaked &&
(Cache.Instance.ActiveShip.GivenName.ToLower() != Settings.Instance.CombatShipName.ToLower() ||
Cache.Instance.ActiveShip.GivenName.ToLower() != Settings.Instance.SalvageShipName.ToLower()) &&
!Cache.Instance.InWarp))
{
if (Settings.Instance.DebugSalvage) Logging.Log("Salvage", "SalvageState.Idle:", Logging.Debug);
_States.CurrentSalvageState = SalvageState.TargetWrecks;
return;
}
break;
default:
// Unknown state, goto first state
_States.CurrentSalvageState = SalvageState.TargetWrecks;
break;
}
}