From 930b3185d0f7016ed438ad6616590673974bb4f7 Mon Sep 17 00:00:00 2001 From: Jean-Patrick Guerrero Date: Sun, 14 Feb 2016 15:30:02 +0100 Subject: [PATCH] Move crafting guide to its own book --- craftguide.lua | 151 +++++++++++++++++++++++++++++ init.lua | 1 + recipes.lua | 6 ++ textures/xdecor_crafting_guide.png | Bin 0 -> 201 bytes worktable.lua | 138 +------------------------- 5 files changed, 161 insertions(+), 135 deletions(-) create mode 100644 craftguide.lua create mode 100644 textures/xdecor_crafting_guide.png diff --git a/craftguide.lua b/craftguide.lua new file mode 100644 index 0000000..c1ed579 --- /dev/null +++ b/craftguide.lua @@ -0,0 +1,151 @@ +local craftguide = {} + +function craftguide:get_recipe(item) + if item:sub(1,6) == "group:" then + if item:sub(-4) == "wool" or item:sub(-3) == "dye" then + item = item:sub(7)..":white" + elseif minetest.registered_items["default:"..item:sub(7)] then + item = item:gsub("group:", "default:") + else for node, def in pairs(minetest.registered_items) do + if def.groups[item:match("[^,:]+$")] then item = node end + end + end + end + return item +end + +function craftguide:get_formspec(stack, pagenum, item, recipe_num, filter, player_name) + local inv_size = self[player_name].size + local npp, i, s = 8*3, 0, 0 + local pagemax = math.floor((inv_size - 1) / npp + 1) + + if pagenum > pagemax then pagenum = 1 + elseif pagenum == 0 then pagenum = pagemax end + + local formspec = [[ size[8,6.6;] + tablecolumns[color;text;color;text] + tableoptions[background=#00000000;highlight=#00000000;border=false] + button[5.5,0;0.7,0.95;prev;<] + button[7.3,0;0.7,0.95;next;>] + button[4,0.2;0.7,0.5;search;?] + button[4.6,0.2;0.7,0.5;clearfilter;X] + button[0,0;1.5,1;backcraft;< Back] + tooltip[search;Search] + tooltip[clearfilter;Reset] ]] + .."table[6.1,0.18;1.1,0.5;pagenum;#FFFF00,"..tostring(pagenum).. + ",#FFFFFF,/ "..tostring(pagemax).."]".. + "field[1.8,0.32;2.6,1;filter;;"..filter.."]"..xbg + + for _, name in pairs(self:get_items(filter, player_name)) do + if s < (pagenum - 1) * npp then + s = s + 1 + else if i >= npp then break end + formspec = formspec.."item_image_button["..(i%8)..",".. + (math.floor(i/8)+1)..";1,1;"..name..";"..name..";]" + i = i + 1 + end + end + + if item and minetest.registered_items[item] then + --print(dump(minetest.get_all_craft_recipes(item))) + local items_num = #minetest.get_all_craft_recipes(item) + if recipe_num > items_num then recipe_num = 1 end + + if items_num > 1 then formspec = formspec.. + "button[0,6;1.6,1;alternate;Alternate]".. + "label[0,5.5;Recipe "..recipe_num.." of "..items_num.."]" + end + + local type = minetest.get_all_craft_recipes(item)[recipe_num].type + if type == "cooking" then formspec = formspec.. + "image[3.75,4.6;0.5,0.5;default_furnace_fire_fg.png]" + end + + local items = minetest.get_all_craft_recipes(item)[recipe_num].items + local width = minetest.get_all_craft_recipes(item)[recipe_num].width + if width == 0 then width = math.min(3, #items) end + -- Lua 5.3 removed `table.maxn`, use `xdecor.maxn` in case of breakage. + local rows = math.ceil(table.maxn(items) / width) + + local function is_group(item) + if item:sub(1,6) == "group:" then return "\nG" end + return "" + end + + for i, v in pairs(items) do formspec = formspec.. + "item_image_button["..((i-1) % width + 4.5)..",".. + (math.floor((i-1) / width + (6 - math.min(2, rows))))..";1,1;".. + self:get_recipe(v)..";"..self:get_recipe(v)..";"..is_group(v).."]" + end + + local output = minetest.get_all_craft_recipes(item)[recipe_num].output + formspec = formspec.."item_image_button[2.5,5;1,1;"..output..";"..item..";]".. + "image[3.5,5;1,1;gui_furnace_arrow_bg.png^[transformR90]" + end + + stack:set_metadata(formspec) + self[player_name].formspec = stack:get_metadata() + minetest.show_formspec(player_name, "", formspec) +end + +function craftguide:get_items(filter, player_name) + local items_list = {} + for name, def in pairs(minetest.registered_items) do + if not (def.groups.not_in_creative_inventory == 1) and + minetest.get_craft_recipe(name).items and + def.description and def.description ~= "" and + (not filter or def.name:find(filter, 1, true) or + def.description:lower():find(filter, 1, true)) then + items_list[#items_list+1] = name + end + end + + self[player_name].size = #items_list + table.sort(items_list) + return items_list +end + +minetest.register_on_player_receive_fields(function(player, _, fields) + local player_name = player:get_player_name() + local stack = player:get_wielded_item() + local formspec = craftguide[player_name].formspec + local filter = formspec:match("filter;;([%w_:]+)") or "" + local pagenum = tonumber(formspec:match("#FFFF00,(%d+)")) or 1 + + if fields.clearfilter then + craftguide:get_items(nil, player_name) + craftguide:get_formspec(stack, 1, nil, 1, "", player_name) + elseif fields.alternate then + local item = formspec:match("item_image_button%[.*;([%w_:]+);.*%]") or 1 + local recipe_num = tonumber(formspec:match("Recipe%s(%d+)")) or 1 + recipe_num = recipe_num + 1 + craftguide:get_formspec(stack, pagenum, item, recipe_num, filter, player_name) + elseif fields.search then + craftguide:get_items(fields.filter:lower(), player_name) + craftguide:get_formspec(stack, 1, nil, 1, fields.filter:lower(), player_name) + elseif fields.prev or fields.next then + if fields.prev then pagenum = pagenum - 1 + else pagenum = pagenum + 1 end + craftguide:get_formspec(stack, pagenum, nil, 1, filter, player_name) + else for item in pairs(fields) do + if minetest.get_craft_recipe(item).items then + craftguide:get_formspec(stack, pagenum, item, 1, filter, player_name) + end + end + end +end) + +minetest.register_craftitem("xdecor:crafting_guide", { + description = "Crafting Guide", + inventory_image = "xdecor_crafting_guide.png", + wield_image = "xdecor_crafting_guide.png", + stack_max = 1, + on_use = function(itemstack, user) + local player_name = user:get_player_name() + craftguide[player_name] = {} + + craftguide:get_items(nil, player_name) + craftguide:get_formspec(itemstack, 1, nil, 1, "", player_name) + end +}) + diff --git a/init.lua b/init.lua index 89d1c10..df420f1 100644 --- a/init.lua +++ b/init.lua @@ -11,6 +11,7 @@ dofile(modpath.."/handlers/registration.lua") -- Item files. dofile(modpath.."/chess.lua") dofile(modpath.."/cooking.lua") +dofile(modpath.."/craftguide.lua") dofile(modpath.."/craftitems.lua") dofile(modpath.."/enchanting.lua") dofile(modpath.."/hive.lua") diff --git a/recipes.lua b/recipes.lua index 8da6fcc..706e1b6 100644 --- a/recipes.lua +++ b/recipes.lua @@ -55,6 +55,12 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = "xdecor:crafting_guide", + type = "shapeless", + recipe = {"default:book", "dye:blue"} +}) + minetest.register_craft({ output = "xdecor:cushion 3", recipe = { diff --git a/textures/xdecor_crafting_guide.png b/textures/xdecor_crafting_guide.png new file mode 100644 index 0000000000000000000000000000000000000000..1bc4fb67c22095a81942e7eed90cecd7ab531354 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFv3GfMV1=3Ct4R;^h(zA_JF?6@^ z&RMyBkyldx{$r=sZ(ZS;*mvf_@l8oPRsq#9mIV0)GdMiEkp|=hd%8G=a9mG5z#rnQ zXcE0pp=GJwLXMP1mRVDzTpgH#xJ_Af4{9wD>+(rUNDyaX@@8jaQ%iSroS3pe=$cBp tqcQu0ykynMngYyow_7@_HE`T0z#y5$lPUiGNE6U_22WQ%mvv4FO#tcJKDPh> literal 0 HcmV?d00001 diff --git a/worktable.lua b/worktable.lua index 4217dfa..ca83236 100644 --- a/worktable.lua +++ b/worktable.lua @@ -42,109 +42,6 @@ worktable.repairable_tools = [[ pick, axe, shovel, sword, hoe, armor, shield ]] -function worktable:get_recipe(item) - if item:sub(1,6) == "group:" then - if item:sub(-4) == "wool" or item:sub(-3) == "dye" then - item = item:sub(7)..":white" - elseif minetest.registered_items["default:"..item:sub(7)] then - item = item:gsub("group:", "default:") - else for node, def in pairs(minetest.registered_items) do - if def.groups[item:match("[^,:]+$")] then item = node end - end - end - end - return item -end - -function worktable:craftguide_formspec(meta, pagenum, item, recipe_num, filter) - local inv_size = meta:get_int("inv_size") - local npp, i, s = 8*3, 0, 0 - local pagemax = math.floor((inv_size - 1) / npp + 1) - - if pagenum > pagemax then pagenum = 1 - elseif pagenum == 0 then pagenum = pagemax end - - local formspec = [[ size[8,6.6;] - tablecolumns[color;text;color;text] - tableoptions[background=#00000000;highlight=#00000000;border=false] - button[5.5,0;0.7,0.95;prev;<] - button[7.3,0;0.7,0.95;next;>] - button[4,0.2;0.7,0.5;search;?] - button[4.6,0.2;0.7,0.5;clearfilter;X] - button[0,0;1.5,1;backcraft;< Back] - tooltip[search;Search] - tooltip[clearfilter;Reset] ]] .. - "table[6.1,0.18;1.1,0.5;pagenum;#FFFF00,"..tostring(pagenum).. - ",#FFFFFF,/ "..tostring(pagemax).."]".. - "field[1.8,0.32;2.6,1;filter;;"..filter.."]"..xbg - - for _, name in pairs(self:craftguide_items(meta, filter)) do - if s < (pagenum - 1) * npp then - s = s + 1 - else if i >= npp then break end - formspec = formspec.."item_image_button["..(i%8)..",".. - (math.floor(i/8)+1)..";1,1;"..name..";"..name..";]" - i = i + 1 - end - end - - if item and minetest.registered_items[item] then - --print(dump(minetest.get_all_craft_recipes(item))) - local items_num = #minetest.get_all_craft_recipes(item) - if recipe_num > items_num then recipe_num = 1 end - - if items_num > 1 then formspec = formspec.. - "button[0,6;1.6,1;alternate;Alternate]".. - "label[0,5.5;Recipe "..recipe_num.." of "..items_num.."]" - end - - local type = minetest.get_all_craft_recipes(item)[recipe_num].type - if type == "cooking" then formspec = formspec.. - "image[3.75,4.6;0.5,0.5;default_furnace_fire_fg.png]" - end - - local items = minetest.get_all_craft_recipes(item)[recipe_num].items - local width = minetest.get_all_craft_recipes(item)[recipe_num].width - if width == 0 then width = math.min(3, #items) end - -- Lua 5.3 removed `table.maxn`, use `xdecor.maxn` in case of breakage. - local rows = math.ceil(table.maxn(items) / width) - - local function is_group(item) - if item:sub(1,6) == "group:" then return "\nG" end - return "" - end - - for i, v in pairs(items) do formspec = formspec.. - "item_image_button["..((i-1) % width + 4.5)..",".. - (math.floor((i-1) / width + (6 - math.min(2, rows))))..";1,1;".. - self:get_recipe(v)..";"..self:get_recipe(v)..";"..is_group(v).."]" - end - - local output = minetest.get_all_craft_recipes(item)[recipe_num].output - formspec = formspec.."item_image_button[2.5,5;1,1;"..output..";"..item..";]".. - "image[3.5,5;1,1;gui_furnace_arrow_bg.png^[transformR90]" - end - - meta:set_string("formspec", formspec) -end - -function worktable:craftguide_items(meta, filter) - local items_list = {} - for name, def in pairs(minetest.registered_items) do - if not (def.groups.not_in_creative_inventory == 1) and - minetest.get_craft_recipe(name).items and - def.description and def.description ~= "" and - (not filter or def.name:find(filter, 1, true) or - def.description:lower():find(filter, 1, true)) then - items_list[#items_list+1] = name - end - end - - meta:set_int("inv_size", #items_list) - table.sort(items_list) - return items_list -end - function worktable:get_output(inv, input, name) if inv:is_empty("input") then inv:set_list("forms", {}) return @@ -210,39 +107,10 @@ function worktable.construct(pos) end function worktable.fields(pos, _, fields) - if fields.quit then return end local meta = minetest.get_meta(pos) - local formspec = meta:to_table().fields.formspec - local filter = formspec:match("filter;;([%w_:]+)") or "" - local pagenum = tonumber(formspec:match("#FFFF00,(%d+)")) or 1 - - if fields.back then - worktable.formspecs(meta, 1) - elseif fields.craft then - worktable.formspecs(meta, 2) - elseif fields.storage then - worktable.formspecs(meta, 3) - elseif fields.craftguide or fields.clearfilter then - worktable:craftguide_items(meta, nil) - worktable:craftguide_formspec(meta, 1, nil, 1, "") - elseif fields.alternate then - local item = formspec:match("image_button%[.*;([%w_:]+);.*%]") or "" - local recipe_num = tonumber(formspec:match("Recipe%s(%d+)")) or 1 - recipe_num = recipe_num + 1 - worktable:craftguide_formspec(meta, pagenum, item, recipe_num, filter) - elseif fields.search then - worktable:craftguide_items(meta, fields.filter:lower()) - worktable:craftguide_formspec(meta, 1, nil, 1, fields.filter:lower()) - elseif fields.prev or fields.next then - if fields.prev then pagenum = pagenum - 1 - else pagenum = pagenum + 1 end - worktable:craftguide_formspec(meta, pagenum, nil, 1, filter) - else for item in pairs(fields) do - if minetest.get_craft_recipe(item).items then - worktable:craftguide_formspec(meta, pagenum, item, 1, filter) - end - end - end + if fields.back then worktable.formspecs(meta, 1) + elseif fields.craft then worktable.formspecs(meta, 2) + elseif fields.storage then worktable.formspecs(meta, 3) end end function worktable.dig(pos)