b08c0905c0
Any of these new submods can be run without any other components that were once part of the big "homedecor" mod, other than homedecor_common and homedecor_i18n Reduced dependencies where possible, but each submod still has its various dependencies more or less the same as before, i.e. some need basic_materials, others need unifieddyes, some need building_blocks, and so on. All of the stuff that used to be under homedecor/handlers got moved to homedecor_common, as did any models and/or textures that are used by more than one other homedecor component. All the miscellaneous items that didn't warrant their own mod ended up in homedecor_misc, which can also be thought of as the remains of the original "homedecor" mod, renamed.
116 lines
3.7 KiB
Lua
116 lines
3.7 KiB
Lua
-- variables taken by the start... function
|
|
--
|
|
-- pos and node are as usual, from e.g. on_rightclick.
|
|
--
|
|
-- in the { particledef } table:
|
|
--
|
|
-- outletx/y/z are the exact coords of the starting point
|
|
-- for the spawner, relative to the center of the node
|
|
--
|
|
-- velocityx/y/z are the speed of the particles,
|
|
-- (x and z are relative to a node placed while looking north/facedir 0)
|
|
-- negative Y values flow downward.
|
|
--
|
|
-- spread is the radius from the starting point,
|
|
-- along X and Z only, to randomly spawn particles.
|
|
--
|
|
-- soundname is the filename (without .ogg) of the sound file
|
|
-- to be played along with the particle stream
|
|
|
|
function homedecor.start_particle_spawner(pos, node, particledef, soundname)
|
|
|
|
local this_spawner_meta = minetest.get_meta(pos)
|
|
local id = this_spawner_meta:get_int("active")
|
|
local s_handle = this_spawner_meta:get_int("sound")
|
|
|
|
if id ~= 0 then
|
|
if s_handle then
|
|
minetest.after(0, function(handle)
|
|
minetest.sound_stop(handle)
|
|
end, s_handle)
|
|
end
|
|
minetest.delete_particlespawner(id)
|
|
this_spawner_meta:set_int("active", 0)
|
|
this_spawner_meta:set_int("sound", 0)
|
|
return
|
|
end
|
|
|
|
local fdir = node.param2
|
|
|
|
if fdir and fdir < 4 and (not id or id == 0) then
|
|
|
|
local outletx = particledef.outlet.x
|
|
local outlety = particledef.outlet.y
|
|
local outletz = particledef.outlet.z
|
|
local velocityx = particledef.velocity_x
|
|
local velocityy = particledef.velocity_y
|
|
local velocityz = particledef.velocity_z
|
|
local spread = particledef.spread
|
|
|
|
local minx_t = { outletx - spread, -outletz - spread, outletx - spread, outletz - spread }
|
|
local maxx_t = { outletx + spread, -outletz + spread, outletx + spread, outletz + spread }
|
|
local minz_t = { -outletz - spread, outletx - spread, outletz - spread, outletx - spread }
|
|
local maxz_t = { -outletz + spread, outletx + spread, outletz + spread, outletx + spread }
|
|
|
|
local minvelx_t = { velocityx.min, velocityz.min, -velocityx.max, -velocityz.max }
|
|
local maxvelx_t = { velocityx.max, velocityz.max, -velocityx.min, -velocityz.min }
|
|
local minvelz_t = { velocityz.min, velocityx.min, -velocityz.max, velocityx.min }
|
|
local maxvelz_t = { velocityz.max, velocityx.max, -velocityz.min, velocityx.max }
|
|
|
|
local minx = minx_t[fdir + 1]
|
|
local maxx = maxx_t[fdir + 1]
|
|
local minz = minz_t[fdir + 1]
|
|
local maxz = maxz_t[fdir + 1]
|
|
|
|
local minvelx = minvelx_t[fdir + 1]
|
|
local minvelz = minvelz_t[fdir + 1]
|
|
local maxvelx = maxvelx_t[fdir + 1]
|
|
local maxvelz = maxvelz_t[fdir + 1]
|
|
|
|
id = minetest.add_particlespawner({
|
|
amount = 60,
|
|
time = 0,
|
|
collisiondetection = true,
|
|
collision_removal = particledef.die_on_collision,
|
|
minpos = {x=pos.x - minx, y=pos.y + outlety, z=pos.z - minz},
|
|
maxpos = {x=pos.x - maxx, y=pos.y + outlety, z=pos.z - maxz},
|
|
minvel = {x = minvelx, y = velocityy, z = minvelz},
|
|
maxvel = {x = maxvelx, y = velocityy, z = maxvelz},
|
|
minacc = {x=0, y=0, z=0},
|
|
maxacc = {x=0, y=-0.05, z=0},
|
|
minexptime = 2,
|
|
maxexptime = 4,
|
|
minsize = 0.5,
|
|
maxsize = 1,
|
|
texture = "homedecor_water_particle.png",
|
|
})
|
|
s_handle = minetest.sound_play(soundname, {
|
|
pos = pos,
|
|
max_hear_distance = 5,
|
|
loop = true
|
|
})
|
|
this_spawner_meta:set_int("active", id)
|
|
this_spawner_meta:set_int("sound", s_handle)
|
|
return
|
|
end
|
|
end
|
|
|
|
function homedecor.stop_particle_spawner(pos)
|
|
local this_spawner_meta = minetest.get_meta(pos)
|
|
local id = this_spawner_meta:get_int("active")
|
|
local s_handle = this_spawner_meta:get_int("sound")
|
|
|
|
if id ~= 0 then
|
|
minetest.delete_particlespawner(id)
|
|
end
|
|
|
|
if s_handle then
|
|
minetest.after(0, function(handle)
|
|
minetest.sound_stop(handle)
|
|
end, s_handle)
|
|
end
|
|
|
|
this_spawner_meta:set_int("active", 0)
|
|
this_spawner_meta:set_int("sound", 0)
|
|
end
|