mirror of
https://github.com/minetest-mods/craftguide.git
synced 2024-11-25 12:13:43 +01:00
Switch to formspec_version 4 and drop sfinv(-buttons) support
This commit is contained in:
parent
b9e4d75545
commit
8843bb978c
460
init.lua
460
init.lua
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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=
|
||||||
|
1
mod.conf
1
mod.conf
@ -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
|
||||||
|
@ -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
|
|
||||||
|
Loading…
Reference in New Issue
Block a user