summaryrefslogtreecommitdiff
path: root/homedecor_common/water_particles.lua
diff options
context:
space:
mode:
Diffstat (limited to 'homedecor_common/water_particles.lua')
-rw-r--r--homedecor_common/water_particles.lua115
1 files changed, 115 insertions, 0 deletions
diff --git a/homedecor_common/water_particles.lua b/homedecor_common/water_particles.lua
new file mode 100644
index 0000000..8042599
--- /dev/null
+++ b/homedecor_common/water_particles.lua
@@ -0,0 +1,115 @@
+-- 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