summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim <t4im@users.noreply.github.com>2015-01-28 06:23:46 +0100
committerTim <t4im@users.noreply.github.com>2015-01-28 06:51:59 +0100
commit320a483f4fcd67fc52ea4a23620d4c1a0c41885b (patch)
tree4c700002f9055878505f1500dd18763f0072ce67
parent5fa3e1f626c029694891433c3f7178fc96edcaa0 (diff)
downloadpipeworks-320a483f4fcd67fc52ea4a23620d4c1a0c41885b.tar
pipeworks-320a483f4fcd67fc52ea4a23620d4c1a0c41885b.tar.gz
pipeworks-320a483f4fcd67fc52ea4a23620d4c1a0c41885b.tar.bz2
pipeworks-320a483f4fcd67fc52ea4a23620d4c1a0c41885b.tar.xz
pipeworks-320a483f4fcd67fc52ea4a23620d4c1a0c41885b.zip
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
-rw-r--r--autocrafter.lua65
1 files changed, 47 insertions, 18 deletions
diff --git a/autocrafter.lua b/autocrafter.lua
index 4a898f5..f500c77 100644
--- a/autocrafter.lua
+++ b/autocrafter.lua
@@ -22,22 +22,12 @@ local function get_craft(pos, inventory, hash)
local hash = hash or minetest.hash_node_position(pos)
local craft = autocrafterCache[hash]
if not craft then
- if inventory:is_empty("recipe") then
- set_infotext(pos, nil)
- return
- end
local recipe = inventory:get_list("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}
autocrafterCache[hash] = craft
- set_infotext(pos, "Autocrafter: " .. output.item:get_name())
- end
- -- only return crafts that have an actual result
- if not craft.output.item:is_empty() then
- return craft
- else
- set_infotext(pos, "Autocrafter: unknown recipe")
end
+ return craft
end
local function start_crafter(pos)
@@ -78,6 +68,11 @@ local function after_recipe_change(pos, inventory)
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)
end
@@ -119,6 +114,12 @@ local function run_autocrafter(pos, elapsed)
local inventory = meta:get_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
local continue = autocraft(inventory, craft)
if not continue then return false end
@@ -146,6 +147,8 @@ local function set_formspec(meta, enabled)
meta:set_string("formspec",
"size[8,11]"..
"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]" ..
"list[context;src;0,3.5;8,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)
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", {
description = "Autocrafter",
drawtype = "normal",
@@ -190,6 +206,7 @@ minetest.register_node("pipeworks:autocrafter", {
inv:set_size("src", 3*8)
inv:set_size("recipe", 3*3)
inv:set_size("dst", 4*3)
+ inv:set_size("output", 1)
end,
on_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.get_meta(pos)
@@ -227,10 +244,12 @@ minetest.register_node("pipeworks:autocrafter", {
add_virtual_item(inv, listname, index, stack)
after_recipe_change(pos, inv)
return 0
- else
- after_inventory_change(pos, inv)
- return stack:get_count()
+ elseif listname == "output" then
+ on_output_change(pos, inv, stack)
+ return 0
end
+ after_inventory_change(pos, inv)
+ return stack:get_count()
end,
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
update_autocrafter(pos)
@@ -239,23 +258,33 @@ minetest.register_node("pipeworks:autocrafter", {
inv:set_stack(listname, index, ItemStack(""))
after_recipe_change(pos, inv)
return 0
- else
- after_inventory_change(pos, inv)
- return stack:get_count()
+ elseif listname == "output" then
+ on_output_change(pos, inv, nil)
+ return 0
end
+ after_inventory_change(pos, inv)
+ return stack:get_count()
end,
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
update_autocrafter(pos)
local inv = minetest.get_meta(pos):get_inventory()
local stack = inv:get_stack(from_list, from_index)
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
inv:set_stack(from_list, from_index, ItemStack(""))
end
if to_list == "recipe" then
add_virtual_item(inv, to_list, to_index, stack)
end
-
if from_list == "recipe" or to_list == "recipe" then
after_recipe_change(pos, inv)
return 0