---
title: Player Info Update
description: "Play 0x46, server → client."
---

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

Adds players to the client's player list or updates their data. The server sends it when a player joins, changes game mode, latency, display name, list visibility, chat session, or similar. The `action` bitmask selects which fields are present per entry; the client uses the data for the tab list, skins, and chat signature verification.

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

## Fields

| Field | Type | Notes |
|---|---|---|
| `action` | UByte |  |
| `data` | Array |  |

## Send it

```ts
const uuid = "3f4e9c2a1b5d4a7c8e6f0a1b2c3d4e5f"; // 32 hex chars, no dashes
const none = {
  add_player: false, initialize_chat: false, update_game_mode: false, update_listed: false,
  update_latency: false, update_display_name: false, update_hat: false, update_list_order: false,
};

// Add a player to the tab list. Do this before spawning the player entity.
await client.sendPacket("PlayerInfoUpdate", {
  action: { ...none, add_player: true, update_game_mode: true, update_listed: true, update_latency: true },
  data: [{
    uuid,
    player: { name: "Steve", properties: [] },
    gamemode: 0,
    listed: 1,
    latency: 50,
  }],
});

// Later: change the shown name only.
await client.sendPacket("PlayerInfoUpdate", {
  action: { ...none, update_display_name: true },
  data: [{ uuid, displayName: { text: "Steve", color: "gold" } }],
});
```

`action` is a set of flags and every flag must be present (`true` or `false`); the writer throws on a missing one. Each entry in `data` carries the fields for exactly the flags that are set: `player` for `add_player`, `gamemode` for `update_game_mode`, `listed` for `update_listed`, `latency` for `update_latency`, `displayName` for `update_display_name`, `showHat` for `update_hat`, `listPriority` for `update_list_order`, `chatSession` for `initialize_chat`. `properties` holds the skin textures. Remove players with `PlayerInfoRemove`.

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

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