From 0636d574afa3fee82468166f11eaaf45a84ba692 Mon Sep 17 00:00:00 2001
From: PilzAdam <adam-k@outlook.com>
Date: Sat, 15 Dec 2012 15:01:49 +0100
Subject: [PATCH] Add upside down slabs and stairs
---
mods/stairs/init.lua | 96 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 96 insertions(+)
diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua
index 1be5f5b..3e7f927 100644
--- a/mods/stairs/init.lua
+++ b/mods/stairs/init.lua
@@ -21,6 +21,43 @@ function stairs.register_stair(subname, recipeitem, groups, images, description,
{-0.5, 0, 0, 0.5, 0.5, 0.5},
},
},
+ on_place = function(itemstack, placer, pointed_thing)
+ if pointed_thing.type ~= "node" then
+ return itemstack
+ end
+
+ local p0 = pointed_thing.under
+ local p1 = pointed_thing.above
+ 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
+ end
+ end
+
+ -- Otherwise place regularly
+ return minetest.item_place(itemstack, placer, pointed_thing)
+ end,
+ })
+
+ 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},
+ },
+ },
})
minetest.register_craft({
@@ -95,10 +132,69 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
return itemstack
end
+ -- 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
+ -- Remove the slab at the position of the slab
+ minetest.env:remove_node(p0)
+ -- Make a fake stack of a single item and try to place it
+ local fakestack = ItemStack(recipeitem)
+ pointed_thing.above = p0
+ fakestack = 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)
+ -- Else put old node back
+ else
+ minetest.env:set_node(p0, n0)
+ end
+ return itemstack
+ 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
+ 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
+ end
+
-- Otherwise place regularly
return minetest.item_place(itemstack, placer, pointed_thing)
end,
})
+
+ 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},
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {-0.5, 0, -0.5, 0.5, 0.5, 0.5},
+ },
+ })
minetest.register_craft({
output = 'stairs:slab_' .. subname .. ' 3',