diff --git a/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs b/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs index ec44d08af..4f043091d 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/CharacterNetworking.cs @@ -138,11 +138,12 @@ namespace Barotrauma msg.ReadFloat(), msg.ReadFloat()); + float rotation = msg.ReadFloat(); int index = 0; if (GameMain.NetworkMember.Character == this && AllowInput) { - var posInfo = new CharacterStateInfo(pos, networkUpdateID, facingRight ? Direction.Right : Direction.Left, selectedEntity, animation); + var posInfo = new CharacterStateInfo(pos, rotation, networkUpdateID, facingRight ? Direction.Right : Direction.Left, selectedEntity, animation); while (index < memState.Count && NetIdUtils.IdMoreRecent(posInfo.ID, memState[index].ID)) index++; @@ -150,7 +151,7 @@ namespace Barotrauma } else { - var posInfo = new CharacterStateInfo(pos, sendingTime, facingRight ? Direction.Right : Direction.Left, selectedEntity, animation); + var posInfo = new CharacterStateInfo(pos, rotation, sendingTime, facingRight ? Direction.Right : Direction.Left, selectedEntity, animation); while (index < memState.Count && posInfo.Timestamp > memState[index].Timestamp) index++; diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs b/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs index 9c9a70b4a..f6962526c 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs @@ -83,9 +83,13 @@ namespace Barotrauma { levitatingCollider = false; Collider.FarseerBody.FixedRotation = false; - - Collider.LinearVelocity = (GetLimb(LimbType.Waist).SimPosition - Collider.SimPosition) * 20.0f; - Collider.SmoothRotate(GetLimb(LimbType.Torso).Rotation); + + if (Math.Abs(Collider.Rotation-GetLimb(LimbType.Torso).Rotation)>Math.PI*0.6f) + { + Collider.SetTransform(Collider.SimPosition, MathHelper.WrapAngle(Collider.Rotation + (float)Math.PI)); + } + Collider.SmoothRotate(GetLimb(LimbType.Torso).Rotation); + Collider.LinearVelocity = (GetLimb(LimbType.Waist).SimPosition - Collider.SimPosition) * 20.0f; return; } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs b/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs index 2feb08dd3..1a9442acd 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs @@ -1339,13 +1339,18 @@ namespace Barotrauma } } - Vector2 positionError = serverPos.Position - localPos.Position; + Vector2 positionError = serverPos.Position - localPos.Position; + float rotationError = serverPos.Rotation - localPos.Rotation; for (int i = localPosIndex; i < character.MemLocalState.Count; i++) { - character.MemLocalState[i].Translate(positionError); + character.MemLocalState[i].Translate(positionError,rotationError); } - Collider.SetTransform(Collider.SimPosition + positionError, Collider.Rotation); + Collider.SetTransform(Collider.SimPosition + positionError, Collider.Rotation + rotationError); + foreach (Limb limb in Limbs) + { + limb.body.SetTransform(limb.body.SimPosition + positionError, limb.body.Rotation + rotationError); + } } if (character.MemLocalState.Count > 120) character.MemLocalState.RemoveRange(0, character.MemLocalState.Count - 120); diff --git a/Barotrauma/BarotraumaShared/Source/Characters/CharacterNetworking.cs b/Barotrauma/BarotraumaShared/Source/Characters/CharacterNetworking.cs index 217156842..1a6ec6b07 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/CharacterNetworking.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/CharacterNetworking.cs @@ -15,18 +15,18 @@ namespace Barotrauma public readonly AnimController.Animation Animation; - public CharacterStateInfo(Vector2 pos, float time, Direction dir, Entity interact, AnimController.Animation animation = AnimController.Animation.None) - : this(pos, 0, time, dir, interact, animation) + public CharacterStateInfo(Vector2 pos, float rotation, float time, Direction dir, Entity interact, AnimController.Animation animation = AnimController.Animation.None) + : this(pos, rotation, 0, time, dir, interact, animation) { } - public CharacterStateInfo(Vector2 pos, UInt16 ID, Direction dir, Entity interact, AnimController.Animation animation = AnimController.Animation.None) - : this(pos, ID, 0.0f, dir, interact, animation) + public CharacterStateInfo(Vector2 pos, float rotation, UInt16 ID, Direction dir, Entity interact, AnimController.Animation animation = AnimController.Animation.None) + : this(pos, rotation, ID, 0.0f, dir, interact, animation) { } - protected CharacterStateInfo(Vector2 pos, UInt16 ID, float time, Direction dir, Entity interact, AnimController.Animation animation = AnimController.Animation.None) - : base(pos, ID, time) + protected CharacterStateInfo(Vector2 pos, float rotation, UInt16 ID, float time, Direction dir, Entity interact, AnimController.Animation animation = AnimController.Animation.None) + : base(pos, rotation, ID, time) { Direction = dir; Interact = interact; @@ -197,6 +197,7 @@ namespace Barotrauma { var posInfo = new CharacterStateInfo( SimPosition, + AnimController.Collider.Rotation, LastNetworkUpdateID, AnimController.TargetDir, SelectedCharacter == null ? (Entity)selectedConstruction : (Entity)SelectedCharacter, @@ -467,6 +468,7 @@ namespace Barotrauma tempBuffer.Write(SimPosition.X); tempBuffer.Write(SimPosition.Y); + tempBuffer.Write(AnimController.Collider.Rotation); tempBuffer.WritePadBits(); diff --git a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs index 45b4f17c0..5a4ae4962 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs @@ -1258,7 +1258,7 @@ namespace Barotrauma return; } - subBody.MemPos.Insert(index, new PosInfo(newTargetPosition, sendingTime)); + subBody.MemPos.Insert(index, new PosInfo(newTargetPosition, 0.0f, sendingTime)); } } diff --git a/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs b/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs index 4c54d48fd..3cfa569da 100644 --- a/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs +++ b/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs @@ -16,22 +16,29 @@ namespace Barotrauma private set; } + public float Rotation + { + get; + private set; + } + public readonly float Timestamp; public readonly UInt16 ID; - public PosInfo(Vector2 pos, float time) - : this(pos, 0, time) + public PosInfo(Vector2 pos, float rotation, float time) + : this(pos, rotation, 0, time) { } - public PosInfo(Vector2 pos, UInt16 ID) - : this(pos, ID, 0.0f) + public PosInfo(Vector2 pos, float rotation, UInt16 ID) + : this(pos, rotation, ID, 0.0f) { } - protected PosInfo(Vector2 pos, UInt16 ID, float time) + protected PosInfo(Vector2 pos, float rotation, UInt16 ID, float time) { Position = pos; + Rotation = rotation; this.ID = ID; Timestamp = time; @@ -52,9 +59,9 @@ namespace Barotrauma } } - public void Translate(Vector2 amount) + public void Translate(Vector2 posAmount,float rotationAmount) { - Position += amount; + Position += posAmount; Rotation += rotationAmount; } }