Plot system migrated from static Java + KubeJS to a runtime
configurable, FTB-Chunks-integrated system.
* Plot definitions now live in JSON at
<world>/serverconfig/bnstoolkit/plots.json. Default file written on
first server start with the three v0.33 plots. Editable in-place
+ reloadable via /bns admin plot reload.
* New static Plot.REGISTRY replaces Plot.ALL. Loaded on ServerStartedEvent.
Plot.all() returns the current snapshot.
* New FtbBridge.java — compileOnly deps on ftb-teams + ftb-chunks
(always in the pack). Wraps team lookup, chunk claim/unclaim, and
the BEFORE_UNCLAIM event.
* /bns admin spawn-init creates the Spawn (cyan) + Plots (gold) server
teams using configured UUIDs/colors and claims every defined plot
for the Plots team. Idempotent.
* /bns admin plot define <id> <name> <price> — adds the chunk you're
standing in to the plot. Re-run with the same id (different chunks)
to make multi-chunk plots. Auto-claims for the Plots team and
persists to JSON.
* /bns admin plot list / remove / reload commands.
* /bns plot buy <id> — pays via NumismaticsBridge.spend (cash+bank
combined), unclaims chunks from Plots team, claims for the buyer's
personal FTB Teams team. Records ownership in server NBT and the
player's bnsOwnedPlots list.
* /bns plot release <id> — reverse flow, refunds 50% to bank.
* Plot chunk guard: ClaimedChunkEvent.BEFORE_UNCLAIM subscriber rejects
any unclaim of a registered plot chunk unless a thread-local
SYSTEM_UNCLAIMING flag is set (only set during the release/transfer
flows). Players who try to unclaim via the FTB Chunks UI get a chat
message redirecting them to /bns plot release.
* KubeJS plots.js retired (.retired suffix kept). All logic now in
Java; KubeJS no longer participates in plot ownership state.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
All five screens implemented with FTB Library widgets (Panel/Widget/
SimpleTextButton). Layout matches FTB Quests/Chunks for visual
consistency with the rest of the pack.
Screens:
- TierUpgradeScreen — 13-row ladder, current tier highlighted,
Upgrade button to next tier with cost/affordability check
- ShopBrowserScreen — 9-cell item grid + detail pane, quick-sell
buttons (1/16/64) with live DR-aware price preview
- BountyBoardScreen — daily pool + active set, accept/cancel/turn-in
per state, slot-cap indicator
- PlotPurchaseScreen — plot list + detail pane, buy/release with
ownership colour-coding and tier-gated buy
- QuestLogScreen — at-a-glance tier+balance summary, active
bounties with progress bars, owned plots
HUD overlay: top-left tier name + spurs balance, registered as a
NeoForge GUI layer above the experience bar. 1Hz server push keeps
the balance current without polling client-side inventory.
Network: replaces single smoke-test packet with 7-packet contract:
- C2S: RequestEconomySnapshot, RunBnsCommand (whitelisted)
- S2C: TierStateUpdate, SellSnapshot, BountySnapshot, PlotSnapshot, Toast
Server-side bridge (ServerEconomyBridge) reads player NBT and
Numismatics-by-item-id-string for balance, routes write verbs
through the existing KubeJS /bns chat commands so KubeJS remains the
source of truth for economy logic.
Key bindings (rebindable in vanilla controls menu):
- K Civic tier ladder
- J Bounty board
- N Plot office
- H Bazaar shop
- M Quest log
FTB Library + Architectury maven repos wired in build.gradle as
compileOnly; the jar stays small since FTB Library is already in pack.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>