forked from luanti-org/minetest_game
		
	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