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_<subname>
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,
})
-- 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_<subname>
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)
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
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,
})