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