a39bfee803
bnstoolkit 0.7.0 -> 0.8.0. Plot system migrated from static Java + KubeJS to a runtime configurable, FTB-Chunks-integrated system. * Plot definitions now live at world/serverconfig/bnstoolkit/plots.json. Default file ships with 3 starter plots; edit + /bns admin plot reload. * /bns admin plot define <id> <name> <price>: add a plot in-game by standing in the chunk. Re-run with same id to add multi-chunk plots. * /bns admin plot list / remove / reload + /bns admin spawn-init. * /bns admin spawn-init creates Spawn (cyan #00BFFF) + Plots (gold #FFD700) server teams via FTB Teams + claims all defined plots for the Plots team. Idempotent. * /bns plot buy now: pays via combined cash+bank, unclaims chunks from Plots team, claims for buyer's personal FTB Teams team. * /bns plot release: reverse — chunks go back to Plots team, 50% refund. * Plot chunk guard: ClaimedChunkEvent.BEFORE_UNCLAIM subscriber blocks manual unclaim of plot chunks (player gets chat hint redirecting to /bns plot release). * KubeJS plots.js retired (.retired suffix in repo as documentation). On the map: cyan zones = Spawn team protection (manually claimed), gold zones = Plots team (for sale), other team colors = owned plots. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Brass & Sigil KubeJS scripts
All custom server behaviour lives here. Files in this tree ship via the
modpack manifest (see scripts/Build-Pack.ps1 — kubejs/ is in
managedRoots), get synced to both server and client installs, and are
loaded by KubeJS on startup.
File layout
kubejs/
├── README.md this file
│
├── server_scripts/ Loaded by the SERVER's KubeJS on world load.
│ ├── recipes_<x>.js Crafting-recipe overhauls per mod.
│ ├── waystones_policy.js Waystones placement gating (1/player + bans).
│ ├── welcome.js First-join grant: waystone + manual book.
│ ├── cc_recipes.js Full ComputerCraft recipe overhaul.
│ └── bns_admin.js /bns admin <subcommand> for OP diagnostics.
│
└── client_scripts/ Loaded by the CLIENT's KubeJS on game load.
└── jei_hides.js Hide specific items from the JEI ingredient list.
Conventions
- Logging prefix: every console line uses
[bns/<module>]so server logs can be filtered withjournalctl -u brass-sigil-server.service | grep '\[bns/'. Keeps our output separate from mod output. - One concern per file. Recipe overhauls live in
recipes_<modname>. Block/item policy goes in a<thing>_policy.js. Don't mix recipe removal with event listeners in the same file. - Persistent player data keys are prefixed
bnsto avoid clashing with other mods' use ofplayer.persistentData. Currently used keys:bnsWaystoneCount(int) — seewaystones_policy.jsbnsWelcomeGranted(bool) — seewelcome.js
- Performance: hot-path event handlers (BlockEvents.placed/broken,
PlayerEvents.loggedIn) must stay O(1). Use
Setfor ID lookups, never Array.includes inside an event handler. Avoid Modrinth/network calls in event handlers — never. No periodic-tick polling unless absolutely necessary. - Server commands are registered under the
/bnsnamespace (/bns admin ..., future:/bns plot ...). Seebns_admin.jsfor the registration pattern.
Diagnostics
When something looks wrong in-game, first port of call:
/bns admin info— prints active flags + counts for the running player/bns admin waystone-count <player>— read stored count/bns admin reset-welcome <player>— re-trigger the first-join grant- Server log:
journalctl -u brass-sigil-server.service -f | grep '\[bns/'
See also
pack/overrides/defaultconfigs/— first-run mod configs (auto-copied toconfig/by NeoForge on first launch only)scripts/Check-Deps.ps1— pre-flight dep check, runs before any Deploy-Brass-Stage Packdeploy- The memory file
project-mc-player-economy.mdfor the broader plan