diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/AITarget.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/AITarget.cs index 166f89537..5add4a6b3 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/AITarget.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/AITarget.cs @@ -75,13 +75,6 @@ namespace Barotrauma EnemyOnly } - public string SonarLabel; - - public bool Enabled = true; - - public float MinSoundRange, MinSightRange; - public float MaxSoundRange = float.MaxValue, MaxSightRange = float.MaxValue; - public Vector2 WorldPosition { get diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs index ac684c3cb..5be2b5d54 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs @@ -21,6 +21,8 @@ namespace Barotrauma private Hull currentTarget; private float newTargetTimer; + private bool searchingNewHull; + private float standStillTimer; private float walkDuration; @@ -66,7 +68,38 @@ namespace Barotrauma } if (newTargetTimer <= 0.0f) { - currentTarget = FindRandomHull(); + if (!searchingNewHull) + { + //find all available hulls first + FindTargetHulls(); + searchingNewHull = true; + return; + } + else if (targetHulls.Count > 0) + { + //choose a random available hull + var randomHull = ToolBox.SelectWeightedRandom(targetHulls, hullWeights, Rand.RandSync.Unsynced); + + bool isCurrentHullOK = !HumanAIController.UnsafeHulls.Contains(character.CurrentHull) && !IsForbidden(character.CurrentHull); + if (isCurrentHullOK) + { + // Check that there is no unsafe or forbidden hulls on the way to the target + // Only do this when the current hull is ok, because otherwise the would block all paths from the current hull to the target hull. + var path = PathSteering.PathFinder.FindPath(character.SimPosition, randomHull.SimPosition); + if (path.Unreachable || + path.Nodes.Any(n => HumanAIController.UnsafeHulls.Contains(n.CurrentHull) || IsForbidden(n.CurrentHull))) + { + //can't go to this room, remove it from the list and try another room next frame + int index = targetHulls.IndexOf(randomHull); + targetHulls.RemoveAt(index); + hullWeights.RemoveAt(index); + PathSteering.Reset(); + return; + } + } + currentTarget = randomHull; + searchingNewHull = false; + } if (currentTarget != null) { @@ -163,24 +196,27 @@ namespace Barotrauma private readonly List targetHulls = new List(20); private readonly List hullWeights = new List(20); - private Hull FindRandomHull() + private void FindTargetHulls() { var idCard = character.Inventory.FindItemByIdentifier("idcard"); - Hull targetHull = null; bool isCurrentHullOK = !HumanAIController.UnsafeHulls.Contains(character.CurrentHull) && !IsForbidden(character.CurrentHull); - //random chance of navigating back to the room where the character spawned - if (Rand.Int(5) == 1 && idCard != null) - { - foreach (WayPoint wp in WayPoint.WayPointList) - { - if (wp.SpawnType != SpawnType.Human || wp.CurrentHull == null) { continue; } - foreach (string tag in wp.IdCardTags) + targetHulls.Clear(); + hullWeights.Clear(); + foreach (var hull in Hull.hullList) + { + if (HumanAIController.UnsafeHulls.Contains(hull)) { continue; } + if (hull.Submarine == null) { continue; } + if (hull.Submarine.TeamID != character.TeamID) { continue; } + // If the character is inside, only take connected hulls into account. + if (character.Submarine != null && !character.Submarine.IsEntityFoundOnThisSub(hull, true)) { continue; } + if (IsForbidden(hull)) { continue; } + // Ignore hulls that are too low to stand inside + if (character.AnimController is HumanoidAnimController animController) + { + if (hull.CeilingHeight < ConvertUnits.ToDisplayUnits(animController.HeadPosition.Value)) { - if (idCard.HasTag(tag)) - { - targetHull = wp.CurrentHull; - } + continue; } } if (!targetHulls.Contains(hull)) @@ -189,47 +225,7 @@ namespace Barotrauma hullWeights.Add(hull.Volume); } } - if (targetHull == null) - { - targetHulls.Clear(); - hullWeights.Clear(); - foreach (var hull in Hull.hullList) - { - if (HumanAIController.UnsafeHulls.Contains(hull)) { continue; } - if (hull.Submarine == null) { continue; } - if (hull.Submarine.TeamID != character.TeamID) { continue; } - // If the character is inside, only take connected hulls into account. - if (character.Submarine != null && !character.Submarine.IsEntityFoundOnThisSub(hull, true)) { continue; } - if (IsForbidden(hull)) { continue; } - // Ignore hulls that are too low to stand inside - if (character.AnimController is HumanoidAnimController animController) - { - if (hull.CeilingHeight < ConvertUnits.ToDisplayUnits(animController.HeadPosition.Value)) - { - continue; - } - } - if (isCurrentHullOK) - { - // Check that there is no unsafe or forbidden hulls on the way to the target - // Only do this when the current hull is ok, because otherwise the would block all paths from the current hull to the target hull. - var path = PathSteering.PathFinder.FindPath(character.SimPosition, hull.SimPosition); - if (path.Unreachable) { continue; } - if (path.Nodes.Any(n => HumanAIController.UnsafeHulls.Contains(n.CurrentHull) || IsForbidden(n.CurrentHull))) { continue; } - } - - // If we want to do a steering check, we should do it here, before setting the path - //if (path.Cost > 1000.0f) { continue; } - - if (!targetHulls.Contains(hull)) - { - targetHulls.Add(hull); - hullWeights.Add(hull.Volume); - } - } - return ToolBox.SelectWeightedRandom(targetHulls, hullWeights, Rand.RandSync.Unsynced); - } - return targetHull; + } private bool IsForbidden(Hull hull) diff --git a/Barotrauma/BarotraumaShared/Submarines/Bunyip.sub b/Barotrauma/BarotraumaShared/Submarines/Bunyip.sub index ee8d2d85a..3d2057afc 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Bunyip.sub and b/Barotrauma/BarotraumaShared/Submarines/Bunyip.sub differ diff --git a/Barotrauma/BarotraumaShared/Submarines/Dugong.sub b/Barotrauma/BarotraumaShared/Submarines/Dugong.sub index 511746b0c..760896d43 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Dugong.sub and b/Barotrauma/BarotraumaShared/Submarines/Dugong.sub differ diff --git a/Barotrauma/BarotraumaShared/Submarines/Humpback.sub b/Barotrauma/BarotraumaShared/Submarines/Humpback.sub index 8b43c675f..cb20224a1 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Humpback.sub and b/Barotrauma/BarotraumaShared/Submarines/Humpback.sub differ diff --git a/Barotrauma/BarotraumaShared/Submarines/Orca.sub b/Barotrauma/BarotraumaShared/Submarines/Orca.sub index c20881e5c..3e9bd8a4e 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Orca.sub and b/Barotrauma/BarotraumaShared/Submarines/Orca.sub differ diff --git a/Barotrauma/BarotraumaShared/Submarines/Remora.sub b/Barotrauma/BarotraumaShared/Submarines/Remora.sub index 2383ef1a9..0691c9e7b 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Remora.sub and b/Barotrauma/BarotraumaShared/Submarines/Remora.sub differ diff --git a/Barotrauma/BarotraumaShared/Submarines/Selkie.sub b/Barotrauma/BarotraumaShared/Submarines/Selkie.sub index 23c9548e5..25e6379b0 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Selkie.sub and b/Barotrauma/BarotraumaShared/Submarines/Selkie.sub differ diff --git a/Barotrauma/BarotraumaShared/Submarines/Typhon.sub b/Barotrauma/BarotraumaShared/Submarines/Typhon.sub index 1113c5152..45d5eddc9 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Typhon.sub and b/Barotrauma/BarotraumaShared/Submarines/Typhon.sub differ diff --git a/Barotrauma/BarotraumaShared/Submarines/Venture.sub b/Barotrauma/BarotraumaShared/Submarines/Venture.sub index d72b72043..9fb0bcfd4 100644 Binary files a/Barotrauma/BarotraumaShared/Submarines/Venture.sub and b/Barotrauma/BarotraumaShared/Submarines/Venture.sub differ