From 3804d8a078dc5474501463c8f331b91a0873cf3a Mon Sep 17 00:00:00 2001 From: PilzAdam Date: Wed, 11 Sep 2013 16:32:32 +0200 Subject: [PATCH] Use 6d facedir to place upside down slabs and stairs --- mods/stairs/init.lua | 128 +++++++++++++++++++++++-------------------- 1 file changed, 69 insertions(+), 59 deletions(-) diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 0dbc40c6..85c2978d 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -28,36 +28,35 @@ function stairs.register_stair(subname, recipeitem, groups, images, description, 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 - local fakestack = ItemStack("stairs:stair_" .. subname.."upside_down") - local ret = minetest.item_place(fakestack, placer, pointed_thing) - if ret:is_empty() then - itemstack:take_item() - return itemstack + param2 = param2 + 20 + if param2 == 21 then + param2 = 23 + elseif param2 == 23 then + param2 = 21 end end - -- Otherwise place regularly - return minetest.item_place(itemstack, placer, pointed_thing) + return minetest.item_place(itemstack, placer, pointed_thing, param2) end, }) + -- for replace ABM minetest.register_node(":stairs:stair_" .. subname.."upside_down", { - drop = "stairs:stair_" .. subname, - drawtype = "nodebox", - tiles = images, - paramtype = "light", - paramtype2 = "facedir", - is_ground_content = true, - groups = groups, - sounds = sounds, - node_box = { - type = "fixed", - fixed = { - {-0.5, 0, -0.5, 0.5, 0.5, 0.5}, - {-0.5, -0.5, 0, 0.5, 0, 0.5}, - }, - }, + replace_name = "stairs:stair_" .. subname, + groups = {slabs_replace=1}, }) minetest.register_craft({ @@ -87,6 +86,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, drawtype = "nodebox", tiles = images, paramtype = "light", + paramtype2 = "facedir", is_ground_content = true, groups = groups, sounds = sounds, @@ -106,21 +106,32 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, local p0 = pointed_thing.under local p1 = pointed_thing.above local n0 = minetest.get_node(p0) - if n0.name == "stairs:slab_" .. subname and - p0.y+1 == p1.y then + local n1 = minetest.get_node(p1) + local param2 = 0 + + local n0_is_upside_down = (n0.name == "stairs:slab_" .. subname and + n0.param2 >= 20) + + if n0.name == "stairs:slab_" .. subname and not n0_is_upside_down and p0.y+1 == p1.y then slabpos = p0 slabnode = n0 + elseif n1.name == "stairs:slab_" .. subname then + slabpos = p1 + slabnode = n1 end if slabpos then -- Remove the slab at slabpos minetest.remove_node(slabpos) -- Make a fake stack of a single item and try to place it local fakestack = ItemStack(recipeitem) + fakestack:set_count(itemstack:get_count()) + pointed_thing.above = slabpos - fakestack = minetest.item_place(fakestack, placer, pointed_thing) + local success + fakestack, success = minetest.item_place(fakestack, placer, pointed_thing) -- If the item was taken from the fake stack, decrement original - if not fakestack or fakestack:is_empty() then - itemstack:take_item(1) + if success then + itemstack:set_count(fakestack:get_count()) -- Else put old node back else minetest.set_node(slabpos, slabnode) @@ -131,16 +142,19 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, -- Upside down slabs if p0.y-1 == p1.y then -- Turn into full block if pointing at a existing slab - if n0.name == "stairs:slab_" .. subname.."upside_down" then + if n0_is_upside_down then -- Remove the slab at the position of the slab minetest.remove_node(p0) -- Make a fake stack of a single item and try to place it local fakestack = ItemStack(recipeitem) + fakestack:set_count(itemstack:get_count()) + pointed_thing.above = p0 - fakestack = minetest.item_place(fakestack, placer, pointed_thing) + local success + fakestack, success = minetest.item_place(fakestack, placer, pointed_thing) -- If the item was taken from the fake stack, decrement original - if not fakestack or fakestack:is_empty() then - itemstack:take_item(1) + if success then + itemstack:set_count(fakestack:get_count()) -- Else put old node back else minetest.set_node(p0, n0) @@ -149,43 +163,22 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, end -- Place upside down slab - local fakestack = ItemStack("stairs:slab_" .. subname.."upside_down") - local ret = minetest.item_place(fakestack, placer, pointed_thing) - if ret:is_empty() then - itemstack:take_item() - return itemstack - end + param2 = 20 end -- If pointing at the side of a upside down slab - if n0.name == "stairs:slab_" .. subname.."upside_down" and - p0.y+1 ~= p1.y then - -- Place upside down slab - local fakestack = ItemStack("stairs:slab_" .. subname.."upside_down") - local ret = minetest.item_place(fakestack, placer, pointed_thing) - if ret:is_empty() then - itemstack:take_item() - return itemstack - end + if n0_is_upside_down and p0.y+1 ~= p1.y then + param2 = 20 end - -- Otherwise place regularly - return minetest.item_place(itemstack, placer, pointed_thing) + return minetest.item_place(itemstack, placer, pointed_thing, param2) end, }) + -- for replace ABM minetest.register_node(":stairs:slab_" .. subname.."upside_down", { - drop = "stairs:slab_"..subname, - drawtype = "nodebox", - tiles = images, - paramtype = "light", - is_ground_content = true, - groups = groups, - sounds = sounds, - node_box = { - type = "fixed", - fixed = {-0.5, 0, -0.5, 0.5, 0.5, 0.5}, - }, + replace_name = "stairs:slab_"..subname, + groups = {slabs_replace=1}, }) minetest.register_craft({ @@ -196,6 +189,23 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, }) end +-- Replace old "upside_down" nodes with new param2 versions +minetest.register_abm({ + nodenames = {"group:slabs_replace"}, + interval = 1, + chance = 1, + action = function(pos, node) + node.name = minetest.registered_nodes[node.name].replace_name + node.param2 = node.param2 + 20 + if node.param2 == 21 then + node.param2 = 23 + elseif node.param2 == 23 then + node.param2 = 21 + end + minetest.set_node(pos, node) + end, +}) + -- Nodes will be called stairs:{stair,slab}_ function stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds) stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds)