diff --git a/data/ui_scripts/server_list/serverlist.lua b/data/ui_scripts/server_list/serverlist.lua index 556e9cc5..568670ed 100644 --- a/data/ui_scripts/server_list/serverlist.lua +++ b/data/ui_scripts/server_list/serverlist.lua @@ -2,151 +2,189 @@ local Lobby = luiglobals.Lobby local SystemLinkJoinMenu = LUI.mp_menus.SystemLinkJoinMenu if (not SystemLinkJoinMenu) then - return + return end game:addlocalizedstring("MENU_NUMPLAYERS", "Players") game:addlocalizedstring("MENU_PING", "Ping") -local offsets = {10, 500, 950, 700, 1100} - -local columns = {"@MENU_HOST_NAME", "@MENU_MAP", "@MENU_NUMPLAYERS", "@MENU_TYPE1", "@MENU_PING"} +local columns = { + { + offset = 10, + text = "@MENU_HOST_NAME", + dataindex = 0 + }, + { + offset = 500, + text = "@MENU_MAP", + dataindex = 1 + }, + { + offset = 700, + text = "@MENU_TYPE1", + dataindex = 3 + }, + { + offset = 950, + text = "@MENU_NUMPLAYERS", + dataindex = 2 + }, + { + offset = 1100, + text = "@MENU_PING", + dataindex = 4 + } +} function textlength(text, font, height) - local _, _, width = luiglobals.GetTextDimensions(text, font, height) - return width + local _, _, width = luiglobals.GetTextDimensions(text, font, height) + return width end function trimtext(text, font, height, maxwidth) - while (textlength(text, font, height) > maxwidth) do - text = text:sub(1, #text - 1) - end + if (maxwidth < 0) then + return text + end - return text + while (textlength(text, font, height) > maxwidth) do + text = text:sub(1, #text - 1) + end + + return text end SystemLinkJoinMenu.AddHeaderButton = function(menu, f12_arg1, width) - local state = CoD.CreateState(0, f12_arg1, nil, nil, CoD.AnchorTypes.TopLeft) - state.width = width - local element = LUI.UIElement.new(state) - local button = SystemLinkJoinMenu.CreateButton("header", 24) + local state = CoD.CreateState(0, f12_arg1, nil, nil, CoD.AnchorTypes.TopLeft) + state.width = width + local element = LUI.UIElement.new(state) + local button = SystemLinkJoinMenu.CreateButton("header", 24) - button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.TopLeftRight), 40, - LUI.Divider.Grey)) - button:makeNotFocusable() - button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.BottomLeftRight), 40, - LUI.Divider.Grey)) + button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.TopLeftRight), 40, + LUI.Divider.Grey)) + button:makeNotFocusable() + button:addElement(LUI.Divider.new(CoD.CreateState(nil, 0, nil, nil, CoD.AnchorTypes.BottomLeftRight), 40, + LUI.Divider.Grey)) - local gettext = function(i) - return Engine.Localize(columns[i]) - end + button.m_eventHandlers = {} - for i = 1, #offsets do - SystemLinkJoinMenu.MakeText(button.textHolder, offsets[i], gettext(i), nil) - end + for i = 1, #columns do + SystemLinkJoinMenu.MakeText(button.textHolder, columns[i].offset, Engine.Localize(columns[i].text), nil) + end - element:addElement(button) - menu:addElement(element) + element:addElement(button) + menu:addElement(element) end SystemLinkJoinMenu.AddServerButton = function(menu, controller, index) - local button = SystemLinkJoinMenu.CreateButton(index or "header", 24) - button:makeFocusable() - button.index = index - button:addEventHandler("button_action", SystemLinkJoinMenu.OnJoinGame) + local button = SystemLinkJoinMenu.CreateButton(index or "header", 24) + button:makeFocusable() + button.index = index + button:addEventHandler("button_action", SystemLinkJoinMenu.OnJoinGame) - local gettext = function(i) - local text = Lobby.GetServerData(controller, index, i - 1) - return trimtext(text, CoD.TextSettings.TitleFontSmall.Font, 14, 400) - end + local gettext = function(i) + local text = Lobby.GetServerData(controller, index, columns[i].dataindex) - for i = 1, #offsets do - SystemLinkJoinMenu.MakeText(button.textHolder, offsets[i], gettext(i), luiglobals.Colors.h1.medium_grey) - end + local islast = not columns[i + 1] + local end_ = islast and 1130 or columns[i + 1].offset + local maxlength = end_ - columns[i].offset - menu.list:addElement(button) - return button + if (maxlength < 0) then + maxlength = columns[i].offset - end_ + end + + if (not islast) then + maxlength = maxlength - 50 + end + + return trimtext(text, CoD.TextSettings.TitleFontSmall.Font, 14, maxlength) + end + + for i = 1, #columns do + SystemLinkJoinMenu.MakeText(button.textHolder, columns[i].offset, gettext(i), luiglobals.Colors.h1.medium_grey) + end + + menu.list:addElement(button) + return button end SystemLinkJoinMenu.MakeText = function(menu, f5_arg1, text, color) - local state = CoD.CreateState(f5_arg1, nil, f5_arg1 + 200, nil, CoD.AnchorTypes.Left) - state.font = CoD.TextSettings.TitleFontSmall.Font - state.top = -6 - state.height = 14 - state.alignment = LUI.Alignment.Left - state.glow = LUI.GlowState.None - state.color = color + local state = CoD.CreateState(f5_arg1, nil, f5_arg1 + 200, nil, CoD.AnchorTypes.Left) + state.font = CoD.TextSettings.TitleFontSmall.Font + state.top = -6 + state.height = 14 + state.alignment = nil + state.glow = LUI.GlowState.None + state.color = color - local el = LUI.UIText.new(state) - el:registerAnimationState("focused", { - color = luiglobals.Colors.white - }) + local el = LUI.UIText.new(state) + el:registerAnimationState("focused", { + color = luiglobals.Colors.white + }) - el:registerEventHandler("focused", function(element, event) - element:animateToState("focused", 0) - end) + el:registerEventHandler("focused", function(element, event) + element:animateToState("focused", 0) + end) - el:registerEventHandler("unfocused", function(element, event) - element:animateToState("default", 0) - end) + el:registerEventHandler("unfocused", function(element, event) + element:animateToState("default", 0) + end) - el:setText(text) - menu:addElement(el) + el:setText(text) + menu:addElement(el) end function menu_systemlink_join(f19_arg0, f19_arg1) - local width = 1145 + local width = 1145 - local menu = LUI.MenuTemplate.new(f19_arg0, { - menu_title = "@PLATFORM_SYSTEM_LINK_TITLE", - menu_width = width, - menu_top_indent = 20, - disableDeco = true, - spacing = 1 - }) + local menu = LUI.MenuTemplate.new(f19_arg0, { + menu_title = "@PLATFORM_SYSTEM_LINK_TITLE", + menu_width = width, + menu_top_indent = 20, + disableDeco = true, + spacing = 1 + }) - SystemLinkJoinMenu.AddHeaderButton(menu, 80, width) - SystemLinkJoinMenu.AddLowerCounter(menu, width) - SystemLinkJoinMenu.UpdateCounterText(menu, nil) - Lobby.BuildServerList(Engine.GetFirstActiveController()) + SystemLinkJoinMenu.AddHeaderButton(menu, 80, width) + SystemLinkJoinMenu.AddLowerCounter(menu, width) + SystemLinkJoinMenu.UpdateCounterText(menu, nil) + Lobby.BuildServerList(Engine.GetFirstActiveController()) - menu.list:registerEventHandler(LUI.UIScrollIndicator.UpdateEvent, function(element, event) - SystemLinkJoinMenu.UpdateCounterText(menu, event) - end) + menu.list:registerEventHandler(LUI.UIScrollIndicator.UpdateEvent, function(element, event) + SystemLinkJoinMenu.UpdateCounterText(menu, event) + end) - SystemLinkJoinMenu.UpdateGameList(menu) - menu:registerEventHandler("updateGameList", SystemLinkJoinMenu.UpdateGameList) - menu:addElement(LUI.UITimer.new(250, "updateGameList")) + SystemLinkJoinMenu.UpdateGameList(menu) + menu:registerEventHandler("updateGameList", SystemLinkJoinMenu.UpdateGameList) - LUI.ButtonHelperText.ClearHelperTextObjects(menu.help, { - side = "all" - }) + LUI.ButtonHelperText.ClearHelperTextObjects(menu.help, { + side = "all" + }) - menu:AddHelp({ - name = "add_button_helper_text", - button_ref = "button_alt1", - helper_text = Engine.Localize("@MENU_SB_TOOLTIP_BTN_REFRESH"), - side = "right", - clickable = true, - priority = -1000 - }, function(f21_arg0, f21_arg1) - SystemLinkJoinMenu.RefreshServers(f21_arg0, f21_arg1, menu) - end) + menu:AddHelp({ + name = "add_button_helper_text", + button_ref = "button_alt1", + helper_text = Engine.Localize("@MENU_SB_TOOLTIP_BTN_REFRESH"), + side = "right", + clickable = true, + priority = -1000 + }, function(f21_arg0, f21_arg1) + SystemLinkJoinMenu.RefreshServers(f21_arg0, f21_arg1, menu) + end) - menu:AddHelp({ - name = "add_button_helper_text", - button_ref = "button_action", - helper_text = Engine.Localize("@MENU_JOIN_GAME1"), - side = "left", - clickable = false, - priority = -1000 - }, nil, nil, true) + menu:AddHelp({ + name = "add_button_helper_text", + button_ref = "button_action", + helper_text = Engine.Localize("@MENU_JOIN_GAME1"), + side = "left", + clickable = false, + priority = -1000 + }, nil, nil, true) - menu:AddBackButton() + menu:AddBackButton() - Lobby.RefreshServerList(Engine.GetFirstActiveController()) + Lobby.RefreshServerList(Engine.GetFirstActiveController()) - return menu + return menu end LUI.MenuBuilder.m_types_build["menu_systemlink_join"] = menu_systemlink_join diff --git a/src/client/component/server_list.cpp b/src/client/component/server_list.cpp index 54354f7f..81f2beb0 100644 --- a/src/client/component/server_list.cpp +++ b/src/client/component/server_list.cpp @@ -1,24 +1,26 @@ #include #include "loader/component_loader.hpp" + #include "server_list.hpp" #include "localized_strings.hpp" #include "network.hpp" #include "scheduler.hpp" #include "party.hpp" +#include "console.hpp" +#include "command.hpp" + #include "game/game.hpp" +#include "game/ui_scripting/execution.hpp" #include #include #include -#include "console.hpp" -#include "command.hpp" - namespace server_list { namespace { - const int server_limit = 18; + const int server_limit = 100; struct server_info { @@ -107,11 +109,6 @@ namespace server_list int ui_feeder_count() { std::lock_guard _(mutex); - if (update_server_list) - { - update_server_list = false; - return 0; - } const auto count = static_cast(servers.size()); const auto index = get_page_base_index(); const auto diff = count - index; @@ -272,6 +269,15 @@ namespace server_list lui_open_menu_hook.invoke(controllerIndex, menuName, isPopup, isModal, isExclusive); } + + void check_refresh() + { + if (update_server_list) + { + update_server_list = false; + ui_scripting::notify("updateGameList", {}); + } + } } bool sl_key_event(const int key, const int down) @@ -430,6 +436,7 @@ namespace server_list }), true); scheduler::loop(do_frame_work, scheduler::pipeline::main); + scheduler::loop(check_refresh, scheduler::pipeline::lui, 10ms); network::on("getServersResponse", [](const game::netadr_s& target, const std::string_view& data) {