diff --git a/burner.lua b/burner.lua new file mode 100644 index 0000000..ee918e3 --- /dev/null +++ b/burner.lua @@ -0,0 +1,161 @@ + + + + +bitumen.burners = {} + + + +local function grab_fuel(inv) + + local list = inv:get_list("fuel") + for i,st in ipairs(list) do + print(st:get_name()) + local fuel, remains + fuel, remains = minetest.get_craft_result({ + method = "fuel", + width = 1, + items = { + ItemStack(st:get_name()) + }, + }) + + if fuel.time > 0 then + -- Take fuel from fuel list + st:take_item() + inv:set_stack("fuel", i, st) + + return fuel.time + end + end + + return 0 -- no fuel found +end + + +bitumen.register_burner = function(nodes, callbacks) + local default_callbacks = { + grab_fuel = grab_fuel, -- needs to return the fuel time + start_cook = function() end, -- needs to return the cook time + finish_cook = function() end, + abort_cook = function() end, + get_formspec_on = bitumen.get_melter_active_formspec, + turn_on = function() end, + turn_off = function() end, + } + + for k,v in pairs(callbacks) do + default_callbacks[k] = v + end + + for _,n in ipairs(nodes) do + print("setting burner: "..n) + bitumen.burners[n] = default_callbacks + end +end + + + +bitumen.burner_on_timer = function(pos, elapsed) + + local posnode = minetest.get_node(pos) + local fns = bitumen.burners[posnode.name] + if fns == nil then + return false + end + + + local meta = minetest.get_meta(pos) + local fuel_time = meta:get_float("fuel_time") or 0 + local fuel_burned = meta:get_float("fuel_burned") or 0 + local cook_time = meta:get_float("cook_time") or 0 + local cook_burned = meta:get_float("cook_burned") or 0 + + local inv = meta:get_inventory() + + local burned = elapsed + local turn_off = false + + +-- print("\n\naf timer") +--/ print("fuel_burned: " .. fuel_burned) +-- print("fuel_time: " .. fuel_time) + + + if fuel_time > 0 and fuel_burned + elapsed < fuel_time then + -- still good on fuel + fuel_burned = fuel_burned + elapsed + meta:set_float("fuel_burned", fuel_burned + elapsed) + else + local t = fns.grab_fuel(inv) + if t <= 0 then -- out of fuel + --print("out of fuel") + meta:set_float("fuel_time", 0) + meta:set_float("fuel_burned", 0) + + burned = fuel_time - fuel_burned + + turn_off = true + else + -- check if the machine is turning on + if fuel_time == 0 then + fns.turn_on(pos, meta, inv) + end + + -- roll into the next period + fuel_burned = elapsed - (fuel_time - fuel_burned) + fuel_time = t + + meta:set_float("fuel_time", fuel_time) + meta:set_float("fuel_burned", fuel_burned) + end + end + + + --print("cooktime " .. cook_time) + --print("cookburned " .. cook_burned) + if cook_time == 0 then -- nothing cooking atm + --print("fueltime " .. fuel_time) + --print("turnoff " .. dump(turn_off)) + if fuel_time ~= 0 and turn_off == false then -- should we start to cook? + cook_time = fns.start_cook(pos, meta, inv) + meta:set_float("cook_time", cook_time) + meta:set_float("cook_burned", 0) + else + -- no fuel + end + else -- continue cooking + cook_burned = cook_burned + burned + if cook_burned >= cook_time then -- cooking finished + fns.finish_cook(pos, met, inv) + + local new_cook_time = fns.start_cook(pos, meta, inv) + meta:set_float("cook_time", new_cook_time) + cook_burned = cook_burned - cook_time + end + meta:set_float("cook_burned", cook_burned) + end + + + + if turn_off then + fns.turn_off(pos) + return false + end + + fuel_pct = math.floor((fuel_burned * 100) / fuel_time) + meta:set_string("formspec", fns.get_formspec_on(fuel_pct, 0)) + meta:set_string("infotext", "Fuel: " .. fuel_pct) + + return true +end + + + + + + + + + + diff --git a/heater.lua b/heater.lua new file mode 100644 index 0000000..9332087 --- /dev/null +++ b/heater.lua @@ -0,0 +1,136 @@ + + + +local function swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) +end + + + +minetest.register_craftitem("bitumen:heat", { + description = "Heat", + stack_max = 100, + inventory_image = "bitumen_heat.png", + groups = {flammable = 3}, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "bitumen:heat", + burntime = 10, +}) + + +minetest.register_node("bitumen:heater", { + description = "Heater", + tiles = { + "default_bronze_block.png", "default_bronze_block.png", + "default_bronze_block.png", "default_bronze_block.png", + "default_bronze_block.png", "default_furnace_front.png", + }, + paramtype2 = "facedir", + groups = {cracky=2, petroleum_fixture=1}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + + on_punch = function(pos) + swap_node(pos, "bitumen:heater_on") + end, +}) + + +minetest.register_node("bitumen:heater_on", { + description = "Heater (Active)", + tiles = { + "default_tin_block.png", "default_bronze_block.png", + "default_bronze_block.png", "default_tin_block.png", + "default_tin_block.png", + { + image = "default_furnace_front_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + } + }, + paramtype2 = "facedir", + groups = {cracky=2, petroleum_fixture=1, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + + on_punch = function(pos) + swap_node(pos, "bitumen:heater") + end, +}) + + + + + +minetest.register_abm({ + nodenames = {"bitumen:heater_on"}, + interval = 1, + chance = 1, + action = function(pos) + + local apos = {x=pos.x, y=pos.y + 1, z=pos.z} + local anode = minetest.get_node(apos) + if anode.name == "air" then + -- print("air above") + return + end + + local ameta = minetest.get_meta(apos) + local ainv = ameta:get_inventory() + if ainv:get_size("fuel") <= 0 then + -- print("no fuel inv") + return + end + + if ainv:contains_item("fuel", "bitumen:heat 2") then + -- print("fuel full") + return -- still full + end + + local node = minetest.get_node(pos) + local back_dir = minetest.facedir_to_dir(node.param2) + local backpos = vector.add(pos, back_dir) + local backnet = bitumen.pipes.get_net(backpos) + if backnet == nil then + -- print("no network") + return + end + + local max_amount = 1 + + local taken, fluid = bitumen.pipes.take_fluid(backpos, max_amount) + -- print("taken " .. fluid .. " " .. taken) + local heat = bitumen.fluid_to_heat(fluid, taken) + ainv:add_item("fuel", "bitumen:heat ".. math.floor(heat+.5)) +-- print("") + + -- print("added heat ".. heat) + end +}) + + + + +minetest.register_craft({ + output = "bitumen:heater", + recipe = { + {"default:tin_ingot", "default:furnace", "default:tin_ingot"}, + {"default:tin_ingot", "default:tin_ingot", "default:tin_ingot"}, + {"default:tin_ingot", "default:tin_ingot", "default:tin_ingot"}, + } +}) + + diff --git a/init.lua b/init.lua index d0d5817..759f8f7 100644 --- a/init.lua +++ b/init.lua @@ -1,9 +1,49 @@ local modpath = minetest.get_modpath("bitumen") -bitumen ={} +bitumen = {} + +-- coal = 38 +-- crude 44 +bitumen.energy_density = { + tar = 20, + heavy_oil = 25, + light_oil = 30, + diesel = 36, + kerosene = 38, + gasoline = 34, + mineral_spirits = 42, + lpg = 45, + + ["bitumen:tar"] = 20, + ["bitumen:heavy_oil"] = 25, + ["bitumen:light_oil"] = 30, + ["bitumen:diesel"] = 36, + ["bitumen:kerosene"] = 38, + ["bitumen:gasoline"] = 34, + ["bitumen:mineral_spirits"] = 42, + ["bitumen:lpg"] = 45, +} + + +-- a coal lump burns for 40 seconds +-- a bitumen:heat burns for 10 seconds +-- multiply the energy density by this factor to find the number of bitumen:heats +bitumen.coal_equivalency = .1 + +bitumen.fluid_to_heat = function(fluid, amount) + local d = bitumen.energy_density[fluid] + if d == nil then + return 0 + end + + return bitumen.coal_equivalency * d * amount +end + + -- first, to initialize the pipe API dofile(modpath.."/pipes.lua") +dofile(modpath.."/burner.lua") dofile(modpath.."/fluids.lua") @@ -12,6 +52,7 @@ dofile(modpath.."/fluids.lua") --dofile(modpath.."/pumping.lua") +dofile(modpath.."/heater.lua") dofile(modpath.."/pump.lua") dofile(modpath.."/oilshale.lua") dofile(modpath.."/wells.lua") diff --git a/oilshale.lua b/oilshale.lua index 78ae4e3..69aa0b0 100644 --- a/oilshale.lua +++ b/oilshale.lua @@ -155,129 +155,6 @@ end -bitumen.burners = {} - -bitumen.register_burner = function(nodes, callbacks) - local default_callbacks = { - grab_fuel = grab_fuel, -- needs to return the fuel time - start_cook = function() end, -- needs to return the cook time - finish_cook = function() end, - abort_cook = function() end, - get_formspec_on = get_melter_active_formspec, - turn_on = function() end, - turn_off = function() end, - } - - for k,v in pairs(callbacks) do - default_callbacks[k] = v - end - - for _,n in ipairs(nodes) do - print("setting burner: "..n) - bitumen.burners[n] = default_callbacks - end -end - - - -bitumen.burner_on_timer = function(pos, elapsed) - - local posnode = minetest.get_node(pos) - local fns = bitumen.burners[posnode.name] - if fns == nil then - return false - end - - - local meta = minetest.get_meta(pos) - local fuel_time = meta:get_float("fuel_time") or 0 - local fuel_burned = meta:get_float("fuel_burned") or 0 - local cook_time = meta:get_float("cook_time") or 0 - local cook_burned = meta:get_float("cook_burned") or 0 - - local inv = meta:get_inventory() - - local burned = elapsed - local turn_off = false - - --- print("\n\naf timer") ---/ print("fuel_burned: " .. fuel_burned) --- print("fuel_time: " .. fuel_time) - - - if fuel_time > 0 and fuel_burned + elapsed < fuel_time then - -- still good on fuel - fuel_burned = fuel_burned + elapsed - meta:set_float("fuel_burned", fuel_burned + elapsed) - else - local t = fns.grab_fuel(inv) - if t <= 0 then -- out of fuel - --print("out of fuel") - meta:set_float("fuel_time", 0) - meta:set_float("fuel_burned", 0) - - burned = fuel_time - fuel_burned - - turn_off = true - else - -- check if the machine is turning on - if fuel_time == 0 then - fns.turn_on(pos, meta, inv) - end - - -- roll into the next period - fuel_burned = elapsed - (fuel_time - fuel_burned) - fuel_time = t - - meta:set_float("fuel_time", fuel_time) - meta:set_float("fuel_burned", fuel_burned) - end - end - - - --print("cooktime " .. cook_time) - --print("cookburned " .. cook_burned) - if cook_time == 0 then -- nothing cooking atm - --print("fueltime " .. fuel_time) - --print("turnoff " .. dump(turn_off)) - if fuel_time ~= 0 and turn_off == false then -- should we start to cook? - cook_time = fns.start_cook(pos, meta, inv) - meta:set_float("cook_time", cook_time) - meta:set_float("cook_burned", 0) - else - -- no fuel - end - else -- continue cooking - cook_burned = cook_burned + burned - if cook_burned >= cook_time then -- cooking finished - fns.finish_cook(pos, met, inv) - - local new_cook_time = fns.start_cook(pos, meta, inv) - meta:set_float("cook_time", new_cook_time) - cook_burned = cook_burned - cook_time - end - meta:set_float("cook_burned", cook_burned) - end - - - - if turn_off then - fns.turn_off(pos) - return false - end - - fuel_pct = math.floor((fuel_burned * 100) / fuel_time) - meta:set_string("formspec", fns.get_formspec_on(fuel_pct, 0)) - meta:set_string("infotext", "Fuel: " .. fuel_pct) - - return true -end - - - - - diff --git a/pump.lua b/pump.lua index 9f7ffc6..e6739b8 100644 --- a/pump.lua +++ b/pump.lua @@ -51,6 +51,8 @@ minetest.register_node("bitumen:pump", { --bitumen.pipes.on_construct(pos) end, + + --[[ not working, apparently due to an "undocumented feature" in the engine ;) on_receive_fields = function(pos, form, fields, player) local meta = minetest:get_meta(pos) local mf = meta:get_string("formspec") @@ -70,6 +72,7 @@ minetest.register_node("bitumen:pump", { minetest.show_formspec(player:get_player_name(), "", pump_formspec_on) end end, + ]] on_punch = function(pos) swap_node(pos, "bitumen:pump_on") @@ -78,45 +81,6 @@ minetest.register_node("bitumen:pump", { -minetest.register_abm({ - nodenames = {"bitumen:pump"}, - interval = 1, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local node = minetest.get_node(pos) - - local back_dir = minetest.facedir_to_dir(node.param2) - local backpos = vector.add(pos, back_dir) - local backnet = bitumen.pipes.get_net(backpos) - if backnet == nil then - print("pump no backnet at "..minetest.pos_to_string(backpos)) - return - end - - local front_dir = vector.multiply(back_dir, -1) - local frontpos = vector.add(pos, front_dir) - local frontnet = bitumen.pipes.get_net(frontpos) - if frontnet == nil then - print("pump no frontnet at "..minetest.pos_to_string(frontpos)) - return - end - - if backnet.fluid ~= frontnet.fluid and backnet.fluid ~= "air" then - print("pump: bad_fluid") - return -- incompatible fluids - end - - local lift = 25 - - local taken, fluid = bitumen.pipes.take_fluid(frontpos, 20) - local pushed = bitumen.pipes.push_fluid(backpos, fluid, taken, lift) - print("pumped " ..pushed) - - if pushed < taken then - print("pump leaked ".. (taken - pushed)) - end - end -}) minetest.register_node("bitumen:pump_on", { description = "Pump (Active)", @@ -136,6 +100,7 @@ minetest.register_node("bitumen:pump_on", { --bitumen.pipes.on_construct(pos) end, + --[[ not working, apparently due to an "undocumented feature" in the engine ;) on_receive_fields = function(pos, form, fields, player) if fields.stop then print("stop") @@ -146,8 +111,62 @@ minetest.register_node("bitumen:pump_on", { minetest.show_formspec(player:get_player_name(), "", pump_formspec) end end, - + ]] + on_punch = function(pos) swap_node(pos, "bitumen:pump") end, }) + + + + + + + + +minetest.register_abm({ + nodenames = {"bitumen:pump_on"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local node = minetest.get_node(pos) + + local back_dir = minetest.facedir_to_dir(node.param2) + local backpos = vector.add(pos, back_dir) + local backnet = bitumen.pipes.get_net(backpos) + if backnet == nil then + -- print("pump no backnet at "..minetest.pos_to_string(backpos)) + return + end + + local front_dir = vector.multiply(back_dir, -1) + local frontpos = vector.add(pos, front_dir) + local frontnet = bitumen.pipes.get_net(frontpos) + if frontnet == nil then + -- print("pump no frontnet at "..minetest.pos_to_string(frontpos)) + return + end + + if backnet.fluid ~= frontnet.fluid and backnet.fluid ~= "air" then + -- print("pump: bad_fluid") + return -- incompatible fluids + end + + local lift = 25 + --print("fpos ".. minetest.pos_to_string(frontpos) .. " | bpos "..minetest.pos_to_string(backpos)) + --print("fp ".. frontnet.in_pressure .. " | bp "..backnet.in_pressure) + local taken, fluid = bitumen.pipes.take_fluid(frontpos, 20) + local pushed = bitumen.pipes.push_fluid(backpos, fluid, taken, lift) + --print("pumped " ..taken .. " > "..pushed) + + if pushed < taken then + --print("pump leaked ".. (taken - pushed)) + end + + --print("") + end +}) + + + diff --git a/refinery.lua b/refinery.lua index 2d1f7fd..791f0d2 100644 --- a/refinery.lua +++ b/refinery.lua @@ -309,15 +309,6 @@ bitumen.distillation_yield = { -bitumen.energy_density = { - lpg = { 33 }, - jet_fuel = { 40 }, - gasoline = { 30 }, - diesel = { 25 }, - fuel_oil = { 18 }, - lube_oil = { 12 }, - synth_crude = { 10 } -} diff --git a/sphere_tank.lua b/sphere_tank.lua index 5656110..31061c9 100644 --- a/sphere_tank.lua +++ b/sphere_tank.lua @@ -242,6 +242,7 @@ minetest.register_node("bitumen:sphere_tank", { 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%") set_magic_collision_nodes(pos, gensphere({0, 11, 0}, 9.99)) @@ -292,16 +293,16 @@ minetest.register_abm({ local meta = minetest.get_meta(pos) local fluid = meta:get_string("fluid") or "air" - local capacity = meta:get_float("capacity") or 1000 + local capacity = meta:get_float("capacity") or 109000 local fill = meta:get_float("fill_level") or 0 - meta:set_float("capacity", 1000) --- print("tank fill: ".. fill .. " " ..capacity ) + -- print("tank fill: ".. fill .. " " ..capacity ) local rem_capacity = capacity - fill local can_change = fill <= 0.01 local pres = (fill / capacity) * 20 -- the tank is roughly 20 nodes tall, nevermind the sphere part - - local delta, new_fluid = bitumen.pipes.buffer(pos, fluid, pres, fill, rem_capacity, can_change) + local cap_take = math.min(rem_capacity, 60) + + local delta, new_fluid = bitumen.pipes.buffer(pos, fluid, pres, fill, cap_take, can_change) -- print("delta ".. delta .. " " .. new_fluid) if delta > 0.01 or delta < -0.01 then diff --git a/textures/bitumen_heat.png b/textures/bitumen_heat.png new file mode 100644 index 0000000..0be6fcb Binary files /dev/null and b/textures/bitumen_heat.png differ