beginning of well pumping and forceloading

master
Izzy 2018-07-07 00:55:38 -06:00
parent ac2b0f1b13
commit c38e4ad1f6
3 changed files with 305 additions and 32 deletions

View File

@ -3,7 +3,7 @@
-- pipes
minetest.register_craft({
output = "bitumen:pipe 6",
output = "bitumen:pipe 12",
recipe = {
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
{"", "", ""},
@ -28,7 +28,7 @@ minetest.register_craft({
-- drilling
minetest.register_craft({
output = 'bitumen:drill_pipe 6',
output = 'bitumen:drill_pipe 12',
recipe = {
{'', 'default:steel_ingot', ''},
{'', 'default:steel_ingot', ''},

View File

@ -460,7 +460,7 @@ minetest.register_node("bitumen:intake", {
if found_net == 0 then
local hash = minetest.hash_node_position(pos)
local net = new_network(pos)
net.in_pressure = pos.z
net.in_pressure = pos.y
net.inputs[hash] = 1
end

331
wells.lua
View File

@ -127,6 +127,106 @@ minetest.register_node("bitumen:well_siphon", {
})
local function pushpos(t, v, p)
local h = minetest.hash_node_position(p)
if v[h] == nil then
table.insert(t, p)
end
end
local function find_blob_extent(startpos)
local blob = {}
local stack = {}
local visited = {}
local future = {}
-- local shell = {}
local node = minetest.get_node(startpos)
if node.name == "air" then
return nil
end
local bname = node.name
table.insert(stack, startpos)
while #stack > 0 do
local p = table.remove(stack)
local ph = minetest.hash_node_position(p)
--print("visiting "..minetest.pos_to_string(p))
if p.x < startpos.x - 50
or p.x > startpos.x + 50
or p.y < startpos.y - 50
or p.y > startpos.y + 50
or p.z < startpos.z - 50
or p.z > startpos.z + 50
then
print("got to extent")
visited[ph] = 1
end
if visited[ph] == nil then
print("visiting "..minetest.pos_to_string(p))
local pn = minetest.get_node(p)
if pn then
if pn.name == "bitumen:crude_oil" or pn.name == "bitumen:crude_oil_full" then
blob[ph] = {x=p.x, y=p.y, z=p.z}
pushpos(stack, visited, {x=p.x+1, y=p.y, z=p.z})
pushpos(stack, visited, {x=p.x-1, y=p.y, z=p.z})
pushpos(stack, visited, {x=p.x, y=p.y+1, z=p.z})
pushpos(stack, visited, {x=p.x, y=p.y-1, z=p.z})
pushpos(stack, visited, {x=p.x, y=p.y, z=p.z+1})
pushpos(stack, visited, {x=p.x, y=p.y, z=p.z-1})
visited[ph] = 1
elseif pn.name == "ignore" then
if minetest.forceload_block(p, false) then
print("forceload successful: ".. minetest.pos_to_string(p))
else
print("forceload failed: ".. minetest.pos_to_string(p))
end
table.insert(future, p)
end
else
print("failed to get node")
end
end
end
for _,p in pairs(blob) do
print("blob "..minetest.pos_to_string(p))
end
-- for n,v in pairs(shell) do
-- print("shell "..n.." - ".. v)
-- end
return blob--, shell
end
local function forceload_deposit(pos)
-- minetest.emerge_area(dp, {x=dp.x, y=dp.y - 20, z=dp.z})
find_blob_extent(pos)
end
local function drill(pos)
local meta = minetest.get_meta(pos)
@ -206,6 +306,8 @@ minetest.register_node("bitumen:drill_controls", {
cmd = "retract"
elseif fields.stop then
cmd = "stop"
elseif fields.pump then
cmd = "pump"
elseif fields.up then
cmd = "up"
elseif fields.down then
@ -400,7 +502,7 @@ minetest.register_node("bitumen:drill_rig", {
bitumen.magic.set_nodes(pos, "bitumen:drill_pipe_chest", {pipe_chest_delta})
bitumen.magic.set_nodes(pos, "bitumen:drill_mud_injector", {mud_injector_delta})
bitumen.magic.set_nodes(pos, "bitumen:drill_mud_extractor", {mud_extractor_delta})
local function add(p, d)
return {x=p.x + d[1], y=p.y + d[2], z=p.z + d[3]}
end
@ -413,6 +515,26 @@ minetest.register_node("bitumen:drill_rig", {
}
local pcmeta = minetest.get_meta(altnodes.pipe_chest)
local pcinv = pcmeta:get_inventory()
pcinv:set_size("main", 8*32)
local pipe_chest_formspec =
"size[8,9;]" ..
default.gui_bg ..
default.gui_bg_img ..
default.gui_slots ..
"list[context;main;0,0.3;8,4;]" ..
"list[current_player;main;0,4.85;8,1;]" ..
"list[current_player;main;0,6.08;8,3;8]" ..
"listring[context;main]" ..
"listring[current_player;main]" ..
default.get_hotbar_bg(0, 4.85)
pcmeta:set_string("formspec", pipe_chest_formspec)
local state = {
state = "idle",
command = "none",
@ -440,29 +562,40 @@ local function get_controls_formspec(state)
local up_down = ""
if state.state == "idle" then
up_down = "button[5,3;6,1;up;Up One]" ..
"button[5,4;6,1;down;Down One]"
up_down = "button[5,3;4,1;up;Up One]" ..
"button[5,4;4,1;down;Down One]"
end
local stop = ""
if state.state ~= "idle" then
stop = "button[5,0;5,1;stop;Stop]"
stop = "button[5,0;4,1;stop;Stop]"
end
local drill = ""
if state.state ~= "drilling" then
drill = "button[5,1;5,1;drill;Drill]"
drill = "button[5,1;4,1;drill;Drill]"
end
local retract= ""
if state.state ~= "retracting" then
retract = "button[5,2;6,1;retract;Retract Pipe]"
retract = "button[5,2;4,1;retract;Retract Pipe]"
end
local forceload= ""
if state.state ~= "forceload" then
forceload = "button[5,3;4,1;forceload;Forceload]"
end
local pump= ""
if state.state ~= "pump" then
pump = "button[5,4;4,1;pump;Pump]"
end
local state_strings = {
drilling = "Drilling",
retracting = "Retracting",
idle = "Idle",
pump = "Pumping",
}
local state_str = state_strings[state.state] or "None"
@ -480,6 +613,8 @@ local function get_controls_formspec(state)
drill ..
retract ..
up_down ..
forceload ..
pump ..
""
end
@ -533,6 +668,21 @@ local function retract(pos)
end
local function pump_oil(pos)
local dp = check_drill_stack(pos)
local n = minetest.get_node(dp)
if n.name == "bitumen:crude_oil" then
minetest.set_node(dp, {name="air"})
pos.x = pos.x + 1
minetest.set_node(pos, {name="bitumen:crude_oil"})
minetest.set_node_level(pos, 64)
end
end
minetest.register_abm({
nodenames = {"bitumen:drill_rig"},
interval = 2,
@ -562,6 +712,7 @@ minetest.register_abm({
elseif state.command == "stop" then
state.state = "idle"
elseif state.command == "pump" then
print("set to pump")
state.state = "pump"
elseif state.command == "explore" then
state.state = "idle"
@ -570,6 +721,7 @@ minetest.register_abm({
elseif state.command == "forceload" then
state.state = "idle"
forceload_deposit({x=pos.x, y = state.depth - 1, z=pos.z})
-- do forceload
elseif state.command == "un_forceload" then
state.state = "idle"
@ -595,15 +747,26 @@ minetest.register_abm({
if state.state == "drilling" or inch == -1 then
local n, y, hit_oil = drill(pos)
if n then
state.last_drilled_node = n
state.depth = y
state.max_depth = math.min(y, state.max_depth or y)
if hit_oil and inch == 0 then
state.state = "idle"
local pcmeta = minetest.get_meta(alts.pipe_chest)
local pcinv = pcmeta:get_inventory()
if pcinv:contains_item("main", "bitumen:drill_pipe 1") then
local n, y, hit_oil = drill(pos)
if n then
state.last_drilled_node = n
state.depth = y
state.max_depth = math.min(y, state.max_depth or y)
pcinv:remove_item("main", "bitumen:drill_pipe 1")
if hit_oil and inch == 0 then
state.state = "idle"
end
end
else
-- out of pipe
state.state = "idle"
end
elseif state.state == "retracting" or inch == 1 then
local y, removed, ended
@ -623,12 +786,27 @@ minetest.register_abm({
elseif state.state == "pump" then
local expos = alts.mud_extractor
expos.x = expos.x + 1
local exnet = bitumen.pipes.get_net(expos)
if exnet.fluid == "bitumen:crude_oil" then
if exnet and (exnet.fluid == "bitumen:crude_oil" or exnet.fluid == "air") then
-- pump oil
local dp = {x=pos.x, y = state.depth - 1, z=pos.z}
local n = minetest.get_node(dp)
if n.name == "bitumen:crude_oil" or n.name == "bitumen:crude_oil_full" then
-- minetest.set_node(dp, {name="air"})
-- local expos = alts.mud_extractor
-- expos.x = expos.x + 1
local p = bitumen.pipes.push_fluid(expos, "bitumen:crude_oil", 5, 20)
--print("pushed " .. p)
end
else
-- must empty the mud out of the pipe first
print("well not connected " .. dump(exnet))
end
end
@ -642,20 +820,7 @@ minetest.register_abm({
})
local function pump_oil(pos)
local dp = check_drill_stack(pos)
local n = minetest.get_node(dp)
if n.name == "bitumen:crude_oil" then
minetest.set_node(dp, {name="air"})
pos.x = pos.x + 1
minetest.set_node(pos, {name="bitumen:crude_oil"})
minetest.set_node_level(pos, 64)
end
end
@ -678,3 +843,111 @@ minetest.register_node("bitumen:well_pump", {
})
local rig_builder_formspec =
"size[10,8;]" ..
default.gui_bg ..
default.gui_bg_img ..
default.gui_slots ..
"list[context;main;0,0.3;4,3;]" ..
"button[5,1;1,4;build;Build]" ..
"list[current_player;main;0,3.85;8,1;]" ..
"list[current_player;main;0,5.08;8,3;8]" ..
"listring[context;main]" ..
"listring[current_player;main]" ..
default.get_hotbar_bg(0, 3.85)
minetest.register_node("bitumen:oil_rig_constructor", {
description = "Oil Rig Constructor",
drawtype = "normal",
paramtype2 = "facedir",
on_rotate = screwdriver.rotate_simple,
groups = {cracky=1},
tiles = {
"default_copper_block.png","default_tin_block.png",
},
on_construct = function(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size("main", 12)
meta:set_string("formspec", rig_builder_formspec);
end,
on_receive_fields = function(pos, form, fields, player)
local meta = minetest.get_meta(pos)
if fields.build then
-- tanks can only be built on thick foundations
--[[
local ret = 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},
{
["default:stone"] = 1,
["bitumen:concrete"] = 1,
}
)
if ret == false then
minetest.chat_send_player(player:get_player_name(), "Foundation is incomplete: 10x10x3")
return
else
minetest.chat_send_player(player:get_player_name(), "Foundation is complete.")
end
]]
-- local inv = meta:get_inventory();
--
-- if inv:contains_item("main", "default:steelblock 8") then
--
-- inv:remove_item("main", "default:steelblock 8")
-- else
-- minetest.chat_send_player(player:get_player_name(), "Not enough materials: 8x SteelBlock")
-- return
-- end
-- ready to go
minetest.chat_send_player(player:get_player_name(), "Clear area, construction starting...")
minetest.after(5, function()
minetest.set_node({x=pos.x, y=pos.y + 2, z=pos.z}, {name="bitumen:drill_rig"})
end)
end
end,
})
bitumen.register_blueprint({name="bitumen:drill_rig"})
minetest.register_craft({
output = 'bitumen:oil_rig_constructor',
recipe = {
{'default:steelblock', 'default:steelblock', 'default:steelblock'},
{'default:steelblock', 'bitumen:drill_rig_blueprint', 'default:steelblock'},
{'default:steelblock', 'default:steelblock', 'default:steelblock'},
}
})