This commit is contained in:
Milan2018 2021-05-16 14:40:53 +02:00
parent d1826401c9
commit eaf68ede9d
102 changed files with 3647 additions and 3280 deletions

View file

@ -1,11 +0,0 @@
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

View file

@ -1,2 +0,0 @@
*~

View file

@ -1,21 +0,0 @@
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" }

View file

@ -1,19 +0,0 @@
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.

View file

@ -1,51 +1,22 @@
# 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. 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
* 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+
# Licenses
Copyright (C) 2012-2014 Maciej Kasatkin (RealBadAngel) Copyright (C) 2012-2014 Maciej Kasatkin (RealBadAngel)
Copyright (C) 2012-? Various minetest-mods contributors Unified inventory code is licensed under the GNU LGPLv2+.
Licenses for textures:
## Code
GNU LGPLv2+, see [license notice](LICENSE.txt)
## Textures
VanessaE: (CC-BY-4.0) VanessaE: (CC-BY-4.0)
* `ui_group.png` * `ui_group.png`
Tango Project: (Public Domain, CC-BY-4.0) Tango Project: (Public Domain, CC-BY-4.0)
* [`ui_reset_icon.png`](https://commons.wikimedia.org/wiki/File:Edit-clear.svg) * [`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_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) * [`ui_doubleright_icon.png`](http://commons.wikimedia.org/wiki/File:Media-seek-forward.svg)
@ -54,7 +25,6 @@ Tango Project: (Public Domain, CC-BY-4.0)
* [`ui_skip_forward_icon.png`](http://commons.wikimedia.org/wiki/File:Media-skip-forward.svg) * [`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): From http://www.clker.com (Public Domain, CC-BY-4.0):
* [`bags_small.png`](http://www.clker.com/clipart-moneybag-empty.html) * [`bags_small.png`](http://www.clker.com/clipart-moneybag-empty.html)
* [`bags_medium.png`](http://www.clker.com/clipart-backpack-1.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) * [`bags_large.png` / `ui_bags_icon.png`](http://www.clker.com/clipart-backpack-green-brown.html)
@ -67,33 +37,25 @@ From http://www.clker.com (Public Domain, CC-BY-4.0):
* [`ui_waypoint_set_icon.png`](http://www.clker.com/clipart-larger-flag.html) * [`ui_waypoint_set_icon.png`](http://www.clker.com/clipart-larger-flag.html)
Everaldo Coelho (YellowIcon) (LGPL v2.1+): Everaldo Coelho (YellowIcon) (LGPL v2.1+):
* [`ui_craftguide_icon.png` / `ui_craft_icon.png`](http://commons.wikimedia.org/wiki/File:Advancedsettings.png) * [`ui_craftguide_icon.png` / `ui_craft_icon.png`](http://commons.wikimedia.org/wiki/File:Advancedsettings.png)
Gregory H. Revera: (CC-BY-SA 3.0) Gregory H. Revera: (CC-BY-SA 3.0)
* [`ui_moon_icon.png`](http://commons.wikimedia.org/wiki/File:FullMoon2010.jpg) * [`ui_moon_icon.png`](http://commons.wikimedia.org/wiki/File:FullMoon2010.jpg)
Thomas Bresson: (CC-BY 3.0) Thomas Bresson: (CC-BY 3.0)
* [`ui_sun_icon.png`](http://commons.wikimedia.org/wiki/File:2012-10-13_15-29-35-sun.jpg) * [`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) Fibonacci: (Public domain, CC-BY 4.0)
* [`ui_xyz_off_icon.png`](http://commons.wikimedia.org/wiki/File:No_sign.svg) * [`ui_xyz_off_icon.png`](http://commons.wikimedia.org/wiki/File:No_sign.svg)
Gregory Maxwell: (Public domain, CC-BY 4.0) Gregory Maxwell: (Public domain, CC-BY 4.0)
* [`ui_ok_icon.png`](http://commons.wikimedia.org/wiki/File:Yes_check.svg) * [`ui_ok_icon.png`](http://commons.wikimedia.org/wiki/File:Yes_check.svg)
Adrien Facélina: (LGPL v2.1+) Adrien Facélina: (LGPL v2.1+)
* [`inventory_plus_worldedit_gui.png`](http://commons.wikimedia.org/wiki/File:Erioll_world_2.svg) * [`inventory_plus_worldedit_gui.png`](http://commons.wikimedia.org/wiki/File:Erioll_world_2.svg)
Other files from Wikimedia Commons: 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+) * [`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) RealBadAngel: (CC-BY-4.0)
* Everything else. * Everything else.

View file

@ -1,6 +1,5 @@
local S = minetest.get_translator("unified_inventory") local S = unified_inventory.gettext
local F = minetest.formspec_escape local F = minetest.formspec_escape
local ui = unified_inventory
-- Create detached creative inventory after loading all mods -- Create detached creative inventory after loading all mods
minetest.after(0.01, function() minetest.after(0.01, function()
@ -9,16 +8,16 @@ minetest.after(0.01, function()
if not rev_aliases[target] then rev_aliases[target] = {} end if not rev_aliases[target] then rev_aliases[target] = {} end
table.insert(rev_aliases[target], source) table.insert(rev_aliases[target], source)
end end
ui.items_list = {} unified_inventory.items_list = {}
for name, def in pairs(minetest.registered_items) do for name, def in pairs(minetest.registered_items) do
if (not def.groups.not_in_creative_inventory or if (not def.groups.not_in_creative_inventory or
def.groups.not_in_creative_inventory == 0) and def.groups.not_in_creative_inventory == 0) and
def.description and def.description ~= "" then def.description and def.description ~= "" then
table.insert(ui.items_list, name) table.insert(unified_inventory.items_list, name)
local all_names = rev_aliases[name] or {} local all_names = rev_aliases[name] or {}
table.insert(all_names, name) table.insert(all_names, name)
for _, player_name in ipairs(all_names) do for _, name in ipairs(all_names) do
local recipes = minetest.get_all_craft_recipes(player_name) local recipes = minetest.get_all_craft_recipes(name)
if recipes then if recipes then
for _, recipe in ipairs(recipes) do for _, recipe in ipairs(recipes) do
@ -27,30 +26,30 @@ minetest.after(0.01, function()
for _,chk in pairs(recipe.items) do for _,chk in pairs(recipe.items) do
local groupchk = string.find(chk, "group:") local groupchk = string.find(chk, "group:")
if (not groupchk and not minetest.registered_items[chk]) if (not groupchk and not minetest.registered_items[chk])
or (groupchk and not ui.get_group_item(string.gsub(chk, "group:", "")).item) or (groupchk and not unified_inventory.get_group_item(string.gsub(chk, "group:", "")).item)
or minetest.get_item_group(chk, "not_in_craft_guide") ~= 0 then or minetest.get_item_group(chk, "not_in_craft_guide") ~= 0 then
unknowns = true unknowns = true
end end
end end
if not unknowns then if not unknowns then
ui.register_craft(recipe) unified_inventory.register_craft(recipe)
end end
end end
end end
end end
end end
end end
table.sort(ui.items_list) table.sort(unified_inventory.items_list)
ui.items_list_size = #ui.items_list unified_inventory.items_list_size = #unified_inventory.items_list
print("Unified Inventory. inventory size: "..ui.items_list_size) print("Unified Inventory. inventory size: "..unified_inventory.items_list_size)
for _, name in ipairs(ui.items_list) do for _, name in ipairs(unified_inventory.items_list) do
local def = minetest.registered_items[name] local def = minetest.registered_items[name]
-- Simple drops -- Simple drops
if type(def.drop) == "string" then if type(def.drop) == "string" then
local dstack = ItemStack(def.drop) local dstack = ItemStack(def.drop)
if not dstack:is_empty() and dstack:get_name() ~= name then if not dstack:is_empty() and dstack:get_name() ~= name then
ui.register_craft({ unified_inventory.register_craft({
type = "digging", type = "digging",
items = {name}, items = {name},
output = def.drop, output = def.drop,
@ -116,7 +115,7 @@ minetest.after(0.01, function()
end end
end end
for itemstring, count in pairs(drop_guaranteed) do for itemstring, count in pairs(drop_guaranteed) do
ui.register_craft({ unified_inventory.register_craft({
type = "digging", type = "digging",
items = {name}, items = {name},
output = itemstring .. " " .. count, output = itemstring .. " " .. count,
@ -124,7 +123,7 @@ minetest.after(0.01, function()
}) })
end end
for itemstring, count in pairs(drop_maybe) do for itemstring, count in pairs(drop_maybe) do
ui.register_craft({ unified_inventory.register_craft({
type = "digging_chance", type = "digging_chance",
items = {name}, items = {name},
output = itemstring .. " " .. count, output = itemstring .. " " .. count,
@ -133,22 +132,22 @@ minetest.after(0.01, function()
end end
end end
end end
for _, recipes in pairs(ui.crafts_for.recipe) do for _, recipes in pairs(unified_inventory.crafts_for.recipe) do
for _, recipe in ipairs(recipes) do for _, recipe in ipairs(recipes) do
local ingredient_items = {} local ingredient_items = {}
for _, spec in pairs(recipe.items) do for _, spec in pairs(recipe.items) do
local matches_spec = ui.canonical_item_spec_matcher(spec) local matches_spec = unified_inventory.canonical_item_spec_matcher(spec)
for _, name in ipairs(ui.items_list) do for _, name in ipairs(unified_inventory.items_list) do
if matches_spec(name) then if matches_spec(name) then
ingredient_items[name] = true ingredient_items[name] = true
end end
end end
end end
for name, _ in pairs(ingredient_items) do for name, _ in pairs(ingredient_items) do
if ui.crafts_for.usage[name] == nil then if unified_inventory.crafts_for.usage[name] == nil then
ui.crafts_for.usage[name] = {} unified_inventory.crafts_for.usage[name] = {}
end end
table.insert(ui.crafts_for.usage[name], recipe) table.insert(unified_inventory.crafts_for.usage[name], recipe)
end end
end end
end end
@ -157,9 +156,9 @@ end)
-- load_home -- load_home
local function load_home() local function load_home()
local input = io.open(ui.home_filename, "r") local input = io.open(unified_inventory.home_filename, "r")
if not input then if not input then
ui.home_pos = {} unified_inventory.home_pos = {}
return return
end end
while true do while true do
@ -168,40 +167,32 @@ local function load_home()
local y = input:read("*n") local y = input:read("*n")
local z = input:read("*n") local z = input:read("*n")
local name = input:read("*l") local name = input:read("*l")
ui.home_pos[name:sub(2)] = {x = x, y = y, z = z} unified_inventory.home_pos[name:sub(2)] = {x = x, y = y, z = z}
end end
io.close(input) io.close(input)
end end
load_home() load_home()
function ui.set_home(player, pos) function unified_inventory.set_home(player, pos)
local player_name = player:get_player_name() local player_name = player:get_player_name()
ui.home_pos[player_name] = vector.round(pos) unified_inventory.home_pos[player_name] = vector.round(pos)
-- save the home data from the table to the file -- save the home data from the table to the file
local output = io.open(ui.home_filename, "w") local output = io.open(unified_inventory.home_filename, "w")
if not output then for k, v in pairs(unified_inventory.home_pos) do
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") output:write(v.x.." "..v.y.." "..v.z.." "..k.."\n")
end end
io.close(output) io.close(output)
end end
function ui.go_home(player) function unified_inventory.go_home(player)
local pos = ui.home_pos[player:get_player_name()] local pos = unified_inventory.home_pos[player:get_player_name()]
if pos then if pos then
player:set_pos(pos) player:setpos(pos)
return true
end end
return false
end end
-- register_craft -- register_craft
function ui.register_craft(options) function unified_inventory.register_craft(options)
if not options.output then if not options.output then
return return
end end
@ -212,10 +203,10 @@ function ui.register_craft(options)
if options.type == "normal" and options.width == 0 then if options.type == "normal" and options.width == 0 then
options = { type = "shapeless", items = options.items, output = options.output, width = 0 } options = { type = "shapeless", items = options.items, output = options.output, width = 0 }
end end
if not ui.crafts_for.recipe[itemstack:get_name()] then if not unified_inventory.crafts_for.recipe[itemstack:get_name()] then
ui.crafts_for.recipe[itemstack:get_name()] = {} unified_inventory.crafts_for.recipe[itemstack:get_name()] = {}
end end
table.insert(ui.crafts_for.recipe[itemstack:get_name()],options) table.insert(unified_inventory.crafts_for.recipe[itemstack:get_name()],options)
end end
@ -226,7 +217,7 @@ local craft_type_defaults = {
} }
function ui.craft_type_defaults(name, options) function unified_inventory.craft_type_defaults(name, options)
if not options.description then if not options.description then
options.description = name options.description = name
end end
@ -235,13 +226,13 @@ function ui.craft_type_defaults(name, options)
end end
function ui.register_craft_type(name, options) function unified_inventory.register_craft_type(name, options)
ui.registered_craft_types[name] = unified_inventory.registered_craft_types[name] =
ui.craft_type_defaults(name, options) unified_inventory.craft_type_defaults(name, options)
end end
ui.register_craft_type("normal", { unified_inventory.register_craft_type("normal", {
description = F(S("Crafting")), description = F(S("Crafting")),
icon = "ui_craftgrid_icon.png", icon = "ui_craftgrid_icon.png",
width = 3, width = 3,
@ -257,7 +248,7 @@ ui.register_craft_type("normal", {
}) })
ui.register_craft_type("shapeless", { unified_inventory.register_craft_type("shapeless", {
description = F(S("Mixing")), description = F(S("Mixing")),
icon = "ui_craftgrid_icon.png", icon = "ui_craftgrid_icon.png",
width = 3, width = 3,
@ -272,7 +263,7 @@ ui.register_craft_type("shapeless", {
}) })
ui.register_craft_type("cooking", { unified_inventory.register_craft_type("cooking", {
description = F(S("Cooking")), description = F(S("Cooking")),
icon = "default_furnace_front.png", icon = "default_furnace_front.png",
width = 1, width = 1,
@ -280,60 +271,38 @@ ui.register_craft_type("cooking", {
}) })
ui.register_craft_type("digging", { unified_inventory.register_craft_type("digging", {
description = F(S("Digging")), description = F(S("Digging")),
icon = "default_tool_steelpick.png", icon = "default_tool_steelpick.png",
width = 1, width = 1,
height = 1, height = 1,
}) })
ui.register_craft_type("digging_chance", { unified_inventory.register_craft_type("digging_chance", {
description = "Digging (by chance)", description = "Digging (by chance)",
icon = "default_tool_steelpick.png^[transformFY.png", icon = "default_tool_steelpick.png^[transformFY.png",
width = 1, width = 1,
height = 1, height = 1,
}) })
function ui.register_page(name, def) function unified_inventory.register_page(name, def)
ui.pages[name] = def unified_inventory.pages[name] = def
end end
function ui.register_button(name, def) function unified_inventory.register_button(name, def)
if not def.action then if not def.action then
def.action = function(player) def.action = function(player)
ui.set_inventory_formspec(player, name) unified_inventory.set_inventory_formspec(player, name)
end end
end end
def.name = name def.name = name
table.insert(ui.buttons, def) table.insert(unified_inventory.buttons, def)
end end
function ui.is_creative(playername)
function unified_inventory.is_creative(playername)
return minetest.check_player_privs(playername, {creative=true}) return minetest.check_player_privs(playername, {creative=true})
or minetest.settings:get_bool("creative_mode") or minetest.settings:get_bool("creative_mode")
end 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

View file

@ -1,38 +1,30 @@
--[[ -- Bags for Minetest
Bags for Minetest
Copyright (c) 2012 cornernote, Brett O'Donnell <cornernote@gmail.com> -- Copyright (c) 2012 cornernote, Brett O'Donnell <cornernote@gmail.com>
License: GPLv3 -- License: GPLv3
--]]
local S = minetest.get_translator("unified_inventory") local S = unified_inventory.gettext
local F = minetest.formspec_escape local F = minetest.formspec_escape
local ui = unified_inventory
ui.register_page("bags", { unified_inventory.register_page("bags", {
get_formspec = function(player) get_formspec = function(player)
local player_name = player:get_player_name() local player_name = player:get_player_name()
return { formspec = table.concat({ local formspec = "background[0.06,0.99;7.92,7.52;ui_bags_main_form.png]"
ui.style_full.standard_inv_bg, formspec = formspec.."label[0,0;"..F(S("Bags")).."]"
ui.single_slot(0.925, 1.5), formspec = formspec.."button[0,2;2,0.5;bag1;"..F(S("Bag @1", 1)).."]"
ui.single_slot(3.425, 1.5), formspec = formspec.."button[2,2;2,0.5;bag2;"..F(S("Bag @1", 2)).."]"
ui.single_slot(5.925, 1.5), formspec = formspec.."button[4,2;2,0.5;bag3;"..F(S("Bag @1", 3)).."]"
ui.single_slot(8.425, 1.5), formspec = formspec.."button[6,2;2,0.5;bag4;"..F(S("Bag @1", 4)).."]"
"label["..ui.style_full.form_header_x..","..ui.style_full.form_header_y..";" .. F(S("Bags")) .. "]", formspec = formspec.."listcolors[#00000000;#00000000]"
"button[0.6125,2.75;1.875,0.75;bag1;" .. F(S("Bag @1", 1)) .. "]", formspec = formspec.."list[detached:"..F(player_name).."_bags;bag1;0.5,1;1,1;]"
"button[3.1125,2.75;1.875,0.75;bag2;" .. F(S("Bag @1", 2)) .. "]", formspec = formspec.."list[detached:"..F(player_name).."_bags;bag2;2.5,1;1,1;]"
"button[5.6125,2.75;1.875,0.75;bag3;" .. F(S("Bag @1", 3)) .. "]", formspec = formspec.."list[detached:"..F(player_name).."_bags;bag3;4.5,1;1,1;]"
"button[8.1125,2.75;1.875,0.75;bag4;" .. F(S("Bag @1", 4)) .. "]", formspec = formspec.."list[detached:"..F(player_name).."_bags;bag4;6.5,1;1,1;]"
"listcolors[#00000000;#00000000]", return {formspec=formspec}
"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, end,
}) })
ui.register_button("bags", { unified_inventory.register_button("bags", {
type = "image", type = "image",
image = "ui_bags_icon.png", image = "ui_bags_icon.png",
tooltip = S("Bags"), tooltip = S("Bags"),
@ -46,38 +38,37 @@ local function get_player_bag_stack(player, i)
}):get_stack("bag" .. i, 1) }):get_stack("bag" .. i, 1)
end end
for bag_i = 1, 4 do for i = 1, 4 do
ui.register_page("bag" .. bag_i, { local bi = i
unified_inventory.register_page("bag"..bi, {
get_formspec = function(player) get_formspec = function(player)
local stack = get_player_bag_stack(player, bag_i) local stack = get_player_bag_stack(player, bi)
local image = stack:get_definition().inventory_image 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 local slots = stack:get_definition().groups.bagslots
if slots == 8 then
local formspec = { formspec = formspec.."background[0.06,0.99;7.92,7.52;ui_bags_sm_form.png]"
ui.style_full.standard_inv_bg, elseif slots == 16 then
ui.make_inv_img_grid(0.3, 1.5, 8, slots/8), formspec = formspec.."background[0.06,0.99;7.92,7.52;ui_bags_med_form.png]"
"image[9.2,0.4;1,1;" .. image .. "]", elseif slots == 24 then
"label[0.3,0.65;" .. F(S("Bag @1", bag_i)) .. "]", formspec = formspec.."background[0.06,0.99;7.92,7.52;ui_bags_lg_form.png]"
"listcolors[#00000000;#00000000]", end
"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. local player_name = player:get_player_name() -- For if statement.
if ui.trash_enabled if unified_inventory.trash_enabled or unified_inventory.is_creative(player_name) or minetest.get_player_privs(player_name).give then
or ui.is_creative(player_name) formspec = (formspec.."background[6.06,0;0.92,0.92;ui_bags_trash.png]"
or minetest.get_player_privs(player_name).give then .."list[detached:trash;main;6,0.1;1,1;]")
formspec[n] = ui.make_trash_slot(7.8, 0.25)
n = n + 1
end end
local inv = player:get_inventory() local inv = player:get_inventory()
for i = 1, 4 do for i = 1, 4 do
local def = get_player_bag_stack(player, i):get_definition() local def = get_player_bag_stack(player, i):get_definition()
local button
if def.groups.bagslots then 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 size = inv:get_size(list_name)
local used = 0 local used = 0
for si = 1, size do for si = 1, size do
@ -87,13 +78,14 @@ for bag_i = 1, 4 do
end end
end end
local img = def.inventory_image local img = def.inventory_image
local label = F(S("Bag @1", i)) .. "\n" .. used .. "/" .. size 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]", button = "image_button["..(i+1)..",0;1,1;"..img..";bag"..i..";"..label.."]"
(i + 1.35)*1.25, img, i, label) else
n = n + 1 button = ""
end end
formspec = formspec..button
end end
return { formspec = table.concat(formspec) } return {formspec=formspec}
end, end,
}) })
end end
@ -103,12 +95,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
return return
end end
for i = 1, 4 do for i = 1, 4 do
if fields["bag" .. i] then if fields["bag"..i] then
local stack = get_player_bag_stack(player, i) local stack = get_player_bag_stack(player, i)
if not stack:get_definition().groups.bagslots then if not stack:get_definition().groups.bagslots then
return return
end end
ui.set_inventory_formspec(player, "bag" .. i) unified_inventory.set_inventory_formspec(player, "bag"..i)
return return
end end
end end
@ -118,32 +110,30 @@ local function save_bags_metadata(player, bags_inv)
local is_empty = true local is_empty = true
local bags = {} local bags = {}
for i = 1, 4 do for i = 1, 4 do
local bag = "bag" .. i local bag = "bag"..i
if not bags_inv:is_empty(bag) then if not bags_inv:is_empty(bag) then
-- Stack limit is 1, otherwise use stack:to_string() -- Stack limit is 1, otherwise use stack:to_string()
bags[i] = bags_inv:get_stack(bag, 1):get_name() bags[i] = bags_inv:get_stack(bag, 1):get_name()
is_empty = false is_empty = false
end end
end end
local meta = player:get_meta()
if is_empty then if is_empty then
meta:set_string("unified_inventory:bags", nil) player:set_attribute("unified_inventory:bags", nil)
else else
meta:set_string("unified_inventory:bags", player:set_attribute("unified_inventory:bags",
minetest.serialize(bags)) minetest.serialize(bags))
end end
end end
local function load_bags_metadata(player, bags_inv) local function load_bags_metadata(player, bags_inv)
local player_inv = player:get_inventory() local player_inv = player:get_inventory()
local meta = player:get_meta() local bags_meta = player:get_attribute("unified_inventory:bags")
local bags_meta = meta:get("unified_inventory:bags")
local bags = bags_meta and minetest.deserialize(bags_meta) or {} local bags = bags_meta and minetest.deserialize(bags_meta) or {}
local dirty_meta = false local dirty_meta = false
if not bags_meta then if not bags_meta then
-- Backwards compatiblity -- Backwards compatiblity
for i = 1, 4 do for i = 1, 4 do
local bag = "bag" .. i local bag = "bag"..i
if not player_inv:is_empty(bag) then if not player_inv:is_empty(bag) then
-- Stack limit is 1, otherwise use stack:to_string() -- Stack limit is 1, otherwise use stack:to_string()
bags[i] = player_inv:get_stack(bag, 1):get_name() bags[i] = player_inv:get_stack(bag, 1):get_name()
@ -153,7 +143,7 @@ local function load_bags_metadata(player, bags_inv)
end end
-- Fill detached slots -- Fill detached slots
for i = 1, 4 do for i = 1, 4 do
local bag = "bag" .. i local bag = "bag"..i
bags_inv:set_size(bag, 1) bags_inv:set_size(bag, 1)
bags_inv:set_stack(bag, 1, bags[i] or "") bags_inv:set_stack(bag, 1, bags[i] or "")
end end
@ -165,16 +155,17 @@ local function load_bags_metadata(player, bags_inv)
-- Clean up deprecated garbage after saving -- Clean up deprecated garbage after saving
for i = 1, 4 do for i = 1, 4 do
local bag = "bag" .. i local bag = "bag"..i
player_inv:set_size(bag, 0) player_inv:set_size(bag, 0)
end end
end end
minetest.register_on_joinplayer(function(player) minetest.register_on_joinplayer(function(player)
local player_inv = player:get_inventory()
local player_name = player:get_player_name() 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) 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) stack:get_definition().groups.bagslots)
save_bags_metadata(player, inv) save_bags_metadata(player, inv)
end, end,
@ -184,14 +175,14 @@ minetest.register_on_joinplayer(function(player)
return 0 return 0
end end
local player_inv = player:get_inventory() 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 if new_slots >= old_slots then
return 1 return 1
end end
-- using a smaller bag, make sure it fits -- 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 new_list = {}
local slots_used = 0 local slots_used = 0
local use_new_list = false local use_new_list = false
@ -205,7 +196,7 @@ minetest.register_on_joinplayer(function(player)
end end
if new_slots >= slots_used then if new_slots >= slots_used then
if use_new_list then if use_new_list then
player_inv:set_list(listname .. "contents", new_list) player_inv:set_list(listname.."contents", new_list)
end end
return 1 return 1
end end
@ -213,13 +204,13 @@ minetest.register_on_joinplayer(function(player)
return 0 return 0
end, end,
allow_take = function(inv, listname, index, stack, player) 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() return stack:get_count()
end end
return 0 return 0
end, end,
on_take = function(inv, listname, index, stack, player) 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) save_bags_metadata(player, inv)
end, end,
allow_move = function() allow_move = function()
@ -254,7 +245,7 @@ if minetest.get_modpath("farming") ~= nil then
minetest.register_craft({ minetest.register_craft({
output = "unified_inventory:bag_small", output = "unified_inventory:bag_small",
recipe = { recipe = {
{"", "farming:string", ""}, {"", "farming:cotton", ""},
{"group:wool", "group:wool", "group:wool"}, {"group:wool", "group:wool", "group:wool"},
{"group:wool", "group:wool", "group:wool"}, {"group:wool", "group:wool", "group:wool"},
}, },
@ -264,8 +255,8 @@ if minetest.get_modpath("farming") ~= nil then
output = "unified_inventory:bag_medium", output = "unified_inventory:bag_medium",
recipe = { recipe = {
{"", "", ""}, {"", "", ""},
{"farming:string", "unified_inventory:bag_small", "farming:string"}, {"farming:cotton", "unified_inventory:bag_small", "farming:cotton"},
{"farming:string", "unified_inventory:bag_small", "farming:string"}, {"farming:cotton", "unified_inventory:bag_small", "farming:cotton"},
}, },
}) })
@ -273,8 +264,8 @@ if minetest.get_modpath("farming") ~= nil then
output = "unified_inventory:bag_large", output = "unified_inventory:bag_large",
recipe = { recipe = {
{"", "", ""}, {"", "", ""},
{"farming:string", "unified_inventory:bag_medium", "farming:string"}, {"farming:cotton", "unified_inventory:bag_medium", "farming:cotton"},
{"farming:string", "unified_inventory:bag_medium", "farming:string"}, {"farming:cotton", "unified_inventory:bag_medium", "farming:cotton"},
}, },
}) })
end end

View file

@ -19,8 +19,6 @@ minetest.register_on_joinplayer(function(player)
unified_inventory.active_search_direction[player_name] = "nochange" unified_inventory.active_search_direction[player_name] = "nochange"
unified_inventory.apply_filter(player, "", "nochange") unified_inventory.apply_filter(player, "", "nochange")
unified_inventory.current_searchbox[player_name] = "" 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.alternate[player_name] = 1
unified_inventory.current_item[player_name] = nil unified_inventory.current_item[player_name] = nil
unified_inventory.current_craft_direction[player_name] = "recipe" unified_inventory.current_craft_direction[player_name] = "recipe"
@ -30,6 +28,7 @@ minetest.register_on_joinplayer(function(player)
-- Refill slot -- Refill slot
local refill = minetest.create_detached_inventory(player_name.."refill", { local refill = minetest.create_detached_inventory(player_name.."refill", {
allow_put = function(inv, listname, index, stack, player) allow_put = function(inv, listname, index, stack, player)
local player_name = player:get_player_name()
if unified_inventory.is_creative(player_name) then if unified_inventory.is_creative(player_name) then
return stack:get_count() return stack:get_count()
else else
@ -37,6 +36,7 @@ minetest.register_on_joinplayer(function(player)
end end
end, end,
on_put = function(inv, listname, index, stack, player) 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 local handle_refill = (minetest.registered_items[stack:get_name()] or {}).on_refill or default_refill
stack = handle_refill(stack) stack = handle_refill(stack)
inv:set_stack(listname, index, stack) inv:set_stack(listname, index, stack)
@ -47,15 +47,6 @@ minetest.register_on_joinplayer(function(player)
refill:set_size("main", 1) refill:set_size("main", 1)
end) 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) minetest.register_on_player_receive_fields(function(player, formname, fields)
local player_name = player:get_player_name() local player_name = player:get_player_name()
@ -69,41 +60,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.searchbox if fields.searchbox
and fields.searchbox ~= unified_inventory.current_searchbox[player_name] then and fields.searchbox ~= unified_inventory.current_searchbox[player_name] then
unified_inventory.current_searchbox[player_name] = fields.searchbox unified_inventory.current_searchbox[player_name] = fields.searchbox
end unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name])
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 end
for i, def in pairs(unified_inventory.buttons) do for i, def in pairs(unified_inventory.buttons) do
@ -155,19 +112,21 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
unified_inventory.current_page[player_name]) unified_inventory.current_page[player_name])
end end
-- Check clicked item image button
local clicked_item local clicked_item
for name, value in pairs(fields) do 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) clicked_item = unified_inventory.demangle_for_formspec(mangled_item)
if string.sub(clicked_item, 1, 6) == "group:" then if string.sub(clicked_item, 1, 6) == "group:" then
-- Change search filter to this group minetest.sound_play("click", {to_player=player_name, gain = 0.1})
unified_inventory.current_category[player_name] = "all" unified_inventory.apply_filter(player, clicked_item, new_dir)
apply_new_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])
return return
end 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 unified_inventory.current_craft_direction[player_name] = new_dir
end end
break break
@ -186,7 +145,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
unified_inventory.alternate[player_name] = 1 unified_inventory.alternate[player_name] = 1
unified_inventory.set_inventory_formspec(player, "craftguide") unified_inventory.set_inventory_formspec(player, "craftguide")
elseif player_creative then elseif player_creative then
-- Creative page: Add entire stack to inventory
local inv = player:get_inventory() local inv = player:get_inventory()
local stack = ItemStack(clicked_item) local stack = ItemStack(clicked_item)
stack:set_count(stack:get_stack_max()) stack:set_count(stack:get_stack_max())
@ -204,7 +162,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
minetest.sound_play("paperflip2", minetest.sound_play("paperflip2",
{to_player=player_name, gain = 1.0}) {to_player=player_name, gain = 1.0})
elseif fields.searchresetbutton then elseif fields.searchresetbutton then
apply_new_filter(player, "", "nochange") 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})
end end
-- alternate buttons -- alternate buttons

View file

@ -1,149 +0,0 @@
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 = "default:stick",
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)
if config and config.symbol then
unified_inventory.set_category_symbol(category_name, config.symbol)
end
if config and config.label then
unified_inventory.set_category_label(category_name, config.label)
end
if config and config.index then
unified_inventory.set_category_index(category_name, config.index)
end
if config and 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

View file

@ -1,704 +0,0 @@
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)
--]]

View file

@ -0,0 +1,6 @@
default
creative?
sfinv?
intllib?
datastorage?
farming?

View file

@ -0,0 +1 @@
Unified Inventory replaces the default survival and creative inventory. It adds a nicer interface and a number of features, such as a crafting guide.

View file

@ -1,172 +0,0 @@
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")

View file

@ -1,13 +1,8 @@
local S = minetest.get_translator("unified_inventory") local S = unified_inventory.gettext
function unified_inventory.canonical_item_spec_matcher(spec) function unified_inventory.canonical_item_spec_matcher(spec)
local specname = ItemStack(spec):get_name() local specname = ItemStack(spec):get_name()
if specname:sub(1, 6) ~= "group:" then if specname:sub(1, 6) == "group:" then
return function (itemname)
return itemname == specname
end
end
local group_names = specname:sub(7):split(",") local group_names = specname:sub(7):split(",")
return function (itemname) return function (itemname)
local itemdef = minetest.registered_items[itemname] local itemdef = minetest.registered_items[itemname]
@ -18,6 +13,9 @@ function unified_inventory.canonical_item_spec_matcher(spec)
end end
return true return true
end end
else
return function (itemname) return itemname == specname end
end
end end
function unified_inventory.item_matches_spec(item, spec) function unified_inventory.item_matches_spec(item, spec)
@ -27,11 +25,23 @@ end
function unified_inventory.extract_groupnames(groupname) function unified_inventory.extract_groupnames(groupname)
local specname = ItemStack(groupname):get_name() local specname = ItemStack(groupname):get_name()
if specname:sub(1, 6) ~= "group:" then 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
return nil, 0 return nil, 0
end end
local group_names = specname:sub(7):split(",")
return table.concat(group_names, S(" and ")), #group_names
end end
unified_inventory.registered_group_items = { unified_inventory.registered_group_items = {

View file

@ -3,6 +3,9 @@
local modpath = minetest.get_modpath(minetest.get_current_modname()) local modpath = minetest.get_modpath(minetest.get_current_modname())
local worldpath = minetest.get_worldpath() local worldpath = minetest.get_worldpath()
-- Intllib
local S, NS = dofile(modpath .. "/intllib.lua")
-- Data tables definitions -- Data tables definitions
unified_inventory = { unified_inventory = {
activefilter = {}, activefilter = {},
@ -10,8 +13,6 @@ unified_inventory = {
alternate = {}, alternate = {},
current_page = {}, current_page = {},
current_searchbox = {}, current_searchbox = {},
current_category = {},
current_category_scroll = {},
current_index = {}, current_index = {},
current_item = {}, current_item = {},
current_craft_direction = {}, current_craft_direction = {},
@ -32,113 +33,26 @@ unified_inventory = {
-- Default inventory page -- Default inventory page
default = "craft", default = "craft",
-- intllib
gettext = S,
-- "Lite" mode -- "Lite" mode
lite_mode = minetest.settings:get_bool("unified_inventory_lite"), 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
trash_enabled = (minetest.settings:get_bool("unified_inventory_trash") ~= false), 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 = 2
}
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, pagecols = 8,
pagerows = 9, pagerows = 10,
page_x = 10.75, page_y = 0,
page_y = 2.30, formspec_y = 1,
craft_x = 2.8, main_button_x = 0,
craft_y = 1.15, main_button_y = 9,
craftresult_x = 7.8, craft_result_x = 0.3,
craft_arrow_x = 6.55, craft_result_y = 0.5,
craft_guide_x = 3.3, form_header_y = 0
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 -- Disable default creative inventory
local creative = rawget(_G, "creative") or rawget(_G, "creative_inventory") local creative = rawget(_G, "creative") or rawget(_G, "creative_inventory")
if creative then if creative then
@ -154,11 +68,9 @@ if sfinv then
end end
dofile(modpath.."/group.lua") dofile(modpath.."/group.lua")
dofile(modpath.."/category.lua") dofile(modpath.."/api.lua")
dofile(modpath.."/default-categories.lua")
dofile(modpath.."/internal.lua") dofile(modpath.."/internal.lua")
dofile(modpath.."/callbacks.lua") dofile(modpath.."/callbacks.lua")
dofile(modpath.."/match_craft.lua")
dofile(modpath.."/register.lua") dofile(modpath.."/register.lua")
if minetest.settings:get_bool("unified_inventory_bags") ~= false then if minetest.settings:get_bool("unified_inventory_bags") ~= false then

View file

@ -1,6 +1,5 @@
local S = minetest.get_translator("unified_inventory") local S = unified_inventory.gettext
local F = minetest.formspec_escape local F = minetest.formspec_escape
local ui = unified_inventory
-- This pair of encoding functions is used where variable text must go in -- This pair of encoding functions is used where variable text must go in
-- button names, where the text might contain formspec metacharacters. -- button names, where the text might contain formspec metacharacters.
@ -10,61 +9,78 @@ local ui = unified_inventory
-- This is a game engine bug, and in the anticipation that it might be -- 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 -- fixed some day we don't want to rely on it. So for safety we apply
-- an encoding that avoids all formspec metacharacters. -- 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) return string.gsub(str, "([^A-Za-z0-9])", function (c) return string.format("_%d_", string.byte(c)) end)
end end
function ui.demangle_for_formspec(str) function unified_inventory.demangle_for_formspec(str)
return string.gsub(str, "_([0-9]+)_", function (v) return string.char(v) end) return string.gsub(str, "_([0-9]+)_", function (v) return string.char(v) end)
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})
function ui.get_per_player_formspec(player_name) local ui = {}
local draw_lite_mode = ui.lite_mode and not minetest.check_player_privs(player_name, {ui_full=true}) 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
return table.copy(draw_lite_mode and ui.style_lite or ui.style_full), draw_lite_mode if lite then
end ui.pagecols = 4
ui.pagerows = 6
local function formspec_button(ui_peruser, name, image, offset, pos, scale, label) ui.page_y = 0.25
local element = 'image_button' ui.formspec_y = 0.47
if minetest.registered_items[image] then ui.main_button_x = 8.2
element = 'item_image_button' 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 end
local spc = (1-scale)*ui_peruser.btn_size/2
local size = ui_peruser.btn_size*scale ui.items_per_page = ui.pagecols * ui.pagerows
return string.format("%s[%f,%f;%f,%f;%s;%s;]", element, return ui, lite
(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 end
function ui.get_formspec(player, page) function unified_inventory.get_formspec(player, page)
if not player then if not player then
return "" return ""
end end
local player_name = player:get_player_name() local player_name = player:get_player_name()
local ui_peruser,draw_lite_mode = ui.get_per_player_formspec(player_name) local ui_peruser,draw_lite_mode = unified_inventory.get_per_player_formspec(player_name)
ui.current_page[player_name] = page unified_inventory.current_page[player_name] = page
local pagedef = ui.pages[page] local pagedef = unified_inventory.pages[page]
if not pagedef then local formspec = {
"size[14,10]",
"background[-0.19,-0.25;14.4,10.75;ui_form_bg.png]" -- 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 return "" -- Invalid page name
end end
local formspec = { local perplayer_formspec = unified_inventory.get_per_player_formspec(player_name)
"formspec_version[4]",
"size["..ui_peruser.formw..","..ui_peruser.formh.."]",
pagedef.formspec_prepend and "" or "no_prepend[]",
ui.standard_background
}
local n = 5
local perplayer_formspec = ui.get_per_player_formspec(player_name)
local fsdata = pagedef.get_formspec(player, perplayer_formspec) local fsdata = pagedef.get_formspec(player, perplayer_formspec)
formspec[n] = fsdata.formspec formspec[n] = fsdata.formspec
@ -77,7 +93,7 @@ function ui.get_formspec(player, page)
local filtered_inv_buttons = {} local filtered_inv_buttons = {}
for i, def in pairs(ui.buttons) do for i, def in pairs(unified_inventory.buttons) do
if not (draw_lite_mode and def.hide_lite) then if not (draw_lite_mode and def.hide_lite) then
table.insert(filtered_inv_buttons, def) table.insert(filtered_inv_buttons, def)
end end
@ -92,20 +108,21 @@ function ui.get_formspec(player, page)
if def.type == "image" then if def.type == "image" then
if (def.condition == nil or def.condition(player) == true) then if (def.condition == nil or def.condition(player) == true) then
formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s;]", formspec[n] = "image_button["
ui_peruser.main_button_x + ui_peruser.btn_spc * (i - 1) - button_col * ui_peruser.btn_spc * 4, formspec[n+1] = ( ui_peruser.main_button_x + 0.65 * (i - 1) - button_col * 0.65 * 4)
ui_peruser.main_button_y + button_row * ui_peruser.btn_spc, formspec[n+2] = ","..(ui_peruser.main_button_y + button_row * 0.7)..";0.8,0.8;"
ui_peruser.btn_size,ui_peruser.btn_size, formspec[n+3] = F(def.image)..";"
F(def.image), formspec[n+4] = F(def.name)..";]"
F(def.name)) formspec[n+5] = "tooltip["..F(def.name)
formspec[n+1] = "tooltip["..F(def.name)..";"..(def.tooltip or "").."]" formspec[n+6] = ";"..(def.tooltip or "").."]"
n = n+2 n = n+7
else else
formspec[n] = string.format("image[%f,%f;%f,%f;%s^[colorize:#808080:alpha]", formspec[n] = "image["
ui_peruser.main_button_x + ui_peruser.btn_spc * (i - 1) - button_col * ui_peruser.btn_spc * 4, formspec[n+1] = ( ui_peruser.main_button_x + 0.65 * (i - 1) - button_col * 0.65 * 4)
ui_peruser.main_button_y + button_row * ui_peruser.btn_spc, formspec[n+2] = ","..(ui_peruser.main_button_y + button_row * 0.7)..";0.8,0.8;"
ui_peruser.btn_size,ui_peruser.btn_size,def.image) formspec[n+3] = F(def.image).."^[colorize:#808080:alpha]"
n = n+1 n = n+4
end end
end end
end end
@ -113,7 +130,7 @@ function ui.get_formspec(player, page)
if fsdata.draw_inventory ~= false then if fsdata.draw_inventory ~= false then
-- Player inventory -- Player inventory
formspec[n] = "listcolors[#00000000;#00000000]" formspec[n] = "listcolors[#00000000;#00000000]"
formspec[n+1] = ui_peruser.standard_inv formspec[n+1] = "list[current_player;main;0,"..(ui_peruser.formspec_y + 3.5)..";8,4;]"
n = n+2 n = n+2
end end
@ -121,94 +138,71 @@ function ui.get_formspec(player, page)
return table.concat(formspec, "") return table.concat(formspec, "")
end end
-- Category filters -- Controls to flip items pages
local start_x = 9.2
local categories_pos = { ui_peruser.page_x, ui_peruser.page_y-ui_peruser.btn_spc-0.5 } if not draw_lite_mode then
local categories_scroll_pos = { ui_peruser.page_x, ui_peruser.form_header_y-(draw_lite_mode and 0 or 0.2) } 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")) .. "]"
formspec[n] = string.format("background9[%f,%f;%f,%f;%s;false;3]", .. "image_button[" .. (start_x + 0.6 * 1)
ui_peruser.page_x-0.1, categories_scroll_pos[2], .. ",9;.8,.8;ui_doubleleft_icon.png;rewind3;]"
(ui_peruser.btn_spc * ui_peruser.pagecols) + 0.13, 1.4+(draw_lite_mode and 0 or 0.2), .. "tooltip[rewind3;" .. F(S("Back three pages")) .. "]"
"ui_smallbg_9_sliced.png") .. "image_button[" .. (start_x + 0.6 * 2)
n = n + 1 .. ",9;.8,.8;ui_left_icon.png;rewind1;]"
.. "tooltip[rewind1;" .. F(S("Back one page")) .. "]"
formspec[n] = string.format("label[%f,%f;%s]", ui_peruser.page_x, ui_peruser.form_header_y+(draw_lite_mode and 0.3 or 0.2), "Category:") .. "image_button[" .. (start_x + 0.6 * 3)
n = n + 1 .. ",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")) .. "]"
local scroll_offset = 0 .. "image_button[" .. (start_x + 0.6 * 5)
local category_count = #unified_inventory.category_list .. ",9;.8,.8;ui_skip_forward_icon.png;end_list;]"
if category_count > ui_peruser.pagecols then .. "tooltip[end_list;" .. F(S("Last page")) .. "]"
scroll_offset = unified_inventory.current_category_scroll[player_name] else
end formspec[n] =
"image_button[" .. (8.2 + 0.65 * 0)
for index, category in ipairs(unified_inventory.category_list) do .. ",5.8;.8,.8;ui_skip_backward_icon.png;start_list;]"
local column = index - scroll_offset .. "tooltip[start_list;" .. F(S("First page")) .. "]"
if column > 0 and column <= ui_peruser.pagecols then .. "image_button[" .. (8.2 + 0.65 * 1)
local scale = 0.8 .. ",5.8;.8,.8;ui_left_icon.png;rewind1;]"
if unified_inventory.current_category[player_name] == category.name then .. "tooltip[rewind1;" .. F(S("Back one page")) .. "]"
scale = 1 .. "image_button[" .. (8.2 + 0.65 * 2)
end .. ",5.8;.8,.8;ui_right_icon.png;forward1;]"
formspec[n] = formspec_button(ui_peruser, "category_"..category.name, category.symbol, categories_pos, {column-1, 0}, scale, category.label) .. "tooltip[forward1;" .. F(S("Forward one page")) .. "]"
n = n + 1 .. "image_button[" .. (8.2 + 0.65 * 3)
end .. ",5.8;.8,.8;ui_skip_forward_icon.png;end_list;]"
end .. "tooltip[end_list;" .. F(S("Last page")) .. "]"
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"))
n = n + 1
end end
n = n+1
-- Search box -- Search box
formspec[n] = "field_close_on_enter[searchbox;false]" formspec[n] = "field_close_on_enter[searchbox;false]"
n = n+1
formspec[n+1] = string.format("field[%f,%f;%f,%f;searchbox;;%s]", if not draw_lite_mode then
ui_peruser.page_buttons_x, ui_peruser.page_buttons_y, formspec[n] = "field[9.5,8.325;3,1;searchbox;;"
ui_peruser.searchwidth - 0.1, ui_peruser.btn_size, .. F(unified_inventory.current_searchbox[player_name]) .. "]"
F(ui.current_searchbox[player_name])) formspec[n+1] = "image_button[12.2,8.1;.8,.8;ui_search_icon.png;searchbutton;]"
formspec[n+2] = string.format("image_button[%f,%f;%f,%f;ui_search_icon.png;searchbutton;]", .. "tooltip[searchbutton;" ..F(S("Search")) .. "]"
ui_peruser.page_buttons_x + ui_peruser.searchwidth, ui_peruser.page_buttons_y, formspec[n+2] = "image_button[12.9,8.1;.8,.8;ui_reset_icon.png;searchresetbutton;]"
ui_peruser.btn_size,ui_peruser.btn_size) .. "tooltip[searchbutton;" ..F(S("Search")) .. "]"
formspec[n+3] = "tooltip[searchbutton;" ..F(S("Search")) .. "]" .. "tooltip[searchresetbutton;" ..F(S("Reset search and display everything")) .. "]"
formspec[n+4] = string.format("image_button[%f,%f;%f,%f;ui_reset_icon.png;searchresetbutton;]", else
ui_peruser.page_buttons_x + ui_peruser.searchwidth + ui_peruser.btn_spc, formspec[n] = "field[8.5,5.225;2.2,1;searchbox;;"
ui_peruser.page_buttons_y, .. F(unified_inventory.current_searchbox[player_name]) .. "]"
ui_peruser.btn_size, ui_peruser.btn_size) formspec[n+1] = "image_button[10.3,5;.8,.8;ui_search_icon.png;searchbutton;]"
formspec[n+5] = "tooltip[searchresetbutton;"..F(S("Reset search and display everything")).."]" .. "tooltip[searchbutton;" ..F(S("Search")) .. "]"
formspec[n+2] = "image_button[11,5;.8,.8;ui_reset_icon.png;searchresetbutton;]"
n = n + 6 .. "tooltip[searchbutton;" ..F(S("Search")) .. "]"
.. "tooltip[searchresetbutton;" ..F(S("Reset search and display everything")) .. "]"
-- 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 draw_lite_mode then
btnlist[5] = nil
btnlist[2] = 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 end
n = n+3
local no_matches = S("No matching items") local no_matches = S("No matching items")
if draw_lite_mode then if draw_lite_mode then
@ -216,23 +210,24 @@ function ui.get_formspec(player, page)
end end
-- Items list -- Items list
if #ui.filtered_items_list[player_name] == 0 then if #unified_inventory.filtered_items_list[player_name] == 0 then
formspec[n] = "label["..ui_peruser.page_x..","..(ui_peruser.page_y+0.15)..";" .. F(no_matches) .. "]" formspec[n] = "label[8.2,"..ui_peruser.form_header_y..";" .. F(no_matches) .. "]"
else else
local dir = ui.active_search_direction[player_name] local dir = unified_inventory.active_search_direction[player_name]
local list_index = ui.current_index[player_name] local list_index = unified_inventory.current_index[player_name]
local page2 = math.floor(list_index / (ui_peruser.items_per_page) + 1) local page = math.floor(list_index / (ui_peruser.items_per_page) + 1)
local pagemax = math.floor( local pagemax = math.floor(
(#ui.filtered_items_list[player_name] - 1) (#unified_inventory.filtered_items_list[player_name] - 1)
/ (ui_peruser.items_per_page) + 1) / (ui_peruser.items_per_page) + 1)
local item = {}
for y = 0, ui_peruser.pagerows - 1 do for y = 0, ui_peruser.pagerows - 1 do
for x = 0, ui_peruser.pagecols - 1 do for x = 0, ui_peruser.pagecols - 1 do
local name = ui.filtered_items_list[player_name][list_index] local name = unified_inventory.filtered_items_list[player_name][list_index]
local item = minetest.registered_items[name] local item = minetest.registered_items[name]
if item then if item then
-- Clicked on current item: Flip crafting direction -- Clicked on current item: Flip crafting direction
if name == ui.current_item[player_name] then if name == unified_inventory.current_item[player_name] then
local cdir = ui.current_craft_direction[player_name] local cdir = unified_inventory.current_craft_direction[player_name]
if cdir == "recipe" then if cdir == "recipe" then
dir = "usage" dir = "usage"
elseif cdir == "usage" then elseif cdir == "usage" then
@ -240,15 +235,13 @@ function ui.get_formspec(player, page)
end end
else else
-- Default: use active search direction by default -- Default: use active search direction by default
dir = ui.active_search_direction[player_name] dir = unified_inventory.active_search_direction[player_name]
end end
local button_name = "item_button_" .. dir .. "_" local button_name = "item_button_" .. dir .. "_"
.. ui.mangle_for_formspec(name) .. unified_inventory.mangle_for_formspec(name)
formspec[n] = ("item_image_button[%f,%f;%f,%f;%s;%s;]"):format( formspec[n] = ("item_image_button[%f,%f;.81,.81;%s;%s;]"):format(
ui_peruser.page_x + x * ui_peruser.btn_spc, 8.2 + x * 0.7, ui_peruser.formspec_y + ui_peruser.page_y + y * 0.7,
ui_peruser.page_y + y * ui_peruser.btn_spc,
ui_peruser.btn_size, ui_peruser.btn_size,
name, button_name name, button_name
) )
formspec[n + 1] = ("tooltip[%s;%s \\[%s\\]]"):format( formspec[n + 1] = ("tooltip[%s;%s \\[%s\\]]"):format(
@ -260,36 +253,26 @@ function ui.get_formspec(player, page)
end end
end end
end end
formspec[n] = string.format("label[%f,%f;%s: %s]", formspec[n] = "label[8.2,"..ui_peruser.form_header_y..";"..F(S("Page")) .. ": "
ui_peruser.page_buttons_x + ui_peruser.btn_spc * (draw_lite_mode and 1 or 2), .. S("%s of %s"):format(page,pagemax).."]"
ui_peruser.page_buttons_y + 0.1 + ui_peruser.btn_spc * 2,
F(S("Page")), S("@1 of @2",page2,pagemax))
end end
n= n+1 n= n+1
if ui.activefilter[player_name] ~= "" then if unified_inventory.activefilter[player_name] ~= "" then
formspec[n] = string.format("label[%f,%f;%s: %s]", formspec[n] = "label[8.2,"..(ui_peruser.form_header_y + 0.4)..";" .. F(S("Filter")) .. ":]"
ui_peruser.page_x, ui_peruser.page_y - 0.25, formspec[n+1] = "label[9.1,"..(ui_peruser.form_header_y + 0.4)..";"..F(unified_inventory.activefilter[player_name]).."]"
F(S("Filter")), F(ui.activefilter[player_name]))
end end
return table.concat(formspec, "") return table.concat(formspec, "")
end end
function ui.set_inventory_formspec(player, page) function unified_inventory.set_inventory_formspec(player, page)
if player then if player then
player:set_inventory_formspec(ui.get_formspec(player, page)) player:set_inventory_formspec(unified_inventory.get_formspec(player, page))
end end
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) --apply filter to the inventory list (create filtered copy of full one)
function ui.apply_filter(player, filter, search_dir) function unified_inventory.apply_filter(player, filter, search_dir)
if not player then if not player then
return false return false
end end
@ -308,53 +291,34 @@ function ui.apply_filter(player, filter, search_dir)
return true return true
end end
else else
local lang = minetest.get_player_information(player_name).lang_code
ffilter = function(name, def) ffilter = function(name, def)
local lname = string.lower(name) local lname = string.lower(name)
local ldesc = string.lower(def.description) 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) return string.find(lname, lfilter, 1, true) or string.find(ldesc, lfilter, 1, true)
or llocaldesc and string.find(llocaldesc, lfilter, 1, true)
end end
end end
ui.filtered_items_list[player_name]={} local is_creative = unified_inventory.is_creative(player_name)
local category = ui.current_category[player_name] or 'all' unified_inventory.filtered_items_list[player_name]={}
if category == 'all' then
for name, def in pairs(minetest.registered_items) do for name, def in pairs(minetest.registered_items) do
if valid_def(def) if (not def.groups.not_in_creative_inventory
and ffilter(name, def) then or def.groups.not_in_creative_inventory == 0)
table.insert(ui.filtered_items_list[player_name], name) 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
end end
elseif category == 'uncategorized' then table.sort(unified_inventory.filtered_items_list[player_name])
for name, def in pairs(minetest.registered_items) do unified_inventory.filtered_items_list_size[player_name] = #unified_inventory.filtered_items_list[player_name]
if (not ui.find_category(name)) unified_inventory.current_index[player_name] = 1
and valid_def(def) unified_inventory.activefilter[player_name] = filter
and ffilter(name, def) then unified_inventory.active_search_direction[player_name] = search_dir
table.insert(ui.filtered_items_list[player_name], name) unified_inventory.set_inventory_formspec(player,
end unified_inventory.current_page[player_name])
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 end
function ui.items_in_group(groups) function unified_inventory.items_in_group(groups)
local items = {} local items = {}
for name, item in pairs(minetest.registered_items) do for name, item in pairs(minetest.registered_items) do
for _, group in pairs(groups:split(',')) do for _, group in pairs(groups:split(',')) do
@ -366,7 +330,7 @@ function ui.items_in_group(groups)
return items return items
end end
function ui.sort_inventory(inv) function unified_inventory.sort_inventory(inv)
local inlist = inv:get_list("main") local inlist = inv:get_list("main")
local typecnt = {} local typecnt = {}
local typekeys = {} local typekeys = {}

View file

@ -0,0 +1,45 @@
-- Fallback functions for when `intllib` is not installed.
-- Code released under Unlicense <http://unlicense.org>.
-- 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

View file

@ -2,24 +2,24 @@
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 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 hudbars_mod = minetest.get_modpath("hudbars")
local function set_hud(player) local function set_hud(player)
local player_name = player:get_player_name() local player_name = player:get_player_name()
local off = {x=0, y=-65} local off = {x=0, y=-70}
if hudbars_mod then if air_hud_mod or hud_mod then
-- Assume no alignment (2 per line) off.y = off.y - 20
off.y = off.y - math.ceil(hb.hudbars_count / 2) * 25 elseif hudbars_mod then
else off.y = off.y + 13
off.y = off.y - 25
end end
item_names[player_name] = { item_names[player_name] = {
hud = player:hud_add({ hud = player:hud_add({
hud_elem_type = "text", hud_elem_type = "text",
position = {x=0.5, y=1}, position = {x=0.5, y=1},
offset = off, offset = off,
alignment = {x=0, y=-1}, alignment = {x=0, y=0},
number = 0xFFFFFF, number = 0xFFFFFF,
text = "", text = "",
}), }),

View file

@ -0,0 +1,366 @@
# 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 <codexp@gmx.net>, 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 <codexp@gmx.net>\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"

View file

@ -0,0 +1,366 @@
# 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 <kaeza>
# CodeXP <codexp@gmx.net>, 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 <codexp@gmx.net>\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"

View file

@ -0,0 +1,364 @@
# 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 <codexp@gmx.net>, 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 <codexp@gmx.net>\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"

View file

@ -0,0 +1,369 @@
# Malay 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.
# muhdnurhidayat <translation@mnh48.moe>, 2018.
#
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: 2018-07-17 20:14+0800\n"
"Language-Team: muhdnurhidayat <translation@mnh48.moe>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.9\n"
"Last-Translator: muhdnurhidayat <translation@mnh48.moe>\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"Language: ms\n"
"X-Poedit-Flags-xgettext: --add-comments\n"
#: api.lua register.lua
msgid "Crafting"
msgstr "Pertukangan"
#: api.lua
msgid "Mixing"
msgstr "Pencampuran"
#: api.lua
msgid "Cooking"
msgstr "Pemasakan"
#: api.lua
msgid "Digging"
msgstr "Penggalian"
#: bags.lua
msgid "Bags"
msgstr "Beg"
#: bags.lua
msgid "Bag @1"
msgstr "Beg @1"
#: bags.lua
msgid "Small Bag"
msgstr "Beg Kecil"
#: bags.lua
msgid "Medium Bag"
msgstr "Beg Sederhana"
#: bags.lua
msgid "Large Bag"
msgstr "Beg Besar"
#: group.lua
msgid " and "
msgstr " dan "
#: internal.lua
msgid "First page"
msgstr "Halaman pertama"
#: internal.lua
msgid "Back three pages"
msgstr "Tiga halaman sebelumnya"
#: internal.lua
msgid "Back one page"
msgstr "Halaman sebelumnya"
#: internal.lua
msgid "Forward one page"
msgstr "Halaman seterusnya"
#: internal.lua
msgid "Forward three pages"
msgstr "Tiga halaman seterusnya"
#: internal.lua
msgid "Last page"
msgstr "Halaman terakhir"
#: internal.lua
msgid "Search"
msgstr "Cari"
#: internal.lua
msgid "Reset search and display everything"
msgstr "Set semula carian dan tunjukkan semua benda"
#: internal.lua
msgid "No matching items"
msgstr "Tiada item sepadan"
#: internal.lua
msgid "No matches."
msgstr "Tiada padanan."
#: internal.lua
msgid "Page"
msgstr "Halaman"
#: internal.lua
#, lua-format
msgid "%s of %s"
msgstr "%s drpd %s"
#: internal.lua
msgid "Filter"
msgstr "Tapis"
#: register.lua
msgid "Can use the creative inventory"
msgstr "Boleh guna inventori kreatif"
#: register.lua
msgid ""
"Forces Unified Inventory to be displayed in Full mode if Lite mode is "
"configured globally"
msgstr ""
"Memaksa Unified Inventory untuk dipaparkan dalam mod Full jika mod Lite "
"ditetapkan secara global"
#: register.lua
msgid "Crafting Grid"
msgstr "Grid Pertukangan"
#: register.lua
msgid "Crafting Guide"
msgstr "Panduan Pertukangan"
#: register.lua
msgid "Set home position"
msgstr "Tetapkan kedudukan rumah"
#: register.lua
#, lua-format
msgid "Home position set to: %s"
msgstr "Kedudukan rumah ditetapkan ke: %s"
#: register.lua
msgid "You don't have the \"home\" privilege!"
msgstr "Anda tidak ada keistimewaan \"home\"!"
#: register.lua
msgid "Go home"
msgstr "Balik rumah"
#: register.lua
msgid "Set time to day"
msgstr "Tetapkan masa jadi siang"
#: register.lua
msgid "Time of day set to 6am"
msgstr "Masa ditetapkan ke 6 pagi"
#: register.lua
msgid "You don't have the settime privilege!"
msgstr "Anda tidak ada keistimewaan settime!"
#: register.lua
msgid "Set time to night"
msgstr "Tetapkan masa jadi malam"
#: register.lua
msgid "Time of day set to 9pm"
msgstr "Masa ditetapkan ke 9 malam"
#: register.lua
msgid "Clear inventory"
msgstr "Kosongkan inventori"
#: register.lua
msgid ""
"This button has been disabled outside of creative mode to prevent accidental "
"inventory trashing.\n"
"Use the trash slot instead."
msgstr ""
"Butang ini dilumpuhkan di luar mod kreatif untuk mengelakkan pengosongan "
"inventori secara tidak sengaja.\n"
"Sebaliknya, gunakan slot tong sampah."
#: register.lua
msgid "Inventory cleared!"
msgstr "Inventori dikosongkan!"
#: register.lua
msgid "Trash:"
msgstr "Buang:"
#: register.lua
msgid "Refill:"
msgstr "Isi balik:"
#: register.lua
#, lua-format
msgid "Any item belonging to the %s group"
msgstr "Sebarang item dari kumpulan %s"
#: register.lua
#, lua-format
msgid "Any item belonging to the groups %s"
msgstr "Sebarang item dari kumpulan %s"
#: register.lua
#, lua-format
msgid "Recipe %d of %d"
msgstr "Resipi %d drpd %d"
#: register.lua
#, lua-format
msgid "Usage %d of %d"
msgstr "Kegunaan %d drpd %d"
#: register.lua
msgid "No recipes"
msgstr "Tiada resipi"
#: register.lua
msgid "No usages"
msgstr "Tiada kegunaan"
#: register.lua
msgid "Result"
msgstr "Hasil"
#: register.lua
msgid "Ingredient"
msgstr "Bahan"
#: register.lua
msgid "Show next recipe"
msgstr "Tunjuk resipi seterusnya"
#: register.lua
msgid "Show next usage"
msgstr "Tunjuk kegunaan seterusnya"
#: register.lua
msgid "Show previous recipe"
msgstr "Tunjuk resipi sebelumnya"
#: register.lua
msgid "Show previous usage"
msgstr "Tunjuk kegunaan sebelumnya"
#: register.lua
#, lua-format
msgid "%s (%s)"
msgstr "%s (%s)"
#: register.lua
msgid "Give me:"
msgstr "Beri saya:"
#: register.lua
msgid ""
"This recipe is too\n"
"large to be displayed."
msgstr ""
"Resipi ini terlalu\n"
"besar untuk paparan."
#: register.lua
msgid "To craft grid:"
msgstr "Ke grid pertukangan:"
#: register.lua
msgid "All"
msgstr ""
"SE\n"
"MUA"
#: waypoints.lua
msgid "White"
msgstr "Putih"
#: waypoints.lua
msgid "Yellow"
msgstr "Kuning"
#: waypoints.lua
msgid "Red"
msgstr "Merah"
#: waypoints.lua
msgid "Green"
msgstr "Hijau"
#: waypoints.lua
msgid "Blue"
msgstr "Biru"
#: waypoints.lua
msgid "Waypoints"
msgstr "Titik Arah"
#: waypoints.lua
#, lua-format
msgid "Select Waypoint #%d"
msgstr "Pilih Titik Arah #%d"
#: waypoints.lua
#, lua-format
msgid "Waypoint %d"
msgstr "Titik Arah %d"
#: waypoints.lua
msgid "Set waypoint to current location"
msgstr "Tetapkan titik arah ke lokasi semasa"
#: waypoints.lua
msgid "invisible"
msgstr "Sembunyikan"
#: waypoints.lua
msgid "visible"
msgstr "Paparkan"
#: waypoints.lua
msgid "Make waypoint @1"
msgstr "@1 titik arah"
#: waypoints.lua
msgid "Disable"
msgstr "Sembunyikan"
#: waypoints.lua
msgid "Enable"
msgstr "Paparkan"
#: waypoints.lua
msgid "@1 display of waypoint coordinates"
msgstr "@1 koordinat untuk titik arah"
#: waypoints.lua
msgid "Change color of waypoint display"
msgstr "Tukar warna paparan titik arah"
#: waypoints.lua
msgid "Edit waypoint name"
msgstr "Edit nama titik arah"
#: waypoints.lua
msgid "Waypoint active"
msgstr "Titik arah aktif"
#: waypoints.lua
msgid "Waypoint inactive"
msgstr "Titik arah tidak aktif"
#: waypoints.lua
msgid "Finish editing"
msgstr "Selesai edit"
#: waypoints.lua
msgid "World position"
msgstr "Kedudukan dunia"
#: waypoints.lua
msgid "Name"
msgstr "Nama"
#: waypoints.lua
msgid "HUD text color"
msgstr "Warna tulisan HUD"

View file

@ -0,0 +1,359 @@
# 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 <codexp@gmx.net>, 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 <codexp@gmx.net>\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"

View file

@ -0,0 +1,366 @@
# 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 <lunovox@openmailbox.org>
# CodeXP <codexp@gmx.net>, 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 <codexp@gmx.net>\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"

View file

@ -0,0 +1,366 @@
# 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 <codexp@gmx.net>, 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 <codexp@gmx.net>\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а"

View file

@ -0,0 +1,360 @@
# 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 <codexp@gmx.net>, 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 <codexp@gmx.net>\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"

View file

@ -1,79 +0,0 @@
# textdomain: unified_inventory
Crafting=Fertigung
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
and = und
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
Search=Suchen
Reset search and display everything=Suche zurücksetzen und alles anzeigen
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
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
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
Give me:=Gib mir:
To craft grid:=Ins Fertigungsraster:
All=Alles
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
invisible=unsichtbar
visible=sichtbar
Make waypoint @1=Wegpunkt @1 machen
Disable=ausschalten
Enable=einschalten
@1 display of waypoint coordinates=Anzeige der Wegpunktkoordinaten @1
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
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

View file

@ -1,100 +0,0 @@
# textdomain: unified_inventory
# waypoints.lua
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
Make waypoint @1=Hacer punto @1
invisible=invisible
visible=visible
@1 display of waypoint coordinates=Visualizar coordenadas del punto @1
Disable=Deshabilitado
Enable=Habilitado
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
# group.lua
and = y
# 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!=¡No tienes el privilegio \"home\"!
Go home=Ir a casa
Set time to day=Cambiar a dia
Set time to night=Cambiar a noche
Time of day set to 6am=Hora del día cambiada a 6 AM
Time of day set to 9pm=Hora del día cambiada a 9 PM
You don't have the settime privilege!=¡No tienes el privilegio "settime"!
Clear inventory=Limpiar inventario
Inventory cleared!=¡Inventario limpio!
This button has been disabled outside=Este botón ha sido deshabilitado
Crafting=Elaboración
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@nlarge to be displayed.=Esta receta es demasiado@ngrande para ser mostrada.
To craft grid:=Construir:
All=Todos
# api.lua
Mixing=Mezclar
Cooking=Hornear
Digging=Recoger
# 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
Search=Buscar
Reset search and display everything=Limpiar la busqueda y mostrar todo
No matching items=No se encontraron elementos
No matches.=No hay resultados.
Page=Página
@1 of @2=@1 de @2
Filter=Filtro
# bags.lua
Bags=Bolsos
Bag @1=Bolso @1
Small Bag=Bolso Pequeño
Medium Bag=Bolso Mediano
Large Bag=Bolso Grande

View file

@ -1,57 +0,0 @@
# textdomain: unified_inventory
Crafting=Création
Cooking=Cuisson
Digging=Creuser
Bags=Sacs
Bag @1=Sac @1
Small Bag=Petit sac
Medium Bag=Sac moyen
Large Bag=Grand sac
and = et
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
Search=Rechercher
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
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"!
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"!
Time of day set to 9pm=Heure fixée à 21h
Inventory cleared!=Inventaire vidé !
Trash:=Poubelle :
Refill:=Remplir :
Recipe @1 of @2=Recette @1 de @2
Result=Résultat
To craft grid:=Sur de création:
All=Tout
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
Make waypoint @1=Rendre @1 le point de passage
@1 display of waypoint coordinates=@1 montrer les coordonnées des points de passages
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

View file

@ -1,79 +0,0 @@
# textdomain: unified_inventory
Crafting=Assemblaggio
Mixing=Unione
Cooking=Cottura
Digging=Scavo
Bags=Borse
Bag @1=Borsa @1
Small Bag=Borsa piccola
Medium Bag=Borsa media
Large Bag=Borsa grande
and = e
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
Search=Cerca
Reset search and display everything=Azzera la ricerca e mostra tutto
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
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
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
Give me:=Dammi:
To craft grid:=Alla griglia di assemblaggio:
All=Tutto
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
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
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
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

View file

@ -1,78 +0,0 @@
# textdomain: unified_inventory
Crafting=Pertukangan
Mixing=Pencampuran
Cooking=Pemasakan
Digging=Penggalian
Bags=Beg
Bag @1=Beg @1
Small Bag=Beg Kecil
Medium Bag=Beg Sederhana
Large Bag=Beg Besar
and = dan
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
Search=Cari
Reset search and display everything=Set semula carian dan tunjukkan semua benda
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
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
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:
To craft grid:=Ke grid 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
invisible=Sembunyikan
visible=Paparkan
Make waypoint @1=@1 titik arah
Disable=Sembunyikan
Enable=Paparkan
@1 display of waypoint coordinates=@1 koordinat untuk titik arah
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

View file

@ -1,61 +0,0 @@
# textdomain: unified_inventory
Bags=Plecaki
Bag @1=Plecak @1
Small Bag=Maly plecak
Medium Bag=Sredni plecak
Large Bag=Duzy plecak
and = i
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
Search=Szukaj
No matching items=Brak pasujacych przedmiotow
No matches.=Brak wyników
Page=Strona
@1 of @2=@1 z @2
Filter=Filtr
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
Inventory cleared!=Zapasy zostały wyczyszczone!
Trash:=Smietnik:
Refill:=Uzupelnianie:
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
Give me:=Daj mi:
All=Wszystko
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
invisible=niewidzialny
visible=widomy
Make waypoint @1=Robić punkt @1
@1 display of waypoint coordinates=@1 koordynatow punktu
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

View file

@ -1,76 +0,0 @@
# textdomain: unified_inventory
Crafting=Artesanato
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
and = e
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
Search=Pesquisar
Reset search and display everything=Redefinir pesquisa e exibir tudo
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
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
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
Give me:=Gerado:
To craft grid:=Para Grade de Artesanato
All=MAX
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
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
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

View file

@ -1,78 +0,0 @@
# textdomain: unified_inventory
Crafting=Крафт
Mixing=Мешать
Cooking=Варить
Digging=Копать
Bags=Сумки
Bag @1=Сумка @1
Small Bag=Малая сумка
Medium Bag=Средняя сумка
Large Bag=Большая сумка
and = и
First page=Первая страница
Back three pages=3 страницы назад
Back one page=1 страницу назад
Forward one page=1 страницу вперёд
Forward three pages=3 страницы вперёд
Last page=Последняя страница
Search=Поиск
Reset search and display everything=Сброс поиска, показать всё
No matching items=Нет подходящих элементов
No matches.=Ничего не найдено
Page=Страница
@1 of @2=@1 из @2
Filter=Фильтр
Can use the creative inventory=Можно использовать инвентарь творческого режима
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=Очистить инвентарь
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=Прошлая страница
Give me:=Дай мне:
To craft grid:=На решeтку крафта:
All=Все
White=Белый
Yellow=Желтый
Red=Красный
Green=Зелёный
Blue=Синий
Waypoints=Путевые точки
Select Waypoint #@1=Выбрать путевую точку №@1
Waypoint @1=Путевая точка @1
Set waypoint to current location=Установить путевую точку по текущей позиции
invisible=невидимой
visible=видимой
Make waypoint @1=Сделать путевую точку @1
Disable=Выключить
Enable=Включить
@1 display of waypoint coordinates=@1 показ координат путевых точек
Change color of waypoint display=Поменять цвет путевой точки
Edit waypoint name=Переименовать путевую точку
Waypoint active=Путевая точка включена
Waypoint inactive=Путевая точка выключена
Finish editing=Закончить редакцию
World position=Позиция мира
Name=Имя
HUD text color=Цвет текста HUDа

View file

@ -1,100 +0,0 @@
# textdomain: unified_inventory
# waypoints.lua
White=
Yellow=
Red=
Green=
Blue=
Waypoints=
Select Waypoint #@1=
Waypoint @1=
Set waypoint to current location=
Make waypoint @1=
invisible=
visible=
@1 display of waypoint coordinates=
Disable=
Enable=
Change color of waypoint display=
Edit waypoint name=
Waypoint active=
Waypoint inactive=
Finish editing=
World position=
Name=
HUD text color=
# group.lua
and =
# register.lua
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=
Set time to night=
Time of day set to 6am=
Time of day set to 9pm=
You don't have the settime privilege!=
Clear inventory=
Inventory cleared!=
This button has been disabled outside=
Crafting=
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@nlarge to be displayed.=
To craft grid:=
All=
# api.lua
Mixing=
Cooking=
Digging=
# internal.lua
First page=
Back three pages=
Back one page=
Forward one page=
Forward three pages=
Last page=
Search=
Reset search and display everything=
No matching items=
No matches.=
Page=
@1 of @2=
Filter=
# bags.lua
Bags=
Bag @1=
Small Bag=
Medium Bag=
Large Bag=

View file

@ -1,69 +0,0 @@
# textdomain: unified_inventory
Crafting=Üretim
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
and = ve
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
Search=Ara
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
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ı
msgid ""=Yaratıcı modu dışında iken bu tuş kullanılamaz.
Inventory cleared!=Envanter temizlendi!
Trash:=Çöp
Refill:=Doldur
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
Give me:=Ver bana:
To craft grid:=Üretim tablosuna kopyala
All=Tümü
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
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
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

View file

@ -1,79 +0,0 @@
# textdomain: unified_inventory
# traslation by: IFRFSX(BingFengFSX)
#Email: IFRFSX@Protonmail.com
Crafting=合成
Mixing=混合
Cooking=烹饪
Digging=挖出
Bags=背包
Bag @1=背包@1
Small Bag=小背包
Medium Bag=中背包
Large Bag=大背包
and = 和
First page=第一页
Back three pages=后退三页
Back one page=后退一页
Forward one page=前进一页
Forward three pages=前进三页
Last page=最后一页
Search=搜索
No matching items=没有匹配物品
No matches.=没有匹配
Page=页面
@1 of @2=第@1页共@2页
Filter=过滤器
Can use the creative inventory=可以使用创造背包
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点
Inventory cleared!=清空背包
Clear inventory=清空背包
Trash:=丢弃:
Refill:=填满:
Recipe @1 of @2=第@1配方共@2个
Usage @1 of @2=第@1用法共@2个
No recipes=没有配方
No usages=没有用法
Result=结果
Ingredient=原料
Give me:=给予:
To craft grid:=填充物品到合成表
All=全部
White=白
Yellow=黄
Red=红
Green=绿
Blue=蓝
Waypoints=航路点
Select Waypoint #@1=查询航路点 #@1
Waypoint @1=航路点 @1
Set waypoint to current location=将航路点设置到当前位置
invisible=不可见的
visible=可见的
Make waypoint @1=设置航路点 @1
@1 display of waypoint coordinates=显示航路点@1坐标
Change color of waypoint display=改变航路点显示的颜色
Edit waypoint name=编辑航路点名称
Waypoint active=航路点已激活
Waypoint inactive=航路点未激活
Finish editing=完成编辑
World position=世界位置
Name=名称
HUD text color=HUD文本颜色
Reset search and display everything=重置搜索并显示所有物品
Any item belonging to the @1 group=属于@1组的任何项目
Any item belonging to the groups @1=属于组@1的任何项目

View file

@ -1,79 +0,0 @@
# textdomain: unified_inventory
# traslation by: IFRFSX(BingFengFSX)
#Email: IFRFSX@Protonmail.com
Crafting=合成
Mixing=混合
Cooking=烹飪
Digging=挖出
Bags=揹包
Bag @1=揹包@1
Small Bag=小揹包
Medium Bag=中揹包
Large Bag=大揹包
and = 和
First page=第一頁
Back three pages=後退三頁
Back one page=後退一頁
Forward one page=前進一頁
Forward three pages=前進三頁
Last page=最後一頁
Search=搜索
No matching items=沒有匹配物品
No matches.=沒有匹配
Page=頁面
@1 of @2=第@1頁共@2頁
Filter=過濾器
Can use the creative inventory=可以使用創造揹包
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點
Inventory cleared!=清空揹包
Clear inventory=清空揹包
Trash:=丟棄:
Refill:=填滿:
Recipe @1 of @2=第@1配方共@2個
Usage @1 of @2=第@1用法共@2個
No recipes=沒有配方
No usages=沒有用法
Result=結果
Ingredient=原料
Give me:=給予:
To craft grid:=填充物品到合成表
All=全部
White=白
Yellow=黃
Red=紅
Green=綠
Blue=藍
Waypoints=航路點
Select Waypoint #@1=查詢航路點 #@1
Waypoint @1=航路點 @1
Set waypoint to current location=將航路點設置到當前位置
invisible=不可見的
visible=可見的
Make waypoint @1=設置航路點 @1
@1 display of waypoint coordinates=顯示航路點@1座標
Change color of waypoint display=改變航路點顯示的顏色
Edit waypoint name=編輯航路點名稱
Waypoint active=航路點已激活
Waypoint inactive=航路點未激活
Finish editing=完成編輯
World position=世界位置
Name=名稱
HUD text color=HUD文本顏色
Reset search and display everything=重置搜索並顯示所有物品
Any item belonging to the @1 group=屬於@1組的任何項目
Any item belonging to the groups @1=屬於組@1的任何項目

View file

@ -1,409 +0,0 @@
-- 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

View file

@ -1,8 +1 @@
name = unified_inventory name = unified_inventory
depends = default
optional_depends = 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

View file

@ -1,7 +1,5 @@
local S = minetest.get_translator("unified_inventory") local S = unified_inventory.gettext
local NS = function(s) return s end
local F = minetest.formspec_escape local F = minetest.formspec_escape
local ui = unified_inventory
minetest.register_privilege("creative", { minetest.register_privilege("creative", {
description = S("Can use the creative inventory"), description = S("Can use the creative inventory"),
@ -13,9 +11,10 @@ minetest.register_privilege("ui_full", {
give_to_singleplayer = false, give_to_singleplayer = false,
}) })
local trash = minetest.create_detached_inventory("trash", { local trash = minetest.create_detached_inventory("trash", {
--allow_put = function(inv, listname, index, stack, player) --allow_put = function(inv, listname, index, stack, player)
-- if ui.is_creative(player:get_player_name()) then -- if unified_inventory.is_creative(player:get_player_name()) then
-- return stack:get_count() -- return stack:get_count()
-- else -- else
-- return 0 -- return 0
@ -29,19 +28,19 @@ local trash = minetest.create_detached_inventory("trash", {
}) })
trash:set_size("main", 1) trash:set_size("main", 1)
ui.register_button("craft", { unified_inventory.register_button("craft", {
type = "image", type = "image",
image = "ui_craft_icon.png", image = "ui_craft_icon.png",
tooltip = S("Crafting Grid") tooltip = S("Crafting Grid")
}) })
ui.register_button("craftguide", { unified_inventory.register_button("craftguide", {
type = "image", type = "image",
image = "ui_craftguide_icon.png", image = "ui_craftguide_icon.png",
tooltip = S("Crafting Guide") tooltip = S("Crafting Guide")
}) })
ui.register_button("home_gui_set", { unified_inventory.register_button("home_gui_set", {
type = "image", type = "image",
image = "ui_sethome_icon.png", image = "ui_sethome_icon.png",
tooltip = S("Set home position"), tooltip = S("Set home position"),
@ -49,18 +48,18 @@ ui.register_button("home_gui_set", {
action = function(player) action = function(player)
local player_name = player:get_player_name() local player_name = player:get_player_name()
if minetest.check_player_privs(player_name, {home=true}) then if minetest.check_player_privs(player_name, {home=true}) then
ui.set_home(player, player:get_pos()) unified_inventory.set_home(player, player:getpos())
local home = ui.home_pos[player_name] local home = unified_inventory.home_pos[player_name]
if home ~= nil then if home ~= nil then
minetest.sound_play("dingdong", minetest.sound_play("dingdong",
{to_player=player_name, gain = 1.0}) {to_player=player_name, gain = 1.0})
minetest.chat_send_player(player_name, minetest.chat_send_player(player_name,
S("Home position set to: @1", minetest.pos_to_string(home))) S("Home position set to: %s"):format(minetest.pos_to_string(home)))
end end
else else
minetest.chat_send_player(player_name, minetest.chat_send_player(player_name,
S("You don't have the \"home\" privilege!")) S("You don't have the \"home\" privilege!"))
ui.set_inventory_formspec(player, ui.current_page[player_name]) unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name])
end end
end, end,
condition = function(player) condition = function(player)
@ -68,7 +67,7 @@ ui.register_button("home_gui_set", {
end, end,
}) })
ui.register_button("home_gui_go", { unified_inventory.register_button("home_gui_go", {
type = "image", type = "image",
image = "ui_gohome_icon.png", image = "ui_gohome_icon.png",
tooltip = S("Go home"), tooltip = S("Go home"),
@ -76,13 +75,13 @@ ui.register_button("home_gui_go", {
action = function(player) action = function(player)
local player_name = player:get_player_name() local player_name = player:get_player_name()
if minetest.check_player_privs(player_name, {home=true}) then if minetest.check_player_privs(player_name, {home=true}) then
if ui.go_home(player) then minetest.sound_play("teleport",
minetest.sound_play("teleport", {to_player = player_name}) {to_player=player:get_player_name(), gain = 1.0})
end unified_inventory.go_home(player)
else else
minetest.chat_send_player(player_name, minetest.chat_send_player(player_name,
S("You don't have the \"home\" privilege!")) S("You don't have the \"home\" privilege!"))
ui.set_inventory_formspec(player, ui.current_page[player_name]) unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name])
end end
end, end,
condition = function(player) condition = function(player)
@ -90,7 +89,7 @@ ui.register_button("home_gui_go", {
end, end,
}) })
ui.register_button("misc_set_day", { unified_inventory.register_button("misc_set_day", {
type = "image", type = "image",
image = "ui_sun_icon.png", image = "ui_sun_icon.png",
tooltip = S("Set time to day"), tooltip = S("Set time to day"),
@ -106,7 +105,7 @@ ui.register_button("misc_set_day", {
else else
minetest.chat_send_player(player_name, minetest.chat_send_player(player_name,
S("You don't have the settime privilege!")) S("You don't have the settime privilege!"))
ui.set_inventory_formspec(player, ui.current_page[player_name]) unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name])
end end
end, end,
condition = function(player) condition = function(player)
@ -114,7 +113,7 @@ ui.register_button("misc_set_day", {
end, end,
}) })
ui.register_button("misc_set_night", { unified_inventory.register_button("misc_set_night", {
type = "image", type = "image",
image = "ui_moon_icon.png", image = "ui_moon_icon.png",
tooltip = S("Set time to night"), tooltip = S("Set time to night"),
@ -130,7 +129,7 @@ ui.register_button("misc_set_night", {
else else
minetest.chat_send_player(player_name, minetest.chat_send_player(player_name,
S("You don't have the settime privilege!")) S("You don't have the settime privilege!"))
ui.set_inventory_formspec(player, ui.current_page[player_name]) unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name])
end end
end, end,
condition = function(player) condition = function(player)
@ -138,19 +137,19 @@ ui.register_button("misc_set_night", {
end, end,
}) })
ui.register_button("clear_inv", { unified_inventory.register_button("clear_inv", {
type = "image", type = "image",
image = "ui_trash_icon.png", image = "ui_trash_icon.png",
tooltip = S("Clear inventory"), tooltip = S("Clear inventory"),
action = function(player) action = function(player)
local player_name = player:get_player_name() local player_name = player:get_player_name()
if not ui.is_creative(player_name) then if not unified_inventory.is_creative(player_name) then
minetest.chat_send_player(player_name, minetest.chat_send_player(player_name,
S("This button has been disabled outside" S("This button has been disabled outside"
.." of creative mode to prevent" .." of creative mode to prevent"
.." accidental inventory trashing." .." accidental inventory trashing."
.."\nUse the trash slot instead.")) .."\nUse the trash slot instead."))
ui.set_inventory_formspec(player, ui.current_page[player_name]) unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name])
return return
end end
player:get_inventory():set_list("main", {}) player:get_inventory():set_list("main", {})
@ -159,42 +158,35 @@ ui.register_button("clear_inv", {
{to_player=player_name, gain = 1.0}) {to_player=player_name, gain = 1.0})
end, end,
condition = function(player) condition = function(player)
return ui.is_creative(player:get_player_name()) return unified_inventory.is_creative(player:get_player_name())
end, end,
}) })
ui.register_page("craft", { unified_inventory.register_page("craft", {
get_formspec = function(player, perplayer_formspec) get_formspec = function(player, perplayer_formspec)
local formheaderx = perplayer_formspec.form_header_x local formspecy = perplayer_formspec.formspec_y
local formheadery = perplayer_formspec.form_header_y 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 player_name = player:get_player_name()
local formspec = { local formspec = "background[2,"..formspecy..";6,3;ui_crafting_form.png]"
perplayer_formspec.standard_inv_bg, formspec = formspec.."background[0,"..(formspecy + 3.5)..";8,4;ui_main_inventory.png]"
perplayer_formspec.craft_grid, formspec = formspec.."label[0,"..formheadery..";" ..F(S("Crafting")).."]"
"label["..formheaderx..","..formheadery..";" ..F(S("Crafting")).."]", formspec = formspec.."listcolors[#00000000;#00000000]"
"listcolors[#00000000;#00000000]", formspec = formspec.."list[current_player;craftpreview;6,"..formspecy..";1,1;]"
"listring[current_name;craft]", formspec = formspec.."list[current_player;craft;2,"..formspecy..";3,3;]"
"listring[current_player;main]" 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:")) .. "]"
local n=#formspec+1 formspec = formspec.."background[7,"..(formspecy + 2)..";1,1;ui_single_slot.png]"
formspec = formspec.."list[detached:trash;main;7,"..(formspecy + 2)..";1,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 end
formspec = formspec.."listring[current_name;craft]"
if ui.is_creative(player_name) then formspec = formspec.."listring[current_player;main]"
formspec[n] = ui.single_slot(craftx - 2.5, crafty + 2.5) if unified_inventory.is_creative(player_name) then
formspec[n+1] = string.format("label[%f,%f;%s]", craftx - 2.3, crafty + 2.4,F(S("Refill:"))) formspec = formspec.."label[0,"..(formspecy + 1.5)..";" .. F(S("Refill:")) .. "]"
formspec[n+2] = string.format("list[detached:%srefill;main;%f,%f;1,1;]", formspec = formspec.."list[detached:"..F(player_name).."refill;main;0,"..(formspecy +2)..";1,1;]"
F(player_name), craftx - 2.5 + ui.list_img_offset, crafty + 2.5 + ui.list_img_offset)
end end
return {formspec=table.concat(formspec)} return {formspec=formspec}
end, end,
}) })
@ -213,23 +205,23 @@ local function stack_image_button(x, y, w, h, buttonname_prefix, item)
local selectitem = name local selectitem = name
if name:sub(1, 6) == "group:" then if name:sub(1, 6) == "group:" then
local group_name = name:sub(7) local group_name = name:sub(7)
local group_item = ui.get_group_item(group_name) local group_item = unified_inventory.get_group_item(group_name)
show_is_group = not group_item.sole show_is_group = not group_item.sole
displayitem = group_item.item or "unknown" displayitem = group_item.item or "unknown"
selectitem = group_item.sole and displayitem or name selectitem = group_item.sole and displayitem or name
end end
local label = show_is_group and "G" or "" local label = show_is_group and "G" or ""
local buttonname = F(buttonname_prefix..ui.mangle_for_formspec(selectitem)) local buttonname = F(buttonname_prefix..unified_inventory.mangle_for_formspec(selectitem))
local button = string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]", local button = string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",
x, y, w, h, x, y, w, h,
F(displayitem), buttonname, label) F(displayitem), buttonname, label)
if show_is_group then if show_is_group then
local groupstring, andcount = ui.extract_groupnames(name) local groupstring, andcount = unified_inventory.extract_groupnames(name)
local grouptip local grouptip
if andcount == 1 then if andcount == 1 then
grouptip = S("Any item belonging to the @1 group", groupstring) grouptip = string.format(S("Any item belonging to the %s group"), groupstring)
elseif andcount > 1 then elseif andcount > 1 then
grouptip = S("Any item belonging to the groups @1", groupstring) grouptip = string.format(S("Any item belonging to the groups %s"), groupstring)
end end
grouptip = F(grouptip) grouptip = F(grouptip)
if andcount >= 1 then if andcount >= 1 then
@ -240,8 +232,8 @@ local function stack_image_button(x, y, w, h, buttonname_prefix, item)
end end
local recipe_text = { local recipe_text = {
recipe = NS("Recipe @1 of @2"), recipe = S("Recipe %d of %d"),
usage = NS("Usage @1 of @2"), usage = S("Usage %d of %d"),
} }
local no_recipe_text = { local no_recipe_text = {
recipe = S("No recipes"), recipe = S("No recipes"),
@ -264,112 +256,83 @@ local other_dir = {
usage = "recipe", usage = "recipe",
} }
ui.register_page("craftguide", { unified_inventory.register_page("craftguide", {
get_formspec = function(player, perplayer_formspec) get_formspec = function(player, perplayer_formspec)
local craftguidex = perplayer_formspec.craft_guide_x local formspecy = perplayer_formspec.formspec_y
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 formheadery = perplayer_formspec.form_header_y
local give_x = perplayer_formspec.give_btn_x local craftresultx = perplayer_formspec.craft_result_x
local craftresulty = perplayer_formspec.craft_result_y
local player_name = player:get_player_name() local player_name = player:get_player_name()
local player_privs = minetest.get_player_privs(player_name) local player_privs = minetest.get_player_privs(player_name)
local formspec = ""
local formspec = { formspec = formspec.."background[0,"..(formspecy + 3.5)..";8,4;ui_main_inventory.png]"
perplayer_formspec.standard_inv_bg, formspec = formspec.."label[0,"..formheadery..";" .. F(S("Crafting Guide")) .. "]"
"label["..formheaderx..","..formheadery..";" .. F(S("Crafting Guide")) .. "]", formspec = formspec.."listcolors[#00000000;#00000000]"
"listcolors[#00000000;#00000000]" local item_name = unified_inventory.current_item[player_name]
} if not item_name then return {formspec=formspec} end
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 local item_name_shown
if minetest.registered_items[item_name] if minetest.registered_items[item_name] and minetest.registered_items[item_name].description then
and minetest.registered_items[item_name].description then item_name_shown = string.format(S("%s (%s)"), minetest.registered_items[item_name].description, item_name)
item_name_shown = S("@1 (@2)",
minetest.registered_items[item_name].description, item_name)
else else
item_name_shown = item_name item_name_shown = item_name
end end
local dir = ui.current_craft_direction[player_name] local dir = unified_inventory.current_craft_direction[player_name]
local rdir = dir == "recipe" and "usage" or "recipe" local rdir
if dir == "recipe" then rdir = "usage" end
local crafts = ui.crafts_for[dir][item_name] if dir == "usage" then rdir = "recipe" end
local alternate = ui.alternate[player_name] local crafts = unified_inventory.crafts_for[dir][item_name]
local alternate = unified_inventory.alternate[player_name]
local alternates, craft local alternates, craft
if crafts and #crafts > 0 then if crafts ~= nil and #crafts > 0 then
alternates = #crafts alternates = #crafts
craft = crafts[alternate] craft = crafts[alternate]
end end
local has_give = player_privs.give or ui.is_creative(player_name) local has_creative = player_privs.give or player_privs.creative or
minetest.settings:get_bool("creative_mode")
formspec[n] = string.format("image[%f,%f;%f,%f;ui_crafting_arrow.png]", formspec = formspec.."background[0.5,"..(formspecy + 0.2)..";8,3;ui_craftguide_form.png]"
craftguidearrowx, craftguidey, ui.imgscale, ui.imgscale) formspec = formspec.."textarea["..craftresultx..","..craftresulty
..";10,1;;"..F(role_text[dir])..": "..item_name_shown..";]"
formspec[n+1] = string.format("textarea[%f,%f;10,1;;%s: %s;]", formspec = formspec..stack_image_button(0, formspecy, 1.1, 1.1, "item_button_"
perplayer_formspec.craft_guide_resultstr_x, perplayer_formspec.craft_guide_resultstr_y, .. rdir .. "_", ItemStack(item_name))
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 if not craft then
-- No craft recipes available for this item. formspec = formspec.."label[5.5,"..(formspecy + 2.35)..";"
formspec[n] = string.format("label[%f,%f;%s]", craftguidex+2.5, craftguidey+1.5, F(no_recipe_text[dir])) ..F(no_recipe_text[dir]).."]"
local no_pos = dir == "recipe" and (craftguidex+2.5) or craftguideresultx local no_pos = dir == "recipe" and 4.5 or 6.5
local item_pos = dir == "recipe" and craftguideresultx or (craftguidex+2.5) local item_pos = dir == "recipe" and 6.5 or 4.5
formspec[n+1] = "image["..no_pos..","..craftguidey..";1.2,1.2;ui_no.png]" formspec = formspec.."image["..no_pos..","..formspecy..";1.1,1.1;ui_no.png]"
formspec[n+2] = stack_image_button(item_pos, craftguidey, 1.2, 1.2, formspec = formspec..stack_image_button(item_pos, formspecy, 1.1, 1.1, "item_button_"
"item_button_" .. other_dir[dir] .. "_", ItemStack(item_name)) ..other_dir[dir].."_", ItemStack(item_name))
if has_give then if has_creative then
formspec[n+3] = giveme_form 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]"
end end
return { formspec = table.concat(formspec) } return {formspec = formspec}
else
formspec[n] = stack_image_button(craftguideresultx, craftguidey, 1.2, 1.2,
"item_button_" .. rdir .. "_", ItemStack(craft.output))
n = n + 1
end end
local craft_type = ui.registered_craft_types[craft.type] or local craft_type = unified_inventory.registered_craft_types[craft.type] or
ui.craft_type_defaults(craft.type, {}) unified_inventory.craft_type_defaults(craft.type, {})
if craft_type.icon then if craft_type.icon then
formspec[n] = string.format("image[%f,%f;%f,%f;%s]", formspec = formspec..string.format(" image[%f,%f;%f,%f;%s]",5.7,(formspecy + 0.05),0.5,0.5,craft_type.icon)
craftguidearrowx+0.35, craftguidey, 0.5, 0.5, craft_type.icon)
n = n + 1
end end
formspec[n] = string.format("label[%f,%f;%s]", craftguidearrowx + 0.15, craftguidey + 1.4, F(craft_type.description)) formspec = formspec.."label[5.5,"..(formspecy + 1)..";" .. F(craft_type.description).."]"
n = n + 1 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 display_size = craft_type.dynamic_display_size local craft_width = craft_type.get_shaped_craft_width and craft_type.get_shaped_craft_width(craft) or display_size.width
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, -- This keeps recipes aligned to the right,
-- so that they're close to the arrow. -- so that they're close to the arrow.
local xoffset = craftguidex+3.75 local xoffset = 5.5
local bspc = 1.25
-- Offset factor for crafting grids with side length > 4 -- Offset factor for crafting grids with side length > 4
local of = (3/math.max(3, math.max(display_size.width, display_size.height))) local of = (3/math.max(3, math.max(display_size.width, display_size.height)))
local od = 0 local od = 0
-- Minimum grid size at which size optimization measures kick in -- Minimum grid size at which size optimazation measures kick in
local mini_craft_size = 6 local mini_craft_size = 6
if display_size.width >= mini_craft_size then if display_size.width >= mini_craft_size then
od = math.max(1, display_size.width - 2) od = math.max(1, display_size.width - 2)
@ -378,12 +341,12 @@ ui.register_page("craftguide", {
-- Size modifier factor -- Size modifier factor
local sf = math.min(1, of * (1.05 + 0.05*od)) local sf = math.min(1, of * (1.05 + 0.05*od))
-- Button size -- Button size
local bsize = 1.2 * sf local bsize_h = 1.1 * sf
local bsize_w = bsize_h
if display_size.width >= mini_craft_size then -- it's not a normal 3x3 grid if display_size.width >= mini_craft_size then
bsize = 0.8 * sf bsize_w = 1.175 * sf
end end
if (bsize > 0.35 and display_size.width) then if (bsize_h > 0.35 and display_size.width) then
for y = 1, display_size.height do for y = 1, display_size.height do
for x = 1, display_size.width do for x = 1, display_size.width do
local item local item
@ -393,76 +356,67 @@ ui.register_page("craftguide", {
-- Flipped x, used to build formspec buttons from right to left -- Flipped x, used to build formspec buttons from right to left
local fx = display_size.width - (x-1) local fx = display_size.width - (x-1)
-- x offset, y offset -- x offset, y offset
local xof = ((fx-1) * of + of) * bspc local xof = (fx-1) * of + of
local yof = ((y-1) * of + 1) * bspc local yof = (y-1) * of + 1
if item then if item then
formspec[n] = stack_image_button( formspec = formspec..stack_image_button(
xoffset - xof, craftguidey - 1.25 + yof, bsize, bsize, xoffset - xof, formspecy - 1 + yof, bsize_w, bsize_h,
"item_button_recipe_", "item_button_recipe_",
ItemStack(item)) ItemStack(item))
else else
-- Fake buttons just to make grid -- Fake buttons just to make grid
formspec[n] = string.format("image_button[%f,%f;%f,%f;ui_blank_image.png;;]", formspec = formspec.."image_button["
xoffset - xof, craftguidey - 1.25 + yof, bsize, bsize) ..tostring(xoffset - xof)..","..tostring(formspecy - 1 + yof)
..";"..bsize_w..","..bsize_h..";ui_blank_image.png;;]"
end end
n = n + 1
end end
end end
else else
-- Error -- Error
formspec[n] = string.format("label[2,%f;%s]", formspec = formspec.."label["
craftguidey, F(S("This recipe is too@nlarge to be displayed."))) ..tostring(2)..","..tostring(formspecy)
n = n + 1 ..";"..F(S("This recipe is too\nlarge to be displayed.")).."]"
end end
if craft_type.uses_crafting_grid and display_size.width <= 3 then if craft_type.uses_crafting_grid and display_size.width <= 3 then
formspec[n] = "label["..(give_x+0.1)..",".. (craftguidey + 1.7) .. ";" .. F(S("To craft grid:")) .. "]" formspec = formspec.."label[0,"..(formspecy + 0.9)..";" .. F(S("To craft grid:")) .. "]"
formspec[n+1] = "button[".. (give_x)..",".. (craftguidey + 1.9) .. ";0.75,0.5;craftguide_craft_1;1]" .."button[0, "..(formspecy + 1.5)..";0.6,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]" .."button[0.6,"..(formspecy + 1.5)..";0.7,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")) .. "]" .."button[1.3,"..(formspecy + 1.5)..";0.8,0.5;craftguide_craft_max;" .. F(S("All")) .. "]"
n = n + 4
end end
if has_creative then
if has_give then formspec = formspec.."label[0,"..(formspecy + 2.1)..";" .. F(S("Give me:")) .. "]"
formspec[n] = giveme_form .."button[0, "..(formspecy + 2.7)..";0.6,0.5;craftguide_giveme_1;1]"
n = n + 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]"
end end
if alternates and alternates > 1 then if alternates and alternates > 1 then
formspec[n] = string.format("label[%f,%f;%s]", formspec = formspec.."label[5.5,"..(formspecy + 1.6)..";"
craftguidex+4, craftguidey + 2.3, F(S(recipe_text[dir], alternate, alternates))) ..string.format(F(recipe_text[dir]), alternate, alternates).."]"
formspec[n+1] = string.format("image_button[%f,%f;1.1,1.1;ui_left_icon.png;alternate_prev;]", .."image_button[5.5,"..(formspecy + 2)..";1,1;ui_left_icon.png;alternate_prev;]"
craftguidearrowx+0.2, craftguidey + 2.6) .."image_button[6.5,"..(formspecy + 2)..";1,1;ui_right_icon.png;alternate;]"
formspec[n+2] = string.format("image_button[%f,%f;1.1,1.1;ui_right_icon.png;alternate;]", .."tooltip[alternate_prev;"..F(prev_alt_text[dir]).."]"
craftguidearrowx+1.35, craftguidey + 2.6) .."tooltip[alternate;"..F(next_alt_text[dir]).."]"
formspec[n+3] = "tooltip[alternate_prev;" .. F(prev_alt_text[dir]) .. "]"
formspec[n+4] = "tooltip[alternate;" .. F(next_alt_text[dir]) .. "]"
end end
return {formspec = formspec}
return { formspec = table.concat(formspec) }
end, end,
}) })
local function craftguide_giveme(player, formname, fields) 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 local amount
for k, v in pairs(fields) do for k, v in pairs(fields) do
amount = k:match("craftguide_giveme_(.*)") amount = k:match("craftguide_giveme_(.*)")
if amount then break end if amount then break end
end end
if not amount then return end
amount = tonumber(amount) or 0 amount = tonumber(amount)
if amount == 0 then return end if amount == 0 then return end
local output = ui.current_item[player_name] local player_name = player:get_player_name()
local output = unified_inventory.current_item[player_name]
if (not output) or (output == "") then return end if (not output) or (output == "") then return end
local player_inv = player:get_inventory() local player_inv = player:get_inventory()
@ -470,6 +424,80 @@ local function craftguide_giveme(player, formname, fields)
player_inv:add_item("main", {name = output, count = amount}) player_inv:add_item("main", {name = output, count = amount})
end 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) local function craftguide_craft(player, formname, fields)
local amount local amount
for k, v in pairs(fields) do for k, v in pairs(fields) do
@ -477,34 +505,63 @@ local function craftguide_craft(player, formname, fields)
if amount then break end if amount then break end
end end
if not amount then return 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 player_name = player:get_player_name()
local output = ui.current_item[player_name] or "" local output = unified_inventory.current_item[player_name]
if output == "" then return end if (not output) or (output == "") then return end
local crafts = ui.crafts_for[ local player_inv = player:get_inventory()
ui.current_craft_direction[player_name]][output] or {}
if #crafts == 0 then return end
local alternate = ui.alternate[player_name] 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 craft = crafts[alternate] local craft = crafts[alternate]
if craft.width > 3 then return end if craft.width > 3 then return end
ui.craftguide_match_craft(player, "main", "craft", craft, amount) local needed = craft.items
ui.set_inventory_formspec(player, "craft") 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")
end end
minetest.register_on_player_receive_fields(function(player, formname, fields) minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "" then
return
end
for k, v in pairs(fields) do for k, v in pairs(fields) do
if k:match("craftguide_craft_") then if k:match("craftguide_craft_") then
craftguide_craft(player, formname, fields) craftguide_craft(player, formname, fields)

View file

@ -9,6 +9,3 @@ unified_inventory_bags (Enable bags) bool true
#If enabled, the trash slot can be used by those without both creative #If enabled, the trash slot can be used by those without both creative
#and the give privilege. #and the give privilege.
unified_inventory_trash (Enable trash) bool true unified_inventory_trash (Enable trash) bool true
unified_inventory_automatic_categorization (Items automatically added to categories) bool true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 456 B

After

Width:  |  Height:  |  Size: 546 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 961 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 658 B

After

Width:  |  Height:  |  Size: 777 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 928 B

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 B

After

Width:  |  Height:  |  Size: 81 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 483 B

After

Width:  |  Height:  |  Size: 896 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 788 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 240 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 648 B

After

Width:  |  Height:  |  Size: 988 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 697 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Some files were not shown because too many files have changed in this diff Show more