diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs index 7188dc107..306b0a65b 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs @@ -493,7 +493,7 @@ namespace Barotrauma } else { - if (!IsProperlyLatchedOnSub) + if (!IsLatchedOnSub) { UpdateWallTarget(); } @@ -552,7 +552,7 @@ namespace Barotrauma { WallSection section = wallTarget.Structure.GetSection(wallTarget.SectionIndex); Vector2 targetPos = wallTarget.Structure.SectionPosition(wallTarget.SectionIndex, true); - if (section?.gap != null && section.gap.IsRoomToRoom && SteerThroughGap(wallTarget.Structure, section, targetPos, deltaTime)) + if (section?.gap != null && SteerThroughGap(wallTarget.Structure, section, targetPos, deltaTime)) { return; } @@ -1045,6 +1045,7 @@ namespace Barotrauma #endregion #region Targeting + private bool IsLatchedOnSub => LatchOntoAI != null && LatchOntoAI.IsAttachedToSub; private bool IsProperlyLatchedOnSub => LatchOntoAI != null && LatchOntoAI.IsAttachedToSub && SelectedAiTarget?.Entity == wallTarget?.Structure; @@ -1053,12 +1054,33 @@ namespace Barotrauma //sight/hearing range public AITarget UpdateTargets(Character character, out TargetingPriority priority) { - if (IsProperlyLatchedOnSub) + if (IsLatchedOnSub) { - // If attached to a valid target, just keep the target. - // Priority not used in this case. - priority = null; - return SelectedAiTarget; + var wall = SelectedAiTarget.Entity as Structure; + // The target is not a wall or it's not the same as we are attached to -> release + bool releaseTarget = wall == null || !wall.Bodies.Contains(LatchOntoAI.AttachJoints[0].BodyB); + if (!releaseTarget) + { + for (int i = 0; i < wall.Sections.Length; i++) + { + if (CanPassThroughHole(wall, i)) + { + releaseTarget = true; + } + } + } + if (releaseTarget) + { + SelectedAiTarget = null; + LatchOntoAI.DeattachFromBody(); + } + else if (SelectedAiTarget.Entity == wallTarget?.Structure) + { + // If attached to a valid target, just keep the target. + // Priority not used in this case. + priority = null; + return SelectedAiTarget; + } } AITarget newTarget = null; priority = null; @@ -1141,7 +1163,7 @@ namespace Barotrauma else if (target.Entity != null) { //skip the target if it's a room and the character is already inside a sub - if (character.CurrentHull != null && target.Entity is Hull) continue; + if (character.CurrentHull != null && target.Entity is Hull) { continue; } Door door = null; if (target.Entity is Item item) @@ -1170,6 +1192,13 @@ namespace Barotrauma // Ignore structures that doesn't have a body (not walls) continue; } + if (s.IsPlatform) + { + continue; + } + float wallMaxHealth = 400; // Anything more than this is ignored -> 200 = 1 + // Prefer weaker targets. + valueModifier = MathHelper.Lerp(2, 0, MathHelper.Clamp(s.Health / wallMaxHealth, 0, 1)); // Ignore walls when inside. valueModifier = character.CurrentHull == null ? 1 : 0; if (aggressiveBoarding) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs index ba902de7f..c09cc65c7 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs @@ -2559,6 +2559,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