minetest-craft_guide/craft_guide/api_craft_guide.lua
Miner59 f7f39cc1c5 Now works with recent versions of technic mod, too
Shows recipes of machines from technic mod, too. This includes recipes for grinder, compressor, extractor, alloy furnace and centrifuge.
Should work with old and new versions of technic mod.
Also added code to better handle aliases which occur in recipes.
2014-12-24 17:23:03 +01:00

1768 lines
54 KiB
Lua

--[[
Craft Guide for Minetest
Copyright (c) 2012 cornernote, Brett O'Donnell <cornernote@gmail.com>
Source Code: https://github.com/cornernote/minetest-craft_guide
License: BSD-3-Clause https://raw.github.com/cornernote/minetest-craft_guide/master/LICENSE
CRAFT GUIDE API
]]--
-- expose object to other modules
craft_guide = {}
-- vvv INTERNAL SETTINGS vvv
-- enable or disable you need feature
craft_guide.you_need=true
-- show items which only have have craft recipes of type "fuel". This are for example: tree trunks, saplings, .. etc.
--Don't matter when craft_guide.show_fuel=true
craft_guide.show_all_fuel_crafts=false
-- don't show any recipes of type fuel in craft guide
craft_guide.show_fuel=true
--shows crafts other then normal crafts in crafting grid or of type "cooking" or "fuel".
--at the moment this are crafts for machines from technic mod
craft_guide.other_crafting_types = true
--don't show crafts which are registered in moreblocks mod to get the original item back from its slabs, panels, microblocks, etc...
--and don't show all ingots, dusts and blocks of uranium with different percentages
craft_guide.remove_cluttering_crafts = true
-- here you can define base items for "you need" feature
--all items with this prefix are base items:
craft_guide.basic_item_prefixes = {
"dye:",
}
--all items which belong to this groups are base items
craft_guide.basic_item_groups = {
"wood",
"stone",
"stick",
"tree",
"sand",
"glass",
}
--all items which end with these strings are base items
craft_guide.basic_item_endings = {
"ingot",
"lump",
"glass",
"dust",
}
-- here you can define single items as base items.
-- items without crafting recipe or items which match criterias from the tables above are base items too.
craft_guide.basic_items = {
"default:dirt",
"default:sand",
"default:cobble",
"default:snowblock",
"default:ice",
"default:wood",
"default:stone",
"default:stick",
"default:clay_brick",
"default:gravel",
"default:mossycobble",
"default:desert_stone",
"default:desert_cobble",
"default:desert_sand",
"default:diamond",
"default:mese_crystal",
"default:glass",
"default:obsidian",
"bucket:bucket_water",
"bucket:bucket_lava",
"technic:uranium",
"technic:raw_latex",
"homedecor:roof_tile_terracotta",
"homedecor:terracotta_base",
"mesecons_materials:glue",
}
-- END OF SETTINGS SECTION
-- define api variables
craft_guide.crafts = {}
craft_guide.alias = {}
craft_guide.fuel = {}
craft_guide.you_need_list = {}
craft_guide.add_things=true
craft_guide.fuel_to_add=false
-- log
craft_guide.log = function(message)
--if not craft_guide.DEBUG then return end
minetest.log("action", "[CraftGuide] "..message)
end
-- register_craft
craft_guide.register_craft = function(options)
if options.type == "fuel" and craft_guide.show_fuel and options.recipe~=nil then
local itemstack = ItemStack(options.recipe)
if itemstack:is_empty() then
return
end
if craft_guide.fuel[itemstack:get_name()]==nil then
craft_guide.fuel[itemstack:get_name()] = {}
end
table.insert(craft_guide.fuel[itemstack:get_name()],options)
craft_guide.fuel_to_add=true
return
end
if options.output == nil then
return
end
local itemstack = ItemStack(options.output)
if itemstack:is_empty() then
return
end
--this should remove crafts which craft original item back from stairs, slabs, panels or micros,
if craft_guide.remove_cluttering_crafts then
local mod,_=string.find(itemstack:get_name(),":")
if mod~=nil then
mod=string.sub(itemstack:get_name(),1,mod)
local recipestr=""
if options.recipe[1]~=nil and type(options.recipe[1])=="string" then
recipestr=" "..options.recipe[1]
elseif options.recipe[1]~=nil and type(options.recipe[1][1])=="string" then
recipestr=" "..options.recipe[1][1]
elseif options.recipe[2]~=nil and type(options.recipe[2][1])=="string" then
recipestr=" "..options.recipe[2][1]
end
if
--dont show recipes for ingots, dusts and blocks of uranium with different percentages
string.find(itemstack:get_name(),"technic:uranium._")==nil
and string.find(itemstack:get_name(),"technic:uranium.._")==nil
and
(recipestr==""or (options.recipe~=nil and string.find(recipestr," "..mod.."panel_")==nil
and string.find(recipestr," "..mod.."stair_")==nil
and string.find(recipestr," "..mod.."micro_")==nil and string.find(recipestr," "..mod.."slab_")==nil
and string.find(recipestr," moreblocks:panel_")==nil and string.find(recipestr," moreblocks:stair_")==nil
and string.find(recipestr," moreblocks:micro_")==nil and string.find(recipestr," moreblocks:slab_")==nil)) then
--craft_guide.log("registered craft for - "..itemstack:get_name())
if craft_guide.crafts[itemstack:get_name()]==nil then
craft_guide.crafts[itemstack:get_name()] = {}
end
table.insert(craft_guide.crafts[itemstack:get_name()],options)
end
end
end
end
-- register_alias
craft_guide.register_alias = function(alias,convert_to)
local count=#craft_guide.alias
craft_guide.alias[count+1]=alias
craft_guide.alias[count+2]=convert_to
end
-- get_craft_guide_formspec
craft_guide.get_craft_guide_formspec = function(meta, search, page, alternate)
if craft_guide.add_things then
craft_guide.add_additional_crafts()
end
if search == nil then
search = meta:get_string("search")
if search == nil then
search = ""
end
end
if meta:get_string("formspec")=="" then
meta:set_string("saved_search","|")
meta:set_string("saved_page","1")
meta:set_string("saved_pages","1")
meta:set_string("switch","bookmarks")
meta:set_string("poslist","down")
meta:set_string("globalcount","1")
meta:set_string("time","0")
meta:set_string("method","Cook")
end
if page == nil then
page = craft_guide.get_current_page(meta)
end
if alternate == nil then
alternate = craft_guide.get_current_alternate(meta)
end
local inv = meta:get_inventory()
local size = inv:get_size("main")
local start = (page-1) * (5*14) --was 1 too much before
local pages = math.floor((size-1) / (5*14) + 1)
local alternates = 0
local stack = inv:get_stack("output",1)
local crafts = craft_guide.crafts[stack:get_name()]
if crafts ~= nil then
alternates = #crafts
end
backbutton=""
if meta:get_string("saved_search")~="|" then
backbutton="button[6,5.8;2.7,1;back_button;<--- Back]"
end
local changeable_part=""
if meta:get_string("switch")=="youneed" and craft_guide.you_need then
changeable_part="button[9.7,6.35;0.8,0.7;switch_to_bookmarks;>>]"
.."tooltip[switch_to_bookmarks;Show your saved bookmarks]"
if meta:get_string("poslist")=="down" then
changeable_part= changeable_part.."label[8,6.5;You need:]"
.."button[10.42,6.35;0.5,0.7;move_up;^]"
.."tooltip[move_up;Move the list of needed items upwards]"
.."label[11.4,6.0;Add to]"
.."label[11.2,6.35;bookmarks]"
.."label[12.6,6.05;->]"
.."list[current_name;add;13,6;1,1;]"
..craft_guide.build_button_list(meta,inv,"youneed",12,29,8,7,6)
else
changeable_part= changeable_part.."button[10.42,6.35;0.5,0.7;move_down;v]"
.."tooltip[move_down;Move the list of needed items downwards]"
..craft_guide.build_button_list(meta,inv,"youneed",12,29,0,1,14,0)
end
changeable_part= changeable_part..craft_guide.get_amounts(meta,inv,"youneed")
end
if meta:get_string("switch")=="bookmarks" or (not craft_guide.you_need) or meta:get_string("poslist")=="up" then
changeable_part= changeable_part.."label[8,6.5;Bookmarks]"
if craft_guide.you_need and meta:get_string("switch")=="bookmarks" then
changeable_part= changeable_part.."button[9.7,6.35;0.8,0.7;switch_to_youneed;>>]"
.."tooltip[switch_to_youneed;Show amount of basic items needed]"
end
changeable_part= changeable_part.."list[current_name;bookmark;8,7;6,3;]"
.."label[12,6.1;Bin ->]"
.."list[current_name;bin;13,6;1,1;]"
end
local formspec = "size[14,10;]"
if meta:get_string("switch")=="youneed" and meta:get_string("poslist")=="up" then
formspec=formspec.."label[0.1,0.3;You need:]"
else
formspec=formspec.."list[current_name;main;0,0;14,5;"..tostring(start).."]"
end
formspec=formspec.."label[0,5;--== Learn to Craft ==--]"
.."label[0,5.4;Drag any item to the Output box to see the]"
.."label[0,5.8;craft. Save your favorite items in Bookmarks.]"
.."field[6,5.4;2,1;craft_guide_search_box;;"..tostring(search).."]"
.."button[7.5,5.1;1.2,1;craft_guide_search_button;Search]"
..backbutton
.."label[9,5.2;page "..tostring(page).." of "..tostring(pages).."]"
.."button[11,5;1.5,1;craft_guide_prev;<<]"
.."button[12.5,5;1.5,1;craft_guide_next;>>]"
if inv:get_stack("fuel",1)==nil or inv:get_stack("fuel",1):get_name()==nil or inv:get_stack("fuel",1):get_name()=="" then
formspec=formspec.."label[0,6.5;Output]"
end
formspec=formspec.."list[current_name;output;0,7;1,1;]"
.."label[2,6.5;Inventory Craft]"
if not (inv:get_stack("additional",1)==nil or inv:get_stack("additional",1):get_name()==nil or inv:get_stack("additional",1):get_name()=="") then
formspec=formspec.."list[current_name;additional;0.96,7;1,1;]"
end
formspec=formspec..craft_guide.build_button_list(meta,inv,"build",3,11,2,7,3)
if not (inv:get_stack("cook",1)==nil or inv:get_stack("cook",1):get_name()==nil or inv:get_stack("cook",1):get_name()=="")
or (inv:get_stack("fuel",1)==nil or inv:get_stack("fuel",1):get_name()==nil or inv:get_stack("fuel",1):get_name()=="") then
formspec=formspec.."label["..tostring(6.22-string.len(meta:get_string("method"))*0.05)..",6.5;"..meta:get_string("method").."]"
if not (inv:get_stack("cook",2)==nil or inv:get_stack("cook",2):get_name()==nil or inv:get_stack("cook",2):get_name()=="") then
formspec=formspec..craft_guide.build_button_list(meta,inv,"cook",1,2,5.5,7,2)
else
formspec=formspec..craft_guide.build_button_list(meta,inv,"cook",1,1,6,7,1)
end
end
--add flames from default mod for craft fuel
if not (inv:get_stack("fuel",1)==nil or inv:get_stack("fuel",1):get_name()==nil or inv:get_stack("fuel",1):get_name()=="") then
formspec=formspec.."label[6,6.5;Fuel]"
..craft_guide.build_button_list(meta,inv,"fuel",1,1,6,7,1)
.."image[6.13,9.1;0.7,0.7;default_furnace_fire_fg.png]"
if meta:get_string("time")~=nil and meta:get_string("time")~="nil" then
formspec=formspec.."label[6.02,8.17;"..meta:get_string("time").." sec]"
end
end
if not (inv:get_stack("cook",1)==nil or inv:get_stack("cook",1):get_name()==nil or inv:get_stack("cook",1):get_name()=="") then
formspec=formspec.."list[current_name;machine;6,9;1,1;]"
if meta:get_string("time")~=nil and meta:get_string("time")~="nil" then
formspec=formspec.."label[6.02,8.17;"..meta:get_string("time").." sec]"
end
end
formspec=formspec..changeable_part
.."button_exit[0,9.2;1,0.8;close_mm;ESC]"
if alternates > 1 then
if alternate>alternates then
alternate=1
end
formspec = formspec
.."label[0,8;recipe "..tostring(alternate).." of "..tostring(alternates).."]"
.."button[0,8.4;2,1;alternate;Alternate]"
end
return formspec
end
-- on_construct
craft_guide.on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
local inv = meta:get_inventory()
inv:set_size("output", 1)
inv:set_size("additional", 1) --here goes the second output of centrifuge recipe, just shown when needed
inv:set_size("build", 3*3)
inv:set_size("cook", 2*1)
inv:set_size("fuel", 1)
inv:set_size("machine", 1)
inv:set_size("bookmark", 6*3)
inv:set_size("youneed", 6*15)
inv:set_size("bin", 1)
inv:set_size("add", 1)
craft_guide.create_inventory(inv)
meta:set_string("formspec",craft_guide.get_craft_guide_formspec(meta))
meta:set_string("out","")
meta:set_string("addindex","1")
end
-- on_receive_fields
craft_guide.on_receive_fields = function(pos, formname, fields, player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
local size = inv:get_size("main",1)
local stack = inv:get_stack("output",1)
local crafts = craft_guide.crafts[stack:get_name()]
local alternate = craft_guide.get_current_alternate(meta)
local alternates = 0
if crafts ~= nil then
alternates = #crafts
end
local page = craft_guide.get_current_page(meta)
local pages = math.floor((size-1) / (5*14) + 1)
-- search
local search
search = fields.craft_guide_search_box
if search~=nil then
if string.lower(search)==string.upper(search) and tonumber(search)==nil and search~="*" then
search=""
end
meta:set_string("search", search)
end
if fields.craft_guide_search_button then
if search==nil then
meta:set_string("search", "")
end
if meta:get_string("switch")=="youneed" and meta:get_string("poslist")=="up" then
meta:set_string("switch","bookmarks")
end
meta:set_string("saved_search", "|")
page = 1
end
-- change page
if fields.craft_guide_prev then
page = page - 1
if page < 1 then
page = pages
end
if meta:get_string("switch")=="youneed" and meta:get_string("poslist")=="up" then
meta:set_string("switch","bookmarks")
end
end
if fields.craft_guide_next then
page = page + 1
if page > pages then
page = 1
end
if meta:get_string("switch")=="youneed" and meta:get_string("poslist")=="up" then
meta:set_string("switch","bookmarks")
end
end
if page > pages then
page = pages
end
if page < 1 then
page = 1
end
-- go back to search result
if fields.back_button then
if meta:get_string("switch")=="youneed" and meta:get_string("poslist")=="up" then
meta:set_string("switch","bookmarks")
end
local saved_search = meta:get_string("saved_search")
if saved_search~="|" then
search=saved_search
meta:set_string("search", saved_search)
page=tonumber(meta:get_string("saved_page"))
pages=tonumber(meta:get_string("saved_pages"))
meta:set_string("saved_search", "|")
end
end
--toogle between bookmarks/you need
if fields.switch_to_bookmarks then
meta:set_string("switch","bookmarks")
end
if fields.switch_to_youneed then
meta:set_string("switch","youneed")
craft_guide.update_recipe(meta, player, stack, alternate)
end
--replacing bookmarks or main item list?
if fields.move_up then
if meta:get_string("switch")=="youneed" then
meta:set_string("poslist","up")
end
end
if fields.move_down then
if meta:get_string("switch")=="youneed" then
meta:set_string("poslist","down")
end
end
-- get an alternate recipe
if fields.alternate then
alternate = alternate+1
craft_guide.update_recipe(meta, player, stack, alternate)
end
if alternate > alternates then
alternate = 1
end
--group buttons, finally a solution with a for loop
local starts=""
local ends=""
local xx=""
local formspec = meta:get_string("formspec")
for button_number=1,29,1 do
if fields[("t_758s"..tostring(button_number))] then
xx,starts=string.find(formspec,"tooltip%[t_758s"..tostring(button_number)..";")
if starts~=nil then
ends,xx=string.find(formspec,"%]",starts+1)
local group=string.lower(string.sub(formspec,starts+1,ends-2))
meta:set_string("search", "group:"..group)
if meta:get_string("saved_search")=="|" then
meta:set_string("saved_search", search)
meta:set_string("saved_page", tostring(page))
meta:set_string("saved_pages", tostring(pages))
end
page = 1
search="group:"..group
end
break
end
end
if starts~="" and meta:get_string("switch")=="youneed" and meta:get_string("poslist")=="up" then --button pressed, need to move back to bookmarks
meta:set_string("switch","bookmarks")
end
-- update the formspec
craft_guide.create_inventory(inv, search)
meta:set_string("formspec",craft_guide.get_craft_guide_formspec(meta, search, page, alternate))
end
-- returns formspec string of a inventory list with buttons for group items
craft_guide.build_button_list = function(meta,inv,list,start_index,end_index,x,y,w,show_empty)
--button numbers go from start_index to end_index
--button numbers 1,(2)= cook or fuel
--button numbers 3-11= inventory craft field
--button numbers 12-29= you need items
if show_empty~=0 then
show_empty=1
end
local string=""
for i=1,end_index-start_index+1,1 do
local string_old=string
local stack = inv:get_stack(list,i)
if stack~=nil then
local name=stack:get_name()
if string.sub(name,1,6)=="group:" then
local groups=string.sub(name,7)
local saved=""
for name,def in pairs(minetest.registered_items) do
local hasgroup=1
for group in string.gmatch(groups,"([^,]+)") do
if minetest.get_item_group(name, group)==0 then
hasgroup=0
end
end
if hasgroup==1 then
--prefer items from default mod
if string.sub(name,1,8)=="default:" then
--prefer items with simple short names, because cnc machines adds items under default prefix too
if string.len(name)<20 then
string=string.."item_image_button["..tostring(x+((i-1)%w))..","
..tostring(y+math.floor((i-1)/w))..";1,1;"
..name..";t_758s"..tostring(i+start_index-1)..";group]"
.."tooltip[t_758s"..tostring(i+start_index-1)..";"
..string.upper(string.sub(groups,1,1))..string.sub(groups.." ",2).."]"
saved=""
break
end
elseif saved=="" then
saved=name
end
end
end
if saved~="" then
string=string.."item_image_button["..tostring(x+((i-1)%w))..","
..tostring(y+math.floor((i-1)/w))..";1,1;"..saved..";t_758s"..tostring(i+start_index-1)..";group]"
.."tooltip[t_758s"..tostring(i+start_index-1)..";"
..string.upper(string.sub(groups,1,1))..string.sub(groups.." ",2).."]"
end
end
end
if string_old==string and ((stack~=nil and stack:get_name()~="") or show_empty==1) then
string=string.."list[current_name;"..list..";"..tostring(x+((i-1)%w))..","..tostring(y+math.floor((i-1)/w))
..";1,1;"..tostring(i-1).."]"
end
end
return string
end
-- returns a formspec string with item amounts
craft_guide.get_amounts = function(meta,inv,list)
local amounts=""
local xx=8.1
local yy=7.45
local w=6
local size=18
if meta:get_string("poslist")=="up" then
xx=0.1
yy=1.45
w=14
size=70
end
for jj=1,size,1 do
local item=string.lower(inv:get_stack(list,jj):get_name())
local cnt=meta:get_string("globalcount")
if item==nil or item=="" then
break
end
local count=craft_guide.you_need_list[item]
if count~=nil then
cnt=math.floor(((count)/tonumber(meta:get_string("globalcount")))*1000+0.49)/1000
if cnt>1000 then
cnt=math.floor(cnt+0.49)
elseif cnt>100 then
cnt=math.floor(cnt*10+0.49)/10
elseif cnt>10 then
cnt=math.floor(cnt*100+0.49)/100
end
amounts=amounts.."label["..tostring(xx+((jj-1)%w))..","..tostring(yy+math.floor((jj-1)/w))..";"..tostring(cnt).."]"
end
jj=jj+1
if jj > size then
break
end
end
return amounts
end
-- get_current_page
craft_guide.get_current_page = function(meta)
local formspec = meta:get_string("formspec")
local page = string.match(formspec, "label%[[%d.]+,[%d.]+;page (%d+) of [%d.]+%]")
page = tonumber(page) or 1
return page
end
-- get_current_alternate
craft_guide.get_current_alternate = function(meta)
local formspec = meta:get_string("formspec")
local alternate = string.match(formspec, "label%[[%d.]+,[%d.]+;recipe (%d+) of [%d.]+%]")
alternate = tonumber(alternate) or 1
return alternate
end
-- update_recipe
craft_guide.update_recipe = function(meta, player, stack, alternate)
local globalcount=1
local list={}
local list2={}
local test={}
local forlist={}
local inv = meta:get_inventory()
for i=0,inv:get_size("build"),1 do
inv:set_stack("build", i, nil)
end
for i=0,inv:get_size("youneed"),1 do
inv:set_stack("youneed", i, nil)
end
inv:set_stack("cook", 1, nil)
inv:set_stack("cook", 2, nil)
inv:set_stack("fuel", 1, nil)
inv:set_stack("machine", 1, nil)
inv:set_stack("additional", 1, nil)
meta:set_string("method","Cook")
if stack==nil then return end
inv:set_stack("output", 1, stack:get_name())
if alternate==nil then
alternate=craft_guide.get_current_alternate(meta)
end
alternate = tonumber(alternate) or 1
local crafts = craft_guide.crafts[stack:get_name()]
if crafts == nil then
if stack:get_name()~=nil and stack:get_name()~="" then
minetest.chat_send_player(player:get_player_name(), "no recipe available for "..stack:get_name())
end
meta:set_string("formspec",craft_guide.get_craft_guide_formspec(meta))
return
end
if alternate < 1 or alternate > #crafts then
alternate = 1
end
if stack:get_name()~=nil and stack:get_name()~="" then
craft_guide.log(player:get_player_name().." requests recipe "..alternate.." for "..stack:get_name())
end
local craft = crafts[alternate]
-- show me the unknown items
craft_guide.log(dump(craft))
--minetest.chat_send_player(player:get_player_name(), "recipe for "..stack:get_name()..": "..dump(craft))
local itemstack = ItemStack(craft.output)
inv:set_stack("output", 1, itemstack)
if craft.type~=nil and craft.type~="shapeless" and craft.type~="fuel" then
-- cook
if craft.type=="cooking" then
if craft.cooktime==nil then
meta:set_string("time","3")
else
meta:set_string("time",tostring(craft.cooktime))
end
inv:set_stack("cook", 1, craft.recipe)
if minetest.get_modpath("default") then
inv:set_stack("machine", 1, ItemStack("default:furnace"))
end
else
-- custom types added by technic mod
local input={}
if type(craft.input)~="table" or craft.input[1]==nil or craft.input[1]=="" then
table.insert(input,craft.input)
else
input=craft.input
end
if type(input)~="table" or input[1]==nil or input[1]=="" then
input={}
table.insert(input,craft.input)
end
if craft.type=="Grinder" then
inv:set_stack("machine", 1, ItemStack("technic:lv_grinder"))
inv:set_stack("cook", 1, input[1])
elseif craft.type=="Extractor" then
inv:set_stack("machine", 1, ItemStack("technic:extractor"))
inv:set_stack("cook", 1, input[1])
elseif craft.type=="Compressor" then
inv:set_stack("machine", 1, ItemStack("technic:compressor"))
inv:set_stack("cook", 1, input[1])
elseif craft.type=="Alloy Furnace" then
inv:set_stack("machine", 1, ItemStack("technic:lv_alloy_furnace"))
inv:set_stack("cook", 1, craft.input[2])
inv:set_stack("cook", 2, craft.input[1])
elseif craft.type=="Centrifuge" then
inv:set_stack("machine", 1, ItemStack("technic:mv_centrifuge"))
inv:set_stack("cook", 1, input[1])
inv:set_stack("additional", 1, craft.output2)
end
meta:set_string("method",craft.type)
meta:set_string("time",tostring(craft.time))
meta:set_string("globalcount",tostring(ItemStack(craft.output):get_count()))
end
else
-- fuel
if craft.type == "fuel" then
meta:set_string("time",tostring(craft.burntime))
itemstack=ItemStack(craft.recipe)
inv:set_stack("output", 1, meta:get_string("out"))
inv:set_stack("fuel", 1, craft.recipe)
else
-- build (shaped or shapeless)
if craft.recipe[1] then
if (type(craft.recipe[1]) == "string") then
inv:set_stack("build", 1, craft.recipe[1])
else
if craft.recipe[1][1] then
inv:set_stack("build", 1, craft.recipe[1][1])
end
if craft.recipe[1][2] then
inv:set_stack("build", 2, craft.recipe[1][2])
end
if craft.recipe[1][3] then
inv:set_stack("build", 3, craft.recipe[1][3])
end
end
end
if craft.recipe[2] then
if (type(craft.recipe[2]) == "string") then
inv:set_stack("build", 2, craft.recipe[2])
else
if craft.recipe[2][1] then
inv:set_stack("build", 4, craft.recipe[2][1])
end
if craft.recipe[2][2] then
inv:set_stack("build", 5, craft.recipe[2][2])
end
if craft.recipe[2][3] then
inv:set_stack("build", 6, craft.recipe[2][3])
end
end
end
if craft.recipe[3] then
if (type(craft.recipe[3]) == "string") then
inv:set_stack("build", 3, craft.recipe[3])
else
if craft.recipe[3][1] then
inv:set_stack("build", 7, craft.recipe[3][1])
end
if craft.recipe[3][2] then
inv:set_stack("build", 8, craft.recipe[3][2])
end
if craft.recipe[3][3] then
inv:set_stack("build", 9, craft.recipe[3][3])
end
end
end
if craft.recipe[4] then
if (type(craft.recipe[4]) == "string") then
inv:set_stack("build", 4, craft.recipe[4])
end
end
if craft.recipe[5] then
if (type(craft.recipe[5]) == "string") then
inv:set_stack("build", 5, craft.recipe[5])
end
end
if craft.recipe[6] then
if (type(craft.recipe[6]) == "string") then
inv:set_stack("build", 6, craft.recipe[6])
end
end
if craft.recipe[7] then
if (type(craft.recipe[7]) == "string") then
inv:set_stack("build", 7, craft.recipe[7])
end
end
if craft.recipe[8] then
if (type(craft.recipe[8]) == "string") then
inv:set_stack("build", 8, craft.recipe[8])
end
end
if craft.recipe[9] then
if (type(craft.recipe[9]) == "string") then
inv:set_stack("build", 9, craft.recipe[9])
end
end
end
end
if meta:get_string("switch")=="youneed" and craft_guide.you_need then
craft_guide.you_need_list=nil
craft_guide.you_need_list={}
list[stack:get_name()] = {}
list[stack:get_name()] = 1
for j=1,6,1 do --main iteration loop
local finished=1
local limit=inv:get_size("youneed")
local k=0
for name,count in pairs(list) do
if k>limit then
break
end
k=k+1
local isbase=0
if name==nil or name=="" or count==0 or string.sub(name,1,6)=="group:" then
isbase=1
elseif j>1 or k>1 then
for ii=1,999,1 do
if craft_guide.basic_item_prefixes[ii]==nil or craft_guide.basic_item_prefixes[ii]=="" then
break
elseif string.sub(name,1,string.len(craft_guide.basic_item_prefixes[ii]))==
string.lower(craft_guide.basic_item_prefixes[ii]) then
isbase=1
break
end
end
if isbase==0 then
for aa=1,999,1 do
if craft_guide.basic_item_groups[aa]==nil or craft_guide.basic_item_groups[aa]=="" then
break
elseif minetest.get_item_group(name, string.lower(craft_guide.basic_item_groups[aa]))>0 then
isbase=1
break
end
end
if isbase==0 then
for bb=1,999,1 do
if craft_guide.basic_item_endings[bb]==nil or craft_guide.basic_item_endings[bb]=="" then
break
elseif string.sub(name,string.len(name)-(string.len(craft_guide.basic_item_endings[bb])-1))==
string.lower(craft_guide.basic_item_endings[bb]) then
isbase=1
break
end
end
if isbase==0 then
for cc=1,999,1 do
if craft_guide.basic_items[cc]==nil or craft_guide.basic_items[cc]=="" then
break
elseif name==string.lower(craft_guide.basic_items[cc]) then
isbase=1
break
end
end
end
end
end
end
crafts = craft_guide.crafts[name]
if crafts==nil or ((j>1 or k>1) and crafts[1].type~=nil and crafts[1].type~="cooking" and crafts[1].type~="shapeless") then
isbase=1
end
if isbase==0 then
finished=0
if crafts ~= nil then
local istest=1
local bestcraft=1
local bestvalue=10 --lower is better
for craftnumber=1,#crafts+1,1 do
if craftnumber>49 then
craftnumber=#crafts+1
end
local index=craftnumber
if j>1 then
if #crafts==1 and index<=#crafts then
bestvalue=0
istest=0
elseif index>#crafts or bestvalue==0 then
index=bestcraft
bestvalue=0
istest=0
end
else
bestvalue=0
index=alternate
istest=0
end
local craft = crafts[index]
if craft~=nil and craft.type~="fuel" then
local amount=count
if istest==0 then
list[name]=0
local output_count=ItemStack(craft.output):get_count()
if output_count~=1 and (j>1 or k>1) then
if amount/output_count==math.floor(amount/output_count) then
amount=amount/output_count
else
globalcount=globalcount*output_count
for _name,_amount in pairs(list) do
if tonumber(amount)>0 then
list[_name]=tonumber(_amount)*output_count
end
end
end
end
end
if istest==1 then
list2=list
list=nil
list={}
list=test
end
if craft.type == "cooking" then
if list[craft.recipe]==nil then
list[(craft.recipe)]={}
list[(craft.recipe)]=amount
else
local add=amount+tonumber(list[(craft.recipe)])
list[(craft.recipe)]=add
end
elseif craft.type ~=nil and craft.type ~= "fuel" and craft.type ~= "shapeless" then
local input=ItemStack(craft.input):get_name()
local _count=ItemStack(craft.input):get_count()
if input~=nil and input~="" then
if list[input]==nil then
list[input]={}
list[input]=amount*_count
else
local add=amount*_count+tonumber(list[input])
list[input]=add
end
else
input=ItemStack(craft.input[1]):get_name()
_count=ItemStack(craft.input[1]):get_count()
if input~=nil and input~="" then
if list[input]==nil then
list[input]={}
list[input]=amount*_count
else
local add=amount*_count+tonumber(list[input])
list[input]=add
end
input=ItemStack(craft.input[2]):get_name()
_count=ItemStack(craft.input[2]):get_count()
if input~=nil and input~="" then
if list[input]==nil then
list[input]={}
list[input]=amount*_count
else
local add=amount*_count+tonumber(list[input])
list[input]=add
end
end
end
end
elseif craft.type==nil or craft.type=="shapeless" then
if craft.recipe[1] then
if (type(craft.recipe[1]) == "string") then
if list[craft.recipe[1]]==nil then
list[(craft.recipe[1])]={}
list[(craft.recipe[1])]=amount
else
local add =amount+tonumber(list[(craft.recipe[1])])
list[(craft.recipe[1])]=add
end
else
if craft.recipe[1][1] then
if list[(craft.recipe[1][1])]==nil then
list[(craft.recipe[1][1])]={}
list[(craft.recipe[1][1])]=amount
else
local add =amount+tonumber(list[(craft.recipe[1][1])])
list[(craft.recipe[1][1])]=add
end
end
if craft.recipe[1][2] then
if list[(craft.recipe[1][2])]==nil then
list[(craft.recipe[1][2])]={}
list[(craft.recipe[1][2])]=amount
else
local add =amount+tonumber(list[(craft.recipe[1][2])])
list[(craft.recipe[1][2])]=add
end
end
if craft.recipe[1][3] then
if list[(craft.recipe[1][3])]==nil then
list[(craft.recipe[1][3])]={}
list[(craft.recipe[1][3])]=amount
else
local add =amount+tonumber(list[(craft.recipe[1][3])])
list[(craft.recipe[1][3])]=add
end
end
end
end
if craft.recipe[2] then
if (type(craft.recipe[2]) == "string") then
if list[(craft.recipe[2])]==nil then
list[(craft.recipe[2])]={}
list[(craft.recipe[2])]=amount
else
local add =amount+tonumber(list[(craft.recipe[2])])
list[(craft.recipe[2])]=add
end
else
if craft.recipe[2][1] then
if list[(craft.recipe[2][1])]==nil then
list[(craft.recipe[2][1])]={}
list[(craft.recipe[2][1])]=amount
else
local add =amount+tonumber(list[(craft.recipe[2][1])])
list[(craft.recipe[2][1])]=add
end
end
if craft.recipe[2][2] then
if list[(craft.recipe[2][2])]==nil then
list[(craft.recipe[2][2])]={}
list[(craft.recipe[2][2])]=amount
else
local add =amount+tonumber(list[(craft.recipe[2][2])])
list[(craft.recipe[2][2])]=add
end
end
if craft.recipe[2][3] then
if list[(craft.recipe[2][3])]==nil then
list[(craft.recipe[2][3])]={}
list[(craft.recipe[2][3])]=amount
else
local add =amount+tonumber(list[(craft.recipe[2][3])])
list[(craft.recipe[2][3])]=add
end
end
end
end
if craft.recipe[3] then
if (type(craft.recipe[3]) == "string") then
if list[(craft.recipe[3])]==nil then
list[(craft.recipe[3])]={}
list[(craft.recipe[3])]=amount
else
local add =amount+tonumber(list[(craft.recipe[3])])
list[(craft.recipe[3])]=add
end
else
if craft.recipe[3][1] then
if list[(craft.recipe[3][1])]==nil then
list[(craft.recipe[3][1])]={}
list[(craft.recipe[3][1])]=amount
else
local add =amount+tonumber(list[(craft.recipe[3][1])])
list[(craft.recipe[3][1])]=add
end
end
if craft.recipe[3][2] then
if list[(craft.recipe[3][2])]==nil then
list[(craft.recipe[3][2])]={}
list[(craft.recipe[3][2])]=amount
else
local add =amount+tonumber(list[(craft.recipe[3][2])])
list[(craft.recipe[3][2])]=add
end
end
if craft.recipe[3][3] then
if list[(craft.recipe[3][3])]==nil then
list[(craft.recipe[3][3])]={}
list[(craft.recipe[3][3])]=amount
else
local add =amount+tonumber(list[(craft.recipe[3][3])])
list[(craft.recipe[3][3])]=add
end
end
end
end
if craft.recipe[4] then
if (type(craft.recipe[4]) == "string") then
if list[(craft.recipe[4])]==nil then
list[(craft.recipe[4])]={}
list[(craft.recipe[4])]=amount
else
local add =amount+tonumber(list[(craft.recipe[4])])
list[(craft.recipe[4])]=add
end
end
end
if craft.recipe[5] then
if (type(craft.recipe[5]) == "string") then
if list[(craft.recipe[5])]==nil then
list[(craft.recipe[5])]={}
list[(craft.recipe[5])]=amount
else
local add =amount+tonumber(list[(craft.recipe[5])])
list[(craft.recipe[5])]=add
end
end
end
if craft.recipe[6] then
if (type(craft.recipe[6]) == "string") then
if list[(craft.recipe[6])]==nil then
list[(craft.recipe[6])]={}
list[(craft.recipe[6])]=amount
else
local add =amount+tonumber(list[(craft.recipe[6])])
list[(craft.recipe[6])]=add
end
end
end
if craft.recipe[7] then
if (type(craft.recipe[7]) == "string") then
if list[(craft.recipe[7])]==nil then
list[(craft.recipe[7])]={}
list[(craft.recipe[7])]=amount
else
local add =amount+tonumber(list[(craft.recipe[7])])
list[(craft.recipe[7])]=add
end
end
end
if craft.recipe[8] then
if (type(craft.recipe[8]) == "string") then
if list[(craft.recipe[8])]==nil then
list[(craft.recipe[8])]={}
list[(craft.recipe[8])]=amount
else
local add =amount+tonumber(list[(craft.recipe[8])])
list[(craft.recipe[8])]=add
end
end
end
if craft.recipe[9] then
if (type(craft.recipe[9]) == "string") then
if list[(craft.recipe[9])]==nil then
list[(craft.recipe[9])]={}
list[(craft.recipe[9])]=amount
else
local add =amount+tonumber(list[(craft.recipe[9])])
list[(craft.recipe[9])]=add
end
end
end
end
if istest==1 then
test=list
list=nil
list={}
list=list2
end
end
if istest==1 then
local value=0
local h=0
for name,testcount in pairs(test) do
h=h+1
if h>888 then
break
end
if testcount>0 then
if name.def==nil or (craft_guide.crafts[name]==nil
and string.sub(name,1,8)=="technic:")
then
bestvalue=10
h=999
else
local testcrafts = craft_guide.crafts[name]
local testcraft=""
if testcrafts~=nil then
testcraft=testcrafts[1]
end
local isbase=0
--too much tabs needed, starting here left again till this section is over
if name==nil or name==""
or string.sub(name,1,6)=="group:"
or testcrafts==nil or testcraft==nil
or (testcraft.type~=nil and testcraft.type~="shapeless")
then
isbase=1
else
for ii=1,999,1 do
if craft_guide.basic_item_prefixes[ii]==nil or craft_guide.basic_item_prefixes[ii]=="" then
break
elseif string.sub(name,1,string.len(craft_guide.basic_item_prefixes[ii]))==string.lower(craft_guide.basic_item_prefixes[ii]) then
isbase=1
break
end
end
if isbase==0 then
for aa=1,999,1 do
if craft_guide.basic_item_groups[aa]==nil or craft_guide.basic_item_groups[aa]=="" then
break
elseif minetest.get_item_group(name, string.lower(craft_guide.basic_item_groups[aa]))>0 then
isbase=1
break
end
end
if isbase==0 then
for bb=1,999,1 do
if craft_guide.basic_item_endings[bb]==nil or craft_guide.basic_item_endings[bb]=="" then
break
elseif string.sub(name,string.len(name)-(string.len(craft_guide.basic_item_endings[bb])-1))==
string.lower(craft_guide.basic_item_endings[bb]) then
isbase=1
break
end
end
if isbase==0 then
for cc=1,999,1 do
if craft_guide.basic_items[cc]==nil or craft_guide.basic_items[cc]=="" then
break
elseif name==string.lower(craft_guide.basic_items[cc]) then
isbase=1
break
end
end
end
end
end
end
--starting with correct tabs here again
if isbase==0 then
value=value+1
-- if string.find(name,"slab")~=nil
-- or string.find(name,"panel")~=nil
-- or string.find(name,"microblock")~=nil
-- or string.find(name,"stair")~=nil
-- then
-- value=value+5
-- end
end
end
end
end
if value<bestvalue then
bestcraft=index
bestvalue=value
end
else
craftnumber=999
break
end
end
end
end
end
if finished==1 then
break
end
end
end
local jj=1
local duplicate=0
for name,amount in pairs(list) do
local count=tonumber(amount)
if name~=nil and count>0 and string.lower(name)~=string.upper(name) then
local lower=string.lower(name)
if craft_guide.you_need_list[lower]~=nil and craft_guide.you_need_list[lower]>0 then
craft_guide.you_need_list[lower]=count+craft_guide.you_need_list[lower]
else
inv:add_item("youneed", lower)
if inv:get_stack("youneed",jj)==nil or inv:get_stack("youneed",jj):get_name()=="" then
for jjj=1,jj,1 do
if inv:get_stack("youneed",jjj):get_count()>1 then
local alias=string.lower(inv:get_stack("youneed",jjj):get_name())
if craft_guide.you_need_list[alias]==nil then
craft_guide.you_need_list[alias]={}
craft_guide.you_need_list[alias]=count
inv:set_stack("youneed",jjj,alias)
else
craft_guide.you_need_list[alias]=craft_guide.you_need_list[alias]+count
inv:set_stack("youneed",jjj,alias)
end
end
end
inv:set_stack("youneed",jj,ItemStack(nil))
duplicate=1
list[lower]=0
elseif string.lower(inv:get_stack("youneed",jj):get_name())~=lower then
local alias=string.lower(inv:get_stack("youneed",jj):get_name())
if craft_guide.you_need_list[alias]~=nil then
craft_guide.you_need_list[alias]=craft_guide.you_need_list[alias]+count
else
if list[alias]==nil then
craft_guide.you_need_list[alias]={}
craft_guide.you_need_list[alias]=count
inv:set_stack("youneed",jj,alias)
else
list[alias]=list[alias]+count
end
end
list[lower]=0
else
craft_guide.you_need_list[lower]={}
craft_guide.you_need_list[lower]=count
end
if duplicate==0 then
jj=jj+1
else
duplicate=0
end
if jj>inv:get_size("youneed") then
break
end
end
end
end
meta:set_string("globalcount",tostring(globalcount))
meta:set_string("formspec",craft_guide.get_craft_guide_formspec(meta))
end
-- create_inventory
craft_guide.create_inventory = function(inv, search)
local craft_guide_list = {}
for name,def in pairs(minetest.registered_items) do
-- local craft_recipe = minetest.get_craft_recipe(name);
-- if craft_recipe.items ~= nil then
local craft = craft_guide.crafts[name];
if (not def.groups.not_in_craft_guide or def.groups.not_in_craft_guide == 0)
and (craft ~= nil or (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0))
--and (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0)
and def.description and def.description ~= "" then
if search and search~="" then
--search used to display groups of items
--if you enter something in search field it displays items without crafting recipes too
search=string.lower(search)
if string.sub(search,1,6)=="group:" then
local groups=string.sub(search,7)
local hasgroup=0
for group in string.gmatch(groups,"([^,]+)") do
if minetest.get_item_group(name, group)>0 then
hasgroup=1
else
hasgroup=0
break
end
end
if hasgroup==1 then
table.insert(craft_guide_list, name)
end
else
search=string.lower(search)
local test1=0
local test2=0
local test3=0
test1,test2=string.find(string.lower(def.name.." "), search)
test2,test3=string.find(string.lower(def.description.." "), search)
if (test1~=nil and test1>0) or (test2~=nil and test2>0) or search=="*" then
table.insert(craft_guide_list, name)
end
end
else
if craft~=nil and ((craft[1]).type~="fuel" or craft_guide.show_all_fuel_crafts) then
table.insert(craft_guide_list, name)
end
end
end
end
table.sort(craft_guide_list)
for i=0,inv:get_size("main"),1 do
inv:set_stack("main", i, nil)
end
inv:set_size("main", #craft_guide_list)
for _,itemstring in ipairs(craft_guide_list) do
inv:add_item("main", ItemStack(itemstring))
end
end
-- add fuel recipes and recipes from technic machines to craft list
craft_guide.add_additional_crafts = function()
if craft_guide.other_crafting_types then
if minetest.get_modpath("technic") then
local oldversion=false
local recipelist={}
if technic.recipes==nil or technic.recipes["grinding"]==nil and technic.grinder_recipes~=nil then
oldversion=true
recipelist=technic.grinder_recipes
for t,recipe in pairs(recipelist) do
recipe.type="Grinder"
local name=ItemStack(recipe.output):get_name()
if name~=nil and name~="" then
if craft_guide.crafts[name]==nil then
craft_guide.crafts[name] = {}
end
recipe.time=recipe.time or 3
table.insert(craft_guide.crafts[name],recipe)
end
end
else
recipelist=technic.recipes["grinding"].recipes
for t,recipe in pairs(recipelist) do
recipe.type="Grinder"
local name=ItemStack(recipe.output):get_name()
if name~=nil and name~="" and (not craft_guide.remove_cluttering_crafts
or (string.find(name,"technic:uranium._")==nil
and string.find(name,"technic:uranium.._")==nil)) then
if craft_guide.crafts[name]==nil then
craft_guide.crafts[name] = {}
end
local idx=1
for _name, _count in pairs(recipe.input) do
recipe.input[idx]=_name.." ".._count
break
end
recipe.time=recipe.time or 3
table.insert(craft_guide.crafts[name],recipe)
end
end
end
if oldversion then
for t,recipe in pairs(technic.compressor_recipes) do
recipe.type="Compressor"
local name=ItemStack(recipe.dst_name):get_name()
if name~=nil and name~="" then
if craft_guide.crafts[name]==nil then
craft_guide.crafts[name] = {}
end
recipe.input=t.." "..tostring(recipe.src_count)
recipe.output=recipe.dst_name.." "..tostring(recipe.dst_count)
recipe.time=recipe.time or 4
table.insert(craft_guide.crafts[name],recipe)
end
end
else
for t,recipe in pairs(technic.recipes["compressing"].recipes) do
recipe.type="Compressor"
local name=ItemStack(recipe.output):get_name()
if name~=nil and name~="" then
if craft_guide.crafts[name]==nil then
craft_guide.crafts[name] = {}
end
local idx=1
for _name, _count in pairs(recipe.input) do
recipe.input[idx]=_name.." ".._count
break
end
recipe.time=recipe.time or 4
table.insert(craft_guide.crafts[name],recipe)
end
end
end
if oldversion then
for t,recipe in pairs(technic.extractor_recipes) do
recipe.type="Extractor"
local name=ItemStack(recipe.dst_name):get_name()
if name~=nil and name~="" then
if craft_guide.crafts[name]==nil then
craft_guide.crafts[name] = {}
end
recipe.input=t.." "..tostring(recipe.src_count)
recipe.output=recipe.dst_name.." "..tostring(recipe.dst_count)
recipe.time=recipe.time or 4
table.insert(craft_guide.crafts[name],recipe)
end
end
else
for t,recipe in pairs(technic.recipes["extracting"].recipes) do
recipe.type="Extractor"
local name=ItemStack(recipe.output):get_name()
if name~=nil and name~="" then
if craft_guide.crafts[name]==nil then
craft_guide.crafts[name] = {}
end
local idx=1
for _name, _count in pairs(recipe.input) do
recipe.input[idx]=_name.." ".._count
break
end
recipe.time=recipe.time or 4
table.insert(craft_guide.crafts[name],recipe)
end
end
end
if oldversion then
recipelist=technic.alloy_recipes
for t,recipe in pairs(recipelist) do
recipe.type="Alloy Furnace"
local name=ItemStack(recipe.output):get_name()
if name~=nil and name~="" then
if craft_guide.crafts[name]==nil then
craft_guide.crafts[name] = {}
end
recipe.time=recipe.time or 6
table.insert(craft_guide.crafts[name],recipe)
end
end
else
recipelist=technic.recipes["alloy"].recipes
for t,recipe in pairs(recipelist) do
local rec={}
rec.type="Alloy Furnace"
local name=ItemStack(recipe.output):get_name()
if name~=nil and name~="" then
if craft_guide.crafts[name]==nil then
craft_guide.crafts[name] = {}
end
local idx=1
rec.output=recipe.output
rec.time=recipe.time or 6
rec.input={}
for _name, _count in pairs(recipe.input) do
rec.input[idx]=_name.." ".._count
idx=idx+1
if idx>2 then
break
end
end
table.insert(craft_guide.crafts[name],rec)
end
end
end
if not oldversion then
for t,recipe in pairs(technic.recipes["separating"].recipes) do
local rec={}
local rec2={}
rec.type="Centrifuge"
rec2.type="Centrifuge"
local name=ItemStack(recipe.output[1]):get_name()
local name2=ItemStack(recipe.output[2]):get_name()
local count=ItemStack(recipe.output[1]):get_count()
local count2=ItemStack(recipe.output[2]):get_count()
if name~=nil and name~="" and (not craft_guide.remove_cluttering_crafts
or (string.find(name,"technic:uranium._")==nil
and string.find(name,"technic:uranium.._")==nil)) then
if craft_guide.crafts[name]==nil then
craft_guide.crafts[name] = {}
end
local idx=1
rec.input={}
rec2.input={}
for _name, _count in pairs(recipe.input) do
rec.input[idx]=_name.." ".._count
rec2.input[idx]=_name.." ".._count
break
end
rec.time=recipe.time or 10
rec2.time=recipe.time or 10
rec.output2=name2.." "..tostring(count2)
rec.output=name.." "..tostring(count)
table.insert(craft_guide.crafts[name],rec)
if name2~=nil and name2~="" and (not craft_guide.remove_cluttering_crafts
or (string.find(name2,"technic:uranium._")==nil
and string.find(name2,"technic:uranium.._")==nil)) then
if craft_guide.crafts[name2]==nil then
craft_guide.crafts[name2] = {}
end
rec2.output=name2.." "..tostring(count2)
rec2.output2=name.." "..tostring(count)
table.insert(craft_guide.crafts[name2],rec2)
end
end
end
end
end
end
craft_guide.other_crafting_types = false
if craft_guide.fuel_to_add then
--add crafts with type "fuel"
for name,def in pairs(minetest.registered_items) do
if (not def.groups.not_in_craft_guide or def.groups.not_in_craft_guide == 0) then
if craft_guide.fuel[name]~=nil then
if craft_guide.crafts[name]==nil then
craft_guide.crafts[name] = {}
end
local fuels=craft_guide.fuel[name]
local fuel=fuels[1]
table.insert(craft_guide.crafts[name],fuel)
else
local best=0
local bestgroup=""
for group,_ in pairs(def.groups) do
if craft_guide.fuel["group:"..group]~=nil then
local fuels=craft_guide.fuel["group:"..group]
local fuel=fuels[1]
if fuel.burntime>best then
best=fuel.burntime
bestgroup=group
end
end
end
if bestgroup~="" then
if craft_guide.crafts[name]==nil then
craft_guide.crafts[name] = {}
end
local fuels=craft_guide.fuel["group:"..bestgroup]
local fuel=fuels[1]
table.insert(craft_guide.crafts[name],fuel)
end
end
end
end
end
craft_guide.fuel_to_add=false
craft_guide.fuel=nil
craft_guide.fuel={}
-- all aliases should share the same crafting recipes
if craft_guide.add_things then
for i=1,9999,2 do
local alias=craft_guide.alias[i]
local convert_to=craft_guide.alias[i+1]
if alias~=nil and convert_to~=nil and (craft_guide.crafts[convert_to]~=nil or craft_guide.crafts[alias]~=nil) then
if craft_guide.crafts[convert_to]==nil and craft_guide.crafts[alias]~=nil then
craft_guide.crafts[convert_to]={}
elseif craft_guide.crafts[alias]==nil and craft_guide.crafts[convert_to]~=nil then
craft_guide.crafts[alias]={}
end
for ii=1,9999,1 do
local craft=(craft_guide.crafts[alias])[ii]
if craft==nil then
break
else
table.insert(craft_guide.crafts[convert_to],craft)
end
end
craft_guide.crafts[alias]={}
for ii=1,9999,1 do
local craft=(craft_guide.crafts[convert_to])[ii]
if craft==nil then
break
else
table.insert(craft_guide.crafts[alias],craft)
end
end
end
end
end
craft_guide.add_things=false
end
-- allow_metadata_inventory_move
craft_guide.allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
local meta = minetest.env:get_meta(pos)
local inv = meta:get_inventory()
if to_list == "bin" and from_list == "output" then
inv:set_stack(from_list,from_index,nil)
craft_guide.update_recipe(meta, player, inv:get_stack(from_list, from_index))
end
if to_list == "bin" and from_list == "bookmark" then
inv:set_stack(from_list,from_index,nil)
inv:set_stack("add",1,nil)--clear this because bookmarks aren't full anymore
end
if to_list == "bookmark" and not inv:contains_item("bookmark",inv:get_stack(from_list, from_index):get_name()) then
inv:set_stack(to_list, to_index, inv:get_stack(from_list, from_index):get_name())
if not inv:contains_item("bookmark",ItemStack(nil)) then
inv:set_stack("add", 1, inv:get_stack("bookmark", tonumber(meta:get_string("addindex"))):get_name())
end
end
if to_list == "add" and not inv:contains_item("bookmark",inv:get_stack(from_list, from_index):get_name()) then
local index=tonumber(meta:get_string("addindex"))
local stack=inv:get_stack("bookmark",index)
local status=0
if stack~=nil and stack:get_name()~=nil and stack:get_name()~="" then
for i=1,inv:get_size("bookmark"),1 do
stack=inv:get_stack("bookmark",i)
if stack~=nil and stack:get_name()~=nil and stack:get_name()~="" then
else
if status==0 then
inv:set_stack("bookmark", i, inv:get_stack(from_list, from_index):get_name())
meta:set_string("addindex",tostring(i))
status=1
elseif status==1 then
status=2
end
end
end
if status==1 then --bookmarks are full now
inv:set_stack("add", to_index, inv:get_stack(from_list, from_index):get_name())
elseif status==2 then --bookmarks has still empty slots after adding this stack
inv:set_stack("add", to_index, nil)
elseif status==0 then --bookmarks were already full, replace last added item
inv:set_stack("bookmark", index, inv:get_stack(from_list, from_index):get_name())
inv:set_stack("add", to_index, inv:get_stack(from_list, from_index):get_name())
end
else
inv:set_stack("bookmark", index, inv:get_stack(from_list, from_index):get_name())
inv:set_stack("add", to_index, nil)
end
end
if to_list == "output" or from_list == "output" then
if from_list ~= "output" and to_list == "output" then
local name=inv:get_stack(from_list, from_index)
if name~=nil then
name=name:get_name()
end
if name~=nil then
meta:set_string("out",name)
inv:set_stack(to_list, to_index, nil)
end
end
if from_list == "output" and (to_list == "bin" or to_list=="add" ) then
meta:set_string("out","")
end
craft_guide.update_recipe(meta, player, inv:get_stack(from_list, from_index))
end
if from_list == "bookmark" and to_list == "bookmark" then
return count
end
return 0
end
-- allow_metadata_inventory_put
craft_guide.allow_metadata_inventory_put = function(pos, listname, index, stack, player)
return 0
end
-- allow_metadata_inventory_take
craft_guide.allow_metadata_inventory_take = function(pos, listname, index, stack, player)
return 0
end