diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs b/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs index 667d29d62..7951bcf8e 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs @@ -98,7 +98,7 @@ namespace Barotrauma if (distSqrd > 10.0f || !character.AllowInput) { Collider.TargetRotation = newRotation; - SetPosition(newPosition, lerp: distSqrd < 5.0f); + SetPosition(newPosition, lerp: distSqrd < 5.0f, ignorePlatforms: false); } else { @@ -149,6 +149,62 @@ namespace Barotrauma character.MemLocalState[i].TransformOutToInside(currentHull.Submarine); } } + + if (localPos.Animation != serverPos.Animation) + { + if (serverPos.Animation == AnimController.Animation.CPR) + { + character.AnimController.Anim = AnimController.Animation.CPR; + } + else if (character.AnimController.Anim == AnimController.Animation.CPR) + { + character.AnimController.Anim = AnimController.Animation.None; + } + } + + Hull serverHull = Hull.FindHull(ConvertUnits.ToDisplayUnits(serverPos.Position), character.CurrentHull, serverPos.Position.Y < lowestSubPos); + Hull clientHull = Hull.FindHull(ConvertUnits.ToDisplayUnits(localPos.Position), serverHull, localPos.Position.Y < lowestSubPos); + + if (serverHull != null && clientHull != null && serverHull.Submarine != clientHull.Submarine) + { + //hull subs don't match => teleport the camera to the other sub + character.Submarine = serverHull.Submarine; + character.CurrentHull = currentHull = serverHull; + SetPosition(serverPos.Position); + character.MemLocalState.Clear(); + } + else + { + Vector2 positionError = serverPos.Position - localPos.Position; + float rotationError = serverPos.Rotation.HasValue && localPos.Rotation.HasValue ? + serverPos.Rotation.Value - localPos.Rotation.Value : + 0.0f; + + for (int i = localPosIndex; i < character.MemLocalState.Count; i++) + { + Hull pointHull = Hull.FindHull(ConvertUnits.ToDisplayUnits(character.MemLocalState[i].Position), clientHull, character.MemLocalState[i].Position.Y < lowestSubPos); + if (pointHull != clientHull && ((pointHull == null) || (clientHull == null) || (pointHull.Submarine == clientHull.Submarine))) break; + character.MemLocalState[i].Translate(positionError, rotationError); + } + + float errorMagnitude = positionError.Length(); + if (errorMagnitude > 0.01f) + { + Collider.TargetPosition = Collider.SimPosition + positionError; + Collider.TargetRotation = Collider.Rotation + rotationError; + Collider.MoveToTargetPosition(lerp: true); + if (errorMagnitude > 0.5f) + { + character.MemLocalState.Clear(); + foreach (Limb limb in Limbs) + { + limb.body.TargetPosition = limb.body.SimPosition + positionError; + limb.body.MoveToTargetPosition(lerp: true); + } + } + } + } + } if (character.MemState.Count < 1) return; @@ -238,20 +294,16 @@ namespace Barotrauma } float errorMagnitude = positionError.Length(); - if (errorMagnitude > 0.01f) + if (errorMagnitude > 0.5f) + { + character.MemLocalState.Clear(); + SetPosition(serverPos.Position, lerp: true, ignorePlatforms: false); + } + else if (errorMagnitude > 0.01f) { Collider.TargetPosition = Collider.SimPosition + positionError; Collider.TargetRotation = Collider.Rotation + rotationError; Collider.MoveToTargetPosition(lerp: true); - if (errorMagnitude > 0.5f) - { - character.MemLocalState.Clear(); - foreach (Limb limb in Limbs) - { - limb.body.TargetPosition = limb.body.SimPosition + positionError; - limb.body.MoveToTargetPosition(lerp: true); - } - } } } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs b/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs index f54998194..279c7b90e 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/AI/EnemyAIController.cs @@ -1060,6 +1060,8 @@ namespace Barotrauma private bool IsProperlyLatchedOnSub => LatchOntoAI != null && LatchOntoAI.IsAttachedToSub && SelectedAiTarget?.Entity == wallTarget?.Structure; + private bool IsProperlyLatchedOnSub => LatchOntoAI != null && LatchOntoAI.IsAttachedToSub && SelectedAiTarget?.Entity == wallTarget?.Structure; + //goes through all the AItargets, evaluates how preferable it is to attack the target, //whether the Character can see/hear the target and chooses the most preferable target within //sight/hearing range diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs b/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs index ef7dcecf5..3530df734 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Animation/HumanoidAnimController.cs @@ -379,7 +379,6 @@ namespace Barotrauma { //rotate collider back upright Collider.AngularVelocity = MathUtils.GetShortestAngle(Collider.Rotation, 0.0f) * 10.0f; - Collider.FarseerBody.FixedRotation = false; } else @@ -387,6 +386,14 @@ namespace Barotrauma Collider.FarseerBody.FixedRotation = true; } } + else + { + float angleDiff = MathUtils.GetShortestAngle(Collider.Rotation, 0.0f); + if (Math.Abs(angleDiff) > 0.001f) + { + Collider.SetTransform(Collider.SimPosition, Collider.Rotation + angleDiff); + } + } if (character.LockHands) { diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs b/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs index 8eaca9be2..05ef1b83f 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Animation/Ragdoll.cs @@ -1450,7 +1450,7 @@ namespace Barotrauma } } - public void SetPosition(Vector2 simPosition, bool lerp = false) + public void SetPosition(Vector2 simPosition, bool lerp = false, bool ignorePlatforms = true) { if (!MathUtils.IsValid(simPosition)) { @@ -1481,18 +1481,18 @@ namespace Barotrauma //check visibility from the new position of the collider to the new position of this limb Vector2 movePos = limb.SimPosition + limbMoveAmount; - TrySetLimbPosition(limb, simPosition, movePos, lerp); + TrySetLimbPosition(limb, simPosition, movePos, lerp, ignorePlatforms); } } - protected void TrySetLimbPosition(Limb limb, Vector2 original, Vector2 simPosition, bool lerp = false) + protected void TrySetLimbPosition(Limb limb, Vector2 original, Vector2 simPosition, bool lerp = false, bool ignorePlatforms = true) { Vector2 movePos = simPosition; if (Vector2.DistanceSquared(original, simPosition) > 0.0001f) { Category collisionCategory = Physics.CollisionWall | Physics.CollisionLevel; - //if (!ignorePlatforms) collisionCategory |= Physics.CollisionPlatform; + if (!ignorePlatforms) { collisionCategory |= Physics.CollisionPlatform; } Body body = Submarine.PickBody(original, simPosition, null, collisionCategory);