Use louder footstep sound as dug_node
[oweals/minetest_game.git] / mods / bones / init.lua
1 -- Minetest 0.4 mod: bones
2 -- See README.txt for licensing and other information. 
3
4 local function is_owner(pos, name)
5         local owner = minetest.get_meta(pos):get_string("owner")
6         if owner == "" or owner == name then
7                 return true
8         end
9         return false
10 end
11
12 minetest.register_node("bones:bones", {
13         description = "Bones",
14         tiles = {
15                 "bones_top.png",
16                 "bones_bottom.png",
17                 "bones_side.png",
18                 "bones_side.png",
19                 "bones_rear.png",
20                 "bones_front.png"
21         },
22         paramtype2 = "facedir",
23         groups = {dig_immediate=2},
24         sounds = default.node_sound_dirt_defaults({
25                 footstep = {name="default_gravel_footstep", gain=0.5},
26                 dug = {name="default_gravel_footstep", gain=1.0},
27         }),
28         
29         can_dig = function(pos, player)
30                 local inv = minetest.get_meta(pos):get_inventory()
31                 return is_owner(pos, player:get_player_name()) and inv:is_empty("main")
32         end,
33         
34         allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
35                 if is_owner(pos, player:get_player_name()) then
36                         return count
37                 end
38                 return 0
39         end,
40         
41         allow_metadata_inventory_put = function(pos, listname, index, stack, player)
42                 return 0
43         end,
44         
45         allow_metadata_inventory_take = function(pos, listname, index, stack, player)
46                 if is_owner(pos, player:get_player_name()) then
47                         return stack:get_count()
48                 end
49                 return 0
50         end,
51         
52         on_metadata_inventory_take = function(pos, listname, index, stack, player)
53                 local meta = minetest.get_meta(pos)
54                 if meta:get_string("owner") ~= "" and meta:get_inventory():is_empty("main") then
55                         meta:set_string("infotext", meta:get_string("owner").."'s old bones")
56                         meta:set_string("formspec", "")
57                         meta:set_string("owner", "")
58                 end
59         end,
60         
61         on_timer = function(pos, elapsed)
62                 local meta = minetest.get_meta(pos)
63                 local time = meta:get_int("time")+elapsed
64                 local publish = 1200
65                 if tonumber(minetest.setting_get("share_bones_time")) then
66                         publish = tonumber(minetest.setting_get("share_bones_time"))
67                 end
68                 if publish == 0 then
69                         return
70                 end
71                 if time >= publish then
72                         meta:set_string("infotext", meta:get_string("owner").."'s old bones")
73                         meta:set_string("owner", "")
74                 else
75                         return true
76                 end
77         end,
78 })
79
80 minetest.register_on_dieplayer(function(player)
81         if minetest.setting_getbool("creative_mode") then
82                 return
83         end
84         
85         local pos = player:getpos()
86         pos.x = math.floor(pos.x+0.5)
87         pos.y = math.floor(pos.y+0.5)
88         pos.z = math.floor(pos.z+0.5)
89         local param2 = minetest.dir_to_facedir(player:get_look_dir())
90         
91         local nn = minetest.get_node(pos).name
92         if minetest.registered_nodes[nn].can_dig and
93                 not minetest.registered_nodes[nn].can_dig(pos, player) then
94                 local player_inv = player:get_inventory()
95
96                 for i=1,player_inv:get_size("main") do
97                         player_inv:set_stack("main", i, nil)
98                 end
99                 for i=1,player_inv:get_size("craft") do
100                         player_inv:set_stack("craft", i, nil)
101                 end
102                 return
103         end
104         
105         minetest.dig_node(pos)
106         minetest.add_node(pos, {name="bones:bones", param2=param2})
107         
108         local meta = minetest.get_meta(pos)
109         local inv = meta:get_inventory()
110         local player_inv = player:get_inventory()
111         inv:set_size("main", 8*4)
112         
113         local empty_list = inv:get_list("main")
114         inv:set_list("main", player_inv:get_list("main"))
115         player_inv:set_list("main", empty_list)
116         
117         for i=1,player_inv:get_size("craft") do
118                 inv:add_item("main", player_inv:get_stack("craft", i))
119                 player_inv:set_stack("craft", i, nil)
120         end
121         
122         meta:set_string("formspec", "size[8,9;]"..
123                         "list[current_name;main;0,0;8,4;]"..
124                         "list[current_player;main;0,5;8,4;]")
125         meta:set_string("infotext", player:get_player_name().."'s fresh bones")
126         meta:set_string("owner", player:get_player_name())
127         meta:set_int("time", 0)
128         
129         local timer  = minetest.get_node_timer(pos)
130         timer:start(10)
131 end)