From fbdb70894196d6b121835df6ee760a4453943648 Mon Sep 17 00:00:00 2001 From: miniduikboot Date: Tue, 27 Jan 2026 22:17:03 +0100 Subject: [PATCH] Implement host chat commands On January 21 Innersloth released a document that details a few new features. One of these are host chat commands: any chat message that starts with "/cmd" is forwarded to the host and to the host only. Implement this feature in Impostor too for implementation parity. For more info, see their GitHub page: https://github.com/Innersloth-LLC/AmongUsModdingInformation --- .../Events/Game/Player/IPlayerChatEvent.cs | 9 +++++- .../Events/Game/Player/PlayerChatEvent.cs | 4 ++- .../Net/Inner/Objects/InnerPlayerControl.cs | 28 ++++++++++++++++++- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/Impostor.Api/Events/Game/Player/IPlayerChatEvent.cs b/src/Impostor.Api/Events/Game/Player/IPlayerChatEvent.cs index 9147010..c3143e1 100644 --- a/src/Impostor.Api/Events/Game/Player/IPlayerChatEvent.cs +++ b/src/Impostor.Api/Events/Game/Player/IPlayerChatEvent.cs @@ -1,4 +1,4 @@ -namespace Impostor.Api.Events.Player +namespace Impostor.Api.Events.Player { public interface IPlayerChatEvent : IPlayerEvent, IEventCancelable { @@ -6,5 +6,12 @@ /// Gets the message sent by the player. /// string Message { get; } + + /// + /// Gets or sets a value indicating whether the message is sent to + /// all players (true) or only to the host (false). + /// To not send this message at all, cancel this event instead. + /// + bool SendToAllPlayers { get; set; } } } diff --git a/src/Impostor.Server/Events/Game/Player/PlayerChatEvent.cs b/src/Impostor.Server/Events/Game/Player/PlayerChatEvent.cs index 34ec95e..44ce179 100644 --- a/src/Impostor.Server/Events/Game/Player/PlayerChatEvent.cs +++ b/src/Impostor.Server/Events/Game/Player/PlayerChatEvent.cs @@ -1,4 +1,4 @@ -using Impostor.Api.Events.Player; +using Impostor.Api.Events.Player; using Impostor.Api.Games; using Impostor.Api.Net; using Impostor.Api.Net.Inner.Objects; @@ -24,5 +24,7 @@ namespace Impostor.Server.Events.Player public string Message { get; } public bool IsCancelled { get; set; } + + public bool SendToAllPlayers { get; set; } = true; } } diff --git a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs index fb49b74..c4cab7c 100644 --- a/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs +++ b/src/Impostor.Server/Net/Inner/Objects/InnerPlayerControl.cs @@ -1183,9 +1183,35 @@ namespace Impostor.Server.Net.Inner.Objects private async ValueTask HandleSendChat(ClientPlayer sender, string message) { var @event = new PlayerChatEvent(Game, sender, this, message); + + // See https://github.com/Innersloth-LLC/AmongUsModdingInformation?tab=readme-ov-file#chat-commands + // Details not mentioned: + // - If the host sends a message that starts with /cmd, it is sent to all players + // - If the message starts with " /cmd" (note the space) it is sent to all players + if (Game.IsHostAuthoritive && !sender.IsHost && message.StartsWith("/cmd")) + { + @event.SendToAllPlayers = false; + } + await _eventManager.CallAsync(@event); - return !@event.IsCancelled; + if (@event.IsCancelled) + { + return false; + } + else if (@event.SendToAllPlayers == false) + { + if (Game.Host != null) + { + await SendChatToPlayerAsync(message, Game.Host.Character); + } + + return false; + } + else + { + return true; + } } private async ValueTask HandleStartMeeting(byte targetId) -- 2.39.5