From c751c58495d6dc65341a4c1e05511ca37afe0db0 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Wed, 3 Apr 2019 16:22:41 +0300 Subject: [PATCH] (c793f55af) Clamp velocities when pushing characters out of doorways, play only one damage sound when hit by a door (not once per each limb that's in the doorway), refactored the logic so to prevent creating new lists --- .../Source/Items/Components/Door.cs | 117 +++++++++--------- .../Items/Components/Signal/LightComponent.cs | 4 - 2 files changed, 61 insertions(+), 60 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs index 91d669c94..73826cd2c 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs @@ -277,7 +277,7 @@ namespace Barotrauma.Items.Components if (isClosing) { - PushCharactersAway(); + if (OpenState < 0.9f) { PushCharactersAway(); } } else { @@ -373,8 +373,7 @@ namespace Barotrauma.Items.Components "Failed to push a character out of a doorway - position of the door is not valid (" + item.SimPosition + ")."); return; } - - //push characters out of the doorway when the door is closing/opening + Vector2 simPos = ConvertUnits.ToSimUnits(new Vector2(item.Rect.X, item.Rect.Y)); Vector2 currSize = IsHorizontal ? @@ -388,7 +387,7 @@ namespace Barotrauma.Items.Components if (!c.Enabled) continue; if (!MathUtils.IsValid(c.SimPosition)) { - DebugConsole.ThrowError("Failed to push a character out of a doorway - position of the character \"" + c.Name + "\" is not valid (" + c.SimPosition + ")"); + if (GameSettings.VerboseLogging) { DebugConsole.ThrowError("Failed to push a character out of a doorway - position of the character \"" + c.Name + "\" is not valid (" + c.SimPosition + ")"); } GameAnalyticsManager.AddErrorEventOnce("PushCharactersAway:CharacterPosInvalid", GameAnalyticsSDK.Net.EGAErrorSeverity.Error, "Failed to push a character out of a doorway - position of the character \"" + c.Name + "\" is not valid (" + c.SimPosition + ")." + " Removed: " + c.Removed + @@ -397,67 +396,73 @@ namespace Barotrauma.Items.Components } int dir = IsHorizontal ? Math.Sign(c.SimPosition.Y - item.SimPosition.Y) : Math.Sign(c.SimPosition.X - item.SimPosition.X); - List bodies = c.AnimController.Limbs.Select(l => l.body).ToList(); - bodies.Add(c.AnimController.Collider); - - foreach (PhysicsBody body in bodies) + bool soundPlayed = false; + foreach (Limb limb in c.AnimController.Limbs) { - float diff = 0.0f; - if (!MathUtils.IsValid(body.SimPosition)) - { - DebugConsole.ThrowError("Failed to push a limb out of a doorway - position of the body (character \"" + c.Name + "\") is not valid (" + body.SimPosition + ")"); - GameAnalyticsManager.AddErrorEventOnce("PushCharactersAway:LimbPosInvalid", GameAnalyticsSDK.Net.EGAErrorSeverity.Error, - "Failed to push a character out of a doorway - position of the character \"" + c.Name + "\" is not valid (" + body.SimPosition + ")." + - " Removed: " + c.Removed + - " Remoteplayer: " + c.IsRemotePlayer); - continue; - } - - if (IsHorizontal) - { - if (body.SimPosition.X < simPos.X || body.SimPosition.X > simPos.X + simSize.X) continue; - diff = body.SimPosition.Y - item.SimPosition.Y; - } - else - { - if (body.SimPosition.Y > simPos.Y || body.SimPosition.Y < simPos.Y - simSize.Y) continue; - diff = body.SimPosition.X - item.SimPosition.X; - } - - if (Math.Sign(diff) != dir) + if (PushBodyOutOfDoorway(c, limb.body, dir, simPos, simSize) && !soundPlayed) { #if CLIENT - SoundPlayer.PlayDamageSound("LimbBlunt", 1.0f, body); + SoundPlayer.PlayDamageSound("LimbBlunt", 1.0f, limb.body); #endif - - if (IsHorizontal) - { - body.SetTransform(new Vector2(body.SimPosition.X, item.SimPosition.Y + dir * simSize.Y * 2.0f), body.Rotation); - body.ApplyLinearImpulse(new Vector2(isOpen ? 0.0f : 1.0f, dir * 2.0f)); - } - else - { - body.SetTransform(new Vector2(item.SimPosition.X + dir * simSize.X * 1.2f, body.SimPosition.Y), body.Rotation); - body.ApplyLinearImpulse(new Vector2(dir * 0.5f, isOpen ? 0.0f : -1.0f)); - } + soundPlayed = true; } + } + PushBodyOutOfDoorway(c, c.AnimController.Collider, dir, simPos, simSize); + } + } - if (IsHorizontal) - { - if (Math.Abs(body.SimPosition.Y - item.SimPosition.Y) > simSize.Y * 0.5f) continue; + private bool PushBodyOutOfDoorway(Character c, PhysicsBody body, int dir, Vector2 doorRectSimPos, Vector2 doorRectSimSize) + { + float diff = 0.0f; + if (!MathUtils.IsValid(body.SimPosition)) + { + DebugConsole.ThrowError("Failed to push a limb out of a doorway - position of the body (character \"" + c.Name + "\") is not valid (" + body.SimPosition + ")"); + GameAnalyticsManager.AddErrorEventOnce("PushCharactersAway:LimbPosInvalid", GameAnalyticsSDK.Net.EGAErrorSeverity.Error, + "Failed to push a character out of a doorway - position of the character \"" + c.Name + "\" is not valid (" + body.SimPosition + ")." + + " Removed: " + c.Removed + + " Remoteplayer: " + c.IsRemotePlayer); + return false; + } + + if (IsHorizontal) + { + if (body.SimPosition.X < doorRectSimPos.X || body.SimPosition.X > doorRectSimPos.X + doorRectSimSize.X) { return false; } + diff = body.SimPosition.Y - item.SimPosition.Y; + } + else + { + if (body.SimPosition.Y > doorRectSimPos.Y || body.SimPosition.Y < doorRectSimPos.Y - doorRectSimSize.Y) { return false; } + diff = body.SimPosition.X - item.SimPosition.X; + } - body.ApplyLinearImpulse(new Vector2(isOpen ? 0.0f : 1.0f, dir * 0.5f)); - } - else - { - if (Math.Abs(body.SimPosition.X - item.SimPosition.X) > simSize.X * 0.5f) continue; - - body.ApplyLinearImpulse(new Vector2(dir * 0.5f, isOpen ? 0.0f : -1.0f)); - } - - c.SetStun(0.2f); + //if the limb is at a different side of the door than the character (collider), + //immediately teleport it to the correct side + if (Math.Sign(diff) != dir) + { + if (IsHorizontal) + { + body.SetTransform(new Vector2(body.SimPosition.X, item.SimPosition.Y + dir * doorRectSimSize.Y * 2.0f), body.Rotation); + } + else + { + body.SetTransform(new Vector2(item.SimPosition.X + dir * doorRectSimSize.X * 1.2f, body.SimPosition.Y), body.Rotation); } } + + //apply an impulse to push the limb further from the door + if (IsHorizontal) + { + if (Math.Abs(body.SimPosition.Y - item.SimPosition.Y) > doorRectSimSize.Y * 0.5f) { return false; } + body.ApplyLinearImpulse(new Vector2(isOpen ? 0.0f : 1.0f, dir * 2.0f), maxVelocity: NetConfig.MaxPhysicsBodyVelocity); + } + else + { + if (Math.Abs(body.SimPosition.X - item.SimPosition.X) > doorRectSimSize.X * 0.5f) { return false; } + body.ApplyLinearImpulse(new Vector2(dir * 2.0f, isOpen ? 0.0f : -1.0f), maxVelocity: NetConfig.MaxPhysicsBodyVelocity); + } + + c.SetStun(0.2f); + return true; } public override void ReceiveSignal(int stepsTaken, string signal, Connection connection, Item source, Character sender, float power = 0.0f, float signalStrength = 1.0f) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/LightComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/LightComponent.cs index eebf1146a..7845f609c 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/LightComponent.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/LightComponent.cs @@ -26,10 +26,6 @@ namespace Barotrauma.Items.Components private float blinkTimer; - private bool itemLoaded; - - private float blinkTimer; - public PhysicsBody ParentBody; [Editable(MinValueFloat = 0.0f, MaxValueFloat = 2048.0f), Serialize(100.0f, true)]