From b24f0877a1779b43cad3d74bed75c31c4e8947c5 Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 17 Apr 2017 17:56:17 +0300 Subject: [PATCH] Fixed characters occasionally teleporting around at the clients' end after respawning. The position syncing logic assumed that all coordinates above the level are in sub-relative space, even though the world position of the respawn shuttle can also be above the level. --- .../Source/Characters/Animation/Ragdoll.cs | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/Subsurface/Source/Characters/Animation/Ragdoll.cs b/Subsurface/Source/Characters/Animation/Ragdoll.cs index 9b14b4baa..68271e9af 100644 --- a/Subsurface/Source/Characters/Animation/Ragdoll.cs +++ b/Subsurface/Source/Characters/Animation/Ragdoll.cs @@ -1234,19 +1234,21 @@ namespace Barotrauma { if (GameMain.NetworkMember == null) return; + float lowestSubPos = ConvertUnits.ToSimUnits(Submarine.Loaded.Min(s => s.HiddenSubPosition.Y - s.Borders.Height)); + for (int i = 0; i < character.MemState.Count; i++ ) { if (character.Submarine == null) { //transform in-sub coordinates to outside coordinates - if (character.MemState[i].Position.Y > ConvertUnits.ToSimUnits(Level.Loaded.Size.Y)) + if (character.MemState[i].Position.Y > lowestSubPos) character.MemState[i].TransformInToOutside(); } else if (currentHull != null) { //transform outside coordinates to in-sub coordinates - if (character.MemState[i].Position.Y < ConvertUnits.ToSimUnits(Level.Loaded.Size.Y)) - character.MemState[i].TransformOutToInside(currentHull.Submarine); + if (character.MemState[i].Position.Y m.Timestamp > 0.0f); - + for (int i = 0; i < character.MemLocalState.Count; i++) { if (character.Submarine == null) { //transform in-sub coordinates to outside coordinates - if (character.MemLocalState[i].Position.Y > ConvertUnits.ToSimUnits(Level.Loaded.Size.Y)) + if (character.MemLocalState[i].Position.Y > lowestSubPos) + { character.MemLocalState[i].TransformInToOutside(); + } } else if (currentHull != null) { //transform outside coordinates to in-sub coordinates - if (character.MemLocalState[i].Position.Y < ConvertUnits.ToSimUnits(Level.Loaded.Size.Y)) - character.MemLocalState[i].TransformOutToInside(currentHull.Submarine); + if (character.MemLocalState[i].Position.Y < lowestSubPos) + { + character.MemLocalState[i].TransformOutToInside(currentHull.Submarine); + } } }