-- LUA Script - precede every function and global member with lowercase name of script + '_main' local emitterList = {} local namedEmitter = { ember = { animSpd = 1/16, SR = 1, freq = 400, lifeMin = 2000, lifeMax = 5000, -- minX minY minZ maxX maxY maxZ offset = { -4, 5, -4, 4, 10, 4 }, speed = { -0.1, 0.1, -0.1, 0.1, 0.3, 0.1 }, rotate = { -0.1, 0.1 }, -- currently only Z rotate processed -- startMin startMax endMin endMax scale = { 2, 6, 2, 6 }, alpha = { 60, 90, 0, 0 } }, fire = { animSpd = 1/16, SR = 1, freq = 25, lifeMin = 100, lifeMax = 500, -- minX minY minZ maxX maxY maxZ offset = { -2, 5, -2, 2, 15, 2 }, speed = { -0.02, -0.02, -0.02, 0.05, 0.02, 0.02 }, rotate = { -0.1, 0.1 }, -- currently only Z rotate processed -- startMin startMax endMin endMax scale = { 5, 25, 30, 50 }, alpha = { 40, 75, 0, 0 } }, smoke = { animSpd = 1/16, SR = 1, freq = 25, lifeMin = 1000, lifeMax = 4000, -- minX minY minZ maxX maxY maxZ offset = { -2, 25, -2, 2, 40, 2 }, speed = { -0.05, 0.2, -0.05, 0.05, 1, 0.05 }, rotate = { -0.1, 0.1 },-- currently only Z rotate processed -- startMin startMax endMin endMax scale = { 20, 35, 90, 100 }, alpha = { 20, 55, 0, 0 } } } -- caller must load image local function PE_CreateNamedEmitter( name, image, frames, object ) image = image or 1 -- default to smoke frames = frames or 64 local et = namedEmitter[ name ] if et == nil then return end local emitter = ParticlesGetFreeEmitter() if emitter == -1 then return end local pos, spd, scl = et.offset, et.speed, et.scale if object == nil then ParticlesAddEmitter( emitter, et.animSpd, et.SR, pos[1], pos[2], pos[3], pos[4], pos[5], pos[6], scl[1], scl[2], scl[3], scl[4], spd[1], spd[2], spd[3], spd[4], spd[5], spd[6], et.rotate[1], et.rotate[2], et.lifeMin, et.lifeMax, et.alpha[1], et.alpha[2], et.alpha[3], et.alpha[4], et.freq, image, frames ) else ParticlesAddEmitter( emitter, et.animSpd, et.SR, pos[1], pos[2], pos[3], pos[4], pos[5], pos[6], scl[1], scl[2], scl[3], scl[4], spd[1], spd[2], spd[3], spd[4], spd[5], spd[6], et.rotate[1], et.rotate[2], et.lifeMin, et.lifeMax, et.alpha[1], et.alpha[2], et.alpha[3], et.alpha[4], et.freq, image, frames, object ) end return emitter end function smoke_particle_emitter_init(e) end local controlEnt = nil local windAng = 0 local windSpd = 0 local windTimer = 0 function smoke_particle_emitter_main(e) if controlEnt == nil then controlEnt = e end local emitter = emitterList[e] if emitter == nil then emitterList[e] = { used = false } else -- ParticlesLoadImage( "effectbank\\particles\\64snowflakes.dds" ) -- ParticlesLoadImage( "effectbank\\particles\\flowerpuff.png" ) if not emitter.used then --local imageFile = ParticlesLoadImage( "effectbank\\particles\\flowerpuff.dds" ) local numFrames = 64 local smoke = PE_CreateNamedEmitter( 'smoke', 1, numFrames, g_Entity[e].obj ) local flames = PE_CreateNamedEmitter( 'fire', 2, numFrames, g_Entity[e].obj ) local embers = PE_CreateNamedEmitter( 'ember', 2, numFrames, g_Entity[e].obj ) emitter.used = true ParticlesSetLife( smoke, 200, 3000, 16000, 10 ) ParticlesSetLife( flames, 25, 100, 800, 20 ) ParticlesSetLife( flames, 500, 2000, 5000, 5 ) end if controlEnt == e then if g_Time > windTimer then windTimer = g_Time + 3000 + math.random() * 4000 windSpd = math.random() * 0.04 windAng = math.rad( math.random() * 360 ) ParticlesSetWindVector( windSpd * math.sin( windAng ), windSpd * math.cos( windAng ) ) end end end end