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 6a5682887..04e0d0848 100644
--- a/Barotrauma/BarotraumaClient/Source/GUI/GUITextBlock.cs
+++ b/Barotrauma/BarotraumaClient/Source/GUI/GUITextBlock.cs
@@ -341,6 +341,14 @@ 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(params GUITextBlock[] textBlocks)
+ {
+ AutoScaleAndNormalize(textBlocks.AsEnumerable());
+ }
+
///
/// Set the text scale of the GUITextBlocks so that they all use the same scale and can fit the text within the block.
///
diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Reactor.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Reactor.cs
index b4d53d0e0..7fa05648b 100644
--- a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Reactor.cs
+++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Reactor.cs
@@ -110,8 +110,8 @@ namespace Barotrauma.Items.Components
GUIFrame columnLeft = new GUIFrame(new RectTransform(new Vector2(0.2f, 1.0f), paddedFrame.RectTransform), style: null);
leftHUDColumn = columnLeft;
- GUIFrame columnMid = new GUIFrame(new RectTransform(new Vector2(0.45f, 1.0f), paddedFrame.RectTransform), style: null);
- GUIFrame columnRight = new GUIFrame(new RectTransform(new Vector2(0.35f, 1.0f), paddedFrame.RectTransform), style: null);
+ GUIFrame columnMid = new GUIFrame(new RectTransform(new Vector2(0.5f, 1.0f), paddedFrame.RectTransform), style: null);
+ GUIFrame columnRight = new GUIFrame(new RectTransform(new Vector2(0.3f, 1.0f), paddedFrame.RectTransform), style: null);
//----------------------------------------------------------
//left column
@@ -136,6 +136,7 @@ namespace Barotrauma.Items.Components
btnText.SetTextPos();
warningButtons.Add(warningTexts[i], warningBtn);
}
+ GUITextBlock.AutoScaleAndNormalize(warningButtons.Values.Select(b => b.TextBlock));
inventoryContainer = new GUIFrame(new RectTransform(new Vector2(1.0f, 0.45f), columnLeft.RectTransform, Anchor.BottomLeft), style: null);
@@ -143,33 +144,37 @@ namespace Barotrauma.Items.Components
//mid column
//----------------------------------------------------------
- criticalHeatWarning = new GUITickBox(new RectTransform(new Point(30, 30), columnMid.RectTransform),
+ criticalHeatWarning = new GUITickBox(new RectTransform(new Point(columnMid.Rect.Width / 3, 30), columnMid.RectTransform),
TextManager.Get("ReactorWarningCriticalTemp"), font: GUI.SmallFont, style: "IndicatorLightRed")
{
CanBeFocused = false
};
- lowTemperatureWarning = new GUITickBox(new RectTransform(new Point(30, 30), columnMid.RectTransform) { RelativeOffset = new Vector2(0.3f, 0.0f) },
+ lowTemperatureWarning = new GUITickBox(new RectTransform(new Point(columnMid.Rect.Width / 3, 30), columnMid.RectTransform) { RelativeOffset = new Vector2(0.27f, 0.0f) },
TextManager.Get("ReactorWarningCriticalLowTemp"), font: GUI.SmallFont, style: "IndicatorLightRed")
{
CanBeFocused = false
};
- criticalOutputWarning = new GUITickBox(new RectTransform(new Point(30, 30), columnMid.RectTransform) { RelativeOffset = new Vector2(0.75f, 0.0f) },
+ criticalOutputWarning = new GUITickBox(new RectTransform(new Point(columnMid.Rect.Width / 3, 30), columnMid.RectTransform) { RelativeOffset = new Vector2(0.66f, 0.0f) },
TextManager.Get("ReactorWarningCriticalOutput"), font: GUI.SmallFont, style: "IndicatorLightRed")
{
CanBeFocused = false
};
+
+ GUITextBlock.AutoScaleAndNormalize(criticalHeatWarning.TextBlock, lowTemperatureWarning.TextBlock, criticalOutputWarning.TextBlock);
+
+ float gaugeOffset = criticalHeatWarning.Rect.Height / (float)columnMid.Rect.Height + 0.05f;
- new GUITextBlock(new RectTransform(new Vector2(0.5f, 0.05f), columnMid.RectTransform) { RelativeOffset = new Vector2(0.0f, 0.25f) },
+ new GUITextBlock(new RectTransform(new Vector2(0.5f, 0.05f), columnMid.RectTransform) { RelativeOffset = new Vector2(0.0f, gaugeOffset) },
TextManager.Get("ReactorFissionRate"));
- new GUICustomComponent(new RectTransform(new Vector2(0.5f, 0.5f), columnMid.RectTransform) { RelativeOffset = new Vector2(0.0f, 0.3f) },
+ new GUICustomComponent(new RectTransform(new Vector2(0.5f, 0.5f), columnMid.RectTransform) { RelativeOffset = new Vector2(0.0f, gaugeOffset + 0.05f) },
DrawFissionRateMeter, null)
{
ToolTip = TextManager.Get("ReactorTipFissionRate")
};
- new GUITextBlock(new RectTransform(new Vector2(0.5f, 0.05f), columnMid.RectTransform, Anchor.TopRight) { RelativeOffset = new Vector2(0.0f, 0.25f) },
+ new GUITextBlock(new RectTransform(new Vector2(0.5f, 0.05f), columnMid.RectTransform, Anchor.TopRight) { RelativeOffset = new Vector2(0.0f, gaugeOffset) },
TextManager.Get("ReactorTurbineOutput"));
- new GUICustomComponent(new RectTransform(new Vector2(0.5f, 0.5f), columnMid.RectTransform, Anchor.TopRight) { RelativeOffset = new Vector2(0.0f, 0.3f) },
+ new GUICustomComponent(new RectTransform(new Vector2(0.5f, 0.5f), columnMid.RectTransform, Anchor.TopRight) { RelativeOffset = new Vector2(0.0f, gaugeOffset + 0.05f) },
DrawTurbineOutputMeter, null)
{
ToolTip = TextManager.Get("ReactorTipTurbineOutput")
@@ -209,12 +214,13 @@ namespace Barotrauma.Items.Components
//right column
//----------------------------------------------------------
- new GUITextBlock(new RectTransform(new Point(100, 20), columnRight.RectTransform), TextManager.Get("ReactorAutoTemp"))
+ new GUITextBlock(new RectTransform(new Vector2(0.7f, 0.1f), columnRight.RectTransform), TextManager.Get("ReactorAutoTemp"))
{
- ToolTip = TextManager.Get("ReactorTipAutoTemp")
+ ToolTip = TextManager.Get("ReactorTipAutoTemp"),
+ AutoScale = true
};
- autoTempSlider = new GUIScrollBar(new RectTransform(new Point(100, 30), columnRight.RectTransform) { AbsoluteOffset = new Point(0, 30) },
- barSize: 0.5f, style: "OnOffSlider")
+ autoTempSlider = new GUIScrollBar(new RectTransform(new Vector2(0.6f, 0.15f), columnRight.RectTransform) { RelativeOffset = new Vector2(0.0f, 0.1f) },
+ barSize: 0.55f, style: "OnOffSlider")
{
ToolTip = TextManager.Get("ReactorTipAutoTemp"),
IsBooleanSwitch = true,
@@ -226,8 +232,10 @@ namespace Barotrauma.Items.Components
return true;
}
};
-
- onOffSwitch = new GUIScrollBar(new RectTransform(new Point(50, 80), columnRight.RectTransform, Anchor.TopRight),
+ var sliderSprite = autoTempSlider.Frame.Style.Sprites[GUIComponent.ComponentState.None].First();
+ autoTempSlider.RectTransform.MaxSize = sliderSprite.Sprite.size.ToPoint();
+
+ onOffSwitch = new GUIScrollBar(new RectTransform(new Vector2(0.4f, 0.3f), columnRight.RectTransform, Anchor.TopRight),
barSize: 0.2f, style: "OnOffLever")
{
IsBooleanSwitch = true,
@@ -240,6 +248,8 @@ namespace Barotrauma.Items.Components
return true;
}
};
+ var switchSprite = onOffSwitch.Frame.Style.Sprites[GUIComponent.ComponentState.None].First();
+ onOffSwitch.RectTransform.MaxSize = switchSprite.Sprite.size.ToPoint();
var lever = onOffSwitch.GetChild();
lever.RectTransform.NonScaledSize = new Point(lever.Rect.Width + 30, lever.Rect.Height);