Show title and author of book in description
[oweals/minetest_game.git] / mods / beds / api.lua
1
2 local reverse = true
3
4 local function destruct_bed(pos, n)
5         local node = minetest.get_node(pos)
6         local other
7
8         if n == 2 then
9                 local dir = minetest.facedir_to_dir(node.param2)
10                 other = vector.subtract(pos, dir)
11         elseif n == 1 then
12                 local dir = minetest.facedir_to_dir(node.param2)
13                 other = vector.add(pos, dir)
14         end
15
16         if reverse then
17                 reverse = not reverse
18                 minetest.remove_node(other)
19                 minetest.check_for_falling(other)
20         else
21                 reverse = not reverse
22         end
23 end
24
25 function beds.register_bed(name, def)
26         minetest.register_node(name .. "_bottom", {
27                 description = def.description,
28                 inventory_image = def.inventory_image,
29                 wield_image = def.wield_image,
30                 drawtype = "nodebox",
31                 tiles = def.tiles.bottom,
32                 paramtype = "light",
33                 paramtype2 = "facedir",
34                 is_ground_content = false,
35                 stack_max = 1,
36                 groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1},
37                 sounds = def.sounds or default.node_sound_wood_defaults(),
38                 node_box = {
39                         type = "fixed",
40                         fixed = def.nodebox.bottom,
41                 },
42                 selection_box = {
43                         type = "fixed",
44                         fixed = def.selectionbox,
45                 },
46
47                 on_place = function(itemstack, placer, pointed_thing)
48                         local under = pointed_thing.under
49                         local node = minetest.get_node(under)
50                         local udef = minetest.registered_nodes[node.name]
51                         if udef and udef.on_rightclick and
52                                         not (placer and placer:get_player_control().sneak) then
53                                 return udef.on_rightclick(under, node, placer, itemstack,
54                                         pointed_thing) or itemstack
55                         end
56
57                         local pos
58                         if minetest.registered_items[minetest.get_node(under).name].buildable_to then
59                                 pos = under
60                         else
61                                 pos = pointed_thing.above
62                         end
63
64                         if minetest.is_protected(pos, placer:get_player_name()) and
65                                         not minetest.check_player_privs(placer, "protection_bypass") then
66                                 minetest.record_protection_violation(pos, placer:get_player_name())
67                                 return itemstack
68                         end
69
70                         local node_def = minetest.registered_nodes[minetest.get_node(pos).name]
71                         if not node_def or not node_def.buildable_to then
72                                 return itemstack
73                         end
74
75                         local dir = minetest.dir_to_facedir(placer:get_look_dir())
76                         local botpos = vector.add(pos, minetest.facedir_to_dir(dir))
77
78                         if minetest.is_protected(botpos, placer:get_player_name()) and
79                                         not minetest.check_player_privs(placer, "protection_bypass") then
80                                 minetest.record_protection_violation(botpos, placer:get_player_name())
81                                 return itemstack
82                         end
83
84                         local botdef = minetest.registered_nodes[minetest.get_node(botpos).name]
85                         if not botdef or not botdef.buildable_to then
86                                 return itemstack
87                         end
88
89                         minetest.set_node(pos, {name = name .. "_bottom", param2 = dir})
90                         minetest.set_node(botpos, {name = name .. "_top", param2 = dir})
91
92                         if not minetest.setting_getbool("creative_mode") then
93                                 itemstack:take_item()
94                         end
95                         return itemstack
96                 end,
97
98                 on_destruct = function(pos)
99                         destruct_bed(pos, 1)
100                 end,
101
102                 on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
103                         beds.on_rightclick(pos, clicker)
104                         return itemstack
105                 end,
106
107                 on_rotate = function(pos, node, user, mode, new_param2)
108                         local dir = minetest.facedir_to_dir(node.param2)
109                         local p = vector.add(pos, dir)
110                         local node2 = minetest.get_node_or_nil(p)
111                         if not node2 or not minetest.get_item_group(node2.name, "bed") == 2 or
112                                         not node.param2 == node2.param2 then
113                                 return false
114                         end
115                         if minetest.is_protected(p, user:get_player_name()) then
116                                 minetest.record_protection_violation(p, user:get_player_name())
117                                 return false
118                         end
119                         if mode ~= screwdriver.ROTATE_FACE then
120                                 return false
121                         end
122                         local newp = vector.add(pos, minetest.facedir_to_dir(new_param2))
123                         local node3 = minetest.get_node_or_nil(newp)
124                         local node_def = node3 and minetest.registered_nodes[node3.name]
125                         if not node_def or not node_def.buildable_to then
126                                 return false
127                         end
128                         if minetest.is_protected(newp, user:get_player_name()) then
129                                 minetest.record_protection_violation(newp, user:get_player_name())
130                                 return false
131                         end
132                         node.param2 = new_param2
133                         -- do not remove_node here - it will trigger destroy_bed()
134                         minetest.set_node(p, {name = "air"})
135                         minetest.set_node(pos, node)
136                         minetest.set_node(newp, {name = name .. "_top", param2 = new_param2})
137                         return true
138                 end,
139         })
140
141         minetest.register_node(name .. "_top", {
142                 drawtype = "nodebox",
143                 tiles = def.tiles.top,
144                 paramtype = "light",
145                 paramtype2 = "facedir",
146                 is_ground_content = false,
147                 pointable = false,
148                 groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 2},
149                 sounds = def.sounds or default.node_sound_wood_defaults(),
150                 drop = name .. "_bottom",
151                 node_box = {
152                         type = "fixed",
153                         fixed = def.nodebox.top,
154                 },
155                 on_destruct = function(pos)
156                         destruct_bed(pos, 2)
157                 end,
158         })
159
160         minetest.register_alias(name, name .. "_bottom")
161
162         minetest.register_craft({
163                 output = name,
164                 recipe = def.recipe
165         })
166 end