ae183f27de9d749fb870bae5b0b778b91fe2e486
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
Self-hosted Minecraft modpack distribution + administration system. Three components, one repo:
brass-and-sigil/
├── launcher/ ← Avalonia desktop client (Windows .NET 8)
│ Auths with Microsoft, syncs the modpack, launches the game.
├── server/ ← brass-sigil-server daemon (Linux .NET 8)
│ Wraps the MC subprocess, exposes the admin web panel,
│ syncs mods, runs backups + BlueMap, handles whitelist.
├── pack/ ← Modpack content
│ ├── pack.lock.json Source of truth for mod versions / URLs / hashes
│ ├── tweaks/ Hand-written data-only tweak source
│ └── overrides/ Build output / hand-placed local files (gitignored)
├── scripts/ ← Build + deploy entry points (run from repo root)
│ ├── Update-Pack.ps1 Refresh pack.lock.json from Modrinth/CurseForge
│ ├── Check-Updates.ps1 Non-mutating "what's new?" report
│ ├── Build-Tweaks.ps1 Compile tweaks/ into pack/overrides/mods/*.jar
│ ├── Build-Pack.ps1 Generate manifest.json from the lockfile
│ └── Deploy-Brass.ps1 One-shot build + deploy everything
└── docs/ ← Operational notes, deploy runbook, schema docs
Quick start
# Pull dependencies, copy and edit the deploy profile
git clone <remote> brass-and-sigil
cd brass-and-sigil
Copy-Item scripts\deploy.config.template.ps1 scripts\deploy.config.ps1
notepad scripts\deploy.config.ps1 # fill in deploy share, SSH host, etc.
# Build + deploy everything in one go
.\scripts\Deploy-Brass.ps1
deploy.config.ps1 is gitignored -- local values never get committed.
Component reference
| Component | What it does | Technology |
|---|---|---|
launcher/ |
Friend-distributed client. Auths with Microsoft via WebView2 + XboxAuthNet, downloads mods, launches Minecraft. Single self-contained .exe published from publish/. |
Avalonia 12 + CmlLib.Core |
server/ |
Daemon running alongside the MC process on Linux. Hosts a Kestrel web panel for admin (cookie-auth, rate-limited), bridges RCON, runs scheduled backups + BlueMap renders, handles whitelist requests. | ASP.NET Core minimal APIs |
pack/ |
Lockfile-driven modpack content. pack.lock.json resolves mod slug → URL+SHA-1; Build-Pack.ps1 walks it and produces manifest.json for the launcher and the server-tool to consume. |
PowerShell tooling |
Workflow
- Bump mod versions:
.\scripts\Update-Pack.ps1(queries Modrinth + manual CurseForge entries). - Sanity-check:
.\scripts\Check-Updates.ps1for a non-mutating availability report. - Edit tweaks under
pack/tweaks/<name>/if you're changing recipes / loot / etc. - Deploy:
.\scripts\Deploy-Brass.ps1-- builds launcher + server, regenerates manifest, mirrors everything to the deploy share, scp's the server binary.
Secrets / config files
| File | Tracked? | Notes |
|---|---|---|
launcher/launcher-config.template.json |
✓ | Empty placeholders, public-safe |
launcher/launcher-config.json |
✗ | Local override; merged into the published exe at build time if present |
server/deploy/server-config.example.json |
✓ | Template; rename to server-config.json on the server with real values |
server/deploy/server-config.json |
✗ | Production config; lives on the server only |
scripts/deploy.config.ps1 |
✗ | Local deploy profile (paths, SSH host, share location) |
License
See LICENSE.
Languages
C#
53.1%
JavaScript
23.9%
PowerShell
12.9%
HTML
5.3%
CSS
2.9%
Other
1.9%