mirror of
				https://github.com/luanti-org/minetest_game.git
				synced 2025-11-04 01:05:49 +01:00 
			
		
		
		
	Use 6d facedir to place upside down slabs and stairs
This commit is contained in:
		@@ -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}_<subname>
 | 
			
		||||
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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user