From a5eef1c5de77fa7770877802e66c3e1c53f9a0da Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg Date: Wed, 24 Apr 2019 18:59:36 -0400 Subject: update castles, areas, homedecor, plantlife, gloopblocks, hotbar, inspector, maptools, mesecons, moreblocks, moreores, technic, teleport_request, and worldedit switched to caverealms_lite (with minor fixes by me) switched to CWz's fork of player_textures The homedecor update brings in the big split, and will require you to re-enable all modpack components in order to avoid loss of content. --- homedecor_common/water_particles.lua | 115 +++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 homedecor_common/water_particles.lua (limited to 'homedecor_common/water_particles.lua') 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 -- cgit v1.2.3