From 4d40f5d483221cfd370e35b9fe3ec5de271db8ee Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sun, 13 Aug 2017 19:52:56 +0300 Subject: [PATCH] Submarines, items and characters that reach a depth of 300,000 units (~4000 m) are automatically disabled. Avoids the unnecessary cost of updating entities that are way too deep to be reached by anyone. --- Barotrauma/BarotraumaClient/Source/Camera.cs | 11 +++-- .../BarotraumaClient/Source/Map/Submarine.cs | 2 +- .../Source/Screens/GameScreen.cs | 12 +++--- .../Source/Characters/Character.cs | 10 ++++- .../BarotraumaShared/Source/Items/Item.cs | 6 +++ .../Source/Map/Levels/Level.cs | 6 ++- .../BarotraumaShared/Source/Map/Submarine.cs | 43 +++++++++++++++---- .../Source/Map/SubmarineBody.cs | 2 - .../Source/Networking/NetworkMember.cs | 5 +++ .../Source/Networking/RespawnManager.cs | 5 +++ .../Source/Screens/GameScreen.cs | 6 +-- 11 files changed, 83 insertions(+), 25 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Camera.cs b/Barotrauma/BarotraumaClient/Source/Camera.cs index 7b0fc0388..483e73790 100644 --- a/Barotrauma/BarotraumaClient/Source/Camera.cs +++ b/Barotrauma/BarotraumaClient/Source/Camera.cs @@ -139,12 +139,17 @@ namespace Barotrauma if (Level.Loaded != null && clampPos) { - position.Y -= Math.Max(worldView.Y - Level.Loaded.Size.Y, 0.0f); - interpolatedPosition.Y -= Math.Max(worldView.Y - Level.Loaded.Size.Y, 0.0f); + float maxY = Level.Loaded.Size.Y + 100; - worldView.Y = Math.Min((int)Level.Loaded.Size.Y, worldView.Y); + position.Y -= Math.Max(worldView.Y - maxY, 0.0f); + interpolatedPosition.Y -= Math.Max(worldView.Y - maxY, 0.0f); + + position.Y = Math.Max(position.Y, (int)Level.MaxCameraDepth); + interpolatedPosition.Y = Math.Max(interpolatedPosition.Y, (int)Level.MaxCameraDepth); + worldView.Y = MathHelper.Clamp(worldView.Y, (int)Level.MaxCameraDepth, (int)maxY); } + transform = Matrix.CreateTranslation( new Vector3(-interpolatedPosition.X, interpolatedPosition.Y, 0)) * Matrix.CreateScale(new Vector3(interpolatedZoom, interpolatedZoom, 1)) * diff --git a/Barotrauma/BarotraumaClient/Source/Map/Submarine.cs b/Barotrauma/BarotraumaClient/Source/Map/Submarine.cs index 39837fb47..58cce015d 100644 --- a/Barotrauma/BarotraumaClient/Source/Map/Submarine.cs +++ b/Barotrauma/BarotraumaClient/Source/Map/Submarine.cs @@ -39,7 +39,7 @@ namespace Barotrauma if (GameMain.DebugDraw) { - foreach (Submarine sub in Submarine.Loaded) + foreach (Submarine sub in Loaded) { Rectangle worldBorders = sub.Borders; worldBorders.Location += sub.WorldPosition.ToPoint(); diff --git a/Barotrauma/BarotraumaClient/Source/Screens/GameScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/GameScreen.cs index 713d95609..8d3d610db 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/GameScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/GameScreen.cs @@ -68,7 +68,7 @@ namespace Barotrauma public override void Draw(double deltaTime, GraphicsDevice graphics, SpriteBatch spriteBatch) { - cam.UpdateTransform(true); + cam.UpdateTransform(true, !GameMain.DebugDraw); Submarine.CullEntities(cam); DrawMap(graphics, spriteBatch); @@ -88,11 +88,11 @@ namespace Barotrauma { for (int i = 0; i < Submarine.MainSubs.Length; i++) { - if (Submarine.MainSubs[i] != null) - { - Color indicatorColor = i == 0 ? Color.LightBlue * 0.5f : Color.Red * 0.5f; - DrawSubmarineIndicator(spriteBatch, Submarine.MainSubs[i], indicatorColor); - } + if (Submarine.MainSubs[i] == null) continue; + if (Level.Loaded != null && Submarine.MainSubs[i].WorldPosition.Y < Level.MaxEntityDepth) continue; + + Color indicatorColor = i == 0 ? Color.LightBlue * 0.5f : Color.Red * 0.5f; + DrawSubmarineIndicator(spriteBatch, Submarine.MainSubs[i], indicatorColor); } } diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs index f3bf6565e..8d3ecbe9d 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs @@ -1332,7 +1332,15 @@ namespace Barotrauma if (GameMain.Client != null && this == Controlled && !isSynced) return; if (!Enabled) return; - + + if (Level.Loaded != null && WorldPosition.Y < Level.MaxEntityDepth || + (Submarine != null && Submarine.WorldPosition.Y < Level.MaxEntityDepth)) + { + Enabled = false; + Kill(CauseOfDeath.Pressure); + return; + } + PreviousHull = CurrentHull; CurrentHull = Hull.FindHull(WorldPosition, CurrentHull, true); //if (PreviousHull != CurrentHull && Character.Controlled == this) Hull.DetectItemVisibility(this); //WIP item culling diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index 3df13f4e6..9ff26a81e 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -779,6 +779,12 @@ namespace Barotrauma public override void Update(float deltaTime, Camera cam) { + if (Level.Loaded != null && WorldPosition.Y < Level.MaxEntityDepth) + { + Spawner.AddToRemoveQueue(this); + return; + } + ApplyStatusEffects(ActionType.Always, deltaTime, null); foreach (ItemComponent ic in components) diff --git a/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs b/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs index a2bcd31b0..56f8382fe 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Levels/Level.cs @@ -14,8 +14,12 @@ namespace Barotrauma { partial class Level { - public const float ShaftHeight = 1000.0f; + //all entities are disabled after they reach this depth + public const float MaxEntityDepth = -300000.0f; + public const float MaxCameraDepth = -290000.0f; + public const float ShaftHeight = 1000.0f; + public static Level Loaded { get { return loaded; } diff --git a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs index cc859c440..401094d87 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs @@ -414,15 +414,17 @@ namespace Barotrauma public static void CullEntities(Camera cam) { HashSet visibleSubs = new HashSet(); - foreach (Submarine sub in Submarine.Loaded) + foreach (Submarine sub in Loaded) { + if (sub.WorldPosition.Y < Level.MaxEntityDepth) continue; + Rectangle worldBorders = new Rectangle( sub.Borders.X + (int)sub.WorldPosition.X - 500, sub.Borders.Y + (int)sub.WorldPosition.Y + 500, sub.Borders.Width + 1000, sub.Borders.Height + 1000); - if (Submarine.RectsOverlap(worldBorders, cam.WorldView)) + if (RectsOverlap(worldBorders, cam.WorldView)) { visibleSubs.Add(sub); } @@ -682,21 +684,46 @@ namespace Barotrauma { //if (PlayerInput.KeyHit(InputType.Crouch) && (this == MainSub)) FlipX(); - if (Level.Loaded == null) return; - - if (subBody == null) return; + if (Level.Loaded == null || subBody == null) return; + + if (WorldPosition.Y < Level.MaxEntityDepth && + subBody.Body.Enabled && + (GameMain.NetworkMember?.RespawnManager == null || this != GameMain.NetworkMember.RespawnManager.RespawnShuttle)) + { + subBody.Body.ResetDynamics(); + subBody.Body.Enabled = false; + + foreach (MapEntity e in MapEntity.mapEntityList) + { + if (e.Submarine == this) + { + Spawner.AddToRemoveQueue(e); + } + } + + foreach (Character c in Character.CharacterList) + { + if (c.Submarine == this) + { + c.Kill(CauseOfDeath.Pressure); + c.Enabled = false; + } + } + + return; + } subBody.Body.LinearVelocity = new Vector2( LockX ? 0.0f : subBody.Body.LinearVelocity.X, LockY ? 0.0f : subBody.Body.LinearVelocity.Y); - + subBody.Update(deltaTime); for (int i = 0; i < 2; i++ ) { - if (Submarine.MainSubs[i] == null) continue; - if (this != Submarine.MainSubs[i] && Submarine.MainSubs[i].DockedTo.Contains(this)) return; + if (MainSubs[i] == null) continue; + if (this != MainSubs[i] && MainSubs[i].DockedTo.Contains(this)) return; } //send updates more frequently if moving fast diff --git a/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs b/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs index 75b91f7dd..faa349cff 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs @@ -16,8 +16,6 @@ namespace Barotrauma class SubmarineBody { public const float DamageDepth = -30000.0f; - //private const float PressureDamageMultiplier = 0.001f; - private const float DamageMultiplier = 50.0f; private const float Friction = 0.2f, Restitution = 0.0f; diff --git a/Barotrauma/BarotraumaShared/Source/Networking/NetworkMember.cs b/Barotrauma/BarotraumaShared/Source/Networking/NetworkMember.cs index 41f84b7e5..eb7eeaff6 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/NetworkMember.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/NetworkMember.cs @@ -117,6 +117,11 @@ namespace Barotrauma.Networking get { return null; } } + public RespawnManager RespawnManager + { + get { return respawnManager; } + } + public NetworkMember() { InitProjSpecific(); diff --git a/Barotrauma/BarotraumaShared/Source/Networking/RespawnManager.cs b/Barotrauma/BarotraumaShared/Source/Networking/RespawnManager.cs index ecbb192f6..deba6b86c 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/RespawnManager.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/RespawnManager.cs @@ -59,6 +59,11 @@ namespace Barotrauma.Networking private float updateReturnTimer; + public Submarine RespawnShuttle + { + get { return respawnShuttle; } + } + public RespawnManager(NetworkMember networkMember, Submarine shuttle) : base(shuttle) { diff --git a/Barotrauma/BarotraumaShared/Source/Screens/GameScreen.cs b/Barotrauma/BarotraumaShared/Source/Screens/GameScreen.cs index 06296036d..c43ad2c2b 100644 --- a/Barotrauma/BarotraumaShared/Source/Screens/GameScreen.cs +++ b/Barotrauma/BarotraumaShared/Source/Screens/GameScreen.cs @@ -24,15 +24,15 @@ namespace Barotrauma { base.Select(); - if (Character.Controlled!=null) + if (Character.Controlled != null) { cam.Position = Character.Controlled.WorldPosition; - cam.UpdateTransform(); + cam.UpdateTransform(true, !GameMain.DebugDraw); } else if (Submarine.MainSub != null) { cam.Position = Submarine.MainSub.WorldPosition; - cam.UpdateTransform(); + cam.UpdateTransform(true, !GameMain.DebugDraw); } foreach (MapEntity entity in MapEntity.mapEntityList)