From 69c414dfc940b8513ef89f0dec84498bed76bd85 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Fri, 5 Apr 2019 16:20:58 +0300 Subject: [PATCH] (34cca982f) Steering tweaks that should fix bots not being able to proceed on ladders when the next waypoint is not on the ladder but the one after that is. --- .../Source/GameSession/CrewManager.cs | 17 ++-- .../Source/Items/Components/ItemComponent.cs | 79 +++++++++++++++++ .../Source/Items/Components/Turret.cs | 9 +- .../Characters/AI/IndoorsSteeringManager.cs | 84 +++++++++++++++++-- 4 files changed, 168 insertions(+), 21 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs b/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs index 736783e38..132a7cfc6 100644 --- a/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs +++ b/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs @@ -60,12 +60,19 @@ namespace Barotrauma public CrewManager(XElement element, bool isSinglePlayer) : this(isSinglePlayer) + { + return characterListBox.Rect; + } + + partial void InitProjectSpecific() { guiFrame = new GUIFrame(new RectTransform(Vector2.One, GUICanvas.Instance), null, Color.Transparent) { CanBeFocused = false }; + Point scrollButtonSize = new Point((int)(200 * GUI.Scale), (int)(30 * GUI.Scale)); + var characterInfo = new CharacterInfo(subElement); characterInfos.Add(characterInfo); foreach (XElement invElement in subElement.Elements()) @@ -125,16 +132,6 @@ namespace Barotrauma prevUIScale = GUI.Scale; } - - #endregion - - #region Character list management - - public Rectangle GetCharacterListArea() - { - return characterListBox.Rect; - } - partial void InitProjectSpecific() { guiFrame = new GUIFrame(new RectTransform(Vector2.One, GUICanvas.Instance), null, Color.Transparent) diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs index e5c8ea551..5cd9780b0 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/ItemComponent.cs @@ -234,6 +234,85 @@ namespace Barotrauma.Items.Components private set; } + private bool useAlternativeLayout; + public bool UseAlternativeLayout + { + get { return useAlternativeLayout; } + set + { + if (AlternativeLayout != null) + { + if (value == useAlternativeLayout) { return; } + useAlternativeLayout = value; + if (useAlternativeLayout) + { + AlternativeLayout?.ApplyTo(GuiFrame.RectTransform); + } + else + { + DefaultLayout?.ApplyTo(GuiFrame.RectTransform); + } + } + } + + public void ApplyTo(RectTransform target) + { + if (RelativeOffset.HasValue) + { + target.RelativeOffset = RelativeOffset.Value; + } + else if (AbsoluteOffset.HasValue) + { + target.AbsoluteOffset = AbsoluteOffset.Value; + } + if (RelativeSize.HasValue) + { + target.RelativeSize = RelativeSize.Value; + } + else if (AbsoluteSize.HasValue) + { + target.NonScaledSize = AbsoluteSize.Value; + } + if (Anchor.HasValue) + { + target.Anchor = Anchor.Value; + } + if (Pivot.HasValue) + { + target.Pivot = Pivot.Value; + } + else + { + target.Pivot = RectTransform.MatchPivotToAnchor(target.Anchor); + } + target.RecalculateChildren(true, true); + } + } + + public GUIFrame GuiFrame { get; protected set; } + + [Serialize(false, false)] + public bool AllowUIOverlap + { + get; + set; + } + + private ItemComponent linkToUIComponent; + [Serialize("", false)] + public string LinkUIToComponent + { + get; + set; + } + + [Serialize(0, false)] + public int HudPriority + { + get; + private set; + } + private bool shouldMuffleLooping; private float lastMuffleCheckTime; private ItemSound loopingSound; diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Turret.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Turret.cs index 5feaf21da..6e42a2949 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Turret.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Turret.cs @@ -339,10 +339,11 @@ namespace Barotrauma.Items.Components } } - float zoom = cam == null ? 1.0f : (float)Math.Sqrt(cam.Zoom); - - crosshairSprite?.Draw(spriteBatch, crosshairPos, readyToFire ? Color.White : Color.White * 0.2f, 0, zoom); - crosshairPointerSprite?.Draw(spriteBatch, crosshairPointerPos, 0, zoom); + if (crosshairSprite != null) + { + crosshairSprite.Draw(spriteBatch, crosshairPos, readyToFire ? Color.White : Color.White * 0.2f, 0, (float)Math.Sqrt(cam.Zoom)); + } + if (crosshairPointerSprite != null) crosshairPointerSprite.Draw(spriteBatch, crosshairPointerPos, 0, (float)Math.Sqrt(cam.Zoom)); } public void ClientRead(ServerNetObject type, NetBuffer msg, float sendingTime) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/IndoorsSteeringManager.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/IndoorsSteeringManager.cs index 532d715f3..6c3d6ba8a 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/IndoorsSteeringManager.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/IndoorsSteeringManager.cs @@ -43,11 +43,80 @@ namespace Barotrauma private set; } - public bool InLadders => currentPath != null && currentPath.CurrentNode != null && currentPath.CurrentNode.Ladders != null; - public bool IsNextNodeLadder => currentPath.NextNode != null && currentPath.CurrentNode.Ladders != null; - public bool IsNextLadderSameAsCurrent => IsNextNodeLadder && currentPath.CurrentNode.Ladders == currentPath.NextNode.Ladders; + /// + /// Returns true if the current or the next node is in ladders. + /// + public bool InLadders => + currentPath != null && + currentPath.CurrentNode != null && (currentPath.CurrentNode.Ladders != null || + (currentPath.NextNode != null && currentPath.NextNode.Ladders != null)); - public bool InStairs => currentPath != null && currentPath.CurrentNode != null && currentPath.CurrentNode.Stairs != null; + /// + /// Returns true if the current or the next node is in stairs. + /// + public bool InStairs => + currentPath != null && + currentPath.CurrentNode != null && (currentPath.CurrentNode.Stairs != null || + (currentPath.NextNode != null && currentPath.NextNode.Stairs != null)); + + public bool IsNextNodeLadder + { + get + { + if (currentPath == null) { return false; } + if (currentPath.NextNode == null) { return false; } + if (currentPath.NextNode.Ladders != null) + { + return true; + } + else + { + // Check if the node after the next node is ladder. + int index = currentPath.CurrentIndex + 2; + if (currentPath.Nodes.Count > index) + { + var node = currentPath.Nodes[index]; + if (node == null) { return false; } + // Only applied if the node is close enough to the current node. + if (Vector2.DistanceSquared(currentPath.CurrentNode.WorldPosition, node.WorldPosition) > 100) { return false; } + return node.Ladders != null; + } + return false; + } + } + } + + public bool IsNextLadderSameAsCurrent + { + get + { + if (currentPath == null) { return false; } + if (currentPath.CurrentNode == null) { return false; } + if (currentPath.NextNode == null) { return false; } + var currentLadder = currentPath.CurrentNode.Ladders; + if (currentLadder == null) { return false; } + var nextLadder = currentPath.NextNode.Ladders; + if (nextLadder != null) + { + return currentLadder == nextLadder; + } + else + { + // Check if the node after the next node is in the same ladder as the current. + int index = currentPath.CurrentIndex + 2; + if (currentPath.Nodes.Count > index) + { + var node = currentPath.Nodes[index]; + if (node == null) { return false; } + // Only applied if the node is close enough to the current node. + if (Vector2.DistanceSquared(currentPath.CurrentNode.WorldPosition, node.WorldPosition) > 100) { return false; } + nextLadder = node.Ladders; + return nextLadder != null && nextLadder == currentLadder; + } + return false; + } + } + } public IndoorsSteeringManager(ISteerable host, bool canOpenDoors, bool canBreakDoors) : base(host) { @@ -171,8 +240,9 @@ namespace Barotrauma if (character.IsClimbing) { Vector2 diff = currentPath.CurrentNode.SimPosition - pos; + bool nextLadderSamesCurrent = IsNextLadderSameAsCurrent; - if (IsNextLadderSameAsCurrent) + if (nextLadderSamesCurrent) { //climbing ladders -> don't move horizontally diff.X = 0.0f; @@ -190,14 +260,14 @@ namespace Barotrauma bool aboveFloor = heightFromFloor > 0.0f && heightFromFloor < collider.height * 1.5f; if (aboveFloor || IsNextNodeLadder) { - if (!IsNextLadderSameAsCurrent) + if (!nextLadderSamesCurrent) { character.AnimController.Anim = AnimController.Animation.None; } currentPath.SkipToNextNode(); } } - else if (IsNextLadderSameAsCurrent) + else if (nextLadderSamesCurrent) { //if the current node is below the character and the next one is above (or vice versa) //and both are on ladders, we can skip directly to the next one