mirror of
https://github.com/mt-mods/pipeworks.git
synced 2024-11-10 01:13:57 +01:00
add an output field, that is being filled with the crafting result and can be used for quickly emptying or filling the crafting grid with the last registered recipe
some of the recipes are still treated wrongly due to minetest/minetest#2222 but are failling gracefully
This commit is contained in:
parent
5fa3e1f626
commit
320a483f4f
@ -22,22 +22,12 @@ local function get_craft(pos, inventory, hash)
|
|||||||
local hash = hash or minetest.hash_node_position(pos)
|
local hash = hash or minetest.hash_node_position(pos)
|
||||||
local craft = autocrafterCache[hash]
|
local craft = autocrafterCache[hash]
|
||||||
if not craft then
|
if not craft then
|
||||||
if inventory:is_empty("recipe") then
|
|
||||||
set_infotext(pos, nil)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local recipe = inventory:get_list("recipe")
|
local recipe = inventory:get_list("recipe")
|
||||||
local output, decremented_input = minetest.get_craft_result({method = "normal", width = 3, items = recipe})
|
local output, decremented_input = minetest.get_craft_result({method = "normal", width = 3, items = recipe})
|
||||||
craft = {recipe = recipe, consumption=count_index(recipe), output = output, decremented_input = decremented_input}
|
craft = {recipe = recipe, consumption=count_index(recipe), output = output, decremented_input = decremented_input}
|
||||||
autocrafterCache[hash] = craft
|
autocrafterCache[hash] = craft
|
||||||
set_infotext(pos, "Autocrafter: " .. output.item:get_name())
|
|
||||||
end
|
end
|
||||||
-- only return crafts that have an actual result
|
|
||||||
if not craft.output.item:is_empty() then
|
|
||||||
return craft
|
return craft
|
||||||
else
|
|
||||||
set_infotext(pos, "Autocrafter: unknown recipe")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function start_crafter(pos)
|
local function start_crafter(pos)
|
||||||
@ -78,6 +68,11 @@ local function after_recipe_change(pos, inventory)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
craft = craft or get_craft(pos, inventory, hash)
|
||||||
|
local output_item = craft.output.item
|
||||||
|
set_infotext(pos, "Autocrafter: " .. output_item:get_name())
|
||||||
|
inventory:set_stack("output", 1, output_item)
|
||||||
|
|
||||||
start_crafter(pos)
|
start_crafter(pos)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -119,6 +114,12 @@ local function run_autocrafter(pos, elapsed)
|
|||||||
local inventory = meta:get_inventory()
|
local inventory = meta:get_inventory()
|
||||||
local craft = get_craft(pos, inventory)
|
local craft = get_craft(pos, inventory)
|
||||||
|
|
||||||
|
-- only use crafts that have an actual result
|
||||||
|
if craft.output.item:is_empty() then
|
||||||
|
set_infotext(pos, "Autocrafter: unknown recipe")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
for step = 1, math.floor(elapsed/craft_time) do
|
for step = 1, math.floor(elapsed/craft_time) do
|
||||||
local continue = autocraft(inventory, craft)
|
local continue = autocraft(inventory, craft)
|
||||||
if not continue then return false end
|
if not continue then return false end
|
||||||
@ -146,6 +147,8 @@ local function set_formspec(meta, enabled)
|
|||||||
meta:set_string("formspec",
|
meta:set_string("formspec",
|
||||||
"size[8,11]"..
|
"size[8,11]"..
|
||||||
"list[context;recipe;0,0;3,3;]"..
|
"list[context;recipe;0,0;3,3;]"..
|
||||||
|
"image[3,1;1,1;gui_hb_bg.png^[colorize:#141318:255]"..
|
||||||
|
"list[context;output;3,1;1,1;]"..
|
||||||
"image_button[3,2;1,1;pipeworks_button_" .. state .. ".png;" .. state .. ";;;false;pipeworks_button_interm.png]" ..
|
"image_button[3,2;1,1;pipeworks_button_" .. state .. ".png;" .. state .. ";;;false;pipeworks_button_interm.png]" ..
|
||||||
"list[context;src;0,3.5;8,3;]"..
|
"list[context;src;0,3.5;8,3;]"..
|
||||||
"list[context;dst;4,0;4,3;]"..
|
"list[context;dst;4,0;4,3;]"..
|
||||||
@ -162,6 +165,19 @@ local function add_virtual_item(inv, listname, index, stack)
|
|||||||
inv:set_stack(listname, index, stack_copy)
|
inv:set_stack(listname, index, stack_copy)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function on_output_change(pos, inventory, stack)
|
||||||
|
if not stack then
|
||||||
|
inventory:set_list("output", {})
|
||||||
|
inventory:set_list("recipe", {})
|
||||||
|
else
|
||||||
|
local input = minetest.get_craft_recipe(stack:get_name())
|
||||||
|
if not input.items or input.type ~= "normal" then return end
|
||||||
|
inventory:set_list("recipe", input.items)
|
||||||
|
add_virtual_item(inventory, "output", 1, stack)
|
||||||
|
end
|
||||||
|
after_recipe_change(pos, inventory)
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_node("pipeworks:autocrafter", {
|
minetest.register_node("pipeworks:autocrafter", {
|
||||||
description = "Autocrafter",
|
description = "Autocrafter",
|
||||||
drawtype = "normal",
|
drawtype = "normal",
|
||||||
@ -190,6 +206,7 @@ minetest.register_node("pipeworks:autocrafter", {
|
|||||||
inv:set_size("src", 3*8)
|
inv:set_size("src", 3*8)
|
||||||
inv:set_size("recipe", 3*3)
|
inv:set_size("recipe", 3*3)
|
||||||
inv:set_size("dst", 4*3)
|
inv:set_size("dst", 4*3)
|
||||||
|
inv:set_size("output", 1)
|
||||||
end,
|
end,
|
||||||
on_receive_fields = function(pos, formname, fields, sender)
|
on_receive_fields = function(pos, formname, fields, sender)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
@ -227,10 +244,12 @@ minetest.register_node("pipeworks:autocrafter", {
|
|||||||
add_virtual_item(inv, listname, index, stack)
|
add_virtual_item(inv, listname, index, stack)
|
||||||
after_recipe_change(pos, inv)
|
after_recipe_change(pos, inv)
|
||||||
return 0
|
return 0
|
||||||
else
|
elseif listname == "output" then
|
||||||
|
on_output_change(pos, inv, stack)
|
||||||
|
return 0
|
||||||
|
end
|
||||||
after_inventory_change(pos, inv)
|
after_inventory_change(pos, inv)
|
||||||
return stack:get_count()
|
return stack:get_count()
|
||||||
end
|
|
||||||
end,
|
end,
|
||||||
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
|
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
|
||||||
update_autocrafter(pos)
|
update_autocrafter(pos)
|
||||||
@ -239,23 +258,33 @@ minetest.register_node("pipeworks:autocrafter", {
|
|||||||
inv:set_stack(listname, index, ItemStack(""))
|
inv:set_stack(listname, index, ItemStack(""))
|
||||||
after_recipe_change(pos, inv)
|
after_recipe_change(pos, inv)
|
||||||
return 0
|
return 0
|
||||||
else
|
elseif listname == "output" then
|
||||||
|
on_output_change(pos, inv, nil)
|
||||||
|
return 0
|
||||||
|
end
|
||||||
after_inventory_change(pos, inv)
|
after_inventory_change(pos, inv)
|
||||||
return stack:get_count()
|
return stack:get_count()
|
||||||
end
|
|
||||||
end,
|
end,
|
||||||
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
||||||
update_autocrafter(pos)
|
update_autocrafter(pos)
|
||||||
local inv = minetest.get_meta(pos):get_inventory()
|
local inv = minetest.get_meta(pos):get_inventory()
|
||||||
local stack = inv:get_stack(from_list, from_index)
|
local stack = inv:get_stack(from_list, from_index)
|
||||||
stack:set_count(count)
|
stack:set_count(count)
|
||||||
|
|
||||||
|
if to_list == "output" then
|
||||||
|
on_output_change(pos, inv, stack)
|
||||||
|
return 0
|
||||||
|
elseif from_list == "output" then
|
||||||
|
on_output_change(pos, inv, nil)
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
|
||||||
if from_list == "recipe" then
|
if from_list == "recipe" then
|
||||||
inv:set_stack(from_list, from_index, ItemStack(""))
|
inv:set_stack(from_list, from_index, ItemStack(""))
|
||||||
end
|
end
|
||||||
if to_list == "recipe" then
|
if to_list == "recipe" then
|
||||||
add_virtual_item(inv, to_list, to_index, stack)
|
add_virtual_item(inv, to_list, to_index, stack)
|
||||||
end
|
end
|
||||||
|
|
||||||
if from_list == "recipe" or to_list == "recipe" then
|
if from_list == "recipe" or to_list == "recipe" then
|
||||||
after_recipe_change(pos, inv)
|
after_recipe_change(pos, inv)
|
||||||
return 0
|
return 0
|
||||||
|
Loading…
Reference in New Issue
Block a user