RustTip

OnPlayerChat

OxideCarbonPlayer

Called when a player chats.

void OnPlayerChat(BasePlayer player, string message, ConVar.Chat.ChatChannel channel)
Works — the game method in this build is the one the hook was written for.

Parameters

player
BasePlayer
message
string
channel
ConVar.Chat.ChatChannel

Return value

voidBehaviour is not described.

Example

private void OnPlayerChat(BasePlayer player, string message, ConVar.Chat.ChatChannel channel)
{
    Puts("OnPlayerChat");
}

Works in both Oxide and Carbon: Carbon loads Oxide plugins as is.

Where it is called

Oxide core (Oxide.Rust)
RustCore::IOnPlayerChat(ulong playerId, string playerName, string message, Chat.ChatChannel channel, BasePlayer basePlayer)

Oxide core code — the hook is called from here

// …
    // Check if using Rust+ app
    if (basePlayer == null || !basePlayer.IsConnected)
    {
        // Call offline chat hook
        return Interface.CallHook("OnPlayerOfflineChat", playerId, playerName, message, channel);
    }

    // Call hooks for plugins
    object chatSpecific = Interface.CallHook("OnPlayerChat", basePlayer, message, channel);
    object chatCovalence = Interface.CallHook("OnUserChat", basePlayer.IPlayer, message);
    return chatSpecific is null ? chatCovalence : chatSpecific;
}

Injection point

Rust.opj (Oxide)
void ConVar.Chat.<sayAs>d__22.MoveNext()

Injected internal hook IOnPlayerChat — this hook is called by its handler in the Oxide/Carbon core

WorksReturnBehavior: UseArgumentStringArgumentBehavior: UseArgumentString (this.userId, this.username, this.<strChatText>5__2, this.targetChannel, this.player => l1)Assembly-CSharp.dll

Where it is called (this branch's game code)

// …
if (<strChatText>5__2.Length > 128)
{
	<strChatText>5__2 = <strChatText>5__2.Substring(0, 128);
}
if (<strChatText>5__2.Length <= 0)
{
	result = false;
}
Interface.CallHook("IOnPlayerChat", this.userId, this.username, this.<strChatText>5__2, this.targetChannel, this.player => l1);
else if (<strChatText>5__2.StartsWith("/") || <strChatText>5__2.StartsWith("\\"))
{
	result = false;
}
else
{
	<strChatText>5__2 = <strChatText>5__2.EscapeRichText();
	if (!Server.emojiOwnershipCheck || !<strChatText>5__2.Contains(":") || !(player != null))
// …

Sources: Rust.opj from OxideMod/Oxide.Rust (MIT) and hook metadata of the Carbon documentation (MIT). Method code is decompiled from this branch's server.