From 9eaca68ceab70a5581842c677698b3c058d95d81 Mon Sep 17 00:00:00 2001 From: Regalis Date: Wed, 9 Nov 2016 17:43:23 +0200 Subject: [PATCH] Clients move their saved local positions if they don't match the servers position (instead of immediately snapping to the latest server position) TODO: prevent ladders from sending the character flying, some safeguards in case positions are way off --- .../Source/Characters/Animation/Ragdoll.cs | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/Subsurface/Source/Characters/Animation/Ragdoll.cs b/Subsurface/Source/Characters/Animation/Ragdoll.cs index ce79d9ab4..11fddad95 100644 --- a/Subsurface/Source/Characters/Animation/Ragdoll.cs +++ b/Subsurface/Source/Characters/Animation/Ragdoll.cs @@ -1066,7 +1066,7 @@ namespace Barotrauma if (character == GameMain.NetworkMember.Character) { - if (character.MemPos.Count < 2) return; + if (character.MemPos.Count < 1) return; PosInfo serverPos = character.MemPos.Last(); @@ -1075,16 +1075,27 @@ namespace Barotrauma { PosInfo localPos = character.MemLocalPos[localPosIndex]; - if (Vector2.Distance(localPos.Position, serverPos.Position) > collider.LinearVelocity.Length()+0.02f) + Vector2 positionError = serverPos.Position - localPos.Position; + + if (positionError.Length() > collider.LinearVelocity.Length()+0.02f) { - //collider.SetTransform(collider.SimPosition + (pos.Position - remotePos), collider.Rotation); - collider.SetTransform(serverPos.Position, collider.Rotation); - // character.MemLocalPos.RemoveRange(localPosIndex, character.MemLocalPos.Count - localPosIndex); + //our prediction differs from the server position + //-> we need to move the saved local position and all the positions saved after it + + //(a better way to do this would be to move the character back to + //serverPos and "replay" inputs to see where the character should be now) + for (int i = localPosIndex; i < character.MemLocalPos.Count; i++ ) + { + character.MemLocalPos[i] = + new PosInfo( + character.MemLocalPos[i].Position + positionError, + character.MemLocalPos[i].Direction, + character.MemLocalPos[i].ID); + } + collider.SetTransform(character.MemLocalPos.Last().Position, collider.Rotation); } } - - if (character.MemLocalPos.Count > 120) character.MemLocalPos.RemoveRange(0, character.MemLocalPos.Count - 120); character.MemPos.Clear(); }