mirror of https://github.com/minetest-mods/i3.git
Compare commits
34 Commits
Author | SHA1 | Date |
---|---|---|
Jean-Patrick Guerrero | 9437545ddb | |
Jean-Patrick Guerrero | ff7353392f | |
Jean-Patrick Guerrero | 45fc03cc26 | |
Jean-Patrick Guerrero | f26a1c288d | |
Jean-Patrick Guerrero | 85fc8219c1 | |
Jean-Patrick Guerrero | 83623effbf | |
Jean-Patrick Guerrero | c64f28a90b | |
Jean-Patrick Guerrero | ad08ca56b8 | |
Jean-Patrick Guerrero | 1684388851 | |
Jean-Patrick Guerrero | 1f43c8fac2 | |
Jean-Patrick Guerrero | 6953a11279 | |
Jean-Patrick Guerrero | 21affdeeba | |
Jean-Patrick Guerrero | 7130ea565d | |
Jean-Patrick Guerrero | b7308b4739 | |
Jean-Patrick Guerrero | d5df9f6f0f | |
Jean-Patrick Guerrero | 7246249c52 | |
Jean-Patrick Guerrero | d36d6e67e7 | |
Jean-Patrick Guerrero | d5fc865634 | |
Jean-Patrick Guerrero | fe475747ea | |
Jean-Patrick Guerrero | e2fafbc876 | |
Jean-Patrick Guerrero | 3b860082b5 | |
Jean-Patrick Guerrero | 36cdcde7ed | |
Jean-Patrick Guerrero | c9e02dfe09 | |
Jean-Patrick Guerrero | 7005794cc3 | |
Jean-Patrick Guerrero | 66b88dec3b | |
Jean-Patrick Guerrero | c207db38a0 | |
Jean-Patrick Guerrero | c89cbf700f | |
Jean-Patrick Guerrero | a1a4535f26 | |
Jean-Patrick Guerrero | 80b927de1c | |
Jean-Patrick Guerrero | 482027d09b | |
Jean-Patrick Guerrero | ea7140a7bb | |
Jean-Patrick Guerrero | 84416b130b | |
Jean-Patrick Guerrero | b31e7a48ab | |
Jean-Patrick Guerrero | 7a4f352ce4 |
15
API.md
15
API.md
|
@ -26,6 +26,7 @@ Custom tabs can be added to the `i3` inventory as follow (example):
|
|||
i3.new_tab("stuff", {
|
||||
description = "Stuff",
|
||||
image = "image.png", -- Optional, add an image next to the tab description
|
||||
slots = true -- Optional, whether the inventory slots are shown or not. Disabled by default.
|
||||
|
||||
--
|
||||
-- The functions below are all optional
|
||||
|
@ -37,6 +38,7 @@ i3.new_tab("stuff", {
|
|||
return name == "singleplayer"
|
||||
end,
|
||||
|
||||
-- Build the formspec
|
||||
formspec = function(player, data, fs)
|
||||
fs("label", 3, 1, "Just a test")
|
||||
fs"label[3,2;Lorem Ipsum]"
|
||||
|
@ -49,7 +51,8 @@ i3.new_tab("stuff", {
|
|||
-- Do things
|
||||
end
|
||||
|
||||
i3.set_fs(player) -- Update the formspec
|
||||
-- To prevent a formspec update, return false.
|
||||
-- Otherwise: no need to return anything, it's automatic.
|
||||
end,
|
||||
})
|
||||
```
|
||||
|
@ -72,7 +75,7 @@ Return the current player tab. `player` is an `ObjectRef` to the user.
|
|||
|
||||
#### `i3.set_tab(player[, tabname])`
|
||||
|
||||
Sets the current tab by name. `player` is an `ObjectRef` to the user.
|
||||
Set the current tab by name. `player` is an `ObjectRef` to the user.
|
||||
`tabname` can be omitted to get an empty tab.
|
||||
|
||||
#### `i3.override_tab(tabname, def)`
|
||||
|
@ -143,7 +146,7 @@ i3.register_craft {
|
|||
}
|
||||
```
|
||||
|
||||
Multiples recipes can also be registered:
|
||||
Multiple recipes can also be registered at once:
|
||||
|
||||
```Lua
|
||||
i3.register_craft {
|
||||
|
@ -218,7 +221,7 @@ Remove a minitab by name.
|
|||
|
||||
- `name` is the name of the tab to remove.
|
||||
|
||||
#### `i3.minimap`
|
||||
#### `i3.minitabs`
|
||||
|
||||
A list of registered minitabs.
|
||||
|
||||
|
@ -416,7 +419,7 @@ Return a table of all waypoints of a specific player.
|
|||
|
||||
#### `i3.hud_notif(name, msg[, img])`
|
||||
|
||||
Show a Steam-like HUD notification on the bottom-right corner of the screen (experimental).
|
||||
Show a Steam-like HUD notification on the bottom-left corner of the screen.
|
||||
|
||||
- `name` is the player name.
|
||||
- `msg` is the HUD message to show.
|
||||
|
@ -438,4 +441,4 @@ given a number between 1 and 4.
|
|||
|
||||
---
|
||||
|
||||
**¹** Add `i3` to the `secure.http_mods` or `secure.trusted_mods` setting in `minetest.conf`.
|
||||
**[1]** Add `i3` to the `secure.http_mods` or `secure.trusted_mods` setting in `minetest.conf`.
|
||||
|
|
4
LICENSE
4
LICENSE
|
@ -28,10 +28,12 @@ Licenses of media (sounds)
|
|||
|
||||
Lone_Wolf (CC0):
|
||||
i3_tab.ogg
|
||||
i3_craft.ogg
|
||||
i3_click.ogg
|
||||
i3_cannot.ogg
|
||||
|
||||
MadPanCake (CC0):
|
||||
i3_craft.ogg (https://freesound.org/people/MadPanCake/sounds/567849/)
|
||||
|
||||
Licenses of media (textures)
|
||||
----------------------------
|
||||
|
||||
|
|
|
@ -35,7 +35,6 @@ To enable it: `i3_progressive_mode = true` in `minetest.conf`.*
|
|||
To use this mod in the best conditions:
|
||||
|
||||
- Use LuaJIT
|
||||
- Use a HiDPI widescreen display
|
||||
- Use the default Freetype font style
|
||||
|
||||
#### Troubleshooting
|
||||
|
|
5
init.lua
5
init.lua
|
@ -20,7 +20,7 @@ local function lf(path)
|
|||
end
|
||||
|
||||
i3 = {
|
||||
version = 114,
|
||||
version = 1161,
|
||||
data = core.deserialize(storage:get_string"data") or {},
|
||||
|
||||
settings = {
|
||||
|
@ -33,7 +33,7 @@ i3 = {
|
|||
wielditem_fade_after = 3,
|
||||
save_interval = 600, -- Player data save interval (in seconds)
|
||||
|
||||
hud_speed = 1,
|
||||
hud_speed = 3,
|
||||
hud_timer_max = 3,
|
||||
|
||||
damage_enabled = core.settings:get_bool"enable_damage",
|
||||
|
@ -113,6 +113,7 @@ i3.files.common()
|
|||
i3.files.api(http)
|
||||
i3.files.compress()
|
||||
i3.files.detached()
|
||||
i3.files.fields()
|
||||
i3.files.groups()
|
||||
i3.files.callbacks(http, storage)
|
||||
|
||||
|
|
Binary file not shown.
Binary file not shown.
35
src/api.lua
35
src/api.lua
|
@ -2,8 +2,8 @@ local http = ...
|
|||
local make_fs, get_inventory_fs = i3.files.gui()
|
||||
|
||||
IMPORT("sorter", "sort_inventory", "play_sound")
|
||||
IMPORT("get_player_by_name", "add_hud_waypoint")
|
||||
IMPORT("sort", "concat", "copy", "insert", "remove")
|
||||
IMPORT("get_player_by_name", "add_hud_waypoint", "init_hud_notif")
|
||||
IMPORT("gmatch", "split", "S", "err", "fmt", "reg_items", "pos_to_str")
|
||||
IMPORT("true_str", "true_table", "is_str", "is_func", "is_table", "clean_name")
|
||||
|
||||
|
@ -196,7 +196,7 @@ end
|
|||
i3.new_tab("inventory", {
|
||||
description = S"Inventory",
|
||||
formspec = get_inventory_fs,
|
||||
fields = i3.files.fields(),
|
||||
slots = true,
|
||||
})
|
||||
|
||||
function i3.remove_tab(name)
|
||||
|
@ -204,7 +204,7 @@ function i3.remove_tab(name)
|
|||
return err "i3.remove_tab: tab name missing"
|
||||
end
|
||||
|
||||
for i = #i3.tabs, 1, -1 do
|
||||
for i = #i3.tabs, 2, -1 do
|
||||
local def = i3.tabs[i]
|
||||
if def and name == def.name then
|
||||
remove(i3.tabs, i)
|
||||
|
@ -319,13 +319,30 @@ function i3.hud_notif(name, msg, img)
|
|||
return err "i3.hud_notif: no player data initialized"
|
||||
end
|
||||
|
||||
data.show_hud = true
|
||||
data.hud_msg = msg
|
||||
local player = get_player_by_name(name)
|
||||
if not player then return end
|
||||
local max_y = -125
|
||||
|
||||
local def = {
|
||||
show = true,
|
||||
max = {x = -330, y = max_y},
|
||||
hud_msg = msg,
|
||||
hud_img = img and fmt("%s^[resize:64x64", img) or nil,
|
||||
hud_timer = 0,
|
||||
elems = init_hud_notif(player),
|
||||
}
|
||||
|
||||
insert(data.hud.notifs, def)
|
||||
play_sound(name, "i3_achievement", 1.0)
|
||||
|
||||
if img then
|
||||
data.hud_img = fmt("%s^[resize:64x64", img)
|
||||
local nb_notifs = #data.hud.notifs
|
||||
for i = 1, nb_notifs - 1 do
|
||||
local notif = data.hud.notifs[i]
|
||||
if notif then
|
||||
notif.show = true
|
||||
notif.max.y = ((nb_notifs - i) + 1) * max_y
|
||||
notif.hud_timer = 0.5 * (nb_notifs - i)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -447,11 +464,9 @@ end
|
|||
function i3.remove_minitab(name)
|
||||
if not true_str(name) then
|
||||
return err "i3.remove_minitab: name missing"
|
||||
elseif name == "all" then
|
||||
return err "i3.remove_minitab: removing the 'All' tab is not allowed"
|
||||
end
|
||||
|
||||
for i = #i3.minitabs, 1, -1 do
|
||||
for i = #i3.minitabs, 2, -1 do
|
||||
local v = i3.minitabs[i]
|
||||
if v and v.name == name then
|
||||
remove(i3.minitabs, i)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
local replacements = {fuel = {}}
|
||||
local http = ...
|
||||
|
||||
IMPORT("maxn", "copy", "insert", "sort", "match", "sub")
|
||||
IMPORT("copy", "insert", "sort", "match", "sub")
|
||||
IMPORT("true_str", "is_table", "valid_item", "table_merge", "table_replace", "table_eq")
|
||||
IMPORT("fmt", "reg_items", "reg_aliases", "reg_nodes", "is_cube", "get_cube", "ItemStack")
|
||||
IMPORT("is_group", "extract_groups", "item_has_groups", "groups_to_items", "get_group_stereotype")
|
||||
|
@ -178,13 +178,7 @@ local function cache_recipes(item)
|
|||
_recipes[#recipes + 1 - k] = v
|
||||
end
|
||||
|
||||
local size_rpl = maxn(replacements[item])
|
||||
local size_rcp = #_recipes
|
||||
local shift = size_rcp - size_rpl
|
||||
|
||||
for k, v in pairs(replacements[item]) do
|
||||
k += shift
|
||||
|
||||
if _recipes[k] then
|
||||
_recipes[k].replacements = v
|
||||
end
|
||||
|
|
|
@ -577,11 +577,7 @@ local function sort_inventory(player, data)
|
|||
local size = inv:get_size"main"
|
||||
local start_i = data.ignore_hotbar and (data.hotbar_len + 1) or 1
|
||||
|
||||
if data.inv_compress then
|
||||
list = compress_items(list, start_i)
|
||||
else
|
||||
list = pre_sorting(list, start_i)
|
||||
end
|
||||
list = data.inv_compress and compress_items(list, start_i) or pre_sorting(list, start_i)
|
||||
|
||||
local new_inv = i3.sorting_methods[data.sort].func(list, data)
|
||||
if not new_inv then return end
|
||||
|
@ -636,6 +632,41 @@ local function add_hud_waypoint(player, name, pos, color, image)
|
|||
}
|
||||
end
|
||||
|
||||
local function init_hud_notif(player)
|
||||
return {
|
||||
bg = player:hud_add {
|
||||
hud_elem_type = "image",
|
||||
position = {x = 0, y = 1},
|
||||
offset = {x = 10, y = 0},
|
||||
alignment = {x = 1, y = 1},
|
||||
scale = {x = 0.6, y = 0.6},
|
||||
text = "i3_bg_notif.png",
|
||||
z_index = 0xDEAD,
|
||||
},
|
||||
|
||||
img = player:hud_add {
|
||||
hud_elem_type = "image",
|
||||
position = {x = 0, y = 1},
|
||||
offset = {x = 20, y = 20},
|
||||
alignment = {x = 1, y = 1},
|
||||
scale = {x = 1, y = 1},
|
||||
text = "",
|
||||
z_index = 0xDEAD,
|
||||
},
|
||||
|
||||
text = player:hud_add {
|
||||
hud_elem_type = "text",
|
||||
position = {x = 0, y = 1},
|
||||
offset = {x = 100, y = 40},
|
||||
alignment = {x = 1, y = 1},
|
||||
number = 0xffffff,
|
||||
text = "",
|
||||
z_index = 0xDEAD,
|
||||
style = 1,
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
local function get_detached_inv(name, player_name)
|
||||
return core.get_inventory {
|
||||
type = "detached",
|
||||
|
@ -653,11 +684,7 @@ local function update_inv_size(player, data)
|
|||
player:hud_set_hotbar_itemcount(data.hotbar_len)
|
||||
|
||||
core.after(0, function()
|
||||
if data.legacy_inventory then
|
||||
player:hud_set_hotbar_image"gui_hotbar.png"
|
||||
else
|
||||
player:hud_set_hotbar_image"i3_hotbar.png"
|
||||
end
|
||||
player:hud_set_hotbar_image(data.legacy_inventory and "gui_hotbar.png" or "i3_hotbar.png")
|
||||
end)
|
||||
end
|
||||
|
||||
|
@ -725,6 +752,7 @@ local _ = {
|
|||
play_sound = play_sound,
|
||||
reset_data = reset_data,
|
||||
safe_teleport = safe_teleport,
|
||||
init_hud_notif = init_hud_notif,
|
||||
add_hud_waypoint = add_hud_waypoint,
|
||||
|
||||
-- Core functions
|
||||
|
@ -790,6 +818,7 @@ local _ = {
|
|||
|
||||
-- Math
|
||||
round = round,
|
||||
abs = math.abs,
|
||||
min = math.min,
|
||||
max = math.max,
|
||||
ceil = math.ceil,
|
||||
|
|
|
@ -12,12 +12,6 @@ IMPORT("search", "sort_inventory", "sort_by_category", "get_recipes", "get_detac
|
|||
local function inv_fields(player, data, fields)
|
||||
local name = data.player_name
|
||||
local inv = player:get_inventory()
|
||||
local sb_inv = fields.scrbar_inv
|
||||
|
||||
if sb_inv and sub(sb_inv, 1, 3) == "CHG" then
|
||||
data.scrbar_inv = tonumber(match(sb_inv, "%d+"))
|
||||
return
|
||||
end
|
||||
|
||||
if fields.dd_sorting_method then
|
||||
data.sort = tonumber(fields.dd_sorting_method)
|
||||
|
@ -211,8 +205,6 @@ local function inv_fields(player, data, fields)
|
|||
elseif fields.hide_debug_grid then
|
||||
data.hide_debug_grid = not data.hide_debug_grid
|
||||
end
|
||||
|
||||
return set_fs(player)
|
||||
end
|
||||
|
||||
local function select_item(player, data, fields)
|
||||
|
@ -431,8 +423,7 @@ core.register_on_player_receive_fields(function(player, formname, fields)
|
|||
local name = player:get_player_name()
|
||||
|
||||
if formname == "i3_outdated" then
|
||||
return false, core.kick_player(name,
|
||||
S"Your Minetest client needs updating (www.minetest.net)")
|
||||
return false, core.kick_player(name, S"Your Minetest client needs updating (www.minetest.net)")
|
||||
elseif formname ~= "" then
|
||||
return false
|
||||
end
|
||||
|
@ -448,6 +439,12 @@ core.register_on_player_receive_fields(function(player, formname, fields)
|
|||
local data = i3.data[name]
|
||||
if not data then return end
|
||||
|
||||
local sb_inv = fields.scrbar_inv
|
||||
if sb_inv and sub(sb_inv, 1, 3) == "CHG" then
|
||||
data.scrbar_inv = tonumber(match(sb_inv, "%d+"))
|
||||
return
|
||||
end
|
||||
|
||||
for f in pairs(fields) do
|
||||
if sub(f, 1, 4) == "tab_" then
|
||||
local tabname = sub(f, 5)
|
||||
|
@ -464,12 +461,16 @@ core.register_on_player_receive_fields(function(player, formname, fields)
|
|||
rcp_fields(player, data, fields)
|
||||
|
||||
local tab = i3.tabs[data.tab]
|
||||
if tab then
|
||||
if tab.slots then
|
||||
inv_fields(player, data, fields)
|
||||
end
|
||||
|
||||
if tab and tab.fields then
|
||||
return true, tab.fields(player, data, fields)
|
||||
if tab.fields then
|
||||
local ret = tab.fields(player, data, fields)
|
||||
if ret == false then return end
|
||||
end
|
||||
end
|
||||
|
||||
return true, set_fs(player)
|
||||
end)
|
||||
|
||||
return inv_fields
|
||||
|
|
250
src/gui.lua
250
src/gui.lua
|
@ -11,11 +11,11 @@ IMPORT("vec", "vec_round")
|
|||
IMPORT("find", "match", "sub", "upper")
|
||||
IMPORT("clr", "ESC", "msg", "check_privs")
|
||||
IMPORT("min", "max", "floor", "ceil", "round")
|
||||
IMPORT("true_str", "is_fav", "is_num", "str_to_pos")
|
||||
IMPORT("reg_items", "reg_nodes", "reg_tools", "reg_entities")
|
||||
IMPORT("get_bag_description", "get_detached_inv", "get_recipes")
|
||||
IMPORT("compression_active", "compressible", "recipe_filter_set")
|
||||
IMPORT("S", "ES", "translate", "ItemStack", "toupper", "utf8_len")
|
||||
IMPORT("true_str", "true_table", "is_fav", "is_num", "str_to_pos")
|
||||
IMPORT("maxn", "sort", "concat", "copy", "insert", "remove", "unpack")
|
||||
IMPORT("extract_groups", "groups_to_items", "is_group", "item_has_groups", "get_group")
|
||||
|
||||
|
@ -124,33 +124,13 @@ local function get_stack_max(inv, data, is_recipe, rcp)
|
|||
end
|
||||
end
|
||||
|
||||
return max_stacks
|
||||
end
|
||||
local missing = {}
|
||||
|
||||
local function get_inv_slots(data, fs)
|
||||
local legacy_inventory = data.legacy_inventory
|
||||
local hotbar_len = data.hotbar_len
|
||||
local inv_x = legacy_inventory and 0.23 or 0.22
|
||||
local inv_y = legacy_inventory and 6.7 or 6.9
|
||||
local spacing = legacy_inventory and 0.25 or 0.1
|
||||
local size = 1
|
||||
|
||||
fs"style_type[box;colors=#77777710,#77777710,#777,#777]"
|
||||
|
||||
for i = 0, hotbar_len - 1 do
|
||||
box(i * size + inv_x + (i * spacing), inv_y, size, size, "")
|
||||
for item, count in pairs(counts_rcp) do
|
||||
missing[item] = max(0, count - (counts_inv[item] or 0))
|
||||
end
|
||||
|
||||
fs("style_type[list;size=%f;spacing=%f]", size, spacing)
|
||||
fs("list[current_player;main;%f,%f;%u,1;]", inv_x, inv_y, hotbar_len)
|
||||
|
||||
fs("style_type[list;size=%f;spacing=%f,%f]", size, spacing, legacy_inventory and 0.15 or spacing)
|
||||
|
||||
fs("list[current_player;main;%f,%f;%u,%u;%u]", inv_x, inv_y + (legacy_inventory and 1.25 or 1.15),
|
||||
hotbar_len, data.inv_size / hotbar_len, hotbar_len)
|
||||
|
||||
fs"style_type[list;size=1;spacing=0.15]"
|
||||
fs"listring[current_player;craft]listring[current_player;main]"
|
||||
return max_stacks, missing
|
||||
end
|
||||
|
||||
local function add_subtitle(fs, name, y, ctn_len, font_size, sep, label)
|
||||
|
@ -305,7 +285,7 @@ local function get_waypoint_fs(fs, data, player, yextra, ctn_len)
|
|||
label(0, yextra + 0.85, ES"New waypoint" .. ":")
|
||||
fs("field[0.1,%f;4.8,0.6;waypoint_name;;]", yextra + 1.1)
|
||||
image_button(5.1, yextra + 1.15, 0.5, 0.5, "", "waypoint_add", "")
|
||||
fs("tooltip[waypoint_add;%s]", ES"Add waypoint")
|
||||
fs("tooltip[waypoint_add;%s;#32333899;#fff]", ES"Add waypoint")
|
||||
|
||||
if #data.waypoints == 0 then return end
|
||||
fs"style_type[label;font=bold;font_size=17]"
|
||||
|
@ -332,7 +312,7 @@ local function get_waypoint_fs(fs, data, player, yextra, ctn_len)
|
|||
label(0.15, y + 0.33, clr(fmt("#%s", hex), waypoint_name))
|
||||
|
||||
local tooltip = fmt("Name: %s\nPosition:%s", clr("#dbeeff", v.name),
|
||||
v.pos:sub(2,-2):gsub("(%-*%d*%.?%d+)", clr("#dbeeff", " %1")))
|
||||
v.pos:sub(2,-2):gsub("(%-*%d*%.?%d+)", clr("#dbeeff", " %1")))
|
||||
|
||||
if teleport_priv then
|
||||
tooltip = fmt("%s\n%s", tooltip, clr("#ff0", ES"[Click to teleport]"))
|
||||
|
@ -343,23 +323,23 @@ local function get_waypoint_fs(fs, data, player, yextra, ctn_len)
|
|||
local del = fmt("waypoint_%u_delete", i)
|
||||
fs("style[%s;fgimg=%s;fgimg_hovered=%s;content_offset=0]", del, PNG.trash, PNG.trash_hover)
|
||||
image_button(ctn_len - 0.5, yi, icon_size, icon_size, "", del, "")
|
||||
fs("tooltip[%s;%s]", del, ES"Remove waypoint")
|
||||
fs("tooltip[%s;%s;#32333899;#fff]", del, ES"Remove waypoint")
|
||||
|
||||
local rfs = fmt("waypoint_%u_refresh", i)
|
||||
fs("style[%s;fgimg=%s;fgimg_hovered=%s;content_offset=0]", rfs, PNG.refresh, PNG.refresh_hover)
|
||||
image_button(ctn_len - 1, yi, icon_size, icon_size, "", rfs, "")
|
||||
fs("tooltip[%s;%s]", rfs, ES"Change color")
|
||||
fs("tooltip[%s;%s;#32333899;#fff]", rfs, ES"Change color")
|
||||
|
||||
local see = fmt("waypoint_%u_see", i)
|
||||
fs("style[%s;fgimg=%s;fgimg_hovered=%s;content_offset=0]",
|
||||
see, waypoint_preview and PNG.search_hover or PNG.search, PNG.search, PNG.search_hover)
|
||||
image_button(ctn_len - 1.5, yi, icon_size, icon_size, "", see, "")
|
||||
fs("tooltip[%s;%s]", see, ES"Preview the waypoint area")
|
||||
fs("tooltip[%s;%s;#32333899;#fff]", see, ES"Preview the waypoint area")
|
||||
|
||||
local vsb = fmt("waypoint_%u_hide", i)
|
||||
fs("style[%s;fgimg=%s;content_offset=0]", vsb, v.hide and PNG.nonvisible or PNG.visible)
|
||||
image_button(ctn_len - 2, yi, icon_size, icon_size, "", vsb, "")
|
||||
fs("tooltip[%s;%s]", vsb, v.hide and ES"Show waypoint" or ES"Hide waypoint")
|
||||
fs("tooltip[%s;%s;#32333899;#fff]", vsb, v.hide and ES"Show waypoint" or ES"Hide waypoint")
|
||||
|
||||
if teleport_priv then
|
||||
local tp = fmt("waypoint_%u_teleport", i)
|
||||
|
@ -399,7 +379,7 @@ local function get_bag_fs(fs, data, bag_size, yextra)
|
|||
hypertext(1.3, yextra + 0.8, 4.3, 0.6, "content",
|
||||
fmt("<global size=16><center><b>%s</b></center>", desc))
|
||||
image_button(5.22, yextra + 0.835, 0.25, 0.25, "", "bag_rename", "")
|
||||
fs("tooltip[bag_rename;%s]", ES"Rename the bag")
|
||||
fs("tooltip[bag_rename;%s;#32333899;#fff]", ES"Rename the bag")
|
||||
else
|
||||
box(1.7, yextra + 0.82, 2.6, 0.4, "#707070")
|
||||
fs("field[1.8,%f;2.5,0.4;bag_newname;;%s]", yextra + 0.82, desc)
|
||||
|
@ -462,7 +442,7 @@ local function get_container(fs, data, player, yoffset, ctn_len, award_list, awa
|
|||
data.subcat == i and PNG[fmt("%s_hover", title)] or PNG[title],
|
||||
PNG[fmt("%s_hover", title)])
|
||||
image_button(0.25 + ((i - 1) * 1.18), yextra - 0.2, 0.5, 0.5, "", btn_name, "")
|
||||
fs("tooltip[%s;%s]", btn_name, title:gsub("^%l", upper))
|
||||
fs("tooltip[%s;%s;#32333899;#fff]", btn_name, title:gsub("^%l", upper))
|
||||
end
|
||||
|
||||
box(0, yextra + 0.45, ctn_len, 0.045, "#bababa50")
|
||||
|
@ -560,7 +540,7 @@ local function get_container(fs, data, player, yoffset, ctn_len, award_list, awa
|
|||
Y += (Y * 2.45) + yextra - 2.75 + add_y
|
||||
|
||||
image_button(X, Y, 1.86, 3.4, "", btn_name, "")
|
||||
fs("tooltip[%s;%s]", btn_name, ESC(skin.name))
|
||||
fs("tooltip[%s;%s;#32333899;#fff]", btn_name, ESC(skin.name))
|
||||
end
|
||||
|
||||
elseif data.subcat == 4 then
|
||||
|
@ -625,7 +605,9 @@ local function show_settings(fs, data)
|
|||
end
|
||||
|
||||
hypertext(2.2, 9.9, 6, 0.6, "home_pos", fmt("<global size=16><center>%s</center>", str))
|
||||
image_button(4.3, 10.4, 1.8, 0.7, "", "set_home", "Set home")
|
||||
fs("style[set_home;padding=20,10,-210,-10;fgimg=%s;fgimg_hovered=%s]", PNG.home_px, PNG.home_px_hover)
|
||||
image_button(4.1, 10.4, 2.2, 0.7, "", "set_home", "")
|
||||
label(4.9, 10.75, "Set home")
|
||||
|
||||
elseif show_style then
|
||||
checkbox(2.6, 9.95, "cb_hide_tabs", "Hide tabs", tostring(data.hide_tabs))
|
||||
|
@ -639,17 +621,17 @@ local function show_settings(fs, data)
|
|||
local sign = (data.font_size > 0 and "+") or (data.font_size > 0 and "-") or ""
|
||||
label(5.3, 9.95, ES"Font size" .. fmt(": %s", sign .. data.font_size))
|
||||
|
||||
local range = 5
|
||||
local range = 8
|
||||
fs("scrollbaroptions[min=-%u;max=%u;smallstep=1;largestep=1;thumbsize=2]", range, range)
|
||||
fs("scrollbar[5.3,10.2;2.55,0.3;horizontal;sb_font_size;%d]", data.font_size)
|
||||
fs("scrollbar[5.3,10.2;2.55,0.3;horizontal;sb_font_size;%d+]", data.font_size)
|
||||
|
||||
fs("tooltip[cb_hide_tabs;%s;#707070;#fff]",
|
||||
fs("tooltip[cb_hide_tabs;%s;#32333899;#fff]",
|
||||
ES"Enable this option to change the style of the right panel")
|
||||
fs("tooltip[cb_legacy_inventory;%s;#707070;#fff]",
|
||||
fs("tooltip[cb_legacy_inventory;%s;#32333899;#fff]",
|
||||
ES"Enable this option to set the classic inventory size in Minetest")
|
||||
fs("tooltip[cb_wielditem_hud;%s;#707070;#fff]",
|
||||
fs("tooltip[cb_wielditem_hud;%s;#32333899;#fff]",
|
||||
ES"Enable this option to show the wielded item description in your HUD")
|
||||
fs("tooltip[cb_collapse;%s;#707070;#fff]",
|
||||
fs("tooltip[cb_collapse;%s;#32333899;#fff]",
|
||||
ES"Enable this option to collapse the inventory list by grouping some items")
|
||||
|
||||
elseif show_sorting then
|
||||
|
@ -666,21 +648,20 @@ local function show_settings(fs, data)
|
|||
end
|
||||
|
||||
label(5.3, 10.4, ES"Sorting method:")
|
||||
fs("dropdown[%f,%f;2.6,0.5;dd_sorting_method;%s;%u;true]",
|
||||
5.3, 10.6, concat(methods, ","), data.sort)
|
||||
fs("dropdown[%f,%f;2.6,0.5;dd_sorting_method;%s;%u;true]", 5.3, 10.6, concat(methods, ","), data.sort)
|
||||
|
||||
local desc = i3.sorting_methods[data.sort].description
|
||||
if desc then
|
||||
tooltip(5.3, 10.6, 2.4, 0.5, ESC(desc))
|
||||
end
|
||||
|
||||
fs("tooltip[cb_inv_compress;%s;#707070;#fff]",
|
||||
fs("tooltip[cb_inv_compress;%s;#32333899;#fff]",
|
||||
ES"Enable this option to compress your inventory")
|
||||
fs("tooltip[cb_reverse_sorting;%s;#707070;#fff]",
|
||||
fs("tooltip[cb_reverse_sorting;%s;#32333899;#fff]",
|
||||
ES"Enable this option to sort your inventory in reverse order")
|
||||
fs("tooltip[cb_ignore_hotbar;%s;#707070;#fff]",
|
||||
fs("tooltip[cb_ignore_hotbar;%s;#32333899;#fff]",
|
||||
ES"Enable this option to sort your inventory except the hotbar slots")
|
||||
fs("tooltip[cb_auto_sorting;%s;#707070;#fff]",
|
||||
fs("tooltip[cb_auto_sorting;%s;#32333899;#fff]",
|
||||
ES"Enable this option to sort your inventory automatically")
|
||||
end
|
||||
|
||||
|
@ -688,11 +669,53 @@ local function show_settings(fs, data)
|
|||
end
|
||||
end
|
||||
|
||||
local function get_footer(fs, data)
|
||||
local btn = {
|
||||
{"trash", ES"Clear inventory"},
|
||||
{"sort", ES"Sort inventory"},
|
||||
{"settings", ES"Settings"},
|
||||
{"home", ES"Go home"},
|
||||
}
|
||||
|
||||
for i, v in ipairs(btn) do
|
||||
local btn_name, tooltip = unpack(v)
|
||||
fs("style[%s;fgimg=%s;fgimg_hovered=%s;content_offset=0]",
|
||||
btn_name, PNG[btn_name], PNG[fmt("%s_hover", btn_name)])
|
||||
image_button(i + 3.43 - (i * 0.4), 11.43, 0.35, 0.35, "", btn_name, "")
|
||||
fs("tooltip[%s;%s;#32333899;#fff]", btn_name, tooltip)
|
||||
end
|
||||
|
||||
show_settings(fs, data)
|
||||
end
|
||||
|
||||
local function get_slots(fs, data)
|
||||
local legacy_inventory = data.legacy_inventory
|
||||
local hotbar_len = data.hotbar_len
|
||||
local inv_x = legacy_inventory and 0.23 or 0.22
|
||||
local inv_y = legacy_inventory and 6.7 or 6.9
|
||||
local spacing = legacy_inventory and 0.25 or 0.1
|
||||
local size = 1
|
||||
|
||||
fs"style_type[box;colors=#77777710,#77777710,#777,#777]"
|
||||
|
||||
for i = 0, hotbar_len - 1 do
|
||||
box(i * size + inv_x + (i * spacing), inv_y, size, size, "")
|
||||
end
|
||||
|
||||
fs("style_type[list;size=%f;spacing=%f]", size, spacing)
|
||||
fs("list[current_player;main;%f,%f;%u,1;]", inv_x, inv_y, hotbar_len)
|
||||
|
||||
fs("style_type[list;size=%f;spacing=%f,%f]", size, spacing, legacy_inventory and 0.15 or spacing)
|
||||
|
||||
fs("list[current_player;main;%f,%f;%u,%u;%u]", inv_x, inv_y + (legacy_inventory and 1.25 or 1.15),
|
||||
hotbar_len, data.inv_size / hotbar_len, hotbar_len)
|
||||
|
||||
fs"listring[current_player;craft]listring[current_player;main]"
|
||||
|
||||
get_footer(fs, data)
|
||||
end
|
||||
|
||||
local function get_inventory_fs(player, data, fs)
|
||||
fs"listcolors[#bababa50;#bababa99]"
|
||||
|
||||
get_inv_slots(data, fs)
|
||||
|
||||
local props = player:get_properties()
|
||||
local ctn_len = 5.7
|
||||
local ctn_hgt = data.legacy_inventory and 6.1 or 6.3
|
||||
|
@ -712,7 +735,7 @@ local function get_inventory_fs(player, data, fs)
|
|||
-- fs"style[player_model;bgcolor=black]"
|
||||
model(0.2, 0.2, armor_skin and 4 or 3.4, ctn_hgt,
|
||||
"player_model", props.mesh, textures, "0,-150", "false", "false",
|
||||
fmt("%u,%u;30", anim.x, anim.y))
|
||||
true_table(anim) and fmt("%u,%u;30", anim.x, anim.y) or "")
|
||||
else
|
||||
local size = 2.5
|
||||
image(0.7, 0.2, size, size * props.visual_size.y, props.textures[1])
|
||||
|
@ -747,7 +770,6 @@ local function get_inventory_fs(player, data, fs)
|
|||
|
||||
for i = 1, award_list_nb do
|
||||
local award = award_list[i]
|
||||
|
||||
if award.unlocked then
|
||||
awards_unlocked++
|
||||
end
|
||||
|
@ -757,7 +779,6 @@ local function get_inventory_fs(player, data, fs)
|
|||
|
||||
elseif data.subcat == 5 then
|
||||
local wp = #data.waypoints
|
||||
|
||||
if wp > 0 then
|
||||
local mul = (wp > 8 and 7) or (wp > 4 and 6) or 5
|
||||
max_val += 11 + (wp * mul)
|
||||
|
@ -772,23 +793,6 @@ local function get_inventory_fs(player, data, fs)
|
|||
fs("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, bag_size)
|
||||
fs"scroll_container_end[]"
|
||||
|
||||
local btn = {
|
||||
{"trash", ES"Clear inventory"},
|
||||
{"sort", ES"Sort inventory"},
|
||||
{"settings", ES"Settings"},
|
||||
{"home", ES"Go home"},
|
||||
}
|
||||
|
||||
for i, v in ipairs(btn) do
|
||||
local btn_name, tooltip = unpack(v)
|
||||
fs("style[%s;fgimg=%s;fgimg_hovered=%s;content_offset=0]",
|
||||
btn_name, PNG[btn_name], PNG[fmt("%s_hover", btn_name)])
|
||||
image_button(i + 3.43 - (i * 0.4), 11.43, 0.35, 0.35, "", btn_name, "")
|
||||
fs("tooltip[%s;%s]", btn_name, tooltip)
|
||||
end
|
||||
|
||||
show_settings(fs, data)
|
||||
end
|
||||
|
||||
local function get_tooltip(item, info, lang_code)
|
||||
|
@ -864,7 +868,7 @@ local function get_tooltip(item, info, lang_code)
|
|||
end
|
||||
end
|
||||
|
||||
return fmt("tooltip[%s;%s]", item, ESC(tooltip))
|
||||
return fmt("tooltip[%s;%s;#32333899;#fff]", item, ESC(tooltip))
|
||||
end
|
||||
|
||||
local function get_true_count(data, count, is_recipe, is_usage)
|
||||
|
@ -946,7 +950,9 @@ local function get_output_fs(fs, data, rcp, is_recipe, is_usage, shapeless, righ
|
|||
local itemstr = ESC(item:to_string())
|
||||
item_image_button(X + 0.11, Y, BTN_SIZE, BTN_SIZE, itemstr, _name, "")
|
||||
|
||||
if item:get_stack_max() < count then
|
||||
local stackmax = item:get_stack_max()
|
||||
|
||||
if stackmax == 1 and count > 1 then
|
||||
label(X + 1.05, Y + 1, count)
|
||||
end
|
||||
|
||||
|
@ -1097,7 +1103,8 @@ local function get_grid_fs(fs, data, rcp, is_recipe, is_usage)
|
|||
|
||||
item_image_button(X, Y, btn_size, btn_size, itemstr, btn_name, label)
|
||||
|
||||
if item:get_stack_max() < count then
|
||||
local stackmax = item:get_stack_max()
|
||||
if stackmax == 1 and count > 1 then
|
||||
label(X + 0.95, Y + 0.95, count)
|
||||
end
|
||||
end
|
||||
|
@ -1123,9 +1130,7 @@ local function get_grid_fs(fs, data, rcp, is_recipe, is_usage)
|
|||
meta_desc = meta_desc,
|
||||
}
|
||||
|
||||
if next(infos) then
|
||||
fs(get_tooltip(btn_name, infos, data.lang_code))
|
||||
end
|
||||
fs(get_tooltip(btn_name, infos, data.lang_code))
|
||||
end
|
||||
|
||||
if large_recipe then
|
||||
|
@ -1226,20 +1231,18 @@ local function get_header(fs, data)
|
|||
local star_x, star_y, size = data.inv_width + 0.3, data.yoffset + 0.2, 0.4
|
||||
|
||||
if nfavs < max_favs or (nfavs == max_favs and fav) then
|
||||
local fav_marked = fmt("i3_fav%s.png", fav and "_off" or "")
|
||||
fs("style[fav;fgimg=%s;fgimg_hovered=%s;fgimg_pressed=%s]",
|
||||
fmt("i3_fav%s.png", fav and "" or "_off"), fav_marked, fav_marked)
|
||||
fs("style[fav;fgimg=i3_fav%s.png;fgimg_hovered=i3_fav%s.png]", fav and "" or "_off", fav and "" or "_off")
|
||||
image_button(star_x, star_y, size, size, "", "fav", "")
|
||||
fs("tooltip[fav;%s]", fav and ES"Unmark this item" or ES"Mark this item")
|
||||
fs("tooltip[fav;%s;#32333899;#fff]", fav and ES"Unbookmark this item" or ES"Bookmark this item")
|
||||
else
|
||||
fs("style[nofav;fgimg=%s;fgimg_hovered=%s;fgimg_pressed=%s]",
|
||||
"i3_fav_off.png", PNG.cancel, PNG.cancel)
|
||||
image_button(star_x, star_y, size, size, "", "nofav", "")
|
||||
fs("tooltip[nofav;%s]", ES"Cannot mark this item. Bookmark limit reached.")
|
||||
fs("tooltip[nofav;%s;#32333899;#fff]", ES"Unable to bookmark this item, limit reached")
|
||||
end
|
||||
|
||||
image_button(star_x + 0.05, star_y + 0.6, size, size, "", "exit", "")
|
||||
fs("tooltip[exit;%s]", ES"Back to item list")
|
||||
fs("tooltip[exit;%s;#32333899;#fff]", ES"Back to item list")
|
||||
|
||||
local desc_lim, name_lim = 34, 35
|
||||
local desc = get_desc(data.query_item, data.lang_code)
|
||||
|
@ -1282,7 +1285,7 @@ local function get_crafting_fs(fs, data, is_recipe, is_usage, max_stacks_rcp, ma
|
|||
fs("style[crafting_%s;fgimg=%s;fgimg_hovered=%s;content_offset=0]",
|
||||
name, fmt("%s", show_crafting and PNG.crafting_hover or PNG.crafting), PNG.crafting_hover)
|
||||
image_button(data.inv_width + 7.35, data.yoffset + 0.2, 0.45, 0.45, "", fmt("crafting_%s", name), "")
|
||||
fs("tooltip[crafting_%s;%s]", name, ES"Quick crafting")
|
||||
fs("tooltip[crafting_%s;%s;#32333899;#fff]", name, ES"Quick crafting")
|
||||
|
||||
if not show_crafting then return end
|
||||
|
||||
|
@ -1310,9 +1313,10 @@ local function get_crafting_fs(fs, data, is_recipe, is_usage, max_stacks_rcp, ma
|
|||
fs("scrollbaroptions[min=1;max=%u;smallstep=1]", craft_max)
|
||||
|
||||
scrollbar(x + 0.2, data.yoffset + 1.45, 2.5, 0.35, "horizontal", fmt("scrbar_%s", name), stack_fs)
|
||||
button(x + 0.2, data.yoffset + 1.85, 2.5, 0.7, fmt("craft_%s", name), ES("Craft (×@1)", stack_fs))
|
||||
button(x + 0.2, data.yoffset + 1.9, 2.5, 0.7, fmt("craft_%s", name), ES("Craft (×@1)", stack_fs))
|
||||
|
||||
fs"style_type[label;font_size=16;textcolor=#fff]"
|
||||
fs"style_type[image,button,image_button;noclip=false]"
|
||||
end
|
||||
|
||||
local function get_rcp_extra(fs, data, player, panel, is_recipe, is_usage)
|
||||
|
@ -1322,15 +1326,15 @@ local function get_rcp_extra(fs, data, player, panel, is_recipe, is_usage)
|
|||
if rn then
|
||||
local rcp_ok = is_recipe and panel.rcp[data.rnum].type == "normal"
|
||||
local usg_ok = is_usage and panel.rcp[data.unum].type == "normal"
|
||||
local max_stacks_rcp, max_stacks_usg = 0, 0
|
||||
local max_stacks_rcp, max_stacks_usg, missing_rcp, missing_usg = 0, 0
|
||||
local inv = player:get_inventory()
|
||||
|
||||
if rcp_ok then
|
||||
max_stacks_rcp = get_stack_max(inv, data, is_recipe, panel.rcp[data.rnum])
|
||||
max_stacks_rcp, missing_rcp = get_stack_max(inv, data, is_recipe, panel.rcp[data.rnum])
|
||||
end
|
||||
|
||||
if usg_ok then
|
||||
max_stacks_usg = get_stack_max(inv, data, is_recipe, panel.rcp[data.unum])
|
||||
max_stacks_usg, missing_usg = get_stack_max(inv, data, is_recipe, panel.rcp[data.unum])
|
||||
end
|
||||
|
||||
if is_recipe and max_stacks_rcp == 0 then
|
||||
|
@ -1343,6 +1347,23 @@ local function get_rcp_extra(fs, data, player, panel, is_recipe, is_usage)
|
|||
|
||||
if max_stacks_rcp > 0 or max_stacks_usg > 0 then
|
||||
get_crafting_fs(fs, data, is_recipe, is_usage, max_stacks_rcp, max_stacks_usg)
|
||||
|
||||
elseif rcp_ok or usg_ok then
|
||||
local X = data.inv_width + 7.35
|
||||
local Y = data.yoffset + 0.2
|
||||
local missing = is_recipe and missing_rcp or missing_usg
|
||||
local str = ""
|
||||
|
||||
for item, count in pairs(missing) do
|
||||
if count > 0 then
|
||||
local name = is_group(item) and (i3.group_names[item:sub(7)] or item) or
|
||||
get_desc(item, data.lang_code)
|
||||
str = fmt("%s\n%s %s", str, clr("#ff0", count .. '×'), name)
|
||||
end
|
||||
end
|
||||
|
||||
image(X, Y, 0.45, 0.45, PNG.crafting .. "^\\[opacity:100")
|
||||
tooltip(X, Y, 0.45, 0.45, fmt("%s:%s", ES"Missing materials for crafting", str))
|
||||
end
|
||||
|
||||
get_rcp_lbl(fs, data, panel, rn, is_recipe, is_usage)
|
||||
|
@ -1392,7 +1413,7 @@ local function get_header_items_fs(fs, data)
|
|||
fs("style[enable_search;bgimg=%s;bgimg_hovered=%s;bgimg_pressed=%s]",
|
||||
data.enable_search and PNG.search_hover or PNG.search, PNG.search_hover, PNG.search_hover)
|
||||
image_button(X + 0.3, 0.2, 0.5, 0.5, "", "enable_search", "")
|
||||
fs("tooltip[enable_search;%s]", ES"Search")
|
||||
fs("tooltip[enable_search;%s;#32333899;#fff]", ES"Search")
|
||||
|
||||
if data.enable_search then
|
||||
image(X + 0.4, 0.75, 3.4, 0.8, PNG.bg_goto)
|
||||
|
@ -1408,11 +1429,11 @@ local function get_header_items_fs(fs, data)
|
|||
|
||||
if not recipe_filter_set() then
|
||||
for _, v in ipairs(i3.minitabs) do
|
||||
if v.name == "Nodes" then
|
||||
if v.name == "nodes" then
|
||||
insert(cat, {"node", "nodes only"})
|
||||
end
|
||||
|
||||
if v.name == "Items" then
|
||||
if v.name == "items" then
|
||||
insert(cat, {"item", "items only"})
|
||||
end
|
||||
end
|
||||
|
@ -1425,12 +1446,12 @@ local function get_header_items_fs(fs, data)
|
|||
fs("style[itab_%u;bgimg=%s;bgimg_hovered=%s;bgimg_pressed=%s;sound=i3_tab]",
|
||||
i, data.itab == i and active or PNG[name], active, active)
|
||||
image_button(X + 1.25 + ((i - 1) * 0.7), 0.2, 0.5, 0.5, "", fmt("itab_%s", i), "")
|
||||
fs("tooltip[itab_%u;Show %s]", i, desc)
|
||||
fs("tooltip[itab_%u;Show %s;#32333899;#fff]", i, desc)
|
||||
end
|
||||
else
|
||||
fs("style[search;bgimg=%s]", PNG.search_hover)
|
||||
image_button(X + 0.35, 0.32, 0.35, 0.35, "", "search", "")
|
||||
fs("tooltip[search;%s]", ES"Search")
|
||||
fs("tooltip[search;%s;#32333899;#fff]", ES"Search")
|
||||
|
||||
if data.enable_search then
|
||||
fs"style[filter;font_size=18]"
|
||||
|
@ -1449,7 +1470,7 @@ local function get_header_items_fs(fs, data)
|
|||
|
||||
if true_str(data.filter) then
|
||||
image_button(X + 4.3, 0.4, 0.2, 0.2, "", "cancel", "")
|
||||
fs("tooltip[cancel;%s]", ES"Clear")
|
||||
fs("tooltip[cancel;%s;#32333899;#fff]", ES"Clear")
|
||||
box(X + 0.85, 0.75, 3.74, 0.01, "#f9826c")
|
||||
end
|
||||
end
|
||||
|
@ -1482,7 +1503,6 @@ local function get_minitabs(fs, data, player, full_height)
|
|||
|
||||
for i, v in ipairs(i3.minitabs) do
|
||||
local access = v.access
|
||||
|
||||
if access == nil or access(player, data) then
|
||||
minitabs[i] = v.description
|
||||
end
|
||||
|
@ -1497,17 +1517,16 @@ local function get_minitabs(fs, data, player, full_height)
|
|||
local selected = id == data.itab
|
||||
local hover_texture = selected and PNG.tab_small_hover or PNG.tab_small
|
||||
local flip = top and "^[transformFY" or ""
|
||||
local tabname = fmt("itab_%u", id)
|
||||
|
||||
fs([[ style_type[image_button;bgimg=%s%s;bgimg_hovered=%s%s;
|
||||
bgimg_middle=14,0,-14,-14;padding=-14,0,14,14] ]],
|
||||
hover_texture, flip, PNG.tab_small_hover, flip)
|
||||
fs([[ style[%s;bgimg=%s%s;bgimg_hovered=%s%s;noclip=true;font=bold;font_size=16;
|
||||
textcolor=%s;content_offset=0;sound=i3_tab;bgimg_middle=14,0,-14,-14;padding=-14,0,14,14] ]],
|
||||
tabname, hover_texture, flip, PNG.tab_small_hover, flip, selected and "#fff" or "#bbb")
|
||||
|
||||
fs([[ style_type[image_button;noclip=true;font=bold;font_size=16;
|
||||
textcolor=%s;content_offset=0;sound=i3_tab] ]], selected and "#fff" or "#bbb")
|
||||
fs"style_type[image_button:hovered;textcolor=#fff]"
|
||||
fs("style[%s:hovered;textcolor=#fff]", tabname)
|
||||
|
||||
image_button((data.inv_width - 0.65) + (X * (tab_len + 0.1)),
|
||||
top and -tab_hgh or full_height, tab_len, tab_hgh, "", fmt("itab_%u", id), title)
|
||||
top and -tab_hgh or full_height, tab_len, tab_hgh, "", tabname, title)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -1576,10 +1595,12 @@ local function get_items_fs(fs, data, player, full_height)
|
|||
if compressible(item, data) then
|
||||
local expand = data.expand == name
|
||||
|
||||
fs("tooltip[%s;%s]", item, expand and ES"Click to hide" or ES"Click to expand")
|
||||
fs("tooltip[%s;%s;#32333899;#fff]", item, expand and ES"Click to hide" or ES"Click to expand")
|
||||
fs"style_type[label;font=bold;font_size=20]"
|
||||
label(X + 0.65, Y + 0.7, expand and "-" or "+")
|
||||
fs"style_type[label;font=normal;font_size=16]"
|
||||
elseif true_str(name) then
|
||||
fs(get_tooltip(name, {}, data.lang_code))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -1656,17 +1677,17 @@ local function get_tabs_fs(fs, player, data, full_height)
|
|||
local middle = btm and "16,0,-16,-16" or "16,16,-16,-16"
|
||||
local padding = btm and "-16,0,16,16" or "-16,-16,16,16"
|
||||
|
||||
fs([[ style_type[image_button;bgimg=%s;bgimg_hovered=%s;bgimg_middle=%s;padding=%s] ]],
|
||||
bgimg, bgimg_hover, middle, padding)
|
||||
local tabname = fmt("tab_%s", def.name)
|
||||
|
||||
fs("style_type[image_button;noclip=true;font_size=16;textcolor=%s;content_offset=0;sound=i3_tab]",
|
||||
selected and "#fff" or "#ddd")
|
||||
fs([[ style[%s;bgimg=%s;bgimg_hovered=%s;bgimg_middle=%s;padding=%s;noclip=true;
|
||||
font=bold;font_size=16;textcolor=%s;content_offset=0;sound=i3_tab] ]],
|
||||
tabname, bgimg, bgimg_hover, middle, padding, selected and "#fff" or "#bbb")
|
||||
|
||||
local X = (data.inv_width / 2) + (c * (tab_len + 0.1)) - ((tab_len + 0.05) * (shift / 2))
|
||||
local Y = btm and full_height or -tab_hgh
|
||||
|
||||
fs"style_type[image_button:hovered;textcolor=#fff]"
|
||||
image_button(X, Y, tab_len, tab_hgh, "", fmt("tab_%s", def.name), ESC(def.description))
|
||||
fs("style[%s:hovered;textcolor=#fff]", tabname)
|
||||
image_button(X, Y, tab_len, tab_hgh, "", tabname, ESC(def.description))
|
||||
|
||||
if true_str(def.image) then
|
||||
local desc = translate(data.lang_code, def.description)
|
||||
|
@ -1674,6 +1695,7 @@ local function get_tabs_fs(fs, player, data, full_height)
|
|||
|
||||
fs"style_type[image;noclip=true]"
|
||||
image(X + (tab_len / 2) - ((desc_len * 0.1) / 2) - 0.55, Y + 0.05, 0.35, 0.35, def.image)
|
||||
fs"style_type[image;noclip=false]"
|
||||
end
|
||||
|
||||
c++
|
||||
|
@ -1736,8 +1758,14 @@ local function make_fs(player, data)
|
|||
|
||||
local tab = i3.tabs[data.tab]
|
||||
|
||||
if tab and tab.formspec then
|
||||
tab.formspec(player, data, fs)
|
||||
if tab then
|
||||
if tab.formspec then
|
||||
tab.formspec(player, data, fs)
|
||||
end
|
||||
|
||||
if tab.slots then
|
||||
get_slots(fs, data)
|
||||
end
|
||||
end
|
||||
|
||||
if data.query_item then
|
||||
|
|
137
src/hud.lua
137
src/hud.lua
|
@ -1,9 +1,9 @@
|
|||
IMPORT("ceil", "get_connected_players", "str_to_pos", "add_hud_waypoint")
|
||||
IMPORT("max", "ceil", "remove", "str_to_pos")
|
||||
IMPORT("get_connected_players", "add_hud_waypoint")
|
||||
|
||||
local function init_hud(player)
|
||||
local name = player:get_player_name()
|
||||
local data = i3.data[name]
|
||||
|
||||
local wdesc_y = -90
|
||||
|
||||
if core.global_exists"hb" then
|
||||
|
@ -13,36 +13,7 @@ local function init_hud(player)
|
|||
end
|
||||
|
||||
data.hud = {
|
||||
bg = player:hud_add {
|
||||
hud_elem_type = "image",
|
||||
position = {x = 1, y = 1},
|
||||
offset = {x = -320, y = 0},
|
||||
alignment = {x = 1, y = 1},
|
||||
scale = {x = 300, y = 105},
|
||||
text = "i3_bg.png",
|
||||
z_index = 0xDEAD,
|
||||
},
|
||||
|
||||
img = player:hud_add {
|
||||
hud_elem_type = "image",
|
||||
position = {x = 1, y = 1},
|
||||
offset = {x = -310, y = 20},
|
||||
alignment = {x = 1, y = 1},
|
||||
scale = {x = 1, y = 1},
|
||||
text = "",
|
||||
z_index = 0xDEAD,
|
||||
},
|
||||
|
||||
text = player:hud_add {
|
||||
hud_elem_type = "text",
|
||||
position = {x = 1, y = 1},
|
||||
offset = {x = -235, y = 40},
|
||||
alignment = {x = 1, y = 1},
|
||||
number = 0xffffff,
|
||||
text = "",
|
||||
z_index = 0xDEAD,
|
||||
style = 1,
|
||||
},
|
||||
notifs = {},
|
||||
|
||||
wielditem = player:hud_add {
|
||||
hud_elem_type = "text",
|
||||
|
@ -53,56 +24,55 @@ local function init_hud(player)
|
|||
text = "",
|
||||
z_index = 0xDEAD,
|
||||
style = 1,
|
||||
},
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
local function show_hud(player, data)
|
||||
local hud_info_bg = player:hud_get(data.hud.bg)
|
||||
local dt = 0.016
|
||||
local offset_y = hud_info_bg.offset.y
|
||||
local speed = 5 * i3.settings.hud_speed
|
||||
local function get_progress(offset, max_val)
|
||||
local progress = offset * (1 / (max_val - 5))
|
||||
return 1 - (progress ^ 4)
|
||||
end
|
||||
|
||||
if offset_y < -100 then
|
||||
data.show_hud = false
|
||||
data.hud_timer = (data.hud_timer or 0) + dt
|
||||
local function show_hud(player, data, notif, idx, dt)
|
||||
local hud_info_bg = player:hud_get(notif.elems.bg)
|
||||
local offset = hud_info_bg.offset
|
||||
|
||||
if offset.y < notif.max.y then
|
||||
notif.show = false
|
||||
notif.hud_timer += dt
|
||||
end
|
||||
|
||||
player:hud_change(data.hud.text, "text", data.hud_msg)
|
||||
player:hud_change(notif.elems.text, "text", notif.hud_msg)
|
||||
|
||||
if data.hud_img then
|
||||
player:hud_change(data.hud.img, "text", data.hud_img)
|
||||
if notif.hud_img then
|
||||
player:hud_change(notif.elems.img, "text", notif.hud_img)
|
||||
end
|
||||
|
||||
if data.show_hud then
|
||||
for name, def in pairs(data.hud) do
|
||||
if name ~= "wielditem" then
|
||||
local hud_info = player:hud_get(def)
|
||||
if notif.show then
|
||||
local speed = i3.settings.hud_speed * (100 * get_progress(offset.y, notif.max.y)) * dt
|
||||
|
||||
player:hud_change(def, "offset", {
|
||||
x = hud_info.offset.x,
|
||||
y = hud_info.offset.y - speed
|
||||
})
|
||||
end
|
||||
for _, def in pairs(notif.elems) do
|
||||
local hud_info = player:hud_get(def)
|
||||
|
||||
player:hud_change(def, "offset", {
|
||||
x = hud_info.offset.x,
|
||||
y = hud_info.offset.y - (speed * max(1, (#data.hud.notifs - idx + 1) / 1.45))
|
||||
})
|
||||
end
|
||||
elseif data.show_hud == false then
|
||||
if data.hud_timer >= i3.settings.hud_timer_max then
|
||||
for name, def in pairs(data.hud) do
|
||||
if name ~= "wielditem" then
|
||||
local hud_info = player:hud_get(def)
|
||||
elseif notif.show == false and notif.hud_timer >= i3.settings.hud_timer_max then
|
||||
local speed = (i3.settings.hud_speed * 2.6) * (100 * get_progress(offset.x, notif.max.x)) * dt
|
||||
|
||||
player:hud_change(def, "offset", {
|
||||
x = hud_info.offset.x,
|
||||
y = hud_info.offset.y + speed
|
||||
})
|
||||
end
|
||||
end
|
||||
for _, def in pairs(notif.elems) do
|
||||
local hud_info = player:hud_get(def)
|
||||
|
||||
if offset_y > 0 then
|
||||
data.show_hud = nil
|
||||
data.hud_timer = nil
|
||||
data.hud_msg = nil
|
||||
data.hud_img = nil
|
||||
player:hud_change(def, "offset", {
|
||||
x = hud_info.offset.x - speed,
|
||||
y = hud_info.offset.y
|
||||
})
|
||||
|
||||
if hud_info.offset.x < notif.max.x then
|
||||
player:hud_remove(def)
|
||||
remove(data.hud.notifs, idx)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -118,8 +88,18 @@ core.register_globalstep(function(dt)
|
|||
local data = i3.data[name]
|
||||
if not data then return end
|
||||
|
||||
for idx, notif in ipairs(data.hud.notifs) do
|
||||
if notif.show ~= nil then
|
||||
show_hud(player, data, notif, idx, dt)
|
||||
end
|
||||
end
|
||||
|
||||
local has_text = player:hud_get(data.hud.wielditem).text ~= ""
|
||||
|
||||
if not data.wielditem_hud then
|
||||
player:hud_change(data.hud.wielditem, "text", "")
|
||||
if has_text then
|
||||
player:hud_change(data.hud.wielditem, "text", "")
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
|
@ -127,7 +107,7 @@ core.register_globalstep(function(dt)
|
|||
local wieldidx = player:get_wield_index()
|
||||
|
||||
if wieldidx == data.old_wieldidx then
|
||||
if data.timer >= i3.settings.wielditem_fade_after then
|
||||
if data.timer >= i3.settings.wielditem_fade_after and has_text then
|
||||
player:hud_change(data.hud.wielditem, "text", "")
|
||||
end
|
||||
return
|
||||
|
@ -148,21 +128,6 @@ core.register_globalstep(function(dt)
|
|||
end
|
||||
end)
|
||||
|
||||
core.register_globalstep(function()
|
||||
local players = get_connected_players()
|
||||
players[0] = #players
|
||||
|
||||
for i = 1, players[0] do
|
||||
local player = players[i]
|
||||
local name = player:get_player_name()
|
||||
local data = i3.data[name]
|
||||
|
||||
if data and data.show_hud ~= nil then
|
||||
show_hud(player, data)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
local function init_waypoints(player)
|
||||
local name = player:get_player_name()
|
||||
local data = i3.data[name]
|
||||
|
|
|
@ -54,6 +54,8 @@ local PNG = {
|
|||
node = "i3_node.png",
|
||||
item = "i3_item.png",
|
||||
cube = "i3_cube.png",
|
||||
home_px = "i3_home_px.png",
|
||||
home_px_hover = "i3_home_px_hover.png",
|
||||
|
||||
cancel_hover = "i3_cancel.png^\\[brighten",
|
||||
search_hover = "i3_search.png^\\[brighten",
|
||||
|
@ -83,6 +85,9 @@ local PNG = {
|
|||
}
|
||||
|
||||
local styles = string.format([[
|
||||
listcolors[#bababa50;#bababa99]
|
||||
|
||||
style_type[list;size=1;spacing=0.15]
|
||||
style_type[field;border=false;bgcolor=transparent]
|
||||
style_type[label,field;font_size=16]
|
||||
style_type[button;border=false;content_offset=0]
|
||||
|
@ -123,7 +128,7 @@ local fs_elements = {
|
|||
label = "label[%f,%f;%s]",
|
||||
box = "box[%f,%f;%f,%f;%s]",
|
||||
image = "image[%f,%f;%f,%f;%s]",
|
||||
tooltip = "tooltip[%f,%f;%f,%f;%s]",
|
||||
tooltip = "tooltip[%f,%f;%f,%f;%s;#32333899;#fff]",
|
||||
button = "button[%f,%f;%f,%f;%s;%s]",
|
||||
checkbox = "checkbox[%f,%f;%s;%s;%s]",
|
||||
slot = "image[%f,%f;%f,%f;" .. fmt("%s;9]", PNG.slot),
|
||||
|
|
|
@ -1,16 +1,32 @@
|
|||
local SWITCH
|
||||
|
||||
i3.new_tab("test1", {
|
||||
description = "Test 1 Test 1",
|
||||
image = "i3_heart.png",
|
||||
|
||||
formspec = function(player, data, fs)
|
||||
fs("button", 3, 4, 3, 0.8, "test", "Click here")
|
||||
fs("label", 3, 1, "Just a test")
|
||||
fs"label[3,2;Lorem Ipsum]"
|
||||
|
||||
|
||||
if SWITCH then
|
||||
fs"label[3,2;Button clicked]"
|
||||
else
|
||||
fs"label[3,2;Lorem Ipsum]"
|
||||
end
|
||||
end,
|
||||
|
||||
fields = function(player, data, fields)
|
||||
if fields.test then
|
||||
SWITCH = true
|
||||
end
|
||||
end
|
||||
})
|
||||
|
||||
i3.new_tab("test2", {
|
||||
description = "Test 2",
|
||||
image = "i3_mesepick.png",
|
||||
slots = true,
|
||||
|
||||
formspec = function(player, data, fs)
|
||||
fs("label[3,1;Test 2]")
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 1.4 KiB |
Binary file not shown.
After Width: | Height: | Size: 171 B |
Binary file not shown.
After Width: | Height: | Size: 171 B |
Loading…
Reference in New Issue