diff --git a/Barotrauma/BarotraumaClient/Source/Fonts/ScalableFont.cs b/Barotrauma/BarotraumaClient/Source/Fonts/ScalableFont.cs
index a64d9b6e1..de6bcb3ab 100644
--- a/Barotrauma/BarotraumaClient/Source/Fonts/ScalableFont.cs
+++ b/Barotrauma/BarotraumaClient/Source/Fonts/ScalableFont.cs
@@ -425,6 +425,17 @@ namespace Barotrauma
return retVal;
}
+ public Vector2 MeasureChar(char c)
+ {
+ Vector2 retVal = Vector2.Zero;
+ retVal.Y = baseHeight * 1.8f;
+ if (texCoords.TryGetValue(c, out GlyphData gd))
+ {
+ retVal.X = gd.advance;
+ }
+ return retVal;
+ }
+
public void Dispose()
{
FontList.Remove(this);
diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUIComponent.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUIComponent.cs
index 61ae5e113..1be79d6b6 100644
--- a/Barotrauma/BarotraumaClient/Source/GUI/GUIComponent.cs
+++ b/Barotrauma/BarotraumaClient/Source/GUI/GUIComponent.cs
@@ -134,6 +134,8 @@ namespace Barotrauma
public bool IgnoreLayoutGroups;
+ public bool IgnoreLayoutGroups;
+
public virtual ScalableFont Font
{
get;
diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUIMessageBox.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUIMessageBox.cs
index 435c43066..fa8ac527b 100644
--- a/Barotrauma/BarotraumaClient/Source/GUI/GUIMessageBox.cs
+++ b/Barotrauma/BarotraumaClient/Source/GUI/GUIMessageBox.cs
@@ -53,6 +53,12 @@ namespace Barotrauma
Content = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.85f), InnerFrame.RectTransform, Anchor.Center)) { AbsoluteSpacing = 5 };
Tag = tag;
+ InnerFrame = new GUIFrame(new RectTransform(new Point(width, height), RectTransform, Anchor.Center) { IsFixedSize = false }, style: null);
+ GUI.Style.Apply(InnerFrame, "", this);
+
+ Content = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.85f), InnerFrame.RectTransform, Anchor.Center)) { AbsoluteSpacing = 5 };
+ Tag = tag;
+
if (height == 0)
{
string wrappedText = ToolBox.WrapText(text, Content.Rect.Width, GUI.Font);
diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUIStyle.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUIStyle.cs
index a3b89fd53..14b219a4a 100644
--- a/Barotrauma/BarotraumaClient/Source/GUI/GUIStyle.cs
+++ b/Barotrauma/BarotraumaClient/Source/GUI/GUIStyle.cs
@@ -99,6 +99,12 @@ namespace Barotrauma
return style;
}
+ public GUIComponentStyle GetComponentStyle(string name)
+ {
+ componentStyles.TryGetValue(name.ToLowerInvariant(), out GUIComponentStyle style);
+ return style;
+ }
+
public void Apply(GUIComponent targetComponent, string styleName = "", GUIComponent parent = null)
{
GUIComponentStyle componentStyle = null;
diff --git a/Barotrauma/BarotraumaClient/Source/GameMain.cs b/Barotrauma/BarotraumaClient/Source/GameMain.cs
index 12f296bf5..4708c53b4 100644
--- a/Barotrauma/BarotraumaClient/Source/GameMain.cs
+++ b/Barotrauma/BarotraumaClient/Source/GameMain.cs
@@ -178,14 +178,6 @@ namespace Barotrauma
GUI.KeyboardDispatcher = new EventInput.KeyboardDispatcher(Window);
- GUI.KeyboardDispatcher = new EventInput.KeyboardDispatcher(Window);
-
- GUI.KeyboardDispatcher = new EventInput.KeyboardDispatcher(Window);
-
-
- PerformanceCounter = new PerformanceCounter();
-
- PerformanceCounter = new PerformanceCounter();
PerformanceCounter = new PerformanceCounter();
diff --git a/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs b/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs
index 2a0aa2f37..d6bec4488 100644
--- a/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs
+++ b/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs
@@ -70,18 +70,89 @@ namespace Barotrauma
public CrewManager(XElement element, bool isSinglePlayer)
: this(isSinglePlayer)
{
- foreach (XElement subElement in element.Elements())
- {
- if (subElement.Name.ToString().ToLowerInvariant() != "character") continue;
+ return characterListBox.Rect;
+ }
- var characterInfo = new CharacterInfo(subElement);
- characterInfos.Add(characterInfo);
- foreach (XElement invElement in subElement.Elements())
+ 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));
+
+ crewArea = new GUIFrame(HUDLayoutSettings.ToRectTransform(HUDLayoutSettings.CrewArea, guiFrame.RectTransform), "", Color.Transparent)
+ {
+ CanBeFocused = false
+ };
+ toggleCrewButton = new GUIButton(new RectTransform(new Point((int)(30 * GUI.Scale), HUDLayoutSettings.CrewArea.Height), guiFrame.RectTransform)
+ { AbsoluteOffset = HUDLayoutSettings.CrewArea.Location },
+ "", style: "UIToggleButton");
+ toggleCrewButton.OnClicked += (GUIButton btn, object userdata) =>
+ {
+ ToggleCrewAreaOpen = !ToggleCrewAreaOpen;
+ return true;
+ };
+
+ characterListBox = new GUIListBox(new RectTransform(new Point(100, (int)(crewArea.Rect.Height - scrollButtonSize.Y * 1.6f)), crewArea.RectTransform, Anchor.CenterLeft), false, Color.Transparent, null)
+ {
+ //Spacing = (int)(3 * GUI.Scale),
+ ScrollBarEnabled = false,
+ ScrollBarVisible = false,
+ CanBeFocused = false
+ };
+
+ scrollButtonUp = new GUIButton(new RectTransform(scrollButtonSize, crewArea.RectTransform, Anchor.TopLeft, Pivot.TopLeft), "", Alignment.Center, "GUIButtonVerticalArrow")
+ {
+ Visible = false,
+ UserData = -1,
+ OnClicked = ScrollCharacterList
+ };
+ scrollButtonDown = new GUIButton(new RectTransform(scrollButtonSize, crewArea.RectTransform, Anchor.BottomLeft, Pivot.BottomLeft), "", Alignment.Center, "GUIButtonVerticalArrow")
+ {
+ Visible = false,
+ UserData = 1,
+ OnClicked = ScrollCharacterList
+ };
+ scrollButtonDown.Children.ForEach(c => c.SpriteEffects = SpriteEffects.FlipVertically);
+
+ if (isSinglePlayer)
+ {
+ ChatBox = new ChatBox(guiFrame, isSinglePlayer: true)
{
- if (invElement.Name.ToString().ToLowerInvariant() != "inventory") continue;
- characterInfo.InventoryData = invElement;
- break;
- }
+ OnEnterMessage = (textbox, text) =>
+ {
+ if (Character.Controlled?.Info == null)
+ {
+ textbox.Deselect();
+ textbox.Text = "";
+ return true;
+ }
+
+ textbox.TextColor = ChatMessage.MessageColor[(int)ChatMessageType.Default];
+
+ if (!string.IsNullOrWhiteSpace(text))
+ {
+ string msgCommand = ChatMessage.GetChatMessageCommand(text, out string msg);
+ AddSinglePlayerChatMessage(
+ Character.Controlled.Info.Name,
+ msg,
+ ((msgCommand == "r" || msgCommand == "radio") && ChatMessage.CanUseRadio(Character.Controlled)) ? ChatMessageType.Radio : ChatMessageType.Default,
+ Character.Controlled);
+ var headset = GetHeadset(Character.Controlled, true);
+ if (headset != null && headset.CanTransmit())
+ {
+ headset.TransmitSignal(stepsTaken: 0, signal: msg, source: headset.Item, sender: Character.Controlled, sendToChat: false);
+ }
+ }
+ textbox.Deselect();
+ textbox.Text = "";
+ return true;
+ }
+ };
+
+ ChatBox.InputBox.OnTextChanged += ChatBox.TypingChatMessage;
}
var reports = Order.PrefabList.FindAll(o => o.TargetAllCharacters && o.SymbolSprite != null);
@@ -120,12 +191,14 @@ namespace Barotrauma
Visible = false
};
- var img = new GUIImage(new RectTransform(Vector2.One, btn.RectTransform), order.Prefab.SymbolSprite, scaleToFit: true)
+ var characterInfo = new CharacterInfo(subElement);
+ characterInfos.Add(characterInfo);
+ foreach (XElement invElement in subElement.Elements())
{
- Color = order.Color,
- HoverColor = Color.Lerp(order.Color, Color.White, 0.5f),
- ToolTip = order.Name
- };
+ if (invElement.Name.ToString().ToLowerInvariant() != "inventory") continue;
+ characterInfo.InventoryData = invElement;
+ break;
+ }
}
screenResolution = new Point(GameMain.GraphicsWidth, GameMain.GraphicsHeight);
@@ -135,16 +208,6 @@ namespace Barotrauma
ToggleCrewAreaOpen = GameMain.Config.CrewMenuOpen;
}
-
- #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)
@@ -666,19 +729,6 @@ namespace Barotrauma
characterListBox.BarScroll = roundedPos;
}
- #region Dialog
- ///
- /// Adds the message to the single player chatbox.
- ///
- public void AddSinglePlayerChatMessage(string senderName, string text, ChatMessageType messageType, Character sender)
- {
- if (!isSinglePlayer)
- {
- DebugConsole.ThrowError("Cannot add messages to single player chat box in multiplayer mode!\n" + Environment.StackTrace);
- return;
- }
- if (string.IsNullOrEmpty(text)) { return; }
-
ChatBox.AddMessage(ChatMessage.Create(senderName, text, messageType, sender));
}
diff --git a/Barotrauma/BarotraumaClient/Source/Items/CharacterInventory.cs b/Barotrauma/BarotraumaClient/Source/Items/CharacterInventory.cs
index 4b232ad92..532e98df2 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/CharacterInventory.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/CharacterInventory.cs
@@ -440,16 +440,6 @@ namespace Barotrauma
}
}
- public override void Update(float deltaTime, Camera cam, bool isSubInventory = false)
- {
- if (!AccessibleWhenAlive && !character.IsDead)
- {
- syncItemsDelay = Math.Max(syncItemsDelay - deltaTime, 0.0f);
- return;
- }
-
- base.Update(deltaTime, cam);
-
//force personal slots open if an item is running out of battery/fuel/oxygen/etc
if (hidePersonalSlots)
{
@@ -473,6 +463,7 @@ namespace Barotrauma
{
UpdateSubInventory(deltaTime, highlightedSubInventorySlot.SlotIndex, cam);
}
+ }
Rectangle hoverArea = GetSubInventoryHoverArea(highlightedSubInventorySlot);
if (highlightedSubInventorySlot.Inventory?.slots == null || (!hoverArea.Contains(PlayerInput.MousePosition)))
diff --git a/Barotrauma/BarotraumaClient/Source/Map/Hull.cs b/Barotrauma/BarotraumaClient/Source/Map/Hull.cs
index b755074bb..9ed321c15 100644
--- a/Barotrauma/BarotraumaClient/Source/Map/Hull.cs
+++ b/Barotrauma/BarotraumaClient/Source/Map/Hull.cs
@@ -380,6 +380,33 @@ namespace Barotrauma
Color.Green, width: 2);
}
}
+
+ foreach (MapEntity e in linkedTo)
+ {
+ if (e is Hull)
+ {
+ Hull linkedHull = (Hull)e;
+ Rectangle connectedHullRect = e.Submarine == null ?
+ linkedHull.rect :
+ new Rectangle(
+ (int)(Submarine.DrawPosition.X + linkedHull.WorldPosition.X),
+ (int)(Submarine.DrawPosition.Y + linkedHull.WorldPosition.Y),
+ linkedHull.WorldRect.Width, linkedHull.WorldRect.Height);
+
+ //center of the hull
+ Rectangle currentHullRect = Submarine == null ?
+ WorldRect :
+ new Rectangle(
+ (int)(Submarine.DrawPosition.X + WorldPosition.X),
+ (int)(Submarine.DrawPosition.Y + WorldPosition.Y),
+ WorldRect.Width, WorldRect.Height);
+
+ GUI.DrawLine(spriteBatch,
+ new Vector2(currentHullRect.X, -currentHullRect.Y),
+ new Vector2(connectedHullRect.X, -connectedHullRect.Y),
+ Color.Green, width: 2);
+ }
+ }
}
public static void UpdateVertices(GraphicsDevice graphicsDevice, Camera cam, WaterRenderer renderer)
diff --git a/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs b/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs
index d4a0cfdd0..5a122773b 100644
--- a/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs
+++ b/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs
@@ -24,6 +24,10 @@ namespace Barotrauma
private GUIComponent selectedLocationInfo;
private GUIListBox selectedMissionInfo;
+ private GUIComponent missionPanel;
+ private GUIComponent selectedLocationInfo;
+ private GUIListBox selectedMissionInfo;
+
private GUIButton repairHullsButton, repairItemsButton;
private GUIFrame characterPreviewFrame;
diff --git a/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs
index e9adfa167..3716a8561 100644
--- a/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs
+++ b/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs
@@ -312,25 +312,6 @@ namespace Barotrauma
return true;
};
- playYourself = new GUITickBox(new RectTransform(new Vector2(0.06f, 0.06f), myCharacterFrame.RectTransform) { RelativeOffset = new Vector2(0.05f,0.05f) },
- TextManager.Get("PlayYourself"))
- {
- Selected = true,
- OnSelected = TogglePlayYourself,
- UserData = "playyourself"
- };
-
- var toggleMyPlayerFrame = new GUIButton(new RectTransform(new Point(25, 70), myCharacterFrame.RectTransform, Anchor.TopLeft, Pivot.TopRight), "", style: "GUIButtonHorizontalArrow");
- toggleMyPlayerFrame.OnClicked += (GUIButton btn, object userdata) =>
- {
- MyCharacterFrameOpen = !MyCharacterFrameOpen;
- foreach (GUIComponent child in btn.Children)
- {
- child.SpriteEffects = MyCharacterFrameOpen ? SpriteEffects.FlipHorizontally : SpriteEffects.None;
- }
- return true;
- };
-
playYourself = new GUITickBox(new RectTransform(new Vector2(0.06f, 0.06f), myCharacterFrame.RectTransform) { RelativeOffset = new Vector2(0.05f,0.05f) },
TextManager.Get("PlayYourself"))
{
diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs
index 364acaaae..0d91bfffd 100644
--- a/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs
+++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs
@@ -1050,6 +1050,8 @@ namespace Barotrauma
private bool IsProperlyLatchedOnSub => LatchOntoAI != null && LatchOntoAI.IsAttachedToSub && SelectedAiTarget?.Entity == wallTarget?.Structure;
+ private bool IsProperlyLatchedOnSub => LatchOntoAI != null && LatchOntoAI.IsAttachedToSub && SelectedAiTarget?.Entity == wallTarget?.Structure;
+
//goes through all the AItargets, evaluates how preferable it is to attack the target,
//whether the Character can see/hear the target and chooses the most preferable target within
//sight/hearing range
diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs
index 7257b4c18..a1ac30d52 100644
--- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs
+++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs
@@ -2602,6 +2602,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
diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Steering.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Steering.cs
index c59d6bce6..cf60f4585 100644
--- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Steering.cs
+++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Steering.cs
@@ -198,6 +198,19 @@ namespace Barotrauma.Items.Components
return true;
}
+ public override void OnItemLoaded()
+ {
+ sonar = item.GetComponent();
+ }
+
+ public override bool Select(Character character)
+ {
+ if (!CanBeSelected) return false;
+
+ user = character;
+ return true;
+ }
+
public override void Update(float deltaTime, Camera cam)
{
networkUpdateTimer -= deltaTime;
diff --git a/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs b/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs
index 0b833e2dd..11bf41f6c 100644
--- a/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs
+++ b/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs
@@ -18,10 +18,7 @@ namespace Barotrauma
private Hull hull;
- private readonly Submarine submarine;
- public Submarine Submarine => submarine;
-
- protected bool removed;
+ private bool removed;
private bool removed;
diff --git a/Barotrauma/BarotraumaShared/Source/Map/Hull.cs b/Barotrauma/BarotraumaShared/Source/Map/Hull.cs
index 3cfbaa599..03220257b 100644
--- a/Barotrauma/BarotraumaShared/Source/Map/Hull.cs
+++ b/Barotrauma/BarotraumaShared/Source/Map/Hull.cs
@@ -109,6 +109,25 @@ namespace Barotrauma
}
}
+ public string DisplayName
+ {
+ get;
+ private set;
+ }
+
+ private string roomName;
+ [Editable, Serialize("", true, translationTextTag: "RoomName.")]
+ public string RoomName
+ {
+ get { return roomName; }
+ set
+ {
+ if (roomName == value) { return; }
+ roomName = value;
+ DisplayName = TextManager.Get(roomName, returnNull: true) ?? roomName;
+ }
+ }
+
public override Rectangle Rect
{
get
diff --git a/Barotrauma/BarotraumaShared/Source/Map/Structure.cs b/Barotrauma/BarotraumaShared/Source/Map/Structure.cs
index 55608b242..250c1e652 100644
--- a/Barotrauma/BarotraumaShared/Source/Map/Structure.cs
+++ b/Barotrauma/BarotraumaShared/Source/Map/Structure.cs
@@ -1206,6 +1206,9 @@ namespace Barotrauma
if (FlippedX) element.Add(new XAttribute("flippedx", true));
if (FlippedY) element.Add(new XAttribute("flippedy", true));
+ if (FlippedX) element.Add(new XAttribute("flippedx", true));
+ if (FlippedY) element.Add(new XAttribute("flippedy", true));
+
for (int i = 0; i < Sections.Length; i++)
{
if (Sections[i].damage == 0.0f) continue;
diff --git a/Barotrauma/BarotraumaShared/Source/PlayerInput.cs b/Barotrauma/BarotraumaShared/Source/PlayerInput.cs
index e13028523..8ad826eea 100644
--- a/Barotrauma/BarotraumaShared/Source/PlayerInput.cs
+++ b/Barotrauma/BarotraumaShared/Source/PlayerInput.cs
@@ -162,6 +162,21 @@ namespace Barotrauma
get { return binding; }
}
+ public void SetState()
+ {
+ hit = binding.IsHit();
+ if (hit) hitQueue = true;
+
+ held = binding.IsDown();
+ if (held) heldQueue = true;
+ }
+#endif
+
+ public KeyOrMouse State
+ {
+ get { return binding; }
+ }
+
public void SetState()
{
hit = binding.IsHit();