diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUIComponent.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUIComponent.cs
index 5b4840414..0cb0eb420 100644
--- a/Barotrauma/BarotraumaClient/Source/GUI/GUIComponent.cs
+++ b/Barotrauma/BarotraumaClient/Source/GUI/GUIComponent.cs
@@ -172,6 +172,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 53347a4b5..25157ab14 100644
--- a/Barotrauma/BarotraumaClient/Source/GUI/GUIMessageBox.cs
+++ b/Barotrauma/BarotraumaClient/Source/GUI/GUIMessageBox.cs
@@ -167,6 +167,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/GameSession/CrewManager.cs b/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs
index f97bd8812..ff992b7b2 100644
--- a/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs
+++ b/Barotrauma/BarotraumaClient/Source/GameSession/CrewManager.cs
@@ -69,11 +69,6 @@ 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)
{
@@ -95,14 +90,64 @@ namespace Barotrauma
return true;
};
- var characterInfo = new CharacterInfo(subElement);
- characterInfos.Add(characterInfo);
- foreach (XElement invElement in subElement.Elements())
+ 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);
@@ -114,39 +159,14 @@ namespace Barotrauma
CanBeFocused = false
};
- //report buttons
- foreach (Order order in reports)
- {
- if (!order.TargetAllCharacters || order.SymbolSprite == null) continue;
- var btn = new GUIButton(new RectTransform(new Point(reportButtonFrame.Rect.Width), reportButtonFrame.RectTransform), style: null)
+ var characterInfo = new CharacterInfo(subElement);
+ characterInfos.Add(characterInfo);
+ foreach (XElement invElement in subElement.Elements())
{
- OnClicked = (GUIButton button, object userData) =>
- {
- if (Character.Controlled == null || Character.Controlled.SpeechImpediment >= 100.0f) return false;
- SetCharacterOrder(null, order, null, Character.Controlled);
- HumanAIController.PropagateHullSafety(Character.Controlled, Character.Controlled.CurrentHull);
- return true;
- },
- UserData = order,
- ToolTip = order.Name
- };
-
- new GUIFrame(new RectTransform(new Vector2(1.5f), btn.RectTransform, Anchor.Center), "OuterGlow")
- {
- Color = Color.Red * 0.8f,
- HoverColor = Color.Red * 1.0f,
- PressedColor = Color.Red * 0.6f,
- UserData = "highlighted",
- CanBeFocused = false,
- Visible = false
- };
-
- var img = new GUIImage(new RectTransform(Vector2.One, btn.RectTransform), order.Prefab.SymbolSprite, scaleToFit: true)
- {
- 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);
diff --git a/Barotrauma/BarotraumaClient/Source/Map/Hull.cs b/Barotrauma/BarotraumaClient/Source/Map/Hull.cs
index 262b4488b..73fccbd3d 100644
--- a/Barotrauma/BarotraumaClient/Source/Map/Hull.cs
+++ b/Barotrauma/BarotraumaClient/Source/Map/Hull.cs
@@ -893,6 +893,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/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs
index 06b9cded4..ffcfa1998 100644
--- a/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs
+++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs
@@ -1090,6 +1090,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/AI/Objectives/AIObjective.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjective.cs
index 99a7aee71..a910de503 100644
--- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjective.cs
+++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjective.cs
@@ -21,7 +21,15 @@ namespace Barotrauma
protected string option;
protected bool abandon;
+ ///
+ /// Can the objective be completed. That is, does the objective have failing subobjectives or other conditions that prevent it from completing.
+ ///
public virtual bool CanBeCompleted => !abandon && subObjectives.All(so => so.CanBeCompleted);
+
+ ///
+ /// When true, the objective is never completed, unless CanBeCompleted returns false.
+ ///
+ public virtual bool IsLoop { get; set; }
public IEnumerable SubObjectives => subObjectives;
public AIObjective CurrentSubObjective { get; private set; }
diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveChargeBatteries.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveChargeBatteries.cs
index b0224241d..df1b7abb0 100644
--- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveChargeBatteries.cs
+++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveChargeBatteries.cs
@@ -53,6 +53,6 @@ namespace Barotrauma
protected override bool Filter(PowerContainer battery) => true;
protected override float Average(PowerContainer battery) => 100 - battery.ChargePercentage;
protected override IEnumerable GetList() => batteryList;
- protected override AIObjective ObjectiveConstructor(PowerContainer battery) => new AIObjectiveOperateItem(battery, character, Option, false);
+ protected override AIObjective ObjectiveConstructor(PowerContainer battery) => new AIObjectiveOperateItem(battery, character, Option, false) { IsLoop = true };
}
}
diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveExtinguishFires.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveExtinguishFires.cs
index 698f99a24..0dd0da212 100644
--- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveExtinguishFires.cs
+++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveExtinguishFires.cs
@@ -33,6 +33,8 @@ namespace Barotrauma
public override bool IsCompleted() => false;
public override bool CanBeCompleted => true;
+ public override bool IsLoop { get => true; set => throw new System.Exception("Trying to set the value for IsLoop from: " + System.Environment.StackTrace); }
+
public override bool IsDuplicate(AIObjective otherObjective)
{
return otherObjective is AIObjectiveExtinguishFires;
diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs
index 596f86321..9b1202ebb 100644
--- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs
+++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveIdle.cs
@@ -38,6 +38,8 @@ namespace Barotrauma
public override bool IsCompleted() => false;
public override bool CanBeCompleted => true;
+ public override bool IsLoop { get => true; set => throw new System.Exception("Trying to set the value for IsLoop from: " + System.Environment.StackTrace); }
+
public override float GetPriority(AIObjectiveManager objectiveManager)
{
return 1.0f;
diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveLoop.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveLoop.cs
index 42171e828..aaa93f2d7 100644
--- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveLoop.cs
+++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveLoop.cs
@@ -26,6 +26,8 @@ namespace Barotrauma
public override bool IsCompleted() => false;
public override bool CanBeCompleted => true;
+ public override bool IsLoop { get => true; set => throw new System.Exception("Trying to set the value for IsLoop from: " + System.Environment.StackTrace); }
+
public override void Update(AIObjectiveManager objectiveManager, float deltaTime)
{
base.Update(objectiveManager, deltaTime);
diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs
index 419e7f5ea..a58f84694 100644
--- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs
+++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveManager.cs
@@ -191,11 +191,11 @@ namespace Barotrauma
var steering = (order?.TargetEntity as Item)?.GetComponent();
if (steering != null) steering.PosToMaintain = steering.Item.Submarine?.WorldPosition;
if (order.TargetItemComponent == null) { return null; }
- newObjective = new AIObjectiveOperateItem(order.TargetItemComponent, character, option, false, null, order.UseController, priorityModifier: priorityModifier);
+ newObjective = new AIObjectiveOperateItem(order.TargetItemComponent, character, option, false, null, order.UseController, priorityModifier: priorityModifier) { IsLoop = true };
break;
default:
if (order.TargetItemComponent == null) { return null; }
- newObjective = new AIObjectiveOperateItem(order.TargetItemComponent, character, option, false, null, order.UseController, priorityModifier: priorityModifier);
+ newObjective = new AIObjectiveOperateItem(order.TargetItemComponent, character, option, false, null, order.UseController, priorityModifier: priorityModifier) { IsLoop = true };
break;
}
return newObjective;
diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveOperateItem.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveOperateItem.cs
index db3ed420a..f43af1f56 100644
--- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveOperateItem.cs
+++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveOperateItem.cs
@@ -100,6 +100,12 @@ namespace Barotrauma
}
return;
}
+
+ if (component.AIOperate(deltaTime, character, this))
+ {
+ isCompleted = true;
+ }
+ return;
}
AddSubObjective(gotoObjective = new AIObjectiveGoTo(target.Item, character));
@@ -155,14 +161,17 @@ namespace Barotrauma
return;
}
- if (component.AIOperate(deltaTime, character, this)) isCompleted = true;
+ if (component.AIOperate(deltaTime, character, this))
+ {
+ isCompleted = true;
+ }
}
}
}
public override bool IsCompleted()
{
- return isCompleted;
+ return isCompleted && !IsLoop;
}
public override bool IsDuplicate(AIObjective otherObjective)
diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectivePumpWater.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectivePumpWater.cs
index 6f17b7a85..797a983b9 100644
--- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectivePumpWater.cs
+++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectivePumpWater.cs
@@ -53,7 +53,7 @@ namespace Barotrauma
protected override bool Filter(Pump pump) => true;
protected override IEnumerable GetList() => pumpList;
- protected override AIObjective ObjectiveConstructor(Pump pump) => new AIObjectiveOperateItem(pump, character, Option, false);
protected override float Average(Pump target) => MathHelper.Lerp(0, 100, target.CurrFlow / target.MaxFlow);
+ protected override AIObjective ObjectiveConstructor(Pump pump) => new AIObjectiveOperateItem(pump, character, Option, false) { IsLoop = true };
}
}
diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRescueAll.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRescueAll.cs
index 9d025a3ee..c385a558c 100644
--- a/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRescueAll.cs
+++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/Objectives/AIObjectiveRescueAll.cs
@@ -62,5 +62,7 @@ namespace Barotrauma
public override bool IsCompleted() => false;
public override bool CanBeCompleted => true;
+
+ public override bool IsLoop { get => true; set => throw new System.Exception("Trying to set the value for IsLoop from: " + System.Environment.StackTrace); }
}
}
diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs
index 6d98e57da..fa389d244 100644
--- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs
+++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs
@@ -2678,6 +2678,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 15688afc2..e7dfac908 100644
--- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Steering.cs
+++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Steering.cs
@@ -445,6 +445,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/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs
index 78dfbed90..7b06241ea 100644
--- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs
+++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs
@@ -1160,6 +1160,10 @@ namespace Barotrauma
{
ApplyStatusEffects(!waterProof && inWater ? ActionType.InWater : ActionType.NotInWater, deltaTime);
}
+ if (!broken)
+ {
+ ApplyStatusEffects(!waterProof && inWater ? ActionType.InWater : ActionType.NotInWater, deltaTime);
+ }
ApplyStatusEffects(!waterProof && inWater ? ActionType.InWater : ActionType.NotInWater, deltaTime);
if (body == null || !body.Enabled || !inWater || ParentInventory != null || Removed) { return; }
diff --git a/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs b/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs
index 11bf41f6c..686cd222f 100644
--- a/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs
+++ b/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs
@@ -24,6 +24,8 @@ namespace Barotrauma
private bool removed;
+ private bool removed;
+
#if CLIENT
private List burnDecals = new List();
#endif
diff --git a/Barotrauma/BarotraumaShared/Source/Map/Hull.cs b/Barotrauma/BarotraumaShared/Source/Map/Hull.cs
index b8a22ca5b..762806897 100644
--- a/Barotrauma/BarotraumaShared/Source/Map/Hull.cs
+++ b/Barotrauma/BarotraumaShared/Source/Map/Hull.cs
@@ -470,6 +470,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/PlayerInput.cs b/Barotrauma/BarotraumaShared/Source/PlayerInput.cs
index 8ad826eea..e13028523 100644
--- a/Barotrauma/BarotraumaShared/Source/PlayerInput.cs
+++ b/Barotrauma/BarotraumaShared/Source/PlayerInput.cs
@@ -162,21 +162,6 @@ 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();