From fab1c54234c7944d376e686041785c4ad0c798ca Mon Sep 17 00:00:00 2001 From: Jean-Patrick Guerrero Date: Tue, 29 Dec 2020 03:09:46 +0100 Subject: [PATCH] WIP inventory mode --- .luacheckrc | 3 +- init.lua | 530 +++++++++++++++++++++++------ license.txt | 2 +- settingtypes.txt | 3 + sounds/craftguide_delete.ogg | Bin 0 -> 8596 bytes sounds/craftguide_tab.ogg | Bin 0 -> 6421 bytes textures/craftguide_compress.png | Bin 0 -> 2825 bytes textures/craftguide_delete.png | Bin 0 -> 4539 bytes textures/craftguide_hb_bg.png | Bin 0 -> 509 bytes textures/craftguide_heart.png | Bin 0 -> 279 bytes textures/craftguide_heart_half.png | Bin 0 -> 5204 bytes textures/craftguide_selected.png | Bin 1328 -> 0 bytes textures/craftguide_slot.png | Bin 0 -> 567 bytes textures/craftguide_sort.png | Bin 0 -> 6278 bytes textures/craftguide_sort2.png | Bin 0 -> 7268 bytes textures/craftguide_tab.png | Bin 0 -> 950 bytes textures/craftguide_tab_hover.png | Bin 0 -> 16499 bytes textures/craftguide_trash.png | Bin 0 -> 1827 bytes 18 files changed, 431 insertions(+), 107 deletions(-) create mode 100755 sounds/craftguide_delete.ogg create mode 100755 sounds/craftguide_tab.ogg create mode 100644 textures/craftguide_compress.png create mode 100644 textures/craftguide_delete.png create mode 100644 textures/craftguide_hb_bg.png create mode 100644 textures/craftguide_heart.png create mode 100644 textures/craftguide_heart_half.png delete mode 100644 textures/craftguide_selected.png create mode 100644 textures/craftguide_slot.png create mode 100644 textures/craftguide_sort.png create mode 100644 textures/craftguide_sort2.png create mode 100644 textures/craftguide_tab.png create mode 100644 textures/craftguide_tab_hover.png create mode 100644 textures/craftguide_trash.png diff --git a/.luacheckrc b/.luacheckrc index 8067e73..04cef09 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -4,8 +4,7 @@ allow_defined_top = true read_globals = { "minetest", "default", - "sfinv", - "sfinv_buttons", + "armor", "vector", "string", "table", diff --git a/init.lua b/init.lua index af2e2b7..4b34d02 100644 --- a/init.lua +++ b/init.lua @@ -11,6 +11,8 @@ local replacements = {fuel = {}} local toolrepair local progressive_mode = core.settings:get_bool "craftguide_progressive_mode" +local inventory_mode = core.settings:get_bool "craftguide_inventory_mode" +local __3d_armor local http = core.request_http_api() local singleplayer = core.is_singleplayer() @@ -82,20 +84,30 @@ local PNG = { prev = "craftguide_next.png^\\[transformFX", next = "craftguide_next.png", arrow = "craftguide_arrow.png", + trash = "craftguide_trash.png", + sort_az = "craftguide_sort.png", + sort_za = "craftguide_sort2.png", + compress = "craftguide_compress.png", fire = "craftguide_fire.png", fire_anim = "craftguide_fire_anim.png", book = "craftguide_book.png", sign = "craftguide_sign.png", cancel = "craftguide_cancel.png", export = "craftguide_export.png", - selected = "craftguide_selected.png", + slot = "craftguide_slot.png", + tab = "craftguide_tab.png", furnace_anim = "craftguide_furnace_anim.png", cancel_hover = "craftguide_cancel.png^\\[brighten", search_hover = "craftguide_search.png^\\[brighten", export_hover = "craftguide_export.png^\\[brighten", + trash_hover = "craftguide_trash.png^\\[brighten", + compress_hover = "craftguide_compress.png^\\[brighten", + sort_az_hover = "craftguide_sort.png^\\[brighten", + sort_za_hover = "craftguide_sort2.png^\\[brighten", prev_hover = "craftguide_next_hover.png^\\[transformFX", next_hover = "craftguide_next_hover.png", + tab_hover = "craftguide_tab_hover.png", } local fs_elements = { @@ -106,7 +118,7 @@ local fs_elements = { tooltip = "tooltip[%f,%f;%f,%f;%s]", item_image = "item_image[%f,%f;%f,%f;%s]", bg9 = "background9[%f,%f;%f,%f;%s;false;%u]", - model = "model[%f,%f;%f,%f;%s;%s;%s;0,0;true;true;%s]", + model = "model[%f,%f;%f,%f;%s;%s;%s;%s;%s;true;%s]", image_button = "image_button[%f,%f;%f,%f;%s;%s;%s]", animated_image = "animated_image[%f,%f;%f,%f;;%s;%u;%u]", scrollbar = "scrollbar[%f,%f;%f,%f;horizontal;%s;%u]", @@ -121,26 +133,36 @@ local styles = sprintf([[ style[filter;border=false] style[cancel;fgimg=%s;fgimg_hovered=%s;content_offset=0] style[search;fgimg=%s;fgimg_hovered=%s;content_offset=0] + style[trash;fgimg=%s;fgimg_hovered=%s;content_offset=0;sound=craftguide_delete] + style[sort_az;fgimg=%s;fgimg_hovered=%s;content_offset=0] + style[sort_za;fgimg=%s;fgimg_hovered=%s;content_offset=0] + style[compress;fgimg=%s;fgimg_hovered=%s;content_offset=0] style[prev_page;fgimg=%s;fgimg_hovered=%s] style[next_page;fgimg=%s;fgimg_hovered=%s] style[prev_recipe;fgimg=%s;fgimg_hovered=%s] style[next_recipe;fgimg=%s;fgimg_hovered=%s] style[prev_usage;fgimg=%s;fgimg_hovered=%s] style[next_usage;fgimg=%s;fgimg_hovered=%s] + style[guide_mode,inv_mode;fgimg_hovered=%s;noclip=true;content_offset=0;sound=craftguide_tab] style[pagenum,no_item,no_rcp;border=false;font=bold;font_size=+2;content_offset=0] style[craft_rcp,craft_usg;border=false;noclip=true;font_size=+0;sound=craftguide_craft; bgimg=craftguide_btn9.png;bgimg_hovered=craftguide_btn9_hovered.png; bgimg_pressed=craftguide_btn9_pressed.png;bgimg_middle=4,6] ]], -PNG.selected, +PNG.slot, PNG.cancel, PNG.cancel_hover, PNG.search, PNG.search_hover, +PNG.trash, PNG.trash_hover, +PNG.sort_az, PNG.sort_az_hover, +PNG.sort_za, PNG.sort_za_hover, +PNG.compress, PNG.compress_hover, PNG.prev, PNG.prev_hover, PNG.next, PNG.next_hover, PNG.prev, PNG.prev_hover, PNG.next, PNG.next_hover, PNG.prev, PNG.prev_hover, -PNG.next, PNG.next_hover) +PNG.next, PNG.next_hover, +PNG.tab_hover) local function get_lang_code(info) return info and info.lang_code @@ -665,8 +687,7 @@ local function cache_fuel(item) end local function show_item(def) - return def and not (def.groups.not_in_craft_guide == 1 or - def.groups.not_in_creative_inventory == 1) and + return def and def.groups.not_in_creative_inventory ~= 1 and def.description and def.description ~= "" end @@ -844,10 +865,86 @@ local function groups_to_items(groups, get_all) return get_all and names or "" end -local function get_stack_max(data, is_recipe, rcp) - data.inv = data.player:get_inventory() - local list = data.inv:get_list("main") - local size = data.inv:get_size("main") +local function sort_itemlist(player, az) + local inv = player:get_inventory() + local list = inv:get_list("main") + local size = inv:get_size("main") + local new_inv, stack_meta = {}, {} + + for i = 1, size do + local stack = list[i] + local name = stack:get_name() + local count = stack:get_count() + local empty = stack:is_empty() + local meta = stack:get_meta():to_table() + + if not empty then + if next(meta.fields) then + stack_meta[#stack_meta + 1] = stack + else + new_inv[#new_inv + 1] = sprintf("%s %u", name, count) + end + end + end + + if az then + sort(new_inv) + else + sort(new_inv, function(a, b) return a > b end) + end + + inv:set_list("main", new_inv) + + for i = 1, #stack_meta do + inv:set_stack("main", #new_inv + i, stack_meta[i]) + end +end + +local function compress_items(player) + local inv = player:get_inventory() + local list = inv:get_list("main") + local size = inv:get_size("main") + local new_inv, _new_inv, stack_meta = {}, {}, {} + + for i = 1, size do + local stack = list[i] + local name = stack:get_name() + local count = stack:get_count() + local empty = stack:is_empty() + local meta = stack:get_meta():to_table() + + if not empty then + if next(meta.fields) then + stack_meta[#stack_meta + 1] = stack + else + new_inv[name] = new_inv[name] or 0 + new_inv[name] = new_inv[name] + count + end + end + end + + for name, count in pairs(new_inv) do + local stackmax = ItemStack(name):get_stack_max() + local iter = ceil(count / stackmax) + local leftover = count + + for _ = 1, iter do + _new_inv[#_new_inv + 1] = sprintf("%s %u", name, min(stackmax, leftover)) + leftover = leftover - stackmax + end + end + + sort(_new_inv) + inv:set_list("main", _new_inv) + + for i = 1, #stack_meta do + inv:set_stack("main", #_new_inv + i, stack_meta[i]) + end +end + +local function get_stack_max(inv, data, is_recipe, rcp) + local list = inv:get_list("main") + local size = inv:get_size("main") local counts_inv, counts_rcp, counts = {}, {}, {} local rcp_usg = is_recipe and "recipe" or "usage" @@ -897,11 +994,29 @@ local function get_stack_max(data, is_recipe, rcp) return max_stacks end +local function get_stack(player, pname, stack, message) + local inv = player:get_inventory() + + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + msg(pname, sprintf("%s added in your inventory", message)) + else + local dir = player:get_look_dir() + local ppos = player:get_pos() + ppos.y = ppos.y + 1.625 + local look_at = vec_add(ppos, vec_mul(dir, 1)) + + core.add_item(look_at, stack) + msg(pname, sprintf("%s spawned", message)) + end +end + local function craft_stack(player, pname, data, craft_rcp) + local inv = player:get_inventory() local rcp_usg = craft_rcp and "recipe" or "usage" local output = craft_rcp and data.recipes[data.rnum].output or data.usages[data.unum].output output = ItemStack(output) - local stackname, stackcount = output:get_name(), output:get_count() + local stackname, stackcount, stackmax = output:get_name(), output:get_count(), output:get_stack_max() local scrbar_val = data[sprintf("scrbar_%s", craft_rcp and "rcp" or "usg")] or 1 for name, count in pairs(data.export_counts[rcp_usg].rcp) do @@ -927,36 +1042,32 @@ local function craft_stack(player, pname, data, craft_rcp) end for k, v in pairs(items) do - data.inv:remove_item("main", sprintf("%s %s", k, v * scrbar_val)) + inv:remove_item("main", sprintf("%s %s", k, v * scrbar_val)) end end local count = stackcount * scrbar_val - local stack = ItemStack(sprintf("%s %s", stackname, count)) local desc = get_desc(stackname) - local message + local iter = ceil(count / stackmax) + local leftover = count - if count > 1 then - message = clr("#ff0", sprintf("%s x %s", count, desc)) - else - message = clr("#ff0", sprintf("%s", desc)) - end + for _ = 1, iter do + local c = min(stackmax, leftover) + local message - if data.inv:room_for_item("main", stack) then - data.inv:add_item("main", stack) - msg(pname, sprintf("%s added in your inventory", message)) - else - local dir = player:get_look_dir() - local ppos = player:get_pos() - ppos.y = ppos.y + 1.625 - local look_at = vec_add(ppos, vec_mul(dir, 1)) + if c > 1 then + message = clr("#ff0", sprintf("%s x %s", c, desc)) + else + message = clr("#ff0", sprintf("%s", desc)) + end - core.add_item(look_at, stack) - msg(pname, sprintf("%s crafted", message)) + local stack = ItemStack(sprintf("%s %s", stackname, c)) + get_stack(player, pname, stack, message) + leftover = leftover - stackmax end end -local function select_item(player, data, _f) +local function select_item(player, name, data, _f) local item for field in pairs(_f) do @@ -978,11 +1089,17 @@ local function select_item(player, data, _f) item = reg_aliases[item] or item - if item == data.query_item then return end + if item == data.query_item then + if data.creative then + local stack = ItemStack(item) + local stackmax = stack:get_stack_max() + stack = sprintf("%s %s", item, stackmax) + get_stack(player, name, stack, clr("#ff0", sprintf("%u x %s", stackmax, item))) + end + return + end local recipes, usages = get_recipes(item, data, player) - if not recipes and not usages then return end - if data.show_usages and not usages then return end data.query_item = item data.recipes = recipes @@ -1132,7 +1249,7 @@ local function get_output_fs(fs, data, rcp, is_recipe, shapeless, right, btn_siz local count = item:get_count() local bt_s = ITEM_BTN_SIZE * 1.2 - fs(fmt("image", X, Y - 0.11, bt_s, bt_s, PNG.selected)) + fs(fmt("image", X, Y - 0.11, bt_s, bt_s, PNG.slot)) local _name = sprintf("_%s", name) @@ -1240,7 +1357,7 @@ local function get_grid_fs(fs, data, rcp, is_recipe) end 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.slot)) end local btn_name = groups and sprintf("group|%s|%s", groups[1], item) or item @@ -1346,7 +1463,7 @@ local function get_model_fs(fs, data, def, model_alias) fs(fmt("model", data.xoffset + 6.6, data.yoffset + 0.05, 1.3, 1.3, "", - def.mesh, concat(t, ","), model_alias and model_alias.frames or "")) + def.mesh, concat(t, ","), "0,0", "true", model_alias and model_alias.frames or "")) end local function get_header(fs, data) @@ -1387,7 +1504,7 @@ local function get_header(fs, data) fs("style_type[label;font=bold;font_size=+6]", fmt("label", X, Y1, desc), "style_type[label;font=mono;font_size=+0]", - fmt("label", X, Y2, clr("#7bf", tech_name)), "style_type[label;font=normal]") + fmt("label", X, Y2, clr("#7bf", tech_name)), "style_type[label;font=normal;font_size=+0]") local def = reg_items[data.query_item] local model_alias = craftguide.model_alias[data.query_item] @@ -1411,12 +1528,6 @@ local function get_export_fs(fs, data, panel, is_recipe, is_usage, max_stacks_rc if not show_export then return end - local item = (is_recipe and panel.rcp[data.rnum].output) or - (is_usage and panel.rcp[data.unum].output) - item = clean_name(item) - local _name = match(item, "%S*") - local stack = ItemStack(_name) - local stack_max = stack:get_stack_max() local craft_max = is_recipe and max_stacks_rcp or max_stacks_usg local stack_fs = (is_recipe and data.scrbar_rcp) or (is_usage and data.scrbar_usg) or 1 @@ -1431,28 +1542,29 @@ local function get_export_fs(fs, data, panel, is_recipe, is_usage, max_stacks_rc end fs(sprintf("style[scrbar_%s;noclip=true]", name), - sprintf("scrollbaroptions[min=1;max=%u;smallstep=1]", min(craft_max, stack_max)), + sprintf("scrollbaroptions[min=1;max=%u;smallstep=1]", craft_max), fmt("scrollbar", data.xoffset + 8.1, data.yoffset, 3, 0.35, sprintf("scrbar_%s", name), stack_fs), fmt("button", data.xoffset + 8.1, data.yoffset + 0.4, 3, 0.7, sprintf("craft_%s", name), - sprintf("%s", sprintf(stack_fs > 1 and ES"Craft %u stacks" or ES"Craft %u stack", + sprintf("%s", sprintf(stack_fs > 1 and ES"Craft %u items" or ES"Craft %u item", stack_fs)))) end -local function get_rcp_extra(fs, data, panel, is_recipe, is_usage) +local function get_rcp_extra(player, fs, data, panel, is_recipe, is_usage) local rn = panel.rcp and #panel.rcp if rn then local rcp_normal = is_recipe and panel.rcp[data.rnum].type == "normal" local usg_normal = is_usage and panel.rcp[data.unum].type == "normal" local max_stacks_rcp, max_stacks_usg = 0, 0 + local inv = player:get_inventory() if rcp_normal then - max_stacks_rcp = get_stack_max(data, is_recipe, panel.rcp[data.rnum]) + max_stacks_rcp = get_stack_max(inv, data, is_recipe, panel.rcp[data.rnum]) end if usg_normal then - max_stacks_usg = get_stack_max(data, is_recipe, panel.rcp[data.unum]) + max_stacks_usg = get_stack_max(inv, data, is_recipe, panel.rcp[data.unum]) end if is_recipe and max_stacks_rcp == 0 then @@ -1486,14 +1598,14 @@ local function get_favs(fs, data) local Y = data.yoffset + 0.8 if data.query_item == item then - fs(fmt("image", X, Y, ITEM_BTN_SIZE, ITEM_BTN_SIZE, PNG.selected)) + fs(fmt("image", X, Y, ITEM_BTN_SIZE, ITEM_BTN_SIZE, PNG.slot)) end fs(fmt("item_image_button", X, Y, ITEM_BTN_SIZE, ITEM_BTN_SIZE, item, item, "")) end end -local function get_panels(fs, data) +local function get_panels(player, fs, data) local _title = {name = "title", height = 1.4} local _favs = {name = "favs", height = 2.23} local _recipes = {name = "recipes", rcp = data.recipes, height = 3.9} @@ -1515,7 +1627,7 @@ local function get_panels(fs, data) local is_recipe, is_usage = panel.name == "recipes", panel.name == "usages" if is_recipe or is_usage then - get_rcp_extra(fs, data, panel, is_recipe, is_usage) + get_rcp_extra(player, fs, data, panel, is_recipe, is_usage) elseif panel.name == "title" then get_header(fs, data) elseif panel.name == "favs" then @@ -1524,26 +1636,14 @@ local function get_panels(fs, data) end end -local function make_fs(data) - local fs = setmetatable({}, { - __call = function(t, ...) - t[#t + 1] = concat({...}) - end - }) - - data.xoffset = ROWS + 1.04 - local full_height = LINES + 1.73 - - fs(sprintf("formspec_version[%u]size[%f,%f]no_prepend[]bgcolor[#0000]", - MIN_FORMSPEC_VERSION, data.xoffset + (data.query_item and 8 or 0), full_height), - styles) +local function get_item_list(fs, data, full_height) + fs(fmt("bg9", 0, 0, data.xoffset, full_height, PNG.bg_full, 10)) local filtered = data.filter ~= "" - fs(fmt("bg9", 0, 0, data.xoffset, full_height, PNG.bg_full, 10)) - - fs("box[0.2,0.2;4.55,0.6;#bababa25]set_focus[filter]field_close_on_enter[filter;false]") + fs("box[0.2,0.2;4.55,0.6;#bababa25]", "set_focus[filter]") fs(sprintf("field[0.3,0.2;%f,0.6;filter;;%s]", filtered and 3.45 or 3.9, ESC(data.filter))) + fs("field_close_on_enter[filter;false]") if filtered then fs(fmt("image_button", 3.75, 0.35, 0.3, 0.3, "", "cancel", "")) @@ -1577,20 +1677,127 @@ local function make_fs(data) if not item then break end local X = i % ROWS - X = X + (X * 0.08) + 0.2 + X = X + (X * 0.1) + 0.2 local Y = floor((i % IPP - X) / ROWS + 1) Y = Y + (Y * 0.06) + 1 if data.query_item == item then - fs(fmt("image", X, Y, 1, 1, PNG.selected)) + fs(fmt("image", X, Y, 1, 1, PNG.slot)) end fs(fmt("item_image_button", X, Y, 1, 1, item, sprintf("%s_inv", item), "")) end +end - if (data.recipes and #data.recipes > 0) or (data.usages and #data.usages > 0) then - get_panels(fs, data) +local function get_inventory_mode(player, fs, data, full_height) + fs(fmt("bg9", 0, 0, data.xoffset, full_height, PNG.bg_full, 10)) + + local player_props = player:get_properties() + local name = player:get_player_name() + + fs(fmt("model", 0.2, 0.2, 4, 5.4, "player_model", + player_props.mesh, concat(player_props.textures, ","), "0,-150", "false", "0,0")) + + local xoffset = __3d_armor and 0 or 4.5 + + if __3d_armor then + fs(sprintf("scrollbaroptions[max=35]scrollbar[-1,0;0.3,3;vertical;scrbar_inv;%u]", + data.scrbar_inv or 0)) + fs("scroll_container[4.5,0;5.5,5.5;scrbar_inv;vertical]") + end + + fs("style_type[label;font=bold;font_size=+6]") + fs(fmt("label", xoffset, 0.4, ESC(name))) + fs("style_type[label;font=normal;font_size=+0]") + fs(fmt("box", xoffset, 0.7, 5.5, 0.05, "#666")) + + fs("listcolors[#bababa50;#bababa99]") + + local hp = data.hp or player:get_hp() + local half = ceil((hp / 2) % 1) + local hearts = (hp / 2) + half + + for i = 1, hearts do + fs(fmt("image", xoffset + ((i - 1) * 0.4), 0.9, 0.4, 0.4, + (half == 1 and i == floor(hearts)) and + "craftguide_heart_half.png" or "craftguide_heart.png")) + end + + fs(sprintf("list[current_player;craft;%f,1.75;3,3;]", xoffset)) + fs(fmt("image", xoffset + 3.64, 3.18, 0.7, 0.7, PNG.arrow)) + fs(sprintf("list[current_player;craftpreview;%f,3;1,1;]", xoffset + 4.45)) + fs("listring[detached:craftguide_trash;main]") + fs(sprintf("list[detached:craftguide_trash;main;%f,4.25;1,1;]", xoffset + 4.45)) + fs(fmt("image", xoffset + 4.45, 4.25, 1, 1, PNG.trash)) + + if __3d_armor then + fs("style_type[label;font=bold;font_size=+2]") + fs(fmt("label", 0, 5.8, ES"Armor")) + fs("style_type[label;font=normal;font_size=+0]") + fs(fmt("box", 0, 6.1, 5.5, 0.05, "#666")) + fs(sprintf("list[detached:%s_armor;armor;0,6.4;3,2;]", name)) + + fs(fmt("label", 3.75, 7.35, sprintf("%s: %s", ES"Level", armor.def[name].level))) + fs(fmt("label", 3.75, 7.75, sprintf("%s: %s", ES"Heal", armor.def[name].heal))) + + fs("scroll_container_end[]") + end + + for i = 0, 7 do + fs(fmt("image", i + 0.23 + (i * 0.25), 6.1, 1, 1, "craftguide_hb_bg.png")) + end + + fs("listring[current_player;main]") + fs("list[current_player;main;0.23,6.1;8,1;]") + fs("list[current_player;main;0.23,7.4;8,3;8]") + + local i = 0 + local btn = { + trash = ES"Trash all items", + sort_az = ES"Sort items (A-Z)", + sort_za = ES"Sort items (Z-A)", + compress = ES"Compress items", + } + + for btn_name, tooltip in pairs(btn) do + fs(fmt("image_button", i + 4 - (i * 0.4), + full_height - 0.6, 0.35, 0.35, "", btn_name, "")) + i = i + 1 + fs(sprintf("tooltip[%s;%s]", btn_name, tooltip)) + end +end + +local function make_fs(player, data) + local fs = setmetatable({}, { + __call = function(t, ...) + t[#t + 1] = concat({...}) + end + }) + + data.xoffset = ROWS + 1.2 + local full_height = LINES + 1.73 + local half_height = full_height / 2 + + fs(sprintf("formspec_version[%u]size[%f,%f]no_prepend[]bgcolor[#0000]", + MIN_FORMSPEC_VERSION, data.xoffset + (data.query_item and 8 or 0), full_height), styles) + + if not data.on_use then + fs(sprintf("style[guide_mode;fgimg=%s]", data.inv_mode and PNG.tab or PNG.tab_hover)) + fs(sprintf("style[inv_mode;fgimg=%s]", data.inv_mode and PNG.tab_hover or PNG.tab)) + + fs(fmt("image_button", 2.05, full_height, 3, 0.5, "", "guide_mode", ES"Crafting Guide")) + fs(fmt("image_button", 5.15, full_height, 3, 0.5, "", "inv_mode", ES"Inventory")) + end + + if data.inv_mode then + get_inventory_mode(player, fs, data, full_height, half_height) + else + get_item_list(fs, data, full_height) + end + + if data.query_item then + get_panels(player, fs, data) end return concat(fs) @@ -1598,7 +1805,38 @@ end local function show_fs(player, name) local data = pdata[name] - show_formspec(name, "craftguide", make_fs(data)) + local fs = make_fs(player, data) + + if data.on_use then + show_formspec(name, "craftguide", fs) + end + + if inventory_mode then + player:set_inventory_formspec(fs) + end +end + +if inventory_mode then + local trash = core.create_detached_inventory("craftguide_trash", { + allow_put = function(inv, listname, index, stack, player) + return stack:get_count() + end, + on_put = function(inv, listname) + inv:set_list(listname, {}) + end, + }) + + trash:set_size("main", 1) + + core.register_on_player_inventory_action(function(player) + after(0, function() + local name = player:get_player_name() + local data = pdata[name] + local fs = make_fs(player, data) + + player:set_inventory_formspec(fs) + end) + end) end craftguide.register_craft_type("digging", { @@ -1791,13 +2029,9 @@ local function get_init_items() for name in pairs(_preselect) do cache_usages(name) - end - for name in pairs(_preselect) do - if recipes_cache[name] or usages_cache[name] then - init_items[#init_items + 1] = name - _select[name] = true - end + init_items[#init_items + 1] = name + _select[name] = true end resolve_aliases(_select) @@ -1816,7 +2050,7 @@ local function get_init_items() end end -local function init_data(name) +local function init_data(player, name) local info = get_player_info(name) pdata[name] = { @@ -1826,10 +2060,18 @@ local function init_data(name) items_raw = init_items, favs = {}, export_counts = {}, + inv_mode = inventory_mode, lang_code = get_lang_code(info), fs_version = get_formspec_version(info), - player = get_player_by_name(name), + creative = core.is_creative_enabled(name), } + + if inventory_mode then + local data = pdata[name] + local fs = make_fs(player, data) + + player:set_inventory_formspec(fs) + end end local function reset_data(data) @@ -1842,37 +2084,72 @@ local function reset_data(data) data.query_item = nil data.recipes = nil data.usages = nil - data.show_usages = nil data.export_rcp = nil data.export_usg = nil data.items = data.items_raw end -on_mods_loaded(get_init_items) +on_mods_loaded(function() + get_init_items() -on_joinplayer(function(player) - local name = player:get_player_name() - init_data(name) - local data = pdata[name] + if inventory_mode then + local creative = rawget(_G, "creative") + if creative then + function creative.set_creative_formspec() return end + end - if data.fs_version < MIN_FORMSPEC_VERSION then - outdated(name) + local sfinv = rawget(_G, "sfinv") + if sfinv then + sfinv.enabled = false + end + + local unified_inventory = rawget(_G, "unified_inventory") + if unified_inventory then + function unified_inventory.set_inventory_formspec() return end + end + + if rawget(_G, "armor") then + __3d_armor = true + end end end) -local function fields(player, _f) +on_joinplayer(function(player) + after(0, function() + local name = player:get_player_name() + init_data(player, name) + local data = pdata[name] + + if data.fs_version < MIN_FORMSPEC_VERSION then + outdated(name) + end + end) +end) + +on_receive_fields(function(player, formname, _f) local name = player:get_player_name() local data = pdata[name] - if _f.quit then - player:hud_change(data.vignette, "text", "") - data.vignette = nil - return + if not ((inventory_mode and formname == "") or (data.on_use and formname == "craftguide")) then + return false end local sb_rcp, sb_usg = _f.scrbar_rcp, _f.scrbar_usg - if _f.cancel then + if _f.quit then + if data.on_use then + data.on_use = nil + data.inv_mode = true + + player:hud_change(data.vignette, "text", "") + data.vignette = nil + + data.hud_flags.crosshair = true + player:hud_set_flags(data.hud_flags) + data.hud_flags = nil + end + + elseif _f.cancel then reset_data(data) elseif _f.prev_recipe or _f.next_recipe then @@ -1936,6 +2213,29 @@ local function fields(player, _f) end end + elseif _f.guide_mode or _f.inv_mode then + if _f.guide_mode then + data.inv_mode = nil + else + data.inv_mode = true + end + + elseif _f.trash then + local inv = player:get_inventory() + if not inv:is_empty("main") then + inv:set_list("main", {}) + end + + elseif _f.compress then + compress_items(player) + + elseif _f.sort_az or _f.sort_za then + sort_itemlist(player, _f.sort_az) + + elseif _f.scrbar_inv then + data.scrbar_inv = tonumber(match(_f.scrbar_inv, "%d+")) + return true + elseif (sb_rcp and sub(sb_rcp, 1, 3) == "CHG") or (sb_usg and sub(sb_usg, 1, 3) == "CHG") then data.scrbar_rcp = sb_rcp and tonum(match(sb_rcp, "%d+")) data.scrbar_usg = sb_usg and tonum(match(sb_usg, "%d+")) @@ -1943,21 +2243,16 @@ local function fields(player, _f) elseif _f.craft_rcp or _f.craft_usg then craft_stack(player, name, data, _f.craft_rcp) else - select_item(player, data, _f) + select_item(player, name, data, _f) end return true, show_fs(player, name) -end - -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 not data then return end if data.fs_version < MIN_FORMSPEC_VERSION then return outdated(name) @@ -1968,7 +2263,10 @@ local function on_use(user) search(data) end - show_formspec(name, "craftguide", make_fs(data)) + data.on_use = true + data.inv_mode = nil + + show_fs(user, name) data.vignette = user:hud_add({ hud_elem_type = "image", @@ -1977,6 +2275,23 @@ local function on_use(user) text = "craftguide_vignette.png", z_index = -0xB00B, }) + + data.hud_flags = user:hud_get_flags() + data.hud_flags.crosshair = false + user:hud_set_flags(data.hud_flags) +end + +if inventory_mode then + core.register_on_player_hpchange(function(player, hpchange) + local name = player:get_player_name() + local data = pdata[name] + local hp_max = player:get_properties().hp_max + + data.hp = min(hp_max, player:get_hp() + hpchange) + + local fs = make_fs(player, data) + player:set_inventory_formspec(fs) + end) end core.register_craftitem("craftguide:book", { @@ -2219,12 +2534,19 @@ if progressive_mode then if #diff > 0 then data.inv_items = table_merge(diff, data.inv_items) local oldknown = data.known_recipes or 0 - get_filtered_items(player, data) + local items = get_filtered_items(player, data) data.discovered = data.known_recipes - oldknown if data.show_hud == nil and data.discovered > 0 then data.show_hud = true end + + if inventory_mode then + data.items_raw = items + search(data) + local fs = make_fs(player, data) + player:set_inventory_formspec(fs) + end end end @@ -2290,7 +2612,7 @@ on_leaveplayer(function(player) pdata[name] = nil end) -function craftguide.show(name, item, show_usages) +function craftguide.show(name, item) if not true_str(name) then return err "craftguide.show(): player name missing" end diff --git a/license.txt b/license.txt index 91dc864..7ee8b36 100644 --- a/license.txt +++ b/license.txt @@ -28,7 +28,7 @@ Licenses of media (textures) ---------------------------- paramat (CC BY-SA 3.0): - sfinv_crafting_arrow.png - derived from a texture by BlockMen (CC BY-SA 3.0) + craftguide_arrow.png - derived from a texture by BlockMen (CC BY-SA 3.0) You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/settingtypes.txt b/settingtypes.txt index b54f897..2d62a0a 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -1,2 +1,5 @@ # 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 + +# Transform the Crafting Guide into an inventory. +craftguide_inventory_mode (Transform the guide into an inventory) bool true diff --git a/sounds/craftguide_delete.ogg b/sounds/craftguide_delete.ogg new file mode 100755 index 0000000000000000000000000000000000000000..fea98b6f8c09077610e77ae2a87fd67a66fb1c1b GIT binary patch literal 8596 zcmeG>XH=8RwqK~BN(l%UFf=I!4}l>47)t1f1cDHx6FMkWQ9L5e5Q<2Xst5!j6afJX zf>;7bQ$(bwfYMYf2qIW{6Y!ktJ@2k}-&%LQe{a@gnAv;J>~D6PJ%f#}uN}k!{VW3_ zqi|+d6OLqqNx`BHhI#sjGXX5dHOxPtgl-aFh1oD?{#BSWVPG_Lb&H5l-1^_j8P?6E z_yC2KN0g6-)-E;eT^LnWHUQWTe&i6ZgWlvYeSq`=NDV9#i3;-f+?*%)7m2rXZe^b(XuZnM(1UlF?$Tvrt{ARh4mJJ zAT}sgkt@Ay&OBg1+gD5>J*-6Af3Ma>6erboN}KEU$_}rPil&OdkO3umIG+b$BfOV@d=*z~}VN2TeZ zg%xJl!KK0me97s8iVS1J9}#)D3LDvqsSvskt0#Zo$?Z$uO4^0n&>>5=(3vVA(r&B zt{tCTW!8r)`X-Q7RZ|^5)@aaj8bNqd4*3voqu7AUv*1x zZzH<5k#~axf&mg{De*6;_;1z6DVO~3E6%T58NvZsc7-ClLgnxTxvnrY=Z1v4A)r$n z0nG@*nucS$!u3EkjWE8KZPowLYRjKW*syH~he0wzk@tW!2r5Hi8vDcbN5ZW~fGC&} z`Jc;l|~casw!pj?vi~X1}@KPqV0UEgHC`{T$3l9xn{M#^nNfpS_FT^>Z;{ ze>Wc-(3{7oSZ8q@>UcVbCqlYHI!h|zG=EkJrdz38DlOf_qAGqLL0o|r5x22(6a*y* zY*_K1&4wv&T5)+MRk=s;a-Ui+n%UIc8PHj%zawD8ivd=Q)&N$V);xDEyiVIJkka`y!#2Y;#eKOk*|1U!DU2r%BlG$!yP5Ojl9-UPG=;1^?+e zp@^tCK@8YTxS@Em-Y+%KNffk7GpZ)!wa zFK_Nqe-H>X0>AZF1wc?o2CwBt9I+*+3==el2`WT;{r}lx0CpH_J%j~<&4D0s2%0Ic zcyyFs$TLGb*}xBOeiz9&p!2Gz>_FS1)j$&=0lJ*0@g3gJcB^#7{ua)^>M=Z&EbF6 z0!CO{Hc)>q0~ih3!v?WGc>yjR>UbO$oFxBw`4_xwHDETs@WNrOarV~#Ij8?$;r}J@ zZzTXs9L5iRqJ|fwce2E4!Jt#qxJ;D!A~x2`X;JTpgq84=qp04N0?wg7y#s=9OV}e) zdRr>EGO%0Dao&&j|0}t+7;(7!Q+#VSJ3 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 Z{{y};WUZm_drANR002ovPDHLkV1m#eZ7%=- literal 0 HcmV?d00001 diff --git a/textures/craftguide_hb_bg.png b/textures/craftguide_hb_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..c8911feb2af96402b59c6cf2ab82dd37ad19f193 GIT binary patch literal 509 zcmVEX>4Tx04R}tkv&MmKpe$iQ>9WW4rUPPkfAzR5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|DYS_3;J6>}?mh0_0Yam~bh~F9&<)2* zClgXOw(bPTQat9cCG8Ic{NkN)Ip#Z#}(KqFQ!CN4_=JnRz$LRx*p{`Olz`-Ff zTBPiCpLh3l_xA6Zc7H!radMjjE3$0>000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2jmPK7dil<{+*rx000e1L_t&t*JH@Y$oLNc1gru$+aWD(00000NkvXXu0mjfh{)G| literal 0 HcmV?d00001 diff --git a/textures/craftguide_heart.png b/textures/craftguide_heart.png new file mode 100644 index 0000000000000000000000000000000000000000..4412cab587f2690e68731d7def7abda335dcd2a0 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$3?vg*uel1OasqrpTtQq0h9m}tOa_K528JdE zhE4{CE(V4P3=9()7^X8Y%wS-cBO$VYfngy7!$t;%O$-bN7#J=xFgy|Gc&Z}xMnUWo z1H*41Vr2Nu%kW#2;kSy^Z&m5vrh30^%zxWj{0{K>9T)vOF6MV_O{MGAQlNc|B|(0{ z3=Yq3qyagRo-U3d9I~tjIhh&*7+4QzMmyOrY(G)<-+C4!L&1$rS&h%CZf!rlu~D!8 z`p=@XJDiK_|JoH#;+y^OXRZIq4ac^n%$qbtYE_YUP*%c4^`&epeg!dZh+$y(z`i|% V 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 literal 0 HcmV?d00001 diff --git a/textures/craftguide_sort2.png b/textures/craftguide_sort2.png new file mode 100644 index 0000000000000000000000000000000000000000..e39566994a5a8e41a3b2e7ddedb7228fa430827a GIT binary patch literal 7268 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 XFgU%ka;+6Gk{LW*{an^LB{Ts5aVm9l literal 0 HcmV?d00001 diff --git a/textures/craftguide_tab_hover.png b/textures/craftguide_tab_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..44c9adc039fd88ba2f703dc6d4634e1adb0f69fd GIT binary patch literal 16499 zcmX|oWl$Zkwl(fn+z#$g+}+*Xi@UqKI|YinAKZ#N9Hh9r7I$~}`o8<_`;km$XZG4z znc101_DZy}q7*U$J^~mR7_yACxGESJc+$VIBpl4Yey?so77PrM!$)1)P1V?w#L30c z!rIQ9#Le5uoW$JA+5!yBYpo{D_Sau3B+0L)7>53zXy||X`KK}gW-l*&9xYW>W#xR) zJmxcyq-PLVuiL$n&xokbail=+aawyXlY~q}m>z(Vq2t<~&ks7@7Nu9Td7kJ(^m~^m z&4fIJ`&X7--Oxu%|LggI02p3mE#XXhHkgY%ihI9f+Pq*FAsE`uO|{LJbmq~scFS?sZSW>r8#PEA^)@}4WixTrB@3kE5s*)->eQ1>{!T^YwKp>4 z#yTG&*g$bxv9D0bVZgSI3q%P|ChA+&WH0-q5z=#o&|`$mhJ0jW_ppAJgtJgN7U{?r zltVI4`^U3WwZBB*1kG@_pU_<|D!#AVn;KVz6x6cv3D(=aeKXN|UD0dgMtsNoa1Nu< z=7TH{*Vao$f`_w<7N?!Hn2-$PmaudjHIx_&vdmIWDbAojqfP4mq$A?LHH_3ES@IjCi`e2MQ#^ zq3ZYw)d%a)a&W9@c@fgWY1qe{%5n&q=PFSz4Z?IHLr;%66>%PS%}X?ol6#|Oc^`d4 zWO+{?^JMAb(6g+=2Zzm%{&OlOZ~vL7_`$!n_4tR-aP!HniP&Xv{r(Z%KPK4cZTz#- z>RksZvg^HPS5V@_&JB+y4H< zVPI%%Q!Pqu2+1?}-rwVrV=~ImI@;!_o1He|t4o2)EpXA|0k=*|!WrZdS!xVb&Q`i` z!*3#(WCOUW8TM0SE(ksQXGGvVTf^SJzS@PPdVjUzp(RCGW?J(M5e&^|CyaULYnxF@ zkPA{1H64cxCF*Ml1nleEHT1Db(5K{4V@H>o;8Yn*$o^8~mmr*X3%w1m9>G8QKIKyi zT6_A-6!$ki&AfI#jx1V&K_mhSiz8JfIF!2vhL&@#Isf_wwe_8~UEL+Ef3zWp&W+}~ z&@=J-W(nt`94goVAQdmS`bZSN<&5K~TRQN!Q`S($>fcWKvJo$(l-7hclK*o=(9ao)CIo-=ZjWi8BJiK6`=kma3 z9BAxl(FUNh219q-CyLh>MwK%3c<6ep3Ni7ml!VTXHC<`-Jd{U-(7@lclsmG4ZyeFR_Go-^Z}XVNgzo-(C-6g+O>vB zXFG0<`1ZAPS!`XaCqnKA_g4PbXX=B~n#hZ z1GfBed_kAqAVRM5)&LmU!(-p>u1_C@h~+CAzhFVAH-2802-f)WhCN?^@?KwNui%sS zQeBr)HqF(Mj_LF*Zu?06a{|`Y)$(&mO2v|IXdSizLF$ROPS+dXR`1uVqi%KhcXSjbnKSx;0vfbfG3S_-Ue*+llCg=3a_qdB|-6bPz(Hcgk}fH z!LV-9Pp(76bN56`#wNHtxE!-uw&~E?m(@2jQ!9;hcE*xE-)AuE0ykDHKCnmfDvQYttJr2Im)!FDLAVsd*3S z6b0ddOL#?mql1q+)PV>GeX7Lby(x~ zv+lyWCTs+jNge928u!;8OM&|CBc!LS{%D@ZHoUk8W(-^SB!zFjJ$*|$gns>ZC#+WjXsY$4C(7q!5&r`i1A z{cY*%>g^E;WZ2$8+)2~x&iL)bZBU}n6X(@o&B>$vC+8>7_1qG4@wLeN{t@uYLR*N7 zSBR}HAbsV@*RMGrL8I56-&DXhke84C-P4(Kqx?4CPb#!e%>2a9Z-y6`npZ-C7yh~K z`iXcW0ki#=;CK0L_RyK@2OjBDX(DtW%-f}+uhXpobV@HuN`{GVQRS^MM-@C^6}%^O)uym3Z;n{07Mq{Xm}gdI@tG z$kD^)_xA4Z1_g+5zipW(l?AquK=v4C?18u%=6rXIY==`8^|Ev!e$*?%Fj|+HtYn?y z(L{1%<)o&=Zanx5$j(+=r<Lx5lYwn-Nt>;(ZBk;Uky>^!@Z7L zNNLAq93i-VoZTSz>Npgk!BVuERCV_4Ot5)pG%OahJas9w@t$g~tRyUT@3^P&a)0H` z6ByFhwZmYeR_)ewfK7v%PNBH(WNldxNH2WBr=e^#2qSH~w!rid&957m3{X6P96Qjc zs#i)Rs=iO>Iu(l@vZNk$7IY;FI^;gKzR2bZKEy=qp8QE0S%V9&T*^NdW86EytcSTa z#~*7<`apOYYXsT)OtS?aa6sXl>c_d6f`f93OX%h4`6#4tO{s6Gj{Hl%6dE;_SAt#l zLl%`zvH%waj7;di0eOxg*j%N@u^1=!;-{=-L)J+mNVpZgQDipLN%G93uaZ>$LD=+dg7!_vYisxMs06&q8O3zN@kQ|C@Me%;`4QOONuY-_ zEMDGx{|*NEMp&{yAuDv6Mc+U^`aZK5M&Ycv3%A=S<3jE6T7MEOMP)-@W>!1O3v@fy zZx^GXoVQ;iU%v4J_}OT#;mcreBa8^_#3+)k;n&!VD~jF@I}RbwiO^>BBVEULbAlo` zOTL+gee_2EK~}a+$gP3R909NSL<$LZEI`SZ!`qPZb2AjyjR?+3;A9T%|k1VE&gnLR6u@xW4dAe9wlaT3=t4Z?Ve$b#9ripBmN9&L8c2adO$WT#}I9Jv*PF?2WN zp`7ixPp$BbQz zSRMys@T6@#J(cUQu-7Cf3O7M5bl8X29uafipNr{*7w~*7;l*?q3IzYw(&WCw*p$3H zTFC(HT$dwg9V%FUCBzwsO7Xyv2=tx&_WEH1KHA}8R4gS@veMb5OC}X%eMp|tORz{n z;JhE|)0=@%(Y!%nhQCom9T*83#xp+R33!1CuV|*APWzHK=Iw4_HbPuE2d==F?Sn|h z&{2=fpuLivadTZ)`=jX8&~EgvzPG#pY2bMzJ1;w#mqQiUowDAK?eq=d{jmPp4_hZ*|GGFYd2s+PMf;)er}65Tz26(Z zq(UZeOPn~-U0I&S1~==}pf5{yhV%XguRjma+&ZP$&^c-UY+1;H_0ip0Q(V(u=&^j6 z4A6yjB&_k3&)pil=JOv~O-`>Q(!1-DSZdfeigp*&Tb!tcpB2Q zpNY+~ z;-Fr#xehi=qUh)Qh@(Kf}JYkcv-Z1fVXCxpvALZORg2Z~akF8_>BCDQ3_HQQx8yT(s2@l9f|ncMxs8c% zqfp8{Lcs`tz#cUFE6P{)vlJR-q$Vev$~L*;oS<>(NiGWXOyhJ!Bc(uR8lN#I00?P11_#qBM83u&wr^?-ls2LS#zuTM zRhKB^ZrZvXNR9puFkZveN{Qce`~IlS=864vdY`*GZe(0tjZqdItkrW`CbWvg<@}9~ z;vW(zkfydE(+Hm6cd15L; z4=J4sr+9BIaI5^Qs*9Q`8GZ?A_euQfMO(lFBZ`@jif9AQurU{c?Qh7gTKW882obMb z=WK?d|Iq-F*IK4Np3WOAkd8CkLv~=slbN~9B_tpPBEg!B_u7`9mrAxbPraJ}kD%PFV>*aSzGDByiOn++Duk z0zErAb5LjMBW#b{VDZvbR!?uQ)eQ+hrkG7BMmi&DtP6!Bmy{WS6<1Qb4HS(h%m=R^ z658U_Z-4cZt|x|FLKm}ckGgs&TDTv}WVpQ>9Vm%xzk#%!&Xf~GOu?56BMf7J?X5Mu zEv+Hwb(rQl1xq-RLbnyN5uoOrX_T%UZr9(S)QS+XM2PtS0M>LgG&o;hpu@NVR+#;gxoo-AVLz7SNm5#@0ilj1xsp=>k8L_Hq*6rUpc8}*^2!pb zDTWL#aVq2er=4xUu>kO0F^N~9yZORMe%QJO$E($K8my|noyymAj?(96nOwFU>y$!z z+EXhi5-WZNu(Uhcqzt`+*Rk->WVJPOBRPK!XZK07FS>(kiHqRx-n&B%-&`ubv%!qZ zFaFiFsC)hEw6NCuWbHRsH7gS(E5F|E(yD`Op-Deqx?(StaGZFqq%D@K@QsxeJ}he4o&KKh zC$<^~hhZ#(oRHs}F!(d+e2}#wUeTH}Yf*Ei^~gDJ=AL0TM2Z#Lvo9@Sd@cj!M(XTc z9R9mDpBw84pPhX(fP-@xAf<7n16gpE@O$Noylb?V^OXPV^GU$N(1 zqdeAaiTFnxJZwFG6qz@*8*-2`a zry=0@3LDb?Cu8qnHNoN2;HsI&ol>M&2*8qhX(oNJz$tilsK_?crwxy{3Tp|bYYPen zQ%`aBAU>HsX;dN77O31ROA!iXoUv&CT`& zDN81U)1dsqa?FB%L|%YGyCW2G!nZ0y3^x`bS>hd9wG{E8^r*?6kUR-;kVB4bEP$A~ zU5d-Y#gZ4Hsh^iqBW#M-dGl{&sgv>wwT<4aoCnknihq)e4{2BSt1vAYFAbw76`2&v zZ2yicoOw)pC;kBLXdoX}WNrfNnWlRjo07^Y46My>noDmui=_ILW&)38Q(XHc_l0l; zq~uEo&klp`Sg*bQ@~rCEr*NC^Y@>518x_jQzY<*jM5KAcY5t85C9}<11OP8IX|Mr5 z`o7PTxQ)+2Bdp63;$N zdJNGmB4AylTjjhsWi`FKqr)wRuGIBspLqCJ}Bc<7g%2(P3zpeHtcgaGRpGz0YK}rR1s}rr3@ct~abnq0ugO{^_ z)Aq+foYSSXXD10xyEL_VE?T?2wewre%mbDmY*s1u%CA&5sm0x9DVp%q6u4X<`IzHV zzg&)$bPa5O*F_%OrgZfk1OstmqlNTrKGc`NNNlbA*e>0};I@;kGr%J8#qUzv8kwmg zR$aD@kCW*PpI3?8Z=cg~6t3~msrt#dM%cx2dn?F|7RBvWh)QM$KiL2iEF4c6H#vjK zAw0-`;k3RV`{#FgN(a{v~RgJ~+J)xqDJq8aBD`||F&P(G{b(s=u z&v>jwq!8#%Nsg3imGiGQ8>IBvR2w3q0hxF;&K&-lh3!C?h3xh%4>` zKR5YQ8Nfp!Ip6zsDG=0H@08F%F)i`<1Be&q8xR3o!Eu|~S#iy#jhM`zMSf-<9<<0& z4SGb!mD%R+`l8FoIg1dSmct&B@ZyEX3KKM^H{jlHwwe^dA*PLvHGe=A!ojV+hTbfg_b2!7c`tX;v8udWAd*zM zKQbNUA*IN?Da%;kC>3^5Dxlef?aL+lhoM`3vlI>T0(XdXY0PiBK(#gTb7}^)lBEev z$QEc(Zi_&&YFYxLYvJvfstbcKIW3JUM-Al$oQMRg>xhgt`{8r?4}&vLYYXgbws8Xy zPvO#K@+`K3-Xlp*EGwr&*9NvRn1XRne(F?WI_B*9%HIMLXq=&ayQ1|-dq@`suGm5p z1nO3dX&P85j|3H)2;B|@X_fFLkX_}LxXdnE(zyrhidl;sUrN+XlbUU~YceW4d8FR} zNlM;#>!Zy!!(t;^yRiW-&x< zT@XsbvHGOC8E7g`T{C49m3+>>ZGPVPmGOc$as_GoJ6Oe6i7~MQ^2CbsFpX1$U0f~g zZrRrI&75eEfug^~S_2x*n){8XV7Ke}cPBGKk7g$K80|rJgvC9vmA{%7=*PE1mkRT^ za(^>KOvOMuXjM7wd19VKePqo^H(o>Y_^X7U>`2&ZK7=4r$0}(@)_5zX1}LS@sC!23 zDUfvNW*xW*_(~t5$brZIyIkKbLfNvoRP+#8SK?b6oLogw+EylIiHgIJx9@C(Syo07 zQ&&WSrwwsqmfaP6h38_hVXWkVRg@gt27+UNiqZW#R`@%y3jjelu2MRxW>I!Nl}_c2 zFWnnk_gE1oaNKOHon|digjVe+CH;+rKW+Lsj;5e;#Z|Ii{INh*3x7rNdv%R<4!ec% zl9haBG}?Hf$SUpnVjR40o|oK%5M>7PScXuKdTQK+PGitNiAo4!#`JmP!xx0OXqw`J zN1AnDCI@sINLpIT3iuAYlWjG2d)!Qsl*(efPyIWs8kkHYyQ@y;E?*N~fWZY-+p3j5 ztPSbW>Ke9lyF<581z#Q6<&9#xtC+|bH8w(e(VNt7!Bb1d8p>$`5}{xpouP|PHd&eD z@OF{LKewcDE5r<{>${?3>J_hlDmtQ+a!BekmrG;m%g6V~nUa@j5HiQM__IFpMo5+l zmX{vH@ahweQLQva4>c$_MIu5}!RXp3^2YxZC9W$VrgxF)L;6`wTtk!zdEc=b7F)bL zG~*<7b?snp?PygohUScI$8MDwwdZT8$yzZ@-eg-LWkoGW9~~$P|HGdH*~5Br)1ENy zja&6dKp7lBx_YKRk(u#8kokpK0RY#lIS)4zuIna(yHl%!A!yOm_?|TsjKSf%$82LP zo9T%V2%To&xyY?)gf$yKm33b;g}O~>15(uVW;cr}VL62a_&E9H5UiPaxY8~q1e3i! z&tea@UzkybjvB-o;&tr~*jP|HlkYeS2QKKAc#8Bavo0*Y)=cK$Mm$Ornv$kT}aaqPXN%Tks zi$1buQ&^22y(h&!*^<(XWg}GPbsTZ$*PgmG1Y7x=du_iTI&wHg)Aye>xWU=EOw+k& zy~`F7fEjnRr~@iZI(#cUSynuh>)L_h<*`4I*K>LOx1fEW{7uf&^0sg>{T{$l1yG3+ zQTCAys&7R_S|-W=upP5M{|*zYF$Ox`|AOpjRawy2?c^l`p&a^FhfTZ3dzrc}eRX}F zoN-GSeY>d`F^>Bi!W5X6nn8Zzjc%%};nq>$E)9$2S?*m;rJ|TuL`mKvP?GSZ6B}AZ zI!Ld3;wan)^VvP#Xv`q)va<)2f+lpl^gAiw#HWC$YElL14^NKH8`Oa~O?CxxNPZ@_ zhDkY%NuX0fT8 zD0b%WC*R(e9aqd~L1$u@hoI?NH75Va5;br#2WV7fa;+Pbfel;;bwds-s}Ob8HlVETgDmklU{nY7(UE)8vn`pEvf#+z@D%pvV0xm2=BK1u z7fmX{Jg1E}?T6uQa6RhU=8IV}&iSmJ{F&`nBUMtTLWJ5;?lV0JkRTUE!yvP%6eUFl5R<9oe2x+#eGPqWm z*Ljk*<(IdyVumF%-*yvm3;0(DH<&P(w2BRwB*s_Q!r{YG#0EIA2oLd9Y8vmk%d6xP z3E8UycvRbJ@HsrONzFsaHjk?{L=N3A6c7|qrL=ByC82PoTM8Vv@Y$qo-^D|Vf%MnE zIW7_YNGWvuyYv<)L>gurA;%yf3+9qCeDt71IA3EMhaPkwxF;oe*1<=#@51;Jo-#$x zz53~%vm)UZm8@E~tQ|X86U`FJ{6wI}xDvUO{jI1P^%xL-6ZeuGWydh{5tven?~eL3>RX91T*PN>}AY^wG&Fv1^Sg|=VoBQULP#;xnLh(|$GLjA1L zGA$bEw^%SyaP-idc<;Rv?Rnj2mFqAwoY_@Z1}=5z@X z65|}*)_UO3gy)eh@Og$PUf)1n{Z+yen`mAu6pHF@zoT93wMmX?gR`l&Ck;J`$Jr`z zv4~=xdFoco(X>{J&mX32p5S*`c$veAgK+`cxjp`dr3+S9dvPGUZB3yeLYvT`FZSeW zg4Asye3zia>%~F+tMN^=P{bA77+OzEZEOrlnxM;DFw`F_6Ru?p3?YTdmRk9hZ`tmFWJ&eQ-dZ^%W^+OpBJSmQ4+MSX24rR+st zVnJojkTr(Q5bnu93>YJ@QLn`cPzx1EHHX1Uw)O^QIt1{HQ|$7YKlV9LHp_SC&r8P~ z!%R&rA$42 zy(CjqS$zyXE=3QsFh?1D1S~2doB{DQ*!0kw=`UNT|i?L zk{4MF@|Y?4YdvhQ3)}Su&BJ~IaFU;s4r7ylT8867kJMP?bu-tjHaFe!iIo6SXoa#) zYYCwyB+v95z~+`|i}+??%4Q!Mm*pcMxUFrc)|p-tjXWES9U~k*o+T6?RR6=gxgne6m}nX7 zE5Z&}6q;3YcBav^9mLH$K8tMY~eQ7Kg zi2g@W<9x$ukMWy?Wt*X7OfoA!5O@VwH(9_CH=lwI=_f^yCq zk3f-*mKIu^HkU|RT5WzIpl2u&xO&qSQ;??4cIHxh6z~6fS@2B9)(*_0^ZEL7ynt3s+{S0tPPLlh=*XeY zeNsv|QZkCv+{7@yh{|#PcJZd-FkYIei;U~tB#hfdOT&?UV;1f<=eCNiWI-iBmiLS& z@l(dODM+St@(k;20wiY5h|KU$O4=YEGVM#a*;V#I#T~SU*@9`E*|W_-M`Qe z1o=n3n`K^LqZS!JgcgO=DzHp|MZ)cy#3TxhUWCQN$k1~vTKnu?5U8(xf|#K?Td#Pz zm()7AujjyHYAxz%>l~2Di*INT)ad||%Y;P+#m_$Rd1N*7P>{Z6Lt4fAL{qG4`kuFc zYuj2Sg<H(AdZeHB|jt1IA7vR2G~wbzEl`q!*c z2n$h5;BkFlS%*q8xTy%%-l0R}6jvL>_NkCm4GyjxIL6c}D|+&VP3<60KDsmXK8JbY zsF3$0;6*w-vyxpF%USfAeH|4wfJDh!)E0j7eIEw_x3*K{=Kg z_GU6}kI8Vdr*GCE@vsMBF9j6CefeI(A^k|T{TfB%Kj|XX##P@LMpGfPuj5S7pkU0$ zOWO6=jMQq-+?cvoG!mH%W2#9>+L zz*N#~*61I72bk61!>XY9emOp7_j#hO12%ldi4L1d_MR(>;Q=E{ELi{AJl(1o#w;zU zf5LRdg)6^bU2XtKO}nKH&uVfG8oClaGFKH@+rhqapAp~(6zbZUp;9H#-a4WvrpK5w zY(+#es}Q=gyfM=zbw$$hdwlMLrrhbChy6^I=`izYvD*R?S)u~^K;skQ7erd%i!;%A0vJSDTxScAPZ%DDp9wU4?=a*P#QkYflT3Ca&9 zzVaMIoFxz_`hb;sm}ByqFW}oHvvEmOV)#f4>oBQ#weCpeE$r;$_gI9fUa+nW$7Rsh z3Id05lk-Tym<|L5qVgQ|B@K^LS1|?lFp|zreSd`jzpO^Z)S}}ABA#4BS0{wJveu36 zLZ#x}7Q%m2UGJOrQ|{>9^+=K*Q-%4{tLAgF#D624vk!K7y;M{QK=Abb##U_F8QDHB zbSjb}t~yCXj(5iLY1-F=ilB5wq7`$4bV8j|36aWyXp&$a9Yt8Ni#Kc1M3>=M$5ojo z9aFN>^Pq#6i|KsJ=99+Upqxz6hEA_V1x{c?wxA)#2)V`(#Xp>BJkkmI%v=G+ek3_M z1`WiuS&%^%MsjHDnJ6HZinroWJPjk=A&?yq#j>Lq{LreYpu@87EQy0?Qye*MD!+mn4~>HQSxVdK@t5D^}jow3rzr_S;3#f z@?zw4GxF2?zWmX5yfc6gb}wj+0`ZGw5&-_XZ7P~VeT*UMWy6M>rWv%@Sx_Ewflt>p z%Pph}{r%MwDo=rmE|n@>PnV9)H+=89Y!J%y>I6&b!B5`%wR%o;4@-Fz*aKy%@ z{In*YJ6*4v!!k>e^x7(OwDh$oIHh^3VmFRC^(}?m&+}KILv5AYaD4Fg4G8ovWTL>u zf_h#*STCMDB+c1PNzqd@N&k41cV$72PP!+Ew^n$yIBk@bBfE8RwH`!+o)f zP&@7<9|2GXH=`Wfx#%y37pp#@C#ksEe+cxqNRN8PbG3V=I|L*RjOpc+VrHz9(k^32 z6$EpmrA&{4j_`R(XOLW~HeDxyv3=F+H8-OlZsU$l7(0fD?tH? zTEtS!c$FY{m@HL&BrKj*weA7f-F`{~d-t-u+rZesDJ8r-c-;4NDT9FqwBUc=Ru+bcI-UUW0f@_p z07htw9KK)%1;e1Wu32R2*M*-`L!82QC!l?`&+@(iZVXa+oAy;0^{4$8X%>I zKSvatC5jH0RQRN-O?H5UIS@wQ7;Bd$ih+hnpq>AXSIXO8 zV|hUEJ&y4*8?uMR+V%8(rlQ&&;xM{jb9xc*)4LgF0*8q9iS))g=?8~y7hrnu83=%b zr{-Vr4HCA+^^%x%305@eFP*Zm0UX>=Rz61QMi1lF_psNs77T;K0y5=vtRmISnkPSX zsR*2Yr&9kr4(l)3;pq6&e0Q0LPCyRE2NjZK#~Xu^ESj%IuVbhT??xju33U8uMVV;k zI>n-bhr)3EoaC>SS|>&D_=+AKm2F)G!kV}`@Dli&b-8LI2bzbR+~HP`;uRz|N_8`&Wk1G^Ni zdJ-arMxm_j=v)4T>p68o>IjD(XA&|KJfTou_s@3WPj(HU>vt=Q3z^@#+*r?n^{I|m z)Jnv}suuTYS&Fo~aP2Q`IS}Dq=U81uW=MYHm`THWiu^N2QzC7EvC(`yuQ>CKWQ{Zp z`PFCE%MpGd%3j`J|Dd%CHU_8o=zc6ai8`A*Nx z*&4@P(w(`FfXH-Jut~l#YJJGb$gNm!-0cw~i>*$xa+nN62xpMjLauGN;lIj+GEC3l zZdS%2L!lZnjUj5ZjYvG%XSDapdH0oCrjTh=ZW)W4N(eOZgHyMpVJ#ZXd(T6v}O zthP&ynLf~zwuGh5l613ufm518;&7=Q*n8LHqW@{!E5aJ>GFfBk@R zsFgcqv&3q95=8h0ee&SZqE$909cL>}pNPn7BY2_|)t0TXeetQQ@kUfR5wRFN_kydF z-ebD`OZL=z^g-S@tasCi0o5w;KrBH!Ns6kWS{(?rR<8j?h0h-8H*xjnQldzq&Gfxp zbB7x4Jop_yJ{&{e0T}a)Ot4em!~wXF-w(<#X01k>f|@|UO-HB@yDM?ym?Ic2Ma)1d z&rbb$$!1LTbD3{ar=`IH$=g*4QwyspVe3zY#FmFU9R9McGX>wk+s_D3j5>v%p-_#5 zW~ZpN5p130-ZSszWn2E_PvUG-v{Zd%>MFeapd?)uXyw4ydkpG7_miXGuWA)iLd8%^ zYcbUuJuKoAYN4dx0={#DgdxZoH(HBAQX2CZo}8zRe)BCq_$O__J4n~QM)hSxsXt3# zm6ZN@<4`hA60PJN5)_9TR4^VXoMr8d(dd7S@@e!gjh(vZ@`7Eki@$@JW>FdlYT zAS>R0r)u*+MCp*e-IzxWF42wmd$2Z zdgWX`Zh%Lq(SLR1G;lLNRk6##6KWs*nC+bEI?fk|$fi6OUWfg&v=QoM5A=ck@j@Xc zAHJc!0u2hYH450|>tWeLdL|7x_I;-i3bOTp39Y5JXKWKaXK#gF7=G+fk#ee8l+S%O5*skAu?=(TirOa`g4=?a06Y8_U3u;jaz5!=okWQHZT z?+HXoJN8(}20bWu3U6BVEri%iYeq6eLBO|&Q<(Wx7v)0*Ex8)v&0S@c+iY337a}~0 zyvG&7KWNshlIIpKao(?qXV7O2#BXOuvKxO;G``A@bg+AlhveV&VGylDygiBqB<-5} z5z_<@L?r!CG|+11-TS;GOZVlm@`)TFKl@$g+7~iwGq^69 z#0O;4*YWesV1nnvBj&omT-G!skau&QWI#VxHjka+7Q?DMc4Zp-uf!ZWJ_p&HB;;>3 zS8nDiwucBCYm0_THbbgb5bIh*TG>GVyfQ%)U^6BFvloR$5bx%}~}3*;47^>t7XFIf7+ zCHe{(L(xjaLtY6>igWRi0Jax@4}wuT0M&3*8N2pW(hbt(Q4OQH;_ zZ;n_*pYZ6j%bI>;!*5WcX^7VbJYuo(>%KT~xFG$MfcA(6KJ|W++6*bY^q;%CyX?Uf zbul2-u6NAsDN%7-MM@D@&@=|P+wU(_NPpw|SGubluPR*%k!1C3qViQ^Ua2prmUP{5L2)&G-8f#EU# zNj_v^#eIjn;9jJSHlhz_L(>Q#z>trl(mVsn#GyRk6>;?9TkIdT``@XdhcBx`c)G)7 zp$Cf@r;ZdwtLME)Y>P)JXBr6~;~akgEfDJn@IUYk#pKt+HQxa8uflx7Sz-vY4={iB zYjPjx%r(vK7Br#uRW1GBg)cW;F56teSTOc#Gp^L7GOg0vFf19}mS{_RW_;=W3IdaQ z_8%A8zJ?z1SVB!7zPot@w>n%}a>zyMzb)NBt{jG3?0klR?g2t$3E&Z{;jvlgs5C$! zbyvkN*A2;l&!{QMAuNaiX!f=(-OazwWnf z9d2V^LzYVt7I4q@OJD&mDm#&`@16P2tG&YqsA_iLJ<$YO*jxTEis~Pk5$8|$3rDZ| z`Dd>FwbKuL`uWIz|Np36aQUh$`2CO#>3^r%1OA+GDQSGXSP}{@|HtFw*K)p)#>1a! zZohxN|2&Rfzt{Z`)OfJWcYgjaq@H2mqxvEf@N_x9;s1;&%XL+!IRDVhH9k%(`Tq~_ z??bu9LwYReEx+niE1%`%zaXJ!T2}(5Pr>hrz}MpGw*L#){~&cGFo+NTrKa(5V`=wa z9D`b+fGeyt0%?uK-a4SrOWf>#DYkw7?Up(}bA0~@yiUCD{rb0rC*W(g#)FdJ{(l(! z3z_Tv-U)pDv29Oci}6yY@gP)nO02oK{Ta9Uzr0(z0yH$fegi)TeH|-^?McpF|M5r% zzHVzgcvhV{`h#x&vxlF$`n|QlFKvylGT`U>MdUTp=RxmhCh8jy82AsM3;5}*@zD)@ z<;!RJ{14SHrrPZVIh>pH2UY49iEbaL-tJE(a`^oyks7V6e;;hYWF!>DYekJh{vW^D B7McJ6 literal 0 HcmV?d00001 diff --git a/textures/craftguide_trash.png b/textures/craftguide_trash.png new file mode 100644 index 0000000000000000000000000000000000000000..962eac7ad586b4a9e396fd37925101518f42e661 GIT binary patch literal 1827 zcmV+;2i*9HP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=HIlI$i7h2L34mVhLL#Bwk{RoOw7p98jgx@RWI zy>;(Ps@jwd7Fd$cC(|9qUw_W<2M#JZhNR}Xz1COQ_2Yp%1|6^V;MWZM<>;EY9m{G>*5|q(SS~cu1p}v%j?~J zjL!nShoo%g-%gNzFaDPJDX=^;;@1h|+tpW*=j=Y`INz?O z3`O%*QCsX=p|$XUjXogcUw%rPv#~K@u_t@fr)~FDJ$_$jKQ>95`_l+7-OgtE= zF>_ zNkq{fS|Kl9b&WI@xpl=V0HJwt(=G7bF8uMSepaa_EL$==Ua-dFba5zs)Rt_{f^~}i z{Ddf2zZ^g!#8xCj0s=9UC}l!Dun|E=2cU|~SrQ*0K&sr4Bqx!~!Pt4l#xq8HEh}eU zX6#J>p_0YGrbq>>loa)2$x%a9MU$##HT9rHYnGg{=A13BO|F_)GPP`GZpEsLCs)sI z?q0kWE`mK!ODfM;UdZ)~3ufb>?Z)XPNau?V|dn{RB0-sPQJX*4cv^tikMd zL2EnF#SFwa5s2F&fP&`5EIOsci`-%s3*)0uMv}VNgiebX5T-$_lOF6o$o&wvp#DSL z_`k@7h3$9@gfZwyY2EW?B9lagB9lagB9lagB z9sTbe3H~~i@HfA9oL02Ai`)PJ0fT8nLr_UWLm+T+Z)Rz1WdHzpoPCi!NW(xJ#a~mU zQYsE+5b2PiI$01Eanvdlp+cw?T6HkF^b49aBq=VAf@{ISkHxBki?gl{u7V)=0pjH7 zr060g{;w&ti1FaKAMfrx?%n}Hqr!B%XB^NC$4Vy?QZ~0Lgxm0qM!N{?IDs(6J>YT&7~)`a_jUL7@0oUgKUHyZoBz@8 z9{>OV32;bRa{vGV*Z=?l*a7-nrg8uP00(qQO+^Rf3>^UlGv()Q6951LJxN4CRCwC$ z+r4WPK^VvJPc9)ztD?b_Vr38!I~640OGqP1Y*f%rv9q(%%1RJB#pZ%G!B`85e}FG2 zsA#khu`opxVku(oEV2?k?so5z-Sh79Ja8~`{C0Sr@9r}*`!L&AE|(Q#{kVfE46bsF zpP0oNEEVBoNpUuTlWPcGa_uP`Day$r0c_53tSv=3IiP*^4)aZFN3o+FPPG%jHB2|D zJ&STXoGMx8w(bEmlLEVNC|TB8u{|~YNsP4N+CR30M|hnk>dV*%Y{Od&cj*oOkxZta zR+|EQyEu4>@B7v=2MqLjn#U>-00Kbl1JZ1|h3#uR0Rf;#QlNz0*wACKF5)GsSpa5n zyhm^NeVj;3flWOeJj?aTjcEWD@xF%v%q1~4Oo0jx;I#U6xJm5n@F3sdL7o2>aJQK` zU;)<~3_j8Y0AAqI|5^s;a1pm;*YUsOGOi@;tm4MaWb9m1G|$)FUpVOB%J2CU{W;uA z+8;2JqP>j^f2~rVwO*kr{0W$^3I17z{&|CTmi9~X>$sg@rKVra&{tEgl`&SO69L4# zKmZ5;0U!VbfB+Bx0zd!=00AHX1b_e#00KY&2mk>f00e*l5C8%|00;o<1HfQLKTSW> z;@Cr-2w>F8+5CRlhpna>wCmY1E9U|BV{2Yc=lwmvV?4xmjAdxAT0T$#;~ClsyuwEu z&eP$%0Sx143;OXEv|~*`jY%*76b#^77sT|nNB}qRRE}qKa