diff --git a/.github/workflows/publish-test.yml b/.github/workflows/publish-test.yml
new file mode 100644
index 0000000000..c9a58a0577
--- /dev/null
+++ b/.github/workflows/publish-test.yml
@@ -0,0 +1,53 @@
+name: Publish Test
+
+concurrency:
+ group: publish
+ cancel-in-progress: true
+
+on:
+ workflow_dispatch:
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Set up Python
+ uses: actions/setup-python@v2
+ with:
+ python-version: '3.x'
+
+ - name: Install Dependencies
+ run: pip install pyyaml requests
+
+ - uses: actions/checkout@v4.2.2
+ with:
+ submodules: 'recursive'
+
+ - name: Setup .NET Core
+ uses: actions/setup-dotnet@v4.1.0
+ with:
+ dotnet-version: 9.0.x
+
+ - name: Get Engine Tag
+ run: |
+ cd RobustToolbox
+ git fetch --depth=1
+
+ - name: Install dependencies
+ run: dotnet restore
+
+ - name: Build Packaging
+ run: dotnet build Content.Packaging --configuration Release --no-restore /m
+
+ - name: Package server
+ run: dotnet run --project Content.Packaging server --platform win-x64 --platform linux-x64 --platform osx-x64 --platform linux-arm64
+
+ - name: Package client
+ run: dotnet run --project Content.Packaging client --no-wipe-release
+
+ - name: Publish version
+ run: Tools/publish_multi_request.py --fork-id sunrise_station_test
+ env:
+ PUBLISH_TOKEN: ${{ secrets.PUBLISH_TOKEN }}
+ GITHUB_REPOSITORY: ${{ vars.GITHUB_REPOSITORY }}
diff --git a/Content.Client/Administration/Systems/AdminWhoSystem.cs b/Content.Client/Administration/Systems/AdminWhoSystem.cs
new file mode 100644
index 0000000000..81e801ece5
--- /dev/null
+++ b/Content.Client/Administration/Systems/AdminWhoSystem.cs
@@ -0,0 +1,31 @@
+using Content.Shared.Administration;
+
+namespace Content.Client.Administration.Systems;
+
+///
+/// Client system for handling admin who requests
+///
+public sealed class AdminWhoSystem : EntitySystem
+{
+ public event Action>? OnAdminWhoUpdate;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeNetworkEvent(OnAdminWhoResponse);
+ }
+
+ ///
+ /// Request the list of online administrators from the server
+ ///
+ public void RequestAdminWho()
+ {
+ RaiseNetworkEvent(new RequestAdminWhoEvent());
+ }
+
+ private void OnAdminWhoResponse(AdminWhoResponseEvent args, EntitySessionEventArgs session)
+ {
+ OnAdminWhoUpdate?.Invoke(args.Admins);
+ }
+}
\ No newline at end of file
diff --git a/Content.Client/Administration/Systems/BwoinkSystem.cs b/Content.Client/Administration/Systems/BwoinkSystem.cs
index 72c87b6ba6..3c0730c88d 100644
--- a/Content.Client/Administration/Systems/BwoinkSystem.cs
+++ b/Content.Client/Administration/Systems/BwoinkSystem.cs
@@ -12,13 +12,25 @@ namespace Content.Client.Administration.Systems
[Dependency] private readonly IGameTiming _timing = default!;
public event EventHandler? OnBwoinkTextMessageRecieved;
+ public event EventHandler? OnBwoinkCooldownReceived;
private (TimeSpan Timestamp, bool Typing) _lastTypingUpdateSent;
+ public override void Initialize()
+ {
+ base.Initialize();
+ SubscribeNetworkEvent(OnBwoinkCooldownMessage);
+ }
+
protected override void OnBwoinkTextMessage(BwoinkTextMessage message, EntitySessionEventArgs eventArgs)
{
OnBwoinkTextMessageRecieved?.Invoke(this, message);
}
+ private void OnBwoinkCooldownMessage(BwoinkCooldownMessage message, EntitySessionEventArgs eventArgs)
+ {
+ OnBwoinkCooldownReceived?.Invoke(this, message);
+ }
+
public void Send(NetUserId channelId, string text, bool playSound, bool adminOnly)
{
// Reuse the channel ID as the 'true sender'.
diff --git a/Content.Client/Administration/UI/Bwoink/AdminWhoUIController.cs b/Content.Client/Administration/UI/Bwoink/AdminWhoUIController.cs
new file mode 100644
index 0000000000..23cc08298a
--- /dev/null
+++ b/Content.Client/Administration/UI/Bwoink/AdminWhoUIController.cs
@@ -0,0 +1,65 @@
+
+using Content.Client.Administration.Systems;
+using JetBrains.Annotations;
+using Robust.Client.UserInterface.Controllers;
+
+namespace Content.Client.Administration.UI.Bwoink
+{
+ [UsedImplicitly]
+ public sealed class AdminWhoUIController : UIController, IOnSystemChanged
+ {
+ private AdminWhoWindow? _dialog;
+ private AdminWhoSystem? _adminWhoSystem;
+
+ protected override string SawmillName => "c.c.admin.adminwho";
+
+ public void OnSystemLoaded(AdminWhoSystem system)
+ {
+ _adminWhoSystem = system;
+
+ _dialog = new AdminWhoWindow();
+ _dialog.Initialize(system);
+ }
+
+ public void OnSystemUnloaded(AdminWhoSystem system)
+ {
+ if (_dialog != null)
+ {
+ _dialog.Close();
+ _dialog.Uninitialize();
+ _dialog.Dispose();
+ _dialog = null;
+ }
+
+ _adminWhoSystem = null;
+ }
+
+ public void Open()
+ {
+ if (_dialog == null)
+ {
+ if (_adminWhoSystem == null)
+ return;
+
+ _dialog = new AdminWhoWindow();
+ _dialog.Initialize(_adminWhoSystem);
+ }
+
+ _dialog.OpenCentered();
+ _dialog.RefreshAdminList();
+ }
+
+ public void Toggle()
+ {
+ if (_dialog?.IsOpen == true)
+ Close();
+ else
+ Open();
+ }
+
+ public void Close()
+ {
+ _dialog?.Close();
+ }
+ }
+}
diff --git a/Content.Client/Administration/UI/Bwoink/AdminWhoWindow.xaml b/Content.Client/Administration/UI/Bwoink/AdminWhoWindow.xaml
new file mode 100644
index 0000000000..811dbd9b97
--- /dev/null
+++ b/Content.Client/Administration/UI/Bwoink/AdminWhoWindow.xaml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Content.Client/Administration/UI/Bwoink/AdminWhoWindow.xaml.cs b/Content.Client/Administration/UI/Bwoink/AdminWhoWindow.xaml.cs
new file mode 100644
index 0000000000..e1f9717f0e
--- /dev/null
+++ b/Content.Client/Administration/UI/Bwoink/AdminWhoWindow.xaml.cs
@@ -0,0 +1,102 @@
+using System.Text;
+using Content.Client.Administration.Managers;
+using Content.Client.Administration.Systems;
+using Content.Client.UserInterface.Controls;
+using Content.Shared.Administration;
+using Robust.Client.AutoGenerated;
+using Robust.Client.UserInterface;
+using Robust.Client.UserInterface.Controls;
+using Robust.Client.UserInterface.XAML;
+
+namespace Content.Client.Administration.UI.Bwoink
+{
+ [GenerateTypedNameReferences]
+ public sealed partial class AdminWhoWindow : FancyWindow
+ {
+ private AdminWhoSystem? _adminWhoSystem;
+
+ public AdminWhoWindow()
+ {
+ RobustXamlLoader.Load(this);
+ IoCManager.InjectDependencies(this);
+
+ RefreshButton.OnPressed += _ => RefreshAdminList();
+ CloseButton.OnPressed += _ => Close();
+ }
+
+ public void Initialize(AdminWhoSystem system)
+ {
+ _adminWhoSystem = system;
+ _adminWhoSystem.OnAdminWhoUpdate += OnAdminListReceived;
+
+ // Request the list when the window is initialized
+ RefreshAdminList();
+ }
+
+ public void Uninitialize()
+ {
+ if (_adminWhoSystem != null)
+ {
+ _adminWhoSystem.OnAdminWhoUpdate -= OnAdminListReceived;
+ _adminWhoSystem = null;
+ }
+ }
+
+ public void RefreshAdminList()
+ {
+ AdminsContainer.RemoveAllChildren();
+
+ NoAdminsLabel.Visible = false;
+ LoadingLabel.Visible = true;
+
+ _adminWhoSystem?.RequestAdminWho();
+ }
+
+ private void OnAdminListReceived(List admins)
+ {
+ LoadingLabel.Visible = false;
+
+ if (admins.Count == 0)
+ {
+ NoAdminsLabel.Visible = true;
+ return;
+ }
+
+ NoAdminsLabel.Visible = false;
+
+ // Add each admin
+ foreach (var admin in admins)
+ {
+ var adminText = new StringBuilder();
+ adminText.Append(admin.Name);
+
+ if (!string.IsNullOrEmpty(admin.Title))
+ adminText.Append($": [{admin.Title}]");
+
+ if (admin.IsStealth)
+ adminText.Append(" (S)");
+
+ if (admin.IsAfk)
+ adminText.Append(" [AFK]");
+
+ var adminLabel = new Label
+ {
+ Text = adminText.ToString(),
+ StyleClasses = { "LabelText" },
+ HorizontalAlignment = Control.HAlignment.Left,
+ Margin = new Thickness(16, 2, 8, 2)
+ };
+ AdminsContainer.AddChild(adminLabel);
+ }
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ Uninitialize();
+ }
+ base.Dispose(disposing);
+ }
+ }
+}
diff --git a/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml b/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml
index 2c27fdd2ce..4450bd4f16 100644
--- a/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml
+++ b/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml
@@ -16,6 +16,8 @@
+
+
diff --git a/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml.cs b/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml.cs
index 54c2edb8b7..6d8ae297f7 100644
--- a/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml.cs
+++ b/Content.Client/Administration/UI/Bwoink/BwoinkControl.xaml.cs
@@ -203,6 +203,14 @@ namespace Content.Client.Administration.UI.Bwoink
{
uiController.PopOut();
};
+
+ // Sunrise-Start
+ AdminWho.OnPressed += _ =>
+ {
+ var ctrl = _ui.GetUIController();
+ ctrl.Toggle();
+ };
+ // Sunrise-End
}
public void OnBwoink(NetUserId channel)
diff --git a/Content.Client/Administration/UI/Bwoink/BwoinkPanel.xaml b/Content.Client/Administration/UI/Bwoink/BwoinkPanel.xaml
index 31f46c5500..ea36af016f 100644
--- a/Content.Client/Administration/UI/Bwoink/BwoinkPanel.xaml
+++ b/Content.Client/Administration/UI/Bwoink/BwoinkPanel.xaml
@@ -3,8 +3,14 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Orientation="Vertical"
HorizontalExpand="True">
+
+
+
+
+
+
diff --git a/Content.Client/Administration/UI/Bwoink/BwoinkPanel.xaml.cs b/Content.Client/Administration/UI/Bwoink/BwoinkPanel.xaml.cs
index 0c76510fd3..991d227466 100644
--- a/Content.Client/Administration/UI/Bwoink/BwoinkPanel.xaml.cs
+++ b/Content.Client/Administration/UI/Bwoink/BwoinkPanel.xaml.cs
@@ -1,15 +1,19 @@
using Content.Shared.Administration;
using Robust.Client.AutoGenerated;
+using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Timing;
using Robust.Shared.Utility;
+using System.Threading;
namespace Content.Client.Administration.UI.Bwoink
{
[GenerateTypedNameReferences]
public sealed partial class BwoinkPanel : BoxContainer
{
+ [Dependency] private readonly IUserInterfaceManager _ui = default!;
+
private readonly Action _messageSender;
public int Unread { get; private set; } = 0;
@@ -20,11 +24,14 @@ namespace Content.Client.Administration.UI.Bwoink
// Sunrise-Start
private DateTime? _lastDateHeader;
public bool LoadDb { get; set; }
+ private DateTime _cooldownEnd = DateTime.MinValue;
+ private CancellationTokenSource? _cooldownCancellationTokenSource;
// Sunrise-End
public BwoinkPanel(Action messageSender)
{
RobustXamlLoader.Load(this);
+ IoCManager.InjectDependencies(this); // Sunrise-Edit
var msg = new FormattedMessage();
msg.PushColor(Color.LightGray);
@@ -41,6 +48,15 @@ namespace Content.Client.Administration.UI.Bwoink
};
SenderLineEdit.OnTextEntered += Input_OnTextEntered;
SenderLineEdit.OnTextChanged += Input_OnTextChanged;
+
+ // Sunrise-Start
+ AdminWhoButton.OnPressed += _ =>
+ {
+ var ctrl = _ui.GetUIController();
+ ctrl.Toggle();
+ };
+ // Sunrise-End
+
UpdateTypingIndicator();
}
@@ -49,6 +65,10 @@ namespace Content.Client.Administration.UI.Bwoink
if (string.IsNullOrWhiteSpace(args.Text))
return;
+ // Check if we're still on cooldown
+ if (DateTime.Now < _cooldownEnd)
+ return;
+
_messageSender.Invoke(args.Text);
SenderLineEdit.Clear();
}
@@ -107,7 +127,7 @@ namespace Content.Client.Administration.UI.Bwoink
return;
PeopleTyping.Add(name);
- Timer.Spawn(TimeSpan.FromSeconds(10), () =>
+ Robust.Shared.Timing.Timer.Spawn(TimeSpan.FromSeconds(10), () =>
{
if (Disposed)
return;
@@ -124,11 +144,38 @@ namespace Content.Client.Administration.UI.Bwoink
UpdateTypingIndicator();
}
+ public void OnCooldownReceived(BwoinkCooldownMessage message)
+ {
+ // Set cooldown end time
+ _cooldownEnd = DateTime.Now.Add(message.RemainingCooldown);
+
+ // Disable input field and show feedback
+ SenderLineEdit.Editable = false;
+ SenderLineEdit.PlaceHolder = Loc.GetString("bwoink-cooldown-message",
+ ("seconds", $"{message.RemainingCooldown.TotalSeconds:F1}"));
+
+ // Clean up existing timer
+ _cooldownCancellationTokenSource?.Cancel();
+ _cooldownCancellationTokenSource = new CancellationTokenSource();
+
+ // Set timer to re-enable input
+ Robust.Shared.Timing.Timer.Spawn(message.RemainingCooldown, () =>
+ {
+ if (Disposed)
+ return;
+
+ SenderLineEdit.Editable = true;
+ SenderLineEdit.PlaceHolder = Loc.GetString("bwoink-input-placeholder");
+ }, _cooldownCancellationTokenSource.Token);
+ }
+
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
InputTextChanged = null;
+ _cooldownCancellationTokenSource?.Cancel();
+ _cooldownCancellationTokenSource = null;
}
}
}
diff --git a/Content.Client/Communications/UI/CommunicationsConsoleBoundUserInterface.cs b/Content.Client/Communications/UI/CommunicationsConsoleBoundUserInterface.cs
index 0310e91eeb..a6bb84c644 100644
--- a/Content.Client/Communications/UI/CommunicationsConsoleBoundUserInterface.cs
+++ b/Content.Client/Communications/UI/CommunicationsConsoleBoundUserInterface.cs
@@ -27,6 +27,7 @@ namespace Content.Client.Communications.UI
_menu.OnBroadcast += BroadcastButtonPressed;
_menu.OnAlertLevel += AlertLevelSelected;
_menu.OnEmergencyLevel += EmergencyShuttleButtonPressed;
+ _menu.OnToggleRelay += ToggleRelayPressed; // Sunrise-Edit
}
public void AlertLevelSelected(string level)
@@ -58,6 +59,13 @@ namespace Content.Client.Communications.UI
SendMessage(new CommunicationsConsoleBroadcastMessage(message));
}
+ // Sunrise-Start
+ private void ToggleRelayPressed()
+ {
+ SendMessage(new CommunicationsConsoleToggleRelayMessage());
+ }
+ // Sunrise-End
+
public void CallShuttle()
{
SendMessage(new CommunicationsConsoleCallEmergencyShuttleMessage());
@@ -91,6 +99,14 @@ namespace Content.Client.Communications.UI
_menu.EmergencyShuttleButton.Disabled = !_menu.CanCall;
_menu.AnnounceButton.Disabled = !_menu.CanAnnounce;
_menu.BroadcastButton.Disabled = !_menu.CanBroadcast;
+
+ // Sunrise-Start
+ _menu.CanRelay = commsState.CanRelay;
+ _menu.IsRelaying = commsState.IsRelaying;
+ _menu.RelayCooldownRemaining = commsState.RelayCooldownRemaining;
+ _menu.RelayTimeRemaining = commsState.RelayTimeRemaining;
+ _menu.UpdateRelayUi();
+ // Sunrise-End
}
}
}
diff --git a/Content.Client/Communications/UI/CommunicationsConsoleMenu.xaml b/Content.Client/Communications/UI/CommunicationsConsoleMenu.xaml
index b74df979cf..0c276d0a99 100644
--- a/Content.Client/Communications/UI/CommunicationsConsoleMenu.xaml
+++ b/Content.Client/Communications/UI/CommunicationsConsoleMenu.xaml
@@ -9,23 +9,25 @@
VerticalExpand="True"
Margin="6 6 6 5">
-
-
-
+ Margin="0 2">
-
-
+
+
+
+
+
-
+
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Text="{Loc 'comms-console-menu-relay-button'}"
+ ToolTip="{Loc 'comms-console-menu-relay-button-tooltip'}"
+ StyleClasses="OpenBoth"/>
+
+
-
+
-
-
+
+
+
+
+
-
+
-
-
diff --git a/Content.Client/Communications/UI/CommunicationsConsoleMenu.xaml.cs b/Content.Client/Communications/UI/CommunicationsConsoleMenu.xaml.cs
index 926b8c6567..913b77706f 100644
--- a/Content.Client/Communications/UI/CommunicationsConsoleMenu.xaml.cs
+++ b/Content.Client/Communications/UI/CommunicationsConsoleMenu.xaml.cs
@@ -19,6 +19,12 @@ namespace Content.Client.Communications.UI
public bool CanAnnounce;
public bool CanBroadcast;
public bool CanCall;
+ // Sunrise-Start
+ public bool CanRelay;
+ public bool IsRelaying;
+ public float RelayCooldownRemaining;
+ public float RelayTimeRemaining;
+ // Sunrise-End
public bool AlertLevelSelectable;
public bool CountdownStarted;
public string CurrentLevel = string.Empty;
@@ -28,6 +34,7 @@ namespace Content.Client.Communications.UI
public event Action? OnAlertLevel;
public event Action? OnAnnounce;
public event Action? OnBroadcast;
+ public event Action? OnToggleRelay; // Sunrise-Edit
public CommunicationsConsoleMenu()
{
@@ -58,6 +65,11 @@ namespace Content.Client.Communications.UI
BroadcastButton.OnPressed += _ => OnBroadcast?.Invoke(Rope.Collapse(MessageInput.TextRope));
BroadcastButton.Disabled = !CanBroadcast;
+ // Sunrise-Start
+ RelayButton.OnPressed += _ => OnToggleRelay?.Invoke();
+ RelayButton.Disabled = !CanRelay;
+ // Sunrise-End
+
AlertLevelButton.OnItemSelected += args =>
{
var metadata = AlertLevelButton.GetItemMetadata(args.Id);
@@ -78,6 +90,7 @@ namespace Content.Client.Communications.UI
{
base.FrameUpdate(args);
UpdateCountdown();
+ UpdateRelayUi(); // Sunrise-Edit
}
// The current alert could make levels unselectable, so we need to ensure that the UI reacts properly.
@@ -122,6 +135,7 @@ namespace Content.Client.Communications.UI
if (!CountdownStarted)
{
CountdownLabel.SetMessage(string.Empty);
+ CountdownLabel.Visible = false; // Sunrise-Edit
EmergencyShuttleButton.Text = Loc.GetString("comms-console-menu-call-shuttle");
return;
}
@@ -132,6 +146,36 @@ namespace Content.Client.Communications.UI
var infoText = Loc.GetString($"comms-console-menu-time-remaining",
("time", diff.ToString(@"hh\:mm\:ss", CultureInfo.CurrentCulture)));
CountdownLabel.SetMessage(infoText);
+ CountdownLabel.Visible = true; // Sunrise-Edit
}
+
+ // Sunrise-Start
+ public void UpdateRelayUi()
+ {
+ RelayButton.Disabled = !CanRelay && !IsRelaying;
+ if (IsRelaying)
+ {
+ RelayButton.Text = Loc.GetString("comms-console-menu-relay-stop");
+ var remaining = TimeSpan.FromSeconds(Math.Max(0f, RelayTimeRemaining));
+ var text = Loc.GetString("comms-console-menu-relay-time-left", ("time", remaining.ToString(@"mm\:ss", CultureInfo.CurrentCulture)));
+ RelayStatusLabel.Visible = true;
+ RelayStatusLabel.SetMessage(text);
+ }
+ else if (RelayCooldownRemaining > 0f)
+ {
+ var remaining = TimeSpan.FromSeconds(RelayCooldownRemaining);
+ RelayButton.Text = Loc.GetString("comms-console-menu-relay-button");
+ RelayStatusLabel.SetMessage(Loc.GetString("comms-console-menu-relay-cooldown", ("time", remaining.ToString(@"mm\:ss", CultureInfo.CurrentCulture))));
+ RelayStatusLabel.Visible = true;
+ RelayButton.Disabled = true;
+ }
+ else
+ {
+ RelayButton.Text = Loc.GetString("comms-console-menu-relay-button");
+ RelayStatusLabel.Visible = false;
+ RelayStatusLabel.SetMessage(string.Empty);
+ }
+ }
+ // Sunrise-End
}
}
diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs
index efc3e8caf9..4fc346e375 100644
--- a/Content.Client/Input/ContentContexts.cs
+++ b/Content.Client/Input/ContentContexts.cs
@@ -26,7 +26,8 @@ namespace Content.Client.Input
common.AddFunction(ContentKeyFunctions.CycleChatChannelBackward);
common.AddFunction(ContentKeyFunctions.EscapeContext);
common.AddFunction(ContentKeyFunctions.ExamineEntity);
- common.AddFunction(ContentKeyFunctions.OpenAHelp);
+ // Sunrise-Edit
+ //common.AddFunction(ContentKeyFunctions.OpenAHelp);
common.AddFunction(ContentKeyFunctions.TakeScreenshot);
common.AddFunction(ContentKeyFunctions.TakeScreenshotNoUI);
common.AddFunction(ContentKeyFunctions.ToggleFullscreen);
@@ -49,6 +50,11 @@ namespace Content.Client.Input
// Not in engine so that the RCD can rotate objects
common.AddFunction(EngineKeyFunctions.EditorRotateObject);
+ // Sunrise-Start
+ common.AddFunction(ContentKeyFunctions.OpenMentorHelp);
+ common.AddFunction(ContentKeyFunctions.OpenHelpChoice);
+ // Sunrise-End
+
var human = contexts.GetContext("human");
human.AddFunction(EngineKeyFunctions.MoveUp);
human.AddFunction(EngineKeyFunctions.MoveDown);
diff --git a/Content.Client/Lobby/UI/LobbyGui.xaml b/Content.Client/Lobby/UI/LobbyGui.xaml
index 2d2c6a91fd..fd775f5c45 100644
--- a/Content.Client/Lobby/UI/LobbyGui.xaml
+++ b/Content.Client/Lobby/UI/LobbyGui.xaml
@@ -177,7 +177,11 @@
HorizontalAlignment="Right" SizeFlagsStretchRatio="1">
+
+