local reverse = true local function destruct_bed(pos, n) local node = minetest.get_node(pos) local other if n == 2 then local dir = minetest.facedir_to_dir(node.param2) other = vector.subtract(pos, dir) elseif n == 1 then local dir = minetest.facedir_to_dir(node.param2) other = vector.add(pos, dir) end if reverse then reverse = not reverse minetest.remove_node(other) minetest.check_for_falling(other) else reverse = not reverse end end function beds.register_bed(name, def) minetest.register_node(name .. "_bottom", { description = def.description, inventory_image = def.inventory_image, wield_image = def.wield_image, drawtype = "nodebox", tiles = def.tiles.bottom, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, stack_max = 1, groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1}, sounds = default.node_sound_wood_defaults(), node_box = { type = "fixed", fixed = def.nodebox.bottom, }, selection_box = { type = "fixed", fixed = def.selectionbox, }, on_place = function(itemstack, placer, pointed_thing) local under = pointed_thing.under local pos if minetest.registered_items[minetest.get_node(under).name].buildable_to then pos = under else pos = pointed_thing.above end if minetest.is_protected(pos, placer:get_player_name()) and not minetest.check_player_privs(placer, "protection_bypass") then minetest.record_protection_violation(pos, placer:get_player_name()) return itemstack end local node_def = minetest.registered_nodes[minetest.get_node(pos).name] if not node_def or not node_def.buildable_to then return itemstack end local dir = minetest.dir_to_facedir(placer:get_look_dir()) local botpos = vector.add(pos, minetest.facedir_to_dir(dir)) if minetest.is_protected(botpos, placer:get_player_name()) and not minetest.check_player_privs(placer, "protection_bypass") then minetest.record_protection_violation(botpos, placer:get_player_name()) return itemstack end local botdef = minetest.registered_nodes[minetest.get_node(botpos).name] if not botdef or not botdef.buildable_to then return itemstack end minetest.set_node(pos, {name = name .. "_bottom", param2 = dir}) minetest.set_node(botpos, {name = name .. "_top", param2 = dir}) if not minetest.setting_getbool("creative_mode") then itemstack:take_item() end return itemstack end, on_destruct = function(pos) destruct_bed(pos, 1) end, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) beds.on_rightclick(pos, clicker) return itemstack end, on_rotate = function(pos, node, user, mode, new_param2) local dir = minetest.facedir_to_dir(node.param2) local p = vector.add(pos, dir) local node2 = minetest.get_node_or_nil(p) if not node2 or not minetest.get_item_group(node2.name, "bed") == 2 or not node.param2 == node2.param2 then return false end if minetest.is_protected(p, user:get_player_name()) then minetest.record_protection_violation(p, user:get_player_name()) return false end if mode ~= screwdriver.ROTATE_FACE then return false end local newp = vector.add(pos, minetest.facedir_to_dir(new_param2)) local node3 = minetest.get_node_or_nil(newp) local node_def = node3 and minetest.registered_nodes[node3.name] if not node_def or not node_def.buildable_to then return false end if minetest.is_protected(newp, user:get_player_name()) then minetest.record_protection_violation(newp, user:get_player_name()) return false end node.param2 = new_param2 -- do not remove_node here - it will trigger destroy_bed() minetest.set_node(p, {name = "air"}) minetest.set_node(pos, node) minetest.set_node(newp, {name = name .. "_top", param2 = new_param2}) return true end, }) minetest.register_node(name .. "_top", { drawtype = "nodebox", tiles = def.tiles.top, paramtype = "light", paramtype2 = "facedir", is_ground_content = false, pointable = false, groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 2}, sounds = default.node_sound_wood_defaults(), drop = name .. "_bottom", node_box = { type = "fixed", fixed = def.nodebox.top, }, on_destruct = function(pos) destruct_bed(pos, 2) end, }) minetest.register_alias(name, name .. "_bottom") minetest.register_craft({ output = name, recipe = def.recipe }) end