From 0569a665f44e697d6891fc7be689c39ac063629e Mon Sep 17 00:00:00 2001 From: juanjp600 Date: Thu, 5 Jan 2017 22:37:14 -0300 Subject: [PATCH] Fixed a server-side off-by-one error in the player input IDs I'm guessing this one comes from the player's position not being updated immediately after the input is processed, so that's where most of the remaining error came from. Also added some rounding to the horizontal velocity when approaching 0, and changed something that depended on the head limb to use the collider instead, which should hopefully further reduce the chance of syncing errors. --- .../Animation/HumanoidAnimController.cs | 4 +++ .../Source/Characters/Animation/Ragdoll.cs | 1 + Subsurface/Source/Characters/Character.cs | 28 +++++++++++++------ Subsurface/Source/Physics/PhysicsBody.cs | 5 ++++ 4 files changed, 30 insertions(+), 8 deletions(-) diff --git a/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs b/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs index 9fe45b871..e1307c9de 100644 --- a/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs +++ b/Subsurface/Source/Characters/Animation/HumanoidAnimController.cs @@ -489,6 +489,10 @@ namespace Barotrauma { movement = Vector2.Normalize(movement); } + if (Math.Abs(movement.X)<0.005f) + { + movement.X = 0.0f; + } } private void ClimbOverObstacles() diff --git a/Subsurface/Source/Characters/Animation/Ragdoll.cs b/Subsurface/Source/Characters/Animation/Ragdoll.cs index 3f966bc69..7bb6ed201 100644 --- a/Subsurface/Source/Characters/Animation/Ragdoll.cs +++ b/Subsurface/Source/Characters/Animation/Ragdoll.cs @@ -571,6 +571,7 @@ namespace Barotrauma } Collider.DebugDraw(spriteBatch, frozen ? Color.Red : (inWater ? Color.SkyBlue : Color.Gray)); + spriteBatch.DrawString(GUI.Font, Collider.LinearVelocity.X.ToString(), new Vector2(Collider.DrawPosition.X, -Collider.DrawPosition.Y), Color.Orange); foreach (RevoluteJoint joint in limbJoints) { diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 171691ede..1579ba01d 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -839,13 +839,13 @@ namespace Barotrauma AnimController.Anim != AnimController.Animation.UsingConstruction && AnimController.Anim != AnimController.Animation.CPR) { - Limb head = AnimController.GetLimb(LimbType.Head); + //Limb head = AnimController.GetLimb(LimbType.Head); - if (cursorPosition.X < head.Position.X - 10.0f) + if (cursorPosition.X < AnimController.Collider.Position.X - 10.0f) { AnimController.TargetDir = Direction.Left; } - else if (cursorPosition.X > head.Position.X + 10.0f) + else if (cursorPosition.X > AnimController.Collider.Position.X + 10.0f) { AnimController.TargetDir = Direction.Right; } @@ -1249,7 +1249,7 @@ namespace Barotrauma { foreach (Character c in CharacterList) { - if (!c.Enabled) continue; + if (!c.Enabled || c.AnimController.Frozen) continue; c.AnimController.UpdateAnim(deltaTime); } @@ -1610,25 +1610,37 @@ namespace Barotrauma if (aiTarget != null) aiTarget.Draw(spriteBatch); } - if (memPos != null && memPos.Count > 0) + if (memPos != null && memPos.Count > 0 && controlled == this) { PosInfo serverPos = memPos.Last(); Vector2 remoteVec = ConvertUnits.ToDisplayUnits(serverPos.Position); - if (Submarine!=null) + if (Submarine != null) { remoteVec += Submarine.DrawPosition; } remoteVec.Y = -remoteVec.Y; PosInfo localPos = memLocalPos.Find(m => m.ID == serverPos.ID); + int mpind = memLocalPos.FindIndex(lp => lp.ID == localPos.ID); + PosInfo? localPos1 = mpind > 0 ? memLocalPos[mpind - 1] : (PosInfo?)null; + PosInfo? localPos2 = mpind < memLocalPos.Count-1 ? memLocalPos[mpind + 1] : (PosInfo?)null; + Vector2 localVec = ConvertUnits.ToDisplayUnits(localPos.Position); + Vector2 localVec1 = localPos1 != null ? ConvertUnits.ToDisplayUnits(((PosInfo)localPos1).Position) : Vector2.Zero; + Vector2 localVec2 = localPos2 != null ? ConvertUnits.ToDisplayUnits(((PosInfo)localPos2).Position) : Vector2.Zero; if (Submarine != null) { localVec += Submarine.DrawPosition; + localVec1 += Submarine.DrawPosition; + localVec2 += Submarine.DrawPosition; } localVec.Y = -localVec.Y; + localVec1.Y = -localVec1.Y; + localVec2.Y = -localVec2.Y; - GUI.DrawLine(spriteBatch, remoteVec, localVec, Color.Yellow,0,10); + GUI.DrawLine(spriteBatch, remoteVec, localVec, Color.Yellow, 0, 10); + if (localPos1 != null) GUI.DrawLine(spriteBatch, remoteVec, localVec1, Color.Lime, 0, 6); + if (localPos2 != null) GUI.DrawLine(spriteBatch, remoteVec, localVec2, Color.Red, 0, 3); } Vector2 mouseDrawPos = CursorWorldPosition; @@ -2037,7 +2049,7 @@ namespace Barotrauma //length of the message msg.Write((byte)(4+4+4)); msg.Write(true); - msg.Write((UInt32)(LastNetworkUpdateID - memInput.Count)); + msg.Write((UInt32)(LastNetworkUpdateID - memInput.Count - 1)); } else { diff --git a/Subsurface/Source/Physics/PhysicsBody.cs b/Subsurface/Source/Physics/PhysicsBody.cs index 79ff44613..67f2422eb 100644 --- a/Subsurface/Source/Physics/PhysicsBody.cs +++ b/Subsurface/Source/Physics/PhysicsBody.cs @@ -146,6 +146,11 @@ namespace Barotrauma get { return body.Position; } } + public Vector2 Position + { + get { return ConvertUnits.ToDisplayUnits(body.Position); } + } + public Vector2 PrevPosition { get { return prevPosition; }