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>
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.
URGENT client-side fix. brassandsigil_tweaks-1.0.0.jar (built from
pack/tweaks/ into pack/overrides/mods/) declares lithostitched as a
hard dependency in its mods.toml. lithostitched is tagged side=server
in the lockfile because it's worldgen-only. brassandsigil_tweaks had
no explicit side tag so Build-Pack defaulted it to side=both. Clients
downloaded the tweak jar but not the dep -> NeoForge refused to start
with 'Mod brassandsigil_tweaks requires lithostitched 1.7 or above'.
Fix: Build-Pack now injects side='server' on any local-override file
under mods/. All tweak jars are data-only (worldgen modifiers, recipe
overrides) and pure server-side. If a future tweak is actually client-
relevant, this rule will need a per-file exception.
Tested in build output -- the brassandsigil_tweaks entry now shows
side='server' in the generated manifest.
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.
Configured is the in-game config GUI library JEI suggests when you
press its wrench icon (and the same library a bunch of other mods use
for their config screens). CurseForge-only (not on Modrinth) so we
add as source: curseforge -- following the same pattern as the FTB
mods already in the lockfile.
Tagged side=client because Configured is purely a client-side config
UI provider; the server doesn't need it. Server-side filter will skip
it on sync.
Filename gotcha noted for future CF adds: the CF web page shows the
mod with a friendly name like 'Configured 2.6.3.jar', but the actual
file on mediafilez.forgecdn.net is named 'configured-neoforge-1.21.1
-2.6.3.jar'. Use the CDN filename in the URL, not the web display
name.
The 0.4.10 build was already deployed (replacing the broken 0.4.9 that
shipped without launcher-config.json embedded). This commit just makes
the repo match what's live so a future 'git status' isn't dirty.
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.
Microsoft.NET.Sdk.WindowsDesktop emits NETSDK1100 when a Windows-
targeting project is built from a non-Windows host. Setting
EnableWindowsTargeting=true opts in to the cross-compile path, which
works on Linux as long as the WindowsDesktop SDK files are present.
On glados they were copied from a Windows .NET 8 SDK archive into
/usr/lib/dotnet/sdk/8.0.126/Sdks/Microsoft.NET.Sdk.WindowsDesktop/
and /usr/lib/dotnet/packs/Microsoft.WindowsDesktop.App.Ref/. This is
a one-time setup per Linux host -- see the bridge-claude memory note.
No-op on Windows hosts (the flag has no effect when the SDK is native).
Both PC builds and glados builds now produce the same output.
So existing 0.4.8 installs see the upgrade banner in their current
launcher after the next deploy. The actual session-refresh code change
landed in the previous commit (DoLaunchAsync pre-launch refresh).
Microsoft access tokens have a ~1 hour TTL. The launcher cached the
MSession once at sign-in and re-used it on every Play click, so leaving
the launcher open for >1 hour and then hitting Play sent stale
credentials to MC -- Mojang's session check on the server then rejected
the join with "Invalid session".
Fix: in DoLaunchAsync, before assembling the MC launch command, call
_auth.TryAuthenticateSilentlyAsync(). XboxAuthNet's silent flow uses
the cached refresh token (~14 day TTL) to mint a fresh access token
transparently. On success ApplySession swaps in the new MSession and
we launch with valid credentials. On failure (refresh token also
stale) the launcher prompts the player to sign in again -- they keep
the launcher open, hit Sign In, no MC restart needed.
No new dependencies, no UI change beyond the brief "Refreshing
session..." status line, no perf cost beyond the ~500ms HTTP roundtrip
to Microsoft each launch.
Bump the launcher version in launcher/ModpackLauncher.csproj before
publishing so old launcher installs see the upgrade banner.
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.