Rename mobs mod to mcl_mobs
[MineClone/MineClone2.git] / mods / ITEMS / mcl_beds / api.lua
blob407aea978be03acc762e5ddf1e9d9e6fed71a211
2 local reverse = true
4 local function destruct_bed(pos, n)
5 local node = minetest.get_node(pos)
6 local other
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
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
25 local beddesc = "Beds allow you to sleep at night and make the time pass faster."
26 local beduse = "Right-click on the bed to sleep in it. This only works when the sun sets, at night or during a thunderstorm."
27 if minetest.settings:get_bool("enable_bed_respawn") == false then
28 beddesc = beddesc .. "\n" .. "In local folklore, legends are told of other worlds where setting the start point for your next would be possible. But this world is not one of them."
29 else
30 beddesc = beddesc .. "\n" .. "By sleeping in a bed, you set the starting point for your next life."
31 end
32 if minetest.settings:get_bool("enable_bed_night_skip") == false then
33 beddesc = beddesc .. "\n" .. "In this strange world, going to bed won't skip the night, but you can skip thunderstorms."
34 else
35 beddesc = beddesc .. "\n" .. "Sleeping allows you to skip the night if you're the only player in this world. If you're not alone, the night is skipped when all players in this world went to sleep. Thunderstorms can be skipped in the same manner."
36 end
38 local default_sounds
39 if minetest.get_modpath("mcl_sounds") then
40 default_sounds = mcl_sounds.node_sound_wood_defaults()
41 end
43 function mcl_beds.register_bed(name, def)
44 local node_box_bottom, selection_box_bottom, collision_box_bottom
45 if def.nodebox and def.nodebox.bottom then
46 node_box_bottom = { type = "fixed", fixed = def.nodebox.bottom }
47 end
48 if def.selectionbox and def.selectionbox.bottom then
49 selection_box_bottom = { type = "fixed", fixed = def.selectionbox.bottom }
50 end
51 if def.collisionbox and def.collisionbox.bottom then
52 collision_box_bottom = { type = "fixed", fixed = def.collisionbox.bottom }
53 end
54 minetest.register_node(name .. "_bottom", {
55 description = def.description,
56 _doc_items_longdesc = def._doc_items_longdesc or beddesc,
57 _doc_items_usagehelp = def._doc_items_usagehelp or beduse,
58 inventory_image = def.inventory_image,
59 wield_image = def.wield_image,
60 drawtype = "nodebox",
61 tiles = def.tiles.bottom,
62 paramtype = "light",
63 paramtype2 = "facedir",
64 is_ground_content = false,
65 stack_max = 1,
66 groups = {handy=1, flammable = 3, bed = 1, dig_by_piston=1, bouncy=66, fall_damage_add_percent=-50},
67 _mcl_hardness = 0.2,
68 _mcl_blast_resistance = 1,
69 sounds = def.sounds or default_sounds,
70 node_box = node_box_bottom,
71 selection_box = selection_box_bottom,
72 collision_box = collision_box_bottom,
73 on_place = function(itemstack, placer, pointed_thing)
74 local under = pointed_thing.under
76 -- Use pointed node's on_rightclick function first, if present
77 local node = minetest.get_node(under)
78 if placer and not placer:get_player_control().sneak then
79 if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then
80 return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack
81 end
82 end
84 local pos
85 local undername = minetest.get_node(under).name
86 if minetest.registered_items[undername] and minetest.registered_items[undername].buildable_to then
87 pos = under
88 else
89 pos = pointed_thing.above
90 end
92 if minetest.is_protected(pos, placer:get_player_name()) and
93 not minetest.check_player_privs(placer, "protection_bypass") then
94 minetest.record_protection_violation(pos, placer:get_player_name())
95 return itemstack
96 end
98 local node_def = minetest.registered_nodes[minetest.get_node(pos).name]
99 if not node_def or not node_def.buildable_to then
100 return itemstack
103 local dir = minetest.dir_to_facedir(placer:get_look_dir())
104 local botpos = vector.add(pos, minetest.facedir_to_dir(dir))
106 if minetest.is_protected(botpos, placer:get_player_name()) and
107 not minetest.check_player_privs(placer, "protection_bypass") then
108 minetest.record_protection_violation(botpos, placer:get_player_name())
109 return itemstack
112 local botdef = minetest.registered_nodes[minetest.get_node(botpos).name]
113 if not botdef or not botdef.buildable_to then
114 return itemstack
117 minetest.set_node(pos, {name = name .. "_bottom", param2 = dir})
118 minetest.set_node(botpos, {name = name .. "_top", param2 = dir})
120 if not minetest.settings:get_bool("creative_mode") then
121 itemstack:take_item()
123 return itemstack
124 end,
126 on_destruct = function(pos)
127 destruct_bed(pos, 1)
128 end,
130 on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
131 mcl_beds.on_rightclick(pos, clicker)
132 return itemstack
133 end,
135 on_rotate = function(pos, node, user, mode, new_param2)
136 local dir = minetest.facedir_to_dir(node.param2)
137 local p = vector.add(pos, dir)
138 local node2 = minetest.get_node_or_nil(p)
139 if not node2 or not minetest.get_item_group(node2.name, "bed") == 2 or
140 not node.param2 == node2.param2 then
141 return false
143 if minetest.is_protected(p, user:get_player_name()) then
144 minetest.record_protection_violation(p, user:get_player_name())
145 return false
147 if mode ~= screwdriver.ROTATE_FACE then
148 return false
150 local newp = vector.add(pos, minetest.facedir_to_dir(new_param2))
151 local node3 = minetest.get_node_or_nil(newp)
152 local node_def = node3 and minetest.registered_nodes[node3.name]
153 if not node_def or not node_def.buildable_to then
154 return false
156 if minetest.is_protected(newp, user:get_player_name()) then
157 minetest.record_protection_violation(newp, user:get_player_name())
158 return false
160 node.param2 = new_param2
161 -- do not remove_node here - it will trigger destroy_bed()
162 minetest.set_node(p, {name = "air"})
163 minetest.set_node(pos, node)
164 minetest.set_node(newp, {name = name .. "_top", param2 = new_param2})
165 return true
166 end,
169 local node_box_top, selection_box_top, collision_box_top
170 if def.nodebox and def.nodebox.top then
171 node_box_top = { type = "fixed", fixed = def.nodebox.top }
173 if def.selectionbox and def.selectionbox.top then
174 selection_box_top = { type = "fixed", fixed = def.selectionbox.top }
176 if def.collisionbox and def.collisionbox.top then
177 collision_box_top = { type = "fixed", fixed = def.collisionbox.top }
180 minetest.register_node(name .. "_top", {
181 drawtype = "nodebox",
182 tiles = def.tiles.top,
183 paramtype = "light",
184 paramtype2 = "facedir",
185 is_ground_content = false,
186 -- FIXME: Should be bouncy=66, but this would be a higher bounciness than slime blocks!
187 groups = {handy = 1, flammable = 3, bed = 2, dig_by_piston=1, bouncy=33, fall_damage_add_percent=-50},
188 _mcl_hardness = 0.2,
189 _mcl_blast_resistance = 1,
190 sounds = def.sounds or default_sounds,
191 drop = name .. "_bottom",
192 node_box = node_box_top,
193 selection_box = selection_box_top,
194 collision_box = collision_box_top,
195 on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
196 mcl_beds.on_rightclick(pos, clicker)
197 return itemstack
198 end,
199 on_rotate = false,
200 on_destruct = function(pos)
201 destruct_bed(pos, 2)
202 end,
205 minetest.register_alias(name, name .. "_bottom")
207 if def.recipe then
208 minetest.register_craft({
209 output = name,
210 recipe = def.recipe
214 doc.add_entry_alias("nodes", name.."_bottom", "nodes", name.."_top")