diff --git a/concrete.lua b/concrete.lua index 75add9e..f9af08c 100644 --- a/concrete.lua +++ b/concrete.lua @@ -77,8 +77,8 @@ minetest.register_abm({ interval = 5, chance = 5, action = function(pos) - minetest.get_node_timer(pos):start(15*60) -- concrete takes half an hour to cure at best --- minetest.get_node_timer(pos):start(5) -- fast cure for debugging +-- minetest.get_node_timer(pos):start(15*60) -- concrete takes half an hour to cure at best + minetest.get_node_timer(pos):start(5) -- fast cure for debugging end }) diff --git a/craftitems.lua b/craftitems.lua index 877002b..99ca4e2 100644 --- a/craftitems.lua +++ b/craftitems.lua @@ -1,112 +1,19 @@ - +--[[ minetest.register_craftitem(":bitumen:bitumen", { description = "Bitumen", inventory_image = "bitumen_bitumen.png", on_place_on_ground = minetest.craftitem_place_item, }) +]] - - - - - --- these are temporary until the piping system is done -minetest.register_craftitem(":bitumen:synthetic_crude", { - description = "Synthetic Crude Oil", - inventory_image = "bitumen_synthetic_crude.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - -minetest.register_craftitem(":bitumen:lube_oil", { - description = "Heavy Lubricating Oil", - inventory_image = "bitumen_lube_oil.png", - on_place_on_ground = minetest.craftitem_place_item, -}) -minetest.register_craftitem(":bitumen:fuel_oil", { - description = "Fuel Oil", - inventory_image = "bitumen_fuel_oil.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - -minetest.register_craftitem(":bitumen:diesel", { - description = "Diesel", - inventory_image = "bitumen_diesel.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - -minetest.register_craftitem(":bitumen:kerosene", { - description = "Kerosene", - inventory_image = "bitumen_kerosene.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - -minetest.register_craftitem(":bitumen:gasoline", { - description = "Gasoline", - inventory_image = "bitumen_gasoline.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - -minetest.register_craftitem(":bitumen:jet_fuel", { - description = "Jet Fuel", - inventory_image = "bitumen_jet_fuel.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - -minetest.register_craftitem(":bitumen:lpg", { - description = "LPG", - inventory_image = "bitumen_lpg.png", +minetest.register_craftitem("bitumen:galv_steel_sheet", { + description = "Galvanized Steel Sheet", + inventory_image = "bitumen_galv_steel_sheet.png", on_place_on_ground = minetest.craftitem_place_item, }) - - -minetest.register_craftitem(":bitumen:lpg_regulator", { - description = "LPG Regulator", - inventory_image = "bitumen_lpg_regulator.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - --- these may need to just be tools -minetest.register_craftitem(":bitumen:small_lpg_bottle", { - description = "Small LPG Bottle", - inventory_image = "bitumen_small_lpg_bottle.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - -minetest.register_craftitem(":bitumen:gas_can", { - description = "Plastic Gas Can", - inventory_image = "bitumen_gas_can.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - - - - -minetest.register_craftitem(":bitumen:brass_ingot", { - description = "Brass Ingot", - inventory_image = "bitumen_brass_ingot.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - -minetest.register_craftitem(":bitumen:brass_dust", { - description = "Brass Dust", - inventory_image = "bitumen_brass_dust.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - -minetest.register_craftitem(":bitumen:carbon_steel_ingot", { - description = "Carbon Steel Ingot", - inventory_image = "bitumen_carbon_steel_ingot.png", - on_place_on_ground = minetest.craftitem_place_item, -}) -minetest.register_craftitem(":bitumen:carbon_steel_dust", { - description = "Carbon Steel Dust", - inventory_image = "bitumen_carbon_steel_dust.png", - on_place_on_ground = minetest.craftitem_place_item, -}) - diff --git a/crafts.lua b/crafts.lua index cbc8ae8..cd17064 100644 --- a/crafts.lua +++ b/crafts.lua @@ -187,11 +187,57 @@ minetest.register_craft({ }) minetest.register_craft({ - output = "bitumen:oil_drum 27", + output = "bitumen:oil_drum 3", recipe = { - {"default:steelblock", "default:tin_ingot", "default:steelblock"}, - {"default:steelblock", "", "default:steelblock"}, - {"default:steelblock", "default:steelblock", "default:steelblock"}, + {"default:tin_ingot", "default:tin_ingot", "default:tin_ingot"}, + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, } }) + +-- tanks +minetest.register_craft({ + output = "bitumen:galv_steel_sheet 3", + recipe = { + {"", "", ""}, + {"", "", ""}, + {"default:steel_ingot", "default:tin_ingot", "default:steel_ingot"}, + } +}) + +minetest.register_craft({ + output = "bitumen:cylinder_tank 1", + recipe = { + {"default:galv_steel_sheet", "default:galv_steel_sheet", "default:galv_steel_sheet"}, + {"default:galv_steel_sheet", "", "default:galv_steel_sheet"}, + {"default:galv_steel_sheet", "default:galv_steel_sheet", "default:galv_steel_sheet"}, + } +}) + + +minetest.register_craft({ + output = "bitumen:cylinder_tank_top 1", + recipe = { + {"", "bitumen:intake", ""}, + {"", "bitumen:cylinder_tank", ""}, + {"", "", ""}, + } +}) + +minetest.register_craft({ + output = "bitumen:cylinder_tank_bottom 1", + recipe = { + {"", "", ""}, + {"", "bitumen:cylinder_tank", ""}, + {"", "bitumen:spout", ""}, + } +}) + +minetest.register_craft({ + output = "bitumen:galv_steel_sheet 4", + type = "shapeless", + recipe = {"bitumen:cylinder_tank_cracked"}, +}) + + diff --git a/cylinder_tank.lua b/cylinder_tank.lua index 44463fb..76cf1d8 100644 --- a/cylinder_tank.lua +++ b/cylinder_tank.lua @@ -1,12 +1,63 @@ + +local function check_tank_foundation(bpos) + local meta = minetest.get_meta(bpos) + local height = meta:get_int("height") + + if height < 1 then + return + end + + local d = math.ceil(height / 5) + + return bitumen.check_foundation( + {x = bpos.x - 2, y = bpos.y - 1 - d, z = bpos.z - 2}, + {x = bpos.x + 2, y = bpos.y - 2 , z = bpos.z + 2}, + { + ["default:stone"] = 1, + ["default:desert_stone"] = 1, + ["default:steelblock"] = 1, + ["bitumen:concrete"] = 1, + } + ) +end + + +-- check poor foundation +minetest.register_abm({ + nodenames = {"bitumen:cylinder_tank_bottom"}, + interval = 30, + chance = 10, + action = function(pos) + if not check_tank_foundation(pos) then + --print("tank failure") + + local meta = minetest.get_meta(pos) + local fill = meta:get_int("fill") + local height = meta:get_int("height") + + if height < 2 then + -- no middle segments + return + end + + local fillh = math.ceil(fill / (9 * 60)) + + local y = math.random(1, fillh) + minetest.set_node({x=pos.x, y=pos.y+y, z=pos.z}, {name="bitumen:cylinder_tank_cracked"}) + + end + end +}) + + local function try_add_fluid(tpos) -- find the bottom node local tmeta = minetest.get_meta(tpos) local rbpos = tmeta:get_string("bpos") if not rbpos then - --print("no bpos") return end @@ -15,8 +66,6 @@ local function try_add_fluid(tpos) local npos = {x=tpos.x, y=tpos.y+1, z=tpos.z} local tnet = bitumen.pipes.get_net(npos) if not tnet or not tnet.fluid or tnet.fluid == "air" then - --print("no tnet") - --print(dump(tnet.fluid)) return end @@ -29,12 +78,10 @@ local function try_add_fluid(tpos) -- check for full if fill >= capacity then - --print("empty") return end if fill > 0 and fluid ~= tnet.fluid then - --print("wrong fluid to take") return end @@ -43,7 +90,6 @@ local function try_add_fluid(tpos) local taken, tfluid = bitumen.pipes.take_fluid(npos, remcap) if taken == 0 then - --print("none taken") return end @@ -54,7 +100,6 @@ local function try_add_fluid(tpos) end fill = fill + taken - --print("cyl tank fill: " .. fill .. " ("..tfluid..")") bmeta:set_int("fill", fill) end @@ -66,7 +111,6 @@ local function try_give_fluid(bpos) local npos = {x=bpos.x, y=bpos.y-1, z=bpos.z} local tnet = bitumen.pipes.get_net(npos) if not tnet then - --print("no bnet") return end @@ -78,7 +122,6 @@ local function try_give_fluid(bpos) -- check for empty if fill <= 0 or fluid == "air" then - --print("tank empty " .. fluid .. " " ..fill) return end @@ -86,12 +129,10 @@ local function try_give_fluid(bpos) local pushed = bitumen.pipes.push_fluid(npos, fluid, math.min(fill, 64), lift) if pushed == 0 then - --print("none pushed") return end fill = math.max(fill - pushed, 0) - --print("cyl tank fill: " .. fill .. " ("..fluid..") [push]") bmeta:set_int("fill", fill) end @@ -102,8 +143,6 @@ end -- tank data is stored based on the bottom position local function init_tank(tpos, bpos) - --print(dump(tpos)) - --print(dump(bpos)) local fluid = "air" local tnet = bitumen.pipes.get_net({x=tpos.x, y=tpos.y+1, z=tpos.z}) @@ -117,16 +156,16 @@ local function init_tank(tpos, bpos) }} local tmeta = minetest.get_meta(tpos) tmeta:from_table(tmetad) - --print(dump2(tmeta:to_table())) - local cap = (tpos.y - bpos.y) * 60 * 9 - --print("capacity: ".. cap) + local height = tpos.y - bpos.y + local cap = height * 60 * 9 local bmeta = minetest.get_meta(bpos) local bmetad = {fields = { capacity = cap, fill = 0, fluid = fluid, + height = height, tpos = minetest.serialize(tpos), }} bmeta:from_table(bmetad) @@ -135,6 +174,30 @@ local function init_tank(tpos, bpos) end +local function find_bottom(pos) + + local p = {x=pos.x, y=pos.y, z=pos.z} + + while 1==1 do + -- find the bottom and check the fill + + local n = minetest.get_node(p) + if n.name == "bitumen:cylinder_tank_bottom" then + return p + elseif n.name ~= "bitumen:cylinder_tank" + and n.name ~= "bitumen:cylinder_tank_cracked" + and n.name ~= "bitumen:cylinder_tank_top" + + then + return nil + end + + p.y = p.y - 1 + end + +end + + local function can_dig_tank(pos, player) --if 1==1 then return true end -- check owner @@ -145,21 +208,14 @@ local function can_dig_tank(pos, player) -- if player:get_player_name() ~= owner then -- return false -- end - - local p = {x=pos.x, y=pos.y, z=pos.z} - while 1==1 do - -- find the bottom and check the fill - local n = minetest.get_node(p) - if n.name == "bitumen:cylinder_tank_bottom" then - local meta = minetest.get_meta(p) - local fill = meta:get_int("fill") - return fill <= 0 - elseif n.name ~= "bitumen:cylinder_tank" and n.name ~= "bitumen:cylinder_tank_top" then - return true - end - - p.y = p.y - 1 + local n = find_bottom(pos) + if n == nil then + return true + else + local meta = minetest.get_meta(pos) + local fill = meta:get_int("fill") + return fill <= 0 end end @@ -177,9 +233,9 @@ minetest.register_node("bitumen:cylinder_tank", { node_box = { type = "fixed", fixed = { - { -1.5, -.5, -1.5, 1.5, .5, 1.5 }, - { -1.7, -.5, -1.2, 1.7, .5, 1.2 }, - { -1.2, -.5, -1.7, 1.2, .5, 1.7 }, + { -1.3, -.5, -1.3, 1.3, .5, 1.3 }, + { -1.5, -.5, -1.1, 1.5, .5, 1.1 }, + { -1.1, -.5, -1.5, 1.1, .5, 1.5 }, -- { -8.2, -.5, -.2, -7.8, 10, .2 }, -- { -.2, -.5, -8.2, .2, 10, -7.8 }, -- { 8.2, -.5, -.2, 7.8, 10, .2 }, @@ -189,13 +245,68 @@ minetest.register_node("bitumen:cylinder_tank", { collision_box = { type = "fixed", fixed = { - { -1.7, -.5, -1.7, 1.7, .5, 1.7 }, + { -1.5, -.5, -1.5, 1.5, .5, 1.5 }, } }, selection_box = { type = "fixed", fixed = { - { -1.7, -.5, -1.7, 1.7, .5, 1.7 }, + { -1.5, -.5, -1.5, 1.5, .5, 1.5 }, + } + }, + paramtype2 = "facedir", + groups = {cracky=1, level =2}, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) +-- local meta = minetest.get_meta(pos) +-- if placer then +-- local owner = placer:get_player_name() +-- meta:set_string("owner", owner) +-- end +-- meta:set_float("fluid_level", 0) +-- meta:set_float("capacity", math.floor(3.14159 * .75 * 9 * 9 * 9 * 64)) +-- meta:set_string("infotext", "0%") + + --bitumen.pipes.on_construct(pos) + end, + +-- on_destruct = bitumen.magic.on_destruct, + + can_dig = can_dig_tank, +}) + + + +minetest.register_node("bitumen:cylinder_tank_cracked", { + paramtype = "light", + drawtype = "nodebox", + description = "Cracked Cylinder Tank Segment", + tiles = { + "default_tin_block.png", + }, + node_box = { + type = "fixed", + fixed = { + { -1.3, -.5, -1.3, 1.3, .5, 1.3 }, + { -1.5, -.5, -1.1, 1.5, .5, 1.1 }, + { -1.1, -.5, -1.5, 1.1, .5, 1.5 }, +-- { -8.2, -.5, -.2, -7.8, 10, .2 }, +-- { -.2, -.5, -8.2, .2, 10, -7.8 }, +-- { 8.2, -.5, -.2, 7.8, 10, .2 }, +-- { -.2, -.5, 8.2, .2, 10, 7.8 }, + }, + }, + collision_box = { + type = "fixed", + fixed = { + { -1.5, -.5, -1.5, 1.5, .5, 1.5 }, + } + }, + selection_box = { + type = "fixed", + fixed = { + { -1.5, -.5, -1.5, 1.5, .5, 1.5 }, } }, paramtype2 = "facedir", @@ -232,9 +343,9 @@ minetest.register_node("bitumen:cylinder_tank_top", { node_box = { type = "fixed", fixed = { - { -1.5, -.5, -1.5, 1.5, .0, 1.5 }, - { -1.7, -.5, -1.2, 1.7, .0, 1.2 }, - { -1.2, -.5, -1.7, 1.2, .0, 1.7 }, + { -1.3, -.5, -1.3, 1.3, .0, 1.3 }, + { -1.5, -.5, -1.1, 1.5, .0, 1.1 }, + { -1.1, -.5, -1.5, 1.1, .0, 1.5 }, { -1.2, -.1, -1.2, 1.2, .2, 1.2 }, { -.7, -.1, -.7, .7, .4, .7 }, { -.1, .1, -.1, .1, .5, .1 }, @@ -243,13 +354,13 @@ minetest.register_node("bitumen:cylinder_tank_top", { collision_box = { type = "fixed", fixed = { - { -1.7, -.5, -1.7, 1.7, .5, 1.7 }, + { -1.5, -.5, -1.5, 1.5, .5, 1.5 }, } }, selection_box = { type = "fixed", fixed = { - { -1.7, -.5, -1.7, 1.7, .5, 1.7 }, + { -1.5, -.5, -1.5, 1.5, .5, 1.5 }, } }, paramtype2 = "facedir", @@ -309,31 +420,31 @@ minetest.register_node("bitumen:cylinder_tank_bottom", { node_box = { type = "fixed", fixed = { - { -1.5, .0, -1.5, 1.5, .5, 1.5 }, - { -1.7, .0, -1.2, 1.7, .5, 1.2 }, - { -1.2, .0, -1.7, 1.2, .5, 1.7 }, - { -1.2, -.2, -1.2, 1.2, .1, 1.2 }, + { -1.3, .0, -1.3, 1.3, .5, 1.3 }, + { -1.5, .0, -1.1, 1.5, .5, 1.1 }, + { -1.1, .0, -1.5, 1.1, .5, 1.5 }, + { -1.0, -.2, -1.0, 1.0, .1, 1.0 }, { -.7, -.4, -.7, .7, .1, .7 }, { -.1, -.5, -.1, .1, .1, .1 }, -- legs - { -1.4, -1.55, -1.4, -1.3, 0, -1.3 }, - { 1.3, -1.55, -1.4, 1.4, 0, -1.3 }, - { -1.4, -1.55, 1.3, -1.3, 0, 1.4 }, - { 1.3, -1.55, 1.3, 1.4, 0, 1.4 }, + { -1.25, -1.55, -1.25, -1.15, 0, -1.15 }, + { 1.15, -1.55, -1.15, 1.25, 0, -1.25 }, + { -1.25, -1.55, 1.15, -1.15, 0, 1.25 }, + { 1.15, -1.55, 1.15, 1.25, 0, 1.25 }, }, }, collision_box = { type = "fixed", fixed = { - { -1.7, -.5, -1.7, 1.7, .5, 1.7 }, + { -1.5, -.5, -1.5, 1.5, .5, 1.5 }, } }, selection_box = { type = "fixed", fixed = { - { -1.7, -.5, -1.7, 1.7, .5, 1.7 }, + { -1.5, -.5, -1.5, 1.5, .5, 1.5 }, } }, paramtype2 = "facedir", @@ -402,13 +513,47 @@ minetest.register_abm({ ---[[ -minetest.register_craft({ - output = 'bitumen:sphere_tank_constructor', - recipe = { - {'default:steelblock', 'default:steelblock', 'default:steelblock'}, - {'default:steelblock', 'vessels:steel_bottle', 'default:steelblock'}, - {'default:steelblock', 'default:steelblock', 'default:steelblock'}, - } + +-- leaking +minetest.register_abm({ + nodenames = {"bitumen:cylinder_tank_cracked"}, + interval = 10, + chance = 5, + action = function(pos, node, active_object_count, active_object_count_wider) + + local p = find_bottom(pos) + if p == nil then + return + end + + local meta = minetest.get_meta(p) + local fill = meta:get_int("fill") + + local fillh = math.ceil(fill / (9 * 60)) + local dh = pos.y - p.y + -- fill level is below the crack + if fillh < dh then + return + end + + -- choose a random place to leak + local airs = minetest.find_nodes_in_area({x=p.x-2, y=pos.y-1, z=pos.z-2}, {x=p.x+2, y=pos.y, z=pos.z+2}, {"air"}) + if not airs then + return + end + + local ap = airs[math.random(#airs)] + local l = math.min(fill, math.min(64, math.random(5, 30))) + + local fluid = meta:get_string("fluid") + minetest.set_node(ap, {name=fluid}) + minetest.set_node_level(ap, l) + + meta:set_int("fill", fill - l) + + end, }) -]] + + + + diff --git a/init.lua b/init.lua index 434673d..a4e405b 100644 --- a/init.lua +++ b/init.lua @@ -41,7 +41,46 @@ end +local function vmin(a, b) + return { + x = math.min(a.x, b.x), + y = math.min(a.y, b.y), + z = math.min(a.z, b.z), + } +end +local function vmax(a, b) + return { + x = math.max(a.x, b.x), + y = math.max(a.y, b.y), + z = math.max(a.z, b.z), + } +end + +bitumen.check_foundation = function(p1, p2, accept) + local low = vmin(p1, p2) + local high = vmax(p1, p2) + + --print(dump(low) .. "\n" .. dump(high)) + for x = low.x, high.x do + for y = low.y, high.y do + for z = low.z, high.z do + local n = minetest.get_node({x=x, y=y, z=z}) + if accept[n.name] == nil then + return false + end + end + end + end + + return true +end + + + + + -- first initialize the internal APIs +dofile(modpath.."/craftitems.lua") dofile(modpath.."/magic_nodes.lua") dofile(modpath.."/blueprints.lua") dofile(modpath.."/pipes.lua") @@ -63,6 +102,13 @@ dofile(modpath.."/cylinder_tank.lua") dofile(modpath.."/sphere_tank.lua") dofile(modpath.."/refinery.lua") + + +----------------------------------- +-- -- +-- * * * * * LOOK HERE * * * * * -- +-- -- +----------------------------------- -- where players should look for information dofile(modpath.."/crafts.lua") dofile(modpath.."/ore_gen.lua") @@ -96,6 +142,14 @@ minetest.register_node("bitumen:glass", { end, }) + + + + + + +-- igore this; test for structure algorithm + local support = {} minetest.register_abm({ diff --git a/sphere_tank.lua b/sphere_tank.lua index f2d3958..c9a02ac 100644 --- a/sphere_tank.lua +++ b/sphere_tank.lua @@ -1,37 +1,6 @@ -local function vmin(a, b) - return { - x = math.min(a.x, b.x), - y = math.min(a.y, b.y), - z = math.min(a.z, b.z), - } -end -local function vmax(a, b) - return { - x = math.max(a.x, b.x), - y = math.max(a.y, b.y), - z = math.max(a.z, b.z), - } -end -local function check_foundation(p1, p2, accept) - local low = vmin(p1, p2) - local high = vmax(p1, p2) - print(dump(low) .. "\n" .. dump(high)) - for x = low.x, high.x do - for y = low.y, high.y do - for z = low.z, high.z do - local n = minetest.get_node({x=x, y=y, z=z}) - if accept[n.name] == nil then - return false - end - end - end - end - - return true -end @@ -74,7 +43,7 @@ minetest.register_node("bitumen:sphere_tank_constructor", { if fields.build then -- tanks can only be built on thick foundations - local ret = check_foundation( + local ret = bitumen.check_foundation( {x = pos.x - 9, y = pos.y - 3, z = pos.z - 9}, {x = pos.x + 9, y = pos.y - 1, z = pos.z + 9}, { diff --git a/textures/bitumen_galv_steel_sheet.png b/textures/bitumen_galv_steel_sheet.png new file mode 100644 index 0000000..6200b75 Binary files /dev/null and b/textures/bitumen_galv_steel_sheet.png differ