Skip to content
Snippets Groups Projects
Commit 3804d8a0 authored by PilzAdam's avatar PilzAdam
Browse files

Use 6d facedir to place upside down slabs and stairs

parent a4823a42
No related branches found
No related tags found
No related merge requests found
...@@ -28,36 +28,35 @@ function stairs.register_stair(subname, recipeitem, groups, images, description, ...@@ -28,36 +28,35 @@ function stairs.register_stair(subname, recipeitem, groups, images, description,
local p0 = pointed_thing.under local p0 = pointed_thing.under
local p1 = pointed_thing.above 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 if p0.y-1 == p1.y then
local fakestack = ItemStack("stairs:stair_" .. subname.."upside_down") param2 = param2 + 20
local ret = minetest.item_place(fakestack, placer, pointed_thing) if param2 == 21 then
if ret:is_empty() then param2 = 23
itemstack:take_item() elseif param2 == 23 then
return itemstack param2 = 21
end end
end end
-- Otherwise place regularly return minetest.item_place(itemstack, placer, pointed_thing, param2)
return minetest.item_place(itemstack, placer, pointed_thing)
end, end,
}) })
-- for replace ABM
minetest.register_node(":stairs:stair_" .. subname.."upside_down", { minetest.register_node(":stairs:stair_" .. subname.."upside_down", {
drop = "stairs:stair_" .. subname, replace_name = "stairs:stair_" .. subname,
drawtype = "nodebox", groups = {slabs_replace=1},
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({ minetest.register_craft({
...@@ -87,6 +86,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, ...@@ -87,6 +86,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
drawtype = "nodebox", drawtype = "nodebox",
tiles = images, tiles = images,
paramtype = "light", paramtype = "light",
paramtype2 = "facedir",
is_ground_content = true, is_ground_content = true,
groups = groups, groups = groups,
sounds = sounds, sounds = sounds,
...@@ -106,21 +106,32 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, ...@@ -106,21 +106,32 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
local p0 = pointed_thing.under local p0 = pointed_thing.under
local p1 = pointed_thing.above local p1 = pointed_thing.above
local n0 = minetest.get_node(p0) local n0 = minetest.get_node(p0)
if n0.name == "stairs:slab_" .. subname and local n1 = minetest.get_node(p1)
p0.y+1 == p1.y then 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 slabpos = p0
slabnode = n0 slabnode = n0
elseif n1.name == "stairs:slab_" .. subname then
slabpos = p1
slabnode = n1
end end
if slabpos then if slabpos then
-- Remove the slab at slabpos -- Remove the slab at slabpos
minetest.remove_node(slabpos) minetest.remove_node(slabpos)
-- Make a fake stack of a single item and try to place it -- Make a fake stack of a single item and try to place it
local fakestack = ItemStack(recipeitem) local fakestack = ItemStack(recipeitem)
fakestack:set_count(itemstack:get_count())
pointed_thing.above = slabpos 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 the item was taken from the fake stack, decrement original
if not fakestack or fakestack:is_empty() then if success then
itemstack:take_item(1) itemstack:set_count(fakestack:get_count())
-- Else put old node back -- Else put old node back
else else
minetest.set_node(slabpos, slabnode) minetest.set_node(slabpos, slabnode)
...@@ -131,16 +142,19 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, ...@@ -131,16 +142,19 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
-- Upside down slabs -- Upside down slabs
if p0.y-1 == p1.y then if p0.y-1 == p1.y then
-- Turn into full block if pointing at a existing slab -- 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 -- Remove the slab at the position of the slab
minetest.remove_node(p0) minetest.remove_node(p0)
-- Make a fake stack of a single item and try to place it -- Make a fake stack of a single item and try to place it
local fakestack = ItemStack(recipeitem) local fakestack = ItemStack(recipeitem)
fakestack:set_count(itemstack:get_count())
pointed_thing.above = p0 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 the item was taken from the fake stack, decrement original
if not fakestack or fakestack:is_empty() then if success then
itemstack:take_item(1) itemstack:set_count(fakestack:get_count())
-- Else put old node back -- Else put old node back
else else
minetest.set_node(p0, n0) minetest.set_node(p0, n0)
...@@ -149,43 +163,22 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, ...@@ -149,43 +163,22 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
end end
-- Place upside down slab -- Place upside down slab
local fakestack = ItemStack("stairs:slab_" .. subname.."upside_down") param2 = 20
local ret = minetest.item_place(fakestack, placer, pointed_thing)
if ret:is_empty() then
itemstack:take_item()
return itemstack
end
end end
-- If pointing at the side of a upside down slab -- If pointing at the side of a upside down slab
if n0.name == "stairs:slab_" .. subname.."upside_down" and if n0_is_upside_down and p0.y+1 ~= p1.y then
p0.y+1 ~= p1.y then param2 = 20
-- 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 end
-- Otherwise place regularly return minetest.item_place(itemstack, placer, pointed_thing, param2)
return minetest.item_place(itemstack, placer, pointed_thing)
end, end,
}) })
-- for replace ABM
minetest.register_node(":stairs:slab_" .. subname.."upside_down", { minetest.register_node(":stairs:slab_" .. subname.."upside_down", {
drop = "stairs:slab_"..subname, replace_name = "stairs:slab_"..subname,
drawtype = "nodebox", groups = {slabs_replace=1},
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},
},
}) })
minetest.register_craft({ minetest.register_craft({
...@@ -196,6 +189,23 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, ...@@ -196,6 +189,23 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
}) })
end 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}_<subname> -- Nodes will be called stairs:{stair,slab}_<subname>
function stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds) 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) stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment