Files
wwdpublic/Content.Shared/Chat/MsgChatMessage.cs
RedFoxIV aed54f75fb Add Chatstack (#1422)
# Description

Chatstack.

Can be changed/disabled in settings, and the chat automatically updates
to reflect the change.
Does not interfere with filters, etc.
Also updated ChatMessage class and serverside IChatManager with a new
IgnoreChatStack bool option, default false.

Currently is limited to looking up to 3 messages behind, only because I
feel off adding a textbox to the options.

---

# TODO

- [x] Make sure it works
- [x] Add it to settings
---

<details><summary><h1>Media</h1></summary>
<p>

![image](https://github.com/user-attachments/assets/e020bb35-3bac-4620-80d1-3dbd9dee2d1c)

[ee.webm](https://github.com/user-attachments/assets/bf1c92f0-b52a-47a0-b142-70b1ee5003cc)

</p>
</details>

---

# Changelog

🆑
- add: Chatstack. Look for it in Options under "General -
Accessibility".

---------

Co-authored-by: sleepyyapril <123355664+sleepyyapril@users.noreply.github.com>

(cherry picked from commit 78edbab4308bcef190fe387d36df79d90200e084)
2025-01-14 01:19:23 +03:00

75 lines
2.6 KiB
C#

using System.IO;
using JetBrains.Annotations;
using Lidgren.Network;
using Robust.Shared.Network;
using Robust.Shared.Serialization;
using Robust.Shared.Utility;
namespace Content.Shared.Chat
{
[Serializable, NetSerializable]
public sealed class ChatMessage
{
public ChatChannel Channel;
public string Message;
public string WrappedMessage;
public NetEntity SenderEntity;
/// <summary>
/// Identifier sent when <see cref="SenderEntity"/> is <see cref="NetEntity.Invalid"/>
/// if this was sent by a player to assign a key to the sender of this message.
/// This is unique per sender.
/// </summary>
public int? SenderKey;
public bool HideChat;
public Color? MessageColorOverride;
public string? AudioPath;
public float AudioVolume;
public bool IgnoreChatStack;
[NonSerialized]
public bool Read;
public ChatMessage(ChatChannel channel, string message, string wrappedMessage, NetEntity source, int? senderKey, bool hideChat = false, Color? colorOverride = null, string? audioPath = null, float audioVolume = 0, bool ignoreChatStack = false)
{
Channel = channel;
Message = message;
WrappedMessage = wrappedMessage;
SenderEntity = source;
SenderKey = senderKey;
HideChat = hideChat;
MessageColorOverride = colorOverride;
AudioPath = audioPath;
AudioVolume = audioVolume;
IgnoreChatStack = ignoreChatStack;
}
}
/// <summary>
/// Sent from server to client to notify the client about a new chat message.
/// </summary>
[UsedImplicitly]
public sealed class MsgChatMessage : NetMessage
{
public override MsgGroups MsgGroup => MsgGroups.Command;
public ChatMessage Message = default!;
public override void ReadFromBuffer(NetIncomingMessage buffer, IRobustSerializer serializer)
{
var length = buffer.ReadVariableInt32();
using var stream = new MemoryStream(length);
buffer.ReadAlignedMemory(stream, length);
serializer.DeserializeDirect(stream, out Message);
}
public override void WriteToBuffer(NetOutgoingMessage buffer, IRobustSerializer serializer)
{
var stream = new MemoryStream();
serializer.SerializeDirect(stream, Message);
buffer.WriteVariableInt32((int) stream.Length);
buffer.Write(stream.AsSpan());
}
}
}