diff --git a/builtin/misc_helpers.lua b/builtin/misc_helpers.lua index 55c5798d7..623476915 100644 --- a/builtin/misc_helpers.lua +++ b/builtin/misc_helpers.lua @@ -264,78 +264,86 @@ end -------------------------------------------------------------------------------- if minetest then - local dirs1 = { 9, 18, 7, 12 } - local dirs2 = { 20, 23, 22, 21 } + local dirs1 = {9, 18, 7, 12} + local dirs2 = {20, 23, 22, 21} - function minetest.rotate_and_place(itemstack, placer, pointed_thing, infinitestacks, orient_flags) + function minetest.rotate_and_place(itemstack, placer, pointed_thing, + infinitestacks, orient_flags) orient_flags = orient_flags or {} - local node = minetest.get_node(pointed_thing.under) - if not minetest.registered_nodes[node.name] - or not minetest.registered_nodes[node.name].on_rightclick then + local unode = minetest.get_node_or_nil(pointed_thing.under) + if not unode then + return + end + local undef = minetest.registered_nodes[unode.name] + if undef and undef.on_rightclick then + undef.on_rightclick(pointed_thing.under, node, placer, + itemstack) + return + end + local pitch = placer:get_look_pitch() + local fdir = minetest.dir_to_facedir(placer:get_look_dir()) + local wield_name = itemstack:get_name() - local above = pointed_thing.above - local under = pointed_thing.under - local pitch = placer:get_look_pitch() - local pname = minetest.get_node(under).name - local node = minetest.get_node(above) - local fdir = minetest.dir_to_facedir(placer:get_look_dir()) - local wield_name = itemstack:get_name() - local reg_node = minetest.registered_nodes[pname] + local above = pointed_thing.above + local under = pointed_thing.under + local iswall = (above.y == under.y) + local isceiling = not iswall and (above.y < under.y) + local anode = minetest.get_node_or_nil(above) + if not anode then + return + end + local pos = pointed_thing.above + local node = anode - if not reg_node or not reg_node.on_rightclick then + if undef and undef.buildable_to then + pos = pointed_thing.under + node = unode + iswall = false + end - local iswall = (above.x ~= under.x) or (above.z ~= under.z) - local isceiling = (above.x == under.x) and (above.z == under.z) - and (pitch > 0) - local pos1 = above + local ndef = minetest.registered_nodes[node.name] + if not ndef or not ndef.buildable_to then + return + end - if reg_node and reg_node.buildable_to then - pos1 = under - iswall = false - end + if orient_flags.force_floor then + iswall = false + isceiling = false + elseif orient_flags.force_ceiling then + iswall = false + isceiling = true + elseif orient_flags.force_wall then + iswall = true + isceiling = false + elseif orient_flags.invert_wall then + iswall = not iswall + end - reg_node = minetest.registered_nodes[minetest.get_node(pos1).name] - if not reg_node or not reg_node.buildable_to then - return - end - - if orient_flags.force_floor then - iswall = false - isceiling = false - elseif orient_flags.force_ceiling then - iswall = false - isceiling = true - elseif orient_flags.force_wall then - iswall = true - isceiling = false - elseif orient_flags.invert_wall then - iswall = not iswall - end - - if iswall then - minetest.add_node(pos1, {name = wield_name, param2 = dirs1[fdir+1] }) - elseif isceiling then - if orient_flags.force_facedir then - minetest.add_node(pos1, {name = wield_name, param2 = 20 }) - else - minetest.add_node(pos1, {name = wield_name, param2 = dirs2[fdir+1] }) - end - else -- place right side up - if orient_flags.force_facedir then - minetest.add_node(pos1, {name = wield_name, param2 = 0 }) - else - minetest.add_node(pos1, {name = wield_name, param2 = fdir }) - end - end - - if not infinitestacks then - itemstack:take_item() - return itemstack - end + if iswall then + minetest.set_node(pos, {name = wield_name, + param2 = dirs1[fdir+1]}) + elseif isceiling then + if orient_flags.force_facedir then + minetest.set_node(pos, {name = wield_name, + param2 = 20}) + else + minetest.set_node(pos, {name = wield_name, + param2 = dirs2[fdir+1]}) end - else - minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) + else -- place right side up + if orient_flags.force_facedir then + minetest.set_node(pos, {name = wield_name, + param2 = 0}) + else + minetest.set_node(pos, {name = wield_name, + param2 = fdir}) + end + end + + if not infinitestacks then + itemstack:take_item() + return itemstack end end @@ -348,8 +356,8 @@ if minetest then minetest.rotate_node = function(itemstack, placer, pointed_thing) minetest.rotate_and_place(itemstack, placer, pointed_thing, - minetest.setting_getbool("creative_mode"), - {invert_wall = placer:get_player_control().sneak}) + minetest.setting_getbool("creative_mode"), + {invert_wall = placer:get_player_control().sneak}) return itemstack end end