using Barotrauma.Items.Components; using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Barotrauma.Extensions; namespace Barotrauma { class AIObjectivePumpWater : AIObjectiveLoop { public override Identifier Identifier { get; set; } = "pump water".ToIdentifier(); public override bool KeepDivingGearOn => true; public override bool AllowAutomaticItemUnequipping => true; protected override bool AllowWhileHandcuffed => false; private List pumpList; public AIObjectivePumpWater(Character character, AIObjectiveManager objectiveManager, Identifier option, float priorityModifier = 1) : base(character, objectiveManager, priorityModifier, option) { } protected override void FindTargets() { if (Option == null) { return; } base.FindTargets(); } protected override bool IsValidTarget(Pump pump) { if (pump?.Item == null || pump.Item.Removed) { return false; } if (pump.Item.IgnoreByAI(character)) { return false; } if (!pump.Item.IsInteractable(character)) { return false; } if (pump.IsAutoControlled) { return false; } if (pump.Item.ConditionPercentage <= 0) { return false; } if (pump.Item.CurrentHull == null) { return false; } if (pump.Item.CurrentHull.FireSources.Count > 0) { return false; } if (character.Submarine != null && pump.Item.Submarine != null) { if (!character.Submarine.IsConnectedTo(pump.Item.Submarine)) { return false; } } if (Character.CharacterList.Any(c => c.CurrentHull == pump.Item.CurrentHull && !HumanAIController.IsFriendly(c) && HumanAIController.IsActive(c))) { return false; } if (pump.Item.IsClaimedByBallastFlora) { return false; } if (IsReady(pump)) { return false; } return true; } protected override IEnumerable GetList() { if (pumpList == null) { if (character == null || character.Submarine == null) { return Array.Empty(); } pumpList = new List(); foreach (Item item in character.Submarine.GetItems(true)) { var pump = item.GetComponent(); if (pump == null || pump.Item.Submarine == null || pump.Item.CurrentHull == null) { continue; } if (pump.Item.Submarine.TeamID != character.TeamID) { continue; } if (pump.Item.HasTag(Tags.Ballast)) { continue; } pumpList.Add(pump); } } return pumpList; } protected override float GetTargetPriority() { if (Targets.None()) { return 0; } if (Option == "stoppumping") { return Targets.Max(t => MathHelper.Lerp(0, 100, Math.Abs(t.FlowPercentage / 100))); } else { return Targets.Max(t => MathHelper.Lerp(100, 0, Math.Abs(-t.FlowPercentage / 100))); } } private bool IsReady(Pump pump) { if (Option == "stoppumping") { return !pump.IsActive || MathUtils.NearlyEqual(pump.FlowPercentage, 0); } else { return !pump.Item.InWater || pump.IsActive && pump.FlowPercentage <= -99.9f; } } protected override AIObjective ObjectiveConstructor(Pump pump) => new AIObjectiveOperateItem(pump, character, objectiveManager, Option, false) { completionCondition = () => IsReady(pump) }; protected override void OnObjectiveCompleted(AIObjective objective, Pump target) => HumanAIController.RemoveTargets(character, target); } }