Compare commits

..

7 Commits

Author SHA1 Message Date
Matt 03f650ce3b Merge pull request 'pack: v0.40.0 — drop Alex's Mobs + bounty board fix + Numismatics polish' (#81) from feature/v0.40.0-drop-am-polish into main 2026-06-08 17:20:10 +00:00
Matt 35cbd84146 pack: v0.40.0 — drop Alex's Mobs + bounty board fix + Numismatics polish
Drops Alex's Mobs from the pack (105 -> 103 mods total). The 4 AM-mob
bounty entries are replaced with vanilla 1.21.x mob bounties (Breeze,
Bogged, Evoker, Vindicator, Piglin Brute, Ravager).

Bounty board bug fix: KubeJS PlayerEvents.loggedIn now ensures the
daily pool is rolled on first login. Previously the pool only rolled
when a player ran /bns bounty list, so the bounty board screen showed
empty for anyone who'd never typed that command.

/bns tier upgrade now uses combined cash+bank deduction via
NumismaticsBridge.spend (Java). Players who've sold a fortune into
their bank can now spend it on tier upgrades directly.

Every player gets a bound white_card on first login — no more "I need
to craft + bind a card before I can spend at a Vendor block" friction.

bnstoolkit 0.6.2 -> 0.7.0.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-08 17:20:09 +00:00
Matt c9f57dae9e Merge pull request 'pack: v0.39.2 — Adventurer's Journal + smart Back button' (#80) from hotfix/adventurers-journal into main 2026-06-08 16:20:03 +00:00
Matt 83949d63b5 pack: v0.39.2 — Adventurer's Journal + smart Back button
bnstoolkit 0.6.1 -> 0.6.2.

Journal (formerly Quest Log) reworked to be useful: active bounties
with progress bars, current Counting House rates per wealth-token,
owned plots. FTB Quests stays as a separate system (footer line
points players to their Quest Book item).

Back button: opens-from-Hub uses FTB Library's previous-screen
mechanism so Close becomes Back and returns to Hub. NPC-opened
journals (no previous screen) get a regular Close.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-08 16:20:03 +00:00
Matt 68aae5c917 Merge pull request 'pack: v0.39.1 — bnstoolkit 0.6.1 sub-panel sizing hotfix' (#79) from hotfix/sub-panel-sizing into main 2026-06-08 15:51:32 +00:00
Matt 0818fe8eab pack: v0.39.1 — bnstoolkit 0.6.1 sub-panel sizing hotfix
Hub screen showed blank content area: title bar + 3 buttons rendered,
but the status panel in between was empty. Same latent bug affected
every screen with a sub-panel (Tier, Counting House, Bounty, Plot,
Quest Log).

Root cause: FTB Library's Panel.refreshWidgets order is
addWidgets → recurse-into-child-panels.refreshWidgets → alignWidgets.
So when the parent's alignWidgets sets a sub-panel's size, the
sub-panel's children have already aligned themselves using the
sub-panel's pre-size dimensions (0x0). Every Row got setSize(0, 12)
→ invisible.

Fix: size sub-panels BEFORE add() in the parent's addWidgets so the
recursive refreshWidgets sees correct dimensions. Parent's
alignWidgets now only positions the top-level action buttons.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-08 15:50:51 +00:00
Matt f269cc4861 Merge pull request 'pack: v0.39.0 — Counting House + remove Create: Encased' (#78) from feature/v0.39.0-counting-house into main 2026-06-08 15:34:48 +00:00
5 changed files with 30 additions and 28 deletions
@@ -59,12 +59,14 @@ const BOUNTY_POOL = [
{ id: 'b_wither_skel_3', name: 'Slay 3 Wither Skeletons', target: 'minecraft:wither_skeleton', count: 3, type: 'kill', reward: 150, source: "Adventurer's Guild" },
{ id: 'b_shulker_3', name: 'Slay 3 Shulkers', target: 'minecraft:shulker', count: 3, type: 'kill', reward: 200, source: "Adventurer's Guild" },
// ── Boss tier (rare picks) ──
// ── Boss tier (rare picks) — all vanilla 1.21.x ──
{ id: 'b_warden_1', name: 'Slay the Warden', target: 'minecraft:warden', count: 1, type: 'kill', reward: 800, source: "Adventurer's Guild" },
{ id: 'b_voidworm_1', name: 'Destroy a Void Worm', target: 'alexsmobs:void_worm', count: 1, type: 'kill', reward: 1200, source: "Adventurer's Guild" },
{ id: 'b_warped_mosco_1', name: 'Slay a Warped Mosco', target: 'alexsmobs:warped_mosco', count: 1, type: 'kill', reward: 700, source: "Adventurer's Guild" },
{ id: 'b_farseer_1', name: 'Slay the Farseer', target: 'alexsmobs:farseer', count: 1, type: 'kill', reward: 900, source: "Adventurer's Guild" },
{ id: 'b_skreecher_1', name: 'Slay a Skreecher', target: 'alexsmobs:skreecher', count: 1, type: 'kill', reward: 400, source: "Adventurer's Guild" },
{ id: 'b_breeze_3', name: 'Hunt 3 Breezes', target: 'minecraft:breeze', count: 3, type: 'kill', reward: 250, source: "Adventurer's Guild" },
{ id: 'b_bogged_5', name: 'Slay 5 Bogged', target: 'minecraft:bogged', count: 5, type: 'kill', reward: 120, source: "Adventurer's Guild" },
{ id: 'b_evoker_2', name: 'Slay 2 Evokers', target: 'minecraft:evoker', count: 2, type: 'kill', reward: 350, source: "Adventurer's Guild" },
{ id: 'b_vindicator_4', name: 'Slay 4 Vindicators', target: 'minecraft:vindicator', count: 4, type: 'kill', reward: 180, source: "Adventurer's Guild" },
{ id: 'b_piglin_brute_2', name: 'Slay 2 Piglin Brutes', target: 'minecraft:piglin_brute', count: 2, type: 'kill', reward: 400, source: "Adventurer's Guild" },
{ id: 'b_ravager_1', name: 'Hunt down a Ravager', target: 'minecraft:ravager', count: 1, type: 'kill', reward: 500, source: "Adventurer's Guild" },
];
// Index pool by id for O(1) lookup
@@ -344,4 +346,14 @@ ServerEvents.commandRegistry(event => {
event.register(bountyCmd);
});
// ─── First-login pool roll ─────────────────────────────────────────
// Without this, new players see an empty Bounty Board until they type
// /bns bounty list (which triggers ensurePoolFresh). The board reads
// bnsBountyPool from NBT; bnsBountyPool stays empty until rollDailyPool
// runs. This hook closes the gap so the screen is populated the first
// time it's opened.
PlayerEvents.loggedIn(event => {
ensurePoolFresh(event.player);
});
console.info('[bns/bounty_engine] loaded — ' + BOUNTY_POOL.length + ' bounties in catalogue');
@@ -109,19 +109,20 @@ ServerEvents.commandRegistry(event => {
}
const nextTier = cur + 1;
const nextCfg = bnsTier.config(nextTier);
const balance = countCoins(player);
if (balance < nextCfg.cost) {
// Combined cash+bank deduction via bnstoolkit Java bridge.
// Pulls inventory coins first, then bank for the remainder.
const Bridge = Java.loadClass('uk.sijbers.bnstoolkit.economy.NumismaticsBridge');
const ok = Bridge.spend(player, nextCfg.cost);
if (!ok) {
const cash = countCoins(player);
const bank = Bridge.balanceOf(player);
player.tell(Text.red(
'Upgrade to ' + nextCfg.name + ' costs ' + nextCfg.cost + ' spurs. You have ' + balance + '.'
'Upgrade to ' + nextCfg.name + ' costs ' + nextCfg.cost + ' spurs. ' +
'You have ' + cash + ' cash + ' + bank + ' bank = ' + (cash + bank) + ' total.'
));
return 0;
}
const took = takeCoins(player, nextCfg.cost);
if (took < nextCfg.cost) {
giveCoins(player, took);
player.tell(Text.red('Coin removal failed — refunded. Try again.'));
return 0;
}
// Promote via FTB Ranks
const rankId = TIER_RANK_ID[nextTier];
Utils.server.runCommandSilent('ftbranks add ' + player.username + ' ' + rankId);
Binary file not shown.
Binary file not shown.
+2 -13
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",
"name": "Brass and Sigil",
"version": "0.39.0",
"version": "0.40.0",
"minecraft": "1.21.1",
"loader": {
"type": "neoforge",
"version": "21.1.228"
},
"lockedAt": "2026-06-08T15:30:12Z",
"lockedAt": "2026-06-08T17:18:54Z",
"mods": [
{
"source": "modrinth",
@@ -1054,17 +1054,6 @@
"size": 193381,
"side": "both"
},
{
"source": "modrinth",
"slug": "alexs-mobs(1.21.1)",
"versionId": "KSgki4uc",
"version": "1.22.17",
"path": "mods/alexsmobs-1.22.17.jar",
"url": "https://cdn.modrinth.com/data/EmNhnNnt/versions/KSgki4uc/alexsmobs-1.22.17.jar",
"sha1": "5070e8070f60650d773bfd9f1d031496f8f50259",
"size": 26620546,
"side": "both"
},
{
"source": "modrinth",
"slug": "item-obliterator",