Christopher Head
2019-01-26 4f78a69ffc714886c9d6e812f78d543bb33fe674
concrete/init.lua
@@ -1,22 +1,20 @@
--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
@@ -26,37 +24,19 @@
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({
@@ -68,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 = 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