| | |
| | | --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 = {} |
| | | |
| | | -- 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 |
| | | 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 |
| | |
| | | end |
| | | |
| | | minetest.register_craft({ |
| | | output = 'technic:rebar 6', |
| | | recipe = { |
| | | {'','', steel_ingot}, |
| | | {'',steel_ingot,''}, |
| | | {steel_ingot, '', ''}, |
| | | } |
| | | }) |
| | | |
| | | 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'}, |
| | | } |
| | | }) |
| | | |
| | | 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({ |
| | |
| | | } |
| | | }) |
| | | |
| | | 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", |
| | | }) |
| | | |
| | | minetest.register_node(":technic:concrete", { |
| | | description = S("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 = S("Blast-resistant Concrete Block"), |
| | | tile_images = {"technic_blast_resistant_concrete_block.png",}, |
| | | groups={cracky=1, level=3, concrete=1}, |
| | | 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 = S("Concrete Post Platform"), |
| | | tile_images = {"technic_concrete_block.png",}, |
| | | 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, { |
| | | minetest.register_node(":technic:concrete_post"..(platform == 1 and "_with_platform" or ""), { |
| | | description = S("Concrete Post"), |
| | | tiles = {"technic_concrete_block.png"}, |
| | | groups = groups, |
| | | 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 |
| | | |