fluids, spills, and intake bug fixes

gasoline-powered pump
better pump textures
master
Izzy 2020-04-17 11:46:57 -06:00
parent 6678ba4e8f
commit 32d204111c
9 changed files with 228 additions and 11 deletions

View File

@ -15,5 +15,11 @@ minetest.register_craftitem("bitumen:galv_steel_sheet", {
})
minetest.register_craftitem("bitumen:gas_engine", {
description = "Gasoline Engine",
inventory_image = "bitumen_gasoline_engine.png",
})

View File

@ -32,6 +32,21 @@ minetest.register_craft({
},
})
minetest.register_craft({
output = "bitumen:pump_gas 1",
type = "shapeless",
recipe = {"bitumen:pump", "bitumen:gas_engine"},
})
minetest.register_craft({
output = "bitumen:gas_engine 1",
recipe = {
{"", "", ""},
{"default:steel_ingot", "", "default:steel_ingot"},
{"", "default:steelblock", ""},
},
})
-- drilling

View File

@ -182,7 +182,7 @@ minetest.register_abm({
if ym.name == "air" then
local nb = {}
print("air below")
-- print("air below")
for _,p in ipairs(npos) do
local n = minetest.get_node(p)

View File

@ -528,8 +528,9 @@ minetest.register_abm({
local take = math.max(0, math.min(ulevel, cap - pnet.buffer))
pnet.buffer = pnet.buffer + take
--print("intake took "..take.. " water")
if ulevel - rate > 0 then
minetest.set_node_level(pos, ulevel - take)
local nl = math.floor(ulevel - take + 0.5)
if nl > 0 then
minetest.set_node_level(pos, nl)
else
minetest.set_node(pos, {name = "air"})
end

202
pump.lua
View File

@ -38,7 +38,11 @@ end
minetest.register_node("bitumen:pump", {
description = "Pump",
drawtype = "normal",
tiles = {"default_steel_block.png"},
tiles = {
"default_steel_block.png^bitumen_arrow.png^[transformR90", "default_steel_block.png^bitumen_arrow.png^[transformR270",
"default_steel_block.png^bitumen_arrow.png", "default_steel_block.png^bitumen_arrow.png^[transformR180",
"default_copper_block.png", "default_tin_block.png",
},
is_ground_content = false,
paramtype2 = "facedir",
groups = {cracky = 1, petroleum_fixture=1, oddly_breakable_by_hand = 3},
@ -85,7 +89,11 @@ minetest.register_node("bitumen:pump", {
minetest.register_node("bitumen:pump_on", {
description = "Pump (Active)",
drawtype = "normal",
tiles = {"default_tin_block.png"},
tiles = {
"default_steel_block.png^bitumen_arrow_yellow.png^[transformR90", "default_steel_block.png^bitumen_arrow_yellow.png^[transformR270",
"default_steel_block.png^bitumen_arrow_yellow.png", "default_steel_block.png^bitumen_arrow_yellow.png^[transformR180",
"default_copper_block.png", "default_tin_block.png",
},
is_ground_content = false,
paramtype2 = "facedir",
groups = {cracky = 1, petroleum_fixture=1, oddly_breakable_by_hand = 3, --[[not_in_creaetive_inventory=1]]},
@ -120,11 +128,6 @@ minetest.register_node("bitumen:pump_on", {
minetest.register_abm({
nodenames = {"bitumen:pump_on"},
interval = 1,
@ -177,3 +180,188 @@ minetest.register_abm({
-- gas-powered pump
minetest.register_node("bitumen:pump_gas", {
description = "Gas-powered Pump",
drawtype = "normal",
tiles = {
"default_steel_block.png^default_obsidian_glass.png^bitumen_arrow.png^[transformR90", "default_steel_block.png^default_obsidian_glass.png^bitumen_arrow.png^[transformR270",
"default_steel_block.png^default_obsidian_glass.png^bitumen_arrow.png", "default_steel_block.png^default_obsidian_glass.png^bitumen_arrow.png^[transformR180",
"default_copper_block.png^default_obsidian_glass.png", "default_tin_block.png^default_obsidian_glass.png",
},
is_ground_content = false,
paramtype2 = "facedir",
groups = {cracky = 1, petroleum_fixture=1, oddly_breakable_by_hand = 3},
sounds = default.node_sound_glass_defaults(),
on_place = minetest.rotate_node,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", pump_formspec)
--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")
print(dump(mf).."\n")
if fields.start then
print("start")
swap_node(pos, "bitumen:pump_on")
-- refetch the meta after the node swap just to be sure
local meta = minetest:get_meta(pos)
meta:set_string("formspec", "")
meta:set_string("formspec", pump_formspec_on)
local mf = meta:get_string("formspec")
print(dump(mf))
minetest.show_formspec(player:get_player_name(), "", pump_formspec_on)
end
end,
]]
on_punch = function(pos)
swap_node(pos, "bitumen:pump_gas_on")
end,
})
minetest.register_node("bitumen:pump_gas_on", {
description = "Gas-powered Pump (Active)",
drawtype = "normal",
tiles = {
"default_steel_block.png^default_obsidian_glass.png^bitumen_arrow_yellow.png^[transformR90", "default_steel_block.png^default_obsidian_glass.png^bitumen_arrow_yellow.png^[transformR270",
"default_steel_block.png^default_obsidian_glass.png^bitumen_arrow_yellow.png", "default_steel_block.png^default_obsidian_glass.png^bitumen_arrow_yellow.png^[transformR180",
"default_copper_block.png^default_obsidian_glass.png", "default_tin_block.png^default_obsidian_glass.png",
},
is_ground_content = false,
paramtype2 = "facedir",
groups = {cracky = 1, petroleum_fixture=1, oddly_breakable_by_hand = 3, --[[not_in_creaetive_inventory=1]]},
sounds = default.node_sound_glass_defaults(),
on_place = minetest.rotate_node,
drop = "bitumen:pump_gas",
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", pump_formspec_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")
swap_node(pos, {name="bitumen:pump"})
local meta = minetest:get_meta(pos)
meta:set_string("formspec", pump_formspec)
minetest.show_formspec(player:get_player_name(), "", pump_formspec)
end
end,
]]
on_punch = function(pos)
swap_node(pos, "bitumen:pump_gas")
end,
})
minetest.register_abm({
nodenames = {"bitumen:pump_gas_on"},
interval = 1,
chance = 1,
action = function(pos)
local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos)
local fuel = meta:get_int("fuel")
-- print("pump fuel "..fuel)
if fuel <= 0 then
local below = {x=pos.x, y=pos.y-1, z=pos.z}
local bnode = minetest.get_node(below)
if bnode.name == "bitumen:oil_drum" then
local bmeta = minetest.get_meta(below)
local fluid = bmeta:get_string("fluid")
if fluid == "bitumen:gasoline" then
local fill = bmeta:get_int("fill")
print("pump fill "..fill)
if fill >= 1 then
fill = fill - 1
bmeta:set_int("fill", fill)
local max_fill = bmeta:get_int("maxfill")
bmeta:set_string("infotext", fluid .." (".. math.floor(((fill*100)/max_fill)+0.5) .."%)")
fuel = 60
end
end
end
end
if fuel <= 0 then
-- minetest.set_node(pos, {name="bitumen:pump_gas"})
print("pump out of gas " .. fuel)
swap_node(pos, "bitumen:pump_gas")
return
else
fuel = fuel - 1
meta:set_int("fuel", fuel)
end
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("bpump 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("bpump no frontnet at "..minetest.pos_to_string(frontpos))
return
end
if backnet.fluid ~= frontnet.fluid and backnet.fluid ~= "air" then
print("bpump: bad_fluid")
return -- incompatible fluids
end
local lift = 50
--print("fpos ".. minetest.pos_to_string(frontpos) .. " | bpos "..minetest.pos_to_string(backpos))
--print("fp ".. frontnet.in_pressure .. " | bp "..backnet.in_pressure)
-- HACK: hardcoded buffer amount
local to_take = 64 - backnet.buffer
if to_take <= 0 then
-- print("pump: output pipe full")
return
end
local taken, fluid = bitumen.pipes.take_fluid(frontpos, to_take)
local pushed = bitumen.pipes.push_fluid(backpos, fluid, taken, lift)
-- print("bitumen pumped " ..taken .. " > "..pushed)
if pushed < taken then
print("bitumen pump leaked ".. (taken - pushed) .. " at " ..pos.x..","..pos.y..","..pos.z)
end
--print("")
end
})

View File

@ -429,7 +429,14 @@ minetest.register_abm({
-- print(dump2(x).. " -> " ..dump2(bnode.name))
else
local lvl = minetest.get_node_level(pos)
minetest.set_node_level(pos, math.max(0, lvl - 10))
local nl = math.max(0, lvl - 10)
if nl == 0 then
minetest.set_node(pos, {name="air"})
else
minetest.set_node_level(pos, nl)
end
minetest.set_node(bp, {name=x})
return

BIN
textures/bitumen_arrow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 419 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 485 B