---
title: Player Chat
description: "Play 0x41, server → client."
---

`play` · `0x41` · **clientbound** (server → client)

Delivers a signed chat message from the player `senderUuid`, with the `plainMessage`, its `signature`, timestamp, salt, and references to previous messages for the signature chain. It also carries the chat `type` and display names, and an optional filtered or unsigned variant. The client verifies the signature and displays the message with the chat type's formatting.

Sent by the server, read by the client. Listen for it with `client.on("PlayerChat", (data) => …)` on the receiving side.

## Fields

| Field | Type | Notes |
|---|---|---|
| `globalIndex` | VarInt |  |
| `senderUuid` | UUID |  |
| `index` | VarInt |  |
| `signature` | Optional |  |
| `plainMessage` | String |  |
| `timestamp` | Long |  |
| `salt` | Long |  |
| `previousMessages` | previousMessages |  |
| `unsignedChatContent` | Optional |  |
| `filterType` | VarInt |  |
| `filterTypeMask` | Struct |  |
| `type` | ChatTypesHolder | also `subscriptionType` |
| `networkName` | NBT |  |
| `networkTargetName` | Optional |  |

## Send it

```ts
await client.sendPacket("PlayerChat", {
  globalIndex: /* VarInt */,
  senderUuid: /* UUID */,
  index: /* VarInt */,
  signature: /* Optional */,
  plainMessage: /* String */,
  timestamp: /* Long */,
  salt: /* Long */,
  previousMessages: /* previousMessages */,
  unsignedChatContent: /* Optional */,
  filterType: /* VarInt */,
  filterTypeMask: /* Struct */,
  type: /* ChatTypesHolder */,
  networkName: /* NBT */,
  networkTargetName: /* Optional */,
});
```

Field aliases listed under Notes are accepted as alternative keys when writing.

Source: [`src/Core/Versions/776/Packets/play/clientbound/PlayerChat.ts`](https://github.com/GDLev/mc-protocol/blob/master/src/Core/Versions/776/Packets/play/clientbound/PlayerChat.ts)
