Rename mod: walls → hades_walls
[minetest_hades/hades_revisited.git] / mods / hades_drippingwater / init.lua
blob730bfcdf6eb9d2324dc044b2a0fe6045d587267b
1 -- Dripping Water Mod
2 local GRAVITY = -(tonumber(minetest.settings:get("movement_gravity")) or 10)
4 minetest.register_entity("hades_drippingwater:drop_water", {
5 hp_max = 2,
6 physical = true,
7 collide_with_objects = false,
8 collisionbox = { -0.025, -0.05, -0.025, 0.025, -0.01, 0.025 },
9 pointable = false,
10 visual = "cube",
11 visual_size = {x=0.05, y=0.1},
12 textures = {"default_water.png","default_water.png","default_water.png","default_water.png", "default_water.png","default_water.png"},
13 spritediv = {x=1, y=1},
14 initial_sprite_basepos = {x=0, y=0},
15 static_save = false,
17 on_activate = function(self, staticdata)
18 self.object:set_sprite({x=0,y=0}, 1, 1, true)
19 self.object:set_armor_groups({immortal=1})
20 end,
22 on_step = function(self, dtime)
23 local ownpos = self.object:get_pos()
25 local falling = false
26 local acc = self.object:get_acceleration()
27 if acc.y < -0.01 then
28 falling = true
29 end
31 if not falling then
32 local k = math.random(1,222)
33 if k==1 then
34 self.object:set_acceleration({x=0, y=GRAVITY, z=0})
35 else
36 local n_above = minetest.get_node({x=ownpos.x, y=ownpos.y+0.5, z=ownpos.z})
37 local d_above = minetest.registered_nodes[n_above.name]
38 if not d_above then
39 self.object:remove()
40 return
41 end
42 if not d_above.walkable then
43 self.object:set_acceleration({x=0, y=GRAVITY, z=0})
44 end
45 end
46 end
48 local n_below = minetest.get_node({x=ownpos.x, y=ownpos.y -0.5, z=ownpos.z})
49 local d_below = minetest.registered_nodes[n_below.name]
50 if not d_below then
51 self.object:remove()
52 return
53 end
54 if d_below.walkable or d_below.liquidtype ~= "none" then
55 self.object:remove()
56 local snd, gain = "drippingwater_drip", 0.5
57 local n_here = minetest.get_node(ownpos)
58 if minetest.get_item_group(n_below.name, "water") ~= 0 or
59 minetest.get_item_group(n_here.name, "water") ~= 0 then
60 snd, gain = "drippingwater_drip_on_water", 0.5
61 elseif minetest.get_item_group(n_below.name, "lava") ~= 0 or
62 minetest.get_item_group(n_here.name, "lava") ~= 0 then
63 snd, gain = "drippingwater_drip_on_lava", 0.2
64 end
65 minetest.sound_play({name=snd}, {pos = ownpos, gain = gain, max_hear_distance = 8}, true)
66 end
67 end,
70 --Create drop
72 minetest.register_abm({
73 label = "Spawn water droplets",
74 nodenames = {"group:porous"},
75 neighbors = {"group:water"},
76 interval = 2,
77 chance = 22,
78 action = function(pos)
79 local above = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name
80 local below1 = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name
81 local below2 = minetest.get_node({x=pos.x, y=pos.y-2, z=pos.z}).name
82 if minetest.get_item_group(above, "water") > 0 and
83 below1 == "air" and below2 == "air" then
84 local i = math.random(-45,45) / 100
85 minetest.add_entity({x=pos.x + i, y=pos.y-0.501, z=pos.z + i}, "hades_drippingwater:drop_water")
86 end
87 end,