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