4 local function destruct_bed(pos
, n
)
5 local node
= minetest
.get_node(pos
)
9 local dir
= minetest
.facedir_to_dir(node
.param2
)
10 other
= vector
.subtract(pos
, dir
)
12 local dir
= minetest
.facedir_to_dir(node
.param2
)
13 other
= vector
.add(pos
, dir
)
18 minetest
.remove_node(other
)
19 minetest
.check_for_falling(other
)
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."
30 beddesc
= beddesc
.. "\n" .. "By sleeping in a bed, you set the starting point for your next life."
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."
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."
39 if minetest
.get_modpath("mcl_sounds") then
40 default_sounds
= mcl_sounds
.node_sound_wood_defaults()
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
}
48 if def
.selectionbox
and def
.selectionbox
.bottom
then
49 selection_box_bottom
= { type = "fixed", fixed
= def
.selectionbox
.bottom
}
51 if def
.collisionbox
and def
.collisionbox
.bottom
then
52 collision_box_bottom
= { type = "fixed", fixed
= def
.collisionbox
.bottom
}
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
,
61 tiles
= def
.tiles
.bottom
,
63 paramtype2
= "facedir",
64 is_ground_content
= false,
66 groups
= {handy
=1, flammable
= 3, bed
= 1, dig_by_piston
=1, bouncy
=66, fall_damage_add_percent
=-50},
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
85 local undername
= minetest
.get_node(under
).name
86 if minetest
.registered_items
[undername
] and minetest
.registered_items
[undername
].buildable_to
then
89 pos
= pointed_thing
.above
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())
98 local node_def
= minetest
.registered_nodes
[minetest
.get_node(pos
).name
]
99 if not node_def
or not node_def
.buildable_to
then
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())
112 local botdef
= minetest
.registered_nodes
[minetest
.get_node(botpos
).name
]
113 if not botdef
or not botdef
.buildable_to
then
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()
126 on_destruct
= function(pos
)
130 on_rightclick
= function(pos
, node
, clicker
, itemstack
, pointed_thing
)
131 mcl_beds
.on_rightclick(pos
, clicker
)
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
143 if minetest
.is_protected(p
, user
:get_player_name()) then
144 minetest
.record_protection_violation(p
, user
:get_player_name())
147 if mode
~= screwdriver
.ROTATE_FACE
then
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
156 if minetest
.is_protected(newp
, user
:get_player_name()) then
157 minetest
.record_protection_violation(newp
, user
:get_player_name())
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
})
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
,
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},
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
)
200 on_destruct
= function(pos
)
205 minetest
.register_alias(name
, name
.. "_bottom")
208 minetest
.register_craft({
214 doc
.add_entry_alias("nodes", name
.."_bottom", "nodes", name
.."_top")