if (_admin.HasFlag(AdminFlags.Admin))
{
FilterableChannels |= ChatChannel.Admin;
+ FilterableChannels |= ChatChannel.AdminAlert;
FilterableChannels |= ChatChannel.AdminChat;
CanSendChannels |= ChatSelectChannel.Admin;
}
ChatChannel.OOC,
ChatChannel.Dead,
ChatChannel.Admin,
+ ChatChannel.AdminAlert,
ChatChannel.AdminChat,
ChatChannel.Server
};
using System.Linq;
+using Content.Server.Administration.Systems;
using Content.Server.AME.Components;
+using Content.Server.Chat.Managers;
using Content.Server.Explosion.EntitySystems;
using Content.Server.NodeContainer.NodeGroups;
using Content.Server.NodeContainer.Nodes;
[Dependency] private readonly IEntityManager _entMan = default!;
+ [Dependency] private readonly IChatManager _chat = default!;
+
public AMEControllerComponent? MasterController => _masterController;
private readonly List<AMEShieldComponent> _cores = new();
if (instability != 0)
{
overloading = true;
+ var integrityCheck = 100;
foreach(AMEShieldComponent core in _cores)
{
+ var oldIntegrity = core.CoreIntegrity;
core.CoreIntegrity -= instability;
+
+ if (oldIntegrity > 95
+ && core.CoreIntegrity <= 95
+ && core.CoreIntegrity < integrityCheck)
+ integrityCheck = core.CoreIntegrity;
}
+
+ // Admin alert
+ if (integrityCheck != 100 && _masterController != null)
+ _chat.SendAdminAlert($"AME overloading: {_entMan.ToPrettyString(_masterController.Owner)}");
}
}
// Note the float conversions. The maths will completely fail if not done using floats.
using System.Linq;
using Content.Server.Administration.Logs;
+using Content.Server.Administration.Systems;
+using Content.Server.Chat.Managers;
using Content.Server.Mind.Components;
using Content.Server.NodeContainer;
using Content.Server.Power.Components;
[Dependency] private readonly IEntityManager _entities = default!;
[Dependency] private readonly IEntitySystemManager _sysMan = default!;
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
+ [Dependency] private readonly IChatManager _chat = default!;
[ViewVariables] private BoundUserInterface? UserInterface => Owner.GetUIOrNull(AMEControllerUiKey.Key);
private bool _injecting;
if (msg.Button == UiButton.ToggleInjection)
_adminLogger.Add(LogType.Action, LogImpact.Extreme, $"{_entities.ToPrettyString(mindComponent.Owner):player} has set the AME to {humanReadableState}");
+
+ // Admin alert
+ if (GetCoreCount() * 2 == InjectionAmount - 2 && msg.Button == UiButton.IncreaseFuel)
+ _chat.SendAdminAlert(player, $"increased AME over safe limit to {InjectionAmount}", mindComponent);
}
GetAMENodeGroup()?.UpdateCoreVisuals();
}
}
+ public PlayerInfo? GetCachedPlayerInfo(NetUserId? netUserId)
+ {
+ if (netUserId == null)
+ return null;
+
+ _playerList.TryGetValue(netUserId.Value, out var value);
+ return value ?? null;
+ }
+
private void OnIdentityChanged(IdentityChangedEvent ev)
{
if (!TryComp<ActorComponent>(ev.CharacterEntity, out var actor))
using System.Linq;
using Content.Server.Administration.Logs;
using Content.Server.Administration.Managers;
+using Content.Server.Administration.Systems;
+using Content.Server.Mind.Components;
using Content.Server.MoMMI;
using Content.Server.Preferences.Managers;
using Content.Server.Station.Systems;
[Dependency] private readonly IServerPreferencesManager _preferencesManager = default!;
[Dependency] private readonly IConfigurationManager _configurationManager = default!;
[Dependency] private readonly INetConfigurationManager _netConfigManager = default!;
+ [Dependency] private readonly IEntityManager _entityManager = default!;
/// <summary>
/// The maximum length a player-sent message can be sent
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Admin announcement: {message}");
}
+ public void SendAdminAlert(string message)
+ {
+ var clients = _adminManager.ActiveAdmins.Select(p => p.ConnectedClient);
+
+ var wrappedMessage = Loc.GetString("chat-manager-send-admin-announcement-wrap-message",
+ ("adminChannelName", Loc.GetString("chat-manager-admin-channel-name")), ("message", FormattedMessage.EscapeText(message)));
+
+ ChatMessageToMany(ChatChannel.AdminAlert, message, wrappedMessage, default, false, true, clients);
+ }
+
+ public void SendAdminAlert(EntityUid player, string message, MindComponent? mindComponent = null)
+ {
+ if(mindComponent == null && !_entityManager.TryGetComponent(player, out mindComponent))
+ {
+ SendAdminAlert(message);
+ return;
+ }
+
+ var adminSystem = _entityManager.System<AdminSystem>();
+ var antag = mindComponent.Mind!.UserId != null
+ && (adminSystem.GetCachedPlayerInfo(mindComponent.Mind!.UserId.Value)?.Antag ?? false);
+
+ SendAdminAlert($"{mindComponent.Mind!.Session?.Name}{(antag ? " (ANTAG)" : "")} {message}");
+ }
+
public void SendHookOOC(string sender, string message)
{
if (!_oocEnabled && _configurationManager.GetCVar(CCVars.DisablingOOCDisablesRelay))
+using Content.Server.Mind.Components;
using Content.Shared.Chat;
using Robust.Server.Player;
using Robust.Shared.Network;
void SendHookOOC(string sender, string message);
void SendAdminAnnouncement(string message);
+ void SendAdminAlert(string message);
+ void SendAdminAlert(EntityUid player, string message, MindComponent? mindComponent = null);
void ChatMessageToOne(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat,
INetChannel client, Color? colorOverride = null, bool recordReplay = false, string? audioPath = null, float audioVolume = 0);
/// </summary>
Admin = 1 << 10,
+ /// <summary>
+ /// Admin alerts, messages likely of elevated importance to admins
+ /// </summary>
+ AdminAlert = 1 << 11,
+
/// <summary>
/// Admin chat
/// </summary>
- AdminChat = 1 << 11,
+ AdminChat = 1 << 12,
/// <summary>
/// Unspecified.
/// </summary>
- Unspecified = 1 << 12,
+ Unspecified = 1 << 13,
/// <summary>
/// Channels considered to be IC.
ChatChannel.OOC => Color.LightSkyBlue,
ChatChannel.Dead => Color.MediumPurple,
ChatChannel.Admin => Color.Red,
+ ChatChannel.AdminAlert => Color.Red,
ChatChannel.AdminChat => Color.HotPink,
ChatChannel.Whisper => Color.DarkGray,
_ => Color.LightGray
hud-chatbox-select-channel-Radio = Radio
hud-chatbox-channel-Admin = Admin Misc
+hud-chatbox-channel-AdminAlert = Admin Alert
hud-chatbox-channel-AdminChat = Admin Chat
hud-chatbox-channel-Dead = Dead
hud-chatbox-channel-Emotes = Emotes