spawnpoints = FindLocations("firespawn") smokespawn = FindLocation("smokespawn") firetrigger = FindTrigger("firetrigger") firelight = FindLight("firelight") unlit = true smoketimer = 5 timer = 0 function tick(dt) if IsPointInTrigger(firetrigger, GetPlayerPos()) and unlit then -- Light the bonfrie if player is inside the trigger and the fire has not yet been lit for i=1,#spawnpoints do SpawnFire(GetLocationTransform(spawnpoints[i]).pos) end unlit = false end if not unlit then smoketimer = smoketimer - dt end if smoketimer > 0 then emitsmoke(GetLocationTransform(smokespawn).pos,Vec(0,1,0)) local intensity = 0.25 + ((math.sin(timer/2)+1)/8)+((math.sin(timer*3.7)+1)/4)+((math.sin(timer*5.12)+1)/4) SetLightIntensity(firelight, intensity*smoketimer) else Delete(firelight) end timer = timer + dt end function emitsmoke(pos,dir) local radius = 0.3 local life = 4 local count = 4 local vel = 0.5 local drag = 0.5 local gravity = 2 local red = 0.25 local green = 0.2 local blue = 0.15 local alpha = 0.5 --Set up the particle state ParticleReset() ParticleType("smoke") ParticleRadius(radius) ParticleAlpha(alpha, alpha, "constant", 0.1/life, 0.5) -- Ramp up fast, ramp down after 50% ParticleGravity(gravity * rnd(0.5, 1.5)) -- Slightly randomized gravity looks better ParticleDrag(drag) ParticleColor(red, green, blue, 0.9, 0.9, 0.9) -- Animating color towards white --Emit particles count = rnd(0,count*smoketimer/5) -- Scale down number of emitted smoke particles based on the time since the player entered the trigger. To fade from artifical smoke to smoke from actual fire for i=1, count do --Randomize position slightly. This is important when spawning multiple particles at the same time local p = VecAdd(pos, VecAdd(VecScale(dir, radius), rndVec(radius))) --Randomize velocity slightly local v = VecScale(VecAdd(dir, rndVec(0.2)), vel) --Randomize lifetime local l = rnd(life*0.5, life*1.5) --Spawn particle into the world SpawnParticle(p, v, l) end end --Helper to return a random number in range mi to ma function rnd(mi, ma) return math.random(1000)/1000*(ma-mi) + mi end --Helper to return a random vector of particular length function rndVec(length) local v = VecNormalize(Vec(math.random(-100,100), math.random(-100,100), math.random(-100,100))) return VecScale(v, length) end