technic/concrete/init.lua

280 lines
7.6 KiB
Lua
Raw Normal View History

--Minetest 0.4.7 mod: concrete
2013-04-04 01:17:39 +02:00
--(c) 2013 by RealBadAngel <mk@realbadangel.pl>
2013-07-17 21:34:35 +02:00
local technic = technic or {}
technic.concrete_posts = {}
2014-04-16 19:10:00 +02:00
-- Boilerplate to support localized strings if intllib mod is installed.
local S
if intllib then
S = intllib.Getter()
else
S = function(s) return s end
end
2013-07-17 21:34:35 +02:00
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")
local steel_ingot
if minetest.get_modpath("technic_worldgen") then
steel_ingot = "technic:carbon_steel_ingot"
else
steel_ingot = "default:steel_ingot"
end
2013-04-04 01:17:39 +02:00
minetest.register_craft({
output = 'technic:rebar 6',
2013-04-04 01:17:39 +02:00
recipe = {
{'','', steel_ingot},
{'',steel_ingot,''},
{steel_ingot, '', ''},
2013-04-04 01:17:39 +02:00
}
})
minetest.register_craft({
output = 'technic:concrete 5',
2013-04-04 01:17:39 +02:00
recipe = {
{'default:stone','technic:rebar','default:stone'},
{'technic:rebar','default:stone','technic:rebar'},
{'default:stone','technic:rebar','default:stone'},
}
})
minetest.register_craft({
output = 'technic:concrete_post_platform 6',
2013-04-04 01:17:39 +02:00
recipe = {
2013-07-17 21:34:35 +02:00
{'technic:concrete','technic:concrete_post0','technic:concrete'},
2013-04-04 01:17:39 +02:00
}
})
minetest.register_craft({
2013-07-17 21:34:35 +02:00
output = 'technic:concrete_post0 12',
2013-04-04 01:17:39 +02:00
recipe = {
{'default:stone','technic:rebar','default:stone'},
{'default:stone','technic:rebar','default:stone'},
{'default:stone','technic:rebar','default:stone'},
}
})
2013-07-14 12:11:56 +02:00
minetest.register_craft({
output = 'technic:blast_resistant_concrete 5',
recipe = {
{'technic:concrete','technic:composite_plate','technic:concrete'},
{'technic:composite_plate','technic:concrete','technic:composite_plate'},
{'technic:concrete','technic:composite_plate','technic:concrete'},
}
})
2013-07-17 21:34:35 +02:00
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}
2013-04-04 01:17:39 +02:00
minetest.register_craftitem(":technic:rebar", {
2014-04-16 19:10:00 +02:00
description = S("Rebar"),
2013-04-04 01:17:39 +02:00
inventory_image = "technic_rebar.png",
})
minetest.register_node(":technic:concrete", {
2014-04-16 19:10:00 +02:00
description = S("Concrete Block"),
2013-04-04 01:17:39 +02:00
tile_images = {"technic_concrete_block.png",},
2013-07-17 21:34:35 +02:00
groups = {cracky=1, level=2, concrete=1},
2013-04-04 01:17:39 +02:00
sounds = default.node_sound_stone_defaults(),
2013-07-17 21:34:35 +02:00
after_place_node = function(pos, placer, itemstack)
technic.update_posts(pos, false)
2013-04-04 01:17:39 +02:00
end,
after_dig_node = function (pos, oldnode, oldmetadata, digger)
2013-07-17 21:34:35 +02:00
technic.update_posts(pos, false)
2013-04-04 01:17:39 +02:00
end,
})
2013-07-14 12:11:56 +02:00
minetest.register_node(":technic:blast_resistant_concrete", {
2014-04-16 19:10:00 +02:00
description = S("Blast-resistant Concrete Block"),
2013-07-14 12:11:56 +02:00
tile_images = {"technic_blast_resistant_concrete_block.png",},
2013-07-17 21:34:35 +02:00
groups={cracky=1, level=3, concrete=1},
2013-07-14 12:11:56 +02:00
sounds = default.node_sound_stone_defaults(),
2013-07-17 21:34:35 +02:00
after_place_node = function(pos, player, itemstack)
technic.update_posts(pos, false)
2013-07-14 12:11:56 +02:00
end,
after_dig_node = function (pos, oldnode, oldmetadata, digger)
2013-07-17 21:34:35 +02:00
technic.update_posts(pos, false)
2013-07-14 12:11:56 +02:00
end,
})
2013-04-04 01:17:39 +02:00
minetest.register_node(":technic:concrete_post_platform", {
2014-04-16 19:10:00 +02:00
description = S("Concrete Post Platform"),
2013-04-04 01:17:39 +02:00
tile_images = {"technic_concrete_block.png",},
2013-07-17 21:34:35 +02:00
groups={cracky=1, level=2},
2013-04-04 01:17:39 +02:00
sounds = default.node_sound_stone_defaults(),
paramtype = "light",
drawtype = "nodebox",
node_box = {
type = "fixed",
2013-07-17 21:34:35 +02:00
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)
end
local links = technic.concrete_posts[node.name]
2014-08-29 01:26:25 +02:00
if links[6] ~= 0 then -- The post already has a platform
2013-07-17 21:34:35 +02:00
return minetest.item_place_node(itemstack, placer, pointed_thing)
end
2014-08-29 01:26:25 +02:00
local id = technic.get_post_id({links[1], links[2], links[3], links[4], links[5], 1})
2013-07-17 21:34:35 +02:00
minetest.set_node(pointed_thing.under, {name="technic:concrete_post"..id})
itemstack:take_item()
placer:set_wielded_item(itemstack)
return itemstack
2013-04-04 01:17:39 +02:00
end,
})
2014-08-29 01:26:25 +02:00
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
2013-07-17 21:34:35 +02:00
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
2013-04-04 01:17:39 +02:00
2013-07-17 21:34:35 +02:00
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
2013-04-04 01:17:39 +02:00
2013-07-17 21:34:35 +02:00
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
2013-04-04 01:17:39 +02:00
2013-07-17 21:34:35 +02:00
function technic.get_post_id(links)
2014-08-29 01:26:25 +02:00
return (links[1] * 1) + (links[2] * 2)
+ (links[3] * 4) + (links[4] * 8)
+ (links[5] * 16) + (links[6] * 32)
2013-07-17 21:34:35 +02:00
end
2013-04-04 01:17:39 +02:00
2013-07-17 21:34:35 +02:00
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},
2014-08-29 01:26:25 +02:00
{x=pos.x, y=pos.y-1, z=pos.z},
{x=pos.x, y=pos.y+1, z=pos.z},
2013-07-17 21:34:35 +02:00
}
2013-04-04 01:17:39 +02:00
2014-08-29 01:26:25 +02:00
local links = {0, 0, 0, 0, 0, 0}
2013-07-17 21:34:35 +02:00
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
2013-04-04 01:17:39 +02:00
end
2013-07-17 21:34:35 +02:00
end
2014-08-29 01:26:25 +02:00
if links[5] == 1 or links[6] == 1 then
links[5] = 1
links[6] = 0
end
2013-07-17 21:34:35 +02:00
-- 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
2014-08-29 01:26:25 +02:00
links[6] = oldlinks[6]
2013-04-04 01:17:39 +02:00
end
2013-07-17 21:34:35 +02:00
minetest.set_node(pos, {name="technic:concrete_post"
..technic.get_post_id(links)})
end
2013-04-04 01:17:39 +02:00
end
2013-07-17 21:34:35 +02:00
for x1 = 0, 1 do
for x2 = 0, 1 do
for z1 = 0, 1 do
for z2 = 0, 1 do
2014-08-29 01:26:25 +02:00
for y = 0, 1 do
2013-07-17 21:34:35 +02:00
for platform = 0, 1 do
2014-08-29 01:26:25 +02:00
local links = {x1, x2, z1, z2, y, platform}
2013-07-17 21:34:35 +02:00
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
2013-04-04 01:17:39 +02:00
end
2013-07-17 21:34:35 +02:00
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)
end
end
minetest.register_node(":technic:concrete_post"..id, {
2014-04-16 19:10:00 +02:00
description = S("Concrete Post"),
2013-07-17 21:34:35 +02:00
tiles = {"technic_concrete_block.png"},
groups = groups,
sounds = default.node_sound_stone_defaults(),
drop = drop,
paramtype = "light",
sunlight_propagates = true,
drawtype = "nodebox",
node_box = {
type = "fixed",
2014-08-29 01:26:25 +02:00
fixed = gen_post_nodebox(x1, x2, z1, z2, y, platform),
2013-07-17 21:34:35 +02:00
},
after_place_node = function(pos, placer, itemstack)
technic.update_posts(pos, true)
end,
after_dig_node = after_dig_node,
})
end
2013-04-04 01:17:39 +02:00
end
2013-07-17 21:34:35 +02:00
end
end
end
2014-08-29 01:26:25 +02:00
end
2013-07-17 21:34:35 +02:00