Compare commits
13 Commits
0cc8effce0
...
c723a42628
| Author | SHA1 | Date | |
|---|---|---|---|
| c723a42628 | |||
| 83abbc90d3 | |||
| 5a24801f48 | |||
| 5e816e1a7a | |||
| d2cc179ebd | |||
| 847ca460ff | |||
| 96d4608e4c | |||
| 61321e5fcd | |||
| a8ff660114 | |||
| ab63908d04 | |||
| fd211aae51 | |||
| f81bb29fda | |||
| 9f0c9e262a |
@@ -0,0 +1,342 @@
|
||||
#.
|
||||
#These values affect the extent of cannon failure.
|
||||
[failure]
|
||||
#.
|
||||
#.
|
||||
#If true, cannons cannot fail whatsoever. Equivalent to setting all the chances below to zero.
|
||||
disableAllCannonFailure = true
|
||||
#.
|
||||
#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
|
||||
# Range: 0.0 ~ 1.0
|
||||
squibChance = 0.25
|
||||
#.
|
||||
#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.
|
||||
# Default: 0.20000000298023224
|
||||
# Range: 0.0 ~ 1.0
|
||||
barrelChargeBurstChance = 0.20000000298023224
|
||||
#.
|
||||
#How strong the explosion of a catastrophic failure is. Scaled by the amount of charges used in the shot.
|
||||
# Default: 2.0
|
||||
# Range: 0.0 ~ 3.4028234663852886E38
|
||||
failureExplosionPower = 2.0
|
||||
#.
|
||||
#Chance that a cannon loaded with more Powder Charges that it can handle will fail. 0 is 0%, 1 is 100%.
|
||||
# Default: 0.5
|
||||
# Range: 0.0 ~ 1.0
|
||||
overloadBurstChance = 0.5
|
||||
#.
|
||||
#Chance that a load with gaps between the loaded Powder Charges will not completely combust. 0 is 0%, 1 is 100%.
|
||||
# Default: 0.33000001311302185
|
||||
# Range: 0.0 ~ 1.0
|
||||
interruptedIgnitionChance = 0.33000001311302185
|
||||
|
||||
#.
|
||||
#These values affect the characteristics of cannon munitions.
|
||||
[munitions]
|
||||
#.
|
||||
#.
|
||||
#If projectiles can bounce, ricochet, and be deflected.
|
||||
projectilesCanBounce = true
|
||||
#.
|
||||
# Default: 0.33000001311302185
|
||||
# Range: 0.0 ~ 1.0
|
||||
baseProjectileBounceChance = 0.33000001311302185
|
||||
#.
|
||||
# Default: 0.8999999761581421
|
||||
# Range: 0.0 ~ 1.0
|
||||
baseProjectileFluidBounceChance = 0.8999999761581421
|
||||
#.
|
||||
#[in Meters per Tick]
|
||||
#The minimum velocity necessary to activate the penetration bonus.
|
||||
# Default: 1.0
|
||||
# Range: 0.0 ~ 3.4028234663852886E38
|
||||
minimumVelocityForPenetrationBonus = 1.0
|
||||
#.
|
||||
# Default: 0.10000000149011612
|
||||
# Range: 0.0 ~ 3.4028234663852886E38
|
||||
penetrationBonusScale = 0.10000000149011612
|
||||
#.
|
||||
#The extent to which cannon projectiles can damage surrounding blocks.
|
||||
#All Damage - projectiles will destroy anything they hit, if applicable. Explosive projectiles will destroy blocks on detonation.
|
||||
#No Explosive Damage - projectiles will destroy anything they hit, if applicable. Explosive projectiles will only harm entities on detonation.
|
||||
#No Damage - projectiles will not destroy anything they hit, and will only deal entity damage. Explosive projectiles will only harm entities on detonation.
|
||||
#Allowed Values: ALL_DAMAGE, NO_EXPLOSIVE_DAMAGE, NO_DAMAGE
|
||||
damageRestriction = "ALL_DAMAGE"
|
||||
#.
|
||||
projectilesChangeSurroundings = true
|
||||
#.
|
||||
munitionBlocksCanExplode = true
|
||||
|
||||
#.
|
||||
#Damp Big Cannon Propellant
|
||||
[munitions.dampBigCannonPropellant]
|
||||
#.
|
||||
dampPropellantBlocksStartingIgnition = true
|
||||
#.
|
||||
dampPropellantWeakensPropellant = true
|
||||
|
||||
#.
|
||||
#Chunkloading
|
||||
[munitions.chunkloading]
|
||||
#.
|
||||
projectilesCanChunkload = true
|
||||
#.
|
||||
smokeCloudsCanChunkload = true
|
||||
|
||||
#.
|
||||
#Big Cannon Munitions
|
||||
[munitions.bigCannonMunitions]
|
||||
#.
|
||||
#Allowed Values: NONE, LONG, SHORT
|
||||
trailType = "SHORT"
|
||||
#.
|
||||
#Makes all shot big cannon projectiles tracers regardless if the item had a tracer tip applied.
|
||||
allBigCannonProjectilesAreTracers = false
|
||||
#.
|
||||
#[in Ticks]
|
||||
# Default: 20
|
||||
# Range: 0 ~ 100
|
||||
quickFiringBreechItemPickupDelay = 20
|
||||
#.
|
||||
quickFiringBreechItemGoesToInventory = false
|
||||
|
||||
#.
|
||||
#Projectile Fuzes
|
||||
[munitions.fuzes]
|
||||
#.
|
||||
#Chance that the Impact Fuze/Delayed Impact Fuze will detonate on hitting something. 0 is 0% (never), 1 is 100% (always).
|
||||
# Default: 0.6700000166893005
|
||||
# Range: 0.0 ~ 1.0
|
||||
impactFuzeDetonationChance = 0.6700000166893005
|
||||
#.
|
||||
#How many blocks the Impact Fuze/Delayed Impact Fuze can hit before breaking. Set to -1 to never break.
|
||||
# Default: 3
|
||||
# Range: > -1
|
||||
impactFuzeDurability = 3
|
||||
#.
|
||||
#Chance that the Inertia Fuze/Delayed Inertia Fuze will detonate on hitting something. 0 is 0% (never), 1 is 100% (always).
|
||||
# Default: 0.8999999761581421
|
||||
# Range: 0.0 ~ 1.0
|
||||
inertiaFuzeDetonationChance = 0.8999999761581421
|
||||
#.
|
||||
#How many blocks the Inertia Fuze/Delayed Inertia Fuze can hit before breaking. Set to -1 to never break.
|
||||
# Default: 3
|
||||
# Range: > -1
|
||||
inertiaFuzeDurability = 3
|
||||
#.
|
||||
#[in Ticks]
|
||||
#Time it takes for a proximity fuze to arm itself.
|
||||
#After the fuze has been in the air for the specified arming time, it will detonate when it gets close enough to a block or entity.
|
||||
# Default: 5
|
||||
# Range: > 0
|
||||
proximityFuzeArmingTime = 5
|
||||
#.
|
||||
#Scale of the area covered by the Proximity Fuze. Larger number means wider area covered
|
||||
# Default: 5
|
||||
# Range: 1 ~ 10
|
||||
proximityFuzeScale = 5
|
||||
#.
|
||||
#[in Blocks]
|
||||
#Spacing of the detection points of the Proximity Fuze.
|
||||
# Default: 1.5
|
||||
# Range: 0.5 ~ 2.0
|
||||
proximityFuzeSpacing = 1.5
|
||||
|
||||
#.
|
||||
#Grouped Munitions
|
||||
[munitions.groupedMunitions]
|
||||
#.
|
||||
#The chance of a fluid blob affecting a block in its area of effect (AOE). 0 is 0% (never), 1 is 100% (always).
|
||||
# Default: 0.5
|
||||
# Range: 0.0 ~ 1.0
|
||||
fluidBlobBlockEffectChance = 0.5
|
||||
|
||||
#.
|
||||
#Autocannon Munitions
|
||||
[munitions.autocannonMunitions]
|
||||
#.
|
||||
#Allowed Values: NONE, LONG, SHORT
|
||||
trailType = "SHORT"
|
||||
#.
|
||||
#Makes all shot autocannon projectiles tracers regardless if the item had a tracer tip applied. Emulates legacy behavior.
|
||||
allAutocannonProjectilesAreTracers = false
|
||||
#.
|
||||
#How many autocannon rounds the Autocannon Ammo Container can store.
|
||||
# Default: 16
|
||||
# Range: 1 ~ 128
|
||||
autocannonAmmoContainerAutocannonRoundCapacity = 16
|
||||
#.
|
||||
#How many machine gun rounds the Autocannon Ammo Container can store.
|
||||
# Default: 64
|
||||
# Range: 1 ~ 128
|
||||
autocannonAmmoContainerMachineGunRoundCapacity = 64
|
||||
|
||||
#.
|
||||
#These values affect the characteristics of cannon materials and cannon structures
|
||||
[cannons]
|
||||
#.
|
||||
#.
|
||||
#Maximum length of cannons that can be built.
|
||||
# Default: 64
|
||||
# Range: > 3
|
||||
maxCannonLength = 64
|
||||
#.
|
||||
#Time when the Quickfiring Breech cannot be loaded by Mechanical Arms.
|
||||
# Default: 40
|
||||
# Range: > 0
|
||||
quickfiringBreechLoadingCooldown = 40
|
||||
#.
|
||||
#Time it takes for the Quickfiring Breech to fully open/close, during which it cannot be loaded.
|
||||
# Default: 5
|
||||
# Range: > 0
|
||||
quickfiringBreechOpeningCooldown = 5
|
||||
#.
|
||||
# Default: 4.0
|
||||
# Range: 0.0 ~ 3.4028234663852886E38
|
||||
bigCannonRecoilScale = 4.0
|
||||
#.
|
||||
# Default: 0.5
|
||||
# Range: 0.0 ~ 3.4028234663852886E38
|
||||
autocannonRecoilScale = 0.5
|
||||
|
||||
#.
|
||||
#Drop Mortar
|
||||
[cannons.dropMortar]
|
||||
#.
|
||||
#Time in ticks between inserting a munition into a drop mortar and the drop mortar firing it. There are 20 ticks in 1 second.
|
||||
# Default: 5
|
||||
# Range: > 0
|
||||
dropMortarDelay = 5
|
||||
#.
|
||||
#Length in ticks that the player has to wait for before inserting the same munition type into a drop mortar again. There are 20 ticks in 1 second.
|
||||
# Default: 40
|
||||
# Range: > 0
|
||||
dropMortarItemCooldown = 40
|
||||
|
||||
#.
|
||||
#Loading Tools
|
||||
[cannons.loadingTools]
|
||||
#.
|
||||
#If deployers can use loading tools.
|
||||
deployersCanUseLoadingTools = false
|
||||
#.
|
||||
#How many blocks inside a cannon a Ram Rod can reach.
|
||||
# Default: 5
|
||||
# Range: > 1
|
||||
ramRodReach = 5
|
||||
#.
|
||||
#Maximum amount of munition blocks a Ram Rod can push.
|
||||
# Default: 3
|
||||
# Range: > 1
|
||||
ramRodStrength = 3
|
||||
#.
|
||||
#How many blocks inside a cannon a Worm can reach.
|
||||
# Default: 5
|
||||
# Range: > 1
|
||||
wormReach = 5
|
||||
#.
|
||||
#How many hunger/saturation points it takes to move one munition block a distance of one block using loading tools.
|
||||
# Default: 2.5
|
||||
# Range: 0.0 ~ 3.4028234663852886E38
|
||||
loadingToolHungerConsumption = 2.5
|
||||
#.
|
||||
#How many ticks before a player can use a manual loading tool again. There are 20 ticks in 1 second.
|
||||
# Default: 20
|
||||
# Range: > 0
|
||||
loadingToolCooldown = 20
|
||||
|
||||
#.
|
||||
#Cannon Carriages
|
||||
[cannons.carriage]
|
||||
#.
|
||||
#How fast the carriage is, in blocks per tick.
|
||||
# Default: 0.03999999910593033
|
||||
# Range: 0.03999999910593033 ~ 1.0
|
||||
carriageSpeed = 0.03999999910593033
|
||||
#.
|
||||
#How fast the carriage turns, in degrees per tick.
|
||||
# Default: 1.0
|
||||
# Range: 0.10000000149011612 ~ 10.0
|
||||
carriageTurnRate = 1.0
|
||||
#.
|
||||
cannonWeightAffectsCarriageSpeed = true
|
||||
|
||||
#.
|
||||
#Display Link Info
|
||||
[cannons.displayLink]
|
||||
#.
|
||||
shouldDisplayCannonRotation = true
|
||||
#.
|
||||
shouldDisplayContainedMunitions = true
|
||||
|
||||
#.
|
||||
#Big Cannon Screen Shake
|
||||
[cannons.bigCannonScreenShake]
|
||||
#.
|
||||
# Default: 8.0
|
||||
# Range: 0.0 ~ 3.4028234663852886E38
|
||||
blastDistanceMultiplier = 8.0
|
||||
|
||||
#.
|
||||
#These values affect various miscellaneous contraptions.
|
||||
[kinetics]
|
||||
#.
|
||||
#.
|
||||
#Maximum length of cannon loaders that can be built.
|
||||
# Default: 64
|
||||
# Range: > 3
|
||||
maxLoaderLength = 64
|
||||
#.
|
||||
#When enabled, Cannon Loaders will not break if another contraption is placed on them. Enables legacy behavior.
|
||||
enableIntersectionLoading = false
|
||||
|
||||
#.
|
||||
#These values affect the stress of Create Big Cannons' mechanical blocks.
|
||||
[kinetics.stressValues.v2]
|
||||
|
||||
#.
|
||||
#.
|
||||
#[in Stress Units]
|
||||
#Configure the individual stress impact of mechanical blocks. Note that this cost is doubled for every speed increase it receives.
|
||||
[kinetics.stressValues.v2.impact]
|
||||
steel_sliding_breech = 32.0
|
||||
cannon_drill = 8.0
|
||||
nethersteel_screw_breech = 40.0
|
||||
steel_screw_breech = 16.0
|
||||
bronze_sliding_breech = 12.0
|
||||
cannon_loader = 4.0
|
||||
cannon_builder = 8.0
|
||||
cast_iron_sliding_breech = 16.0
|
||||
|
||||
#.
|
||||
#These values affect cannon crafting properties.
|
||||
[crafting]
|
||||
#.
|
||||
#.
|
||||
#Maximum height of a single cannon cast that can be built.
|
||||
# Default: 32
|
||||
# Range: > 1
|
||||
maxCannonCastHeight = 32
|
||||
#.
|
||||
#Maximum length of a Cannon Drill that can be built.
|
||||
# Default: 32
|
||||
# Range: > 1
|
||||
maxCannonDrillLength = 32
|
||||
#.
|
||||
#Maximum length of a Cannon Builder that can be built.
|
||||
# Default: 32
|
||||
# Range: > 1
|
||||
maxCannonBuilderLength = 32
|
||||
#.
|
||||
#Maximum reach of a Cannon Builder.
|
||||
# Default: 32
|
||||
# Range: > 2
|
||||
maxCannonBuilderRange = 32
|
||||
#.
|
||||
#[in Ticks]
|
||||
#Time a built-up cannon block needs to be heated for until it transforms into its finished form.
|
||||
# Default: 6000
|
||||
# Range: > 0
|
||||
builtUpCannonHeatingTime = 6000
|
||||
@@ -10,15 +10,18 @@
|
||||
// depositors, bank cards) stay craftable -- those are infrastructure,
|
||||
// not currency.
|
||||
|
||||
const COIN_IDS = [
|
||||
// Renamed to avoid collision with COIN_IDS in numismatics_tooltips.js
|
||||
// (KubeJS server_scripts share a single Rhino global scope).
|
||||
const COIN_RECIPE_REMOVE_IDS = [
|
||||
'numismatics:spur',
|
||||
'numismatics:bevel',
|
||||
'numismatics:sprocket',
|
||||
'numismatics:cog',
|
||||
'numismatics:crown',
|
||||
'numismatics:sun',
|
||||
];
|
||||
|
||||
ServerEvents.recipes(event => {
|
||||
COIN_IDS.forEach(coin => event.remove({ output: coin }));
|
||||
console.info(`[bns/recipes_numismatics] removed crafting recipes for ${COIN_IDS.length} coin denominations`);
|
||||
COIN_RECIPE_REMOVE_IDS.forEach(coin => event.remove({ output: coin }));
|
||||
console.info(`[bns/recipes_numismatics] removed crafting recipes for ${COIN_RECIPE_REMOVE_IDS.length} coin denominations`);
|
||||
});
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
// Brass & Sigil -- Supplementaries cross-mod bridges
|
||||
//
|
||||
// Supplementaries already does tag work (c:crops/flax, c:fiber/flax,
|
||||
// c:drinks/lumisene, etc.) and Create auto-generates Millstone +
|
||||
// 9x packing recipes from those tags. So most integration is done.
|
||||
//
|
||||
// What's left -- two small bridges:
|
||||
// 1. Flax -> String via Mechanical Press (Create doesn't map
|
||||
// c:fiber -> string natively; this fills the gap so flax becomes
|
||||
// a viable string-source for textile builds).
|
||||
// 2. Plunderer drops 1-3 Numismatics spurs so the hostile NPC pulls
|
||||
// into the server economy. Plunderers are rare so this is a
|
||||
// mild bounty, not a farmable currency source.
|
||||
//
|
||||
// Lumisene -> Ars Source was on the list but Ars Nouveau 5.11.x's
|
||||
// sourcelink recipe schema needs verification before we add it.
|
||||
// Parked for a follow-up.
|
||||
|
||||
ServerEvents.recipes(event => {
|
||||
// 2 flax pressed -> 1 string. Cheaper than wool->4 string but
|
||||
// requires a Press (kinetic infrastructure) -- balanced.
|
||||
//
|
||||
// Uses the kubejs_create mod's builder API (added in pack v0.27.0).
|
||||
// Before that, the bare event.recipes.create.pressing() signature
|
||||
// didn't match Create 6.x's recipe shape and we had to use a raw
|
||||
// event.custom({type: 'create:pressing', ...}) call.
|
||||
event.recipes.create.pressing('2x minecraft:string', 'supplementaries:flax')
|
||||
.id('bns:press_flax_to_string');
|
||||
console.info('[bns/supplementaries_bridges] added flax -> string press recipe');
|
||||
});
|
||||
|
||||
// Plunderer is a hostile mob that raids unprotected chests. Adding
|
||||
// a small spur bounty makes them a mini-event rather than a pure
|
||||
// nuisance. Range tuned low: 1-3 spurs = trivial vs. the player
|
||||
// economy but creates a "go hunt the plunderer" hook.
|
||||
//
|
||||
// KubeJS 2101.7.2 doesn't expose ServerEvents.entityLootTables on
|
||||
// NeoForge -- we use EntityEvents.drops (filtered by entity id) and
|
||||
// add items via event.addDrop instead.
|
||||
EntityEvents.drops('supplementaries:plunderer', event => {
|
||||
const count = 1 + Math.floor(Math.random() * 3);
|
||||
event.addDrop(Item.of('numismatics:spur', count));
|
||||
});
|
||||
console.info('[bns/supplementaries_bridges] registered plunderer -> spur drops handler');
|
||||
@@ -1,34 +1,27 @@
|
||||
// Brass & Sigil — first-join welcome grant
|
||||
// Brass & Sigil -- first-join welcome grant
|
||||
//
|
||||
// Gives each new player exactly 1 Waystone + 1 server manual book on
|
||||
// Gives each new player exactly 1 Waystone + 1 Patchouli manual on
|
||||
// first login. Gated by a per-player persistent flag so it fires once
|
||||
// even if the player relogs.
|
||||
//
|
||||
// Future: replace the vanilla written book with a Patchouli book in a
|
||||
// custom tweak jar once we have enough content to warrant the rich
|
||||
// formatting. Patchouli is already in the pack so swapping later is
|
||||
// purely a content+recipe change, no mod-add needed.
|
||||
// The manual is a Patchouli book ("patchouli:manual") shipped in the
|
||||
// pack's root patchouli_books/ folder (the modpack-author path that
|
||||
// Patchouli's docs recommend for non-mod books).
|
||||
// Folder layout:
|
||||
// patchouli_books/manual/book.json
|
||||
// patchouli_books/manual/en_us/categories/<name>.json
|
||||
// patchouli_books/manual/en_us/entries/<name>.json
|
||||
// Namespace defaults to "patchouli" in this mode -- the book id is
|
||||
// "patchouli:manual".
|
||||
|
||||
const WELCOME_FLAG = 'bnsWelcomeGranted';
|
||||
|
||||
const MANUAL_PAGES = [
|
||||
'Welcome to Brass & Sigil.\n\nThis manual covers the basics. Read it once, then keep it or toss it.',
|
||||
'WAYSTONES\n\nYou have one Waystone item. Place it at your base -- it is the only one you get.\n\nNeed to travel further? Build trains, roads, or Create Aeronautics planes.',
|
||||
'MONEY\n\nCoins cannot be crafted.\n\nTake valuables (diamonds etc.) to the bank at spawn. The exchange will trade them for coins.\n\nDynamic rates are planned.',
|
||||
'SPAWN PLOTS\n\nComing soon: buy a small commercial plot at spawn to set up your shop. One plot per player.\n\nYour home base goes OUT in the world -- claim it with FTB Chunks (free, anywhere).',
|
||||
'RULES\n\n- Be excellent to each other.\n- No griefing.\n- Lost your Waystone? Ask an OP or buy one from the bank (soon).\n- Report bugs to staff.\n\nHave fun.',
|
||||
];
|
||||
|
||||
function giveManual(player) {
|
||||
// 1.21 components-based written book: pages are filterable text
|
||||
// components, title supports the same. Plain strings are accepted.
|
||||
const book = Item.of('minecraft:written_book');
|
||||
book.set('minecraft:written_book_content', {
|
||||
title: { raw: 'Brass & Sigil Manual' },
|
||||
author: 'Server Staff',
|
||||
pages: MANUAL_PAGES.map(text => ({ raw: text })),
|
||||
resolved: true,
|
||||
});
|
||||
// Patchouli's guide_book uses the "patchouli:book" data component
|
||||
// (1.21 component system) to identify which book to open. Plain
|
||||
// resource location string is the expected value type.
|
||||
const book = Item.of('patchouli:guide_book');
|
||||
book.set('patchouli:book', 'patchouli:manual');
|
||||
player.give(book);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"name": "Brass & Sigil Manual",
|
||||
"landing_text": "Welcome to Brass & Sigil. This manual covers the essentials -- read it once, then keep it or toss it.",
|
||||
"subtitle": "The Server Handbook",
|
||||
"creative_tab": "minecraft:tools_and_utilities",
|
||||
"model": "patchouli:guide_book",
|
||||
"show_progress": false,
|
||||
"show_advancements": false,
|
||||
"book_texture": "patchouli:textures/gui/book_brown.png",
|
||||
"version": 1
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"name": "Server Basics",
|
||||
"description": "The essentials for life in Brass & Sigil.",
|
||||
"icon": "minecraft:writable_book",
|
||||
"sortnum": 0
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "Money",
|
||||
"icon": "numismatics:cog",
|
||||
"category": "patchouli:main",
|
||||
"sortnum": 2,
|
||||
"pages": [
|
||||
{
|
||||
"type": "patchouli:text",
|
||||
"title": "Coins & Trade",
|
||||
"text": "Coins $(bold)cannot be crafted$(0). They enter circulation only through the bank at spawn.$(br2)Take valuables -- diamonds, emeralds, rare loot -- to the exchange. It trades them for coins at fixed rates."
|
||||
},
|
||||
{
|
||||
"type": "patchouli:text",
|
||||
"title": "Denominations",
|
||||
"text": "$(li)$(item)Spur$() = 1$(li)$(item)Bevel$() = 8 spurs$(li)$(item)Sprocket$() = 16 spurs$(li)$(item)Cog$() = 64 spurs$(li)$(item)Crown$() = 512 spurs$(li)$(item)Sun$() = 4 096 spurs$(br2)Use a $(item)Bank Teller$() block to convert between denominations."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "Plots & Claims",
|
||||
"icon": "ftbchunks:map",
|
||||
"category": "patchouli:main",
|
||||
"sortnum": 3,
|
||||
"pages": [
|
||||
{
|
||||
"type": "patchouli:text",
|
||||
"title": "Spawn Plots",
|
||||
"text": "Buy a small commercial plot at spawn to set up your shop or stall. $(bold)One plot per player$(0).$(br2)Plots are limited and rented from the Plot Office at spawn -- pay in $(item)cog$()s, or trade rare items for the upgrade."
|
||||
},
|
||||
{
|
||||
"type": "patchouli:text",
|
||||
"title": "Your Home Base",
|
||||
"text": "Your $(bold)home base$(0) lives out in the world -- not on a spawn plot. Pick a spot you like and claim it with $(item)FTB Chunks$(): open the map ($(item)m$()), click chunks to claim and force-load.$(br2)FTB Chunks claims are $(bold)free$(0) and protect against grief from other players."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"name": "Rules",
|
||||
"icon": "minecraft:shield",
|
||||
"category": "patchouli:main",
|
||||
"sortnum": 4,
|
||||
"pages": [
|
||||
{
|
||||
"type": "patchouli:text",
|
||||
"title": "House Rules",
|
||||
"text": "$(li)Be excellent to each other.$(li)No griefing.$(li)Don't break others' contraptions or fly through their bases.$(li)Lost your Waystone? Ask an op or buy one from the bank.$(li)Report bugs and crashes to staff."
|
||||
},
|
||||
{
|
||||
"type": "patchouli:text",
|
||||
"title": "PvP & Combat",
|
||||
"text": "PvP is $(bold)allowed$(0) outside claimed chunks. Claim your base with $(item)FTB Chunks$() to protect it.$(br2)Airships flying through unclaimed chunks are $(bold)fair game$(0) -- if you take it out beyond your claim, expect cannons."
|
||||
},
|
||||
{
|
||||
"type": "patchouli:text",
|
||||
"title": "Griefing vs PvP",
|
||||
"text": "PvP and griefing are $(bold)not the same$(0).$(br2)Allowed: combat, raiding contested ground, sinking each other's airships in open air.$(br2)$(bold)Not allowed -- ban-worthy:$()$(li)Repeated targeted harassment of a player$(li)Destruction of unclaimed builds purely to ruin them$(li)Camping someone's claim border to grief them$(li)Stealing keys/coins via social engineering or exploit$(br2)If unsure, ask staff first."
|
||||
},
|
||||
{
|
||||
"type": "patchouli:text",
|
||||
"text": "$(bold)Have fun.$(0)$(br2)This manual is a living document -- expect new pages as the server grows. To re-read at any time, hold the manual and right-click."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "Waystones",
|
||||
"icon": "waystones:waystone",
|
||||
"category": "patchouli:main",
|
||||
"sortnum": 1,
|
||||
"pages": [
|
||||
{
|
||||
"type": "patchouli:text",
|
||||
"title": "Waystones",
|
||||
"text": "You have one $(item)Waystone$() in your starter kit. $(bold)Place it at your base$() -- it is the only one you get from the server."
|
||||
},
|
||||
{
|
||||
"type": "patchouli:text",
|
||||
"text": "Need to travel further? Build:$(br)$(li)$(item)Create$() trains and tracks$(li)Roads with the $(item)brass road sign$()$(li)$(item)Create Aeronautics$() planes and airships$(br2)Once Quests are live, additional Waystones will be purchasable at the bank."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "Welcome",
|
||||
"icon": "minecraft:cake",
|
||||
"category": "patchouli:main",
|
||||
"priority": true,
|
||||
"sortnum": 0,
|
||||
"pages": [
|
||||
{
|
||||
"type": "patchouli:text",
|
||||
"title": "Welcome",
|
||||
"text": "Welcome to $(bold)Brass & Sigil$(0)!$(br2)This manual covers the basics. Skim it now, then keep it on you or toss it in a chest -- you can always craft another by combining a $(item)book$() with a server-issued $(item)sigil$()."
|
||||
}
|
||||
]
|
||||
}
|
||||
+324
-16
@@ -1,13 +1,13 @@
|
||||
{
|
||||
"$schema": "Brass-and-Sigil pack.lock.json - generated, do not edit by hand unless you know what you are doing",
|
||||
"name": "Brass and Sigil",
|
||||
"version": "0.23.0",
|
||||
"version": "0.28.0",
|
||||
"minecraft": "1.21.1",
|
||||
"loader": {
|
||||
"type": "neoforge",
|
||||
"version": "21.1.228"
|
||||
},
|
||||
"lockedAt": "2026-05-04T13:22:58.7131203+00:00",
|
||||
"lockedAt": "2026-05-28T19:27:42Z",
|
||||
"mods": [
|
||||
{
|
||||
"source": "modrinth",
|
||||
@@ -53,6 +53,17 @@
|
||||
"size": 3715787,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "create-radars",
|
||||
"versionId": "3MbtX7qD",
|
||||
"version": "0.4.8-1.21.1",
|
||||
"path": "mods/create_radar-0.4.8-1.21.1.jar",
|
||||
"url": "https://cdn.modrinth.com/data/BLu2Yqfq/versions/3MbtX7qD/create_radar-0.4.8-1.21.1.jar",
|
||||
"sha1": "e33b4957cf831e4ee76c5cb334119270e057c529",
|
||||
"size": 16462408,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "create-tfmg",
|
||||
@@ -64,6 +75,83 @@
|
||||
"size": 4924243,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "copycats",
|
||||
"versionId": "kecZ0sl7",
|
||||
"version": "3.0.4+mc.1.21.1-neoforge",
|
||||
"path": "mods/copycats-3.0.4+mc.1.21.1-neoforge.jar",
|
||||
"url": "https://cdn.modrinth.com/data/UT2M39wf/versions/kecZ0sl7/copycats-3.0.4%2Bmc.1.21.1-neoforge.jar",
|
||||
"sha1": "6a11d5806bcf521e08faba1ee6ef5f31af55ca0f",
|
||||
"size": 1791747,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "create-connected",
|
||||
"versionId": "EHyCRpCV",
|
||||
"version": "1.1.16-mc1.21.1",
|
||||
"path": "mods/create_connected-1.1.16-mc1.21.1.jar",
|
||||
"url": "https://cdn.modrinth.com/data/Vg5TIO6d/versions/EHyCRpCV/create_connected-1.1.16-mc1.21.1.jar",
|
||||
"sha1": "11fafde06b25b872f8d5c4e927516188b831cf1a",
|
||||
"size": 6608605,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "interiors",
|
||||
"versionId": "gBrfZy6S",
|
||||
"version": "0.6.1",
|
||||
"path": "mods/interiors-1.21.1-neoforge-0.6.1.jar",
|
||||
"url": "https://cdn.modrinth.com/data/r4Knci2k/versions/gBrfZy6S/interiors-1.21.1-neoforge-0.6.1.jar",
|
||||
"sha1": "a558777ef4510da2f4d32ca3da6ac7384c9a9940",
|
||||
"size": 486912,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "create-power-loader",
|
||||
"versionId": "3Y4r0ItR",
|
||||
"version": "2.0.5-mc1.21.1",
|
||||
"path": "mods/create_power_loader-2.0.5-mc1.21.1.jar",
|
||||
"url": "https://cdn.modrinth.com/data/wPQ6GgFE/versions/3Y4r0ItR/create_power_loader-2.0.5-mc1.21.1.jar",
|
||||
"sha1": "5bd3ecef6fc66985e6fdf416706c98fb774ba03d",
|
||||
"size": 442369,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "kubejs-create",
|
||||
"versionId": "1qmcLagN",
|
||||
"version": "2101.3.1-build.18",
|
||||
"path": "mods/kubejs-create-neoforge-2101.3.1-build.18.jar",
|
||||
"url": "https://cdn.modrinth.com/data/T38eAZQC/versions/1qmcLagN/kubejs-create-neoforge-2101.3.1-build.18.jar",
|
||||
"sha1": "f54d9ff53909771d27e4d9d135c3707cd5d5f855",
|
||||
"size": 38629,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "create-encased",
|
||||
"versionId": "3sUW27Ho",
|
||||
"version": "1.8.1-ht1",
|
||||
"path": "mods/Create Encased-1.21.1-1.8.1-ht1.jar",
|
||||
"url": "https://cdn.modrinth.com/data/hSSqdyU1/versions/3sUW27Ho/Create%20Encased-1.21.1-1.8.1-ht1.jar",
|
||||
"sha1": "5ca3d7674676dda5dd472b0433505a54d5e920d0",
|
||||
"size": 2574837,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "bellsandwhistles",
|
||||
"versionId": "w0mifib8",
|
||||
"version": "v0.4.7-1.21.1",
|
||||
"path": "mods/bellsandwhistles-0.4.7-1.21.1.jar",
|
||||
"url": "https://cdn.modrinth.com/data/gJ5afkVv/versions/w0mifib8/bellsandwhistles-0.4.7-1.21.1.jar",
|
||||
"sha1": "85944080f8bd47dad64a8193a70662cd9ddbb200",
|
||||
"size": 193619,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "distanthorizons",
|
||||
@@ -240,6 +328,94 @@
|
||||
"size": 20689115,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "ars-creo",
|
||||
"versionId": "l9IAhn9x",
|
||||
"version": "5.3.1",
|
||||
"path": "mods/ars_creo-1.21.1-5.3.1.jar",
|
||||
"url": "https://cdn.modrinth.com/data/fZ324GMc/versions/l9IAhn9x/ars_creo-1.21.1-5.3.1.jar",
|
||||
"sha1": "296ea073e2976360a626b1dc30a392318a0ca522",
|
||||
"size": 87005,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "create-dragons-plus",
|
||||
"versionId": "r0TIh2nX",
|
||||
"version": "1.10.1",
|
||||
"path": "mods/CreateDragonsPlus-1.10.1.jar",
|
||||
"url": "https://cdn.modrinth.com/data/dzb1a5WV/versions/r0TIh2nX/CreateDragonsPlus-1.10.1.jar",
|
||||
"sha1": "0759898cc7ca22ece49e7d7a210db8becfd79cdf",
|
||||
"size": 759631,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "sophisticated-core",
|
||||
"versionId": "xLeCYw3D",
|
||||
"version": "1.21.1-1.4.41.1867",
|
||||
"path": "mods/sophisticatedcore-1.21.1-1.4.41.1867.jar",
|
||||
"url": "https://cdn.modrinth.com/data/nmoqTijg/versions/xLeCYw3D/sophisticatedcore-1.21.1-1.4.41.1867.jar",
|
||||
"sha1": "c5880807715abf1cf276be0afdd1351a3cc747e0",
|
||||
"size": 1607780,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "sophisticated-storage",
|
||||
"versionId": "dMp3ZwPO",
|
||||
"version": "1.21.1-1.5.50.1743",
|
||||
"path": "mods/sophisticatedstorage-1.21.1-1.5.50.1743.jar",
|
||||
"url": "https://cdn.modrinth.com/data/hMlaZH8f/versions/dMp3ZwPO/sophisticatedstorage-1.21.1-1.5.50.1743.jar",
|
||||
"sha1": "aafe9fa35429b42073ba7dac22318aa5b22c83cb",
|
||||
"size": 1689268,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "sophisticated-storage-create-integration",
|
||||
"versionId": "cxMKWFFD",
|
||||
"version": "1.21.1-0.1.17.132",
|
||||
"path": "mods/sophisticatedstoragecreateintegration-1.21.1-0.1.17.132.jar",
|
||||
"url": "https://cdn.modrinth.com/data/MJ0hdevs/versions/cxMKWFFD/sophisticatedstoragecreateintegration-1.21.1-0.1.17.132.jar",
|
||||
"sha1": "afabee69117b0cd50184579af33d80d096f4a9c6",
|
||||
"size": 133451,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "sophisticated-backpacks",
|
||||
"versionId": "tqDekk0k",
|
||||
"version": "1.21.1-3.25.49.1788",
|
||||
"path": "mods/sophisticatedbackpacks-1.21.1-3.25.49.1788.jar",
|
||||
"url": "https://cdn.modrinth.com/data/TyCTlI4b/versions/tqDekk0k/sophisticatedbackpacks-1.21.1-3.25.49.1788.jar",
|
||||
"sha1": "bf46106f0e2df9a9749891735440c357550a3d4a",
|
||||
"size": 1056463,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "create-additional-logistics",
|
||||
"versionId": "soesZiME",
|
||||
"version": "1.4.5",
|
||||
"path": "mods/createadditionallogistics-1.21.1-1.4.5.jar",
|
||||
"url": "https://cdn.modrinth.com/data/CZaz7aje/versions/soesZiME/createadditionallogistics-1.21.1-1.4.5.jar",
|
||||
"sha1": "6acf4d30516b6bf66928aa5d79d6bac6283de44e",
|
||||
"size": 953230,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "create-enchantment-industry",
|
||||
"versionId": "zjSKnkVT",
|
||||
"version": "2.3.1",
|
||||
"path": "mods/create-enchantment-industry-2.3.1.jar",
|
||||
"url": "https://cdn.modrinth.com/data/JWGBpFUP/versions/zjSKnkVT/create-enchantment-industry-2.3.1.jar",
|
||||
"sha1": "e9a57b322459bda9905e4287d2582ad600909b11",
|
||||
"size": 684729,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "terralith",
|
||||
@@ -262,6 +438,116 @@
|
||||
"size": 461244,
|
||||
"side": "server"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "yungs-better-dungeons",
|
||||
"versionId": "D6aZn0Em",
|
||||
"version": "1.21.1-NeoForge-5.1.4",
|
||||
"path": "mods/YungsBetterDungeons-1.21.1-NeoForge-5.1.4.jar",
|
||||
"url": "https://cdn.modrinth.com/data/o1C1Dkj5/versions/D6aZn0Em/YungsBetterDungeons-1.21.1-NeoForge-5.1.4.jar",
|
||||
"sha1": "73a660c13063450e555e5e2c015ae24d606b32b4",
|
||||
"size": 782160,
|
||||
"side": "server"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "yungs-better-mineshafts",
|
||||
"versionId": "Go3nbneL",
|
||||
"version": "1.21.1-NeoForge-5.1.1",
|
||||
"path": "mods/YungsBetterMineshafts-1.21.1-NeoForge-5.1.1.jar",
|
||||
"url": "https://cdn.modrinth.com/data/HjmxVlSr/versions/Go3nbneL/YungsBetterMineshafts-1.21.1-NeoForge-5.1.1.jar",
|
||||
"sha1": "6a14e1d8201f068ca87ef8333e471c5378955906",
|
||||
"size": 493967,
|
||||
"side": "server"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "yungs-better-ocean-monuments",
|
||||
"versionId": "yFjEcj2g",
|
||||
"version": "1.21.1-NeoForge-4.1.2",
|
||||
"path": "mods/YungsBetterOceanMonuments-1.21.1-NeoForge-4.1.2.jar",
|
||||
"url": "https://cdn.modrinth.com/data/3dT9sgt4/versions/yFjEcj2g/YungsBetterOceanMonuments-1.21.1-NeoForge-4.1.2.jar",
|
||||
"sha1": "fba629defdb92ad99ec4f411895afb6e19555a18",
|
||||
"size": 1025571,
|
||||
"side": "server"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "yungs-better-nether-fortresses",
|
||||
"versionId": "iopJiJQp",
|
||||
"version": "1.21.1-NeoForge-3.1.5",
|
||||
"path": "mods/YungsBetterNetherFortresses-1.21.1-NeoForge-3.1.5.jar",
|
||||
"url": "https://cdn.modrinth.com/data/Z2mXHnxP/versions/iopJiJQp/YungsBetterNetherFortresses-1.21.1-NeoForge-3.1.5.jar",
|
||||
"sha1": "4061ece2141475227646649046fc14c2da505922",
|
||||
"size": 609639,
|
||||
"side": "server"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "yungs-better-end-island",
|
||||
"versionId": "I52NZ1qK",
|
||||
"version": "1.21.1-NeoForge-3.1.2",
|
||||
"path": "mods/YungsBetterEndIsland-1.21.1-NeoForge-3.1.2.jar",
|
||||
"url": "https://cdn.modrinth.com/data/2BwBOmBQ/versions/I52NZ1qK/YungsBetterEndIsland-1.21.1-NeoForge-3.1.2.jar",
|
||||
"sha1": "832f2c17425debe74a9f267f4136f1a0f0221d19",
|
||||
"size": 398130,
|
||||
"side": "server"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "yungs-better-witch-huts",
|
||||
"versionId": "AvedwcIe",
|
||||
"version": "1.21.1-NeoForge-4.1.1",
|
||||
"path": "mods/YungsBetterWitchHuts-1.21.1-NeoForge-4.1.1.jar",
|
||||
"url": "https://cdn.modrinth.com/data/t5FRdP87/versions/AvedwcIe/YungsBetterWitchHuts-1.21.1-NeoForge-4.1.1.jar",
|
||||
"sha1": "bbf6c91f4a2829c58bc024eaaab821986bc93de6",
|
||||
"size": 174789,
|
||||
"side": "server"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "yungs-better-desert-temples",
|
||||
"versionId": "GQ9iNWkI",
|
||||
"version": "1.21.1-NeoForge-4.1.5",
|
||||
"path": "mods/YungsBetterDesertTemples-1.21.1-NeoForge-4.1.5.jar",
|
||||
"url": "https://cdn.modrinth.com/data/XNlO7sBv/versions/GQ9iNWkI/YungsBetterDesertTemples-1.21.1-NeoForge-4.1.5.jar",
|
||||
"sha1": "90529257dbd92558998c65178294bc7b2fd16a64",
|
||||
"size": 905839,
|
||||
"side": "server"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "yungs-better-jungle-temples",
|
||||
"versionId": "P00i2hJn",
|
||||
"version": "1.21.1-NeoForge-3.1.2",
|
||||
"path": "mods/YungsBetterJungleTemples-1.21.1-NeoForge-3.1.2.jar",
|
||||
"url": "https://cdn.modrinth.com/data/z9Ve58Ih/versions/P00i2hJn/YungsBetterJungleTemples-1.21.1-NeoForge-3.1.2.jar",
|
||||
"sha1": "d6b7ce6cf351b09cbd23147ff166c35cfdc572e8",
|
||||
"size": 795839,
|
||||
"side": "server"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "yungs-bridges",
|
||||
"versionId": "urkCzBf6",
|
||||
"version": "1.21.1-NeoForge-5.1.1",
|
||||
"path": "mods/YungsBridges-1.21.1-NeoForge-5.1.1.jar",
|
||||
"url": "https://cdn.modrinth.com/data/Ht4BfYp6/versions/urkCzBf6/YungsBridges-1.21.1-NeoForge-5.1.1.jar",
|
||||
"sha1": "18099c2d54acd16bb8ab90a66f40fa16496d065e",
|
||||
"size": 136820,
|
||||
"side": "server"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "yungs-extras",
|
||||
"versionId": "N2EpMhR7",
|
||||
"version": "1.21.1-NeoForge-5.1.1",
|
||||
"path": "mods/YungsExtras-1.21.1-NeoForge-5.1.1.jar",
|
||||
"url": "https://cdn.modrinth.com/data/ZYgyPyfq/versions/N2EpMhR7/YungsExtras-1.21.1-NeoForge-5.1.1.jar",
|
||||
"sha1": "62833733aaf407f36bdacf648ed4b2ef9940662b",
|
||||
"size": 198183,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "lithostitched",
|
||||
@@ -588,7 +874,7 @@
|
||||
"version": "2.3.2",
|
||||
"path": "mods/mcw-roofs-2.3.2-mc1.21.1neoforge.jar",
|
||||
"url": "https://cdn.modrinth.com/data/B8jaH3P1/versions/jiXRXiSt/mcw-roofs-2.3.2-mc1.21.1neoforge.jar",
|
||||
"sha1": "05806ff152e739ea0c5db86dabd9caf0cfa55b9d",
|
||||
"sha1": "05806ff152fab56f7c1b4b215d772ea73611283d",
|
||||
"size": 1784829,
|
||||
"side": "both"
|
||||
},
|
||||
@@ -599,7 +885,7 @@
|
||||
"version": "1.1.1",
|
||||
"path": "mods/mcw-mcwpaths-1.1.1-mc1.21.1neoforge.jar",
|
||||
"url": "https://cdn.modrinth.com/data/VRLhWB91/versions/tlymsxUG/mcw-mcwpaths-1.1.1-mc1.21.1neoforge.jar",
|
||||
"sha1": "4bb7e1d28e8b3b5d3a3eaf5e0d3bcc62d1ab57f1",
|
||||
"sha1": "4bb7e1d28eef19f87438881b0f582a15297b95ae",
|
||||
"size": 777742,
|
||||
"side": "both"
|
||||
},
|
||||
@@ -658,17 +944,6 @@
|
||||
"size": 1190404,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "create-deco",
|
||||
"versionId": "qrcMVoBD",
|
||||
"version": "2.1.3",
|
||||
"path": "mods/createdeco-2.1.3.jar",
|
||||
"url": "https://cdn.modrinth.com/data/sMvUb4Rb/versions/qrcMVoBD/createdeco-2.1.3.jar",
|
||||
"sha1": "93d9eff58b46c6953e907d071e6be4e3ce07be38",
|
||||
"size": 3328498,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "effortless-building",
|
||||
@@ -680,6 +955,17 @@
|
||||
"size": 810119,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "fallingtree",
|
||||
"versionId": "wxGXaJMA",
|
||||
"version": "1.21.1-1.21.1.11",
|
||||
"path": "mods/FallingTree-1.21.1-1.21.1.11.jar",
|
||||
"url": "https://cdn.modrinth.com/data/Fb4jn8m6/versions/wxGXaJMA/FallingTree-1.21.1-1.21.1.11.jar",
|
||||
"sha1": "7e1b3ee0ba89b556d5a468797bb1b5f4e2b8ccb7",
|
||||
"size": 496356,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "moonlight",
|
||||
@@ -690,6 +976,28 @@
|
||||
"sha1": "a865d9a00a595038d35b908c42565930189be68a",
|
||||
"size": 1578765,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "create-steam-n-rails-1.21.1",
|
||||
"versionId": "oQKsMKfj",
|
||||
"version": "0.2.0+neoforge-mc1.21.1",
|
||||
"path": "mods/railways-0.2.0+neoforge-mc1.21.1.jar",
|
||||
"url": "https://cdn.modrinth.com/data/L3Jv0QZI/versions/oQKsMKfj/railways-0.2.0%2Bneoforge-mc1.21.1.jar",
|
||||
"sha1": "9d52eef0772b81de397271b98c0201a59733f9c6",
|
||||
"size": 12106875,
|
||||
"side": "both"
|
||||
},
|
||||
{
|
||||
"source": "modrinth",
|
||||
"slug": "copycats+-aeronautics-weight",
|
||||
"versionId": "wsXjRa7l",
|
||||
"version": "1.1.1",
|
||||
"path": "mods/aerocopycats-1.1.1.jar",
|
||||
"url": "https://cdn.modrinth.com/data/wjpmYU1u/versions/wsXjRa7l/aerocopycats-1.1.1.jar",
|
||||
"sha1": "3a93862421d0a8cdae1e3a3d7f0d4bd01e049007",
|
||||
"size": 14702,
|
||||
"side": "both"
|
||||
}
|
||||
],
|
||||
"defaultServer": {
|
||||
@@ -698,4 +1006,4 @@
|
||||
},
|
||||
"defaultShader": "ComplementaryReimagined_r5.7.1.zip",
|
||||
"panelUrl": "https://bns-admin.sijbers.uk"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,11 +37,28 @@ public sealed class BackupScheduler : IDisposable
|
||||
public void Start()
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(_config.BackupSchedule)) return;
|
||||
if (Parse(_config.BackupSchedule) == default)
|
||||
var parsed = Parse(_config.BackupSchedule);
|
||||
if (parsed == default)
|
||||
{
|
||||
_log($"[backup-scheduler] Invalid backupSchedule '{_config.BackupSchedule}'. Expected 'HH:mm', 'HH:mm,HH:mm', or 'every Nh'/'every Nm'. Disabled.");
|
||||
return;
|
||||
}
|
||||
|
||||
// No-replay startup: mark all of today's already-passed slots as fired so
|
||||
// the wake loop only fires future slots. Without this, a daily-times
|
||||
// schedule like "00:00,04:00,...,20:00" on a service restart at 19:00
|
||||
// would catch up by firing 5 backups at 1-minute intervals (one per
|
||||
// missed slot), each producing a full-world zip of the SAME world state.
|
||||
// For full-snapshot backups that's pure waste -- the live world hasn't
|
||||
// diverged across missed slots.
|
||||
if (parsed.Times is not null)
|
||||
{
|
||||
var nowTime = TimeOnly.FromDateTime(DateTime.Now);
|
||||
_lastFireDay = DateOnly.FromDateTime(DateTime.Now);
|
||||
foreach (var t in parsed.Times)
|
||||
if (t <= nowTime) _firedToday.Add(t);
|
||||
}
|
||||
|
||||
_cts?.Cancel();
|
||||
_cts = new CancellationTokenSource();
|
||||
_loop = Task.Run(() => RunAsync(_cts.Token));
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
# ZFS ARC sizing for glados — a mixed-workload host (32 GB RAM).
|
||||
#
|
||||
# Why these numbers:
|
||||
# - The cold ZFS pool is BACKUP TIER ONLY. Hot data (MC world, Gitea repos,
|
||||
# Directus DB, containers) all live on NVMe LVM, not ZFS — so a large
|
||||
# ARC doesn't help any of the actual workloads.
|
||||
# - Tier-2 backup work is streaming writes (rsync hot→cold every 4h):
|
||||
# streaming writes don't benefit much from cache.
|
||||
# - Reads happen rarely (disaster recovery, Gitea LFS fetches), and a
|
||||
# one-time cold read is fine.
|
||||
# - MC is the memory-hungry workload (10 GB Java heap). Every GB we DON'T
|
||||
# give to ARC is a GB more headroom for MC and future content.
|
||||
#
|
||||
# 2 GB max / 1 GB min keeps ZFS metadata + small ARC for occasional reads,
|
||||
# without crowding MC out of RAM.
|
||||
options zfs zfs_arc_max=2147483648
|
||||
options zfs zfs_arc_min=1073741824
|
||||
Reference in New Issue
Block a user