b85eef04bd
Was: 5-denom x8 chain (spur=1, bevel=8, cog=64, crown=512, sun=4096). Now: 6-denom x8 chain with sprocket inserted between bevel and cog. Verified in-game (user reported Sun = 64 Cogs, which only fits these values: spur=1, bevel=8, sprocket=64, cog=512, crown=4096, sun=32768). Plot purchase math (countCoins, takeCoins, giveCoins) was using the old 5-denom map: cog would have been counted as 64 spurs when it's actually 512, and sprockets weren't counted at all. Plot prices remain at 100/250/600 spurs which are still appropriate small-change amounts; user can edit PLOT_DEFS to raise once playtesting confirms desired economy scale.
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