diff --git a/Subsurface/Content/Items/Diving/divinggear.xml b/Subsurface/Content/Items/Diving/divinggear.xml index 875804ca1..d537af6c2 100644 --- a/Subsurface/Content/Items/Diving/divinggear.xml +++ b/Subsurface/Content/Items/Diving/divinggear.xml @@ -17,7 +17,7 @@ - + diff --git a/Subsurface/Content/Items/Tools/tools.xml b/Subsurface/Content/Items/Tools/tools.xml index ff6953708..6df87404d 100644 --- a/Subsurface/Content/Items/Tools/tools.xml +++ b/Subsurface/Content/Items/Tools/tools.xml @@ -118,7 +118,7 @@ - + diff --git a/Subsurface/Content/Particles/ParticlePrefabs.xml b/Subsurface/Content/Particles/ParticlePrefabs.xml index 36fbedd31..da68c848f 100644 --- a/Subsurface/Content/Particles/ParticlePrefabs.xml +++ b/Subsurface/Content/Particles/ParticlePrefabs.xml @@ -159,18 +159,21 @@ - + velocitychange="0.0, 1.0" + animduration="1.2" + loopanim="false"> + currentHull.FullVolume * 0.95f || - (waterSurface - floorY > HeadPosition * 0.95f && Collider.SimPosition.Y < waterSurface); + inWater = false; + if (inWater = currentHull.Volume > currentHull.FullVolume * 0.95f) + { + inWater = true; + } + else + { + float waterSurface = ConvertUnits.ToSimUnits(currentHull.Surface); + if (Collider.SimPosition.Y < waterSurface && waterSurface - GetFloorY() > HeadPosition * 0.95f) + { + inWater = true; + } + } } if (flowForce.LengthSquared() > 0.001f) @@ -1069,15 +1076,7 @@ namespace Barotrauma float tfloorY = rayStart.Y + (rayEnd.Y - rayStart.Y) * closestFraction; float targetY = tfloorY + Collider.height * 0.5f + Collider.radius + colliderHeightFromFloor; - - float waterSurface = ConvertUnits.ToSimUnits(currentHull.Surface); - - float floorY = GetFloorY(); - - if (currentHull.Volume > currentHull.FullVolume * 0.95f || - (waterSurface - floorY > HeadPosition * 0.95f && Collider.SimPosition.Y < waterSurface)) - inWater = true; - + if (Math.Abs(Collider.SimPosition.Y - targetY) > 0.01f && Collider.SimPosition.Y DimLight(LightSource light) { - float currBrightness= 1.0f; + float currBrightness = 1.0f; float startRange = light.Range; while (light.Color.A > 0.0f) @@ -99,13 +116,13 @@ namespace Barotrauma light.Color = new Color(light.Color.R, light.Color.G, light.Color.B, currBrightness); light.Range = startRange * currBrightness; - currBrightness -= CoroutineManager.DeltaTime*10.0f; + currBrightness -= CoroutineManager.DeltaTime * 20.0f; yield return CoroutineStatus.Running; } light.Remove(); - + yield return CoroutineStatus.Success; } @@ -115,6 +132,11 @@ namespace Barotrauma foreach (Character c in Character.CharacterList) { + Vector2 explosionPos = worldPosition; + if (c.Submarine != null) explosionPos -= c.Submarine.Position; + + explosionPos = ConvertUnits.ToSimUnits(explosionPos); + foreach (Limb limb in c.AnimController.Limbs) { float dist = Vector2.Distance(limb.WorldPosition, worldPosition); @@ -128,6 +150,9 @@ namespace Barotrauma float distFactor = 1.0f - dist / range; + //solid obstacles between the explosion and the limb reduce the effect of the explosion by 90% + if (Submarine.CheckVisibility(limb.SimPosition, explosionPos) != null) distFactor *= 0.1f; + c.AddDamage(limb.WorldPosition, DamageType.None, damage / c.AnimController.Limbs.Length * distFactor, 0.0f, stun * distFactor, false); diff --git a/Subsurface/Source/Map/FireSource.cs b/Subsurface/Source/Map/FireSource.cs index 93a583c4d..518f61f2b 100644 --- a/Subsurface/Source/Map/FireSource.cs +++ b/Subsurface/Source/Map/FireSource.cs @@ -68,10 +68,10 @@ namespace Barotrauma if (!isNetworkMessage && GameMain.Client != null) return; - if (fireSoundBasic==null) + if (fireSoundBasic == null) { - fireSoundBasic = Sound.Load("Content/Sounds/fire.ogg"); - fireSoundLarge = Sound.Load("Content/Sounds/firelarge.ogg"); + fireSoundBasic = Sound.Load("Content/Sounds/fire.ogg", false); + fireSoundLarge = Sound.Load("Content/Sounds/firelarge.ogg", false); } hull.AddFireSource(this); @@ -80,13 +80,8 @@ namespace Barotrauma this.position = worldPosition - new Vector2(-5.0f, 5.0f) - Submarine.Position; - lightSource = new LightSource(this.position, 50.0f, new Color(1.0f, 0.9f, 0.7f), hull == null ? null : hull.Submarine); - - - - //this.position.Y = hull.Rect.Y - hull.Rect.Height; - + size = new Vector2(10.0f, 10.0f); } @@ -358,12 +353,12 @@ namespace Barotrauma { lightSource.Remove(); - if (basicSoundIndex > -1) + if (basicSoundIndex > 0) { Sounds.SoundManager.Stop(basicSoundIndex); basicSoundIndex = -1; } - if (largeSoundIndex > -1) + if (largeSoundIndex > 0) { Sounds.SoundManager.Stop(largeSoundIndex); largeSoundIndex = -1; diff --git a/Subsurface/Source/Map/Lights/LightSource.cs b/Subsurface/Source/Map/Lights/LightSource.cs index bc2363e7c..0aeeada4e 100644 --- a/Subsurface/Source/Map/Lights/LightSource.cs +++ b/Subsurface/Source/Map/Lights/LightSource.cs @@ -352,7 +352,19 @@ namespace Barotrauma.Lights points.AddRange(boundaryCorners); var compareCCW = new CompareSegmentPointCW(drawPos); - points.Sort(compareCCW); + try + { + points.Sort(compareCCW); + } + catch (Exception e) + { + StringBuilder sb = new StringBuilder("Constructing light volumes failed! Light pos: "+drawPos+", Hull verts:\n"); + foreach (SegmentPoint sp in points) + { + sb.AppendLine(sp.Pos.ToString()); + } + DebugConsole.ThrowError(sb.ToString(), e); + } List output = new List(); diff --git a/Subsurface/Source/Sounds/Sound.cs b/Subsurface/Source/Sounds/Sound.cs index 9ce6c8079..34714f97d 100644 --- a/Subsurface/Source/Sounds/Sound.cs +++ b/Subsurface/Source/Sounds/Sound.cs @@ -242,7 +242,11 @@ namespace Barotrauma SoundManager.ClearAlSource(AlBufferId); ALHelper.Check(); - if (oggSound != null) oggSound.Dispose(); + if (oggSound != null) + { + oggSound.Dispose(); + oggSound = null; + } } diff --git a/Subsurface/Source/Sounds/SoundManager.cs b/Subsurface/Source/Sounds/SoundManager.cs index e1184e983..4b1202da9 100644 --- a/Subsurface/Source/Sounds/SoundManager.cs +++ b/Subsurface/Source/Sounds/SoundManager.cs @@ -75,8 +75,8 @@ namespace Barotrauma.Sounds public static int Play(Sound sound, Vector2 position, float volume = 1.0f, float lowPassGain = 0.0f, bool loop=false) { - if (Disabled) return -1; - + if (Disabled || sound.AlBufferId == -1) return -1; + for (int i = 1; i < DefaultSourceCount; i++) { //find a source that's free to use (not playing or paused) diff --git a/Subsurface/Source/Utils/MathUtils.cs b/Subsurface/Source/Utils/MathUtils.cs index 62f11fab1..30d09ee5d 100644 --- a/Subsurface/Source/Utils/MathUtils.cs +++ b/Subsurface/Source/Utils/MathUtils.cs @@ -512,6 +512,7 @@ namespace Barotrauma public static int Compare(Vector2 a, Vector2 b, Vector2 center) { + if (a == b) return 0; if (a.X - center.X >= 0 && b.X - center.X < 0) return -1; if (a.X - center.X < 0 && b.X - center.X >= 0) return 1; if (a.X - center.X == 0 && b.X - center.X == 0)