From d781261523f49191a87f8eda4b8c5ea01272f60d Mon Sep 17 00:00:00 2001
From: Cristiano Magro <cristiano.magro@vola.it>
Date: Wed, 14 Oct 2020 23:30:06 +0200
Subject: [PATCH] refactor extract class

---
 concrete/init.lua |  265 +++++++++++++++-------------------------------------
 1 files changed, 79 insertions(+), 186 deletions(-)

diff --git a/concrete/init.lua b/concrete/init.lua
index 2e263bc..ced0471 100644
--- a/concrete/init.lua
+++ b/concrete/init.lua
@@ -1,47 +1,42 @@
---Minetest 0.4.7 mod: concrete 
+--Minetest 0.4.7 mod: concrete
 --(c) 2013 by RealBadAngel <mk@realbadangel.pl>
 
-local technic = technic or {}
+local technic = rawget(_G, "technic") or {}
 technic.concrete_posts = {}
 
-minetest.register_alias("technic:concrete_post",   "technic:concrete_post0")
-minetest.register_alias("technic:concrete_post32", "technic:concrete_post12")
-minetest.register_alias("technic:concrete_post33", "technic:concrete_post3")
-minetest.register_alias("technic:concrete_post34", "technic:concrete_post28")
-minetest.register_alias("technic:concrete_post35", "technic:concrete_post19")
+-- Boilerplate to support localized strings if intllib mod is installed.
+local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end
 
-minetest.register_craft({
-	output = 'technic:rebar 6',
-	recipe = {
-		{'','', 'default:steel_ingot'},
-		{'','default:steel_ingot',''},
-		{'default:steel_ingot', '', ''},
-	}
-})
+for i = 0, 31 do
+	minetest.register_alias("technic:concrete_post"..i,
+			"technic:concrete_post")
+end
+for i = 32, 63 do
+	minetest.register_alias("technic:concrete_post"..i,
+			"technic:concrete_post_with_platform")
+end
 
-minetest.register_craft({
-	output = 'technic:concrete 5',
-	recipe = {
-		{'default:stone','technic:rebar','default:stone'},
-		{'technic:rebar','default:stone','technic:rebar'},
-		{'default:stone','technic:rebar','default:stone'},
-	}
-})
+local steel_ingot
+if minetest.get_modpath("technic_worldgen") then
+	steel_ingot = "technic:carbon_steel_ingot"
+else
+	steel_ingot = "default:steel_ingot"
+end
 
 minetest.register_craft({
 	output = 'technic:concrete_post_platform 6',
 	recipe = {
-		{'technic:concrete','technic:concrete_post0','technic:concrete'},
+		{'technic:concrete','technic:concrete_post','technic:concrete'},
 	}
 })
 
 minetest.register_craft({
-	output = 'technic:concrete_post0 12',
+	output = 'technic:concrete_post 12',
 	recipe = {
-		{'default:stone','technic:rebar','default:stone'},
-		{'default:stone','technic:rebar','default:stone'},
-		{'default:stone','technic:rebar','default:stone'},
-}
+		{'default:stone','basic_materials:steel_bar','default:stone'},
+		{'default:stone','basic_materials:steel_bar','default:stone'},
+		{'default:stone','basic_materials:steel_bar','default:stone'},
+	}
 })
 
 minetest.register_craft({
@@ -53,195 +48,93 @@
 	}
 })
 
-local box_platform = {-0.5,  0.3,  -0.5,  0.5,  0.5, 0.5}
-local box_center   = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15}
-local box_x1       = {0,     -0.3, -0.1,  0.5,  0.3, 0.1}
-local box_z1       = {-0.1,  -0.3, 0,     0.1,  0.3, 0.5}
-local box_x2       = {0,     -0.3, -0.1,  -0.5, 0.3, 0.1}
-local box_z2       = {-0.1,  -0.3, 0,     0.1,  0.3, -0.5}
-
-minetest.register_craftitem(":technic:rebar", {
-	description = "Rebar",
-	inventory_image = "technic_rebar.png",
-})
-
-minetest.register_node(":technic:concrete", {
-	description = "Concrete Block",
-	tile_images = {"technic_concrete_block.png",},
-	groups = {cracky=1, level=2, concrete=1},
-	sounds = default.node_sound_stone_defaults(),
-	after_place_node = function(pos, placer, itemstack)
-		technic.update_posts(pos, false)
-	end,
-	after_dig_node = function (pos, oldnode, oldmetadata, digger)
-		technic.update_posts(pos, false)
-	end,
-})
-
 minetest.register_node(":technic:blast_resistant_concrete", {
-	description = "Blast-resistant Concrete Block",
-	tile_images = {"technic_blast_resistant_concrete_block.png",},
-	groups={cracky=1, level=3, concrete=1},
+	description = S("Blast-resistant Concrete Block"),
+	tiles = {"technic_blast_resistant_concrete_block.png",},
+	groups = {cracky=1, level=3, concrete=1},
 	sounds = default.node_sound_stone_defaults(),
-	after_place_node = function(pos, player, itemstack)
-		technic.update_posts(pos, false)
-	end,
-	after_dig_node = function (pos, oldnode, oldmetadata, digger)
-		technic.update_posts(pos, false)
+	on_blast = function(pos, intensity)
+		if intensity > 9 then
+			minetest.remove_node(pos)
+			return {"technic:blast_resistant_concrete"}
+		end
 	end,
 })
+
+if minetest.get_modpath("moreblocks") then
+	stairsplus:register_all("technic","blast_resistant_concrete","technic:blast_resistant_concrete",{
+		description = "Blast-resistant Concrete",
+		tiles = {"technic_blast_resistant_concrete_block.png",},
+		groups = {cracky=1, level=3, concrete=1},
+		sounds = default.node_sound_stone_defaults(),
+		on_blast = function(pos, intensity)
+			if intensity > 1 then
+				minetest.remove_node(pos)
+				minetest.add_item(pos, "technic:blast_resistant_concrete")
+			end
+		end,
+	})
+end
+
+local box_platform = {-0.5,  0.3,  -0.5,  0.5,  0.5, 0.5}
+local box_post     = {-0.15, -0.5, -0.15, 0.15, 0.5, 0.15}
+local box_front    = {-0.1,  -0.3, -0.5,  0.1,  0.3, 0}
+local box_back     = {-0.1,  -0.3, 0,     0.1,  0.3, 0.5}
+local box_left     = {-0.5,  -0.3, -0.1,  0,    0.3, 0.1}
+local box_right    = {0,     -0.3, -0.1,  0.5,  0.3, 0.1}
 
 minetest.register_node(":technic:concrete_post_platform", {
-	description = "Concrete Post Platform",
-	tile_images = {"technic_concrete_block.png",},
+	description = S("Concrete Post Platform"),
+	tiles = {"basic_materials_concrete_block.png",},
 	groups={cracky=1, level=2},
 	sounds = default.node_sound_stone_defaults(),
 	paramtype = "light",
-	drawtype = "nodebox", 
+	drawtype = "nodebox",
 	node_box = {
 		type = "fixed",
 		fixed = {box_platform}
 	},
 	on_place = function (itemstack, placer, pointed_thing)
 		local node = minetest.get_node(pointed_thing.under)
-		if not technic.concrete_posts[node.name] then 
-			return minetest.item_place_node(itemstack, placer, pointed_thing) 
+		if node.name ~= "technic:concrete_post" then
+			return minetest.item_place_node(itemstack, placer, pointed_thing)
 		end
-		local links = technic.concrete_posts[node.name]
-		if links[5] ~= 0 then -- The post already has a platform
-			return minetest.item_place_node(itemstack, placer, pointed_thing) 
-		end
-		local id = technic.get_post_id({links[1], links[2], links[3], links[4], 1})
-		minetest.set_node(pointed_thing.under, {name="technic:concrete_post"..id})
+		minetest.set_node(pointed_thing.under, {name="technic:concrete_post_with_platform"})
 		itemstack:take_item()
 		placer:set_wielded_item(itemstack)
 		return itemstack
 	end,
 })
 
-local function gen_post_nodebox(x1, x2, z1, z2, platform)
-	local box = {box_center}
-	if x1 ~= 0 then
-		table.insert(box, box_x1)
-	end
-	if x2 ~= 0 then
-		table.insert(box, box_x2)
-	end
-	if z1 ~= 0 then
-		table.insert(box, box_z1)
-	end
-	if z2 ~= 0 then
-		table.insert(box, box_z2)
-	end
-	if platform ~= 0 then
-		table.insert(box, box_platform)
-	end
-	return box
-end
-
-local function dig_post_with_platform(pos, oldnode, oldmetadata)
-	oldnode.name = "technic:concrete_post0"
-	minetest.set_node(pos, oldnode)
-	technic.update_posts(pos, true)
-end
-
-function technic.posts_should_connect(pos)
-	local node = minetest.get_node(pos)
-	if technic.concrete_posts[node.name] then
-		return "post"
-	elseif minetest.get_item_group(node.name, "concrete") ~= 0 then
-		return "block"
-	end
-end
-
-function technic.get_post_id(links)
-	return (links[4] * 1) + (links[3] * 2)
-		+ (links[2] * 4) + (links[1] * 8)
-		+ (links[5] * 16)
-end
-
-function technic.update_posts(pos, set, secondrun)
-	local node = minetest.get_node(pos)
-	local link_positions = {
-		{x=pos.x+1, y=pos.y,   z=pos.z},
-		{x=pos.x-1, y=pos.y,   z=pos.z},
-		{x=pos.x,   y=pos.y,   z=pos.z+1},
-		{x=pos.x,   y=pos.y,   z=pos.z-1},
-	}
-
-	local links = {0, 0, 0, 0, 0}
-
-	for i, link_pos in pairs(link_positions) do
-		local connecttype = technic.posts_should_connect(link_pos)
-		if connecttype then
-			links[i] = 1
-			-- Have posts next to us update theirselves,
-			-- but only once. (We don't want to start an
-			-- infinite loop of updates)
-			if not secondrun and connecttype == "post" then
-				technic.update_posts(link_pos, true, true)
-			end
-		end
-	end
-	-- We don't want to set ourselves if we have been removed or we are
-	-- updating a concrete node
-	if set then
-		-- Preserve platform
-		local oldlinks = technic.concrete_posts[node.name]
-		if oldlinks then
-			links[5] = oldlinks[5]
-		end
-		minetest.set_node(pos, {name="technic:concrete_post"
-				..technic.get_post_id(links)})
-	end
-end
-
-for x1 = 0, 1 do
-for x2 = 0, 1 do
-for z1 = 0, 1 do
-for z2 = 0, 1 do
 for platform = 0, 1 do
-	local links = {x1, x2, z1, z2, platform}
-	local id = technic.get_post_id(links)
-	technic.concrete_posts["technic:concrete_post"..id] = links
-
-	local groups = {cracky=1, level=2, concrete_post=1}
-	if id ~= 0 then
-		groups.not_in_creative_inventory = 1
-	end
-	
-	local drop = "technic:concrete_post0"
-	local after_dig_node = function(pos, oldnode, oldmetadata, digger)
-		technic.update_posts(pos, false)
-	end
-	if platform ~= 0 then
-		drop = "technic:concrete_post_platform"
-		after_dig_node = function(pos, oldnode, oldmetadata, digger)
-			dig_post_with_platform(pos, oldnode, oldmetadata)
+	local after_dig_node = nil
+	if platform == 1 then
+		after_dig_node = function(pos, old_node)
+			old_node.name = "technic:concrete_post"
+			minetest.set_node(pos, old_node)
 		end
 	end
 
-	minetest.register_node(":technic:concrete_post"..id, {
-		description = "Concrete Post",
-		tiles = {"technic_concrete_block.png"},
-		groups = groups,
+	minetest.register_node(":technic:concrete_post"..(platform == 1 and "_with_platform" or ""), {
+		description = S("Concrete Post"),
+		tiles = {"basic_materials_concrete_block.png"},
+		groups = {cracky=1, level=2, concrete_post=1, not_in_creative_inventory=platform},
 		sounds = default.node_sound_stone_defaults(),
-		drop = drop,
+		drop = (platform == 1 and "technic:concrete_post_platform" or
+				"technic:concrete_post"),
 		paramtype = "light",
 		sunlight_propagates = true,
-		drawtype = "nodebox", 
+		drawtype = "nodebox",
+		connects_to = {"group:concrete", "group:concrete_post"},
 		node_box = {
-			type = "fixed",
-			fixed = gen_post_nodebox(x1, x2, z1, z2, platform),
+			type = "connected",
+			fixed = {box_post, (platform == 1 and box_platform or nil)},
+			connect_front = box_front,
+			connect_back  = box_back,
+			connect_left  = box_left,
+			connect_right = box_right,
 		},
-		after_place_node = function(pos, placer, itemstack)
-			technic.update_posts(pos, true)
-		end,
 		after_dig_node = after_dig_node,
 	})
-end
-end
-end
-end
 end
 

--
Gitblit v1.8.0