diff --git a/Content.Client/Administration/UI/Bwoink/BwoinkWindow.xaml.cs b/Content.Client/Administration/UI/Bwoink/BwoinkWindow.xaml.cs
index 984d8c5b1a..2562da3fa7 100644
--- a/Content.Client/Administration/UI/Bwoink/BwoinkWindow.xaml.cs
+++ b/Content.Client/Administration/UI/Bwoink/BwoinkWindow.xaml.cs
@@ -19,6 +19,11 @@ namespace Content.Client.Administration.UI.Bwoink
if (sel is not null)
{
Title = $"{sel.CharacterName} / {sel.Username}";
+
+ if (sel.OverallPlaytime != null)
+ {
+ Title += $" | {Loc.GetString("generic-playtime-title")}: {sel.PlaytimeString()}";
+ }
}
};
diff --git a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTab.xaml.cs b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTab.xaml.cs
index 29f7005754..ad8e4392c2 100644
--- a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTab.xaml.cs
+++ b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTab.xaml.cs
@@ -120,9 +120,11 @@ namespace Content.Client.Administration.UI.Tabs.PlayerTab
player.StartingJob,
player.Antag ? "YES" : "NO",
new StyleBoxFlat(useAltColor ? _altColor : _defaultColor),
- player.Connected);
+ player.Connected,
+ player.PlaytimeString());
entry.PlayerEntity = player.NetEntity;
entry.OnPressed += args => OnEntryPressed?.Invoke(args);
+ entry.ToolTip = Loc.GetString("player-tab-entry-tooltip");
PlayerList.AddChild(entry);
useAltColor ^= true;
diff --git a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml
index 93482c294c..883681a28a 100644
--- a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml
+++ b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml
@@ -24,5 +24,9 @@
SizeFlagsStretchRatio="2"
HorizontalExpand="True"
ClipText="True"/>
+
diff --git a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml.cs b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml.cs
index 91d04d6754..80a68f4cd2 100644
--- a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml.cs
+++ b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml.cs
@@ -10,7 +10,7 @@ public sealed partial class PlayerTabEntry : ContainerButton
{
public NetEntity? PlayerEntity;
- public PlayerTabEntry(string username, string character, string identity, string job, string antagonist, StyleBox styleBox, bool connected)
+ public PlayerTabEntry(string username, string character, string identity, string job, string antagonist, StyleBox styleBox, bool connected, string overallPlaytime)
{
RobustXamlLoader.Load(this);
@@ -23,5 +23,6 @@ public sealed partial class PlayerTabEntry : ContainerButton
CharacterLabel.Text += $" [{identity}]";
AntagonistLabel.Text = antagonist;
BackgroundColorPanel.PanelOverride = styleBox;
+ OverallPlaytimeLabel.Text = overallPlaytime;
}
}
diff --git a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabHeader.xaml b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabHeader.xaml
index 022aeffba7..001d56efcb 100644
--- a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabHeader.xaml
+++ b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabHeader.xaml
@@ -32,5 +32,11 @@
ClipText="True"
Text="{Loc player-tab-antagonist}"
MouseFilter="Pass"/>
+
diff --git a/Content.Server/Administration/Systems/AdminSystem.cs b/Content.Server/Administration/Systems/AdminSystem.cs
index 8851680aea..e1d769b1b2 100644
--- a/Content.Server/Administration/Systems/AdminSystem.cs
+++ b/Content.Server/Administration/Systems/AdminSystem.cs
@@ -3,11 +3,13 @@ using Content.Server.Administration.Managers;
using Content.Server.Chat.Managers;
using Content.Server.IdentityManagement;
using Content.Server.Mind;
+using Content.Server.Players.PlayTimeTracking;
using Content.Shared.Administration;
using Content.Shared.Administration.Events;
using Content.Shared.CCVar;
using Content.Shared.GameTicking;
using Content.Shared.IdentityManagement;
+using Content.Shared.Players.PlayTimeTracking;
using Content.Shared.Roles;
using Content.Shared.Roles.Jobs;
using Robust.Server.GameObjects;
@@ -25,6 +27,7 @@ namespace Content.Server.Administration.Systems
[Dependency] private readonly IChatManager _chat = default!;
[Dependency] private readonly IConfigurationManager _config = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
+ [Dependency] private readonly PlayTimeTrackingManager _playTime = default!;
[Dependency] private readonly SharedJobSystem _jobs = default!;
[Dependency] private readonly MindSystem _minds = default!;
[Dependency] private readonly SharedRoleSystem _role = default!;
@@ -210,9 +213,16 @@ namespace Content.Server.Administration.Systems
}
var connected = session != null && session.Status is SessionStatus.Connected or SessionStatus.InGame;
+ TimeSpan? overallPlaytime = null;
+ if (session != null &&
+ _playTime.TryGetTrackerTimes(session, out var playTimes) &&
+ playTimes.TryGetValue(PlayTimeTrackingShared.TrackerOverall, out var playTime))
+ {
+ overallPlaytime = playTime;
+ }
return new PlayerInfo(name, entityName, identityName, startingRole, antag, GetNetEntity(session?.AttachedEntity), data.UserId,
- connected, _roundActivePlayers.Contains(data.UserId));
+ connected, _roundActivePlayers.Contains(data.UserId), overallPlaytime);
}
private void OnPanicBunkerChanged(bool enabled)
diff --git a/Content.Shared/Administration/PlayerInfo.cs b/Content.Shared/Administration/PlayerInfo.cs
index bc1195dc47..c72329aedc 100644
--- a/Content.Shared/Administration/PlayerInfo.cs
+++ b/Content.Shared/Administration/PlayerInfo.cs
@@ -13,5 +13,12 @@ namespace Content.Shared.Administration
NetEntity? NetEntity,
NetUserId SessionId,
bool Connected,
- bool ActiveThisRound);
+ bool ActiveThisRound,
+ TimeSpan? OverallPlaytime)
+ {
+ public string PlaytimeString()
+ {
+ return OverallPlaytime?.ToString("%d':'hh':'mm") ?? Loc.GetString("generic-unknown-title");
+ }
+ }
}
diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml
index aafb784ddc..4a1905d110 100644
--- a/Resources/Changelog/Admin.yml
+++ b/Resources/Changelog/Admin.yml
@@ -14,3 +14,8 @@ Entries:
if admins are online or not.', type: Add}
id: 2
time: '2023-10-12T22:46:00.0000000+00:00'
+- author: DrSmugleaf
+ changes:
+ - {message: 'Added total playtime to the F7 player list and the AHelp window title.', type: Add}
+ id: 3
+ time: '2023-10-14T08:55:00.0000000+00:00'
diff --git a/Resources/Locale/en-US/administration/ui/tabs/player-tab.ftl b/Resources/Locale/en-US/administration/ui/tabs/player-tab.ftl
index b9c8f4e5ab..e0dd7a03b1 100644
--- a/Resources/Locale/en-US/administration/ui/tabs/player-tab.ftl
+++ b/Resources/Locale/en-US/administration/ui/tabs/player-tab.ftl
@@ -2,5 +2,7 @@
player-tab-character = Character
player-tab-job = Job
player-tab-antagonist = Antagonist
+player-tab-playtime = Playtime
player-tab-show-disconnected = Show Disconnected
player-tab-overlay = Overlay
+player-tab-entry-tooltip = Playtime is displayed in days:hours:minutes.
diff --git a/Resources/Locale/en-US/generic.ftl b/Resources/Locale/en-US/generic.ftl
index 7b3e0d3684..73d15024c9 100644
--- a/Resources/Locale/en-US/generic.ftl
+++ b/Resources/Locale/en-US/generic.ftl
@@ -10,3 +10,5 @@ generic-error = error
generic-invalid = invalid
generic-hours = hours
+
+generic-playtime-title = Playtime