diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index f3e3535ad..20131a96c 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -668,6 +668,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/Subsurface/Content/Items/Clothes/clothes.xml b/Subsurface/Content/Items/Clothes/clothes.xml index b80bb4193..84d4c66d4 100644 --- a/Subsurface/Content/Items/Clothes/clothes.xml +++ b/Subsurface/Content/Items/Clothes/clothes.xml @@ -183,8 +183,8 @@ - - + + @@ -193,11 +193,11 @@ - - + + - - + + diff --git a/Subsurface/Content/UI/damageOverlay.png b/Subsurface/Content/UI/damageOverlay.png new file mode 100644 index 000000000..9d0bcdbbd Binary files /dev/null and b/Subsurface/Content/UI/damageOverlay.png differ diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 0cdb390bb..80628d056 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -1104,7 +1104,11 @@ namespace Barotrauma public virtual void AddDamage(CauseOfDeath causeOfDeath, float amount, IDamageable attacker) { health = MathHelper.Clamp(health-amount, 0.0f, maxHealth); - if (amount>0.0f) lastAttackCauseOfDeath = causeOfDeath; + if (amount > 0.0f) + { + lastAttackCauseOfDeath = causeOfDeath; + if (controlled == this) CharacterHUD.TakeDamage(amount); + } if (health <= 0.0f) Kill(causeOfDeath); } @@ -1126,7 +1130,6 @@ namespace Barotrauma public AttackResult AddDamage(Vector2 simPosition, DamageType damageType, float amount, float bleedingAmount, float stun, bool playSound) { StartStun(stun); - if (controlled == this) CharacterHUD.TakeDamage(); Limb closestLimb = null; float closestDistance = 0.0f; @@ -1554,7 +1557,12 @@ namespace Barotrauma } bool allOk = message.ReadBoolean(); - if (allOk) return; + if (allOk) + { + bleeding = 0.0f; + Stun = 0.0f; + return; + } float newStunTimer = message.ReadRangedSingle(0.0f, 60.0f, 8); StartStun(newStunTimer); diff --git a/Subsurface/Source/Characters/CharacterHUD.cs b/Subsurface/Source/Characters/CharacterHUD.cs index efdfa0b6f..f35fb466a 100644 --- a/Subsurface/Source/Characters/CharacterHUD.cs +++ b/Subsurface/Source/Characters/CharacterHUD.cs @@ -12,13 +12,17 @@ namespace Barotrauma private static Sprite statusIcons; - private static Sprite noise; + private static Sprite noiseOverlay, damageOverlay; private static GUIProgressBar drowningBar, healthBar; - public static void TakeDamage() + private static float damageOverlayTimer; + + public static void TakeDamage(float amount) { healthBar.Flash(); + + damageOverlayTimer = MathHelper.Clamp(amount*0.1f, 0.2f, 5.0f); } public static void Update(float deltaTime, Character character) @@ -29,6 +33,8 @@ namespace Barotrauma if (character.Oxygen < 10.0f) drowningBar.Flash(); } if (healthBar != null) healthBar.Update(deltaTime); + + if (damageOverlayTimer > 0.0f) damageOverlayTimer -= deltaTime; } public static void Draw(SpriteBatch spriteBatch, Character character, Camera cam) @@ -38,9 +44,14 @@ namespace Barotrauma statusIcons = new Sprite("Content/UI/statusIcons.png", Vector2.Zero); } - if (noise==null) + if (noiseOverlay==null) { - noise = new Sprite("Content/UI/noise.png", Vector2.Zero); + noiseOverlay = new Sprite("Content/UI/noise.png", Vector2.Zero); + } + + if (damageOverlay==null) + { + damageOverlay = new Sprite("Content/UI/damageOverlay.png", Vector2.Zero); } DrawStatusIcons(spriteBatch, character); @@ -104,13 +115,13 @@ namespace Barotrauma // Vector2.Zero, // Color.White * 0.1f); - if (character.Oxygen < 50.0f) + if (character.Oxygen < 50.0f && !character.IsDead) { - Vector2 offset = Rand.Vector(noise.size.X); + Vector2 offset = Rand.Vector(noiseOverlay.size.X); offset.X = Math.Abs(offset.X); offset.Y = Math.Abs(offset.Y); - noise.DrawTiled(spriteBatch, Vector2.Zero - offset, new Vector2(GameMain.GraphicsWidth, GameMain.GraphicsHeight) + offset, + noiseOverlay.DrawTiled(spriteBatch, Vector2.Zero - offset, new Vector2(GameMain.GraphicsWidth, GameMain.GraphicsHeight) + offset, Vector2.Zero, Color.White * ((50.0f - character.Oxygen) / 50.0f)); @@ -119,6 +130,12 @@ namespace Barotrauma // new Rectangle(Rand.Int(GameMain.GraphicsWidth), Rand.Int(GameMain.GraphicsHeight), (int)noise.size.X, (int)noise.size.Y), // Color.White * ((100.0f - character.Oxygen) / 100.0f)); } + + if (damageOverlayTimer>0.0f) + { + damageOverlay.Draw(spriteBatch, Vector2.Zero, Color.White * damageOverlayTimer, Vector2.Zero, 0.0f, + new Vector2(GameMain.GraphicsWidth / damageOverlay.size.X, GameMain.GraphicsHeight / damageOverlay.size.Y)); + } } private static void DrawStatusIcons(SpriteBatch spriteBatch, Character character) diff --git a/Subsurface/Source/Items/CharacterInventory.cs b/Subsurface/Source/Items/CharacterInventory.cs index c1ab7820a..207ca6863 100644 --- a/Subsurface/Source/Items/CharacterInventory.cs +++ b/Subsurface/Source/Items/CharacterInventory.cs @@ -403,6 +403,10 @@ namespace Barotrauma } } + lastUpdate = sendingTime; + + if (GameMain.Server == null) return; + var sender = GameMain.Server.ConnectedClients.Find(c => c.Connection == message.SenderConnection); if (sender != null && sender.Character != null) { @@ -410,7 +414,7 @@ namespace Barotrauma { GameServer.Log(sender.Character == character ? character.Name + " dropped " + item.Name : - sender.Character + " removed " + item.Name+" from "+character+"'s inventory", Color.Orange); + sender.Character + " removed " + item.Name + " from " + character + "'s inventory", Color.Orange); } foreach (Item item in Items) @@ -421,9 +425,6 @@ namespace Barotrauma sender.Character + " placed " + item.Name + " in " + character + "'s inventory", Color.Orange); } } - - - lastUpdate = sendingTime; } } diff --git a/Subsurface/Source/Items/Components/Holdable/Holdable.cs b/Subsurface/Source/Items/Components/Holdable/Holdable.cs index 655c2a2d6..c640e3f69 100644 --- a/Subsurface/Source/Items/Components/Holdable/Holdable.cs +++ b/Subsurface/Source/Items/Components/Holdable/Holdable.cs @@ -320,6 +320,8 @@ namespace Barotrauma.Items.Components { Use(1.0f); + if (GameMain.Server == null) return; + var sender = GameMain.Server.ConnectedClients.Find(c => c.Connection == message.SenderConnection); if (sender != null && sender.Character != null) { diff --git a/Subsurface/Source/Items/Components/Machines/Reactor.cs b/Subsurface/Source/Items/Components/Machines/Reactor.cs index a0845745d..72df6207e 100644 --- a/Subsurface/Source/Items/Components/Machines/Reactor.cs +++ b/Subsurface/Source/Items/Components/Machines/Reactor.cs @@ -577,7 +577,6 @@ namespace Barotrauma.Items.Components lastUpdate = sendingTime; - if (GameMain.Server == null) return; var sender = GameMain.Server.ConnectedClients.Find(c => c.Connection == message.SenderConnection); diff --git a/Subsurface/Source/Items/Inventory.cs b/Subsurface/Source/Items/Inventory.cs index 468140ac4..65778372f 100644 --- a/Subsurface/Source/Items/Inventory.cs +++ b/Subsurface/Source/Items/Inventory.cs @@ -394,8 +394,10 @@ namespace Barotrauma TryPutItem(item, item.AllowedSlots, false); if (droppedItems.Contains(item)) droppedItems.Remove(item); } + + lastUpdate = sendingTime; - + if (GameMain.Server == null) return; var sender = GameMain.Server.ConnectedClients.Find(c => c.Connection == message.SenderConnection); if (sender != null && sender.Character != null) { @@ -410,9 +412,6 @@ namespace Barotrauma GameServer.Log(sender.Character + " placed " + item.Name + " in " + Owner.ToString(), Color.Orange); } } - - - lastUpdate = sendingTime; } } } diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 5067dadef..3427d79bf 100644 Binary files a/Subsurface_Solution.v12.suo and b/Subsurface_Solution.v12.suo differ