mirror of
https://github.com/minetest-mods/technic.git
synced 2024-11-14 06:20:41 +01:00
Tie item ejection rate to machine production rate.
Items will be ejected from machines as quickly as they are processed only while the machine is active and fully upgraded with control logic units.
This commit is contained in:
parent
a793747d92
commit
5bc306d4ba
|
@ -51,7 +51,7 @@ local function on_machine_downgrade(meta, stack, list)
|
|||
local inv = meta:get_inventory()
|
||||
local upg1, upg2 = inv:get_stack("upgrade1", 1), inv:get_stack("upgrade2", 1)
|
||||
|
||||
-- only set 0 if theres not a nother chest in the other list too
|
||||
-- only set 0 if theres not another chest in the other list too
|
||||
if (not upg1 or not upg2 or upg1:get_name() ~= upg2:get_name()) then
|
||||
meta:set_int("public", 0)
|
||||
end
|
||||
|
@ -60,7 +60,7 @@ local function on_machine_downgrade(meta, stack, list)
|
|||
end
|
||||
|
||||
|
||||
function technic.send_items(pos, x_velocity, z_velocity, output_name)
|
||||
function technic.send_items(pos, x_velocity, z_velocity, output_name, item_count)
|
||||
-- Send items on their way in the pipe system.
|
||||
if output_name == nil then
|
||||
output_name = "dst"
|
||||
|
@ -74,9 +74,14 @@ function technic.send_items(pos, x_velocity, z_velocity, output_name)
|
|||
if stack then
|
||||
local item0 = stack:to_table()
|
||||
if item0 then
|
||||
item0["count"] = "1"
|
||||
-- Calculate how many items to move. Don't move more items than exist.
|
||||
-- Basically, 'item_count' is the maximum number of items to move.
|
||||
local num_items = item_count or 1
|
||||
if stack:get_count() < num_items then num_items = stack:get_count() end
|
||||
|
||||
item0["count"] = tostring(num_items)
|
||||
technic.tube_inject_item(pos, pos, vector.new(x_velocity, 0, z_velocity), item0)
|
||||
stack:take_item(1)
|
||||
stack:take_item(num_items)
|
||||
inv:set_stack(output_name, i, stack)
|
||||
return
|
||||
end
|
||||
|
@ -84,7 +89,6 @@ function technic.send_items(pos, x_velocity, z_velocity, output_name)
|
|||
end
|
||||
end
|
||||
|
||||
|
||||
function technic.smelt_item(meta, result, speed)
|
||||
local inv = meta:get_inventory()
|
||||
meta:set_int("cook_time", meta:get_int("cook_time") + 1)
|
||||
|
@ -105,7 +109,7 @@ function technic.smelt_item(meta, result, speed)
|
|||
end
|
||||
end
|
||||
|
||||
function technic.handle_machine_pipeworks(pos, tube_upgrade, send_function)
|
||||
function technic.handle_machine_pipeworks(pos, tube_upgrade, send_function, items_processed_this_cycle)
|
||||
if send_function == nil then
|
||||
send_function = technic.send_items
|
||||
end
|
||||
|
@ -117,7 +121,6 @@ function technic.handle_machine_pipeworks(pos, tube_upgrade, send_function)
|
|||
local x_velocity = 0
|
||||
local z_velocity = 0
|
||||
|
||||
-- Output is on the left side of the furnace
|
||||
if node.param2 == 3 then pos1.z = pos1.z - 1 z_velocity = -1 end
|
||||
if node.param2 == 2 then pos1.x = pos1.x - 1 x_velocity = -1 end
|
||||
if node.param2 == 1 then pos1.z = pos1.z + 1 z_velocity = 1 end
|
||||
|
@ -128,13 +131,43 @@ function technic.handle_machine_pipeworks(pos, tube_upgrade, send_function)
|
|||
if minetest.get_item_group(node1.name, "tubedevice") > 0 then
|
||||
output_tube_connected = true
|
||||
end
|
||||
local tube_time = meta:get_int("tube_time") + tube_upgrade
|
||||
if tube_time >= 2 then
|
||||
|
||||
items_processed_this_cycle = items_processed_this_cycle or 1
|
||||
local eject_count = meta:get_int("eject_count") + items_processed_this_cycle
|
||||
meta:set_int("eject_count", eject_count)
|
||||
|
||||
local tube_upgrade_max = 2
|
||||
local norm_tube_upgrade = tube_upgrade / tube_upgrade_max
|
||||
local stack_size = 11
|
||||
local tube_time = meta:get_int("tube_time") + 1
|
||||
|
||||
if tube_time >= 10 then
|
||||
tube_time = 0
|
||||
|
||||
if output_tube_connected then
|
||||
send_function(pos, x_velocity, z_velocity)
|
||||
-- Calculate how many items to eject during this run. Eject none if no
|
||||
-- tube upgrades exist, and eject as many as were produced if the max
|
||||
-- number of tube upgrades exist.
|
||||
-- Always try to eject at least 5 to 10 items per execution. This is the
|
||||
-- fallback behavior for when the machine isn't producing anything (and
|
||||
-- thus 'eject_count' is 0).
|
||||
if eject_count < 10 then eject_count = 10 end
|
||||
eject_count = eject_count * norm_tube_upgrade
|
||||
|
||||
if eject_count > 0 then
|
||||
-- Eject items. Use multiple stacks if needed, to avoid ejecting a
|
||||
-- monolithic stack.
|
||||
while eject_count >= stack_size do
|
||||
send_function(pos, x_velocity, z_velocity, nil, stack_size)
|
||||
eject_count = eject_count - stack_size
|
||||
end
|
||||
send_function(pos, x_velocity, z_velocity, nil, eject_count)
|
||||
end
|
||||
end
|
||||
|
||||
meta:set_int("eject_count", 0)
|
||||
end
|
||||
|
||||
meta:set_int("tube_time", tube_time)
|
||||
end
|
||||
|
||||
|
|
|
@ -78,22 +78,22 @@ function technic.register_base_machine(data)
|
|||
if data.upgrade then
|
||||
EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
|
||||
end
|
||||
if data.tube then
|
||||
technic.handle_machine_pipeworks(pos, tube_upgrade)
|
||||
end
|
||||
|
||||
local powered = eu_input >= machine_demand[EU_upgrade+1]
|
||||
if powered then
|
||||
meta:set_int("src_time", meta:get_int("src_time") + round(data.speed*10))
|
||||
end
|
||||
while true do
|
||||
|
||||
local items_processed_this_cycle = 0
|
||||
|
||||
while true do -- Begin recipe processing.
|
||||
local result = technic.get_recipe(typename, inv:get_list("src"))
|
||||
if not result then
|
||||
technic.swap_node(pos, machine_node)
|
||||
meta:set_string("infotext", S("%s Idle"):format(machine_desc_tier))
|
||||
meta:set_int(tier.."_EU_demand", 0)
|
||||
meta:set_int("src_time", 0)
|
||||
return
|
||||
break
|
||||
end
|
||||
meta:set_int(tier.."_EU_demand", machine_demand[EU_upgrade+1])
|
||||
technic.swap_node(pos, machine_node.."_active")
|
||||
|
@ -103,7 +103,7 @@ function technic.register_base_machine(data)
|
|||
technic.swap_node(pos, machine_node)
|
||||
meta:set_string("infotext", S("%s Unpowered"):format(machine_desc_tier))
|
||||
end
|
||||
return
|
||||
break
|
||||
end
|
||||
local output = result.output
|
||||
if type(output) ~= "table" then output = { output } end
|
||||
|
@ -120,14 +120,19 @@ function technic.register_base_machine(data)
|
|||
break
|
||||
end
|
||||
inv:add_item("dst_tmp", o)
|
||||
items_processed_this_cycle = items_processed_this_cycle + o:get_count()
|
||||
end
|
||||
if not room_for_output then
|
||||
meta:set_int("src_time", round(result.time*10))
|
||||
return
|
||||
break
|
||||
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 of recipe processing.
|
||||
|
||||
if data.tube then
|
||||
technic.handle_machine_pipeworks(pos, tube_upgrade, nil, items_processed_this_cycle)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user