diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs b/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs
index bcf133b30..fa30d8a82 100644
--- a/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs
+++ b/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs
@@ -108,6 +108,61 @@ namespace Barotrauma
}
}
+ //unconscious/dead characters can't correct their position using AnimController movement
+ // -> we need to correct it manually
+ if (!character.AllowInput)
+ {
+ float mainLimbDistSqrd = Vector2.DistanceSquared(MainLimb.PullJointWorldAnchorA, Collider.SimPosition);
+ float mainLimbErrorTolerance = 0.1f;
+ //if the main limb is roughly at the correct position and the collider isn't moving (much at least),
+ //don't attempt to correct the position.
+ if (mainLimbDistSqrd > mainLimbErrorTolerance || Collider.LinearVelocity.LengthSquared() > 0.05f)
+ {
+ MainLimb.PullJointWorldAnchorB = Collider.SimPosition;
+ MainLimb.PullJointEnabled = true;
+ }
+ character.SelectedConstruction = character.MemState[0].SelectedItem;
+ }
+
+ if (character.MemState[0].Animation == AnimController.Animation.CPR)
+ {
+ character.AnimController.Anim = AnimController.Animation.CPR;
+ }
+ else if (character.AnimController.Anim == AnimController.Animation.CPR)
+ {
+ character.AnimController.Anim = AnimController.Animation.None;
+ }
+
+ Vector2 newVelocity = Collider.LinearVelocity;
+ Vector2 newPosition = Collider.SimPosition;
+ float newRotation = Collider.Rotation;
+ float newAngularVelocity = Collider.AngularVelocity;
+ Collider.CorrectPosition(character.MemState, out newPosition, out newVelocity, out newRotation, out newAngularVelocity);
+
+ newVelocity = newVelocity.ClampLength(100.0f);
+ if (!MathUtils.IsValid(newVelocity)) { newVelocity = Vector2.Zero; }
+ overrideTargetMovement = newVelocity.LengthSquared() > 0.01f ? newVelocity : Vector2.Zero;
+
+ Collider.LinearVelocity = newVelocity;
+ Collider.AngularVelocity = newAngularVelocity;
+
+ float distSqrd = Vector2.DistanceSquared(newPosition, Collider.SimPosition);
+ float errorTolerance = character.AllowInput ? 0.01f : 0.2f;
+ if (distSqrd > errorTolerance)
+ {
+ if (distSqrd > 10.0f || !character.AllowInput)
+ {
+ Collider.TargetRotation = newRotation;
+ SetPosition(newPosition, lerp: distSqrd < 5.0f, ignorePlatforms: false);
+ }
+ else
+ {
+ Collider.TargetRotation = newRotation;
+ Collider.TargetPosition = newPosition;
+ Collider.MoveToTargetPosition(true);
+ }
+ }
+
//unconscious/dead characters can't correct their position using AnimController movement
// -> we need to correct it manually
if (!character.AllowInput)
@@ -151,32 +206,34 @@ namespace Barotrauma
}
}
-
- if (character.MemLocalState.Count > 120) character.MemLocalState.RemoveRange(0, character.MemLocalState.Count - 120);
- character.MemState.Clear();
+ character.MemLocalState.Clear();
}
- }
-
- partial void ImpactProjSpecific(float impact, Body body)
- {
- float volume = MathHelper.Clamp(impact - 3.0f, 0.5f, 1.0f);
-
- if (body.UserData is Limb limb && character.Stun <= 0f)
+ else
{
- if (impact > 3.0f) { PlayImpactSound(limb); }
- }
- else if (body.UserData is Limb || body == Collider.FarseerBody)
- {
- if (!character.IsRemotePlayer && impact > ImpactTolerance)
+ //remove states with a timestamp (there may still timestamp-based states
+ //in the list if the controlled character switches from timestamp-based interpolation to ID-based)
+ character.MemState.RemoveAll(m => m.Timestamp > 0.0f);
+
+ for (int i = 0; i < character.MemLocalState.Count; i++)
{
- SoundPlayer.PlayDamageSound("LimbBlunt", strongestImpact, Collider);
+ if (character.Submarine == null)
+ {
+ //transform in-sub coordinates to outside coordinates
+ if (character.MemLocalState[i].Position.Y > lowestSubPos)
+ {
+ character.MemLocalState[i].TransformInToOutside();
+ }
+ }
+ else if (currentHull?.Submarine != null)
+ {
+ //transform outside coordinates to in-sub coordinates
+ if (character.MemLocalState[i].Position.Y < lowestSubPos)
+ {
+ character.MemLocalState[i].TransformOutToInside(currentHull.Submarine);
+ }
+ }
+
}
- }
- if (Character.Controlled == character)
- {
- GameMain.GameScreen.Cam.Shake = Math.Min(Math.Max(strongestImpact, GameMain.GameScreen.Cam.Shake), 3.0f);
- }
- }
if (character.MemState.Count < 1) return;
diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUITextBlock.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUITextBlock.cs
index 07d09a5dd..6a5682887 100644
--- a/Barotrauma/BarotraumaClient/Source/GUI/GUITextBlock.cs
+++ b/Barotrauma/BarotraumaClient/Source/GUI/GUITextBlock.cs
@@ -1,6 +1,8 @@
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System;
+using System.Collections.Generic;
+using System.Linq;
namespace Barotrauma
{
@@ -247,7 +249,7 @@ namespace Barotrauma
return;
}
- textPos = new Vector2(rect.Width / 2.0f, rect.Height / 2.0f);
+ textPos = new Vector2(padding.X + (rect.Width - padding.Z - padding.X) / 2.0f, padding.Y + (rect.Height - padding.Y - padding.W) / 2.0f);
origin = TextSize * 0.5f;
if (textAlignment.HasFlag(Alignment.Left) && !overflowClipActive)
@@ -338,5 +340,25 @@ namespace Barotrauma
if (OutlineColor.A * currColor.A > 0.0f) GUI.DrawRectangle(spriteBatch, rect, OutlineColor * (currColor.A / 255.0f), false);
}
+
+ ///
+ /// Set the text scale of the GUITextBlocks so that they all use the same scale and can fit the text within the block.
+ ///
+ public static void AutoScaleAndNormalize(IEnumerable textBlocks)
+ {
+ if (!textBlocks.Any()) { return; }
+ float minScale = textBlocks.First().TextScale;
+ foreach (GUITextBlock textBlock in textBlocks)
+ {
+ textBlock.AutoScale = true;
+ minScale = Math.Min(textBlock.TextScale, minScale);
+ }
+
+ foreach (GUITextBlock textBlock in textBlocks)
+ {
+ textBlock.AutoScale = false;
+ textBlock.TextScale = minScale;
+ }
+ }
}
}
diff --git a/Barotrauma/BarotraumaClient/Source/GUI/GUITickBox.cs b/Barotrauma/BarotraumaClient/Source/GUI/GUITickBox.cs
index 5dfa73ba9..06e197eeb 100644
--- a/Barotrauma/BarotraumaClient/Source/GUI/GUITickBox.cs
+++ b/Barotrauma/BarotraumaClient/Source/GUI/GUITickBox.cs
@@ -76,6 +76,11 @@ namespace Barotrauma
get { return box; }
}
+ public GUITextBlock TextBlock
+ {
+ get { return text; }
+ }
+
public override string ToolTip
{
get { return base.ToolTip; }
@@ -123,6 +128,7 @@ namespace Barotrauma
private void ResizeBox()
{
box.RectTransform.NonScaledSize = new Point(RectTransform.NonScaledSize.Y);
+ text.RectTransform.NonScaledSize = new Point(Rect.Width - box.Rect.Width, text.Rect.Height);
text.RectTransform.AbsoluteOffset = new Point(box.Rect.Width, 0);
}
diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Engine.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Engine.cs
index b55286f50..fe1b9aa82 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Engine.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Engine.cs
@@ -30,25 +30,25 @@ namespace Barotrauma.Items.Components
partial void InitProjSpecific(XElement element)
{
- powerIndicator = new GUITickBox(new RectTransform(new Point(30, 30), GuiFrame.RectTransform) { RelativeOffset = new Vector2(0.05f, 0.15f) },
+ var content = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.8f), GuiFrame.RectTransform, Anchor.Center))
+ {
+ Stretch = true,
+ RelativeSpacing = 0.05f
+ };
+
+ powerIndicator = new GUITickBox(new RectTransform(new Point(30, 30), content.RectTransform),
TextManager.Get("EnginePowered"), style: "IndicatorLightGreen")
{
CanBeFocused = false
};
string powerLabel = TextManager.Get("EngineForce");
- new GUITextBlock(new RectTransform(new Vector2(0.9f, 0.3f), GuiFrame.RectTransform, Anchor.BottomCenter)
- { RelativeOffset = new Vector2(0.0f, 0.4f) }, "", textAlignment: Alignment.Center)
+ new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.3f), content.RectTransform), "", textAlignment: Alignment.Center)
{
TextGetter = () => { return powerLabel + ": " + (int)(targetForce) + " %"; }
};
- var sliderArea = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.25f), GuiFrame.RectTransform, Anchor.BottomCenter)
- { RelativeOffset = new Vector2(0.0f, 0.2f) }, isHorizontal: true);
-
- new GUITextBlock(new RectTransform(new Vector2(0.2f, 1.0f), sliderArea.RectTransform), TextManager.Get("EngineBackwards"),
- font: GUI.SmallFont, textAlignment: Alignment.Center);
- forceSlider = new GUIScrollBar(new RectTransform(new Vector2(0.6f, 1.0f), sliderArea.RectTransform), barSize: 0.25f, style: "GUISlider")
+ forceSlider = new GUIScrollBar(new RectTransform(new Vector2(1.0f, 0.3f), content.RectTransform), barSize: 0.2f, style: "GUISlider")
{
Step = 0.05f,
OnMoved = (GUIScrollBar scrollBar, float barScroll) =>
@@ -66,8 +66,16 @@ namespace Barotrauma.Items.Components
return true;
}
};
- new GUITextBlock(new RectTransform(new Vector2(0.2f, 1.0f), sliderArea.RectTransform), TextManager.Get("EngineForwards"),
- font: GUI.SmallFont, textAlignment: Alignment.Center);
+
+ var textArea = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.2f), content.RectTransform), isHorizontal: true)
+ {
+ Stretch = true
+ };
+
+ new GUITextBlock(new RectTransform(new Vector2(0.5f, 1.0f), textArea.RectTransform), TextManager.Get("EngineBackwards"),
+ font: GUI.SmallFont, textAlignment: Alignment.CenterLeft);
+ new GUITextBlock(new RectTransform(new Vector2(0.5f, 1.0f), textArea.RectTransform), TextManager.Get("EngineForwards"),
+ font: GUI.SmallFont, textAlignment: Alignment.CenterRight);
foreach (XElement subElement in element.Elements())
{
diff --git a/Barotrauma/BarotraumaClient/Source/Networking/ServerLog.cs b/Barotrauma/BarotraumaClient/Source/Networking/ServerLog.cs
index 81532e489..e636ac341 100644
--- a/Barotrauma/BarotraumaClient/Source/Networking/ServerLog.cs
+++ b/Barotrauma/BarotraumaClient/Source/Networking/ServerLog.cs
@@ -1,5 +1,6 @@
using Microsoft.Xna.Framework;
using System;
+using System.Collections.Generic;
using System.Linq;
namespace Barotrauma.Networking
@@ -23,8 +24,8 @@ namespace Barotrauma.Networking
return true;
};
- GUIFrame innerFrame = new GUIFrame(new RectTransform(new Vector2(0.3f, 0.4f), LogFrame.RectTransform, Anchor.Center) { MinSize = new Point(600, 420) });
- GUIFrame paddedFrame = new GUIFrame(new RectTransform(new Vector2(0.9f, 0.85f), innerFrame.RectTransform, Anchor.Center) { RelativeOffset = new Vector2(0.0f, -0.03f) }, style: null);
+ GUIFrame innerFrame = new GUIFrame(new RectTransform(new Vector2(0.5f, 0.5f), LogFrame.RectTransform, Anchor.Center) { MinSize = new Point(700, 500) });
+ GUIFrame paddedFrame = new GUIFrame(new RectTransform(new Vector2(0.95f, 0.85f), innerFrame.RectTransform, Anchor.Center) { RelativeOffset = new Vector2(0.0f, -0.03f) }, style: null);
new GUITextBlock(new RectTransform(new Vector2(0.75f, 0.05f), paddedFrame.RectTransform, Anchor.TopRight), TextManager.Get("ServerLog.Filter"), font: GUI.SmallFont);
GUITextBox searchBox = new GUITextBox(new RectTransform(new Vector2(0.6f, 0.05f), paddedFrame.RectTransform, Anchor.TopRight), font: GUI.SmallFont);
@@ -44,29 +45,30 @@ namespace Barotrauma.Networking
listBox = new GUIListBox(new RectTransform(new Vector2(0.75f, 0.95f), paddedFrame.RectTransform, Anchor.BottomRight));
- var tickBoxContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.2f, 0.95f), paddedFrame.RectTransform, Anchor.BottomLeft));
-
+ var tickBoxContainer = new GUILayoutGroup(new RectTransform(new Vector2(0.25f, 0.95f), paddedFrame.RectTransform, Anchor.BottomLeft));
int y = 30;
+ List tickBoxes = new List();
foreach (MessageType msgType in Enum.GetValues(typeof(MessageType)))
{
- var tickBox = new GUITickBox(new RectTransform(new Point(20, 20), tickBoxContainer.RectTransform), TextManager.Get("ServerLog." + messageTypeName[(int)msgType]), font: GUI.SmallFont)
+ var tickBox = new GUITickBox(new RectTransform(new Point(tickBoxContainer.Rect.Width, 30), tickBoxContainer.RectTransform), TextManager.Get("ServerLog." + messageTypeName[(int)msgType]), font: GUI.SmallFont)
{
Selected = true,
- TextColor = messageColor[(int)msgType]
+ TextColor = messageColor[(int)msgType],
+ OnSelected = (GUITickBox tb) =>
+ {
+ msgTypeHidden[(int)msgType] = !tb.Selected;
+ FilterMessages();
+ return true;
+ }
};
-
- tickBox.OnSelected += (GUITickBox tb) =>
- {
- msgTypeHidden[(int)msgType] = !tb.Selected;
- FilterMessages();
- return true;
- };
-
tickBox.Selected = !msgTypeHidden[(int)msgType];
+ tickBoxes.Add(tickBox);
y += 20;
}
+ GUITextBlock.AutoScaleAndNormalize(tickBoxes.Select(t => t.TextBlock));
+
var currLines = lines.ToList();
foreach (LogMessage line in currLines)
diff --git a/Barotrauma/BarotraumaClient/Source/Networking/ServerSettings.cs b/Barotrauma/BarotraumaClient/Source/Networking/ServerSettings.cs
index 7607be585..a905e9a0b 100644
--- a/Barotrauma/BarotraumaClient/Source/Networking/ServerSettings.cs
+++ b/Barotrauma/BarotraumaClient/Source/Networking/ServerSettings.cs
@@ -504,6 +504,8 @@ namespace Barotrauma.Networking
return true;
};
+ GUITextBlock.AutoScaleAndNormalize(buttonHolder.Children.Select(c => ((GUIButton)c).TextBlock));
+
foreach (ItemPrefab ip in MapEntityPrefab.List.Where(p => p is ItemPrefab).Select(p => p as ItemPrefab))
{
if (!ip.CanBeBought && !ip.Tags.Contains("smallitem")) continue;
diff --git a/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs b/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs
index 44859a667..95ba8dd5a 100644
--- a/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs
+++ b/Barotrauma/BarotraumaClient/Source/Screens/CampaignUI.cs
@@ -78,7 +78,6 @@ namespace Barotrauma
int i = 0;
var tabValues = Enum.GetValues(typeof(Tab));
- float minTextScale = 1.0f;
foreach (Tab tab in tabValues)
{
var tabButton = new GUIButton(new RectTransform(new Vector2(0.25f, 1.0f), tabButtonContainer.RectTransform),
@@ -93,17 +92,12 @@ namespace Barotrauma
var buttonSprite = tabButton.Style.Sprites[GUIComponent.ComponentState.None][0];
tabButton.RectTransform.MaxSize = new Point(
(int)(tabButton.Rect.Height * (buttonSprite.Sprite.size.X / buttonSprite.Sprite.size.Y)), int.MaxValue);
+
tabButtons.Add(tabButton);
tabButton.Font = GUI.LargeFont;
- tabButton.TextBlock.AutoScale = true;
- minTextScale = Math.Min(tabButton.TextBlock.TextScale, minTextScale);
i++;
}
-
- foreach (GUIButton tabButton in tabButtons)
- {
- tabButton.TextBlock.TextScale = minTextScale;
- }
+ GUITextBlock.AutoScaleAndNormalize(tabButtons.Select(t => t.TextBlock));
// crew tab -------------------------------------------------------------------------