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}");
|
_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)
|
public void SendAdminAlert(string message)
|
||||||
{
|
{
|
||||||
var clients = _adminManager.ActiveAdmins.Select(p => p.Channel);
|
var clients = _adminManager.ActiveAdmins.Select(p => p.Channel);
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ namespace Content.Server.Chat.Managers
|
|||||||
|
|
||||||
void SendHookOOC(string sender, string message);
|
void SendHookOOC(string sender, string message);
|
||||||
void SendAdminAnnouncement(string message, AdminFlags? flagBlacklist = null, AdminFlags? flagWhitelist = null);
|
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(string message);
|
||||||
void SendAdminAlert(EntityUid player, string message);
|
void SendAdminAlert(EntityUid player, string message);
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Content.Server.Administration;
|
using Content.Server.Administration;
|
||||||
using Content.Server.GameTicking.Components;
|
using Content.Server.GameTicking.Components;
|
||||||
|
using Content.Server.GameTicking.Rules.Components;
|
||||||
using Content.Shared.Administration;
|
using Content.Shared.Administration;
|
||||||
using Content.Shared.Database;
|
using Content.Shared.Database;
|
||||||
using Content.Shared.Prototypes;
|
using Content.Shared.Prototypes;
|
||||||
@@ -42,6 +43,14 @@ public sealed partial class GameTicker
|
|||||||
string.Empty,
|
string.Empty,
|
||||||
"cleargamerules",
|
"cleargamerules",
|
||||||
ClearGameRulesCommand);
|
ClearGameRulesCommand);
|
||||||
|
|
||||||
|
// List game rules command.
|
||||||
|
var localizedHelp = Loc.GetString("listgamerules-command-help");
|
||||||
|
|
||||||
|
_consoleHost.RegisterCommand("listgamerules",
|
||||||
|
string.Empty,
|
||||||
|
$"listgamerules - {localizedHelp}",
|
||||||
|
ListGameRuleCommand);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ShutdownGameRules()
|
private void ShutdownGameRules()
|
||||||
@@ -49,6 +58,7 @@ public sealed partial class GameTicker
|
|||||||
_consoleHost.UnregisterCommand("addgamerule");
|
_consoleHost.UnregisterCommand("addgamerule");
|
||||||
_consoleHost.UnregisterCommand("endgamerule");
|
_consoleHost.UnregisterCommand("endgamerule");
|
||||||
_consoleHost.UnregisterCommand("cleargamerules");
|
_consoleHost.UnregisterCommand("cleargamerules");
|
||||||
|
_consoleHost.UnregisterCommand("listgamerules");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -64,6 +74,13 @@ public sealed partial class GameTicker
|
|||||||
|
|
||||||
var ev = new GameRuleAddedEvent(ruleEntity, ruleId);
|
var ev = new GameRuleAddedEvent(ruleEntity, ruleId);
|
||||||
RaiseLocalEvent(ruleEntity, ref ev, true);
|
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;
|
return ruleEntity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,7 +127,8 @@ public sealed partial class GameTicker
|
|||||||
if (delayTime > TimeSpan.Zero)
|
if (delayTime > TimeSpan.Zero)
|
||||||
{
|
{
|
||||||
_sawmill.Info($"Queued start for game rule {ToPrettyString(ruleEntity)} with delay {delayTime}");
|
_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);
|
var delayed = EnsureComp<DelayedStartRuleComponent>(ruleEntity);
|
||||||
delayed.RuleStartTime = _gameTiming.CurTime + (delayTime);
|
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)}");
|
_sawmill.Info($"Started game rule {ToPrettyString(ruleEntity)}");
|
||||||
_adminLogger.Add(LogType.EventStarted, $"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)
|
if (shell.Player != null)
|
||||||
{
|
{
|
||||||
_adminLogger.Add(LogType.EventStarted, $"{shell.Player} tried to add game rule [{rule}] via command");
|
_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
|
else
|
||||||
{
|
{
|
||||||
@@ -306,6 +338,7 @@ public sealed partial class GameTicker
|
|||||||
// Start rule if we're already in the middle of a round
|
// Start rule if we're already in the middle of a round
|
||||||
if(RunLevel == GameRunLevel.InRound)
|
if(RunLevel == GameRunLevel.InRound)
|
||||||
StartGameRule(ent);
|
StartGameRule(ent);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -349,5 +382,42 @@ public sealed partial class GameTicker
|
|||||||
ClearGameRules();
|
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
|
#endregion
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
|
using System.Linq;
|
||||||
using Content.Server.Database;
|
using Content.Server.Database;
|
||||||
|
using Content.Shared.Administration;
|
||||||
using Content.Shared.CCVar;
|
using Content.Shared.CCVar;
|
||||||
using Content.Shared.GameTicking;
|
using Content.Shared.GameTicking;
|
||||||
using Content.Shared.GameWindow;
|
using Content.Shared.GameWindow;
|
||||||
@@ -196,6 +198,15 @@ namespace Content.Server.GameTicking
|
|||||||
_playerGameStatuses[session.UserId] = PlayerGameStatus.JoinedGame;
|
_playerGameStatuses[session.UserId] = PlayerGameStatus.JoinedGame;
|
||||||
_db.AddRoundPlayers(RoundId, session.UserId);
|
_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);
|
RaiseNetworkEvent(new TickerJoinGameEvent(), session.Channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,6 @@ public sealed class SecretRuleSystem : GameRuleSystem<SecretRuleComponent>
|
|||||||
|
|
||||||
Log.Info($"Selected {preset.ID} as the secret preset.");
|
Log.Info($"Selected {preset.ID} as the secret preset.");
|
||||||
_adminLogger.Add(LogType.EventStarted, $"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)
|
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