<!-- GENERATED FILE — do not edit by hand. Rendered by packages/server/src/tools/protocoldoc.ts from protocoldoc.template.md + the live @game/shared registries. Regenerate: npm -w @game/server run protocoldoc -->

# Tessera Wire Protocol — Bot & External Client Reference

**Live game:** https://tessera.kimhwan.kr · **WebSocket:** `wss://tessera.kimhwan.kr/ws` ·
**Protocol version:** `7`

This document is the complete, self-contained reference for talking to a Tessera
server over its native wire protocol. It is written so that a program — or a
large language model — can implement a fully functional bot from this file
alone: connect, authenticate, stream the world, move, mine, build, craft,
fight, trade and chat, exactly like the official browser client does.

> 한국어 요약: 이 문서는 Tessera 게임 서버의 통신 프로토콜 전체 명세입니다. 이
> 문서 하나로 외부 서비스/봇(자동 여행·채굴·건축 봇, 사람처럼 행동하는 NPC 봇
> 등)을 만들 수 있도록 모든 메시지, 바이너리 프레임 바이트 배치, 이동 검증
> 규칙, 게임 데이터 테이블을 담고 있습니다. LLM에 이 문서를 그대로 입력해
> 봇 코드를 생성시키는 용도를 지원합니다.

Everything here is generated from, or checked against, the game's actual source
registries on every release (`npm -w @game/server run protocoldoc`), so the
tables below cannot silently drift from the live server.

---

## 1. Transport at a glance

- **One WebSocket** per client, path **`/ws`** (`wss://tessera.kimhwan.kr/ws` in
  production, `ws://localhost:8080/ws` against a local dev server).
- **Text frames = JSON control messages.** Every JSON message is an object with
  a string tag field **`t`** (see §6/§7).
- **Binary frames = hot/bulk data** (world chunks, entity snapshots, block
  deltas, item drops, your movement input). The **first byte is an opcode**
  (§5). All multi-byte values are **little-endian**.
- The server is **authoritative**: you *propose* (moves, edits, crafts), the
  server *validates and broadcasts the truth*. Your bot must accept server
  corrections (§8).
- Server loops: simulation tick at **30 Hz**, entity snapshots at
  **30 Hz** (both are also echoed to you in `welcome`).

### Hard limits (you will be disconnected)

| Limit | Value | What happens |
|---|---|---|
| Messages per connection | **120/s** (text + binary combined) | socket closed (code 4000, reason `rate limit`) |
| Concurrent sockets per IP | 24 | new socket closed (code 4002, `too many connections`) |
| Max inbound frame size | 1 MiB | socket destroyed by the WS library |
| Time to send `hello` after connect | 10 s | closed (`join timeout`) |
| Wrong `protocol` in `hello` | must equal `7` | `kick` with `reload: true`, then closed |

### Keepalive

- The server sends a **WebSocket protocol-level ping every 15 s**. Standard WS
  libraries (browser, `ws` for Node, etc.) answer automatically. If your client
  doesn't answer, the socket is terminated at the next sweep (≤ 30 s).
- The server also sends an application-level JSON **`ping`** (~every 3 s).
  Reply with **`pong`**, echoing `time`, so your latency shows up correctly
  (`ping` also carries `rtt`, your last measured round-trip, back to you).
- If you buffer too much unread data (> 4 MiB server-side), **chunk streaming
  pauses** for you until you catch up; snapshots keep flowing.

---

## 2. Accounts and joining

You can play three ways:

- **Transient guest** — hello with no token; nothing persists after disconnect.
- **Guest account** — `POST /api/guest` mints a real account row (no
  email/password) and returns a JWT. Present it on hello and your inventory,
  position, HP and stats persist across sessions — the token is the *only* key
  to that identity. This is what the web client does for "play as guest". Guest
  accounts unseen for ~30 days are purged.
- **Account** — register/login below; persists the same way and works from any
  device.

A guest account can be **upgraded** to a full account with its progress kept:
pass the guest JWT as `guestToken` on `/api/register` (or start browser OAuth
with `?guest=<JWT>` on the kickoff URL). If the email isn't registered yet, the
guest row is converted in place — same account id, so inventory/position/stats
carry over. If the email already has an account, that account simply logs in
(two played identities are never merged) and the guest identity is left behind.

### HTTP endpoints (same origin as the game)

| Method & path | Body | Response |
|---|---|---|
| `POST /api/register` | `{ "email": "...", "password": "...", "name": "...", "guestToken": "<JWT, optional>" }` | `200 { "token": "<JWT>", "account": { id, name, email, isAdmin } }` or `400 { "error": "..." }` — with a valid `guestToken`, upgrades that guest account in place |
| `POST /api/login` | `{ "email": "...", "password": "..." }` | `200 { token, account }` or `401 { error }` |
| `POST /api/guest` | `{ "name": "..." }` | `200 { token, account }` — a persistent guest account (never admin; `account.email` is synthetic) |
| `POST /api/refresh` | `{ "token": "<JWT>" }` | `200 { token, account }` (a fresh 30-day token for the same account) or `401 { error }` |
| `GET /api/version` | — | `{ "version": "<server build>" }` |
| `GET /health` | — | `ok` |

Tokens expire after 30 days; call `/api/refresh` on startup to stay signed in
(the web client does). Credential endpoints (`register`/`login`/`guest`) are
rate-limited per IP (a burst of ~10 tries, then ~1 per 4 s). OAuth
(GitHub/Google) also exists for browsers, but for bots email+password is the
practical path.

### Join sequence

1. Open the WebSocket to `/ws`.
2. Send (as a **text/JSON** frame):
   ```json
   { "t": "hello", "name": "MyBot", "protocol": 7, "token": "<JWT, optional>" }
   ```
   - `name` is used for guests; with a token, your account name wins. Names are
     sanitized to letters/digits (any script), space, `-`, `_`, max 16 chars.
   - One session per account: logging in again elsewhere kicks the old session
     (`logged in elsewhere`).
3. Receive **`welcome`**:
   ```json
   {
     "t": "welcome",
     "version": "abc1234",        // server build id
     "playerId": 17,               // your entity id (u32, same id space as snapshots)
     "seed": 1234567890,           // world seed (informational)
     "worldgenVersion": 2,         // world content version (absent → 1); ≥2 adds the huge urban cities
     "spawn": { "x": 12.5, "y": 83, "z": -4.5 },
     "inventory": [ { "item": 10, "count": 1, "dur": 60 }, ... ],  // 36 slots
     "armor": [ ...5 slots: helmet, chestplate, leggings, boots, back... ],
     "selectedSlot": 0,            // your restored hotbar selection (0-8) — adopt it
     "players": [ { "id": 3, "name": "someone" }, ... ],  // current roster (excluding you)
     "tickRate": 30,
     "snapshotRate": 30,
     "pvp": false                  // world combat mode (§10.3); may be absent = peaceful
   }
   ```
4. You'll immediately also receive a `time` message, an initial `chat_history`
   page, a `stats` push, and the world will start streaming in as binary
   `Chunk` frames (§5.1) around your spawn.

### Kick reasons you may see

`kick { reason, reload? }` followed by a close: protocol mismatch
(`reload: true` — you're built against an old protocol), banned account,
`logged in elsewhere`, `rate limit`, `join timeout`, `too many connections`.

---

## 3. Units, coordinates and the world model

- Distances are in **blocks** (1 block = 1 m equivalent), time in seconds,
  speeds in blocks/second. **+Y is up.**
- A player position (`x, y, z`) is the **center of the feet**. The player
  collision box is **0.6 wide × 1.8 tall**; the
  camera/eye sits at **feet + 1.62**. While **crouched**
  (Input buttons bit 8, §5.6) the box shrinks to
  **0.6 × 1.4** and the eye drops to
  **feet + 1.2** — a crouched player fits through
  1.5-block gaps and presents a proportionally shorter hitbox. While **prone**
  (Input buttons bit 13, §5.6) the box flattens to
  **0.6 × 0.6** and the eye drops to
  **feet + 0.5** — a prone player crawls through 1-block
  gaps and presents the lowest hitbox band.
- **Yaw/pitch are radians.** The look/forward direction is:
  ```
  forward = ( -sin(yaw)·cos(pitch),  sin(pitch),  -cos(yaw)·cos(pitch) )
  ```
  So `yaw = 0` faces **−Z**, `yaw = π/2` faces **−X**; positive pitch looks up.
- The world is a grid of **chunk columns**: each chunk is
  **16 × 1024 × 16** blocks (x, y, z). Chunk coords:
  `cx = floor(x / 16)`, `cz = floor(z / 16)`.
- Inside a chunk, a block's flat index is
  ```
  index = (y*16 + z_local)*16 + x_local        // = y*256 + z*16 + x
  y = index >> 8 · z_local = (index >> 4) & 15 · x_local = index & 15
  ```
  with `x_local = x - cx*16` (i.e. `((x % 16) + 16) % 16` for negatives).
- Block ids are **u16** values from the table in §13.1. `0` is always Air.
  Sea level is y = 80. Valid block y is `0 .. 1023`.
- **Terrain is deterministic** from `seed`, but the generation algorithm is not
  part of this contract — build your world model from the streamed chunks and
  the `BlockDelta` updates instead.

### What you can see (interest management)

You only ever receive data near you — nothing global leaks:

- **Chunks:** every column within **Chebyshev distance 10 chunks**
  of yours (a 21×21 square), streamed
  nearest-first at up to **8 chunks/tick**. When
  you move away, `ChunkUnload` tells you to drop a column.
- **Entities** (players/mobs/arrows): within **6 chunks**,
  in every snapshot (§5.3).
- **Item drops:** same 6-chunk radius, full list every
  snapshot (§5.5) — treat each frame as the complete truth and prune the rest.
- Block changes (`BlockDelta`) are only sent for chunks you currently have.

---

## 4. Time, weather and day/night

`time` messages arrive ~every 2 s:

```json
{ "t": "time", "phase": 0.52, "day": 132, "storm": false }
```

- `phase` 0..1: 0/1 = midnight, 0.5 = noon. A full day lasts
  **480 s** of real time.
- `day` is the absolute world date (drives seasons: day length, sun path, moon
  phase). Seasonal **sunrise/sunset vary** — night is not a fixed phase window.
- `storm` is the shared server weather.
- Hostile MONSTERS spawn only at night (and only if the admin enabled them). This
  is a shared open world, so the night can't be skipped. Aggressive WILDLIFE
  (wolf/bear/lion/crocodile, §10.5) is part of the persistent biome fauna and
  attacks day or night when you wander into its aggro range.

---

## 5. Binary frames — byte-exact layouts

First byte = opcode. All integers/floats little-endian. Offsets below are from
byte 0 of the frame.

| Opcode | Name | Direction |
|---|---|---|
| `0x01` | Chunk | server → client |
| `0x02` | ChunkUnload | server → client |
| `0x03` | Snapshot | server → client |
| `0x04` | BlockDelta | server → client |
| `0x05` | ItemDrops | server → client |
| `0x10` | Input | client → server |

### 5.1 Chunk (`0x01`) — a full column, RLE-compressed

```
off  size  field
0    u8    op = 0x01
1    i32   cx
5    i32   cz
9    u32   runCount
13   runCount × { u16 count, u16 blockId }
```

Decode by expanding runs in flat-index order into a `Uint16Array` of
**262144** cells (see §3 for the index math). Runs never exceed
65535 cells; long spans just split. The tail of every column is air — a useful
optimization is to remember the highest non-air index while expanding.

### 5.2 ChunkUnload (`0x02`)

```
0 u8 op=0x02 · 1 i32 cx · 5 i32 cz
```
Drop the column (you'll get a fresh `Chunk` if you come back).

### 5.3 Snapshot (`0x03`) — nearby entities, 30×/s

```
off  size  field
0    u8    op = 0x03
1    u16   count
3    count × 45-byte records:
     +0   u32  id          // entity id (players share welcome.playerId's id space)
     +4   f32  x, +8 f32 y, +12 f32 z     // feet position (blocks)
     +16  f32  vx, +20 f32 vy, +24 f32 vz // velocity (blocks/s) for interpolation
     +28  f32  yaw, +32 f32 pitch         // radians
     +36  u16  flags       // bit field, see below (widened u8→u16 in protocol v4)
     +38  u16  hp          // current HP (players are on a 0–100 scale; widened
                           // u8→u16 in protocol v7 — boss HP outgrew 255: 44→45 B)
     +40  u8   kind        // MobKind: 0=player, see §13.5
     +41  u16  held        // ItemId held in hand (0 = none; for rendering)
     +43  u16  back        // ItemId worn on the back (0 = none; jetpack — players
                           // only, for rendering. Added in protocol v5)
```

**You are never in your own snapshot** — your position is whatever you last
sent (or were corrected to). An entity that stops appearing has left your AOI
(or died); expire it after a few missed snapshots.

`flags` bits — for **players**: bits 0–5 mirror the sender's input buttons
(1 forward, 2 back, 4 left, 8 right, 16 jump, 32 sprint), bit 6 = arm-swing,
**bit 7 (128) = dead** — they're on the death screen (§10.4); render a corpse,
not a standing player (the bit clears when they respawn), **bit 8 (256) =
crouched** — render the player squashed to
1.4/1.8 height (the server hit-tests that same
squashed shape), **bit 9 (512) = jetpack thrust** — their back-worn jetpack
(`back` field) burned fuel this tick; draw its exhaust flame, **bit 10
(1024) = mounted** — driving a vehicle (§10.6): a vehicle entity in the same
snapshot shares their exact position (draw them seated on it), **bit 11
(2048) = aiming** — holding a gun down sights (`set_aiming`; only stamped
while a gun is actually held): draw a two-handed aimed stance, **bit 12
(4096) = shield up** — their shield is raised (`set_blocking` + a shield
actually in hand): frontal melee/arrows against them are mostly soaked
(§10.1), **bit 13 (8192) = prone** — render the player lying flat; the server
hit-tests a feet-anchored 0.6/1.8-height band,
**bit 14 (16384) = parachute** — they're gliding under an open canopy (§8.1);
draw a parachute above them.
For **mobs**: bit 5 = baby, bit 6 = swing/attack, bit 7 = dying
(death animation; it will despawn).

### 5.4 BlockDelta (`0x04`) — authoritative world edits

```
off  size  field
0    u8    op = 0x04
1    u16   count
3    count × 14-byte records:
     +0  i32 cx · +4 i32 cz · +8 u32 index · +12 u16 blockId
```

Apply to your copy of that chunk (`index` as in §3). Deltas are batched per
tick and **only cover chunks you have**. This is also how edit *rejections*
reach you: the server echoes the true block back (see §9.1).

### 5.5 ItemDrops (`0x05`) — ground items near you, every snapshot

```
off  size  field
0    u8    op = 0x05
1    u16   count
3    count × 20-byte records:
     +0 u32 id · +4 f32 x · +8 f32 y · +12 f32 z · +16 u16 item · +18 u16 count
```

The **complete** list of drops in your AOI. Replace your local set with it each
frame (an id that disappears was picked up or despawned).

### 5.6 Input (`0x10`) — your movement, client → server

```
off  size  field
0    u8    op = 0x10
1    u32   seq       // strictly increasing; stale/duplicate seq is ignored
5    f32   x
9    f32   y
13   f32   z
17   f32   yaw
21   f32   pitch
25   u16   buttons   // bitmask (widened u8→u16 in protocol v4)
```
27 bytes total. `buttons`: 1 forward, 2 back, 4 left, 8 right, 16 jump,
32 sprint, **256 crouch**, **8192 prone**, **16384 parachute**. Bits 0–5 are
informational (they drive your pose for others); **crouch/prone are
functional**: they lower your collision/hitbox height to 1.4 /
0.6 and your shot origin to feet + 1.2 /
0.5, and
tighten gun spread ×0.6 / ×0.4 — but the
spread bonus only applies while you actually move at that stance's speed
(≤ 2.6×1.5 / ≤ 1.3×1.5 blocks/s; claiming a bit at
sprint speed earns nothing). Don't set both stance bits at once (the official
client never does; the server treats prone as the lower stance). The
**parachute** bit is the canopy-glide state — see §8.1 for what it does (and
what it doesn't let you fake). Send at
~30 Hz while moving (the official client does); you may idle at a
lower rate when stationary. Movement validation: §8.

Example frame — `seq=1`, standing at `(0.5, 83, 0.5)` looking down −Z:
`10 01000000 0000003f 00a6a542 0000003f 00000000 00000000 0100`

---

## 6. JSON messages: client → server

Every message is `{ "t": "<tag>", ... }`. Unknown/malformed messages are
ignored. While **dead** (§10.4) only `respawn`, `pong`, `chat`,
`chat_hist_req`, `set_name`, `stats_query`, `ach_query` are accepted.

| `t` | Fields | Meaning / server-side validation |
|---|---|---|
| `hello` | `name`, `protocol`, `token?` | join (§2). Must be first; must match protocol `7`. |
| `block_edit` | `action:"place"\|"break"`, `x,y,z` (ints), `nx,ny,nz?`, `rot?` | Mine or place at the target cell (§9.1, §9.2). Reach-checked. `rot` (0..3 = +Z/−Z/+X/−X) manually orients a placed stairs / fence-gate / floor-repeater; omitted = auto-orient from the placer's yaw (wall-mounted blocks ignore it). |
| `use_block` | `x,y,z`, `nx,ny,nz?` | Right-click a block: doors/levers/buttons/bed/anvil/enchant table, hoe-till, plant seeds, bucket scoop, flint & steel (§9.6). Reach-checked. Right-clicking a **Sign** replies with `sign_text`; a **Music Player** replies with `music_state`. |
| `sign_edit` | `x,y,z`, `text` | Set the text of the Sign block at the cell. The server sanitizes the text to a single line + caps its length, and gates editing on the land claim (owner/members/admin, or unclaimed land), then echoes a `sign_text`. |
| `music_set` | `x,y,z`, `mml`, `instruments[]`, `loop` | Write the MML score of the Music Player at the cell (claim-gated exactly like `sign_edit`). The server caps the MML length and validates the per-track instrument indices, then echoes a `music_state`. |
| `music_toggle` | `x,y,z`, `play` | Start (`play:true`) or stop the Music Player at the cell (same claim gate). Flips the block to its On/Off variant and broadcasts `music_play` / `music_stop` to nearby players. |
| `use_item` | `slot?` | Use the held item: eat food, equip armour, cast/reel the fishing rod (§9.5). `slot` (inventory index 0..35) uses that slot instead of the held one — e.g. equip armour straight from the inventory. |
| `craft` | `recipeId`, `count?` | Instantly craft a HAND recipe, `count` times (§9.3). Station recipes are rejected here — queue them with `bench_queue`. Answered with `craft_result`. |
| `select_slot` | `slot` (0..8) | Select the active hotbar slot (what you place/attack/use with). |
| `inv_move` | `from`, `to` | Move/merge/swap inventory slots (0..35). |
| `inv_sort` | — | Sort + merge the BAG (slots 9..35) by item category then id; the hotbar is untouched. The refreshed `inventory` push follows. |
| `inv_split` | `from`, `to` (−1 = first empty) | Split half a stack onto a slot. |
| `drop_item` | `all?` | Throw 1 (or the whole stack) of the held item forward. |
| `unequip` | `slot` (0..4) | Take an equipped piece off into a free inventory slot (0 helmet · 1 chestplate · 2 leggings · 3 boots · 4 back). |
| `shoot` | — | LEGACY: fire the held bow at a fixed mid charge along your yaw/pitch (needs an arrow). New code should use `fire` (§10.2). |
| `fire` | `dx,dy,dz`, `ads?` | Fire the held ranged weapon along the given view direction: a gun shot (hitscan, §10.2b), a bow/grenade release (§10.2, §10.2c) or a rocket (§10.2c). Fire rate / ammo / reload are server-gated; spread is rolled server-side (tighter with `ads`). Answered with `ammo`; everyone nearby gets `shot_fx` (hitscan) or `proj_spawn` (projectiles), + `hit_fx` on a hit. |
| `weapon_action` | `action:"reload"\|"draw"\|"cancel"` | `reload` starts a magazine reload (needs matching ammo, §13.2b); `draw` starts a bow draw / grenade wind-up (charge accrues server-side until `fire`); `cancel` aborts either. |
| `mine_hit` | `x,y,z` | "Still mining this cell" progress ping (~4/s while holding). The server credits the real elapsed time between pings into the block's wear pool (§9.1) — partial mining persists as cracks and resumes. Reach-checked. No wear accrues inside someone else's territory (§9.7). |
| `territory_open` | `x,y,z` | Sent when you open YOUR Territory Core's panel at that cell (§9.7). The server replies (unicast) with a `territory_update` carrying a populated `claimStock` — the claim's chest totals — so the upgrade cost's have/need can count base storage, not just your pack. Silent for a core you don't own. |
| `territory_upgrade` | `x,y,z` | Upgrade YOUR Territory Core at that cell (§9.7). Reach-checked. The cost is paid from your pack AND, for any shortfall, the claim's own chests (like a bench/furnace order, §9.4). Success = `territory_update` (+ a stock-refreshed unicast to you) + the material cost deducted (an `inventory` re-sync); every outcome also answers with a `territory_notice`. |
| `territory_relocate` | `x,y,z` | "거점 이전" — relocate YOUR base at that core (§9.7). Owner-only, reach-checked. Packs the blocks you/your members placed in the claim (block-log provenance, capped at a 27-slot crate) into a moving crate, removes them (block deltas), releases + parks the claim (level/members/crate), and drops the core to carry away. Answers with `territory_notice` (`relocatePacked`, then `relocateLeftover` if the crate filled). Place the core anywhere to restore the claim (`relocated`) and open it like a chest to withdraw the crate (`relocateWithdraw`). |
| `territory_invite` | `toId` | (Owner) Add a FRIEND — by account id, chosen in the core panel's invite picker — as a member of your claim (§9.7, §11.1). Friend-gated + member-cap-checked; success broadcasts `territory_update`, both parties get a `territory_notice`. Offline-safe. The UI form of `/invite`. |
| `territory_kick` | `id` | (Owner) Remove a member from your claim by account id (§9.7). Broadcasts `territory_update` + `territory_notice`. The UI form of `/uninvite`. |
| `territory_leave` | `owner` | (Member) Leave a claim owned by `owner` (§9.7). Broadcasts `territory_update` + `territory_notice`. The UI form of `/leave`. |
| `friend_search` | `q` | Search accounts by name (min 2 chars) for the friends panel; answered with `friend_search_result` (id-tagged so name collisions are unambiguous, online-first, self/existing-friends filtered). §11.1. |
| `friend_request` | `toId` | Send a friend request to an account id (from a search hit). Offline-safe — persists until accepted. If they had already requested you, you auto-become friends. §11.1. |
| `friend_respond` | `fromId`, `accept` | Accept (`accept:true`) or decline an incoming request from `fromId`. §11.1. |
| `friend_cancel` | `toId` | Cancel an outgoing request you sent to `toId`. §11.1. |
| `friend_remove` | `id` | Unfriend the account `id`. §11.1. |
| `friend_list_req` | — | (Re)fetch your full `friend_list` (on panel open / relogin). §11.1. |
| `recall_base` | — | "거점 귀환" — teleport to YOUR Territory Core (§9.7). No payload. Answered with a `correction` snap on success, else a `territory_notice`: `recalled` (ok), `recallNoClaim` (you own no claim), `recallCombat` (`level` = seconds left — you took damage too recently), `recallBlocked` (core sealed in). Blocked for 10s after taking damage; not accepted while dead (use `respawn`). |
| `attack` | `mobId` | Melee the mob (§10.1). Reach + swing-cooldown checked. |
| `attack_player` | `targetId` | PvP melee (needs the world in PvP mode; §10.3). |
| `set_blocking` | `on` | Raise/lower a held shield (blocks most frontal melee AND arrows; costs shield durability per blocked hit). Streamed to others as snapshot flag bit 12. |
| `set_aiming` | `on` | ADS stance on/off — cosmetic only (streamed to others as snapshot flag bit 11; the per-shot spread bonus still comes from `fire.ads`). Send on change, not per frame. |
| `swing` | — | Cosmetic arm swing (shows your punch to others when you hit air). |
| `interact_mob` | `mobId` | Right-click a mob: feed/breed animals, shear sheep, open villager trades (§10.5). |
| `mount` | `vehicleId` | Board an unoccupied vehicle entity (§10.6). Reach-checked; on success you are teleported onto its seat and answered with `mount_state`. |
| `dismount` | — | Get out of the current vehicle (it stays parked where it is). Answered with `mount_state {vehicleId:0}`. |
| `trade_execute` | `index` | Execute row `index` of the open villager's trade list. |
| `trade_close` | — | Close the trade panel. |
| `trade_action` | `kind`, (`accept` / `offers[]` / `ready`) | Player↔player trade. `kind` ∈ `respond` (accept/decline the pending invite via `accept`), `set` (replace your whole offer — `offers[]` = `{item,count}` stacks, STACKABLE items only), `ready` (`ready` bool; both sides ready = one atomic swap), `cancel`. The invite itself is the `/trade <name>` chat command. |
| `furnace_open` / `furnace_close` | `x,y,z` / — | Open/close a furnace GUI; while open you get `furnace_state` pushes whenever its state changes (§9.4). Reach + territory checked. |
| `furnace_queue` | `x,y,z`, `item`, `count` | Order `count` smelts of the smeltable `item` on that furnace (§9.4). Only the ORE for the whole order is consumed up front (from your pack and, inside a claim you may use, its chests). FUEL is NOT taken here — it burns from the furnace's own fuel slot (load it with `furnace_fuel`), so a queued smelt idles until fuel is present. It then smelts on the wall clock. Answered with `craft_result` (`recipeId:-1`). |
| `furnace_cancel` | `x,y,z`, `job` | Cancel the furnace's smelt at queue index `job`; the remaining units' ore refunds to YOU (overflow drops). The current unit's progress is lost; the loaded fuel stays in the slot (cancelling burns nothing). |
| `furnace_collect` | `x,y,z` | Collect the furnace's finished-item buffer into your inventory (whatever fits stays collected; the rest remains). |
| `furnace_fuel` | `x,y,z`, `from`, `to` | Load/unload the furnace's single fuel slot (§9.4). Combined indices: `0` = the fuel slot, `1+i` = your inventory slot `i`; `to < 0` quick-transfers the whole `from` stack to the opposite side (click a bag stack to load / click the slot to unload). Only items that burn as fuel are accepted into the slot. |
| `chest_open` / `chest_close` | `x,y,z` / — | Open/close a chest (27 slots). |
| `chest_move` | `x,y,z,from,to` | Move stacks in the chest GUI (§9.4). |
| `bench_open` / `bench_close` | `x,y,z` / — | Open/close a crafting station's bench GUI (§9.3b); while open you get `bench_state` pushes on every change. Reach + territory checked. |
| `bench_queue` | `x,y,z`, `recipeId`, `count` | Queue `count` units of a STATION recipe on that bench (§9.3b). Ingredients for all units are consumed up front; the job then crafts on the wall clock. Answered with `craft_result`. |
| `bench_cancel` | `x,y,z`, `job` | Cancel the bench's job at queue index `job`; the remaining units' ingredients refund to YOU (overflow drops at the bench). |
| `bench_collect` | `x,y,z` | Collect the bench's finished-item buffer into your inventory (whatever fits stays collected; the rest remains). |
| `chat` | `text` | Chat, ≤ 200 chars (§11). `/w name msg` whispers, `/l msg` is local (48 blocks). |
| `chat_hist_req` | `before?`, `limit?` (≤50) | Page older chat history. |
| `set_name` | `name` | Rename yourself (persists on accounts; broadcast to the roster). |
| `respawn` | — | Leave the death screen; you'll be `correction`-teleported to your spawn. |
| `pong` | `time` | Echo of the server `ping`'s `time`. |
| `stats_query` | — | Request the lifetime-stats leaderboard (`stats_board`). |
| `ach_query` | — | Request your achievement state (`ach_state`). |
| `hub_query` | `tab`, `name?` | Fetch a Hub-panel tab's data (`tab` ∈ `profile`/`dashboard`/`daily`/`ally`; `name` = profile lookup). Replies with `hub_data`. The clickable-UI equivalent of `/프로필` `/생산` `/일일` `/동맹목록`. |
| `hub_action` | `op`, `name?`, `on?` | A Hub-panel mutation, handled identically to the matching chat command: `allyPropose`/`allyBreak` (`name`), `visitorSet` (`on`). Answered with a `notice` + a fresh `hub_data` for the affected tab. |
| `market_query` | `view` | Fetch a Market (장터) panel view — `view` ∈ `browse` (all open listings, newest-first, capped) / `mine` (your own). Replies with `market_data`. |
| `market_action` | `op`, `offer?`, `wants?`, `note?`, `id?`, `option?` | A barter-market mutation: `create` posts a listing (escrows `offer[] = {item,count,dur?,ench?}`, asks for `wants[][]` = OR-options each an AND-set of `{item,count}`, plus a one-line `note`); `buy` fulfils listing `id` by paying its `option`-th want-set; `cancel` withdraws your listing `id`; `collect` claims your payout mailbox. Each answered with a `notice` + a fresh `market_data`. |

---

## 7. JSON messages: server → client

| `t` | Fields | Meaning |
|---|---|---|
| `welcome` | see §2 | Join accepted. |
| `kick` | `reason`, `reload?` | You're being dropped (socket closes right after). |
| `correction` | `x,y,z` | **Movement rejected** (or respawn/teleport): snap to this position and continue from it (§8). |
| `knockback` | `dx,dy,dz` | Impulse (blocks/s) applied to you when hit — add it to your velocity. |
| `death` | `by?`, `corpse?` | You died (killer's name if any). Dying drops your whole inventory + equipped gear: account sessions get a **remains chest** (block id 169) at the death spot — `corpse:true` rides along and a `corpses` push follows; accountless sessions scatter their gear as field drops. Send `respawn` when ready. |
| `player_join` / `player_leave` | `player{id,name}` / `playerId` | Roster changes (also fired on renames). |
| `inventory` | `slots[]`, `armor[]` | **Full authoritative inventory re-sync.** Replaces your local state; sent after any server-side change (pickup, craft, reject-revert…). |
| `stats` | `hp,maxHp,hunger,maxHunger,air,maxAir,effects?` | Your survival stats (0–100 scales). `effects` = active `{id,secs}` list (§13.6); count them down locally. |
| `craft_result` | `ok`, `recipeId`, `reason?` | Craft outcome. |
| `time` | `phase`, `day?`, `storm?` | World clock/weather (§4). |
| `ping` | `time`, `rtt?` | Reply with `pong`. `rtt` = your latency as measured by the server. |
| `chat_msg` | `from`, `text`, `channel?`, `key?`, `args?` | Chat line. `channel` ∈ `global,local,whisper,system`. `text` is always the (English) line to show. `key`/`args` are an optional client-localization hint for server lines that vary by language (e.g. the death kill feed): a localizing client may render its own `key`-templated string with `args` instead of `text`. Bots can ignore them and use `text`. |
| `chat_history` | `messages[]`, `more`, `initial` | A page of stored chat (`{id,from,text,ts}` rows, oldest→newest). |
| `furnace_state` | `x,y,z`, `jobs[]`, `fuel`, `output[]`, `burnSec`, `claimStock?` | A viewed furnace's smelt queue + fuel slot + burn reserve + finished-item buffer (§9.4). `jobs` rows are `{item, count, msLeft, msPer}` where `item` is the smeltable input (its output is implied); `msPer` = wall-clock ms per unit, `msLeft` = ms left on the CURRENT unit (front job only; animate locally). `fuel` = the single manual fuel slot's contents (an `{item,count}` slot; empty = `item:0`), loaded via `furnace_fuel`. `output` = 8 slots. `burnSec` = seconds of burn already lit from the slot (≈ `burnSec`/6 more smelts without touching the slot). `claimStock` (item totals) is present only when the furnace sits in a claim you may use (§9.4). |
| `chest_state` | `x,y,z,slots[]` | Chest contents (pushed to viewers on change). |
| `bench_state` | `x,y,z`, `jobs[]`, `output[]`, `claimStock?` | A viewed bench's craft queue + finished-item buffer (§9.3b). `jobs` rows are `{recipeId, count, msLeft, msPer}` — `msPer` = wall-clock ms per unit, `msLeft` = ms left on the CURRENT unit (front job only; animate it locally between pushes). `output` = 8 slots. `claimStock` (item totals; may be `[]` when the claim's chests are empty) is present only on user-action sends (open / queue / cancel / collect) when the bench sits in a claim you may use; the ~5 Hz streaming pushes OMIT it — carry the last value forward rather than reverting to pack-only (§9.4). |
| `trade_state` | `villagerId`, `trades[]` | The open villager's trade list (`{give:[{item,count}...], get:{item,count}}` rows). |
| `trade_event` | `ev`, … | Player↔player trade. `ev` ∈ `invited` (`fromName` wants to trade — reply `trade_action respond`), `open` (`partnerName`; the window opened), `state` (`partnerName`, `yourOffer[]`, `theirOffer[]`, `youReady`, `theyReady`), `closed` (`reason` ∈ `done`/`cancelled`/`left`/`full`/`declined`/`busy`). |
| `stats_board` | `top[]`, `me` | Leaderboard rows `{name,mobKills,blocksMined,blocksPlaced,deaths,playSec}`. |
| `ach_state` | `unlocked[]` | Your unlocked achievements as `{id,ts}` rows (`id` = a key from the shared achievement registry, `ts` = unlock epoch ms; locked achievements are simply absent). Pushed once right after `welcome` and again on every `ach_query`. |
| `ach_unlocked` | `id` | You just unlocked achievement `id` (live notification; also reflected in the next `ach_state`). Unlocks are earned server-side from validated actions (mining, crafting, kills, …) — there is no way to claim one from the client. |
| `ammo` | `mag`, `reserve`, `reloadMs?` | Your held ranged weapon's authoritative ammo: rounds in the magazine + matching ammo in your bag. Pushed after a shot / reload start & finish / slot change, and right after `welcome` when you join holding a gun (loaded magazines persist across sessions). `reloadMs` present = a reload is running, done in that many ms. Bow: `mag` is 0, watch `reserve` (arrows). |
| `shot_fx` | `id`, `item`, `ox,oy,oz`, `ends[]` | A ranged shot near you: shooter entity `id` fired weapon `item` from muzzle `(ox,oy,oz)`. `ends` = one `[x,y,z,hit]` per pellet (hit 0 = air/max-range, 1 = block, 2 = entity) — the server's actual raycast endpoints, for tracers/impact effects. You also receive your own shots (your client may ignore them if it predicted). |
| `hit_fx` | `victim`, `attacker`, `dmg`, `hs?`, `kill?`, `kind`, `dx?,dz?` | Somebody near you took a hit: final `dmg` after armour/falloff (`hs` = headshot, `kill` = this hit killed/destroyed the victim), `kind` ∈ `gun,arrow,melee,explosion`, `dx,dz` = horizontal attacker→victim direction. Drives hit flashes/flinch on the victim's model; if `victim` is YOU, use `dx,dz` for a directional damage indicator; if `attacker` is you, it's your hit confirmation (`kill` = your kill confirm). `attacker < 0` = a non-entity source (defence turret). |
| `proj_spawn` | `id`, `x,y,z`, `vx,vy,vz`, `owner`, `kind?` | A projectile launched with these TRUE kinematics — simulate it locally for smooth flight; the same `id` also appears in snapshots as a coarse fallback. `owner` = shooter entity id (< 0 for turrets). `kind` 0/absent = arrow (gravity -18 blocks/s²), 1 = grenade (gravity -22; RE-SENT with the same `id` after every bounce — snap your sim onto the new kinematics), 2 = rocket (gravity -2), 4 = seed (the field boss's explosive mortar, §10.5 — gravity -12, detonates on any contact with blast radius 2). See §10.2c. |
| `proj_hit` | `id`, `x,y,z`, `hit`, `kind?` | Projectile `id` ended at this exact point (hit 0 = expired mid-air, 1 = block, 2 = entity). Remove it + play impact effects there. Explosive kinds (grenade fuse-out counts as hit 0; rockets and seeds end on any contact) detonate — the boom arrives as the accompanying `explosion_fx`. |
| `explosion_fx` | `x,y,z`, `r` | An explosion detonated here (Blast Charge, Blastling, grenade, rocket, a field boss's seed) with blast radius `r` blocks. Cosmetic companion: the authoritative effects — the crater's block deltas and `hit_fx`/`stats` damage — arrive separately. |
| `block_damage` | `x,y,z`, `stage` | The cell's wear pool (§9.1) crossed a crack stage: 1..8 = show that crack depth, 0 = cleared. No message on the silent heal — expire overlays after 120 s without updates. |
| `pvp_mode` | `on` | The world's combat mode was flipped by an admin (§10.3). `on:true` = PvP: players can hurt each other, and clients should stop revealing other players (name tags, minimap markers). The join-time value rides in `welcome.pvp`. |
| `territories` | `list[]`, `self`, `spawn` | The FULL territory-claim list (§9.7), pushed once right after `welcome` (global like the roster — not AOI-scoped). Each entry is `{owner,name,x,y,z,level,members?,hasStorage?}`: owner account id, display name, core block cell, claim level, the member list (`[{id,name},…]` — accounts the owner shared the claim with; absent/empty = none), and `hasStorage` (true while the core carries an unwithdrawn relocation crate — §9.7; the official client then right-clicks the core to `chest_open` the crate instead of the claim panel). `self` = YOUR account id (0 = accountless session, which can never claim) — match it against `owner` (or the `members` ids) to find claims you may use. `spawn` = the world spawn centre + no-claim radius `{x,z,radius}`; the no-claim exclusion zone (§9.7) is a Chebyshev square of half-extent `spawn.radius` blocks around `{x,z}`. `radius` tracks the admin-configured spawn size (= the scatter disc new players spawn into; default 64) and can change live — the server re-sends `territories` when an admin moves/resizes spawn, so redraw the zone from it rather than assuming the constant. |
| `territory_update` | `tr`, `claimStock?` | A claim appeared or changed (core placed, upgraded, owner renamed, member invited/removed) — upsert `tr` into your list by `tr.owner`. `claimStock` (`[{item,count},…]`, the claim's pooled chest totals — an explicit `[]` means the chests are now empty, e.g. an upgrade just drained them) is present ONLY on the unicast reply to your own `territory_open` and just after your own upgrade — it lets the core panel count base storage in the upgrade cost. Absent on every broadcast form; treat a MISSING `claimStock` as "unchanged" (not "empty") and an explicit `[]` as "cleared". |
| `territory_remove` | `owner` | A claim was released (core broken / owner account purged) — drop that owner's entry. |
| `territory_notice` | `code`, `name?`, `level?` | Outcome/denial of a territory action, for a status line. `code` ∈ `protected` (that land belongs to `name`), `claimExists`, `claimOverlap`, `claimSpawn`, `claimAccount`, `claimed` (success, `level` rides along), `upgraded` (now `level`), `upgradeMax`, `upgradeCost`, `upgradeOverlap`, `removed`, `relocateSaved` (you broke YOUR core: its `level` + members are parked, and re-placing a core anywhere restores the claim — §9.7), `relocatePacked` (`territory_relocate` packed your base into the core's crate; `level` = blocks packed), `relocateLeftover` (the crate filled — `level` = item units left standing), `relocated` (a re-placed core restored a parked claim at `level` with its members + any crate), `relocateWithdraw` (the restored core carries a crate — open it like a chest to unpack), `needTerritory` (automation machines only place inside a claim you belong to, §9.7), a base-recall code (§9.7) — `recalled`, `recallNoClaim`, `recallCombat` (`level` = seconds left on the combat lock), `recallBlocked` — or a member-system code (§9.7 "Territory members"): `memberAdded`, `memberWelcome`, `memberRemoved`, `memberKicked`, `memberLeft`, `memberLeftOwner`, `memberList` (`name` = comma-joined names), `memberOf`, `memberNone`, `memberNotFound`, `memberCap` (`level` = the cap), `memberDupe`, `memberSelf`, `memberNoClaim`, `memberNotFriend` (UI invite: you can only invite your friends), `memberNotMember`. |
| `mount_state` | `vehicleId`, `kind?`, `x?,y?,z?,yaw?` | Your mount state changed (§10.6): the reply to `mount`/`dismount`, or a FORCED dismount (death, disconnect, vehicle destroyed). `vehicleId` 0 = on foot. On a successful mount it carries the vehicle's MobKind + authoritative pose — snap your position there and switch to that vehicle's drive physics. |
| `corpses` | `list[{x,y,z,ts,cause?}]` | Your unclaimed remains chests (death caches), newest first — pushed after `welcome` and on every change (a new death, a loot, a cap eviction; at most 5 per account, oldest spills to ground drops beyond that). Each entry carries the death time `ts` (ms epoch) and how you died `cause` (`{key,by?}`: `key` is `slain` with `by` = the killer's name, or an environmental tag `fall`/`drown`/`lava`/`fire`/`starve`/`cactus`/`unknown`) — the official client renders a "when + why you died" tooltip on the map's grave marker. Right-click (`use_block`) a listed cell to recover everything — owner-only; the block is indestructible and pops once looted. |
| `boss_state` | `dead[]` | Anchors (`{x,z}`, world coords) of currently-DEAD **field bosses** (§10.5) — pushed once after `welcome` and re-pushed whenever the list changes: a kill adds an anchor, its timed respawn (~an hour of wall-clock later) removes it again (global, like `territories`). Hide the matching map markers while listed. |
| `raid_state` | `active`, `phase`, `wave`, `waves`, `secs`, `enemies`, `tier`, `coreHp`, `coreMax` | **Base-siege** status for your own land claim, sent ONLY to the claim's owner + online members while a raid runs (and once with `active:false` when it ends). `phase`: `"warn"` = incoming countdown (`secs` to wave 1), `"wave"` = fighting (`enemies` left of `wave`/`waves`), `"cleared"` = lull (`secs` to the next wave). `tier` = difficulty (scales with base value). `coreHp`/`coreMax` = the Territory Core's siege HP: raiders that reach the core drain it, and if it hits 0 the base is **breached** (siege lost). During an active siege ONLY, raiders can also damage/break that claim's blocks (walls) — claims are otherwise blast/edit-proof. Drives the raid HUD; purely informational for bots. |
| `quest_state` | `quest`, `progress[]`, `done?` | Your main-quest progress (§9.8): active quest id (1-based into §13.9's table; 0 = the whole line is complete) + per-objective counters. Pushed once after `welcome` and on every change. `done` = the id of a quest that JUST completed (its rewards were granted — an `inventory` re-sync rides along — and `quest`/`progress` already describe the next one). Purely informational for bots. |
| `fishing` | `ev` | Your fishing line's lifecycle (§9.5), sent only to the angler. `ev` ∈ `cast` (line in the water), `bite` (fish ON — send `use_item` within 1200 ms to land it), `lost` (window lapsed; the line stays cast, a new bite is re-rolled), `catch` (landed — loot arrives as an item drop), `end` (line left the water with no catch). |
| `friend_list` | `friends[]`, `incoming[]`, `outgoing[]` | Your full social snapshot (§11.1). `friends[]` = `{id,name,online}` (online-first); `incoming[]`/`outgoing[]` = `{id,name}` pending requests. Pushed once after `welcome` and again on every change that affects you (a request arrives/resolves, a friend's presence flips). Small + global, like the claim/roster lists. Empty for accountless (transient) sessions. |
| `friend_search_result` | `results[]` | Hits for your `friend_search` — `{id,name,online}[]`, id-tagged so name collisions are unambiguous, online-first, with your account + existing friends filtered out. §11.1. |
| `friend_request_in` | `fromId`, `fromName` | A new incoming friend request arrived while you're online (a toast cue; it also appears in your next `friend_list`). §11.1. |
| `friend_notice` | `code`, `name?` | Outcome of a friend action, for a status line. `code` ∈ `sent`, `requested` (they'd already requested you → now friends), `already`, `pending`, `selfReq`, `accepted`, `declined`, `cancelled`, `removed`, `added` (the requester's ack when their request is accepted), `notFound`, `reqNotFound`, `full`, `needAccount`. §11.1. |
| `sign_text` | `x,y,z`, `text`, `canEdit` | A Sign block's current text — pushed when you `use_block` a Sign, and after a `sign_edit`. `canEdit` = you may edit it (own claim / admin / unclaimed land); the official client opens a text prompt when true, else shows the label read-only. |
| `signs` | `signs[]` | A batch of sign labels so a client can draw the text ON each sign's board (not just on right-click). Each entry is `{x,y,z,text}`. Streamed for the signs in each chunk as it loads, and pushed as a one-entry batch whenever a sign is edited within your view. Merge by cell; an empty `text` clears that cell's label. |
| `music_state` | `x,y,z`, `mml`, `instruments[]`, `loop`, `playing`, `canEdit` | A Music Player's current score — pushed when you `use_block` it, and after a `music_set`. `canEdit` = you may write to it (own claim / member / admin / unclaimed land); the official client opens the MML editor when true, else read-only. |
| `music_boxes` | `boxes[]` | The currently-PLAYING music players in a streamed chunk, so a client entering range joins the tune. Each entry is `{x,y,z,mml,instruments[],loop,elapsedMs}` (`elapsedMs` = how long it has been playing, for phase alignment). |
| `music_play` | `x,y,z`, `mml`, `instruments[]`, `loop` | A Music Player near you STARTED — synth the score at the cell, distance-attenuated. Sent on a right-click Play or a Signal trigger. |
| `music_stop` | `x,y,z` | The Music Player at the cell stopped (Stop pressed, unpowered, or broken) — silence it. |
| `notice` | `code`, `from?`, `item?`, `args?` | A LOCALIZED system message. The client renders `t("notice." + code, {item name, …args})` in the VIEWER's language (server never sends prose) and shows it as a system chat line. `from` is the icon prefix; `item` (an ItemId) resolves to the localized item name as `{item}`; `args` supplies any other `{placeholders}`. Used for chest-lock, taming, auto-crafter/smelter config, bed, enchant/anvil, corpse recovery, trade/whisper feedback, mute, daily challenges, alliances, visitor access, the 장터 (barter market), etc. |
| `hub_data` | `tab`, one section of `profile`/`dashboard`/`daily`/`allies` | Reply to `hub_query` (and a live push after a `hub_action`): the requested Hub tab's data. Only the section matching `tab` is populated. The client localizes item names (daily reward) and renders the clickable panel. |
| `market_data` | `view`, `orders[]`, `capped`, `mailbox[]`, `listingCount`, `maxListings` | A Market (장터) panel view (reply to `market_query`, and a live push after a `market_action`). Each `orders[]` entry is `{id, seller, offer[], wants[][], note, mine?}` where `offer[]` = `{item,count,dur?,ench?}` and `wants[][]` = OR-options of `{item,count}` AND-sets; the client localizes every item id to a name. `capped` = more open listings exist than were sent. `mailbox[]` = items owed to you from completed sales (`{item,count,dur?,ench?}`, collectable via `market_action` `collect`). `listingCount`/`maxListings` = your active-listing count + the per-seller cap. |

`InvSlot` (inventory/armor/furnace/chest slots everywhere):
```json
{ "item": 23, "count": 1, "dur": 180, "ench": 33 }
```
`item` = ItemId (§13.2), `dur` = remaining durability (tools only), `ench` =
packed enchant `(enchantId << 4) | level` (§13.7). `item: 0` = empty slot.

---

## 8. Movement rules (anti-cheat) — read this or get rubber-banded

You self-report your position via Input frames (§5.6). The server accepts a
move only if it is *physically plausible*; otherwise you get a `correction`
and your position stays where the server last believed:

- Let `dt` = seconds since your previous Input arrived (clamped to 0.001..0.5).
- **Horizontal:** `dist((x,z) − prev)` must be ≤ `8 × 1.6 × dt + 0.4` (≈ 12.8 blocks/s + slack).
- **Up:** `y − prevY ≤ 30 × dt + 0.5` · **Down:** `prevY − y ≤ 280 × dt + 0.5`.
- **Mounted** (§10.6): the horizontal cap uses the vehicle's top speed instead
  of sprint, and a FLYING vehicle raises the rise cap to
  `maxSpeed × 1.6` (climbing is legal but still bounded).
  Everything else (fall cap, bounds, `seq`) is unchanged.
- `y` must be within `−2 .. 1028`; all values must be finite.
- `seq` must strictly increase (u32); stale/duplicate frames are dropped.
- **Collision (optional, operator-toggled):** some servers additionally reject a
  reported position whose body box is buried in solid geometry (noclip /
  wall-phase) — using the same partial-block collision the world is meshed with.
  A well-behaved client never ends a frame inside a block, so this is invisible;
  a `correction` snaps you out if you try. The speed/vertical caps above are
  always enforced regardless.

**On `correction`: set your position to exactly the given point, zero your
velocity, and keep sending Input from there** (with increasing `seq`). If you
ignore corrections you will desync permanently.

The contract is that clients simulate real kinematics, like the official one:

| Constant | Value |
|---|---|
| Walk / sprint speed | 5 / 8 blocks/s |
| Crouch speed / height / eye | 2.6 blocks/s · 1.4 · feet + 1.2 (buttons bit 256) |
| Prone speed / height / eye | 1.3 blocks/s · 0.6 · feet + 0.5 (buttons bit 8192) |
| Jump velocity | 8.4 blocks/s |
| Gravity | -28 blocks/s² |
| Step: collision box | 0.6 × 1.8 (feet-centered) |

Implement: apply gravity while unsupported, collide against **solid** blocks
(§13.1 `solid` column; slabs/stairs/fences have partial boxes — treating them
as full cubes is a safe approximation for a bot), swim in water (reduced
speeds, hold "jump" to rise), climb ladders. The server additionally computes
**fall damage** from your reported motion: falling more than 3 blocks costs
`floor((fall − 3) × 5)` HP on landing (water or a ladder cancels it). Don't
teleport-hop; don't hover — plausibility checks get stricter over time.
Powered flight exists, but only one sanctioned way: a worn **jetpack** (§9.5)
thrusting while you hold jump airborne — its climb fits inside the rise bound
above and burns server-side fuel.

### 8.1 Parachute (buttons bit 16384)

Every player has a built-in parachute — no item needed. Set the bit while
airborne to declare "gliding under canopy"; clear it (or land) to release.
What it does:

- **Fall damage void:** while the bit is set AND you are airborne AND your
  measured per-frame descent is a real canopy sink — `prevY − y ≤
  10.5 × 1.6 × dt + 0.5` — no fall
  accrues, so landing under canopy is safe. The check runs per accepted Input
  frame on the server's own dt: setting the bit during a genuine freefall
  (sinking faster than that envelope) voids nothing and the landing hurts as
  usual. There is no other effect — hitboxes, reach and shooting are unchanged.
- **Rendering:** everyone near you sees snapshot flags bit 14 and draws the
  canopy.
- **Movement stays inside §8:** the official client glides at
  7.5 forward / 4.2 down blocks/s, leaning
  forward to dive (up to 11.5 / 10.5),
  leaning back to flare (down to 3.5 /
  2.2), drifting sideways at ≤ 3 —
  all under the horizontal cap, so no special validation applies. Bots may fly
  any glide profile that fits the caps.
- The official client only deploys while falling ≥ 3
  blocks/s with ≥ 6 blocks of clear air below the
  feet, and auto-releases on touchdown / water / a ladder / mounting — mimic
  that for a human-plausible look.

---

## 9. Working the world

### 9.1 Mining (breaking blocks)

1. Target a block cell (integers `x,y,z`) whose **center is within
   6.5 blocks of your eye** (feet + 1.62).
2. Optionally wait the block's break time like a human would:
   `breakSeconds = hardness × 0.75 / toolSpeed` (hardness in §13.1; toolSpeed
   in §13.2 applies when the tool's type matches the block's `tool` column).
   Bots are expected to respect this; hammering instant breaks is detectable
   and treated as cheating.
3. Send `{ "t": "block_edit", "action": "break", "x": …, "y": …, "z": … }`.
4. On success everyone (you included) gets the `BlockDelta` (→ Air) plus any
   cascades (felling a tree topples the whole trunk + canopy). The block's
   drop appears as a ground item — walk within **1.4** blocks
   to auto-collect (a magnet pulls from 2.6; fresh drops are
   inert for 0.5 s). Your `inventory` message follows.
5. On rejection you get a `BlockDelta` echoing the real block, and an
   `inventory` re-sync. Rejection causes: out of reach, unbreakable block
   (bedrock), spawn-protected zone (an admin-set radius around world spawn).

**Tool gating:** anything can be *broken* by hand, but ores only *drop* when
harvested with a good enough tool (`minTier` column in §13.1: 1 wood, 2 stone,
3 iron; e.g. iron ore needs a stone pickaxe or better). Durability: each break
costs the held tool 1 use; at 0 it vanishes.

**Block wear (persistent partial damage).** Every breakable block carries a
shared "HP" pool of `hardness × 27` that mining time AND
bullet damage (§10.2b) both drain. While mining, send
`mine_hit {x,y,z}` ~4×/s; the server credits the REAL elapsed time between
your pings (clamped — claiming more time than passed is impossible) at your
tool's breakSeconds rate. Stop halfway and the block stays cracked: the area
gets `block_damage {x,y,z,stage}` pushes (stage 1..8,
0 = cleared) so every client shows the same cracks. Resume later — yours or
anyone's damage counts — and only the remainder is left. Untouched damage
heals after 120 s (no message; mirror the timeout). The
final break is still a normal `block_edit`, so drops/durability follow the
mining rules above.

### 9.2 Placing blocks

1. Put a placeable item (§13.2 `places` column) in a hotbar slot and
   `select_slot` it.
2. Aim at an existing block face; the target cell is the **air cell you want
   to fill**, `nx,ny,nz` is the face normal you clicked (−1/0/1 each; e.g.
   placing on top of `(10,80,5)` → cell `(10,81,5)` with normal `(0,1,0)`).
3. Send `{ "t": "block_edit", "action": "place", "x,y,z": …, "nx,ny,nz": … }`.
4. Success = `BlockDelta` with the placed block id (stairs/torches/doors
   resolve to an oriented variant per your yaw/normal) + `inventory` (−1
   item). Rejection = `BlockDelta` echoing the (unchanged) cell.

Placement rules the server enforces: cell within reach; cell must be
replaceable (air/water/plants); most blocks need support (not floating);
torches/ladders/levers mount on the clicked wall; a **solid** block may not
overlap any player's body (including yours); doors need 2 cells; slabs merge
into a full block when you stack two of the same material.

### 9.3 Crafting

Crafting is **shapeless**: a recipe consumes ingredient stacks from anywhere
in your inventory. There are two kinds of recipe (see the `station` and `time`
columns in §13.3):

- **Hand recipes** (empty `station`) craft **instantly**, anywhere: send
  `{ "t": "craft", "recipeId": N, "count"? }` (`count` repeats the recipe, up
  to 99; crafting stops at the first failure and `ok`
  is true if at least one unit crafted).
- **Station recipes** craft **over wall-clock time on the station's bench
  queue** (§9.3b) — the instant `craft` path rejects them.

A recipe's **station** column names the crafting station BLOCK the job must
run on. Stations come in two FAMILIES with two TIERS each — a higher tier
also covers its family's lower tier, but families never substitute for each
other:

| family | tier 1 block | tier 2 block | unlocks |
|---|---|---|---|
| workbench | Crafting Table (9) | Advanced Workbench (165) | general goods; T2 adds diamond-tier gear, the Enchanting Table and the Anvil |
| gunsmith | Gunsmith Bench (166) | Advanced Gunsmith Bench (167) | firearms/ammo/explosives; T2 adds the rifle, sniper gear and rockets |

The server replies `craft_result` and, on success, re-syncs your inventory
(a wrong station fails with reason `needs <station name>`).

### 9.3b Bench crafting (station recipes; wall-clock queue)

Every placed station block owns a **job queue** (max 4
jobs) and a **finished-item buffer** (8 slots):

1. `bench_open {x,y,z}` on the station (reach-checked) subscribes you to its
   `bench_state` pushes.
2. `bench_queue {x,y,z, recipeId, count}` starts a job (`count` ≤
   99 units). The station's family/tier must satisfy
   the recipe, a `core lv` recipe additionally requires the bench to stand
   inside YOUR claim of that level, and the ingredients for ALL units are
   consumed from your inventory up front. Answered with `craft_result`.
3. The bench works its queue front-to-back on the **wall clock** — each unit
   takes the recipe's `time` (§13.3) and keeps crafting while you are away,
   the chunk is unloaded, even across server restarts. Finished units land in
   the output buffer; a FULL buffer pauses the bench at 100% of the current
   unit until space frees up.
4. `bench_collect {x,y,z}` moves the buffer into your inventory (whatever
   fits). This is when craft-quest/achievement credit is granted.
5. `bench_cancel {x,y,z, job}` (0-based queue index) refunds the remaining
   units' ingredients to you (overflow drops at the bench); progress on the
   in-flight unit is lost. `bench_close` unsubscribes.

Territory rules mirror chests (§9.7): a bench inside someone ELSE'S claim
refuses to open; a bench **in the wild is open to everyone** — anyone may
queue on it, cancel jobs (pocketing the refund) or collect its finished items.
Breaking a station spills its buffer + queued materials as drops.

### 9.4 Furnace (wall-clock smelt queue) & chest GUI

The **furnace is the bench's smelting sibling** — a wall-clock job queue, not a
slot machine. `furnace_open` (reach + territory checked) subscribes you to
`furnace_state` pushes (on change). `furnace_queue {x,y,z, item, count}` orders
`count` smelts of a smeltable `item` (§13.4): the server consumes only the ore for
the whole order **up front** — from your pack and, if the furnace sits in a claim
you own or share, that claim's chests too. **Fuel is manual:** load it into the
furnace's single fuel slot with `furnace_fuel` (index `0` = the fuel slot, `1+i` =
your inventory slot `i`; `to < 0` = quick-transfer — click a carried fuel stack to
load it, click the slot to take it back; only items that burn as fuel (§13.4b) are
accepted). As each unit cooks the furnace burns one item from the slot into a burn
reserve (`burnSec`); a queued smelt **idles until fuel is loaded**. Each unit takes
**6 s** of wall-clock time (it keeps smelting while you're away/
offline; a full output buffer OR an empty fuel slot pauses it at 100%). Up to
4 jobs queue, ≤ 99 units each.
`furnace_collect` banks the finished items (smelt credit is granted here, on
withdrawal); `furnace_cancel {x,y,z, job}` refunds the remaining ore (the loaded
fuel is untouched). `furnace_close` unsubscribes (also auto-closes when you walk
away). Territory rules mirror the bench/chest.

**Base-shared materials:** ordering at a bench (`bench_queue`) or furnace
(`furnace_queue`) that stands inside a claim you own or are a member of draws the
ingredients from your inventory **and every chest in that claim** — so a shared
base's storage feeds its stations. **Territory Core upgrades** (`territory_upgrade`,
§9.7) draw from the same pool. (Furnace FUEL is the exception: it is always
hand-loaded into the fuel slot, never auto-pulled.) `bench_state` / `furnace_state`
carry a `claimStock` list (item totals, `[]` when the claim's chests are empty) on
user-action sends so a client's have/need can reflect base storage, not just the
pack; the streaming pushes omit it (carry the last value forward). The core panel
gets the same list from a `territory_open` request (§9.7).

The **chest** GUI still uses `chest_move` with **combined indices**:
`0..26` = chest slots; `27 + i` = your inventory slot
`i`; `to: -1` = quick-transfer to the opposite container.

### 9.5 `use_item` (held item, no target)

By default acts on the held (selected hotbar) item; an optional `slot`
(inventory index) acts on that slot instead — this is how the inventory GUI
equips armour by drag without re-selecting the hotbar.

- **Food** (§13.2 `food` column): eat when hunger < 100 (a Golden Apple also
  works below full HP and grants Regeneration + Resistance).
- **Armour piece:** equips into its slot (swaps the old piece back to the
  source slot).
- **Jetpack (back gear):** equips into slot 4 the same way. While worn with
  fuel left, holding the **jump button while airborne** thrusts: climb at up
  to 9 blocks/s (inside the §8 rise bound), the server
  burns 4 fuel/s (fuel = the item's durability, tank
  240), any fall accumulated so far is voided, and everyone
  near you sees snapshot flag bit 9. In water / on a ladder jump means swim or
  climb instead — no burn. An empty pack stays worn and simply stops
  thrusting; craft the refuel recipe (§13.3) to refill it.
- **Fishing rod:** cast near water (`fishing {ev:"cast"}` confirms). After
  2–5.5 s the fish BITES — the server pushes `fishing {ev:"bite"}` and you
  have a 1200 ms window to send `use_item` again:
  inside the window lands the catch (`ev:"catch"`; the loot pops out of the
  water toward you and is auto-picked up), too late and the fish escapes
  (`ev:"lost"` — the line STAYS cast, a new bite is re-rolled), reeling
  between bites brings the line in empty (`ev:"end"`). Switching slots or
  leaving the water also ends the cast (`ev:"end"`). Rod durability is spent
  only on a landed catch.

### 9.6 `use_block` (right-click a block)

Works empty-handed: **bed** (sets your respawn point), **doors/trapdoors/fence
gates** (toggle), **lever**
(latch on/off), **button** (momentary), **anvil** (repair: combines the held
tool with an identical one from your bag), **enchant table** (spend 2 diamonds
to enchant the held item, §13.7). With an item held: **hoe** tills grass/dirt
→ farmland, **seeds** plant on farmland (the cell above it), **bone meal**
instantly grows a sapling, **empty bucket** scoops a water/lava source,
**filled bucket** places its liquid (via `block_edit` place), **flint & steel**
lights a fire on the clicked face (or primes a Blast Charge directly),
**Auto Crafter** (§9.7) — holding an item configures the machine to craft it
(the first recipe producing that item; self-consuming recipes like the jetpack
refuel are skipped), an empty hand clears; the answer is a `chat` status line.

### 9.7 Territory (personal land claims)

Placing a **Territory Core** (item 148 / block 168) **claims a square of
columns** (full world height) centred on the core: level N covers half-extent
`4 / 8 / 16 / 24 / 34` blocks (levels 1..5). One claim
per **account** (accountless sessions can't claim — `claimAccount`). The claim
list arrives as `territories` after `welcome` and stays current via
`territory_update` / `territory_remove`.

- **Claiming** = a normal `block_edit` place of the core. The server first
  validates the claim: you have none yet, the core is ≥ `spawn.radius` blocks
  (Chebyshev) from the world spawn — that radius tracks the admin-configured
  spawn size (default 64; read the live value from
  the `territories` message's `spawn.radius`) — and the new level-1 box keeps ≥
  16 blocks of gap from every other claim box. An invalid claim rejects the edit (echo + `territory_notice`)
  without consuming the item. Because a second core could never be placed, the
  Territory Core recipe is also refused while you own a claim or already hold
  a core (`craft_result` reason `one territory core per player`).
- **Inside someone else's claim you cannot**: edit blocks (`block_edit`
  rejects), use blocks (`use_block` is inert — doors, levers, beds, anvils,
  buckets, tilling…), open chests, furnaces or benches, or accrue mining wear.
  You get `territory_notice code:"protected"` with the owner's name.
- **Claimed land is damage-proof**: explosions never destroy claimed cells,
  bullets neither wear nor demolish them, and fire never ignites or spreads
  onto them. Ambient mobs don't spawn inside claims.
- **Upgrading**: send `territory_upgrade` at your core (or right-click it in
  the official client). The cost is drawn from your pack first, then the claim's
  own chests for any shortfall (the same base-shared pool a bench/furnace order
  uses, §9.4) — send `territory_open` first to learn that stock. Costs climb
  through the material tiers; each level
  grows the square and unlocks `coreLevel`-gated recipes (§13.3 lists them) —
  those recipes ALSO require you to be standing inside your own claim when
  crafting.
- **Territory members (shared base / party)**: the owner can share the claim
  with up to 8 accounts. The primary path is the core
  panel's member UI, driven by the FRIEND system (§11.1): add someone as a friend,
  then pick them from the invite list — `territory_invite {toId}` (friend-gated,
  offline-safe, by account id), `territory_kick {id}`, `territory_leave {owner}`.
  The equivalent chat commands still work (§11): `/invite <name>` (the player must
  be ONLINE — names aren't unique account keys, a live player is unambiguous),
  `/uninvite <name>` (works offline, by the stored member name), `/members`
  (list), `/leave [owner]` (a member walks away; the owner name disambiguates
  when you belong to several).
  Members **build, use blocks/containers, place + run automation machines,
  and craft `coreLevel`-gated recipes** inside the claim exactly like the
  owner. They can NOT upgrade the core, invite/remove members, or break the
  core (releasing stays the owner's call — a member breaking the core gets
  `territory_notice code:"protected"`). Membership rides on the claim in
  `territories` / `territory_update` (`members` array); every command answers
  with a `member*` notice code (see §7). Purged/deleted accounts drop out of
  member lists automatically. Respawn is unchanged (own bed > own core —
  members respawn at their own base, not the shared one; place a bed in the
  shared base to respawn there).
- **Home respawn**: dying respawns you at your core (standing on/beside it)
  when you have a claim and no bed spawn — bed > territory > world spawn
  (§10.4).
- **Releasing / relocating**: break your core (it drops as an item) — the land
  is instantly unclaimed. Breaking YOUR OWN core also **parks the claim's level
  and member list** to your account (`territory_notice code:"relocateSaved"`,
  `level` rides along); the very next core you place — anywhere valid — restores
  the claim at that level with those members instead of starting fresh at level 1
  (`territory_notice code:"relocated"`). The parked state is consumed by that
  placement, and is discarded on account purge/reset or a full world reset. A
  purged idle guest account releases its claim automatically.
  **Moving the whole base** (blocks and all): send `territory_relocate` at your
  core (right-click → "거점 이전" in the official client) instead of breaking it.
  The server packs the blocks you and your members placed inside the claim —
  identified by block-log provenance, so a pre-claim stranger's edits are left
  alone — plus any chest/furnace/bench CONTENTS, into a 27-slot
  crate (overflow is left standing / spilled as drops), clears them, and parks
  the crate alongside the level+members. When you re-place the core the crate is
  seeded **as a chest on the core**: right-click it (`chest_open`/`chest_move`,
  §9.4) to withdraw; it vanishes once emptied.
- **Base recall ("거점 귀환")**: send `recall_base` (the official client's world-map
  button) to teleport to your OWN core — same destination the respawn logic uses
  (standing on the core, or the nearest clear footing around it). Owner-only; you
  can't recall for 10s after taking damage, and it's
  refused if the core is walled in solid. Success is a `correction` snap; every
  outcome answers with a `territory_notice` (`recalled` / `recallNoClaim` /
  `recallCombat` / `recallBlocked`).
- **Base automation**: the machine blocks — Resource Extractor, Item
  Collector, Auto Harvester (§13.1 lists their ids) — only **place inside your
  OWN claim**; a `block_edit` place anywhere else rejects (echo +
  `territory_notice code:"needTerritory"`) without consuming the item. They
  only **operate while the land stays claimed** (breaking the core powers
  every machine down) and bank their output into an **adjacent chest** — no
  chest, or a full one, and the machine idles. All effects reach you through
  the ordinary streams (block deltas, item-drop lists, chest state) — there is
  no automation-specific message.
- **Offline production (wall-clock settlement)**: producing machines track
  real elapsed time, not simulation ticks. Log off (or let the chunk unload,
  or the server restart) and the backlog settles the next time the machine is
  observed: up to `floor(elapsed / cycle)` yields are granted at once, capped
  at 12 h of backlog and by the chest's space.
  Furnaces fast-forward through server downtime the same way. Wheat growth is
  also wall-clock (32 s per stage ± a deterministic per-cell
  jitter, 3 stages to ripe), so fields keep ripening — and a harvester keeps
  cycling them — while nobody is online.
  - The **Resource Extractor** sits on a NODE: the block directly below it.
    A listed node yields its drop per cycle **without ever consuming the
    block** (infinite nodes, per-resource rates):

| node block (under the extractor) | yield / cycle | cycle (s) | per hour |
|---|---|---|---|
| Stone (1) | 1× Cobblestone (14) | 15 | 240 |
| Cobblestone (8) | 1× Cobblestone (14) | 15 | 240 |
| Coal Ore (12) | 1× Coal (62) | 30 | 120 |
| Iron Ore (13) | 1× Raw Iron (65) | 40 | 90 |
| Gold Ore (55) | 1× Raw Gold (67) | 90 | 40 |
| Diamond Ore (56) | 1× Diamond (69) | 240 | 15 |
| Signal Ore (78) | 4× Signal Conduit (53) | 60 | 240 |

  - The **Item Collector** is reactive (drops don't exist while unsimulated):
    it sweeps settled item drops within 8 blocks —
    own-claim drops only — every 1 s, at most
    4 drops per sweep. No offline backlog.
  - The **Auto Harvester** earns one harvest of settle budget per
    4 s and spends it on ripe wheat within
    6 blocks (±4 vertically), replanting each cell in
    place (one seed of the yield is the replant cost).
  - The **Auto Crafter** runs one CONFIGURED recipe (set via `use_block`,
    §9.6) every 10 s: inputs are pulled from the
    adjacent chests, the output banks back into one (whole-output space
    required). It obeys the normal crafting gates — the recipe's station
    block must stand ADJACENT to the machine, and a `coreLevel`-gated recipe
    needs the claim at that level — so automation extends the crafting rules
    rather than bypassing them. Starved (missing inputs) or jammed (no output
    space) machines hold a cap-bounded backlog.
  - **Signal lock**: a POWERED signal component (a lit wire, a switch flipped
    on, a pressed button, a lit lamp, a driving repeater) touching any face
    of a machine PAUSES it — wire a switch into the machine row and flip
    production off without breaking anything. Locked time never accrues
    offline backlog (like unclaimed land).

### 9.8 Main quest line

A single linear chain of onboarding/progression quests (the full table is
§13.9). Progress is entirely **server-tracked** — there is nothing to send.
Your position arrives as `quest_state` (once after `welcome`, then on every
change); when a quest completes its rewards are granted into your inventory
(overflow drops at your feet) and the next quest activates immediately.

What advances each objective kind (all server-authoritative events):

- `mine` / `place` — breaking / placing one of the listed blocks.
- `craft` — a successful `craft` of the item (counts the recipe's output
  quantity).
- `collect` — the item entering your inventory **from the world**: a ground
  pickup or a furnace-output withdrawal. Crafted outputs, quest rewards, chest
  withdrawals and re-picking an item you tossed yourself do NOT count.
- `kill` — a mob kill credited to you (melee, gunfire, or your own arrow).
- `claim` / `upgrade` — owning a territory / your core reaching the level
  (§9.7). These auto-complete if your claim already satisfies them, so an
  established account chains straight through.

State persists per account (guests included). Quests are optional — nothing
is gated on them beyond their rewards.

---

## 10. Combat, mobs, death

### 10.1 Melee (PvE)

`{ "t": "attack", "mobId": N }` — target from your snapshots. Checks: mob
within the held weapon's **reach + 3.5** blocks
(horizontal — a default-reach weapon keeps the historical ~7
bound), and the held weapon's **swing cooldown** (attacks arriving < 85% of it
since your last are silently dropped; a fully recharged swing crits ×1.5).
Reach + swing time are **per-weapon**: the fist/generic default is
3.5 blocks / 600 ms, **swords** swing fast
(3.5+ reach, well under the default cooldown — the fighting
weapon), and **axes** swing heavy (slower than default). Damage = held item's
`dmg` (§13.2, fist = 1) + Sharpness + Strength/− Weakness effects. Each swing
costs 1 durability.

### 10.2 Bow (charged projectile)

Hold a Bow with ≥1 Arrow. Send `weapon_action {action:"draw"}` to start
drawing, then `fire {dx,dy,dz}` to release — the server measures YOUR draw
time and scales arrow speed/damage by charge (15%..100% over the full-draw
window; see §13.2b). The arrow launches from your eye with the kinematics
echoed in `proj_spawn`; simulate `vy += -18·dt` locally for a
smooth flight. Impact/expiry arrives as `proj_hit`. Arrows also appear in
snapshots as `kind` 10 entities (coarse fallback). Legacy
`{ "t": "shoot" }` still fires instantly at a fixed mid charge using your
Input yaw/pitch.

### 10.2b Firearms (hitscan)

Guns (§13.2b) fire with `fire {dx,dy,dz, ads?}` — no projectile: the server
raycasts instantly from your eye along your direction (after rolling the
weapon's spread cone — tighter with `ads:true`, wider the faster you move,
×0.6 while genuinely crouched / ×0.4
while genuinely prone, §5.6), against blocks and entities,
with **lag compensation** (entity positions are rewound by your latency +
interpolation delay, so aim at what you SEE). Hits in the target's head band
multiply damage; distance applies linear falloff. The server enforces the
weapon's fire interval (shots arriving early are dropped), magazine and
reload: send `weapon_action {action:"reload"}` with matching ammo (§13.2b) in
your inventory, wait `ammo.reloadMs`. **Sprint gate:** a gun/launcher `fire`
is DROPPED (answered only with a re-synced `ammo`, no shot) if your position
history shows sprint speed (> 6.5 blocks/s horizontal) at
any point in the last 250 ms — stop sprinting, wait
the delay, then shoot (the official client lowers the weapon and holds its
own trigger for the same window; charge weapons are exempt). Every accepted
shot answers with your new `ammo` state and broadcasts `shot_fx` (tracer
endpoints) + `hit_fx` (on hits) to the area. Each shot costs the gun 1 durability. A fresh (or slot-moved) gun starts
EMPTY, but a loaded magazine survives a disconnect: it rides your player save
and is pushed back as `ammo` right after `welcome`.

**Bullets vs blocks.** A pellet that ends on a block (`shot_fx` hit `1`)
damages it — guns DEMOLISH, they never mine (a bullet-broken block drops
nothing; containers spill their contents). Rules derive from block hardness
(§13.1): hardness ≤ 0.6 (glass/panes/ice/leaves/snow) **shatters on any
hit**; pickaxe-family blocks (stone/ore/metal), blast-resistant barricades,
bedrock and the spawn-protected zone are **bullet-proof**; everything else
(earth/wood/wool…) drains the block's shared WEAR pool (§9.1) — the same one
mining fills, so gunfire and a pickaxe compose, cracks broadcast to everyone
via `block_damage`, and untouched damage heals after
120 s. Shooting a Blast Charge detonates it.

### 10.2c Explosive ordnance (grenades + the rocket launcher)

Two projectile weapons carry an EXPLOSIVE payload instead of point damage; the
detonation is a full server-side explosion — the same one a Blast Charge makes:
breakable blocks inside the radius shatter (a fraction of their drops scatter;
blast-resistant/unbreakable blocks and the spawn zone survive), engulfed Blast
Charges chain, and every player/mob near the centre takes linear-falloff damage
(**including the shooter** — mind your feet). Each blast is announced with an
`explosion_fx` and the crater arrives as ordinary block deltas.

**Grenade** (§13.2b) is a charge weapon that is its OWN ammo: hold a Grenade,
`weapon_action {action:"draw"}`, then `fire {dx,dy,dz}` — throw speed scales
with your held wind-up time, one Grenade item leaves your inventory per throw.
The grenade (`proj_spawn` kind 1) BOUNCES off blocks (0.45×
velocity kept per bounce, re-announced via `proj_spawn` each time), never hits
entities in flight, and detonates 2 s after release
wherever it lies.

**Rocket launcher** (§13.2b) fires like a gun (semi trigger; 1-round magazine —
reload a Rocket between shots) but spawns a fast, near-flat projectile
(`proj_spawn` kind 2) instead of a hitscan ray; there is no `shot_fx`. The
rocket detonates on ANY contact: a struck entity takes the weapon's direct
damage plus the blast.

### 10.3 PvP

Player-vs-player damage is governed by a WORLD-WIDE combat mode (an admin
setting, persisted server-side): `welcome.pvp` tells you the mode at join and
a broadcast `pvp_mode {on}` announces a live flip. While the world is
**peaceful** (`pvp` absent/false) players cannot hurt each other at all —
melee is rejected and bullets/arrows pass straight through other players.
While it is **PvP**, `attack_player { targetId }` uses the same cooldown/
damage/crit rules as `attack`; a victim holding a raised shield
(`set_blocking`) soaks most frontal hits — melee AND arrows (frontal = the
projectile arrives within ~75° of their facing). No PvP inside the
spawn-protection zone, and a freshly (re)spawned player is briefly
invulnerable (§10.4).

### 10.4 Taking damage & dying

Watch your `stats` messages (HP 0–100). Armour reduces most damage (each
defense point ≈ −4%, capped 80%); starvation/drowning/fall/poison bypass
armour. When you're hit you get `knockback` — apply it. At HP 0 you get
`death` and are **frozen** (movement + all interactive messages ignored) until
you send `respawn`, which snaps you (via `correction`) to your bed spawn (if
its bed still exists), else your territory core (§9.7 — you respawn standing
at your base), else a world spawn. A fresh (re)spawn grants
**5 s of invulnerability** (the Invulnerable status
effect, §13.6 — visible in your `stats.effects`); attacking or firing anything
ends it early. Dying drops your whole inventory + equipped gear into a
**remains chest** at the death spot (see `death`/`corpses` in §7 — owner-only,
right-click to recover everything; accountless sessions scatter field drops
instead). HP regenerates +2/3 s while
hunger ≥ 80; hunger drains 1 per 8 s (faster living costs more — keep food).
Starvation deals no damage while you stand inside a claim you own or belong to
(§9.7) — your base is a safe haven from hunger (hunger still drains to empty,
it just can't cut HP there). Underwater: air drains ~13 s, then 2 HP/s drowning;
it refills in ~1.5 s on the surface.

### 10.5 Mobs & animals

Mob kinds/stats in §13.5. Night MONSTERS (Zombie, Skeleton, Spider, Blastling —
which fuses and explodes) hunt players at night within their aggro range if
the server has them enabled.

**Bosses** (behaviour `slam`/`summon`/`barrage` in §13.5) are persistent world
residents: two dungeon guardians, plus the **field boss** — a colossal
open-plains roamer spawned deterministically per world region (plains/savanna
only, never near the world spawn) that persists like fauna until killed, and
then stays dead for that world. All bosses fight with a melee base kit plus
special moves on cooldowns; the field boss also sprint-charges, and
periodically LIFTS OFF to hover ~9 blocks up and lob explosive seeds
(`proj_spawn` kind 4) that crater unclaimed terrain where they land — watch
the falling arcs and keep moving. Each mortar impact leaves a **Sunflower
Seed** item drop where it landed: a small food, and plantable on Farmland —
it grows a 3-stage sunflower crop (wall-clock, like wheat) whose full bloom
harvests into 2-3 seeds. Hurting any hostile from range (sniper, bow, a
blast) provokes REVENGE aggro: it hunts the attacker far beyond its normal
aggro radius for a while, refreshed per hit. A slain field boss RESPAWNS at
its anchor about an hour (wall-clock — it keeps counting through restarts)
later; `boss_state` tells clients when to drop and when to restore its map
marker. (The dungeon guardians, by contrast, stay dead forever.)

**Animals are persistent biome fauna.** Each biome grows its own species
(plains livestock, forest wolves/bears, desert camels, savanna lions and
antelope, swamp frogs/crocodiles, mountain goats, beach turtles, …): herds are
rolled into a chunk the first time it is ever seen, and their positions/HP are
persisted server-side — every player sees the SAME animals, and a herd you
hunt out stays gone (the land slowly re-grows animals over time). Far-away
animals sleep server-side and wake as you approach; expect them to appear in
snapshots a moment after the terrain streams in. Aggressive wildlife (marked
hostile in §13.5) charges anyone inside its aggro range at ANY hour — watch
for wolves in the forest.

Herbivores can be **fed** (`interact_mob` with their food: wheat for
cow/sheep/pig/goat/camel/antelope, seeds for chicken/rabbit) — feed two adults
to breed a baby. **Shear** sheep with Shears for wool. **Villagers** open a
trade panel (`trade_state`); execute rows with `trade_execute` if you hold the
`give` items.

### 10.6 Vehicles (car, plane)

Vehicles are ordinary snapshot entities under their own MobKinds — they
interpolate, enter/leave AOI and hit-test like mobs, but have no AI: an
unoccupied vehicle sits parked (with gravity), and a **driven vehicle mirrors
its driver's accepted position exactly** (vehicle yaw = the driver's look yaw).

| kind | name | item | hp | top / reverse (b/s) | accel / brake (b/s²) | box | step | mode |
|---|---|---|---|---|---|---|---|---|
| 21 | Car | Car (149) | 60 | 20 / 7 | 7 / 14 | 1.5×1.3 | 1.05 | ground |
| 22 | Plane | Plane (150) | 80 | 45 / 0 | 6 / 11 | 1.2×1.5 | 1.05 | flies (lift ≥ 13 b/s) |
| 25 | Boat | Boat (208) | 50 | 14 / 5 | 3 / 4.5 | 1.6×1.1 | 1.05 | ground |

- **Get one:** craft the matching item (§13.3), then `use_block` on a solid
  block with it held — the vehicle entity spawns on top (needs 2 cells of
  clearance above). The item is consumed.
- **Board:** `mount {vehicleId}` while within reach of an unoccupied one. The
  server teleports you onto the seat and confirms with `mount_state` (kind +
  pose). From then on you keep sending ordinary Input frames — but simulate
  the VEHICLE's physics: top speed from the table above (the anti-cheat cap in
  §8 switches to it), its collision box, its `step` auto-step. Your snapshot
  record gains flags bit 9 (mounted); the vehicle entity rides your position.
- **Fly** (plane): below the lift speed you taxi like a car; at/above it your
  full look direction is the thrust axis — pitch up to climb. The rise cap in
  §8 widens to `maxSpeed × 1.6` while you're mounted on it.
  Fall damage is suppressed while mounted (landing a plane is safe; bailing
  out mid-air is not).
- **Exit:** `dismount` — the vehicle parks where it stands (it persists across
  server restarts). Death, disconnecting and vehicle destruction force-dismount
  you (watch for `mount_state {vehicleId:0}`).
- **Destroy:** melee `attack {vehicleId}` works on vehicles; at 0 HP the wreck
  plays a death animation and drops its item back.

---

## 11. Chat & social

- `chat { text }` (≤200 chars): plain text broadcasts **globally** (persisted;
  new joiners see history).
- `/w <name> <message>` (also `/whisper`, `/msg`, `/tell`) — private whisper.
- `/l <message>` (also `/local`, `/say`) — only players within 48 blocks.
- `/invite <name>` (`/초대`) · `/uninvite <name>` (`/추방`) · `/members`
  (`/멤버`) · `/leave [owner]` (`/탈퇴`) — territory member management
  (§9.7). Replies arrive as `territory_notice` `member*` codes, not chat
  lines.
- Incoming `chat_msg.channel` tells you which channel a line came on;
  `system` lines are server notices (kill feed, mute warnings…).
- A useful bot pattern: listen for commands addressed to you in chat and act
  on them (`"bot: come"`, `"bot: mine 20 iron"` …).

### 11.1 Friends (social graph)

Friendships are between ACCOUNTS (not sessions), keyed by the stable account
id — the same integer that identifies a claim owner/member. Names aren't unique
account keys, so you friend someone by picking their **id** from a name search;
requests + friendships persist by id, so an offline player can still be friended
and can accept later.

- `friend_list_req` → `friend_list { friends[], incoming[], outgoing[] }`. Also
  pushed unprompted after `welcome` and on every change affecting you (a request
  arrives/resolves, a friend logs in/out). `friends[]` entries carry `online`.
- `friend_search { q }` (min 2 chars) → `friend_search_result { results[] }`:
  `{id,name,online}` hits, online-first, with you + your existing friends removed.
- `friend_request { toId }` — send a request. If `toId` had already requested
  you, you auto-become friends (`friend_notice code:"requested"`). The target,
  if online, gets `friend_request_in { fromId, fromName }`.
- `friend_respond { fromId, accept }`, `friend_cancel { toId }`,
  `friend_remove { id }` — accept/decline, cancel outgoing, unfriend.
- Every action answers the actor with a `friend_notice` code (§7). Accountless
  (transient) sessions can't use the friend system.
- The core panel's member invite (§9.7) draws from this friend list —
  `territory_invite` is friend-gated.

---

## 12. A minimal working bot (Node.js)

```js
// npm i ws
import WebSocket from "ws";

const HOST = "wss://tessera.kimhwan.kr"; // or ws://localhost:8080
const ws = new WebSocket(HOST + "/ws");
ws.binaryType = "arraybuffer";

let myId = 0, seq = 0, pos = null, yaw = 0, pitch = 0;

const OP = { Chunk: 1, ChunkUnload: 2, Snapshot: 3, BlockDelta: 4, ItemDrops: 5, Input: 0x10 };
const chunks = new Map(); // "cx,cz" -> Uint16Array(262144)

function sendJson(o) { ws.send(JSON.stringify(o)); }
function sendInput() {
  const b = new DataView(new ArrayBuffer(26));
  b.setUint8(0, OP.Input); b.setUint32(1, ++seq, true);
  b.setFloat32(5, pos.x, true); b.setFloat32(9, pos.y, true); b.setFloat32(13, pos.z, true);
  b.setFloat32(17, yaw, true); b.setFloat32(21, pitch, true); b.setUint8(25, 0);
  ws.send(b.buffer);
}

ws.on("open", () => sendJson({ t: "hello", name: "DocBot", protocol: 7 }));

ws.on("message", (data, isBinary) => {
  if (!isBinary) {
    const m = JSON.parse(data.toString());
    if (m.t === "welcome") { myId = m.playerId; pos = { ...m.spawn }; setInterval(sendInput, 50); }
    if (m.t === "ping") sendJson({ t: "pong", time: m.time });
    if (m.t === "correction") { pos = { x: m.x, y: m.y, z: m.z }; }
    if (m.t === "death") sendJson({ t: "respawn" });
    if (m.t === "chat_msg" && m.text === "hi bot") sendJson({ t: "chat", text: "hello!" });
    return;
  }
  const v = new DataView(data instanceof ArrayBuffer ? data : data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength));
  const op = v.getUint8(0);
  if (op === OP.Chunk) { // expand RLE
    const cx = v.getInt32(1, true), cz = v.getInt32(5, true), runs = v.getUint32(9, true);
    const blocks = new Uint16Array(262144);
    for (let i = 0, p = 13, o = 0; i < runs; i++, p += 4) {
      const n = v.getUint16(p, true), id = v.getUint16(p + 2, true);
      blocks.fill(id, o, o + n); o += n;
    }
    chunks.set(cx + "," + cz, blocks);
  } else if (op === OP.BlockDelta) {
    const n = v.getUint16(1, true);
    for (let i = 0, p = 3; i < n; i++, p += 14) {
      const c = chunks.get(v.getInt32(p, true) + "," + v.getInt32(p + 4, true));
      if (c) c[v.getUint32(p + 8, true)] = v.getUint16(p + 12, true);
    }
  }
});
```

From here: read `blockAt(x,y,z)` out of `chunks`, walk with simple gravity +
collision (§8), scan streamed chunks for ore ids (§13.1) to mine (§9.1), or
place blocks from a blueprint (§9.2). The world is yours.

---

## 13. Data tables (generated from the live registries)

### 13.1 Blocks

`solid` = collides · `opq` = opaque · `brk` = breakable · `hard` = hardness
(break time ≈ hard × 0.75 s by hand) · `tool` = speed-tool type · `minTier` =
tier gate for drops (1 wood 2 stone 3 iron) · `light` = emits light 0..15 ·
`drops` = item you get.

| id | name | solid | opq | brk | hard | tool | minTier | light | drops |
|---|---|---|---|---|---|---|---|---|---|
| 0 | Air |  |  |  | 1 |  |  |  |  |
| 1 | Stone | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Cobblestone (14) |
| 2 | Dirt | ✓ | ✓ | ✓ | 1 | shovel |  |  | 1× Dirt (1) |
| 3 | Grass | ✓ | ✓ | ✓ | 1 | shovel |  |  | 1× Dirt (1) |
| 4 | Sand | ✓ | ✓ | ✓ | 1 | shovel |  |  | 1× Sand (3) |
| 5 | Log | ✓ | ✓ | ✓ | 2 | axe |  |  | 1× Log (10) |
| 6 | Leaves | ✓ | ✓ | ✓ | 0.5 |  |  |  | 1× Leaves (11) |
| 7 | Planks | ✓ | ✓ | ✓ | 2 | axe |  |  | 1× Planks (13) |
| 8 | Cobblestone | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Cobblestone (14) |
| 9 | Crafting Table | ✓ | ✓ | ✓ | 2 | axe |  |  | 1× Crafting Table (43) |
| 10 | Glass | ✓ |  | ✓ | 0.5 |  |  |  | 1× Glass (21) |
| 11 | Bedrock | ✓ | ✓ |  | ∞ |  |  |  |  |
| 12 | Coal Ore | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Coal (62) |
| 13 | Iron Ore | ✓ | ✓ | ✓ | 4 | pickaxe | 2 |  | 1× Raw Iron (65) |
| 14 | Torch |  |  | ✓ | 0 |  |  | 14 | 1× Torch (50) |
| 15 | Furnace | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Furnace (47) |
| 16 | Water |  |  |  | 1 |  |  |  |  |
| 17 | Snow | ✓ | ✓ | ✓ | 0.5 | shovel |  |  | 1× Snow (6) |
| 18 | Ice | ✓ | ✓ | ✓ | 0.5 | pickaxe |  |  | 1× Ice (7) |
| 19 | Cactus | ✓ | ✓ | ✓ | 0.5 |  |  |  | 1× Cactus (8) |
| 20 | Sandstone | ✓ | ✓ | ✓ | 1.5 | pickaxe |  |  | 1× Sandstone (15) |
| 21 | Basalt | ✓ | ✓ | ✓ | 2.5 | pickaxe | 1 |  | 1× Basalt (16) |
| 22 | Obsidian | ✓ | ✓ | ✓ | 12 | pickaxe | 3 |  | 1× Obsidian (17) |
| 23 | Lava |  |  |  | 1 |  |  | 15 |  |
| 24 | Gravel | ✓ | ✓ | ✓ | 1 | shovel |  |  | 1× Gravel (4) |
| 25 | Mud | ✓ | ✓ | ✓ | 0.8 | shovel |  |  | 1× Mud (5) |
| 26 | Savanna Grass | ✓ | ✓ | ✓ | 0.5 | shovel |  |  | 1× Savanna Grass (9) |
| 27 | Wood Slab | ✓ |  | ✓ | 2 | axe |  |  | 1× Wood Slab (24) |
| 28 | Stone Slab | ✓ |  | ✓ | 3 | pickaxe | 1 |  | 1× Stone Slab (25) |
| 29 | Wood Stairs | ✓ |  | ✓ | 2 | axe |  |  | 1× Wood Stairs (28) |
| 30 | Wood Stairs | ✓ |  | ✓ | 2 | axe |  |  | 1× Wood Stairs (28) |
| 31 | Wood Stairs | ✓ |  | ✓ | 2 | axe |  |  | 1× Wood Stairs (28) |
| 32 | Wood Stairs | ✓ |  | ✓ | 2 | axe |  |  | 1× Wood Stairs (28) |
| 33 | Stone Stairs | ✓ |  | ✓ | 3 | pickaxe | 1 |  | 1× Stone Stairs (29) |
| 34 | Stone Stairs | ✓ |  | ✓ | 3 | pickaxe | 1 |  | 1× Stone Stairs (29) |
| 35 | Stone Stairs | ✓ |  | ✓ | 3 | pickaxe | 1 |  | 1× Stone Stairs (29) |
| 36 | Stone Stairs | ✓ |  | ✓ | 3 | pickaxe | 1 |  | 1× Stone Stairs (29) |
| 37 | Ladder |  |  | ✓ | 0.4 | axe |  |  | 1× Ladder (32) |
| 38 | Wood Fence | ✓ |  | ✓ | 2 | axe |  |  | 1× Wood Fence (33) |
| 39 | Glass Pane | ✓ |  | ✓ | 0.5 |  |  |  | 1× Glass Pane (22) |
| 40 | Farmland | ✓ | ✓ | ✓ | 0.6 | shovel |  |  | 1× Dirt (1) |
| 41 | Wheat Crop |  |  | ✓ | 0 |  |  |  |  |
| 42 | Wheat Crop |  |  | ✓ | 0 |  |  |  |  |
| 43 | Wheat Crop |  |  | ✓ | 0 |  |  |  |  |
| 44 | Wheat Crop |  |  | ✓ | 0 |  |  |  |  |
| 45 | Wool | ✓ | ✓ | ✓ | 0.8 |  |  |  | 1× Wool (23) |
| 46 | Torch |  |  | ✓ | 0 |  |  | 14 | 1× Torch (50) |
| 47 | Torch |  |  | ✓ | 0 |  |  | 14 | 1× Torch (50) |
| 48 | Torch |  |  | ✓ | 0 |  |  | 14 | 1× Torch (50) |
| 49 | Torch |  |  | ✓ | 0 |  |  | 14 | 1× Torch (50) |
| 50 | Ladder |  |  | ✓ | 0.4 | axe |  |  | 1× Ladder (32) |
| 51 | Ladder |  |  | ✓ | 0.4 | axe |  |  | 1× Ladder (32) |
| 52 | Ladder |  |  | ✓ | 0.4 | axe |  |  | 1× Ladder (32) |
| 53 | Ladder |  |  | ✓ | 0.4 | axe |  |  | 1× Ladder (32) |
| 54 | Fire |  |  | ✓ | 0 |  |  | 15 |  |
| 55 | Gold Ore | ✓ | ✓ | ✓ | 4 | pickaxe | 2 |  | 1× Raw Gold (67) |
| 56 | Diamond Ore | ✓ | ✓ | ✓ | 5 | pickaxe | 3 |  | 1× Diamond (69) |
| 57 | Coal Block | ✓ | ✓ | ✓ | 5 | pickaxe |  |  | 1× Block of Coal (39) |
| 58 | Iron Block | ✓ | ✓ | ✓ | 5 | pickaxe | 1 |  | 1× Block of Iron (40) |
| 59 | Gold Block | ✓ | ✓ | ✓ | 5 | pickaxe | 2 |  | 1× Block of Gold (41) |
| 60 | Diamond Block | ✓ | ✓ | ✓ | 5 | pickaxe | 2 |  | 1× Block of Diamond (42) |
| 61 | Blast Charge | ✓ | ✓ | ✓ | 0.5 |  |  |  | 1× Blast Charge (130) |
| 62 | Sapling |  |  | ✓ | 0 |  |  |  | 1× Sapling (12) |
| 63 | Chest | ✓ | ✓ | ✓ | 2 | axe |  |  | 1× Chest (48) |
| 64 | Bed | ✓ |  | ✓ | 0.4 |  |  |  | 1× Bed (49) |
| 65 | Trapdoor | ✓ |  | ✓ | 2 | axe |  |  | 1× Trapdoor (38) |
| 66 | Trapdoor | ✓ |  | ✓ | 2 | axe |  |  | 1× Trapdoor (38) |
| 67 | Trapdoor | ✓ |  | ✓ | 2 | axe |  |  | 1× Trapdoor (38) |
| 68 | Trapdoor | ✓ |  | ✓ | 2 | axe |  |  | 1× Trapdoor (38) |
| 69 | Trapdoor | ✓ |  | ✓ | 2 | axe |  |  | 1× Trapdoor (38) |
| 70 | Door | ✓ |  | ✓ | 2 | axe |  |  | 1× Door (37) |
| 71 | Door | ✓ |  | ✓ | 2 | axe |  |  | 1× Door (37) |
| 72 | Door | ✓ |  | ✓ | 2 | axe |  |  | 1× Door (37) |
| 73 | Door | ✓ |  | ✓ | 2 | axe |  |  | 1× Door (37) |
| 74 | Door | ✓ |  | ✓ | 2 | axe |  |  | 1× Door (37) |
| 75 | Door | ✓ |  | ✓ | 2 | axe |  |  | 1× Door (37) |
| 76 | Door | ✓ |  | ✓ | 2 | axe |  |  | 1× Door (37) |
| 77 | Door | ✓ |  | ✓ | 2 | axe |  |  | 1× Door (37) |
| 78 | Signal Ore | ✓ | ✓ | ✓ | 3 | pickaxe | 2 |  | 4× Signal Conduit (53) |
| 79 | Signal Conduit | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Conduit (53) |
| 80 | Signal Switch | ✓ |  | ✓ | 0.8 | pickaxe |  |  | 1× Signal Switch (54) |
| 81 | Signal Switch | ✓ |  | ✓ | 0.8 | pickaxe |  |  | 1× Signal Switch (54) |
| 82 | Signal Button | ✓ | ✓ | ✓ | 0.8 | pickaxe |  |  | 1× Signal Button (55) |
| 83 | Signal Button | ✓ | ✓ | ✓ | 0.8 | pickaxe |  |  | 1× Signal Button (55) |
| 84 | Signal Lamp | ✓ |  | ✓ | 1.5 |  |  |  | 1× Signal Lamp (56) |
| 85 | Signal Lamp | ✓ |  | ✓ | 1.5 |  |  | 15 | 1× Signal Lamp (56) |
| 86 | Signal Conduit | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Conduit (53) |
| 87 | Signal Conduit | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Conduit (53) |
| 88 | Signal Conduit | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Conduit (53) |
| 89 | Signal Conduit | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Conduit (53) |
| 90 | Enchanting Table | ✓ | ✓ | ✓ | 5 |  |  | 7 | 1× Enchanting Table (51) |
| 91 | Anvil | ✓ | ✓ | ✓ | 5 |  |  |  | 1× Anvil (52) |
| 92 | Signal Conduit | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Conduit (53) |
| 93 | Signal Conduit | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Conduit (53) |
| 94 | Signal Conduit | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Conduit (53) |
| 95 | Signal Conduit | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Conduit (53) |
| 96 | Signal Conduit | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Conduit (53) |
| 97 | Stone Bricks | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Stone Bricks (18) |
| 98 | Cracked Stone Bricks | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Cracked Stone Bricks (19) |
| 99 | Chiseled Stone Bricks | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Chiseled Stone Bricks (20) |
| 100 | Flowing Water |  |  |  | 1 |  |  |  |  |
| 101 | Flowing Water |  |  |  | 1 |  |  |  |  |
| 102 | Flowing Water |  |  |  | 1 |  |  |  |  |
| 103 | Flowing Water |  |  |  | 1 |  |  |  |  |
| 104 | Flowing Water |  |  |  | 1 |  |  |  |  |
| 105 | Flowing Water |  |  |  | 1 |  |  |  |  |
| 106 | Flowing Water |  |  |  | 1 |  |  |  |  |
| 107 | Flowing Lava |  |  |  | 1 |  |  | 15 |  |
| 108 | Flowing Lava |  |  |  | 1 |  |  | 15 |  |
| 109 | Flowing Lava |  |  |  | 1 |  |  | 15 |  |
| 110 | Flowing Lava |  |  |  | 1 |  |  | 15 |  |
| 111 | Flowing Lava |  |  |  | 1 |  |  | 15 |  |
| 112 | Flowing Lava |  |  |  | 1 |  |  | 15 |  |
| 113 | Flowing Lava |  |  |  | 1 |  |  | 15 |  |
| 114 | Signal Repeater | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Repeater (57) |
| 115 | Signal Repeater | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Repeater (57) |
| 116 | Signal Repeater | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Repeater (57) |
| 117 | Signal Repeater | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Repeater (57) |
| 118 | Signal Repeater | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Repeater (57) |
| 119 | Signal Repeater | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Repeater (57) |
| 120 | Signal Repeater | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Repeater (57) |
| 121 | Signal Repeater | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Repeater (57) |
| 122 | Signal Switch | ✓ |  | ✓ | 0.8 | pickaxe |  |  | 1× Signal Switch (54) |
| 123 | Signal Switch | ✓ |  | ✓ | 0.8 | pickaxe |  |  | 1× Signal Switch (54) |
| 124 | Signal Switch | ✓ |  | ✓ | 0.8 | pickaxe |  |  | 1× Signal Switch (54) |
| 125 | Signal Switch | ✓ |  | ✓ | 0.8 | pickaxe |  |  | 1× Signal Switch (54) |
| 126 | Signal Switch | ✓ |  | ✓ | 0.8 | pickaxe |  |  | 1× Signal Switch (54) |
| 127 | Signal Switch | ✓ |  | ✓ | 0.8 | pickaxe |  |  | 1× Signal Switch (54) |
| 128 | Signal Switch | ✓ |  | ✓ | 0.8 | pickaxe |  |  | 1× Signal Switch (54) |
| 129 | Signal Switch | ✓ |  | ✓ | 0.8 | pickaxe |  |  | 1× Signal Switch (54) |
| 130 | Signal Repeater | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Repeater (57) |
| 131 | Signal Repeater | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Repeater (57) |
| 132 | Signal Repeater | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Repeater (57) |
| 133 | Signal Repeater | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Repeater (57) |
| 134 | Signal Repeater | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Repeater (57) |
| 135 | Signal Repeater | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Repeater (57) |
| 136 | Signal Repeater | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Repeater (57) |
| 137 | Signal Repeater | ✓ |  | ✓ | 0 |  |  |  | 1× Signal Repeater (57) |
| 138 | Stone Brick Slab | ✓ |  | ✓ | 3 | pickaxe | 1 |  | 1× Stone Brick Slab (26) |
| 139 | Sandstone Slab | ✓ |  | ✓ | 1.5 | pickaxe |  |  | 1× Sandstone Slab (27) |
| 140 | Stone Brick Stairs | ✓ |  | ✓ | 3 | pickaxe | 1 |  | 1× Stone Brick Stairs (30) |
| 141 | Stone Brick Stairs | ✓ |  | ✓ | 3 | pickaxe | 1 |  | 1× Stone Brick Stairs (30) |
| 142 | Stone Brick Stairs | ✓ |  | ✓ | 3 | pickaxe | 1 |  | 1× Stone Brick Stairs (30) |
| 143 | Stone Brick Stairs | ✓ |  | ✓ | 3 | pickaxe | 1 |  | 1× Stone Brick Stairs (30) |
| 144 | Sandstone Stairs | ✓ |  | ✓ | 1.5 | pickaxe |  |  | 1× Sandstone Stairs (31) |
| 145 | Sandstone Stairs | ✓ |  | ✓ | 1.5 | pickaxe |  |  | 1× Sandstone Stairs (31) |
| 146 | Sandstone Stairs | ✓ |  | ✓ | 1.5 | pickaxe |  |  | 1× Sandstone Stairs (31) |
| 147 | Sandstone Stairs | ✓ |  | ✓ | 1.5 | pickaxe |  |  | 1× Sandstone Stairs (31) |
| 148 | Wood Slab | ✓ |  | ✓ | 2 | axe |  |  | 1× Wood Slab (24) |
| 149 | Stone Slab | ✓ |  | ✓ | 3 | pickaxe | 1 |  | 1× Stone Slab (25) |
| 150 | Stone Brick Slab | ✓ |  | ✓ | 3 | pickaxe | 1 |  | 1× Stone Brick Slab (26) |
| 151 | Sandstone Slab | ✓ |  | ✓ | 1.5 | pickaxe |  |  | 1× Sandstone Slab (27) |
| 152 | Iron Bars | ✓ |  | ✓ | 5 | pickaxe | 1 |  | 1× Iron Bars (36) |
| 153 | Cobblestone Wall | ✓ |  | ✓ | 3 | pickaxe | 1 |  | 1× Cobblestone Wall (35) |
| 154 | Fence Gate | ✓ |  | ✓ | 2 | axe |  |  | 1× Fence Gate (34) |
| 155 | Fence Gate | ✓ |  | ✓ | 2 | axe |  |  | 1× Fence Gate (34) |
| 156 | Fence Gate | ✓ |  | ✓ | 2 | axe |  |  | 1× Fence Gate (34) |
| 157 | Fence Gate | ✓ |  | ✓ | 2 | axe |  |  | 1× Fence Gate (34) |
| 158 | Fence Gate | ✓ |  | ✓ | 2 | axe |  |  | 1× Fence Gate (34) |
| 159 | Fence Gate | ✓ |  | ✓ | 2 | axe |  |  | 1× Fence Gate (34) |
| 160 | Fence Gate | ✓ |  | ✓ | 2 | axe |  |  | 1× Fence Gate (34) |
| 161 | Fence Gate | ✓ |  | ✓ | 2 | axe |  |  | 1× Fence Gate (34) |
| 162 | Bolt Turret | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Bolt Turret (58) |
| 163 | Spike Trap |  |  | ✓ | 1 | pickaxe |  |  | 1× Spike Trap (59) |
| 164 | Reinforced Barricade | ✓ | ✓ | ✓ | 6 | pickaxe | 1 |  | 1× Reinforced Barricade (60) |
| 165 | Advanced Workbench | ✓ | ✓ | ✓ | 2.5 | axe |  |  | 1× Advanced Workbench (44) |
| 166 | Gunsmith Bench | ✓ | ✓ | ✓ | 4 | pickaxe | 1 |  | 1× Gunsmith Bench (45) |
| 167 | Advanced Gunsmith Bench | ✓ | ✓ | ✓ | 5 | pickaxe | 2 |  | 1× Advanced Gunsmith Bench (46) |
| 168 | Territory Core | ✓ | ✓ | ✓ | 6 | pickaxe |  | 10 | 1× Territory Core (148) |
| 169 | Remains Chest | ✓ | ✓ |  | ∞ |  |  | 6 |  |
| 170 | Resource Extractor | ✓ | ✓ | ✓ | 4 | pickaxe | 1 |  | 1× Resource Extractor (151) |
| 171 | Item Collector | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Item Collector (152) |
| 172 | Auto Harvester | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Auto Harvester (153) |
| 173 | Auto Crafter | ✓ | ✓ | ✓ | 4 | pickaxe | 1 |  | 1× Auto Crafter (154) |
| 174 | Treasury | ✓ | ✓ | ✓ | 3 | axe |  |  | 1× Treasury (157) |
| 175 | Alchemy Station | ✓ | ✓ | ✓ | 2.5 | pickaxe |  |  | 1× Alchemy Station (158) |
| 176 | Concrete | ✓ | ✓ | ✓ | 2.2 | pickaxe | 1 |  | 1× Concrete (165) |
| 177 | Dark Concrete | ✓ | ✓ | ✓ | 2.2 | pickaxe | 1 |  | 1× Dark Concrete (166) |
| 178 | Glass Curtain Wall | ✓ | ✓ | ✓ | 1.5 | pickaxe |  |  | 1× Glass Curtain Wall (167) |
| 179 | Asphalt | ✓ | ✓ | ✓ | 2 | pickaxe | 1 |  | 1× Asphalt (168) |
| 180 | Crosswalk | ✓ | ✓ | ✓ | 2 | pickaxe | 1 |  | 1× Crosswalk (169) |
| 181 | Road Marking | ✓ | ✓ | ✓ | 2 | pickaxe | 1 |  | 1× Road Marking (170) |
| 182 | Traffic Light | ✓ | ✓ | ✓ | 1.5 | pickaxe |  | 7 | 1× Traffic Light (171) |
| 183 | Green Curtain Wall | ✓ | ✓ | ✓ | 1.5 | pickaxe |  |  | 1× Green Curtain Wall (172) |
| 184 | Neon Sign | ✓ | ✓ | ✓ | 1 |  |  | 12 | 1× Neon Sign (173) |
| 185 | Mossy Concrete | ✓ | ✓ | ✓ | 2.2 | pickaxe | 1 |  | 1× Mossy Concrete (174) |
| 186 | Cracked Asphalt | ✓ | ✓ | ✓ | 2 | pickaxe | 1 |  | 1× Cracked Asphalt (175) |
| 187 | Rubble | ✓ | ✓ | ✓ | 1.6 | pickaxe | 1 |  | 1× Rubble (176) |
| 188 | Sign |  |  | ✓ | 1 | axe |  |  | 1× Sign (177) |
| 189 | Red Wool | ✓ | ✓ | ✓ | 0.8 |  |  |  | 1× Red Wool (186) |
| 190 | Orange Wool | ✓ | ✓ | ✓ | 0.8 |  |  |  | 1× Orange Wool (187) |
| 191 | Yellow Wool | ✓ | ✓ | ✓ | 0.8 |  |  |  | 1× Yellow Wool (188) |
| 192 | Green Wool | ✓ | ✓ | ✓ | 0.8 |  |  |  | 1× Green Wool (189) |
| 193 | Brown Wool | ✓ | ✓ | ✓ | 0.8 |  |  |  | 1× Brown Wool (190) |
| 194 | Black Wool | ✓ | ✓ | ✓ | 0.8 |  |  |  | 1× Black Wool (191) |
| 195 | White Wool | ✓ | ✓ | ✓ | 0.8 |  |  |  | 1× White Wool (192) |
| 196 | Pink Wool | ✓ | ✓ | ✓ | 0.8 |  |  |  | 1× Pink Wool (193) |
| 197 | Red Glass | ✓ |  | ✓ | 0.5 |  |  |  | 1× Red Glass (194) |
| 198 | Orange Glass | ✓ |  | ✓ | 0.5 |  |  |  | 1× Orange Glass (195) |
| 199 | Yellow Glass | ✓ |  | ✓ | 0.5 |  |  |  | 1× Yellow Glass (196) |
| 200 | Green Glass | ✓ |  | ✓ | 0.5 |  |  |  | 1× Green Glass (197) |
| 201 | Brown Glass | ✓ |  | ✓ | 0.5 |  |  |  | 1× Brown Glass (198) |
| 202 | Black Glass | ✓ |  | ✓ | 0.5 |  |  |  | 1× Black Glass (199) |
| 203 | White Glass | ✓ |  | ✓ | 0.5 |  |  |  | 1× White Glass (200) |
| 204 | Pink Glass | ✓ |  | ✓ | 0.5 |  |  |  | 1× Pink Glass (201) |
| 205 | Hopper | ✓ | ✓ | ✓ | 2.2 | pickaxe | 1 |  | 1× Hopper (203) |
| 206 | Tall Grass |  |  | ✓ | 0 |  |  |  | 1× Tall Grass (204) |
| 207 | Red Flower |  |  | ✓ | 0 |  |  |  | 1× Red Flower (205) |
| 208 | Yellow Flower |  |  | ✓ | 0 |  |  |  | 1× Yellow Flower (206) |
| 209 | Glow Crystal | ✓ | ✓ | ✓ | 1.5 | pickaxe | 1 | 13 | 1× Glow Crystal (207) |
| 210 | Sign |  |  | ✓ | 1 | axe |  |  | 1× Sign (177) |
| 211 | Sign |  |  | ✓ | 1 | axe |  |  | 1× Sign (177) |
| 212 | Sign |  |  | ✓ | 1 | axe |  |  | 1× Sign (177) |
| 213 | Music Player | ✓ | ✓ | ✓ | 2 | pickaxe | 1 |  | 1× Music Player (209) |
| 214 | Music Player | ✓ | ✓ | ✓ | 2 | pickaxe | 1 | 6 | 1× Music Player (209) |
| 215 | Sunflower |  |  | ✓ | 0 |  |  |  |  |
| 216 | Sunflower |  |  | ✓ | 0 |  |  |  |  |
| 217 | Sunflower |  |  | ✓ | 0 |  |  |  |  |
| 218 | Repeater Turret | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Repeater Turret (213) |
| 219 | Mortar Turret | ✓ | ✓ | ✓ | 3.5 | pickaxe | 1 |  | 1× Mortar Turret (214) |
| 220 | Tesla Coil | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Tesla Coil (215) |
| 221 | Mossy Stone Bricks | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Mossy Stone Bricks (216) |
| 222 | Mossy Cobblestone | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Mossy Cobblestone (217) |
| 223 | Red Bricks | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Red Bricks (218) |
| 224 | Marble | ✓ | ✓ | ✓ | 2.5 | pickaxe | 1 |  | 1× Marble (219) |
| 225 | Marble Pillar | ✓ | ✓ | ✓ | 2.5 | pickaxe | 1 |  | 1× Marble Pillar (220) |
| 226 | Ceramic Tiles | ✓ | ✓ | ✓ | 1.5 | pickaxe | 1 |  | 1× Ceramic Tiles (221) |
| 227 | Bookshelf | ✓ | ✓ | ✓ | 2 | axe |  |  | 1× Bookshelf (222) |
| 228 | Stone Brick Wall | ✓ |  | ✓ | 3 | pickaxe | 1 |  | 1× Stone Brick Wall (223) |
| 229 | Sandstone Wall | ✓ |  | ✓ | 1.5 | pickaxe |  |  | 1× Sandstone Wall (224) |
| 230 | Gilded Bars | ✓ |  | ✓ | 5 | pickaxe | 1 |  | 1× Gilded Bars (225) |
| 231 | Wooden Lattice | ✓ |  | ✓ | 1 | axe |  |  | 1× Wooden Lattice (226) |
| 232 | Lumen Block | ✓ | ✓ | ✓ | 1 | pickaxe | 1 | 15 | 1× Lumen Block (227) |
| 233 | Compactor | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Compactor (237) |
| 234 | Gun Turret | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Gun Turret (238) |
| 235 | Rocket Turret | ✓ | ✓ | ✓ | 3.5 | pickaxe | 1 |  | 1× Rocket Turret (239) |
| 236 | Railgun Turret | ✓ | ✓ | ✓ | 3.5 | pickaxe | 2 |  | 1× Railgun Turret (240) |
| 237 | Flame Turret | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Flame Turret (241) |
| 238 | Power Cable | ✓ |  | ✓ | 0 | pickaxe |  |  | 1× Power Cable (242) |
| 239 | Power Cable | ✓ |  | ✓ | 0 | pickaxe |  |  | 1× Power Cable (242) |
| 240 | Solar Panel | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Solar Panel (243) |
| 241 | Coal Generator | ✓ | ✓ | ✓ | 4 | pickaxe | 1 |  | 1× Coal Generator (244) |
| 242 | Wind Turbine | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Wind Turbine (245) |
| 243 | Geothermal Generator | ✓ | ✓ | ✓ | 4 | pickaxe | 1 |  | 1× Geothermal Generator (246) |
| 244 | Hydro Generator | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Hydro Generator (247) |
| 245 | Battery | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Battery (248) |
| 246 | Electric Furnace | ✓ | ✓ | ✓ | 4 | pickaxe | 1 |  | 1× Electric Furnace (249) |
| 247 | Electric Miner | ✓ | ✓ | ✓ | 4 | pickaxe | 1 |  | 1× Electric Miner (250) |
| 248 | Assembler | ✓ | ✓ | ✓ | 4 | pickaxe | 1 |  | 1× Assembler (251) |
| 249 | Crusher | ✓ | ✓ | ✓ | 4 | pickaxe | 1 |  | 1× Crusher (252) |
| 250 | Sawmill | ✓ | ✓ | ✓ | 3 | pickaxe | 1 |  | 1× Sawmill (253) |
| 251 | Electric Lamp | ✓ | ✓ | ✓ | 1 | pickaxe | 1 |  | 1× Electric Lamp (254) |
| 252 | Electric Lamp | ✓ | ✓ | ✓ | 1 | pickaxe | 1 | 15 | 1× Electric Lamp (254) |

### 13.2 Items

`stack` = max stack · `places` = block placed · tool columns apply when the
type matches the block's · `dmg` = melee damage · `food` = hunger restored ·
`armor` = slot/defense.

| id | name | category | stack | places | tool | dur | dmg | food | armor | notes |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Empty | special | 0 |  |  |  |  |  |  |  |
| 1 | Dirt | terrain | 64 | Dirt (2) |  |  |  |  |  |  |
| 2 | Grass Block | terrain | 64 | Grass (3) |  |  |  |  |  |  |
| 3 | Sand | terrain | 64 | Sand (4) |  |  |  |  |  |  |
| 4 | Gravel | terrain | 64 | Gravel (24) |  |  |  |  |  |  |
| 5 | Mud | terrain | 64 | Mud (25) |  |  |  |  |  |  |
| 6 | Snow | terrain | 64 | Snow (17) |  |  |  |  |  |  |
| 7 | Ice | terrain | 64 | Ice (18) |  |  |  |  |  |  |
| 8 | Cactus | terrain | 64 | Cactus (19) |  |  |  |  |  |  |
| 9 | Savanna Grass | terrain | 64 | Savanna Grass (26) |  |  |  |  |  |  |
| 10 | Log | terrain | 64 | Log (5) |  |  |  |  |  |  |
| 11 | Leaves | terrain | 64 | Leaves (6) |  |  |  |  |  |  |
| 12 | Sapling | terrain | 64 | Sapling (62) |  |  |  |  |  |  |
| 13 | Planks | building | 64 | Planks (7) |  |  |  |  |  |  |
| 14 | Cobblestone | building | 64 | Cobblestone (8) |  |  |  |  |  |  |
| 15 | Sandstone | building | 64 | Sandstone (20) |  |  |  |  |  |  |
| 16 | Basalt | building | 64 | Basalt (21) |  |  |  |  |  |  |
| 17 | Obsidian | building | 64 | Obsidian (22) |  |  |  |  |  |  |
| 18 | Stone Bricks | building | 64 | Stone Bricks (97) |  |  |  |  |  |  |
| 19 | Cracked Stone Bricks | building | 64 | Cracked Stone Bricks (98) |  |  |  |  |  |  |
| 20 | Chiseled Stone Bricks | building | 64 | Chiseled Stone Bricks (99) |  |  |  |  |  |  |
| 21 | Glass | building | 64 | Glass (10) |  |  |  |  |  |  |
| 22 | Glass Pane | building | 64 | Glass Pane (39) |  |  |  |  |  |  |
| 23 | Wool | building | 64 | Wool (45) |  |  |  |  |  |  |
| 24 | Wood Slab | building | 64 | Wood Slab (27) |  |  |  |  |  |  |
| 25 | Stone Slab | building | 64 | Stone Slab (28) |  |  |  |  |  |  |
| 26 | Stone Brick Slab | building | 64 | Stone Brick Slab (138) |  |  |  |  |  |  |
| 27 | Sandstone Slab | building | 64 | Sandstone Slab (139) |  |  |  |  |  |  |
| 28 | Wood Stairs | building | 64 | Wood Stairs (29) |  |  |  |  |  |  |
| 29 | Stone Stairs | building | 64 | Stone Stairs (33) |  |  |  |  |  |  |
| 30 | Stone Brick Stairs | building | 64 | Stone Brick Stairs (140) |  |  |  |  |  |  |
| 31 | Sandstone Stairs | building | 64 | Sandstone Stairs (144) |  |  |  |  |  |  |
| 32 | Ladder | building | 64 | Ladder (37) |  |  |  |  |  |  |
| 33 | Wood Fence | building | 64 | Wood Fence (38) |  |  |  |  |  |  |
| 34 | Fence Gate | building | 64 | Fence Gate (154) |  |  |  |  |  |  |
| 35 | Cobblestone Wall | building | 64 | Cobblestone Wall (153) |  |  |  |  |  |  |
| 36 | Iron Bars | building | 64 | Iron Bars (152) |  |  |  |  |  |  |
| 37 | Door | building | 64 | Door (70) |  |  |  |  |  |  |
| 38 | Trapdoor | building | 64 | Trapdoor (65) |  |  |  |  |  |  |
| 39 | Block of Coal | building | 64 | Coal Block (57) |  |  |  |  |  |  |
| 40 | Block of Iron | building | 64 | Iron Block (58) |  |  |  |  |  |  |
| 41 | Block of Gold | building | 64 | Gold Block (59) |  |  |  |  |  |  |
| 42 | Block of Diamond | building | 64 | Diamond Block (60) |  |  |  |  |  |  |
| 43 | Crafting Table | functional | 64 | Crafting Table (9) |  |  |  |  |  |  |
| 44 | Advanced Workbench | functional | 64 | Advanced Workbench (165) |  |  |  |  |  |  |
| 45 | Gunsmith Bench | functional | 64 | Gunsmith Bench (166) |  |  |  |  |  |  |
| 46 | Advanced Gunsmith Bench | functional | 64 | Advanced Gunsmith Bench (167) |  |  |  |  |  |  |
| 47 | Furnace | functional | 64 | Furnace (15) |  |  |  |  |  |  |
| 48 | Chest | functional | 64 | Chest (63) |  |  |  |  |  |  |
| 49 | Bed | functional | 64 | Bed (64) |  |  |  |  |  |  |
| 50 | Torch | functional | 64 | Torch (14) |  |  |  |  |  |  |
| 51 | Enchanting Table | functional | 64 | Enchanting Table (90) |  |  |  |  |  |  |
| 52 | Anvil | functional | 64 | Anvil (91) |  |  |  |  |  |  |
| 53 | Signal Conduit | signal | 64 | Signal Conduit (79) |  |  |  |  |  |  |
| 54 | Signal Switch | signal | 64 | Signal Switch (80) |  |  |  |  |  |  |
| 55 | Signal Button | signal | 64 | Signal Button (82) |  |  |  |  |  |  |
| 56 | Signal Lamp | signal | 64 | Signal Lamp (84) |  |  |  |  |  |  |
| 57 | Signal Repeater | signal | 64 | Signal Repeater (114) |  |  |  |  |  |  |
| 58 | Bolt Turret | defense | 64 | Bolt Turret (162) |  |  |  |  |  |  |
| 59 | Spike Trap | defense | 64 | Spike Trap (163) |  |  |  |  |  |  |
| 60 | Reinforced Barricade | defense | 64 | Reinforced Barricade (164) |  |  |  |  |  |  |
| 61 | Stick | material | 64 |  |  |  |  |  |  |  |
| 62 | Coal | material | 64 |  |  |  |  |  |  |  |
| 63 | Charcoal | material | 64 |  |  |  |  |  |  |  |
| 64 | Flint | material | 64 |  |  |  |  |  |  |  |
| 65 | Raw Iron | material | 64 |  |  |  |  |  |  |  |
| 66 | Iron Ingot | material | 64 |  |  |  |  |  |  |  |
| 67 | Raw Gold | material | 64 |  |  |  |  |  |  |  |
| 68 | Gold Ingot | material | 64 |  |  |  |  |  |  |  |
| 69 | Diamond | material | 64 |  |  |  |  |  |  |  |
| 70 | Emerald | material | 64 |  |  |  |  |  |  |  |
| 71 | Leather | material | 64 |  |  |  |  |  |  |  |
| 72 | String | material | 64 |  |  |  |  |  |  |  |
| 73 | Bone | material | 64 |  |  |  |  |  |  |  |
| 74 | Bone Meal | material | 64 |  |  |  |  |  |  |  |
| 75 | Blast Powder | material | 64 |  |  |  |  |  |  |  |
| 76 | Wheat Seeds | material | 64 |  |  |  |  |  |  | plants Wheat Crop (41) |
| 77 | Wheat | material | 64 |  |  |  |  |  |  |  |
| 78 | Apple | food | 64 |  |  |  |  | 20 |  |  |
| 79 | Golden Apple | food | 64 |  |  |  |  | 20 |  |  |
| 80 | Bread | food | 64 |  |  |  |  | 16 |  |  |
| 81 | Raw Meat | food | 64 |  |  |  |  | 6 |  |  |
| 82 | Cooked Meat | food | 64 |  |  |  |  | 16 |  |  |
| 83 | Fish | food | 64 |  |  |  |  | 5 |  |  |
| 84 | Cooked Fish | food | 64 |  |  |  |  | 11 |  |  |
| 85 | Wooden Pickaxe | tool | 1 |  | pickaxe t1 ×4 | 60 | 2 |  |  |  |
| 86 | Stone Pickaxe | tool | 1 |  | pickaxe t2 ×6 | 130 | 3 |  |  |  |
| 87 | Iron Pickaxe | tool | 1 |  | pickaxe t3 ×8 | 250 | 4 |  |  |  |
| 88 | Gold Pickaxe | tool | 1 |  | pickaxe t2 ×12 | 32 | 2 |  |  |  |
| 89 | Diamond Pickaxe | tool | 1 |  | pickaxe t4 ×10 | 800 | 5 |  |  |  |
| 90 | Wooden Axe | tool | 1 |  | axe t1 ×4 | 60 | 3 |  |  |  |
| 91 | Stone Axe | tool | 1 |  | axe t2 ×6 | 130 | 4 |  |  |  |
| 92 | Iron Axe | tool | 1 |  | axe t3 ×8 | 250 | 5 |  |  |  |
| 93 | Gold Axe | tool | 1 |  | axe t2 ×12 | 32 | 3 |  |  |  |
| 94 | Diamond Axe | tool | 1 |  | axe t4 ×10 | 800 | 6 |  |  |  |
| 95 | Wooden Shovel | tool | 1 |  | shovel t1 ×4 | 60 | 2 |  |  |  |
| 96 | Stone Shovel | tool | 1 |  | shovel t2 ×6 | 130 | 3 |  |  |  |
| 97 | Iron Shovel | tool | 1 |  | shovel t3 ×8 | 250 | 4 |  |  |  |
| 98 | Gold Shovel | tool | 1 |  | shovel t2 ×12 | 32 | 2 |  |  |  |
| 99 | Diamond Shovel | tool | 1 |  | shovel t4 ×10 | 800 | 5 |  |  |  |
| 100 | Wooden Hoe | tool | 1 |  | hoe t1 ×1 | 60 | 1 |  |  |  |
| 101 | Stone Hoe | tool | 1 |  | hoe t2 ×1 | 130 | 1 |  |  |  |
| 102 | Iron Hoe | tool | 1 |  | hoe t3 ×1 | 250 | 2 |  |  |  |
| 103 | Gold Hoe | tool | 1 |  | hoe t2 ×1 | 32 | 1 |  |  |  |
| 104 | Diamond Hoe | tool | 1 |  | hoe t4 ×1 | 800 | 3 |  |  |  |
| 105 | Shears | tool | 64 |  |  | 238 | 1 |  |  |  |
| 106 | Fishing Rod | tool | 1 |  |  | 64 |  |  |  |  |
| 107 | Flint and Steel | tool | 1 |  |  | 64 |  |  |  |  |
| 108 | Bucket | tool | 1 |  |  |  |  |  |  |  |
| 109 | Water Bucket | tool | 1 | Water (16) |  |  |  |  |  | empties→Bucket (108) |
| 110 | Lava Bucket | tool | 1 | Lava (23) |  |  |  |  |  | empties→Bucket (108) |
| 111 | Wooden Sword | weapon | 1 |  |  | 60 | 4 |  |  |  |
| 112 | Stone Sword | weapon | 1 |  |  | 130 | 5 |  |  |  |
| 113 | Iron Sword | weapon | 1 |  |  | 250 | 6 |  |  |  |
| 114 | Gold Sword | weapon | 1 |  |  | 32 | 4 |  |  |  |
| 115 | Diamond Sword | weapon | 1 |  |  | 800 | 8 |  |  |  |
| 116 | Shield | weapon | 1 |  |  | 336 |  |  |  |  |
| 117 | Bow | weapon | 1 |  |  | 250 |  |  |  |  |
| 118 | Arrow | weapon | 64 |  |  |  |  |  |  |  |
| 119 | Pistol | weapon | 1 |  |  | 600 |  |  |  |  |
| 120 | SMG | weapon | 1 |  |  | 1200 |  |  |  |  |
| 121 | Rifle | weapon | 1 |  |  | 1000 |  |  |  |  |
| 122 | Shotgun | weapon | 1 |  |  | 400 |  |  |  |  |
| 123 | Sniper Rifle | weapon | 1 |  |  | 240 |  |  |  |  |
| 124 | Bullets | weapon | 1024 |  |  |  |  |  |  |  |
| 125 | Shotgun Shells | weapon | 256 |  |  |  |  |  |  |  |
| 126 | Sniper Rounds | weapon | 128 |  |  |  |  |  |  |  |
| 127 | Grenade | weapon | 16 |  |  |  |  |  |  |  |
| 128 | Rocket Launcher | weapon | 1 |  |  | 100 |  |  |  |  |
| 129 | Rockets | weapon | 16 |  |  |  |  |  |  |  |
| 130 | Blast Charge | weapon | 64 | Blast Charge (61) |  |  |  |  |  |  |
| 131 | Leather Helmet | armor | 1 |  |  | 80 |  |  | slot 0 · def 1 |  |
| 132 | Leather Chestplate | armor | 1 |  |  | 80 |  |  | slot 1 · def 3 |  |
| 133 | Leather Leggings | armor | 1 |  |  | 80 |  |  | slot 2 · def 2 |  |
| 134 | Leather Boots | armor | 1 |  |  | 80 |  |  | slot 3 · def 1 |  |
| 135 | Gold Helmet | armor | 1 |  |  | 96 |  |  | slot 0 · def 2 |  |
| 136 | Gold Chestplate | armor | 1 |  |  | 96 |  |  | slot 1 · def 5 |  |
| 137 | Gold Leggings | armor | 1 |  |  | 96 |  |  | slot 2 · def 3 |  |
| 138 | Gold Boots | armor | 1 |  |  | 96 |  |  | slot 3 · def 1 |  |
| 139 | Iron Helmet | armor | 1 |  |  | 200 |  |  | slot 0 · def 2 |  |
| 140 | Iron Chestplate | armor | 1 |  |  | 200 |  |  | slot 1 · def 6 |  |
| 141 | Iron Leggings | armor | 1 |  |  | 200 |  |  | slot 2 · def 5 |  |
| 142 | Iron Boots | armor | 1 |  |  | 200 |  |  | slot 3 · def 2 |  |
| 143 | Diamond Helmet | armor | 1 |  |  | 480 |  |  | slot 0 · def 3 |  |
| 144 | Diamond Chestplate | armor | 1 |  |  | 480 |  |  | slot 1 · def 8 |  |
| 145 | Diamond Leggings | armor | 1 |  |  | 480 |  |  | slot 2 · def 6 |  |
| 146 | Diamond Boots | armor | 1 |  |  | 480 |  |  | slot 3 · def 3 |  |
| 147 | Jetpack | armor | 1 |  |  | 240 |  |  | slot 4 · def 0 |  |
| 148 | Territory Core | special | 1 | Territory Core (168) |  |  |  |  |  |  |
| 149 | Car | special | 1 |  |  |  |  |  |  |  |
| 150 | Plane | special | 1 |  |  |  |  |  |  |  |
| 151 | Resource Extractor | functional | 64 | Resource Extractor (170) |  |  |  |  |  |  |
| 152 | Item Collector | functional | 64 | Item Collector (171) |  |  |  |  |  |  |
| 153 | Auto Harvester | functional | 64 | Auto Harvester (172) |  |  |  |  |  |  |
| 154 | Auto Crafter | functional | 64 | Auto Crafter (173) |  |  |  |  |  |  |
| 155 | Bandage | food | 64 |  |  |  |  |  |  |  |
| 156 | Antidote | food | 64 |  |  |  |  |  |  |  |
| 157 | Treasury | functional | 64 | Treasury (174) |  |  |  |  |  |  |
| 158 | Alchemy Station | functional | 64 | Alchemy Station (175) |  |  |  |  |  |  |
| 159 | Elixir of Regeneration | food | 64 |  |  |  |  |  |  |  |
| 160 | Elixir of Strength | food | 64 |  |  |  |  |  |  |  |
| 161 | Elixir of Resistance | food | 64 |  |  |  |  |  |  |  |
| 162 | Elixir of Fire Resistance | food | 64 |  |  |  |  |  |  |  |
| 163 | Elixir of Water Breathing | food | 64 |  |  |  |  |  |  |  |
| 164 | Telescope | tool | 1 |  |  |  |  |  |  |  |
| 165 | Concrete | building | 64 | Concrete (176) |  |  |  |  |  |  |
| 166 | Dark Concrete | building | 64 | Dark Concrete (177) |  |  |  |  |  |  |
| 167 | Glass Curtain Wall | building | 64 | Glass Curtain Wall (178) |  |  |  |  |  |  |
| 168 | Asphalt | building | 64 | Asphalt (179) |  |  |  |  |  |  |
| 169 | Crosswalk | building | 64 | Crosswalk (180) |  |  |  |  |  |  |
| 170 | Road Marking | building | 64 | Road Marking (181) |  |  |  |  |  |  |
| 171 | Traffic Light | building | 64 | Traffic Light (182) |  |  |  |  |  |  |
| 172 | Green Curtain Wall | building | 64 | Green Curtain Wall (183) |  |  |  |  |  |  |
| 173 | Neon Sign | building | 64 | Neon Sign (184) |  |  |  |  |  |  |
| 174 | Mossy Concrete | building | 64 | Mossy Concrete (185) |  |  |  |  |  |  |
| 175 | Cracked Asphalt | building | 64 | Cracked Asphalt (186) |  |  |  |  |  |  |
| 176 | Rubble | building | 64 | Rubble (187) |  |  |  |  |  |  |
| 177 | Sign | building | 64 | Sign (188) |  |  |  |  |  |  |
| 178 | Red Dye | material | 64 |  |  |  |  |  |  |  |
| 179 | Orange Dye | material | 64 |  |  |  |  |  |  |  |
| 180 | Yellow Dye | material | 64 |  |  |  |  |  |  |  |
| 181 | Green Dye | material | 64 |  |  |  |  |  |  |  |
| 182 | Brown Dye | material | 64 |  |  |  |  |  |  |  |
| 183 | Black Dye | material | 64 |  |  |  |  |  |  |  |
| 184 | White Dye | material | 64 |  |  |  |  |  |  |  |
| 185 | Pink Dye | material | 64 |  |  |  |  |  |  |  |
| 186 | Red Wool | building | 64 | Red Wool (189) |  |  |  |  |  |  |
| 187 | Orange Wool | building | 64 | Orange Wool (190) |  |  |  |  |  |  |
| 188 | Yellow Wool | building | 64 | Yellow Wool (191) |  |  |  |  |  |  |
| 189 | Green Wool | building | 64 | Green Wool (192) |  |  |  |  |  |  |
| 190 | Brown Wool | building | 64 | Brown Wool (193) |  |  |  |  |  |  |
| 191 | Black Wool | building | 64 | Black Wool (194) |  |  |  |  |  |  |
| 192 | White Wool | building | 64 | White Wool (195) |  |  |  |  |  |  |
| 193 | Pink Wool | building | 64 | Pink Wool (196) |  |  |  |  |  |  |
| 194 | Red Glass | building | 64 | Red Glass (197) |  |  |  |  |  |  |
| 195 | Orange Glass | building | 64 | Orange Glass (198) |  |  |  |  |  |  |
| 196 | Yellow Glass | building | 64 | Yellow Glass (199) |  |  |  |  |  |  |
| 197 | Green Glass | building | 64 | Green Glass (200) |  |  |  |  |  |  |
| 198 | Brown Glass | building | 64 | Brown Glass (201) |  |  |  |  |  |  |
| 199 | Black Glass | building | 64 | Black Glass (202) |  |  |  |  |  |  |
| 200 | White Glass | building | 64 | White Glass (203) |  |  |  |  |  |  |
| 201 | Pink Glass | building | 64 | Pink Glass (204) |  |  |  |  |  |  |
| 202 | Lock | functional | 64 |  |  |  |  |  |  |  |
| 203 | Hopper | functional | 64 | Hopper (205) |  |  |  |  |  |  |
| 204 | Tall Grass | terrain | 64 | Tall Grass (206) |  |  |  |  |  |  |
| 205 | Red Flower | terrain | 64 | Red Flower (207) |  |  |  |  |  |  |
| 206 | Yellow Flower | terrain | 64 | Yellow Flower (208) |  |  |  |  |  |  |
| 207 | Glow Crystal | building | 64 | Glow Crystal (209) |  |  |  |  |  |  |
| 208 | Boat | special | 1 |  |  |  |  |  |  |  |
| 209 | Music Player | functional | 64 | Music Player (213) |  |  |  |  |  |  |
| 210 | Flare | weapon | 16 |  |  |  |  |  |  |  |
| 211 | Flare Gun | weapon | 1 |  |  | 200 |  |  |  |  |
| 212 | Sunflower Seed | food | 64 |  |  |  |  | 2 |  | plants Sunflower (215) |
| 213 | Repeater Turret | defense | 64 | Repeater Turret (218) |  |  |  |  |  |  |
| 214 | Mortar Turret | defense | 64 | Mortar Turret (219) |  |  |  |  |  |  |
| 215 | Tesla Coil | defense | 64 | Tesla Coil (220) |  |  |  |  |  |  |
| 216 | Mossy Stone Bricks | building | 64 | Mossy Stone Bricks (221) |  |  |  |  |  |  |
| 217 | Mossy Cobblestone | building | 64 | Mossy Cobblestone (222) |  |  |  |  |  |  |
| 218 | Red Bricks | building | 64 | Red Bricks (223) |  |  |  |  |  |  |
| 219 | Marble | building | 64 | Marble (224) |  |  |  |  |  |  |
| 220 | Marble Pillar | building | 64 | Marble Pillar (225) |  |  |  |  |  |  |
| 221 | Ceramic Tiles | building | 64 | Ceramic Tiles (226) |  |  |  |  |  |  |
| 222 | Bookshelf | building | 64 | Bookshelf (227) |  |  |  |  |  |  |
| 223 | Stone Brick Wall | building | 64 | Stone Brick Wall (228) |  |  |  |  |  |  |
| 224 | Sandstone Wall | building | 64 | Sandstone Wall (229) |  |  |  |  |  |  |
| 225 | Gilded Bars | building | 64 | Gilded Bars (230) |  |  |  |  |  |  |
| 226 | Wooden Lattice | building | 64 | Wooden Lattice (231) |  |  |  |  |  |  |
| 227 | Lumen Block | building | 64 | Lumen Block (232) |  |  |  |  |  |  |
| 228 | Revolver | weapon | 1 |  |  | 500 |  |  |  |  |
| 229 | Marksman Rifle | weapon | 1 |  |  | 300 |  |  |  |  |
| 230 | Light Machine Gun | weapon | 1 |  |  | 1500 |  |  |  |  |
| 231 | Crossbow | weapon | 1 |  |  | 400 |  |  |  |  |
| 232 | Auto Shotgun | weapon | 1 |  |  | 350 |  |  |  |  |
| 233 | Arc Caster | weapon | 1 |  |  | 1000 |  |  |  |  |
| 234 | Heavy Rounds | weapon | 128 |  |  |  |  |  |  |  |
| 235 | Bolts | weapon | 128 |  |  |  |  |  |  |  |
| 236 | Energy Cells | weapon | 512 |  |  |  |  |  |  |  |
| 237 | Compactor | functional | 64 | Compactor (233) |  |  |  |  |  |  |
| 238 | Gun Turret | functional | 64 | Gun Turret (234) |  |  |  |  |  |  |
| 239 | Rocket Turret | functional | 64 | Rocket Turret (235) |  |  |  |  |  |  |
| 240 | Railgun Turret | functional | 64 | Railgun Turret (236) |  |  |  |  |  |  |
| 241 | Flame Turret | functional | 64 | Flame Turret (237) |  |  |  |  |  |  |
| 242 | Power Cable | functional | 64 | Power Cable (238) |  |  |  |  |  |  |
| 243 | Solar Panel | functional | 64 | Solar Panel (240) |  |  |  |  |  |  |
| 244 | Coal Generator | functional | 64 | Coal Generator (241) |  |  |  |  |  |  |
| 245 | Wind Turbine | functional | 64 | Wind Turbine (242) |  |  |  |  |  |  |
| 246 | Geothermal Generator | functional | 64 | Geothermal Generator (243) |  |  |  |  |  |  |
| 247 | Hydro Generator | functional | 64 | Hydro Generator (244) |  |  |  |  |  |  |
| 248 | Battery | functional | 64 | Battery (245) |  |  |  |  |  |  |
| 249 | Electric Furnace | functional | 64 | Electric Furnace (246) |  |  |  |  |  |  |
| 250 | Electric Miner | functional | 64 | Electric Miner (247) |  |  |  |  |  |  |
| 251 | Assembler | functional | 64 | Assembler (248) |  |  |  |  |  |  |
| 252 | Crusher | functional | 64 | Crusher (249) |  |  |  |  |  |  |
| 253 | Sawmill | functional | 64 | Sawmill (250) |  |  |  |  |  |  |
| 254 | Electric Lamp | functional | 64 | Electric Lamp (251) |  |  |  |  |  |  |
| 255 | Iron Dust | material | 64 |  |  |  |  |  |  |  |
| 256 | Gold Dust | material | 64 |  |  |  |  |  |  |  |

### 13.2b Ranged weapons (guns are hitscan; the bow is a charged projectile)

`dmg` = per bullet/pellet before falloff/headshot · `rpm` = server-enforced
fire-rate cap · `spread` = shot-cone half-angle (server-rolled) · `falloff` =
full damage until start, scaling to ×min at end · magazine-less weapons (the
bow) consume ammo per shot. See §10.2/§10.2b for the message flow.

| weapon | type | mode | dmg | headshot | rpm (min gap) | spread hip/ADS | range | falloff | mag / reload | ammo |
|---|---|---|---|---|---|---|---|---|---|---|
| Bow (117) | projectile | charge | 18 | ×1.5 | 60 (1000 ms) | — | 55 b/s |  | per-shot | Arrow (118) |
| Pistol (119) | hitscan | semi | 12 | ×1.75 | 320 (188 ms) | 1.1° / 0.3° | 60 | 18→45 (×0.5) | 12 / 1300 ms | Bullets (124) |
| SMG (120) | hitscan | auto | 7 | ×1.5 | 720 (83 ms) | 2.4° / 1.1° | 45 | 12→35 (×0.4) | 30 / 1800 ms | Bullets (124) |
| Rifle (121) | hitscan | auto | 11 | ×1.75 | 540 (111 ms) | 1.8° / 0.5° | 80 | 25→60 (×0.55) | 30 / 2200 ms | Bullets (124) |
| Shotgun (122) | hitscan | semi | 5 ×8 | ×1.3 | 70 (857 ms) | 5.5° / 4.5° | 24 | 8→20 (×0.3) | 6 / 2600 ms | Shotgun Shells (125) |
| Sniper Rifle (123) | hitscan | semi | 55 | ×2 | 35 (1714 ms) | 6° / 0.05° | 200 |  | 5 / 3000 ms | Sniper Rounds (126) |
| Grenade (127) | projectile | charge | 0 | ×1 | 60 (1000 ms) | — | 24 b/s |  | per-shot | Grenade (127) |
| Rocket Launcher (128) | projectile | semi | 30 | ×1 | 30 (2000 ms) | — | 32 b/s |  | 1 / 3200 ms | Rockets (129) |
| Flare Gun (211) | projectile | semi | 0 | ×1 | 60 (1000 ms) | — | 38 b/s |  | 2 / 1400 ms | Flare (210) |
| Revolver (228) | hitscan | semi | 34 | ×2 | 150 (400 ms) | 1.4° / 0.5° | 70 | 22→55 (×0.5) | 6 / 2400 ms | Heavy Rounds (234) |
| Marksman Rifle (229) | hitscan | semi | 32 | ×2 | 200 (300 ms) | 1.6° / 0.12° | 140 | 60→120 (×0.7) | 10 / 2600 ms | Sniper Rounds (126) |
| Light Machine Gun (230) | hitscan | auto | 10 | ×1.6 | 600 (100 ms) | 2.6° / 1.2° | 70 | 20→55 (×0.5) | 100 / 4500 ms | Bullets (124) |
| Crossbow (231) | projectile | semi | 45 | ×2 | 60 (1000 ms) | — | 80 b/s |  | 1 / 1600 ms | Bolts (235) |
| Auto Shotgun (232) | hitscan | auto | 5 ×6 | ×1.3 | 160 (375 ms) | 5° / 4° | 22 | 8→20 (×0.3) | 8 / 3000 ms | Shotgun Shells (125) |
| Arc Caster (233) | hitscan | auto | 9 | ×1.5 | 480 (125 ms) | 1.4° / 0.3° | 90 | 40→90 (×0.7) | 40 / 2400 ms | Energy Cells (236) |

### 13.3 Crafting recipes (shapeless; `station` = required crafting station, §9.3; `time` = wall-clock seconds per unit on the bench queue, §9.3b — `instant` = hand recipe)

| recipeId | name | inputs | output | station | core lv | time |
|---|---|---|---|---|---|---|
| 1 | Planks | 1× Log (10) | 4× Planks (13) |  |  | instant |
| 2 | Sticks | 2× Planks (13) | 4× Stick (61) |  |  | instant |
| 3 | Crafting Table | 4× Planks (13) | 1× Crafting Table (43) |  |  | instant |
| 4 | Wooden Pickaxe | 3× Planks (13) + 2× Stick (61) | 1× Wooden Pickaxe (85) |  |  | instant |
| 5 | Wooden Axe | 3× Planks (13) + 1× Stick (61) | 1× Wooden Axe (90) |  |  | instant |
| 6 | Wooden Shovel | 1× Planks (13) + 2× Stick (61) | 1× Wooden Shovel (95) |  |  | instant |
| 7 | Glass | 2× Sand (3) | 1× Glass (21) |  |  | instant |
| 8 | Torch | 1× Coal (62) + 1× Stick (61) | 4× Torch (50) |  |  | instant |
| 9 | Wooden Sword | 2× Planks (13) + 1× Stick (61) | 1× Wooden Sword (111) |  |  | instant |
| 10 | Stone Pickaxe | 3× Cobblestone (14) + 2× Stick (61) | 1× Stone Pickaxe (86) | Crafting Table (workbench T1) |  | 6s |
| 11 | Stone Axe | 3× Cobblestone (14) + 1× Stick (61) | 1× Stone Axe (91) | Crafting Table (workbench T1) |  | 6s |
| 12 | Stone Shovel | 1× Cobblestone (14) + 2× Stick (61) | 1× Stone Shovel (96) | Crafting Table (workbench T1) |  | 6s |
| 13 | Stone Sword | 2× Cobblestone (14) + 1× Stick (61) | 1× Stone Sword (112) | Crafting Table (workbench T1) |  | 6s |
| 14 | Iron Pickaxe | 3× Iron Ingot (66) + 2× Stick (61) | 1× Iron Pickaxe (87) | Crafting Table (workbench T1) |  | 6s |
| 15 | Iron Axe | 3× Iron Ingot (66) + 1× Stick (61) | 1× Iron Axe (92) | Crafting Table (workbench T1) |  | 6s |
| 16 | Iron Shovel | 1× Iron Ingot (66) + 2× Stick (61) | 1× Iron Shovel (97) | Crafting Table (workbench T1) |  | 6s |
| 17 | Iron Sword | 2× Iron Ingot (66) + 1× Stick (61) | 1× Iron Sword (113) | Crafting Table (workbench T1) |  | 6s |
| 18 | Furnace | 8× Cobblestone (14) | 1× Furnace (47) | Crafting Table (workbench T1) |  | 6s |
| 19 | Wood Slab | 3× Planks (13) | 6× Wood Slab (24) | Crafting Table (workbench T1) |  | 6s |
| 20 | Stone Slab | 3× Cobblestone (14) | 6× Stone Slab (25) | Crafting Table (workbench T1) |  | 6s |
| 21 | Wood Stairs | 6× Planks (13) | 4× Wood Stairs (28) | Crafting Table (workbench T1) |  | 6s |
| 22 | Stone Stairs | 6× Cobblestone (14) | 4× Stone Stairs (29) | Crafting Table (workbench T1) |  | 6s |
| 23 | Ladder | 7× Stick (61) | 3× Ladder (32) | Crafting Table (workbench T1) |  | 6s |
| 24 | Wood Fence | 4× Planks (13) + 2× Stick (61) | 3× Wood Fence (33) | Crafting Table (workbench T1) |  | 6s |
| 25 | Glass Pane | 6× Glass (21) | 16× Glass Pane (22) | Crafting Table (workbench T1) |  | 6s |
| 26 | Wooden Hoe | 2× Planks (13) + 2× Stick (61) | 1× Wooden Hoe (100) |  |  | instant |
| 27 | Bread | 3× Wheat (77) | 1× Bread (80) |  |  | instant |
| 28 | Shears | 2× Iron Ingot (66) | 1× Shears (105) | Crafting Table (workbench T1) |  | 6s |
| 29 | Bucket | 3× Iron Ingot (66) | 1× Bucket (108) | Crafting Table (workbench T1) |  | 6s |
| 30 | Flint and Steel | 1× Iron Ingot (66) + 1× Flint (64) | 1× Flint and Steel (107) | Crafting Table (workbench T1) |  | 6s |
| 31 | Torch (Charcoal) | 1× Charcoal (63) + 1× Stick (61) | 4× Torch (50) |  |  | instant |
| 32 | Diamond Pickaxe | 3× Diamond (69) + 2× Stick (61) | 1× Diamond Pickaxe (89) | Advanced Workbench (workbench T2) |  | 10s |
| 33 | Diamond Axe | 3× Diamond (69) + 1× Stick (61) | 1× Diamond Axe (94) | Advanced Workbench (workbench T2) |  | 10s |
| 34 | Diamond Shovel | 1× Diamond (69) + 2× Stick (61) | 1× Diamond Shovel (99) | Advanced Workbench (workbench T2) |  | 10s |
| 35 | Diamond Sword | 2× Diamond (69) + 1× Stick (61) | 1× Diamond Sword (115) | Advanced Workbench (workbench T2) |  | 10s |
| 36 | Golden Apple | 8× Gold Ingot (68) + 1× Apple (78) | 1× Golden Apple (79) | Crafting Table (workbench T1) |  | 6s |
| 37 | Block of Coal | 9× Coal (62) | 1× Block of Coal (39) | Crafting Table (workbench T1) |  | 6s |
| 38 | Block of Iron | 9× Iron Ingot (66) | 1× Block of Iron (40) | Crafting Table (workbench T1) |  | 6s |
| 39 | Block of Gold | 9× Gold Ingot (68) | 1× Block of Gold (41) | Crafting Table (workbench T1) |  | 6s |
| 40 | Block of Diamond | 9× Diamond (69) | 1× Block of Diamond (42) | Crafting Table (workbench T1) |  | 6s |
| 41 | Coal ×9 | 1× Block of Coal (39) | 9× Coal (62) |  |  | instant |
| 42 | Iron Ingot ×9 | 1× Block of Iron (40) | 9× Iron Ingot (66) |  |  | instant |
| 43 | Gold Ingot ×9 | 1× Block of Gold (41) | 9× Gold Ingot (68) |  |  | instant |
| 44 | Diamond ×9 | 1× Block of Diamond (42) | 9× Diamond (69) |  |  | instant |
| 45 | Blast Charge | 5× Blast Powder (75) + 4× Sand (3) | 1× Blast Charge (130) | Gunsmith Bench (gunsmith T1) |  | 8s |
| 46 | Bow | 3× String (72) + 3× Stick (61) | 1× Bow (117) | Crafting Table (workbench T1) |  | 6s |
| 47 | Arrows | 1× Flint (64) + 1× Stick (61) | 4× Arrow (118) |  |  | instant |
| 48 | Bone Meal | 1× Bone (73) | 3× Bone Meal (74) |  |  | instant |
| 49 | Chest | 8× Planks (13) | 1× Chest (48) | Crafting Table (workbench T1) |  | 6s |
| 50 | Bed | 3× Wool (23) + 3× Planks (13) | 1× Bed (49) | Crafting Table (workbench T1) |  | 6s |
| 51 | Door | 6× Planks (13) | 1× Door (37) | Crafting Table (workbench T1) |  | 6s |
| 52 | Trapdoor | 4× Planks (13) + 1× Stick (61) | 1× Trapdoor (38) | Crafting Table (workbench T1) |  | 6s |
| 53 | Leather Helmet | 5× Leather (71) | 1× Leather Helmet (131) | Crafting Table (workbench T1) |  | 6s |
| 54 | Leather Chestplate | 8× Leather (71) | 1× Leather Chestplate (132) | Crafting Table (workbench T1) |  | 6s |
| 55 | Leather Leggings | 7× Leather (71) | 1× Leather Leggings (133) | Crafting Table (workbench T1) |  | 6s |
| 56 | Leather Boots | 4× Leather (71) | 1× Leather Boots (134) | Crafting Table (workbench T1) |  | 6s |
| 57 | Iron Helmet | 5× Iron Ingot (66) | 1× Iron Helmet (139) | Crafting Table (workbench T1) |  | 6s |
| 58 | Iron Chestplate | 8× Iron Ingot (66) | 1× Iron Chestplate (140) | Crafting Table (workbench T1) |  | 6s |
| 59 | Iron Leggings | 7× Iron Ingot (66) | 1× Iron Leggings (141) | Crafting Table (workbench T1) |  | 6s |
| 60 | Iron Boots | 4× Iron Ingot (66) | 1× Iron Boots (142) | Crafting Table (workbench T1) |  | 6s |
| 61 | Diamond Helmet | 5× Diamond (69) | 1× Diamond Helmet (143) | Advanced Workbench (workbench T2) |  | 10s |
| 62 | Diamond Chestplate | 8× Diamond (69) | 1× Diamond Chestplate (144) | Advanced Workbench (workbench T2) |  | 10s |
| 63 | Diamond Leggings | 7× Diamond (69) | 1× Diamond Leggings (145) | Advanced Workbench (workbench T2) |  | 10s |
| 64 | Diamond Boots | 4× Diamond (69) | 1× Diamond Boots (146) | Advanced Workbench (workbench T2) |  | 10s |
| 65 | Signal Switch | 1× Stick (61) + 1× Cobblestone (14) | 1× Signal Switch (54) |  |  | instant |
| 66 | Signal Button | 1× Cobblestone (14) | 1× Signal Button (55) |  |  | instant |
| 67 | Signal Lamp | 1× Glass (21) + 4× Signal Conduit (53) | 1× Signal Lamp (56) | Crafting Table (workbench T1) |  | 6s |
| 68 | Enchanting Table | 4× Obsidian (17) + 2× Diamond (69) | 1× Enchanting Table (51) | Advanced Workbench (workbench T2) | 2 | 20s |
| 69 | Anvil | 3× Block of Iron (40) + 4× Iron Ingot (66) | 1× Anvil (52) | Advanced Workbench (workbench T2) | 2 | 15s |
| 70 | Gold Pickaxe | 3× Gold Ingot (68) + 2× Stick (61) | 1× Gold Pickaxe (88) | Crafting Table (workbench T1) |  | 6s |
| 71 | Gold Axe | 3× Gold Ingot (68) + 1× Stick (61) | 1× Gold Axe (93) | Crafting Table (workbench T1) |  | 6s |
| 72 | Gold Shovel | 1× Gold Ingot (68) + 2× Stick (61) | 1× Gold Shovel (98) | Crafting Table (workbench T1) |  | 6s |
| 73 | Gold Sword | 2× Gold Ingot (68) + 1× Stick (61) | 1× Gold Sword (114) | Crafting Table (workbench T1) |  | 6s |
| 74 | Gold Helmet | 5× Gold Ingot (68) | 1× Gold Helmet (135) | Crafting Table (workbench T1) |  | 6s |
| 75 | Gold Chestplate | 8× Gold Ingot (68) | 1× Gold Chestplate (136) | Crafting Table (workbench T1) |  | 6s |
| 76 | Gold Leggings | 7× Gold Ingot (68) | 1× Gold Leggings (137) | Crafting Table (workbench T1) |  | 6s |
| 77 | Gold Boots | 4× Gold Ingot (68) | 1× Gold Boots (138) | Crafting Table (workbench T1) |  | 6s |
| 78 | Shield | 6× Planks (13) + 1× Iron Ingot (66) | 1× Shield (116) | Crafting Table (workbench T1) |  | 6s |
| 79 | Stone Bricks | 4× Cobblestone (14) | 4× Stone Bricks (18) | Crafting Table (workbench T1) |  | 6s |
| 80 | Chiseled Stone Bricks | 4× Stone Bricks (18) | 4× Chiseled Stone Bricks (20) | Crafting Table (workbench T1) |  | 6s |
| 81 | Fishing Rod | 3× Stick (61) + 2× String (72) | 1× Fishing Rod (106) | Crafting Table (workbench T1) |  | 6s |
| 82 | Signal Repeater | 2× Torch (50) + 1× Signal Conduit (53) + 3× Cobblestone (14) | 1× Signal Repeater (57) | Crafting Table (workbench T1) |  | 6s |
| 83 | Stone Brick Slab | 3× Stone Bricks (18) | 6× Stone Brick Slab (26) | Crafting Table (workbench T1) |  | 6s |
| 84 | Sandstone Slab | 3× Sandstone (15) | 6× Sandstone Slab (27) | Crafting Table (workbench T1) |  | 6s |
| 85 | Stone Brick Stairs | 6× Stone Bricks (18) | 4× Stone Brick Stairs (30) | Crafting Table (workbench T1) |  | 6s |
| 86 | Sandstone Stairs | 6× Sandstone (15) | 4× Sandstone Stairs (31) | Crafting Table (workbench T1) |  | 6s |
| 87 | Iron Bars | 6× Iron Ingot (66) | 16× Iron Bars (36) | Crafting Table (workbench T1) |  | 6s |
| 88 | Cobblestone Wall | 6× Cobblestone (14) | 6× Cobblestone Wall (35) | Crafting Table (workbench T1) |  | 6s |
| 89 | Fence Gate | 2× Planks (13) + 4× Stick (61) | 1× Fence Gate (34) | Crafting Table (workbench T1) |  | 6s |
| 90 | Bolt Turret | 5× Iron Ingot (66) + 1× Bow (117) + 2× Signal Conduit (53) | 1× Bolt Turret (58) | Crafting Table (workbench T1) |  | 6s |
| 91 | Spike Trap | 4× Iron Ingot (66) + 2× Stick (61) | 2× Spike Trap (59) | Crafting Table (workbench T1) |  | 6s |
| 92 | Reinforced Barricade | 6× Cobblestone (14) + 1× Iron Ingot (66) | 4× Reinforced Barricade (60) | Crafting Table (workbench T1) |  | 6s |
| 163 | Repeater Turret | 1× Bolt Turret (58) + 3× Iron Ingot (66) + 3× Signal Conduit (53) | 1× Repeater Turret (213) | Advanced Workbench (workbench T2) | 2 | 12s |
| 164 | Mortar Turret | 8× Iron Ingot (66) + 2× Blast Powder (75) + 2× Signal Conduit (53) | 1× Mortar Turret (214) | Advanced Workbench (workbench T2) | 3 | 18s |
| 165 | Tesla Coil | 4× Iron Ingot (66) + 6× Signal Conduit (53) | 1× Tesla Coil (215) | Advanced Workbench (workbench T2) | 3 | 18s |
| 166 | Mossy Stone Bricks | 4× Stone Bricks (18) + 1× Green Dye (181) | 4× Mossy Stone Bricks (216) | Crafting Table (workbench T1) |  | 6s |
| 167 | Mossy Cobblestone | 4× Cobblestone (14) + 1× Green Dye (181) | 4× Mossy Cobblestone (217) | Crafting Table (workbench T1) |  | 6s |
| 168 | Red Bricks | 4× Cobblestone (14) + 1× Red Dye (178) | 4× Red Bricks (218) | Crafting Table (workbench T1) |  | 6s |
| 169 | Marble | 4× Cobblestone (14) + 1× White Dye (184) | 4× Marble (219) | Crafting Table (workbench T1) |  | 6s |
| 170 | Marble Pillar | 2× Marble (219) | 2× Marble Pillar (220) | Crafting Table (workbench T1) |  | 6s |
| 171 | Ceramic Tiles | 2× Cobblestone (14) + 1× White Dye (184) | 4× Ceramic Tiles (221) | Crafting Table (workbench T1) |  | 6s |
| 172 | Bookshelf | 6× Planks (13) + 2× String (72) | 1× Bookshelf (222) | Crafting Table (workbench T1) |  | 6s |
| 173 | Stone Brick Wall | 6× Stone Bricks (18) + 1× Cobblestone (14) | 6× Stone Brick Wall (223) | Crafting Table (workbench T1) |  | 6s |
| 174 | Sandstone Wall | 6× Sandstone (15) + 1× Cobblestone (14) | 6× Sandstone Wall (224) | Crafting Table (workbench T1) |  | 6s |
| 175 | Gilded Bars | 6× Gold Ingot (68) + 1× Iron Ingot (66) | 16× Gilded Bars (225) | Crafting Table (workbench T1) |  | 6s |
| 176 | Wooden Lattice | 1× Planks (13) + 4× Stick (61) | 6× Wooden Lattice (226) | Crafting Table (workbench T1) |  | 6s |
| 177 | Lumen Block | 2× Glow Crystal (207) + 1× Gold Ingot (68) | 2× Lumen Block (227) | Crafting Table (workbench T1) |  | 6s |
| 178 | Revolver | 5× Iron Ingot (66) + 1× Stick (61) | 1× Revolver (228) | Gunsmith Bench (gunsmith T1) |  | 8s |
| 179 | Marksman Rifle | 7× Iron Ingot (66) + 3× Planks (13) | 1× Marksman Rifle (229) | Advanced Gunsmith Bench (gunsmith T2) | 3 | 14s |
| 180 | Light Machine Gun | 12× Iron Ingot (66) + 2× Planks (13) | 1× Light Machine Gun (230) | Advanced Gunsmith Bench (gunsmith T2) | 3 | 20s |
| 181 | Crossbow | 4× Iron Ingot (66) + 2× Planks (13) + 2× String (72) | 1× Crossbow (231) | Gunsmith Bench (gunsmith T1) |  | 8s |
| 182 | Auto Shotgun | 6× Iron Ingot (66) + 4× Planks (13) + 1× Stick (61) | 1× Auto Shotgun (232) | Advanced Gunsmith Bench (gunsmith T2) | 2 | 12s |
| 183 | Arc Caster | 8× Iron Ingot (66) + 2× Glow Crystal (207) + 1× Diamond (69) | 1× Arc Caster (233) | Advanced Gunsmith Bench (gunsmith T2) | 4 | 22s |
| 184 | Heavy Rounds | 3× Iron Ingot (66) + 1× Blast Powder (75) | 6× Heavy Rounds (234) | Gunsmith Bench (gunsmith T1) |  | 8s |
| 185 | Bolts | 1× Iron Ingot (66) + 1× Flint (64) | 4× Bolts (235) | Crafting Table (workbench T1) |  | 6s |
| 186 | Energy Cells | 1× Iron Ingot (66) + 2× Signal Conduit (53) | 8× Energy Cells (236) | Advanced Gunsmith Bench (gunsmith T2) |  | 12s |
| 187 | Compactor | 6× Iron Ingot (66) + 4× Cobblestone (14) + 2× Signal Conduit (53) | 1× Compactor (237) | Advanced Workbench (workbench T2) | 2 | 10s |
| 188 | Gun Turret | 5× Iron Ingot (66) + 2× Signal Conduit (53) + 6× Heavy Rounds (234) | 1× Gun Turret (238) | Advanced Gunsmith Bench (gunsmith T2) | 2 | 12s |
| 189 | Rocket Turret | 6× Iron Ingot (66) + 2× Signal Conduit (53) + 4× Blast Powder (75) | 1× Rocket Turret (239) | Advanced Gunsmith Bench (gunsmith T2) | 3 | 12s |
| 190 | Railgun Turret | 4× Iron Ingot (66) + 4× Signal Conduit (53) + 2× Diamond (69) | 1× Railgun Turret (240) | Advanced Gunsmith Bench (gunsmith T2) | 3 | 12s |
| 191 | Flame Turret | 5× Iron Ingot (66) + 2× Signal Conduit (53) + 8× Coal (62) | 1× Flame Turret (241) | Advanced Gunsmith Bench (gunsmith T2) | 2 | 12s |
| 93 | Stone Hoe | 2× Cobblestone (14) + 2× Stick (61) | 1× Stone Hoe (101) | Crafting Table (workbench T1) |  | 6s |
| 94 | Iron Hoe | 2× Iron Ingot (66) + 2× Stick (61) | 1× Iron Hoe (102) | Crafting Table (workbench T1) |  | 6s |
| 95 | Diamond Hoe | 2× Diamond (69) + 2× Stick (61) | 1× Diamond Hoe (104) | Advanced Workbench (workbench T2) |  | 10s |
| 96 | Gold Hoe | 2× Gold Ingot (68) + 2× Stick (61) | 1× Gold Hoe (103) | Crafting Table (workbench T1) |  | 6s |
| 97 | Bullets | 1× Iron Ingot (66) + 1× Blast Powder (75) | 8× Bullets (124) | Gunsmith Bench (gunsmith T1) |  | 8s |
| 98 | Shotgun Shells | 1× Iron Ingot (66) + 2× Blast Powder (75) | 4× Shotgun Shells (125) | Gunsmith Bench (gunsmith T1) |  | 8s |
| 99 | Sniper Rounds | 2× Iron Ingot (66) + 2× Blast Powder (75) | 4× Sniper Rounds (126) | Advanced Gunsmith Bench (gunsmith T2) |  | 12s |
| 100 | Pistol | 4× Iron Ingot (66) + 1× Stick (61) | 1× Pistol (119) | Gunsmith Bench (gunsmith T1) |  | 8s |
| 101 | SMG | 6× Iron Ingot (66) + 1× Stick (61) | 1× SMG (120) | Gunsmith Bench (gunsmith T1) |  | 8s |
| 102 | Rifle | 8× Iron Ingot (66) + 2× Planks (13) | 1× Rifle (121) | Advanced Gunsmith Bench (gunsmith T2) |  | 12s |
| 103 | Shotgun | 5× Iron Ingot (66) + 2× Planks (13) | 1× Shotgun (122) | Gunsmith Bench (gunsmith T1) |  | 8s |
| 104 | Sniper Rifle | 8× Iron Ingot (66) + 2× Glass (21) + 1× Diamond (69) | 1× Sniper Rifle (123) | Advanced Gunsmith Bench (gunsmith T2) |  | 20s |
| 105 | Grenades | 1× Iron Ingot (66) + 3× Blast Powder (75) | 2× Grenade (127) | Gunsmith Bench (gunsmith T1) |  | 8s |
| 106 | Rocket Launcher | 10× Iron Ingot (66) + 2× Planks (13) | 1× Rocket Launcher (128) | Advanced Gunsmith Bench (gunsmith T2) | 4 | 25s |
| 107 | Rockets | 2× Iron Ingot (66) + 3× Blast Powder (75) | 2× Rockets (129) | Advanced Gunsmith Bench (gunsmith T2) | 4 | 12s |
| 161 | Flares | 1× Stick (61) + 1× Blast Powder (75) | 3× Flare (210) | Gunsmith Bench (gunsmith T1) |  | 8s |
| 162 | Flare Gun | 3× Iron Ingot (66) + 1× Stick (61) | 1× Flare Gun (211) | Gunsmith Bench (gunsmith T1) |  | 8s |
| 108 | Advanced Workbench | 4× Planks (13) + 4× Iron Ingot (66) | 1× Advanced Workbench (44) | Crafting Table (workbench T1) | 2 | 20s |
| 109 | Gunsmith Bench | 4× Planks (13) + 6× Iron Ingot (66) | 1× Gunsmith Bench (45) | Crafting Table (workbench T1) | 2 | 20s |
| 110 | Advanced Gunsmith Bench | 8× Iron Ingot (66) + 1× Diamond (69) | 1× Advanced Gunsmith Bench (46) | Gunsmith Bench (gunsmith T1) | 3 | 25s |
| 111 | Jetpack | 8× Iron Ingot (66) + 4× Coal (62) + 2× Gold Ingot (68) | 1× Jetpack (147) | Advanced Workbench (workbench T2) |  | 30s |
| 112 | Jetpack Refuel | 1× Jetpack (147) + 4× Coal (62) | 1× Jetpack (147) |  |  | instant |
| 113 | Territory Core | 16× Planks (13) + 16× Cobblestone (14) + 4× Iron Ingot (66) | 1× Territory Core (148) |  |  | instant |
| 114 | Car | 8× Iron Ingot (66) + 4× Planks (13) | 1× Car (149) | Advanced Workbench (workbench T2) |  | 30s |
| 115 | Plane | 10× Iron Ingot (66) + 2× Diamond (69) | 1× Plane (150) | Advanced Workbench (workbench T2) |  | 40s |
| 116 | Item Collector | 1× Chest (48) + 4× Iron Ingot (66) + 2× Signal Conduit (53) | 1× Item Collector (152) | Crafting Table (workbench T1) | 2 | 6s |
| 117 | Resource Extractor | 8× Iron Ingot (66) + 2× Gold Ingot (68) + 4× Signal Conduit (53) | 1× Resource Extractor (151) | Advanced Workbench (workbench T2) | 3 | 10s |
| 118 | Auto Harvester | 4× Iron Ingot (66) + 4× Planks (13) + 2× Signal Conduit (53) | 1× Auto Harvester (153) | Crafting Table (workbench T1) | 2 | 6s |
| 119 | Auto Crafter | 8× Iron Ingot (66) + 1× Diamond (69) + 4× Signal Conduit (53) | 1× Auto Crafter (154) | Advanced Workbench (workbench T2) | 3 | 30s |
| 120 | Bandage | 3× String (72) | 2× Bandage (155) |  |  | instant |
| 121 | Antidote | 1× Apple (78) + 2× String (72) | 1× Antidote (156) |  |  | instant |
| 122 | Treasury | 1× Chest (48) + 4× Gold Ingot (68) + 4× Iron Ingot (66) | 1× Treasury (157) | Crafting Table (workbench T1) |  | 6s |
| 123 | Alchemy Station | 4× Cobblestone (14) + 2× Glass (21) + 1× Gold Ingot (68) | 1× Alchemy Station (158) | Crafting Table (workbench T1) |  | 10s |
| 124 | Elixir of Regeneration | 1× Glass (21) + 1× Gold Ingot (68) + 1× Apple (78) | 1× Elixir of Regeneration (159) | Alchemy Station (alchemy T1) |  | 10s |
| 125 | Elixir of Strength | 1× Glass (21) + 1× Coal (62) + 1× Raw Meat (81) | 1× Elixir of Strength (160) | Alchemy Station (alchemy T1) |  | 10s |
| 126 | Elixir of Resistance | 1× Glass (21) + 1× Iron Ingot (66) + 1× Cobblestone (14) | 1× Elixir of Resistance (161) | Alchemy Station (alchemy T1) |  | 10s |
| 127 | Elixir of Fire Resistance | 1× Glass (21) + 1× Obsidian (17) + 1× Charcoal (63) | 1× Elixir of Fire Resistance (162) | Alchemy Station (alchemy T1) |  | 10s |
| 128 | Elixir of Water Breathing | 1× Glass (21) + 1× Fish (83) + 1× String (72) | 1× Elixir of Water Breathing (163) | Alchemy Station (alchemy T1) |  | 10s |
| 129 | Telescope | 2× Glass Pane (22) + 2× Iron Ingot (66) + 1× Gold Ingot (68) | 1× Telescope (164) | Crafting Table (workbench T1) |  | 6s |
| 130 | Sign | 6× Planks (13) + 1× Stick (61) | 3× Sign (177) | Crafting Table (workbench T1) |  | 6s |
| 155 | Lock | 2× Iron Ingot (66) + 1× Stick (61) | 1× Lock (202) | Crafting Table (workbench T1) |  | 6s |
| 156 | Hopper | 4× Iron Ingot (66) + 3× Cobblestone (14) | 1× Hopper (203) | Crafting Table (workbench T1) |  | 6s |
| 131 | Red Dye | 1× Apple (78) | 2× Red Dye (178) |  |  | instant |
| 132 | Orange Dye | 1× Red Dye (178) + 1× Yellow Dye (180) | 2× Orange Dye (179) |  |  | instant |
| 133 | Yellow Dye | 2× Wheat (77) | 2× Yellow Dye (180) |  |  | instant |
| 134 | Green Dye | 1× Cactus (8) | 2× Green Dye (181) |  |  | instant |
| 135 | Brown Dye | 1× Charcoal (63) | 2× Brown Dye (182) |  |  | instant |
| 136 | Black Dye | 1× Coal (62) | 2× Black Dye (183) |  |  | instant |
| 137 | White Dye | 1× Bone Meal (74) | 2× White Dye (184) |  |  | instant |
| 138 | Pink Dye | 1× Red Dye (178) + 1× White Dye (184) | 2× Pink Dye (185) |  |  | instant |
| 139 | Red Wool | 1× Wool (23) + 1× Red Dye (178) | 1× Red Wool (186) |  |  | instant |
| 140 | Orange Wool | 1× Wool (23) + 1× Orange Dye (179) | 1× Orange Wool (187) |  |  | instant |
| 141 | Yellow Wool | 1× Wool (23) + 1× Yellow Dye (180) | 1× Yellow Wool (188) |  |  | instant |
| 142 | Green Wool | 1× Wool (23) + 1× Green Dye (181) | 1× Green Wool (189) |  |  | instant |
| 143 | Brown Wool | 1× Wool (23) + 1× Brown Dye (182) | 1× Brown Wool (190) |  |  | instant |
| 144 | Black Wool | 1× Wool (23) + 1× Black Dye (183) | 1× Black Wool (191) |  |  | instant |
| 145 | White Wool | 1× Wool (23) + 1× White Dye (184) | 1× White Wool (192) |  |  | instant |
| 146 | Pink Wool | 1× Wool (23) + 1× Pink Dye (185) | 1× Pink Wool (193) |  |  | instant |
| 147 | Red Glass | 1× Glass (21) + 1× Red Dye (178) | 1× Red Glass (194) |  |  | instant |
| 148 | Orange Glass | 1× Glass (21) + 1× Orange Dye (179) | 1× Orange Glass (195) |  |  | instant |
| 149 | Yellow Glass | 1× Glass (21) + 1× Yellow Dye (180) | 1× Yellow Glass (196) |  |  | instant |
| 150 | Green Glass | 1× Glass (21) + 1× Green Dye (181) | 1× Green Glass (197) |  |  | instant |
| 151 | Brown Glass | 1× Glass (21) + 1× Brown Dye (182) | 1× Brown Glass (198) |  |  | instant |
| 152 | Black Glass | 1× Glass (21) + 1× Black Dye (183) | 1× Black Glass (199) |  |  | instant |
| 153 | White Glass | 1× Glass (21) + 1× White Dye (184) | 1× White Glass (200) |  |  | instant |
| 154 | Pink Glass | 1× Glass (21) + 1× Pink Dye (185) | 1× Pink Glass (201) |  |  | instant |
| 157 | Red Dye (flower) | 1× Red Flower (205) | 2× Red Dye (178) |  |  | instant |
| 158 | Yellow Dye (flower) | 1× Yellow Flower (206) | 2× Yellow Dye (180) |  |  | instant |
| 159 | Boat | 12× Planks (13) + 2× Iron Ingot (66) | 1× Boat (208) | Crafting Table (workbench T1) |  | 20s |
| 160 | Music Player | 4× Planks (13) + 2× Iron Ingot (66) + 1× Signal Conduit (53) | 1× Music Player (209) | Crafting Table (workbench T1) | 1 | 6s |
| 192 | Power Cable | 3× Iron Ingot (66) + 1× Coal (62) | 8× Power Cable (242) | Crafting Table (workbench T1) | 2 | 6s |
| 193 | Solar Panel | 3× Glass (21) + 2× Iron Ingot (66) + 1× Power Cable (242) | 1× Solar Panel (243) | Advanced Workbench (workbench T2) | 2 | 10s |
| 194 | Coal Generator | 5× Iron Ingot (66) + 3× Cobblestone (14) + 1× Power Cable (242) | 1× Coal Generator (244) | Advanced Workbench (workbench T2) | 2 | 10s |
| 195 | Wind Turbine | 4× Iron Ingot (66) + 2× Planks (13) + 1× Power Cable (242) | 1× Wind Turbine (245) | Advanced Workbench (workbench T2) | 2 | 10s |
| 196 | Geothermal Generator | 6× Iron Ingot (66) + 2× Obsidian (17) + 2× Power Cable (242) | 1× Geothermal Generator (246) | Advanced Workbench (workbench T2) | 3 | 10s |
| 197 | Hydro Generator | 5× Iron Ingot (66) + 4× Planks (13) + 2× Power Cable (242) | 1× Hydro Generator (247) | Advanced Workbench (workbench T2) | 2 | 10s |
| 198 | Battery | 4× Iron Ingot (66) + 4× Coal (62) + 2× Power Cable (242) | 1× Battery (248) | Advanced Workbench (workbench T2) | 2 | 10s |
| 199 | Electric Furnace | 1× Furnace (47) + 4× Iron Ingot (66) + 2× Power Cable (242) | 1× Electric Furnace (249) | Advanced Workbench (workbench T2) | 2 | 10s |
| 200 | Electric Miner | 8× Iron Ingot (66) + 1× Diamond (69) + 4× Power Cable (242) | 1× Electric Miner (250) | Advanced Workbench (workbench T2) | 3 | 10s |
| 201 | Assembler | 8× Iron Ingot (66) + 2× Gold Ingot (68) + 4× Power Cable (242) | 1× Assembler (251) | Advanced Workbench (workbench T2) | 3 | 10s |
| 202 | Crusher | 6× Iron Ingot (66) + 4× Cobblestone (14) + 2× Power Cable (242) | 1× Crusher (252) | Advanced Workbench (workbench T2) | 2 | 10s |
| 203 | Sawmill | 4× Iron Ingot (66) + 6× Planks (13) + 1× Power Cable (242) | 1× Sawmill (253) | Advanced Workbench (workbench T2) | 2 | 10s |
| 204 | Electric Lamp | 2× Glass (21) + 1× Gold Ingot (68) + 1× Power Cable (242) | 2× Electric Lamp (254) | Crafting Table (workbench T1) | 2 | 6s |

### 13.4 Smelting (6 s each)

| input | output |
|---|---|
| Sand (3) | Glass (21) |
| Log (10) | Charcoal (63) |
| Stone Bricks (18) | Cracked Stone Bricks (19) |
| Raw Iron (65) | Iron Ingot (66) |
| Raw Gold (67) | Gold Ingot (68) |
| Raw Meat (81) | Cooked Meat (82) |
| Fish (83) | Cooked Fish (84) |
| Iron Dust (255) | Iron Ingot (66) |
| Gold Dust (256) | Gold Ingot (68) |

#### 13.4b Fuels (items smelted per unit)

| fuel | items smelted |
|---|---|
| Log (10) | 2 |
| Planks (13) | 2 |
| Block of Coal (39) | 80 |
| Stick (61) | 1 |
| Coal (62) | 8 |
| Charcoal (63) | 8 |

### 13.5 Mobs

| kind | name | hp | speed | behaviour | aggro/dmg | size | drops |
|---|---|---|---|---|---|---|---|
| 1 | Pig | 10 | 2.4 | passive |  | 0.9×0.9 | 2× Raw Meat (81) |
| 2 | Zombie | 20 | 2.9 | melee | 16 / 6 | 0.6×1.8 | 0× Raw Meat (81) |
| 3 | Cow | 12 | 2.2 | passive |  | 0.9×1.3 | 3× Raw Meat (81), 1× Leather (71) |
| 4 | Sheep | 10 | 2.2 | passive |  | 0.9×1.3 | 1× Raw Meat (81) |
| 5 | Chicken | 6 | 2 | passive |  | 0.4×0.7 | 1× Raw Meat (81) |
| 6 | Villager | 20 | 1.4 | passive |  | 0.6×1.8 | 0× Empty (0) |
| 7 | Blastling | 20 | 3 | explode | 16 / 0 | 0.75×1.35 | 1× Blast Powder (75) |
| 8 | Skeleton | 20 | 2.8 | ranged | 18 / 0 | 0.6×1.8 | 1× Bone (73), 1× Arrow (118) |
| 9 | Spider | 16 | 3.4 | melee | 14 / 3 | 0.9×0.7 | 1× String (72) |
| 11 | Wolf | 16 | 3.8 | melee | 12 / 4 | 0.7×0.85 | 1× Bone (73) |
| 12 | Bear | 44 | 3 | melee | 9 / 8 | 1×1.4 | 3× Raw Meat (81), 1× Leather (71) |
| 13 | Goat | 12 | 2.6 | passive |  | 0.8×1.1 | 1× Raw Meat (81), 1× Leather (71) |
| 14 | Camel | 20 | 2.4 | passive |  | 0.9×1.8 | 2× Leather (71) |
| 15 | Rabbit | 4 | 3.2 | passive |  | 0.4×0.5 | 1× Raw Meat (81) |
| 16 | Lion | 30 | 4 | melee | 13 / 7 | 0.9×1.2 | 2× Raw Meat (81) |
| 17 | Antelope | 14 | 3.6 | passive |  | 0.8×1.25 | 2× Raw Meat (81), 1× Leather (71) |
| 18 | Crocodile | 30 | 2.4 | melee | 7 / 6 | 0.9×0.55 | 2× Leather (71) |
| 19 | Frog | 4 | 2.2 | passive |  | 0.35×0.45 | 0× Empty (0) |
| 20 | Turtle | 15 | 1 | passive |  | 0.7×0.5 | 0× Empty (0) |
| 23 | Vault Sentinel | 240 | 2.6 | slam | 15 / 12 | 1.3×3 | 3× Diamond (69), 5× Gold Ingot (68), 1× Golden Apple (79) |
| 24 | Crypt Revenant | 200 | 2.8 | summon | 16 / 9 | 0.9×2.4 | 2× Diamond (69), 6× Gold Ingot (68), 2× Emerald (70), 1× Golden Apple (79) |
| 26 | Sunseed Hamster | 500 | 4.2 | barrage | 22 / 10 | 3×2.6 | 2× Diamond (69), 1× Golden Apple (79), 4× Leather (71) |
| 27 | Raider | 30 | 3.1 | melee | 18 / 7 | 0.7×1.95 | 1× Iron Ingot (66) |
| 28 | Siege Brute | 90 | 2.4 | melee | 18 / 14 | 1.2×2.4 | 2× Iron Ingot (66), 1× Blast Powder (75) |

### 13.6 Status effects (`stats.effects[].id`)

| id | name | kind |
|---|---|---|
| 1 | Regeneration | buff |
| 2 | Poison | debuff |
| 3 | Resistance | buff |
| 4 | Strength | buff |
| 5 | Weakness | debuff |
| 6 | FireResistance | buff |
| 7 | WaterBreathing | buff |
| 8 | Invulnerable | buff |

### 13.7 Enchants (`InvSlot.ench = (id << 4) | level`, level 1..3)

| id | name | applies to | effect |
|---|---|---|---|
| 1 | Efficiency | tools | faster mining |
| 2 | Sharpness | weapons | extra melee damage |
| 3 | Protection | armour | less damage taken (cap 40%) |
| 4 | Fortune | tools | extra ore drops |
| 5 | Knockback | weapons | stronger melee knockback |
| 6 | FeatherFalling | armour | less fall damage (cap 80% summed) |
| 7 | Flame | bow | arrows ignite what they hit (fire arrows) |

### 13.8 Key constants

| constant | value | meaning |
|---|---|---|
| `PROTOCOL_VERSION` | 7 | hello.protocol must equal this |
| `TICK_RATE` | 30 | server simulation Hz |
| `SNAPSHOT_RATE` | 30 | entity snapshot broadcast Hz |
| `WORLD_HEIGHT` | 1024 | blocks; valid block y = 0..1023 |
| `SEA_LEVEL` | 80 | water floods open terrain up to here |
| `CHUNK_VOLUME` | 262144 | cells per chunk column (16×height×16) |
| `VIEW_DISTANCE_CHUNKS` | 10 | chunk stream radius (Chebyshev) |
| `ENTITY_AOI_CHUNKS` | 6 | entity/drop visibility radius (chunks) |
| `CHUNK_SEND_BUDGET_PER_TICK` | 8 | max chunks streamed per tick per player |
| `DAY_LENGTH_SEC` | 480 | one full day-night cycle (real seconds) |
| `PLAYER_WIDTH / HEIGHT / EYE` | 0.6 / 1.8 / 1.62 | collision box + eye height |
| `PLAYER_REACH` | 5.5 | block/entity interaction distance (server adds ~1 slack) |
| `WALK / SPRINT / JUMP` | 5 / 8 / 8.4 | blocks/s (jump = initial vy) |
| `CROUCH HEIGHT / EYE / SPEED` | 1.4 / 1.2 / 2.6 | crouched box + eye + blocks/s (buttons bit 8) |
| `CROUCH_SPREAD_MUL` | 0.6 | weapon cone × while crouched (speed-gated server-side) |
| `PRONE HEIGHT / EYE / SPEED` | 0.6 / 0.5 / 1.3 | prone box + eye + blocks/s (buttons bit 13) |
| `PRONE_SPREAD_MUL` | 0.4 | weapon cone × while prone (speed-gated server-side) |
| `SPRINT_FIRE_DELAY_MS` | 250 | guns can't fire while at sprint speed (> 6.5 blocks/s) or this long after (server-dropped) |
| `GRAVITY` | -28 | blocks/s² |
| `SPEED_TOLERANCE` | 1.6 | anti-cheat horizontal headroom ×sprint |
| `MAX_RISE_SPEED / MAX_FALL_SPEED` | 30 / 280 | anti-cheat vertical caps (blocks/s) |
| `ATTACK_COOLDOWN_MS` | 600 | default melee swing cooldown (per-weapon; swords faster, axes slower) |
| `MELEE_REACH / +TOLERANCE` | 3.5 / +3.5 | default melee reach (per-weapon) + server hit-range slack |
| `RESPAWN_INVULN_SEC` | 5 | invulnerability after (re)spawn (broken by attacking) |
| `ARROW_GRAVITY / ARROW_TTL_SEC` | -18 / 6 | projectile gravity (blocks/s²) / lifetime |
| `BLOCK_WEAR_HP / REGEN / STAGES` | 27 / 120s / 8 | block HP per hardness / heal window / crack stages |
| `MAGNET_RADIUS / PICKUP_RADIUS` | 2.6 / 1.4 | drop vacuum / auto-collect radius |
| `PICKUP_DELAY_SEC / ITEM_DROP_TTL_SEC` | 0.5 / 300 | fresh-drop immunity / despawn |
| `HOTBAR_SIZE / INVENTORY_SIZE / MAX_STACK` | 9 / 36 / 64 | inventory geometry |
| `CHEST_SIZE` | 27 | chest container size (combined GUI indexing) |
| `BENCH_QUEUE_MAX / OUTPUT_SLOTS / JOB_MAX` | 4 / 8 / 99 | crafting bench: queued jobs / output buffer slots / units per order |
| `FURNACE_QUEUE_MAX / OUTPUT_SLOTS / JOB_MAX` | 4 / 8 / 99 | furnace: queued smelts / output buffer slots / units per order |
| `COOK_TIME_SEC` | 6 | wall-clock seconds to smelt one item |
| `MAX_MESSAGES_PER_SEC` | 120 | per-connection message cap (kick) |
| `TERRITORY_MAX_LEVEL / RADII` | 5 / 4,8,16,24,34 | claim levels + half-extent (blocks) per level |
| `TERRITORY_GAP / SPAWN_EXCLUSION` | 16 / 64 | min gap between claim boxes / DEFAULT min core distance from spawn (live value = admin spawn size, sent as territories.spawn.radius) |
| `TERRITORY_MAX_MEMBERS` | 8 | accounts a claim owner may share the land with (§9.7 members) |
| `AUTOMATION_OFFLINE_CAP_HOURS` | 12 | max wall-clock hours a machine settles in one go (§9.7) |
| `COLLECTOR_RADIUS / INTERVAL / BATCH` | 8 / 1 / 4 | item collector: vacuum radius / sweep seconds / drops per sweep |
| `HARVESTER_RADIUS / INTERVAL` | 6 / 4 | auto harvester: crop scan half-extent / seconds of settle budget per harvest |
| `CRAFTER_INTERVAL_SEC` | 10 | auto crafter: seconds per craft of its configured recipe (§9.7) |
| `CROP_STAGE_SEC / JITTER` | 32 / ±20% | wall-clock wheat growth per stage (3 stages → ripe); deterministic per-cell jitter |

### 13.9 Main quest line (§9.8)

`quest_state.quest` indexes this table by `id`; `progress[i]` counts toward
objective `i`'s target (claim/upgrade objectives are a single 0/1 check).

| id | quest | objectives | rewards |
|---|---|---|---|
| 1 | logs | collect 10× Log (10) | 2× Bread (80) |
| 2 | claim | claim land (place your Territory Core) | 8× Torch (50), 16× Planks (13) |
| 3 | wood | craft 16× Planks (13) · craft 8× Stick (61) | 4× Coal (62) |
| 4 | tools | craft 1× Wooden Axe (90) · craft 1× Wooden Sword (111) · craft 1× Wooden Pickaxe (85) | 2× Bread (80) |
| 5 | table | craft 1× Crafting Table (43) · place 1× Crafting Table (9) | 2× Apple (78) |
| 6 | torches | craft 4× Torch (50) · place 4× Torch (14) | 4× Coal (62) |
| 7 | chest | craft 1× Chest (48) · place 1× Chest (63) | 8× Planks (13) |
| 8 | stone | mine 16× Stone (1) / Cobblestone (8) · craft 1× Stone Pickaxe (86) | 6× Coal (62) |
| 9 | furnace | craft 1× Furnace (47) · place 1× Furnace (15) | 2× Bread (80) |
| 10 | charcoal | collect 4× Charcoal (63) | 8× Torch (50) |
| 11 | hunt | kill 3 mobs · collect 2× Raw Meat (81) | 5× Coal (62) |
| 12 | cook | collect 3× Cooked Meat (82) | 2× Bread (80) |
| 13 | wool | craft 1× Shears (105) · collect 3× Wool (23) | 2× Bread (80) |
| 14 | bed | craft 1× Bed (49) · place 1× Bed (64) | 2× Apple (78) |
| 15 | ores | mine 5× Coal Ore (12) · mine 5× Iron Ore (13) | 8× Torch (50) |
| 16 | iron | collect 5× Iron Ingot (66) | 3× Bread (80) |
| 17 | irongear | craft 1× Iron Pickaxe (87) · craft 1× Iron Sword (113) | 3× Apple (78) |
| 18 | ironarmor | craft 1× Iron Helmet (139) · craft 1× Iron Chestplate (140) · craft 1× Shield (116) | 4× Iron Ingot (66) |
| 19 | archery | craft 1× Bow (117) · craft 8× Arrow (118) | 16× Arrow (118) |
| 20 | fishing | craft 1× Fishing Rod (106) · collect 2× Fish (83) | 2× Cooked Fish (84) |
| 21 | core2 | core level ≥ 2 | 4× Iron Ingot (66) |
| 22 | advbench | craft 1× Advanced Workbench (44) · place 1× Advanced Workbench (165) | 8× Coal (62) |
| 23 | signal | mine 2× Signal Ore (78) · craft 1× Signal Lamp (56) · place 1× Signal Lamp (84) | 8× Torch (50) |
| 24 | gunsmith | craft 1× Gunsmith Bench (45) · place 1× Gunsmith Bench (166) | 8× Blast Powder (75) |
| 25 | pistol | craft 1× Pistol (119) · craft 8× Bullets (124) | 24× Bullets (124), 10× Blast Powder (75) |
| 26 | boom | craft 2× Grenade (127) · craft 1× Blast Charge (130) | 6× Blast Powder (75) |
| 27 | smg | craft 1× SMG (120) | 32× Bullets (124) |
| 28 | gems | collect 3× Raw Gold (67) · collect 2× Diamond (69) | 16× Torch (50) |
| 29 | core3 | core level ≥ 3 | 1× Diamond (69) |
| 30 | enchant | craft 1× Enchanting Table (51) · place 1× Enchanting Table (90) | 1× Diamond (69) |
| 31 | diamondgear | craft 1× Diamond Pickaxe (89) | 8× Iron Ingot (66) |
| 32 | turret | craft 1× Bolt Turret (58) · place 1× Bolt Turret (162) | 24× Arrow (118) |
| 33 | rifle | craft 1× Advanced Gunsmith Bench (46) · place 1× Advanced Gunsmith Bench (167) · craft 1× Rifle (121) | 64× Bullets (124) |
| 34 | sniper | craft 1× Sniper Rifle (123) · craft 4× Sniper Rounds (126) | 12× Sniper Rounds (126) |
| 35 | car | craft 1× Car (149) | 4× Cooked Meat (82) |
| 36 | core4 | core level ≥ 4 | 2× Diamond (69) |
| 37 | plane | craft 1× Plane (150) | 1× Golden Apple (79) |
| 38 | jetpack | craft 1× Jetpack (147) | 16× Coal (62) |
| 39 | core5 | core level ≥ 5 | 3× Golden Apple (79), 3× Diamond (69) |
| 40 | boss | kill 1 mobs | 5× Diamond (69), 2× Golden Apple (79) |
| 41 | collector | craft 1× Item Collector (152) · place 1× Item Collector (171) | 2× Chest (48) |
| 42 | extractor | craft 1× Resource Extractor (151) · place 1× Resource Extractor (170) | 8× Signal Conduit (53) |
| 43 | harvester | craft 1× Auto Harvester (153) · place 1× Auto Harvester (172) | 8× Wheat Seeds (76), 4× Bread (80) |
| 44 | crafter | craft 1× Auto Crafter (154) · place 1× Auto Crafter (173) | 2× Diamond (69) |
| 45 | shotgun | craft 1× Shotgun (122) · craft 4× Shotgun Shells (125) | 24× Shotgun Shells (125), 8× Blast Powder (75) |
| 46 | rockets | craft 1× Rocket Launcher (128) · craft 2× Rockets (129) | 4× Rockets (129), 6× Blast Powder (75) |
| 47 | diamondarmor | craft 1× Diamond Helmet (143) · craft 1× Diamond Chestplate (144) | 4× Diamond (69) |
| 48 | anvil | craft 1× Anvil (52) · place 1× Anvil (91) | 2× Block of Iron (40) |
| 49 | farm | craft 1× Wooden Hoe (100) · collect 3× Wheat (77) · craft 2× Bread (80) | 1× Golden Apple (79) |
| 50 | slayer | kill 15 mobs | 2× Golden Apple (79), 2× Diamond (69) |
| 51 | defenseline | craft 1× Bolt Turret (58) · place 3× Bolt Turret (162) | 6× Signal Conduit (53), 8× Iron Ingot (66) |
| 52 | cullraiders | kill 12 mobs | 2× Block of Iron (40), 4× Blast Powder (75) |
| 53 | holdtheline | survive 1 base siege | 3× Diamond (69), 2× Golden Apple (79) |

---

## 14. Versioning & etiquette

- The `protocol` field gates the wire format: this doc describes version
  **`7`**. If the server kicks you with `reload: true`,
  re-fetch this document — the format has moved.
- `welcome.version` / `GET /api/version` identify the server build; the wire
  format only changes when `PROTOCOL_VERSION` bumps.
- This file lives at `https://tessera.kimhwan.kr/docs/protocol.md`
  (machine-readable pointer: `https://tessera.kimhwan.kr/llms.txt`).
- **Be a good citizen:** it's a shared world with real players. Don't spam
  chat, don't strip-mine other people's builds, respect block break times, and
  keep your message rate humane (the 120/s cap is a
  ceiling, not a target). Abusive automation gets banned like any player.
