pack: v0.29.0 — train fuel requirement + CBC tier-preserving safety

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>
This commit is contained in:
Matt
2026-05-28 20:42:38 +00:00
parent 92306823cb
commit e84de6c190
10 changed files with 105 additions and 8 deletions
@@ -4,33 +4,33 @@
#. #.
#. #.
#If true, cannons cannot fail whatsoever. Equivalent to setting all the chances below to zero. #If true, cannons cannot fail whatsoever. Equivalent to setting all the chances below to zero.
disableAllCannonFailure = true disableAllCannonFailure = false
#. #.
#Chance that a fired projectile will get stuck in a barrel after exceeding the squib ratio. 0 is 0%, 1 is 100%. #Chance that a fired projectile will get stuck in a barrel after exceeding the squib ratio. 0 is 0%, 1 is 100%.
# Default: 0.25 # Default: 0.25
# Range: 0.0 ~ 1.0 # Range: 0.0 ~ 1.0
squibChance = 0.25 squibChance = 0.0
#. #.
#Chance that a cannon will fail if a Powder Charge is ignited in a "barrel"-type cannon block. 0 is 0%, 1 is 100%. #Chance that a cannon will fail if a Powder Charge is ignited in a "barrel"-type cannon block. 0 is 0%, 1 is 100%.
#This chance can be affected by stronger and weaker charge blocks. #This chance can be affected by stronger and weaker charge blocks.
# Default: 0.20000000298023224 # Default: 0.20000000298023224
# Range: 0.0 ~ 1.0 # Range: 0.0 ~ 1.0
barrelChargeBurstChance = 0.20000000298023224 barrelChargeBurstChance = 0.0
#. #.
#How strong the explosion of a catastrophic failure is. Scaled by the amount of charges used in the shot. #How strong the explosion of a catastrophic failure is. Scaled by the amount of charges used in the shot.
# Default: 2.0 # Default: 2.0
# Range: 0.0 ~ 3.4028234663852886E38 # Range: 0.0 ~ 3.4028234663852886E38
failureExplosionPower = 2.0 failureExplosionPower = 0.0
#. #.
#Chance that a cannon loaded with more Powder Charges that it can handle will fail. 0 is 0%, 1 is 100%. #Chance that a cannon loaded with more Powder Charges that it can handle will fail. 0 is 0%, 1 is 100%.
# Default: 0.5 # Default: 0.5
# Range: 0.0 ~ 1.0 # Range: 0.0 ~ 1.0
overloadBurstChance = 0.5 overloadBurstChance = 1.0
#. #.
#Chance that a load with gaps between the loaded Powder Charges will not completely combust. 0 is 0%, 1 is 100%. #Chance that a load with gaps between the loaded Powder Charges will not completely combust. 0 is 0%, 1 is 100%.
# Default: 0.33000001311302185 # Default: 0.33000001311302185
# Range: 0.0 ~ 1.0 # Range: 0.0 ~ 1.0
interruptedIgnitionChance = 0.33000001311302185 interruptedIgnitionChance = 0.0
#. #.
#These values affect the characteristics of cannon munitions. #These values affect the characteristics of cannon munitions.
@@ -0,0 +1,67 @@
#.
#Miscellaneous settings
[misc]
#.
#Coupler will require points to be on the same or adjacent track edge, this will prevent the coupler from working if there is any form of junction in between the two points.
strictCoupler = false
#.
#Allow controlling Brass Switches remotely when approaching them on a train
flipDistantSwitches = true
#.
#Max distance between targeted track and placed switch stand
# Default: 64
# Range: 16 ~ 128
switchPlacementRange = 64
#.
#Allow creepers and ghast fireballs to damage tracks
creeperTrackDamage = false
#.
#Multiplier used for calculating exhaustion from speed when a handcar is used.
# Default: 0.009999999776482582
# Range: 0.0 ~ 1.0
handcarHungerMultiplier = 0.009999999776482582
#.
#Semaphore settings
[semaphores]
#.
#.
#Simplified semaphore placement (no upside-down placement)
simplifiedPlacement = true
#.
#Whether semaphore color order is reversed when the semaphores are oriented upside-down
flipYellowOrder = false
#.
#Conductor settings
[conductors]
#.
#.
#Conductor whistle is limited to the owner of a train
mustOwnBoundTrain = false
#.
#Maximum length of conductor vents
# Default: 64
# Range: > 1
maxConductorVentLength = 64
#.
#How often a conductor whistle updates the train of the bound conductor
# Default: 10
# Range: 1 ~ 600
whistleRebindRate = 10
#.
#Maximum distance (in blocks) at which a conductor can be activated by looking at them
# Default: 16
# Range: 1 ~ 64
activationDistance = 16
#.
#Realism Settings
[realism]
#.
#.
#Make trains require fuel to run (either from fuel tanks or solid fuels in chests/barrels)
realisticTrains = true
#.
#Make fuel tanks only accept proper liquid fuels (so water etc can't go into them)
realisticFuelTanks = true
@@ -0,0 +1,4 @@
{
"fluids": ["tfmg:crude_oil"],
"fuel_ticks": 8000
}
@@ -0,0 +1,4 @@
{
"fluids": ["tfmg:diesel"],
"fuel_ticks": 48000
}
@@ -0,0 +1,4 @@
{
"fluids": ["tfmg:furnace_gas"],
"fuel_ticks": 12000
}
@@ -0,0 +1,4 @@
{
"fluids": ["tfmg:gasoline"],
"fuel_ticks": 36000
}
@@ -0,0 +1,4 @@
{
"fluids": ["tfmg:kerosene"],
"fuel_ticks": 24000
}
@@ -0,0 +1,4 @@
{
"fluids": ["tfmg:naphtha"],
"fuel_ticks": 24000
}
@@ -0,0 +1,6 @@
{
"pack": {
"pack_format": 48,
"description": "Brass and Sigil — Steam'n'Rails liquid fuel definitions"
}
}
+2 -2
View File
@@ -1,13 +1,13 @@
{ {
"$schema": "Brass-and-Sigil pack.lock.json - generated, do not edit by hand unless you know what you are doing", "$schema": "Brass-and-Sigil pack.lock.json - generated, do not edit by hand unless you know what you are doing",
"name": "Brass and Sigil", "name": "Brass and Sigil",
"version": "0.28.0", "version": "0.29.0",
"minecraft": "1.21.1", "minecraft": "1.21.1",
"loader": { "loader": {
"type": "neoforge", "type": "neoforge",
"version": "21.1.228" "version": "21.1.228"
}, },
"lockedAt": "2026-05-28T19:27:42Z", "lockedAt": "2026-05-28T20:40:32Z",
"mods": [ "mods": [
{ {
"source": "modrinth", "source": "modrinth",