From af1a681da00d0a05c45d4d99639318f1a1a3d35a Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Tue, 11 Jul 2017 20:01:49 +0300 Subject: [PATCH] Fixed far-away AI characters staying disabled when switching control to them + minor optimization --- .../BarotraumaShared/Source/Characters/Character.cs | 10 +++++----- .../BarotraumaShared/Source/Networking/GameServer.cs | 3 ++- .../BarotraumaShared/Source/Networking/NetConfig.cs | 1 + 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs index cb5aae9e0..569e35ac3 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs @@ -1288,22 +1288,22 @@ namespace Barotrauma if (GameMain.Server != null) { - //disable AI characters that are far away from all clients and the host's character + //disable AI characters that are far away from all clients and the host's character and not controlled by anyone c.Enabled = + c == controlled || CharacterList.Any(c2 => (c2.IsRemotePlayer || c2 == GameMain.Server.Character) && - Vector2.Distance(c2.WorldPosition, c.WorldPosition) < NetConfig.CharacterIgnoreDistance); + Vector2.DistanceSquared(c2.WorldPosition, c.WorldPosition) < NetConfig.CharacterIgnoreDistanceSqr); } else if (Submarine.MainSub != null) { //disable AI characters that are far away from the sub and the controlled character - c.Enabled = Vector2.Distance(Submarine.MainSub.WorldPosition, c.WorldPosition) < NetConfig.CharacterIgnoreDistance || - (controlled != null && Vector2.Distance(controlled.WorldPosition, c.WorldPosition) < NetConfig.CharacterIgnoreDistance); + c.Enabled = Vector2.DistanceSquared(Submarine.MainSub.WorldPosition, c.WorldPosition) < NetConfig.CharacterIgnoreDistanceSqr || + (controlled != null && Vector2.DistanceSquared(controlled.WorldPosition, c.WorldPosition) < NetConfig.CharacterIgnoreDistanceSqr); } } } - for (int i = 0; i < CharacterList.Count; i++) { CharacterList[i].Update(deltaTime, cam); diff --git a/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs b/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs index f304e5d96..50adb3eb4 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs @@ -842,7 +842,7 @@ namespace Barotrauma.Networking if (!character.Enabled) continue; if (c.Character != null && Vector2.DistanceSquared(character.WorldPosition, c.Character.WorldPosition) >= - NetConfig.CharacterIgnoreDistance * NetConfig.CharacterIgnoreDistance) + NetConfig.CharacterIgnoreDistanceSqr) { continue; } @@ -1876,6 +1876,7 @@ namespace Barotrauma.Networking newCharacter.LastNetworkUpdateID = client.Character.LastNetworkUpdateID; newCharacter.IsRemotePlayer = true; + newCharacter.Enabled = true; client.Character = newCharacter; CreateEntityEvent(newCharacter, new object[] { NetEntityEvent.Type.Control, client }); } diff --git a/Barotrauma/BarotraumaShared/Source/Networking/NetConfig.cs b/Barotrauma/BarotraumaShared/Source/Networking/NetConfig.cs index 86983ee8a..fe834b55e 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/NetConfig.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/NetConfig.cs @@ -14,6 +14,7 @@ //if a Character is further than this from the sub, the server will ignore it //(in display units) public const float CharacterIgnoreDistance = 20000.0f; + public const float CharacterIgnoreDistanceSqr = CharacterIgnoreDistance * CharacterIgnoreDistance; //how much the physics body of an item has to move until the server //send a position update to clients (in sim units)