mirror of
https://github.com/minetest-mods/technic.git
synced 2024-12-25 18:30:29 +01:00
Smoother link of processing cycles to ABM cycles
Make the generic processing machine code willing to complete more than one processing cycle in one ABM cycle, and more generally to carry over leftover processing effort after completing a processing cycle. The src_time meta item now represents accumulated processing effort (time multiplied by speed) in a scaled form (to retain fractions), rather than just time in integral seconds. This affects the MV furnace, with speed 4 and most recipe times being 3 s, and will be essential for faster furnaces.
This commit is contained in:
parent
d0efa15b98
commit
814646b542
@ -15,6 +15,10 @@ local tube = {
|
|||||||
connect_sides = {left = 1, right = 1, back = 1, top = 1, bottom = 1},
|
connect_sides = {left = 1, right = 1, back = 1, top = 1, bottom = 1},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local function round(v)
|
||||||
|
return math.floor(v + 0.5)
|
||||||
|
end
|
||||||
|
|
||||||
function technic.register_base_machine(data)
|
function technic.register_base_machine(data)
|
||||||
local typename = data.typename
|
local typename = data.typename
|
||||||
local input_size = technic.recipes[typename].input_size
|
local input_size = technic.recipes[typename].input_size
|
||||||
@ -70,51 +74,53 @@ function technic.register_base_machine(data)
|
|||||||
technic.handle_machine_pipeworks(pos, tube_upgrade)
|
technic.handle_machine_pipeworks(pos, tube_upgrade)
|
||||||
end
|
end
|
||||||
|
|
||||||
local result = technic.get_recipe(typename, inv:get_list("src"))
|
local powered = eu_input >= machine_demand[EU_upgrade+1]
|
||||||
|
if powered then
|
||||||
if not result then
|
meta:set_int("src_time", meta:get_int("src_time") + round(data.speed*10))
|
||||||
technic.swap_node(pos, machine_node)
|
|
||||||
meta:set_string("infotext", S("%s Idle"):format(machine_desc_tier))
|
|
||||||
meta:set_int(tier.."_EU_demand", 0)
|
|
||||||
return
|
|
||||||
end
|
end
|
||||||
|
while true do
|
||||||
if eu_input < machine_demand[EU_upgrade+1] then
|
local result = technic.get_recipe(typename, inv:get_list("src"))
|
||||||
-- Unpowered - go idle
|
if not result then
|
||||||
technic.swap_node(pos, machine_node)
|
technic.swap_node(pos, machine_node)
|
||||||
meta:set_string("infotext", S("%s Unpowered"):format(machine_desc_tier))
|
meta:set_string("infotext", S("%s Idle"):format(machine_desc_tier))
|
||||||
elseif eu_input >= machine_demand[EU_upgrade+1] then
|
meta:set_int(tier.."_EU_demand", 0)
|
||||||
-- Powered
|
meta:set_int("src_time", 0)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
meta:set_int(tier.."_EU_demand", machine_demand[EU_upgrade+1])
|
||||||
technic.swap_node(pos, machine_node.."_active")
|
technic.swap_node(pos, machine_node.."_active")
|
||||||
meta:set_string("infotext", S("%s Active"):format(machine_desc_tier))
|
meta:set_string("infotext", S("%s Active"):format(machine_desc_tier))
|
||||||
|
if meta:get_int("src_time") < round(result.time*10) then
|
||||||
meta:set_int("src_time", meta:get_int("src_time") + 1)
|
if not powered then
|
||||||
if meta:get_int("src_time") >= result.time / data.speed then
|
technic.swap_node(pos, machine_node)
|
||||||
meta:set_int("src_time", 0)
|
meta:set_string("infotext", S("%s Unpowered"):format(machine_desc_tier))
|
||||||
local output = result.output
|
|
||||||
if type(output) ~= "table" then output = { output } end
|
|
||||||
local output_stacks = {}
|
|
||||||
for _, o in ipairs(output) do
|
|
||||||
table.insert(output_stacks, ItemStack(o))
|
|
||||||
end
|
|
||||||
local room_for_output = true
|
|
||||||
inv:set_size("dst_tmp", inv:get_size("dst"))
|
|
||||||
inv:set_list("dst_tmp", inv:get_list("dst"))
|
|
||||||
for _, o in ipairs(output_stacks) do
|
|
||||||
if not inv:room_for_item("dst_tmp", o) then
|
|
||||||
room_for_output = false
|
|
||||||
break
|
|
||||||
end
|
|
||||||
inv:add_item("dst_tmp", o)
|
|
||||||
end
|
|
||||||
if room_for_output then
|
|
||||||
inv:set_list("src", result.new_input)
|
|
||||||
inv:set_list("dst", inv:get_list("dst_tmp"))
|
|
||||||
else
|
|
||||||
end
|
end
|
||||||
|
return
|
||||||
end
|
end
|
||||||
|
local output = result.output
|
||||||
|
if type(output) ~= "table" then output = { output } end
|
||||||
|
local output_stacks = {}
|
||||||
|
for _, o in ipairs(output) do
|
||||||
|
table.insert(output_stacks, ItemStack(o))
|
||||||
|
end
|
||||||
|
local room_for_output = true
|
||||||
|
inv:set_size("dst_tmp", inv:get_size("dst"))
|
||||||
|
inv:set_list("dst_tmp", inv:get_list("dst"))
|
||||||
|
for _, o in ipairs(output_stacks) do
|
||||||
|
if not inv:room_for_item("dst_tmp", o) then
|
||||||
|
room_for_output = false
|
||||||
|
break
|
||||||
|
end
|
||||||
|
inv:add_item("dst_tmp", o)
|
||||||
|
end
|
||||||
|
if not room_for_output then
|
||||||
|
meta:set_int("src_time", round(result.time*10))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
meta:set_int("src_time", meta:get_int("src_time") - round(result.time*10))
|
||||||
|
inv:set_list("src", result.new_input)
|
||||||
|
inv:set_list("dst", inv:get_list("dst_tmp"))
|
||||||
end
|
end
|
||||||
meta:set_int(tier.."_EU_demand", machine_demand[EU_upgrade+1])
|
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_node("technic:"..ltier.."_"..machine_name, {
|
minetest.register_node("technic:"..ltier.."_"..machine_name, {
|
||||||
|
Loading…
Reference in New Issue
Block a user