86 lines
2.2 KiB
Lua

local S = minetest.get_translator("sf_particles")
local EDITOR = minetest.settings:get_bool("sf_editor", false) or minetest.settings:get_bool("creative_mode", false)
local register_particle_emitter = function(id, def)
local drawtype, pointable
if EDITOR then
drawtype = "allfaces"
pointable = true
else
drawtype = "airlike"
pointable = false
end
minetest.register_node("sf_particles:emitter_"..id, {
description = def.description,
pointable = pointable,
drawtype = drawtype,
visual_scale = 0.5,
paramtype = "light",
sunlight_propagates = true,
tiles = {"sf_particles_emitter_base.png^"..def.texture.."^sf_particles_emitter_overlay.png"},
walkable = false,
groups = { particle_emitter = 1, editor_breakable = 1 },
on_construct = function(pos)
local timer = minetest.get_node_timer(pos)
timer:start(0)
end,
on_timer = function(pos)
if not EDITOR then
local spawnerdef = table.copy(def.spawner)
if def.pos_offset_min then
spawnerdef.pos = {
min = vector.add(pos, def.pos_offset_min),
max = vector.add(pos, def.pos_offset_max),
}
else
spawnerdef.pos = pos
end
minetest.add_particlespawner(spawnerdef)
end
local timer = minetest.get_node_timer(pos)
timer:start(def.spawntimer)
end,
})
end
register_particle_emitter("smoke", {
description = S("Smoke Emitter"),
texture = "sf_particles_smoke.png",
spawntimer = 5,
pos_offset_min = vector.new(-1.2,0,-1.2),
pos_offset_max = vector.new(1.2,0,1.2),
spawner = {
amount = 3,
time = 5,
exptime = {
min = 30,
max = 50,
},
size = {
min = 9,
max = 18,
},
vel = {
min = vector.new(-0.01, 0.2, -0.01),
max = vector.new(0.01, 0.5, 0.01),
},
texpool = {
{ name = "sf_particles_smoke.png", alpha_tween = { 1, 0, start = 0.75 } },
{ name = "sf_particles_smoke_med.png", alpha_tween = { 1, 0, start = 0.75 } },
{ name = "sf_particles_smoke_dense.png", alpha_tween = { 1, 0, start = 0.75 } },
},
},
})
minetest.register_lbm({
label = "Restart particle emitter node timers",
name = "sf_particles:restart_emitter_node_timers",
nodenames = {"group:particle_emitter"},
run_at_every_load = true,
action = function(pos)
local timer = minetest.get_node_timer(pos)
timer:start(0)
end,
})