ae183f27de
Major economy / spawn-design pivot. ## Removed: Create: Encased The mod's `chorium_ingot` → `creative_casing` chain unlocked 60+ infinite-output creative-tier blocks via fully renewable inputs (rose quartz + chorus fruit + lava). Single creative_mechanical_drill in a player base would have produced enough diamonds to trivialize the civic ladder. Removing the mod was simpler than KubeJS recipe overrides since none of the mod's other content (wood-variant encased shafts, coloured casings) was load-bearing for our pack. Parallel audit of 14 other Create-family mods confirmed none have similar exploits — only Create: Encased was the breaker. ## Counting House refactor What used to be "Bazaar" became "Counting House" — a wealth exchange, not a general shop. Conceptual model: - Players accumulate diamonds / netherite / ancient debris through adventure and mining (the wealth-store axis) - Counting House converts these to spurs, credited directly to the player's Numismatics bank account - Iron / gold / coal / lapis / redstone are no longer here — those belong on player-run Numismatics Vendor blocks at market prices SellCatalogue cut from 9 items to 4 (diamond, diamond_block, netherite_ingot, ancient_debris). Diminishing-returns floor tightened 50% -> 30%. ## Numismatics integration NumismaticsBridge (reflection — no hard dep) wires up: - ensureAccount on PlayerLoggedInEvent (every player gets a personal account on first login) - balanceOf / deposit / deduct for bank operations - SpurBalance.totalSpurs = inventory coins + own bank balance, no card lookups required - HUD overlay now shows three lines: tier / cash on hand / bank balance — total wealth visible regardless of cards ## /bns commands migrated to Java `/bns sell` and `/bns wallet` are now Java-handled (CountingHouseCommands.java). Bank credit happens atomically with inventory pull. KubeJS `02_sell_shop.js` retired (.retired suffix preserved in the repo as documentation). ## Hub status-only Removed the Civic Tier / Bazaar / Bounty / Plot routing buttons. Transactional screens are now only reachable via NPC dialogue (`/bns open <screen>` from an Easy NPC COMMAND action). The hub shows tier + cash + bank + total + slot caps; footer reads "Visit spawn NPCs for trades, bounties, plots, tier upgrades." This locks the spawn-as-civic-centre design: players have to travel. ## bnstoolkit jar 0.5.1 -> 0.6.0 (network version 0.4 -> 0.5; TierStateUpdatePacket now carries cashOnHand + bankBalance separately). ## Pack manifest 102 -> 104 mods after Encased removal. Manifest republished on glados (publish-pack.py) before restart so the wrapper's sync sees the right target state. Without that step, the sync was reverting our changes. 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