diff --git a/client/src/routes/admin/SpawnAtlas.jsx b/client/src/routes/admin/SpawnAtlas.jsx index 10f084e..68e459b 100644 --- a/client/src/routes/admin/SpawnAtlas.jsx +++ b/client/src/routes/admin/SpawnAtlas.jsx @@ -159,11 +159,14 @@ export default function SpawnAtlas() { setStatus(fresh) setPath(fresh.path || '') setMsg( - fresh.path === '' - ? 'Path cleared. The atlas will be skipped on the next boot; what is loaded keeps serving.' - : fresh.treeReadable - ? 'Saved. The tree is readable — import when you are ready.' - : 'Saved, but the tree could not be read from here. Check the mount and permissions.', + fresh.source === 'bridge' + ? 'Saved, but not in use: this site reads the atlas from the linked shard. The path takes' + + ' over only if uo-link is disabled.' + : fresh.path === '' + ? 'Path cleared. The atlas will be skipped on the next boot; what is loaded keeps serving.' + : fresh.treeReadable + ? 'Saved. The tree is readable — import when you are ready.' + : 'Saved, but the tree could not be read from here. Check the mount and permissions.', ) } catch (err) { setError(err.message || 'Could not save the path.') @@ -185,9 +188,11 @@ export default function SpawnAtlas() {

The bestiary and spawn map on the public site, parsed from the shard’s own ServUO files. - It refreshes itself on every server start; everything here is for the times you don’t want - to wait for one. Nothing on this page touches the sidecar — the atlas is shard content, not - shard state, and stays complete while the shard is down. + Where those files come from depends on whether a shard is linked: with uo-link configured + the shard serves them over the bridge and importing is something you do here, when a map + changes. Without one, the site reads a local tree and re-imports itself on every server + start. Either way the atlas is shard content rather than shard state, so what is + loaded keeps serving in full while the shard is down.

@@ -218,10 +223,23 @@ export default function SpawnAtlas() { {counts.champions?.toLocaleString() ?? '—'} )} - - {!status?.configured ? 'No path set' : status.treeReadable ? 'Yes' : 'No'} + + {status?.source === 'bridge' + ? 'The shard, over uo-link' + : status?.configured + ? status.path + : 'None — no shard linked and no path set'} - + + {!status?.configured + ? 'No source' + : status.treeReadable + ? 'Yes' + : status.source === 'bridge' + ? 'No — the shard did not answer, or Bridge.TreeEnabled is off' + : 'No'} + + {status?.drift == null ? '—' : status.drift ? 'Yes — an import would pick it up' : 'No'} @@ -231,9 +249,13 @@ export default function SpawnAtlas() { ServUO tree

- Where the website reads the shard’s spawn files from — the same host, a bind mount or a + A local ServUO tree the website can read directly — the same host, a bind mount or a shared volume. This setting wins over the SERVUO_PATH deploy default, so the - mount can move without a redeploy. Leave it blank to turn the atlas off. + mount can move without a redeploy. + {status?.source === 'bridge' + ? ' It is not in use right now: this site has a shard linked, and the shard serves its' + + ' own files over the bridge. Unlink or disable uo-link to fall back to a path.' + : ' Leave it blank to turn the atlas off.'}

- Applies a map change without restarting. An unchanged tree costs nothing — the source files - are hashed first and skipped when they match. A refresh that would remove a facet still - comes back here for approval rather than being applied. + Applies a map change without restarting — and on a linked shard it is the only thing that + does, because boot deliberately never calls the shard for this. An unchanged source costs + almost nothing: the file list and its hashes are read first (about 32 KB over the bridge) + and no file is transferred when they match. A refresh that would remove a facet still comes + back here for approval rather than being applied.