private static void TargetWrecks()
{
if (!Cache.Instance.OpenWrecks)
{
if (Settings.Instance.DebugTargetWrecks) Logging.Log("Salvage.TargetWrecks", "Debug: OpenWrecks is false, we do not need to target any wrecks.", Logging.Teal);
return;
}
// We are jammed, we do not need to log (Combat does this already)
if (Cache.Instance.MaxLockedTargets == 0 || Cache.Instance.Targets.Any() && Cache.Instance.Targets.Count() >= Cache.Instance.MaxLockedTargets)
{
if (Settings.Instance.DebugTargetWrecks) Logging.Log("Salvage.TargetWrecks", "Debug: if (Cache.Instance.MaxLockedTargets == 0) || Cache.Instance.Targets.Any() && Cache.Instance.Targets.Count() >= Cache.Instance.MaxLockedTargets", Logging.Teal);
return;
}
List<ModuleCache> tractorBeams = Cache.Instance.Modules.Where(m => m.GroupId == (int)Group.TractorBeam).ToList();
List<EntityCache> targets = new List<EntityCache>();
targets.AddRange(Cache.Instance.Targets);
targets.AddRange(Cache.Instance.Targeting);
bool hasSalvagers = Cache.Instance.Modules.Any(m => m.GroupId == (int)Group.Salvager);
List<EntityCache> wreckTargets = targets.Where(t => (t.GroupId == (int)Group.Wreck || t.GroupId == (int)Group.CargoContainer) && t.CategoryId == (int)CategoryID.Celestial).ToList();
// Check for cargo containers
foreach (EntityCache wreck in wreckTargets.OrderByDescending(i => i.IsLootTarget))
{
if (!hasSalvagers)
{
if (wreck.IsWreckEmpty) //this only returns true if it is a wreck, not for cargo containers, spawn containers, etc.
{
Logging.Log("Salvage", "Wreck: [" + wreck.Name + "][" + Math.Round(wreck.Distance / 1000, 0) + "k][ID: " + Cache.Instance.MaskedID(wreck.Id) + "] wreck is empty, unlocking container.", Logging.White);
Cache.Instance.LootedContainers.Add(wreck.Id);
wreck.UnlockTarget("Salvage");
continue;
}
}
if (!Cache.Instance.SalvageAll)
{
if (Settings.Instance.WreckBlackList.Any(a => a == wreck.TypeId))
{
Logging.Log("Salvage", "Cargo Container [" + wreck.Name + "][" + Math.Round(wreck.Distance / 1000, 0) + "k][ID: " + Cache.Instance.MaskedID(wreck.Id) + "] wreck is on our blacklist, unlocking container.", Logging.White);
Cache.Instance.LootedContainers.Add(wreck.Id);
wreck.UnlockTarget("Salvage");
continue;
}
}
if (hasSalvagers && wreck.GroupId != (int)Group.CargoContainer)
{
if (Settings.Instance.DebugTargetWrecks) Logging.Log("Salvage.TargetWrecks", "Debug: if (hasSalvagers && wreck.GroupId != (int)Group.CargoContainer))", Logging.Teal);
continue;
}
// Unlock if within loot range
if (wreck.Distance < (int)Distances.SafeScoopRange)
{
Logging.Log("Salvage", "Cargo Container [" + wreck.Name + "][" + Math.Round(wreck.Distance / 1000, 0) + "k][ID: " + Cache.Instance.MaskedID(wreck.Id) + "] within loot range, unlocking container.", Logging.White);
wreck.UnlockTarget("Salvage");
continue;
}
}
if (Cache.Instance.MissionLoot)
{
if (wreckTargets.Count >= Cache.Instance.MaxLockedTargets)
{
if (Settings.Instance.DebugTargetWrecks) Logging.Log("Salvage.TargetWrecks", "Debug: if (wreckTargets.Count >= Cache.Instance.MaxLockedTargets)", Logging.Teal);
return;
}
}
else if (wreckTargets.Count >= MaximumWreckTargets || Cache.Instance.Targets.Count() >= Cache.Instance.MaxLockedTargets)
{
if (Settings.Instance.DebugTargetWrecks) Logging.Log("Salvage.TargetWrecks", "Debug: else if (wreckTargets.Count >= MaximumWreckTargets)", Logging.Teal);
return;
}
double tractorBeamRange = 0;
if (tractorBeams.Count > 0)
{
tractorBeamRange = tractorBeams.Min(t => t.OptimalRange);
}
int wrecksProcessedThisTick = 0;
IEnumerable<EntityCache> wrecks = Cache.Instance.UnlootedContainers;
foreach (EntityCache wreck in wrecks.OrderByDescending(i => i.IsLootTarget))
{
// Its already a target, ignore it
if (wreck.IsTarget || wreck.IsTargeting)
{
if (Settings.Instance.DebugTargetWrecks) Logging.Log("Salvage.TargetWrecks", "Debug: if (wreck.IsTarget || wreck.IsTargeting)", Logging.Teal);
continue;
}
if (wreck.Distance > tractorBeamRange)
{
if (Settings.Instance.DebugTargetWrecks) Logging.Log("Salvage.TargetWrecks", "Debug: if (wreck.Distance > tractorBeamRange)", Logging.Teal);
continue;
}
if (!wreck.HaveLootRights)
{
if (Settings.Instance.DebugTargetWrecks) Logging.Log("Salvage.TargetWrecks", "Debug: if (!wreck.HaveLootRights)", Logging.Teal);
continue;
}
// No need to tractor a non-wreck within loot range
if (wreck.GroupId != (int)Group.Wreck && wreck.Distance < (int)Distances.SafeScoopRange)
{
if (Settings.Instance.DebugTargetWrecks) Logging.Log("Salvage.TargetWrecks", "Debug: if (wreck.GroupId != (int)Group.Wreck && wreck.Distance < (int)Distance.SafeScoopRange)", Logging.Teal);
continue;
}
if (!Cache.Instance.SalvageAll)
{
//
// do not tractor blacklisted wrecks
//
if (Settings.Instance.WreckBlackList.Any(a => a == wreck.TypeId))
{
if (Settings.Instance.DebugTargetWrecks) Logging.Log("Salvage.TargetWrecks", "Debug: if (Settings.Instance.WreckBlackList.Any(a => a == wreck.TypeId)", Logging.Teal);
continue;
}
}
if (wreck.GroupId != (int)Group.Wreck && wreck.GroupId != (int)Group.CargoContainer)
{
if (Settings.Instance.DebugTargetWrecks) Logging.Log("Salvage.TargetWrecks", "Debug: if (wreck.GroupId != (int)Group.Wreck && wreck.GroupId != (int)Group.CargoContainer)", Logging.Teal);
continue;
}
if (!hasSalvagers)
{
// Ignore already looted wreck
if (Cache.Instance.LootedContainers.Contains(wreck.Id))
{
if (Settings.Instance.DebugTargetWrecks) Logging.Log("Salvage.TargetWrecks", "Debug: Ignoring Already Looted Entity ID [" + wreck.Id + "]", Logging.Teal);
continue;
}
// Ignore empty wrecks
if (wreck.IsWreckEmpty) //this only returns true if it is a wreck, not for cargo containers, spawn containers, etc.
{
if (Settings.Instance.DebugTargetWrecks) Logging.Log("Salvage.TargetWrecks", "Debug: Ignoring Empty Entity ID [" + wreck.Id + "]", Logging.Teal);
continue;
}
// Ignore wrecks already in loot range
if (wreck.Distance < (int)Distances.SafeScoopRange)
{
if (Settings.Instance.DebugTargetWrecks) Logging.Log("Salvage.TargetWrecks", "Debug: Ignoring Entity that is already in loot range ID [" + wreck.Id + "]", Logging.Teal);
continue;
}
}
if (wreck.LockTarget("Salvage"))
{
Logging.Log("Salvage", "Locking [" + wreck.Name + "][" + Math.Round(wreck.Distance / 1000, 0) + "k][ID: " + Cache.Instance.MaskedID(wreck.Id) + "][" + Math.Round(wreck.Distance / 1000, 0) + "k away]", Logging.White);
wreckTargets.Add(wreck);
wrecksProcessedThisTick++;
if (Settings.Instance.DebugSalvage) Logging.Log("Salvage", "wrecksProcessedThisTick [" + wrecksProcessedThisTick + "]", Logging.Teal);
if (Cache.Instance.MissionLoot)
{
if (wreckTargets.Count >= Cache.Instance.MaxLockedTargets)
{
if (Settings.Instance.DebugTargetWrecks) Logging.Log("Salvage", " wreckTargets.Count [" + wreckTargets.Count + "] >= Cache.Instance.MaxLockedTargets) [" + Cache.Instance.MaxLockedTargets + "]", Logging.Teal);
return;
}
}
else
{
if (wreckTargets.Count >= MaximumWreckTargets)
{
if (Settings.Instance.DebugTargetWrecks) Logging.Log("Salvage", " wreckTargets.Count [" + wreckTargets.Count + "] >= MaximumWreckTargets [" + MaximumWreckTargets + "]", Logging.Teal);
return;
}
}
if (wrecksProcessedThisTick < Settings.Instance.NumberOfModulesToActivateInCycle)
{
if (Settings.Instance.DebugTargetWrecks) Logging.Log("Salvage", "if (wrecksProcessedThisTick [" + wrecksProcessedThisTick + "] < Settings.Instance.NumberOfModulesToActivateInCycle [" + Settings.Instance.NumberOfModulesToActivateInCycle + "])", Logging.Teal);
continue;
}
}
return;
}
}