From 65211ecbb66e6bf64d466b8a6e18d9eec997d823 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Tue, 22 Aug 2017 19:06:29 +0300 Subject: [PATCH] Characters that are outside are rendered under particles -> creatures can be hidden by smoke from hydrothermal vents. --- .../Source/Screens/GameScreen.cs | 37 +++++++++++++++++-- .../BarotraumaShared/Source/Map/Submarine.cs | 12 +++--- .../Source/Map/SubmarineBody.cs | 13 +++++-- 3 files changed, 50 insertions(+), 12 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Screens/GameScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/GameScreen.cs index 0e58721e7..8ffb7ca9f 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/GameScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/GameScreen.cs @@ -2,6 +2,8 @@ using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using System; +using System.Collections.Generic; +using System.Linq; namespace Barotrauma { @@ -103,6 +105,18 @@ namespace Barotrauma public void DrawMap(GraphicsDevice graphics, SpriteBatch spriteBatch) { + HashSet outsideCharacters = new HashSet(); + foreach (Character c in Character.CharacterList) + { + if (!c.AnimController.CanEnterSubmarine) + { + outsideCharacters.Add(c); + } + else if (c.CurrentHull == null && !Submarine.Loaded.Any(s => Submarine.RectContains(s.WorldBorders, c.WorldPosition))) + { + outsideCharacters.Add(c); + } + } foreach (Submarine sub in Submarine.Loaded) { @@ -134,6 +148,18 @@ namespace Barotrauma Level.Loaded.DrawBack(graphics, spriteBatch, cam, BackgroundCreatureManager); } + spriteBatch.Begin(SpriteSortMode.BackToFront, + BlendState.AlphaBlend, + null, null, null, null, + cam.Transform); + + foreach (Character c in outsideCharacters) + { + if (c.CurrentHull == null) c.Draw(spriteBatch); + } + + spriteBatch.End(); + #if LINUX spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, @@ -141,9 +167,9 @@ namespace Barotrauma cam.Transform); #else spriteBatch.Begin(SpriteSortMode.Deferred, - BlendState.AlphaBlend, - null, DepthStencilState.DepthRead, null, null, - cam.Transform); + BlendState.AlphaBlend, + null, DepthStencilState.DepthRead, null, null, + cam.Transform); #endif GameMain.ParticleManager.Draw(spriteBatch, true, false, Particles.ParticleBlendState.AlphaBlend); spriteBatch.End(); @@ -178,7 +204,10 @@ namespace Barotrauma Submarine.DrawBack(spriteBatch, false, s => !(s is Structure)); - foreach (Character c in Character.CharacterList) c.Draw(spriteBatch); + foreach (Character c in Character.CharacterList) + { + if (!outsideCharacters.Contains(c)) c.Draw(spriteBatch); + } spriteBatch.End(); diff --git a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs index 401094d87..a379bd8ac 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/Submarine.cs @@ -151,12 +151,14 @@ namespace Barotrauma public Rectangle Borders { - get - { - return subBody.Borders; - } + get { return subBody.Borders; } } - + + public Rectangle WorldBorders + { + get { return SubBody.WorldBorders; } + } + public override Vector2 Position { get { return subBody==null ? Vector2.Zero : subBody.Position - HiddenSubPosition; } diff --git a/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs b/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs index 9d873cc9a..f629d27de 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/SubmarineBody.cs @@ -39,6 +39,12 @@ namespace Barotrauma get; private set; } + + public Rectangle WorldBorders + { + get; + private set; + } public Vector2 Velocity { @@ -181,6 +187,10 @@ namespace Barotrauma public void Update(float deltaTime) { + var worldBorders = Borders; + worldBorders.Location += MathUtils.ToPoint(Position); + WorldBorders = worldBorders; + if (GameMain.Client != null) { if (memPos.Count == 0) return; @@ -232,9 +242,6 @@ namespace Barotrauma //if outside left or right edge of the level if (Position.X < 0 || Position.X > Level.Loaded.Size.X) { - Rectangle worldBorders = Borders; - worldBorders.Location += MathUtils.ToPoint(Position); - //push the sub back below the upper "barrier" of the level if (worldBorders.Y > Level.Loaded.Size.Y) {