---
title: Level Chunk With Light
description: "Play 0x2D, server → client."
---

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

Sends the block data, heightmaps, block entities, and light data for one chunk column at `chunkX`, `chunkZ`. The server sends it for every chunk in the player's view distance, usually inside a chunk batch. The client loads or replaces the chunk and renders it.

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

## Fields

| Field | Type | Notes |
|---|---|---|
| `chunkX` | Number |  |
| `chunkZ` | Number |  |
| `chunkData` | Byte[] |  |
| `blockEntities` | Struct[] | Optional. Shape: `Array<{ x: number; z: number; y: number; type: number; nbtData: unknown }>`. |
| `heightmaps` | Struct[] | Optional. Shape: `Array<{ type: number; data: Array<bigint \| number \| string> }>`. |
| `skyLightMask` | Long[] | Optional. Shape: `Array<bigint \| number \| string>`. |
| `blockLightMask` | Long[] | Optional. Shape: `Array<bigint \| number \| string>`. |
| `emptySkyLightMask` | Long[] | Optional. Shape: `Array<bigint \| number \| string>`. |
| `emptyBlockLightMask` | Long[] | Optional. Shape: `Array<bigint \| number \| string>`. |
| `skyLight` | Byte[][] | Optional. |
| `blockLight` | Byte[][] | Optional. |

## Send it

```ts
await client.sendPacket("LevelChunkWithLight", {
  chunkX: /* Number */,
  chunkZ: /* Number */,
  chunkData: /* Byte[] */,
  blockEntities: /* Struct[] */,
  heightmaps: /* Struct[] */,
  skyLightMask: /* Long[] */,
  blockLightMask: /* Long[] */,
  emptySkyLightMask: /* Long[] */,
  emptyBlockLightMask: /* Long[] */,
  skyLight: /* Byte[][] */,
  blockLight: /* Byte[][] */,
});
```

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

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