f19e7b187e
Numismatics' x8 uniform chain isn't intuitive. Mod values are hardcoded so we cant fix the ratios, but we can put the conversion table directly on each coins tooltip via KubeJS ItemEvents.tooltip. Players hover any coin -> see how it relates to the others + a hint to use Bank Teller for on-the-fly conversion. ~25 lines, ItemEvents.tooltip hot path is cached per item-id so no performance concern.
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