Switch to formspec_version 4 and drop sfinv(-buttons) support

This commit is contained in:
Jean-Patrick Guerrero 2020-12-08 00:32:09 +01:00
parent b9e4d75545
commit 8843bb978c
5 changed files with 170 additions and 296 deletions

460
init.lua
View File

@ -11,7 +11,6 @@ local replacements = {fuel = {}}
local toolrepair local toolrepair
local progressive_mode = core.settings:get_bool "craftguide_progressive_mode" local progressive_mode = core.settings:get_bool "craftguide_progressive_mode"
local sfinv_only = core.settings:get_bool "craftguide_sfinv_only" and rawget(_G, "sfinv")
local http = core.request_http_api() local http = core.request_http_api()
local singleplayer = core.is_singleplayer() local singleplayer = core.is_singleplayer()
@ -62,16 +61,12 @@ local min, max, floor, ceil, abs = math.min, math.max, math.floor, math.ceil, ma
local pairs, ipairs, next, type, setmetatable = pairs, ipairs, next, type, setmetatable local pairs, ipairs, next, type, setmetatable = pairs, ipairs, next, type, setmetatable
local vec_add, vec_mul = vector.add, vector.multiply local vec_add, vec_mul = vector.add, vector.multiply
local ROWS = 9 local ROWS, _ROWS = 9
local LINES = sfinv_only and 5 or 10 local LINES = 10
local IPP = ROWS * LINES local IPP = ROWS * LINES
local WH_LIMIT = 10
local MAX_FAVS = 6 local MAX_FAVS = 6
local ITEM_BTN_SIZE = 1.1 local ITEM_BTN_SIZE = 1.1
local XOFFSET = sfinv_only and 3.83 or 11.2
local YOFFSET = sfinv_only and 4.9 or 1
-- Progressive mode -- Progressive mode
local POLL_FREQ = 0.25 local POLL_FREQ = 0.25
local HUD_TIMER_MAX = 1.5 local HUD_TIMER_MAX = 1.5
@ -112,7 +107,7 @@ local fs_elements = {
image_button = "image_button[%f,%f;%f,%f;%s;%s;%s]", image_button = "image_button[%f,%f;%f,%f;%s;%s;%s]",
animated_image = "animated_image[%f,%f;%f,%f;;%s;%u;%u]", animated_image = "animated_image[%f,%f;%f,%f;;%s;%u;%u]",
item_image_button = "item_image_button[%f,%f;%f,%f;%s;%s;%s]", item_image_button = "item_image_button[%f,%f;%f,%f;%s;%s;%s]",
arrow = "image_button[%f,%f;0.8,0.8;%s;%s;;;false;%s]", arrow = "image_button[%f,%f;0.7,0.7;%s;%s;;;false;%s]",
} }
local styles = sprintf([[ local styles = sprintf([[
@ -495,6 +490,7 @@ function craftguide.register_craft(def)
def.custom = true def.custom = true
def.width = width def.width = width
insert(recipes_cache[item], def) insert(recipes_cache[item], def)
end end
@ -746,7 +742,9 @@ local function cache_recipes(item)
recipes = _recipes recipes = _recipes
end end
recipes_cache[item] = recipes if recipes then
recipes_cache[item] = table_merge(recipes, recipes_cache[item] or {})
end
end end
local function get_recipes(item, data, player) local function get_recipes(item, data, player)
@ -759,20 +757,8 @@ local function get_recipes(item, data, player)
end end
local no_recipes = not recipes or #recipes == 0 local no_recipes = not recipes or #recipes == 0
if no_recipes and not usages then return end
if no_recipes and not usages then usages = apply_recipe_filters(usages, player)
return
elseif sfinv_only then
if usages and no_recipes then
data.show_usages = true
elseif recipes and not usages then
data.show_usages = nil
end
end
if not sfinv_only or (sfinv_only and data.show_usages) then
usages = apply_recipe_filters(usages, player)
end
local no_usages = not usages or #usages == 0 local no_usages = not usages or #usages == 0
@ -952,8 +938,8 @@ local function get_output_fs(fs, rcp, shapeless, right, btn_size, _btn_size, spa
icon = sprintf("craftguide_%s.png^[resize:16x16", icon) icon = sprintf("craftguide_%s.png^[resize:16x16", icon)
end end
local pos_x = right + btn_size + 0.1 local pos_x = right + btn_size + 0.35
local pos_y = YOFFSET + (sfinv_only and 1.55 or -0.45) + spacing local pos_y = spacing + 0.9
if sub(icon, 1, 18) == "craftguide_furnace" then if sub(icon, 1, 18) == "craftguide_furnace" then
fs(fmt("animated_image", pos_x, pos_y, 0.5, 0.5, PNG.furnace_anim, 8, 180)) fs(fmt("animated_image", pos_x, pos_y, 0.5, 0.5, PNG.furnace_anim, 8, 180))
@ -967,9 +953,9 @@ local function get_output_fs(fs, rcp, shapeless, right, btn_size, _btn_size, spa
fs(fmt("tooltip", pos_x, pos_y, 0.5, 0.5, ESC(tooltip))) fs(fmt("tooltip", pos_x, pos_y, 0.5, 0.5, ESC(tooltip)))
end end
local arrow_X = right + (_btn_size or ITEM_BTN_SIZE) local arrow_X = right + 0.2 + (_btn_size or ITEM_BTN_SIZE)
local X = arrow_X + 0.9 local X = arrow_X + 1.1
local Y = YOFFSET + (sfinv_only and 2 or 0) + spacing local Y = spacing + 1.4
fs(fmt("image", arrow_X, Y + 0.2, 0.9, 0.7, PNG.arrow)) fs(fmt("image", arrow_X, Y + 0.2, 0.9, 0.7, PNG.arrow))
@ -980,12 +966,13 @@ local function get_output_fs(fs, rcp, shapeless, right, btn_size, _btn_size, spa
item = clean_name(item) item = clean_name(item)
local name = match(item, "%S*") local name = match(item, "%S*")
fs(fmt("image", X, Y - 0.1, ITEM_BTN_SIZE * 1.2, ITEM_BTN_SIZE * 1.2, PNG.selected)) fs(fmt("image",
X, Y - 0.11, ITEM_BTN_SIZE * 1.2, ITEM_BTN_SIZE * 1.2, PNG.selected))
local _name = sfinv_only and name or sprintf("_%s", name) local _name = sprintf("_%s", name)
fs(fmt("item_image_button", fs(fmt("item_image_button",
X + 0.09, Y, ITEM_BTN_SIZE, ITEM_BTN_SIZE, item, _name, "")) X + 0.1, Y, ITEM_BTN_SIZE, ITEM_BTN_SIZE, item, _name, ""))
local def = reg_items[name] local def = reg_items[name]
local unknown = not def or nil local unknown = not def or nil
@ -1005,15 +992,6 @@ local function get_output_fs(fs, rcp, shapeless, right, btn_size, _btn_size, spa
if next(infos) then if next(infos) then
fs(get_tooltip(_name, infos)) fs(get_tooltip(_name, infos))
end end
if infos.burntime and sfinv_only then
fs(fmt("image",
X + 1.15, YOFFSET + (sfinv_only and 2 or 0.1) + spacing,
0.6, 0.4, PNG.arrow),
fmt("animated_image",
X + 1.75, YOFFSET + (sfinv_only and 1.85 or 0) + spacing,
0.6, 0.6, PNG.fire_anim, 8, 180))
end
end end
end end
@ -1031,16 +1009,6 @@ local function get_grid_fs(fs, rcp, spacing)
end end
local rows = ceil(maxn(rcp.items) / width) local rows = ceil(maxn(rcp.items) / width)
if width > WH_LIMIT or rows > WH_LIMIT then
fs(fmt("label",
XOFFSET + (sfinv_only and -1.5 or -1.6),
YOFFSET + (sfinv_only and 0.5 or spacing),
ES("Recipe's too big to be displayed (@1x@2)", width, rows)))
return concat(fs)
end
local large_recipe = width > 3 or rows > 3 local large_recipe = width > 3 or rows > 3
if large_recipe then if large_recipe then
@ -1052,17 +1020,21 @@ local function get_grid_fs(fs, rcp, spacing)
item = clean_name(item) item = clean_name(item)
local name = match(item, "%S*") local name = match(item, "%S*")
local X = ceil((i - 1) % width - width) + XOFFSET local X = ceil((i - 1) % width - width)
local Y = ceil(i / width) + YOFFSET - min(2, rows) + spacing X = X + (X * 0.2) + _ROWS + 3.9
local Y = ceil(i / width) - min(2, rows)
Y = Y + (Y * 0.15) + spacing + 1.4
if large_recipe then if large_recipe then
btn_size = (width > 3 and 3 / width or 3 / rows) + 0.1 btn_size = (3 / width) * (3 / rows) + 0.3
_btn_size = btn_size _btn_size = btn_size
local xi = (i - 1) % width local xi = (i - 1) % width
local yi = floor((i - 1) / width) local yi = floor((i - 1) / width)
X = btn_size * xi + XOFFSET - 2.65 - (xi * 0.15) X = btn_size * xi + _ROWS + 0.3 + (xi * 0.05)
Y = btn_size * yi + spacing + (sfinv_only and 4 or 0) - (yi * 0.1) Y = btn_size * yi + spacing + 0.2 + (yi * 0.05)
end end
if X > right then if X > right then
@ -1101,8 +1073,6 @@ local function get_grid_fs(fs, rcp, spacing)
end end
end end
Y = Y + (sfinv_only and 2 or 0)
if not large_recipe then if not large_recipe then
fs(fmt("image", X, Y, btn_size, btn_size, PNG.selected)) fs(fmt("image", X, Y, btn_size, btn_size, PNG.selected))
end end
@ -1140,36 +1110,27 @@ local function get_grid_fs(fs, rcp, spacing)
end end
local function get_rcp_lbl(fs, data, panel, spacing, rn, is_recipe) local function get_rcp_lbl(fs, data, panel, spacing, rn, is_recipe)
local lbl local lbl = ES("Usage @1 of @2", data.unum, rn)
if (not sfinv_only and is_recipe) or (sfinv_only and not data.show_usages) then if is_recipe then
lbl = ES("Recipe @1 of @2", data.rnum, rn) lbl = ES("Recipe @1 of @2", data.rnum, rn)
elseif not sfinv_only or (sfinv_only and data.show_usages) then
lbl = ES("Usage @1 of @2", data.unum, rn)
elseif sfinv_only then
lbl = data.show_usages and ES("Usage @1 of @2", data.unum, rn) or
ES("Recipe @1 of @2", data.rnum, rn)
end end
local _lbl = translate(data.lang_code, lbl) local _lbl = translate(data.lang_code, lbl)
local lbl_len = #_lbl:gsub("[\128-\191]", "") -- Count chars, not bytes in UTF-8 strings local lbl_len = #_lbl:gsub("[\128-\191]", "") -- Count chars, not bytes in UTF-8 strings
local shift = min(0.9, abs(12 - max(12, lbl_len)) * 0.1) local shift = min(0.9, abs(12 - max(12, lbl_len)) * 0.15)
fs(fmt("label", fs(fmt("label", _ROWS + 5.65 - shift, spacing + 3.37, lbl))
XOFFSET + (sfinv_only and 2.3 or 1.6) - shift,
YOFFSET + (sfinv_only and 3.4 or 1.5 + spacing), lbl))
if rn > 1 then if rn > 1 then
local btn_suffix = is_recipe and "recipe" or "usage" local btn_suffix = is_recipe and "recipe" or "usage"
local prev_name = sprintf("prev_%s", btn_suffix) local prev_name = sprintf("prev_%s", btn_suffix)
local next_name = sprintf("next_%s", btn_suffix) local next_name = sprintf("next_%s", btn_suffix)
local x_arrow = XOFFSET + (sfinv_only and 1.7 or 1) local x_arrow = _ROWS + 4.9
local y_arrow = YOFFSET + (sfinv_only and 3.3 or 1.4 + spacing) local y_arrow = spacing + 3
fs(fmt("arrow", x_arrow - shift, y_arrow, PNG.prev, prev_name, ""), fs(fmt("arrow", x_arrow - shift, y_arrow, PNG.prev, prev_name, ""),
fmt("arrow", x_arrow + 1.8, y_arrow, PNG.next, next_name, "")) fmt("arrow", x_arrow + 2.3, y_arrow, PNG.next, next_name, ""))
end end
local rcp = is_recipe and panel.rcp[data.rnum] or panel.rcp[data.unum] local rcp = is_recipe and panel.rcp[data.rnum] or panel.rcp[data.unum]
@ -1177,10 +1138,29 @@ local function get_rcp_lbl(fs, data, panel, spacing, rn, is_recipe)
end end
local function get_title_fs(query_item, favs, lang_code, fs, spacing) local function get_title_fs(query_item, favs, lang_code, fs, spacing)
local fav = is_fav(favs, query_item)
local nfavs = #favs
local star_x, star_y, star_size = _ROWS + 0.4, spacing + 0.45, 0.45
if nfavs < MAX_FAVS or (nfavs == MAX_FAVS and fav) then
local fav_marked = sprintf("craftguide_fav%s.png", fav and "_off" or "")
fs(sprintf("style[fav;fgimg=%s;fgimg_hovered=%s;fgimg_pressed=%s]",
sprintf("craftguide_fav%s.png", fav and "" or "_off"),
fav_marked, fav_marked),
fmt("image_button", star_x, star_y, star_size, star_size, "", "fav", ""),
sprintf("tooltip[fav;%s]", fav and ES"Unmark this item" or ES"Mark this item"))
else
fs(sprintf("style[fav_no;fgimg=%s;fgimg_hovered=%s;fgimg_pressed=%s]",
"craftguide_fav_off.png", PNG.nothing, PNG.nothing),
fmt("image_button", star_x, star_y, star_size, star_size, "", "fav_no", ""),
sprintf("tooltip[fav_no;%s]", ES"Cannot mark this item. Bookmark limit reached."))
end
fs("style_type[label;font=bold;font_size=+6]", fs("style_type[label;font=bold;font_size=+6]",
fmt("label", 8.75, spacing - 0.1, snip(ESC(get_desc(query_item, lang_code)), 33)), fmt("label", _ROWS + 1.1, spacing + 0.45, snip(ESC(get_desc(query_item, lang_code)), 31)),
"style_type[label;font=mono;font_size=+0]", "style_type[label;font=mono;font_size=+0]",
fmt("label", 8.75, spacing + 0.3, clr("#7bf", snip(query_item, 35))), fmt("label", _ROWS + 1.1, spacing + 0.95, clr("#7bf", snip(query_item, 34))),
"style_type[label;font=normal]") "style_type[label;font=normal]")
local def = reg_items[query_item] local def = reg_items[query_item]
@ -1226,41 +1206,20 @@ local function get_title_fs(query_item, favs, lang_code, fs, spacing)
t[#t + 1] = t[#t] t[#t + 1] = t[#t]
end end
fs(fmt("model", 13.5, spacing - 0.2, 1.2, 1.2, "", def.mesh, concat(t, ","))) --fs("style_type[model;bgcolor=black]")
fs(fmt("model", _ROWS + 6.6, spacing + 0.05, 1.3, 1.3, "", def.mesh, concat(t, ",")))
else else
fs(fmt("item_image", 13.6, spacing - 0.13, 1.1, 1.1, query_item)) fs(fmt("item_image", _ROWS + 6.8, spacing + 0.17, 1.1, 1.1, query_item))
end
local fav = is_fav(favs, query_item)
local nfavs = #favs
if nfavs < MAX_FAVS or (nfavs == MAX_FAVS and fav) then
local fav_marked = sprintf("craftguide_fav%s.png", fav and "_off" or "")
fs(sprintf("style[fav;fgimg=%s;fgimg_hovered=%s;fgimg_pressed=%s]",
sprintf("craftguide_fav%s.png", fav and "" or "_off"),
fav_marked, fav_marked),
fmt("image_button", 8.25, spacing + 0.15, 0.5, 0.45, "", "fav", ""),
sprintf("tooltip[fav;%s]", fav and ES"Unmark this item" or ES"Mark this item"))
else
fs(sprintf("style[fav_no;fgimg=%s;fgimg_hovered=%s;fgimg_pressed=%s]",
"craftguide_fav_off.png", PNG.nothing, PNG.nothing),
fmt("image_button", 8.25, spacing + 0.15, 0.5, 0.45, "", "fav_no", ""),
sprintf("tooltip[fav_no;%s]", ES"Cannot mark this item. Bookmark limit reached."))
end end
end end
local function get_panels(data, fs) local function get_panels(data, fs)
local _title = {name = "title", height = 1.2} local _title = {name = "title", height = 1.4}
local _favs = {name = "favs", height = 1.91} local _favs = {name = "favs", height = 2.2}
local _recipes = {name = "recipes", rcp = data.recipes, height = 3.5} local _recipes = {name = "recipes", rcp = data.recipes, height = 3.9}
local _usages = {name = "usages", rcp = data.usages, height = 3.5} local _usages = {name = "usages", rcp = data.usages, height = 3.9}
local panels = {_title, _recipes, _usages, _favs} local panels = {_title, _recipes, _usages, _favs}
if sfinv_only then
panels = {data.show_usages and _usages or _recipes}
end
for idx = 1, #panels do for idx = 1, #panels do
local panel, spacing = panels[idx], 0 local panel, spacing = panels[idx], 0
@ -1271,31 +1230,30 @@ local function get_panels(data, fs)
end end
local rn = panel.rcp and #panel.rcp local rn = panel.rcp and #panel.rcp
local is_recipe = sfinv_only and not data.show_usages or panel.name == "recipes" local is_recipe = panel.name == "recipes"
local recipe_or_usage = panel.name == "recipes" or panel.name == "usages" local recipe_or_usage = panel.name == "recipes" or panel.name == "usages"
if rn then if rn then
get_rcp_lbl(fs, data, panel, spacing, rn, is_recipe) get_rcp_lbl(fs, data, panel, spacing, rn, is_recipe)
end end
if sfinv_only then return end fs(fmt("bg9", _ROWS + 0.1, spacing, 7.9, panel.height, PNG.bg_full, 10))
fs(fmt("bg9", 8.1, -0.2 + spacing, 6.6, panel.height, PNG.bg_full, 10))
if recipe_or_usage and not rn then if recipe_or_usage and not rn then
local lbl = is_recipe and ES"No recipes" or ES"No usages" local lbl = is_recipe and ES"No recipes" or ES"No usages"
fs(fmt("button", 8, YOFFSET + spacing + 0.1, 6.8, 1, "", lbl)) fs(fmt("button",
_ROWS + 0.1, spacing + (panel.height / 2) - 0.5, 7.8, 1, "", lbl))
elseif panel.name == "title" then elseif panel.name == "title" then
get_title_fs(data.query_item, data.favs, data.lang_code, fs, spacing) get_title_fs(data.query_item, data.favs, data.lang_code, fs, spacing)
elseif panel.name == "favs" then elseif panel.name == "favs" then
fs(fmt("label", 8.3, spacing - 0.15, ES"Bookmarks")) fs(fmt("label", _ROWS + 0.4, spacing + 0.4, ES"Bookmarks"))
for i = 1, #data.favs do for i = 1, #data.favs do
local item = data.favs[i] local item = data.favs[i]
local X = 7.85 + (i - 0.5) local X = _ROWS - 0.7 + (i * 1.2)
local Y = spacing + 0.4 local Y = spacing + 0.8
if data.query_item == item then if data.query_item == item then
fs(fmt("image", fs(fmt("image",
@ -1316,42 +1274,36 @@ local function make_fs(data)
end end
}) })
_ROWS = ROWS + 0.8
fs(sprintf([[ fs(sprintf([[
formspec_version[%u]
size[%f,%f] size[%f,%f]
no_prepend[] no_prepend[]
bgcolor[#0000] bgcolor[#0000]
]], ]],
9 + (data.query_item and 6.7 or 0) - 1.2, LINES - 0.3), styles) MIN_FORMSPEC_VERSION, _ROWS + (data.query_item and 8 or 0), LINES + 1.7), styles)
if not sfinv_only then fs(fmt("bg9", 0, 0, _ROWS, LINES + 1.7, PNG.bg_full, 10))
fs(fmt("bg9", -0.15, -0.2, 9 - 0.9, LINES + 0.4, PNG.bg_full, 10))
end
fs(sprintf([[ fs(sprintf([[
field[0.4,0.2;2.6,1;filter;;%s] set_focus[filter;true]
field[0.2,0.2;3.5,0.6;filter;;%s]
field_close_on_enter[filter;false] field_close_on_enter[filter;false]
box[0,0;2.5,0.6;#bababa25] box[0.2,0.2;3.5,0.6;#bababa25]
]], ESC(data.filter)), ]], ESC(data.filter)),
fmt("image_button", 2.6, -0.06, 0.85, 0.85, "", "search", ""), fmt("image_button", 3.75, 0.15, 0.7, 0.7, "", "search", ""),
fmt("image_button", 3.3, -0.06, 0.85, 0.85, "", "clear", "")) fmt("image_button", 4.43, 0.15, 0.7, 0.7, "", "clear", ""))
if sfinv_only then fs(fmt("image_button", 6.8, 0.15, 0.7, 0.7, "", "prev_page", ""),
fs("container[0.2,0]") fmt("image_button", 9.1, 0.15, 0.7, 0.7, "", "next_page", ""))
end
fs(fmt("image_button", 5.35, -0.06, 0.85, 0.85, "", "prev_page", ""),
fmt("image_button", 7.1, -0.06, 0.85, 0.85, "", "next_page", ""))
data.pagemax = max(1, ceil(#data.items / IPP)) data.pagemax = max(1, ceil(#data.items / IPP))
fs(fmt("button", fs(fmt("button",
5.97, -0.06, 1.36, 0.85, "pagenum", 7.48, 0.15, 1.68, 0.7, "pagenum",
sprintf("%s / %u", clr("#ff0", data.pagenum), data.pagemax))) sprintf("%s / %u", clr("#ff0", data.pagenum), data.pagemax)))
if sfinv_only then
fs("container_end[]")
end
if #data.items == 0 then if #data.items == 0 then
local lbl = ES"No item to show" local lbl = ES"No item to show"
@ -1359,7 +1311,7 @@ local function make_fs(data)
lbl = ES"Collect items to reveal more recipes" lbl = ES"Collect items to reveal more recipes"
end end
fs(fmt("button", -0.25, 3, 8.3, 1, "", lbl)) fs(fmt("button", 0, 3, _ROWS, 1, "", lbl))
end end
local first_item = (data.pagenum - 1) * IPP local first_item = (data.pagenum - 1) * IPP
@ -1370,8 +1322,8 @@ local function make_fs(data)
local X = i % ROWS local X = i % ROWS
local Y = (i % IPP - X) / ROWS + 1 local Y = (i % IPP - X) / ROWS + 1
X = X - (X * (sfinv_only and 0.12 or 0.14)) - 0.05 X = X - (X * -0.05) + 0.2
Y = Y - (Y * 0.08) - 0.15 Y = Y + (Y * 0.05)
if data.query_item == item then if data.query_item == item then
fs(fmt("image", X, Y, 1, 1, PNG.selected)) fs(fmt("image", X, Y, 1, 1, PNG.selected))
@ -1389,11 +1341,7 @@ end
local show_fs = function(player, name) local show_fs = function(player, name)
local data = pdata[name] local data = pdata[name]
if sfinv_only then show_formspec(name, "craftguide", make_fs(data))
sfinv.set_player_inventory_formspec(player)
else
show_formspec(name, "craftguide", make_fs(data))
end
end end
craftguide.register_craft_type("digging", { craftguide.register_craft_type("digging", {
@ -1582,9 +1530,7 @@ local function get_init_items()
cache_fuel(name) cache_fuel(name)
end end
if not recipes_cache[name] then cache_recipes(name)
cache_recipes(name)
end
_preselect[name] = true _preselect[name] = true
end end
@ -1724,15 +1670,7 @@ local function fields(player, _f)
item = reg_aliases[item] or item item = reg_aliases[item] or item
if sfinv_only then if item == data.query_item then return end
if item ~= data.query_item then
data.show_usages = nil
else
data.show_usages = not data.show_usages
end
elseif item == data.query_item then
return
end
local recipes, usages = get_recipes(item, data, player) local recipes, usages = get_recipes(item, data, player)
if not recipes and not usages then return end if not recipes and not usages then return end
@ -1748,140 +1686,95 @@ local function fields(player, _f)
return true, show_fs(player, name) return true, show_fs(player, name)
end end
if sfinv_only then on_receive_fields(function(player, formname, _f)
sfinv.register_page("craftguide:craftguide", { if formname == "craftguide" then
title = S"Craft Guide", fields(player, _f)
end
end)
is_in_nav = function(self, player, context) local function on_use(user)
local name = player:get_player_name() local name = user:get_player_name()
local info = get_player_info(name) local data = pdata[name]
return get_formspec_version(info) >= MIN_FORMSPEC_VERSION if data.fs_version < MIN_FORMSPEC_VERSION then
end, return outdated(name)
get = function(self, player, context)
local name = player:get_player_name()
local data = pdata[name]
return sfinv.make_formspec(player, context, make_fs(data))
end,
on_enter = function(self, player, context)
if next(recipe_filters) then
local name = player:get_player_name()
local data = pdata[name]
data.items_raw = get_filtered_items(player)
search(data)
end
end,
on_player_receive_fields = function(self, player, context, _f)
fields(player, _f)
end,
})
else
on_receive_fields(function(player, formname, _f)
if formname == "craftguide" then
fields(player, _f)
end
end)
local function on_use(user)
local name = user:get_player_name()
local data = pdata[name]
if data.fs_version < MIN_FORMSPEC_VERSION then
return outdated(name)
end
if next(recipe_filters) then
data.items_raw = get_filtered_items(user)
search(data)
end
show_formspec(name, "craftguide", make_fs(data))
end end
core.register_craftitem("craftguide:book", { if next(recipe_filters) then
description = S"Crafting Guide", data.items_raw = get_filtered_items(user)
inventory_image = PNG.book, search(data)
wield_image = PNG.book,
stack_max = 1,
groups = {book = 1},
on_use = function(itemstack, user)
on_use(user)
end
})
core.register_node("craftguide:sign", {
description = S"Crafting Guide Sign",
drawtype = "nodebox",
tiles = {PNG.sign},
inventory_image = PNG.sign,
wield_image = PNG.sign,
paramtype = "light",
paramtype2 = "wallmounted",
sunlight_propagates = true,
groups = {
choppy = 1,
attached_node = 1,
oddly_breakable_by_hand = 1,
flammable = 3,
},
node_box = {
type = "wallmounted",
wall_top = {-0.5, 0.4375, -0.5, 0.5, 0.5, 0.5},
wall_bottom = {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5},
wall_side = {-0.5, -0.5, -0.5, -0.4375, 0.5, 0.5}
},
on_construct = function(pos)
local meta = core.get_meta(pos)
meta:set_string("infotext", "Crafting Guide Sign")
end,
on_rightclick = function(pos, node, user, itemstack)
on_use(user)
end
})
core.register_craft{
output = "craftguide:book",
type = "shapeless",
recipe = {"default:book"}
}
core.register_craft{
type = "fuel",
recipe = "craftguide:book",
burntime = 3
}
core.register_craft{
output = "craftguide:sign",
type = "shapeless",
recipe = {"default:sign_wall_wood"}
}
core.register_craft{
type = "fuel",
recipe = "craftguide:sign",
burntime = 10
}
if rawget(_G, "sfinv_buttons") then
sfinv_buttons.register_button("craftguide", {
title = S"Crafting Guide",
tooltip = S"Shows a list of available crafting recipes",
image = PNG.book,
action = function(player)
on_use(player)
end,
})
end end
show_formspec(name, "craftguide", make_fs(data))
end end
core.register_craftitem("craftguide:book", {
description = S"Crafting Guide",
inventory_image = PNG.book,
wield_image = PNG.book,
stack_max = 1,
groups = {book = 1},
on_use = function(itemstack, user)
on_use(user)
end
})
core.register_node("craftguide:sign", {
description = S"Crafting Guide Sign",
drawtype = "nodebox",
tiles = {PNG.sign},
inventory_image = PNG.sign,
wield_image = PNG.sign,
paramtype = "light",
paramtype2 = "wallmounted",
sunlight_propagates = true,
groups = {
choppy = 1,
attached_node = 1,
oddly_breakable_by_hand = 1,
flammable = 3,
},
node_box = {
type = "wallmounted",
wall_top = {-0.5, 0.4375, -0.5, 0.5, 0.5, 0.5},
wall_bottom = {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5},
wall_side = {-0.5, -0.5, -0.5, -0.4375, 0.5, 0.5}
},
on_construct = function(pos)
local meta = core.get_meta(pos)
meta:set_string("infotext", "Crafting Guide Sign")
end,
on_rightclick = function(pos, node, user, itemstack)
on_use(user)
end
})
core.register_craft{
output = "craftguide:book",
type = "shapeless",
recipe = {"default:book"}
}
core.register_craft{
type = "fuel",
recipe = "craftguide:book",
burntime = 3
}
core.register_craft{
output = "craftguide:sign",
type = "shapeless",
recipe = {"default:sign_wall_wood"}
}
core.register_craft{
type = "fuel",
recipe = "craftguide:sign",
burntime = 10
}
if progressive_mode then if progressive_mode then
local function item_in_inv(item, inv_items) local function item_in_inv(item, inv_items)
local inv_items_size = #inv_items local inv_items_size = #inv_items
@ -2055,21 +1948,12 @@ if progressive_mode then
if #diff > 0 then if #diff > 0 then
data.inv_items = table_merge(diff, data.inv_items) data.inv_items = table_merge(diff, data.inv_items)
local oldknown = data.known_recipes or 0 local oldknown = data.known_recipes or 0
local items = get_filtered_items(player, data)
data.discovered = data.known_recipes - oldknown data.discovered = data.known_recipes - oldknown
if data.show_hud == nil and data.discovered > 0 then if data.show_hud == nil and data.discovered > 0 then
data.show_hud = true data.show_hud = true
end end
if sfinv_only then
data.items_raw = items
search(data)
sfinv.set_player_inventory_formspec(player)
end
end end
end end
@ -2163,10 +2047,6 @@ function craftguide.show(name, item, show_usages)
data.recipes = recipes data.recipes = recipes
data.usages = usages data.usages = usages
if sfinv_only then
data.show_usages = show_usages
end
show_fs(player, name) show_fs(player, name)
end end

View File

@ -46,7 +46,6 @@ Any wood planks=Quelconques planches de bois
Any wool=Quelconque laine Any wool=Quelconque laine
Any yellow dye=Quelconque colorant jaune Any yellow dye=Quelconque colorant jaune
Any yellow flower=Quelconque fleur jaune Any yellow flower=Quelconque fleur jaune
Recipe's too big to be displayed (@1x@2)=La recette est trop grande pour être affichée (@1x@2)
Shapeless=Sans forme Shapeless=Sans forme
Cooking=Cuisson Cooking=Cuisson
No item to show=Aucun item à afficher No item to show=Aucun item à afficher

View File

@ -46,7 +46,6 @@ Any wood planks=
Any wool= Any wool=
Any yellow dye= Any yellow dye=
Any yellow flower= Any yellow flower=
Recipe's too big to be displayed (@1x@2)=
Shapeless= Shapeless=
Cooking= Cooking=
No item to show= No item to show=

View File

@ -1,3 +1,2 @@
name = craftguide name = craftguide
optional_depends = sfinv, sfinv_buttons
description = The most comprehensive Crafting Guide on Minetest description = The most comprehensive Crafting Guide on Minetest

View File

@ -1,5 +1,2 @@
# The progressive mode shows recipes you can craft from items you ever had in your inventory. # The progressive mode shows recipes you can craft from items you ever had in your inventory.
craftguide_progressive_mode (Learn crafting recipes progressively) bool false craftguide_progressive_mode (Learn crafting recipes progressively) bool false
# Integration in the default Minetest Game inventory.
craftguide_sfinv_only (Crafting Guide in inventory only) bool false