From 8cc12b69887a88df8e7ac0a36660ae09c82b0420 Mon Sep 17 00:00:00 2001 From: Regalis Date: Wed, 27 Jan 2016 20:38:24 +0200 Subject: [PATCH] Moving camera with sub even if typing, server doesn't do impact damage to client characters, server sends cause of death in importantentityupdate if health<=0, fire sync fixes, lerping water surface in update instead of render, --- Subsurface/Properties/AssemblyInfo.cs | 4 +- Subsurface/Source/Camera.cs | 13 +++--- .../Source/Characters/Animation/Ragdoll.cs | 12 ++--- Subsurface/Source/Characters/Character.cs | 41 ++++++++++++++---- Subsurface/Source/DebugConsole.cs | 2 +- .../Items/Components/Holdable/RepairTool.cs | 2 +- Subsurface/Source/Map/FireSource.cs | 21 +++++---- Subsurface/Source/Map/Hull.cs | 39 +++++++++++++---- Subsurface/Source/Map/Lights/LightSource.cs | 7 ++- Subsurface/Source/Networking/GameClient.cs | 2 +- Subsurface/Source/Screens/GameScreen.cs | 3 +- Subsurface/changelog.txt | 10 +++++ Subsurface_Solution.v12.suo | Bin 811520 -> 928768 bytes 13 files changed, 111 insertions(+), 45 deletions(-) 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 2cfe323d17c968cdabb781dd352bfb7414cbec41..20e934c357ebea2f5edb079ca47dbfca35a20c74 100644 GIT binary patch delta 22346 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 apzgU&>}%s~&*1$0#)q@tKd{A2DE&9?ts;T| delta 14516 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