Clean bag code (warning: break backward compat)

This commit is contained in:
Jean-Patrick Guerrero 2021-11-24 00:51:58 +01:00
parent 88b1e56c87
commit 0cedd16efe
6 changed files with 68 additions and 51 deletions

View File

@ -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,

View File

@ -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")

View File

@ -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)

View File

@ -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

View File

@ -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 = {

View File

@ -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)