From 22fcd644ace5c99db27050e80f15627f321916a5 Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 8 Feb 2016 21:59:57 +0200 Subject: [PATCH] Improved character syncing, clients can't enable monsters before the server says so --- .../Source/Characters/Animation/Ragdoll.cs | 17 +++++++++++++---- Subsurface/Source/Characters/Character.cs | 2 +- .../Source/Events/Quests/MonsterQuest.cs | 2 +- Subsurface/Source/Networking/GameServer.cs | 2 +- Subsurface_Solution.v12.suo | Bin 862720 -> 914432 bytes 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/Subsurface/Source/Characters/Animation/Ragdoll.cs b/Subsurface/Source/Characters/Animation/Ragdoll.cs index 47e6f52d0..d08e1f80c 100644 --- a/Subsurface/Source/Characters/Animation/Ragdoll.cs +++ b/Subsurface/Source/Characters/Animation/Ragdoll.cs @@ -460,7 +460,7 @@ namespace Barotrauma pos.Y = -pos.Y; GUI.DrawRectangle(spriteBatch, new Rectangle((int)pos.X - 10, (int)pos.Y - 10, 20, 20), Color.Cyan, false, 0.01f); - GUI.DrawLine(spriteBatch, pos, new Vector2(limb.Position.X, -limb.Position.Y), limb == RefLimb ? Color.Orange : Color.Cyan); + GUI.DrawLine(spriteBatch, pos, new Vector2(limb.WorldPosition.X, -limb.WorldPosition.Y), limb == RefLimb ? Color.Orange : Color.Cyan); } } @@ -794,7 +794,7 @@ namespace Barotrauma limb.body.TargetPosition = Vector2.Zero; } - correctionMovement = Vector2.Zero; + correctionMovement = targetMovement; return; } else @@ -818,10 +818,19 @@ namespace Barotrauma } else { + //clamp the magnitude of the correction movement between 0.5f - 5.0f Vector2 newCorrectionMovement = Vector2.Normalize(diff) * MathHelper.Clamp(dist * 5.0f, 0.5f, 5.0f); - newCorrectionMovement.X = Math.Max(newCorrectionMovement.X, 0.5f) * Math.Sign(newCorrectionMovement.X); - correctionMovement = Vector2.Lerp(targetMovement, newCorrectionMovement, 0.2f); + //heading in the right direction -> use the ''normal'' movement if it's faster than correctionMovement + //i.e. the character is close to the targetposition but the character is still running + if (Math.Sign(targetMovement.X)==Math.Sign(newCorrectionMovement.X)) + { + newCorrectionMovement.X = Math.Max(Math.Abs(targetMovement.X), Math.Abs(newCorrectionMovement.X)) * Math.Sign(targetMovement.X); + } + + //newCorrectionMovement.X = Math.Max(newCorrectionMovement.X, 0.5f) * Math.Sign(newCorrectionMovement.X); + + correctionMovement = Vector2.Lerp(correctionMovement, newCorrectionMovement, 0.5f); if (Math.Abs(correctionMovement.Y) < 0.1f) correctionMovement.Y = 0.0f; } diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 417abdda3..44ab1ae9c 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -600,7 +600,7 @@ namespace Barotrauma AnimController.TargetMovement = targetMovement; - AnimController.IgnorePlatforms = targetMovement.Y < 0.0f; + AnimController.IgnorePlatforms = AnimController.TargetMovement.Y < 0.0f; if (AnimController.onGround && !AnimController.InWater && diff --git a/Subsurface/Source/Events/Quests/MonsterQuest.cs b/Subsurface/Source/Events/Quests/MonsterQuest.cs index d315babaa..cba33be31 100644 --- a/Subsurface/Source/Events/Quests/MonsterQuest.cs +++ b/Subsurface/Source/Events/Quests/MonsterQuest.cs @@ -43,7 +43,7 @@ namespace Barotrauma { radarPosition = monster.Position; } - else + else if (GameMain.Client == null) { Vector2 diff = monster.WorldPosition-Submarine.Loaded.WorldPosition; monster.Enabled = FarseerPhysics.ConvertUnits.ToSimUnits(diff.Length()) < NetConfig.CharacterIgnoreDistance; } diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index 143c2e9c8..a1ddbcf48 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -817,7 +817,7 @@ namespace Barotrauma.Networking gameStarted = true; - GameMain.GameScreen.Cam.TargetPos = Submarine.Loaded.Position; + GameMain.GameScreen.Cam.TargetPos = Vector2.Zero; GameMain.GameScreen.Select(); diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 1f8d22e37311f7717e8c22f7df2282abdab1f867..355cb5e2a8bdb194e555f16ae63835f5d5cf1995 100644 GIT binary patch delta 10477 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 T&+22`K?mnsZa#O8wV3@UJU-Vt delta 10988 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 Ku4vAyo&FOST^82>