b4cd66036b
KubeJS module that owns the 13-tier civic ladder per economy doc §4a. Authoritative source for TIER_CONFIG (per-tier perks: cost, wilderness chunks, plot slots, daily bounty slots, shop fee discount, chat colour, join broadcast). Player tier stored as int in player.persistentData.bnsTier; default 1 (Peasant), set on first login. Admin commands (op level 2): /bns admin tier get <player> /bns admin tier set <player> <1-13> /bns admin tier list Module-local pattern (KubeJS Rhino runs scripts in strict mode -- no globalThis, no bare-assignment globals). Other economy scripts will duplicate TIER_CONFIG and use player.persistentData.bnsTier directly to read tier rather than trying to import. See feedback-kubejs-rhino- gotchas memory. FTB Ranks will mirror this once the bnstoolkit mod ships -- ranks will carry the FTB Chunks permission nodes. For now the NBT is the single source of truth and admin promotes manually with /bns admin tier set. Verified: server boots clean, KubeJS loads with 0 errors. First-join hook initialises new players to tier 1. 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