pack: content + storage batch v0.24.0 -> v0.26.0

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>
This commit is contained in:
Matt
2026-05-24 22:42:32 +00:00
parent 0cc8effce0
commit 9f0c9e262a
11 changed files with 446 additions and 40 deletions
@@ -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,46 @@
// 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.
//
// KubeJS's event.recipes.create.pressing(out, in) signature
// doesn't match Create 6.x's two-arg form, so build the recipe
// via custom() with the raw JSON schema.
event.custom({
type: 'create:pressing',
ingredients: [{ item: 'supplementaries:flax' }],
results: [{ id: 'minecraft:string', count: 2 }],
}).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');
+16 -23
View File
@@ -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$()."
}
]
}