Economy MVP: Numismatics+Patchouli+welcome flow #15

Merged
Matt merged 1 commits from feature/economy-mvp into main 2026-05-23 14:16:46 +00:00
4 changed files with 152 additions and 1 deletions
Showing only changes of commit 2ac4b2f2cd - Show all commits
@@ -0,0 +1,52 @@
// Brass & Sigil — JEI hides
//
// Hides all Waystones items + all Numismatics coin items from the JEI
// item list. Combined with the server-side recipe removal in
// economy_policy.js, players don't see crafting recipes OR the item
// icons in the JEI ingredient list -- they only ever encounter these
// items through the welcome grant or the bank exchange.
const COLORS = [
'white', 'orange', 'magenta', 'light_blue', 'yellow', 'lime',
'pink', 'gray', 'light_gray', 'cyan', 'purple', 'blue',
'brown', 'green', 'red', 'black',
];
const WAYSTONE_ITEMS = [
// regular waystone variants
'waystones:waystone',
'waystones:mossy_waystone',
'waystones:sandy_waystone',
'waystones:blackstone_waystone',
'waystones:deepslate_waystone',
'waystones:end_stone_waystone',
// handheld + plate
'waystones:warp_stone',
'waystones:warp_scroll',
'waystones:bound_scroll',
'waystones:return_scroll',
'waystones:warp_plate',
// sharestones (16 colors) + shards
'waystones:sharestone', // base id if registered
];
COLORS.forEach(c => {
WAYSTONE_ITEMS.push(`waystones:${c}_sharestone`);
WAYSTONE_ITEMS.push(`waystones:${c}_portstone`);
});
const COIN_ITEMS = [
'numismatics:spur',
'numismatics:bevel',
'numismatics:sundial',
'numismatics:sun',
];
JEIEvents.hideItems(event => {
[...WAYSTONE_ITEMS, ...COIN_ITEMS].forEach(id => {
try { event.hide(id); } catch (e) {
// Some IDs may not exist (e.g. base 'waystones:sharestone' isn't
// registered if only colored variants are). Swallow per-item
// failures so one bad id doesn't break the whole pass.
}
});
});
@@ -0,0 +1,24 @@
// Brass & Sigil — economy policy (recipe removal)
//
// Players can't craft Waystones items (they're distributed by the welcome
// grant -- see welcome.js -- and any replacements come from the bank
// vendor in the future). Players also can't manufacture currency: coins
// only enter circulation through the bank exchange (item-in / coin-out).
//
// Other Numismatics blocks (piggy banks, bank tellers, vendor blocks) stay
// craftable -- those are infrastructure, not currency.
ServerEvents.recipes(event => {
// Block ALL crafting of Waystones items. The welcome-grant script
// gives each new player exactly one regular waystone; any further
// recovery happens via OP /give or future bank vendor.
event.remove({ mod: 'waystones' });
// Block coin manufacturing only -- 4 denominations.
[
'numismatics:spur',
'numismatics:bevel',
'numismatics:sundial',
'numismatics:sun',
].forEach(coin => event.remove({ output: coin }));
});
@@ -0,0 +1,53 @@
// Brass & Sigil — first-join welcome grant
//
// Gives each new player exactly 1 Waystone + 1 server manual book 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.
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,
});
player.give(book);
}
function giveStarterWaystone(player) {
player.give(Item.of('waystones:waystone'));
}
PlayerEvents.loggedIn(event => {
const player = event.player;
const data = player.persistentData;
if (data.getBoolean(WELCOME_FLAG)) return;
try {
giveStarterWaystone(player);
giveManual(player);
data.putBoolean(WELCOME_FLAG, true);
player.tell(Text.gold('Welcome to Brass & Sigil. Check your inventory for a Waystone and the server manual.'));
} catch (e) {
// If something goes wrong, don't set the flag -- player gets another chance.
console.error(`[bns/welcome] failed for ${player.username}: ${e}`);
}
});
+23 -1
View File
@@ -1,7 +1,7 @@
{ {
"$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.17.0", "version": "0.18.0",
"minecraft": "1.21.1", "minecraft": "1.21.1",
"loader": { "loader": {
"type": "neoforge", "type": "neoforge",
@@ -481,6 +481,28 @@
"sha1": "488bc70db3730f209e65cbda04c36dbc3918c448", "sha1": "488bc70db3730f209e65cbda04c36dbc3918c448",
"size": 878265, "size": 878265,
"side": "both" "side": "both"
},
{
"source": "modrinth",
"slug": "numismatics",
"versionId": "guON3qvQ",
"version": "1.0.20+neoforge-mc1.21.1",
"path": "mods/CreateNumismatics-1.0.20+neoforge-mc1.21.1.jar",
"url": "https://cdn.modrinth.com/data/Jdbbtt0i/versions/guON3qvQ/CreateNumismatics-1.0.20%2Bneoforge-mc1.21.1.jar",
"sha1": "9883bfd6fef5bd5068f9174ddccba5047849c922",
"size": 693446,
"side": "both"
},
{
"source": "modrinth",
"slug": "patchouli",
"versionId": "BIogJv2D",
"version": "1.21.1-93-neoforge",
"path": "mods/Patchouli-1.21.1-93-NEOFORGE.jar",
"url": "https://cdn.modrinth.com/data/nU0bVIaL/versions/BIogJv2D/Patchouli-1.21.1-93-NEOFORGE.jar",
"sha1": "5413bb9b8fc35ebe46b06b48bf9afafbd8471140",
"size": 646777,
"side": "both"
} }
], ],
"defaultServer": { "defaultServer": {