diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs b/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs index c127b8175..52cfb5ffc 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/Animation/Ragdoll.cs @@ -122,6 +122,67 @@ namespace Barotrauma MainLimb.PullJointEnabled = true; } } + + 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.MemLocalState.Count > 120) character.MemLocalState.RemoveRange(0, character.MemLocalState.Count - 120); + character.MemState.Clear(); + } + } + + partial void ImpactProjSpecific(float impact, Body body) + { + float volume = MathHelper.Clamp(impact - 3.0f, 0.5f, 1.0f); + + if (body.UserData is Limb && character.Stun <= 0f) + { + Limb limb = (Limb)body.UserData; + if (impact > 3.0f && limb.LastImpactSoundTime < Timing.TotalTime - Limb.SoundInterval) + { + PlayImpactSound(limb); } character.MemLocalState.Clear(); } @@ -256,6 +317,12 @@ namespace Barotrauma } } + } + if (Character.Controlled == character) + { + GameMain.GameScreen.Cam.Shake = Math.Min(Math.Max(strongestImpact, GameMain.GameScreen.Cam.Shake), 3.0f); + } + } if (character.MemLocalState.Count > 120) character.MemLocalState.RemoveRange(0, character.MemLocalState.Count - 120); character.MemState.Clear(); @@ -266,22 +333,15 @@ namespace Barotrauma { float volume = MathHelper.Clamp(impact - 3.0f, 0.5f, 1.0f); - if (body.UserData is Limb && character.Stun <= 0f) + if (body.UserData is Limb limb && character.Stun <= 0f) { - Limb limb = (Limb)body.UserData; - if (impact > 3.0f && limb.LastImpactSoundTime < Timing.TotalTime - Limb.SoundInterval) - { - PlayImpactSound(limb); - } + if (impact > 3.0f) { PlayImpactSound(limb); } } else if (body.UserData is Limb || body == Collider.FarseerBody) { - if (!character.IsRemotePlayer) + if (!character.IsRemotePlayer && impact > ImpactTolerance) { - if (impact > ImpactTolerance) - { - SoundPlayer.PlayDamageSound("LimbBlunt", strongestImpact, Collider); - } + SoundPlayer.PlayDamageSound("LimbBlunt", strongestImpact, Collider); } } if (Character.Controlled == character) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Animation/FishAnimController.cs b/Barotrauma/BarotraumaShared/Source/Characters/Animation/FishAnimController.cs index 6e1406f46..6f049f1a6 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Animation/FishAnimController.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Animation/FishAnimController.cs @@ -588,6 +588,7 @@ namespace Barotrauma } } + float prevWalkPos = WalkPos; WalkPos -= MainLimb.LinearVelocity.X * (CurrentAnimationParams.CycleSpeed / RagdollParams.JointScale / 100.0f); Vector2 transformedStepSize = Vector2.Zero; @@ -620,8 +621,14 @@ namespace Barotrauma footPos.X += limb.StepOffset.X * Dir; footPos.Y += limb.StepOffset.Y; + bool playFootstepSound = false; if (limb.type == LimbType.LeftFoot) { + if (Math.Sign(Math.Sin(prevWalkPos)) > 0 && Math.Sign(transformedStepSize.Y) < 0) + { + playFootstepSound = true; + } + limb.DebugRefPos = footPos + Vector2.UnitX * movement.X * 0.1f; limb.DebugTargetPos = footPos + new Vector2( transformedStepSize.X + movement.X * 0.1f, @@ -630,13 +637,20 @@ namespace Barotrauma } else if (limb.type == LimbType.RightFoot) { + if (Math.Sign(Math.Sin(prevWalkPos)) < 0 && Math.Sign(transformedStepSize.Y) > 0) + { + playFootstepSound = true; + } + limb.DebugRefPos = footPos + Vector2.UnitX * movement.X * 0.1f; limb.DebugTargetPos = footPos + new Vector2( -transformedStepSize.X + movement.X * 0.1f, (-transformedStepSize.Y > 0.0f) ? -transformedStepSize.Y : 0.0f); limb.MoveToPos(limb.DebugTargetPos, FootMoveForce); } - +#if CLIENT + if (playFootstepSound) { PlayImpactSound(limb); } +#endif if (CurrentGroundedParams.FootAnglesInRadians.ContainsKey(limb.limbParams.ID)) { SmoothRotateWithoutWrapping(limb,