Fix gamerule display issues (#28178)
* A comprehensive rule list for joining admins and mid round command to get rule list added * Fix up for when a rule is added vs started and some logging * fix command help localization, fix admin flags and spam anouncement. * Send admin message only to the joining player not all admins. * Bit better formatting in chat box
This commit is contained in:
@@ -150,6 +150,14 @@ namespace Content.Server.Chat.Managers
|
||||
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Admin announcement: {message}");
|
||||
}
|
||||
|
||||
public void SendAdminAnnouncementMessage(ICommonSession player, string message, bool suppressLog = true)
|
||||
{
|
||||
var wrappedMessage = Loc.GetString("chat-manager-send-admin-announcement-wrap-message",
|
||||
("adminChannelName", Loc.GetString("chat-manager-admin-channel-name")),
|
||||
("message", FormattedMessage.EscapeText(message)));
|
||||
ChatMessageToOne(ChatChannel.Admin, message, wrappedMessage, default, false, player.Channel);
|
||||
}
|
||||
|
||||
public void SendAdminAlert(string message)
|
||||
{
|
||||
var clients = _adminManager.ActiveAdmins.Select(p => p.Channel);
|
||||
|
||||
@@ -23,6 +23,7 @@ namespace Content.Server.Chat.Managers
|
||||
|
||||
void SendHookOOC(string sender, string message);
|
||||
void SendAdminAnnouncement(string message, AdminFlags? flagBlacklist = null, AdminFlags? flagWhitelist = null);
|
||||
void SendAdminAnnouncementMessage(ICommonSession player, string message, bool suppressLog = true);
|
||||
void SendAdminAlert(string message);
|
||||
void SendAdminAlert(EntityUid player, string message);
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
using System.Linq;
|
||||
using Content.Server.Administration;
|
||||
using Content.Server.GameTicking.Components;
|
||||
using Content.Server.GameTicking.Rules.Components;
|
||||
using Content.Shared.Administration;
|
||||
using Content.Shared.Database;
|
||||
using Content.Shared.Prototypes;
|
||||
@@ -42,6 +43,14 @@ public sealed partial class GameTicker
|
||||
string.Empty,
|
||||
"cleargamerules",
|
||||
ClearGameRulesCommand);
|
||||
|
||||
// List game rules command.
|
||||
var localizedHelp = Loc.GetString("listgamerules-command-help");
|
||||
|
||||
_consoleHost.RegisterCommand("listgamerules",
|
||||
string.Empty,
|
||||
$"listgamerules - {localizedHelp}",
|
||||
ListGameRuleCommand);
|
||||
}
|
||||
|
||||
private void ShutdownGameRules()
|
||||
@@ -49,6 +58,7 @@ public sealed partial class GameTicker
|
||||
_consoleHost.UnregisterCommand("addgamerule");
|
||||
_consoleHost.UnregisterCommand("endgamerule");
|
||||
_consoleHost.UnregisterCommand("cleargamerules");
|
||||
_consoleHost.UnregisterCommand("listgamerules");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -64,6 +74,13 @@ public sealed partial class GameTicker
|
||||
|
||||
var ev = new GameRuleAddedEvent(ruleEntity, ruleId);
|
||||
RaiseLocalEvent(ruleEntity, ref ev, true);
|
||||
|
||||
var currentTime = RunLevel == GameRunLevel.PreRoundLobby ? TimeSpan.Zero : RoundDuration();
|
||||
if (!HasComp<RoundstartStationVariationRuleComponent>(ruleEntity) && !HasComp<StationVariationPassRuleComponent>(ruleEntity))
|
||||
{
|
||||
_allPreviousGameRules.Add((currentTime, ruleId + " (Pending)"));
|
||||
}
|
||||
|
||||
return ruleEntity;
|
||||
}
|
||||
|
||||
@@ -110,7 +127,8 @@ public sealed partial class GameTicker
|
||||
if (delayTime > TimeSpan.Zero)
|
||||
{
|
||||
_sawmill.Info($"Queued start for game rule {ToPrettyString(ruleEntity)} with delay {delayTime}");
|
||||
_adminLogger.Add(LogType.EventStarted, $"Queued start for game rule {ToPrettyString(ruleEntity)} with delay {delayTime}");
|
||||
_adminLogger.Add(LogType.EventStarted,
|
||||
$"Queued start for game rule {ToPrettyString(ruleEntity)} with delay {delayTime}");
|
||||
|
||||
var delayed = EnsureComp<DelayedStartRuleComponent>(ruleEntity);
|
||||
delayed.RuleStartTime = _gameTiming.CurTime + (delayTime);
|
||||
@@ -118,7 +136,20 @@ public sealed partial class GameTicker
|
||||
}
|
||||
}
|
||||
|
||||
_allPreviousGameRules.Add((RoundDuration(), id));
|
||||
var currentTime = RunLevel == GameRunLevel.PreRoundLobby ? TimeSpan.Zero : RoundDuration();
|
||||
|
||||
// Remove the first occurrence of the pending entry before adding the started entry
|
||||
var pendingRuleIndex = _allPreviousGameRules.FindIndex(rule => rule.Item2 == id + " (Pending)");
|
||||
if (pendingRuleIndex >= 0)
|
||||
{
|
||||
_allPreviousGameRules.RemoveAt(pendingRuleIndex);
|
||||
}
|
||||
|
||||
if (!HasComp<RoundstartStationVariationRuleComponent>(ruleEntity) && !HasComp<StationVariationPassRuleComponent>(ruleEntity))
|
||||
{
|
||||
_allPreviousGameRules.Add((currentTime, id));
|
||||
}
|
||||
|
||||
_sawmill.Info($"Started game rule {ToPrettyString(ruleEntity)}");
|
||||
_adminLogger.Add(LogType.EventStarted, $"Started game rule {ToPrettyString(ruleEntity)}");
|
||||
|
||||
@@ -296,6 +327,7 @@ public sealed partial class GameTicker
|
||||
if (shell.Player != null)
|
||||
{
|
||||
_adminLogger.Add(LogType.EventStarted, $"{shell.Player} tried to add game rule [{rule}] via command");
|
||||
_chatManager.SendAdminAnnouncement(Loc.GetString("add-gamerule-admin", ("rule", rule), ("admin", shell.Player)));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -306,6 +338,7 @@ public sealed partial class GameTicker
|
||||
// Start rule if we're already in the middle of a round
|
||||
if(RunLevel == GameRunLevel.InRound)
|
||||
StartGameRule(ent);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -349,5 +382,42 @@ public sealed partial class GameTicker
|
||||
ClearGameRules();
|
||||
}
|
||||
|
||||
[AdminCommand(AdminFlags.Admin)]
|
||||
private void ListGameRuleCommand(IConsoleShell shell, string argstr, string[] args)
|
||||
{
|
||||
_sawmill.Info($"{shell.Player} tried to get list of game rules via command");
|
||||
_adminLogger.Add(LogType.Action, $"{shell.Player} tried to get list of game rules via command");
|
||||
var message = GetGameRulesListMessage(false);
|
||||
shell.WriteLine(message);
|
||||
}
|
||||
private string GetGameRulesListMessage(bool forChatWindow)
|
||||
{
|
||||
if (_allPreviousGameRules.Count > 0)
|
||||
{
|
||||
var sortedRules = _allPreviousGameRules.OrderBy(rule => rule.Item1).ToList();
|
||||
var message = "\n";
|
||||
|
||||
if (!forChatWindow)
|
||||
{
|
||||
var header = Loc.GetString("list-gamerule-admin-header");
|
||||
message += $"\n{header}\n";
|
||||
message += "|------------|------------------\n";
|
||||
}
|
||||
|
||||
foreach (var (time, rule) in sortedRules)
|
||||
{
|
||||
var formattedTime = time.ToString(@"hh\:mm\:ss");
|
||||
message += $"| {formattedTime,-10} | {rule,-16} \n";
|
||||
}
|
||||
|
||||
return message;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Loc.GetString("list-gamerule-admin-no-rules");
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
using System.Linq;
|
||||
using Content.Server.Database;
|
||||
using Content.Shared.Administration;
|
||||
using Content.Shared.CCVar;
|
||||
using Content.Shared.GameTicking;
|
||||
using Content.Shared.GameWindow;
|
||||
@@ -196,6 +198,15 @@ namespace Content.Server.GameTicking
|
||||
_playerGameStatuses[session.UserId] = PlayerGameStatus.JoinedGame;
|
||||
_db.AddRoundPlayers(RoundId, session.UserId);
|
||||
|
||||
if (_adminManager.HasAdminFlag(session, AdminFlags.Admin))
|
||||
{
|
||||
if (_allPreviousGameRules.Count > 0)
|
||||
{
|
||||
var rulesMessage = GetGameRulesListMessage(true);
|
||||
_chatManager.SendAdminAnnouncementMessage(session, Loc.GetString("starting-rule-selected-preset", ("preset", rulesMessage)));
|
||||
}
|
||||
}
|
||||
|
||||
RaiseNetworkEvent(new TickerJoinGameEvent(), session.Channel);
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,6 @@ public sealed class SecretRuleSystem : GameRuleSystem<SecretRuleComponent>
|
||||
|
||||
Log.Info($"Selected {preset.ID} as the secret preset.");
|
||||
_adminLogger.Add(LogType.EventStarted, $"Selected {preset.ID} as the secret preset.");
|
||||
_chatManager.SendAdminAnnouncement(Loc.GetString("rule-secret-selected-preset", ("preset", preset.ID)));
|
||||
|
||||
foreach (var rule in preset.Rules)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
#When an admin adds a game rule
|
||||
add-gamerule-admin = Game rule({$rule}) added - {$admin}
|
||||
list-gamerule-admin-header = | Time | Rule added
|
||||
list-gamerule-admin-no-rules = No game rules have been added.
|
||||
starting-rule-selected-preset = Current gamerules in use: {$preset}
|
||||
listgamerules-command-help = Lists all rules that have been added for the round so far.
|
||||
@@ -1,2 +0,0 @@
|
||||
# Sent to admin chat
|
||||
rule-secret-selected-preset = Selected {$preset} for secret.
|
||||
Reference in New Issue
Block a user