From 92a162cbf5b96da1d3b9e64a3ae18d01567b12cc Mon Sep 17 00:00:00 2001 From: Regalis Date: Sat, 30 Jan 2016 15:18:19 +0200 Subject: [PATCH] Only AICharacters use simplephysics, AICharacter bleeding syncing, resetting limb velocities in MP when doing full position reset, characters aren't updated if health <= 0, monsterevent initialization using synced seed, GetRandomWaypoint uses synced seed, disabling debug stuff when starting a client, netconfig changes --- Subsurface/Source/Characters/AICharacter.cs | 22 ++++++++++++++++-- .../Source/Characters/Animation/Ragdoll.cs | 14 ++++++----- Subsurface/Source/Characters/Character.cs | 12 +--------- Subsurface/Source/Events/MonsterEvent.cs | 4 ++-- Subsurface/Source/Map/WayPoint.cs | 2 +- Subsurface/Source/Networking/GameClient.cs | 4 ++++ Subsurface/Source/Networking/NetConfig.cs | 4 ++-- Subsurface/Source/Screens/NetLobbyScreen.cs | 5 +--- Subsurface_Solution.v12.suo | Bin 914944 -> 914432 bytes 9 files changed, 39 insertions(+), 28 deletions(-) diff --git a/Subsurface/Source/Characters/AICharacter.cs b/Subsurface/Source/Characters/AICharacter.cs index e97c1efb8..6e0dddc60 100644 --- a/Subsurface/Source/Characters/AICharacter.cs +++ b/Subsurface/Source/Characters/AICharacter.cs @@ -34,8 +34,18 @@ namespace Barotrauma public override void Update(Camera cam, float deltaTime) { base.Update(cam, deltaTime); + + float dist = Vector2.Distance(cam.WorldViewCenter, WorldPosition); + if (dist > 8000.0f) + { + AnimController.SimplePhysicsEnabled = true; + } + else if (dist < 7000.0f) + { + AnimController.SimplePhysicsEnabled = false; + } - if (isDead) return; + if (isDead || health <= 0.0f) return; if (Controlled == this) return; @@ -92,6 +102,9 @@ namespace Barotrauma message.WriteRangedSingle(MathHelper.Clamp(AnimController.StunTimer, 0.0f, 60.0f), 0.0f, 60.0f, 8); message.Write((byte)((health / maxHealth) * 255.0f)); + Bleeding = MathHelper.Clamp(Bleeding, 0.0f, 5.0f); + message.WriteRangedSingle(Bleeding, 0.0f, 5.0f, 8); + aiController.FillNetworkData(message); return true; case NetworkEventType.EntityUpdate: @@ -160,18 +173,23 @@ namespace Barotrauma } //} - float newStunTimer = 0.0f, newHealth = 0.0f; + float newStunTimer = 0.0f, newHealth = 0.0f, newBleeding = 0.0f; try { newStunTimer = message.ReadRangedSingle(0.0f, 60.0f, 8); newHealth = (message.ReadByte() / 255.0f) * maxHealth; + + + newBleeding = message.ReadRangedSingle(0.0f, 5.0f, 8); } catch { return; } AnimController.StunTimer = newStunTimer; health = newHealth; + Bleeding = newBleeding; + aiController.ReadNetworkData(message); return; case NetworkEventType.EntityUpdate: diff --git a/Subsurface/Source/Characters/Animation/Ragdoll.cs b/Subsurface/Source/Characters/Animation/Ragdoll.cs index a23baf77a..217bce765 100644 --- a/Subsurface/Source/Characters/Animation/Ragdoll.cs +++ b/Subsurface/Source/Characters/Animation/Ragdoll.cs @@ -393,13 +393,13 @@ namespace Barotrauma if (impact > 0.8f && l.HitSound != null && l.soundTimer <= 0.0f) l.HitSound.Play(volume, impact * 100.0f, l.WorldPosition); if (impact > l.impactTolerance) - { + { if (!character.IsNetworkPlayer) { character.AddDamage(CauseOfDeath.Damage, impact - l.impactTolerance * 0.1f); - } - strongestImpact = Math.Max(strongestImpact, impact - l.impactTolerance); + strongestImpact = Math.Max(strongestImpact, impact - l.impactTolerance); + } SoundPlayer.PlayDamageSound(DamageSoundType.LimbBlunt, strongestImpact, l.body); @@ -824,8 +824,10 @@ namespace Barotrauma //if (character is AICharacter) SetRotation(refLimb.body.TargetRotation); - //foreach (Limb limb in Limbs) - //{ + foreach (Limb limb in Limbs) + { + limb.body.LinearVelocity = Vector2.Zero; + limb.body.AngularVelocity = Vector2.Zero; // if (limb.body.TargetPosition == Vector2.Zero) // { // limb.body.SetTransform(limb.body.SimPosition + diff, limb.body.Rotation); @@ -837,7 +839,7 @@ namespace Barotrauma // limb.body.SetTransform(limb.body.TargetPosition, limb.body.TargetRotation); // limb.body.TargetPosition = Vector2.Zero; - //} + } } } diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index e2f8851ae..0ab519ce5 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -873,7 +873,7 @@ namespace Barotrauma { foreach (Character c in CharacterList) { - if (c.isDead || !c.Enabled) continue; + if (c.isDead || c.health <= 0.0f || !c.Enabled) continue; c.AnimController.UpdateAnim(deltaTime); } } @@ -897,16 +897,6 @@ namespace Barotrauma obstructVisionAmount = Math.Max(obstructVisionAmount - deltaTime, 0.0f); - float dist = Vector2.Distance(cam.WorldViewCenter, WorldPosition); - if (dist > 8000.0f) - { - AnimController.SimplePhysicsEnabled = true; - } - else if (dist < 7000.0f) - { - AnimController.SimplePhysicsEnabled = false; - } - if (isDead) return; if (!(AnimController is FishAnimController)) diff --git a/Subsurface/Source/Events/MonsterEvent.cs b/Subsurface/Source/Events/MonsterEvent.cs index 259f2555d..3f2d316b6 100644 --- a/Subsurface/Source/Events/MonsterEvent.cs +++ b/Subsurface/Source/Events/MonsterEvent.cs @@ -42,8 +42,8 @@ namespace Barotrauma position.Y -= Level.Loaded.Size.Y; } - position.X += Rand.Range(-0.5f, 0.5f); - position.Y += Rand.Range(-0.5f, 0.5f); + position.X += Rand.Range(-0.5f, 0.5f, false); + position.Y += Rand.Range(-0.5f, 0.5f, false); monsters[i] = Character.Create(characterFile, position); } } diff --git a/Subsurface/Source/Map/WayPoint.cs b/Subsurface/Source/Map/WayPoint.cs index 716676b6f..e84e0548f 100644 --- a/Subsurface/Source/Map/WayPoint.cs +++ b/Subsurface/Source/Map/WayPoint.cs @@ -617,7 +617,7 @@ namespace Barotrauma if (!wayPoints.Any()) return null; - return wayPoints[Rand.Int(wayPoints.Count())]; + return wayPoints[Rand.Int(wayPoints.Count(), false)]; } public static WayPoint[] SelectCrewSpawnPoints(List crew) diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index d9bb13689..8b149cc8d 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -30,6 +30,10 @@ namespace Barotrauma.Networking public GameClient(string newName) { + GameMain.DebugDraw = false; + Hull.EditFire = false; + Hull.EditWater = false; + name = newName; characterInfo = new CharacterInfo(Character.HumanConfigFile, name); diff --git a/Subsurface/Source/Networking/NetConfig.cs b/Subsurface/Source/Networking/NetConfig.cs index 7ca0c7c49..9e1940093 100644 --- a/Subsurface/Source/Networking/NetConfig.cs +++ b/Subsurface/Source/Networking/NetConfig.cs @@ -16,7 +16,7 @@ namespace Barotrauma.Networking //if a Character is further than this from the sub, the server will ignore it //(in sim units) - public const float CharacterIgnoreDistance = 100.0f; + public const float CharacterIgnoreDistance = 300.0f; //if a ragdoll is further than this from the correct position, teleport it there //(in sim units) @@ -32,7 +32,7 @@ namespace Barotrauma.Networking public const float IdSendInterval = 0.2f; public const float RerequestInterval = 0.2f; - public const int ReliableMessageBufferSize = 100; + public const int ReliableMessageBufferSize = 500; public const int ResendAttempts = 10; } } diff --git a/Subsurface/Source/Screens/NetLobbyScreen.cs b/Subsurface/Source/Screens/NetLobbyScreen.cs index d88d71533..d6725fac3 100644 --- a/Subsurface/Source/Screens/NetLobbyScreen.cs +++ b/Subsurface/Source/Screens/NetLobbyScreen.cs @@ -884,10 +884,7 @@ namespace Barotrauma public bool TrySelectSub(string subName, string md5Hash) { - - subName = subName.ToLower(); - - Submarine sub = Submarine.SavedSubmarines.Find(m => m.Name.ToLower() == subName); + Submarine sub = Submarine.SavedSubmarines.Find(m => m.Name == subName); if (sub == null) { new GUIMessageBox("Submarine not found!","The submarine ''" + subName + "'' has been selected by the server. Matching file not found in your map folder."); diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 14d9dde82e1663acd3ec201ecd894b572760e0b8..522cba9625d66f762ebebf79dccc069fe5eac0ae 100644 GIT binary patch delta 15480 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