You know classic Diku zedit / zone files. Neo has no zedit. Zones are workspace prototypes edited with @zone …, saved with @save zone, then exercised live with the immortal zone reset / zone clear commands.
Hub: Creation Law. Rooms/mobs/items you place must already exist (Rooms, Mobiles, Objects). Zones have no SpecProc table of their own — see Script Law — Zones.
From server docs (ZONES.md) and the workspace editor: a zone owns lifespan (seconds between automatic resets), a reset command list (Diku-style loads: mobiles, items, doors, equip, …), weather affiliation, and related flags/attrs. Setting lifespan schedules a repeating ZoneCmdEvent; when it fires, zone.reset() runs the command list (unless global/zone noreset debug flags are on).
Why you care as a new creator: building rooms and mobiles is not enough — without zone reset lines (and a reset), the world stays empty.
1. Open a zone draft (VID is the zone top you are allowed to use in-range):
> @new zone 1299 Okay. >
If a zone draft is already open, @examine zone then @save or @clear.
2. Name and text (writers — why: immortals and indexes need a human label):
> @zone name The Quiet Alcove > @zone author > @zone description >
3. Lifespan (why: how often the area repops). Value is seconds; the event period is that many milliseconds under the hood.
> @zone lifespan 900 Okay. >
4. Optional attrs/flags:
> @zone attrs zonetype … > @zone flags zoneflags … >
5. Reset lines — place content (rooms 1200 and mobile/item prototypes must already be saved):
> @zone npc 1210 1200 Okay. > @zone item 3100 1200 Okay. > @zone list > @examine zone > @save zone Okay. >
6. Make it live:
> zone reset Okay. >
Omit the VID to reset the zone of your current room, or pass a top: zone reset 1299. @save zone alone does not repop the rooms — you must zone reset (or wait for lifespan) to see mobiles/items appear. That is the #1 zone gotcha.
Include: attrs, author, clear, description, delete, door, equip, flags, follow, give, item, levels, list, lifespan, map, max, name, npc, place, put, rndmob, rndobj, ride.
Teaching notes on the ones you will use first:
npc <mob-vid> <room-vid> — load mobile into room on resetitem <item-vid> <room-vid> — load item into roomequip <item-vid> <wear-loc> — equip onto the mobile most recently implied by reset order (place npc before equip)give <item-vid> — give into inventory of that mobile contextput … / follow / ride / door — container, pet, mount, door-state resetslist — show the command list while editingdelete / clear — remove list entries or clear editor state (workspace clear vs immortal zone clear are different — see below)> @load zone 4599 Okay. > @zone npc 4503 4500 Okay. > @zone equip 4502 wield Okay. > @zone give 3101 Okay. > @zone list > @examine zone > @save zone Okay. > zone reset Okay. >
If the mob loads without the weapon: check list order, confirm item 4502 exists and is wieldable (Items), then reset again.
> zone reset Okay. > zone clear 1299 Okay. >
zone [clear|reset] (<zone-top>) — immortal utilities. reset runs the stored command list; clear clears the live zone contents (per immortal handler). Do not confuse zone clear with @zone clear inside the workspace draft.
@rezone <old-top> <new-top> remaps a zone top within your range (implementor/creator tooling) when you need to slide an area to a new top VID.
approve zone <vid> prompts an immortal confirmation to mark a zone approved — use when your build is ready for wider play.
> approve zone 1299 >
Zone definitions and reset lists live in the world H2 database. Workspace drafts are memory-only until @save zone. Automatic world saves run on a long real-time cadence (SaveEvent); shutdown also saves. There is no classic “asave” — @save zone is the commit.
A zone does not carry a SpecProc name. Scripted behavior lives on the rooms, items, and mobiles the zone places. Create those procs, attach them on the prototypes, then let zone resets load the prototypes — Script zones, Script rooms, Script mobiles, Script objects.
zone reset@zone npc / item pointing at VIDs you have not @saved yetequip before npc in the list@clear / @zone clear (workspace) with zone clear (live)