forked from minetest-mods/technic
		
	Use connected nodeboxes for concrete posts
This commit is contained in:
		@@ -7,11 +7,14 @@ technic.concrete_posts = {}
 | 
			
		||||
-- 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_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")
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
local steel_ingot
 | 
			
		||||
if minetest.get_modpath("technic_worldgen") then
 | 
			
		||||
@@ -41,17 +44,17 @@ minetest.register_craft({
 | 
			
		||||
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'},
 | 
			
		||||
}
 | 
			
		||||
	}
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_craft({
 | 
			
		||||
@@ -63,13 +66,6 @@ minetest.register_craft({
 | 
			
		||||
	}
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
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 = S("Rebar"),
 | 
			
		||||
	inventory_image = "technic_rebar.png",
 | 
			
		||||
@@ -80,27 +76,23 @@ minetest.register_node(":technic:concrete", {
 | 
			
		||||
	tiles = {"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 = S("Blast-resistant Concrete Block"),
 | 
			
		||||
	tiles = {"technic_blast_resistant_concrete_block.png",},
 | 
			
		||||
	groups={cracky=1, level=3, concrete=1},
 | 
			
		||||
	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)
 | 
			
		||||
	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,     0.1,  0.3, -0.5}
 | 
			
		||||
local box_back     = {-0.1,  -0.3, 0,     0.1,  0.3, 0.5}
 | 
			
		||||
local box_left     = {0,     -0.3, -0.1,  -0.5, 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 = S("Concrete Post Platform"),
 | 
			
		||||
	tiles = {"technic_concrete_block.png",},
 | 
			
		||||
@@ -114,161 +106,45 @@ minetest.register_node(":technic:concrete_post_platform", {
 | 
			
		||||
	},
 | 
			
		||||
	on_place = function (itemstack, placer, pointed_thing)
 | 
			
		||||
		local node = minetest.get_node(pointed_thing.under)
 | 
			
		||||
		if not technic.concrete_posts[node.name] then 
 | 
			
		||||
		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[6] ~= 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], links[5], 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, y, platform)
 | 
			
		||||
	local box
 | 
			
		||||
	local xx = x1 + x2
 | 
			
		||||
	local zz = z1 + z2
 | 
			
		||||
	if ((xx == 2 and zz == 0) or (xx == 0 and zz == 2)) and y == 0 then
 | 
			
		||||
		box = {}
 | 
			
		||||
	else 
 | 
			
		||||
		box = {box_center}
 | 
			
		||||
	end
 | 
			
		||||
	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[1] * 1) + (links[2] * 2)
 | 
			
		||||
		+ (links[3] * 4) + (links[4] * 8)
 | 
			
		||||
		+ (links[5] * 16) + (links[6] * 32)
 | 
			
		||||
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},
 | 
			
		||||
		{x=pos.x,   y=pos.y-1,   z=pos.z},
 | 
			
		||||
		{x=pos.x,   y=pos.y+1,   z=pos.z},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	local links = {0, 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
 | 
			
		||||
 | 
			
		||||
	if links[5] == 1 or links[6] == 1 then
 | 
			
		||||
		links[5] = 1
 | 
			
		||||
		links[6] = 0
 | 
			
		||||
	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[6] = oldlinks[6]
 | 
			
		||||
		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 y = 0, 1 do
 | 
			
		||||
for platform = 0, 1 do
 | 
			
		||||
	local links = {x1, x2, z1, z2, y, 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, {
 | 
			
		||||
	minetest.register_node(":technic:concrete_post"..(platform == 1 and "_with_platform" or ""), {
 | 
			
		||||
		description = S("Concrete Post"),
 | 
			
		||||
		tiles = {"technic_concrete_block.png"},
 | 
			
		||||
		groups = groups,
 | 
			
		||||
		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, y, 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
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user