Files
Matt ae183f27de pack: v0.39.0 — Counting House refactor + remove Create: Encased
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>
2026-06-08 15:34:25 +00:00
..

Brass & Sigil KubeJS scripts

All custom server behaviour lives here. Files in this tree ship via the modpack manifest (see scripts/Build-Pack.ps1kubejs/ 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 with journalctl -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 bns to avoid clashing with other mods' use of player.persistentData. Currently used keys:
    • bnsWaystoneCount (int) — see waystones_policy.js
    • bnsWelcomeGranted (bool) — see welcome.js
  • Performance: hot-path event handlers (BlockEvents.placed/broken, PlayerEvents.loggedIn) must stay O(1). Use Set for 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 /bns namespace (/bns admin ..., future: /bns plot ...). See bns_admin.js for the registration pattern.

Diagnostics

When something looks wrong in-game, first port of call:

  1. /bns admin info — prints active flags + counts for the running player
  2. /bns admin waystone-count <player> — read stored count
  3. /bns admin reset-welcome <player> — re-trigger the first-join grant
  4. Server log: journalctl -u brass-sigil-server.service -f | grep '\[bns/'

See also

  • pack/overrides/defaultconfigs/ — first-run mod configs (auto-copied to config/ by NeoForge on first launch only)
  • scripts/Check-Deps.ps1 — pre-flight dep check, runs before any Deploy-Brass -Stage Pack deploy
  • The memory file project-mc-player-economy.md for the broader plan