---
title: Map Item Data
description: "Play 0x33, server → client."
---

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

Updates a map item identified by `itemDamage` (the map id) with its `scale`, `locked` flag, icons such as player markers, and an optional rectangle of color `data` given by `columns`, `rows`, `x`, and `y`. The server sends it when a player holds a map or the map content changes. The client updates the map texture.

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

## Fields

| Field | Type | Notes |
|---|---|---|
| `itemDamage` | VarInt | Map ID; match the filled map item's `map_id` component. |
| `scale` | Byte | Map scale, 0 to 4. |
| `locked` | Boolean | Whether the map is locked. |
| `icons` | MapIcon[] or null | Optional map markers; `null` omits the icon list. |
| `columns` | UByte | Image width; `0` omits the remaining image fields. |
| `rows` | UByte | Image height; present when `columns` is nonzero. |
| `x` | UByte | Left edge of the image region; present when `columns` is nonzero. |
| `y` | UByte | Top edge of the image region; present when `columns` is nonzero. |
| `data` | Byte[] | Length-prefixed palette indices, row by row; present when `columns` is nonzero. |

### Icon entries

When `icons` is an array, each entry has these fields:

| Field | Wire type | Meaning |
|---|---|---|
| `type` | VarInt | Map decoration type ID; `subscriptionType` is accepted when writing. |
| `x` | Byte | Signed horizontal map coordinate. |
| `z` | Byte | Signed vertical map coordinate. |
| `direction` | UByte | Marker direction. |
| `displayName` | Optional anonymous NBT | Marker label; omit or use `null` when absent. |

`icons: null` writes no icon list, while `icons: []` writes an empty list. With `columns: 0`, omit `rows`, `x`, `y`, and `data`; this lets you update the icons without image pixels. With image data, `data.length` must equal `columns * rows` and each byte is a Minecraft map palette index. See [Maps](/docs/maps) for RGB conversion and region bounds.

```ts
const mapId = 1;
await client.sendPacket("MapItemData", {
  itemDamage: mapId,
  scale: 0,
  locked: false,
  icons: [{ type: 0, x: 0, z: 0, direction: 0, displayName: null }],
  columns: 0,
});
```

## Send it

```ts
import { helpers } from "mc-protocol";

const mapId = 1;
await client.sendPacket("SetPlayerInventory", {
  slotId: 0,
  contents: helpers.createMapSlot(mapId, { name: "Red map" }),
});
await client.sendPacket("MapItemData", helpers.createMapPacket(
  mapId,
  Array(128 * 128).fill("#ff0000"),
  { format: "rgb" },
));
```

The map ID must match the `map_id` component of the [filled map slot](/docs/maps#createmapslotmapid-options). The helper converts RGB pixels to palette indices and fills the packet fields. For partial images, icon-only updates, and option details, see [Maps](/docs/maps).

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

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