Skip to content

Commit bddbc2f

Browse files
authored
Added player list tooltip to Nitrox Launcher (SubnauticaNitrox#2699)
1 parent 11e206e commit bddbc2f

9 files changed

Lines changed: 45 additions & 24 deletions

File tree

Nitrox.Launcher/Models/Design/ServerEntry.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Concurrent;
3+
using System.Collections.Generic;
34
using System.ComponentModel;
45
using System.Diagnostics;
56
using System.Diagnostics.CodeAnalysis;
@@ -92,7 +93,11 @@ internal sealed partial class ServerEntry : ObservableObject
9293
private Perms playerPermissions = serverDefaults.DefaultPlayerPerm;
9394

9495
[ObservableProperty]
95-
private int players;
96+
private int playerCount;
97+
98+
[ObservableProperty]
99+
[NotifyPropertyChangedFor(nameof(PlayerNamesTooltip))]
100+
private List<string> playerNames = [];
96101

97102
[ObservableProperty]
98103
private int port = serverDefaults.ServerPort;
@@ -111,6 +116,7 @@ internal sealed partial class ServerEntry : ObservableObject
111116

112117
internal ServerProcess? Process { get; private set; }
113118
public AvaloniaList<OutputLine> Output { get; } = [];
119+
public string? PlayerNamesTooltip => PlayerNames.Count == 0 ? null : string.Join(Environment.NewLine, PlayerNames);
114120

115121
/// <summary>
116122
/// Gets the last process id known by this server entry.
@@ -337,7 +343,7 @@ protected override void OnPropertyChanged(PropertyChangedEventArgs e)
337343
switch (e.PropertyName)
338344
{
339345
case nameof(IsOnline) when LastProcessId > 0:
340-
WeakReferenceMessenger.Default.Send(new ServerStatusMessage(LastProcessId, IsOnline, Players));
346+
WeakReferenceMessenger.Default.Send(new ServerStatusMessage(LastProcessId, IsOnline, PlayerCount));
341347
break;
342348
}
343349
base.OnPropertyChanged(e);
@@ -372,7 +378,8 @@ await Dispatcher.UIThread.InvokeAsync(async () =>
372378
}
373379
}
374380
CommandQueue = Channel.CreateUnbounded<string>();
375-
Players = 0;
381+
PlayerCount = 0;
382+
PlayerNames = [];
376383
IsOnline = false;
377384
Output.Clear();
378385
});

Nitrox.Launcher/Models/Services/ServersManagement.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,15 @@ internal sealed class ServersManagement(ServerService serverService) : Streaming
2020
private int processId;
2121
private string saveName;
2222

23-
public ValueTask SetPlayerCount(int playerCount)
23+
public ValueTask SetPlayers(string[] players)
2424
{
2525
ServerEntry? entry = serverService.GetServerEntryByAnyOf(processId, saveName);
2626
if (entry == null)
2727
{
2828
return CompletedTask;
2929
}
30-
entry.Players = playerCount;
30+
entry.PlayerCount = players.Length;
31+
entry.PlayerNames = [..players];
3132
return CompletedTask;
3233
}
3334

Nitrox.Launcher/ViewModels/ManageServerViewModel.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ internal partial class ManageServerViewModel : RoutableViewModelBase
111111

112112
[ObservableProperty]
113113
[NotifyCanExecuteChangedFor(nameof(SaveCommand), nameof(UndoCommand), nameof(BackCommand), nameof(RestoreBackupCommand), nameof(StartServerCommand))]
114-
private int serverPlayers;
114+
private int serverPlayerCount;
115115

116116
[ObservableProperty]
117117
[NotifyCanExecuteChangedFor(nameof(SaveCommand), nameof(UndoCommand), nameof(BackCommand), nameof(RestoreBackupCommand), nameof(StartServerCommand))]
@@ -147,7 +147,7 @@ public ManageServerViewModel(DialogService dialogService, StorageService storage
147147
return;
148148
}
149149
vm.ServerIsOnline = status.IsOnline;
150-
vm.ServerPlayers = status.PlayerCount;
150+
vm.ServerPlayerCount = status.PlayerCount;
151151
});
152152
}
153153

@@ -185,7 +185,7 @@ public void LoadFrom(ServerEntry serverEntry)
185185
ServerDefaultPlayerPerm = Server.PlayerPermissions;
186186
ServerAutoSaveInterval = Server.AutoSaveInterval;
187187
ServerMaxPlayers = Server.MaxPlayers;
188-
ServerPlayers = Server.Players;
188+
ServerPlayerCount = Server.PlayerCount;
189189
ServerPort = Server.Port;
190190
ServerAutoPortForward = Server.PortForward;
191191
ServerAllowLanDiscovery = Server.AllowLanDiscovery;
@@ -203,7 +203,7 @@ private bool HasChanges() => Server != null &&
203203
ServerDefaultPlayerPerm != Server.PlayerPermissions ||
204204
ServerAutoSaveInterval != Server.AutoSaveInterval ||
205205
ServerMaxPlayers != Server.MaxPlayers ||
206-
ServerPlayers != Server.Players ||
206+
ServerPlayerCount != Server.PlayerCount ||
207207
ServerPort != Server.Port ||
208208
ServerAutoPortForward != Server.PortForward ||
209209
ServerAllowLanDiscovery != Server.AllowLanDiscovery ||
@@ -261,7 +261,7 @@ private void Save()
261261
Server.PlayerPermissions = ServerDefaultPlayerPerm;
262262
Server.AutoSaveInterval = ServerAutoSaveInterval;
263263
Server.MaxPlayers = ServerMaxPlayers;
264-
Server.Players = ServerPlayers;
264+
Server.PlayerCount = ServerPlayerCount;
265265
Server.Port = ServerPort;
266266
Server.PortForward = ServerAutoPortForward;
267267
Server.AllowLanDiscovery = ServerAllowLanDiscovery;
@@ -311,7 +311,7 @@ private void Undo()
311311
ServerDefaultPlayerPerm = Server.PlayerPermissions;
312312
ServerAutoSaveInterval = Server.AutoSaveInterval;
313313
ServerMaxPlayers = Server.MaxPlayers;
314-
ServerPlayers = Server.Players;
314+
ServerPlayerCount = Server.PlayerCount;
315315
ServerPort = Server.Port;
316316
ServerAutoPortForward = Server.PortForward;
317317
ServerAllowLanDiscovery = Server.AllowLanDiscovery;

Nitrox.Launcher/ViewModels/ServersViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public ServersViewModel(IKeyValueStore keyValueStore, DialogService dialogServic
4141
{
4242
return;
4343
}
44-
entry.Players = message.PlayerCount;
44+
entry.PlayerCount = message.PlayerCount;
4545
entry.IsOnline = message.IsOnline;
4646
});
4747

Nitrox.Launcher/Views/ManageServerView.axaml

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,18 @@
119119
</StackPanel>
120120
</Panel>
121121
<TextBlock Text="{Binding Server.GameMode, Converter={converters:ToStringConverter}, FallbackValue=Survival}" />
122-
<TextBlock TextWrapping="NoWrap">
123-
<Run Text="{Binding Server.Players, FallbackValue=0}" />
124-
<Run Text="/" />
122+
<TextBlock TextWrapping="NoWrap" Background="Transparent"
123+
Classes.online="{Binding Server.IsOnline, FallbackValue=False}"
124+
ToolTip.Tip="{Binding Server.PlayerNamesTooltip, FallbackValue=''}">
125+
<Run Text="{Binding Server.PlayerCount, FallbackValue=0}" />
126+
<Run Text=" / " />
125127
<Run Text="{Binding Server.MaxPlayers, FallbackValue=100}" />
126-
<Run Text="playing" />
128+
<Run Text=" playing" />
129+
<TextBlock.Styles>
130+
<Style Selector="TextBlock.online:pointerover">
131+
<Setter Property="TextDecorations" Value="Underline" />
132+
</Style>
133+
</TextBlock.Styles>
127134
</TextBlock>
128135
</StackPanel>
129136

Nitrox.Launcher/Views/ServersView.axaml

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,18 @@
118118
</StackPanel>
119119
</Panel>
120120
<TextBlock Text="{Binding GameMode, Converter={converters:ToStringConverter}}" />
121-
<TextBlock TextWrapping="NoWrap">
122-
<Run Text="{Binding Players}" />
123-
<Run Text="/" />
121+
<TextBlock TextWrapping="NoWrap" Background="Transparent"
122+
Classes.online="{Binding IsOnline}"
123+
ToolTip.Tip="{Binding PlayerNamesTooltip}">
124+
<Run Text="{Binding PlayerCount}" />
125+
<Run Text=" / " />
124126
<Run Text="{Binding MaxPlayers}" />
125-
<Run Text="playing" />
127+
<Run Text=" playing" />
128+
<TextBlock.Styles>
129+
<Style Selector="TextBlock.online:pointerover">
130+
<Setter Property="TextDecorations" Value="Underline" />
131+
</Style>
132+
</TextBlock.Styles>
126133
</TextBlock>
127134
</WrapPanel>
128135
</StackPanel>

Nitrox.Model/MagicOnion/IServersManagement.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace Nitrox.Model.MagicOnion;
99
/// </summary>
1010
public interface IServersManagement : IStreamingHub<IServersManagement, IServerManagementReceiver>
1111
{
12-
ValueTask SetPlayerCount(int playerCount);
12+
ValueTask SetPlayers(string[] players);
1313
ValueTask AddOutputLine(string category, DateTimeOffset? localTime, int level, string message);
1414
}
1515

Nitrox.Server.Subnautica/Models/GameLogic/PlayerManager.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,6 @@ public Player CreatePlayerData(SessionId sessionId, string reservationKey, out b
188188
return player;
189189
}
190190

191-
public int PlayerCount => connectedPlayersBySessionId.Count;
192-
193191
public bool SetPlayerProperty<T>(SessionId sessionId, T value, Action<Player, T> action)
194192
{
195193
if (!TryGetPlayerBySessionId(sessionId, out Player? player))

Nitrox.Server.Subnautica/Services/ServersManagementService.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Buffers;
22
using System.IO;
3+
using System.Linq;
34
using System.Threading.Channels;
45
using Grpc.Core;
56
using Grpc.Net.Client;
@@ -114,7 +115,7 @@ Task CreateLoopingTask(Func<IServersManagement, CancellationToken, Task> action,
114115

115116
private async Task PushPollDataAsync(IServersManagement api)
116117
{
117-
await api.SetPlayerCount(playerManager.PlayerCount);
118+
await api.SetPlayers(playerManager.ConnectedPlayers().Select(player => player.Name).ToArray());
118119
}
119120

120121
private async Task PushLogsAsync(IServersManagement api, CancellationToken cancellationToken)

0 commit comments

Comments
 (0)