Client LuaCsForBarotrauma
BarotraumaClient/ClientSource/Map/FireSource.cs
1 using Barotrauma.Lights;
3 using Microsoft.Xna.Framework;
4 using System;
5 
6 namespace Barotrauma
7 {
8  partial class FireSource
9  {
10  private LightSource lightSource;
11 
12  private float particleTimer;
13 
14  partial void UpdateProjSpecific(float growModifier, float deltaTime)
15  {
16  if (this is DummyFireSource)
17  {
18  EmitParticles(size, WorldPosition, deltaTime, hull, growModifier, null);
19  }
20  else
21  {
22  EmitParticles(size, WorldPosition, deltaTime, hull, growModifier, OnChangeHull);
23  }
24 
25  lightSource.Color = new Color(1.0f, 0.45f, 0.3f) * Rand.Range(0.8f, 1.0f);
26  if (Math.Abs((lightSource.Range * 0.2f) - Math.Max(size.X, size.Y)) > 1.0f) { lightSource.Range = Math.Max(size.X, size.Y) * 5.0f; }
27  if (Vector2.DistanceSquared(lightSource.Position, position) > 5.0f) { lightSource.Position = position + Vector2.UnitY * 30.0f; }
28  }
29 
30  public void EmitParticles(Vector2 size, Vector2 worldPosition, float deltaTime, Hull hull, float growModifier, Particle.OnChangeHullHandler onChangeHull = null)
31  {
32  var particlePrefab = ParticleManager.FindPrefab("flame");
33  if (particlePrefab == null) { return; }
34 
35  float particlesPerSecond = MathHelper.Clamp(size.X / 2.0f, 10.0f, 200.0f);
36 
37  float particleInterval = 1.0f / particlesPerSecond;
38  particleTimer += deltaTime;
39  while (particleTimer > particleInterval)
40  {
41  particleTimer -= particleInterval;
42  Vector2 particlePos = new Vector2(
43  worldPosition.X + Rand.Range(0.0f, size.X),
44  worldPosition.Y - size.Y + particlePrefab.CollisionRadius);
45 
46  Vector2 particleVel = new Vector2(
47  particlePos.X - (worldPosition.X + size.X / 2.0f),
48  Math.Max((float)Math.Sqrt(size.X) * Rand.Range(0.0f, 15.0f) * growModifier, 0.0f));
49 
50  particleVel.X = MathHelper.Clamp(particleVel.X, -200.0f, 200.0f);
51 
52  var particle = GameMain.ParticleManager.CreateParticle(particlePrefab,
53  particlePos, particleVel, 0.0f, hull);
54 
55  if (particle == null) { continue; }
56 
57  //make some of the particles create another firesource when they enter another hull
58  if (Rand.Int(20) == 1) { particle.OnChangeHull = onChangeHull; }
59 
60  particle.Size *= MathHelper.Clamp(size.X / 60.0f * Math.Max(hull.Oxygen / hull.Volume, 0.4f), 0.5f, 1.0f);
61 
62  if (Rand.Int(5) == 1)
63  {
64  var smokeParticle = GameMain.ParticleManager.CreateParticle("smoke",
65  particlePos, new Vector2(particleVel.X, particleVel.Y * 0.1f), 0.0f, hull);
66 
67  if (smokeParticle != null)
68  {
69  smokeParticle.Size *= MathHelper.Clamp(size.X / 100.0f * Math.Max(hull.Oxygen / hull.Volume, 0.4f), 0.5f, 1.0f);
70  }
71  }
72  }
73  }
74  }
75 }
void EmitParticles(Vector2 size, Vector2 worldPosition, float deltaTime, Hull hull, float growModifier, Particle.OnChangeHullHandler onChangeHull=null)
static ParticleManager ParticleManager
Definition: GameMain.cs:101
OnChangeHullHandler OnChangeHull
Definition: Particle.cs:17
delegate void OnChangeHullHandler(Vector2 position, Hull currentHull)
Particle CreateParticle(string prefabName, Vector2 position, float angle, float speed, Hull hullGuess=null, float collisionIgnoreTimer=0f, Tuple< Vector2, Vector2 > tracerPoints=null)
static ParticlePrefab FindPrefab(string prefabName)