This commit is contained in:
Jean-Patrick Guerrero 2021-01-22 00:42:48 +01:00
parent f06e5c3b5a
commit 406defae02
4 changed files with 239 additions and 101 deletions

340
init.lua
View File

@ -44,6 +44,7 @@ local slz, dslz = core.serialize, core.deserialize
local on_mods_loaded = core.register_on_mods_loaded local on_mods_loaded = core.register_on_mods_loaded
local on_leaveplayer = core.register_on_leaveplayer local on_leaveplayer = core.register_on_leaveplayer
local get_player_info = core.get_player_information local get_player_info = core.get_player_information
local create_inventory = core.create_detached_inventory
local on_receive_fields = core.register_on_player_receive_fields local on_receive_fields = core.register_on_player_receive_fields
local ESC = core.formspec_escape local ESC = core.formspec_escape
@ -73,12 +74,22 @@ local IPP = ROWS * LINES
local MAX_FAVS = 6 local MAX_FAVS = 6
local ITEM_BTN_SIZE = 1.1 local ITEM_BTN_SIZE = 1.1
local INV_SIZE = 8*4
-- Progressive mode -- Progressive mode
local POLL_FREQ = 0.25 local POLL_FREQ = 0.25
local HUD_TIMER_MAX = 1.5 local HUD_TIMER_MAX = 1.5
local MIN_FORMSPEC_VERSION = 4 local MIN_FORMSPEC_VERSION = 4
local META_SAVES = {"bag_size", "skin_id"}
local BAG_SIZES = {
small = INV_SIZE + 8,
medium = INV_SIZE + 16,
large = INV_SIZE + 24,
}
local PNG = { local PNG = {
bg = "i3_bg.png", bg = "i3_bg.png",
bg_full = "i3_bg_full.png", bg_full = "i3_bg_full.png",
@ -1093,6 +1104,15 @@ local function get_stack_max(inv, data, is_recipe, rcp)
return max_stacks return max_stacks
end end
local function spawn_item(player, stack)
local dir = player:get_look_dir()
local ppos = player:get_pos()
ppos.y = ppos.y + 1.625
local look_at = vec_add(ppos, vec_mul(dir, 1))
core.add_item(look_at, stack)
end
local function get_stack(player, pname, stack, message) local function get_stack(player, pname, stack, message)
local inv = player:get_inventory() local inv = player:get_inventory()
@ -1100,12 +1120,7 @@ local function get_stack(player, pname, stack, message)
inv:add_item("main", stack) inv:add_item("main", stack)
msg(pname, fmt("%s added in your inventory", message)) msg(pname, fmt("%s added in your inventory", message))
else else
local dir = player:get_look_dir() spawn_item(player, stack)
local ppos = player:get_pos()
ppos.y = ppos.y + 1.625
local look_at = vec_add(ppos, vec_mul(dir, 1))
core.add_item(look_at, stack)
msg(pname, fmt("%s spawned", message)) msg(pname, fmt("%s spawned", message))
end end
end end
@ -1647,7 +1662,7 @@ local function get_export_fs(fs, data, is_recipe, is_usage, max_stacks_rcp, max_
fmt("scrollbaroptions[min=1;max=%u;smallstep=1]", craft_max), fmt("scrollbaroptions[min=1;max=%u;smallstep=1]", craft_max),
fmt("scrollbar", data.xoffset + 8.1, data.yoffset, 3, 0.35, fmt("scrbar_%s", name), stack_fs), fmt("scrollbar", data.xoffset + 8.1, data.yoffset, 3, 0.35, fmt("scrbar_%s", name), stack_fs),
fmt("button", data.xoffset + 8.1, data.yoffset + 0.4, 3, 0.7, fmt("craft_%s", name), fmt("button", data.xoffset + 8.1, data.yoffset + 0.4, 3, 0.7, fmt("craft_%s", name),
fmt("%s", fmt(ES"Craft x %u", stack_fs)))) fmt("%s", fmt(ES"Craft (x%u)", stack_fs))))
end end
local function get_rcp_extra(player, data, fs, panel, is_recipe, is_usage) local function get_rcp_extra(player, data, fs, panel, is_recipe, is_usage)
@ -1735,11 +1750,13 @@ local function get_panels(player, data, fs)
end end
local function add_subtitle(fs, title, x, y, ctn_len, font_size) local function add_subtitle(fs, title, x, y, ctn_len, font_size)
font_size = font_size or "+2"
fs(fmt("style_type[label;font=bold;font_size=%s]", font_size), fmt("label", x, y, title), fs(fmt("style_type[label;font=bold;font_size=%s]", font_size), fmt("label", x, y, title),
"style_type[label;font=normal;font_size=+0]", fmt("box", x, y + 0.3, ctn_len, 0.045, "#bababa50")) "style_type[label;font=normal;font_size=+0]", fmt("box", x, y + 0.3, ctn_len, 0.045, "#bababa50"))
end end
local function get_award_list(fs, ctn_len, yextra, award_list, awards_unlocked, award_list_nb) local function get_award_list(data, fs, ctn_len, yextra, award_list, awards_unlocked, award_list_nb)
if (__3darmor and __skinsdb) or __skinsdb then if (__3darmor and __skinsdb) or __skinsdb then
yextra = yextra + 1.8 yextra = yextra + 1.8
elseif __3darmor then elseif __3darmor then
@ -1749,7 +1766,7 @@ local function get_award_list(fs, ctn_len, yextra, award_list, awards_unlocked,
local percent = fmt("%.1f%%", (awards_unlocked * 100) / award_list_nb):gsub(".0", "") local percent = fmt("%.1f%%", (awards_unlocked * 100) / award_list_nb):gsub(".0", "")
add_subtitle(fs, fmt("%s: %u of %u (%s)", ES"Achievements", add_subtitle(fs, fmt("%s: %u of %u (%s)", ES"Achievements",
awards_unlocked, award_list_nb, percent), 0, yextra, ctn_len, "+2") awards_unlocked, award_list_nb, percent), 0, yextra, ctn_len)
for i = 1, award_list_nb do for i = 1, award_list_nb do
local award = award_list[i] local award = award_list[i]
@ -1836,15 +1853,18 @@ local function get_ctn_content(fs, data, player, xoffset, yoffset, ctn_len, awar
local yextra = 5.6 local yextra = 5.6
if __3darmor then add_subtitle(fs, ES"Backpack", 0, yextra, ctn_len)
add_subtitle(fs, ES"Armor", 0, yextra, ctn_len, "+2") fs(fmt("list[detached:%s_backpack;main;0,%f;1,1;]", ESC(name), yextra + 0.6))
fs(fmt("list[detached:%s_armor;armor;0,%f;3,2;]", ESC(name), yextra + 0.6)) if __3darmor then
add_subtitle(fs, ES"Armor", 0, yextra + 2.2, ctn_len)
fs(fmt("list[detached:%s_armor;armor;0,%f;3,2;]", ESC(name), yextra + 2.8))
local armor_def = armor.def[name] local armor_def = armor.def[name]
fs(fmt("label", 3.75, yextra + 1.55, fmt("%s: %s", ES"Level", armor_def.level)), fs(fmt("label", 3.75, yextra + 3.75, fmt("%s: %s", ES"Level", armor_def.level)),
fmt("label", 3.75, yextra + 1.95, fmt("%s: %s", ES"Heal", armor_def.heal))) fmt("label", 3.75, yextra + 4.25, fmt("%s: %s", ES"Heal", armor_def.heal)))
end end
if __skinsdb then if __skinsdb then
@ -1855,16 +1875,16 @@ local function get_ctn_content(fs, data, player, xoffset, yoffset, ctn_len, awar
t[#t + 1] = skin.name t[#t + 1] = skin.name
end end
yextra = __3darmor and (yextra + 3.5) or yextra yextra = __3darmor and (yextra + 5.7) or yextra + 2.2
add_subtitle(fs, ES"Skins", 0, yextra, ctn_len, "+2") add_subtitle(fs, ES"Skins", 0, yextra, ctn_len)
fs(fmt("dropdown[0,%f;3.55,0.6;skins;%s;%u;true]", fs(fmt("dropdown[0,%f;3.55,0.6;skins;%s;%u;true]",
yextra + 0.6, concat(t, ","), data.skin_id or 1)) yextra + 0.6, concat(t, ","), data.skin_id or 1))
end end
if __awards then if __awards then
get_award_list(fs, ctn_len, yextra, award_list, awards_unlocked, award_list_nb) get_award_list(data, fs, ctn_len, yextra, award_list, awards_unlocked, award_list_nb)
end end
end end
@ -2008,8 +2028,8 @@ function i3.delete_tab(name)
end end
end end
local function init_data(player, name) local function init_data(player, info)
local info = get_player_info(name) local name = player:get_player_name()
pdata[name] = { pdata[name] = {
filter = "", filter = "",
@ -2020,18 +2040,17 @@ local function init_data(player, name)
export_counts = {}, export_counts = {},
current_tab = 1, current_tab = 1,
lang_code = get_lang_code(info), lang_code = get_lang_code(info),
fs_version = get_formspec_version(info),
} }
local data = pdata[name] local data = pdata[name]
local meta = player:get_meta()
data.bag_size = dslz(meta:get_string "bag_size")
if __skinsdb then if __skinsdb then
local meta = player:get_meta()
data.skin_id = tonum(dslz(meta:get_string "skin_id") or 1) data.skin_id = tonum(dslz(meta:get_string "skin_id") or 1)
end end
if data.fs_version < MIN_FORMSPEC_VERSION then return end
after(0, set_fs, player) after(0, set_fs, player)
end end
@ -2102,17 +2121,46 @@ local function panel_fields(player, data, fields)
end end
end end
local function get_inventory_fs(player, data, fs) local function get_inv_slots(data, fs)
local inv_x = 0.234 local inv_x = 0.234
local bag = data.bag_size
for i = 0, 7 do if bag then
fs(fmt("image", i + inv_x + (i * 0.25), 6.1, 1, 1, "i3_hb_bg.png")) local max_value = 38
if data.bag_size == "small" then
max_value = 12
elseif data.bag_size == "medium" then
max_value = 25
end
fs(fmt([[
scrollbaroptions[arrows=hide;thumbsize=6;max=%u]
scrollbar[-2,6.09;0.3,4.83;vertical;scrbar_inv2;]
scrollbaroptions[arrows=default;thumbsize=0;max=1000]
]], max_value))
fs(fmt("scroll_container[%f,6.09;10,4.83;scrbar_inv2;vertical]", inv_x))
inv_x = 0
end end
fs("listcolors[#bababa50;#bababa99]", for i = 0, 7 do
"listring[current_player;main]", fs(fmt("image", i + inv_x + (i * 0.25), bag and 0 or 6.1, 1, 1, "i3_hb_bg.png"))
fmt("list[current_player;main;%f,6.1;8,1;]", inv_x), end
fmt("list[current_player;main;%f,7.4;8,3;8]", inv_x))
fs(fmt("list[current_player;main;%f,%f;8,1;]", inv_x, bag and 0 or 6.1),
fmt("list[current_player;main;%f,%f;8,%u;8]", inv_x, bag and 1.3 or 7.4,
(bag and BAG_SIZES[data.bag_size] or INV_SIZE) / 8))
if bag then
fs("scroll_container_end[]")
end
end
local function get_inventory_fs(player, data, fs)
fs("listcolors[#bababa50;#bababa99]listring[current_player;main]")
get_inv_slots(data, fs)
local props = player:get_properties() local props = player:get_properties()
local name = player:get_player_name() local name = player:get_player_name()
@ -2129,57 +2177,54 @@ local function get_inventory_fs(player, data, fs)
fs(fmt("image", 0.7, 0.2, size, size * props.visual_size.y, props.textures[1])) fs(fmt("image", 0.7, 0.2, size, size * props.visual_size.y, props.textures[1]))
end end
local extras = __3darmor or __skinsdb or __awards
local ctn_len = 5.6 local ctn_len = 5.6
local xoffset = extras and 0 or 4.4 local xoffset, yoffset = 0, 0
local yoffset = extras and 0 or 0.2
local award_list, award_list_nb local award_list, award_list_nb
local awards_unlocked = 0 local awards_unlocked = 0
if extras then local max_val = 20
local max_val = 15
if __3darmor then if __3darmor then
max_val = max_val + 15 max_val = max_val + 33
if __skinsdb then if __skinsdb then
max_val = max_val + 20 max_val = max_val + 3
end
end end
if __awards then
award_list = awards.get_award_states(name)
award_list_nb = #award_list
for i = 1, award_list_nb do
local award = award_list[i]
if award.unlocked then
awards_unlocked = awards_unlocked + 1
end
end
max_val = max_val + (award_list_nb * (12.9 + ((__3darmor or __skinsdb) and 0.25 or 0)))
end
fs(fmt([[
scrollbaroptions[arrows=hide;thumbsize=%u;max=%u]
scrollbar[9.69,0.2;0.3,5.5;vertical;scrbar_inv;%u]
scrollbaroptions[arrows=default;thumbsize=0;max=1000]
]],
(max_val * 3) / 15, max_val, data.scrbar_inv or 0))
fs(fmt("scroll_container[3.9,0.2;%f,5.5;scrbar_inv;vertical]", ctn_len))
end end
if __skinsdb then
max_val = max_val + 16
end
if __awards then
award_list = awards.get_award_states(name)
award_list_nb = #award_list
for i = 1, award_list_nb do
local award = award_list[i]
if award.unlocked then
awards_unlocked = awards_unlocked + 1
end
end
max_val = max_val + (award_list_nb * (12.9 + ((__3darmor or __skinsdb) and 0.25 or 0)))
end
fs(fmt([[
scrollbaroptions[arrows=hide;thumbsize=%u;max=%u]
scrollbar[%f,0.2;0.3,5.5;vertical;scrbar_inv;%u]
scrollbaroptions[arrows=default;thumbsize=0;max=1000]
]],
(max_val * 3) / 15, max_val, 9.69, data.scrbar_inv or 0))
fs(fmt("scroll_container[3.9,0.2;%f,5.5;scrbar_inv;vertical]", ctn_len))
get_ctn_content(fs, data, player, xoffset, yoffset, ctn_len, award_list, awards_unlocked, get_ctn_content(fs, data, player, xoffset, yoffset, ctn_len, award_list, awards_unlocked,
award_list_nb) award_list_nb)
if extras then fs("scroll_container_end[]")
fs("scroll_container_end[]")
end
local btn = { local btn = {
{"trash", ES"Trash all items"}, {"trash", ES"Trash all items"},
@ -2330,7 +2375,7 @@ i3.new_tab {
end, end,
} }
local trash = core.create_detached_inventory("i3_trash", { local trash = create_inventory("i3_trash", {
allow_put = function(inv, listname, index, stack) allow_put = function(inv, listname, index, stack)
return stack:get_count() return stack:get_count()
end, end,
@ -2365,14 +2410,7 @@ end
if rawget(_G, "skins") then if rawget(_G, "skins") then
__skinsdb = true __skinsdb = true
insert(META_SAVES, "skin_id")
on_shutdown(function()
local players = get_players()
for i = 1, #players do
local player = players[i]
save_meta(player, {"skin_id"})
end
end)
end end
if rawget(_G, "awards") then if rawget(_G, "awards") then
@ -2572,13 +2610,92 @@ on_mods_loaded(function()
end end
end) end)
on_joinplayer(function(player) local function init_backpack(player)
local name = player:get_player_name() local name = player:get_player_name()
init_data(player, name)
local data = pdata[name] local data = pdata[name]
if data.fs_version < MIN_FORMSPEC_VERSION then local player_inv = player:get_inventory()
outdated(name) player_inv:set_size("main", INV_SIZE)
data.bag = create_inventory(fmt("%s_backpack", name), {
allow_put = function(inv, listname, _, stack)
local empty = inv:get_stack(listname, 1):is_empty()
if empty and sub(stack:get_name(), 1, 7) == "i3:bag_" then
return 1
end
return 0
end,
on_put = function(_, _, _, stack)
data.bag_size = match(stack:get_name(), "_(%w+)$")
player_inv:set_size("main", BAG_SIZES[data.bag_size])
set_fs(player)
end,
on_take = function()
for i = INV_SIZE + 1, BAG_SIZES[data.bag_size] do
local stack = player_inv:get_stack("main", i)
if not stack:is_empty() then
spawn_item(player, stack)
end
end
data.bag_size = nil
player_inv:set_size("main", INV_SIZE)
set_fs(player)
end,
})
data.bag:set_size("main", 1)
if data.bag_size then
data.bag:set_stack("main", 1, fmt("i3:bag_%s", data.bag_size))
player_inv:set_size("main", BAG_SIZES[data.bag_size])
end
end
on_joinplayer(function(player)
local name = player:get_player_name()
local info = get_player_info(name)
if get_formspec_version(info) < MIN_FORMSPEC_VERSION then
return outdated(name)
end
init_data(player, info)
init_backpack(player)
end)
core.register_on_dieplayer(function(player)
local name = player:get_player_name()
local data = pdata[name]
data.bag_size = nil
data.bag:set_list("main", {})
local inv = player:get_inventory()
inv:set_size("main", INV_SIZE)
set_fs(player)
end)
on_leaveplayer(function(player)
save_meta(player, META_SAVES)
local name = player:get_player_name()
pdata[name] = nil
end)
on_shutdown(function()
local players = get_players()
for i = 1, #players do
local player = players[i]
save_meta(player, META_SAVES)
end end
end) end)
@ -2586,6 +2703,7 @@ on_receive_fields(function(player, formname, fields)
if formname ~= "" then return false end if formname ~= "" then return false end
local name = player:get_player_name() local name = player:get_player_name()
local data = pdata[name] local data = pdata[name]
if not data then return end
for f in pairs(fields) do for f in pairs(fields) do
if sub(f, 1, 4) == "tab_" then if sub(f, 1, 4) == "tab_" then
@ -2838,29 +2956,49 @@ if progressive_mode then
end end
end) end)
local to_save = {"inv_items", "known_recipes"} table_merge(META_SAVES, {"inv_items", "known_recipes"})
on_leaveplayer(function(player)
save_meta(player, to_save)
end)
on_shutdown(function()
local players = get_players()
for i = 1, #players do
local player = players[i]
save_meta(player, to_save)
end
end)
end end
on_leaveplayer(function(player) for _, size in ipairs({"small", "medium", "large"}) do
if __skinsdb then local bagname = fmt("i3:bag_%s", size)
save_meta(player, {"skin_id"})
end
local name = player:get_player_name() core.register_craftitem(bagname, {
pdata[name] = nil description = fmt("%s Backpack", size:gsub("^%l", upper)),
end) inventory_image = fmt("i3_bag_%s.png", size),
stack_max = 1,
})
core.register_craft {
type = "fuel",
recipe = bagname,
burntime = 3
}
end
core.register_craft {
output = "i3:bag_small",
recipe = {
{"", "farming:string", ""},
{"group:wool", "group:wool", "group:wool"},
{"group:wool", "group:wool", "group:wool"},
}
}
core.register_craft {
output = "i3:bag_medium",
recipe = {
{"farming:string", "i3:bag_small", "farming:string"},
{"farming:string", "i3:bag_small", "farming:string"},
}
}
core.register_craft {
output = "i3:bag_large",
recipe = {
{"farming:string", "i3:bag_medium", "farming:string"},
{"farming:string", "i3:bag_medium", "farming:string"},
}
}
--dofile(core.get_modpath("i3") .. "/test_tabs.lua") --dofile(core.get_modpath("i3") .. "/test_tabs.lua")
--dofile(core.get_modpath("i3") .. "/test_custom_recipes.lua") --dofile(core.get_modpath("i3") .. "/test_custom_recipes.lua")

BIN
textures/i3_bag_large.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
textures/i3_bag_medium.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
textures/i3_bag_small.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB