diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/RepairTool.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/RepairTool.cs index df3b9504b..75ce9a7e6 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/RepairTool.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Holdable/RepairTool.cs @@ -163,10 +163,13 @@ namespace Barotrauma.Items.Components } #if CLIENT - float particleAngle = item.body.Rotation + ((item.body.Dir > 0.0f) ? 0.0f : MathHelper.Pi); - ParticleEmitter.Emit( - deltaTime, item.WorldPosition + TransformedBarrelPos, - item.CurrentHull, particleAngle, -particleAngle); + if (ParticleEmitter != null) + { + float particleAngle = item.body.Rotation + ((item.body.Dir > 0.0f) ? 0.0f : MathHelper.Pi); + ParticleEmitter.Emit( + deltaTime, item.WorldPosition + TransformedBarrelPos, + item.CurrentHull, particleAngle, -particleAngle); + } #endif return true; @@ -174,27 +177,35 @@ namespace Barotrauma.Items.Components private void Repair(Vector2 rayStart, Vector2 rayEnd, float deltaTime, Character user, float degreeOfSuccess, List ignoredBodies) { + Body targetBody = Submarine.PickBody(rayStart, rayEnd, ignoredBodies, + Physics.CollisionWall | Physics.CollisionCharacter | Physics.CollisionItem | Physics.CollisionLevel | Physics.CollisionRepair, false); + if (ExtinquishAmount > 0.0f && item.CurrentHull != null) { - Vector2 displayPos = ConvertUnits.ToDisplayUnits(rayStart + (rayEnd - rayStart) * Submarine.LastPickedFraction * 0.9f); - - displayPos += item.CurrentHull.Submarine.Position; - - Hull hull = Hull.FindHull(displayPos, item.CurrentHull); - if (hull != null) + List fireSourcesInRange = new List(); + //step along the ray in 10% intervals, collecting all fire sources in the range + for (float x = 0.0f; x <= Submarine.LastPickedFraction; x += 0.1f) { - hull.Extinguish(deltaTime, ExtinquishAmount, displayPos); - if (hull != item.CurrentHull) + Vector2 displayPos = ConvertUnits.ToDisplayUnits(rayStart + (rayEnd - rayStart) * x); + displayPos += item.CurrentHull.Submarine.Position; + + Hull hull = Hull.FindHull(displayPos, item.CurrentHull); + if (hull == null) continue; + foreach (FireSource fs in hull.FireSources) { - item.CurrentHull.Extinguish(deltaTime, ExtinquishAmount, displayPos); + if (fs.IsInDamageRange(displayPos, 100.0f) && !fireSourcesInRange.Contains(fs)) + { + fireSourcesInRange.Add(fs); + } } } + foreach (FireSource fs in fireSourcesInRange) + { + fs.Extinguish(deltaTime, ExtinquishAmount); + } } - Body targetBody = Submarine.PickBody(rayStart, rayEnd, ignoredBodies, - Physics.CollisionWall | Physics.CollisionCharacter | Physics.CollisionItem | Physics.CollisionLevel | Physics.CollisionRepair, false); - if (targetBody == null || targetBody.UserData == null) return; pickedPosition = Submarine.LastPickedPosition; @@ -212,7 +223,10 @@ namespace Barotrauma.Items.Components #if CLIENT Vector2 progressBarPos = targetStructure.SectionPosition(sectionIndex); - if (targetStructure.Submarine != null) progressBarPos += targetStructure.Submarine.DrawPosition; + if (targetStructure.Submarine != null) + { + progressBarPos += targetStructure.Submarine.DrawPosition; + } var progressBar = user.UpdateHUDProgressBar( targetStructure, @@ -221,17 +235,9 @@ namespace Barotrauma.Items.Components Color.Red, Color.Green); if (progressBar != null) progressBar.Size = new Vector2(60.0f, 20.0f); - - Vector2 particlePos = ConvertUnits.ToDisplayUnits(pickedPosition); - if (targetStructure.Submarine != null) particlePos += targetStructure.Submarine.DrawPosition; - foreach (var emitter in ParticleEmitterHitStructure) - { - float particleAngle = item.body.Rotation + ((item.body.Dir > 0.0f) ? 0.0f : MathHelper.Pi); - emitter.Emit(deltaTime, particlePos, item.CurrentHull, particleAngle + MathHelper.Pi, -particleAngle + MathHelper.Pi); - } #endif - targetStructure.AddDamage(sectionIndex, -StructureFixAmount * degreeOfSuccess,user); + targetStructure.AddDamage(sectionIndex, -StructureFixAmount * degreeOfSuccess, user); //if the next section is small enough, apply the effect to it as well //(to make it easier to fix a small "left-over" section) @@ -253,7 +259,7 @@ namespace Barotrauma.Items.Components #if CLIENT Vector2 particlePos = ConvertUnits.ToDisplayUnits(pickedPosition); - if (targetLimb.character.Submarine != null) particlePos += targetLimb.character.Submarine.DrawPosition; + if (targetLimb.character.Submarine != null) particlePos += targetLimb.character.Submarine.DrawPosition; foreach (var emitter in ParticleEmitterHitCharacter) { float particleAngle = item.body.Rotation + ((item.body.Dir > 0.0f) ? 0.0f : MathHelper.Pi); @@ -283,7 +289,7 @@ namespace Barotrauma.Items.Components if (progressBar != null) progressBar.Size = new Vector2(60.0f, 20.0f); Vector2 particlePos = ConvertUnits.ToDisplayUnits(pickedPosition); - if (targetItem.Submarine != null) particlePos += targetItem.Submarine.DrawPosition; + if (targetItem.Submarine != null) particlePos += targetItem.Submarine.DrawPosition; foreach (var emitter in ParticleEmitterHitItem) { float particleAngle = item.body.Rotation + ((item.body.Dir > 0.0f) ? 0.0f : MathHelper.Pi); @@ -293,7 +299,7 @@ namespace Barotrauma.Items.Components #endif } } - + public override bool AIOperate(float deltaTime, Character character, AIObjectiveOperateItem objective) { Gap leak = objective.OperateTarget as Gap; diff --git a/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs b/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs index 4f0a684ce..e329521ca 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs @@ -60,7 +60,7 @@ namespace Barotrauma public float DamageRange { - get { return (float)Math.Sqrt(size.X) * 20.0f; } + get { return (float)Math.Sqrt(size.X) * 20.0f; } } public Hull Hull @@ -181,7 +181,7 @@ namespace Barotrauma private void OnChangeHull(Vector2 pos, Hull particleHull) { - if (particleHull == hull || particleHull==null) return; + if (particleHull == hull || particleHull == null) return; //hull already has a firesource roughly at the particles position -> don't create a new one if (particleHull.FireSources.Find(fs => pos.X > fs.position.X - 100.0f && pos.X < fs.position.X + fs.size.X + 100.0f) != null) return; @@ -198,9 +198,7 @@ namespace Barotrauma Character c = Character.CharacterList[i]; if (c.AnimController.CurrentHull == null || c.IsDead) continue; - float range = DamageRange; - if (c.Position.X < position.X - range || c.Position.X > position.X + size.X + range) continue; - if (c.Position.Y < position.Y - size.Y || c.Position.Y > hull.Rect.Y) continue; + if (!IsInDamageRange(c, DamageRange)) continue; float dmg = (float)Math.Sqrt(size.X) * deltaTime / c.AnimController.Limbs.Length; foreach (Limb limb in c.AnimController.Limbs) @@ -210,6 +208,22 @@ namespace Barotrauma } } + public bool IsInDamageRange(Character c, float damageRange) + { + if (c.Position.X < position.X - damageRange || c.Position.X > position.X + size.X + damageRange) return false; + if (c.Position.Y < position.Y - size.Y || c.Position.Y > hull.Rect.Y) return false; + + return true; + } + + public bool IsInDamageRange(Vector2 worldPosition, float damageRange) + { + if (worldPosition.X < WorldPosition.X - damageRange || worldPosition.X > WorldPosition.X + size.X + damageRange) return false; + if (worldPosition.Y < WorldPosition.Y - size.Y || worldPosition.Y > hull.WorldRect.Y) return false; + + return true; + } + private void DamageItems(float deltaTime) { if (size.X <= 0.0f || GameMain.Client != null) return; @@ -251,7 +265,7 @@ namespace Barotrauma for (int i = 0; i < steamCount; i++) { Vector2 spawnPos = new Vector2( - WorldPosition.X + Rand.Range(0.0f, size.X), + WorldPosition.X + Rand.Range(0.0f, size.X), WorldPosition.Y + 10.0f); Vector2 speed = new Vector2((spawnPos.X - (WorldPosition.X + size.X / 2.0f)), (float)Math.Sqrt(size.X) * Rand.Range(20.0f, 25.0f)); @@ -270,26 +284,21 @@ namespace Barotrauma //evaporate some of the water hull.WaterVolume -= extinquishAmount; - + if (GameMain.Client != null) return; if (size.X < 1.0f) Remove(); } - public void Extinguish(float deltaTime, float amount, Vector2 pos) + public void Extinguish(float deltaTime, float amount) { - float range = 100.0f; - - if (pos.X < WorldPosition.X - range || pos.X > WorldPosition.X + size.X + range) return; - if (pos.Y < WorldPosition.Y - range || pos.Y > WorldPosition.Y + 500.0f) return; - float extinquishAmount = amount * deltaTime; #if CLIENT float steamCount = Rand.Range(-5.0f, (float)Math.Sqrt(amount)); for (int i = 0; i < steamCount; i++) { - Vector2 spawnPos = new Vector2(pos.X + Rand.Range(-5.0f, 5.0f), Rand.Range(position.Y - size.Y, position.Y) + 10.0f); + Vector2 spawnPos = new Vector2(Rand.Range(position.X, position.X + size.X), Rand.Range(position.Y - size.Y, position.Y) + 10.0f); Vector2 speed = new Vector2((spawnPos.X - (position.X + size.X / 2.0f)), (float)Math.Sqrt(size.X) * Rand.Range(20.0f, 25.0f)); @@ -312,6 +321,11 @@ namespace Barotrauma if (size.X < 1.0f) Remove(); } + public void Extinguish(float deltaTime, float amount, Vector2 worldPosition) + { + if (IsInDamageRange(worldPosition, 100.0f)) Extinguish(deltaTime, amount); + } + public void Remove() { #if CLIENT @@ -331,7 +345,7 @@ namespace Barotrauma foreach (Decal d in burnDecals) { d.StopFadeIn(); - } + } #endif hull.RemoveFire(this);