_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);
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;
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()
_consoleHost.UnregisterCommand("addgamerule");
_consoleHost.UnregisterCommand("endgamerule");
_consoleHost.UnregisterCommand("cleargamerules");
+ _consoleHost.UnregisterCommand("listgamerules");
}
/// <summary>
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;
}
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);
}
}
- _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)}");
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
{
// Start rule if we're already in the middle of a round
if(RunLevel == GameRunLevel.InRound)
StartGameRule(ent);
+
}
}
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
}
+using System.Linq;
using Content.Server.Database;
+using Content.Shared.Administration;
using Content.Shared.CCVar;
using Content.Shared.GameTicking;
using Content.Shared.GameWindow;
_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);
}