---
title: Light Update
description: "Play 0x30, server → client."
---

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

Updates the sky and block light data for the chunk at `chunkX`, `chunkZ`. The bit masks say which sections have data or are fully empty, and the arrays hold the 2048-byte nibble arrays per section. The client replaces the light data for those sections and rerenders them.

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

## Fields

| Field | Type | Notes |
|---|---|---|
| `chunkX` | VarInt |  |
| `chunkZ` | VarInt |  |
| `skyLightMask` | Array |  |
| `blockLightMask` | Array |  |
| `emptySkyLightMask` | Array |  |
| `emptyBlockLightMask` | Array |  |
| `skyLight` | Array |  |
| `blockLight` | Array |  |

## Send it

```ts
await client.sendPacket("LightUpdate", {
  chunkX: /* VarInt */,
  chunkZ: /* VarInt */,
  skyLightMask: /* Array */,
  blockLightMask: /* Array */,
  emptySkyLightMask: /* Array */,
  emptyBlockLightMask: /* Array */,
  skyLight: /* Array */,
  blockLight: /* Array */,
});
```

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

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