public ChangeAmmo ( DirectEve.DirectItem charge, int weaponNumber, double Range, String entityName = "n/a", Double entityDistance ) : bool | ||
charge | DirectEve.DirectItem | |
weaponNumber | int | |
Range | double | |
entityName | String | |
entityDistance | Double | |
return | bool |
//~Combat() //{ // Interlocked.Decrement(ref CombatInstances); //} // Reload correct (tm) ammo for the NPC // (enough/correct) ammo is loaded, false if wrong/not enough ammo is loaded private static bool ReloadNormalAmmo(ModuleCache weapon, EntityCache entity, int weaponNumber, bool force = false) { if (Settings.Instance.WeaponGroupId == 53) return true; if (entity == null) { if (Settings.Instance.DebugReloadAll) Logging.Log("debug ReloadAll:", "if (entity == null)", Logging.Orange); return false; } List<Ammo> correctAmmoToUse = null; List<Ammo> correctAmmoInCargo = null; // // NOTE: This new setting is NOT ready for use! // NOTE: when we are finished molesting ReloadNormalAmmo we should do the same to the routine used for lasers... // // // ammo selection based on target size // if (Settings.Instance.SelectAmmoToUseBasedOnShipSize) { if (Cache.Instance.LastChangedAmmoTimeStamp != null && Cache.Instance.LastChangedAmmoTimeStamp.ContainsKey(weapon.ItemId)) { // // Do not allow the changing of ammo if we already changed ammo in the last 60 seconds AND we do not need to reload yet // if (DateTime.UtcNow < Cache.Instance.LastChangedAmmoTimeStamp[weapon.ItemId].AddSeconds(Time.Instance.EnforcedDelayBetweenArbitraryAmmoChanges)) { if (weapon.CurrentCharges >= Settings.Instance.MinimumAmmoCharges && !force) { if (Settings.Instance.DebugReloadAll) Logging.Log("debug ReloadAll:", "[" + weapon.TypeName + "] last reloaded [" + DateTime.UtcNow.Subtract(Cache.Instance.LastChangedAmmoTimeStamp[weapon.ItemId]).TotalSeconds + "sec ago] [ " + weapon.CurrentCharges + " ] charges in in [" + Cache.Instance.Weapons.Count() + "] total weapons, minimum of [" + Settings.Instance.MinimumAmmoCharges + "] charges, MaxCharges is [" + weapon.MaxCharges + "]", Logging.Orange); return true; } } } if (Settings.Instance.Ammo.Any(a => a.DamageType == Cache.Instance.MissionDamageType)) { // Get ammo based on damage type correctAmmoToUse = Settings.Instance.Ammo.Where(a => a.DamageType == Cache.Instance.MissionDamageType).ToList(); // // get Ammo Based on entity we are shooting's size class, default to normal ammo if we cant determine its size // if (entity.IsBattleship) { // this needs one more layer somewhere to determine the right damage type for battleships, etc (EM, kinetic, etc) and it needs to do it for // default, faction and mission specific layers // //correctAmmoToUse = Settings.Instance.Ammo.Where(a => a.DamageType == DamageType.BattleShip_EM).ToList(); } else if (entity.IsBattlecruiser) { //correctAmmoToUse = Settings.Instance.Ammo.Where(a => a.DamageType == DamageType.BattleShip_EM).ToList(); } else if (entity.IsCruiser) { //correctAmmoToUse = Settings.Instance.Ammo.Where(a => a.DamageType == DamageType.BattleShip_EM).ToList(); } else if (entity.IsFrigate) { //correctAmmoToUse = Settings.Instance.Ammo.Where(a => a.DamageType == DamageType.Frigate_EM).ToList(); } else if (entity.IsLargeCollidable) { //correctAmmoToUse = Settings.Instance.Ammo.Where(a => a.DamageType == DamageType.LargeCollidable_EM).ToList(); } else if (entity.IsPlayer) { //correctAmmoToUse = Settings.Instance.Ammo.Where(a => a.DamageType == DamageType.PVP_EM).ToList(); } // Check if we still have that ammo in our cargo correctAmmoInCargo = correctAmmoToUse.Where(a => Cache.Instance.CurrentShipsCargo.Items.Any(i => i.TypeId == a.TypeId && i.Quantity >= Settings.Instance.MinimumAmmoCharges)).ToList(); //check if mission specific ammo is defined if (Cache.Instance.MissionAmmo.Count() != 0) { correctAmmoInCargo = Cache.Instance.MissionAmmo.Where(a => a.DamageType == Cache.Instance.MissionDamageType).ToList(); } // Check if we still have that ammo in our cargo correctAmmoInCargo = correctAmmoInCargo.Where(a => Cache.Instance.CurrentShipsCargo.Items.Any(i => i.TypeId == a.TypeId && i.Quantity >= Settings.Instance.MinimumAmmoCharges)).ToList(); if (Cache.Instance.MissionAmmo.Count() != 0) { correctAmmoInCargo = Cache.Instance.MissionAmmo; } // We are out of ammo! :( if (!correctAmmoInCargo.Any()) { Logging.Log("Combat", "ReloadNormalAmmo: not enough [" + Cache.Instance.MissionDamageType + "] ammo in cargohold: MinimumCharges: [" + Settings.Instance.MinimumAmmoCharges + "]", Logging.Orange); _States.CurrentCombatState = CombatState.OutOfAmmo; return false; } } else { Logging.Log("Combat", "ReloadNormalAmmo: ammo is not defined properly in the ammo section of this characters settings xml", Logging.Orange); _States.CurrentCombatState = CombatState.OutOfAmmo; return false; } } else { // // normal ammo selection - ignore target attributes and uses the right ammo for the pocket // if (Settings.Instance.Ammo.Any(a => a.DamageType == Cache.Instance.MissionDamageType)) { // Get ammo based on damage type correctAmmoToUse = Settings.Instance.Ammo.Where(a => a.DamageType == Cache.Instance.MissionDamageType).ToList(); // Check if we still have that ammo in our cargo correctAmmoInCargo = correctAmmoToUse.Where(a => Cache.Instance.CurrentShipsCargo.Items.Any(i => i.TypeId == a.TypeId && i.Quantity >= Settings.Instance.MinimumAmmoCharges)).ToList(); //check if mission specific ammo is defined if (Cache.Instance.MissionAmmo.Count() != 0) { correctAmmoInCargo = Cache.Instance.MissionAmmo.Where(a => a.DamageType == Cache.Instance.MissionDamageType).ToList(); } // Check if we still have that ammo in our cargo correctAmmoInCargo = correctAmmoInCargo.Where(a => Cache.Instance.CurrentShipsCargo.Items.Any(i => i.TypeId == a.TypeId && i.Quantity >= Settings.Instance.MinimumAmmoCharges)).ToList(); if (Cache.Instance.MissionAmmo.Count() != 0) { correctAmmoInCargo = Cache.Instance.MissionAmmo; } // We are out of ammo! :( if (!correctAmmoInCargo.Any()) { Logging.Log("Combat", "ReloadNormalAmmo: not enough [" + Cache.Instance.MissionDamageType + "] ammo in cargohold: MinimumCharges: [" + Settings.Instance.MinimumAmmoCharges + "]", Logging.Orange); _States.CurrentCombatState = CombatState.OutOfAmmo; return false; } } else { Logging.Log("Combat", "ReloadNormalAmmo: ammo is not defined properly in the ammo section of this characters settings xml", Logging.Orange); _States.CurrentCombatState = CombatState.OutOfAmmo; return false; } } /****** if (weapon.Charge != null) { IEnumerable<Ammo> areWeMissingAmmo = correctAmmo.Where(a => a.TypeId == weapon.Charge.TypeId); if (!areWeMissingAmmo.Any()) { if (DateTime.UtcNow.Subtract(Cache.Instance.LastLoggingAction).TotalSeconds > 4) { Logging.Log("Combat", "ReloadNormalAmmo: We have ammo loaded that does not have a full reload available, checking cargo for other ammo", Logging.Orange); Cache.Instance.LastLoggingAction = DateTime.UtcNow; try { if (Settings.Instance.Ammo.Any()) { DirectItem availableAmmo = cargo.Items.OrderByDescending(i => i.Quantity).Where(a => Settings.Instance.Ammo.Any(i => i.TypeId == a.TypeId)).ToList().FirstOrDefault(); if (availableAmmo != null) { Cache.Instance.DamageType = Settings.Instance.Ammo.ToList().OrderByDescending(i => i.Quantity).Where(a => a.TypeId == availableAmmo.TypeId).ToList().FirstOrDefault().DamageType; Logging.Log("Combat", "ReloadNormalAmmo: found [" + availableAmmo.Quantity + "] units of [" + availableAmmo.TypeName + "] changed DamageType to [" + Cache.Instance.DamageType.ToString() + "]", Logging.Orange); return false; } Logging.Log("Combat", "ReloadNormalAmmo: unable to find any alternate ammo in your cargo", Logging.teal); _States.CurrentCombatState = CombatState.OutOfAmmo; return false; } } catch (Exception) { Logging.Log("Combat", "ReloadNormalAmmo: unable to find any alternate ammo in your cargo", Logging.teal); _States.CurrentCombatState = CombatState.OutOfAmmo; } return false; } } } *****/ // Get the best possible ammo Ammo ammo = correctAmmoInCargo.FirstOrDefault(); try { if (ammo != null && entity != null) { ammo = correctAmmoInCargo.Where(a => a.Range > entity.Distance).OrderBy(a => a.Range).FirstOrDefault(); } } catch (Exception exception) { Logging.Log("Combat", "ReloadNormalAmmo: Unable to find the correct ammo: waiting [" + exception + "]", Logging.Teal); return false; } // We do not have any ammo left that can hit targets at that range! if (ammo == null) { if (Settings.Instance.DebugReloadAll) Logging.Log("debug ReloadAll:", "We do not have any ammo left that can hit targets at that range!", Logging.Orange); return false; } // Do We have enough ammo loaded? if (weapon.Charge != null && weapon.Charge.TypeId == ammo.TypeId) { if (weapon.CurrentCharges >= Settings.Instance.MinimumAmmoCharges && !force) { if (Settings.Instance.DebugReloadAll) Logging.Log("debug ReloadAll:", "[ " + weapon.CurrentCharges + " ] charges in in [" + Cache.Instance.Weapons.Count() + "] total weapons, minimum of [" + Settings.Instance.MinimumAmmoCharges + "] charges, MaxCharges is [" + weapon.MaxCharges + "]", Logging.Orange); return true; } if (weapon.CurrentCharges >= weapon.MaxCharges && force) { // // even if force is true do not reload a weapon that is already full! // if (Settings.Instance.DebugReloadAll) Logging.Log("debug ReloadAll:", "[ " + weapon.CurrentCharges + " ] charges in [" + Cache.Instance.Weapons.Count() + "] total weapons, MaxCharges [" + weapon.MaxCharges + "]", Logging.Orange); return true; } if (force && weapon.CurrentCharges < weapon.MaxCharges) { // // allow the reload (and log it!) // if (Settings.Instance.DebugReloadAll) Logging.Log("debug ReloadAll:", "[ " + weapon.CurrentCharges + " ] charges in [" + Cache.Instance.Weapons.Count() + "] total weapons, MaxCharges [" + weapon.MaxCharges + "] - forced reloading proceeding", Logging.Orange); } } // Retry later, assume its ok now //if (!weapon.MatchingAmmo.Any()) //{ // LastWeaponReload[weapon.ItemId] = DateTime.UtcNow; //mark this weapon as reloaded... by the time we need to reload this timer will have aged enough... // return true; //} DirectItem charge = Cache.Instance.CurrentShipsCargo.Items.FirstOrDefault(e => e.TypeId == ammo.TypeId && e.Quantity >= Settings.Instance.MinimumAmmoCharges); // This should have shown up as "out of ammo" if (charge == null) { if (Settings.Instance.DebugReloadAll) Logging.Log("debug ReloadAll:", "This should have shown up as out of ammo", Logging.Orange); return false; } // If we are reloading, wait Time.ReloadWeaponDelayBeforeUsable_seconds (see time.cs) if (weapon.IsReloadingAmmo) { if (Settings.Instance.DebugReloadAll) Logging.Log("debug ReloadAll:", "We are already reloading, wait - weapon.IsReloadingAmmo [" + weapon.IsReloadingAmmo + "]", Logging.Orange); return true; } // If we are changing ammo, wait Time.ReloadWeaponDelayBeforeUsable_seconds (see time.cs) if (weapon.IsChangingAmmo) { if (Settings.Instance.DebugReloadAll) Logging.Log("debug ReloadAll:", "We are already changing ammo, wait - weapon.IsReloadingAmmo [" + weapon.IsReloadingAmmo + "]", Logging.Orange); return true; } try { // Reload or change ammo if (weapon.Charge != null && weapon.Charge.TypeId == charge.TypeId && !weapon.IsChangingAmmo) { if (weapon.ReloadAmmo(charge, weaponNumber, (double) ammo.Range)) { return true; } return false; } if (weapon.ChangeAmmo(charge, weaponNumber, (double) ammo.Range, entity.Name, entity.Distance)) { return true; } return false; } catch (Exception exception) { Logging.Log("Combat.ReloadNormalAmmo", "Exception [" + exception + "]", Logging.Debug); } // Return true as we are reloading ammo, assume it is the correct ammo... return true; }
/// <summary> Reload correct (tm) ammo for the NPC /// </summary> /// <param name = "weapon"></param> /// <param name = "entity"></param> /// <param name = "weaponNumber"></param> /// <returns>True if the (enough/correct) ammo is loaded, false if wrong/not enough ammo is loaded</returns> public static bool ReloadNormalAmmo(ModuleCache weapon, EntityCache entity, int weaponNumber) { if (Settings.Instance.WeaponGroupId == 53) return true; if (entity == null) return false; DirectContainer cargo = Cache.Instance.DirectEve.GetShipsCargo(); // Get ammo based on damage type IEnumerable<Ammo> correctAmmo = Settings.Instance.Ammo.Where(a => a.DamageType == Cache.Instance.DamageType).ToList(); // Check if we still have that ammo in our cargo IEnumerable<Ammo> correctAmmoIncargo = correctAmmo.Where(a => cargo.Items.Any(i => i.TypeId == a.TypeId && i.Quantity >= Settings.Instance.MinimumAmmoCharges)).ToList(); //check if mission specific ammo is defined if (Cache.Instance.MissionAmmo.Count() != 0) { correctAmmoIncargo = Cache.Instance.MissionAmmo.Where(a => a.DamageType == Cache.Instance.DamageType).ToList(); } // Check if we still have that ammo in our cargo correctAmmoIncargo = correctAmmoIncargo.Where(a => cargo.Items.Any(i => i.TypeId == a.TypeId && i.Quantity >= Settings.Instance.MinimumAmmoCharges)).ToList(); if (Cache.Instance.MissionAmmo.Count() != 0) { correctAmmoIncargo = Cache.Instance.MissionAmmo; } // We are out of ammo! :( if (!correctAmmoIncargo.Any()) { Logging.Log("Combat", "ReloadNormalAmmo: not enough [" + Cache.Instance.DamageType + "] ammo in cargohold: MinimumCharges: [" + Settings.Instance.MinimumAmmoCharges + "]", Logging.Orange); _States.CurrentCombatState = CombatState.OutOfAmmo; return false; } /****** if (weapon.Charge != null) { IEnumerable<Ammo> areWeMissingAmmo = correctAmmo.Where(a => a.TypeId == weapon.Charge.TypeId); if (!areWeMissingAmmo.Any()) { if (DateTime.UtcNow.Subtract(Cache.Instance.LastLoggingAction).TotalSeconds > 4) { Logging.Log("Combat", "ReloadNormalAmmo: We have ammo loaded that does not have a full reload available, checking cargo for other ammo", Logging.Orange); Cache.Instance.LastLoggingAction = DateTime.UtcNow; try { if (Settings.Instance.Ammo.Any()) { DirectItem availableAmmo = cargo.Items.OrderByDescending(i => i.Quantity).Where(a => Settings.Instance.Ammo.Any(i => i.TypeId == a.TypeId)).ToList().FirstOrDefault(); if (availableAmmo != null) { Cache.Instance.DamageType = Settings.Instance.Ammo.ToList().OrderByDescending(i => i.Quantity).Where(a => a.TypeId == availableAmmo.TypeId).ToList().FirstOrDefault().DamageType; Logging.Log("Combat", "ReloadNormalAmmo: found [" + availableAmmo.Quantity + "] units of [" + availableAmmo.TypeName + "] changed DamageType to [" + Cache.Instance.DamageType.ToString() + "]", Logging.Orange); return false; } Logging.Log("Combat", "ReloadNormalAmmo: unable to find any alternate ammo in your cargo", Logging.teal); _States.CurrentCombatState = CombatState.OutOfAmmo; return false; } } catch (Exception) { Logging.Log("Combat", "ReloadNormalAmmo: unable to find any alternate ammo in your cargo", Logging.teal); _States.CurrentCombatState = CombatState.OutOfAmmo; } return false; } } } *****/ // Get the best possible ammo Ammo ammo = correctAmmoIncargo.FirstOrDefault(); try { if (ammo != null && entity != null) { ammo = correctAmmoIncargo.Where(a => a.Range > entity.Distance).OrderBy(a => a.Range).FirstOrDefault(); } } catch (Exception exception) { Logging.Log("Combat", "ReloadNormalAmmo: Unable to find the correct ammo: waiting [" + exception + "]", Logging.Teal); return false; } // We do not have any ammo left that can hit targets at that range! if (ammo == null) return false; // We have enough ammo loaded if (weapon.Charge != null && weapon.Charge.TypeId == ammo.TypeId && weapon.CurrentCharges >= Settings.Instance.MinimumAmmoCharges) { LastWeaponReload[weapon.ItemId] = DateTime.UtcNow; //mark this weapon as reloaded... by the time we need to reload this timer will have aged enough... return true; } // Retry later, assume its ok now //if (!weapon.MatchingAmmo.Any()) //{ // LastWeaponReload[weapon.ItemId] = DateTime.UtcNow; //mark this weapon as reloaded... by the time we need to reload this timer will have aged enough... // return true; //} DirectItem charge = cargo.Items.FirstOrDefault(i => i.TypeId == ammo.TypeId && i.Quantity >= Settings.Instance.MinimumAmmoCharges); // This should have shown up as "out of ammo" if (charge == null) return false; // We are reloading, wait Time.ReloadWeaponDelayBeforeUsable_seconds (see time.cs) if (LastWeaponReload.ContainsKey(weapon.ItemId) && DateTime.UtcNow < LastWeaponReload[weapon.ItemId].AddSeconds(Time.Instance.ReloadWeaponDelayBeforeUsable_seconds)) return true; LastWeaponReload[weapon.ItemId] = DateTime.UtcNow; try { // Reload or change ammo if (weapon.Charge != null && weapon.Charge.TypeId == charge.TypeId && !weapon.IsChangingAmmo) { if (DateTime.UtcNow.Subtract(Cache.Instance.LastLoggingAction).TotalSeconds > 10) { Cache.Instance.TimeSpentReloading_seconds = Cache.Instance.TimeSpentReloading_seconds + Time.Instance.ReloadWeaponDelayBeforeUsable_seconds; Cache.Instance.LastLoggingAction = DateTime.UtcNow; } Logging.Log("Combat", "Reloading [" + weaponNumber + "] with [" + charge.TypeName + "][" + Math.Round((double)ammo.Range / 1000, 0) + "][TypeID: " + charge.TypeId + "]", Logging.Teal); weapon.ReloadAmmo(charge); weapon.ReloadTimeThisMission = weapon.ReloadTimeThisMission + Time.Instance.ReloadWeaponDelayBeforeUsable_seconds; return false; } if (!weapon.IsChangingAmmo) { if (DateTime.UtcNow.Subtract(Cache.Instance.LastLoggingAction).TotalSeconds > 10) { Cache.Instance.TimeSpentReloading_seconds = Cache.Instance.TimeSpentReloading_seconds + Time.Instance.ReloadWeaponDelayBeforeUsable_seconds; Cache.Instance.LastLoggingAction = DateTime.UtcNow; } Logging.Log("Combat", "Changing [" + weaponNumber + "] with [" + charge.TypeName + "][" + Math.Round((double)ammo.Range / 1000, 0) + "][TypeID: " + charge.TypeId + "] so we can hit [" + entity.Name + "][" + Math.Round(entity.Distance / 1000, 0) + "k]", Logging.Teal); weapon.ChangeAmmo(charge); weapon.ReloadTimeThisMission = weapon.ReloadTimeThisMission + Time.Instance.ReloadWeaponDelayBeforeUsable_seconds; return false; } if (weapon.IsChangingAmmo) { Logging.Log("Combat", "Weapon [" + weaponNumber + "] is already reloading. waiting", Logging.Teal); return false; } } catch (Exception exception) { Logging.Log("Combat.ReloadNormalAmmo", "Exception [" + exception + "]", Logging.Debug); } // Return true as we are reloading ammo, assume it is the correct ammo... return true; }
private static bool ReloadEnergyWeaponAmmo(ModuleCache weapon, EntityCache entity, int weaponNumber) { // Get ammo based on damage type IEnumerable<Ammo> correctAmmo = Settings.Instance.Ammo.Where(a => a.DamageType == Cache.Instance.MissionDamageType).ToList(); // Check if we still have that ammo in our cargo IEnumerable<Ammo> correctAmmoInCargo = correctAmmo.Where(a => Cache.Instance.CurrentShipsCargo.Items.Any(e => e.TypeId == a.TypeId)).ToList(); //check if mission specific ammo is defined if (Cache.Instance.MissionAmmo.Count() != 0) { correctAmmoInCargo = Cache.Instance.MissionAmmo.Where(a => a.DamageType == Cache.Instance.MissionDamageType).ToList(); } // Check if we still have that ammo in our cargo correctAmmoInCargo = correctAmmoInCargo.Where(a => Cache.Instance.CurrentShipsCargo.Items.Any(e => e.TypeId == a.TypeId && e.Quantity >= Settings.Instance.MinimumAmmoCharges)).ToList(); if (Cache.Instance.MissionAmmo.Count() != 0) { correctAmmoInCargo = Cache.Instance.MissionAmmo; } // We are out of ammo! :( if (!correctAmmoInCargo.Any()) { Logging.Log("Combat", "ReloadEnergyWeapon: not enough [" + Cache.Instance.MissionDamageType + "] ammo in cargohold: MinimumCharges: [" + Settings.Instance.MinimumAmmoCharges + "]", Logging.Orange); _States.CurrentCombatState = CombatState.OutOfAmmo; return false; } if (weapon.Charge != null) { IEnumerable<Ammo> areWeMissingAmmo = correctAmmoInCargo.Where(a => a.TypeId == weapon.Charge.TypeId); if (!areWeMissingAmmo.Any()) { Logging.Log("Combat", "ReloadEnergyWeaponAmmo: We have ammo loaded that does not have a full reload available in the cargo.", Logging.Orange); } } // Get the best possible ammo - energy weapons change ammo near instantly Ammo ammo = correctAmmoInCargo.Where(a => a.Range > (entity.Distance)).OrderBy(a => a.Range).FirstOrDefault(); //default // We do not have any ammo left that can hit targets at that range! if (ammo == null) { if (Settings.Instance.DebugReloadorChangeAmmo) Logging.Log("Combat", "ReloadEnergyWeaponAmmo: best possible ammo: [ ammo == null]", Logging.White); return false; } if (Settings.Instance.DebugReloadorChangeAmmo) Logging.Log("Combat", "ReloadEnergyWeaponAmmo: best possible ammo: [" + ammo.TypeId + "][" + ammo.DamageType + "]", Logging.White); if (Settings.Instance.DebugReloadorChangeAmmo) Logging.Log("Combat", "ReloadEnergyWeaponAmmo: best possible ammo: [" + entity.Name + "][" + Math.Round(entity.Distance / 1000, 0) + "]", Logging.White); DirectItem charge = Cache.Instance.CurrentShipsCargo.Items.OrderBy(e => e.Quantity).FirstOrDefault(e => e.TypeId == ammo.TypeId); // We do not have any ammo left that can hit targets at that range! if (charge == null) { if (Settings.Instance.DebugReloadorChangeAmmo) Logging.Log("Combat", "ReloadEnergyWeaponAmmo: We do not have any ammo left that can hit targets at that range!", Logging.Orange); return false; } if (Settings.Instance.DebugReloadorChangeAmmo) Logging.Log("Combat", "ReloadEnergyWeaponAmmo: charge: [" + charge.TypeName + "][" + charge.TypeId + "]", Logging.White); // We have enough ammo loaded if (weapon.Charge != null && weapon.Charge.TypeId == ammo.TypeId) { if (Settings.Instance.DebugReloadorChangeAmmo) Logging.Log("Combat", "ReloadEnergyWeaponAmmo: We have Enough Ammo of that type Loaded Already", Logging.White); return true; } // We are reloading, wait if (weapon.IsReloadingAmmo) return true; // We are reloading, wait if (weapon.IsChangingAmmo) return true; // Reload or change ammo if (weapon.Charge != null && weapon.Charge.TypeId == charge.TypeId) { // // reload // if (weapon.ReloadAmmo(charge, weaponNumber, (double) ammo.Range)) { return true; } return false; } // // change ammo // if (weapon.ChangeAmmo(charge, weaponNumber, (double) ammo.Range, entity.Name, entity.Distance)) { return true; } return false; }
public static bool ReloadEnergyWeaponAmmo(ModuleCache weapon, EntityCache entity, int weaponNumber) { DirectContainer cargo = Cache.Instance.DirectEve.GetShipsCargo(); // Get ammo based on damage type IEnumerable<Ammo> correctAmmo = Settings.Instance.Ammo.Where(a => a.DamageType == Cache.Instance.DamageType).ToList(); // Check if we still have that ammo in our cargo IEnumerable<Ammo> correctAmmoInCargo = correctAmmo.Where(a => cargo.Items.Any(i => i.TypeId == a.TypeId)).ToList(); //check if mission specific ammo is defined if (Cache.Instance.MissionAmmo.Count() != 0) { correctAmmoInCargo = Cache.Instance.MissionAmmo.Where(a => a.DamageType == Cache.Instance.DamageType).ToList(); } // Check if we still have that ammo in our cargo correctAmmoInCargo = correctAmmoInCargo.Where(a => cargo.Items.Any(i => i.TypeId == a.TypeId && i.Quantity >= Settings.Instance.MinimumAmmoCharges)).ToList(); if (Cache.Instance.MissionAmmo.Count() != 0) { correctAmmoInCargo = Cache.Instance.MissionAmmo; } // We are out of ammo! :( if (!correctAmmoInCargo.Any()) { Logging.Log("Combat", "ReloadEnergyWeapon: not enough [" + Cache.Instance.DamageType + "] ammo in cargohold: MinimumCharges: [" + Settings.Instance.MinimumAmmoCharges + "]", Logging.Orange); _States.CurrentCombatState = CombatState.OutOfAmmo; return false; } if (weapon.Charge != null) { IEnumerable<Ammo> areWeMissingAmmo = correctAmmoInCargo.Where(a => a.TypeId == weapon.Charge.TypeId); if (!areWeMissingAmmo.Any()) { Logging.Log("Combat", "ReloadEnergyWeaponAmmo: We have ammo loaded that does not have a full reload available in the cargo.", Logging.Orange); } } // Get the best possible ammo - energy weapons change ammo near instantly Ammo ammo = correctAmmoInCargo.Where(a => a.Range > (entity.Distance)).OrderBy(a => a.Range).FirstOrDefault(); //default // We do not have any ammo left that can hit targets at that range! if (ammo == null) { if (Settings.Instance.DebugReloadorChangeAmmo) Logging.Log("Combat", "ReloadEnergyWeaponAmmo: best possible ammo: [ ammo == null]", Logging.White); return false; } if (Settings.Instance.DebugReloadorChangeAmmo) Logging.Log("Combat", "ReloadEnergyWeaponAmmo: best possible ammo: [" + ammo.TypeId + "][" + ammo.DamageType + "]", Logging.White); if (Settings.Instance.DebugReloadorChangeAmmo) Logging.Log("Combat", "ReloadEnergyWeaponAmmo: best possible ammo: [" + entity.Name + "][" + Math.Round(entity.Distance / 1000, 0) + "]", Logging.White); DirectItem charge = cargo.Items.OrderBy(i => i.Quantity).FirstOrDefault(i => i.TypeId == ammo.TypeId); // We do not have any ammo left that can hit targets at that range! if (charge == null) { if (Settings.Instance.DebugReloadorChangeAmmo) Logging.Log("Combat", "ReloadEnergyWeaponAmmo: We do not have any ammo left that can hit targets at that range!", Logging.Orange); return false; } if (Settings.Instance.DebugReloadorChangeAmmo) Logging.Log("Combat", "ReloadEnergyWeaponAmmo: charge: [" + charge.TypeName + "][" + charge.TypeId + "]", Logging.White); // We have enough ammo loaded if (weapon.Charge != null && weapon.Charge.TypeId == ammo.TypeId) { if (Settings.Instance.DebugReloadorChangeAmmo) Logging.Log("Combat", "ReloadEnergyWeaponAmmo: We have Enough Ammo of that type Loaded Already", Logging.White); return true; } // We are reloading, wait at least 5 seconds if (LastWeaponReload.ContainsKey(weapon.ItemId) && DateTime.UtcNow < LastWeaponReload[weapon.ItemId].AddSeconds(5)) { if (Settings.Instance.DebugReloadorChangeAmmo) Logging.Log("Combat", "ReloadEnergyWeaponAmmo: We are currently reloading: waiting", Logging.White); return false; } LastWeaponReload[weapon.ItemId] = DateTime.UtcNow; // Reload or change ammo if (weapon.Charge != null && weapon.Charge.TypeId == charge.TypeId) { Logging.Log("Combat", "Reloading [" + weaponNumber + "] with [" + charge.TypeName + "][" + Math.Round((double)ammo.Range / 1000, 0) + "][TypeID: " + charge.TypeId + "]", Logging.Teal); weapon.ReloadAmmo(charge); weapon.ReloadTimeThisMission = weapon.ReloadTimeThisMission + 1; } else { Logging.Log("Combat", "Changing [" + weaponNumber + "] with [" + charge.TypeName + "][" + Math.Round((double)ammo.Range / 1000, 0) + "][TypeID: " + charge.TypeId + "] so we can hit [" + entity.Name + "][" + Math.Round(entity.Distance / 1000, 0) + "k]", Logging.Teal); weapon.ChangeAmmo(charge); weapon.ReloadTimeThisMission = weapon.ReloadTimeThisMission + 1; } // Return false as we are reloading ammo return false; }