From 450543f7820f63bb0d5ecbddd1a7e88b46f9e6a1 Mon Sep 17 00:00:00 2001
From: paramat <mat.gregory@virginmedia.com>
Date: Fri, 14 Aug 2015 03:00:32 +0100
Subject: [PATCH] Stairs: Add straw and metal blocks

Make replace ABM optional, disabled by default
---
 minetest.conf.example   |   4 ++
 mods/stairs/depends.txt |   1 +
 mods/stairs/init.lua    | 144 +++++++++++++++++++++++++++++-----------
 3 files changed, 111 insertions(+), 38 deletions(-)

diff --git a/minetest.conf.example b/minetest.conf.example
index b908ad24..47d03b00 100644
--- a/minetest.conf.example
+++ b/minetest.conf.example
@@ -22,3 +22,7 @@
 
 # The radius of a TNT explosion
 #tnt_radius = 3
+
+# Enable the stairs mod ABM that replaces the old 'upside down'
+# stair and slab nodes in old maps with the new param2 versions.
+#enable_stairs_replace_abm = false
diff --git a/mods/stairs/depends.txt b/mods/stairs/depends.txt
index 4ad96d51..d77ba253 100644
--- a/mods/stairs/depends.txt
+++ b/mods/stairs/depends.txt
@@ -1 +1,2 @@
 default
+farming
diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua
index 7e752d13..c2547935 100644
--- a/mods/stairs/init.lua
+++ b/mods/stairs/init.lua
@@ -1,9 +1,20 @@
 -- Minetest 0.4 mod: stairs
 -- See README.txt for licensing and other information.
 
+
+-- Global namespace for functions
+
 stairs = {}
 
+
+-- Get setting for replace ABM
+
+local replace = minetest.setting_getbool("enable_stairs_replace_abm")
+
+
+-- Register stairs.
 -- Node will be called stairs:stair_<subname>
+
 function stairs.register_stair(subname, recipeitem, groups, images, description, sounds)
 	minetest.register_node(":stairs:stair_" .. subname, {
 		description = description,
@@ -48,7 +59,7 @@ function stairs.register_stair(subname, recipeitem, groups, images, description,
 				param2 = minetest.dir_to_facedir(dir)
 			end
 
-			if p0.y-1 == p1.y then
+			if p0.y - 1 == p1.y then
 				param2 = param2 + 20
 				if param2 == 21 then
 					param2 = 23
@@ -62,10 +73,12 @@ function stairs.register_stair(subname, recipeitem, groups, images, description,
 	})
 
 	-- for replace ABM
-	minetest.register_node(":stairs:stair_" .. subname.."upside_down", {
-		replace_name = "stairs:stair_" .. subname,
-		groups = {slabs_replace=1},
-	})
+	if replace then
+		minetest.register_node(":stairs:stair_" .. subname .. "upside_down", {
+			replace_name = "stairs:stair_" .. subname,
+			groups = {slabs_replace = 1},
+		})
+	end
 
 	minetest.register_craft({
 		output = 'stairs:stair_' .. subname .. ' 6',
@@ -87,7 +100,10 @@ function stairs.register_stair(subname, recipeitem, groups, images, description,
 	})
 end
 
+
+-- Register slabs.
 -- Node will be called stairs:slab_<subname>
+
 function stairs.register_slab(subname, recipeitem, groups, images, description, sounds)
 	minetest.register_node(":stairs:slab_" .. subname, {
 		description = description,
@@ -120,7 +136,8 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
 			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
+			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
@@ -136,7 +153,8 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
 
 				pointed_thing.above = slabpos
 				local success
-				fakestack, success = minetest.item_place(fakestack, placer, pointed_thing)
+				fakestack, success = minetest.item_place(fakestack, placer,
+					pointed_thing)
 				-- If the item was taken from the fake stack, decrement original
 				if success then
 					itemstack:set_count(fakestack:get_count())
@@ -148,7 +166,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
 			end
 			
 			-- 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
 				if n0_is_upside_down  then
 					-- Remove the slab at the position of the slab
@@ -159,7 +177,8 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
 
 					pointed_thing.above = p0
 					local success
-					fakestack, success = minetest.item_place(fakestack, placer, pointed_thing)
+					fakestack, success = minetest.item_place(fakestack, placer,
+						pointed_thing)
 					-- If the item was taken from the fake stack, decrement original
 					if success then
 						itemstack:set_count(fakestack:get_count())
@@ -175,7 +194,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
 			end
 
 			-- If pointing at the side of a upside down slab
-			if n0_is_upside_down and p0.y+1 ~= p1.y then
+			if n0_is_upside_down and p0.y + 1 ~= p1.y then
 				param2 = 20
 			end
 
@@ -184,10 +203,12 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
 	})
 
 	-- for replace ABM
-	minetest.register_node(":stairs:slab_" .. subname.."upside_down", {
-		replace_name = "stairs:slab_"..subname,
-		groups = {slabs_replace=1},
-	})
+	if replace then
+		minetest.register_node(":stairs:slab_" .. subname .. "upside_down", {
+			replace_name = "stairs:slab_".. subname,
+			groups = {slabs_replace = 1},
+		})
+	end
 
 	minetest.register_craft({
 		output = 'stairs:slab_' .. subname .. ' 6',
@@ -197,29 +218,41 @@ 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 = 8,
-	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,
-})
 
+-- Optionally replace old "upside_down" nodes with new param2 versions.
+-- Disabled by default.
+
+if replace then
+	minetest.register_abm({
+		nodenames = {"group:slabs_replace"},
+		interval = 8,
+		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,
+	})
+end
+
+
+-- Stair/slab registration function.
 -- 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_slab(subname, recipeitem, groups, images, desc_slab, sounds)
 end
 
+
+-- Register default stairs and slabs
+
 stairs.register_stair_and_slab("wood", "default:wood",
 		{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3},
 		{"default_wood.png"},
@@ -290,13 +323,6 @@ stairs.register_stair_and_slab("desert_stonebrick", "default:desert_stonebrick",
 		"Desert Stone Brick Slab",
 		default.node_sound_stone_defaults())
 
-stairs.register_stair_and_slab("brick", "default:brick",
-		{cracky = 3},
-		{"default_brick.png"},
-		"Brick Stair",
-		"Brick Slab",
-		default.node_sound_stone_defaults())
-
 stairs.register_stair_and_slab("sandstone", "default:sandstone",
 		{crumbly = 2, cracky = 2},
 		{"default_sandstone.png"},
@@ -324,3 +350,45 @@ stairs.register_stair_and_slab("obsidianbrick", "default:obsidianbrick",
 		"Obsidian Brick Stair",
 		"Obsidian Brick Slab",
 		default.node_sound_stone_defaults())
+
+stairs.register_stair_and_slab("brick", "default:brick",
+		{cracky = 3},
+		{"default_brick.png"},
+		"Brick Stair",
+		"Brick Slab",
+		default.node_sound_stone_defaults())
+
+stairs.register_stair_and_slab("straw", "farming:straw",
+		{snappy = 3, flammable = 4},
+		{"farming_straw.png"},
+		"Straw Stair",
+		"Straw Slab",
+		default.node_sound_leaves_defaults())
+
+stairs.register_stair_and_slab("steelblock", "default:steelblock",
+		{cracky = 1, level = 2},
+		{"default_steel_block.png"},
+		"Steel Block Stair",
+		"Steel Block Slab",
+		default.node_sound_stone_defaults())
+
+stairs.register_stair_and_slab("copperblock", "default:copperblock",
+		{cracky = 1, level = 2},
+		{"default_copper_block.png"},
+		"Copper Block Stair",
+		"Copper Block Slab",
+		default.node_sound_stone_defaults())
+
+stairs.register_stair_and_slab("bronzeblock", "default:bronzeblock",
+		{cracky = 1, level = 2},
+		{"default_bronze_block.png"},
+		"Bronze Block Stair",
+		"Bronze Block Slab",
+		default.node_sound_stone_defaults())
+
+stairs.register_stair_and_slab("goldblock", "default:goldblock",
+		{cracky = 1},
+		{"default_gold_block.png"},
+		"Gold Block Stair",
+		"Gold Block Slab",
+		default.node_sound_stone_defaults())