diff --git a/.github/workflows/check-release.yml b/.github/workflows/check-release.yml new file mode 100644 index 0000000..47313ff --- /dev/null +++ b/.github/workflows/check-release.yml @@ -0,0 +1,11 @@ +on: [push, pull_request] +name: Check & Release +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: lint + uses: Roang-zero1/factorio-mod-luacheck@master + with: + luacheckrc_url: https://raw.githubusercontent.com/minetest-mods/unified_inventory/master/.luacheckrc diff --git a/.luacheckrc b/.luacheckrc new file mode 100644 index 0000000..e6fec97 --- /dev/null +++ b/.luacheckrc @@ -0,0 +1,21 @@ +unused_args = false +allow_defined_top = true +max_line_length = 999 + +globals = { + "unified_inventory", +} + +read_globals = { + string = {fields = {"split", "trim"}}, + table = {fields = {"copy", "getn"}}, + + "minetest", "vector", + "ItemStack", "datastorage", + + "hb", + "doors", +} + +files["callbacks.lua"].ignore = { "player", "draw_lite_mode" } +files["bags.lua"].ignore = { "player" } diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..32492e4 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,19 @@ +Unified Inventory for Minetest +Copyright (C) 2012-2014 Maciej Kasatkin (RealBadAngel) + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Contact information: + Examine a git patch to get the contributor's email address. diff --git a/README.md b/README.md index 1de7256..5d23f79 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,56 @@ -Unified inventory -================= +# Unified Inventory + +[![](https://github.com/minetest-mods/unified_inventory/workflows/Check%20&%20Release/badge.svg)](https://github.com/minetest-mods/unified_inventory/actions) + +![Screenshot](screenshot.png) Unified Inventory replaces the default survival and creative inventory. -It adds a nicer interface and a number of features, such as a crafting guide. -License -======= + +## Features + + * Node, item and tool browser + * Crafting guide + * Can copy the recipe to the crafting grid + * Recipe search function by ingredients + * Up to four bags with up to 24 slots each + * Home function to teleport + * Trash slot and refill slot for creative + * Waypoints to keep track of important locations + * Lite mode: reduces the item browser width + * `minetest.conf` setting `unified_inventory_lite = true` + * Mod API for modders: see [mod_api.txt](doc/mod_api.txt) + * Setting-determinated features: see [settingtypes.txt](settingtypes.txt) + + +## Requirements + + * Minetest 5.4.0+ + * Mod `default` for category filters (contained in Minetest Game) + * Mod `farming` for craftable bags (contained in Minetest Game) + * For waypoint migration: `datastorage` + + +# Licenses Copyright (C) 2012-2014 Maciej Kasatkin (RealBadAngel) -Unified inventory code is licensed under the GNU LGPLv2+. +Copyright (C) 2012-? Various minetest-mods contributors -Licenses for textures: + +## Code + +GNU LGPLv2+, see [license notice](LICENSE.txt) + + +## Textures VanessaE: (CC-BY-4.0) + * `ui_group.png` Tango Project: (Public Domain, CC-BY-4.0) + * [`ui_reset_icon.png`](https://commons.wikimedia.org/wiki/File:Edit-clear.svg) * [`ui_doubleleft_icon.png`](http://commons.wikimedia.org/wiki/File:Media-seek-backward.svg) * [`ui_doubleright_icon.png`](http://commons.wikimedia.org/wiki/File:Media-seek-forward.svg) @@ -25,6 +59,7 @@ * [`ui_skip_forward_icon.png`](http://commons.wikimedia.org/wiki/File:Media-skip-forward.svg) From http://www.clker.com (Public Domain, CC-BY-4.0): + * [`bags_small.png`](http://www.clker.com/clipart-moneybag-empty.html) * [`bags_medium.png`](http://www.clker.com/clipart-backpack-1.html) * [`bags_large.png` / `ui_bags_icon.png`](http://www.clker.com/clipart-backpack-green-brown.html) @@ -37,25 +72,33 @@ * [`ui_waypoint_set_icon.png`](http://www.clker.com/clipart-larger-flag.html) Everaldo Coelho (YellowIcon) (LGPL v2.1+): + * [`ui_craftguide_icon.png` / `ui_craft_icon.png`](http://commons.wikimedia.org/wiki/File:Advancedsettings.png) Gregory H. Revera: (CC-BY-SA 3.0) + * [`ui_moon_icon.png`](http://commons.wikimedia.org/wiki/File:FullMoon2010.jpg) Thomas Bresson: (CC-BY 3.0) + * [`ui_sun_icon.png`](http://commons.wikimedia.org/wiki/File:2012-10-13_15-29-35-sun.jpg) Fibonacci: (Public domain, CC-BY 4.0) + * [`ui_xyz_off_icon.png`](http://commons.wikimedia.org/wiki/File:No_sign.svg) Gregory Maxwell: (Public domain, CC-BY 4.0) + * [`ui_ok_icon.png`](http://commons.wikimedia.org/wiki/File:Yes_check.svg) Adrien Facélina: (LGPL v2.1+) + * [`inventory_plus_worldedit_gui.png`](http://commons.wikimedia.org/wiki/File:Erioll_world_2.svg) Other files from Wikimedia Commons: + * [`ui_gohome_icon.png` / `ui_home_icon.png` / `ui_sethome_icon.png`](http://commons.wikimedia.org/wiki/File:Home_256x256.png) (GPL v2+) RealBadAngel: (CC-BY-4.0) - * Everything else. \ No newline at end of file + + * Everything else. diff --git a/api.lua b/api.lua index f6afec5..22788ae 100644 --- a/api.lua +++ b/api.lua @@ -1,5 +1,6 @@ -local S = unified_inventory.gettext +local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape +local ui = unified_inventory -- Create detached creative inventory after loading all mods minetest.after(0.01, function() @@ -8,16 +9,16 @@ if not rev_aliases[target] then rev_aliases[target] = {} end table.insert(rev_aliases[target], source) end - unified_inventory.items_list = {} + ui.items_list = {} for name, def in pairs(minetest.registered_items) do if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then - table.insert(unified_inventory.items_list, name) + table.insert(ui.items_list, name) local all_names = rev_aliases[name] or {} table.insert(all_names, name) - for _, name in ipairs(all_names) do - local recipes = minetest.get_all_craft_recipes(name) + for _, player_name in ipairs(all_names) do + local recipes = minetest.get_all_craft_recipes(player_name) if recipes then for _, recipe in ipairs(recipes) do @@ -26,30 +27,30 @@ for _,chk in pairs(recipe.items) do local groupchk = string.find(chk, "group:") if (not groupchk and not minetest.registered_items[chk]) - or (groupchk and not unified_inventory.get_group_item(string.gsub(chk, "group:", "")).item) + or (groupchk and not ui.get_group_item(string.gsub(chk, "group:", "")).item) or minetest.get_item_group(chk, "not_in_craft_guide") ~= 0 then unknowns = true end end if not unknowns then - unified_inventory.register_craft(recipe) + ui.register_craft(recipe) end end end end end end - table.sort(unified_inventory.items_list) - unified_inventory.items_list_size = #unified_inventory.items_list - print("Unified Inventory. inventory size: "..unified_inventory.items_list_size) - for _, name in ipairs(unified_inventory.items_list) do + table.sort(ui.items_list) + ui.items_list_size = #ui.items_list + print("Unified Inventory. inventory size: "..ui.items_list_size) + for _, name in ipairs(ui.items_list) do local def = minetest.registered_items[name] -- Simple drops if type(def.drop) == "string" then local dstack = ItemStack(def.drop) if not dstack:is_empty() and dstack:get_name() ~= name then - unified_inventory.register_craft({ + ui.register_craft({ type = "digging", items = {name}, output = def.drop, @@ -115,7 +116,7 @@ end end for itemstring, count in pairs(drop_guaranteed) do - unified_inventory.register_craft({ + ui.register_craft({ type = "digging", items = {name}, output = itemstring .. " " .. count, @@ -123,7 +124,7 @@ }) end for itemstring, count in pairs(drop_maybe) do - unified_inventory.register_craft({ + ui.register_craft({ type = "digging_chance", items = {name}, output = itemstring .. " " .. count, @@ -132,22 +133,22 @@ end end end - for _, recipes in pairs(unified_inventory.crafts_for.recipe) do + for _, recipes in pairs(ui.crafts_for.recipe) do for _, recipe in ipairs(recipes) do local ingredient_items = {} for _, spec in pairs(recipe.items) do - local matches_spec = unified_inventory.canonical_item_spec_matcher(spec) - for _, name in ipairs(unified_inventory.items_list) do + local matches_spec = ui.canonical_item_spec_matcher(spec) + for _, name in ipairs(ui.items_list) do if matches_spec(name) then ingredient_items[name] = true end end end for name, _ in pairs(ingredient_items) do - if unified_inventory.crafts_for.usage[name] == nil then - unified_inventory.crafts_for.usage[name] = {} + if ui.crafts_for.usage[name] == nil then + ui.crafts_for.usage[name] = {} end - table.insert(unified_inventory.crafts_for.usage[name], recipe) + table.insert(ui.crafts_for.usage[name], recipe) end end end @@ -156,9 +157,9 @@ -- load_home local function load_home() - local input = io.open(unified_inventory.home_filename, "r") + local input = io.open(ui.home_filename, "r") if not input then - unified_inventory.home_pos = {} + ui.home_pos = {} return end while true do @@ -167,32 +168,40 @@ local y = input:read("*n") local z = input:read("*n") local name = input:read("*l") - unified_inventory.home_pos[name:sub(2)] = {x = x, y = y, z = z} + ui.home_pos[name:sub(2)] = {x = x, y = y, z = z} end io.close(input) end load_home() -function unified_inventory.set_home(player, pos) +function ui.set_home(player, pos) local player_name = player:get_player_name() - unified_inventory.home_pos[player_name] = vector.round(pos) + ui.home_pos[player_name] = vector.round(pos) + -- save the home data from the table to the file - local output = io.open(unified_inventory.home_filename, "w") - for k, v in pairs(unified_inventory.home_pos) do + local output = io.open(ui.home_filename, "w") + if not output then + minetest.log("warning", "[unified_inventory] Failed to save file: " + .. ui.home_filename) + return + end + for k, v in pairs(ui.home_pos) do output:write(v.x.." "..v.y.." "..v.z.." "..k.."\n") end io.close(output) end -function unified_inventory.go_home(player) - local pos = unified_inventory.home_pos[player:get_player_name()] +function ui.go_home(player) + local pos = ui.home_pos[player:get_player_name()] if pos then - player:setpos(pos) - end + player:set_pos(pos) + return true + end + return false end -- register_craft -function unified_inventory.register_craft(options) +function ui.register_craft(options) if not options.output then return end @@ -203,10 +212,10 @@ if options.type == "normal" and options.width == 0 then options = { type = "shapeless", items = options.items, output = options.output, width = 0 } end - if not unified_inventory.crafts_for.recipe[itemstack:get_name()] then - unified_inventory.crafts_for.recipe[itemstack:get_name()] = {} - end - table.insert(unified_inventory.crafts_for.recipe[itemstack:get_name()],options) + if not ui.crafts_for.recipe[itemstack:get_name()] then + ui.crafts_for.recipe[itemstack:get_name()] = {} + end + table.insert(ui.crafts_for.recipe[itemstack:get_name()],options) end @@ -217,7 +226,7 @@ } -function unified_inventory.craft_type_defaults(name, options) +function ui.craft_type_defaults(name, options) if not options.description then options.description = name end @@ -226,13 +235,13 @@ end -function unified_inventory.register_craft_type(name, options) - unified_inventory.registered_craft_types[name] = - unified_inventory.craft_type_defaults(name, options) -end - - -unified_inventory.register_craft_type("normal", { +function ui.register_craft_type(name, options) + ui.registered_craft_types[name] = + ui.craft_type_defaults(name, options) +end + + +ui.register_craft_type("normal", { description = F(S("Crafting")), icon = "ui_craftgrid_icon.png", width = 3, @@ -248,7 +257,7 @@ }) -unified_inventory.register_craft_type("shapeless", { +ui.register_craft_type("shapeless", { description = F(S("Mixing")), icon = "ui_craftgrid_icon.png", width = 3, @@ -263,7 +272,7 @@ }) -unified_inventory.register_craft_type("cooking", { +ui.register_craft_type("cooking", { description = F(S("Cooking")), icon = "default_furnace_front.png", width = 1, @@ -271,38 +280,60 @@ }) -unified_inventory.register_craft_type("digging", { +ui.register_craft_type("digging", { description = F(S("Digging")), icon = "default_tool_steelpick.png", width = 1, height = 1, }) -unified_inventory.register_craft_type("digging_chance", { +ui.register_craft_type("digging_chance", { description = "Digging (by chance)", icon = "default_tool_steelpick.png^[transformFY.png", width = 1, height = 1, }) -function unified_inventory.register_page(name, def) - unified_inventory.pages[name] = def -end - - -function unified_inventory.register_button(name, def) +function ui.register_page(name, def) + ui.pages[name] = def +end + + +function ui.register_button(name, def) if not def.action then def.action = function(player) - unified_inventory.set_inventory_formspec(player, name) + ui.set_inventory_formspec(player, name) end end def.name = name - table.insert(unified_inventory.buttons, def) -end - - -function unified_inventory.is_creative(playername) + table.insert(ui.buttons, def) +end + +function ui.is_creative(playername) return minetest.check_player_privs(playername, {creative=true}) or minetest.settings:get_bool("creative_mode") end +function ui.single_slot(xpos, ypos, bright) + return string.format("background9[%f,%f;%f,%f;ui_single_slot%s.png;false;16]", + xpos, ypos, ui.imgscale, ui.imgscale, (bright and "_bright" or "") ) +end + +function ui.make_trash_slot(xpos, ypos) + return + ui.single_slot(xpos, ypos).. + "image["..xpos..","..ypos..";1.25,1.25;ui_trash_slot_icon.png]".. + "list[detached:trash;main;"..(xpos + ui.list_img_offset)..","..(ypos + ui.list_img_offset)..";1,1;]" +end + +function ui.make_inv_img_grid(xpos, ypos, width, height, bright) + local tiled = {} + local n=1 + for y = 0, (height - 1) do + for x = 0, (width -1) do + tiled[n] = ui.single_slot(xpos + (ui.imgscale * x), ypos + (ui.imgscale * y), bright) + n = n + 1 + end + end + return table.concat(tiled) +end diff --git a/bags.lua b/bags.lua index 6f07314..14ac875 100644 --- a/bags.lua +++ b/bags.lua @@ -1,30 +1,38 @@ --- Bags for Minetest - --- Copyright (c) 2012 cornernote, Brett O'Donnell --- License: GPLv3 - -local S = unified_inventory.gettext +--[[ +Bags for Minetest + +Copyright (c) 2012 cornernote, Brett O'Donnell +License: GPLv3 +--]] + +local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape - -unified_inventory.register_page("bags", { +local ui = unified_inventory + +ui.register_page("bags", { get_formspec = function(player) local player_name = player:get_player_name() - local formspec = "background[0.06,0.99;7.92,7.52;ui_bags_main_form.png]" - formspec = formspec.."label[0,0;"..F(S("Bags")).."]" - formspec = formspec.."button[0,2;2,0.5;bag1;"..F(S("Bag @1", 1)).."]" - formspec = formspec.."button[2,2;2,0.5;bag2;"..F(S("Bag @1", 2)).."]" - formspec = formspec.."button[4,2;2,0.5;bag3;"..F(S("Bag @1", 3)).."]" - formspec = formspec.."button[6,2;2,0.5;bag4;"..F(S("Bag @1", 4)).."]" - formspec = formspec.."listcolors[#00000000;#00000000]" - formspec = formspec.."list[detached:"..F(player_name).."_bags;bag1;0.5,1;1,1;]" - formspec = formspec.."list[detached:"..F(player_name).."_bags;bag2;2.5,1;1,1;]" - formspec = formspec.."list[detached:"..F(player_name).."_bags;bag3;4.5,1;1,1;]" - formspec = formspec.."list[detached:"..F(player_name).."_bags;bag4;6.5,1;1,1;]" - return {formspec=formspec} + return { formspec = table.concat({ + ui.style_full.standard_inv_bg, + ui.single_slot(0.925, 1.5), + ui.single_slot(3.425, 1.5), + ui.single_slot(5.925, 1.5), + ui.single_slot(8.425, 1.5), + "label["..ui.style_full.form_header_x..","..ui.style_full.form_header_y..";" .. F(S("Bags")) .. "]", + "button[0.6125,2.75;1.875,0.75;bag1;" .. F(S("Bag @1", 1)) .. "]", + "button[3.1125,2.75;1.875,0.75;bag2;" .. F(S("Bag @1", 2)) .. "]", + "button[5.6125,2.75;1.875,0.75;bag3;" .. F(S("Bag @1", 3)) .. "]", + "button[8.1125,2.75;1.875,0.75;bag4;" .. F(S("Bag @1", 4)) .. "]", + "listcolors[#00000000;#00000000]", + "list[detached:" .. F(player_name) .. "_bags;bag1;1.075,1.65;1,1;]", + "list[detached:" .. F(player_name) .. "_bags;bag2;3.575,1.65;1,1;]", + "list[detached:" .. F(player_name) .. "_bags;bag3;6.075,1.65;1,1;]", + "list[detached:" .. F(player_name) .. "_bags;bag4;8.575,1.65;1,1;]" + }) } end, }) -unified_inventory.register_button("bags", { +ui.register_button("bags", { type = "image", image = "ui_bags_icon.png", tooltip = S("Bags"), @@ -38,37 +46,38 @@ }):get_stack("bag" .. i, 1) end -for i = 1, 4 do - local bi = i - unified_inventory.register_page("bag"..bi, { +for bag_i = 1, 4 do + ui.register_page("bag" .. bag_i, { get_formspec = function(player) - local stack = get_player_bag_stack(player, bi) + local stack = get_player_bag_stack(player, bag_i) local image = stack:get_definition().inventory_image - local formspec = ("image[7,0;1,1;"..image.."]" - .."label[0,0;"..F(S("Bag @1", bi)).."]" - .."listcolors[#00000000;#00000000]" - .."list[current_player;bag"..bi.."contents;0,1;8,3;]" - .."listring[current_name;bag"..bi.."contents]" - .."listring[current_player;main]") local slots = stack:get_definition().groups.bagslots - if slots == 8 then - formspec = formspec.."background[0.06,0.99;7.92,7.52;ui_bags_sm_form.png]" - elseif slots == 16 then - formspec = formspec.."background[0.06,0.99;7.92,7.52;ui_bags_med_form.png]" - elseif slots == 24 then - formspec = formspec.."background[0.06,0.99;7.92,7.52;ui_bags_lg_form.png]" - end + + local formspec = { + ui.style_full.standard_inv_bg, + ui.make_inv_img_grid(0.3, 1.5, 8, slots/8), + "image[9.2,0.4;1,1;" .. image .. "]", + "label[0.3,0.65;" .. F(S("Bag @1", bag_i)) .. "]", + "listcolors[#00000000;#00000000]", + "listring[current_player;main]", + string.format("list[current_player;bag%icontents;%f,%f;8,3;]", + bag_i, 0.3 + ui.list_img_offset, 1.5 + ui.list_img_offset), + "listring[current_name;bag" .. bag_i .. "contents]", + } + local n = #formspec + 1 + local player_name = player:get_player_name() -- For if statement. - if unified_inventory.trash_enabled or unified_inventory.is_creative(player_name) or minetest.get_player_privs(player_name).give then - formspec = (formspec.."background[6.06,0;0.92,0.92;ui_bags_trash.png]" - .."list[detached:trash;main;6,0.1;1,1;]") + if ui.trash_enabled + or ui.is_creative(player_name) + or minetest.get_player_privs(player_name).give then + formspec[n] = ui.make_trash_slot(7.8, 0.25) + n = n + 1 end local inv = player:get_inventory() for i = 1, 4 do local def = get_player_bag_stack(player, i):get_definition() - local button if def.groups.bagslots then - local list_name = "bag"..i.."contents" + local list_name = "bag" .. i .. "contents" local size = inv:get_size(list_name) local used = 0 for si = 1, size do @@ -78,14 +87,13 @@ end end local img = def.inventory_image - local label = F(S("Bag @1", i)).."\n"..used.."/"..size - button = "image_button["..(i+1)..",0;1,1;"..img..";bag"..i..";"..label.."]" - else - button = "" + local label = F(S("Bag @1", i)) .. "\n" .. used .. "/" .. size + formspec[n] = string.format("image_button[%f,0.4;1,1;%s;bag%i;%s]", + (i + 1.35)*1.25, img, i, label) + n = n + 1 end - formspec = formspec..button - end - return {formspec=formspec} + end + return { formspec = table.concat(formspec) } end, }) end @@ -95,12 +103,12 @@ return end for i = 1, 4 do - if fields["bag"..i] then + if fields["bag" .. i] then local stack = get_player_bag_stack(player, i) if not stack:get_definition().groups.bagslots then return end - unified_inventory.set_inventory_formspec(player, "bag"..i) + ui.set_inventory_formspec(player, "bag" .. i) return end end @@ -110,30 +118,32 @@ local is_empty = true local bags = {} for i = 1, 4 do - local bag = "bag"..i + local bag = "bag" .. i if not bags_inv:is_empty(bag) then -- Stack limit is 1, otherwise use stack:to_string() bags[i] = bags_inv:get_stack(bag, 1):get_name() is_empty = false end end + local meta = player:get_meta() if is_empty then - player:set_attribute("unified_inventory:bags", nil) + meta:set_string("unified_inventory:bags", nil) else - player:set_attribute("unified_inventory:bags", + meta:set_string("unified_inventory:bags", minetest.serialize(bags)) end end local function load_bags_metadata(player, bags_inv) local player_inv = player:get_inventory() - local bags_meta = player:get_attribute("unified_inventory:bags") + local meta = player:get_meta() + local bags_meta = meta:get("unified_inventory:bags") local bags = bags_meta and minetest.deserialize(bags_meta) or {} local dirty_meta = false if not bags_meta then -- Backwards compatiblity for i = 1, 4 do - local bag = "bag"..i + local bag = "bag" .. i if not player_inv:is_empty(bag) then -- Stack limit is 1, otherwise use stack:to_string() bags[i] = player_inv:get_stack(bag, 1):get_name() @@ -143,7 +153,7 @@ end -- Fill detached slots for i = 1, 4 do - local bag = "bag"..i + local bag = "bag" .. i bags_inv:set_size(bag, 1) bags_inv:set_stack(bag, 1, bags[i] or "") end @@ -155,17 +165,16 @@ -- Clean up deprecated garbage after saving for i = 1, 4 do - local bag = "bag"..i + local bag = "bag" .. i player_inv:set_size(bag, 0) end end minetest.register_on_joinplayer(function(player) - local player_inv = player:get_inventory() local player_name = player:get_player_name() - local bags_inv = minetest.create_detached_inventory(player_name.."_bags",{ + local bags_inv = minetest.create_detached_inventory(player_name .. "_bags",{ on_put = function(inv, listname, index, stack, player) - player:get_inventory():set_size(listname.."contents", + player:get_inventory():set_size(listname .. "contents", stack:get_definition().groups.bagslots) save_bags_metadata(player, inv) end, @@ -175,14 +184,14 @@ return 0 end local player_inv = player:get_inventory() - local old_slots = player_inv:get_size(listname.."contents") + local old_slots = player_inv:get_size(listname .. "contents") if new_slots >= old_slots then return 1 end -- using a smaller bag, make sure it fits - local old_list = player_inv:get_list(listname.."contents") + local old_list = player_inv:get_list(listname .. "contents") local new_list = {} local slots_used = 0 local use_new_list = false @@ -196,7 +205,7 @@ end if new_slots >= slots_used then if use_new_list then - player_inv:set_list(listname.."contents", new_list) + player_inv:set_list(listname .. "contents", new_list) end return 1 end @@ -204,13 +213,13 @@ return 0 end, allow_take = function(inv, listname, index, stack, player) - if player:get_inventory():is_empty(listname.."contents") then + if player:get_inventory():is_empty(listname .. "contents") then return stack:get_count() end return 0 end, on_take = function(inv, listname, index, stack, player) - player:get_inventory():set_size(listname.."contents", 0) + player:get_inventory():set_size(listname .. "contents", 0) save_bags_metadata(player, inv) end, allow_move = function() @@ -245,7 +254,7 @@ minetest.register_craft({ output = "unified_inventory:bag_small", recipe = { - {"", "farming:cotton", ""}, + {"", "farming:string", ""}, {"group:wool", "group:wool", "group:wool"}, {"group:wool", "group:wool", "group:wool"}, }, @@ -255,8 +264,8 @@ output = "unified_inventory:bag_medium", recipe = { {"", "", ""}, - {"farming:cotton", "unified_inventory:bag_small", "farming:cotton"}, - {"farming:cotton", "unified_inventory:bag_small", "farming:cotton"}, + {"farming:string", "unified_inventory:bag_small", "farming:string"}, + {"farming:string", "unified_inventory:bag_small", "farming:string"}, }, }) @@ -264,8 +273,8 @@ output = "unified_inventory:bag_large", recipe = { {"", "", ""}, - {"farming:cotton", "unified_inventory:bag_medium", "farming:cotton"}, - {"farming:cotton", "unified_inventory:bag_medium", "farming:cotton"}, + {"farming:string", "unified_inventory:bag_medium", "farming:string"}, + {"farming:string", "unified_inventory:bag_medium", "farming:string"}, }, }) end diff --git a/callbacks.lua b/callbacks.lua index e6ea3e7..1f43e39 100644 --- a/callbacks.lua +++ b/callbacks.lua @@ -19,6 +19,8 @@ unified_inventory.active_search_direction[player_name] = "nochange" unified_inventory.apply_filter(player, "", "nochange") unified_inventory.current_searchbox[player_name] = "" + unified_inventory.current_category[player_name] = "all" + unified_inventory.current_category_scroll[player_name] = 0 unified_inventory.alternate[player_name] = 1 unified_inventory.current_item[player_name] = nil unified_inventory.current_craft_direction[player_name] = "recipe" @@ -28,7 +30,6 @@ -- Refill slot local refill = minetest.create_detached_inventory(player_name.."refill", { allow_put = function(inv, listname, index, stack, player) - local player_name = player:get_player_name() if unified_inventory.is_creative(player_name) then return stack:get_count() else @@ -36,7 +37,6 @@ end end, on_put = function(inv, listname, index, stack, player) - local player_name = player:get_player_name() local handle_refill = (minetest.registered_items[stack:get_name()] or {}).on_refill or default_refill stack = handle_refill(stack) inv:set_stack(listname, index, stack) @@ -47,6 +47,15 @@ refill:set_size("main", 1) end) +local function apply_new_filter(player, search_text, new_dir) + local player_name = player:get_player_name() + minetest.sound_play("click", {to_player=player_name, gain = 0.1}) + unified_inventory.apply_filter(player, search_text, new_dir) + unified_inventory.current_searchbox[player_name] = search_text + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) +end + minetest.register_on_player_receive_fields(function(player, formname, fields) local player_name = player:get_player_name() @@ -60,7 +69,41 @@ if fields.searchbox and fields.searchbox ~= unified_inventory.current_searchbox[player_name] then unified_inventory.current_searchbox[player_name] = fields.searchbox - unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) + end + + + local clicked_category + for name, value in pairs(fields) do + local category_name = string.match(name, "^category_(.+)$") + if category_name then + clicked_category = category_name + break + end + end + + if clicked_category + and clicked_category ~= unified_inventory.current_category[player_name] then + unified_inventory.current_category[player_name] = clicked_category + unified_inventory.apply_filter(player, unified_inventory.current_searchbox[player_name], "nochange") + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) + end + + if fields.next_category then + local scroll = math.min(#unified_inventory.category_list-ui_peruser.pagecols, unified_inventory.current_category_scroll[player_name] + 1) + if scroll ~= unified_inventory.current_category_scroll[player_name] then + unified_inventory.current_category_scroll[player_name] = scroll + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) + end + end + if fields.prev_category then + local scroll = math.max(0, unified_inventory.current_category_scroll[player_name] - 1) + if scroll ~= unified_inventory.current_category_scroll[player_name] then + unified_inventory.current_category_scroll[player_name] = scroll + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) + end end for i, def in pairs(unified_inventory.buttons) do @@ -112,21 +155,19 @@ unified_inventory.current_page[player_name]) end + -- Check clicked item image button local clicked_item for name, value in pairs(fields) do - if string.sub(name, 1, 12) == "item_button_" then - local new_dir, mangled_item = string.match(name, "^item_button_([a-z]+)_(.*)$") + local new_dir, mangled_item = string.match(name, "^item_button_([a-z]+)_(.*)$") + if new_dir and mangled_item then clicked_item = unified_inventory.demangle_for_formspec(mangled_item) if string.sub(clicked_item, 1, 6) == "group:" then - minetest.sound_play("click", {to_player=player_name, gain = 0.1}) - unified_inventory.apply_filter(player, clicked_item, new_dir) - unified_inventory.current_searchbox[player_name] = clicked_item - unified_inventory.set_inventory_formspec(player, - unified_inventory.current_page[player_name]) + -- Change search filter to this group + unified_inventory.current_category[player_name] = "all" + apply_new_filter(player, clicked_item, new_dir) return end - if new_dir == "recipe" - or new_dir == "usage" then + if new_dir == "recipe" or new_dir == "usage" then unified_inventory.current_craft_direction[player_name] = new_dir end break @@ -145,6 +186,7 @@ unified_inventory.alternate[player_name] = 1 unified_inventory.set_inventory_formspec(player, "craftguide") elseif player_creative then + -- Creative page: Add entire stack to inventory local inv = player:get_inventory() local stack = ItemStack(clicked_item) stack:set_count(stack:get_stack_max()) @@ -162,12 +204,7 @@ minetest.sound_play("paperflip2", {to_player=player_name, gain = 1.0}) elseif fields.searchresetbutton then - unified_inventory.apply_filter(player, "", "nochange") - unified_inventory.current_searchbox[player_name] = "" - unified_inventory.set_inventory_formspec(player, - unified_inventory.current_page[player_name]) - minetest.sound_play("click", - {to_player=player_name, gain = 0.1}) + apply_new_filter(player, "", "nochange") end -- alternate buttons diff --git a/category.lua b/category.lua new file mode 100644 index 0000000..d0fee5e --- /dev/null +++ b/category.lua @@ -0,0 +1,150 @@ +local S = minetest.get_translator("unified_inventory") + +unified_inventory.registered_categories = {} +unified_inventory.registered_category_items = {} +unified_inventory.category_list = {} + +local function char_to_sort_index(char_code) + if char_code <= 32 then + -- Command codes, no thanks + return 0 + end + if char_code <= 64 then + -- Sorts numbers, and some punctuation, after letters + return char_code + end + if char_code >= 158 then + -- Out of sortable range + return 0 + end + if char_code > 122 then + -- Avoids overlap with {, |, } and ~ + return char_code - 58 + end + if char_code > 96 then + -- Normalises lowercase with uppercase + return char_code - 96 + end + return char_code - 64 +end + +local function string_to_sort_index(str) + local max_chars = 5 + local power = 100 + local index = 0 + for i=1,math.min(#str, max_chars) do + index = index + (char_to_sort_index(string.byte(str, i))/(power^i)) + end + return index +end + +function update_category_list() + local category_list = {} + table.insert(category_list, { + name = "all", + label = S("All Items"), + symbol = "ui_category_all.png", + index = -2, + }) + table.insert(category_list, { + name = "uncategorized", + label = S("Misc. Items"), + symbol = "ui_category_none.png", + index = -1, + }) + for category, def in pairs(unified_inventory.registered_categories) do + table.insert(category_list, { + name = category, + label = def.label or category, + symbol = def.symbol, + index = def.index or -- sortby defined order + string_to_sort_index(category) -- or do a rudimentary alphabetical sort + }) + end + table.sort(category_list, function (a,b) + return a.index < b.index + end) + unified_inventory.category_list = category_list +end + +local function ensure_category_exists(category_name) + if not unified_inventory.registered_categories[category_name] then + unified_inventory.registered_categories[category_name] = { + symbol = "unknown_item.png", + label = category_name + } + end + if not unified_inventory.registered_category_items[category_name] then + unified_inventory.registered_category_items[category_name] = {} + end +end + +function unified_inventory.register_category(category_name, config) + ensure_category_exists(category_name) + config = config or {} + if config.symbol then + unified_inventory.set_category_symbol(category_name, config.symbol) + end + if config.label then + unified_inventory.set_category_label(category_name, config.label) + end + if config.index then + unified_inventory.set_category_index(category_name, config.index) + end + if config.items then + unified_inventory.add_category_items(category_name, config.items) + end + update_category_list() +end +function unified_inventory.set_category_symbol(category_name, symbol) + ensure_category_exists(category_name) + unified_inventory.registered_categories[category_name].symbol = symbol + update_category_list() +end +function unified_inventory.set_category_label(category_name, label) + ensure_category_exists(category_name) + unified_inventory.registered_categories[category_name].label = label + update_category_list() +end +function unified_inventory.set_category_index(category_name, index) + ensure_category_exists(category_name) + unified_inventory.registered_categories[category_name].index = index + update_category_list() +end +function unified_inventory.add_category_item(category_name, item) + ensure_category_exists(category_name) + unified_inventory.registered_category_items[category_name][item] = true +end +function unified_inventory.add_category_items(category_name, items) + for _,item in ipairs(items) do + unified_inventory.add_category_item(category_name, item) + end +end + +function unified_inventory.remove_category_item(category_name, item) + unified_inventory.registered_category_items[category_name][item] = nil +end +function unified_inventory.remove_category(category_name) + unified_inventory.registered_categories[category_name] = nil + unified_inventory.registered_category_items[category_name] = nil + update_category_list() +end + +function unified_inventory.find_category(item) + -- Returns the first category the item exists in + -- Best for checking if an item has any category at all + for category, items in pairs(unified_inventory.registered_category_items) do + if items[item] then return category end + end +end +function unified_inventory.find_categories(item) + -- Returns all the categories the item exists in + -- Best for listing all categories + local categories = {} + for category, items in pairs(unified_inventory.registered_category_items) do + if items[item] then + table.insert(categories, category) + end + end + return categories +end diff --git a/default-categories.lua b/default-categories.lua new file mode 100644 index 0000000..57d3e88 --- /dev/null +++ b/default-categories.lua @@ -0,0 +1,704 @@ +local S = minetest.get_translator("unified_inventory") + +unified_inventory.register_category('plants', { + symbol = "flowers:tulip", + label = S("Plant Life") +}) +unified_inventory.register_category('building', { + symbol = "default:brick", + label = S("Building Materials") +}) +unified_inventory.register_category('tools', { + symbol = "default:pick_diamond", + label = S("Tools") +}) +unified_inventory.register_category('minerals', { + symbol = "default:iron_lump", + label = S("Minerals and Metals") +}) +unified_inventory.register_category('environment', { + symbol = "default:dirt_with_grass", + label = S("Environment and Worldgen") +}) +unified_inventory.register_category('lighting', { + symbol = "default:torch", + label = S("Lighting") +}) + + +if unified_inventory.automatic_categorization then + minetest.register_on_mods_loaded(function() + + -- Add biome nodes to environment category + for _,def in pairs(minetest.registered_biomes) do + local env_nodes = { + def.node_riverbed, def.node_top, def.node_filler, def.node_dust, + } + for i,node in pairs(env_nodes) do + if node then + unified_inventory.add_category_item('environment', node) + end + end + end + + -- Add minable ores to minerals and everything else (pockets of stone & sand variations) to environment + for _,item in pairs(minetest.registered_ores) do + if item.ore_type == "scatter" then + local drop = minetest.registered_nodes[item.ore].drop + if drop and drop ~= "" then + unified_inventory.add_category_item('minerals', item.ore) + unified_inventory.add_category_item('minerals', drop) + else + unified_inventory.add_category_item('environment', item.ore) + end + else + unified_inventory.add_category_item('environment', item.ore) + end + end + + -- Add items by item definition + for name, def in pairs(minetest.registered_items) do + local group = def.groups or {} + if not group.not_in_creative_inventory then + if group.stair or + group.slab or + group.wall or + group.fence then + unified_inventory.add_category_item('building', name) + elseif group.flora or + group.flower or + group.seed or + group.leaves or + group.sapling or + group.tree then + unified_inventory.add_category_item('plants', name) + elseif def.type == 'tool' then + unified_inventory.add_category_item('tools', name) + elseif def.liquidtype == 'source' then + unified_inventory.add_category_item('environment', name) + elseif def.light_source and def.light_source > 0 then + unified_inventory.add_category_item('lighting', name) + elseif group.door or + minetest.global_exists("doors") and ( + doors.registered_doors and doors.registered_doors[name..'_a'] or + doors.registered_trapdoors and doors.registered_trapdoors[name] + ) then + unified_inventory.add_category_item('building', name) + end + end + end + end) +end + +-- [[ +unified_inventory.add_category_items('plants', { + "default:dry_grass_5", + "default:acacia_sapling", + "default:blueberry_bush_sapling", + "default:grass_2", + "default:pine_bush_stem", + "default:leaves", + "default:pine_needles", + "default:cactus", + "default:junglegrass", + "default:pine_sapling", + "default:sapling", + "default:bush_stem", + "default:dry_grass_2", + "default:fern_1", + "default:grass_3", + "default:marram_grass_1", + "default:pine_tree", + "default:dry_grass_3", + "default:dry_shrub", + "default:grass_4", + "default:marram_grass_2", + "default:jungleleaves", + "default:apple", + "default:tree", + "default:aspen_tree", + "default:bush_sapling", + "default:grass_5", + "default:blueberry_bush_leaves_with_berries", + "default:acacia_bush_sapling", + "default:grass_1", + "default:aspen_leaves", + "default:marram_grass_3", + "default:large_cactus_seedling", + "default:junglesapling", + "default:dry_grass_4", + "default:acacia_bush_stem", + "default:papyrus", + "default:pine_bush_needles", + "default:bush_leaves", + "default:fern_3", + "default:aspen_sapling", + "default:acacia_tree", + "default:apple_mark", + "default:acacia_leaves", + "default:jungletree", + "default:dry_grass_1", + "default:acacia_bush_leaves", + "default:emergent_jungle_sapling", + "default:fern_2", + "default:blueberries", + "default:sand_with_kelp", + "default:blueberry_bush_leaves", + "default:pine_bush_sapling", + + "farming:cotton", + "farming:cotton_1", + "farming:cotton_2", + "farming:cotton_3", + "farming:cotton_4", + "farming:cotton_5", + "farming:cotton_6", + "farming:cotton_7", + "farming:cotton_8", + "farming:cotton_wild", + "farming:seed_cotton", + "farming:seed_wheat", + "farming:straw", + "farming:wheat", + "farming:wheat_1", + "farming:wheat_2", + "farming:wheat_3", + "farming:wheat_4", + "farming:wheat_5", + "farming:wheat_6", + "farming:wheat_7", + "farming:wheat_8", + + "flowers:chrysanthemum_green", + "flowers:dandelion_white", + "flowers:dandelion_yellow", + "flowers:geranium", + "flowers:mushroom_brown", + "flowers:mushroom_red", + "flowers:rose", + "flowers:tulip", + "flowers:tulip_black", + "flowers:viola", + "flowers:waterlily", + "flowers:waterlily_waving", +}) + +unified_inventory.add_category_items('tools', { + "default:sword_diamond", + "default:axe_diamond", + "default:shovel_diamond", + "default:axe_steel", + "default:shovel_mese", + "default:sword_wood", + "default:pick_bronze", + "default:axe_stone", + "default:sword_stone", + "default:pick_stone", + "default:shovel_stone", + "default:sword_mese", + "default:shovel_bronze", + "default:sword_bronze", + "default:axe_bronze", + "default:shovel_steel", + "default:sword_steel", + "default:axe_mese", + "default:shovel_wood", + "default:pick_mese", + "default:axe_wood", + "default:pick_diamond", + "default:pick_wood", + "default:pick_steel", + + "farming:hoe_bronze", + "farming:hoe_diamond", + "farming:hoe_mese", + "farming:hoe_steel", + "farming:hoe_stone", + "farming:hoe_wood", + + "fire:flint_and_steel", + "map:mapping_kit", + "screwdriver:screwdriver", + + "fireflies:bug_net", + "bucket:bucket_empty", + + "binoculars:binoculars", + "default:skeleton_key", +}) + +unified_inventory.add_category_items('minerals', { + "default:stone_with_copper", + "default:stone_with_gold", + "default:stone_with_iron", + "default:copper_ingot", + "default:copper_lump", + "default:gold_lump", + "default:diamondblock", + "default:stone_with_diamond", + "default:stone_with_mese", + "default:steel_ingot", + "default:gold_ingot", + "default:iron_lump", + "default:tinblock", + "default:tin_lump", + "default:stone_with_tin", + "default:mese_crystal", + "default:diamond", + "default:bronze_ingot", + "default:mese", + "default:mese_crystal_fragment", + "default:copperblock", + "default:stone_with_coal", + "default:steelblock", + "default:tin_ingot", + "default:coalblock", + "default:coal_lump", + "default:bronzeblock", + "default:goldblock", + + "stairs:slab_bronzeblock", + "stairs:slab_copperblock", + "stairs:slab_steelblock", + "stairs:slab_tinblock", + "stairs:stair_bronzeblock", + "stairs:stair_copperblock", + "stairs:stair_inner_bronzeblock", + "stairs:stair_inner_copperblock", + "stairs:stair_inner_steelblock", + "stairs:stair_inner_tinblock", + "stairs:stair_outer_bronzeblock", + "stairs:stair_outer_copperblock", + "stairs:stair_outer_steelblock", + "stairs:stair_outer_tinblock", + "stairs:stair_steelblock", + "stairs:stair_tinblock", +}) + +unified_inventory.add_category_items('building', { + "default:fence_rail_aspen_wood", + "default:fence_rail_acacia_wood", + "default:fence_junglewood", + "default:fence_rail_junglewood", + "default:fence_aspen_wood", + "default:fence_pine_wood", + "default:fence_rail_wood", + "default:fence_rail_pine_wood", + "default:fence_acacia_wood", + "default:junglewood", + "default:acacia_wood", + "default:aspen_wood", + "default:fence_wood", + "default:pine_wood", + "default:silver_sandstone", + "default:desert_sandstone", + "default:sandstone_block", + "default:desert_sandstone_brick", + "default:stone_block", + "default:stonebrick", + "default:obsidian_glass", + "default:desert_sandstone_block", + "default:silver_sandstone_brick", + "default:brick", + "default:obsidianbrick", + "default:sandstonebrick", + "default:sandstone", + "default:desert_stone_block", + "default:silver_sandstone_block", + "default:wood", + "default:obsidian_block", + "default:glass", + "default:clay_brick", + "default:desert_stonebrick", + "default:desert_cobble", + "default:cobble", + "default:mossycobble", + + "doors:door_glass", + "doors:door_glass_a", + "doors:door_glass_b", + "doors:door_glass_c", + "doors:door_glass_d", + "doors:door_obsidian_glass", + "doors:door_obsidian_glass_a", + "doors:door_obsidian_glass_b", + "doors:door_obsidian_glass_c", + "doors:door_obsidian_glass_d", + "doors:door_steel", + "doors:door_steel_a", + "doors:door_steel_b", + "doors:door_steel_c", + "doors:door_steel_d", + "doors:door_wood", + "doors:door_wood_a", + "doors:door_wood_b", + "doors:door_wood_c", + "doors:door_wood_d", + "doors:gate_acacia_wood_closed", + "doors:gate_acacia_wood_open", + "doors:gate_aspen_wood_closed", + "doors:gate_aspen_wood_open", + "doors:gate_junglewood_closed", + "doors:gate_junglewood_open", + "doors:gate_pine_wood_closed", + "doors:gate_pine_wood_open", + "doors:gate_wood_closed", + "doors:gate_wood_open", + "doors:hidden", + "doors:trapdoor", + "doors:trapdoor_open", + "doors:trapdoor_steel", + "doors:trapdoor_steel_open", + + "stairs:slab_bronzeblock", + "stairs:slab_copperblock", + "stairs:slab_steelblock", + "stairs:slab_tinblock", + "stairs:stair_bronzeblock", + "stairs:stair_copperblock", + "stairs:stair_inner_bronzeblock", + "stairs:stair_inner_copperblock", + "stairs:stair_inner_steelblock", + "stairs:stair_inner_tinblock", + "stairs:stair_outer_bronzeblock", + "stairs:stair_outer_copperblock", + "stairs:stair_outer_steelblock", + "stairs:stair_outer_tinblock", + "stairs:stair_steelblock", + "stairs:stair_tinblock", + + "stairs:slab_acacia_wood", + "stairs:slab_aspen_wood", + "stairs:slab_brick", + "stairs:slab_cobble", + "stairs:slab_desert_cobble", + "stairs:slab_desert_sandstone", + "stairs:slab_desert_sandstone_block", + "stairs:slab_desert_sandstone_brick", + "stairs:slab_desert_stone", + "stairs:slab_desert_stone_block", + "stairs:slab_desert_stonebrick", + "stairs:slab_glass", + "stairs:slab_goldblock", + "stairs:slab_ice", + "stairs:slab_junglewood", + "stairs:slab_mossycobble", + "stairs:slab_obsidian", + "stairs:slab_obsidian_block", + "stairs:slab_obsidian_glass", + "stairs:slab_obsidianbrick", + "stairs:slab_pine_wood", + "stairs:slab_sandstone", + "stairs:slab_sandstone_block", + "stairs:slab_sandstonebrick", + "stairs:slab_silver_sandstone", + "stairs:slab_silver_sandstone_block", + "stairs:slab_silver_sandstone_brick", + "stairs:slab_snowblock", + "stairs:slab_stone", + "stairs:slab_stone_block", + "stairs:slab_stonebrick", + "stairs:slab_straw", + "stairs:slab_wood", + "stairs:stair_acacia_wood", + "stairs:stair_aspen_wood", + "stairs:stair_brick", + "stairs:stair_cobble", + "stairs:stair_desert_cobble", + "stairs:stair_desert_sandstone", + "stairs:stair_desert_sandstone_block", + "stairs:stair_desert_sandstone_brick", + "stairs:stair_desert_stone", + "stairs:stair_desert_stone_block", + "stairs:stair_desert_stonebrick", + "stairs:stair_glass", + "stairs:stair_goldblock", + "stairs:stair_ice", + "stairs:stair_inner_acacia_wood", + "stairs:stair_inner_aspen_wood", + "stairs:stair_inner_brick", + "stairs:stair_inner_cobble", + "stairs:stair_inner_desert_cobble", + "stairs:stair_inner_desert_sandstone", + "stairs:stair_inner_desert_sandstone_block", + "stairs:stair_inner_desert_sandstone_brick", + "stairs:stair_inner_desert_stone", + "stairs:stair_inner_desert_stone_block", + "stairs:stair_inner_desert_stonebrick", + "stairs:stair_inner_glass", + "stairs:stair_inner_goldblock", + "stairs:stair_inner_ice", + "stairs:stair_inner_junglewood", + "stairs:stair_inner_mossycobble", + "stairs:stair_inner_obsidian", + "stairs:stair_inner_obsidian_block", + "stairs:stair_inner_obsidian_glass", + "stairs:stair_inner_obsidianbrick", + "stairs:stair_inner_pine_wood", + "stairs:stair_inner_sandstone", + "stairs:stair_inner_sandstone_block", + "stairs:stair_inner_sandstonebrick", + "stairs:stair_inner_silver_sandstone", + "stairs:stair_inner_silver_sandstone_block", + "stairs:stair_inner_silver_sandstone_brick", + "stairs:stair_inner_snowblock", + "stairs:stair_inner_stone", + "stairs:stair_inner_stone_block", + "stairs:stair_inner_stonebrick", + "stairs:stair_inner_straw", + "stairs:stair_inner_wood", + "stairs:stair_junglewood", + "stairs:stair_mossycobble", + "stairs:stair_obsidian", + "stairs:stair_obsidian_block", + "stairs:stair_obsidian_glass", + "stairs:stair_obsidianbrick", + "stairs:stair_outer_acacia_wood", + "stairs:stair_outer_aspen_wood", + "stairs:stair_outer_brick", + "stairs:stair_outer_cobble", + "stairs:stair_outer_desert_cobble", + "stairs:stair_outer_desert_sandstone", + "stairs:stair_outer_desert_sandstone_block", + "stairs:stair_outer_desert_sandstone_brick", + "stairs:stair_outer_desert_stone", + "stairs:stair_outer_desert_stone_block", + "stairs:stair_outer_desert_stonebrick", + "stairs:stair_outer_glass", + "stairs:stair_outer_goldblock", + "stairs:stair_outer_ice", + "stairs:stair_outer_junglewood", + "stairs:stair_outer_mossycobble", + "stairs:stair_outer_obsidian", + "stairs:stair_outer_obsidian_block", + "stairs:stair_outer_obsidian_glass", + "stairs:stair_outer_obsidianbrick", + "stairs:stair_outer_pine_wood", + "stairs:stair_outer_sandstone", + "stairs:stair_outer_sandstone_block", + "stairs:stair_outer_sandstonebrick", + "stairs:stair_outer_silver_sandstone", + "stairs:stair_outer_silver_sandstone_block", + "stairs:stair_outer_silver_sandstone_brick", + "stairs:stair_outer_snowblock", + "stairs:stair_outer_stone", + "stairs:stair_outer_stone_block", + "stairs:stair_outer_stonebrick", + "stairs:stair_outer_straw", + "stairs:stair_outer_wood", + "stairs:stair_pine_wood", + "stairs:stair_sandstone", + "stairs:stair_sandstone_block", + "stairs:stair_sandstonebrick", + "stairs:stair_silver_sandstone", + "stairs:stair_silver_sandstone_block", + "stairs:stair_silver_sandstone_brick", + "stairs:stair_snowblock", + "stairs:stair_stone", + "stairs:stair_stone_block", + "stairs:stair_stonebrick", + "stairs:stair_straw", + "stairs:stair_wood", + + "xpanes:bar", + "xpanes:bar_flat", + "xpanes:door_steel_bar", + "xpanes:door_steel_bar_a", + "xpanes:door_steel_bar_b", + "xpanes:door_steel_bar_c", + "xpanes:door_steel_bar_d", + "xpanes:obsidian_pane", + "xpanes:obsidian_pane_flat", + "xpanes:pane", + "xpanes:pane_flat", + "xpanes:trapdoor_steel_bar", + "xpanes:trapdoor_steel_bar_open", + + "walls:cobble", + "walls:desertcobble", + "walls:mossycobble", +}) + +unified_inventory.add_category_items('environment', { + "air", + "default:cave_ice", + "default:dirt_with_rainforest_litter", + "default:gravel", + "default:dry_dirt_with_dry_grass", + "default:permafrost", + "default:desert_stone", + "default:ice", + "default:dry_dirt", + "default:obsidian", + "default:sand", + "default:river_water_source", + "default:dirt_with_snow", + "default:dirt_with_grass", + "default:water_flowing", + "default:dirt", + "default:desert_sand", + "default:permafrost_with_moss", + "default:dirt_with_coniferous_litter", + "default:water_source", + "default:dirt_with_dry_grass", + "default:river_water_flowing", + "default:stone", + "default:snow", + "default:lava_flowing", + "default:lava_source", + "default:permafrost_with_stones", + "default:dirt_with_grass_footsteps", + "default:silver_sand", + "default:snowblock", + "default:clay", + + "farming:desert_sand_soil", + "farming:desert_sand_soil_wet", + "farming:dry_soil", + "farming:dry_soil_wet", + "farming:soil", + "farming:soil_wet", +}) + +unified_inventory.add_category_items('lighting', { + "default:mese_post_light_junglewood", + "default:torch_ceiling", + "default:meselamp", + "default:torch", + "default:mese_post_light_acacia_wood", + "default:mese_post_light", + "default:torch_wall", + "default:mese_post_light_pine_wood", + "default:mese_post_light_aspen_wood" +}) +--]] + + +--[[ UNCATEGORISED + + "farming:string", + + "beds:bed_bottom", + "beds:bed_top", + "beds:fancy_bed_bottom", + "beds:fancy_bed_top", + "boats:boat", + "bones:bones", + + "bucket:bucket_lava", + "bucket:bucket_river_water", + "bucket:bucket_water", + + "butterflies:butterfly_red", + "butterflies:butterfly_violet", + "butterflies:butterfly_white", + "butterflies:hidden_butterfly_red", + "butterflies:hidden_butterfly_violet", + "butterflies:hidden_butterfly_white", + + "carts:brakerail", + "carts:cart", + "carts:powerrail", + "carts:rail", + + "default:book", + "default:book_written", + "default:bookshelf", + "default:chest", + "default:chest_locked", + "default:chest_locked_open", + "default:chest_open", + "default:clay_lump", + "default:cloud", + "default:coral_brown", + "default:coral_cyan", + "default:coral_green", + "default:coral_orange", + "default:coral_pink", + "default:coral_skeleton", + "default:flint", + "default:furnace", + "default:furnace_active", + "default:key", + "default:ladder_steel", + "default:ladder_wood", + "default:obsidian_shard", + "default:paper", + "default:sign_wall_steel", + "default:sign_wall_wood", + "default:stick", + + "fire:basic_flame", + "fire:permanent_flame", + "fireflies:firefly", + "fireflies:firefly_bottle", + "fireflies:hidden_firefly", + + "ignore", + "unknown", + + "tnt:boom", + "tnt:gunpowder", + "tnt:gunpowder_burning", + "tnt:tnt", + "tnt:tnt_burning", + "tnt:tnt_stick", + + "vessels:drinking_glass", + "vessels:glass_bottle", + "vessels:glass_fragments", + "vessels:shelf", + "vessels:steel_bottle", + + "dye:black", + "dye:blue", + "dye:brown", + "dye:cyan", + "dye:dark_green", + "dye:dark_grey", + "dye:green", + "dye:grey", + "dye:magenta", + "dye:orange", + "dye:pink", + "dye:red", + "dye:violet", + "dye:white", + "dye:yellow", + + "wool:black", + "wool:blue", + "wool:brown", + "wool:cyan", + "wool:dark_green", + "wool:dark_grey", + "wool:green", + "wool:grey", + "wool:magenta", + "wool:orange", + "wool:pink", + "wool:red", + "wool:violet", + "wool:white", + "wool:yellow", + + "unified_inventory:bag_large", + "unified_inventory:bag_medium", + "unified_inventory:bag_small", +--]] + +--[[ LIST UNCATEGORIZED AFTER LOAD +minetest.register_on_mods_loaded(function() + minetest.after(1, function ( ) + local l = {} + for name,_ in pairs(minetest.registered_items) do + if not unified_inventory.find_category(name) then + -- minetest.log("error", minetest.serialize(minetest.registered_items[name])) + table.insert(l, name) + end + end + table.sort(l) + minetest.log(table.concat(l, '",'.."\n"..'"')) + end) +end) +--]] \ No newline at end of file diff --git a/depends.txt b/depends.txt deleted file mode 100644 index 20eb8b0..0000000 --- a/depends.txt +++ /dev/null @@ -1,6 +0,0 @@ -default -creative? -sfinv? -intllib? -datastorage? -farming? diff --git a/description.txt b/description.txt deleted file mode 100644 index b541fdf..0000000 --- a/description.txt +++ /dev/null @@ -1 +0,0 @@ -Unified Inventory replaces the default survival and creative inventory. It adds a nicer interface and a number of features, such as a crafting guide. diff --git a/doc/mod_api.txt b/doc/mod_api.txt new file mode 100644 index 0000000..ff52792 --- /dev/null +++ b/doc/mod_api.txt @@ -0,0 +1,172 @@ +unified_inventory API +===================== + +This file provides information about the API of unified_inventory. + +API revisions within unified_inventory can be checked using: + + (unified_inventory.version or 1) + +**Revision history** + +* Version `1`: Classic formspec layout (no real_coordinates) +* Version `2`: Force formspec version 4 (includes real_coordinates) + +Misc functions +-------------- +Grouped by use-case, afterwards sorted alphabetically. + +* `unified_inventory.is_creative(name)` + * Checks whether creative is enabled or the player has `creative` + + +Pages +----- + +Register a new page: The callback inside this function is called on user input. + + unified_inventory.register_page("pagename", { + get_formspec = function(player) + -- ^ `player` is an `ObjectRef` + -- Compute the formspec string here + return { + formspec = "button[2,2;2,1;mybutton;Press me]", + -- ^ Final form of the formspec to display + draw_inventory = false, -- default `true` + -- ^ Optional. Hides the player's `main` inventory list + draw_item_list = false, -- default `true` + -- ^ Optional. Hides the item list on the right side + formspec_prepend = false, -- default `false` + -- ^ Optional. When `false`: Disables the formspec prepend + } + end, + }) + + +Buttons +------- + +Register a new button for the bottom row: + + unified_inventory.register_button("skins", { + type = "image", + image = "skins_skin_button.png", + tooltip = "Skins", + hide_lite = true + -- ^ Button is hidden when following two conditions are met: + -- Configuration line `unified_inventory_lite = true` + -- Player does not have the privilege `ui_full` + }) + + + +Crafting +-------- + +The code blocks below document each possible parameter using exemplary values. + +Provide information to display custom craft types: + + unified_inventory.register_craft_type("mytype", { + -- ^ Unique identifier for `register_craft` + description = "Sample Craft", + -- ^ Text shown below the crafting arrow + icon = "dummy.png", + -- ^ Image shown above the crafting arrow + width = 3, + height = 3, + -- ^ Maximal input dimensions of the recipes + dynamic_display_size = function(craft) + -- ^ `craft` is the definition from `register_craft` + return { + width = 2, + height = 3 + } + end, + -- ^ Optional callback to change the displayed recipe size + uses_crafting_grid = true, + }) + +Register a non-standard craft recipe: + + unified_inventory.register_craft({ + output = "default:foobar", + type = "mytype", + -- ^ Standard craft type or custom (see `register_craft_type`) + items = { + { "default:foo" }, + { "default:bar" } + }, + width = 3, + -- ^ Same as `minetest.register_recipe` + }) + + +Categories +---------- + +Register a new category: + The config table (second argument) is optional, and all its members are optional + See the unified_inventory.set_category_* functions for more details on the members of the config table + + unified_inventory.register_category("category_name", { + symbol = "mod_name:item_name" or "texture.png", + label = "Human Readable Label", + index = 5, + items = { + "mod_name:item_name", + "another_mod:different_item" + } + }) + +Add / override the symbol for a category: + The category does not need to exist first + The symbol can be an item name or a texture image + If unset this will default to "default:stick" + + unified_inventory.set_category_symbol("category_name", "mod_name:item_name" or "texture.png") + +Add / override the human readable label for a category: + If unset this will default to the category name + + unified_inventory.set_category_label("category_name", "Human Readable Label") + +Add / override the sorting index of the category: + Must be a number, can also be negative (-5) or fractional (2.345) + This determines the position the category appears in the list of categories + The "all" meta-category has index -2, the "misc"/"uncategorized" meta-category has index -1, use a negative number smaller than these to make a category appear before these in the list + By default categories are sorted alphabetically with an index between 0.0101(AA) and 0.2626(ZZ) + + unified_inventory.set_category_index("category_name", 5) + +Add a single item to a category: + + unified_inventory.add_category_item("category_name", "mod_name:item_name") + +Add multiple items to a category: + + unified_inventory.add_category_items("category_name", { + "mod_name:item_name", + "another_mod:different_item" + }) + +Remove an item from a category: + + unified_inventory.remove_category_item("category_name", "mod_name:item_name") + +Remove a category entirely: + + unified_inventory.remove_category("category_name") + +Finding existing items in categories: + This will find the first category an item exists in + It should be used for checking if an item is catgorised + Returns "category_name" or nil + + unified_inventory.find_category("mod_name:item_name") + + + This will find all the categories an item exists in + Returns a number indexed table (list) of category names + + unified_inventory.find_categories("mod_name:item_name") diff --git a/group.lua b/group.lua index 23e2587..3864267 100644 --- a/group.lua +++ b/group.lua @@ -1,20 +1,22 @@ -local S = unified_inventory.gettext +local S = minetest.get_translator("unified_inventory") function unified_inventory.canonical_item_spec_matcher(spec) local specname = ItemStack(spec):get_name() - if specname:sub(1, 6) == "group:" then - local group_names = specname:sub(7):split(",") + if specname:sub(1, 6) ~= "group:" then return function (itemname) - local itemdef = minetest.registered_items[itemname] - for _, group_name in ipairs(group_names) do - if (itemdef.groups[group_name] or 0) == 0 then - return false - end + return itemname == specname + end + end + + local group_names = specname:sub(7):split(",") + return function (itemname) + local itemdef = minetest.registered_items[itemname] + for _, group_name in ipairs(group_names) do + if (itemdef.groups[group_name] or 0) == 0 then + return false end - return true end - else - return function (itemname) return itemname == specname end + return true end end @@ -25,23 +27,11 @@ function unified_inventory.extract_groupnames(groupname) local specname = ItemStack(groupname):get_name() - if specname:sub(1, 6) == "group:" then - local group_names = specname:sub(7):split(",") - if #group_names == 1 then - return group_names[1], 1 - end - local s = "" - for g=1,#group_names do - if g > 1 then - -- List connector - s = s .. S(" and ") - end - s = s .. group_names[g] - end - return s, #group_names - else + if specname:sub(1, 6) ~= "group:" then return nil, 0 end + local group_names = specname:sub(7):split(",") + return table.concat(group_names, S(" and ")), #group_names end unified_inventory.registered_group_items = { diff --git a/init.lua b/init.lua index 1c73fad..5375903 100644 --- a/init.lua +++ b/init.lua @@ -1,10 +1,7 @@ --- Unified Inventory for Minetest >= 0.4.16 +-- Unified Inventory local modpath = minetest.get_modpath(minetest.get_current_modname()) local worldpath = minetest.get_worldpath() - --- Intllib -local S, NS = dofile(modpath .. "/intllib.lua") -- Data tables definitions unified_inventory = { @@ -13,6 +10,8 @@ alternate = {}, current_page = {}, current_searchbox = {}, + current_category = {}, + current_category_scroll = {}, current_index = {}, current_item = {}, current_craft_direction = {}, @@ -33,25 +32,113 @@ -- Default inventory page default = "craft", - -- intllib - gettext = S, - -- "Lite" mode lite_mode = minetest.settings:get_bool("unified_inventory_lite"), + -- Items automatically added to categories based on item definitions + automatic_categorization = (minetest.settings:get_bool("unified_inventory_automatic_categorization") ~= false), + -- Trash enabled trash_enabled = (minetest.settings:get_bool("unified_inventory_trash") ~= false), + imgscale = 1.25, + list_img_offset = 0.13, + standard_background = "background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]", + version = 3 +} + +local ui = unified_inventory + +-- These tables establish position and layout for the two UI styles. +-- UI doesn't use formspec_[xy] anymore, but other mods may need them. + +ui.style_full = { + formspec_x = 1, + formspec_y = 1, + formw = 17.75, + formh = 12.25, pagecols = 8, - pagerows = 10, - page_y = 0, - formspec_y = 1, - main_button_x = 0, - main_button_y = 9, - craft_result_x = 0.3, - craft_result_y = 0.5, - form_header_y = 0 + pagerows = 9, + page_x = 10.75, + page_y = 2.30, + craft_x = 2.8, + craft_y = 1.15, + craftresult_x = 7.8, + craft_arrow_x = 6.55, + craft_guide_x = 3.3, + craft_guide_y = 1.15, + craft_guide_arrow_x = 7.05, + craft_guide_result_x = 8.3, + craft_guide_resultstr_x = 0.3, + craft_guide_resultstr_y = 0.6, + give_btn_x = 0.25, + main_button_x = 0.4, + main_button_y = 11.0, + page_buttons_x = 11.60, + page_buttons_y = 10.15, + searchwidth = 3.4, + form_header_x = 0.4, + form_header_y = 0.4, + btn_spc = 0.85, + btn_size = 0.75, + std_inv_x = 0.3, + std_inv_y = 5.75, } + +ui.style_lite = { + formspec_x = 0.6, + formspec_y = 0.6, + formw = 14, + formh = 9.75, + pagecols = 4, + pagerows = 5, + page_x = 10.5, + page_y = 2.15, + craft_x = 2.6, + craft_y = 0.75, + craftresult_x = 5.75, + craft_arrow_x = 6.35, + craft_guide_x = 3.1, + craft_guide_y = 0.75, + craft_guide_arrow_x = 7.05, + craft_guide_result_x = 8.3, + craft_guide_resultstr_x = 0.15, + craft_guide_resultstr_y = 0.35, + give_btn_x = 0.15, + main_button_x = 10.5, + main_button_y = 8.15, + page_buttons_x = 10.5, + page_buttons_y = 6.15, + searchwidth = 1.6, + form_header_x = 0.2, + form_header_y = 0.2, + btn_spc = 0.8, + btn_size = 0.7, + std_inv_x = 0.1, + std_inv_y = 4.6, +} + +dofile(modpath.."/api.lua") + +for _, style in ipairs({ui.style_full, ui.style_lite}) do + style.items_per_page = style.pagecols * style.pagerows + style.standard_inv = string.format("list[current_player;main;%f,%f;8,4;]", + style.std_inv_x + ui.list_img_offset, style.std_inv_y + ui.list_img_offset) + + style.standard_inv_bg = ui.make_inv_img_grid(style.std_inv_x, style.std_inv_y, 8, 1, true).. + ui.make_inv_img_grid(style.std_inv_x, style.std_inv_y + ui.imgscale, 8, 3) + + style.craft_grid = table.concat({ + ui.make_inv_img_grid(style.craft_x, style.craft_y, 3, 3), + ui.single_slot(style.craft_x + ui.imgscale*4, style.craft_y), -- the craft result slot + string.format("image[%f,%f;%f,%f;ui_crafting_arrow.png]", + style.craft_arrow_x, style.craft_y, ui.imgscale, ui.imgscale), + string.format("list[current_player;craft;%f,%f;3,3;]", + style.craft_x + ui.list_img_offset, style.craft_y + ui.list_img_offset), + string.format("list[current_player;craftpreview;%f,%f;1,1;]", + style.craftresult_x + ui.list_img_offset, style.craft_y + ui.list_img_offset) + }) +end -- Disable default creative inventory local creative = rawget(_G, "creative") or rawget(_G, "creative_inventory") @@ -68,9 +155,11 @@ end dofile(modpath.."/group.lua") -dofile(modpath.."/api.lua") +dofile(modpath.."/category.lua") +dofile(modpath.."/default-categories.lua") dofile(modpath.."/internal.lua") dofile(modpath.."/callbacks.lua") +dofile(modpath.."/match_craft.lua") dofile(modpath.."/register.lua") if minetest.settings:get_bool("unified_inventory_bags") ~= false then @@ -78,7 +167,4 @@ end dofile(modpath.."/item_names.lua") - -if minetest.get_modpath("datastorage") then - dofile(modpath.."/waypoints.lua") -end +dofile(modpath.."/waypoints.lua") diff --git a/internal.lua b/internal.lua index 06967d2..f83f96b 100644 --- a/internal.lua +++ b/internal.lua @@ -1,5 +1,6 @@ -local S = unified_inventory.gettext +local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape +local ui = unified_inventory -- This pair of encoding functions is used where variable text must go in -- button names, where the text might contain formspec metacharacters. @@ -9,263 +10,311 @@ -- This is a game engine bug, and in the anticipation that it might be -- fixed some day we don't want to rely on it. So for safety we apply -- an encoding that avoids all formspec metacharacters. -function unified_inventory.mangle_for_formspec(str) + +function ui.mangle_for_formspec(str) return string.gsub(str, "([^A-Za-z0-9])", function (c) return string.format("_%d_", string.byte(c)) end) end -function unified_inventory.demangle_for_formspec(str) +function ui.demangle_for_formspec(str) return string.gsub(str, "_([0-9]+)_", function (v) return string.char(v) end) end -function unified_inventory.get_per_player_formspec(player_name) - local lite = unified_inventory.lite_mode and not minetest.check_player_privs(player_name, {ui_full=true}) - - local ui = {} - ui.pagecols = unified_inventory.pagecols - ui.pagerows = unified_inventory.pagerows - ui.page_y = unified_inventory.page_y - ui.formspec_y = unified_inventory.formspec_y - ui.main_button_x = unified_inventory.main_button_x - ui.main_button_y = unified_inventory.main_button_y - ui.craft_result_x = unified_inventory.craft_result_x - ui.craft_result_y = unified_inventory.craft_result_y - ui.form_header_y = unified_inventory.form_header_y - - if lite then - ui.pagecols = 4 - ui.pagerows = 6 - ui.page_y = 0.25 - ui.formspec_y = 0.47 - ui.main_button_x = 8.2 - ui.main_button_y = 6.5 - ui.craft_result_x = 2.8 - ui.craft_result_y = 3.4 - ui.form_header_y = -0.1 - end - - ui.items_per_page = ui.pagecols * ui.pagerows - return ui, lite -end - -function unified_inventory.get_formspec(player, page) + +function ui.get_per_player_formspec(player_name) + local draw_lite_mode = ui.lite_mode and not minetest.check_player_privs(player_name, {ui_full=true}) + + local style = table.copy(draw_lite_mode and ui.style_lite or ui.style_full) + style.is_lite_mode = draw_lite_mode + return style +end + +local function formspec_button(ui_peruser, name, image, offset, pos, scale, label) + local element = 'image_button' + if minetest.registered_items[image] then + element = 'item_image_button' + elseif image:find(":", 1, true) then + image = "unknown_item.png" + end + local spc = (1-scale)*ui_peruser.btn_size/2 + local size = ui_peruser.btn_size*scale + return string.format("%s[%f,%f;%f,%f;%s;%s;]", element, + (offset.x or offset[1]) + ( ui_peruser.btn_spc * (pos.x or pos[1]) ) + spc, + (offset.y or offset[2]) + ( ui_peruser.btn_spc * (pos.y or pos[2]) ) + spc, + size, size, image, name) .. + string.format("tooltip[%s;%s]", name, F(label or name)) +end + +local function formspec_add_filters(player, formspec, style) + local button_row = 0 + local button_col = 0 + local n = #formspec + 1 + + -- Main buttons + + local filtered_inv_buttons = {} + + for i, def in pairs(ui.buttons) do + if not (style.is_lite_mode and def.hide_lite) then + table.insert(filtered_inv_buttons, def) + end + end + + for i, def in pairs(filtered_inv_buttons) do + if style.is_lite_mode and i > 4 then + button_row = 1 + button_col = 1 + end + + if def.type == "image" then + local pos_x = style.main_button_x + style.btn_spc * (i - 1) - button_col * style.btn_spc * 4 + local pos_y = style.main_button_y + button_row * style.btn_spc + if (def.condition == nil or def.condition(player) == true) then + formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s;]", + pos_x, pos_y, style.btn_size, style.btn_size, + F(def.image), + F(def.name)) + formspec[n+1] = "tooltip["..F(def.name)..";"..(def.tooltip or "").."]" + n = n+2 + else + formspec[n] = string.format("image[%f,%f;%f,%f;%s^[colorize:#808080:alpha]", + pos_x, pos_y, style.btn_size, style.btn_size, + def.image) + n = n+1 + end + end + end +end + +local function formspec_add_categories(player, formspec, ui_peruser) + local player_name = player:get_player_name() + local n = #formspec + 1 + + local categories_pos = { + ui_peruser.page_x, + ui_peruser.page_y-ui_peruser.btn_spc-0.5 + } + local categories_scroll_pos = { + ui_peruser.page_x, + ui_peruser.form_header_y - (ui_peruser.is_lite_mode and 0 or 0.2) + } + + formspec[n] = string.format("background9[%f,%f;%f,%f;%s;false;3]", + ui_peruser.page_x-0.1, categories_scroll_pos[2], + (ui_peruser.btn_spc * ui_peruser.pagecols) + 0.13, 1.4 + (ui_peruser.is_lite_mode and 0 or 0.2), + "ui_smallbg_9_sliced.png") + n = n + 1 + + formspec[n] = string.format("label[%f,%f;%s]", + ui_peruser.page_x, + ui_peruser.form_header_y + (ui_peruser.is_lite_mode and 0.3 or 0.2), F(S("Category:"))) + n = n + 1 + + local scroll_offset = 0 + local category_count = #ui.category_list + if category_count > ui_peruser.pagecols then + scroll_offset = ui.current_category_scroll[player_name] + end + + for index, category in ipairs(ui.category_list) do + local column = index - scroll_offset + if column > 0 and column <= ui_peruser.pagecols then + local scale = 0.8 + if ui.current_category[player_name] == category.name then + scale = 1 + end + formspec[n] = formspec_button(ui_peruser, "category_"..category.name, category.symbol, categories_pos, {column-1, 0}, scale, category.label) + n = n + 1 + end + end + if category_count > ui_peruser.pagecols and scroll_offset > 0 then + -- prev + formspec[n] = formspec_button(ui_peruser, "prev_category", "ui_left_icon.png", categories_scroll_pos, {ui_peruser.pagecols - 2, 0}, 0.8, S("Scroll categories left")) + n = n + 1 + end + if category_count > ui_peruser.pagecols and category_count - scroll_offset > ui_peruser.pagecols then + -- next + formspec[n] = formspec_button(ui_peruser, "next_category", "ui_right_icon.png", categories_scroll_pos, {ui_peruser.pagecols - 1, 0}, 0.8, S("Scroll categories right")) + end +end + +local function formspec_add_search_box(player, formspec, ui_peruser) + local player_name = player:get_player_name() + local n = #formspec + 1 + + formspec[n] = "field_close_on_enter[searchbox;false]" + + formspec[n+1] = string.format("field[%f,%f;%f,%f;searchbox;;%s]", + ui_peruser.page_buttons_x, ui_peruser.page_buttons_y, + ui_peruser.searchwidth - 0.1, ui_peruser.btn_size, + F(ui.current_searchbox[player_name])) + formspec[n+2] = string.format("image_button[%f,%f;%f,%f;ui_search_icon.png;searchbutton;]", + ui_peruser.page_buttons_x + ui_peruser.searchwidth, ui_peruser.page_buttons_y, + ui_peruser.btn_size,ui_peruser.btn_size) + formspec[n+3] = "tooltip[searchbutton;" ..F(S("Search")) .. "]" + formspec[n+4] = string.format("image_button[%f,%f;%f,%f;ui_reset_icon.png;searchresetbutton;]", + ui_peruser.page_buttons_x + ui_peruser.searchwidth + ui_peruser.btn_spc, + ui_peruser.page_buttons_y, + ui_peruser.btn_size, ui_peruser.btn_size) + formspec[n+5] = "tooltip[searchresetbutton;"..F(S("Reset search and display everything")).."]" + + if ui.activefilter[player_name] ~= "" then + formspec[n+6] = string.format("label[%f,%f;%s: %s]", + ui_peruser.page_x, ui_peruser.page_y - 0.25, + F(S("Filter")), F(ui.activefilter[player_name])) + end +end + +local function formspec_add_item_browser(player, formspec, ui_peruser) + local player_name = player:get_player_name() + local n = #formspec + 1 + + -- Controls to flip items pages + + local btnlist = { + { "ui_skip_backward_icon.png", "start_list", S("First page") }, + { "ui_doubleleft_icon.png", "rewind3", S("Back three pages") }, + { "ui_left_icon.png", "rewind1", S("Back one page") }, + { "ui_right_icon.png", "forward1", S("Forward one page") }, + { "ui_doubleright_icon.png", "forward3", S("Forward three pages") }, + { "ui_skip_forward_icon.png", "end_list", S("Last page") }, + } + + if ui_peruser.is_lite_mode then + btnlist[2] = nil + btnlist[5] = nil + end + + local bn = 0 + for _, b in pairs(btnlist) do + formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s;]", + ui_peruser.page_buttons_x + ui_peruser.btn_spc*bn, + ui_peruser.page_buttons_y + ui_peruser.btn_spc, + ui_peruser.btn_size, ui_peruser.btn_size, + b[1],b[2]) + formspec[n+1] = "tooltip["..b[2]..";"..F(b[3]).."]" + bn = bn + 1 + n = n + 2 + end + + -- Items list + if #ui.filtered_items_list[player_name] == 0 then + local no_matches = S("No matching items") + if ui_peruser.is_lite_mode then + no_matches = S("No matches.") + end + + formspec[n] = "label["..ui_peruser.page_x..","..(ui_peruser.page_y+0.15)..";" .. F(no_matches) .. "]" + return + end + + local dir = ui.active_search_direction[player_name] + local list_index = ui.current_index[player_name] + local page2 = math.floor(list_index / (ui_peruser.items_per_page) + 1) + local pagemax = math.floor( + (#ui.filtered_items_list[player_name] - 1) + / (ui_peruser.items_per_page) + 1) + for y = 0, ui_peruser.pagerows - 1 do + for x = 0, ui_peruser.pagecols - 1 do + local name = ui.filtered_items_list[player_name][list_index] + local item = minetest.registered_items[name] + if item then + -- Clicked on current item: Flip crafting direction + if name == ui.current_item[player_name] then + local cdir = ui.current_craft_direction[player_name] + if cdir == "recipe" then + dir = "usage" + elseif cdir == "usage" then + dir = "recipe" + end + else + -- Default: use active search direction by default + dir = ui.active_search_direction[player_name] + end + + local button_name = "item_button_" .. dir .. "_" + .. ui.mangle_for_formspec(name) + formspec[n] = ("item_image_button[%f,%f;%f,%f;%s;%s;]"):format( + ui_peruser.page_x + x * ui_peruser.btn_spc, + ui_peruser.page_y + y * ui_peruser.btn_spc, + ui_peruser.btn_size, ui_peruser.btn_size, + name, button_name + ) + formspec[n + 1] = ("tooltip[%s;%s \\[%s\\]]"):format( + button_name, minetest.formspec_escape(item.description), + item.mod_origin or "??" + ) + n = n + 2 + list_index = list_index + 1 + end + end + end + formspec[n] = string.format("label[%f,%f;%s: %s]", + ui_peruser.page_buttons_x + ui_peruser.btn_spc * (ui_peruser.is_lite_mode and 1 or 2), + ui_peruser.page_buttons_y + 0.1 + ui_peruser.btn_spc * 2, + F(S("Page")), S("@1 of @2",page2,pagemax)) +end + +function ui.get_formspec(player, page) if not player then return "" end local player_name = player:get_player_name() - local ui_peruser,draw_lite_mode = unified_inventory.get_per_player_formspec(player_name) - - unified_inventory.current_page[player_name] = page - local pagedef = unified_inventory.pages[page] - - local formspec = { - "size[14,10]", - "background[-0.19,-0.25;14.4,10.75;ui_form_bg.png]" -- Background + local ui_peruser = ui.get_per_player_formspec(player_name) + + ui.current_page[player_name] = page + local pagedef = ui.pages[page] + + if not pagedef then + return "" -- Invalid page name + end + + local fs = { + "formspec_version[4]", + "size["..ui_peruser.formw..","..ui_peruser.formh.."]", + pagedef.formspec_prepend and "" or "no_prepend[]", + ui.standard_background } - local n = 3 - - if draw_lite_mode then - formspec[1] = "size[11,7.7]" - formspec[2] = "background[-0.19,-0.2;11.4,8.4;ui_form_bg.png]" - end - - if unified_inventory.is_creative(player_name) - and page == "craft" then - formspec[n] = "background[0,"..(ui_peruser.formspec_y + 2)..";1,1;ui_single_slot.png]" - n = n+1 - end - - -- Current page - if not unified_inventory.pages[page] then - return "" -- Invalid page name - end - - local perplayer_formspec = unified_inventory.get_per_player_formspec(player_name) + + local perplayer_formspec = ui.get_per_player_formspec(player_name) local fsdata = pagedef.get_formspec(player, perplayer_formspec) - formspec[n] = fsdata.formspec - n = n+1 - - local button_row = 0 - local button_col = 0 - - -- Main buttons - - local filtered_inv_buttons = {} - - for i, def in pairs(unified_inventory.buttons) do - if not (draw_lite_mode and def.hide_lite) then - table.insert(filtered_inv_buttons, def) - end - end - - for i, def in pairs(filtered_inv_buttons) do - - if draw_lite_mode and i > 4 then - button_row = 1 - button_col = 1 - end - - if def.type == "image" then - if (def.condition == nil or def.condition(player) == true) then - formspec[n] = "image_button[" - formspec[n+1] = ( ui_peruser.main_button_x + 0.65 * (i - 1) - button_col * 0.65 * 4) - formspec[n+2] = ","..(ui_peruser.main_button_y + button_row * 0.7)..";0.8,0.8;" - formspec[n+3] = F(def.image)..";" - formspec[n+4] = F(def.name)..";]" - formspec[n+5] = "tooltip["..F(def.name) - formspec[n+6] = ";"..(def.tooltip or "").."]" - n = n+7 - else - formspec[n] = "image[" - formspec[n+1] = ( ui_peruser.main_button_x + 0.65 * (i - 1) - button_col * 0.65 * 4) - formspec[n+2] = ","..(ui_peruser.main_button_y + button_row * 0.7)..";0.8,0.8;" - formspec[n+3] = F(def.image).."^[colorize:#808080:alpha]" - n = n+4 - - end - end - end + fs[#fs + 1] = fsdata.formspec + + formspec_add_filters(player, fs, ui_peruser) if fsdata.draw_inventory ~= false then -- Player inventory - formspec[n] = "listcolors[#00000000;#00000000]" - formspec[n+1] = "list[current_player;main;0,"..(ui_peruser.formspec_y + 3.5)..";8,4;]" - n = n+2 + fs[#fs + 1] = "listcolors[#00000000;#00000000]" + fs[#fs + 1] = ui_peruser.standard_inv end if fsdata.draw_item_list == false then - return table.concat(formspec, "") - end - - -- Controls to flip items pages - local start_x = 9.2 - - if not draw_lite_mode then - formspec[n] = - "image_button[" .. (start_x + 0.6 * 0) - .. ",9;.8,.8;ui_skip_backward_icon.png;start_list;]" - .. "tooltip[start_list;" .. F(S("First page")) .. "]" - - .. "image_button[" .. (start_x + 0.6 * 1) - .. ",9;.8,.8;ui_doubleleft_icon.png;rewind3;]" - .. "tooltip[rewind3;" .. F(S("Back three pages")) .. "]" - .. "image_button[" .. (start_x + 0.6 * 2) - .. ",9;.8,.8;ui_left_icon.png;rewind1;]" - .. "tooltip[rewind1;" .. F(S("Back one page")) .. "]" - - .. "image_button[" .. (start_x + 0.6 * 3) - .. ",9;.8,.8;ui_right_icon.png;forward1;]" - .. "tooltip[forward1;" .. F(S("Forward one page")) .. "]" - .. "image_button[" .. (start_x + 0.6 * 4) - .. ",9;.8,.8;ui_doubleright_icon.png;forward3;]" - .. "tooltip[forward3;" .. F(S("Forward three pages")) .. "]" - - .. "image_button[" .. (start_x + 0.6 * 5) - .. ",9;.8,.8;ui_skip_forward_icon.png;end_list;]" - .. "tooltip[end_list;" .. F(S("Last page")) .. "]" - else - formspec[n] = - "image_button[" .. (8.2 + 0.65 * 0) - .. ",5.8;.8,.8;ui_skip_backward_icon.png;start_list;]" - .. "tooltip[start_list;" .. F(S("First page")) .. "]" - .. "image_button[" .. (8.2 + 0.65 * 1) - .. ",5.8;.8,.8;ui_left_icon.png;rewind1;]" - .. "tooltip[rewind1;" .. F(S("Back one page")) .. "]" - .. "image_button[" .. (8.2 + 0.65 * 2) - .. ",5.8;.8,.8;ui_right_icon.png;forward1;]" - .. "tooltip[forward1;" .. F(S("Forward one page")) .. "]" - .. "image_button[" .. (8.2 + 0.65 * 3) - .. ",5.8;.8,.8;ui_skip_forward_icon.png;end_list;]" - .. "tooltip[end_list;" .. F(S("Last page")) .. "]" - end - n = n+1 - - -- Search box - formspec[n] = "field_close_on_enter[searchbox;false]" - n = n+1 - - if not draw_lite_mode then - formspec[n] = "field[9.5,8.325;3,1;searchbox;;" - .. F(unified_inventory.current_searchbox[player_name]) .. "]" - formspec[n+1] = "image_button[12.2,8.1;.8,.8;ui_search_icon.png;searchbutton;]" - .. "tooltip[searchbutton;" ..F(S("Search")) .. "]" - formspec[n+2] = "image_button[12.9,8.1;.8,.8;ui_reset_icon.png;searchresetbutton;]" - .. "tooltip[searchbutton;" ..F(S("Search")) .. "]" - .. "tooltip[searchresetbutton;" ..F(S("Reset search and display everything")) .. "]" - else - formspec[n] = "field[8.5,5.225;2.2,1;searchbox;;" - .. F(unified_inventory.current_searchbox[player_name]) .. "]" - formspec[n+1] = "image_button[10.3,5;.8,.8;ui_search_icon.png;searchbutton;]" - .. "tooltip[searchbutton;" ..F(S("Search")) .. "]" - formspec[n+2] = "image_button[11,5;.8,.8;ui_reset_icon.png;searchresetbutton;]" - .. "tooltip[searchbutton;" ..F(S("Search")) .. "]" - .. "tooltip[searchresetbutton;" ..F(S("Reset search and display everything")) .. "]" - end - n = n+3 - - local no_matches = S("No matching items") - if draw_lite_mode then - no_matches = S("No matches.") - end - - -- Items list - if #unified_inventory.filtered_items_list[player_name] == 0 then - formspec[n] = "label[8.2,"..ui_peruser.form_header_y..";" .. F(no_matches) .. "]" - else - local dir = unified_inventory.active_search_direction[player_name] - local list_index = unified_inventory.current_index[player_name] - local page = math.floor(list_index / (ui_peruser.items_per_page) + 1) - local pagemax = math.floor( - (#unified_inventory.filtered_items_list[player_name] - 1) - / (ui_peruser.items_per_page) + 1) - local item = {} - for y = 0, ui_peruser.pagerows - 1 do - for x = 0, ui_peruser.pagecols - 1 do - local name = unified_inventory.filtered_items_list[player_name][list_index] - if minetest.registered_items[name] then - -- Clicked on current item: Flip crafting direction - if name == unified_inventory.current_item[player_name] then - local cdir = unified_inventory.current_craft_direction[player_name] - if cdir == "recipe" then - dir = "usage" - elseif cdir == "usage" then - dir = "recipe" - end - else - -- Default: use active search direction by default - dir = unified_inventory.active_search_direction[player_name] - end - formspec[n] = "item_image_button[" - ..(8.2 + x * 0.7).."," - ..(ui_peruser.formspec_y + ui_peruser.page_y + y * 0.7)..";.81,.81;" - ..name..";item_button_"..dir.."_" - ..unified_inventory.mangle_for_formspec(name)..";]" - n = n+1 - list_index = list_index + 1 - end - end - end - formspec[n] = "label[8.2,"..ui_peruser.form_header_y..";"..F(S("Page")) .. ": " - .. S("%s of %s"):format(page,pagemax).."]" - end - n= n+1 - - if unified_inventory.activefilter[player_name] ~= "" then - formspec[n] = "label[8.2,"..(ui_peruser.form_header_y + 0.4)..";" .. F(S("Filter")) .. ":]" - formspec[n+1] = "label[9.1,"..(ui_peruser.form_header_y + 0.4)..";"..F(unified_inventory.activefilter[player_name]).."]" - end - return table.concat(formspec, "") -end - -function unified_inventory.set_inventory_formspec(player, page) + return table.concat(fs, "") + end + + formspec_add_categories(player, fs, ui_peruser) + formspec_add_search_box(player, fs, ui_peruser) + formspec_add_item_browser(player, fs, ui_peruser) + + return table.concat(fs) +end + +function ui.set_inventory_formspec(player, page) if player then - player:set_inventory_formspec(unified_inventory.get_formspec(player, page)) - end + player:set_inventory_formspec(ui.get_formspec(player, page)) + end +end + +local function valid_def(def) + return (not def.groups.not_in_creative_inventory + or def.groups.not_in_creative_inventory == 0) + and def.description + and def.description ~= "" end --apply filter to the inventory list (create filtered copy of full one) -function unified_inventory.apply_filter(player, filter, search_dir) +function ui.apply_filter(player, filter, search_dir) if not player then return false end @@ -284,86 +333,48 @@ return true end else + local lang = minetest.get_player_information(player_name).lang_code ffilter = function(name, def) local lname = string.lower(name) local ldesc = string.lower(def.description) + local llocaldesc = minetest.get_translated_string + and string.lower(minetest.get_translated_string(lang, def.description)) return string.find(lname, lfilter, 1, true) or string.find(ldesc, lfilter, 1, true) - end - end - local is_creative = unified_inventory.is_creative(player_name) - unified_inventory.filtered_items_list[player_name]={} - for name, def in pairs(minetest.registered_items) do - if (not def.groups.not_in_creative_inventory - or def.groups.not_in_creative_inventory == 0) - and def.description - and def.description ~= "" - and ffilter(name, def) - and (is_creative or unified_inventory.crafts_for.recipe[def.name]) then - table.insert(unified_inventory.filtered_items_list[player_name], name) - end - end - table.sort(unified_inventory.filtered_items_list[player_name]) - unified_inventory.filtered_items_list_size[player_name] = #unified_inventory.filtered_items_list[player_name] - unified_inventory.current_index[player_name] = 1 - unified_inventory.activefilter[player_name] = filter - unified_inventory.active_search_direction[player_name] = search_dir - unified_inventory.set_inventory_formspec(player, - unified_inventory.current_page[player_name]) -end - -function unified_inventory.items_in_group(groups) - local items = {} - for name, item in pairs(minetest.registered_items) do - for _, group in pairs(groups:split(',')) do - if item.groups[group] then - table.insert(items, name) - end - end - end - return items -end - -function unified_inventory.sort_inventory(inv) - local inlist = inv:get_list("main") - local typecnt = {} - local typekeys = {} - for _, st in ipairs(inlist) do - if not st:is_empty() then - local n = st:get_name() - local w = st:get_wear() - local m = st:get_metadata() - local k = string.format("%s %05d %s", n, w, m) - if not typecnt[k] then - typecnt[k] = { - name = n, - wear = w, - metadata = m, - stack_max = st:get_stack_max(), - count = 0, - } - table.insert(typekeys, k) - end - typecnt[k].count = typecnt[k].count + st:get_count() - end - end - table.sort(typekeys) - local outlist = {} - for _, k in ipairs(typekeys) do - local tc = typecnt[k] - while tc.count > 0 do - local c = math.min(tc.count, tc.stack_max) - table.insert(outlist, ItemStack({ - name = tc.name, - wear = tc.wear, - metadata = tc.metadata, - count = c, - })) - tc.count = tc.count - c - end - end - if #outlist > #inlist then return end - while #outlist < #inlist do - table.insert(outlist, ItemStack(nil)) - end - inv:set_list("main", outlist) -end + or llocaldesc and string.find(llocaldesc, lfilter, 1, true) + end + end + ui.filtered_items_list[player_name]={} + local category = ui.current_category[player_name] or 'all' + if category == 'all' then + for name, def in pairs(minetest.registered_items) do + if valid_def(def) + and ffilter(name, def) then + table.insert(ui.filtered_items_list[player_name], name) + end + end + elseif category == 'uncategorized' then + for name, def in pairs(minetest.registered_items) do + if (not ui.find_category(name)) + and valid_def(def) + and ffilter(name, def) then + table.insert(ui.filtered_items_list[player_name], name) + end + end + else + for name,exists in pairs(ui.registered_category_items[category]) do + local def = minetest.registered_items[name] + if exists and def + and valid_def(def) + and ffilter(name, def) then + table.insert(ui.filtered_items_list[player_name], name) + end + end + end + table.sort(ui.filtered_items_list[player_name]) + ui.filtered_items_list_size[player_name] = #ui.filtered_items_list[player_name] + ui.current_index[player_name] = 1 + ui.activefilter[player_name] = filter + ui.active_search_direction[player_name] = search_dir + ui.set_inventory_formspec(player, + ui.current_page[player_name]) +end diff --git a/intllib.lua b/intllib.lua deleted file mode 100644 index 6669d72..0000000 --- a/intllib.lua +++ /dev/null @@ -1,45 +0,0 @@ - --- Fallback functions for when `intllib` is not installed. --- Code released under Unlicense . - --- Get the latest version of this file at: --- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua - -local function format(str, ...) - local args = { ... } - local function repl(escape, open, num, close) - if escape == "" then - local replacement = tostring(args[tonumber(num)]) - if open == "" then - replacement = replacement..close - end - return replacement - else - return "@"..open..num..close - end - end - return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) -end - -local gettext, ngettext -if minetest.get_modpath("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - gettext, ngettext = intllib.make_gettext_pair() - else - -- Old method using text files. - gettext = intllib.Getter() - end -end - --- Fill in missing functions. - -gettext = gettext or function(msgid, ...) - return format(msgid, ...) -end - -ngettext = ngettext or function(msgid, msgid_plural, n, ...) - return format(n==1 and msgid or msgid_plural, ...) -end - -return gettext, ngettext diff --git a/item_names.lua b/item_names.lua index d374b14..a1368f8 100644 --- a/item_names.lua +++ b/item_names.lua @@ -1,25 +1,25 @@ -- Based on 4itemnames mod by 4aiman -local item_names = {} -- [player_name] = { hud, dtime, itemname } +local item_names = {} -- [player_name] = { hud, dtime, itemname } local dlimit = 3 -- HUD element will be hidden after this many seconds -local air_hud_mod = minetest.get_modpath("4air") -local hud_mod = minetest.get_modpath("hud") local hudbars_mod = minetest.get_modpath("hudbars") local function set_hud(player) local player_name = player:get_player_name() - local off = {x=0, y=-70} - if air_hud_mod or hud_mod then - off.y = off.y - 20 - elseif hudbars_mod then - off.y = off.y + 13 + local off = {x=0, y=-65} + if hudbars_mod then + -- Assume no alignment (2 per line) + off.y = off.y - math.ceil(hb.hudbars_count / 2) * 25 + else + off.y = off.y - 25 end + item_names[player_name] = { hud = player:hud_add({ hud_elem_type = "text", position = {x=0.5, y=1}, offset = off, - alignment = {x=0, y=0}, + alignment = {x=0, y=-1}, number = 0xFFFFFF, text = "", }), diff --git a/locale/de.po b/locale/de.po deleted file mode 100644 index 1231f1a..0000000 --- a/locale/de.po +++ /dev/null @@ -1,366 +0,0 @@ -# German translation for the unified_inventory mod. -# Copyright (C) 2018 Maciej Kasatkin (RealBadAngel) -# This file is distributed under the same license as the unified_inventory package. -# Xanthin -# CodeXP , 2018. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: unified_inventory\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-04-02 13:41+0200\n" -"PO-Revision-Date: \n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: api.lua register.lua -msgid "Crafting" -msgstr "Fertigung" - -#: api.lua -msgid "Mixing" -msgstr "Mischen" - -#: api.lua -msgid "Cooking" -msgstr "Kochen" - -#: api.lua -msgid "Digging" -msgstr "Graben" - -#: bags.lua -msgid "Bags" -msgstr "Taschen" - -#: bags.lua -msgid "Bag @1" -msgstr "Tasche @1" - -#: bags.lua -msgid "Small Bag" -msgstr "Kleine Tasche" - -#: bags.lua -msgid "Medium Bag" -msgstr "Mittelgroße Tasche" - -#: bags.lua -msgid "Large Bag" -msgstr "Große Tasche" - -#: group.lua -msgid " and " -msgstr " und " - -#: internal.lua -msgid "First page" -msgstr "Erste Seite" - -#: internal.lua -msgid "Back three pages" -msgstr "3 Seiten zurückblättern" - -#: internal.lua -msgid "Back one page" -msgstr "1 Seite zurückblättern" - -#: internal.lua -msgid "Forward one page" -msgstr "1 Seite vorblättern" - -#: internal.lua -msgid "Forward three pages" -msgstr "3 Seiten vorblättern" - -#: internal.lua -msgid "Last page" -msgstr "Letzte Seite" - -#: internal.lua -msgid "Search" -msgstr "Suchen" - -#: internal.lua -msgid "Reset search and display everything" -msgstr "Suche zurücksetzen und alles anzeigen" - -#: internal.lua -msgid "No matching items" -msgstr "Keine passenden Gegenstände" - -#: internal.lua -msgid "No matches." -msgstr "Keine Treffer" - -#: internal.lua -msgid "Page" -msgstr "Seite" - -#: internal.lua -#, lua-format -msgid "%s of %s" -msgstr "%s von %s" - -#: internal.lua -msgid "Filter" -msgstr "Filter" - -#: register.lua -msgid "Can use the creative inventory" -msgstr "Kann das Kreativinventar nutzen" - -#: register.lua -msgid "" -"Forces Unified Inventory to be displayed in Full mode if Lite mode is " -"configured globally" -msgstr "" - -#: register.lua -msgid "Crafting Grid" -msgstr "Fertigungsraster" - -#: register.lua -msgid "Crafting Guide" -msgstr "Fertigungsführer" - -#: register.lua -msgid "Set home position" -msgstr "Heimatposition setzen" - -#: register.lua -#, lua-format -msgid "Home position set to: %s" -msgstr "Heimatposition nach: %s gesetzt" - -#: register.lua -msgid "You don't have the \"home\" privilege!" -msgstr "Du hast das \"home\"-Privileg nicht!" - -#: register.lua -msgid "Go home" -msgstr "Nach Hause gehen" - -#: register.lua -msgid "Set time to day" -msgstr "Zur Tageszeit wechseln" - -#: register.lua -msgid "Time of day set to 6am" -msgstr "Tageszeit auf 6 Uhr gesetzt" - -#: register.lua -msgid "You don't have the settime privilege!" -msgstr "Du hast das \"settime\"-Privileg nicht!" - -#: register.lua -msgid "Set time to night" -msgstr "Zur Nachtzeit wechseln" - -#: register.lua -msgid "Time of day set to 9pm" -msgstr "Tageszeit auf 21 Uhr gesetzt" - -#: register.lua -msgid "Clear inventory" -msgstr "Inventar leeren" - -#: register.lua -#, fuzzy -msgid "" -"This button has been disabled outside of creative mode to prevent accidental " -"inventory trashing.\n" -"Use the trash slot instead." -msgstr "" -"Diese Funktion ist außerhalb des Kreativmodus deaktiviert, um ein " -"versehentliches Löschen des ganzen Inventars zu verhindern.\n" -"Nutze stattdessen das Müllfeld." - -#: register.lua -msgid "Inventory cleared!" -msgstr "Inventar geleert!" - -#: register.lua -msgid "Trash:" -msgstr "Müll:" - -#: register.lua -msgid "Refill:" -msgstr "Nachfüllen:" - -#: register.lua -#, lua-format -msgid "Any item belonging to the %s group" -msgstr "Irgendein Gegenstand, der zur Gruppe %s gehört" - -#: register.lua -#, lua-format -msgid "Any item belonging to the groups %s" -msgstr "Irgendein Gegenstand, der zu den Gruppen %s gehört" - -#: register.lua -#, lua-format -msgid "Recipe %d of %d" -msgstr "Rezept %d von %d" - -#: register.lua -#, lua-format -msgid "Usage %d of %d" -msgstr "Verwendung %d von %d" - -#: register.lua -msgid "No recipes" -msgstr "Keine Rezepte" - -#: register.lua -msgid "No usages" -msgstr "Keine Verwendungen" - -#: register.lua -msgid "Result" -msgstr "Ergebnis" - -#: register.lua -msgid "Ingredient" -msgstr "Zutat" - -#: register.lua -msgid "Show next recipe" -msgstr "Nächstes Rezept zeigen" - -#: register.lua -msgid "Show next usage" -msgstr "Nächste Verwendung zeigen" - -#: register.lua -msgid "Show previous recipe" -msgstr "Vorheriges Rezept zeigen" - -#: register.lua -msgid "Show previous usage" -msgstr "Vorherige Verwendung zeigen" - -#: register.lua -#, lua-format -msgid "%s (%s)" -msgstr "" - -#: register.lua -msgid "Give me:" -msgstr "Gib mir:" - -#: register.lua -msgid "" -"This recipe is too\n" -"large to be displayed." -msgstr "" -"Dieses Rezept ist zu\n" -"groß, um angezeigt\n" -"zu werden." - -#: register.lua -msgid "To craft grid:" -msgstr "Ins Fertigungsraster:" - -#: register.lua -msgid "All" -msgstr "Alles" - -#: waypoints.lua -msgid "White" -msgstr "Weiß" - -#: waypoints.lua -msgid "Yellow" -msgstr "Gelb" - -#: waypoints.lua -msgid "Red" -msgstr "Rot" - -#: waypoints.lua -msgid "Green" -msgstr "Grün" - -#: waypoints.lua -msgid "Blue" -msgstr "Blau" - -#: waypoints.lua -msgid "Waypoints" -msgstr "Wegpunkte" - -#: waypoints.lua -#, lua-format -msgid "Select Waypoint #%d" -msgstr "Wegpunkt Nr. %d auswählen" - -#: waypoints.lua -#, lua-format -msgid "Waypoint %d" -msgstr "Wegpunkt Nr. %d" - -#: waypoints.lua -msgid "Set waypoint to current location" -msgstr "Setze Wegpunkt zur derzeitigen Position" - -#: waypoints.lua -msgid "invisible" -msgstr "unsichtbar" - -#: waypoints.lua -msgid "visible" -msgstr "sichtbar" - -#: waypoints.lua -msgid "Make waypoint @1" -msgstr "Wegpunkt @1 machen" - -#: waypoints.lua -msgid "Disable" -msgstr "ausschalten" - -#: waypoints.lua -msgid "Enable" -msgstr "einschalten" - -#: waypoints.lua -msgid "@1 display of waypoint coordinates" -msgstr "Anzeige der Wegpunktkoordinaten @1" - -#: waypoints.lua -msgid "Change color of waypoint display" -msgstr "Farbe der Darstellung der Wegpunkte ändern" - -#: waypoints.lua -msgid "Edit waypoint name" -msgstr "Name des Wegpunkts ändern" - -#: waypoints.lua -msgid "Waypoint active" -msgstr "Wegpunkt aktiv" - -#: waypoints.lua -msgid "Waypoint inactive" -msgstr "Wegpunkt inaktiv" - -#: waypoints.lua -msgid "Finish editing" -msgstr "Bearbeitung abschließen" - -#: waypoints.lua -msgid "World position" -msgstr "Weltposition" - -#: waypoints.lua -msgid "Name" -msgstr "Name" - -#: waypoints.lua -msgid "HUD text color" -msgstr "HUD-Textfarbe" diff --git a/locale/es.po b/locale/es.po deleted file mode 100644 index a49a76d..0000000 --- a/locale/es.po +++ /dev/null @@ -1,366 +0,0 @@ -# Spanish translation for the unified_inventory mod. -# Copyright (C) 2018 Maciej Kasatkin (RealBadAngel) -# This file is distributed under the same license as the unified_inventory package. -# Diego Martínez -# CodeXP , 2018. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: unified_inventory\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-04-02 16:15+0200\n" -"PO-Revision-Date: \n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: api.lua register.lua -msgid "Crafting" -msgstr "Elaboración" - -#: api.lua -msgid "Mixing" -msgstr "" - -#: api.lua -#, fuzzy -msgid "Cooking" -msgstr "hornear" - -#: api.lua -msgid "Digging" -msgstr "" - -#: bags.lua -msgid "Bags" -msgstr "Bolsas" - -#: bags.lua -msgid "Bag @1" -msgstr "Bolsa @1" - -#: bags.lua -msgid "Small Bag" -msgstr "Bolsa Pequeña" - -#: bags.lua -msgid "Medium Bag" -msgstr "Bolsa Mediana" - -#: bags.lua -msgid "Large Bag" -msgstr "Bolsa Grande" - -#: group.lua -msgid " and " -msgstr "" - -#: internal.lua -msgid "First page" -msgstr "" - -#: internal.lua -msgid "Back three pages" -msgstr "" - -#: internal.lua -msgid "Back one page" -msgstr "" - -#: internal.lua -msgid "Forward one page" -msgstr "" - -#: internal.lua -msgid "Forward three pages" -msgstr "" - -#: internal.lua -msgid "Last page" -msgstr "" - -#: internal.lua -msgid "Search" -msgstr "" - -#: internal.lua -msgid "Reset search and display everything" -msgstr "" - -#: internal.lua -msgid "No matching items" -msgstr "" - -#: internal.lua -msgid "No matches." -msgstr "" - -#: internal.lua -msgid "Page" -msgstr "Página" - -#: internal.lua -#, lua-format -msgid "%s of %s" -msgstr "%s de %s" - -#: internal.lua -msgid "Filter" -msgstr "Filtro" - -#: register.lua -msgid "Can use the creative inventory" -msgstr "Puede usar el inventario creativo" - -#: register.lua -msgid "" -"Forces Unified Inventory to be displayed in Full mode if Lite mode is " -"configured globally" -msgstr "" - -#: register.lua -msgid "Crafting Grid" -msgstr "" - -#: register.lua -msgid "Crafting Guide" -msgstr "Guía de Elaboración" - -#: register.lua -#, fuzzy -msgid "Set home position" -msgstr "Posición en el mundo" - -#: register.lua -#, lua-format -msgid "Home position set to: %s" -msgstr "Posición de hogar cambiada a: %s" - -#: register.lua -msgid "You don't have the \"home\" privilege!" -msgstr "¡No tienes el privilegio \"home\"!" - -#: register.lua -msgid "Go home" -msgstr "" - -#: register.lua -msgid "Set time to day" -msgstr "" - -#: register.lua -msgid "Time of day set to 6am" -msgstr "Hora del día cambiada a 6AM" - -#: register.lua -msgid "You don't have the settime privilege!" -msgstr "¡No tienes el privilegio \"settime\"!" - -#: register.lua -msgid "Set time to night" -msgstr "" - -#: register.lua -msgid "Time of day set to 9pm" -msgstr "Hora del día cambiada a 9PM" - -#: register.lua -msgid "Clear inventory" -msgstr "" - -#: register.lua -#, fuzzy -msgid "" -"This button has been disabled outside of creative mode to prevent accidental " -"inventory trashing.\n" -"Use the trash slot instead." -msgstr "" -"Éste botón ha sido deshabilitado para prevenir la destrucción accidental del " -"inventario.\n" -"Usa la ranura para basura en su lugar." - -#: register.lua -msgid "Inventory cleared!" -msgstr "¡Inventario limpio!" - -#: register.lua -msgid "Trash:" -msgstr "Basura:" - -#: register.lua -msgid "Refill:" -msgstr "Rellenar:" - -#: register.lua -#, lua-format -msgid "Any item belonging to the %s group" -msgstr "" - -#: register.lua -#, lua-format -msgid "Any item belonging to the groups %s" -msgstr "" - -#: register.lua -#, lua-format -msgid "Recipe %d of %d" -msgstr "Receta %d de %d" - -#: register.lua -#, lua-format -msgid "Usage %d of %d" -msgstr "" - -#: register.lua -msgid "No recipes" -msgstr "" - -#: register.lua -msgid "No usages" -msgstr "" - -#: register.lua -msgid "Result" -msgstr "Resultado" - -#: register.lua -msgid "Ingredient" -msgstr "" - -#: register.lua -msgid "Show next recipe" -msgstr "" - -#: register.lua -msgid "Show next usage" -msgstr "" - -#: register.lua -msgid "Show previous recipe" -msgstr "" - -#: register.lua -msgid "Show previous usage" -msgstr "" - -#: register.lua -#, lua-format -msgid "%s (%s)" -msgstr "" - -#: register.lua -msgid "Give me:" -msgstr "" - -#: register.lua -msgid "" -"This recipe is too\n" -"large to be displayed." -msgstr "" - -#: register.lua -#, fuzzy -msgid "To craft grid:" -msgstr "Copiar al cuadro de elaboración" - -#: register.lua -msgid "All" -msgstr "Todos" - -#: waypoints.lua -msgid "White" -msgstr "Blanco" - -#: waypoints.lua -msgid "Yellow" -msgstr "Amarillo" - -#: waypoints.lua -msgid "Red" -msgstr "Rojo" - -#: waypoints.lua -msgid "Green" -msgstr "Verde" - -#: waypoints.lua -msgid "Blue" -msgstr "Azul" - -#: waypoints.lua -msgid "Waypoints" -msgstr "Puntos de paso" - -#: waypoints.lua -#, lua-format -msgid "Select Waypoint #%d" -msgstr "" - -#: waypoints.lua -#, lua-format -msgid "Waypoint %d" -msgstr "Puntos de paso %d" - -#: waypoints.lua -msgid "Set waypoint to current location" -msgstr "" - -#: waypoints.lua -msgid "invisible" -msgstr "" - -#: waypoints.lua -msgid "visible" -msgstr "" - -#: waypoints.lua -msgid "Make waypoint @1" -msgstr "" - -#: waypoints.lua -msgid "Disable" -msgstr "" - -#: waypoints.lua -msgid "Enable" -msgstr "" - -#: waypoints.lua -msgid "@1 display of waypoint coordinates" -msgstr "" - -#: waypoints.lua -msgid "Change color of waypoint display" -msgstr "" - -#: waypoints.lua -msgid "Edit waypoint name" -msgstr "" - -#: waypoints.lua -msgid "Waypoint active" -msgstr "Punto de paso activo" - -#: waypoints.lua -msgid "Waypoint inactive" -msgstr "Punto de paso inactivo" - -#: waypoints.lua -msgid "Finish editing" -msgstr "" - -#: waypoints.lua -msgid "World position" -msgstr "Posición en el mundo" - -#: waypoints.lua -msgid "Name" -msgstr "Nombre" - -#: waypoints.lua -msgid "HUD text color" -msgstr "Color del HUD" diff --git a/locale/fr.po b/locale/fr.po deleted file mode 100644 index f6af706..0000000 --- a/locale/fr.po +++ /dev/null @@ -1,364 +0,0 @@ -# French translation for the unified_inventory mod. -# Copyright (C) 2018 Maciej Kasatkin (RealBadAngel) -# This file is distributed under the same license as the unified_inventory package. -# kilbith -# CodeXP , 2018. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: unified_inventory\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-04-02 16:15+0200\n" -"PO-Revision-Date: \n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: fr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: api.lua register.lua -msgid "Crafting" -msgstr "Création" - -#: api.lua -msgid "Mixing" -msgstr "" - -#: api.lua -msgid "Cooking" -msgstr "Cuisson" - -#: api.lua -msgid "Digging" -msgstr "Creuser" - -#: bags.lua -msgid "Bags" -msgstr "Sacs" - -#: bags.lua -msgid "Bag @1" -msgstr "Sac @1" - -#: bags.lua -msgid "Small Bag" -msgstr "Petit sac" - -#: bags.lua -msgid "Medium Bag" -msgstr "Sac moyen" - -#: bags.lua -msgid "Large Bag" -msgstr "Grand sac" - -#: group.lua -msgid " and " -msgstr " et " - -#: internal.lua -msgid "First page" -msgstr "1ère page" - -#: internal.lua -msgid "Back three pages" -msgstr "3 pages en arrière" - -#: internal.lua -msgid "Back one page" -msgstr "Page précédente" - -#: internal.lua -msgid "Forward one page" -msgstr "Page suivante" - -#: internal.lua -msgid "Forward three pages" -msgstr "3 pages en avant" - -#: internal.lua -msgid "Last page" -msgstr "Dernière page" - -#: internal.lua -msgid "Search" -msgstr "Rechercher" - -#: internal.lua -msgid "Reset search and display everything" -msgstr "" - -#: internal.lua -msgid "No matching items" -msgstr "Aucun élément correspondant" - -#: internal.lua -msgid "No matches." -msgstr "Aucun match" - -#: internal.lua -msgid "Page" -msgstr "Page" - -#: internal.lua -#, lua-format -msgid "%s of %s" -msgstr "%s de %s" - -#: internal.lua -msgid "Filter" -msgstr "Filtre" - -#: register.lua -msgid "Can use the creative inventory" -msgstr "Vous pouvez utiliser l'inventaire créatif" - -#: register.lua -msgid "" -"Forces Unified Inventory to be displayed in Full mode if Lite mode is " -"configured globally" -msgstr "" - -#: register.lua -msgid "Crafting Grid" -msgstr "Grille de création" - -#: register.lua -msgid "Crafting Guide" -msgstr "Guide de création" - -#: register.lua -#, fuzzy -msgid "Set home position" -msgstr "Position dans le monde" - -#: register.lua -#, lua-format -msgid "Home position set to: %s" -msgstr "Position de votre base fixée à: %s" - -#: register.lua -msgid "You don't have the \"home\" privilege!" -msgstr "Vous n'avez pas le privilège \"home\"!" - -#: register.lua -msgid "Go home" -msgstr "" - -#: register.lua -msgid "Set time to day" -msgstr "" - -#: register.lua -msgid "Time of day set to 6am" -msgstr "Heure fixée à 6h" - -#: register.lua -msgid "You don't have the settime privilege!" -msgstr "Vous n'avez pas le privilège \"settime\"!" - -#: register.lua -msgid "Set time to night" -msgstr "" - -#: register.lua -msgid "Time of day set to 9pm" -msgstr "Heure fixée à 21h" - -#: register.lua -msgid "Clear inventory" -msgstr "" - -#: register.lua -msgid "" -"This button has been disabled outside of creative mode to prevent accidental " -"inventory trashing.\n" -"Use the trash slot instead." -msgstr "" -"Ce bouton a été désactivé en dehors du mode créatif pour éviter des saccages " -"dans l'inventaire.\n" -"Utilisez plutôt la case poubelle." - -#: register.lua -msgid "Inventory cleared!" -msgstr "Inventaire vidé !" - -#: register.lua -msgid "Trash:" -msgstr "Poubelle :" - -#: register.lua -msgid "Refill:" -msgstr "Remplir :" - -#: register.lua -#, lua-format -msgid "Any item belonging to the %s group" -msgstr "" - -#: register.lua -#, lua-format -msgid "Any item belonging to the groups %s" -msgstr "" - -#: register.lua -#, lua-format -msgid "Recipe %d of %d" -msgstr "Recette %d de %d" - -#: register.lua -#, lua-format -msgid "Usage %d of %d" -msgstr "" - -#: register.lua -msgid "No recipes" -msgstr "" - -#: register.lua -msgid "No usages" -msgstr "" - -#: register.lua -msgid "Result" -msgstr "Résultat" - -#: register.lua -msgid "Ingredient" -msgstr "" - -#: register.lua -msgid "Show next recipe" -msgstr "" - -#: register.lua -msgid "Show next usage" -msgstr "" - -#: register.lua -msgid "Show previous recipe" -msgstr "" - -#: register.lua -msgid "Show previous usage" -msgstr "" - -#: register.lua -#, lua-format -msgid "%s (%s)" -msgstr "" - -#: register.lua -msgid "Give me:" -msgstr "" - -#: register.lua -msgid "" -"This recipe is too\n" -"large to be displayed." -msgstr "" - -#: register.lua -msgid "To craft grid:" -msgstr "Sur de création:" - -#: register.lua -msgid "All" -msgstr "Tout" - -#: waypoints.lua -msgid "White" -msgstr "Blanc" - -#: waypoints.lua -msgid "Yellow" -msgstr "Jaune" - -#: waypoints.lua -msgid "Red" -msgstr "Rouge" - -#: waypoints.lua -msgid "Green" -msgstr "Vert" - -#: waypoints.lua -msgid "Blue" -msgstr "Bleu" - -#: waypoints.lua -msgid "Waypoints" -msgstr "Point de passage" - -#: waypoints.lua -#, lua-format -msgid "Select Waypoint #%d" -msgstr "Choisir un point de passage #%d" - -#: waypoints.lua -#, lua-format -msgid "Waypoint %d" -msgstr "Point de passage %d" - -#: waypoints.lua -msgid "Set waypoint to current location" -msgstr "Marquer un point de passage à la position actuelle" - -#: waypoints.lua -msgid "invisible" -msgstr "" - -#: waypoints.lua -msgid "visible" -msgstr "" - -#: waypoints.lua -msgid "Make waypoint @1" -msgstr "Rendre @1 le point de passage" - -#: waypoints.lua -msgid "Disable" -msgstr "" - -#: waypoints.lua -msgid "Enable" -msgstr "" - -#: waypoints.lua -#, fuzzy -msgid "@1 display of waypoint coordinates" -msgstr "@1 montrer les coordonnées des points de passages" - -#: waypoints.lua -msgid "Change color of waypoint display" -msgstr "Changer la couleur du point de passage" - -#: waypoints.lua -msgid "Edit waypoint name" -msgstr "Editer le nom du point de passage" - -#: waypoints.lua -msgid "Waypoint active" -msgstr "Point de passage actif" - -#: waypoints.lua -msgid "Waypoint inactive" -msgstr "Point de passage inactif" - -#: waypoints.lua -msgid "Finish editing" -msgstr "Terminer l'édition" - -#: waypoints.lua -msgid "World position" -msgstr "Position dans le monde" - -#: waypoints.lua -msgid "Name" -msgstr "Nom" - -#: waypoints.lua -msgid "HUD text color" -msgstr "Couleur de texte du HUD" diff --git a/locale/pl.po b/locale/pl.po deleted file mode 100644 index 5a3f412..0000000 --- a/locale/pl.po +++ /dev/null @@ -1,359 +0,0 @@ -# Polish translation for the unified_inventory mod. -# Copyright (C) 2018 Maciej Kasatkin (RealBadAngel) -# This file is distributed under the same license as the unified_inventory package. -# RealBadAngel -# CodeXP , 2018. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: unified_inventory\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-04-02 16:30+0200\n" -"PO-Revision-Date: \n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: pl\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: api.lua register.lua -msgid "Crafting" -msgstr "" - -#: api.lua -msgid "Mixing" -msgstr "" - -#: api.lua -msgid "Cooking" -msgstr "" - -#: api.lua -msgid "Digging" -msgstr "" - -#: bags.lua -msgid "Bags" -msgstr "Plecaki" - -#: bags.lua -msgid "Bag @1" -msgstr "Plecak @1" - -#: bags.lua -msgid "Small Bag" -msgstr "Maly plecak" - -#: bags.lua -msgid "Medium Bag" -msgstr "Sredni plecak" - -#: bags.lua -msgid "Large Bag" -msgstr "Duzy plecak" - -#: group.lua -msgid " and " -msgstr " i " - -#: internal.lua -msgid "First page" -msgstr "Pierwsza strona" - -#: internal.lua -msgid "Back three pages" -msgstr "3 strony w tyl" - -#: internal.lua -msgid "Back one page" -msgstr "1 strona w tyl" - -#: internal.lua -msgid "Forward one page" -msgstr "1 strona do przodu" - -#: internal.lua -msgid "Forward three pages" -msgstr "3 strony do przodu" - -#: internal.lua -msgid "Last page" -msgstr "Ostatnia strona" - -#: internal.lua -msgid "Search" -msgstr "Szukaj" - -#: internal.lua -msgid "Reset search and display everything" -msgstr "" - -#: internal.lua -msgid "No matching items" -msgstr "Brak pasujacych przedmiotow" - -#: internal.lua -msgid "No matches." -msgstr "Brak wyników" - -#: internal.lua -msgid "Page" -msgstr "Strona" - -#: internal.lua -#, lua-format -msgid "%s of %s" -msgstr "%s z %s" - -#: internal.lua -msgid "Filter" -msgstr "Filtr" - -#: register.lua -msgid "Can use the creative inventory" -msgstr "" - -#: register.lua -msgid "" -"Forces Unified Inventory to be displayed in Full mode if Lite mode is " -"configured globally" -msgstr "" - -#: register.lua -msgid "Crafting Grid" -msgstr "" - -#: register.lua -msgid "Crafting Guide" -msgstr "" - -#: register.lua -msgid "Set home position" -msgstr "Ustaw pozycję wyjściową" - -#: register.lua -#, lua-format -msgid "Home position set to: %s" -msgstr "Pozycja domowa ustawiona na: %s" - -#: register.lua -msgid "You don't have the \"home\" privilege!" -msgstr "Nie masz uprawnien do zmiany czasu \"home\"!" - -#: register.lua -msgid "Go home" -msgstr "Idź do domu" - -#: register.lua -msgid "Set time to day" -msgstr "Ustaw czas na dzień" - -#: register.lua -msgid "Time of day set to 6am" -msgstr "Czas ustawiony na 6:00" - -#: register.lua -msgid "You don't have the settime privilege!" -msgstr "Nie masz uprawnien do zmiany czasu \"settime\"!" - -#: register.lua -msgid "Set time to night" -msgstr "Ustaw czas na noc" - -#: register.lua -msgid "Time of day set to 9pm" -msgstr "Czas ustawiony na 21:00" - -#: register.lua -msgid "Clear inventory" -msgstr "Wyczyść zapasy" - -#: register.lua -msgid "" -"This button has been disabled outside of creative mode to prevent accidental " -"inventory trashing.\n" -"Use the trash slot instead." -msgstr "" - -#: register.lua -msgid "Inventory cleared!" -msgstr "Zapasy zostały wyczyszczone!" - -#: register.lua -msgid "Trash:" -msgstr "Smietnik:" - -#: register.lua -msgid "Refill:" -msgstr "Uzupelnianie:" - -#: register.lua -#, lua-format -msgid "Any item belonging to the %s group" -msgstr "" - -#: register.lua -#, lua-format -msgid "Any item belonging to the groups %s" -msgstr "" - -#: register.lua -#, lua-format -msgid "Recipe %d of %d" -msgstr "Recepta %d z %d" - -#: register.lua -#, lua-format -msgid "Usage %d of %d" -msgstr "Użycie %d z %d" - -#: register.lua -msgid "No recipes" -msgstr "Brak recepty" - -#: register.lua -msgid "No usages" -msgstr "Bez użycia" - -#: register.lua -msgid "Result" -msgstr "Wynik" - -#: register.lua -msgid "Ingredient" -msgstr "Składnik" - -#: register.lua -msgid "Show next recipe" -msgstr "" - -#: register.lua -msgid "Show next usage" -msgstr "" - -#: register.lua -msgid "Show previous recipe" -msgstr "" - -#: register.lua -msgid "Show previous usage" -msgstr "" - -#: register.lua -#, lua-format -msgid "%s (%s)" -msgstr "" - -#: register.lua -msgid "Give me:" -msgstr "Daj mi:" - -#: register.lua -msgid "" -"This recipe is too\n" -"large to be displayed." -msgstr "" - -#: register.lua -msgid "To craft grid:" -msgstr "" - -#: register.lua -msgid "All" -msgstr "Wszystko" - -#: waypoints.lua -msgid "White" -msgstr "Bialy" - -#: waypoints.lua -msgid "Yellow" -msgstr "Zolty" - -#: waypoints.lua -msgid "Red" -msgstr "Czerwony" - -#: waypoints.lua -msgid "Green" -msgstr "Zielony" - -#: waypoints.lua -msgid "Blue" -msgstr "Niebieski" - -#: waypoints.lua -msgid "Waypoints" -msgstr "Punkty orientacyjne" - -#: waypoints.lua -#, lua-format -msgid "Select Waypoint #%d" -msgstr "Wybierz punkt #%d" - -#: waypoints.lua -#, lua-format -msgid "Waypoint %d" -msgstr "Punkty orientacyjne %d" - -#: waypoints.lua -msgid "Set waypoint to current location" -msgstr "Ustaw punkt orientacyjny na biezacej pozycji" - -#: waypoints.lua -msgid "invisible" -msgstr "niewidzialny" - -#: waypoints.lua -msgid "visible" -msgstr "widomy" - -#: waypoints.lua -msgid "Make waypoint @1" -msgstr "Robić punkt @1" - -#: waypoints.lua -msgid "Disable" -msgstr "" - -#: waypoints.lua -msgid "Enable" -msgstr "" - -#: waypoints.lua -msgid "@1 display of waypoint coordinates" -msgstr "@1 koordynatow punktu" - -#: waypoints.lua -msgid "Change color of waypoint display" -msgstr "Zmien kolor punktu" - -#: waypoints.lua -msgid "Edit waypoint name" -msgstr "Edytuj nazwe punktu" - -#: waypoints.lua -msgid "Waypoint active" -msgstr "Punkt wlaczony" - -#: waypoints.lua -msgid "Waypoint inactive" -msgstr "Punkt wylaczony" - -#: waypoints.lua -msgid "Finish editing" -msgstr "Zakoncz edycje" - -#: waypoints.lua -msgid "World position" -msgstr "Pozycja" - -#: waypoints.lua -msgid "Name" -msgstr "Nazwa" - -#: waypoints.lua -msgid "HUD text color" -msgstr "Kolor tekstu HUD" diff --git a/locale/pt.po b/locale/pt.po deleted file mode 100644 index ff9cc3a..0000000 --- a/locale/pt.po +++ /dev/null @@ -1,366 +0,0 @@ -# Portuguese translation for the unified_inventory mod. -# Copyright (C) 2018 Maciej Kasatkin (RealBadAngel) -# This file is distributed under the same license as the unified_inventory package. -# Lunovox -# CodeXP , 2018. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: unified_inventory\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-04-02 16:48+0200\n" -"PO-Revision-Date: \n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: pt\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: api.lua register.lua -msgid "Crafting" -msgstr "Artesanato" - -#: api.lua -msgid "Mixing" -msgstr "Muistura" - -#: api.lua -msgid "Cooking" -msgstr "Cozimento" - -#: api.lua -msgid "Digging" -msgstr "Escavação" - -#: bags.lua -msgid "Bags" -msgstr "Bolsas" - -#: bags.lua -msgid "Bag @1" -msgstr "Bolsa @1" - -#: bags.lua -msgid "Small Bag" -msgstr "Bolsa Pequena" - -#: bags.lua -msgid "Medium Bag" -msgstr "Bolsa Média" - -#: bags.lua -msgid "Large Bag" -msgstr "Bolsa Grande" - -#: group.lua -msgid " and " -msgstr " e " - -#: internal.lua -msgid "First page" -msgstr "Primeira Página" - -#: internal.lua -msgid "Back three pages" -msgstr "Voltar 3 Páginas" - -#: internal.lua -msgid "Back one page" -msgstr "Voltar 1 Página" - -#: internal.lua -msgid "Forward one page" -msgstr "Avançar 1 Página" - -#: internal.lua -msgid "Forward three pages" -msgstr "Avançar 3 Páginas" - -#: internal.lua -msgid "Last page" -msgstr "Ultima Página" - -#: internal.lua -msgid "Search" -msgstr "Pesquisar" - -#: internal.lua -msgid "Reset search and display everything" -msgstr "Redefinir pesquisa e exibir tudo" - -#: internal.lua -msgid "No matching items" -msgstr "Nenhum item correspondente" - -#: internal.lua -msgid "No matches." -msgstr "Sem correspondências" - -#: internal.lua -msgid "Page" -msgstr "Página" - -#: internal.lua -#, lua-format -msgid "%s of %s" -msgstr "%s de %s" - -#: internal.lua -msgid "Filter" -msgstr "Filtro" - -#: register.lua -msgid "Can use the creative inventory" -msgstr "Pode usar o inventário do criativo" - -#: register.lua -msgid "" -"Forces Unified Inventory to be displayed in Full mode if Lite mode is " -"configured globally" -msgstr "" -"Força o Unified Inventory a ser exibido no modo Full se o modo Lite estiver " -"configurado globalmente" - -#: register.lua -msgid "Crafting Grid" -msgstr "Grade de Artesanato" - -#: register.lua -msgid "Crafting Guide" -msgstr "Guia de Artesanato" - -#: register.lua -msgid "Set home position" -msgstr "Definir posição de casa" - -#: register.lua -#, lua-format -msgid "Home position set to: %s" -msgstr "Posição inicial definida para: %s" - -#: register.lua -msgid "You don't have the \"home\" privilege!" -msgstr "Você não tem o privilégio de \"home\"!" - -#: register.lua -msgid "Go home" -msgstr "Transportar para Casa" - -#: register.lua -msgid "Set time to day" -msgstr "Definir turno para dia" - -#: register.lua -msgid "Time of day set to 6am" -msgstr "Hora do dia definida para 06h" - -#: register.lua -msgid "You don't have the settime privilege!" -msgstr "Você não tem o privilégio de \"settime\"!" - -#: register.lua -msgid "Set time to night" -msgstr "Definir turno para noite" - -#: register.lua -msgid "Time of day set to 9pm" -msgstr "Hora do dia ajustada para 21h" - -#: register.lua -msgid "Clear inventory" -msgstr "Limpar Inventário" - -#: register.lua -msgid "" -"This button has been disabled outside of creative mode to prevent accidental " -"inventory trashing.\n" -"Use the trash slot instead." -msgstr "" -"Este botão foi desativado fora do modo de criativo para evitar o descarte " -"acidental de inventário. \n" -"Use o slot de lixo em vez disso." - -#: register.lua -msgid "Inventory cleared!" -msgstr "Inventário Apagado!" - -#: register.lua -msgid "Trash:" -msgstr "Lixo:" - -#: register.lua -msgid "Refill:" -msgstr "Recarga:" - -#: register.lua -#, lua-format -msgid "Any item belonging to the %s group" -msgstr "Qualquer item pertencente ao grupo '%s'." - -#: register.lua -#, lua-format -msgid "Any item belonging to the groups %s" -msgstr "Qualquer item pertencente aos grupos '%s'." - -#: register.lua -#, lua-format -msgid "Recipe %d of %d" -msgstr "Receita %d de %d" - -#: register.lua -#, lua-format -msgid "Usage %d of %d" -msgstr "Utilização %d de %d" - -#: register.lua -msgid "No recipes" -msgstr "Sem Receita" - -#: register.lua -msgid "No usages" -msgstr "Sem Utilização" - -#: register.lua -msgid "Result" -msgstr "Resultado" - -#: register.lua -msgid "Ingredient" -msgstr "Ingrediente" - -#: register.lua -msgid "Show next recipe" -msgstr "Exibir Próxima Receita" - -#: register.lua -msgid "Show next usage" -msgstr "Mostrar Próxima Utilização" - -#: register.lua -msgid "Show previous recipe" -msgstr "Exibir Receita Anterior" - -#: register.lua -msgid "Show previous usage" -msgstr "Exibir Utilização Anterior" - -#: register.lua -#, lua-format -msgid "%s (%s)" -msgstr "" - -#: register.lua -msgid "Give me:" -msgstr "Gerado:" - -#: register.lua -msgid "" -"This recipe is too\n" -"large to be displayed." -msgstr "" -"Esta receita é grande \n" -"demais para ser apresentada." - -#: register.lua -msgid "To craft grid:" -msgstr "Para Grade de Artesanato" - -#: register.lua -msgid "All" -msgstr "MAX" - -#: waypoints.lua -msgid "White" -msgstr "Branco" - -#: waypoints.lua -msgid "Yellow" -msgstr "Amarelo" - -#: waypoints.lua -msgid "Red" -msgstr "Vermelho" - -#: waypoints.lua -msgid "Green" -msgstr "Verde" - -#: waypoints.lua -msgid "Blue" -msgstr "Azul" - -#: waypoints.lua -msgid "Waypoints" -msgstr "Apontador de Direção" - -#: waypoints.lua -#, lua-format -msgid "Select Waypoint #%d" -msgstr "Seleção de Apontador de Direção #%02d" - -#: waypoints.lua -#, lua-format -msgid "Waypoint %d" -msgstr "Apontador de Direção %d" - -#: waypoints.lua -msgid "Set waypoint to current location" -msgstr "Configurar localização atual do Apontador de Direção" - -#: waypoints.lua -msgid "invisible" -msgstr "invisível" - -#: waypoints.lua -msgid "visible" -msgstr "visível" - -#: waypoints.lua -msgid "Make waypoint @1" -msgstr "Fazer Apontador de Direção @1" - -#: waypoints.lua -msgid "Disable" -msgstr "" - -#: waypoints.lua -msgid "Enable" -msgstr "" - -#: waypoints.lua -msgid "@1 display of waypoint coordinates" -msgstr "@1 exibição de coordenadas de Fazer Apontador de Direção" - -#: waypoints.lua -msgid "Change color of waypoint display" -msgstr "Mudar cor exibida do Apontador de Direção" - -#: waypoints.lua -msgid "Edit waypoint name" -msgstr "Editar Nome de Apontador de Direção" - -#: waypoints.lua -msgid "Waypoint active" -msgstr "Apontador de Direção Ativo" - -#: waypoints.lua -msgid "Waypoint inactive" -msgstr "Apontador de Direção Inativo" - -#: waypoints.lua -msgid "Finish editing" -msgstr "Edição Finalizada" - -#: waypoints.lua -msgid "World position" -msgstr "Posição Mundial" - -#: waypoints.lua -msgid "Name" -msgstr "Nome" - -#: waypoints.lua -msgid "HUD text color" -msgstr "Cor de HUD" diff --git a/locale/ru.po b/locale/ru.po deleted file mode 100644 index 7cf6144..0000000 --- a/locale/ru.po +++ /dev/null @@ -1,366 +0,0 @@ -# Russian translation for the unified_inventory mod. -# Copyright (C) 2018 Maciej Kasatkin (RealBadAngel) -# This file is distributed under the same license as the unified_inventory package. -# eternal_sorrow -# CodeXP , 2018. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: unified_inventory\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-04-02 03:34+0200\n" -"PO-Revision-Date: \n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: api.lua register.lua -#, fuzzy -msgid "Crafting" -msgstr "Крафт" - -#: api.lua -msgid "Mixing" -msgstr "Мешать" - -#: api.lua -msgid "Cooking" -msgstr "Варить" - -#: api.lua -msgid "Digging" -msgstr "Копать" - -#: bags.lua -msgid "Bags" -msgstr "Сумки" - -#: bags.lua -msgid "Bag @1" -msgstr "Сумка @1" - -#: bags.lua -msgid "Small Bag" -msgstr "Малая сумка" - -#: bags.lua -msgid "Medium Bag" -msgstr "Средняя сумка" - -#: bags.lua -msgid "Large Bag" -msgstr "Большая сумка" - -#: group.lua -msgid " and " -msgstr " и " - -#: internal.lua -msgid "First page" -msgstr "Первая страница" - -#: internal.lua -msgid "Back three pages" -msgstr "3 страницы назад" - -#: internal.lua -msgid "Back one page" -msgstr "1 страницу назад" - -#: internal.lua -msgid "Forward one page" -msgstr "1 страницу вперёд" - -#: internal.lua -msgid "Forward three pages" -msgstr "3 страницы вперёд" - -#: internal.lua -msgid "Last page" -msgstr "Последняя страница" - -#: internal.lua -msgid "Search" -msgstr "Поиск" - -#: internal.lua -msgid "Reset search and display everything" -msgstr "Сброс поиска, показать всё" - -#: internal.lua -msgid "No matching items" -msgstr "Нет подходящих элементов" - -#: internal.lua -msgid "No matches." -msgstr "Ничего не найдено" - -#: internal.lua -msgid "Page" -msgstr "Страница" - -#: internal.lua -#, lua-format -msgid "%s of %s" -msgstr "%s из %s" - -#: internal.lua -msgid "Filter" -msgstr "Фильтр" - -#: register.lua -msgid "Can use the creative inventory" -msgstr "Можно использовать инвентарь творческого режима" - -#: register.lua -msgid "" -"Forces Unified Inventory to be displayed in Full mode if Lite mode is " -"configured globally" -msgstr "" - -#: register.lua -msgid "Crafting Grid" -msgstr "Решетка крафта" - -#: register.lua -msgid "Crafting Guide" -msgstr "Книга рецептов" - -#: register.lua -msgid "Set home position" -msgstr "Установить позицию дома" - -#: register.lua -#, lua-format -msgid "Home position set to: %s" -msgstr "Дом теперь расположен по коодинатам: %s" - -#: register.lua -msgid "You don't have the \"home\" privilege!" -msgstr "У вас нет привилегии \"home\"!" - -#: register.lua -msgid "Go home" -msgstr "Отправиться домой" - -#: register.lua -msgid "Set time to day" -msgstr "День" - -#: register.lua -msgid "Time of day set to 6am" -msgstr "Установлено время 6 утра" - -#: register.lua -#, fuzzy -msgid "You don't have the settime privilege!" -msgstr "Вам не разрешено устанавливать время! (нет привилегии \"settime\")" - -#: register.lua -msgid "Set time to night" -msgstr "Ночь" - -#: register.lua -msgid "Time of day set to 9pm" -msgstr "Установлено время 9 вечера" - -#: register.lua -msgid "Clear inventory" -msgstr "Очистить инвентарь" - -#: register.lua -msgid "" -"This button has been disabled outside of creative mode to prevent accidental " -"inventory trashing.\n" -"Use the trash slot instead." -msgstr "" -"Эта кнопка отключена вне творческого режима, чтобы предотвратить случайное " -"уничтожение предметов.\n" -"Используйте слот корзины вместо нее." - -#: register.lua -msgid "Inventory cleared!" -msgstr "Инвентарь очищен!" - -#: register.lua -msgid "Trash:" -msgstr "Мусор:" - -#: register.lua -msgid "Refill:" -msgstr "Наполнить:" - -#: register.lua -#, lua-format -msgid "Any item belonging to the %s group" -msgstr "Любой элемент из группы: %s" - -#: register.lua -#, lua-format -msgid "Any item belonging to the groups %s" -msgstr "Любой элемент из группы: %s" - -#: register.lua -#, lua-format -msgid "Recipe %d of %d" -msgstr "Рецепт %s из %s" - -#: register.lua -#, lua-format -msgid "Usage %d of %d" -msgstr "Вариант %d of %d" - -#: register.lua -msgid "No recipes" -msgstr "Рецептов нет" - -#: register.lua -msgid "No usages" -msgstr "Не используется" - -#: register.lua -msgid "Result" -msgstr "Результат" - -#: register.lua -msgid "Ingredient" -msgstr "Состав" - -#: register.lua -msgid "Show next recipe" -msgstr "Следующий рецепт" - -#: register.lua -msgid "Show next usage" -msgstr "Следующее использование" - -#: register.lua -msgid "Show previous recipe" -msgstr "Прошлый рецепт" - -#: register.lua -msgid "Show previous usage" -msgstr "Прошлая страница" - -#: register.lua -#, lua-format -msgid "%s (%s)" -msgstr "" - -#: register.lua -msgid "Give me:" -msgstr "Дай мне:" - -#: register.lua -msgid "" -"This recipe is too\n" -"large to be displayed." -msgstr "" -"Этот рецепт не\n" -"помещается в решетку." - -#: register.lua -msgid "To craft grid:" -msgstr "На решeтку крафта:" - -#: register.lua -msgid "All" -msgstr "Все" - -#: waypoints.lua -msgid "White" -msgstr "Белый" - -#: waypoints.lua -msgid "Yellow" -msgstr "Желтый" - -#: waypoints.lua -msgid "Red" -msgstr "Красный" - -#: waypoints.lua -msgid "Green" -msgstr "Зелёный" - -#: waypoints.lua -msgid "Blue" -msgstr "Синий" - -#: waypoints.lua -msgid "Waypoints" -msgstr "Путевые точки" - -#: waypoints.lua -#, lua-format -msgid "Select Waypoint #%d" -msgstr "Выбрать путевую точку №%d" - -#: waypoints.lua -#, lua-format -msgid "Waypoint %d" -msgstr "Путевая точка %d" - -#: waypoints.lua -msgid "Set waypoint to current location" -msgstr "Установить путевую точку по текущей позиции" - -#: waypoints.lua -msgid "invisible" -msgstr "невидимой" - -#: waypoints.lua -msgid "visible" -msgstr "видимой" - -#: waypoints.lua -msgid "Make waypoint @1" -msgstr "Сделать путевую точку @1" - -#: waypoints.lua -msgid "Disable" -msgstr "Выключить" - -#: waypoints.lua -msgid "Enable" -msgstr "Включить" - -#: waypoints.lua -msgid "@1 display of waypoint coordinates" -msgstr "@1 показ координат путевых точек" - -#: waypoints.lua -msgid "Change color of waypoint display" -msgstr "Поменять цвет путевой точки" - -#: waypoints.lua -msgid "Edit waypoint name" -msgstr "Переименовать путевую точку" - -#: waypoints.lua -msgid "Waypoint active" -msgstr "Путевая точка включена" - -#: waypoints.lua -msgid "Waypoint inactive" -msgstr "Путевая точка выключена" - -#: waypoints.lua -msgid "Finish editing" -msgstr "Закончить редакцию" - -#: waypoints.lua -msgid "World position" -msgstr "Позиция мира" - -#: waypoints.lua -msgid "Name" -msgstr "Имя" - -#: waypoints.lua -msgid "HUD text color" -msgstr "Цвет текста HUDа" diff --git a/locale/template.txt b/locale/template.txt new file mode 100644 index 0000000..fd931d8 --- /dev/null +++ b/locale/template.txt @@ -0,0 +1,90 @@ +# textdomain: unified_inventory +Mixing= +Cooking= +Digging= +Bags= +Bag @1= +Small Bag= +Medium Bag= +Large Bag= +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= + and = +Scroll categories left= +Scroll categories right= +Search= +Reset search and display everything= +First page= +Back three pages= +Back one page= +Forward one page= +Forward three pages= +Last page= +No matching items= +No matches.= +Page= +@1 of @2= +Filter= +Can use the creative inventory= +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= +Crafting Grid= +Crafting Guide= +Set home position= +Home position set to: @1= +You don't have the "home" privilege!= +Go home= +Set time to day= +Time of day set to 6am= +You don't have the settime privilege!= +Set time to night= +Time of day set to 9pm= +Clear inventory= +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!= +Trash:= +Refill:= +Any item belonging to the @1 group= +Any item belonging to the groups @1= +Recipe @1 of @2= +Usage @1 of @2= +No recipes= +No usages= +Result= +Ingredient= +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= +Give me:= +This recipe is too@@large to be displayed.= +To craft grid:= +All= +Crafting= +White= +Yellow= +Red= +Green= +Blue= +Waypoints= +Select Waypoint #@1= +Waypoint @1= +Set waypoint to current location= +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display= +Edit waypoint name= +Waypoint active= +Waypoint inactive= +Finish editing= +World position= +Name= +HUD text color= diff --git a/locale/tr.po b/locale/tr.po deleted file mode 100644 index 2b6211f..0000000 --- a/locale/tr.po +++ /dev/null @@ -1,360 +0,0 @@ -# Turkish translation for the unified_inventory mod. -# Copyright (C) 2018 Maciej Kasatkin (RealBadAngel) -# This file is distributed under the same license as the unified_inventory package. -# Mahmutelmas06@hotmail.com -# CodeXP , 2018. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: unified_inventory\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-04-02 13:41+0200\n" -"PO-Revision-Date: \n" -"Last-Translator: CodeXP \n" -"Language-Team: \n" -"Language: tr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: api.lua register.lua -msgid "Crafting" -msgstr "Üretim" - -#: api.lua -msgid "Mixing" -msgstr "Karıştırma" - -#: api.lua -msgid "Cooking" -msgstr "Pişirme" - -#: api.lua -msgid "Digging" -msgstr "Kazma" - -#: bags.lua -msgid "Bags" -msgstr "Çantalarım" - -#: bags.lua -msgid "Bag @1" -msgstr "@1. Çanta" - -#: bags.lua -msgid "Small Bag" -msgstr "Küçük Çanta" - -#: bags.lua -msgid "Medium Bag" -msgstr "Çanta" - -#: bags.lua -msgid "Large Bag" -msgstr "Büyük Çanta" - -#: group.lua -msgid " and " -msgstr " ve " - -#: internal.lua -msgid "First page" -msgstr "İlk Sayfa" - -#: internal.lua -msgid "Back three pages" -msgstr "3 Sayfa Gerile" - -#: internal.lua -msgid "Back one page" -msgstr "Geri" - -#: internal.lua -msgid "Forward one page" -msgstr "İleri" - -#: internal.lua -msgid "Forward three pages" -msgstr "3 Sayfa İlerile" - -#: internal.lua -msgid "Last page" -msgstr "Son Sayfa" - -#: internal.lua -msgid "Search" -msgstr "Ara" - -#: internal.lua -msgid "Reset search and display everything" -msgstr "" - -#: internal.lua -msgid "No matching items" -msgstr "Eşleşme yok" - -#: internal.lua -msgid "No matches." -msgstr "Eşleşme yok" - -#: internal.lua -msgid "Page" -msgstr "Sayfa" - -#: internal.lua -#, lua-format -msgid "%s of %s" -msgstr "%s dan %s" - -#: internal.lua -msgid "Filter" -msgstr "Süzgeç" - -#: register.lua -msgid "Can use the creative inventory" -msgstr "Yaratıcı envanteri kullanabilir" - -#: register.lua -msgid "" -"Forces Unified Inventory to be displayed in Full mode if Lite mode is " -"configured globally" -msgstr "" - -#: register.lua -msgid "Crafting Grid" -msgstr "Üretim tablosu" - -#: register.lua -msgid "Crafting Guide" -msgstr "Kılavuz" - -#: register.lua -msgid "Set home position" -msgstr "Set ev pozisyon" - -#: register.lua -#, lua-format -msgid "Home position set to: %s" -msgstr "Yeni eviniz: %s" - -#: register.lua -msgid "You don't have the \"home\" privilege!" -msgstr "\"home\" yetkiniz yok!" - -#: register.lua -msgid "Go home" -msgstr "Eve git" - -#: register.lua -msgid "Set time to day" -msgstr "Güne zaman ayarla" - -#: register.lua -msgid "Time of day set to 6am" -msgstr "Saat 06:00 olarak ayarlandı" - -#: register.lua -msgid "You don't have the settime privilege!" -msgstr "\"settime\" yetkiniz yok!" - -#: register.lua -msgid "Set time to night" -msgstr "Geceye zaman ayarla" - -#: register.lua -msgid "Time of day set to 9pm" -msgstr "Saat 19:00 olarak ayarlandı" - -#: register.lua -msgid "Clear inventory" -msgstr "" - -#: register.lua -msgid "" -"This button has been disabled outside of creative mode to prevent accidental " -"inventory trashing.\n" -"Use the trash slot instead." -msgstr "Yaratıcı modu dışında iken bu tuş kullanılamaz." - -#: register.lua -msgid "Inventory cleared!" -msgstr "Envanter temizlendi!" - -#: register.lua -msgid "Trash:" -msgstr "Çöp" - -#: register.lua -msgid "Refill:" -msgstr "Doldur" - -#: register.lua -#, lua-format -msgid "Any item belonging to the %s group" -msgstr "" - -#: register.lua -#, lua-format -msgid "Any item belonging to the groups %s" -msgstr "" - -#: register.lua -#, lua-format -msgid "Recipe %d of %d" -msgstr "%d dan %d tarifi" - -#: register.lua -#, lua-format -msgid "Usage %d of %d" -msgstr "Kullanım %d/%d" - -#: register.lua -msgid "No recipes" -msgstr "Tarifi yok" - -#: register.lua -msgid "No usages" -msgstr "Kullanım yok" - -#: register.lua -msgid "Result" -msgstr "Çıktı" - -#: register.lua -msgid "Ingredient" -msgstr "Bileşen" - -#: register.lua -msgid "Show next recipe" -msgstr "" - -#: register.lua -msgid "Show next usage" -msgstr "" - -#: register.lua -msgid "Show previous recipe" -msgstr "" - -#: register.lua -msgid "Show previous usage" -msgstr "" - -#: register.lua -#, lua-format -msgid "%s (%s)" -msgstr "" - -#: register.lua -msgid "Give me:" -msgstr "Ver bana:" - -#: register.lua -msgid "" -"This recipe is too\n" -"large to be displayed." -msgstr "" - -#: register.lua -#, fuzzy -msgid "To craft grid:" -msgstr "Üretim tablosuna kopyala" - -#: register.lua -msgid "All" -msgstr "Tümü" - -#: waypoints.lua -msgid "White" -msgstr "Beyaz" - -#: waypoints.lua -msgid "Yellow" -msgstr "Sarı" - -#: waypoints.lua -msgid "Red" -msgstr "Kırmızı" - -#: waypoints.lua -msgid "Green" -msgstr "Yeşil" - -#: waypoints.lua -msgid "Blue" -msgstr "Mavi" - -#: waypoints.lua -msgid "Waypoints" -msgstr "Konum Noktaları" - -#: waypoints.lua -#, lua-format -msgid "Select Waypoint #%d" -msgstr "#%d konum noktası seç" - -#: waypoints.lua -#, lua-format -msgid "Waypoint %d" -msgstr "%d Konum Noktaları" - -#: waypoints.lua -msgid "Set waypoint to current location" -msgstr "Bulunduğun noktayı işaretle" - -#: waypoints.lua -msgid "invisible" -msgstr "görünmez" - -#: waypoints.lua -msgid "visible" -msgstr "görünür" - -#: waypoints.lua -msgid "Make waypoint @1" -msgstr "Yol noktası @1" - -#: waypoints.lua -msgid "Disable" -msgstr "" - -#: waypoints.lua -msgid "Enable" -msgstr "" - -#: waypoints.lua -msgid "@1 display of waypoint coordinates" -msgstr "Yol noktası koordinatlarının görüntülenmesini @1" - -#: waypoints.lua -msgid "Change color of waypoint display" -msgstr "Konum Gösterge Rengi" - -#: waypoints.lua -msgid "Edit waypoint name" -msgstr "Konum Noktasını Düzenle" - -#: waypoints.lua -msgid "Waypoint active" -msgstr "Konum Etkin" - -#: waypoints.lua -msgid "Waypoint inactive" -msgstr "Konum Devredışı" - -#: waypoints.lua -msgid "Finish editing" -msgstr "Düzenleme bitti" - -#: waypoints.lua -msgid "World position" -msgstr "Dünya konumu" - -#: waypoints.lua -msgid "Name" -msgstr "İsim" - -#: waypoints.lua -msgid "HUD text color" -msgstr "Metin rengi" diff --git a/locale/unified_inventory.de.tr b/locale/unified_inventory.de.tr new file mode 100644 index 0000000..474049c --- /dev/null +++ b/locale/unified_inventory.de.tr @@ -0,0 +1,100 @@ +# textdomain: unified_inventory +Mixing=Mischen +Cooking=Kochen +Digging=Graben +Bags=Taschen +Bag @1=Tasche @1 +Small Bag=Kleine Tasche +Medium Bag=Mittelgroße Tasche +Large Bag=Große Tasche +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= + and = und +Scroll categories left= +Scroll categories right= +Search=Suchen +Reset search and display everything=Suche zurücksetzen und alles anzeigen +First page=Erste Seite +Back three pages=3 Seiten zurückblättern +Back one page=1 Seite zurückblättern +Forward one page=1 Seite vorblättern +Forward three pages=3 Seiten vorblättern +Last page=Letzte Seite +No matching items=Keine passenden Gegenstände +No matches.=Keine Treffer +Page=Seite +@1 of @2=@1 von @2 +Filter=Filter +Can use the creative inventory=Kann das Kreativinventar nutzen +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Zwingt Unified Inventory, im Vollmodus angezeigt zu werden, wenn der Minimalmodus global eingestellt ist +Crafting Grid=Fertigungsraster +Crafting Guide=Fertigungsführer +Set home position=Heimatposition setzen +Home position set to: @1=Heimatposition nach @1 gesetzt +You don't have the "home" privilege!=Du hast das „home“-Privileg nicht! +Go home=Nach Hause gehen +Set time to day=Zur Tageszeit wechseln +Time of day set to 6am=Tageszeit auf 6 Uhr gesetzt +You don't have the settime privilege!=Du hast das „settime“-Privileg nicht! +Set time to night=Zur Nachtzeit wechseln +Time of day set to 9pm=Tageszeit auf 21 Uhr gesetzt +Clear inventory=Inventar leeren +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=Inventar geleert! +Trash:=Müll: +Refill:=Nachfüllen: +Any item belonging to the @1 group=Irgendein Gegenstand, der zur Gruppe @1 gehört +Any item belonging to the groups @1=Irgendein Gegenstand, der zu den Gruppen @1 gehört +Recipe @1 of @2=Rezept @1 von @2 +Usage @1 of @2=Verwendung @1 von @2 +No recipes=Keine Rezepte +No usages=Keine Verwendungen +Result=Ergebnis +Ingredient=Zutat +Show next recipe=Nächstes Rezept zeigen +Show next usage=Nächste Verwendung zeigen +Show previous recipe=Vorheriges Rezept zeigen +Show previous usage=Vorherige Verwendung zeigen +@1 (@2)= +Give me:=Gib mir: +This recipe is too@@large to be displayed.= +To craft grid:=Ins Fertigungsraster: +All=Alles +Crafting=Fertigung +White=Weiß +Yellow=Gelb +Red=Rot +Green=Grün +Blue=Blau +Waypoints=Wegpunkte +Select Waypoint #@1=Wegpunkt Nr. @1 auswählen +Waypoint @1=Wegpunkt Nr. @1 +Set waypoint to current location=Setze Wegpunkt zur derzeitigen Position +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=Farbe der Darstellung der Wegpunkte ändern +Edit waypoint name=Name des Wegpunkts ändern +Waypoint active=Wegpunkt aktiv +Waypoint inactive=Wegpunkt inaktiv +Finish editing=Bearbeitung abschließen +World position=Weltposition +Name=Name +HUD text color=HUD-Textfarbe + + +##### not used anymore ##### + +invisible=unsichtbar +visible=sichtbar +Make waypoint @1=Wegpunkt @1 machen +Disable=ausschalten +Enable=einschalten +@1 display of waypoint coordinates=Anzeige der Wegpunktkoordinaten @1 diff --git a/locale/unified_inventory.es.tr b/locale/unified_inventory.es.tr new file mode 100644 index 0000000..85a794e --- /dev/null +++ b/locale/unified_inventory.es.tr @@ -0,0 +1,108 @@ +# textdomain: unified_inventory +# api.lua +Mixing=Mezclar +Cooking=Hornear +Digging=Recoger +# bags.lua +Bags=Bolsos +Bag @1=Bolso @1 +Small Bag=Bolso Pequeño +Medium Bag=Bolso Mediano +Large Bag=Bolso Grande +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= +# group.lua + and = y +Scroll categories left= +Scroll categories right= +Search=Buscar +Reset search and display everything=Limpiar la busqueda y mostrar todo +# internal.lua +First page=Primera página +Back three pages=Volver tres páginas +Back one page=Volver una página +Forward one page=Avanzar una página +Forward three pages=Avanzar tres páginas +Last page=Ultima Pagina +No matching items=No se encontraron elementos +No matches.=No hay resultados. +Page=Página +@1 of @2=@1 de @2 +Filter=Filtro +# register.lua +Can use the creative inventory=Puede usar el inventario creativo +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Obliga al Inventario Unificado a mostrarse en modo Completo si el modo Simple está configurado globalmente +Crafting Grid=Cuadricula de Elaboración +Crafting Guide=Guía de Elaboración +Set home position=Establecer posición de la casa +Home position set to: @1=Posición de la casa cambiada a: @1 +You don't have the "home" privilege!= +Go home=Ir a casa +Set time to day=Cambiar a dia +Time of day set to 6am=Hora del día cambiada a 6 AM +You don't have the settime privilege!=¡No tienes el privilegio "settime"! +Set time to night=Cambiar a noche +Time of day set to 9pm=Hora del día cambiada a 9 PM +Clear inventory=Limpiar inventario +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=¡Inventario limpio! +Trash:=Basura: +Refill:=Rellenar: +Any item belonging to the @1 group=Cualquier elemento que pertenezca al grupo @1 +Any item belonging to the groups @1=Cualquier elemento perteneciente a los grupos @1 +Recipe @1 of @2=Receta @1 de @2 +Usage @1 of @2=Uso @1 de @2 +No recipes=No tiene receta +No usages=No tiene uso +Result=Resultado +Ingredient=Ingrediente +Show next recipe=Mostrar la siguiente receta +Show next usage=Mostrar el siguiente uso +Show previous recipe=Mostrar la receta anterior +Show previous usage=Mostrar el uso anterior +@1 (@2)=@1 (@2) +Give me:=Dame: +This recipe is too@@large to be displayed.= +To craft grid:=Construir: +All=Todos +Crafting=Elaboración +White=Blanco +Yellow=Amarillo +Red=Rojo +Green=Verde +Blue=Azul +Waypoints=Puntos +Select Waypoint #@1=Seleccionar Punto #@1 +Waypoint @1=Punto @1 +Set waypoint to current location=Establecer el punto a la ubicación actual +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=Cambiar el color del punto +Edit waypoint name=Editar nombre del punto +Waypoint active=Punto activo +Waypoint inactive=Punto inactivo +Finish editing=Terminar edición +World position=Posición en el mundo +Name=Nombre +HUD text color=Color del texto de la Interfaz + + +##### not used anymore ##### + +Make waypoint @1=Hacer punto @1 +invisible=invisible +visible=visible +@1 display of waypoint coordinates=Visualizar coordenadas del punto @1 +Disable=Deshabilitado +Enable=Habilitado +You don't have the \"home\" privilege!=¡No tienes el privilegio \"home\"! +This button has been disabled outside=Este botón ha sido deshabilitado +This recipe is too@nlarge to be displayed.=Esta receta es demasiado@ngrande para ser mostrada. diff --git a/locale/unified_inventory.fr.tr b/locale/unified_inventory.fr.tr new file mode 100644 index 0000000..96d8c3f --- /dev/null +++ b/locale/unified_inventory.fr.tr @@ -0,0 +1,96 @@ +# textdomain: unified_inventory +Mixing= +Cooking=Cuisson +Digging=Creuser +Bags=Sacs +Bag @1=Sac @1 +Small Bag=Petit sac +Medium Bag=Sac moyen +Large Bag=Grand sac +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= + and = et +Scroll categories left= +Scroll categories right= +Search=Rechercher +Reset search and display everything= +First page=1ère page +Back three pages=3 pages en arrière +Back one page=Page précédente +Forward one page=Page suivante +Forward three pages=3 pages en avant +Last page=Dernière page +No matching items=Aucun élément correspondant +No matches.=Aucun match +Page=Page +@1 of @2=@1 de @2 +Filter=Filtre +Can use the creative inventory=Vous pouvez utiliser l'inventaire créatif +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= +Crafting Grid=Grille de création +Crafting Guide=Guide de création +Set home position=Position dans le monde +Home position set to: @1=Position de votre base fixée à: @1 +You don't have the "home" privilege!=Vous n'avez pas le privilège "home"! +Go home= +Set time to day= +Time of day set to 6am=Heure fixée à 6h +You don't have the settime privilege!=Vous n'avez pas le privilège "settime"! +Set time to night= +Time of day set to 9pm=Heure fixée à 21h +Clear inventory= +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=Inventaire vidé ! +Trash:=Poubelle : +Refill:=Remplir : +Any item belonging to the @1 group= +Any item belonging to the groups @1= +Recipe @1 of @2=Recette @1 de @2 +Usage @1 of @2= +No recipes= +No usages= +Result=Résultat +Ingredient= +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= +Give me:= +This recipe is too@@large to be displayed.= +To craft grid:=Sur de création: +All=Tout +Crafting=Création +White=Blanc +Yellow=Jaune +Red=Rouge +Green=Vert +Blue=Bleu +Waypoints=Point de passage +Select Waypoint #@1=Choisir un point de passage #@1 +Waypoint @1=Point de passage @1 +Set waypoint to current location=Marquer un point de passage à la position actuelle +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=Changer la couleur du point de passage +Edit waypoint name=Editer le nom du point de passage +Waypoint active=Point de passage actif +Waypoint inactive=Point de passage inactif +Finish editing=Terminer l'édition +World position=Position dans le monde +Name=Nom +HUD text color=Couleur de texte du HUD + + +##### not used anymore ##### + +Make waypoint @1=Rendre @1 le point de passage +@1 display of waypoint coordinates=@1 montrer les coordonnées des points de passages diff --git a/locale/unified_inventory.it.tr b/locale/unified_inventory.it.tr new file mode 100644 index 0000000..c30d9e0 --- /dev/null +++ b/locale/unified_inventory.it.tr @@ -0,0 +1,100 @@ +# textdomain: unified_inventory +Mixing=Unione +Cooking=Cottura +Digging=Scavo +Bags=Borse +Bag @1=Borsa @1 +Small Bag=Borsa piccola +Medium Bag=Borsa media +Large Bag=Borsa grande +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= + and = e +Scroll categories left= +Scroll categories right= +Search=Cerca +Reset search and display everything=Azzera la ricerca e mostra tutto +First page=Prima pagina +Back three pages=Indietro di tre pagine +Back one page=Indietro di una pagina +Forward one page=Avanti di una pagina +Forward three pages=Avanti di tre pagine +Last page=Ultima pagina +No matching items=Nessun oggetto corrispondente +No matches.=Nessuna corrispondenza. +Page=Pagina +@1 of @2=@1 di @2 +Filter=Filtro +Can use the creative inventory=Può usare l'inventario creativo +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Forza la visualizzazione di Unified Inventory in modalità completa se è configurata globalmente la visualizzazione semplice +Crafting Grid=Griglia di assemblaggio +Crafting Guide=Guida di assemblaggio +Set home position=Imposta la residenza +Home position set to: @1=Residenza impostata su: @1 +You don't have the "home" privilege!=Non hai il privilegio "home"! +Go home=Torna a casa +Set time to day=Imposta l'orario sul giorno +Time of day set to 6am=Orario impostato sulle 6am +You don't have the settime privilege!=Non hai il privilegio "time"! +Set time to night=Imposta l'orario sulla notte +Time of day set to 9pm=Orario impostato sulle 9am +Clear inventory=Ripulisci l'inventario +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=Inventario ripulito! +Trash:=Butta: +Refill:=Riempi: +Any item belonging to the @1 group=Qualunque oggetto appartenente al gruppo @1 +Any item belonging to the groups @1=Qualunque oggetto appartenente ai gruppi @1 +Recipe @1 of @2=Ricetta @1 di @2 +Usage @1 of @2=Uso @1 di @2 +No recipes=Nessuna ricetta +No usages=Nessun utilizzo +Result=Risultato +Ingredient=Ingrediente +Show next recipe=Mostra la prossima ricetta +Show next usage=Mostra il prossimo utilizzo +Show previous recipe=Mostra la ricetta precedente +Show previous usage=Mostra l'utilizzo precedente +@1 (@2)= +Give me:=Dammi: +This recipe is too@@large to be displayed.= +To craft grid:=Alla griglia di assemblaggio: +All=Tutto +Crafting=Assemblaggio +White=Bianco +Yellow=Giallo +Red=Rosso +Green=Verde +Blue=Blu +Waypoints=Tappe +Select Waypoint #@1=Seleziona tappa n°@1 +Waypoint @1=Tappa @1 +Set waypoint to current location=Imposta tappa alla posizione attuale +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=Modifica il colore della visualizzazione della tappa +Edit waypoint name=Modifica il nome della tappa +Waypoint active=Tappa attiva +Waypoint inactive=Tappa inattiva +Finish editing=Termina la modifica +World position=Posizione del mondo +Name=Nome +HUD text color=Colore del testo del visore + + +##### not used anymore ##### + +invisible=invisibile +visible=visibile +Make waypoint @1=Crea tappa @1 +Disable=Disabilita +Enable=Abilita +@1 display of waypoint coordinates=@1 la visualizzazione delle coordinate della tappa diff --git a/locale/unified_inventory.ms.tr b/locale/unified_inventory.ms.tr new file mode 100644 index 0000000..be4eb5e --- /dev/null +++ b/locale/unified_inventory.ms.tr @@ -0,0 +1,100 @@ +# textdomain: unified_inventory +Mixing=Pencampuran +Cooking=Pemasakan +Digging=Penggalian +Bags=Beg +Bag @1=Beg @1 +Small Bag=Beg Kecil +Medium Bag=Beg Sederhana +Large Bag=Beg Besar +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= + and = dan +Scroll categories left= +Scroll categories right= +Search=Cari +Reset search and display everything=Set semula carian dan tunjukkan semua benda +First page=Halaman pertama +Back three pages=Tiga halaman sebelumnya +Back one page=Halaman sebelumnya +Forward one page=Halaman seterusnya +Forward three pages=Tiga halaman seterusnya +Last page=Halaman terakhir +No matching items=Tiada item sepadan +No matches.=Tiada padanan. +Page=Halaman +@1 of @2=@1 drpd @2 +Filter=Tapis +Can use the creative inventory=Boleh guna inventori kreatif +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= +Crafting Grid=Grid Pertukangan +Crafting Guide=Panduan Pertukangan +Set home position=Tetapkan kedudukan rumah +Home position set to: @1=Kedudukan rumah ditetapkan ke: @1 +You don't have the "home" privilege!=Anda tidak ada keistimewaan "home"! +Go home=Balik rumah +Set time to day=Tetapkan masa jadi siang +Time of day set to 6am=Masa ditetapkan ke 6 pagi +You don't have the settime privilege!=Anda tidak ada keistimewaan settime! +Set time to night=Tetapkan masa jadi malam +Time of day set to 9pm=Masa ditetapkan ke 9 malam +Clear inventory=Kosongkan inventori +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=Inventori dikosongkan! +Trash:=Buang: +Refill:=Isi balik: +Any item belonging to the @1 group=Sebarang item dari kumpulan @1 +Any item belonging to the groups @1=Sebarang item dari kumpulan @1 +Recipe @1 of @2=Resipi @1 drpd @2 +Usage @1 of @2=Kegunaan @1 drpd @2 +No recipes=Tiada resipi +No usages=Tiada kegunaan +Result=Hasil +Ingredient=Bahan +Show next recipe=Tunjuk resipi seterusnya +Show next usage=Tunjuk kegunaan seterusnya +Show previous recipe=Tunjuk resipi sebelumnya +Show previous usage=Tunjuk kegunaan sebelumnya +@1 (@2)=@1 (@2) +Give me:=Beri saya: +This recipe is too@@large to be displayed.= +To craft grid:=Ke grid pertukangan: +All= +Crafting=Pertukangan +White=Putih +Yellow=Kuning +Red=Merah +Green=Hijau +Blue=Biru +Waypoints=Titik Arah +Select Waypoint #@1=Pilih Titik Arah #@1 +Waypoint @1=Titik Arah @1 +Set waypoint to current location=Tetapkan titik arah ke lokasi semasa +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=Tukar warna paparan titik arah +Edit waypoint name=Edit nama titik arah +Waypoint active=Titik arah aktif +Waypoint inactive=Titik arah tidak aktif +Finish editing=Selesai edit +World position=Kedudukan dunia +Name=Nama +HUD text color=Warna tulisan HUD + + +##### not used anymore ##### + +invisible=Sembunyikan +visible=Paparkan +Make waypoint @1=@1 titik arah +Disable=Sembunyikan +Enable=Paparkan +@1 display of waypoint coordinates=@1 koordinat untuk titik arah diff --git a/locale/unified_inventory.pl.tr b/locale/unified_inventory.pl.tr new file mode 100644 index 0000000..69d39e3 --- /dev/null +++ b/locale/unified_inventory.pl.tr @@ -0,0 +1,98 @@ +# textdomain: unified_inventory +Mixing= +Cooking= +Digging= +Bags=Plecaki +Bag @1=Plecak @1 +Small Bag=Maly plecak +Medium Bag=Sredni plecak +Large Bag=Duzy plecak +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= + and = i +Scroll categories left= +Scroll categories right= +Search=Szukaj +Reset search and display everything= +First page=Pierwsza strona +Back three pages=3 strony w tyl +Back one page=1 strona w tyl +Forward one page=1 strona do przodu +Forward three pages=3 strony do przodu +Last page=Ostatnia strona +No matching items=Brak pasujacych przedmiotow +No matches.=Brak wyników +Page=Strona +@1 of @2=@1 z @2 +Filter=Filtr +Can use the creative inventory= +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= +Crafting Grid= +Crafting Guide= +Set home position=Ustaw pozycję wyjściową +Home position set to: @1=Pozycja domowa ustawiona na: @1 +You don't have the "home" privilege!=Nie masz uprawnien do zmiany czasu "home"! +Go home=Idź do domu +Set time to day=Ustaw czas na dzień +Time of day set to 6am=Czas ustawiony na 6:00 +You don't have the settime privilege!=Nie masz uprawnien do zmiany czasu "settime"! +Set time to night=Ustaw czas na noc +Time of day set to 9pm=Czas ustawiony na 21:00 +Clear inventory=Wyczyść zapasy +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=Zapasy zostały wyczyszczone! +Trash:=Smietnik: +Refill:=Uzupelnianie: +Any item belonging to the @1 group= +Any item belonging to the groups @1= +Recipe @1 of @2=Recepta @1 z @2 +Usage @1 of @2=Użycie @1 z @2 +No recipes=Brak recepty +No usages=Bez użycia +Result=Wynik +Ingredient=Składnik +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= +Give me:=Daj mi: +This recipe is too@@large to be displayed.= +To craft grid:= +All=Wszystko +Crafting= +White=Bialy +Yellow=Zolty +Red=Czerwony +Green=Zielony +Blue=Niebieski +Waypoints=Punkty orientacyjne +Select Waypoint #@1=Wybierz punkt #@1 +Waypoint @1=Punkty orientacyjne @1 +Set waypoint to current location=Ustaw punkt orientacyjny na biezacej pozycji +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=Zmien kolor punktu +Edit waypoint name=Edytuj nazwe punktu +Waypoint active=Punkt wlaczony +Waypoint inactive=Punkt wylaczony +Finish editing=Zakoncz edycje +World position=Pozycja +Name=Nazwa +HUD text color=Kolor tekstu HUD + + +##### not used anymore ##### + +invisible=niewidzialny +visible=widomy +Make waypoint @1=Robić punkt @1 +@1 display of waypoint coordinates=@1 koordynatow punktu diff --git a/locale/unified_inventory.pt.tr b/locale/unified_inventory.pt.tr new file mode 100644 index 0000000..5fedbc0 --- /dev/null +++ b/locale/unified_inventory.pt.tr @@ -0,0 +1,98 @@ +# textdomain: unified_inventory +Mixing=Muistura +Cooking=Cozimento +Digging=Escavação +Bags=Bolsas +Bag @1=Bolsa @1 +Small Bag=Bolsa Pequena +Medium Bag=Bolsa Média +Large Bag=Bolsa Grande +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= + and = e +Scroll categories left= +Scroll categories right= +Search=Pesquisar +Reset search and display everything=Redefinir pesquisa e exibir tudo +First page=Primeira Página +Back three pages=Voltar 3 Páginas +Back one page=Voltar 1 Página +Forward one page=Avançar 1 Página +Forward three pages=Avançar 3 Páginas +Last page=Ultima Página +No matching items=Nenhum item correspondente +No matches.=Sem correspondências +Page=Página +@1 of @2=@1 de @2 +Filter=Filtro +Can use the creative inventory=Pode usar o inventário do criativo +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= +Crafting Grid=Grade de Artesanato +Crafting Guide=Guia de Artesanato +Set home position=Definir posição de casa +Home position set to: @1=Posição inicial definida para: @1 +You don't have the "home" privilege!=Você não tem o privilégio de "home"! +Go home=Transportar para Casa +Set time to day=Definir turno para dia +Time of day set to 6am=Hora do dia definida para 06h +You don't have the settime privilege!=Você não tem o privilégio de "settime"! +Set time to night=Definir turno para noite +Time of day set to 9pm=Hora do dia ajustada para 21h +Clear inventory=Limpar Inventário +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=Inventário Apagado! +Trash:=Lixo: +Refill:=Recarga: +Any item belonging to the @1 group=Qualquer item pertencente ao grupo '@1'. +Any item belonging to the groups @1=Qualquer item pertencente aos grupos '@1'. +Recipe @1 of @2=Receita @1 de @2 +Usage @1 of @2=Utilização @1 de @2 +No recipes=Sem Receita +No usages=Sem Utilização +Result=Resultado +Ingredient=Ingrediente +Show next recipe=Exibir Próxima Receita +Show next usage=Mostrar Próxima Utilização +Show previous recipe=Exibir Receita Anterior +Show previous usage=Exibir Utilização Anterior +@1 (@2)= +Give me:=Gerado: +This recipe is too@@large to be displayed.= +To craft grid:=Para Grade de Artesanato +All=MAX +Crafting=Artesanato +White=Branco +Yellow=Amarelo +Red=Vermelho +Green=Verde +Blue=Azul +Waypoints=Apontador de Direção +Select Waypoint #@1=Seleção de Apontador de Direção #@1 +Waypoint @1=Apontador de Direção @1 +Set waypoint to current location=Configurar localização atual do Apontador de Direção +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=Mudar cor exibida do Apontador de Direção +Edit waypoint name=Editar Nome de Apontador de Direção +Waypoint active=Apontador de Direção Ativo +Waypoint inactive=Apontador de Direção Inativo +Finish editing=Edição Finalizada +World position=Posição Mundial +Name=Nome +HUD text color=Cor de HUD + + +##### not used anymore ##### + +invisible=invisível +visible=visível +Make waypoint @1=Fazer Apontador de Direção @1 +@1 display of waypoint coordinates=@1 exibição de coordenadas de Fazer Apontador de Direção diff --git a/locale/unified_inventory.ru.tr b/locale/unified_inventory.ru.tr new file mode 100644 index 0000000..2e3489c --- /dev/null +++ b/locale/unified_inventory.ru.tr @@ -0,0 +1,100 @@ +# textdomain: unified_inventory +Mixing=Мешать +Cooking=Варить +Digging=Копать +Bags=Сумки +Bag @1=Сумка @1 +Small Bag=Малая сумка +Medium Bag=Средняя сумка +Large Bag=Большая сумка +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= + and = и +Scroll categories left= +Scroll categories right= +Search=Поиск +Reset search and display everything=Сброс поиска, показать всё +First page=Первая страница +Back three pages=3 страницы назад +Back one page=1 страницу назад +Forward one page=1 страницу вперёд +Forward three pages=3 страницы вперёд +Last page=Последняя страница +No matching items=Нет подходящих элементов +No matches.=Ничего не найдено +Page=Страница +@1 of @2=@1 из @2 +Filter=Фильтр +Can use the creative inventory=Можно использовать инвентарь творческого режима +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= +Crafting Grid=Решетка крафта +Crafting Guide=Книга рецептов +Set home position=Установить позицию дома +Home position set to: @1=Дом теперь расположен по коодинатам: @1 +You don't have the "home" privilege!=У вас нет привилегии "home"! +Go home=Отправиться домой +Set time to day=День +Time of day set to 6am=Установлено время 6 утра +You don't have the settime privilege!=Вам не разрешено устанавливать время! (нет привилегии "settime") +Set time to night=Ночь +Time of day set to 9pm=Установлено время 9 вечера +Clear inventory=Очистить инвентарь +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=Инвентарь очищен! +Trash:=Мусор: +Refill:=Наполнить: +Any item belonging to the @1 group=Любой элемент из группы: @1 +Any item belonging to the groups @1=Любой элемент из группы: @1 +Recipe @1 of @2=Рецепт @1 из @2 +Usage @1 of @2=Вариант @1 of @2 +No recipes=Рецептов нет +No usages=Не используется +Result=Результат +Ingredient=Состав +Show next recipe=Следующий рецепт +Show next usage=Следующее использование +Show previous recipe=Прошлый рецепт +Show previous usage=Прошлая страница +@1 (@2)= +Give me:=Дай мне: +This recipe is too@@large to be displayed.= +To craft grid:=На решeтку крафта: +All=Все +Crafting=Крафт +White=Белый +Yellow=Желтый +Red=Красный +Green=Зелёный +Blue=Синий +Waypoints=Путевые точки +Select Waypoint #@1=Выбрать путевую точку №@1 +Waypoint @1=Путевая точка @1 +Set waypoint to current location=Установить путевую точку по текущей позиции +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=Поменять цвет путевой точки +Edit waypoint name=Переименовать путевую точку +Waypoint active=Путевая точка включена +Waypoint inactive=Путевая точка выключена +Finish editing=Закончить редакцию +World position=Позиция мира +Name=Имя +HUD text color=Цвет текста HUDа + + +##### not used anymore ##### + +invisible=невидимой +visible=видимой +Make waypoint @1=Сделать путевую точку @1 +Disable=Выключить +Enable=Включить +@1 display of waypoint coordinates=@1 показ координат путевых точек diff --git a/locale/unified_inventory.tr.tr b/locale/unified_inventory.tr.tr new file mode 100644 index 0000000..b4e15b8 --- /dev/null +++ b/locale/unified_inventory.tr.tr @@ -0,0 +1,99 @@ +# textdomain: unified_inventory +Mixing=Karıştırma +Cooking=Pişirme +Digging=Kazma +Bags=Çantalarım +Bag @1=@1. Çanta +Small Bag=Küçük Çanta +Medium Bag=Çanta +Large Bag=Büyük Çanta +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= + and = ve +Scroll categories left= +Scroll categories right= +Search=Ara +Reset search and display everything= +First page=İlk Sayfa +Back three pages=3 Sayfa Gerile +Back one page=Geri +Forward one page=İleri +Forward three pages=3 Sayfa İlerile +Last page=Son Sayfa +No matching items=Eşleşme yok +No matches.=Eşleşme yok +Page=Sayfa +@1 of @2=@1 dan @2 +Filter=Süzgeç +Can use the creative inventory=Yaratıcı envanteri kullanabilir +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= +Crafting Grid=Üretim tablosu +Crafting Guide=Kılavuz +Set home position=Set ev pozisyon +Home position set to: @1=Yeni eviniz: @1 +You don't have the "home" privilege!="home" yetkiniz yok! +Go home=Eve git +Set time to day=Güne zaman ayarla +Time of day set to 6am=Saat 06:00 olarak ayarlandı +You don't have the settime privilege!="settime" yetkiniz yok! +Set time to night=Geceye zaman ayarla +Time of day set to 9pm=Saat 19:00 olarak ayarlandı +Clear inventory= +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=Envanter temizlendi! +Trash:=Çöp +Refill:=Doldur +Any item belonging to the @1 group= +Any item belonging to the groups @1= +Recipe @1 of @2=@1 dan @2 tarifi +Usage @1 of @2=Kullanım @1/@2 +No recipes=Tarifi yok +No usages=Kullanım yok +Result=Çıktı +Ingredient=Bileşen +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= +Give me:=Ver bana: +This recipe is too@@large to be displayed.= +To craft grid:=Üretim tablosuna kopyala +All=Tümü +Crafting=Üretim +White=Beyaz +Yellow=Sarı +Red=Kırmızı +Green=Yeşil +Blue=Mavi +Waypoints=Konum Noktaları +Select Waypoint #@1=#@1 konum noktası seç +Waypoint @1=@1 Konum Noktaları +Set waypoint to current location=Bulunduğun noktayı işaretle +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=Konum Gösterge Rengi +Edit waypoint name=Konum Noktasını Düzenle +Waypoint active=Konum Etkin +Waypoint inactive=Konum Devredışı +Finish editing=Düzenleme bitti +World position=Dünya konumu +Name=İsim +HUD text color=Metin rengi + + +##### not used anymore ##### + +msgid ""=Yaratıcı modu dışında iken bu tuş kullanılamaz. +invisible=görünmez +visible=görünür +Make waypoint @1=Yol noktası @1 +@1 display of waypoint coordinates=Yol noktası koordinatlarının görüntülenmesini @1 diff --git a/locale/unified_inventory.zh_CN.tr b/locale/unified_inventory.zh_CN.tr new file mode 100644 index 0000000..595a492 --- /dev/null +++ b/locale/unified_inventory.zh_CN.tr @@ -0,0 +1,98 @@ +# textdomain: unified_inventory +Mixing=混合 +Cooking=烹饪 +Digging=挖出 +Bags=背包 +Bag @1=背包@1 +Small Bag=小背包 +Medium Bag=中背包 +Large Bag=大背包 +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= + and = 和 +Scroll categories left= +Scroll categories right= +Search=搜索 +Reset search and display everything=重置搜索并显示所有物品 +First page=第一页 +Back three pages=后退三页 +Back one page=后退一页 +Forward one page=前进一页 +Forward three pages=前进三页 +Last page=最后一页 +No matching items=没有匹配物品 +No matches.=没有匹配 +Page=页面 +@1 of @2=第@1页,共@2页 +Filter=过滤器 +Can use the creative inventory=可以使用创造背包 +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= +Crafting Grid=合成表 +Crafting Guide=合成指南 +Set home position=设置家的位置 +Home position set to: @1=家的位置设置到: @1 +You don't have the "home" privilege!=你没有“home”权限! +Go home=回家 +Set time to day=设置时间到白天 +Time of day set to 6am=时间设置到早晨6点 +You don't have the settime privilege!=你没有“settime”权限! +Set time to night=设置时间到晚上 +Time of day set to 9pm=时间设置到晚上9点 +Clear inventory=清空背包 +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=清空背包 +Trash:=丢弃: +Refill:=填满: +Any item belonging to the @1 group=属于@1组的任何项目 +Any item belonging to the groups @1=属于组@1的任何项目 +Recipe @1 of @2=第@1配方,共@2个 +Usage @1 of @2=第@1用法,共@2个 +No recipes=没有配方 +No usages=没有用法 +Result=结果 +Ingredient=原料 +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= +Give me:=给予: +This recipe is too@@large to be displayed.= +To craft grid:=填充物品到合成表 +All=全部 +Crafting=合成 +White=白 +Yellow=黄 +Red=红 +Green=绿 +Blue=蓝 +Waypoints=航路点 +Select Waypoint #@1=查询航路点 #@1 +Waypoint @1=航路点 @1 +Set waypoint to current location=将航路点设置到当前位置 +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=改变航路点显示的颜色 +Edit waypoint name=编辑航路点名称 +Waypoint active=航路点已激活 +Waypoint inactive=航路点未激活 +Finish editing=完成编辑 +World position=世界位置 +Name=名称 +HUD text color=HUD文本颜色 + + +##### not used anymore ##### + +invisible=不可见的 +visible=可见的 +Make waypoint @1=设置航路点 @1 +@1 display of waypoint coordinates=显示航路点@1坐标 diff --git a/locale/unified_inventory.zh_TW.tr b/locale/unified_inventory.zh_TW.tr new file mode 100644 index 0000000..f41190c --- /dev/null +++ b/locale/unified_inventory.zh_TW.tr @@ -0,0 +1,98 @@ +# textdomain: unified_inventory +Mixing=混合 +Cooking=烹飪 +Digging=挖出 +Bags=揹包 +Bag @1=揹包@1 +Small Bag=小揹包 +Medium Bag=中揹包 +Large Bag=大揹包 +All Items= +Misc. Items= +Plant Life= +Building Materials= +Tools= +Minerals and Metals= +Environment and Worldgen= +Lighting= + and = 和 +Scroll categories left= +Scroll categories right= +Search=搜索 +Reset search and display everything=重置搜索並顯示所有物品 +First page=第一頁 +Back three pages=後退三頁 +Back one page=後退一頁 +Forward one page=前進一頁 +Forward three pages=前進三頁 +Last page=最後一頁 +No matching items=沒有匹配物品 +No matches.=沒有匹配 +Page=頁面 +@1 of @2=第@1頁,共@2頁 +Filter=過濾器 +Can use the creative inventory=可以使用創造揹包 +Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= +Crafting Grid=合成表 +Crafting Guide=合成指南 +Set home position=設置家的位置 +Home position set to: @1=家的位置設置到: @1 +You don't have the "home" privilege!=你沒有“home”權限! +Go home=回家 +Set time to day=設置時間到白天 +Time of day set to 6am=時間設置到早晨6點 +You don't have the settime privilege!=你沒有“settime”權限! +Set time to night=設置時間到晚上 +Time of day set to 9pm=時間設置到晚上9點 +Clear inventory=清空揹包 +This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= +Inventory cleared!=清空揹包 +Trash:=丟棄: +Refill:=填滿: +Any item belonging to the @1 group=屬於@1組的任何項目 +Any item belonging to the groups @1=屬於組@1的任何項目 +Recipe @1 of @2=第@1配方,共@2個 +Usage @1 of @2=第@1用法,共@2個 +No recipes=沒有配方 +No usages=沒有用法 +Result=結果 +Ingredient=原料 +Show next recipe= +Show next usage= +Show previous recipe= +Show previous usage= +@1 (@2)= +Give me:=給予: +This recipe is too@@large to be displayed.= +To craft grid:=填充物品到合成表 +All=全部 +Crafting=合成 +White=白 +Yellow=黃 +Red=紅 +Green=綠 +Blue=藍 +Waypoints=航路點 +Select Waypoint #@1=查詢航路點 #@1 +Waypoint @1=航路點 @1 +Set waypoint to current location=將航路點設置到當前位置 +Hide waypoint= +Show waypoint= +Hide coordinates= +Show coordinates= +Change color of waypoint display=改變航路點顯示的顏色 +Edit waypoint name=編輯航路點名稱 +Waypoint active=航路點已激活 +Waypoint inactive=航路點未激活 +Finish editing=完成編輯 +World position=世界位置 +Name=名稱 +HUD text color=HUD文本顏色 + + +##### not used anymore ##### + +invisible=不可見的 +visible=可見的 +Make waypoint @1=設置航路點 @1 +@1 display of waypoint coordinates=顯示航路點@1座標 diff --git a/match_craft.lua b/match_craft.lua new file mode 100644 index 0000000..2dd40b0 --- /dev/null +++ b/match_craft.lua @@ -0,0 +1,409 @@ +-- match_craft.lua +-- Find and automatically move inventory items to the crafting grid +-- according to the recipe. + +--[[ +Retrieve items from inventory lists and calculate their total count. +Return a table of "item name" - "total count" pairs. + +Arguments: + inv: minetest inventory reference + lists: names of inventory lists to use + +Example usage: + -- Count items in "main" and "craft" lists of player inventory + unified_inventory.count_items(player_inv_ref, {"main", "craft"}) + +Example output: + { + ["default:pine_wood"] = 2, + ["default:acacia_wood"] = 4, + ["default:chest"] = 3, + ["default:axe_diamond"] = 2, -- unstackable item are counted too + ["wool:white"] = 6 + } +]]-- +function unified_inventory.count_items(inv, lists) + local counts = {} + + for i = 1, #lists do + local name = lists[i] + local size = inv:get_size(name) + local list = inv:get_list(name) + + for j = 1, size do + local stack = list[j] + + if not stack:is_empty() then + local item = stack:get_name() + local count = stack:get_count() + + counts[item] = (counts[item] or 0) + count + end + end + end + + return counts +end + +--[[ +Retrieve craft recipe items and their positions in the crafting grid. +Return a table of "craft item name" - "set of positions" pairs. + +Note that if craft width is not 3 then positions are recalculated as +if items were placed on a 3x3 grid. Also note that craft can contain +groups of items with "group:" prefix. + +Arguments: + craft: minetest craft recipe + +Example output: + -- Bed recipe + { + ["wool:white"] = {[1] = true, [2] = true, [3] = true} + ["group:wood"] = {[4] = true, [5] = true, [6] = true} + } +--]] +function unified_inventory.count_craft_positions(craft) + local positions = {} + local craft_items = craft.items + local craft_type = unified_inventory.registered_craft_types[craft.type] + or unified_inventory.craft_type_defaults(craft.type, {}) + local display_width = craft_type.dynamic_display_size + and craft_type.dynamic_display_size(craft).width + or craft_type.width + local craft_width = craft_type.get_shaped_craft_width + and craft_type.get_shaped_craft_width(craft) + or display_width + local i = 0 + + for y = 1, 3 do + for x = 1, craft_width do + i = i + 1 + local item = craft_items[i] + + if item ~= nil then + local pos = 3 * (y - 1) + x + local set = positions[item] + + if set ~= nil then + set[pos] = true + else + positions[item] = {[pos] = true} + end + end + end + end + + return positions +end + +--[[ +For every craft item find all matching inventory items. +- If craft item is a group then find all inventory items that matches + this group. +- If craft item is not a group (regular item) then find only this item. + +If inventory doesn't contain needed item then found set is empty for +this item. + +Return a table of "craft item name" - "set of matching inventory items" +pairs. + +Arguments: + inv_items: table with items names as keys + craft_items: table with items names or groups as keys + +Example output: + { + ["group:wood"] = { + ["default:pine_wood"] = true, + ["default:acacia_wood"] = true + }, + ["wool:white"] = { + ["wool:white"] = true + } + } +--]] +function unified_inventory.find_usable_items(inv_items, craft_items) + local get_group = minetest.get_item_group + local result = {} + + for craft_item in pairs(craft_items) do + local group = craft_item:match("^group:(.+)") + local found = {} + + if group ~= nil then + for inv_item in pairs(inv_items) do + if get_group(inv_item, group) > 0 then + found[inv_item] = true + end + end + else + if inv_items[craft_item] ~= nil then + found[craft_item] = true + end + end + + result[craft_item] = found + end + + return result +end + +--[[ +Match inventory items with craft grid positions. +For every position select the matching inventory item with maximum +(total_count / (times_matched + 1)) value. + +If for some position matching item cannot be found or match count is 0 +then return nil. + +Return a table of "matched item name" - "set of craft positions" pairs +and overall match count. + +Arguments: + inv_counts: table of inventory items counts from "count_items" + craft_positions: table of craft positions from "count_craft_positions" + +Example output: + match_table = { + ["wool:white"] = {[1] = true, [2] = true, [3] = true} + ["default:acacia_wood"] = {[4] = true, [6] = true} + ["default:pine_wood"] = {[5] = true} + } + match_count = 2 +--]] +function unified_inventory.match_items(inv_counts, craft_positions) + local usable = unified_inventory.find_usable_items(inv_counts, craft_positions) + local match_table = {} + local match_count + local matches = {} + + for craft_item, pos_set in pairs(craft_positions) do + local use_set = usable[craft_item] + + for pos in pairs(pos_set) do + local pos_item + local pos_count + + for use_item in pairs(use_set) do + local count = inv_counts[use_item] + local times_matched = matches[use_item] or 0 + local new_pos_count = math.floor(count / (times_matched + 1)) + + if pos_count == nil or pos_count < new_pos_count then + pos_item = use_item + pos_count = new_pos_count + end + end + + if pos_item == nil or pos_count == 0 then + return nil + end + + local set = match_table[pos_item] + + if set ~= nil then + set[pos] = true + else + match_table[pos_item] = {[pos] = true} + end + + matches[pos_item] = (matches[pos_item] or 0) + 1 + end + end + + for match_item, times_matched in pairs(matches) do + local count = inv_counts[match_item] + local item_count = math.floor(count / times_matched) + + if match_count == nil or item_count < match_count then + match_count = item_count + end + end + + return match_table, match_count +end + +--[[ +Remove item from inventory lists. +Return stack of actually removed items. + +This function replicates the inv:remove_item function but can accept +multiple lists. + +Arguments: + inv: minetest inventory reference + lists: names of inventory lists + stack: minetest item stack +--]] +function unified_inventory.remove_item(inv, lists, stack) + local removed = ItemStack(nil) + local leftover = ItemStack(stack) + + for i = 1, #lists do + if leftover:is_empty() then + break + end + + local cur_removed = inv:remove_item(lists[i], leftover) + removed:add_item(cur_removed) + leftover:take_item(cur_removed:get_count()) + end + + return removed +end + +--[[ +Add item to inventory lists. +Return leftover stack. + +This function replicates the inv:add_item function but can accept +multiple lists. + +Arguments: + inv: minetest inventory reference + lists: names of inventory lists + stack: minetest item stack +--]] +function unified_inventory.add_item(inv, lists, stack) + local leftover = ItemStack(stack) + + for i = 1, #lists do + if leftover:is_empty() then + break + end + + leftover = inv:add_item(lists[i], leftover) + end + + return leftover +end + +--[[ +Move items from source list to destination list if possible. +Skip positions specified in exclude set. + +Arguments: + inv: minetest inventory reference + src_list: name of source list + dst_list: name of destination list + exclude: set of positions to skip +--]] +function unified_inventory.swap_items(inv, src_list, dst_list, exclude) + local size = inv:get_size(src_list) + local empty = ItemStack(nil) + + for i = 1, size do + if exclude == nil or exclude[i] == nil then + local stack = inv:get_stack(src_list, i) + + if not stack:is_empty() then + inv:set_stack(src_list, i, empty) + local leftover = inv:add_item(dst_list, stack) + + if not leftover:is_empty() then + inv:set_stack(src_list, i, leftover) + end + end + end + end +end + +--[[ +Move matched items to the destination list. + +If destination list position is already occupied with some other item +then function tries to (in that order): +1. Move it to the source list +2. Move it to some other unused position in destination list itself +3. Drop it to the ground if nothing else is possible. + +Arguments: + player: minetest player object + src_list: name of source list + dst_list: name of destination list + match_table: table of matched items + amount: amount of items per every position +--]] +function unified_inventory.move_match(player, src_list, dst_list, match_table, amount) + local inv = player:get_inventory() + local item_drop = minetest.item_drop + local src_dst_list = {src_list, dst_list} + local dst_src_list = {dst_list, src_list} + + local needed = {} + local moved = {} + + -- Remove stacks needed for craft + for item, pos_set in pairs(match_table) do + local stack = ItemStack(item) + local stack_max = stack:get_stack_max() + local bounded_amount = math.min(stack_max, amount) + stack:set_count(bounded_amount) + + for pos in pairs(pos_set) do + needed[pos] = unified_inventory.remove_item(inv, dst_src_list, stack) + end + end + + -- Add already removed stacks + for pos, stack in pairs(needed) do + local occupied = inv:get_stack(dst_list, pos) + inv:set_stack(dst_list, pos, stack) + + if not occupied:is_empty() then + local leftover = unified_inventory.add_item(inv, src_dst_list, occupied) + + if not leftover:is_empty() then + inv:set_stack(dst_list, pos, leftover) + local oversize = unified_inventory.add_item(inv, src_dst_list, stack) + + if not oversize:is_empty() then + item_drop(oversize, player, player:get_pos()) + end + end + end + + moved[pos] = true + end + + -- Swap items from unused positions to src (moved positions excluded) + unified_inventory.swap_items(inv, dst_list, src_list, moved) +end + +--[[ +Find craft match and move matched items to the destination list. + +If match cannot be found or match count is smaller than the desired +amount then do nothing. + +If amount passed is -1 then amount is defined by match count itself. +This is used to indicate "craft All" case. + +Arguments: + player: minetest player object + src_list: name of source list + dst_list: name of destination list + craft: minetest craft recipe + amount: desired amount of output items +--]] +function unified_inventory.craftguide_match_craft(player, src_list, dst_list, craft, amount) + local inv = player:get_inventory() + local src_dst_list = {src_list, dst_list} + + local counts = unified_inventory.count_items(inv, src_dst_list) + local positions = unified_inventory.count_craft_positions(craft) + local match_table, match_count = unified_inventory.match_items(counts, positions) + + if match_table == nil or match_count < amount then + return + end + + if amount == -1 then + amount = match_count + end + + unified_inventory.move_match(player, src_list, dst_list, match_table, amount) +end diff --git a/mod.conf b/mod.conf index 26a8af6..3d27d29 100644 --- a/mod.conf +++ b/mod.conf @@ -1 +1,8 @@ name = unified_inventory + +optional_depends = default, creative, sfinv, datastorage, farming +description = """ +Unified Inventory replaces the default survival and creative inventory. +It adds a nicer interface and a number of features, such as a crafting guide. +""" +min_minetest_version = 5.4.0 diff --git a/register.lua b/register.lua index dd2b3cc..3cb5f59 100644 --- a/register.lua +++ b/register.lua @@ -1,5 +1,7 @@ -local S = unified_inventory.gettext +local S = minetest.get_translator("unified_inventory") +local NS = function(s) return s end local F = minetest.formspec_escape +local ui = unified_inventory minetest.register_privilege("creative", { description = S("Can use the creative inventory"), @@ -11,10 +13,9 @@ give_to_singleplayer = false, }) - local trash = minetest.create_detached_inventory("trash", { --allow_put = function(inv, listname, index, stack, player) - -- if unified_inventory.is_creative(player:get_player_name()) then + -- if ui.is_creative(player:get_player_name()) then -- return stack:get_count() -- else -- return 0 @@ -28,19 +29,19 @@ }) trash:set_size("main", 1) -unified_inventory.register_button("craft", { +ui.register_button("craft", { type = "image", image = "ui_craft_icon.png", tooltip = S("Crafting Grid") }) -unified_inventory.register_button("craftguide", { +ui.register_button("craftguide", { type = "image", image = "ui_craftguide_icon.png", tooltip = S("Crafting Guide") }) -unified_inventory.register_button("home_gui_set", { +ui.register_button("home_gui_set", { type = "image", image = "ui_sethome_icon.png", tooltip = S("Set home position"), @@ -48,18 +49,18 @@ action = function(player) local player_name = player:get_player_name() if minetest.check_player_privs(player_name, {home=true}) then - unified_inventory.set_home(player, player:getpos()) - local home = unified_inventory.home_pos[player_name] + ui.set_home(player, player:get_pos()) + local home = ui.home_pos[player_name] if home ~= nil then minetest.sound_play("dingdong", {to_player=player_name, gain = 1.0}) minetest.chat_send_player(player_name, - S("Home position set to: %s"):format(minetest.pos_to_string(home))) + S("Home position set to: @1", minetest.pos_to_string(home))) end else minetest.chat_send_player(player_name, S("You don't have the \"home\" privilege!")) - unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) + ui.set_inventory_formspec(player, ui.current_page[player_name]) end end, condition = function(player) @@ -67,7 +68,7 @@ end, }) -unified_inventory.register_button("home_gui_go", { +ui.register_button("home_gui_go", { type = "image", image = "ui_gohome_icon.png", tooltip = S("Go home"), @@ -75,13 +76,13 @@ action = function(player) local player_name = player:get_player_name() if minetest.check_player_privs(player_name, {home=true}) then - minetest.sound_play("teleport", - {to_player=player:get_player_name(), gain = 1.0}) - unified_inventory.go_home(player) + if ui.go_home(player) then + minetest.sound_play("teleport", {to_player = player_name}) + end else minetest.chat_send_player(player_name, S("You don't have the \"home\" privilege!")) - unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) + ui.set_inventory_formspec(player, ui.current_page[player_name]) end end, condition = function(player) @@ -89,7 +90,7 @@ end, }) -unified_inventory.register_button("misc_set_day", { +ui.register_button("misc_set_day", { type = "image", image = "ui_sun_icon.png", tooltip = S("Set time to day"), @@ -105,7 +106,7 @@ else minetest.chat_send_player(player_name, S("You don't have the settime privilege!")) - unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) + ui.set_inventory_formspec(player, ui.current_page[player_name]) end end, condition = function(player) @@ -113,7 +114,7 @@ end, }) -unified_inventory.register_button("misc_set_night", { +ui.register_button("misc_set_night", { type = "image", image = "ui_moon_icon.png", tooltip = S("Set time to night"), @@ -129,7 +130,7 @@ else minetest.chat_send_player(player_name, S("You don't have the settime privilege!")) - unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) + ui.set_inventory_formspec(player, ui.current_page[player_name]) end end, condition = function(player) @@ -137,19 +138,19 @@ end, }) -unified_inventory.register_button("clear_inv", { +ui.register_button("clear_inv", { type = "image", image = "ui_trash_icon.png", tooltip = S("Clear inventory"), action = function(player) local player_name = player:get_player_name() - if not unified_inventory.is_creative(player_name) then + if not ui.is_creative(player_name) then minetest.chat_send_player(player_name, S("This button has been disabled outside" .." of creative mode to prevent" .." accidental inventory trashing." .."\nUse the trash slot instead.")) - unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) + ui.set_inventory_formspec(player, ui.current_page[player_name]) return end player:get_inventory():set_list("main", {}) @@ -158,35 +159,42 @@ {to_player=player_name, gain = 1.0}) end, condition = function(player) - return unified_inventory.is_creative(player:get_player_name()) - end, -}) - -unified_inventory.register_page("craft", { + return ui.is_creative(player:get_player_name()) + end, +}) + +ui.register_page("craft", { get_formspec = function(player, perplayer_formspec) - local formspecy = perplayer_formspec.formspec_y - local formheadery = perplayer_formspec.form_header_y - - local player_name = player:get_player_name() - local formspec = "background[2,"..formspecy..";6,3;ui_crafting_form.png]" - formspec = formspec.."background[0,"..(formspecy + 3.5)..";8,4;ui_main_inventory.png]" - formspec = formspec.."label[0,"..formheadery..";" ..F(S("Crafting")).."]" - formspec = formspec.."listcolors[#00000000;#00000000]" - formspec = formspec.."list[current_player;craftpreview;6,"..formspecy..";1,1;]" - formspec = formspec.."list[current_player;craft;2,"..formspecy..";3,3;]" - if unified_inventory.trash_enabled or unified_inventory.is_creative(player_name) or minetest.get_player_privs(player_name).give then - formspec = formspec.."label[7,"..(formspecy + 1.5)..";" .. F(S("Trash:")) .. "]" - formspec = formspec.."background[7,"..(formspecy + 2)..";1,1;ui_single_slot.png]" - formspec = formspec.."list[detached:trash;main;7,"..(formspecy + 2)..";1,1;]" - end - formspec = formspec.."listring[current_name;craft]" - formspec = formspec.."listring[current_player;main]" - if unified_inventory.is_creative(player_name) then - formspec = formspec.."label[0,"..(formspecy + 1.5)..";" .. F(S("Refill:")) .. "]" - formspec = formspec.."list[detached:"..F(player_name).."refill;main;0,"..(formspecy +2)..";1,1;]" - end - return {formspec=formspec} + local formheaderx = perplayer_formspec.form_header_x + local formheadery = perplayer_formspec.form_header_y + local craftx = perplayer_formspec.craft_x + local crafty = perplayer_formspec.craft_y + + local player_name = player:get_player_name() + local formspec = { + perplayer_formspec.standard_inv_bg, + perplayer_formspec.craft_grid, + "label["..formheaderx..","..formheadery..";" ..F(S("Crafting")).."]", + "listcolors[#00000000;#00000000]", + "listring[current_name;craft]", + "listring[current_player;main]" + } + local n=#formspec+1 + + if ui.trash_enabled or ui.is_creative(player_name) or minetest.get_player_privs(player_name).give then + formspec[n] = string.format("label[%f,%f;%s]", craftx + 6.45, crafty + 2.4, F(S("Trash:"))) + formspec[n+1] = ui.make_trash_slot(craftx + 6.25, crafty + 2.5) + n=n + 2 + end + + if ui.is_creative(player_name) then + formspec[n] = ui.single_slot(craftx - 2.5, crafty + 2.5) + formspec[n+1] = string.format("label[%f,%f;%s]", craftx - 2.3, crafty + 2.4,F(S("Refill:"))) + formspec[n+2] = string.format("list[detached:%srefill;main;%f,%f;1,1;]", + F(player_name), craftx - 2.5 + ui.list_img_offset, crafty + 2.5 + ui.list_img_offset) + end + return {formspec=table.concat(formspec)} end, }) @@ -205,23 +213,23 @@ local selectitem = name if name:sub(1, 6) == "group:" then local group_name = name:sub(7) - local group_item = unified_inventory.get_group_item(group_name) + local group_item = ui.get_group_item(group_name) show_is_group = not group_item.sole displayitem = group_item.item or "unknown" selectitem = group_item.sole and displayitem or name end local label = show_is_group and "G" or "" - local buttonname = F(buttonname_prefix..unified_inventory.mangle_for_formspec(selectitem)) + local buttonname = F(buttonname_prefix..ui.mangle_for_formspec(selectitem)) local button = string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]", x, y, w, h, F(displayitem), buttonname, label) if show_is_group then - local groupstring, andcount = unified_inventory.extract_groupnames(name) + local groupstring, andcount = ui.extract_groupnames(name) local grouptip if andcount == 1 then - grouptip = string.format(S("Any item belonging to the %s group"), groupstring) + grouptip = S("Any item belonging to the @1 group", groupstring) elseif andcount > 1 then - grouptip = string.format(S("Any item belonging to the groups %s"), groupstring) + grouptip = S("Any item belonging to the groups @1", groupstring) end grouptip = F(grouptip) if andcount >= 1 then @@ -232,8 +240,8 @@ end local recipe_text = { - recipe = S("Recipe %d of %d"), - usage = S("Usage %d of %d"), + recipe = NS("Recipe @1 of @2"), + usage = NS("Usage @1 of @2"), } local no_recipe_text = { recipe = S("No recipes"), @@ -256,83 +264,112 @@ usage = "recipe", } -unified_inventory.register_page("craftguide", { +ui.register_page("craftguide", { get_formspec = function(player, perplayer_formspec) - local formspecy = perplayer_formspec.formspec_y - local formheadery = perplayer_formspec.form_header_y - local craftresultx = perplayer_formspec.craft_result_x - local craftresulty = perplayer_formspec.craft_result_y + local craftguidex = perplayer_formspec.craft_guide_x + local craftguidey = perplayer_formspec.craft_guide_y + local craftguidearrowx = perplayer_formspec.craft_guide_arrow_x + local craftguideresultx = perplayer_formspec.craft_guide_result_x + local formheaderx = perplayer_formspec.form_header_x + local formheadery = perplayer_formspec.form_header_y + local give_x = perplayer_formspec.give_btn_x local player_name = player:get_player_name() local player_privs = minetest.get_player_privs(player_name) - local formspec = "" - formspec = formspec.."background[0,"..(formspecy + 3.5)..";8,4;ui_main_inventory.png]" - formspec = formspec.."label[0,"..formheadery..";" .. F(S("Crafting Guide")) .. "]" - formspec = formspec.."listcolors[#00000000;#00000000]" - local item_name = unified_inventory.current_item[player_name] - if not item_name then return {formspec=formspec} end + + local formspec = { + perplayer_formspec.standard_inv_bg, + "label["..formheaderx..","..formheadery..";" .. F(S("Crafting Guide")) .. "]", + "listcolors[#00000000;#00000000]" + } + + local item_name = ui.current_item[player_name] + if not item_name then + return { formspec = table.concat(formspec) } + end + + local n = 4 + local item_name_shown - if minetest.registered_items[item_name] and minetest.registered_items[item_name].description then - item_name_shown = string.format(S("%s (%s)"), minetest.registered_items[item_name].description, item_name) + if minetest.registered_items[item_name] + and minetest.registered_items[item_name].description then + item_name_shown = S("@1 (@2)", + minetest.registered_items[item_name].description, item_name) else item_name_shown = item_name end - local dir = unified_inventory.current_craft_direction[player_name] - local rdir - if dir == "recipe" then rdir = "usage" end - if dir == "usage" then rdir = "recipe" end - local crafts = unified_inventory.crafts_for[dir][item_name] - local alternate = unified_inventory.alternate[player_name] + local dir = ui.current_craft_direction[player_name] + local rdir = dir == "recipe" and "usage" or "recipe" + + local crafts = ui.crafts_for[dir][item_name] + local alternate = ui.alternate[player_name] local alternates, craft - if crafts ~= nil and #crafts > 0 then + if crafts and #crafts > 0 then alternates = #crafts craft = crafts[alternate] end - local has_creative = player_privs.give or player_privs.creative or - minetest.settings:get_bool("creative_mode") - - formspec = formspec.."background[0.5,"..(formspecy + 0.2)..";8,3;ui_craftguide_form.png]" - formspec = formspec.."textarea["..craftresultx..","..craftresulty - ..";10,1;;"..F(role_text[dir])..": "..item_name_shown..";]" - formspec = formspec..stack_image_button(0, formspecy, 1.1, 1.1, "item_button_" - .. rdir .. "_", ItemStack(item_name)) + local has_give = player_privs.give or ui.is_creative(player_name) + + formspec[n] = string.format("image[%f,%f;%f,%f;ui_crafting_arrow.png]", + craftguidearrowx, craftguidey, ui.imgscale, ui.imgscale) + + formspec[n+1] = string.format("textarea[%f,%f;10,1;;%s: %s;]", + perplayer_formspec.craft_guide_resultstr_x, perplayer_formspec.craft_guide_resultstr_y, + F(role_text[dir]), item_name_shown) + n = n + 2 + + local giveme_form = table.concat({ + "label[".. (give_x+0.1)..",".. (craftguidey + 2.7) .. ";" .. F(S("Give me:")) .. "]", + "button["..(give_x)..",".. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_1;1]", + "button["..(give_x+0.8)..",".. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_10;10]", + "button["..(give_x+1.6)..",".. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_99;99]" + }) if not craft then - formspec = formspec.."label[5.5,"..(formspecy + 2.35)..";" - ..F(no_recipe_text[dir]).."]" - local no_pos = dir == "recipe" and 4.5 or 6.5 - local item_pos = dir == "recipe" and 6.5 or 4.5 - formspec = formspec.."image["..no_pos..","..formspecy..";1.1,1.1;ui_no.png]" - formspec = formspec..stack_image_button(item_pos, formspecy, 1.1, 1.1, "item_button_" - ..other_dir[dir].."_", ItemStack(item_name)) - if has_creative then - formspec = formspec.."label[0,"..(formspecy + 2.10)..";" .. F(S("Give me:")) .. "]" - .."button[0, "..(formspecy + 2.7)..";0.6,0.5;craftguide_giveme_1;1]" - .."button[0.6,"..(formspecy + 2.7)..";0.7,0.5;craftguide_giveme_10;10]" - .."button[1.3,"..(formspecy + 2.7)..";0.8,0.5;craftguide_giveme_99;99]" + -- No craft recipes available for this item. + formspec[n] = string.format("label[%f,%f;%s]", craftguidex+2.5, craftguidey+1.5, F(no_recipe_text[dir])) + local no_pos = dir == "recipe" and (craftguidex+2.5) or craftguideresultx + local item_pos = dir == "recipe" and craftguideresultx or (craftguidex+2.5) + formspec[n+1] = "image["..no_pos..","..craftguidey..";1.2,1.2;ui_no.png]" + formspec[n+2] = stack_image_button(item_pos, craftguidey, 1.2, 1.2, + "item_button_" .. other_dir[dir] .. "_", ItemStack(item_name)) + if has_give then + formspec[n+3] = giveme_form end - return {formspec = formspec} - end - - local craft_type = unified_inventory.registered_craft_types[craft.type] or - unified_inventory.craft_type_defaults(craft.type, {}) + return { formspec = table.concat(formspec) } + else + formspec[n] = stack_image_button(craftguideresultx, craftguidey, 1.2, 1.2, + "item_button_" .. rdir .. "_", ItemStack(craft.output)) + n = n + 1 + end + + local craft_type = ui.registered_craft_types[craft.type] or + ui.craft_type_defaults(craft.type, {}) if craft_type.icon then - formspec = formspec..string.format(" image[%f,%f;%f,%f;%s]",5.7,(formspecy + 0.05),0.5,0.5,craft_type.icon) - end - formspec = formspec.."label[5.5,"..(formspecy + 1)..";" .. F(craft_type.description).."]" - formspec = formspec..stack_image_button(6.5, formspecy, 1.1, 1.1, "item_button_usage_", ItemStack(craft.output)) - local display_size = craft_type.dynamic_display_size and craft_type.dynamic_display_size(craft) or { width = craft_type.width, height = craft_type.height } - local craft_width = craft_type.get_shaped_craft_width and craft_type.get_shaped_craft_width(craft) or display_size.width + formspec[n] = string.format("image[%f,%f;%f,%f;%s]", + craftguidearrowx+0.35, craftguidey, 0.5, 0.5, craft_type.icon) + n = n + 1 + end + formspec[n] = string.format("label[%f,%f;%s]", craftguidearrowx + 0.15, craftguidey + 1.4, F(craft_type.description)) + n = n + 1 + + local display_size = craft_type.dynamic_display_size + and craft_type.dynamic_display_size(craft) + or { width = craft_type.width, height = craft_type.height } + local craft_width = craft_type.get_shaped_craft_width + and craft_type.get_shaped_craft_width(craft) + or display_size.width -- This keeps recipes aligned to the right, -- so that they're close to the arrow. - local xoffset = 5.5 + local xoffset = craftguidex+3.75 + local bspc = 1.25 -- Offset factor for crafting grids with side length > 4 local of = (3/math.max(3, math.max(display_size.width, display_size.height))) local od = 0 - -- Minimum grid size at which size optimazation measures kick in + -- Minimum grid size at which size optimization measures kick in local mini_craft_size = 6 if display_size.width >= mini_craft_size then od = math.max(1, display_size.width - 2) @@ -341,12 +378,12 @@ -- Size modifier factor local sf = math.min(1, of * (1.05 + 0.05*od)) -- Button size - local bsize_h = 1.1 * sf - local bsize_w = bsize_h - if display_size.width >= mini_craft_size then - bsize_w = 1.175 * sf - end - if (bsize_h > 0.35 and display_size.width) then + local bsize = 1.2 * sf + + if display_size.width >= mini_craft_size then -- it's not a normal 3x3 grid + bsize = 0.8 * sf + end + if (bsize > 0.35 and display_size.width) then for y = 1, display_size.height do for x = 1, display_size.width do local item @@ -356,146 +393,81 @@ -- Flipped x, used to build formspec buttons from right to left local fx = display_size.width - (x-1) -- x offset, y offset - local xof = (fx-1) * of + of - local yof = (y-1) * of + 1 + local xof = ((fx-1) * of + of) * bspc + local yof = ((y-1) * of + 1) * bspc if item then - formspec = formspec..stack_image_button( - xoffset - xof, formspecy - 1 + yof, bsize_w, bsize_h, + formspec[n] = stack_image_button( + xoffset - xof, craftguidey - 1.25 + yof, bsize, bsize, "item_button_recipe_", ItemStack(item)) else -- Fake buttons just to make grid - formspec = formspec.."image_button[" - ..tostring(xoffset - xof)..","..tostring(formspecy - 1 + yof) - ..";"..bsize_w..","..bsize_h..";ui_blank_image.png;;]" + formspec[n] = string.format("image_button[%f,%f;%f,%f;ui_blank_image.png;;]", + xoffset - xof, craftguidey - 1.25 + yof, bsize, bsize) end + n = n + 1 end end else -- Error - formspec = formspec.."label[" - ..tostring(2)..","..tostring(formspecy) - ..";"..F(S("This recipe is too\nlarge to be displayed.")).."]" + formspec[n] = string.format("label[2,%f;%s]", + craftguidey, F(S("This recipe is too@nlarge to be displayed."))) + n = n + 1 end if craft_type.uses_crafting_grid and display_size.width <= 3 then - formspec = formspec.."label[0,"..(formspecy + 0.9)..";" .. F(S("To craft grid:")) .. "]" - .."button[0, "..(formspecy + 1.5)..";0.6,0.5;craftguide_craft_1;1]" - .."button[0.6,"..(formspecy + 1.5)..";0.7,0.5;craftguide_craft_10;10]" - .."button[1.3,"..(formspecy + 1.5)..";0.8,0.5;craftguide_craft_max;" .. F(S("All")) .. "]" - end - if has_creative then - formspec = formspec.."label[0,"..(formspecy + 2.1)..";" .. F(S("Give me:")) .. "]" - .."button[0, "..(formspecy + 2.7)..";0.6,0.5;craftguide_giveme_1;1]" - .."button[0.6,"..(formspecy + 2.7)..";0.7,0.5;craftguide_giveme_10;10]" - .."button[1.3,"..(formspecy + 2.7)..";0.8,0.5;craftguide_giveme_99;99]" + formspec[n] = "label["..(give_x+0.1)..",".. (craftguidey + 1.7) .. ";" .. F(S("To craft grid:")) .. "]" + formspec[n+1] = "button[".. (give_x)..",".. (craftguidey + 1.9) .. ";0.75,0.5;craftguide_craft_1;1]" + formspec[n+2] = "button[".. (give_x+0.8)..",".. (craftguidey + 1.9) .. ";0.75,0.5;craftguide_craft_10;10]" + formspec[n+3] = "button[".. (give_x+1.6)..",".. (craftguidey + 1.9) .. ";0.75,0.5;craftguide_craft_max;" .. F(S("All")) .. "]" + n = n + 4 + end + + if has_give then + formspec[n] = giveme_form + n = n + 1 end if alternates and alternates > 1 then - formspec = formspec.."label[5.5,"..(formspecy + 1.6)..";" - ..string.format(F(recipe_text[dir]), alternate, alternates).."]" - .."image_button[5.5,"..(formspecy + 2)..";1,1;ui_left_icon.png;alternate_prev;]" - .."image_button[6.5,"..(formspecy + 2)..";1,1;ui_right_icon.png;alternate;]" - .."tooltip[alternate_prev;"..F(prev_alt_text[dir]).."]" - .."tooltip[alternate;"..F(next_alt_text[dir]).."]" - end - return {formspec = formspec} + formspec[n] = string.format("label[%f,%f;%s]", + craftguidex+4, craftguidey + 2.3, F(S(recipe_text[dir], alternate, alternates))) + formspec[n+1] = string.format("image_button[%f,%f;1.1,1.1;ui_left_icon.png;alternate_prev;]", + craftguidearrowx+0.2, craftguidey + 2.6) + formspec[n+2] = string.format("image_button[%f,%f;1.1,1.1;ui_right_icon.png;alternate;]", + craftguidearrowx+1.35, craftguidey + 2.6) + formspec[n+3] = "tooltip[alternate_prev;" .. F(prev_alt_text[dir]) .. "]" + formspec[n+4] = "tooltip[alternate;" .. F(next_alt_text[dir]) .. "]" + end + + return { formspec = table.concat(formspec) } end, }) local function craftguide_giveme(player, formname, fields) + local player_name = player:get_player_name() + local player_privs = minetest.get_player_privs(player_name) + if not player_privs.give and + not ui.is_creative(player_name) then + minetest.log("action", "[unified_inventory] Denied give action to player " .. + player_name) + return + end + local amount for k, v in pairs(fields) do amount = k:match("craftguide_giveme_(.*)") if amount then break end end - if not amount then return end - - amount = tonumber(amount) + + amount = tonumber(amount) or 0 if amount == 0 then return end - local player_name = player:get_player_name() - - local output = unified_inventory.current_item[player_name] + local output = ui.current_item[player_name] if (not output) or (output == "") then return end local player_inv = player:get_inventory() player_inv:add_item("main", {name = output, count = amount}) -end - --- tells if an item can be moved and returns an index if so -local function item_fits(player_inv, craft_item, needed_item) - local need_group = string.sub(needed_item, 1, 6) == "group:" - if need_group then - need_group = string.sub(needed_item, 7) - end - if craft_item - and not craft_item:is_empty() then - local ciname = craft_item:get_name() - - -- abort if the item there isn't usable - if ciname ~= needed_item - and not need_group then - return - end - - -- abort if no item fits onto it - if craft_item:get_count() >= craft_item:get_definition().stack_max then - return - end - - -- use the item there if it's in the right group and a group item is needed - if need_group then - if minetest.get_item_group(ciname, need_group) == 0 then - return - end - needed_item = ciname - need_group = false - end - end - - if need_group then - -- search an item of the specific group - for i,item in pairs(player_inv:get_list("main")) do - if not item:is_empty() - and minetest.get_item_group(item:get_name(), need_group) > 0 then - return i - end - end - - -- no index found - return - end - - -- search an item with a the name needed_item - for i,item in pairs(player_inv:get_list("main")) do - if not item:is_empty() - and item:get_name() == needed_item then - return i - end - end - - -- no index found -end - --- modifies the player inventory and returns the changed craft_item if possible -local function move_item(player_inv, craft_item, needed_item) - local stackid = item_fits(player_inv, craft_item, needed_item) - if not stackid then - return - end - local wanted_stack = player_inv:get_stack("main", stackid) - local taken_item = wanted_stack:take_item() - player_inv:set_stack("main", stackid, wanted_stack) - - if not craft_item - or craft_item:is_empty() then - return taken_item - end - - craft_item:add_item(taken_item) - return craft_item end local function craftguide_craft(player, formname, fields) @@ -505,63 +477,34 @@ if amount then break end end if not amount then return end + + amount = tonumber(amount) or -1 -- fallback for "all" + if amount == 0 or amount < -1 or amount > 99 then return end + local player_name = player:get_player_name() - local output = unified_inventory.current_item[player_name] - if (not output) or (output == "") then return end - - local player_inv = player:get_inventory() - - local crafts = unified_inventory.crafts_for[unified_inventory.current_craft_direction[player_name]][output] - if (not crafts) or (#crafts == 0) then return end - - local alternate = unified_inventory.alternate[player_name] + local output = ui.current_item[player_name] or "" + if output == "" then return end + + local crafts = ui.crafts_for[ + ui.current_craft_direction[player_name]][output] or {} + if #crafts == 0 then return end + + local alternate = ui.alternate[player_name] local craft = crafts[alternate] if craft.width > 3 then return end - local needed = craft.items - - local craft_list = player_inv:get_list("craft") - - local width = craft.width - if width == 0 then - -- Shapeless recipe - width = 3 - end - - amount = tonumber(amount) or 99 - --[[ - if amount == "max" then - amount = 99 -- Arbitrary; need better way to do this. - else - amount = tonumber(amount) - end--]] - - for iter = 1, amount do - local index = 1 - for y = 1, 3 do - for x = 1, width do - local needed_item = needed[index] - if needed_item then - local craft_index = ((y - 1) * 3) + x - local craft_item = craft_list[craft_index] - local newitem = move_item(player_inv, craft_item, needed_item) - if newitem then - craft_list[craft_index] = newitem - end - end - index = index + 1 - end - end - end - - player_inv:set_list("craft", craft_list) - - unified_inventory.set_inventory_formspec(player, "craft") + ui.craftguide_match_craft(player, "main", "craft", craft, amount) + + ui.set_inventory_formspec(player, "craft") end minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "" then + return + end + for k, v in pairs(fields) do if k:match("craftguide_craft_") then craftguide_craft(player, formname, fields) diff --git a/settingtypes.txt b/settingtypes.txt index 910989f..27768ac 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -9,3 +9,6 @@ #If enabled, the trash slot can be used by those without both creative #and the give privilege. unified_inventory_trash (Enable trash) bool true + + +unified_inventory_automatic_categorization (Items automatically added to categories) bool true \ No newline at end of file diff --git a/textures/bags_large.png b/textures/bags_large.png index 6d56299..187021c 100644 Binary files a/textures/bags_large.png and b/textures/bags_large.png differ diff --git a/textures/bags_medium.png b/textures/bags_medium.png index 59ba11d..d908883 100644 Binary files a/textures/bags_medium.png and b/textures/bags_medium.png differ diff --git a/textures/bags_small.png b/textures/bags_small.png index d48ffcb..9e4f4f6 100644 Binary files a/textures/bags_small.png and b/textures/bags_small.png differ diff --git a/textures/ui_1_icon.png b/textures/ui_1_icon.png index f4e85a0..ed4ceb9 100644 Binary files a/textures/ui_1_icon.png and b/textures/ui_1_icon.png differ diff --git a/textures/ui_2_icon.png b/textures/ui_2_icon.png index 96175a6..f4566d8 100644 Binary files a/textures/ui_2_icon.png and b/textures/ui_2_icon.png differ diff --git a/textures/ui_3_icon.png b/textures/ui_3_icon.png index 1db2916..ff6ebbb 100644 Binary files a/textures/ui_3_icon.png and b/textures/ui_3_icon.png differ diff --git a/textures/ui_4_icon.png b/textures/ui_4_icon.png index f344af4..3a12bfd 100644 Binary files a/textures/ui_4_icon.png and b/textures/ui_4_icon.png differ diff --git a/textures/ui_5_icon.png b/textures/ui_5_icon.png index e5dc4b0..c389152 100644 Binary files a/textures/ui_5_icon.png and b/textures/ui_5_icon.png differ diff --git a/textures/ui_bags_icon.png b/textures/ui_bags_icon.png index 6d56299..2882a23 100644 Binary files a/textures/ui_bags_icon.png and b/textures/ui_bags_icon.png differ diff --git a/textures/ui_bags_lg_form.png b/textures/ui_bags_lg_form.png deleted file mode 100644 index 713cacc..0000000 Binary files a/textures/ui_bags_lg_form.png and /dev/null differ diff --git a/textures/ui_bags_main_form.png b/textures/ui_bags_main_form.png deleted file mode 100644 index 37450f3..0000000 Binary files a/textures/ui_bags_main_form.png and /dev/null differ diff --git a/textures/ui_bags_med_form.png b/textures/ui_bags_med_form.png deleted file mode 100644 index 33e922e..0000000 Binary files a/textures/ui_bags_med_form.png and /dev/null differ diff --git a/textures/ui_bags_sm_form.png b/textures/ui_bags_sm_form.png deleted file mode 100644 index b3b66bb..0000000 Binary files a/textures/ui_bags_sm_form.png and /dev/null differ diff --git a/textures/ui_bags_trash.png b/textures/ui_bags_trash.png deleted file mode 100644 index 6338999..0000000 Binary files a/textures/ui_bags_trash.png and /dev/null differ diff --git a/textures/ui_blank_image.png b/textures/ui_blank_image.png index a8735b8..83d9d1a 100644 Binary files a/textures/ui_blank_image.png and b/textures/ui_blank_image.png differ diff --git a/textures/ui_blue_icon_background.png b/textures/ui_blue_icon_background.png index 9434217..2f872a4 100644 Binary files a/textures/ui_blue_icon_background.png and b/textures/ui_blue_icon_background.png differ diff --git a/textures/ui_category_all.png b/textures/ui_category_all.png new file mode 100644 index 0000000..0af7a53 Binary files /dev/null and b/textures/ui_category_all.png differ diff --git a/textures/ui_category_none.png b/textures/ui_category_none.png new file mode 100644 index 0000000..8976fb0 Binary files /dev/null and b/textures/ui_category_none.png differ diff --git a/textures/ui_circular_arrows_icon.png b/textures/ui_circular_arrows_icon.png index d687bbf..c6846e6 100644 Binary files a/textures/ui_circular_arrows_icon.png and b/textures/ui_circular_arrows_icon.png differ diff --git a/textures/ui_craft_icon.png b/textures/ui_craft_icon.png index fbe4cc7..a2283e3 100644 Binary files a/textures/ui_craft_icon.png and b/textures/ui_craft_icon.png differ diff --git a/textures/ui_craftgrid_icon.png b/textures/ui_craftgrid_icon.png index 6731327..5111f1e 100644 Binary files a/textures/ui_craftgrid_icon.png and b/textures/ui_craftgrid_icon.png differ diff --git a/textures/ui_craftguide_form.png b/textures/ui_craftguide_form.png deleted file mode 100644 index 3cd8643..0000000 Binary files a/textures/ui_craftguide_form.png and /dev/null differ diff --git a/textures/ui_craftguide_icon.png b/textures/ui_craftguide_icon.png index 5866b7b..d6c89e6 100644 Binary files a/textures/ui_craftguide_icon.png and b/textures/ui_craftguide_icon.png differ diff --git a/textures/ui_crafting_arrow.png b/textures/ui_crafting_arrow.png new file mode 100644 index 0000000..6901c58 Binary files /dev/null and b/textures/ui_crafting_arrow.png differ diff --git a/textures/ui_crafting_form.png b/textures/ui_crafting_form.png deleted file mode 100644 index 8c980ac..0000000 Binary files a/textures/ui_crafting_form.png and /dev/null differ diff --git a/textures/ui_doubleleft_icon.png b/textures/ui_doubleleft_icon.png index 587bb25..64d50c0 100644 Binary files a/textures/ui_doubleleft_icon.png and b/textures/ui_doubleleft_icon.png differ diff --git a/textures/ui_doubleright_icon.png b/textures/ui_doubleright_icon.png index f552acc..af20930 100644 Binary files a/textures/ui_doubleright_icon.png and b/textures/ui_doubleright_icon.png differ diff --git a/textures/ui_form_bg.png b/textures/ui_form_bg.png deleted file mode 100644 index 74a6a3b..0000000 Binary files a/textures/ui_form_bg.png and /dev/null differ diff --git a/textures/ui_formbg_9_sliced.png b/textures/ui_formbg_9_sliced.png new file mode 100644 index 0000000..0b8463c Binary files /dev/null and b/textures/ui_formbg_9_sliced.png differ diff --git a/textures/ui_gohome_icon.png b/textures/ui_gohome_icon.png index b3397ef..c5126ae 100644 Binary files a/textures/ui_gohome_icon.png and b/textures/ui_gohome_icon.png differ diff --git a/textures/ui_green_icon_background.png b/textures/ui_green_icon_background.png index b06c29c..ea28c82 100644 Binary files a/textures/ui_green_icon_background.png and b/textures/ui_green_icon_background.png differ diff --git a/textures/ui_group.png b/textures/ui_group.png index 2e4714a..b6b8d28 100644 Binary files a/textures/ui_group.png and b/textures/ui_group.png differ diff --git a/textures/ui_home_icon.png b/textures/ui_home_icon.png index e44419d..b9ce4f3 100644 Binary files a/textures/ui_home_icon.png and b/textures/ui_home_icon.png differ diff --git a/textures/ui_left_icon.png b/textures/ui_left_icon.png index 68cffb8..373b71e 100644 Binary files a/textures/ui_left_icon.png and b/textures/ui_left_icon.png differ diff --git a/textures/ui_main_inventory.png b/textures/ui_main_inventory.png deleted file mode 100644 index 3d380de..0000000 Binary files a/textures/ui_main_inventory.png and /dev/null differ diff --git a/textures/ui_misc_form.png b/textures/ui_misc_form.png deleted file mode 100644 index e74a605..0000000 Binary files a/textures/ui_misc_form.png and /dev/null differ diff --git a/textures/ui_moon_icon.png b/textures/ui_moon_icon.png index b2d7b44..cec7009 100644 Binary files a/textures/ui_moon_icon.png and b/textures/ui_moon_icon.png differ diff --git a/textures/ui_off_icon.png b/textures/ui_off_icon.png index 319fc6e..187e59a 100644 Binary files a/textures/ui_off_icon.png and b/textures/ui_off_icon.png differ diff --git a/textures/ui_ok_icon.png b/textures/ui_ok_icon.png index dcbda1d..4073899 100644 Binary files a/textures/ui_ok_icon.png and b/textures/ui_ok_icon.png differ diff --git a/textures/ui_on_icon.png b/textures/ui_on_icon.png index a9884cf..0f5c48f 100644 Binary files a/textures/ui_on_icon.png and b/textures/ui_on_icon.png differ diff --git a/textures/ui_pencil_icon.png b/textures/ui_pencil_icon.png index a73b740..dfcc19b 100644 Binary files a/textures/ui_pencil_icon.png and b/textures/ui_pencil_icon.png differ diff --git a/textures/ui_red_icon_background.png b/textures/ui_red_icon_background.png index 67f5dcc..8d4d807 100644 Binary files a/textures/ui_red_icon_background.png and b/textures/ui_red_icon_background.png differ diff --git a/textures/ui_reset_icon.png b/textures/ui_reset_icon.png index ec9ef62..e966685 100644 Binary files a/textures/ui_reset_icon.png and b/textures/ui_reset_icon.png differ diff --git a/textures/ui_right_icon.png b/textures/ui_right_icon.png index 1f11868..cbdab76 100644 Binary files a/textures/ui_right_icon.png and b/textures/ui_right_icon.png differ diff --git a/textures/ui_search_icon.png b/textures/ui_search_icon.png index b529e43..2934bdc 100644 Binary files a/textures/ui_search_icon.png and b/textures/ui_search_icon.png differ diff --git a/textures/ui_sethome_icon.png b/textures/ui_sethome_icon.png index 5c56d64..4c0f6e5 100644 Binary files a/textures/ui_sethome_icon.png and b/textures/ui_sethome_icon.png differ diff --git a/textures/ui_single_slot.png b/textures/ui_single_slot.png index ef2a246..2451623 100644 Binary files a/textures/ui_single_slot.png and b/textures/ui_single_slot.png differ diff --git a/textures/ui_single_slot_bright.png b/textures/ui_single_slot_bright.png new file mode 100644 index 0000000..c66365c Binary files /dev/null and b/textures/ui_single_slot_bright.png differ diff --git a/textures/ui_skip_backward_icon.png b/textures/ui_skip_backward_icon.png index fde4fea..eac6e4c 100644 Binary files a/textures/ui_skip_backward_icon.png and b/textures/ui_skip_backward_icon.png differ diff --git a/textures/ui_skip_forward_icon.png b/textures/ui_skip_forward_icon.png index 182e7ed..3f85a9f 100644 Binary files a/textures/ui_skip_forward_icon.png and b/textures/ui_skip_forward_icon.png differ diff --git a/textures/ui_smallbg_9_sliced.png b/textures/ui_smallbg_9_sliced.png new file mode 100644 index 0000000..865e0c9 Binary files /dev/null and b/textures/ui_smallbg_9_sliced.png differ diff --git a/textures/ui_sun_icon.png b/textures/ui_sun_icon.png index 262b1f3..11c7eef 100644 Binary files a/textures/ui_sun_icon.png and b/textures/ui_sun_icon.png differ diff --git a/textures/ui_trash_icon.png b/textures/ui_trash_icon.png index 081bac7..c5ac97c 100644 Binary files a/textures/ui_trash_icon.png and b/textures/ui_trash_icon.png differ diff --git a/textures/ui_trash_slot_icon.png b/textures/ui_trash_slot_icon.png new file mode 100644 index 0000000..5fc4de1 Binary files /dev/null and b/textures/ui_trash_slot_icon.png differ diff --git a/textures/ui_waypoint_set_icon.png b/textures/ui_waypoint_set_icon.png index 6eb9d19..4649a4d 100644 Binary files a/textures/ui_waypoint_set_icon.png and b/textures/ui_waypoint_set_icon.png differ diff --git a/textures/ui_waypoints_icon.png b/textures/ui_waypoints_icon.png index 530c1d7..91d6e3b 100644 Binary files a/textures/ui_waypoints_icon.png and b/textures/ui_waypoints_icon.png differ diff --git a/textures/ui_xyz_icon.png b/textures/ui_xyz_icon.png index 9b48acb..003ea63 100644 Binary files a/textures/ui_xyz_icon.png and b/textures/ui_xyz_icon.png differ diff --git a/textures/ui_xyz_off_icon.png b/textures/ui_xyz_off_icon.png deleted file mode 100644 index 3c1836e..0000000 Binary files a/textures/ui_xyz_off_icon.png and /dev/null differ diff --git a/textures/ui_xyz_on_icon.png b/textures/ui_xyz_on_icon.png deleted file mode 100644 index 9b48acb..0000000 Binary files a/textures/ui_xyz_on_icon.png and /dev/null differ diff --git a/waypoints.lua b/waypoints.lua index 3f9ee58..08fce38 100644 --- a/waypoints.lua +++ b/waypoints.lua @@ -1,5 +1,7 @@ -local S = unified_inventory.gettext +local S = minetest.get_translator("unified_inventory") local F = minetest.formspec_escape +local ui = unified_inventory +local COUNT = 5 local hud_colors = { {"#FFFFFF", 0xFFFFFF, S("White")}, @@ -9,107 +11,199 @@ {"#2c4df1", 0x2c4df1, S("Blue")}, } -local hud_colors_max = #hud_colors - --- Stores temporary player data (persists until player leaves) +-- Storage compatibility code + +--[[ +Stores temporary player data (persists until player leaves) + [player_name] = { + [] = { + edit = , + hud = , + }, + [] = { ... }, + ... + } +]] local waypoints_temp = {} -unified_inventory.register_page("waypoints", { +--[[ +Datastorage format (per-player): + { + selected = , + [] = { + name = + world_pos = , + color = <"hud_colors" index>, + active = , + display_pos = , + }, + [] = { ... }, + ... + } +Player metadata format: + { + selected = , + -- Cannot mix integer/string keys in JSON + data = { + [] = { same as above }, + ... + } + } +]] + +local function set_waypoint_data(player, waypoints) + local meta = player:get_meta() + if not next(waypoints.data or {}) then + -- Empty data. Do not save anything, or delete + meta:set_string("ui_waypoints", "") + else + meta:set_string("ui_waypoints", minetest.write_json(waypoints)) + end +end + +local function migrate_datastorage(player, waypoints) + -- Copy values from old table + local new_data = { + selected = waypoints.selected, + data = {} + } + for i = 1, COUNT do + new_data.data[i] = waypoints[i] + end + + set_waypoint_data(player, new_data) + + -- Delete values, but keep one entry so that it's saved by datastorage + for k, _ in pairs(waypoints) do + waypoints[k] = nil + end + waypoints[1] = 1 +end + +local have_datastorage = minetest.get_modpath("datastorage") ~= nil +local function get_waypoint_data(player) + local player_name = player:get_player_name() + + -- Migration step + if have_datastorage then + local waypoints = datastorage.get(player_name, "waypoints") + if waypoints.selected then + migrate_datastorage(player, waypoints) + minetest.log("action", "[unified_inventory] " .. + "Migrated waypoints of player: " .. player_name) + end + end + + -- Get directly from metadata + local waypoints = player:get_meta():get("ui_waypoints") + waypoints = waypoints and minetest.parse_json(waypoints) or {} + waypoints.data = waypoints.data or {} + + return waypoints +end + +ui.register_page("waypoints", { get_formspec = function(player) local player_name = player:get_player_name() - - -- build a "fake" temp entry if the server took too long - -- during sign-on and returned an empty entry - if not waypoints_temp[player_name] then waypoints_temp[player_name] = {hud = 1} end - - local waypoints = datastorage.get(player_name, "waypoints") - local formspec = "background[0,4.5;8,4;ui_main_inventory.png]" .. - "image[0,0;1,1;ui_waypoints_icon.png]" .. - "label[1,0;" .. F(S("Waypoints")) .. "]" + local wp_info_x = ui.style_full.form_header_x + 1.25 + local wp_info_y = ui.style_full.form_header_y + 0.5 + local wp_bottom_row = ui.style_full.std_inv_y - 1 + local wp_buttons_rj = ui.style_full.std_inv_x + 10.1 - ui.style_full.btn_spc + local wp_edit_w = ui.style_full.btn_spc * 4 - 0.1 + + local waypoints = get_waypoint_data(player) + local sel = waypoints.selected or 1 + + local formspec = { + ui.style_full.standard_inv_bg, + string.format("label[%f,%f;%s]", + ui.style_full.form_header_x, ui.style_full.form_header_y, F(S("Waypoints"))), + "image["..wp_info_x..","..wp_info_y..";1,1;ui_waypoints_icon.png]" + } + local n=4 -- Tabs buttons: - for i = 1, 5, 1 do - formspec = formspec .. - "image_button[0.0," .. 0.2 + i * 0.7 .. ";.8,.8;" .. - (i == waypoints.selected and "ui_blue_icon_background.png^" or "") .. - "ui_" .. i .. "_icon.png;" .. - "select_waypoint" .. i .. ";]" .. - "tooltip[select_waypoint" .. i .. ";" - .. (S("Select Waypoint #%d"):format(i)).."]" - end - - local i = waypoints.selected or 1 - local waypoint = waypoints[i] or {} - local temp = waypoints_temp[player_name][i] or {} - local default_name = string.format(S("Waypoint %d"), i) + for i = 1, COUNT do + local sw="select_waypoint"..i + formspec[n] = string.format("image_button[%f,%f;%f,%f;%sui_%i_icon.png;%s;]", + ui.style_full.main_button_x, wp_bottom_row - (5-i) * ui.style_full.btn_spc, + ui.style_full.btn_size, ui.style_full.btn_size, + (i == sel) and "ui_blue_icon_background.png^" or "", + i, sw) + formspec[n+1] = "tooltip["..sw..";"..S("Select Waypoint #@1", i).."]" + n = n + 2 + end + + local waypoint = waypoints.data[sel] or {} + local temp = waypoints_temp[player_name][sel] or {} + local default_name = S("Waypoint @1", sel) -- Main buttons: - formspec = formspec .. - "image_button[4.5,3.7;.8,.8;".. - "ui_waypoint_set_icon.png;".. - "set_waypoint"..i..";]".. - "tooltip[set_waypoint" .. i .. ";" - .. F(S("Set waypoint to current location")).."]" - - formspec = formspec .. - "image_button[5.2,3.7;.8,.8;".. - (waypoint.active and "ui_on_icon.png" or "ui_off_icon.png")..";".. - "toggle_waypoint"..i..";]".. - "tooltip[toggle_waypoint" .. i .. ";" - .. F(S("Make waypoint @1", - waypoint.active and S("invisible") or S("visible"))).."]" - - formspec = formspec .. - "image_button[5.9,3.7;.8,.8;".. - (waypoint.display_pos and "ui_green_icon_background.png" or "ui_red_icon_background.png").."^ui_xyz_icon.png;".. - "toggle_display_pos" .. i .. ";]".. - "tooltip[toggle_display_pos" .. i .. ";" - .. F(S("@1 display of waypoint coordinates", - waypoint.display_pos and S("Disable") or S("Enable"))) .."]" - - formspec = formspec .. - "image_button[6.6,3.7;.8,.8;".. - "ui_circular_arrows_icon.png;".. - "toggle_color"..i..";]".. - "tooltip[toggle_color" .. i .. ";" - .. F(S("Change color of waypoint display")).."]" - - formspec = formspec .. - "image_button[7.3,3.7;.8,.8;".. - "ui_pencil_icon.png;".. - "rename_waypoint"..i..";]".. - "tooltip[rename_waypoint" .. i .. ";" - .. F(S("Edit waypoint name")).."]" + local btnlist = { + set_waypoint = { + "ui_waypoint_set_icon.png", + S("Set waypoint to current location") + }, + toggle_waypoint = { + waypoint.active and "ui_on_icon.png" or "ui_off_icon.png", + waypoint.active and S("Hide waypoint") or S("Show waypoint") + }, + toggle_display_pos = { + waypoint.display_pos and "ui_green_icon_background.png^ui_xyz_icon.png" or "ui_red_icon_background.png^ui_xyz_icon.png^(ui_no.png^[transformR90)", + waypoint.display_pos and S("Hide coordinates") or S("Show coordinates") + }, + toggle_color = { + "ui_circular_arrows_icon.png", + S("Change color of waypoint display") + }, + rename_waypoint = { + "ui_pencil_icon.png", + S("Edit waypoint name") + } + } + + local x = 4 + for name, def in pairs(btnlist) do + formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s%i;]", + wp_buttons_rj - ui.style_full.btn_spc * x, wp_bottom_row, + ui.style_full.btn_size, ui.style_full.btn_size, + def[1], name, sel) + formspec[n+1] = "tooltip["..name..sel..";"..F(def[2]).."]" + x = x - 1 + n = n + 2 + end -- Waypoint's info: - if waypoint.active then - formspec = formspec .. "label[1,0.8;"..F(S("Waypoint active")).."]" - else - formspec = formspec .. "label[1,0.8;"..F(S("Waypoint inactive")).."]" - end + formspec[n] = ("label[%f,%f;%s]"):format( + wp_info_x, wp_info_y + 1.1, + F(waypoint.active and S("Waypoint active") or S("Waypoint inactive")) + ) + n = n + 1 if temp.edit then - formspec = formspec .. - "field[1.3,3.2;6,.8;rename_box" .. i .. ";;" - ..(waypoint.name or default_name).."]" .. - "image_button[7.3,2.9;.8,.8;".. - "ui_ok_icon.png;".. - "confirm_rename"..i.. ";]".. - "tooltip[confirm_rename" .. i .. ";" - .. F(S("Finish editing")).."]" - end - - formspec = formspec .. "label[1,1.3;"..F(S("World position"))..": " .. - minetest.pos_to_string(waypoint.world_pos or vector.new()) .. "]" .. - "label[1,1.8;"..F(S("Name"))..": ".. (waypoint.name or default_name) .. "]" .. - "label[1,2.3;"..F(S("HUD text color"))..": " .. - hud_colors[waypoint.color or 1][3] .. "]" - - return {formspec=formspec} + formspec[n] = string.format("field[%f,%f;%f,%f;rename_box%i;;%s]", + wp_buttons_rj - wp_edit_w - 0.1, wp_bottom_row - ui.style_full.btn_spc, + wp_edit_w, ui.style_full.btn_size, sel, (waypoint.name or default_name)) + formspec[n+1] = string.format("image_button[%f,%f;%f,%f;ui_ok_icon.png;confirm_rename%i;]", + wp_buttons_rj, wp_bottom_row - ui.style_full.btn_spc, + ui.style_full.btn_size, ui.style_full.btn_size, sel) + formspec[n+2] = "tooltip[confirm_rename"..sel..";"..F(S("Finish editing")).."]" + n = n + 3 + end + + formspec[n] = string.format("label[%f,%f;%s: %s]", + wp_info_x, wp_info_y+1.6, F(S("World position")), + minetest.pos_to_string(waypoint.world_pos or vector.new())) + formspec[n+1] = string.format("label[%f,%f;%s: %s]", + wp_info_x, wp_info_y+2.10, F(S("Name")), (waypoint.name or default_name)) + formspec[n+2] = string.format("label[%f,%f;%s: %s]", + wp_info_x, wp_info_y+2.60, F(S("HUD text color")), hud_colors[waypoint.color or 1][3]) + + return {formspec=table.concat(formspec)} end, }) -unified_inventory.register_button("waypoints", { +ui.register_button("waypoints", { type = "image", image = "ui_waypoints_icon.png", tooltip = S("Waypoints"), @@ -117,10 +211,12 @@ }) local function update_hud(player, waypoints, temp, i) - local waypoint = waypoints[i] + local waypoint = waypoints.data[i] if not waypoint then return end + temp[i] = temp[i] or {} temp = temp[i] + local pos = waypoint.world_pos or vector.new() local name if waypoint.display_pos then @@ -129,10 +225,13 @@ name = name..", "..waypoint.name end else - name = waypoint.name or "Waypoint "..i - end + name = waypoint.name or S("Waypoint @1", i) + end + + -- Perform HUD updates if temp.hud then player:hud_remove(temp.hud) + temp.hud = nil end if waypoint.active then temp.hud = player:hud_add({ @@ -142,8 +241,6 @@ text = "m", world_pos = pos }) - else - temp.hud = nil end end @@ -155,9 +252,11 @@ local need_update_hud = false local hit = false - local waypoints = datastorage.get(player_name, "waypoints") + local waypoints = get_waypoint_data(player) local temp = waypoints_temp[player_name] - for i = 1, 5, 1 do + for i = 1, COUNT do + local waypoint = waypoints.data[i] or {} + if fields["select_waypoint"..i] then hit = true waypoints.selected = i @@ -166,20 +265,15 @@ if fields["toggle_waypoint"..i] then hit = true - waypoints[i] = waypoints[i] or {} - waypoints[i].active = not (waypoints[i].active) + waypoint.active = not (waypoint.active) need_update_hud = true update_formspec = true end if fields["set_waypoint"..i] then hit = true - local pos = player:getpos() - pos.x = math.floor(pos.x) - pos.y = math.floor(pos.y) - pos.z = math.floor(pos.z) - waypoints[i] = waypoints[i] or {} - waypoints[i].world_pos = pos + local pos = vector.round(player:get_pos()) + waypoint.world_pos = pos need_update_hud = true update_formspec = true end @@ -193,39 +287,45 @@ if fields["toggle_display_pos"..i] then hit = true - waypoints[i] = waypoints[i] or {} - waypoints[i].display_pos = not waypoints[i].display_pos + waypoint.display_pos = not waypoint.display_pos need_update_hud = true update_formspec = true end if fields["toggle_color"..i] then hit = true - waypoints[i] = waypoints[i] or {} - local color = waypoints[i].color or 1 + local color = waypoint.color or 0 color = color + 1 - if color > hud_colors_max then + if color > #hud_colors then color = 1 end - waypoints[i].color = color + waypoint.color = color need_update_hud = true update_formspec = true end if fields["confirm_rename"..i] then hit = true - waypoints[i] = waypoints[i] or {} + temp[i] = temp[i] or {} temp[i].edit = false - waypoints[i].name = fields["rename_box"..i] - need_update_hud = true - update_formspec = true - end + waypoint.name = fields["rename_box"..i] + need_update_hud = true + update_formspec = true + end + + if hit then + -- Save first + waypoints.data[i] = waypoint + set_waypoint_data(player, waypoints) + end + -- Update after if need_update_hud then update_hud(player, waypoints, temp, i) end if update_formspec then - unified_inventory.set_inventory_formspec(player, "waypoints") - end + ui.set_inventory_formspec(player, "waypoints") + end + if hit then return end end end) @@ -233,11 +333,11 @@ minetest.register_on_joinplayer(function(player) local player_name = player:get_player_name() - local waypoints = datastorage.get(player_name, "waypoints") - local temp = {} - waypoints_temp[player_name] = temp - for i = 1, 5 do - update_hud(player, waypoints, temp, i) + local waypoints = get_waypoint_data(player) + + waypoints_temp[player_name] = {} + for i = 1, COUNT do + update_hud(player, waypoints, waypoints_temp[player_name], i) end end)