diff --git a/bags.lua b/bags.lua deleted file mode 100644 index f2e6e3d..0000000 --- a/bags.lua +++ /dev/null @@ -1,250 +0,0 @@ ---[[ -Bags for Minetest - -Copyright (c) 2012 cornernote, Brett O'Donnell -License: GPLv3 ---]] - -local S = minetest.get_translator("unified_inventory") -local F = minetest.formspec_escape -local ui = unified_inventory - -ui.register_page("bags", { - get_formspec = function(player) - local player_name = player:get_player_name() - return { formspec = table.concat({ - ui.style_full.standard_inv_bg, - ui.single_slot(0.925, 1.5), - ui.single_slot(3.425, 1.5), - ui.single_slot(5.925, 1.5), - ui.single_slot(8.425, 1.5), - "label["..ui.style_full.form_header_x..","..ui.style_full.form_header_y..";" .. F(S("Bags")) .. "]", - "button[0.6125,2.75;1.875,0.75;bag1;" .. F(S("Bag @1", 1)) .. "]", - "button[3.1125,2.75;1.875,0.75;bag2;" .. F(S("Bag @1", 2)) .. "]", - "button[5.6125,2.75;1.875,0.75;bag3;" .. F(S("Bag @1", 3)) .. "]", - "button[8.1125,2.75;1.875,0.75;bag4;" .. F(S("Bag @1", 4)) .. "]", - "listcolors[#00000000;#00000000]", - "list[detached:" .. F(player_name) .. "_bags;bag1;1.075,1.65;1,1;]", - "list[detached:" .. F(player_name) .. "_bags;bag2;3.575,1.65;1,1;]", - "list[detached:" .. F(player_name) .. "_bags;bag3;6.075,1.65;1,1;]", - "list[detached:" .. F(player_name) .. "_bags;bag4;8.575,1.65;1,1;]" - }) } - end, -}) - -ui.register_button("bags", { - type = "image", - image = "ui_bags_icon.png", - tooltip = S("Bags"), - hide_lite=true -}) - -local function get_player_bag_stack(player, i) - return minetest.get_inventory({ - type = "detached", - name = player:get_player_name() .. "_bags" - }):get_stack("bag" .. i, 1) -end - -for bag_i = 1, 4 do - ui.register_page("bag" .. bag_i, { - get_formspec = function(player) - local stack = get_player_bag_stack(player, bag_i) - local image = stack:get_definition().inventory_image - local slots = stack:get_definition().groups.bagslots - - local formspec = { - ui.style_full.standard_inv_bg, - ui.make_inv_img_grid(0.3, 1.5, 8, slots/8), - "image[9.2,0.4;1,1;" .. image .. "]", - "label[0.3,0.65;" .. F(S("Bag @1", bag_i)) .. "]", - "listcolors[#00000000;#00000000]", - "listring[current_player;main]", - string.format("list[current_player;bag%icontents;%f,%f;8,3;]", - bag_i, 0.3 + ui.list_img_offset, 1.5 + ui.list_img_offset), - "listring[current_name;bag" .. bag_i .. "contents]", - } - local n = #formspec + 1 - - local player_name = player:get_player_name() -- For if statement. - if ui.trash_enabled - or ui.is_creative(player_name) - or minetest.get_player_privs(player_name).give then - formspec[n] = ui.make_trash_slot(7.8, 0.25) - n = n + 1 - end - local inv = player:get_inventory() - for i = 1, 4 do - local def = get_player_bag_stack(player, i):get_definition() - if def.groups.bagslots then - local list_name = "bag" .. i .. "contents" - local size = inv:get_size(list_name) - local used = 0 - for si = 1, size do - local stk = inv:get_stack(list_name, si) - if not stk:is_empty() then - used = used + 1 - end - end - local img = def.inventory_image - local label = F(S("Bag @1", i)) .. "\n" .. used .. "/" .. size - formspec[n] = string.format("image_button[%f,0.4;1,1;%s;bag%i;%s]", - (i + 1.35)*1.25, img, i, label) - n = n + 1 - end - end - return { formspec = table.concat(formspec) } - end, - }) -end - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "" then - return - end - for i = 1, 4 do - if fields["bag" .. i] then - local stack = get_player_bag_stack(player, i) - if not stack:get_definition().groups.bagslots then - return - end - ui.set_inventory_formspec(player, "bag" .. i) - return - end - end -end) - -local function save_bags_metadata(player, bags_inv) - local is_empty = true - local bags = {} - for i = 1, 4 do - local bag = "bag" .. i - if not bags_inv:is_empty(bag) then - -- Stack limit is 1, otherwise use stack:to_string() - bags[i] = bags_inv:get_stack(bag, 1):get_name() - is_empty = false - end - end - local meta = player:get_meta() - if is_empty then - meta:set_string("unified_inventory:bags", nil) - else - meta:set_string("unified_inventory:bags", - minetest.serialize(bags)) - end -end - -local function load_bags_metadata(player, bags_inv) - local player_inv = player:get_inventory() - local meta = player:get_meta() - local bags_meta = meta:get("unified_inventory:bags") - local bags = bags_meta and minetest.deserialize(bags_meta) or {} - local dirty_meta = false - if not bags_meta then - -- Backwards compatiblity - for i = 1, 4 do - local bag = "bag" .. i - if not player_inv:is_empty(bag) then - -- Stack limit is 1, otherwise use stack:to_string() - bags[i] = player_inv:get_stack(bag, 1):get_name() - dirty_meta = true - end - end - end - -- Fill detached slots - for i = 1, 4 do - local bag = "bag" .. i - bags_inv:set_size(bag, 1) - bags_inv:set_stack(bag, 1, bags[i] or "") - end - - if dirty_meta then - -- Requires detached inventory to be set up - save_bags_metadata(player, bags_inv) - end - - -- Clean up deprecated garbage after saving - for i = 1, 4 do - local bag = "bag" .. i - player_inv:set_size(bag, 0) - end -end - -minetest.register_on_joinplayer(function(player) - local player_name = player:get_player_name() - local bags_inv = minetest.create_detached_inventory(player_name .. "_bags",{ - on_put = function(inv, listname, index, stack, player) - player:get_inventory():set_size(listname .. "contents", - stack:get_definition().groups.bagslots) - save_bags_metadata(player, inv) - end, - allow_put = function(inv, listname, index, stack, player) - local new_slots = stack:get_definition().groups.bagslots - if not new_slots then - return 0 - end - local player_inv = player:get_inventory() - local old_slots = player_inv:get_size(listname .. "contents") - - if new_slots >= old_slots then - return 1 - end - - -- using a smaller bag, make sure it fits - local old_list = player_inv:get_list(listname .. "contents") - local new_list = {} - local slots_used = 0 - local use_new_list = false - - for i, v in ipairs(old_list) do - if v and not v:is_empty() then - slots_used = slots_used + 1 - use_new_list = i > new_slots - new_list[slots_used] = v - end - end - if new_slots >= slots_used then - if use_new_list then - player_inv:set_list(listname .. "contents", new_list) - end - return 1 - end - -- New bag is smaller: Disallow inserting - return 0 - end, - allow_take = function(inv, listname, index, stack, player) - if player:get_inventory():is_empty(listname .. "contents") then - return stack:get_count() - end - return 0 - end, - on_take = function(inv, listname, index, stack, player) - player:get_inventory():set_size(listname .. "contents", 0) - save_bags_metadata(player, inv) - end, - allow_move = function() - return 0 - end, - }, player_name) - - load_bags_metadata(player, bags_inv) -end) - --- register bag tools -minetest.register_tool("unified_inventory:bag_small", { - description = S("Small Bag"), - inventory_image = "bags_small.png", - groups = {bagslots=8}, -}) - -minetest.register_tool("unified_inventory:bag_medium", { - description = S("Medium Bag"), - inventory_image = "bags_medium.png", - groups = {bagslots=16}, -}) - -minetest.register_tool("unified_inventory:bag_large", { - description = S("Large Bag"), - inventory_image = "bags_large.png", - groups = {bagslots=24}, -}) \ No newline at end of file diff --git a/callbacks.lua b/callbacks.lua index fa6d03a..66a8193 100644 --- a/callbacks.lua +++ b/callbacks.lua @@ -128,24 +128,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) (#unified_inventory.filtered_items_list[player_name] - 1) / (ui_peruser.items_per_page) + 1) - if fields.start_list then - start_i = 1 - end if fields.rewind1 then start_i = start_i - 1 end if fields.forward1 then start_i = start_i + 1 end - if fields.rewind3 then - start_i = start_i - 3 - end - if fields.forward3 then - start_i = start_i + 3 - end - if fields.end_list then - start_i = pagemax - end if start_i < 1 then start_i = 1 end diff --git a/category.lua b/category.lua deleted file mode 100644 index d0fee5e..0000000 --- a/category.lua +++ /dev/null @@ -1,150 +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 = "unknown_item.png", - label = category_name - } - end - if not unified_inventory.registered_category_items[category_name] then - unified_inventory.registered_category_items[category_name] = {} - end -end - -function unified_inventory.register_category(category_name, config) - ensure_category_exists(category_name) - config = config or {} - if config.symbol then - unified_inventory.set_category_symbol(category_name, config.symbol) - end - if config.label then - unified_inventory.set_category_label(category_name, config.label) - end - if config.index then - unified_inventory.set_category_index(category_name, config.index) - end - if config.items then - unified_inventory.add_category_items(category_name, config.items) - end - update_category_list() -end -function unified_inventory.set_category_symbol(category_name, symbol) - ensure_category_exists(category_name) - unified_inventory.registered_categories[category_name].symbol = symbol - update_category_list() -end -function unified_inventory.set_category_label(category_name, label) - ensure_category_exists(category_name) - unified_inventory.registered_categories[category_name].label = label - update_category_list() -end -function unified_inventory.set_category_index(category_name, index) - ensure_category_exists(category_name) - unified_inventory.registered_categories[category_name].index = index - update_category_list() -end -function unified_inventory.add_category_item(category_name, item) - ensure_category_exists(category_name) - unified_inventory.registered_category_items[category_name][item] = true -end -function unified_inventory.add_category_items(category_name, items) - for _,item in ipairs(items) do - unified_inventory.add_category_item(category_name, item) - end -end - -function unified_inventory.remove_category_item(category_name, item) - unified_inventory.registered_category_items[category_name][item] = nil -end -function unified_inventory.remove_category(category_name) - unified_inventory.registered_categories[category_name] = nil - unified_inventory.registered_category_items[category_name] = nil - update_category_list() -end - -function unified_inventory.find_category(item) - -- Returns the first category the item exists in - -- Best for checking if an item has any category at all - for category, items in pairs(unified_inventory.registered_category_items) do - if items[item] then return category end - end -end -function unified_inventory.find_categories(item) - -- Returns all the categories the item exists in - -- Best for listing all categories - local categories = {} - for category, items in pairs(unified_inventory.registered_category_items) do - if items[item] then - table.insert(categories, category) - end - end - return categories -end diff --git a/default-categories.lua b/default-categories.lua deleted file mode 100644 index 57d3e88..0000000 --- a/default-categories.lua +++ /dev/null @@ -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) ---]] \ No newline at end of file diff --git a/init.lua b/init.lua index 1b962da..7c26f88 100644 --- a/init.lua +++ b/init.lua @@ -67,9 +67,9 @@ ui.style_full = { formh = 12.25, -- Item browser size, pos pagecols = 8, - pagerows = 9, + pagerows = 11, page_x = 10.75, - page_y = 2.30, + page_y = 0.30, -- Item browser controls page_buttons_x = 11.60, page_buttons_y = 10.15, @@ -108,9 +108,9 @@ ui.style_lite = { formh = 9.75, -- Item browser size, pos pagecols = 4, - pagerows = 5, + pagerows = 7, page_x = 10.5, - page_y = 2.15, + page_y = 0.15, -- Item browser controls page_buttons_x = 10.5, page_buttons_y = 6.15, @@ -179,17 +179,9 @@ if sfinv then end dofile(modpath.."/group.lua") -dofile(modpath.."/category.lua") -dofile(modpath.."/default-categories.lua") dofile(modpath.."/internal.lua") dofile(modpath.."/callbacks.lua") -dofile(modpath.."/match_craft.lua") dofile(modpath.."/register.lua") -if minetest.settings:get_bool("unified_inventory_bags") ~= false then - dofile(modpath.."/bags.lua") -end - dofile(modpath.."/item_names.lua") -dofile(modpath.."/waypoints.lua") dofile(modpath.."/legacy.lua") -- mod compatibility diff --git a/internal.lua b/internal.lua index 938ca19..1b5f98c 100644 --- a/internal.lua +++ b/internal.lua @@ -79,10 +79,10 @@ local function formspec_tab_buttons(player, formspec, style) formspec[n+1] = "tooltip["..F(def.name)..";"..(def.tooltip or "").."]" n = n+2 else - formspec[n] = string.format("image[%g,%g;%g,%g;%s^[colorize:#808080:alpha]", - pos_x, pos_y, style.btn_size, style.btn_size, - def.image) - n = n+1 + -- formspec[n] = string.format("image[%g,%g;%g,%g;%s^[colorize:#808080:alpha]", + -- pos_x, pos_y, style.btn_size, style.btn_size, + -- def.image) + -- n = n+1 end end end @@ -100,60 +100,6 @@ local function formspec_tab_buttons(player, formspec, style) formspec[n+3] = "scrollbaroptions[max=1000;arrows=default]" end end - --- Add category GUI elements (top right) -local function formspec_add_categories(player, formspec, ui_peruser) - local player_name = player:get_player_name() - local n = #formspec + 1 - - local categories_pos = { - ui_peruser.page_x, - ui_peruser.page_y-ui_peruser.btn_spc-0.5 - } - local categories_scroll_pos = { - ui_peruser.page_x, - ui_peruser.form_header_y - (ui_peruser.is_lite_mode and 0 or 0.2) - } - - formspec[n] = string.format("background9[%f,%f;%f,%f;%s;false;16]", - ui_peruser.page_x-0.15, categories_scroll_pos[2], - (ui_peruser.btn_spc * ui_peruser.pagecols) + 0.2, 1.4 + (ui_peruser.is_lite_mode and 0 or 0.2), - "ui_smallbg_9_sliced.png") - n = n + 1 - - formspec[n] = string.format("label[%f,%f;%s]", - ui_peruser.page_x, - ui_peruser.form_header_y + (ui_peruser.is_lite_mode and 0.3 or 0.2), F(S("Category:"))) - n = n + 1 - - local scroll_offset = 0 - local category_count = #ui.category_list - if category_count > ui_peruser.pagecols then - scroll_offset = ui.current_category_scroll[player_name] - end - - for index, category in ipairs(ui.category_list) do - local column = index - scroll_offset - if column > 0 and column <= ui_peruser.pagecols then - local scale = 0.8 - if ui.current_category[player_name] == category.name then - scale = 1 - end - formspec[n] = formspec_button(ui_peruser, "category_"..category.name, category.symbol, categories_pos, {column-1, 0}, scale, category.label) - n = n + 1 - end - end - if category_count > ui_peruser.pagecols and scroll_offset > 0 then - -- prev - formspec[n] = formspec_button(ui_peruser, "prev_category", "ui_left_icon.png", categories_scroll_pos, {ui_peruser.pagecols - 2, 0}, 0.8, S("Scroll categories left")) - n = n + 1 - end - if category_count > ui_peruser.pagecols and category_count - scroll_offset > ui_peruser.pagecols then - -- next - formspec[n] = formspec_button(ui_peruser, "next_category", "ui_right_icon.png", categories_scroll_pos, {ui_peruser.pagecols - 1, 0}, 0.8, S("Scroll categories right")) - end -end - local function formspec_add_search_box(player, formspec, ui_peruser) local player_name = player:get_player_name() local n = #formspec + 1 @@ -184,35 +130,17 @@ end local function formspec_add_item_browser(player, formspec, ui_peruser) local player_name = player:get_player_name() local n = #formspec + 1 - - -- Controls to flip items pages - - local btnlist = { - { "ui_skip_backward_icon.png", "start_list", S("First page") }, - { "ui_doubleleft_icon.png", "rewind3", S("Back three pages") }, - { "ui_left_icon.png", "rewind1", S("Back one page") }, - { "ui_right_icon.png", "forward1", S("Forward one page") }, - { "ui_doubleright_icon.png", "forward3", S("Forward three pages") }, - { "ui_skip_forward_icon.png", "end_list", S("Last page") }, - } - - if ui_peruser.is_lite_mode then - btnlist[2] = nil - btnlist[5] = nil - end - - local bn = 0 - for _, b in pairs(btnlist) do - formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s;]", - ui_peruser.page_buttons_x + ui_peruser.btn_spc*bn, - ui_peruser.page_buttons_y + ui_peruser.btn_spc, - ui_peruser.btn_size, ui_peruser.btn_size, - b[1],b[2]) - formspec[n+1] = "tooltip["..b[2]..";"..F(b[3]).."]" - bn = bn + 1 - n = n + 2 - end - + formspec[n] = string.format("image_button[%f,%f;%f,%f;ui_left_icon.png;rewind1;]", + ui_peruser.page_buttons_x, + ui_peruser.page_buttons_y + 1, + ui_peruser.btn_size, ui_peruser.btn_size) + formspec[n+1] = "tooltip[rewind1;"..F(S("Back one page")).."]" + formspec[n+2] = string.format("image_button[%f,%f;%f,%f;ui_right_icon.png;forward1;]", + ui_peruser.page_buttons_x + ui_peruser.btn_spc * 5, + ui_peruser.page_buttons_y + 1, + ui_peruser.btn_size, ui_peruser.btn_size) + formspec[n+3] = "tooltip[forward1;"..F(S("Forward one page")).."]" + n = n + 4 -- Items list if #ui.filtered_items_list[player_name] == 0 then local no_matches = S("No matching items") @@ -272,7 +200,7 @@ local function formspec_add_item_browser(player, formspec, ui_peruser) end formspec[n] = string.format("label[%f,%f;%s: %s]", ui_peruser.page_buttons_x + ui_peruser.btn_spc * (ui_peruser.is_lite_mode and 1 or 2), - ui_peruser.page_buttons_y + 0.1 + ui_peruser.btn_spc * 2, + ui_peruser.page_buttons_y - 0.3 + ui_peruser.btn_spc * 2, F(S("Page")), S("@1 of @2",page2,pagemax)) end @@ -316,7 +244,6 @@ function ui.get_formspec(player, page) return table.concat(fs, "") end - formspec_add_categories(player, fs, ui_peruser) formspec_add_search_box(player, fs, ui_peruser) formspec_add_item_browser(player, fs, ui_peruser) @@ -369,30 +296,10 @@ function ui.apply_filter(player, filter, search_dir) end end ui.filtered_items_list[player_name]={} - local category = ui.current_category[player_name] or 'all' - if category == 'all' then - for name, def in pairs(minetest.registered_items) do - if valid_def(def) - and ffilter(name, def) then - table.insert(ui.filtered_items_list[player_name], name) - end - end - elseif category == 'uncategorized' then - for name, def in pairs(minetest.registered_items) do - if (not ui.find_category(name)) - and valid_def(def) - and ffilter(name, def) then - table.insert(ui.filtered_items_list[player_name], name) - end - end - else - for name,exists in pairs(ui.registered_category_items[category]) do - local def = minetest.registered_items[name] - if exists and def - and valid_def(def) - and ffilter(name, def) then - table.insert(ui.filtered_items_list[player_name], name) - end + for name, def in pairs(minetest.registered_items) do + if valid_def(def) + and ffilter(name, def) then + table.insert(ui.filtered_items_list[player_name], name) end end table.sort(ui.filtered_items_list[player_name]) diff --git a/register.lua b/register.lua index 8dc20f0..a5bcd62 100644 --- a/register.lua +++ b/register.lua @@ -29,114 +29,11 @@ local trash = minetest.create_detached_inventory("trash", { }) trash:set_size("main", 1) -ui.register_button("craft", { - type = "image", - image = "ui_craft_icon.png", - tooltip = S("Crafting Grid") -}) - -ui.register_button("craftguide", { - type = "image", - image = "ui_craftguide_icon.png", - tooltip = S("Crafting Guide") -}) - -ui.register_button("home_gui_set", { - type = "image", - image = "ui_sethome_icon.png", - tooltip = S("Set home position"), - hide_lite=true, - action = function(player) - local player_name = player:get_player_name() - if minetest.check_player_privs(player_name, {home=true}) then - ui.set_home(player, player:get_pos()) - local home = ui.home_pos[player_name] - if home ~= nil then - minetest.sound_play("dingdong", - {to_player=player_name, gain = 1.0}) - minetest.chat_send_player(player_name, - S("Home position set to: @1", minetest.pos_to_string(home))) - end - else - minetest.chat_send_player(player_name, - S("You don't have the \"home\" privilege!")) - ui.set_inventory_formspec(player, ui.current_page[player_name]) - end - end, - condition = function(player) - return minetest.check_player_privs(player:get_player_name(), {home=true}) - end, -}) - -ui.register_button("home_gui_go", { - type = "image", - image = "ui_gohome_icon.png", - tooltip = S("Go home"), - hide_lite=true, - action = function(player) - local player_name = player:get_player_name() - if minetest.check_player_privs(player_name, {home=true}) then - if ui.go_home(player) then - minetest.sound_play("teleport", {to_player = player_name}) - end - else - minetest.chat_send_player(player_name, - S("You don't have the \"home\" privilege!")) - ui.set_inventory_formspec(player, ui.current_page[player_name]) - end - end, - condition = function(player) - return minetest.check_player_privs(player:get_player_name(), {home=true}) - end, -}) - -ui.register_button("misc_set_day", { - type = "image", - image = "ui_sun_icon.png", - tooltip = S("Set time to day"), - hide_lite=true, - action = function(player) - local player_name = player:get_player_name() - if minetest.check_player_privs(player_name, {settime=true}) then - minetest.sound_play("birds", - {to_player=player_name, gain = 1.0}) - minetest.set_timeofday((6000 % 24000) / 24000) - minetest.chat_send_player(player_name, - S("Time of day set to 6am")) - else - minetest.chat_send_player(player_name, - S("You don't have the settime privilege!")) - ui.set_inventory_formspec(player, ui.current_page[player_name]) - end - end, - condition = function(player) - return minetest.check_player_privs(player:get_player_name(), {settime=true}) - end, -}) - -ui.register_button("misc_set_night", { - type = "image", - image = "ui_moon_icon.png", - tooltip = S("Set time to night"), - hide_lite=true, - action = function(player) - local player_name = player:get_player_name() - if minetest.check_player_privs(player_name, {settime=true}) then - minetest.sound_play("owl", - {to_player=player_name, gain = 1.0}) - minetest.set_timeofday((21000 % 24000) / 24000) - minetest.chat_send_player(player_name, - S("Time of day set to 9pm")) - else - minetest.chat_send_player(player_name, - S("You don't have the settime privilege!")) - ui.set_inventory_formspec(player, ui.current_page[player_name]) - end - end, - condition = function(player) - return minetest.check_player_privs(player:get_player_name(), {settime=true}) - end, -}) +-- ui.register_button("craft", { +-- type = "image", +-- image = "ui_craft_icon.png", +-- tooltip = S("Crafting Grid") +-- }) ui.register_button("clear_inv", { type = "image", @@ -174,25 +71,27 @@ ui.register_page("craft", { local player_name = player:get_player_name() local formspec = { perplayer_formspec.standard_inv_bg, + } + local formspec2 = { perplayer_formspec.craft_grid, "label["..formheaderx..","..formheadery..";" ..F(S("Crafting")).."]", "listcolors[#00000000;#00000000]", "listring[current_name;craft]", - "listring[current_player;main]" + "listring[current_player;main]", + string.format("label[%f,%f;%s]", craftx + 6.45, crafty + 2.4, F(S("Trash:"))), + ui.make_trash_slot(craftx + 6.25, crafty + 2.5), + ui.single_slot(craftx - 2.5, crafty + 2.5), + string.format("label[%f,%f;%s]", craftx - 2.3, crafty + 2.4,F(S("Refill:"))), + 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), } local n=#formspec+1 - if ui.trash_enabled or ui.is_creative(player_name) or minetest.get_player_privs(player_name).give then - formspec[n] = string.format("label[%f,%f;%s]", craftx + 6.45, crafty + 2.4, F(S("Trash:"))) - formspec[n+1] = ui.make_trash_slot(craftx + 6.25, crafty + 2.5) - n=n + 2 - end - if ui.is_creative(player_name) then - formspec[n] = ui.single_slot(craftx - 2.5, crafty + 2.5) - formspec[n+1] = string.format("label[%f,%f;%s]", craftx - 2.3, crafty + 2.4,F(S("Refill:"))) - formspec[n+2] = string.format("list[detached:%srefill;main;%f,%f;1,1;]", - F(player_name), craftx - 2.5 + ui.list_img_offset, crafty + 2.5 + ui.list_img_offset) + --copy formspec2 to formspec + for i=1,#formspec2 do + formspec[n]=formspec2[i] + n = n+1 + end end return {formspec=table.concat(formspec)} end, diff --git a/waypoints.lua b/waypoints.lua deleted file mode 100644 index 1496cdd..0000000 --- a/waypoints.lua +++ /dev/null @@ -1,348 +0,0 @@ -local S = minetest.get_translator("unified_inventory") -local F = minetest.formspec_escape -local ui = unified_inventory -local COUNT = 5 - -local hud_colors = { - {"#FFFFFF", 0xFFFFFF, S("White")}, - {"#DBBB00", 0xf1d32c, S("Yellow")}, - {"#DD0000", 0xDD0000, S("Red")}, - {"#2cf136", 0x2cf136, S("Green")}, - {"#2c4df1", 0x2c4df1, S("Blue")}, -} - --- Storage compatibility code - ---[[ -Stores temporary player data (persists until player leaves) - [player_name] = { - [] = { - edit = , - hud = , - }, - [] = { ... }, - ... - } -]] -local waypoints_temp = {} - ---[[ -Datastorage format (per-player): - { - selected = , - [] = { - name = - world_pos = , - color = <"hud_colors" index>, - active = , - display_pos = , - }, - [] = { ... }, - ... - } -Player metadata format: - { - selected = , - -- Cannot mix integer/string keys in JSON - data = { - [] = { same as above }, - ... - } - } -]] - -local function set_waypoint_data(player, waypoints) - local meta = player:get_meta() - if not next(waypoints.data or {}) then - -- Empty data. Do not save anything, or delete - meta:set_string("ui_waypoints", "") - else - meta:set_string("ui_waypoints", minetest.write_json(waypoints)) - end -end - -local function migrate_datastorage(player, waypoints) - -- Copy values from old table - local new_data = { - selected = waypoints.selected, - data = {} - } - for i = 1, COUNT do - new_data.data[i] = waypoints[i] - end - - set_waypoint_data(player, new_data) - - -- Delete values, but keep one entry so that it's saved by datastorage - for k, _ in pairs(waypoints) do - waypoints[k] = nil - end - waypoints[1] = 1 -end - -local have_datastorage = minetest.get_modpath("datastorage") ~= nil -local function get_waypoint_data(player) - local player_name = player:get_player_name() - - -- Migration step - if have_datastorage then - local waypoints = datastorage.get(player_name, "waypoints") - if waypoints.selected then - migrate_datastorage(player, waypoints) - minetest.log("action", "[unified_inventory] " .. - "Migrated waypoints of player: " .. player_name) - end - end - - -- Get directly from metadata - local waypoints = player:get_meta():get("ui_waypoints") - waypoints = waypoints and minetest.parse_json(waypoints) or {} - waypoints.data = waypoints.data or {} - - return waypoints -end - -ui.register_page("waypoints", { - get_formspec = function(player) - local player_name = player:get_player_name() - local wp_info_x = ui.style_full.form_header_x + 1.25 - local wp_info_y = ui.style_full.form_header_y + 0.5 - local wp_bottom_row = ui.style_full.std_inv_y - 1 - local wp_buttons_rj = ui.style_full.std_inv_x + 10.1 - ui.style_full.btn_spc - local wp_edit_w = ui.style_full.btn_spc * 4 - 0.1 - - local waypoints = get_waypoint_data(player) - local sel = waypoints.selected or 1 - - local formspec = { - ui.style_full.standard_inv_bg, - string.format("label[%f,%f;%s]", - ui.style_full.form_header_x, ui.style_full.form_header_y, F(S("Waypoints"))), - "image["..wp_info_x..","..wp_info_y..";1,1;ui_waypoints_icon.png]" - } - local n=4 - - -- Tabs buttons: - for i = 1, COUNT do - local sw="select_waypoint"..i - formspec[n] = string.format("image_button[%f,%f;%f,%f;%sui_%i_icon.png;%s;]", - ui.style_full.main_button_x, wp_bottom_row - (5-i) * ui.style_full.btn_spc, - ui.style_full.btn_size, ui.style_full.btn_size, - (i == sel) and "ui_blue_icon_background.png^" or "", - i, sw) - formspec[n+1] = "tooltip["..sw..";"..S("Select Waypoint #@1", i).."]" - n = n + 2 - end - - local waypoint = waypoints.data[sel] or {} - local temp = waypoints_temp[player_name][sel] or {} - local default_name = S("Waypoint @1", sel) - - -- Main buttons: - local btnlist = { - set_waypoint = { - "ui_waypoint_set_icon.png", - S("Set waypoint to current location") - }, - toggle_waypoint = { - waypoint.active and "ui_on_icon.png" or "ui_off_icon.png", - waypoint.active and S("Hide waypoint") or S("Show waypoint") - }, - toggle_display_pos = { - waypoint.display_pos and "ui_green_icon_background.png^ui_xyz_icon.png" or "ui_red_icon_background.png^ui_xyz_icon.png^(ui_no.png^[transformR90)", - waypoint.display_pos and S("Hide coordinates") or S("Show coordinates") - }, - toggle_color = { - "ui_circular_arrows_icon.png", - S("Change color of waypoint display") - }, - rename_waypoint = { - "ui_pencil_icon.png", - S("Edit waypoint name") - } - } - - local x = 4 - for name, def in pairs(btnlist) do - formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s%i;]", - wp_buttons_rj - ui.style_full.btn_spc * x, wp_bottom_row, - ui.style_full.btn_size, ui.style_full.btn_size, - def[1], name, sel) - formspec[n+1] = "tooltip["..name..sel..";"..F(def[2]).."]" - x = x - 1 - n = n + 2 - end - - -- Waypoint's info: - formspec[n] = ("label[%f,%f;%s]"):format( - wp_info_x, wp_info_y + 1.1, - F(waypoint.active and S("Waypoint active") or S("Waypoint inactive")) - ) - n = n + 1 - - if temp.edit then - formspec[n] = string.format("field[%f,%f;%f,%f;rename_box%i;;%s]", - wp_buttons_rj - wp_edit_w - 0.1, wp_bottom_row - ui.style_full.btn_spc, - wp_edit_w, ui.style_full.btn_size, sel, (waypoint.name or default_name)) - formspec[n+1] = string.format("image_button[%f,%f;%f,%f;ui_ok_icon.png;confirm_rename%i;]", - wp_buttons_rj, wp_bottom_row - ui.style_full.btn_spc, - ui.style_full.btn_size, ui.style_full.btn_size, sel) - formspec[n+2] = "tooltip[confirm_rename"..sel..";"..F(S("Finish editing")).."]" - n = n + 3 - end - - formspec[n] = string.format("label[%f,%f;%s: %s]", - wp_info_x, wp_info_y+1.6, F(S("World position")), - minetest.pos_to_string(waypoint.world_pos or vector.new())) - formspec[n+1] = string.format("label[%f,%f;%s: %s]", - wp_info_x, wp_info_y+2.10, F(S("Name")), (waypoint.name or default_name)) - formspec[n+2] = string.format("label[%f,%f;%s: %s]", - wp_info_x, wp_info_y+2.60, F(S("HUD text color")), hud_colors[waypoint.color or 1][3]) - - return {formspec=table.concat(formspec)} - end, -}) - -ui.register_button("waypoints", { - type = "image", - image = "ui_waypoints_icon.png", - tooltip = S("Waypoints"), - hide_lite=true -}) - -local function update_hud(player, waypoints, temp, i) - local waypoint = waypoints.data[i] - if not waypoint then return end - - temp[i] = temp[i] or {} - temp = temp[i] - - local pos = waypoint.world_pos or vector.new() - local name - if waypoint.display_pos then - name = minetest.pos_to_string(pos) - if waypoint.name then - name = name..", "..waypoint.name - end - else - name = waypoint.name or S("Waypoint @1", i) - end - - -- Perform HUD updates - if temp.hud then - player:hud_remove(temp.hud) - temp.hud = nil - end - if waypoint.active then - temp.hud = player:hud_add({ - hud_elem_type = "waypoint", - number = hud_colors[waypoint.color or 1][2] , - name = name, - text = "m", - world_pos = pos - }) - end -end - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "" then return end - - local player_name = player:get_player_name() - local update_formspec = false - local need_update_hud = false - local hit = false - - local waypoints = get_waypoint_data(player) - local temp = waypoints_temp[player_name] - for i = 1, COUNT do - local waypoint = waypoints.data[i] or {} - - if fields["select_waypoint"..i] then - hit = true - waypoints.selected = i - update_formspec = true - end - - if fields["toggle_waypoint"..i] then - hit = true - waypoint.active = not (waypoint.active) - need_update_hud = true - update_formspec = true - end - - if fields["set_waypoint"..i] then - hit = true - local pos = vector.round(player:get_pos()) - waypoint.world_pos = pos - need_update_hud = true - update_formspec = true - end - - if fields["rename_waypoint"..i] then - hit = true - temp[i] = temp[i] or {} - temp[i].edit = true - update_formspec = true - end - - if fields["toggle_display_pos"..i] then - hit = true - waypoint.display_pos = not waypoint.display_pos - need_update_hud = true - update_formspec = true - end - - if fields["toggle_color"..i] then - hit = true - local color = waypoint.color or 0 - color = color + 1 - if color > #hud_colors then - color = 1 - end - waypoint.color = color - need_update_hud = true - update_formspec = true - end - - if fields["confirm_rename"..i] then - hit = true - temp[i] = temp[i] or {} - temp[i].edit = false - waypoint.name = fields["rename_box"..i] - need_update_hud = true - update_formspec = true - end - - if hit then - -- Save first - waypoints.data[i] = waypoint - set_waypoint_data(player, waypoints) - end - -- Update after - if need_update_hud then - update_hud(player, waypoints, temp, i) - end - if update_formspec then - ui.set_inventory_formspec(player, "waypoints") - end - - if hit then return end - end -end) - --- waypoints_temp must be initialized before the general unified_inventory --- joinplayer callback is run for updating the inventory -table.insert(minetest.registered_on_joinplayers, 1, function(player) - local player_name = player:get_player_name() - local waypoints = get_waypoint_data(player) - - waypoints_temp[player_name] = {} - for i = 1, COUNT do - update_hud(player, waypoints, waypoints_temp[player_name], i) - end -end) - -minetest.register_on_leaveplayer(function(player) - waypoints_temp[player:get_player_name()] = nil -end) -