mirror of
https://github.com/minetest-mods/i3.git
synced 2024-12-27 11:20:40 +01:00
Clean bag code (warning: break backward compat)
This commit is contained in:
parent
88b1e56c87
commit
0cedd16efe
4
init.lua
4
init.lua
@ -12,6 +12,7 @@ i3 = {
|
|||||||
INV_SIZE = 4*9,
|
INV_SIZE = 4*9,
|
||||||
HOTBAR_LEN = 9,
|
HOTBAR_LEN = 9,
|
||||||
ITEM_BTN_SIZE = 1.1,
|
ITEM_BTN_SIZE = 1.1,
|
||||||
|
DROP_BAG_ON_DIE = true,
|
||||||
MIN_FORMSPEC_VERSION = 4,
|
MIN_FORMSPEC_VERSION = 4,
|
||||||
SAVE_INTERVAL = 600, -- Player data save interval (in seconds)
|
SAVE_INTERVAL = 600, -- Player data save interval (in seconds)
|
||||||
|
|
||||||
@ -24,9 +25,8 @@ i3 = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
META_SAVES = {
|
META_SAVES = {
|
||||||
|
bag = true,
|
||||||
home = true,
|
home = true,
|
||||||
bag_item = true,
|
|
||||||
bag_size = true,
|
|
||||||
waypoints = true,
|
waypoints = true,
|
||||||
inv_items = true,
|
inv_items = true,
|
||||||
drop_items = true,
|
drop_items = true,
|
||||||
|
35
src/bags.lua
35
src/bags.lua
@ -1,14 +1,8 @@
|
|||||||
local set_fs = i3.set_fs
|
local set_fs = i3.set_fs
|
||||||
local ItemStack = ItemStack
|
local ItemStack = ItemStack
|
||||||
local S, ES, fmt, msg, slz, dslz = i3.get("S", "ES", "fmt", "msg", "slz", "dslz")
|
local S, ES, fmt, msg, slz, dslz = i3.get("S", "ES", "fmt", "msg", "slz", "dslz")
|
||||||
local play_sound, create_inventory = i3.get("play_sound", "create_inventory")
|
local get_group, play_sound, get_detached_inv, create_inventory =
|
||||||
|
i3.get("get_group", "play_sound", "get_detached_inv", "create_inventory")
|
||||||
local function get_content_inv(name)
|
|
||||||
return core.get_inventory {
|
|
||||||
type = "detached",
|
|
||||||
name = fmt("i3_bag_content_%s", name)
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
local function get_content(content)
|
local function get_content(content)
|
||||||
local t = {}
|
local t = {}
|
||||||
@ -27,7 +21,7 @@ local function init_bags(player)
|
|||||||
local bag = create_inventory(fmt("i3_bag_%s", name), {
|
local bag = create_inventory(fmt("i3_bag_%s", name), {
|
||||||
allow_put = function(inv, _, _, stack)
|
allow_put = function(inv, _, _, stack)
|
||||||
local empty = inv:is_empty"main"
|
local empty = inv:is_empty"main"
|
||||||
local item_group = core.get_item_group(stack:get_name(), "bag")
|
local item_group = get_group(stack:get_name(), "bag")
|
||||||
|
|
||||||
if empty and item_group > 0 and item_group <= 4 then
|
if empty and item_group > 0 and item_group <= 4 then
|
||||||
return 1
|
return 1
|
||||||
@ -43,14 +37,13 @@ local function init_bags(player)
|
|||||||
end,
|
end,
|
||||||
|
|
||||||
on_put = function(_, _, _, stack)
|
on_put = function(_, _, _, stack)
|
||||||
data.bag_item = stack:to_string()
|
data.bag = stack:to_string()
|
||||||
data.bag_size = core.get_item_group(stack:get_name(), "bag")
|
|
||||||
|
|
||||||
local meta = stack:get_meta()
|
local meta = stack:get_meta()
|
||||||
local content = dslz(meta:get_string"content")
|
local content = dslz(meta:get_string"content")
|
||||||
|
|
||||||
if content then
|
if content then
|
||||||
local inv = get_content_inv(name)
|
local inv = get_detached_inv("bag_content", name)
|
||||||
inv:set_list("main", get_content(content))
|
inv:set_list("main", get_content(content))
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -58,10 +51,8 @@ local function init_bags(player)
|
|||||||
end,
|
end,
|
||||||
|
|
||||||
on_take = function()
|
on_take = function()
|
||||||
data.bag_item = nil
|
data.bag = nil
|
||||||
data.bag_size = nil
|
local content = get_detached_inv("bag_content", name)
|
||||||
|
|
||||||
local content = get_content_inv(name)
|
|
||||||
content:set_list("main", {})
|
content:set_list("main", {})
|
||||||
|
|
||||||
set_fs(player)
|
set_fs(player)
|
||||||
@ -70,8 +61,8 @@ local function init_bags(player)
|
|||||||
|
|
||||||
bag:set_size("main", 1)
|
bag:set_size("main", 1)
|
||||||
|
|
||||||
if data.bag_item then
|
if data.bag then
|
||||||
bag:set_list("main", get_content{data.bag_item})
|
bag:set_list("main", get_content{data.bag})
|
||||||
end
|
end
|
||||||
|
|
||||||
local function save_content(inv)
|
local function save_content(inv)
|
||||||
@ -94,13 +85,15 @@ local function init_bags(player)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local percent = fmt("%d", (c * 100) / (data.bag_size * 4))
|
local bag_size = get_group(bagstack:get_name(), "bag")
|
||||||
|
local percent = fmt("%d", (c * 100) / (bag_size * 4))
|
||||||
|
|
||||||
meta:set_string("description", ES("@1 (@2% full)", bagstack:get_description(), percent))
|
meta:set_string("description", ES("@1 (@2% full)", bagstack:get_description(), percent))
|
||||||
meta:set_string("content", slz(t))
|
meta:set_string("content", slz(t))
|
||||||
end
|
end
|
||||||
|
|
||||||
bag:set_stack("main", 1, bagstack)
|
bag:set_stack("main", 1, bagstack)
|
||||||
data.bag_item = bagstack:to_string()
|
data.bag = bagstack:to_string()
|
||||||
|
|
||||||
set_fs(player)
|
set_fs(player)
|
||||||
end
|
end
|
||||||
@ -113,7 +106,7 @@ local function init_bags(player)
|
|||||||
|
|
||||||
bag_content:set_size("main", 4*4)
|
bag_content:set_size("main", 4*4)
|
||||||
|
|
||||||
if data.bag_item then
|
if data.bag then
|
||||||
local meta = bag:get_stack("main", 1):get_meta()
|
local meta = bag:get_stack("main", 1):get_meta()
|
||||||
local content = dslz(meta:get_string"content")
|
local content = dslz(meta:get_string"content")
|
||||||
|
|
||||||
|
@ -9,12 +9,12 @@ local fmt, find, match, sub, lower, split = i3.get("fmt", "find", "match", "sub"
|
|||||||
local vec_new, vec_eq, vec_round = i3.get("vec_new", "vec_eq", "vec_round")
|
local vec_new, vec_eq, vec_round = i3.get("vec_new", "vec_eq", "vec_round")
|
||||||
local sort, copy, insert, remove, indexof = i3.get("sort", "copy", "insert", "remove", "indexof")
|
local sort, copy, insert, remove, indexof = i3.get("sort", "copy", "insert", "remove", "indexof")
|
||||||
|
|
||||||
local msg, is_fav, pos_to_str, str_to_pos, add_hud_waypoint, play_sound =
|
local msg, is_fav, pos_to_str, str_to_pos, add_hud_waypoint, play_sound, spawn_item =
|
||||||
i3.get("msg", "is_fav", "pos_to_str", "str_to_pos", "add_hud_waypoint", "play_sound")
|
i3.get("msg", "is_fav", "pos_to_str", "str_to_pos", "add_hud_waypoint", "play_sound", "spawn_item")
|
||||||
local search, get_sorting_idx, sort_inventory, sort_by_category, get_recipes =
|
local search, get_sorting_idx, sort_inventory, sort_by_category, get_recipes, get_detached_inv =
|
||||||
i3.get("search", "get_sorting_idx", "sort_inventory", "sort_by_category", "get_recipes")
|
i3.get("search", "get_sorting_idx", "sort_inventory", "sort_by_category", "get_recipes", "get_detached_inv")
|
||||||
local show_item, get_stack, craft_stack, clean_name, compressible, check_privs, safe_teleport =
|
local valid_item, get_stack, craft_stack, clean_name, compressible, check_privs, safe_teleport =
|
||||||
i3.get("show_item", "get_stack", "craft_stack", "clean_name", "compressible", "check_privs", "safe_teleport")
|
i3.get("valid_item", "get_stack", "craft_stack", "clean_name", "compressible", "check_privs", "safe_teleport")
|
||||||
|
|
||||||
local function reset_data(data)
|
local function reset_data(data)
|
||||||
data.filter = ""
|
data.filter = ""
|
||||||
@ -258,7 +258,7 @@ local function select_item(player, data, _f)
|
|||||||
local i = 1
|
local i = 1
|
||||||
|
|
||||||
for _, v in ipairs(items) do
|
for _, v in ipairs(items) do
|
||||||
if show_item(reg_items[clean_name(v)]) then
|
if valid_item(reg_items[clean_name(v)]) then
|
||||||
insert(data.alt_items, idx + i, v)
|
insert(data.alt_items, idx + i, v)
|
||||||
i = i + 1
|
i = i + 1
|
||||||
end
|
end
|
||||||
@ -451,6 +451,18 @@ core.register_on_dieplayer(function(player)
|
|||||||
local data = i3.data[name]
|
local data = i3.data[name]
|
||||||
if not data then return end
|
if not data then return end
|
||||||
|
|
||||||
|
if i3.DROP_BAG_ON_DIE then
|
||||||
|
local bagstack = ItemStack(data.bag)
|
||||||
|
spawn_item(player, bagstack)
|
||||||
|
end
|
||||||
|
|
||||||
|
data.bag = nil
|
||||||
|
local bag = get_detached_inv("bag", name)
|
||||||
|
local content = get_detached_inv("bag_content", name)
|
||||||
|
|
||||||
|
bag:set_list("main", {})
|
||||||
|
content:set_list("main", {})
|
||||||
|
|
||||||
set_fs(player)
|
set_fs(player)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
@ -226,7 +226,7 @@ local function item_has_groups(item_groups, groups)
|
|||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
local function show_item(def)
|
local function valid_item(def)
|
||||||
return def and def.groups.not_in_creative_inventory ~= 1 and
|
return def and def.groups.not_in_creative_inventory ~= 1 and
|
||||||
def.description and def.description ~= ""
|
def.description and def.description ~= ""
|
||||||
end
|
end
|
||||||
@ -237,7 +237,7 @@ local function groups_to_items(groups, get_all)
|
|||||||
local stereotype = i3.group_stereotypes[group]
|
local stereotype = i3.group_stereotypes[group]
|
||||||
local def = core.registered_items[stereotype]
|
local def = core.registered_items[stereotype]
|
||||||
|
|
||||||
if show_item(def) then
|
if valid_item(def) then
|
||||||
return stereotype
|
return stereotype
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -245,7 +245,7 @@ local function groups_to_items(groups, get_all)
|
|||||||
local names = {}
|
local names = {}
|
||||||
|
|
||||||
for name, def in pairs(core.registered_items) do
|
for name, def in pairs(core.registered_items) do
|
||||||
if show_item(def) and item_has_groups(def.groups, groups) then
|
if valid_item(def) and item_has_groups(def.groups, groups) then
|
||||||
if get_all then
|
if get_all then
|
||||||
insert(names, name)
|
insert(names, name)
|
||||||
else
|
else
|
||||||
@ -559,6 +559,13 @@ local function add_hud_waypoint(player, name, pos, color)
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function get_detached_inv(name, player_name)
|
||||||
|
return core.get_inventory {
|
||||||
|
type = "detached",
|
||||||
|
name = fmt("i3_%s_%s", name, player_name)
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
local function createunpack(n)
|
local function createunpack(n)
|
||||||
local ret = {"local t = ... return "}
|
local ret = {"local t = ... return "}
|
||||||
|
|
||||||
@ -612,9 +619,7 @@ local _ = {
|
|||||||
msg = msg,
|
msg = msg,
|
||||||
|
|
||||||
-- Misc. functions
|
-- Misc. functions
|
||||||
get_stack = get_stack,
|
valid_item = valid_item,
|
||||||
craft_stack = craft_stack,
|
|
||||||
show_item = show_item,
|
|
||||||
spawn_item = spawn_item,
|
spawn_item = spawn_item,
|
||||||
clean_name = clean_name,
|
clean_name = clean_name,
|
||||||
play_sound = play_sound,
|
play_sound = play_sound,
|
||||||
@ -626,9 +631,15 @@ local _ = {
|
|||||||
slz = core.serialize,
|
slz = core.serialize,
|
||||||
dslz = core.deserialize,
|
dslz = core.deserialize,
|
||||||
ESC = core.formspec_escape,
|
ESC = core.formspec_escape,
|
||||||
|
get_group = core.get_item_group,
|
||||||
pos_to_str = core.pos_to_string,
|
pos_to_str = core.pos_to_string,
|
||||||
str_to_pos = core.string_to_pos,
|
str_to_pos = core.string_to_pos,
|
||||||
check_privs = core.check_player_privs,
|
check_privs = core.check_player_privs,
|
||||||
|
|
||||||
|
-- Inventory
|
||||||
|
get_stack = get_stack,
|
||||||
|
craft_stack = craft_stack,
|
||||||
|
get_detached_inv = get_detached_inv,
|
||||||
create_inventory = core.create_detached_inventory,
|
create_inventory = core.create_detached_inventory,
|
||||||
|
|
||||||
-- Registered items
|
-- Registered items
|
||||||
|
21
src/gui.lua
21
src/gui.lua
@ -12,7 +12,8 @@ local reg_items, reg_tools, reg_entities = i3.get("reg_items", "reg_tools", "reg
|
|||||||
local maxn, sort, concat, copy, insert, remove, unpack =
|
local maxn, sort, concat, copy, insert, remove, unpack =
|
||||||
i3.get("maxn", "sort", "concat", "copy", "insert", "remove", "unpack")
|
i3.get("maxn", "sort", "concat", "copy", "insert", "remove", "unpack")
|
||||||
|
|
||||||
local true_str, is_fav, is_num = i3.get("true_str", "is_fav", "is_num")
|
local true_str, is_fav, is_num, get_group =
|
||||||
|
i3.get("true_str", "is_fav", "is_num", "get_group")
|
||||||
local groups_to_items, compression_active, compressible =
|
local groups_to_items, compression_active, compressible =
|
||||||
i3.get("groups_to_items", "compression_active", "compressible")
|
i3.get("groups_to_items", "compression_active", "compressible")
|
||||||
local get_sorting_idx, is_group, extract_groups, item_has_groups =
|
local get_sorting_idx, is_group, extract_groups, item_has_groups =
|
||||||
@ -285,7 +286,7 @@ local function get_waypoint_fs(fs, data, player, yextra, ctn_len)
|
|||||||
fs("style_type[label;font_size=16]")
|
fs("style_type[label;font_size=16]")
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_container(fs, data, player, yoffset, ctn_len, award_list, awards_unlocked, award_list_nb)
|
local function get_container(fs, data, player, yoffset, ctn_len, award_list, awards_unlocked, award_list_nb, bag_size)
|
||||||
local name = data.player_name
|
local name = data.player_name
|
||||||
local esc_name = ESC(name)
|
local esc_name = ESC(name)
|
||||||
|
|
||||||
@ -345,7 +346,7 @@ local function get_container(fs, data, player, yoffset, ctn_len, award_list, awa
|
|||||||
|
|
||||||
if not inv:is_empty"main" then
|
if not inv:is_empty"main" then
|
||||||
local v = {{1.9, 2, 0.12}, {3.05, 5, 0.06}, {4.2, 10}, {4.75, 10}}
|
local v = {{1.9, 2, 0.12}, {3.05, 5, 0.06}, {4.2, 10}, {4.75, 10}}
|
||||||
local h, m, yy = unpack(v[data.bag_size])
|
local h, m, yy = unpack(v[bag_size])
|
||||||
|
|
||||||
fs("image", 0.5, yextra + 1.85, 0.6, 0.6, PNG.arrow_content)
|
fs("image", 0.5, yextra + 1.85, 0.6, 0.6, PNG.arrow_content)
|
||||||
fs(fmt("style[bg_content;bgimg=%s;fgimg=i3_blank.png;bgimg_middle=10,%u;sound=]",
|
fs(fmt("style[bg_content;bgimg=%s;fgimg=i3_blank.png;bgimg_middle=10,%u;sound=]",
|
||||||
@ -356,13 +357,12 @@ local function get_container(fs, data, player, yoffset, ctn_len, award_list, awa
|
|||||||
|
|
||||||
local x, size, spacing = 1.45, 0.9, 0.12
|
local x, size, spacing = 1.45, 0.9, 0.12
|
||||||
|
|
||||||
if data.bag_size == 4 then
|
if bag_size == 4 then
|
||||||
x, size, spacing = 1.7, 0.8, 0.1
|
x, size, spacing = 1.7, 0.8, 0.1
|
||||||
end
|
end
|
||||||
|
|
||||||
fs(fmt("style_type[list;size=%f;spacing=%f]", size, spacing))
|
fs(fmt("style_type[list;size=%f;spacing=%f]", size, spacing))
|
||||||
fs(fmt("list[detached:i3_bag_content_%s;main;%f,%f;4,%u;]",
|
fs(fmt("list[detached:i3_bag_content_%s;main;%f,%f;4,%u;]", esc_name, x, yextra + 1.3, bag_size))
|
||||||
esc_name, x, yextra + 1.3, data.bag_size))
|
|
||||||
fs("style_type[list;size=1;spacing=0.15]")
|
fs("style_type[list;size=1;spacing=0.15]")
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -545,9 +545,10 @@ local function get_inventory_fs(player, data, fs)
|
|||||||
|
|
||||||
local awards_unlocked, award_list, award_list_nb = 0
|
local awards_unlocked, award_list, award_list_nb = 0
|
||||||
local max_val = damage_enabled and 12 or 7
|
local max_val = damage_enabled and 12 or 7
|
||||||
|
local bag_size = get_group(ItemStack(data.bag):get_name(), "bag")
|
||||||
|
|
||||||
if data.subcat == 1 and data.bag_size then
|
if data.subcat == 1 and bag_size > 0 then
|
||||||
max_val = max_val + min(32, 6 + ((data.bag_size - 1) * 10))
|
max_val = max_val + min(32, 6 + ((bag_size - 1) * 10))
|
||||||
|
|
||||||
elseif i3.modules.armor and data.subcat == 2 then
|
elseif i3.modules.armor and data.subcat == 2 then
|
||||||
if data.scrbar_inv >= max_val then
|
if data.scrbar_inv >= max_val then
|
||||||
@ -580,14 +581,14 @@ local function get_inventory_fs(player, data, fs)
|
|||||||
end
|
end
|
||||||
|
|
||||||
fs(fmt([[
|
fs(fmt([[
|
||||||
scrollbaroptions[arrows=hide;thumbsize=%u;max=%u]
|
scrollbaroptions[arrows=hide;thumbsize=%d;max=%d]
|
||||||
scrollbar[%f,0.2;0.2,%f;vertical;scrbar_inv;%u]
|
scrollbar[%f,0.2;0.2,%f;vertical;scrbar_inv;%u]
|
||||||
scrollbaroptions[arrows=default;thumbsize=0;max=1000]
|
scrollbaroptions[arrows=default;thumbsize=0;max=1000]
|
||||||
]],
|
]],
|
||||||
(max_val * 4) / 12, max_val, 9.8, ctn_hgt, data.scrbar_inv))
|
(max_val * 4) / 12, max_val, 9.8, ctn_hgt, data.scrbar_inv))
|
||||||
|
|
||||||
fs(fmt("scroll_container[3.9,0.2;%f,%f;scrbar_inv;vertical]", ctn_len, ctn_hgt))
|
fs(fmt("scroll_container[3.9,0.2;%f,%f;scrbar_inv;vertical]", ctn_len, ctn_hgt))
|
||||||
get_container(fs, data, player, yoffset, ctn_len, award_list, awards_unlocked, award_list_nb)
|
get_container(fs, data, player, yoffset, ctn_len, award_list, awards_unlocked, award_list_nb, bag_size)
|
||||||
fs("scroll_container_end[]")
|
fs("scroll_container_end[]")
|
||||||
|
|
||||||
local btn = {
|
local btn = {
|
||||||
|
@ -6,8 +6,8 @@ local maxn, copy, insert, sort, match = i3.get("maxn", "copy", "insert", "sort",
|
|||||||
|
|
||||||
local is_group, extract_groups, item_has_groups, groups_to_items =
|
local is_group, extract_groups, item_has_groups, groups_to_items =
|
||||||
i3.get("is_group", "extract_groups", "item_has_groups", "groups_to_items")
|
i3.get("is_group", "extract_groups", "item_has_groups", "groups_to_items")
|
||||||
local true_str, is_table, show_item, table_merge, table_replace, rcp_eq =
|
local true_str, is_table, valid_item, table_merge, table_replace, rcp_eq =
|
||||||
i3.get("true_str", "is_table", "show_item", "table_merge", "table_replace", "rcp_eq")
|
i3.get("true_str", "is_table", "valid_item", "table_merge", "table_replace", "rcp_eq")
|
||||||
|
|
||||||
local function get_burntime(item)
|
local function get_burntime(item)
|
||||||
return core.get_craft_result{method = "fuel", items = {item}}.time
|
return core.get_craft_result{method = "fuel", items = {item}}.time
|
||||||
@ -30,7 +30,7 @@ local function get_item_usages(item, recipe, added)
|
|||||||
|
|
||||||
if groups then
|
if groups then
|
||||||
for name, def in pairs(reg_items) do
|
for name, def in pairs(reg_items) do
|
||||||
if not added[name] and show_item(def) and item_has_groups(def.groups, groups) then
|
if not added[name] and valid_item(def) and item_has_groups(def.groups, groups) then
|
||||||
local usage = copy(recipe)
|
local usage = copy(recipe)
|
||||||
table_replace(usage.items, item, name)
|
table_replace(usage.items, item, name)
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ local function get_item_usages(item, recipe, added)
|
|||||||
added[name] = true
|
added[name] = true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif show_item(reg_items[item]) then
|
elseif valid_item(reg_items[item]) then
|
||||||
i3.usages_cache[item] = i3.usages_cache[item] or {}
|
i3.usages_cache[item] = i3.usages_cache[item] or {}
|
||||||
insert(i3.usages_cache[item], 1, recipe)
|
insert(i3.usages_cache[item], 1, recipe)
|
||||||
end
|
end
|
||||||
@ -254,7 +254,7 @@ local function init_recipes()
|
|||||||
local _select, _preselect = {}, {}
|
local _select, _preselect = {}, {}
|
||||||
|
|
||||||
for name, def in pairs(reg_items) do
|
for name, def in pairs(reg_items) do
|
||||||
if name ~= "" and show_item(def) then
|
if name ~= "" and valid_item(def) then
|
||||||
cache_drops(name, def.drop)
|
cache_drops(name, def.drop)
|
||||||
cache_fuel(name)
|
cache_fuel(name)
|
||||||
cache_recipes(name)
|
cache_recipes(name)
|
||||||
|
Loading…
Reference in New Issue
Block a user