-- MARK: Helpers local fence_nodebox = { type = "connected", fixed = { -2/16, -0.5, -2/16, 2/16, 0.5, 2/16 }, connect_front = { { -1/16, -6/16, -0.5, 1/16, -2/16, 0 }, { -1/16, 2/16, -0.5, 1/16, 6/16, 0 } }, connect_back = { { -1/16, -6/16, 0, 1/16, -2/16, 0.5 }, { -1/16, 2/16, 0, 1/16, 6/16, 0.5 } }, connect_left = { { -0.5, -6/16, -1/16, 0, -2/16, 1/16 }, { -0.5, 2/16, -1/16, 0, 6/16, 1/16 } }, connect_right = { { 0, -6/16, -1/16, 0.5, -2/16, 1/16 }, { 0, 2/16, -1/16, 0.5, 6/16, 1/16 } }, } local fence_gate_nodebox = { type = "fixed", fixed = { { -8/16, -7/16, -1/16, -6/16, 7/16, 1/16 }, { 8/16, -7/16, -1/16, 6/16, 7/16, 1/16 }, { -6/16, -6/16, -1/16, 6/16, -2/16, 1/16 }, { -6/16, 2/16, -1/16, 6/16, 6/16, 1/16 } } } local fence_gate_open_nodebox = { type = "fixed", fixed = { { -8/16, -7/16, -1/16, -6/16, 7/16, 1/16 }, { 8/16, -7/16, -1/16, 6/16, 7/16, 1/16 }, { -8/16, -6/16, 1/16, -6/16, -2/16, 0.5 }, { -8/16, 2/16, 1/16, -6/16, 6/16, 0.5 }, { 8/16, -6/16, 1/16, 6/16, -2/16, 0.5 }, { 8/16, 2/16, 1/16, 6/16, 6/16, 0.5 }, } } local ladder_nodebox = { type = "fixed", fixed = { { -7/16, -0.5, 0.5, -5/16, 0.5, 6/16 }, { 5/16, -0.5, 0.5, 7/16, 0.5, 6/16 }, { -5/16, -7/16, 7.5/16, 5/16, -5/16, 6.5/16 }, { -5/16, -3/16, 7.5/16, 5/16, -1/16, 6.5/16 }, { -5/16, 1/16, 7.5/16, 5/16, 3/16, 6.5/16 }, { -5/16, 5/16, 7.5/16, 5/16, 7/16, 6.5/16 }, } } local log_nodebox = { type = "fixed", fixed = { { -6/16, -0.5, -0.5, 6/16, 0.5, 0.5, }, { -0.5, -0.5, -6/16, 0.5, 0.5, 6/16, } } } function rgt.register_fence(name, texture) rgt.register_node(name.."_fence", { drawtype = "nodebox", node_box = fence_nodebox, connects_to = {"group:fence"}, paramtype = "light", sunlight_propagates = true, tiles = {{name = texture or "rgt_"..name.."_planks.png", align_style = "world"}}, groups = {dig_immediate = 3, fence = 1}, }) local function fence_gate_swap(pos, node, p) if node.name:find "fence_gate_open" then node.name = node.name:gsub("fence_gate_open", "fence_gate") elseif node.name:find "fence_gate" then node.name = node.name:gsub("fence_gate", "fence_gate_open") local rot = minetest.fourdir_to_dir(node.param2) -- Get the axis on which the gate will open. local axis = rot.x ~= 0 and "x" or "z" local dir = p:get_pos():direction(pos) -- If the gate will open in the opposite direction from the player's facing direction, flip it. if math.sign(dir[axis]) ~= math.sign(rot[axis]) then node.param2 = (node.param2 +2) %4 end end minetest.swap_node(pos, node) end rgt.register_node(name.."_fence_gate", { drawtype = "nodebox", node_box = fence_gate_nodebox, connects_to = {"group:fence"}, connect_sides = {"left", "right"}, paramtype = "light", sunlight_propagates = true, paramtype2 = "4dir", tiles = {{name = "rgt_"..name.."_planks.png", align_style = "world"}}, groups = {dig_immediate = 3, fence = 1}, on_rightclick = fence_gate_swap, }) rgt.register_node(name.."_fence_gate_open", { drawtype = "nodebox", node_box = fence_gate_open_nodebox, connects_to = {"group:fence"}, connect_sides = {"left", "right"}, paramtype = "light", sunlight_propagates = true, paramtype2 = "4dir", tiles = {{name = "rgt_"..name.."_planks.png", align_style = "world"}}, groups = {dig_immediate = 3, fence = 1}, on_rightclick = fence_gate_swap, }) end function rgt.register_ladder(name) rgt.register_node(name.."_ladder", { drawtype = "nodebox", node_box = ladder_nodebox, selection_box = { type = "fixed", fixed = {-7/16, -0.5, 0.5, 7/16, 0.5, 6/16} }, paramtype = "light", sunlight_propagates = true, paramtype2 = "4dir", climbable = true, tiles = {{name = "rgt_"..name.."_planks.png", align_style = "world"}}, groups = {dig_immediate = 3, ladder = 1}, on_place = function(s, p, pt) local under = minetest.get_node(pt.under) -- If placing a ladder against a ladder, attempt to extend the pointed ladder rather than naively placing against it. if under.name:find "ladder" then local old_pt = table.copy(pt) -- This will blow up for touchscreen users, but there's no way around it because they don't obey crosshair restrictions. local iy = rgt.players[p:get_player_name()].pointed_node -- `iy` can be nil in edge cases where the client clicked the node momentarily but is no longer pointing at the -- node on the server when the message arrives and the server responds. In these cases, we just don't place anything -- because we cannot determine the direction in which the player wishes to extend the ladder. if not iy then return end iy = iy.intersection_point.y -- Try extending in the pointed direction first. pt.above = pt.under:offset(0, iy -pt.under.y > 0 and 1 or -1, 0) local s, success = minetest.item_place_node(s, p, pt, under.param2) if success then return s end -- If we can't, try extending in the other direction. pt.above = pt.under:offset(0, iy -pt.under.y > 0 and -1 or 1, 0) s, success = minetest.item_place_node(s, p, pt, under.param2) if success then return s end -- If that too fails, don't place anything. We could fall back to default placement, but that would make rapid laddering more annoying. else return minetest.item_place_node(s, p, pt) end end }) end -- MARK: Oak rgt.register_node("oak_log", { drawtype = "nodebox", node_box = log_nodebox, tiles = {"rgt_oak_log_top.png", "rgt_oak_log_top.png", "rgt_oak_log_side.png"}, groups = {dig_immediate = 3}, paramtype2 = "facedir", }) rgt.register_node("oak_leaves", { drawtype = "allfaces", tiles = {"rgt_oak_leaves.png"}, use_texture_alpha = "clip", groups = {dig_immediate = 3}, }) rgt.register_node("oak_planks", { tiles = {{name = "rgt_oak_planks.png", align_style = "world"}}, _variants = "all", groups = {dig_immediate = 3}, }) rgt.register_fence("oak") rgt.register_ladder("oak") -- MARK: Dark rgt.register_node("dark_planks", { tiles = {{name = "rgt_dark_planks.png", align_style = "world"}}, _variants = "all", groups = {dig_immediate = 3}, }) rgt.register_fence("dark") rgt.register_ladder("dark") -- MARK: Spruce rgt.register_node("spruce_log", { drawtype = "nodebox", node_box = log_nodebox, tiles = {"rgt_spruce_log_top.png", "rgt_spruce_log_top.png", "rgt_spruce_log_side.png"}, groups = {dig_immediate = 3}, paramtype2 = "facedir", }) rgt.register_node("spruce_planks", { tiles = {{name = "rgt_spruce_planks.png", align_style = "world"}}, _variants = "all", groups = {dig_immediate = 3}, }) rgt.register_node("spruce_leaves", { drawtype = "allfaces", tiles = {"rgt_spruce_leaves.png"}, use_texture_alpha = "clip", groups = {dig_immediate = 3}, }) rgt.register_fence("spruce") rgt.register_ladder("spruce") -- MARK: Acacia rgt.register_node("acacia_planks", { tiles = {{name = "rgt_acacia_planks.png", align_style = "world"}}, _variants = "all", groups = {dig_immediate = 3}, }) rgt.register_fence("acacia") rgt.register_ladder("acacia") -- MARK: Redwood rgt.register_node("redwood_planks", { tiles = {{name = "rgt_redwood_planks.png", align_style = "world"}}, _variants = "all", groups = {dig_immediate = 3}, }) rgt.register_fence("redwood") rgt.register_ladder("redwood") -- MARK: Birch rgt.register_node("birch_planks", { tiles = {{name = "rgt_birch_planks.png", align_style = "world"}}, _variants = "all", groups = {dig_immediate = 3}, }) rgt.register_fence("birch") rgt.register_ladder("birch")