Compare commits

...

17 Commits
1.15.2 ... main

Author SHA1 Message Date
Jean-Patrick Guerrero 9437545ddb Bump version 2023-04-02 16:56:20 +02:00
Jean-Patrick Guerrero ff7353392f Fix tooltips 2023-04-02 16:56:18 +02:00
Jean-Patrick Guerrero 45fc03cc26 Bump version 2023-04-02 14:56:14 +02:00
Jean-Patrick Guerrero f26a1c288d New tooltip color + cleaning 2023-04-02 14:49:13 +02:00
Jean-Patrick Guerrero 85fc8219c1 Move notifs to the left 2023-04-02 01:23:11 +02:00
Jean-Patrick Guerrero 83623effbf More HUD improvements 2023-04-02 00:45:39 +02:00
Jean-Patrick Guerrero c64f28a90b Prevent potential crash 2023-04-01 22:51:21 +02:00
Jean-Patrick Guerrero ad08ca56b8 More improvements to notification look 2023-04-01 22:45:18 +02:00
Jean-Patrick Guerrero 1684388851 Ability to stack notifications on top of each other 2023-04-01 22:17:41 +02:00
Jean-Patrick Guerrero 1f43c8fac2 Optimize textures 2023-04-01 18:53:12 +02:00
Jean-Patrick Guerrero 6953a11279 Improve notification look 2023-04-01 18:35:29 +02:00
Jean-Patrick Guerrero 21affdeeba Eventually remove window info 2023-04-01 14:43:02 +02:00
Jean-Patrick Guerrero 7130ea565d Doc 2023-03-08 16:43:35 +01:00
Jean-Patrick Guerrero b7308b4739 Get window info once per second 2023-03-08 16:42:15 +01:00
Jean-Patrick Guerrero d5df9f6f0f Store window info for future work 2023-03-07 14:07:52 +01:00
Jean-Patrick Guerrero 7246249c52 Bump version 2023-03-07 01:24:44 +01:00
Jean-Patrick Guerrero d36d6e67e7 Fix regression 2023-03-07 01:24:27 +01:00
11 changed files with 158 additions and 146 deletions

14
API.md
View File

@ -38,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]"
@ -50,7 +51,8 @@ i3.new_tab("stuff", {
-- Do things
end
-- No need to update the formspec, it's automatic
-- To prevent a formspec update, return false.
-- Otherwise: no need to return anything, it's automatic.
end,
})
```
@ -73,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)`
@ -144,7 +146,7 @@ i3.register_craft {
}
```
Multiples recipes can also be registered:
Multiple recipes can also be registered at once:
```Lua
i3.register_craft {
@ -219,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.
@ -417,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.
@ -439,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`.

View File

@ -20,7 +20,7 @@ local function lf(path)
end
i3 = {
version = 1152,
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",

View File

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

View File

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

View File

@ -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)
@ -429,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
@ -446,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)
@ -462,14 +461,14 @@ 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.fields then
tab.fields(player, data, fields)
local ret = tab.fields(player, data, fields)
if ret == false then return end
end
end

View File

@ -285,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]"
@ -323,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)
@ -379,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)
@ -442,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")
@ -540,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
@ -621,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
@ -648,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
@ -683,7 +682,7 @@ local function get_footer(fs, data)
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)
fs("tooltip[%s;%s;#32333899;#fff]", btn_name, tooltip)
end
show_settings(fs, data)
@ -771,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
@ -781,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)
@ -871,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)
@ -1107,7 +1104,6 @@ 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)
local stackmax = item:get_stack_max()
if stackmax == 1 and count > 1 then
label(X + 0.95, Y + 0.95, count)
end
@ -1134,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
@ -1237,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)
@ -1293,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
@ -1421,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)
@ -1454,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]"
@ -1478,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
@ -1511,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
@ -1604,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

View File

@ -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,10 @@ core.register_globalstep(function(dt)
local data = i3.data[name]
if not data then return end
if data.show_hud ~= nil then
show_hud(player, data)
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 ~= ""

View File

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

BIN
textures/i3_bg_notif.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 171 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 171 B