Remove StoredChatMessage (#12623)
This commit is contained in:
@@ -1,51 +0,0 @@
|
|||||||
using Content.Shared.Chat;
|
|
||||||
using Robust.Shared.Log;
|
|
||||||
using Robust.Shared.Maths;
|
|
||||||
|
|
||||||
namespace Content.Client.Chat
|
|
||||||
{
|
|
||||||
public sealed class StoredChatMessage
|
|
||||||
{
|
|
||||||
// TODO Make me reflected with respect to MsgChatMessage
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Client's own copies of chat messages used in filtering locally
|
|
||||||
/// </summary>
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Actual Message contents, i.e. words
|
|
||||||
/// </summary>
|
|
||||||
public string Message { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Message channel, used for filtering
|
|
||||||
/// </summary>
|
|
||||||
public ChatChannel Channel { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Modified message with some wrapping text. E.g. 'Joe says: "HELP!"'
|
|
||||||
/// </summary>
|
|
||||||
public string WrappedMessage { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The override color of the message
|
|
||||||
/// </summary>
|
|
||||||
public Color MessageColorOverride { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Whether the user has read this message at least once.
|
|
||||||
/// </summary>
|
|
||||||
public bool Read { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constructor to copy a net message into stored client variety
|
|
||||||
/// </summary>
|
|
||||||
public StoredChatMessage(MsgChatMessage netMsg)
|
|
||||||
{
|
|
||||||
Message = netMsg.Message;
|
|
||||||
Channel = netMsg.Channel;
|
|
||||||
WrappedMessage = netMsg.WrappedMessage;
|
|
||||||
MessageColorOverride = netMsg.MessageColorOverride;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -109,6 +109,7 @@ public sealed class ChatUIController : UIController
|
|||||||
= new();
|
= new();
|
||||||
|
|
||||||
private readonly HashSet<ChatBox> _chats = new();
|
private readonly HashSet<ChatBox> _chats = new();
|
||||||
|
public IReadOnlySet<ChatBox> Chats => _chats;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The max amount of characters an entity can send in one message
|
/// The max amount of characters an entity can send in one message
|
||||||
@@ -121,7 +122,7 @@ public sealed class ChatUIController : UIController
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private readonly Dictionary<ChatChannel, int> _unreadMessages = new();
|
private readonly Dictionary<ChatChannel, int> _unreadMessages = new();
|
||||||
|
|
||||||
public readonly List<StoredChatMessage> History = new();
|
public readonly List<ChatMessage> History = new();
|
||||||
|
|
||||||
// Maintains which channels a client should be able to filter (for showing in the chatbox)
|
// Maintains which channels a client should be able to filter (for showing in the chatbox)
|
||||||
// and select (for attempting to send on).
|
// and select (for attempting to send on).
|
||||||
@@ -142,7 +143,7 @@ public sealed class ChatUIController : UIController
|
|||||||
public event Action<ChatChannel>? FilterableChannelsChanged;
|
public event Action<ChatChannel>? FilterableChannelsChanged;
|
||||||
public event Action<ChatSelectChannel>? SelectableChannelsChanged;
|
public event Action<ChatSelectChannel>? SelectableChannelsChanged;
|
||||||
public event Action<ChatChannel, int?>? UnreadMessageCountsUpdated;
|
public event Action<ChatChannel, int?>? UnreadMessageCountsUpdated;
|
||||||
public event Action<StoredChatMessage>? MessageAdded;
|
public event Action<ChatMessage>? MessageAdded;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -285,7 +286,7 @@ public sealed class ChatUIController : UIController
|
|||||||
UpdateChannelPermissions();
|
UpdateChannelPermissions();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddSpeechBubble(MsgChatMessage msg, SpeechBubble.SpeechType speechType)
|
private void AddSpeechBubble(ChatMessage msg, SpeechBubble.SpeechType speechType)
|
||||||
{
|
{
|
||||||
if (!_entities.EntityExists(msg.SenderEntity))
|
if (!_entities.EntityExists(msg.SenderEntity))
|
||||||
{
|
{
|
||||||
@@ -635,18 +636,19 @@ public sealed class ChatUIController : UIController
|
|||||||
box.ChatInput.Input.ReleaseKeyboardFocus();
|
box.ChatInput.Input.ReleaseKeyboardFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnChatMessage(MsgChatMessage msg)
|
private void OnChatMessage(MsgChatMessage message) => ProcessChatMessage(message.Message);
|
||||||
|
|
||||||
|
public void ProcessChatMessage(ChatMessage msg)
|
||||||
{
|
{
|
||||||
// Log all incoming chat to repopulate when filter is un-toggled
|
// Log all incoming chat to repopulate when filter is un-toggled
|
||||||
if (!msg.HideChat)
|
if (!msg.HideChat)
|
||||||
{
|
{
|
||||||
var storedMessage = new StoredChatMessage(msg);
|
History.Add(msg);
|
||||||
History.Add(storedMessage);
|
MessageAdded?.Invoke(msg);
|
||||||
MessageAdded?.Invoke(storedMessage);
|
|
||||||
|
|
||||||
if (!storedMessage.Read)
|
if (!msg.Read)
|
||||||
{
|
{
|
||||||
_sawmill.Debug($"Message filtered: {storedMessage.Channel}: {storedMessage.Message}");
|
_sawmill.Debug($"Message filtered: {msg.Channel}: {msg.Message}");
|
||||||
if (!_unreadMessages.TryGetValue(msg.Channel, out var count))
|
if (!_unreadMessages.TryGetValue(msg.Channel, out var count))
|
||||||
count = 0;
|
count = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public partial class ChatBox : UIWidget
|
|||||||
_controller.SendMessage(this, SelectedChannel);
|
_controller.SendMessage(this, SelectedChannel);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnMessageAdded(StoredChatMessage msg)
|
private void OnMessageAdded(ChatMessage msg)
|
||||||
{
|
{
|
||||||
Logger.DebugS("chat", $"{msg.Channel}: {msg.Message}");
|
Logger.DebugS("chat", $"{msg.Channel}: {msg.Message}");
|
||||||
if (!ChatInput.FilterButton.ChatFilterPopup.IsActive(msg.Channel))
|
if (!ChatInput.FilterButton.ChatFilterPopup.IsActive(msg.Channel))
|
||||||
@@ -54,8 +54,8 @@ public partial class ChatBox : UIWidget
|
|||||||
|
|
||||||
msg.Read = true;
|
msg.Read = true;
|
||||||
|
|
||||||
var color = msg.MessageColorOverride != Color.Transparent
|
var color = msg.MessageColorOverride != null
|
||||||
? msg.MessageColorOverride
|
? msg.MessageColorOverride.Value
|
||||||
: msg.Channel.TextColor();
|
: msg.Channel.TextColor();
|
||||||
|
|
||||||
AddLine(msg.WrappedMessage, color);
|
AddLine(msg.WrappedMessage, color);
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ using Robust.Shared.Configuration;
|
|||||||
using Robust.Shared.Map;
|
using Robust.Shared.Map;
|
||||||
using Robust.Shared.Network;
|
using Robust.Shared.Network;
|
||||||
using Robust.Shared.Player;
|
using Robust.Shared.Player;
|
||||||
|
using Robust.Shared.Replays;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
|
|
||||||
namespace Content.Server.Chat.Managers
|
namespace Content.Server.Chat.Managers
|
||||||
@@ -30,15 +31,13 @@ namespace Content.Server.Chat.Managers
|
|||||||
{ "revolutionary", "#aa00ff" }
|
{ "revolutionary", "#aa00ff" }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
[Dependency] private readonly IReplayRecordingManager _replay = default!;
|
||||||
[Dependency] private readonly IServerNetManager _netManager = default!;
|
[Dependency] private readonly IServerNetManager _netManager = default!;
|
||||||
[Dependency] private readonly IMoMMILink _mommiLink = default!;
|
[Dependency] private readonly IMoMMILink _mommiLink = default!;
|
||||||
[Dependency] private readonly IAdminManager _adminManager = default!;
|
[Dependency] private readonly IAdminManager _adminManager = default!;
|
||||||
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
||||||
[Dependency] private readonly IServerPreferencesManager _preferencesManager = default!;
|
[Dependency] private readonly IServerPreferencesManager _preferencesManager = default!;
|
||||||
[Dependency] private readonly IConfigurationManager _configurationManager = default!;
|
[Dependency] private readonly IConfigurationManager _configurationManager = default!;
|
||||||
[Dependency] private readonly IEntityManager _entityManager = default!;
|
|
||||||
|
|
||||||
private StationSystem _stationSystem = default!;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The maximum length a player-sent message can be sent
|
/// The maximum length a player-sent message can be sent
|
||||||
@@ -50,7 +49,6 @@ namespace Content.Server.Chat.Managers
|
|||||||
|
|
||||||
public void Initialize()
|
public void Initialize()
|
||||||
{
|
{
|
||||||
_stationSystem = _entityManager.EntitySysManager.GetEntitySystem<StationSystem>();
|
|
||||||
_netManager.RegisterNetMessage<MsgChatMessage>();
|
_netManager.RegisterNetMessage<MsgChatMessage>();
|
||||||
|
|
||||||
_configurationManager.OnValueChanged(CCVars.OocEnabled, OnOocEnabledChanged, true);
|
_configurationManager.OnValueChanged(CCVars.OocEnabled, OnOocEnabledChanged, true);
|
||||||
@@ -78,7 +76,7 @@ namespace Content.Server.Chat.Managers
|
|||||||
public void DispatchServerAnnouncement(string message, Color? colorOverride = null)
|
public void DispatchServerAnnouncement(string message, Color? colorOverride = null)
|
||||||
{
|
{
|
||||||
var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", FormattedMessage.EscapeText(message)));
|
var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", FormattedMessage.EscapeText(message)));
|
||||||
ChatMessageToAll(ChatChannel.Server, message, wrappedMessage, colorOverride);
|
ChatMessageToAll(ChatChannel.Server, message, wrappedMessage, EntityUid.Invalid, hideChat: false, recordReplay: true, colorOverride: colorOverride);
|
||||||
Logger.InfoS("SERVER", message);
|
Logger.InfoS("SERVER", message);
|
||||||
|
|
||||||
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Server announcement: {message}");
|
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Server announcement: {message}");
|
||||||
@@ -99,7 +97,7 @@ namespace Content.Server.Chat.Managers
|
|||||||
var wrappedMessage = Loc.GetString("chat-manager-send-admin-announcement-wrap-message",
|
var wrappedMessage = Loc.GetString("chat-manager-send-admin-announcement-wrap-message",
|
||||||
("adminChannelName", Loc.GetString("chat-manager-admin-channel-name")), ("message", FormattedMessage.EscapeText(message)));
|
("adminChannelName", Loc.GetString("chat-manager-admin-channel-name")), ("message", FormattedMessage.EscapeText(message)));
|
||||||
|
|
||||||
ChatMessageToMany(ChatChannel.Admin, message, wrappedMessage, default, false, clients);
|
ChatMessageToMany(ChatChannel.Admin, message, wrappedMessage, default, false, true, clients);
|
||||||
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Admin announcement from {message}: {message}");
|
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Admin announcement from {message}: {message}");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -110,7 +108,7 @@ namespace Content.Server.Chat.Managers
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var wrappedMessage = Loc.GetString("chat-manager-send-hook-ooc-wrap-message", ("senderName", sender), ("message", FormattedMessage.EscapeText(message)));
|
var wrappedMessage = Loc.GetString("chat-manager-send-hook-ooc-wrap-message", ("senderName", sender), ("message", FormattedMessage.EscapeText(message)));
|
||||||
ChatMessageToAll(ChatChannel.OOC, message, wrappedMessage);
|
ChatMessageToAll(ChatChannel.OOC, message, wrappedMessage, source: EntityUid.Invalid, hideChat: false, recordReplay: true);
|
||||||
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Hook OOC from {sender}: {message}");
|
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Hook OOC from {sender}: {message}");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,7 +174,7 @@ namespace Content.Server.Chat.Managers
|
|||||||
}
|
}
|
||||||
|
|
||||||
//TODO: player.Name color, this will need to change the structure of the MsgChatMessage
|
//TODO: player.Name color, this will need to change the structure of the MsgChatMessage
|
||||||
ChatMessageToAll(ChatChannel.OOC, message, wrappedMessage, colorOverride);
|
ChatMessageToAll(ChatChannel.OOC, message, wrappedMessage, EntityUid.Invalid, hideChat: false, recordReplay: true, colorOverride);
|
||||||
_mommiLink.SendOOCMessage(player.Name, message);
|
_mommiLink.SendOOCMessage(player.Name, message);
|
||||||
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"OOC from {player:Player}: {message}");
|
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"OOC from {player:Player}: {message}");
|
||||||
}
|
}
|
||||||
@@ -193,7 +191,7 @@ namespace Content.Server.Chat.Managers
|
|||||||
var wrappedMessage = Loc.GetString("chat-manager-send-admin-chat-wrap-message",
|
var wrappedMessage = Loc.GetString("chat-manager-send-admin-chat-wrap-message",
|
||||||
("adminChannelName", Loc.GetString("chat-manager-admin-channel-name")),
|
("adminChannelName", Loc.GetString("chat-manager-admin-channel-name")),
|
||||||
("playerName", player.Name), ("message", FormattedMessage.EscapeText(message)));
|
("playerName", player.Name), ("message", FormattedMessage.EscapeText(message)));
|
||||||
ChatMessageToMany(ChatChannel.Admin, message, wrappedMessage, default, false, clients.ToList());
|
ChatMessageToMany(ChatChannel.Admin, message, wrappedMessage, default, false, true, clients.ToList());
|
||||||
|
|
||||||
_adminLogger.Add(LogType.Chat, $"Admin chat from {player:Player}: {message}");
|
_adminLogger.Add(LogType.Chat, $"Admin chat from {player:Player}: {message}");
|
||||||
}
|
}
|
||||||
@@ -202,40 +200,32 @@ namespace Content.Server.Chat.Managers
|
|||||||
|
|
||||||
#region Utility
|
#region Utility
|
||||||
|
|
||||||
public void ChatMessageToOne(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat, INetChannel client, Color? colorOverride = null)
|
public void ChatMessageToOne(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat, INetChannel client, Color? colorOverride = null, bool recordReplay = false)
|
||||||
{
|
{
|
||||||
var msg = new MsgChatMessage();
|
var msg = new ChatMessage(channel, message, wrappedMessage, source, hideChat, colorOverride);
|
||||||
msg.Channel = channel;
|
_netManager.ServerSendMessage(new MsgChatMessage() { Message = msg }, client);
|
||||||
msg.Message = message;
|
|
||||||
msg.WrappedMessage = wrappedMessage;
|
if (recordReplay)
|
||||||
msg.SenderEntity = source;
|
_replay.QueueReplayMessage(msg);
|
||||||
msg.HideChat = hideChat;
|
|
||||||
if (colorOverride != null)
|
|
||||||
{
|
|
||||||
msg.MessageColorOverride = colorOverride.Value;
|
|
||||||
}
|
|
||||||
_netManager.ServerSendMessage(msg, client);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ChatMessageToMany(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat, IEnumerable<INetChannel> clients, Color? colorOverride = null)
|
public void ChatMessageToMany(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat, bool recordReplay, IEnumerable<INetChannel> clients, Color? colorOverride = null)
|
||||||
|
=> ChatMessageToMany(channel, message, wrappedMessage, source, hideChat, recordReplay, clients.ToList(), colorOverride);
|
||||||
|
|
||||||
|
public void ChatMessageToMany(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat, bool recordReplay, List<INetChannel> clients, Color? colorOverride = null)
|
||||||
{
|
{
|
||||||
var msg = new MsgChatMessage();
|
var msg = new ChatMessage(channel, message, wrappedMessage, source, hideChat, colorOverride);
|
||||||
msg.Channel = channel;
|
_netManager.ServerSendToMany(new MsgChatMessage() { Message = msg }, clients);
|
||||||
msg.Message = message;
|
|
||||||
msg.WrappedMessage = wrappedMessage;
|
if (recordReplay)
|
||||||
msg.SenderEntity = source;
|
_replay.QueueReplayMessage(msg);
|
||||||
msg.HideChat = hideChat;
|
|
||||||
if (colorOverride != null)
|
|
||||||
{
|
|
||||||
msg.MessageColorOverride = colorOverride.Value;
|
|
||||||
}
|
|
||||||
_netManager.ServerSendToMany(msg, clients.ToList());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ChatMessageToManyFiltered(Filter filter, ChatChannel channel, string message, string wrappedMessage, EntityUid source,
|
public void ChatMessageToManyFiltered(Filter filter, ChatChannel channel, string message, string wrappedMessage, EntityUid source,
|
||||||
bool hideChat, Color? colorOverride = null)
|
bool hideChat, bool recordReplay, Color? colorOverride = null)
|
||||||
{
|
{
|
||||||
if (!filter.Recipients.Any()) return;
|
if (!recordReplay && !filter.Recipients.Any())
|
||||||
|
return;
|
||||||
|
|
||||||
var clients = new List<INetChannel>();
|
var clients = new List<INetChannel>();
|
||||||
foreach (var recipient in filter.Recipients)
|
foreach (var recipient in filter.Recipients)
|
||||||
@@ -243,20 +233,16 @@ namespace Content.Server.Chat.Managers
|
|||||||
clients.Add(recipient.ConnectedClient);
|
clients.Add(recipient.ConnectedClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
ChatMessageToMany(channel, message, wrappedMessage, source, hideChat, clients, colorOverride);
|
ChatMessageToMany(channel, message, wrappedMessage, source, hideChat, recordReplay, clients, colorOverride);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ChatMessageToAll(ChatChannel channel, string message, string wrappedMessage, Color? colorOverride = null)
|
public void ChatMessageToAll(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat, bool recordReplay, Color? colorOverride = null)
|
||||||
{
|
{
|
||||||
var msg = new MsgChatMessage();
|
var msg = new ChatMessage(channel, message, wrappedMessage, source, hideChat, colorOverride);
|
||||||
msg.Channel = channel;
|
_netManager.ServerSendToAll(new MsgChatMessage() { Message = msg });
|
||||||
msg.Message = message;
|
|
||||||
msg.WrappedMessage = wrappedMessage;
|
if (recordReplay)
|
||||||
if (colorOverride != null)
|
_replay.QueueReplayMessage(msg);
|
||||||
{
|
|
||||||
msg.MessageColorOverride = colorOverride.Value;
|
|
||||||
}
|
|
||||||
_netManager.ServerSendToAll(msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool MessageCharacterLimit(IPlayerSession? player, string message)
|
public bool MessageCharacterLimit(IPlayerSession? player, string message)
|
||||||
|
|||||||
@@ -24,11 +24,14 @@ namespace Content.Server.Chat.Managers
|
|||||||
void SendAdminAnnouncement(string message);
|
void SendAdminAnnouncement(string message);
|
||||||
|
|
||||||
void ChatMessageToOne(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat,
|
void ChatMessageToOne(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat,
|
||||||
INetChannel client, Color? colorOverride = null);
|
INetChannel client, Color? colorOverride = null, bool recordReplay = false);
|
||||||
void ChatMessageToMany(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat,
|
|
||||||
|
void ChatMessageToMany(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat, bool recordReplay,
|
||||||
IEnumerable<INetChannel> clients, Color? colorOverride = null);
|
IEnumerable<INetChannel> clients, Color? colorOverride = null);
|
||||||
void ChatMessageToManyFiltered(Filter filter, ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat, Color? colorOverride);
|
|
||||||
void ChatMessageToAll(ChatChannel channel, string message, string wrappedMessage, Color? colorOverride = null);
|
void ChatMessageToManyFiltered(Filter filter, ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat, bool recordReplay, Color? colorOverride);
|
||||||
|
|
||||||
|
void ChatMessageToAll(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat, bool recordReplay, Color? colorOverride = null);
|
||||||
|
|
||||||
bool MessageCharacterLimit(IPlayerSession player, string message);
|
bool MessageCharacterLimit(IPlayerSession player, string message);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,24 +1,22 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using Content.Server.Administration.Logs;
|
using Content.Server.Administration.Logs;
|
||||||
using Content.Server.Administration.Managers;
|
using Content.Server.Administration.Managers;
|
||||||
using Content.Server.Chat.Managers;
|
using Content.Server.Chat.Managers;
|
||||||
using Content.Server.GameTicking;
|
using Content.Server.GameTicking;
|
||||||
using Content.Server.Ghost.Components;
|
using Content.Server.Ghost.Components;
|
||||||
using Content.Server.Mind.Components;
|
using Content.Server.MobState;
|
||||||
using Content.Server.Players;
|
using Content.Server.Players;
|
||||||
using Content.Server.Popups;
|
using Content.Server.Popups;
|
||||||
using Content.Server.Radio.EntitySystems;
|
|
||||||
using Content.Server.Station.Components;
|
using Content.Server.Station.Components;
|
||||||
using Content.Server.Station.Systems;
|
using Content.Server.Station.Systems;
|
||||||
using Content.Server.MobState;
|
|
||||||
using Content.Shared.ActionBlocker;
|
using Content.Shared.ActionBlocker;
|
||||||
using Content.Shared.CCVar;
|
using Content.Shared.CCVar;
|
||||||
using Content.Shared.Chat;
|
using Content.Shared.Chat;
|
||||||
using Content.Shared.Database;
|
using Content.Shared.Database;
|
||||||
using Content.Shared.IdentityManagement;
|
using Content.Shared.IdentityManagement;
|
||||||
using Content.Shared.Inventory;
|
using Content.Shared.Inventory;
|
||||||
|
using Content.Shared.Radio;
|
||||||
using Robust.Server.GameObjects;
|
using Robust.Server.GameObjects;
|
||||||
using Robust.Server.Player;
|
using Robust.Server.Player;
|
||||||
using Robust.Shared.Audio;
|
using Robust.Shared.Audio;
|
||||||
@@ -29,9 +27,8 @@ using Robust.Shared.Player;
|
|||||||
using Robust.Shared.Players;
|
using Robust.Shared.Players;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Random;
|
using Robust.Shared.Random;
|
||||||
|
using Robust.Shared.Replays;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
using Content.Server.Speech.EntitySystems;
|
|
||||||
using Content.Shared.Radio;
|
|
||||||
|
|
||||||
namespace Content.Server.Chat.Systems;
|
namespace Content.Server.Chat.Systems;
|
||||||
|
|
||||||
@@ -41,6 +38,7 @@ namespace Content.Server.Chat.Systems;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public sealed partial class ChatSystem : SharedChatSystem
|
public sealed partial class ChatSystem : SharedChatSystem
|
||||||
{
|
{
|
||||||
|
[Dependency] private readonly IReplayRecordingManager _replay = default!;
|
||||||
[Dependency] private readonly IConfigurationManager _configurationManager = default!;
|
[Dependency] private readonly IConfigurationManager _configurationManager = default!;
|
||||||
[Dependency] private readonly IChatManager _chatManager = default!;
|
[Dependency] private readonly IChatManager _chatManager = default!;
|
||||||
[Dependency] private readonly IChatSanitizationManager _sanitizer = default!;
|
[Dependency] private readonly IChatSanitizationManager _sanitizer = default!;
|
||||||
@@ -119,7 +117,7 @@ public sealed partial class ChatSystem : SharedChatSystem
|
|||||||
/// <param name="player">The player doing the speaking</param>
|
/// <param name="player">The player doing the speaking</param>
|
||||||
/// <param name="nameOverride">The name to use for the speaking entity. Usually this should just be modified via <see cref="TransformSpeakerNameEvent"/>. If this is set, the event will not get raised.</param>
|
/// <param name="nameOverride">The name to use for the speaking entity. Usually this should just be modified via <see cref="TransformSpeakerNameEvent"/>. If this is set, the event will not get raised.</param>
|
||||||
public void TrySendInGameICMessage(EntityUid source, string message, InGameICChatType desiredType, bool hideChat, bool hideGlobalGhostChat = false,
|
public void TrySendInGameICMessage(EntityUid source, string message, InGameICChatType desiredType, bool hideChat, bool hideGlobalGhostChat = false,
|
||||||
IConsoleShell? shell = null, IPlayerSession? player = null, string? nameOverride = null)
|
IConsoleShell? shell = null, IPlayerSession? player = null, string? nameOverride = null, bool checkRadioPrefix = true)
|
||||||
{
|
{
|
||||||
if (HasComp<GhostComponent>(source))
|
if (HasComp<GhostComponent>(source))
|
||||||
{
|
{
|
||||||
@@ -157,7 +155,7 @@ public sealed partial class ChatSystem : SharedChatSystem
|
|||||||
switch (desiredType)
|
switch (desiredType)
|
||||||
{
|
{
|
||||||
case InGameICChatType.Speak:
|
case InGameICChatType.Speak:
|
||||||
SendEntitySpeak(source, message, hideChat, hideGlobalGhostChat, nameOverride);
|
SendEntitySpeak(source, message, hideChat, hideGlobalGhostChat, nameOverride, checkRadioPrefix);
|
||||||
break;
|
break;
|
||||||
case InGameICChatType.Whisper:
|
case InGameICChatType.Whisper:
|
||||||
SendEntityWhisper(source, message, hideChat, hideGlobalGhostChat, null, nameOverride);
|
SendEntityWhisper(source, message, hideChat, hideGlobalGhostChat, null, nameOverride);
|
||||||
@@ -211,7 +209,7 @@ public sealed partial class ChatSystem : SharedChatSystem
|
|||||||
bool playSound = true, SoundSpecifier? announcementSound = null, Color? colorOverride = null)
|
bool playSound = true, SoundSpecifier? announcementSound = null, Color? colorOverride = null)
|
||||||
{
|
{
|
||||||
var wrappedMessage = Loc.GetString("chat-manager-sender-announcement-wrap-message", ("sender", sender), ("message", FormattedMessage.EscapeText(message)));
|
var wrappedMessage = Loc.GetString("chat-manager-sender-announcement-wrap-message", ("sender", sender), ("message", FormattedMessage.EscapeText(message)));
|
||||||
_chatManager.ChatMessageToAll(ChatChannel.Radio, message, wrappedMessage, colorOverride);
|
_chatManager.ChatMessageToAll(ChatChannel.Radio, message, wrappedMessage, default, false, true, colorOverride);
|
||||||
if (playSound)
|
if (playSound)
|
||||||
{
|
{
|
||||||
SoundSystem.Play(announcementSound?.GetSound() ?? DefaultAnnouncementSound, Filter.Broadcast(), AudioParams.Default.WithVolume(-2f));
|
SoundSystem.Play(announcementSound?.GetSound() ?? DefaultAnnouncementSound, Filter.Broadcast(), AudioParams.Default.WithVolume(-2f));
|
||||||
@@ -243,7 +241,7 @@ public sealed partial class ChatSystem : SharedChatSystem
|
|||||||
|
|
||||||
var filter = _stationSystem.GetInStation(stationDataComp);
|
var filter = _stationSystem.GetInStation(stationDataComp);
|
||||||
|
|
||||||
_chatManager.ChatMessageToManyFiltered(filter, ChatChannel.Radio, message, wrappedMessage, source, false, colorOverride);
|
_chatManager.ChatMessageToManyFiltered(filter, ChatChannel.Radio, message, wrappedMessage, source, false, true, colorOverride);
|
||||||
|
|
||||||
if (playDefaultSound)
|
if (playDefaultSound)
|
||||||
{
|
{
|
||||||
@@ -257,12 +255,18 @@ public sealed partial class ChatSystem : SharedChatSystem
|
|||||||
|
|
||||||
#region Private API
|
#region Private API
|
||||||
|
|
||||||
private void SendEntitySpeak(EntityUid source, string originalMessage, bool hideChat, bool hideGlobalGhostChat, string? nameOverride)
|
private void SendEntitySpeak(EntityUid source, string originalMessage, bool hideChat, bool hideGlobalGhostChat, string? nameOverride, bool checkRadioPrefix)
|
||||||
{
|
{
|
||||||
if (!_actionBlocker.CanSpeak(source))
|
if (!_actionBlocker.CanSpeak(source))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var (message, channel) = GetRadioPrefix(source, originalMessage);
|
RadioChannelPrototype? channel = null;
|
||||||
|
string message;
|
||||||
|
|
||||||
|
if (checkRadioPrefix)
|
||||||
|
(message, channel) = GetRadioPrefix(source, originalMessage);
|
||||||
|
else
|
||||||
|
message = originalMessage;
|
||||||
|
|
||||||
if (channel != null)
|
if (channel != null)
|
||||||
{
|
{
|
||||||
@@ -331,6 +335,15 @@ public sealed partial class ChatSystem : SharedChatSystem
|
|||||||
}
|
}
|
||||||
name = FormattedMessage.EscapeText(name);
|
name = FormattedMessage.EscapeText(name);
|
||||||
|
|
||||||
|
|
||||||
|
var wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message",
|
||||||
|
("entityName", name), ("message", FormattedMessage.EscapeText(message)));
|
||||||
|
|
||||||
|
|
||||||
|
var wrappedobfuscatedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message",
|
||||||
|
("entityName", name), ("message", FormattedMessage.EscapeText(obfuscatedMessage)));
|
||||||
|
|
||||||
|
|
||||||
foreach (var (session, data) in GetRecipients(source, VoiceRange))
|
foreach (var (session, data) in GetRecipients(source, VoiceRange))
|
||||||
{
|
{
|
||||||
if (session.AttachedEntity is not { Valid: true } playerEntity)
|
if (session.AttachedEntity is not { Valid: true } playerEntity)
|
||||||
@@ -340,21 +353,12 @@ public sealed partial class ChatSystem : SharedChatSystem
|
|||||||
continue; // Won't get logged to chat, and ghosts are too far away to see the pop-up, so we just won't send it to them.
|
continue; // Won't get logged to chat, and ghosts are too far away to see the pop-up, so we just won't send it to them.
|
||||||
|
|
||||||
if (data.Range <= WhisperRange)
|
if (data.Range <= WhisperRange)
|
||||||
{
|
|
||||||
var wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message",
|
|
||||||
("entityName", name), ("message", FormattedMessage.EscapeText(message)));
|
|
||||||
|
|
||||||
_chatManager.ChatMessageToOne(ChatChannel.Whisper, message, wrappedMessage, source, data.HideChatOverride ?? hideChat, session.ConnectedClient);
|
_chatManager.ChatMessageToOne(ChatChannel.Whisper, message, wrappedMessage, source, data.HideChatOverride ?? hideChat, session.ConnectedClient);
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
_chatManager.ChatMessageToOne(ChatChannel.Whisper, obfuscatedMessage, wrappedobfuscatedMessage, source, data.HideChatOverride ?? hideChat, session.ConnectedClient);
|
||||||
var wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message",
|
}
|
||||||
("entityName", name), ("message", FormattedMessage.EscapeText(obfuscatedMessage)));
|
|
||||||
|
|
||||||
_chatManager.ChatMessageToOne(ChatChannel.Whisper, obfuscatedMessage, wrappedMessage, source, data.HideChatOverride ?? hideChat,
|
_replay.QueueReplayMessage(new ChatMessage(ChatChannel.Whisper, message, wrappedMessage, source, hideChat));
|
||||||
session.ConnectedClient);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var ev = new EntitySpokeEvent(source, message, channel, obfuscatedMessage);
|
var ev = new EntitySpokeEvent(source, message, channel, obfuscatedMessage);
|
||||||
RaiseLocalEvent(source, ev, true);
|
RaiseLocalEvent(source, ev, true);
|
||||||
@@ -421,7 +425,7 @@ public sealed partial class ChatSystem : SharedChatSystem
|
|||||||
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Dead chat from {player:Player}: {message}");
|
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Dead chat from {player:Player}: {message}");
|
||||||
}
|
}
|
||||||
|
|
||||||
_chatManager.ChatMessageToMany(ChatChannel.Dead, message, wrappedMessage, source, hideChat, clients.ToList());
|
_chatManager.ChatMessageToMany(ChatChannel.Dead, message, wrappedMessage, source, hideChat, false, clients.ToList());
|
||||||
|
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
@@ -438,6 +442,8 @@ public sealed partial class ChatSystem : SharedChatSystem
|
|||||||
var entHideChat = data.HideChatOverride ?? (hideChat || hideGlobalGhostChat && data.Observer && data.Range < 0);
|
var entHideChat = data.HideChatOverride ?? (hideChat || hideGlobalGhostChat && data.Observer && data.Range < 0);
|
||||||
_chatManager.ChatMessageToOne(channel, message, wrappedMessage, source, entHideChat, session.ConnectedClient);
|
_chatManager.ChatMessageToOne(channel, message, wrappedMessage, source, entHideChat, session.ConnectedClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_replay.QueueReplayMessage(new ChatMessage(channel, message, wrappedMessage, source, hideChat));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -85,10 +85,7 @@ namespace Content.Server.GameTicking
|
|||||||
|
|
||||||
private void SendServerMessage(string message)
|
private void SendServerMessage(string message)
|
||||||
{
|
{
|
||||||
var msg = new MsgChatMessage();
|
_chatManager.ChatMessageToAll(ChatChannel.Server, message, "", default, false, true);
|
||||||
msg.Channel = ChatChannel.Server;
|
|
||||||
msg.Message = message;
|
|
||||||
IoCManager.Resolve<IServerNetManager>().ServerSendToAll(msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Update(float frameTime)
|
public override void Update(float frameTime)
|
||||||
|
|||||||
@@ -306,6 +306,7 @@ public sealed class ZombieRuleSystem : GameRuleSystem
|
|||||||
_initialInfectedNames.Add(inCharacterName, mind.Session.Name);
|
_initialInfectedNames.Add(inCharacterName, mind.Session.Name);
|
||||||
|
|
||||||
// I went all the way to ChatManager.cs and all i got was this lousy T-shirt
|
// I went all the way to ChatManager.cs and all i got was this lousy T-shirt
|
||||||
|
// You got a free T-shirt!?!?
|
||||||
_chatManager.ChatMessageToOne(Shared.Chat.ChatChannel.Server, message,
|
_chatManager.ChatMessageToOne(Shared.Chat.ChatChannel.Server, message,
|
||||||
wrappedMessage, default, false, mind.Session.ConnectedClient, Color.Plum);
|
wrappedMessage, default, false, mind.Session.ConnectedClient, Color.Plum);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -143,6 +143,6 @@ public sealed class RadioDeviceSystem : EntitySystem
|
|||||||
("originalName", nameEv.Name));
|
("originalName", nameEv.Name));
|
||||||
|
|
||||||
var hideGlobalGhostChat = true; // log to chat so people can identity the speaker/source, but avoid clogging ghost chat if there are many radios
|
var hideGlobalGhostChat = true; // log to chat so people can identity the speaker/source, but avoid clogging ghost chat if there are many radios
|
||||||
_chat.TrySendInGameICMessage(uid, args.Message, InGameICChatType.Speak, false, nameOverride: name, hideGlobalGhostChat:hideGlobalGhostChat);
|
_chat.TrySendInGameICMessage(uid, args.Message, InGameICChatType.Speak, false, nameOverride: name, hideGlobalGhostChat:hideGlobalGhostChat, checkRadioPrefix: false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,22 +1,23 @@
|
|||||||
using Content.Server.Chat.Systems;
|
using Content.Server.Chat.Systems;
|
||||||
using Content.Server.Radio.Components;
|
using Content.Server.Radio.Components;
|
||||||
using Content.Server.Speech;
|
|
||||||
using Content.Server.VoiceMask;
|
using Content.Server.VoiceMask;
|
||||||
using Content.Shared.Chat;
|
using Content.Shared.Chat;
|
||||||
using Content.Shared.IdentityManagement;
|
using Content.Shared.IdentityManagement;
|
||||||
using Content.Shared.Radio;
|
using Content.Shared.Radio;
|
||||||
using Robust.Server.GameObjects;
|
using Robust.Server.GameObjects;
|
||||||
using Robust.Shared.Network;
|
using Robust.Shared.Network;
|
||||||
|
using Robust.Shared.Replays;
|
||||||
using Robust.Shared.Utility;
|
using Robust.Shared.Utility;
|
||||||
|
|
||||||
namespace Content.Server.Radio.EntitySystems;
|
namespace Content.Server.Radio.EntitySystems;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This system handles radio speakers and microphones (which together form a hand-held radio).
|
/// This system handles intrinsic radios and the general process of converting radio messages into chat messages.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public sealed class RadioSystem : EntitySystem
|
public sealed class RadioSystem : EntitySystem
|
||||||
{
|
{
|
||||||
[Dependency] private readonly INetManager _netMan = default!;
|
[Dependency] private readonly INetManager _netMan = default!;
|
||||||
|
[Dependency] private readonly IReplayRecordingManager _replay = default!;
|
||||||
|
|
||||||
// set used to prevent radio feedback loops.
|
// set used to prevent radio feedback loops.
|
||||||
private readonly HashSet<string> _messages = new();
|
private readonly HashSet<string> _messages = new();
|
||||||
@@ -56,13 +57,12 @@ public sealed class RadioSystem : EntitySystem
|
|||||||
name = FormattedMessage.EscapeText(name);
|
name = FormattedMessage.EscapeText(name);
|
||||||
|
|
||||||
// most radios are relayed to chat, so lets parse the chat message beforehand
|
// most radios are relayed to chat, so lets parse the chat message beforehand
|
||||||
var chatMsg = new MsgChatMessage
|
var chat = new ChatMessage(
|
||||||
{
|
ChatChannel.Radio,
|
||||||
Channel = ChatChannel.Radio,
|
message,
|
||||||
Message = message,
|
Loc.GetString("chat-radio-message-wrap", ("color", channel.Color), ("channel", $"\\[{channel.LocalizedName}\\]"), ("name", name), ("message", FormattedMessage.EscapeText(message))),
|
||||||
//Square brackets are added here to avoid issues with escaping
|
EntityUid.Invalid);
|
||||||
WrappedMessage = Loc.GetString("chat-radio-message-wrap", ("color", channel.Color), ("channel", $"\\[{channel.LocalizedName}\\]"), ("name", name), ("message", FormattedMessage.EscapeText(message)))
|
var chatMsg = new MsgChatMessage { Message = chat };
|
||||||
};
|
|
||||||
|
|
||||||
var ev = new RadioReceiveEvent(message, source, channel, chatMsg);
|
var ev = new RadioReceiveEvent(message, source, channel, chatMsg);
|
||||||
var attemptEv = new RadioReceiveAttemptEvent(message, source, channel);
|
var attemptEv = new RadioReceiveAttemptEvent(message, source, channel);
|
||||||
@@ -84,6 +84,7 @@ public sealed class RadioSystem : EntitySystem
|
|||||||
RaiseLocalEvent(radio.Owner, ev);
|
RaiseLocalEvent(radio.Owner, ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_replay.QueueReplayMessage(chat);
|
||||||
_messages.Remove(message);
|
_messages.Remove(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,35 @@ using JetBrains.Annotations;
|
|||||||
using Lidgren.Network;
|
using Lidgren.Network;
|
||||||
using Robust.Shared.Network;
|
using Robust.Shared.Network;
|
||||||
using Robust.Shared.Serialization;
|
using Robust.Shared.Serialization;
|
||||||
|
using Robust.Shared.Utility;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
namespace Content.Shared.Chat
|
namespace Content.Shared.Chat
|
||||||
{
|
{
|
||||||
|
[Serializable, NetSerializable]
|
||||||
|
public sealed class ChatMessage
|
||||||
|
{
|
||||||
|
public ChatChannel Channel;
|
||||||
|
public string Message;
|
||||||
|
public string WrappedMessage;
|
||||||
|
public EntityUid SenderEntity;
|
||||||
|
public bool HideChat;
|
||||||
|
public Color? MessageColorOverride;
|
||||||
|
|
||||||
|
[NonSerialized]
|
||||||
|
public bool Read;
|
||||||
|
|
||||||
|
public ChatMessage(ChatChannel channel, string message, string wrappedMessage, EntityUid source, bool hideChat = false, Color? colorOverride = null)
|
||||||
|
{
|
||||||
|
Channel = channel;
|
||||||
|
Message = message;
|
||||||
|
WrappedMessage = wrappedMessage;
|
||||||
|
SenderEntity = source;
|
||||||
|
HideChat = hideChat;
|
||||||
|
MessageColorOverride = colorOverride;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sent from server to client to notify the client about a new chat message.
|
/// Sent from server to client to notify the client about a new chat message.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -13,73 +39,21 @@ namespace Content.Shared.Chat
|
|||||||
{
|
{
|
||||||
public override MsgGroups MsgGroup => MsgGroups.Command;
|
public override MsgGroups MsgGroup => MsgGroups.Command;
|
||||||
|
|
||||||
/// <summary>
|
public ChatMessage Message = default!;
|
||||||
/// The channel the message is on. This can also change whether certain params are used.
|
|
||||||
/// </summary>
|
|
||||||
public ChatChannel Channel { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The actual message contents.
|
|
||||||
/// </summary>
|
|
||||||
public string Message { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Modified message with some wrapping text. E.g. 'Joe says: "HELP!"'
|
|
||||||
/// </summary>
|
|
||||||
public string WrappedMessage { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The sending entity.
|
|
||||||
/// Only applies to <see cref="ChatChannel.Local"/>, <see cref="ChatChannel.Dead"/> and <see cref="ChatChannel.Emotes"/>.
|
|
||||||
/// </summary>
|
|
||||||
public EntityUid SenderEntity { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The override color of the message
|
|
||||||
/// </summary>
|
|
||||||
public Color MessageColorOverride { get; set; } = Color.Transparent;
|
|
||||||
|
|
||||||
public bool HideChat { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
public override void ReadFromBuffer(NetIncomingMessage buffer, IRobustSerializer serializer)
|
public override void ReadFromBuffer(NetIncomingMessage buffer, IRobustSerializer serializer)
|
||||||
{
|
{
|
||||||
Channel = (ChatChannel) buffer.ReadInt16();
|
var length = buffer.ReadVariableInt32();
|
||||||
Message = buffer.ReadString();
|
using var stream = buffer.ReadAlignedMemory(length);
|
||||||
WrappedMessage = buffer.ReadString();
|
serializer.DeserializeDirect(stream, out Message);
|
||||||
|
|
||||||
switch (Channel)
|
|
||||||
{
|
|
||||||
case ChatChannel.Local:
|
|
||||||
case ChatChannel.Whisper:
|
|
||||||
case ChatChannel.Dead:
|
|
||||||
case ChatChannel.Admin:
|
|
||||||
case ChatChannel.Emotes:
|
|
||||||
SenderEntity = buffer.ReadEntityUid();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
MessageColorOverride = buffer.ReadColor();
|
|
||||||
HideChat = buffer.ReadBoolean();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void WriteToBuffer(NetOutgoingMessage buffer, IRobustSerializer serializer)
|
public override void WriteToBuffer(NetOutgoingMessage buffer, IRobustSerializer serializer)
|
||||||
{
|
{
|
||||||
buffer.Write((short)Channel);
|
var stream = new MemoryStream();
|
||||||
buffer.Write(Message);
|
serializer.SerializeDirect(stream, Message);
|
||||||
buffer.Write(WrappedMessage);
|
buffer.WriteVariableInt32((int) stream.Length);
|
||||||
|
buffer.Write(stream.AsSpan());
|
||||||
switch (Channel)
|
|
||||||
{
|
|
||||||
case ChatChannel.Local:
|
|
||||||
case ChatChannel.Whisper:
|
|
||||||
case ChatChannel.Dead:
|
|
||||||
case ChatChannel.Admin:
|
|
||||||
case ChatChannel.Emotes:
|
|
||||||
buffer.Write(SenderEntity);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
buffer.Write(MessageColorOverride);
|
|
||||||
buffer.Write(HideChat);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user