2 Commits

Author SHA1 Message Date
88b3033477 Purge recipes with invalid ingredients 2023-01-04 11:43:21 +01:00
19e14aa21e Improve group matching for 'copy to craft' 2023-01-04 11:43:15 +01:00
22 changed files with 297 additions and 540 deletions

View File

@ -1,6 +1,6 @@
unused_args = false unused_args = false
allow_defined_top = true allow_defined_top = true
max_line_length = 131 max_line_length = 999
globals = { globals = {
"unified_inventory", "unified_inventory",
@ -10,10 +10,8 @@ read_globals = {
string = {fields = {"split", "trim"}}, string = {fields = {"split", "trim"}},
table = {fields = {"copy", "getn"}}, table = {fields = {"copy", "getn"}},
"dump", "minetest", "vector",
"core", "minetest",
"ItemStack", "datastorage", "ItemStack", "datastorage",
"vector",
"hb", "hb",
"doors", "doors",

View File

@ -71,9 +71,6 @@ From http://www.clker.com (Public Domain, CC-BY-4.0):
* [`ui_pencil_icon.pnc`](http://www.clker.com/clipart-2256.html) * [`ui_pencil_icon.pnc`](http://www.clker.com/clipart-2256.html)
* [`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)
From https://www.svgrepo.com (CC-BY)
* [`ui_teleport.png`](https://www.svgrepo.com/svg/321565/teleport)
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)
@ -105,16 +102,3 @@ Other files from Wikimedia Commons:
RealBadAngel: (CC-BY-4.0) RealBadAngel: (CC-BY-4.0)
* Everything else. * Everything else.
## Sounds
* [`bell.ogg`](https://freesound.org/people/bennstir/sounds/81072/) by bennstir, CC 4.0
* [`electricity.ogg`](https://freesound.org/people/Halleck/sounds/19486/) by Halleck, CC 4.0 (cut)
* [`pageflip1.ogg`](https://freesound.org/people/themfish/sounds/45823/) by themfish, CC 4.0 (cut, slowed down)
* `pageflip2.ogg` (derived from `pageflip1.ogg`)
* [`trash.ogg`](https://freesound.org/people/OwlStorm/sounds/151231/) by OwlStorm, CC 0 (speed up)
* [`trash_all.ogg`](https://freesound.org/people/abel_K/sounds/68280/) by abel_K, Sampling Plus 1.0 (speed up)
* [`ui_click.ogg`](https://freesound.org/people/lartti/sounds/527569/) by lartti, CC 0 (cut)
* [`ui_morning.ogg`](https://freesound.org/people/InspectorJ/sounds/439472/) by InspectorJ, CC 4.0
* [`ui_owl.ogg`](https://freesound.org/people/manda_g/sounds/54987/) by manda_g, Sampling Plus 1.0 (cut)

37
api.lua
View File

@ -12,9 +12,8 @@ local function is_recipe_craftable(recipe)
end end
else else
-- Possibly an item -- Possibly an item
local itemname_cleaned = ItemStack(itemname):get_name() if not minetest.registered_items[itemname]
if not minetest.registered_items[itemname_cleaned] or minetest.get_item_group(itemname, "not_in_craft_guide") ~= 0 then
or minetest.get_item_group(itemname_cleaned, "not_in_craft_guide") ~= 0 then
return false return false
end end
end end
@ -51,7 +50,6 @@ minetest.after(0.01, function()
end end
end end
end end
table.sort(ui.items_list) table.sort(ui.items_list)
ui.items_list_size = #ui.items_list ui.items_list_size = #ui.items_list
print("Unified Inventory. Inventory size: "..ui.items_list_size) print("Unified Inventory. Inventory size: "..ui.items_list_size)
@ -184,37 +182,6 @@ minetest.after(0.01, function()
ui.crafts_for.recipe[outputitemname] = new_recipe_list ui.crafts_for.recipe[outputitemname] = new_recipe_list
end end
-- Remove unknown items from all categories
local total_removed = 0
for cat_name, cat_def in pairs(ui.registered_category_items) do
for itemname, _ in pairs(cat_def) do
local idef = minetest.registered_items[itemname]
if not idef then
total_removed = total_removed + 1
--[[
-- For analysis
minetest.log("warning", "[unified_inventory] Removed item '"
.. itemname .. "' from category '" .. cat_name
.. "'. Reason: item not registered")
]]
cat_def[itemname] = nil
elseif not ui.is_itemdef_listable(idef) then
total_removed = total_removed + 1
--[[
-- For analysis
minetest.log("warning", "[unified_inventory] Removed item '"
.. itemname .. "' from category '" .. cat_name
.. "'. Reason: item is in 'not_in_creative_inventory' group")
]]
cat_def[itemname] = nil
end
end
end
if total_removed > 0 then
minetest.log("info", "[unified_inventory] Removed " .. total_removed ..
" items from the categories.")
end
for _, callback in ipairs(ui.initialized_callbacks) do for _, callback in ipairs(ui.initialized_callbacks) do
callback() callback()
end end

View File

@ -10,26 +10,25 @@ local F = minetest.formspec_escape
local ui = unified_inventory local ui = unified_inventory
ui.register_page("bags", { ui.register_page("bags", {
get_formspec = function(player, perplayer_formspec) get_formspec = function(player)
local player_name = player:get_player_name() local player_name = player:get_player_name()
local std_inv_x = perplayer_formspec.std_inv_x return { formspec = table.concat({
local formspec = { ui.style_full.standard_inv_bg,
perplayer_formspec.standard_inv_bg, ui.single_slot(0.925, 1.5),
"label[", perplayer_formspec.form_header_x, ",", ui.single_slot(3.425, 1.5),
perplayer_formspec.form_header_y, ";", F(S("Bags")), "]", ui.single_slot(5.925, 1.5),
ui.single_slot(8.425, 1.5),
"label["..ui.style_full.form_header_x..","..ui.style_full.form_header_y..";" .. F(S("Bags")) .. "]",
"button[0.6125,2.75;1.875,0.75;bag1;" .. F(S("Bag @1", 1)) .. "]",
"button[3.1125,2.75;1.875,0.75;bag2;" .. F(S("Bag @1", 2)) .. "]",
"button[5.6125,2.75;1.875,0.75;bag3;" .. F(S("Bag @1", 3)) .. "]",
"button[8.1125,2.75;1.875,0.75;bag4;" .. F(S("Bag @1", 4)) .. "]",
"listcolors[#00000000;#00000000]", "listcolors[#00000000;#00000000]",
} "list[detached:" .. F(player_name) .. "_bags;bag1;1.075,1.65;1,1;]",
"list[detached:" .. F(player_name) .. "_bags;bag2;3.575,1.65;1,1;]",
for i = 1, 4 do "list[detached:" .. F(player_name) .. "_bags;bag3;6.075,1.65;1,1;]",
local x = std_inv_x + i * 2.5 "list[detached:" .. F(player_name) .. "_bags;bag4;8.575,1.65;1,1;]"
formspec[#formspec + 1] = ui.single_slot(x - 1.875, 1.5) }) }
formspec[#formspec + 1] = string.format("list[detached:%s_bags;bag%i;%.3f,1.65;1,1;]",
F(player_name), i, x - 1.725)
formspec[#formspec + 1] = string.format("button[%.4f,2.75;1.875,0.75;bag%i;%s]",
x - 2.1875, i, F(S("Bag @1", i)))
end
return { formspec = table.concat(formspec) }
end, end,
}) })
@ -37,6 +36,7 @@ ui.register_button("bags", {
type = "image", type = "image",
image = "ui_bags_icon.png", image = "ui_bags_icon.png",
tooltip = S("Bags"), tooltip = S("Bags"),
hide_lite=true
}) })
local function get_player_bag_stack(player, i) local function get_player_bag_stack(player, i)
@ -48,38 +48,23 @@ end
for bag_i = 1, 4 do for bag_i = 1, 4 do
ui.register_page("bag" .. bag_i, { ui.register_page("bag" .. bag_i, {
get_formspec = function(player, perplayer_formspec) get_formspec = function(player)
local stack = get_player_bag_stack(player, bag_i) local stack = get_player_bag_stack(player, bag_i)
local image = stack:get_definition().inventory_image local image = stack:get_definition().inventory_image
local slots = stack:get_definition().groups.bagslots local slots = stack:get_definition().groups.bagslots
local std_inv_x = perplayer_formspec.std_inv_x
local lite_mode = perplayer_formspec.is_lite_mode
local bag_inv_y, header_x, header_y = 1.5, 0.3, 0.65
if lite_mode then
bag_inv_y = 0.5
header_x = perplayer_formspec.form_header_x
header_y = perplayer_formspec.form_header_y
end
local formspec = { local formspec = {
perplayer_formspec.standard_inv_bg, ui.style_full.standard_inv_bg,
ui.make_inv_img_grid(std_inv_x, bag_inv_y, 8, slots/8), ui.make_inv_img_grid(0.3, 1.5, 8, slots/8),
"label[", header_x, ",", header_y, ";", F(S("Bag @1", bag_i)), "]", "image[9.2,0.4;1,1;" .. image .. "]",
"label[0.3,0.65;" .. F(S("Bag @1", bag_i)) .. "]",
"listcolors[#00000000;#00000000]", "listcolors[#00000000;#00000000]",
"listring[current_player;main]", "listring[current_player;main]",
string.format("list[current_player;bag%icontents;%f,%f;8,3;]", string.format("list[current_player;bag%icontents;%f,%f;8,3;]",
bag_i, std_inv_x + ui.list_img_offset, bag_inv_y + ui.list_img_offset), bag_i, 0.3 + ui.list_img_offset, 1.5 + ui.list_img_offset),
"listring[current_name;bag", bag_i, "contents]", "listring[current_name;bag" .. bag_i .. "contents]",
} }
if lite_mode then
return { formspec = table.concat(formspec) }
end
local n = #formspec + 1 local n = #formspec + 1
formspec[n] = "image[" .. std_inv_x + 8.9 .. ",0.4;1,1;" .. image .. "]"
n = n + 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 ui.trash_enabled
@ -144,7 +129,7 @@ local function save_bags_metadata(player, bags_inv)
end end
local meta = player:get_meta() local meta = player:get_meta()
if is_empty then if is_empty then
meta:set_string("unified_inventory:bags", "") meta:set_string("unified_inventory:bags", nil)
else else
meta:set_string("unified_inventory:bags", meta:set_string("unified_inventory:bags",
minetest.serialize(bags)) minetest.serialize(bags))
@ -221,11 +206,6 @@ minetest.register_on_joinplayer(function(player)
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)
if listname == ui.current_page[player:get_player_name()] then
-- Bag is currently open: avoid follow-up issues by navigating back
-- Trick: the list name is the same as the registered page name
ui.set_inventory_formspec(player, "bags")
end
end, end,
allow_move = function() allow_move = function()
return 0 return 0

View File

@ -57,47 +57,30 @@ end)
local function apply_new_filter(player, search_text, new_dir) local function apply_new_filter(player, search_text, new_dir)
local player_name = player:get_player_name() local player_name = player:get_player_name()
minetest.sound_play("ui_click", {to_player=player_name, gain = 0.1}) minetest.sound_play("click", {to_player=player_name, gain = 0.1})
ui.apply_filter(player, search_text, new_dir) ui.apply_filter(player, search_text, new_dir)
ui.current_searchbox[player_name] = search_text ui.current_searchbox[player_name] = search_text
ui.set_inventory_formspec(player, ui.current_page[player_name]) ui.set_inventory_formspec(player, ui.current_page[player_name])
end end
-- Search box handling minetest.register_on_player_receive_fields(function(player, formname, fields)
local function receive_fields_searchbox(player, formname, fields)
local player_name = player:get_player_name() local player_name = player:get_player_name()
-- always take new search text, even if not searching on it yet local ui_peruser,draw_lite_mode = unified_inventory.get_per_player_formspec(player_name)
if fields.searchbox and fields.searchbox ~= ui.current_searchbox[player_name] then
ui.current_searchbox[player_name] = fields.searchbox
end
if fields.searchbutton
or fields.key_enter_field == "searchbox" then
if ui.current_searchbox[player_name] ~= ui.activefilter[player_name] then
ui.apply_filter(player, ui.current_searchbox[player_name], "nochange")
ui.set_inventory_formspec(player, ui.current_page[player_name])
minetest.sound_play("paperflip2",
{to_player=player_name, gain = 1.0})
end
elseif fields.searchresetbutton then
if ui.activefilter[player_name] ~= "" then
apply_new_filter(player, "", "nochange")
end
end
end
minetest.register_on_player_receive_fields(function(player, formname, fields)
if formname ~= "" then if formname ~= "" then
return return
end end
receive_fields_searchbox(player, formname, fields) -- always take new search text, even if not searching on it yet
local dirty_search_filter = false
local player_name = player:get_player_name() if fields.searchbox
and fields.searchbox ~= unified_inventory.current_searchbox[player_name] then
unified_inventory.current_searchbox[player_name] = fields.searchbox
dirty_search_filter = true
end
local ui_peruser,draw_lite_mode = unified_inventory.get_per_player_formspec(player_name)
local clicked_category local clicked_category
for name, value in pairs(fields) do for name, value in pairs(fields) do
@ -131,7 +114,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
for i, def in pairs(unified_inventory.buttons) do for i, def in pairs(unified_inventory.buttons) do
if fields[def.name] then if fields[def.name] then
def.action(player) def.action(player)
minetest.sound_play("ui_click", minetest.sound_play("click",
{to_player=player_name, gain = 0.1}) {to_player=player_name, gain = 0.1})
return return
end end
@ -196,7 +179,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end end
end end
if clicked_item then if clicked_item then
minetest.sound_play("ui_click", minetest.sound_play("click",
{to_player=player_name, gain = 0.1}) {to_player=player_name, gain = 0.1})
local page = unified_inventory.current_page[player_name] local page = unified_inventory.current_page[player_name]
local player_creative = unified_inventory.is_creative(player_name) local player_creative = unified_inventory.is_creative(player_name)
@ -218,11 +201,25 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end end
end end
if fields.searchbutton
or fields.key_enter_field == "searchbox" then
if dirty_search_filter then
ui.apply_filter(player, ui.current_searchbox[player_name], "nochange")
ui.set_inventory_formspec(player, ui.current_page[player_name])
minetest.sound_play("paperflip2",
{to_player=player_name, gain = 1.0})
end
elseif fields.searchresetbutton then
if ui.activefilter[player_name] ~= "" then
apply_new_filter(player, "", "nochange")
end
end
-- alternate buttons -- alternate buttons
if not (fields.alternate or fields.alternate_prev) then if not (fields.alternate or fields.alternate_prev) then
return return
end end
minetest.sound_play("ui_click", minetest.sound_play("click",
{to_player=player_name, gain = 0.1}) {to_player=player_name, gain = 0.1})
local item_name = unified_inventory.current_item[player_name] local item_name = unified_inventory.current_item[player_name]
if not item_name then if not item_name then

View File

@ -115,11 +115,6 @@ function unified_inventory.set_category_index(category_name, index)
update_category_list() update_category_list()
end end
function unified_inventory.add_category_item(category_name, item) function unified_inventory.add_category_item(category_name, item)
if type(item) ~= "string" then
minetest.log("warning", "[unified_inventory] Cannot register category item: " .. dump(item))
return
end
ensure_category_exists(category_name) ensure_category_exists(category_name)
unified_inventory.registered_category_items[category_name][item] = true unified_inventory.registered_category_items[category_name][item] = true
end end

View File

@ -1,5 +1,4 @@
local S = minetest.get_translator("unified_inventory") local S = minetest.get_translator("unified_inventory")
local ui = unified_inventory
unified_inventory.register_category('plants', { unified_inventory.register_category('plants', {
symbol = "flowers:tulip", symbol = "flowers:tulip",
@ -26,87 +25,71 @@ unified_inventory.register_category('lighting', {
label = S("Lighting") label = S("Lighting")
}) })
local function register_automatic_categorization()
-- 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
-- Preparation for ore registration: find all possible drops (digging) if unified_inventory.automatic_categorization then
local possible_node_dig_drops = { minetest.register_on_mods_loaded(function()
-- ["default:stone_with_coal"] = { "default:coal_lump", "mymod:raregem" }
-- Ores may be contained multiple times, depending on drop chances. -- Add biome nodes to environment category
} for _,def in pairs(minetest.registered_biomes) do
for itemname, recipes in pairs(ui.crafts_for.usage) do local env_nodes = {
for _, recipe in ipairs(recipes) do def.node_riverbed, def.node_top, def.node_filler, def.node_dust,
if recipe.type == "digging" or recipe.type == "digging_chance" then }
if not possible_node_dig_drops[itemname] then for i,node in pairs(env_nodes) do
possible_node_dig_drops[itemname] = {} if node then
unified_inventory.add_category_item('environment', node)
end end
local stack = ItemStack(recipe.output)
table.insert(possible_node_dig_drops[itemname], stack:get_name())
end end
end end
end
-- Add minable ores to minerals and everything else (pockets of stone & sand variations) to environment -- Add minable ores to minerals and everything else (pockets of stone & sand variations) to environment
for _, odef in pairs(minetest.registered_ores) do for _,item in pairs(minetest.registered_ores) do
local drops = possible_node_dig_drops[odef.ore] if item.ore_type == "scatter" then
if drops and odef.ore_type == "scatter" then local drop = minetest.registered_nodes[item.ore].drop
ui.add_category_item('minerals', odef.ore) if drop and drop ~= "" then
-- Register all possible drops as "minerals" unified_inventory.add_category_item('minerals', item.ore)
ui.add_category_items('minerals', drops) unified_inventory.add_category_item('minerals', drop)
possible_node_dig_drops[odef.ore] = {} -- mask as handled else
else unified_inventory.add_category_item('environment', item.ore)
ui.add_category_item('environment', odef.ore) end
end else
end unified_inventory.add_category_item('environment', item.ore)
-- 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
end
if ui.automatic_categorization then -- Add items by item definition
ui.register_on_initialized(register_automatic_categorization) 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 end
-- [[ -- [[
unified_inventory.add_category_items('plants', { unified_inventory.add_category_items('plants', {
"default:dry_grass_5", "default:dry_grass_5",
@ -273,6 +256,23 @@ unified_inventory.add_category_items('minerals', {
"default:coal_lump", "default:coal_lump",
"default:bronzeblock", "default:bronzeblock",
"default:goldblock", "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', { unified_inventory.add_category_items('building', {

View File

@ -53,9 +53,8 @@ unified_inventory = {
standard_background = "bgcolor[#0000]background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]", standard_background = "bgcolor[#0000]background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]",
hide_disabled_buttons = minetest.settings:get_bool("unified_inventory_hide_disabled_buttons", false), hide_disabled_buttons = minetest.settings:get_bool("unified_inventory_hide_disabled_buttons", false),
hide_uncraftable_items = minetest.settings:get_bool("unified_inventory_hide_uncraftable_items", false),
version = 5 version = 4
} }
local ui = unified_inventory local ui = unified_inventory
@ -192,10 +191,7 @@ dofile(modpath.."/register.lua")
if minetest.settings:get_bool("unified_inventory_bags") ~= false then if minetest.settings:get_bool("unified_inventory_bags") ~= false then
dofile(modpath.."/bags.lua") dofile(modpath.."/bags.lua")
end end
if minetest.settings:get_bool("unified_inventory_item_names") ~= false then
dofile(modpath.."/item_names.lua") dofile(modpath.."/item_names.lua")
end dofile(modpath.."/waypoints.lua")
if minetest.settings:get_bool("unified_inventory_waypoints") ~= false then
dofile(modpath.."/waypoints.lua")
end
dofile(modpath.."/legacy.lua") -- mod compatibility dofile(modpath.."/legacy.lua") -- mod compatibility

View File

@ -143,21 +143,18 @@ local function formspec_add_categories(player, formspec, ui_peruser)
if ui.current_category[player_name] == category.name then if ui.current_category[player_name] == category.name then
scale = 1 scale = 1
end end
formspec[n] = formspec_button(ui_peruser, "category_"..category.name, category.symbol, categories_pos, formspec[n] = formspec_button(ui_peruser, "category_"..category.name, category.symbol, categories_pos, {column-1, 0}, scale, category.label)
{column-1, 0}, scale, category.label)
n = n + 1 n = n + 1
end end
end end
if category_count > ui_peruser.pagecols and scroll_offset > 0 then if category_count > ui_peruser.pagecols and scroll_offset > 0 then
-- prev -- prev
formspec[n] = formspec_button(ui_peruser, "prev_category", "ui_left_icon.png", categories_scroll_pos, 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"))
{ui_peruser.pagecols - 2, 0}, 0.8, S("Scroll categories left"))
n = n + 1 n = n + 1
end end
if category_count > ui_peruser.pagecols and category_count - scroll_offset > ui_peruser.pagecols then if category_count > ui_peruser.pagecols and category_count - scroll_offset > ui_peruser.pagecols then
-- next -- next
formspec[n] = formspec_button(ui_peruser, "next_category", "ui_right_icon.png", categories_scroll_pos, 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"))
{ui_peruser.pagecols - 1, 0}, 0.8, S("Scroll categories right"))
end end
end end
@ -273,15 +270,13 @@ local function formspec_add_item_browser(player, formspec, ui_peruser)
button_name, minetest.formspec_escape(tooltip) button_name, minetest.formspec_escape(tooltip)
) )
n = n + 2 n = n + 2
list_index = list_index + 1
end end
list_index = list_index + 1
end end
end end
formspec[n] = "style[page_number;content_offset=0]" formspec[n] = string.format("label[%f,%f;%s: %s]",
formspec[n + 1] = string.format("image_button[%f,%f;%f,0.4;;page_number;%s: %s;false;false;]", ui_peruser.page_buttons_x + ui_peruser.btn_spc * (ui_peruser.is_lite_mode and 1 or 2),
ui_peruser.page_buttons_x, ui_peruser.page_buttons_y + 0.1 + ui_peruser.btn_spc * 2,
ui_peruser.page_buttons_y + ui_peruser.btn_spc * 2 - 0.1,
ui_peruser.btn_spc * (bn - 1) + ui_peruser.btn_size,
F(S("Page")), S("@1 of @2",page2,pagemax)) F(S("Page")), S("@1 of @2",page2,pagemax))
end end
@ -352,29 +347,12 @@ function ui.apply_filter(player, filter, search_dir)
end end
local player_name = player:get_player_name() local player_name = player:get_player_name()
-- Whether to show uncraftable items
local fprefilter = function(_)
return true
end
if ui.hide_uncraftable_items and not ui.is_creative(player_name) then
fprefilter = function(name)
return ui.get_recipe_list(name)
end
end
local registered_items = minetest.registered_items
local lfilter = string.lower(filter) local lfilter = string.lower(filter)
local ffilter local ffilter
if lfilter:sub(1, 6) == "group:" then if lfilter:sub(1, 6) == "group:" then
-- Group filter: all groups of the item must match -- Group filter: all groups of the item must match
local groups = lfilter:sub(7):split(",") local groups = lfilter:sub(7):split(",")
ffilter = function(name) ffilter = function(name, def)
local def = registered_items[name]
if not def then
return false
end
for _, group in ipairs(groups) do for _, group in ipairs(groups) do
if not def.groups[group] if not def.groups[group]
or def.groups[group] <= 0 then or def.groups[group] <= 0 then
@ -388,12 +366,7 @@ function ui.apply_filter(player, filter, search_dir)
local player_info = minetest.get_player_information(player_name) local player_info = minetest.get_player_information(player_name)
local lang = player_info and player_info.lang_code or "" local lang = player_info and player_info.lang_code or ""
ffilter = function(name) ffilter = function(name, def)
local def = registered_items[name]
if not def then
return false
end
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 local llocaldesc = minetest.get_translated_string
@ -403,29 +376,32 @@ function ui.apply_filter(player, filter, search_dir)
end end
end end
local is_itemdef_listable = ui.is_itemdef_listable
local filtered_items = {} local filtered_items = {}
local category = ui.current_category[player_name] or 'all' local category = ui.current_category[player_name] or 'all'
if category == 'all' then if category == 'all' then
for _, name in ipairs(ui.items_list) do for name, def in pairs(minetest.registered_items) do
if fprefilter(name) and ffilter(name) then if is_itemdef_listable(def)
and ffilter(name, def) then
table.insert(filtered_items, name) table.insert(filtered_items, name)
end end
end end
elseif category == 'uncategorized' then elseif category == 'uncategorized' then
for _, name in ipairs(ui.items_list) do for name, def in pairs(minetest.registered_items) do
if not ui.find_category(name) if is_itemdef_listable(def)
and fprefilter(name) and not ui.find_category(name)
and ffilter(name) then and ffilter(name, def) then
table.insert(filtered_items, name) table.insert(filtered_items, name)
end end
end end
else else
-- Any other category is selected -- Any other category is selected
for name, exists in pairs(ui.registered_category_items[category]) do for name, exists in pairs(ui.registered_category_items[category]) do
if exists local def = minetest.registered_items[name]
and fprefilter(name) if exists and def
and ffilter(name) then and is_itemdef_listable(def)
and ffilter(name, def) then
table.insert(filtered_items, name) table.insert(filtered_items, name)
end end
end end

View File

@ -3,8 +3,6 @@
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 hudbars_mod = minetest.get_modpath("hudbars") local hudbars_mod = minetest.get_modpath("hudbars")
local only_names = minetest.settings:get_bool("unified_inventory_only_names", true)
local max_length = tonumber(minetest.settings:get("unified_inventory_max_item_name_length")) or 80
local function set_hud(player) local function set_hud(player)
local player_name = player:get_player_name() local player_name = player:get_player_name()
@ -18,8 +16,7 @@ local function set_hud(player)
item_names[player_name] = { item_names[player_name] = {
hud = player:hud_add({ hud = player:hud_add({
-- TODO: remove compatibility code when 5.8.0 is no longer used hud_elem_type = "text",
[minetest.features.hud_def_type_field and "type" or "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=-1},
@ -63,7 +60,6 @@ minetest.register_globalstep(function(dtime)
data.itemname = itemname data.itemname = itemname
data.index = index data.index = index
data.dtime = 0 data.dtime = 0
local lang_code = minetest.get_player_information(player:get_player_name()).lang_code
local desc = stack.get_meta local desc = stack.get_meta
and stack:get_meta():get_string("description") and stack:get_meta():get_string("description")
@ -73,14 +69,6 @@ minetest.register_globalstep(function(dtime)
local def = minetest.registered_items[itemname] local def = minetest.registered_items[itemname]
desc = def and def.description or "" desc = def and def.description or ""
end end
if only_names and desc and string.find(desc, "\n") then
desc = string.match(desc, "([^\n]*)")
end
desc = minetest.get_translated_string(lang_code, desc)
desc = minetest.strip_colors(desc)
if string.len(desc) > max_length and max_length > 0 then
desc = string.sub(desc, 1, max_length) .. " [...]"
end
player:hud_change(data.hud, 'text', desc) player:hud_change(data.hud, 'text', desc)
end end
end end

View File

@ -1,91 +1,98 @@
# textdomain: unified_inventory # textdomain: unified_inventory
Category:=Kategorie: Mixing=
Mixing=Miksowanie Cooking=
Cooking=Gotowanie Digging=
Digging=Kopanie
Bags=Plecaki Bags=Plecaki
Bag @1=Plecak @1 Bag @1=Plecak @1
Small Bag=Mały plecak Small Bag=Maly plecak
Medium Bag=Średni plecak Medium Bag=Sredni plecak
Large Bag=Duży plecak Large Bag=Duzy plecak
All Items=Wszystkie przedmioty All Items=
Misc. Items=Różne przedmioty Misc. Items=
Plant Life=Życie roślin Plant Life=
Building Materials=Materiały budowlane Building Materials=
Tools=Narzędzia Tools=
Minerals and Metals=Minerały i metale Minerals and Metals=
Environment and Worldgen=Otoczenie i generowanie świata Environment and Worldgen=
Lighting=Oświetlenie Lighting=
and = i and = i
Scroll categories left=Przewiń kategorię w lewo Scroll categories left=
Scroll categories right=Przewiń kategorię w prawo Scroll categories right=
Search=Szukaj Search=Szukaj
Reset search and display everything=Zresetuj wyszukiwanie i pokaż wszystko Reset search and display everything=
First page=Pierwsza strona First page=Pierwsza strona
Back three pages=Trzy strony do tyłu Back three pages=3 strony w tyl
Back one page=Stronę do tyłu Back one page=1 strona w tyl
Forward one page=Stronę do przodu Forward one page=1 strona do przodu
Forward three pages=Trzy strony do przodu Forward three pages=3 strony do przodu
Last page=Ostatnia strona Last page=Ostatnia strona
No matching items=Brak pasujących przedmiotów No matching items=Brak pasujacych przedmiotow
No matches.=Brak wyników No matches.=Brak wyników
Page=Strona Page=Strona
@1 of @2=@1 z @2 @1 of @2=@1 z @2
Filter=Filtr Filter=Filtr
Can use the creative inventory=Może używać kreatywnego ekwipunku Can use the creative inventory=
Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Wymusza wyświetlanie Unified Inventory w trybie Full jeżeli tryb Lite jest skonfigurowany globalnie Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=
Crafting Grid=Siatka craftingu Crafting Grid=
Crafting Guide=Przewodnik craftingu Crafting Guide=
Set home position=Ustaw pozycję domu Set home position=Ustaw pozycję wyjściową
Home position set to: @1=Pozycja domu ustawiona na: @1 Home position set to: @1=Pozycja domowa ustawiona na: @1
You don't have the "home" privilege!=Brak uprawnień "home"! You don't have the "home" privilege!=Nie masz uprawnien do zmiany czasu "home"!
Go home=Idź do domu Go home=Idź do domu
Set time to day=Ustaw czas na dzień Set time to day=Ustaw czas na dzień
Time of day set to 6am=Czas ustawiony na 6:00 Time of day set to 6am=Czas ustawiony na 6:00
You don't have the settime privilege!=Brak uprawnień "settime"! You don't have the settime privilege!=Nie masz uprawnien do zmiany czasu "settime"!
Set time to night=Ustaw czas na noc Set time to night=Ustaw czas na noc
Time of day set to 9pm=Czas ustawiony na 21:00 Time of day set to 9pm=Czas ustawiony na 21:00
Clear inventory=Wyczyść ekwipunek Clear inventory=Wyczyść zapasy
This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=Aby zapobiec przypadkowemu skasowaniu ekwipunku, ten przycisk został wyłączony poza trybem kreatywnym.@nUżyj zamiast tego ikony śmietnika. This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=
Inventory cleared!=Ekwipunek został wyczyszczony! Inventory cleared!=Zapasy zostały wyczyszczone!
Trash:=Śmietnik: Trash:=Smietnik:
Refill:=Uzupełnianie: Refill:=Uzupelnianie:
Any item belonging to the @1 group=Każdy przedmiot należący do @1 grupy Any item belonging to the @1 group=
Any item belonging to the groups @1=Każdy przedmiot należacy do grup @1 Any item belonging to the groups @1=
Recipe @1 of @2=Recepta @1 z @2 Recipe @1 of @2=Recepta @1 z @2
Usage @1 of @2=Użycie @1 z @2 Usage @1 of @2=Użycie @1 z @2
No recipes=Brak recepty No recipes=Brak recepty
No usages=Bez użycia No usages=Bez użycia
Result=Wynik Result=Wynik
Ingredient=Składnik Ingredient=Składnik
Show next recipe=Pokaż nastepną recepturę Show next recipe=
Show next usage=Pokaż następne użycie Show next usage=
Show previous recipe=Pokaż poprzednią recepturę Show previous recipe=
Show previous usage=Pokaż poprzednie użycie Show previous usage=
@1 (@2)=@1 (@2) @1 (@2)=
Give me:=Daj mi: Give me:=Daj mi:
This recipe is too@@large to be displayed.=Receptura jest zbyt@@duża aby ją wyświetlić. This recipe is too@@large to be displayed.=
To craft grid:=Do siatki craftingu. To craft grid:=
All=Wszystko All=Wszystko
Crafting=Crafting Crafting=
White=Biały White=Bialy
Yellow=Zółty Yellow=Zolty
Red=Czerwony Red=Czerwony
Green=Zielony Green=Zielony
Blue=Niebieski Blue=Niebieski
Waypoints=Punkty orientacyjne Waypoints=Punkty orientacyjne
Select Waypoint #@1=Wybierz punkt #@1 Select Waypoint #@1=Wybierz punkt #@1
Waypoint @1=Punkty orientacyjne @1 Waypoint @1=Punkty orientacyjne @1
Set waypoint to current location=Ustaw punkt orientacyjny na bieżacej pozycji Set waypoint to current location=Ustaw punkt orientacyjny na biezacej pozycji
Hide waypoint=Ukryj punkt orientacyjny Hide waypoint=
Show waypoint=Pokaż punkt orientacyjny Show waypoint=
Hide coordinates=Ukryj koordynaty Hide coordinates=
Show coordinates=Pokaż koordynaty Show coordinates=
Change color of waypoint display=Zmień kolor punktu Change color of waypoint display=Zmien kolor punktu
Edit waypoint name=Edytuj nazwę punktu Edit waypoint name=Edytuj nazwe punktu
Waypoint active=Punkt włączony Waypoint active=Punkt wlaczony
Waypoint inactive=Punkt wyłączony Waypoint inactive=Punkt wylaczony
Finish editing=Zakończ edycję Finish editing=Zakoncz edycje
World position=Pozycja World position=Pozycja
Name=Nazwa Name=Nazwa
HUD text color=Kolor tekstu HUD HUD text color=Kolor tekstu HUD
##### not used anymore #####
invisible=niewidzialny
visible=widomy
Make waypoint @1=Robić punkt @1
@1 display of waypoint coordinates=@1 koordynatow punktu

View File

@ -1,23 +1,23 @@
# textdomain: unified_inventory # textdomain: unified_inventory
Mixing=Мешать Mixing=Мешать
Cooking=Готовить Cooking=Варить
Digging=Копать Digging=Копать
Bags=Сумки Bags=Сумки
Bag @1=Сумка @1 Bag @1=Сумка @1
Small Bag=Малая сумка Small Bag=Малая сумка
Medium Bag=Средняя сумка Medium Bag=Средняя сумка
Large Bag=Большая сумка Large Bag=Большая сумка
All Items=Все предметы All Items=
Misc. Items=Разн. предметы Misc. Items=
Plant Life=Растения Plant Life=
Building Materials=Стройматериалы Building Materials=
Tools=Инструменты Tools=
Minerals and Metals=Металлы и минералы Minerals and Metals=
Environment and Worldgen=Окружение и генер.мира Environment and Worldgen=
Lighting=Освещение Lighting=
and = и and = и
Scroll categories left=Листать влево Scroll categories left=
Scroll categories right=Листать вправо Scroll categories right=
Search=Поиск Search=Поиск
Reset search and display everything=Сброс поиска, показать всё Reset search and display everything=Сброс поиска, показать всё
First page=Первая страница First page=Первая страница
@ -32,7 +32,7 @@ Page=Страница
@1 of @2=@1 из @2 @1 of @2=@1 из @2
Filter=Фильтр Filter=Фильтр
Can use the creative inventory=Можно использовать инвентарь творческого режима Can use the creative inventory=Можно использовать инвентарь творческого режима
Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Отображает инвентарь в полном режиме, если простой режим установлен глобально Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=
Crafting Grid=Решетка крафта Crafting Grid=Решетка крафта
Crafting Guide=Книга рецептов Crafting Guide=Книга рецептов
Set home position=Установить позицию дома Set home position=Установить позицию дома
@ -59,11 +59,11 @@ Result=Результат
Ingredient=Состав Ingredient=Состав
Show next recipe=Следующий рецепт Show next recipe=Следующий рецепт
Show next usage=Следующее использование Show next usage=Следующее использование
Show previous recipe=Предыдущий рецепт Show previous recipe=Прошлый рецепт
Show previous usage=Предыдущая страница Show previous usage=Прошлая страница
@1 (@2)= @1 (@2)=
Give me:=Дай мне: Give me:=Дай мне:
This recipe is too@@large to be displayed.=Этот рецепт слишком большой This recipe is too@@large to be displayed.=
To craft grid:=На решeтку крафта: To craft grid:=На решeтку крафта:
All=Все All=Все
Crafting=Крафт Crafting=Крафт
@ -76,10 +76,10 @@ Waypoints=Путевые точки
Select Waypoint #@1=Выбрать путевую точку №@1 Select Waypoint #@1=Выбрать путевую точку №@1
Waypoint @1=Путевая точка @1 Waypoint @1=Путевая точка @1
Set waypoint to current location=Установить путевую точку по текущей позиции Set waypoint to current location=Установить путевую точку по текущей позиции
Hide waypoint=Скрыть точку Hide waypoint=
Show waypoint=Показать точку Show waypoint=
Hide coordinates=Скрыть координаты Hide coordinates=
Show coordinates=Показать координаты Show coordinates=
Change color of waypoint display=Поменять цвет путевой точки Change color of waypoint display=Поменять цвет путевой точки
Edit waypoint name=Переименовать путевую точку Edit waypoint name=Переименовать путевую точку
Waypoint active=Путевая точка включена Waypoint active=Путевая точка включена
@ -88,4 +88,13 @@ Finish editing=Закончить редакцию
World position=Позиция мира World position=Позиция мира
Name=Имя Name=Имя
HUD text color=Цвет текста HUDа HUD text color=Цвет текста HUDа
Category:=Категории:
##### not used anymore #####
invisible=невидимой
visible=видимой
Make waypoint @1=Сделать путевую точку @1
Disable=Выключить
Enable=Включить
@1 display of waypoint coordinates=@1 показ координат путевых точек

View File

@ -1,92 +0,0 @@
# textdomain: unified_inventory
Replaces the default inventory and adds a number of features, such as a crafting guide=Замінює стандартний інвентар та додає ряд особливостей, таких як книга рецептів
Mixing=Перемішати
Cooking=Виплавити
Digging=Викопати
Bags=Сумки
Bag @1=Сумка @1
Small Bag=Мала сумка
Medium Bag=Середня сумка
Large Bag=Велика сумка
All Items=Все
Misc. Items=Різне
Plant Life=Рослини
Building Materials=Будматеріали
Tools=Інструменти
Minerals and Metals=Руди й метали
Environment and Worldgen=Оточення та генерація світу
Lighting=Освітлення
and = та
Scroll categories left=Ліворуч
Scroll categories right=Праворуч
Search=Пошук
Reset search and display everything=Скинути пошук та відобразити усе
First page=Перша сторінка
Back three pages=3 сторінки назад
Back one page=Попередня сторінка
Forward one page=Наступна сторінка
Forward three pages=3 сторінки вперед
Last page=Остання сторінка
No matching items=Не знайдено предметів
No matches.=Немає результатів.
Page=Сторінка
@1 of @2=@1 з @2
Filter=Фільтр
Can use the creative inventory=Можна використовувати творчий інвентар
Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Відображає повний режим, якщо простий режим сконфігуровано глобально
Crafting Grid=Сітка майстрування
Crafting Guide=Книга рецептів
Set home position=Встановити позицію дому
Home position set to: @1=Тепер дім розташований по координатам: @1
You don't have the "home" privilege!=У вас немає привілею "home"!
Go home=Додому
Set time to day=День
Time of day set to 6am=Час встановлено на 6:00
You don't have the settime privilege!=Ви не можете встановлювати час (нема привілею "settime")
Set time to night=Ніч
Time of day set to 9pm=Час встановлено на 21:00
Clear inventory=Очистити інвентар
This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=Цю кнопку було вимкнено в творчому режимі, щоб запобігти випадковому очищенню інвентаря.@nВикористовуйте слот смітника натомість.
Inventory cleared!=Інвентар очищено!
Trash:=Смітник:
Refill:=Заповнити:
Any item belonging to the @1 group=Будь-який елемент із групи @1
Any item belonging to the groups @1=Будь-який елемент із груп @1
Recipe @1 of @2=Рецепт @1 із @2
Usage @1 of @2=Використання @1 із @2
No recipes=Немає рецептів
No usages=Ніде не використовується
Result=Результат
Ingredient=Інгредієнт
Show next recipe=Наступний рецепт
Show next usage=Наступне використання
Show previous recipe=Попередній рецепт
Show previous usage=Попереднє використання
@1 (@2)=@1 (@2)
Give me:=Дай мені:
This recipe is too@@large to be displayed.=Цей рецепт надто великий, щоб його відобразити
To craft grid:=На сітку крафту:
All=Все
Crafting=Крафт
White=Білий
Yellow=Жовтий
Red=Червоний
Green=Зелений
Blue=Синій
Waypoints=Геомітки
Select Waypoint #@1=Вибрати геомітку №@1
Waypoint @1=Геомітка @1
Set waypoint to current location=Встановити тут
Hide waypoint=Сховати геомітку
Show waypoint=Показати геомітку
Hide coordinates=Сховати координати
Show coordinates=Показати координати
Change color of waypoint display=Змінити колір геомітки
Edit waypoint name=Перейменувати геомітку
Waypoint active=Геомітку показано
Waypoint inactive=Геомітку приховано
Finish editing=Закінчити редагування
World position=Світова позиція
Name=Назва
HUD text color=Колір тексту
Category:=Категорії:

View File

@ -98,7 +98,7 @@ ui.register_button("misc_set_day", {
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, {settime=true}) then if minetest.check_player_privs(player_name, {settime=true}) then
minetest.sound_play("ui_morning", minetest.sound_play("birds",
{to_player=player_name, gain = 1.0}) {to_player=player_name, gain = 1.0})
minetest.set_timeofday((6000 % 24000) / 24000) minetest.set_timeofday((6000 % 24000) / 24000)
minetest.chat_send_player(player_name, minetest.chat_send_player(player_name,
@ -122,7 +122,7 @@ ui.register_button("misc_set_night", {
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, {settime=true}) then if minetest.check_player_privs(player_name, {settime=true}) then
minetest.sound_play("ui_owl", minetest.sound_play("owl",
{to_player=player_name, gain = 1.0}) {to_player=player_name, gain = 1.0})
minetest.set_timeofday((21000 % 24000) / 24000) minetest.set_timeofday((21000 % 24000) / 24000)
minetest.chat_send_player(player_name, minetest.chat_send_player(player_name,
@ -183,14 +183,14 @@ ui.register_page("craft", {
local n=#formspec+1 local n=#formspec+1
if ui.trash_enabled or ui.is_creative(player_name) or minetest.get_player_privs(player_name).give then 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.35, crafty + 2.3, F(S("Trash:"))) 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) formspec[n+1] = ui.make_trash_slot(craftx + 6.25, crafty + 2.5)
n=n + 2 n=n + 2
end end
if ui.is_creative(player_name) then if ui.is_creative(player_name) then
formspec[n] = ui.single_slot(craftx - 2.5, crafty + 2.5) formspec[n] = ui.single_slot(craftx - 2.5, crafty + 2.5)
formspec[n+1] = string.format("label[%f,%f;%s]", craftx - 2.4, crafty + 2.3, F(S("Refill:"))) formspec[n+1] = string.format("label[%f,%f;%s]", craftx - 2.3, crafty + 2.4,F(S("Refill:")))
formspec[n+2] = string.format("list[detached:%srefill;main;%f,%f;1,1;]", formspec[n+2] = string.format("list[detached:%srefill;main;%f,%f;1,1;]",
F(player_name), craftx - 2.5 + ui.list_img_offset, crafty + 2.5 + ui.list_img_offset) F(player_name), craftx - 2.5 + ui.list_img_offset, crafty + 2.5 + ui.list_img_offset)
end end
@ -215,7 +215,7 @@ local function stack_image_button(x, y, w, h, buttonname_prefix, item)
local group_name = name:sub(7) local group_name = name:sub(7)
local group_item = ui.get_group_item(group_name) local group_item = ui.get_group_item(group_name)
show_is_group = not group_item.sole show_is_group = not group_item.sole
displayitem = group_item.item or name 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 ""
@ -298,10 +298,11 @@ ui.register_page("craftguide", {
local n = 4 local n = 4
local item_def = minetest.registered_items[item_name]
local item_name_shown local item_name_shown
if item_def and item_def.description then if minetest.registered_items[item_name]
item_name_shown = S("@1 (@2)", item_def.description, item_name) and minetest.registered_items[item_name].description then
item_name_shown = S("@1 (@2)",
minetest.registered_items[item_name].description, item_name)
else else
item_name_shown = item_name item_name_shown = item_name
end end
@ -326,14 +327,12 @@ ui.register_page("craftguide", {
F(role_text[dir]), item_name_shown) F(role_text[dir]), item_name_shown)
n = n + 2 n = n + 2
local giveme_form = local giveme_form = table.concat({
"label[" .. (give_x + 0.1) .. "," .. (craftguidey + 2.7) .. ";" .. F(S("Give me:")) .. "]" .. "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)..",".. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_1;1]",
if item_def and item_def.type ~= "tool" then "button["..(give_x+0.8)..",".. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_10;10]",
giveme_form = giveme_form .. "button["..(give_x+1.6)..",".. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_99;99]"
"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]"
end
if not craft then if not craft then
-- No craft recipes available for this item. -- No craft recipes available for this item.

View File

@ -1,36 +1,17 @@
# Reduced formspec layout, optimized for smaller displays. #Enabling lite mode enables a smaller and simpler version of the Unified
# Note: This may also disable some features to free up visual space. #Inventory, optimized for small displays.
unified_inventory_lite (Lite mode) bool false unified_inventory_lite (Lite mode) bool false
# Provides craftable bag items to extend the inventory space. #If enabled, bags will be made available which can be used to extend
#inventory storage size.
unified_inventory_bags (Enable bags) bool true unified_inventory_bags (Enable bags) bool true
# Shows the trash slot to everyone. #If enabled, the trash slot can be used by those without both creative
# When disabled, only players with the privilege "creative" or "give" will #and the give privilege.
# have this slot shown in their inventory.
unified_inventory_trash (Enable trash) bool true unified_inventory_trash (Enable trash) bool true
# Provides waypoints on a per-player basis to remember positions on the map. #If enabled, disabled buttons will be hidden instead of grayed out.
unified_inventory_waypoints (Enable waypoints) bool true
# If enabled, disabled buttons will be hidden instead of grayed out.
unified_inventory_hide_disabled_buttons (Hide disabled buttons) bool false unified_inventory_hide_disabled_buttons (Hide disabled buttons) bool false
# Hides items with no known craft recipe from the category "all" (default).
# This setting has no effect on players in creative mode.
unified_inventory_hide_uncraftable_items (Hide uncraftable items) bool false
# Automatically categorizes registered items based on their unified_inventory_automatic_categorization (Items automatically added to categories) bool true
# groups. This is based on a fuzzy match, thus is not 100% accurate.
unified_inventory_automatic_categorization (Categories: add items automatically) bool true
# Shows the selected wielded item description in the HUD for a few seconds.
unified_inventory_item_names (Enable HUD item names) bool true
# Trims the shown wielded item description to the first line.
unified_inventory_only_names (HUD item name: first line only) bool true
# Hard character limit of the wielded item description.
# Crops the shown description to the specified length.
# 0 disables this functionality.
unified_inventory_max_item_name_length (HUD item names: character limit) int 80

BIN
sounds/birds.ogg Normal file

Binary file not shown.

BIN
sounds/owl.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -103,7 +103,7 @@ local function get_waypoint_data(player)
end end
ui.register_page("waypoints", { ui.register_page("waypoints", {
get_formspec = function(player, perplayer_formspec) get_formspec = function(player)
local player_name = player:get_player_name() local player_name = player:get_player_name()
local wp_info_x = ui.style_full.form_header_x + 1.25 local wp_info_x = ui.style_full.form_header_x + 1.25
local wp_info_y = ui.style_full.form_header_y + 0.5 local wp_info_y = ui.style_full.form_header_y + 0.5
@ -115,16 +115,12 @@ ui.register_page("waypoints", {
local sel = waypoints.selected or 1 local sel = waypoints.selected or 1
local formspec = { local formspec = {
ui.style_full.standard_inv_bg,
string.format("label[%f,%f;%s]", string.format("label[%f,%f;%s]",
ui.style_full.form_header_x, ui.style_full.form_header_y, F(S("Waypoints"))), ui.style_full.form_header_x, ui.style_full.form_header_y, F(S("Waypoints"))),
"image["..wp_info_x..","..wp_info_y..";1,1;ui_waypoints_icon.png]" "image["..wp_info_x..","..wp_info_y..";1,1;ui_waypoints_icon.png]"
} }
local n=3 local n=4
if not perplayer_formspec.is_lite_mode then
formspec[n] = ui.style_full.standard_inv_bg
n = n + 1
end
-- Tabs buttons: -- Tabs buttons:
for i = 1, COUNT do for i = 1, COUNT do
@ -144,50 +140,36 @@ ui.register_page("waypoints", {
-- Main buttons: -- Main buttons:
local btnlist = { local btnlist = {
-- 1. formspec name set_waypoint = {
-- 2. button image
-- 3. translation text
{
"toggle_waypoint",
waypoint.active and "ui_on_icon.png" or "ui_off_icon.png",
waypoint.active and S("Hide waypoint") or S("Show waypoint")
},
{
"rename_waypoint",
"ui_pencil_icon.png",
S("Edit waypoint name")
},
{
"set_waypoint",
"ui_waypoint_set_icon.png", "ui_waypoint_set_icon.png",
S("Set waypoint to current location") S("Set waypoint to current location")
}, },
{ toggle_waypoint = {
"toggle_display_pos", waypoint.active and "ui_on_icon.png" or "ui_off_icon.png",
waypoint.display_pos and "ui_green_icon_background.png^ui_xyz_icon.png" or waypoint.active and S("Hide waypoint") or S("Show waypoint")
"ui_red_icon_background.png^ui_xyz_icon.png^(ui_no.png^[transformR90)", },
toggle_display_pos = {
waypoint.display_pos and "ui_green_icon_background.png^ui_xyz_icon.png" or "ui_red_icon_background.png^ui_xyz_icon.png^(ui_no.png^[transformR90)",
waypoint.display_pos and S("Hide coordinates") or S("Show coordinates") waypoint.display_pos and S("Hide coordinates") or S("Show coordinates")
}, },
{ toggle_color = {
"toggle_color",
"ui_circular_arrows_icon.png", "ui_circular_arrows_icon.png",
S("Change color of waypoint display") S("Change color of waypoint display")
}, },
rename_waypoint = {
"ui_pencil_icon.png",
S("Edit waypoint name")
}
} }
if minetest.get_player_privs(player_name).teleport then
table.insert(btnlist, {
"teleport_waypoint",
"ui_teleport.png",
S("Teleport to waypoint")
})
end
for i, def in pairs(btnlist) do local x = 4
for name, def in pairs(btnlist) do
formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s%i;]", formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s%i;]",
wp_buttons_rj + ui.style_full.btn_spc * (i - #btnlist), wp_bottom_row, wp_buttons_rj - ui.style_full.btn_spc * x, wp_bottom_row,
ui.style_full.btn_size, ui.style_full.btn_size, ui.style_full.btn_size, ui.style_full.btn_size,
def[2], def[1], sel) def[1], name, sel)
formspec[n+1] = "tooltip["..def[1]..sel..";"..F(def[3]).."]" formspec[n+1] = "tooltip["..name..sel..";"..F(def[2]).."]"
x = x - 1
n = n + 2 n = n + 2
end end
@ -217,10 +199,7 @@ ui.register_page("waypoints", {
formspec[n+2] = string.format("label[%f,%f;%s: %s]", formspec[n+2] = string.format("label[%f,%f;%s: %s]",
wp_info_x, wp_info_y+2.60, F(S("HUD text color")), hud_colors[waypoint.color or 1][3]) wp_info_x, wp_info_y+2.60, F(S("HUD text color")), hud_colors[waypoint.color or 1][3])
return { return {formspec=table.concat(formspec)}
formspec = table.concat(formspec),
draw_inventory = not perplayer_formspec.is_lite_mode,
}
end, end,
}) })
@ -228,6 +207,7 @@ ui.register_button("waypoints", {
type = "image", type = "image",
image = "ui_waypoints_icon.png", image = "ui_waypoints_icon.png",
tooltip = S("Waypoints"), tooltip = S("Waypoints"),
hide_lite=true
}) })
local function update_hud(player, waypoints, temp, i) local function update_hud(player, waypoints, temp, i)
@ -255,7 +235,7 @@ local function update_hud(player, waypoints, temp, i)
end end
if waypoint.active then if waypoint.active then
temp.hud = player:hud_add({ temp.hud = player:hud_add({
[core.features.hud_def_type_field and "type" or "hud_elem_type"] = "waypoint", hud_elem_type = "waypoint",
number = hud_colors[waypoint.color or 1][2] , number = hud_colors[waypoint.color or 1][2] ,
name = name, name = name,
text = "m", text = "m",
@ -333,13 +313,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
update_formspec = true update_formspec = true
end end
if fields["teleport_waypoint" .. i] and waypoint.world_pos then
if minetest.get_player_privs(player_name).teleport then
minetest.sound_play("teleport", {to_player = player_name})
player:set_pos(waypoint.world_pos)
end
end
if hit then if hit then
-- Save first -- Save first
waypoints.data[i] = waypoint waypoints.data[i] = waypoint
@ -350,7 +323,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
update_hud(player, waypoints, temp, i) update_hud(player, waypoints, temp, i)
end end
if update_formspec then if update_formspec then
minetest.sound_play("ui_click", {to_player=player_name, gain = 0.1})
ui.set_inventory_formspec(player, "waypoints") ui.set_inventory_formspec(player, "waypoints")
end end