diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 1379c8c..835b219 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -17,6 +17,30 @@ minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood") local replace = minetest.setting_getbool("enable_stairs_replace_abm") +local function rotate_and_place(itemstack, placer, pointed_thing) + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local param2 = 0 + + local placer_pos = placer:getpos() + if placer_pos then + param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) + end + + local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) + local fpos = finepos.y % 1 + + if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) + or (fpos < -0.5 and fpos > -0.999999999) then + param2 = param2 + 20 + if param2 == 21 then + param2 = 23 + elseif param2 == 23 then + param2 = 21 + end + end + return minetest.item_place(itemstack, placer, pointed_thing, param2) +end -- Register stairs. -- Node will be called stairs:stair_ @@ -52,30 +76,7 @@ function stairs.register_stair(subname, recipeitem, groups, images, description, return itemstack end - local p0 = pointed_thing.under - local p1 = pointed_thing.above - local param2 = 0 - - local placer_pos = placer:getpos() - if placer_pos then - local dir = { - x = p1.x - placer_pos.x, - y = p1.y - placer_pos.y, - z = p1.z - placer_pos.z - } - param2 = minetest.dir_to_facedir(dir) - end - - if p0.y - 1 == p1.y then - param2 = param2 + 20 - if param2 == 21 then - param2 = 23 - elseif param2 == 23 then - param2 = 21 - end - end - - return minetest.item_place(itemstack, placer, pointed_thing, param2) + return rotate_and_place(itemstack, placer, pointed_thing) end, }) @@ -126,8 +127,6 @@ end -- Slab facedir to placement 6d matching table local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4} --- Slab facedir when placing initial slab against other surface -local slab_trans_dir_place = {[0] = 0, 20, 12, 16, 4, 8} -- Register slabs. -- Node will be called stairs:slab_ @@ -153,7 +152,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, local creative_enabled = (creative and creative.is_enabled_for and creative.is_enabled_for(placer:get_player_name())) - if under and wield_item == under.name then + if under and under.name:find("stairs:slab_") then -- place slab using under node orientation local dir = minetest.dir_to_facedir(vector.subtract( pointed_thing.above, pointed_thing.under), true) @@ -161,7 +160,9 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, local p2 = under.param2 -- combine two slabs if possible - if slab_trans_dir[math.floor(p2 / 4)] == dir then + if slab_trans_dir[math.floor(p2 / 4)] == dir + and wield_item == under.name then + if not recipeitem then return itemstack end @@ -194,16 +195,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, end return itemstack else - -- place slab using look direction of player - local dir = minetest.dir_to_wallmounted(vector.subtract( - pointed_thing.above, pointed_thing.under), true) - - local rot = slab_trans_dir_place[dir] - if rot == 0 or rot == 20 then - rot = rot + minetest.dir_to_facedir(placer:get_look_dir()) - end - - return minetest.item_place(itemstack, placer, pointed_thing, rot) + return rotate_and_place(itemstack, placer, pointed_thing) end end, })