The previous commit deleted 0.1.1 from the gitignored mods dir but
git swallowed the add for 0.3.1 because pack/overrides/mods is
ignored. Re-adding with -f.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
bnstoolkit jumps from M0 (empty scaffold) straight to feature complete:
UI screens (all FTB Library widgets, opens via keybinds):
K Civic tier ladder + upgrade
J Bounty board (accept/cancel/turn-in)
N Plot office (buy/release)
H Bazaar sell shop (1/16/64 quick-sell)
M Quest log (status overview)
HUD: top-left tier + spurs balance overlay, refreshed 1Hz server-side.
Villager trade rebalance (NEW): the mod now hooks VillagerTradesEvent
+ WandererTradesEvent and swaps every emerald cost/result for the
Numismatics equivalent (1..7 emeralds -> spurs, 8..63 -> bevels, 64+
-> cogs). This was the blocked Modrinth dep — the third-party mod
options either required a NeoForge bump (numismatics-villager-currency
1.1.0 wants 21.1.230+, we're on 21.1.228) or hand-written JSON for
every trade (data-trades). The in-tree wrapper is cleaner.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
0.1.0 brought the dedicated server down during construct-mods because
the @Mod constructor called NeoForge.EVENT_BUS.register(this) without
any @SubscribeEvent methods on the class — which NeoForge 21.1 treats
as a fatal IllegalArgumentException.
Caught only after live-deploy (gradle build doesn't simulate the
construct-mods step). 0.1.1 removes the bogus register call. The
@SubscribeEvent listeners will come back in M1 alongside the first
real event handler.
Server has been brought down by the crash and is waiting for a manual
start via the web admin panel. The fixed jar is staged in
/srv/fast/brass-sigil-server/server/mods/ already.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Ships the empty bnstoolkit companion mod (0.1.0) into the pack. The mod
loads cleanly on client and server with zero visible surface — it just
proves the deploy pipeline end-to-end so M1-M4 only have to add code,
not figure out tooling.
Per-milestone scope locked in docs/bnstoolkit-discussion-points-2026-06-07.md.
Source: http://10.16.5.102:3000/minecraft/bnstoolkit
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Foundation economy stack — fully command-driven, ready for the custom
UI mod to layer on top later. Built tonight as a single feature batch.
KubeJS scripts:
pack/overrides/kubejs/server_scripts/economy/
00_tier_system.js — 13-tier ladder + admin commands
02_sell_shop.js — /bns sell, 9 items, DR + tier-fee
03_bounty_engine.js — /bns bounty, 20 bounties, state machine
04_player_commands.js — /bns help, /bns me, /bns tier upgrade
plots.js: updated to support multi-plot ownership based on tier slots
- plotsOwnedBy() returns list, slot cap from TIER_PLOT_SLOTS table
- /bns plot release now requires plot id (multiple plots possible)
- /bns plot mine added
FTB Ranks server config:
pack/overrides/world/serverconfig/ftbranks/ranks.snbt
13 ranks with ftbchunks.max_claimed_chunks scaling per tier:
Peasant 9 -> Sovereign 1500 (chunks)
Peasant 1 -> Sovereign 200 (force-loaded)
Name format colour codes match the design doc.
Player command surface (everything callable from chat or Telegram bridge):
/bns help full command listing
/bns me tier, balance, plots, bounties
/bns tier upgrade pay spurs, advance to next tier
/bns plot list|info|buy|release|mine
/bns sell list|<item> [count]
/bns bounty list|active|accept|cancel|turnin|completed
/bns admin tier get|set|list (op level 2)
/bns admin info|waystone-*|reset-welcome (pre-existing)
Tier upgrade flow:
1. Player runs /bns tier upgrade
2. KubeJS takes spurs from inventory
3. KubeJS sets player.persistentData.bnsTier += 1
4. KubeJS runs `ftbranks add <player> <rank>` so FTB Ranks applies
the permission nodes (chunk allowance auto-flips)
Cross-file scope: KubeJS 2101 runs all server_scripts in shared Rhino
global scope. Constants (TIER_CONFIG, COIN_VALUES, bnsTier object,
shared functions like giveCoins/countCoins/takeCoins) are declared
once in their owning file and referenced from siblings. Don't redeclare.
Blocked tonight (deferred):
- Villager trade rebalance: KubeJS 2101.7.2 doesn't ship a
villagerTrades event. ServerEvents only exposes command/loaded/
recipes/registry/tags/tick/unloaded. Verified by grepping the
KubeJS jar's ServerEvents class. No KubeJS-villager-trade addon
on Modrinth for NeoForge 1.21.1. Either build into the custom
mod or add a third-party trade-overrides mod (research pending).
- Custom mod UI screens: no Java toolchain on host, and these
need visual iteration with the user anyway.
Verified live: server boots clean, all 4 economy scripts log loaded,
port 25565 binds, no EcmaError or EvaluatorException in KubeJS log.
FTB Ranks reload via rcon confirms "Ranks reloaded from disk!"
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
KubeJS module that owns the 13-tier civic ladder per economy doc §4a.
Authoritative source for TIER_CONFIG (per-tier perks: cost, wilderness
chunks, plot slots, daily bounty slots, shop fee discount, chat
colour, join broadcast).
Player tier stored as int in player.persistentData.bnsTier; default
1 (Peasant), set on first login.
Admin commands (op level 2):
/bns admin tier get <player>
/bns admin tier set <player> <1-13>
/bns admin tier list
Module-local pattern (KubeJS Rhino runs scripts in strict mode -- no
globalThis, no bare-assignment globals). Other economy scripts will
duplicate TIER_CONFIG and use player.persistentData.bnsTier directly
to read tier rather than trying to import. See feedback-kubejs-rhino-
gotchas memory.
FTB Ranks will mirror this once the bnstoolkit mod ships -- ranks
will carry the FTB Chunks permission nodes. For now the NBT is the
single source of truth and admin promotes manually with /bns admin
tier set.
Verified: server boots clean, KubeJS loads with 0 errors. First-join
hook initialises new players to tier 1.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Stop hacking around the problem -- use the standard cross-recipe-
viewer hide convention that both NeoForge and JEI define.
Source-level confirmation:
mezz/JustEnoughItems @ 1.21.1
CommonApi/.../api/constants/Tags.java
HIDDEN_FROM_RECIPE_VIEWERS = c:hidden_from_recipe_viewers
Library/.../ingredients/IngredientVisibility.java
isIngredientVisible() calls
ingredientHelper.isHiddenFromRecipeViewersByTags(typedIngredient)
-> any item carrying this tag is hidden from JEI.
neoforged/NeoForge @ 1.21.x
common/Tags.java
Tags.Items.HIDDEN_FROM_RECIPE_VIEWERS = c:hidden_from_recipe_viewers
-> same tag, NeoForge agrees with JEI.
EMI / REI also respect this tag (common convention).
So the proper modpack-shippable fix is a single datapack file:
pack/overrides/world/datapacks/bns-fuel/data/c/tags/item/
hidden_from_recipe_viewers.json
{
"replace": false,
"values": [
"alexsmobs:shattered_dimensional_carver",
"alexsmobs:transmutation_table"
]
}
No mod, no KubeJS, no CraftTweaker, no Item Obliterator JEI integration
(which doesn't exist for 1.21.1 NeoForge anyway). Just the tag the
recipe-viewer ecosystem agreed on years ago.
Item Obliterator + Necronomicon stay in the pack for what they actually
deliver on 1.21.1: inventory-pickup block + villager-trade removal +
right-click cancellation. The Capsid recipe override stays too as the
creation block.
The full disable stack now:
- Tag (this commit) -> Hidden from JEI / REI / EMI
- Datapack capsid recipe -> Can't be created in-world
- Item Obliterator -> Can't be picked up / right-clicked
if obtained via /give or creative
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
I removed this datapack override in v0.31.0 on the (incorrect)
assumption that Item Obliterator would also handle Alex's Mobs'
custom capsid_recipes recipe type. It doesn't -- Item Obliterator
intercepts vanilla and some common modded recipes, but the Capsid
uses its own SimpleJsonResourceReloadListener bound to the
"capsid_recipes" folder, and that listener still loaded the
default shipped recipe.
The visible bug: a player could put a regular Dimensional Carver
into a Capsid -- the recipe matched, the Dimensional Carver was
consumed, and the Capsid spat out a Shattered Dimensional Carver.
Item Obliterator then refused the pickup. Net result:
- Player loses their hard-earned regular Carver
- Player can never pick up the Shattered one
- World has an unrecoverable floating item entity
Restore the override at:
pack/overrides/world/datapacks/bns-fuel/data/alexsmobs/
capsid_recipes/shattered_dimensional_carver.json
This swaps the recipe's input from `alexsmobs:dimensional_carver` to
`minecraft:barrier`, which is unobtainable in survival. The recipe
loads cleanly but can never match. The Capsid transformation for
the Shattered Carver effectively no longer exists.
Item Obliterator still handles the JEI / creative tab / inventory /
trade removal -- both layers complement each other.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replace the v0.30.x ad-hoc disable mechanisms (KubeJS server script,
datapack recipe override, KubeJS client-side JEI hide -- which was
broken on this KubeJS build) with a single proper tool:
- **Item Obliterator 2.3.0** + dep **Necronomicon API 1.6.0**
Declarative JSON config to remove items from inventories,
creative tabs, all recipes (including modded custom recipe
types), villager trades, and JEI. Exactly the missing capability.
Config: pack/overrides/defaultconfigs/item_obliterator.json5
Blacklists:
alexsmobs:transmutation_table
alexsmobs:shattered_dimensional_carver
Removed (no longer needed):
- pack/overrides/kubejs/server_scripts/disable_alexsmobs_features.js
(Item Obliterator handles transmutation_table recipe removal
and right-click cancel automatically)
- pack/overrides/world/datapacks/bns-fuel/data/alexsmobs/
capsid_recipes/shattered_dimensional_carver.json
(Item Obliterator handles modded recipe removal too)
Both items now correctly:
- Don't appear in JEI search / item list
- Don't appear in creative tabs
- Have no working recipe path
- Can't be right-clicked / used
- Get scrubbed from inventories on join
The Void Worm boss + regular Dimensional Carver still work --
nothing else in Alex's Mobs is affected.
Verified live: both mods discovered, Necronomicon read our config
file successfully ("File exists, reading config"), Item Obliterator
loaded with the blacklist.
Note: config schema is v2; v1 configs get overwritten by the mod's
default. Always write configVersion: 2.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The hide_disabled_items.js client script I added in v0.30.3 used
`JEIEvents.hideItems(...)` -- a namespace that does NOT exist in
KubeJS 2101.7.2 on NeoForge 1.21.1. There is no kubejs-jei bridge
mod for 1.21.1 NeoForge published on Modrinth at this time.
Client launchers were showing:
KubeJS client script errors
hide_disabled_items.js#8
ReferenceError: \"JEIEvents\" is not defined.
Removing the script entirely. The Shattered Dimensional Carver
still:
- Cannot be produced (Capsid recipe override with barrier input)
- Does nothing on use (server-side right-click cancel)
Tradeoff: the item will still appear as a recipe-less entry in JEI
search if players type its name. Cosmetic only; no gameplay path
to obtain or use it.
If a JEI-hide approach becomes available in a future KubeJS update
or via a new bridge mod, we can revisit.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replaces v0.30.2's right-click intercept with two cleaner layers:
1. Datapack override of the Capsid recipe
pack/overrides/world/datapacks/bns-fuel/data/alexsmobs/
capsid_recipes/shattered_dimensional_carver.json
Changes the input from `alexsmobs:dimensional_carver` to
`minecraft:barrier`, which players cannot obtain in survival.
The recipe loads cleanly but never matches, so the item is
never produced through normal play.
2. Client-side KubeJS JEI hide
pack/overrides/kubejs/client_scripts/hide_disabled_items.js
Hides `alexsmobs:shattered_dimensional_carver` from JEI search
and the item list, so it doesn't appear as a recipe-less ghost.
The right-click intercept in server_scripts/disable_alexsmobs_features.js
stays in place as a safety net for /give cases. Transmutation Table
recipe removal also stays as-is.
Net effect: the Shattered Dimensional Carver effectively does not
exist on this server. Void Worm fight + regular Dimensional Carver
return-home item both stay intact.
Verified live: pack synced to 0.30.3, Alex's Mobs registered its
capsid_recipes datapack listener (which reads our override file).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
KubeJS server script that:
1. Removes the crafting recipe for alexsmobs:transmutation_table.
The Transmutation Table converts items freely with XP cost,
which competes with Ars Nouveau's depth and undermines the
Numismatics-based plot economy. No new tables can be made;
no existing tables exist on the world yet.
2. Cancels the right-click action on
alexsmobs:shattered_dimensional_carver. The item teleports the
user 1,000,000 blocks in a random direction -- breaks any
server-side world-boundary assumption, drops the player into
unloaded chunks far from the rest of the world. The item can
still be produced (the Capsid-shatters-Carver interaction is
a block reaction, not a recipe we can remove cleanly), but it
does nothing on use and sends an explanation to the player.
The Void Worm boss + regular Dimensional Carver (return-home
teleport) stay enabled. Players can still fight the boss and earn
the home-recall item, just not the world-bounding-breaking variant.
Verified live: KubeJS loaded script in 3ms, removed recipe at
recipe-event time, server bound to 25565.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Without this entry, lava buckets get the vanilla bucket-burn fallback
of 20000 ticks each — which made lava more powerful than refined
TFMG kerosene/naphtha despite being free and trivially obtainable.
Setting lava to 8000 ticks matches crude_oil exactly: both are the
raw entry-tier fuels you can scoop without any infrastructure, and
the player has to commit to a refining setup to unlock the higher
tiers.
Solid fuels (coal, charcoal, blaze rods, etc.) continue to work via
realisticTrains' chest/barrel pathway -- no datapack entry needed.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Revert the custom tier-strict + user-error-forgiveness tuning shipped
in v0.29.0 and use the mod's shipped defaults instead:
squibChance 0.0 -> 0.25
barrelChargeBurstChance 0.0 -> 0.2
interruptedIgnitionChance 0.0 -> 0.33
overloadBurstChance 1.0 -> 0.5
failureExplosionPower 0.0 -> 2.0
disableAllCannonFailure stays false. Tier balance is still preserved
(material maxSafePropellantStress is what gates overload). The
difference is failures are now probabilistic per the mod author's
intended balance, and the explosion has its default power.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Two related gameplay tweaks:
1. Train fuel requirement (Steam 'n' Rails)
- Set realisticTrains = true in railways-server.toml.
Trains now consume fuel from a Fuel Tank (liquid) or solid fuels
in chests/barrels on the contraption. realisticFuelTanks stays
true so tanks won't accept water/junk.
- Ship a datapack bns-fuel/ that defines TFMG fluids as proper
liquid fuels at tiered burn rates:
crude_oil 8000 ticks/bucket (raw, abundant -- entry)
furnace_gas 12000 ticks/bucket (cheap by-product)
naphtha 24000 ticks/bucket (mid refined)
kerosene 24000 ticks/bucket (mid refined)
gasoline 36000 ticks/bucket (top refined)
diesel 48000 ticks/bucket (top refined, longest)
Vanilla lava bucket still works via bucket-burn fallback
(20000 ticks). Tier curve incentivises building a real refinery.
2. CBC tier-preserving cannon safety
- Revert the nuclear disableAllCannonFailure=true switch shipped
in v0.28 hotfix -- it killed the bronze/steel/nethersteel tier
balance because overloaded cannons fired without consequence.
- Per-lever config that protects against random RNG losses while
keeping the tier mechanic intact:
disableAllCannonFailure = false
squibChance = 0.0 (no random projectile-stuck)
barrelChargeBurstChance = 0.0 (forgive misplaced charges)
interruptedIgnitionChance = 0.0 (forgive gapped loads)
overloadBurstChance = 1.0 (TIER STRICT -- exceed your
cannon's rated propellant
stress = lose the cannon)
failureExplosionPower = 0.0 (no collateral blast when it
does die from overload)
- Effect: a cannon built to spec and used within its
maxSafePropellantStress is immortal. Overloading dies cleanly
per the material's failureMode, no fortress damage. User error
(squib/misplace/gap) doesn't destroy expensive builds.
Stress units NOT supported for trains: verified by inspecting Rails
and Create bytecode, nothing consumes SU for train movement. Liquid
fuel is the supported mechanism.
Verified live: server boots clean, port 25565 binds, KubeJS loads
0 errors, Minecraft auto-enables the bns-fuel datapack, Rails
initializes the LiquidFuelManager reload listener.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Cannons are expensive to build; users were losing them to RNG
self-destruction (squib, barrel charge burst, overload, interrupted
ignition, catastrophic failure). Per-cannon failure is configurable
via a single master switch in createbigcannons-server.toml:
[failure]
disableAllCannonFailure = true
This zeroes out all six failure paths in one go. Applied to the live
server and tracked here under defaultconfigs/ so future server resets
preserve it.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Now that v0.27.0 ships kubejs_create, the high-level
event.recipes.create.pressing(out, in) builder works, replacing the
raw event.custom({type: 'create:pressing', ...}) JSON shim we needed
before.
Verified live on the server -- recipe loads cleanly:
[bns/supplementaries_bridges] added flax -> string press recipe
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Mods added (in lockfile):
v0.24.0 YUNG's structure mods (9):
- Better Dungeons, Better Mineshafts, Better Ocean
Monuments, Better Nether Fortresses, Better End Island,
Better Witch Huts, Better Desert Temples, Better Jungle
Temples, Bridges, Extras
v0.24.1 Create: Radars (Aeronautics-compatible from v0.4.5.1+)
v0.24.2 Ars Creo + Create Ars Compact (the latter removed in 0.25.0)
v0.24.3 FallingTree (whole-tree chop on axe hit)
v0.24.4 Copycats+, Create: Connected, Create: Interiors
v0.24.5 Create: Power Loader (Aeronautics-airship chunkloading)
v0.24.6 -- KubeJS bridges only (see below)
v0.24.7 -- Patchouli welcome book attempt 1 (kubejs/data) -- failed
v0.24.8 -- Patchouli attempt 2 (assets/data split) -- failed
v0.24.9 -- Patchouli attempt 3 (patchouli_books/ root path) -- worked
v0.25.0 REMOVED Create Ars Compact (broken sauce:source_fluid recipes,
no public tracker, half-finished compat layer);
added Create: Dragons Plus, Create: Enchantment Industry
v0.26.0 Sophisticated Core/Storage/Backpacks/Create-Integration,
Create: Additional Logistics
KubeJS additions:
- supplementaries_bridges.js: flax -> 2x string via Create Press,
Plunderer drops 1-3 spurs via EntityEvents.drops
- recipes_numismatics.js: renamed COIN_IDS -> COIN_RECIPE_REMOVE_IDS
to avoid Rhino global-scope collision with numismatics_tooltips.js,
added sprocket to the removal list (was missing)
- welcome.js: migrated from vanilla written_book (broken Filterable
codec in 1.21) to Patchouli book at patchouli_books/manual/
Patchouli manual:
- 5 entries (Welcome, Waystones, Money, Plots, Rules) under one
"Server Basics" category
- Lives at pack/overrides/patchouli_books/ (root path) -- this is
the modpack-author path per Patchouli docs, NOT data/+assets/
which is for mods bundled in jars
- Book id: patchouli:manual (default namespace in this mode)
All v0.24-v0.26 work has been live on the server and tested.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
User confirmed in-game tooltip values:
spur=1, bevel=8, sprocket=16, cog=64, crown=512, sun=4096.
Chain is non-uniform (x8, x2, x4, x8, x8). My earlier guesses
(uniform x8, assuming Sun=64 Cogs) gave consistent but wrong
intermediate values. Now sourced from the mod's own tooltip, not
triangulated.
Plot prices at 100/250/600 spurs now mean roughly:
100 spurs = 6 bevels + 4 spurs (1 sprocket + 5 bevels + 4 spurs)
250 spurs = 3 cogs + 3 bevels + 2 spurs
600 spurs = 9 cogs + 3 bevels (... still small change tier)
User-side: edit PLOT_DEFS in plots.js to set real prices once the
spawn marketplace and economy scale are decided.
Was: 5-denom x8 chain (spur=1, bevel=8, cog=64, crown=512, sun=4096).
Now: 6-denom x8 chain with sprocket inserted between bevel and cog.
Verified in-game (user reported Sun = 64 Cogs, which only fits these
values: spur=1, bevel=8, sprocket=64, cog=512, crown=4096, sun=32768).
Plot purchase math (countCoins, takeCoins, giveCoins) was using the
old 5-denom map: cog would have been counted as 64 spurs when it's
actually 512, and sprockets weren't counted at all. Plot prices remain
at 100/250/600 spurs which are still appropriate small-change amounts;
user can edit PLOT_DEFS to raise once playtesting confirms desired
economy scale.
Three corrections per user feedback:
1. Drop the conversion-crib lines -- Numismatics' built-in tooltip
already shows 'Value: N spurs' so our added lines were duplicate.
2. Include sprocket (numismatics:sprocket) -- the 6th denomination
I missed when first writing the script. Full set: spur, bevel,
sprocket, cog, crown, sun.
3. Keep only the actually-useful hint: 'Right-click a Bank Teller
block to convert denominations' -- the one piece of info that
isn't on the mod's own tooltip.
Decision punted (deliberately): no 8-spurs-shapeless-to-1-bevel
crafting recipes. The Bank Teller is the spawn-economy anchor;
crafting recipes would let players bypass the bank entirely. Players
who want local conversion can place their own Teller -- which is the
intended Numismatics design.
Numismatics' x8 uniform chain isn't intuitive. Mod values are
hardcoded so we cant fix the ratios, but we can put the conversion
table directly on each coins tooltip via KubeJS ItemEvents.tooltip.
Players hover any coin -> see how it relates to the others + a hint
to use Bank Teller for on-the-fly conversion.
~25 lines, ItemEvents.tooltip hot path is cached per item-id so no
performance concern.
Players with an existing options.txt (i.e. anyone who has launched MC
once) don't get the 'default_packs' applied -- RPO only treats those as
defaults for fresh installs.
Adding 'required: true' to the override entry on the assumption that
the field forces the pack to be enabled on every launch regardless of
player choice. Decompiled the jar for string constants and 'required'
appears alongside 'force_compatible' as a known key.
If the field name is wrong RPO will silently ignore it -- no harm, easy
iteration.
Two consecutive client_scripts errors traced to jei_hides.js:
1. Array-spread syntax not supported by Rhino (fixed in 0.21.1)
2. JEIEvents global is not defined in KubeJS 2101.7 -- the actual JEI
event API uses classes like JEIRemoveEntriesKubeEvent but the binding
name is something different we haven't identified yet.
Rather than ship more guesses, drop the script entirely. Functional
impact is minimal: recipes for waystones + coins are still removed
server-side (recipes_waystones.js, recipes_numismatics.js), so players
cannot craft these items even if they appear in JEI search. The only
loss is some JEI clutter.
When we identify the correct JEI hide API in KubeJS 2101.x, can add
back as kubejs/client_scripts/jei_hides.js with the right binding.
KubeJS uses Rhino as its JS engine, which doesn't support array-spread
syntax (`[...a, ...b]`). The line `[...WAYSTONE_ITEMS, ...COIN_ITEMS]
.forEach(...)` threw EvaluatorException: syntax error at jei_hides.js:46
on client launch, surfacing the KubeJS client script errors dialog.
Fix: use Array.prototype.concat() which is universal JS. Also extracted
the hide-quietly helper into a named function for readability.
/bns plot list|info|buy|release|reload. Single ~316-line file with
clear sections. Hardcoded PLOT_DEFS Map (3 example plots), ownership
state in server.persistentData.bnsPlots, best-effort Numismatics +
FTB Chunks integration (will be verified in playtest). See file
header for full design notes.
Tidying pass on the KubeJS suite before plot system V1 lands. Sets up
the file structure + conventions + diagnostics so the larger plot
system has a clean foundation.
Changes:
1. NEW kubejs/README.md
File layout doc + conventions: logging prefix [bns/<module>],
persistent-data key naming (bns* prefix), one concern per file,
performance discipline (O(1) lookups, no polling).
2. Split economy_policy.js -> recipes_waystones.js + recipes_numismatics.js
Single-concern files. recipes_waystones removes ALL waystones
crafting (welcome.js distributes the only allowed waystone instead).
recipes_numismatics removes the 5 coin-denomination crafts.
3. NEW kubejs/server_scripts/bns_admin.js
/bns admin subcommands for OP diagnostics:
- info calling player's flags+counts
- waystone-count <player> read stored count
- waystone-set <player> <n> override stored count
- reset-welcome <player> clear bnsWelcomeGranted -- replays
the welcome grant on next login
Registered via ServerEvents.commandRegistry with Brigadier tree,
permission level 2 (OP). No performance cost (operator-triggered only).
4. Logging added to waystones_policy.js + welcome.js
Every action prints `[bns/<module>] ...` so server logs can be
filtered with `journalctl ... | grep '\[bns/'`.
Performance discipline applied:
- All event-handler lookups use Set.has (O(1)), not Array.includes
- No periodic tick polling anywhere
- No network calls in event handlers
- console.info is cheap (no string format unless logged)
Bumps to 0.20.0. Plot system V1 follows in v0.21.x as a separate
multi-file submodule under server_scripts/plots/.
Resource Pack Overrides config field names extracted directly from the
mod's class files (default_packs + default_overrides confirmed via grep
on the .class strings). Config ships through defaultconfigs/ so it
seeds the player's local config on first run and respects later edits.
The 'default_position: TOP' override puts the ReCreated pack at the top
of the enabled-packs list so it takes precedence over the vanilla
ComputerCraft textures.
If the filename or schema turns out to be off when tested, it's a
one-line follow-up to fix.
Two design changes:
1) Every electronic CC item now requires tfmg:plastic_sheet. Plastic is
the electrical insulator and gates ALL CC tech behind TFMG's full
oil chain (crude oil -> naphtha -> distillation -> molten plastic
-> sheet). Even cable -- you can't lay wires without insulation.
2) Advanced items now embed their Basic counterpart in the recipe:
- computer_advanced contains computer_normal
- monitor_advanced contains monitor_normal
- wireless_modem_advanced contains wireless_modem_normal
- pocket_computer_advanced contains pocket_computer_normal
- turtle_advanced contains computer_advanced (which contains
computer_normal -- chained upgrade)
This makes the progression literal -- you can't skip Basic to make
Advanced. You upgrade through, paying both costs.
Other tweaks:
- Replaced create:railway_casing with create:industrial_iron_block in
the Advanced Computer recipe. Railway casing is thematically tied to
trains, not computing -- creates a weird "build trains to make a
computer" dependency. industrial_iron_block fits the server-rack
aesthetic and is a more general Create tier-3 material.
- Added plastic to disk_drive, wired_modem, printer, redstone_relay,
speaker (recipes that previously skipped it).
Bumps to 0.19.3.
Expands the v0.19.0 recipe set from 10 to 19 items and builds a deliberate
5-tier progression using richer Create + TFMG materials.
Newly overhauled items:
T1 - cable (8-output, copper_wire-heavy so bulk-laying is viable)
T3 - redstone_relay
T3 - turtle_normal
T4 - turtle_advanced
T5 - pocket_computer_normal, _advanced, _colour
Misc - wired_modem_full (block form, derived from wired_modem)
Existing items reworked with better thematic materials:
computer_normal/advanced -> now uses create:brass_casing / railway_casing
as the chassis instead of bare plastic
monitor_normal/advanced -> nixie_tube for the retro CRT, display_link
for the advanced data-binding monitor
wireless_modem_normal -> tfmg:electromagnetic_coil is the antenna,
copper_wire + aluminum_wire signal lines
wireless_modem_advanced -> constantan_spool + large_coil for high-Q
tuning -- properly end-game wireless
disk_drive -> create:cogwheel for the spinning read head
speaker / printer -> copper_sheet / cogwheel for thematic flair
Wire usage is the through-line: copper_wire in T1-T2 (cheap, used in
quantity), aluminum_wire in T3 mid-tier signal lines, constantan_wire
+ constantan_spool in T4 for high-frequency wireless. TFMG's electrical
production now genuinely gates CC progression.
Bumps pack to 0.19.1 (point release — same mod set, expanded scripts).
Mods (5 additions):
- Easy NPC 6.16.1 (3 jars: bundle + core + config_ui). Lightweight,
config-UI-driven NPC mod -- 817k downloads, NOT the heavyweight
Custom NPCs by Noppes which has no 1.21.1 NeoForge port. Players
will interact with NPCs at spawn (Plot Office land clerk + future
shop NPCs) via right-click -> dialogue.
- CC: Tweaked 1.119.0. ComputerCraft tier added for technical displays,
server stats, and player-built automation. Future plot-system V2
could use CC monitors as the central kiosk with touch buttons; V1
uses NPC + signs.
- Computer Craft: ReCreated v1.2 (resource pack, client-only). Styles
CC's computers + monitors with a brass/wooden Create aesthetic so
they don't look out of place in the pack.
KubeJS scripts:
- cc_recipes.js: Overhauls 10 CC crafting recipes to require Create
(electron_tube, precision_mechanism, rose_quartz) + TFMG (plastic
sheet, steel ingot, silicon ingot). Gates the tech tier behind
Create+industrial progression. Recipes for cables, peripheral
blocks, turtles, etc. left at default -- can iterate later.
Plot system V1 deferred to v0.20.0 -- needs its own focused effort
because of the FTB Chunks claim-transfer integration + Numismatics
inventory coin handling. Memory plan already covers the design.
The 0.18.0 economy_policy.js named 'numismatics:sundial' which doesn't
exist -- the real registry IDs are spur, bevel, cog, crown, sun. The
KubeJS warning surfaced this at startup:
Failed to read ingredient from numismatics:sundial:
Item with ID numismatics:sundial does not exist!
Updates both economy_policy.js (recipe removal) and jei_hides.js (JEI
hide) to use the correct 5-denomination list. Bumps to 0.18.1.
Adds the currency layer and the first-join experience.
Mods:
- Create: Numismatics 1.0.20 (currency, vendor blocks, piggy banks)
- Patchouli 1.21.1-93 (kept in pack for future rich manual book)
KubeJS scripts (server_scripts/):
- economy_policy.js remove ALL Waystones recipes; remove coin recipes
only (piggy banks etc. stay craftable for now)
- welcome.js first-login grant: 1 waystone + vanilla written-book
"Brass & Sigil Manual v1" (5 pages: welcome,
waystones, money, spawn plots, rules). Per-player
flag bnsWelcomeGranted in persistentData gates it.
KubeJS scripts (client_scripts/):
- jei_hides.js hide all Waystones items + 4 coin denominations from
the JEI ingredient list. Combined with the recipe
removal players never encounter these items via
normal play -- only via the welcome grant or the
bank exchange.
The written-book manual is the MVP placeholder. When more content lands
(plot system, dynamic exchange, etc.) it'll be replaced by a proper
Patchouli book authored as a tweak jar -- Patchouli's already in the
lockfile so no mod-add will be needed at that point.
Adds pack/overrides/kubejs/server_scripts/waystones_policy.js which:
- Caps regular waystones at 1 per player. Per-player count is stored in
player.persistentData and decremented on break (works correctly because
restrictedWaystones = ["PLAYER"] means only owners can break).
- Bans all 16 sharestone variants. They defeat the "build transport"
intent (solo pair-teleport) and can be placed just outside a claim
for stealth proximity access.
- Bans all 16 portstone variants pending separate design review.
- Leaves warp plates and warp scrolls untouched.
Bumps to 0.17.0 so launcher re-syncs.
The previous rule 'pack/overrides/' ignored the whole directory, which
made it impossible to re-include subpaths via ! exception (git's rule).
Narrow the ignore to 'pack/overrides/mods/' -- the only path that
Build-Tweaks.ps1 actually writes -- and drop the broken whitelist
block. Other subdirs under pack/overrides/ (defaultconfigs/, etc.) now
live in git like normal source.
Adds the Waystones override that 0.16.1 attempted (spawnInVillages =
DISABLED). Bumps to 0.16.3 so launcher caches re-sync.