`--at -8445,320,135` failed: clap read the leading minus of the separate values as a flag. It is now one x,y,z value that may start with a minus. EDITOR_PROBES casts the cursor's walkable-surface ray down at WoW points beside EDITOR_SHOT. Run at 11 Stormwind spawns on WMO floors (the Keep, the Mage Quarter tower's top storey, the Trade District), it hits 0 to 0.21 yd under the z the server stores, on the spawn's own storey. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
benilla-editor
A content editor for 1.12.1 servers on top of benilla's world engine. Content is authored over the player's own install and exported as vMaNGOS migrations. Nothing from the install is ever committed or written to.
Layout
| Crate | What |
|---|---|
editor-project |
The project model: targets, reserved id ranges, spawns, the last-export baseline. No Bevy. |
editor-vmangos |
Pending changes to one vMaNGOS world migration, in the core's own template; the world database read back (world_db). No Bevy. |
editor-cli |
benilla-editor-cli new / check / export, for CI and the release pipeline. |
editor-app |
benilla-editor, the window: benilla's WorldPlugins, a free camera, placement, preview. |
benilla is a sibling checkout (../benilla) at the commit in BENILLA_REV. The app's build fails
against any other commit: benilla promises no stable API, so moving the pin is a change of its
own (BENILLA_PIN_ANY=1 builds anyway, to try one).
Running
# A project with a guid range the server owner has reserved for it.
cargo run -p editor-cli -- new camp.json --vmangos-rev <core commit> \
--guid-first 9000000 --guid-last 9000999
# Local settings: WOW_DATA (the install) and, optionally, EDITOR_WORLD_DB (the world database,
# read only). Both binaries read .env at the repository root; variables already set win.
cp .env.example .env
# Place spawns: entry is creature_template.entry. With EDITOR_WORLD_DB the preview display and the
# name come from the template; without it, pass --display <CreatureDisplayInfo id>.
cargo run -p editor-app -- camp.json --entry 69
# What would be exported, then write the migration into the server repository.
cargo run -p editor-cli -- check camp.json
cargo run -p editor-cli -- export camp.json --out <core>/sql/content/migrations
Guids are handed out from the top of the range down and never reused. The core gives .npc add
and temporary creatures guids above MAX(creature.guid); once the range's last guid is that
maximum, the server's own allocations land above the range instead of where the project places
next.
With EDITOR_WORLD_DB set, check and export compare the server with the project first, and
export refuses on a conflict: a row in the range the project never held, a guid it adds that is
taken, a template missing at the spawn's patch_min, or (once every export is applied) a row that
no longer matches the last export. The migration's own guards check the same at apply time.
An export writes only what changed since the last one, records the migration and its SHA-256 in the project, and refuses to overwrite a migration file. Re-exporting an unchanged project writes nothing.
The migration
The core's world tables are MyISAM, which cannot roll back. So every check runs before the
migrations row and the first write, and a failed check SIGNALs out with nothing written:
a new guid must be free; an updated or deleted row must still have the guid, entry and map the
last export wrote; a deleted spawn must have no creature_addon, creature_movement,
creature_linking, pool_creature or game_event_creature row.
R0 acceptance
The run that closes R0: a spawn appears on the server at the spot and facing the editor shows.
new, then in the editor place one spawn with a plain creature display (not a humanoid NPC) on terrain, one on a WMO floor (a bridge or an upper storey), turn each to a distinct facing,Ctrl+S.exportinto the core'ssql/content/migrations, apply it (deploy/local/apply-content.sh), restartmangosd.- In the client:
.go xyzwith the line the editor's status shows for each spawn. The creature stands at the editor's position and faces the editor's arrow. Record.gpsnext to the editor's numbers. - Apply the same file again: nothing changes (the
migrationsrow). - Move one spawn, delete the other, export, apply: one row updated, one gone.
Not yet
Humanoid NPC preview (CreatureDisplayInfoExtra: the character geoset and equipment pipeline is
private to benilla-app), the server's existing spawns shown in the world, a project content
patch (the brush previews the patch-10 template), animation, and everything after R1.