2019-03-25 18:31:12 +01:00
|
|
|
|
|
|
|
local furnaces = {}
|
|
|
|
|
|
|
|
local function update_timer (pos)
|
|
|
|
local t = minetest.get_node_timer(pos)
|
|
|
|
if not t:is_started() then
|
|
|
|
t:start(1.0)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
-----------------------
|
|
|
|
-- Buffer operations --
|
|
|
|
-----------------------
|
|
|
|
|
|
|
|
-- List liquids in the controller
|
|
|
|
local function all_liquids (pos)
|
|
|
|
local meta = minetest.get_meta(pos)
|
|
|
|
local count = meta:get_int("buffers")
|
|
|
|
local stacks = {}
|
|
|
|
local total = 0
|
|
|
|
|
|
|
|
if count == 0 then return stacks, total end
|
|
|
|
|
|
|
|
for i = 1, count do
|
|
|
|
stacks[i] = ItemStack(meta:get_string("buffer" .. i))
|
|
|
|
total = total + stacks[i]:get_count()
|
|
|
|
end
|
|
|
|
|
|
|
|
return stacks, total
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Set the bottom-most buffer
|
|
|
|
local function set_hot (pos, buf)
|
|
|
|
local meta = minetest.get_meta(pos)
|
|
|
|
local stacks, total = all_liquids(pos)
|
|
|
|
|
|
|
|
if not stacks[buf] or stacks[buf]:is_empty() then
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
|
|
local current_one = stacks[1]
|
|
|
|
local new_one = stacks[buf]
|
|
|
|
|
|
|
|
meta:set_string("buffer1", new_one:to_string())
|
|
|
|
meta:set_string("buffer" .. buf, current_one:to_string())
|
|
|
|
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Reorganize the buffers, remove empty ones
|
|
|
|
local function clean_buffer_list (pos)
|
|
|
|
local meta = minetest.get_meta(pos)
|
|
|
|
local stacks, total = all_liquids(pos)
|
|
|
|
local new = {}
|
|
|
|
|
|
|
|
for i,v in pairs(stacks) do
|
|
|
|
if not v:is_empty() then
|
|
|
|
table.insert(new, v)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
for i, v in pairs(new) do
|
|
|
|
meta:set_string("buffer" .. i, v:to_string())
|
|
|
|
end
|
|
|
|
|
|
|
|
meta:set_int("buffers", #new)
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Returns how much of the first buffer fluid can be extracted
|
|
|
|
local function can_take_liquid (pos, want_mb)
|
|
|
|
local meta = minetest.get_meta(pos)
|
|
|
|
local stacks = all_liquids(pos)
|
|
|
|
local found = stacks[1]
|
|
|
|
|
|
|
|
if found and found:is_empty() then
|
|
|
|
clean_buffer_list(pos)
|
|
|
|
return "", 0
|
|
|
|
end
|
|
|
|
|
|
|
|
if not found then return "", 0 end
|
|
|
|
|
|
|
|
local count = 0
|
|
|
|
if found:get_count() < want_mb then
|
|
|
|
count = found:get_count()
|
|
|
|
else
|
|
|
|
count = want_mb
|
|
|
|
end
|
|
|
|
|
|
|
|
return found:get_name(), count
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
-- Take liquid from the first buffer
|
|
|
|
local function take_liquid (pos, want_mb)
|
|
|
|
local meta = minetest.get_meta(pos)
|
|
|
|
local stacks = all_liquids(pos)
|
|
|
|
local found = stacks[1]
|
|
|
|
local fluid,count = can_take_liquid(pos, want_mb)
|
|
|
|
|
|
|
|
if fluid == "" or count == 0 or fluid ~= found:get_name() then
|
|
|
|
return fluid, 0
|
|
|
|
end
|
|
|
|
|
|
|
|
found = ItemStack(fluid)
|
|
|
|
found:set_count(count)
|
|
|
|
|
|
|
|
meta:set_string("buffer1", found:to_string())
|
|
|
|
|
|
|
|
return fluid, count
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Calculate furnace fluid capacity
|
|
|
|
local function total_capacity (pos)
|
|
|
|
return 8000 -- TODO
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Can you fit this liquid inside the furnace
|
|
|
|
local function can_put_liquid (pos, liquid)
|
|
|
|
local stacks, storage = all_liquids(pos)
|
|
|
|
local total = total_capacity(pos)
|
|
|
|
local append = liquid:get_count()
|
|
|
|
|
|
|
|
if total == storage then
|
|
|
|
append = 0
|
|
|
|
elseif storage + liquid:get_count() > total then
|
|
|
|
append = total - storage
|
|
|
|
end
|
|
|
|
|
|
|
|
return append
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Returns leftovers
|
|
|
|
local function put_liquid (pos, liquid)
|
|
|
|
local stacks, storage = all_liquids(pos)
|
|
|
|
local total = total_capacity(pos)
|
|
|
|
local append = can_put_liquid(pos, liquid)
|
|
|
|
local leftovers = liquid:get_count() - append
|
|
|
|
|
|
|
|
if append == 0 then
|
|
|
|
return leftovers
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Find a buffer, if not available, create a new one
|
|
|
|
local buf = nil
|
|
|
|
for i,v in pairs(stacks) do
|
|
|
|
if v:get_name() == liquid:get_name() then
|
|
|
|
buf = i
|
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if not buf then
|
|
|
|
buf = #stacks + 1
|
|
|
|
end
|
|
|
|
|
|
|
|
if stacks[buf] then
|
|
|
|
local st = stacks[buf]
|
|
|
|
local stc = st:get_count() + append
|
|
|
|
st:set_count(stc)
|
|
|
|
meta:set_string("buffer" .. buf, st:to_string())
|
|
|
|
else
|
|
|
|
liquid:set_count(append)
|
|
|
|
meta:set_string("buffer" .. buf, liquid:to_string())
|
|
|
|
end
|
|
|
|
|
|
|
|
return leftovers
|
|
|
|
end
|
|
|
|
|
|
|
|
--------------------------
|
|
|
|
-- Controller Operation --
|
|
|
|
--------------------------
|
|
|
|
|
|
|
|
-- Detect a structure based on controller
|
|
|
|
local function detect_structure (pos)
|
|
|
|
local node = minetest.get_node(pos)
|
|
|
|
local back = vector.add(pos, minetest.facedir_to_dir(node.param2))
|
|
|
|
|
|
|
|
local center = multifurnace.api.detect_center(back, 32)
|
|
|
|
|
|
|
|
-- TODO...
|
|
|
|
end
|
|
|
|
|
|
|
|
-- If pos is part of the structure, this will return a position
|
|
|
|
local function get_controller (pos)
|
|
|
|
-- body
|
|
|
|
end
|
|
|
|
|
|
|
|
local function controller_timer (pos, elapsed)
|
|
|
|
local refresh = false
|
|
|
|
local meta = minetest.get_meta(pos)
|
|
|
|
|
|
|
|
return refresh
|
|
|
|
end
|
|
|
|
|
|
|
|
-------------------
|
|
|
|
-- Registrations --
|
|
|
|
-------------------
|
|
|
|
|
|
|
|
minetest.register_node("multifurnace:controller", {
|
|
|
|
description = "Multifurnace Controller",
|
|
|
|
tiles = {
|
|
|
|
"metal_melter_heatbrick.png", "metal_melter_heatbrick.png", "metal_melter_heatbrick.png",
|
|
|
|
"metal_melter_heatbrick.png", "metal_melter_heatbrick.png", "metal_melter_heatbrick.png^multifurnace_controller_face.png",
|
|
|
|
},
|
|
|
|
groups = {cracky = 3, multifurnace = 1},
|
|
|
|
paramtype2 = "facedir",
|
|
|
|
is_ground_content = false,
|
|
|
|
on_timer = controller_timer,
|
|
|
|
on_rightclick = function (pos)
|
|
|
|
detect_structure(pos)
|
|
|
|
end
|
|
|
|
})
|
|
|
|
|
|
|
|
minetest.register_node("multifurnace:port", {
|
|
|
|
description = "Multifurnace Port",
|
|
|
|
tiles = {
|
|
|
|
"metal_melter_heatbrick.png", "metal_melter_heatbrick.png", "metal_melter_heatbrick.png",
|
|
|
|
"metal_melter_heatbrick.png", "metal_melter_heatbrick.png^multifurnace_intake_back.png",
|
|
|
|
"metal_melter_heatbrick.png^multifurnace_intake_face.png",
|
|
|
|
},
|
|
|
|
groups = {cracky = 3, multifurnace = 2},
|
|
|
|
paramtype2 = "facedir",
|
|
|
|
is_ground_content = false,
|
|
|
|
})
|