Files
Matt 9eb8f540c4 pack: v0.32.0 — FTB Quests + XMod Compat + Ranks; restrictive travel design
Mods added (Phase 0a substrate for the bnstoolkit economy work):
  - FTB Quests 2101.1.25 (progression quest UI for Phase 5+)
  - FTB XMod Compat 21.1.8 (KubeJS hooks for FTB Chunks/Quests events)
  - FTB Ranks 2101.1.3 (tier system via permission nodes)

Design revision: restrictive travel.

This is a Create Aeronautics pack — the journey is the point. Removed
all instant-teleport perks from the tier ladder. Players get one
starter Waystone and use it for spawn↔base; further travel means
building airships, trains, vehicles. Pressure on real movement is
intentional.

Removed perks: sethomes, /back after death.
Removed system: the full sethome subsystem (commands, SavedData,
cooldowns) from the bnstoolkit mod scope.

Tier table reduced from 10 columns to 8: cost, wilderness chunks,
plot slots, daily bounties, shop fee, chat colour, join broadcast.

Mod phasing collapsed from 7 phases to 6 (M2 sethome system removed,
later phases shift up).

Future perk dimensions list updated with two waystone-related
candidates (slot cap, XP cost reduction) as the natural travel-
progression hooks for later tier-perk revisions.

Verified live: all 3 mods discovered + loaded, port 25565 binds,
no FATAL/Crashed/Exception lines in startup log. Server resumed
to 0.32.0 cleanly.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-06 23:22:47 +00:00

31 KiB
Raw Permalink Blame History

Brass and Sigil — Economy & Quest System Design

Status: 13-tier ladder locked (v0.4). Architecture + UI confirmed in v0.3. Owner: matt Last updated: 2026-06-06


1. Goals

  • One unified currency — spurs (Numismatics).
  • Multiple ways to earn, each one bounded. No infinite money printer.
  • Multiple sinks that scale with progression. Money disappears as you advance, so wealth never dwarfs the cost of new ambitions.
  • Spatial design that gives spawn personality. Themed guild buildings, each with a clear purpose, each tied to the same wallet.
  • Forward-compat with a proper quest line via FTB Quests, while supporting daily/repeatable activities at spawn.
  • Anti-automation by design, not by patches.

2. Core architecture

            ┌────── MONEY IN (bounded) ──────┐
            │                                 │
   Adventurer's Guild   — Daily bounties (cooldowns, scaling)
   Merchant's Bazaar    — Sell shop (fixed + DR), dynamic exchange
   Mint                 — Capped emerald → spur conversion *
   First-time milestones — One-shot per player
   FTB Quests           — Progression milestone payouts
                  │
                  ▼
          ┌───────────────────┐
          │   Player wallet   │   ← Numismatics
          │     (spurs)       │
          └───────────────────┘
                  │
                  ▼
            ┌────── MONEY OUT (scaling) ──────┐
            │                                  │
   Civic Office         — Plot claim costs (FTB Chunks override)
   Civic Office         — Tier upgrades (FTB Ranks integration)
   Merchant's Bazaar    — Player-to-player job board (no minting)
   Villagers            — Re-priced trades, net sink
   Custom services      — Warps, sethomes, premium cosmetics

* Only if we keep emeralds; see §5 — we're moving villagers to spurs, which probably retires the Mint as a currency-conversion station and repurposes it as a wallet/info hub.


3. Spawn — themed guild buildings

Each guild is a destination. The guild's NPC is both the entry point (accept work) and exit point (return to claim reward). This pattern applies universally — see §4.

Building Purpose Primary mechanics inside
Adventurer's Guild Combat & exploration Bounty board (daily mob hunts), boss-kill quests, dungeon-delve quests (future)
Merchant's Bazaar Trade & raw-mat economy Numismatics sell shop, dynamic exchange counter, player-driven job board
Civic Office Land & status Tier upgrade screen, spawn plot registry (purchase / view your plots), sethome/warp services. NOTE: regular wilderness chunk claiming uses the FTB Chunks map and is tier-allocated, not paid per chunk — see §4.
Library / Academy Knowledge & magic FTB Quests anchor NPC, Ars Nouveau themed quests, lore terminals
Tavern Social & onboarding First-time newbie quests, casual NPCs, food/buff vendor
Foundry / Workshop Crafting & commissions Create-themed contracts, crafting orders, raw-material market
Mint Currency information Wallet info, currency tutorial, possibly emerald exchange

Forward-compat with a full quest line

The architecture is naturally dual-track:

  • FTB Quests = the progression backbone — chapter-by-chapter pack content, one-time rewards, story arcs. The campaign.
  • Spawn-building NPCs (Easy NPC + KubeJS) = the daily/repeatable layer — bounties, sell shops, services. The live activities.

Both pay into the same wallet. Players run the campaign at their pace and the daily content for income/replay value. They reinforce each other rather than compete.


4. Tier system & spawn plots

Two distinct land/status systems that often get conflated. Keeping them clean:

4a. Civic tier ladder

Every player has a Civic rank. Higher rank unlocks perks. Players spend spurs at the Civic Office NPC to upgrade. Powered by FTB Ranks under the hood (permission nodes drive what each rank unlocks).

The ladder is intentionally long (13 tiers) so endgame ranks feel rare and aspirational. Top tiers represent months of dedicated play; Sovereign is "you've finished the game."

# Title Cost to reach Wilderness chunks Plot slots Daily bounties Shop fee Chat colour Join broadcast
1 Peasant free (starter) 9 0 3 0% grey
2 Farmer 200 18 0 3 0% grey
3 Citizen 750 35 1 3 0% white
4 Merchant 2,500 60 1 4 -2% yellow
5 Knight 6,500 100 2 4 -5% green simple
6 Baron 15,000 150 2 5 -7% cyan simple
7 Viscount 35,000 220 3 5 -9% blue fancy
8 Earl 75,000 300 3 6 -11% purple fancy
9 Marquess 150,000 400 4 6 -13% gold fancy
10 Duke 300,000 525 5 7 -15% orange epic
11 Archduke 700,000 700 6 7 -17% red epic
12 Grand Duke 1,500,000 900 7 8 -19% bright red epic + particles
13 Sovereign 10,000,000 1,500 10 10 -25% rainbow epic + spectacular

Travel philosophy: this is a Create Aeronautics pack — the journey is the point. We deliberately do not give players sethomes, /back, or other instant-teleport conveniences. The intended travel system is Waystones (mod already in pack):

  • Players get one waystone at the start of the game. It anchors their base.
  • They can teleport between spawn ↔ their own waystone(s).
  • Beyond that, real travel means building airships, trains, vehicles — the actual gameplay.

This is restrictive by design. We can layer waystone-related perks into the tier ladder in a later revision (e.g. "tier N unlocks 2nd waystone slot", or "tier M reduces waystone XP cost"). For V1 the ladder stays as above and travel pressure remains intentionally high.

Notable shape choices:

  • Knight (tier 5) is the gentry threshold — first colored chat (green), first join broadcast, meaningful jump in plot slots
  • Duke → Archduke jump is the late-game wall (300k → 700k, ~2.3×) — Archduke is the start of "I've really committed to this server" territory
  • Sovereign is dramatic — 6.7× the Grand Duke cost. Real "finished the game" status. -25% shop fee is a step-change leap; spectacular join effects.

Numbers are first-pass calibration. The full perk table lives in a single JSON (config/bnstoolkit/tiers.json) that's hot-reloadable via /bnstoolkit reload. Easy to tune any column without code changes.

4a.1 Founder flag (admin cosmetic)

The server owner / admin has a permanent [Founder] cosmetic prefix in chat that sits alongside their normal rank. It carries no gameplay perks — it's just visible identification so friends know who runs the server. The Founder still grinds the regular tier ladder like everyone else (good for playtesting balance + sharing the experience). Op commands are the actual admin tool; the Founder tag is purely visual.

Wilderness claims: at every tier above Peasant, you get a flat allowance of N chunks you can claim anywhere outside spawn via the FTB Chunks map. Claiming is free within your allowance, refused above. No per-chunk pricing. Driven by FTB Ranks → FTB Chunks permission nodes (ftbchunks.max_claimed_chunks).

4b. Spawn plots

Spawn plots are a separate system from wilderness claims.

  • Pre-defined regions at spawn — single chunks or small fixed clusters — designated by admins as "plots." Visible as fenced/bordered areas on the spawn map.
  • Purchased with spurs at additional cost per plot (separate from tier upgrade cost). Indicative pricing: standard plot ~2,000 spurs, premium (corner / prime location) ~5,000 spurs.
  • Primary use: shops. Players set up Numismatics shop blocks on their plots and sell to other players. Residence is allowed but secondary.
  • Slot-limited by tier: your civic rank determines how many spawn plots you can own simultaneously (column above). Hit the limit, you can't buy another until you upgrade or release a plot.
  • Purchase happens inside the FTB Chunks map UI — clicking a plot region in the map opens a confirmation screen (provided by our custom mod's mixin) showing cost + your remaining slots. Same UI you use for wilderness claims, integrated.
  • Plot data lives in the custom mod (bnstoolkit:plots), not in FTB Chunks. Plots are a separate ownership system that uses the FTB Chunks map as its visual surface.

5. Quest & bounty flow (universal pattern)

Core principle: for any guild, the player accepts work from an NPC, completes it in the world, then returns to that NPC to turn it in and claim the reward. No instant payouts. This:

  • Anchors guilds as destinations
  • Creates risk/reward tension (die on the return, lose the reward)
  • Encourages waypoint use and travel
  • Lets the server centrally control payouts and detect cheating

State machine

Each quest, per player, lives in one of these states:

   AVAILABLE  ─[player accepts]─►  ACTIVE  ─[objective met]─►  READY  ─[turned in]─►  COMPLETED
       ▲                                                                                    │
       └──────────────────────[cooldown elapses]───────────────────────────────────────────┘
  • AVAILABLE — NPC offers the quest in dialog. Player has no current copy of it.
  • ACTIVE — Player accepted. KubeJS tracks objective progress via relevant events (EntityEvents.death for kills, ItemEvents.firstRightClicked for explorations, etc.).
  • READY — Objective met. Reward is promised but not yet paid. NPC dialog now offers a turn-in option.
  • COMPLETED — Reward paid out. Quest goes on cooldown for this player.
  • AVAILABLE (again) — after the cooldown, the NPC will offer it again.

Worked example — daily bounty

  1. Adventurer's Guild NPC has 5 randomized daily quests (e.g. "Slay 10 Plunderers — 50 spurs").
  2. Player right-clicks NPC → Easy NPC dialog → "Accept: Slay 10 Plunderers."
  3. KubeJS writes quest:plunderer_10 to the player's quest state with count: 0.
  4. Player kills Plunderers in the world. EntityEvents.death for supplementaries:plunderer increments the count.
  5. At count=10, KubeJS flips state to READY and notifies the player ("Return to the Adventurer's Guild to claim your reward.").
  6. Player returns. Right-click NPC. Easy NPC dialog detects READY state and offers "Turn in: Slay 10 Plunderers."
  7. KubeJS pays 50 spurs into the player's Numismatics wallet, flips state to COMPLETED, sets cooldown to 24h.

Universal applicability

The same accept → complete → return pattern works for every guild:

Guild Accept Complete Return
Adventurer's "Hunt 10 plunderers" kill them NPC pays bounty
Merchant's "Procure 32 diamonds for our buyer" gather them NPC pays inflated price + completes
Civic "Survey 5 unclaimed chunks" walk through them NPC pays survey fee
Library "Recover this lost tome" find the book in a structure NPC pays + grants reputation
Foundry "Craft 10 Andesite Casings" craft them NPC pays commission

Player-facing UI (locked)

Polished, integrated, no chat commands to memorise. All player interaction happens through GUIs and NPC dialogue. Custom companion mod (working name bnstoolkit) provides the screens; FTB Library's UI framework is the visual basis so our screens match FTB Quests, FTB Chunks, and FTB Teams natively.

Surface Implementation
Quest Log screen Custom mod screen. Tabs: Active / Available / Completed. Click a quest to inspect, cancel from the detail panel. Opened via keybind or by clicking a Quest Log block at any guild.
Bounty Board screen Custom mod screen, opened by right-clicking the Adventurer's Guild Quartermaster NPC OR clicking the in-world Bounty Board block. Lists today's available daily bounties with descriptions, rewards, and "Accept" buttons.
Tier upgrade screen Custom mod screen, opened at the Civic Office NPC. Visual ladder, your current tier highlighted, next-tier cost, perks unlocked at each rank, big Upgrade button.
Plot purchase popup Custom mod mixin into the FTB Chunks map UI. Hover a plot region → cost + slots tooltip. Click → confirmation popup. Owned plots also clickable to see plot info.
Shop browser Numismatics shop blocks render their existing inventory UI by default; optional richer browser screen for the central Merchant's Bazaar inventory.
Quest progress HUD Custom mod render layer — styled HUD element showing active quest names + progress bars. NOT stacked vanilla bossbars.
NPC dialogue + buttons Easy NPC handles all NPC interactions: accept/turn-in, info, tutorials, "click for details" buttons. Players learn the system through NPC dialogue, not by reading docs.

Why custom mod, on FTB Library's UI framework

  • Visual consistency: FTB Quests, FTB Chunks, FTB Teams all use FTB Library's widget framework. Our screens built on the same framework will look and feel like part of the same product.
  • Already a pack dependency: no new mod added just for the UI layer.
  • Mixin compatibility: our spawn plot mixin into the FTB Chunks map operates on FTB Library widgets natively — no translation layer between vanilla MC widgets and FTB Library widgets.
  • Less boilerplate than vanilla MC Screen API: Panel, BlockButton, IconButton, Tooltip, TextField widgets already exist and behave consistently with how players already know FTB UIs to work.
  • Forking FTB is off the table: FTB mods are "All Rights Reserved" — depending on FTB Library as a library is fine (that's what libraries are for), forking FTB Quests or FTB Chunks for redistribution is not legally clean. Custom mod alongside the FTB stack is the correct architecture.

Why NOT FTB Quests for daily bounties

FTB Quests stays for long-form progression (Phase 5+), not for daily bounties. Source review confirms:

  • No abandon/cancel event (Ctrl+Shift+R reset fires no event we can hook)
  • Cooldown is per-team, not per-player
  • Visibility is per-team, not per-player — rotating "5 of 20 daily" doesn't fit cleanly

For long-form progression where one-shot rewards + team scope are fine, FTB Quests is great. Our custom bounty engine handles the daily/repeatable pattern with its own UI.

Quest slot limit

Players have a maximum of 3 active quests at a time. This is the friction that makes cancel meaningful:

  • Forces players to pick which quests they actually want — no "accept all 5, see what's easiest, cancel the rest" RNG-shopping.
  • Keeps the state files small.
  • Makes ready-to-turn-in queues meaningful (you can hold 3 unrewarded quests in your back pocket).

A quest moving to READY frees the slot for accepting a new one even before turn-in.

KubeJS implementation — locked specifics

  • State storage: per-player JSON in world/data/bns_quests/<uuid>.json. Schema:

    {
      "active": [
        {
          "id": "advg_plunderer_10",
          "acceptedAt": 1717684800,
          "progress": 7,
          "target": 10,
          "rewardSpurs": 50,
          "source": "adventurers_guild",
          "bossbarId": "bns:quest_advg_plunderer_10_<uuid>"
        }
      ],
      "completed": {
        "advg_plunderer_10": { "cooldownUntil": 1717771200, "completions": 3 }
      }
    }
    
  • Event tracking: KubeJS event handlers (EntityEvents.death, ItemEvents.pickedUp, BlockEvents.broken) read the player's active quests and increment progress + update bossbar value.

  • Bossbar lifecycle: on quest accept, KubeJS creates a unique per-player bossbar via server.runCommandSilent('bossbar add <id> <name>'), assigns it to that player only, updates value and max on progress. On turn-in or cancel: bossbar remove.

  • Numismatics integration (direct Java access — no events shipped, no KubeJS bindings):

    const Numismatics = Java.loadClass('dev.ithundxr.createnumismatics.Numismatics');
    const ReasonHolder = Java.loadClass('dev.ithundxr.createnumismatics.content.backend.ReasonHolder');
    
    const acct = Numismatics.BANK.getAccount(player);  // ServerPlayer
    const balance = acct.getBalance();                 // int (spurs)
    acct.deposit(50);                                  // pay quest reward
    const ok = acct.deduct(100, ReasonHolder.empty()); // returns false if broke
    Numismatics.BANK.markBankDirty();                  // force persistence
    
  • Dialog branching: Easy NPC dialog branches on scoreboard objective bns.quest.<npc_tag> that KubeJS mirrors quest state into. Dialog Command action triggers /bns_quest accept <id> <npc_tag> which routes to KubeJS.

  • Commands: registered via ServerEvents.commandRegistry in KubeJS. Scoped to the player who runs them. The custom /bns_quest namespace handles NPC-triggered actions; /quests is the player-facing tracker.

  • FTB Chunks claim cost (Phase 2): requires FTB XMod Compat mod. Then:

    FTBChunksEvents.before('claim', event => {
      const player = event.source.player;
      const acct = Numismatics.BANK.getAccount(player);
      const cost = computeClaimCost(player);
      if (acct.getBalance() < cost) {
        event.setResult(ClaimResult.YOU_DO_NOT_HAVE_ENOUGH_SPURS); // custom enum value
        return;
      }
      acct.deduct(cost, ReasonHolder.empty());
    });
    

    Note: the .before may fire twice (sim + real). Guard with idempotent state, or do balance check in .before and deduct in .after('claim').


5. Villager rebalance

Decision: move all villagers to spurs (not emeralds). Thematic consistency over preserving vanilla mental model.

Decision principles:

  • Villagers are net money sinks — players spend more on villagers than they earn from them.
  • Useful trades stay — enchanted books, tools, food, decorative blocks. Reasonable spur prices.
  • Trash trades get deleted — no one ever wanted to sell rotten flesh or buy paper.
  • Sell-to-villager trades exist but are bad64 wheat → 1 spur, 16 leather → 1 spur. Farms still possible, but ~10× slower than any other income source.

Price guidance (initial calibration — tune via playtesting)

Buy-from-villager (player pays spurs)

Item Tier-1 Tier-3 Tier-5
Standard enchanted book (random) 50 spurs 120 spurs 250 spurs
Mending book 800 spurs
Diamond tool (unenchanted) 80 spurs
Diamond tool (enchanted) 350 spurs
Bookshelf 15 spurs

Sell-to-villager (player gets spurs)

Item Spurs per unit
Wheat 1 per 64
Paper 1 per 32
Leather 1 per 16
Iron ingot 2 per 1
Diamond 8 per 1 (matches sell-shop fixed price — players use whichever is closer)

Scope

~60 trades × 5 profession tiers = ~300 trade entries to redesign. One-time data-design pass, implemented via ServerEvents.villagerTrades in KubeJS.


6. Money inflow sources (detailed)

Source Cap / DR mechanism Rough rate
Daily bounties Per-player per-quest cooldown (24h) ~200-500 spurs/day for an active player
Sell shop (fixed price + DR) Lifetime sales tracker per player, 10% price drop per 64 sold ~50-200 spurs/hr while diamond stockpile lasts
Dynamic exchange Global supply pool — price drops with sales Self-balancing
First-time milestones One-shot per player (hasFlag) 5-50 spurs per milestone, ~10 milestones total
FTB Quest progression One-time per quest Varies; cluster rewards at chapter completion
Villager sell trades Inherently slow + bad prices ~50 spurs/hr from a serious villager farm

7. Money outflow sinks (detailed)

Sink Cost curve Why this scales right
Plot claims Free up to 9 chunks. 50 spurs/chunk to 25. 200 spurs/chunk beyond. New players claim free starter areas; ambitious players pay real money
Tier upgrades Cumulative cost: 500 → 2k → 8k → 30k spurs Endgame sink, status display
Buy-from-villager See §5 Constant outflow as you build up
Premium cosmetics 100-2k spurs each Optional sink for cash-flush players
Services Sethome: 50 spurs, warp: 25 spurs, /back: 10 spurs Convenience taxes

8. Mod stack (locked)

Already in pack

Need Mod Version
Currency + wallets + shop blocks Numismatics 1.0.20
NPC dialog presentation Easy NPC 6.16.x (6.17.0 available, minor bump)
Plot claims FTB Chunks 2101.1.14
Team management FTB Teams 2101.1.9
Core library FTB Library 2101.1.31
Cross-mod compat Architectury API 13.0.8
Glue, commands, state KubeJS 2101.7.2

Adding in Phase 0a (mod-additions PR — blocks everything else)

Mod Version Reason
FTB Quests 2101.1.25 Progression quest UI (Phase 5+)
FTB XMod Compat latest 1.21.1 NeoForge KubeJS hooks for FTB Chunks claim events + FTB Quests events
FTB Ranks 2101.1.3 Tier system. CurseForge only, no Modrinth listing.

Building our own (custom companion mod)

bnstoolkit (working name) — a small companion mod in our own repo. Confirmed locked-in.

  • Provides all custom GUI screens (Quest Log, Bounty Board, Tier upgrade, Shop browser)
  • Provides the FTB Chunks map mixins (spawn plot cost overlay, hover tooltip, purchase popup)
  • Provides custom quest-progress HUD render layer
  • Provides the bnstoolkit:plots data storage + ownership permissions
  • Provides network packets for client↔server state sync
  • Provides the /bnstoolkit reload admin command for hot-reloading tier config
  • Built on FTB Library UI framework for visual consistency
  • KubeJS handles all gameplay logic (bounty rotation, state machine, villager trades, Numismatics integration) — the mod is purely the UI + integration layer

Estimated scope: ~2-3k LOC, single-developer week of focused work. Bounded.

Explicitly NOT adding

  • CustomNPCs (Easy NPC covers it)
  • Citizens (Bukkit-only)
  • PMMO / skill mods (out of scope)
  • Generic "quest giver" mods (FTB Quests + our KubeJS bounty engine cover it)

9. Phasing

Each phase is independently shippable. Earlier phases unlock value without depending on later ones.

Phase Deliverable Spawn build required?
0a Mod additions PR: FTB Quests + FTB XMod Compat + FTB Ranks (+ minor Easy NPC bump). New pack version. No
0b Spawn skeleton — 7 guild building blockouts (rough). User does in-game when time permits. Non-blocking. Yes (user)
0c bnstoolkit companion mod — scaffolding pass. Mod project set up, FTB Library UI dependency wired, network packet plumbing, build/release scripts. No screens yet. No
1 Sell shop: Numismatics shop blocks for diamonds (10 spurs) + netherite ingots (100 spurs). Lifetime-sale tracker for diminishing returns. KubeJS only, no mod work needed. No
2 Tier upgrade flow: FTB Ranks integrated + KubeJS /tier upgrade command. bnstoolkit Tier upgrade screen wired to Civic Office NPC. Tier perks driven by tiers.json. No
3 Spawn plot system: plot region registry in bnstoolkit, ownership tracking, FTB Chunks map mixin (cost overlay + purchase popup). No
4 Bounty engine: state machine, KubeJS-rotated dailies, bnstoolkit Bounty Board screen + Quest Log screen + Quest progress HUD. NPC dialog hooks via Easy NPC. 3-slot cap. No (NPC layer activates once spawn is built)
5 Villager rebalance: strip vanilla, ship spur-priced trade table via ServerEvents.villagerTrades. No
6 Progression quest line: FTB Quests anchor + first chapter. KubeJS rewards dispense spurs via Numismatics API. No (anchor NPC at Library once spawn exists)
7 Dynamic exchange rates: global supply-pool pricing for raw mats. No
8+ Lootr dungeons, Foundry crafting commissions, deeper FTB Quests chapters, player-vs-player bounties (if wanted). TBD

10. Risk register

Risk Likelihood Mitigation
Bounty engine bugs out, players lose progress Medium Atomic state writes; logs of every state transition
Villager farms still profitable after rebalance Medium Track player sell volumes; tune prices in patches
KubeJS-EasyNPC dialog branching has limits Low-Med Verify hooks in a test world before Phase 3; fall back to command-driven NPCs if needed
FTB Chunks /claim command override gotchas Low Test in dev world; FTB Chunks API is stable
Plot cost feels punishing Med First 9 chunks free is the safety valve; tune from playtest
Players bypass the system via creative / /give Op-only Document op responsibility; consider audit logs for op spur grants

11. Decisions made

Resolved before implementation:

Question Decision
Quest UI for bounties Custom mod with FTB Library UI widgets — proper GUI screens, no chat commands
Quest UI for progression FTB Quests
Plot purchase UI Custom mod mixin into FTB Chunks map — hover preview, click-to-buy popup
Tier upgrade UI Custom mod screen at Civic Office NPC
State storage KubeJS-managed per-player JSON for quest state; mod-managed for plot ownership
Numismatics access Direct Java via Java.loadClass from KubeJS; via API directly from the mod
Wilderness chunk allowance Tier-driven via FTB Ranks permission nodes — no per-chunk pricing
Spawn plots Predefined regions, slot-limited by tier, individually purchased with spurs
Tier ladder Civic (13 tiers): Peasant → Farmer → Citizen → Merchant → Knight → Baron → Viscount → Earl → Marquess → Duke → Archduke → Grand Duke → Sovereign
Founder flag Admin/owner has [Founder] cosmetic prefix in chat, grinds the regular ladder otherwise
Tier perks JSON-configured (config/bnstoolkit/tiers.json), hot-reloadable
Custom mod Confirmed. Built on FTB Library UI framework. Working name bnstoolkit.
Sethomes / warps Tier-allocated count (not paid per use)
Daily quest count Tier-driven (3 at Peasant, up to 6 at Sovereign), refresh per-player 24h after last accept
Emeralds Retired as currency, retain as a trade material for villager-redirect trades
Fork FTB Not needed — depend on FTB Library as a UI lib, FTB Chunks/Quests stay unmodified, integration via mixins + KubeJS hooks

Still to decide (non-blocking — pick during implementation)

  • PvP bounties — out of scope for V1, revisit after V1 ships
  • Lootr — add only when structured dungeons exist (Phase 8+)
  • Default-rank starting permissions — finalised when FTB Ranks config is written
  • Spawn plot pricing — first-pass numbers (2,000 standard / 5,000 premium), tune in playtest

12. Implementation notes

KubeJS scripts (gameplay logic)

Organised under pack/overrides/kubejs/server_scripts/economy/:

  • 01_numismatics_api.js — Java.loadClass wrapper helpers (balance / deposit / deduct)
  • 02_quest_state.js — load/save world/data/bns_economy/quests/<uuid>.json
  • 03_commands.js — admin commands (/tier upgrade, /bnstoolkit reload, debug)
  • 04_bounty_engine.js — daily rotation, state machine, KubeJS↔mod packet handlers
  • 05_sell_shop.js — Numismatics shop tracking + diminishing returns
  • 06_villager_trades.js — Phase 5 ServerEvents.villagerTrades rebalance
  • 07_tier_perks.js — FTB Ranks promote/demote, perk application
  • 99_dynamic_exchange.js — Phase 7 supply-priced market

Custom mod codebase

Repo: separate (or sub-tree of main repo, TBD). Modid: bnstoolkit (working name). Package layout:

bnstoolkit/
├── client/
│   ├── screen/         QuestLog, BountyBoard, Shop, Tier, PlotConfirm (FTB Library subclasses)
│   ├── mixin/          ChunkScreenPanel (cost overlay + plot button), ChunkButton (hover tooltip)
│   ├── hud/            QuestProgressHud (custom render)
│   └── ClientEvents    keybind reg, screen reg, mixin loader
├── server/
│   ├── packet/         OpenScreen, UpgradeRank, BuyPlot, ClaimBounty, etc.
│   ├── command/        /bnstoolkit reload (config refresh)
│   └── data/           PlotRegistry, PlotOwnership (saved with world data)
├── common/
│   ├── data/           TierConfig (JSON-loaded), BountyDefinition, QuestState mirror
│   └── BnsToolkit.java mod entry
└── config-defaults/
    ├── tiers.json      copied to config/bnstoolkit/tiers.json on first run
    └── plots.json      spawn plot region definitions

Architecture doc (docs/bnstoolkit-architecture.md) covers package layout, screen UX sketches, network packet contract, mixin targets, KubeJS↔mod integration surface — to be written before mod work begins.

State data

  • Quest state: world/data/bns_economy/quests/<uuid>.json. Readable JSON, easy to debug.
  • Plot ownership: persisted with world via the mod's SavedData (vanilla NeoForge persistence). Authoritative source of truth.
  • Tier config: config/bnstoolkit/tiers.json shipped from pack/overrides/defaultconfigs/bnstoolkit/tiers.json. Hot-reloadable.
  • Plot definitions: config/bnstoolkit/plots.json shipped similarly. Defines plot region bounds, type (standard/premium), prices.

NPC dialog

Authored in Easy NPC's in-game editor, exported as preset JSONs into pack/overrides/world/datapacks/bns-fuel/data/easy_npc/. Dialog Command actions call /bnstoolkit <verb> ... which routes to either the mod (for screen-opening) or KubeJS (for state changes).

Villager rebalance

Single source file 06_villager_trades.js. Each profession × tier has its own block. One file = one diff per balance pass.


See also

  • MEMORY.md entries:
    • project-mc-player-economy.md — earlier higher-level notes on Numismatics + plot system
    • feedback-kubejs-rhino-gotchas.md — KubeJS scripting constraints
    • feedback-bns-pack-version-sync.md — pack version + sync workflow
  • Existing tasks #20-#26 — to be reshuffled to mirror the phase plan above