From 5110e910ffdc27f5f54d94b03fdbd6dbb153332f Mon Sep 17 00:00:00 2001 From: Jean-Patrick Guerrero Date: Sun, 11 Apr 2021 23:23:03 +0200 Subject: [PATCH] Waypoints UI overhaul --- init.lua | 188 ++++++++++++++++++++++++------------ textures/i3_non_visible.png | Bin 0 -> 3086 bytes textures/i3_refresh.png | Bin 0 -> 6621 bytes textures/i3_visible.png | Bin 0 -> 2858 bytes 4 files changed, 125 insertions(+), 63 deletions(-) create mode 100644 textures/i3_non_visible.png create mode 100644 textures/i3_refresh.png create mode 100644 textures/i3_visible.png diff --git a/init.lua b/init.lua index 198dbc3..7a3da1a 100644 --- a/init.lua +++ b/init.lua @@ -139,6 +139,9 @@ local PNG = { waypoints = "i3_waypoint.png", teleport = "i3_teleport.png", add = "i3_add.png", + refresh = "i3_refresh.png", + visible = "i3_visible.png^\\[brighten", + nonvisible = "i3_non_visible.png", cancel_hover = "i3_cancel.png^\\[brighten", search_hover = "i3_search.png^\\[brighten", @@ -158,6 +161,7 @@ local PNG = { waypoints_hover = "i3_waypoint_hover.png", teleport_hover = "i3_teleport.png^\\[brighten", add_hover = "i3_add.png^\\[brighten", + refresh_hover = "i3_refresh.png^\\[brighten", } local fs_elements = { @@ -193,8 +197,6 @@ local styles = sprintf([[ style[prev_usage;fgimg=%s;fgimg_hovered=%s] style[next_usage;fgimg=%s;fgimg_hovered=%s] style[waypoint_add;fgimg=%s;fgimg_hovered=%s;content_offset=0] - style[waypoint_delete;fgimg=%s;fgimg_hovered=%s;content_offset=0] - style[waypoint_teleport;fgimg=%s;fgimg_hovered=%s;content_offset=0] style[btn_bag,btn_armor,btn_skins;font=bold;font_size=18;content_offset=0;sound=i3_click] style[craft_rcp,craft_usg;noclip=true;font_size=16;sound=i3_craft; bgimg=i3_btn9.png;bgimg_hovered=i3_btn9_hovered.png; @@ -209,9 +211,7 @@ PNG.prev, PNG.prev_hover, PNG.next, PNG.next_hover, PNG.prev, PNG.prev_hover, PNG.next, PNG.next_hover, -PNG.add, PNG.add_hover, -PNG.trash, PNG.trash_hover, -PNG.teleport, PNG.teleport_hover) +PNG.add, PNG.add_hover) local function get_lang_code(info) return info and info.lang_code @@ -1279,6 +1279,14 @@ local function repairable(tool) return toolrepair and def and def.groups and def.groups.disable_repair ~= 1 end +local function get_waypoint(data, id) + for i, v in ipairs(data.waypoints) do + if id == v.id then + return v, i + end + end +end + local function is_fav(favs, query_item) local fav, i for j = 1, #favs do @@ -1638,11 +1646,10 @@ local function get_model_fs(fs, data, def, model_alias) local hex = fmt("%02x", v.color) while #hex < 8 do - hex = "0" .. hex + hex = hex .. "0" end - _name = fmt("%s^[multiply:%s", v.name, - fmt("#%s%s", sub(hex, 3), sub(hex, 1, 2))) + _name = fmt("%s^[multiply:%s", v.name, fmt("#%s", hex)) else _name = fmt("%s^[multiply:%s", v.name, v.color) end @@ -1904,6 +1911,58 @@ local function get_award_list(data, fs, ctn_len, yextra, award_list, awards_unlo end end +local function get_waypoint_fs(fs, data, name, yextra, ctn_len) + fs(fmt("box[0,%f;4.9,0.6;#bababa25]", yextra + 0.7)) + fs(fmt("field[0.1,%f;4.8,0.6;waypoint_name;;]", yextra + 0.7)) + fs("image_button", 5.1, yextra + 0.75, 0.5, 0.5, "", "waypoint_add", "") + fs(fmt("tooltip[waypoint_add;%s]", ES"Add waypoint")) + + if #data.waypoints == 0 then return end + add_subtitle(fs, name, yextra + 1.5, ctn_len, 18, ES"Waypoints") + + for i, v in ipairs(data.waypoints) do + local y = yextra + 1.7 + (i * 0.6) + + fs(fmt("box[0,%f;%f,0.6;#bababa%u]", y, ctn_len, i % 2 == 0 and 15 or 25)) + + local waypoint_name, lim = v.name, 18 + + if #v.name > lim then + waypoint_name = snip(waypoint_name, lim) + end + + fs("style_type[label;font_size=17]") + fs("label", 0.15, y + 0.35, clr(fmt("#%02x", v.color), waypoint_name)) + + local del = fmt("waypoint_%u_delete", v.id) + fs(fmt("style[%s;fgimg=%s;fgimg_hovered=%s;content_offset=0]", del, PNG.trash, PNG.trash_hover)) + fs("image_button", 5.2, y + 0.12, 0.35, 0.35, "", del, "") + fs(fmt("tooltip[%s;%s]", del, ES"Delete waypoint")) + + local rfs = fmt("waypoint_%u_refresh", v.id) + fs(fmt("style[%s;fgimg=%s;fgimg_hovered=%s;content_offset=0]", rfs, PNG.refresh, PNG.refresh_hover)) + fs("image_button", 4.7, y + 0.12, 0.35, 0.35, "", rfs, "") + fs(fmt("tooltip[%s;%s]", rfs, ES"Change color")) + + local vsb = fmt("waypoint_%u_hide", v.id) + fs(fmt("style[%s;fgimg=%s;content_offset=0]", vsb, v.hide and PNG.nonvisible or PNG.visible)) + fs("image_button", 4.2, y + 0.12, 0.35, 0.35, "", vsb, "") + fs(fmt("tooltip[%s;%s]", vsb, v.hide and ES"Show waypoint" or ES"Hide waypoint")) + + if core.is_creative_enabled(name) then + local tp = fmt("waypoint_%u_teleport", v.id) + + fs(fmt("style[%s;fgimg=%s;fgimg_hovered=%s;content_offset=0]", + tp, PNG.teleport, PNG.teleport_hover)) + + fs("image_button", 3.7, y + 0.12, 0.35, 0.35, "", tp, "") + fs(fmt("tooltip[%s;%s]", tp, ES"Teleport to waypoint")) + end + end + + fs("style_type[label;font_size=16]") +end + local function get_ctn_content(fs, data, player, yoffset, ctn_len, award_list, awards_unlocked, award_list_nb) local name = player:get_player_name() add_subtitle(fs, "player_name", 0, ctn_len, 22, ESC(name)) @@ -1999,34 +2058,7 @@ local function get_ctn_content(fs, data, player, yoffset, ctn_len, award_list, a end elseif data.subcat == 5 then - local waypoints = {} - - for _, v in ipairs(data.waypoints or {}) do - insert(waypoints, v.name) - end - - fs(fmt("dropdown[0,%f;4.2,0.6;waypoints;%s;%u;true]", - yextra + 0.7, concat(waypoints, ","), data.waypoint_id)) - - local no_waypoint = not data.waypoints or #data.waypoints == 0 - - if not no_waypoint then - fs("image_button", 4.4, yextra + 0.75, 0.5, 0.5, "", "waypoint_delete", "") - fs(fmt("tooltip[waypoint_delete;%s]", ES"Delete waypoint")) - - if core.is_creative_enabled(name) then - fs("image_button", - no_waypoint and 4.4 or 5.1, yextra + 0.77, 0.5, 0.5, - "", "waypoint_teleport", "") - - fs(fmt("tooltip[waypoint_teleport;%s]", ES"Teleport to waypoint")) - end - end - - fs(fmt("box[0,%f;4.2,0.6;#bababa25]", yextra + 1.5)) - fs(fmt("field[0.1,%f;4.1,0.6;waypoint_name;;]", yextra + 1.5)) - fs("image_button", 4.4, yextra + 1.55, 0.5, 0.5, "", "waypoint_add", "") - fs(fmt("tooltip[waypoint_add;%s]", ES"Add waypoint")) + get_waypoint_fs(fs, data, name, yextra, ctn_len) end end @@ -2242,7 +2274,7 @@ local function init_data(player, info) export_counts = {}, current_tab = 1, subcat = 1, - waypoint_id = 1, + scrbar_inv = 0, lang_code = get_lang_code(info), } @@ -2386,7 +2418,7 @@ local function get_inventory_fs(player, data, fs) local max_val = 15 if __3darmor and data.subcat == 2 then - if (data.scrbar_inv or 0) >= max_val then + if data.scrbar_inv >= max_val then data.scrbar_inv = data.scrbar_inv + 10 end @@ -2407,7 +2439,11 @@ local function get_inventory_fs(player, data, fs) max_val = max_val + (award_list_nb * 13) elseif data.subcat == 5 then - max_val = max_val + 3 + local waypoints_nb = #data.waypoints + + if waypoints_nb > 0 then + max_val = max_val + 11 + (waypoints_nb * 6) + end end fs(fmt([[ @@ -2415,7 +2451,7 @@ local function get_inventory_fs(player, data, fs) scrollbar[%f,0.2;0.2,%f;vertical;scrbar_inv;%u] scrollbaroptions[arrows=default;thumbsize=0;max=1000] ]], - (max_val * 4) / 15, max_val, 9.8, ctn_hgt, data.scrbar_inv or 0)) + (max_val * 4) / 15, 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)) @@ -2505,14 +2541,51 @@ i3.new_tab { skins.set_player_skin(player, _skins[data.skin_id]) end - if fields.waypoints then - data.waypoint_id = tonumber(fields.waypoints) - end - for field in pairs(fields) do if sub(field, 1, 4) == "btn_" then data.subcat = indexof(SUBCAT, sub(field, 5)) break + + elseif find(field, "waypoint_%d+") then + local id, action = match(field, "_(%d+)_(%w+)$") + id = tonum(id) + local waypoint, _id = get_waypoint(data, id) + + if action == "delete" then + player:hud_remove(waypoint.id) + remove(data.waypoints, _id) + + elseif action == "teleport" then + local pos = waypoint.pos + pos.y = pos.y + 0.5 + + player:set_pos(pos) + msg(name, fmt("Teleported to %s", clr("#ff0", waypoint.name))) + + elseif action == "refresh" then + local color = random(0xffffff) + waypoint.color = color + player:hud_change(id, "number", color) + + elseif action == "hide" then + if waypoint.hide then + waypoint.hide = nil + + local new_id = player:hud_add { + hud_elem_type = "waypoint", + name = waypoint.name, + text = " m", + world_pos = waypoint.pos, + number = waypoint.color, + z_index = -300, + } + + waypoint.id = new_id + else + waypoint.hide = true + player:hud_remove(waypoint.id) + end + end end end @@ -2532,13 +2605,10 @@ i3.new_tab { return elseif fields.waypoint_add then - data.waypoints = data.waypoints or {} local waypoint = fields.waypoint_name - local last = #data.waypoints + 1 - data.waypoint_id = last if fields.waypoint_name == "" then - waypoint = fmt("Waypoint %u", last) + waypoint = "Waypoint" end local color = random(0xffffff) @@ -2554,20 +2624,7 @@ i3.new_tab { } insert(data.waypoints, {name = waypoint, pos = pos, color = color, id = id}) - - elseif fields.waypoint_delete then - local waypoint = data.waypoints[data.waypoint_id] - player:hud_remove(waypoint.id) - remove(data.waypoints, data.waypoint_id) - data.waypoint_id = data.waypoint_id + (data.waypoint_id == 1 and 0 or -1) - - elseif fields.waypoint_teleport then - local waypoint = data.waypoints[data.waypoint_id] - local pos = waypoint.pos - pos.y = pos.y + 0.5 - - player:set_pos(pos) - msg(name, fmt("Teleported to %s", clr("#ff0", waypoint.name))) + data.scrbar_inv = data.scrbar_inv + 100 end return set_fs(player) @@ -2921,8 +2978,9 @@ end local function init_waypoints(player) local name = player:get_player_name() local data = pdata[name] + data.waypoints = data.waypoints or {} - for _, v in ipairs(data.waypoints or {}) do + for _, v in ipairs(data.waypoints) do local id = player:hud_add { hud_elem_type = "waypoint", name = v.name, @@ -2933,6 +2991,10 @@ local function init_waypoints(player) } v.id = id + + if v.hide then + player:hud_remove(id) + end end end diff --git a/textures/i3_non_visible.png b/textures/i3_non_visible.png new file mode 100644 index 0000000000000000000000000000000000000000..b0385f02ce619b67d155088fd124674ab0502a73 GIT binary patch literal 3086 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 literal 0 HcmV?d00001 diff --git a/textures/i3_refresh.png b/textures/i3_refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..4f7d93bc486a996368f76e86641cb30dd9576a2e GIT binary patch literal 6621 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 b+OGZ!wOi*WM;k!d00000NkvXXu0mjfh8c9W literal 0 HcmV?d00001 diff --git a/textures/i3_visible.png b/textures/i3_visible.png new file mode 100644 index 0000000000000000000000000000000000000000..7e9559032ae549ac0a1adea40bff6d26593c84e0 GIT binary patch literal 2858 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