New companion-mod design doc covering:
Architecture
- Purpose & scope (what's in the mod vs what stays in KubeJS)
- High-level diagram showing client/server/KubeJS/FTB-stack roles
- Full Java package layout under uk.sijbers.bnstoolkit
- Six GUI screens specified individually with layouts + network calls
(Quest Log, Bounty Board, Tier Upgrade, Plot Purchase, Shop Browser,
Quest Progress HUD)
- Three mixin targets into FTB Chunks' ChunkScreenPanel (drawBackground,
ChunkButton.addMouseOverText, ChunkButton.onClicked) -- no FTB fork
- Network packet contract (7 S2C + 5 C2S packets, versioned)
- Data persistence model (SavedData for plots + sethomes, in-memory
for death locations, KubeJS for quest state)
- Two config files documented (tiers.json + plots.json) with example
JSON5 schemas
- KubeJS integration surface (8 /bnstoolkit_internal commands)
- Build & release setup (separate Gitea repo, standard NeoForge
ModDevGradle, semver)
- 6 mod implementation phases (M0-M6), each independently shippable
Detailed perk specifications
- Wilderness chunks: FTB Ranks permission node, native FTB Chunks
enforcement, no mod-side work
- Plot slots: SavedData-backed ownership tracking, 50% refund on
release
- Sethomes: full sethome system built in bnstoolkit (no other sethome
mod exists in pack). Per-tier cap, 30s cooldown, /sethome /home
/delhome /listhomes commands
- Daily bounty slots: enforced in KubeJS engine, UI greys Accept when
at cap
- Shop fee discount: base 25% Bazaar fee reduced by tier discount.
Only applies to NPC Bazaar shop, not player-to-player Numismatics.
Worked example showing -25% Sovereign = 0% fee = full 10 spurs/diamond
- Chat colour: full colour ladder per tier (grey to rainbow at
Sovereign with character-by-character cycling)
- Join broadcast: 6 levels documented (none, simple, fancy, epic,
epic+particles, epic+spectacular) with example ASCII
- /back after death: in-memory storage, 60s cooldown, dimension-aware
- Future perk dimensions: 7 candidates the schema supports without
code changes (particle trails, custom join sounds, custom title
prefix, priority bounty access, tier-gated vendors, daily login
bonus, keep-inventory chance)
Six open implementation questions flagged for resolution during
build, none blocking.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Tier ladder extended from 8 -> 13 tiers, with cleaner historical
progression. Replaces the previous Peasant/Citizen/Patron/Notable/
Baron/Noble/Lord/Sovereign ladder which mixed commoner-economic terms
with noble terms.
New 13-tier ladder (Civic + British peerage):
1 Peasant free
2 Farmer 200
3 Citizen 750
4 Merchant 2,500
5 Knight 6,500 (gentry threshold)
6 Baron 15,000 (lowest noble)
7 Viscount 35,000
8 Earl 75,000
9 Marquess 150,000
10 Duke 300,000
11 Archduke 700,000
12 Grand Duke 1,500,000
13 Sovereign 10,000,000 (apex, "finished the game")
Rationale:
- Yeoman -> Farmer, Burgher -> Merchant: both replaced with
recognizable terms while keeping the period feel.
- Earl kept as the British equivalent of Count (Viscount sits below
Earl correctly because Viscount = vice-count).
- Top tier extended above Duke with Archduke -> Grand Duke ->
Sovereign. Avoids singular-feeling Emperor/King/Prince titles.
- Sovereign at 10M is intentionally extreme -- months of dedicated
play to reach, properly mythical.
Full perk table updated to spread cleanly across 13 tiers:
- Plot slots: 0/0/1/1/2/2/3/3/4/5/6/7/10
- Sethomes: 1/1/2/3/4/5/6/8/10/12/16/20/unlimited
- Daily bounties: 3/3/3/4/4/5/5/6/6/7/7/8/10
- Shop fee: 0% down to -25% at Sovereign
- Chat colours: grey -> white -> yellow -> green -> cyan -> blue
-> purple -> gold -> orange -> red -> bright red -> rainbow
Knight (tier 5) is the gentry threshold -- the first meaningful
"I'm somebody" upgrade with colored chat, join broadcast, and /back.
Founder cosmetic flag added for matt (server owner). Permanent chat
prefix [Founder] alongside the normal rank. No gameplay perks; just
identification. Founder still grinds the regular ladder.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Architectural revisions:
- UI approach: custom companion mod (working name 'bnstoolkit') built
on FTB Library's UI framework. Polished GUI screens for Quest Log,
Bounty Board, Tier upgrade, Shop browser, Plot purchase. Quest
progress as a custom HUD render layer (no stacked vanilla bossbars).
All player interaction through GUI + NPC dialogue, no chat commands
to memorise. FTB Library UI chosen for visual consistency with the
rest of the FTB stack already in the pack.
- Tier ladder locked: 8 tiers, Civic theme, starting at Peasant.
Peasant -> Citizen -> Patron -> Notable -> Baron -> Noble -> Lord
-> Sovereign. Replaced Burgess with Baron; reordered ascending.
- Tier perks: full table with chunks claimable, spawn plot slots,
sethome count, daily bounty slots, shop fee, chat colour, join
broadcast tier, /back access. JSON-configured at
config/bnstoolkit/tiers.json, hot-reloadable. Easy to tune any
column without code changes.
- Spawn plots clarified as distinct from wilderness chunk claims:
predefined regions at spawn, purchased individually for spurs,
primary use is shops, slot-limited by tier. Purchase happens
inside the FTB Chunks map UI via custom mod mixin. Plot data
lives in the custom mod, not in FTB Chunks.
- Wilderness chunk claims: tier-allocated, free within allowance,
refused above. NO per-chunk pricing (dropped from v0.2). Powered
by FTB Ranks -> FTB Chunks permission nodes.
- Phasing updated to add Phase 0c (mod scaffolding) and reorder
Phases 1-7 to fit the mod-supplied UI work.
- Implementation notes: KubeJS script layout, custom mod package
layout, state data locations, config file locations all
documented.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Final architecture for the economy + quest system. No more V1/V2/V3
iteration cycles. Resolved against actual mod source code and verified
APIs via research spike.
Key decisions locked:
- Bounty UI: custom (bossbar + /quests commands + Easy NPC dialog).
NOT FTB Quests -- it lacks per-player visibility, has no abandon
event, and cooldown is per-team. Confirmed via FTBQ source review.
- Progression UI: FTB Quests (right tool for long-form content where
per-team cooldowns and one-shot rewards are fine).
- Numismatics: direct Java.loadClass access (no events shipped, no
KubeJS bindings). Documented exact API surface and call patterns.
- FTB Chunks claim cost: FTBChunksEvents.before('claim') with
event.setResult() to refuse. Requires adding FTB XMod Compat.
- Tier system: FTB Ranks (CurseForge only) + permission-driven chunk
limits + KubeJS-mediated upgrades via runCommandSilent('ftbranks add').
- Per-player HUD: bossbars, not scoreboards. Vanilla scoreboards are
global; bossbars natively per-player.
- Custom mod for V1: NOT NEEDED. Re-evaluate if blocked.
Mods to add in Phase 0a (one PR before any implementation):
- FTB Quests 2101.1.25
- FTB XMod Compat (latest)
- FTB Ranks 2101.1.3
Phasing updated: Phase 0a (mod additions) blocks the rest. Phase 0b
(spawn build) is non-blocking and user-paced; all systems can be
built and verified before spawn exists.
KubeJS file layout documented for clean implementation:
pack/overrides/kubejs/server_scripts/economy/{01..99}_*.js
11 open decisions resolved. 3 remain non-blocking.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Three-layer visibility plan:
V1 (Phase 3): /quests, /quests info, /quests cancel commands.
Mobile-friendly via the bridge, no extra mods.
V2 (Phase 3.5): Quest Log book item with dynamic pages.
V3 (later): optional sidebar HUD via vanilla scoreboards.
3-slot active-quest cap so cancellation is a real choice:
- Prevents accept-all-then-cancel-easy-ones RNG shopping
- Keeps state files small
- READY frees the slot so turn-in backlogs are workable
State storage schema documented (active + completed/cooldown).
Phase 3.5 added to the roadmap for the book item.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Full design for the unified spawn economy:
- Seven themed guild buildings (Adventurer's, Merchant's, Civic,
Library, Tavern, Foundry, Mint)
- Universal accept → complete → return quest pattern
- Villagers moved fully to spurs with rebalance principles +
initial price guidance
- Money flow architecture (bounded inflows, scaling sinks)
- Phasing plan (8 phases, each independently shippable)
- Mod stack confirmed (we have everything we need for V1)
- Risk register + open decisions to make before implementation
Status: design, not yet implemented. Phase 0 (spawn skeleton)
is the next concrete deliverable.
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>
Client launcher reported on startup:
Mod improved_village_placement requires lithostitched 1.4 or above
Currently, lithostitched is not installed
Cause: lithostitched was flagged side=server in pack.lock and the
live manifest, so the client launcher skipped it during sync. But
Improved Village Placement (added in v0.29.1) declares lithostitched
as a runtime dependency and IVP itself is side=both, so the client
loaded IVP and then failed the dep check.
Lithostitched is a worldgen library — many mods that use it need it
on both sides (client renders modded structures using its hooks).
Flipping to side=both is the safer default for any library mod.
The other server-side flagged entries (Yung's Better X, noisium,
async-locator, servercore) are genuinely server-only and stay as-is.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Adds the v0.30.0 combat-feel batch:
- Better Combat 2.3.2 -- directional attacks, multi-hit swings,
weapon-type animations. Data-driven attack profiles so Create,
CBC, Ars weapons all get appropriate swings automatically. No
new weapons or recipes -- pure mechanics overhaul. First-person
view fully supported as of 2.0.4.
- Combat Roll 2.0.6 -- dodge roll on double-tap with brief invuln
+ roll-related attributes/enchants. Same author and shares deps
with Better Combat, explicitly designed to work alongside.
- Alex's Mobs port 1.22.17 -- wide nature-themed mob variety
(~70+ creatures). Original mod stops at 1.20.1; this is the
community port for 1.21.1, 187k downloads, recently updated.
Deps added with the batch (all new to pack):
- Cloth Config 15.0.140 (BC + Combat Roll)
- playerAnimator 2.0.4 (BC + Combat Roll)
- Citadel port 2.7.6 (Alex's Mobs)
Verified live: 0.30.0 synced, all 6 jars discovered, BC registered
3007-byte weapon attribute table, Combat Roll loaded, Alex's Mobs
adding datapack listeners. KubeJS 0 errors, port 25565 binds.
The v0.31.0 batch (Twilight Forest + Aether) is parked for later --
holding until plot/economy work is running so players have reason
to leave spawn for those dimensions.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Adds Improved Village Placement 1.1.1 (Modrinth). Forces villages
to spawn on flat terrain instead of clipping into hillsides /
floating mid-air on slopes. Tiny mod (34KB). Required dep
Lithostitched is already in the pack at 1.7.2.
Verified live: mod loaded, server boots clean, port 25565 binds.
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>
Adds two mods on top of v0.27.0:
- Create: Steam 'n' Rails 0.2.0+neoforge-mc1.21.1 (stable). The
official Steam 'n' Rails team skipped 1.21.1, so this is the
"Porters of Railways" community port — actively maintained,
310k downloads on the beta line and 0.2.0 just hit stable.
Brings train QoL: track tools, semaphores, conductor cap,
smokestacks, narrow-gauge tracks, etc.
- Copycats+ aeronautics weight 1.1.1. Small interop mod so
copycat blocks contribute weight to Create: Aeronautics
contraptions instead of being treated as massless. ~15KB.
All deps satisfied by mods already in the pack (Create, Copycats+,
Sable, Create: Aeronautics).
Tested live: server boots, port 25565 binds, KubeJS loads 0/0 errors,
aerocopycats logs HELLO FROM COMMON SETUP, Railways registers
55+53+238 entries across its three creative tabs. No new crashes.
Known noise: Steam 'n' Rails ships optional loot tables for tracks
of wood types from many other mods (TwilightForest, BYG, TFC, Blue
Skies, Hex Casting, BoP, etc.). Mods absent from this pack produce
~276 'Unknown registry key' ERROR lines once at boot. Harmless —
loot tables for items that don't exist just fail to parse and get
skipped. Standard behavior for Rails on lean packs.
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>
Three small Create addons, no overlap with current 18-mod Create stack:
+ kubejs-create v2101.3.1-build.18
Recipe builders for KubeJS scripts. Will replace the raw
Create:pressing JSON in supplementaries_bridges.js with a
cleaner event.recipes.create.* call.
+ create-encased v1.8.1-ht1
Encased/cased variants of Create kinetic blocks (shafts,
gearboxes, cogwheels in compact casings) for cleaner builds.
+ bellsandwhistles v0.4.7-1.21.1
Train whistles, bells, signal lights, station decoration.
All three already deployed live; pack-version.json bumped, MC
server restarted to sync. No mod-load errors.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The cold ZFS pool is a backup tier only — hot data (MC world, Gitea,
Directus DB, containers) lives on NVMe LVM, not ZFS. So ARC's default of
50% RAM was wasted: nothing it could cache was hot enough to matter, and
the ~16GB cache crowded MC out of RAM, pushing 2.4GB into swap.
This file lives in the repo for reproducibility; it gets dropped into
/etc/modprobe.d/ on the host and applied immediately via
/sys/module/zfs/parameters/zfs_arc_{max,min}.
Effect on glados:
before: used=27/31GB, free=748MB, ARC=15.6GB
after: used=~10GB, free=~14GB, ARC=1.0GB (1-2GB range)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The wake loop's daily-times branch was firing one missed slot per minute
on service restart. With a schedule like "00:00,04:00,08:00,12:00,16:00,
20:00" and a restart at 19:00, the wrapper would catch up by firing 5
backups at 1-minute intervals -- each a full-world zip of the same
in-memory world. Pure waste: the live world hasn't diverged across the
missed clock slots, the snapshots would be near-identical, and the rapid
save-off/save-on churn impacts player experience.
Source comment already documented the intended behaviour ("Doesn't catch
up if the server was off when a slot passed -- daily/interval backups
don't need replay logic.") but the code didn't implement it.
Fix: in Start(), pre-populate _firedToday with all times <= now so the
wake loop only fires future slots for the rest of today.
Tested live on glados: switched schedule to clock-aligned daily-times
after deploying the fix, zero catch-up backups fired in the 90s window
after restart (vs 5+ before the fix).
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>