From 250368078fe53915e1967611b1226d858c2e8d97 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Mon, 29 Apr 2019 21:09:18 +0300 Subject: [PATCH] (5c32d30a9) Adjust and fix the steering behavior: Only the characters in the idle state and outside the sub are considered active members of the group. --- .../Source/Characters/AI/EnemyAIController.cs | 7 ++++ .../Source/Characters/AI/SwarmBehavior.cs | 42 ++++++++++++++----- .../Source/Characters/Character.cs | 4 ++ 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs index 21fbeea06..42588f1dc 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs @@ -373,6 +373,12 @@ namespace Barotrauma LatchOntoAI?.Update(this, deltaTime); IsSteeringThroughGap = false; + if (SwarmBehavior != null) + { + SwarmBehavior.IsActive = State == AIState.Idle && Character.CurrentHull == null; + SwarmBehavior.Refresh(); + SwarmBehavior.UpdateSteering(deltaTime); + } steeringManager.Update(Character.AnimController.GetCurrentSpeed(run)); } @@ -793,6 +799,7 @@ namespace Barotrauma { UpdateLimbAttack(deltaTime, AttackingLimb, attackSimPos, distance); } + return false; } public bool IsSteeringThroughGap { get; private set; } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/SwarmBehavior.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/SwarmBehavior.cs index 3eb217589..76adf9000 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/SwarmBehavior.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/SwarmBehavior.cs @@ -14,11 +14,16 @@ namespace Barotrauma private float maxDistFromCenter; private float cohesion; - private List members = new List(); + public List Members { get; private set; } = new List(); + public HashSet ActiveMembers { get; private set; } = new HashSet(); - private AIController ai; + private EnemyAIController ai; - public SwarmBehavior(XElement element, AIController ai) + public bool IsActive { get; set; } + public bool IsEnoughMembers => ActiveMembers.Count > 1; + + + public SwarmBehavior(XElement element, EnemyAIController ai) { this.ai = ai; minDistFromClosest = ConvertUnits.ToSimUnits(element.GetAttributeFloat("mindistfromclosest", 10.0f)); @@ -32,21 +37,36 @@ namespace Barotrauma { if (character.AIController is EnemyAIController enemyAI && enemyAI.SwarmBehavior != null) { - enemyAI.SwarmBehavior.members = swarm.ToList(); + enemyAI.SwarmBehavior.Members = swarm.ToList(); } } } - public void Update(float deltaTime) + public void Refresh() { - members.RemoveAll(m => m.IsDead || m.Removed); - if (members.Count < 2) { return; } + Members.RemoveAll(m => m.IsDead || m.Removed); + foreach (var member in Members) + { + if (!member.AIController.Enabled && member.IsRemotePlayer || Character.Controlled == member || !((EnemyAIController)member.AIController).SwarmBehavior.IsActive) + { + ActiveMembers.Remove(member); + } + else + { + ActiveMembers.Add(member); + } + } + } + public void UpdateSteering(float deltaTime) + { + if (!IsActive) { return; } + if (!IsEnoughMembers) { return; } //calculate the "center of mass" of the swarm and the distance to the closest character in the swarm float closestDistSqr = float.MaxValue; Vector2 center = Vector2.Zero; AICharacter closest = null; - foreach (AICharacter member in members) + foreach (AICharacter member in Members) { center += member.SimPosition; if (member == ai.Character) { continue; } @@ -57,7 +77,7 @@ namespace Barotrauma closest = member; } } - center /= members.Count; + center /= Members.Count; if (closest == null) { return; } @@ -83,11 +103,11 @@ namespace Barotrauma if (cohesion > 0.0f) { Vector2 avgVel = Vector2.Zero; - foreach (AICharacter member in members) + foreach (AICharacter member in Members) { avgVel += member.AnimController.TargetMovement; } - avgVel /= members.Count; + avgVel /= Members.Count; ai.SteeringManager.SteeringManual(deltaTime, avgVel * cohesion); } } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs index c09cc65c7..14ed74ec4 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs @@ -2563,6 +2563,10 @@ namespace Barotrauma GameMain.GameSession?.CrewManager?.RemoveCharacter(this); #endif +#if CLIENT + GameMain.GameSession?.CrewManager?.RemoveCharacter(this); +#endif + #if CLIENT GameMain.GameSession?.CrewManager?.RemoveCharacter(this); #endif