using Barotrauma.Items.Components; using System.Collections.Generic; using System.Linq; namespace Barotrauma { class AIObjectivePumpWater : AIObjectiveLoop { public override string DebugTag => "pump water"; public override bool KeepDivingGearOn => true; private readonly IEnumerable pumpList; public AIObjectivePumpWater(Character character, string option) : base(character, option) { pumpList = character.Submarine.GetItems(true).Select(i => i.GetComponent()).Where(p => p != null); } public override float GetPriority(AIObjectiveManager objectiveManager) { if (character.Submarine == null) { return 0; } if (objectiveManager.CurrentOrder == this && targets.Count > 0) { return AIObjectiveManager.OrderPriority; } return 0.0f; } public override bool IsDuplicate(AIObjective otherObjective) => otherObjective is AIObjectivePumpWater && otherObjective.Option == Option; //availablePumps = allPumps.Where(p => !p.Item.HasTag("ballast") && p.Item.Connections.None(c => c.IsPower && p.Item.GetConnectedComponentsRecursive(c).None())).ToList(); protected override void FindTargets() { if (option == null) { return; } foreach (Item item in Item.ItemList) { if (item.HasTag("ballast")) { continue; } if (item.Submarine == null) { continue; } if (item.Submarine.TeamID != character.TeamID) { continue; } if (character.Submarine != null && !character.Submarine.IsEntityFoundOnThisSub(item, true)) { continue; } var pump = item.GetComponent(); if (pump != null) { if (!ignoreList.Contains(pump)) { if (option == "stoppumping") { if (!pump.IsActive || pump.FlowPercentage == 0.0f) { continue; } } else { if (!pump.Item.InWater) { continue; } if (pump.IsActive && pump.FlowPercentage <= -90.0f) { continue; } } if (!targets.Contains(pump)) { targets.Add(pump); } } } } } protected override bool Filter(Pump pump) => true; protected override IEnumerable GetList() => pumpList; protected override AIObjective ObjectiveConstructor(Pump pump) => new AIObjectiveOperateItem(pump, character, Option, false); protected override float Average(Pump target) => 0; } }