diff --git a/Subsurface/Properties/AssemblyInfo.cs b/Subsurface/Properties/AssemblyInfo.cs index 3743e5477..805f9dc02 100644 --- a/Subsurface/Properties/AssemblyInfo.cs +++ b/Subsurface/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.3.0.1")] -[assembly: AssemblyFileVersion("0.3.0.1")] +[assembly: AssemblyVersion("0.3.0.2")] +[assembly: AssemblyFileVersion("0.3.0.2")] diff --git a/Subsurface/Source/Camera.cs b/Subsurface/Source/Camera.cs index c438c482e..5739ab2c5 100644 --- a/Subsurface/Source/Camera.cs +++ b/Subsurface/Source/Camera.cs @@ -170,15 +170,14 @@ namespace Barotrauma if (PlayerInput.KeyDown(Keys.D)) moveCam.X += moveSpeed; if (PlayerInput.KeyDown(Keys.S)) moveCam.Y -= moveSpeed; if (PlayerInput.KeyDown(Keys.W)) moveCam.Y += moveSpeed; - - if (Submarine.Loaded!=null && Screen.Selected == GameMain.GameScreen) - { - moveCam += FarseerPhysics.ConvertUnits.ToDisplayUnits(Submarine.Loaded.Velocity*deltaTime); - } - - moveCam = moveCam * deltaTime * 60.0f; } + if (Submarine.Loaded!=null && Screen.Selected == GameMain.GameScreen) + { + moveCam += FarseerPhysics.ConvertUnits.ToDisplayUnits(Submarine.Loaded.Velocity*deltaTime); + } + + moveCam = moveCam * deltaTime * 60.0f; Zoom = MathHelper.Clamp(zoom + (PlayerInput.ScrollWheelSpeed / 1000.0f) * zoom, 0.1f, 2.0f); } diff --git a/Subsurface/Source/Characters/Animation/Ragdoll.cs b/Subsurface/Source/Characters/Animation/Ragdoll.cs index bc658485a..a23baf77a 100644 --- a/Subsurface/Source/Characters/Animation/Ragdoll.cs +++ b/Subsurface/Source/Characters/Animation/Ragdoll.cs @@ -385,18 +385,20 @@ namespace Barotrauma float impact = Vector2.Dot(avgVelocity, -normal); - if (GameMain.Server != null) impact = impact / 2.0f; - Limb l = (Limb)f1.Body.UserData; - float volume = stairs == null ? impact/5.0f : impact; - volume= Math.Min(impact, 1.0f); + float volume = stairs == null ? impact / 5.0f : impact; + volume = Math.Min(impact, 1.0f); if (impact > 0.8f && l.HitSound != null && l.soundTimer <= 0.0f) l.HitSound.Play(volume, impact * 100.0f, l.WorldPosition); if (impact > l.impactTolerance) { - character.Health -= (impact - l.impactTolerance * 0.1f); + if (!character.IsNetworkPlayer) + { + character.AddDamage(CauseOfDeath.Damage, impact - l.impactTolerance * 0.1f); + } + strongestImpact = Math.Max(strongestImpact, impact - l.impactTolerance); SoundPlayer.PlayDamageSound(DamageSoundType.LimbBlunt, strongestImpact, l.body); diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index c99c5fc14..e2f8851ae 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -89,6 +89,7 @@ namespace Barotrauma private Character closestCharacter, selectedCharacter; protected bool isDead; + private CauseOfDeath lastAttackCauseOfDeath; private CauseOfDeath causeOfDeath; public readonly bool IsHumanoid; @@ -230,11 +231,10 @@ namespace Barotrauma public float Health { get { return health; } - set + set { if (!MathUtils.IsValid(value)) return; health = MathHelper.Clamp(value, 0.0f, maxHealth); - if (health <= 0.0f) Kill(CauseOfDeath.Damage); } } @@ -968,7 +968,7 @@ namespace Barotrauma PressureProtection -= deltaTime*100.0f; } - health = MathHelper.Clamp(health - bleeding * deltaTime, 0.0f, maxHealth); + Health -= bleeding; if (health <= 0.0f) Kill(CauseOfDeath.Bloodloss, false); } @@ -1063,6 +1063,13 @@ namespace Barotrauma } } + public void AddDamage(CauseOfDeath causeOfDeath, float amount) + { + health = MathHelper.Clamp(health-amount, 0.0f, maxHealth); + if (amount>0.0f) lastAttackCauseOfDeath = causeOfDeath; + if (health <= 0.0f) Kill(causeOfDeath); + } + public virtual AttackResult AddDamage(IDamageable attacker, Vector2 worldPosition, Attack attack, float deltaTime, bool playSound = false) { return AddDamage(worldPosition, attack.DamageType, attack.GetDamage(deltaTime), attack.GetBleedingDamage(deltaTime), attack.Stun, playSound); @@ -1091,8 +1098,11 @@ namespace Barotrauma AttackResult attackResult = closestLimb.AddDamage(simPosition, damageType, amount, bleedingAmount, playSound); - health -= attackResult.Damage; - if (health <= 0.0f && damageType == DamageType.Burn) Kill(CauseOfDeath.Burn); + + AddDamage(damageType == DamageType.Burn ? CauseOfDeath.Burn : causeOfDeath, attackResult.Damage); + + //health -= attackResult.Damage; + //if (health <= 0.0f && damageType == DamageType.Burn) Kill(CauseOfDeath.Burn); Bleeding += attackResult.Bleeding; @@ -1291,9 +1301,16 @@ namespace Barotrauma case NetworkEventType.InventoryUpdate: if (inventory == null) return false; return inventory.FillNetworkData(NetworkEventType.InventoryUpdate, message, data); - case NetworkEventType.ImportantEntityUpdate: - - message.Write((byte)((health / maxHealth) * 255.0f)); + case NetworkEventType.ImportantEntityUpdate: + if (health>0.0f) + { + message.Write(Math.Max((byte)((health / maxHealth) * 255.0f), (byte)1)); + } + else + { + message.Write((byte)0); + message.WriteRangedInteger((int)lastAttackCauseOfDeath, 0, Enum.GetValues(typeof(CauseOfDeath)).Length); + } if (AnimController.StunTimer<=0.0f && bleeding<=0.0f && oxygen>99.0f) { @@ -1437,7 +1454,13 @@ namespace Barotrauma return; case NetworkEventType.ImportantEntityUpdate: - Health = (message.ReadByte() / 255.0f) * maxHealth; + health = MathHelper.Clamp((message.ReadByte() / 255.0f) * maxHealth, 0.0f, maxHealth); + + if (health == 0.0f) + { + causeOfDeath = (CauseOfDeath)message.ReadRangedInteger(0, Enum.GetValues(typeof(CauseOfDeath)).Length); + Kill(causeOfDeath, true); + } bool allOk = message.ReadBoolean(); if (allOk) return; diff --git a/Subsurface/Source/DebugConsole.cs b/Subsurface/Source/DebugConsole.cs index 8012e0e4c..3c2372f97 100644 --- a/Subsurface/Source/DebugConsole.cs +++ b/Subsurface/Source/DebugConsole.cs @@ -269,7 +269,7 @@ namespace Barotrauma case "heal": if (Character.Controlled != null) { - Character.Controlled.Health = Character.Controlled.MaxHealth; + Character.Controlled.AddDamage(CauseOfDeath.Damage, -Character.Controlled.MaxHealth); Character.Controlled.Oxygen = 100.0f; Character.Controlled.Bleeding = 0.0f; } diff --git a/Subsurface/Source/Items/Components/Holdable/RepairTool.cs b/Subsurface/Source/Items/Components/Holdable/RepairTool.cs index 1d342fb0b..09873d8b0 100644 --- a/Subsurface/Source/Items/Components/Holdable/RepairTool.cs +++ b/Subsurface/Source/Items/Components/Holdable/RepairTool.cs @@ -182,7 +182,7 @@ namespace Barotrauma.Items.Components { if (character.IsKeyDown(InputType.Aim)) { - targetLimb.character.Health += LimbFixAmount * degreeOfSuccess; + targetLimb.character.AddDamage(CauseOfDeath.Damage, LimbFixAmount * degreeOfSuccess); //isActive = true; } } diff --git a/Subsurface/Source/Map/FireSource.cs b/Subsurface/Source/Map/FireSource.cs index a4c86e6de..2eeda1e94 100644 --- a/Subsurface/Source/Map/FireSource.cs +++ b/Subsurface/Source/Map/FireSource.cs @@ -56,6 +56,11 @@ namespace Barotrauma } } + public Hull Hull + { + get { return hull; } + } + public FireSource(Vector2 worldPosition, Hull spawningHull = null, bool networkEvent=false) { hull = Hull.FindHull(worldPosition, spawningHull); @@ -193,18 +198,18 @@ namespace Barotrauma if (hull.Volume > 0.0f) HullWaterExtinquish(deltaTime); - lightSource.Range = Math.Max(size.X, size.Y) * Rand.Range(8.0f, 10.0f)/2.0f; - lightSource.Color = new Color(1.0f, 0.45f, 0.3f) * Rand.Range(0.8f, 1.0f); - - hull.Oxygen -= size.X*deltaTime*OxygenConsumption; + hull.Oxygen -= size.X * deltaTime * OxygenConsumption; position.X -= GrowSpeed * growModifier * 0.5f * deltaTime; - //position.Y += GrowSpeed*0.5f * deltaTime; size.X += GrowSpeed * growModifier * deltaTime; - //size.Y += GrowSpeed * deltaTime; - + LimitSize(); + + lightSource.Range = Math.Max(size.X, size.Y) * Rand.Range(8.0f, 10.0f) / 2.0f; + lightSource.Color = new Color(1.0f, 0.45f, 0.3f) * Rand.Range(0.8f, 1.0f); + lightSource.Position = position; + } private void OnChangeHull(Vector2 pos, Hull particleHull) @@ -222,7 +227,7 @@ namespace Barotrauma foreach (Character c in Character.CharacterList) { - if (c.AnimController.CurrentHull == null) continue; + if (c.AnimController.CurrentHull == null || c.IsDead) continue; float range = (float)Math.Sqrt(size.X) * 20.0f; if (c.Position.X < position.X - range || c.Position.X > position.X + size.X + range) continue; diff --git a/Subsurface/Source/Map/Hull.cs b/Subsurface/Source/Map/Hull.cs index ff9e078ba..e1b02a814 100644 --- a/Subsurface/Source/Map/Hull.cs +++ b/Subsurface/Source/Map/Hull.cs @@ -278,6 +278,9 @@ namespace Barotrauma { Oxygen -= OxygenDetoriationSpeed * deltaTime; + + surface = MathHelper.Lerp(surface, GetSurfaceY(), deltaTime * 10.0f); + if (EditWater) { Vector2 position = cam.ScreenToWorld(PlayerInput.MousePosition); @@ -432,17 +435,25 @@ namespace Barotrauma } } + private float GetSurfaceY() + { + float top = rect.Y + Submarine.DrawPosition.Y; + float bottom = top - rect.Height; + + return bottom + Volume / rect.Width; + } + public void Render(GraphicsDevice graphicsDevice, Camera cam) { if (renderer.PositionInBuffer > renderer.vertices.Length - 6) return; - //calculate where the surface should be based on the water volume + ////calculate where the surface should be based on the water volume float top = rect.Y+Submarine.DrawPosition.Y; float bottom = top - rect.Height; - float surfaceY = bottom + Volume / rect.Width; + //float surfaceY = bottom + Volume / rect.Width; - //interpolate the position of the rendered surface towards the "target surface" - surface = surface + ((surfaceY - Submarine.DrawPosition.Y) - surface) / 10.0f; + ////interpolate the position of the rendered surface towards the "target surface" + //surface = surface + ((surfaceY - Submarine.DrawPosition.Y) - surface) / 10.0f; float drawSurface = surface + Submarine.DrawPosition.Y; Matrix transform = cam.Transform * Matrix.CreateOrthographic(GameMain.GraphicsWidth, GameMain.GraphicsHeight, -1, 1) * 0.5f; @@ -643,13 +654,17 @@ namespace Barotrauma message.WriteRangedSingle(MathHelper.Clamp(volume/FullVolume, 0.0f, 1.5f), 0.0f, 1.5f, 6); message.Write((byte)fireSources.Count, 4); - foreach (FireSource fireSource in fireSources) + for (int i = 0; i < Math.Min(fireSources.Count, 16) ;i++ ) { + var fireSource = fireSources[i]; + Vector2 normalizedPos = new Vector2( - (fireSource.Position.X - rect.X) / rect.Width, - (fireSource.Position.Y - (rect.Y - rect.Height))/rect.Height); + (fireSource.Position.X - rect.X) / rect.Width, + (fireSource.Position.Y - (rect.Y - rect.Height)) / rect.Height); message.WriteRangedSingle(MathHelper.Clamp(normalizedPos.X, 0.0f, 1.0f), 0.0f, 1.0f, 4); message.WriteRangedSingle(MathHelper.Clamp(normalizedPos.Y, 0.0f, 1.0f), 0.0f, 1.0f, 4); + + message.WriteRangedSingle(MathHelper.Clamp(fireSource.Size.X / rect.Width, 0.0f, 1.0f), 0, 1.0f, 6); } return true; @@ -680,8 +695,10 @@ namespace Barotrauma for (int i = 0; i < fireSourceCount; i++) { Vector2 pos = Vector2.Zero; + float size = 0.0f; pos.X = message.ReadRangedSingle(0.0f, 1.0f, 4); pos.Y = message.ReadRangedSingle(0.0f, 1.0f, 4); + size = message.ReadRangedSingle(0.0f, 1.0f, 6); if (!MathUtils.IsValid(pos)) continue; pos.X = MathHelper.Clamp(pos.X, 0.05f, 0.95f); @@ -694,10 +711,16 @@ namespace Barotrauma { newFireSources.Add(existingFire); existingFire.Position = pos; + existingFire.Size = new Vector2( + existingFire.Hull == null ? size : size*existingFire.Hull.rect.Width, + existingFire.Size.Y); } else { - var newFire = new FireSource(pos, this, true); + var newFire = new FireSource(pos + Submarine.Loaded.Position, this, true); + newFire.Size = new Vector2( + newFire.Hull == null ? size : size * newFire.Hull.rect.Width, + newFire.Size.Y); //ignore if the fire wasn't added to this room (invalid position)? if (!fireSources.Contains(newFire)) continue; diff --git a/Subsurface/Source/Map/Lights/LightSource.cs b/Subsurface/Source/Map/Lights/LightSource.cs index f867e7e63..6ea6188b8 100644 --- a/Subsurface/Source/Map/Lights/LightSource.cs +++ b/Subsurface/Source/Map/Lights/LightSource.cs @@ -26,6 +26,8 @@ namespace Barotrauma.Lights //what was the range of the light when HullsInRange were last updated private float prevHullUpdateRange; + private Vector2 prevHullUpdatePosition; + private Vector2 position; public Vector2 Position { @@ -33,9 +35,12 @@ namespace Barotrauma.Lights set { if (position == value) return; - position = value; + + if (Vector2.Distance(prevHullUpdatePosition, position) < 5.0f) return; + UpdateHullsInRange(); + prevHullUpdatePosition = position; } } diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index 33202404c..d9bb13689 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -597,7 +597,7 @@ namespace Barotrauma.Networking { if (!gameStarted) yield return CoroutineStatus.Success; - GameMain.GameSession.gameMode.End(endMessage); + if (GameMain.GameSession != null) GameMain.GameSession.gameMode.End(endMessage); //var messageBox = new GUIMessageBox("The round has ended", endMessage, 400, 300); diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index e54479557..7168b4315 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -30,8 +30,7 @@ namespace Barotrauma renderTarget = new RenderTarget2D(graphics, GameMain.GraphicsWidth, GameMain.GraphicsHeight); renderTargetWater = new RenderTarget2D(graphics, GameMain.GraphicsWidth, GameMain.GraphicsHeight); renderTargetAir = new RenderTarget2D(graphics, GameMain.GraphicsWidth, GameMain.GraphicsHeight); - - + BackgroundCreatureManager = new BackgroundCreatureManager("Content/BackgroundSprites/BackgroundCreaturePrefabs.xml"); } diff --git a/Subsurface/changelog.txt b/Subsurface/changelog.txt index 63e1556d5..0eb4df99c 100644 --- a/Subsurface/changelog.txt +++ b/Subsurface/changelog.txt @@ -1,3 +1,13 @@ +--------------------------------------------------------------------------------------------------------- +v0.3.0.2 +--------------------------------------------------------------------------------------------------------- + +- fixed crashing when picking up a thermal artifact outside the sub +- fixed clients crashing if in the lobby when a round ends +- fixed crashing when attempting to join a password-protected server +- camera position is set at the position of the sub when entering spectator mode +- AI crew equips a diving suit before going outside the sub + --------------------------------------------------------------------------------------------------------- v0.3.0.1 diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 2cfe323d1..20e934c35 100644 Binary files a/Subsurface_Solution.v12.suo and b/Subsurface_Solution.v12.suo differ