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
This commit is contained in:
@@ -1066,7 +1066,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (character == GameMain.NetworkMember.Character)
|
if (character == GameMain.NetworkMember.Character)
|
||||||
{
|
{
|
||||||
if (character.MemPos.Count < 2) return;
|
if (character.MemPos.Count < 1) return;
|
||||||
|
|
||||||
PosInfo serverPos = character.MemPos.Last();
|
PosInfo serverPos = character.MemPos.Last();
|
||||||
|
|
||||||
@@ -1075,16 +1075,27 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
PosInfo localPos = character.MemLocalPos[localPosIndex];
|
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);
|
//our prediction differs from the server position
|
||||||
collider.SetTransform(serverPos.Position, collider.Rotation);
|
//-> we need to move the saved local position and all the positions saved after it
|
||||||
// character.MemLocalPos.RemoveRange(localPosIndex, character.MemLocalPos.Count - localPosIndex);
|
|
||||||
|
//(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);
|
if (character.MemLocalPos.Count > 120) character.MemLocalPos.RemoveRange(0, character.MemLocalPos.Count - 120);
|
||||||
character.MemPos.Clear();
|
character.MemPos.Clear();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user