diff --git a/pack/overrides/kubejs/server_scripts/economy/03_bounty_engine.js b/pack/overrides/kubejs/server_scripts/economy/03_bounty_engine.js index e29fb43..625ca63 100644 --- a/pack/overrides/kubejs/server_scripts/economy/03_bounty_engine.js +++ b/pack/overrides/kubejs/server_scripts/economy/03_bounty_engine.js @@ -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) ── - { 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" }, + // ── 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_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'); diff --git a/pack/overrides/kubejs/server_scripts/economy/04_player_commands.js b/pack/overrides/kubejs/server_scripts/economy/04_player_commands.js index 1d5afd8..86b9c5d 100644 --- a/pack/overrides/kubejs/server_scripts/economy/04_player_commands.js +++ b/pack/overrides/kubejs/server_scripts/economy/04_player_commands.js @@ -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); diff --git a/pack/overrides/mods/bnstoolkit-0.6.2.jar b/pack/overrides/mods/bnstoolkit-0.7.0.jar similarity index 85% rename from pack/overrides/mods/bnstoolkit-0.6.2.jar rename to pack/overrides/mods/bnstoolkit-0.7.0.jar index 4fe9e3c..3207bb1 100644 Binary files a/pack/overrides/mods/bnstoolkit-0.6.2.jar and b/pack/overrides/mods/bnstoolkit-0.7.0.jar differ diff --git a/pack/pack.lock.json b/pack/pack.lock.json index f534e5a..af4fbaa 100644 --- a/pack/pack.lock.json +++ b/pack/pack.lock.json @@ -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.2", + "version": "0.40.0", "minecraft": "1.21.1", "loader": { "type": "neoforge", "version": "21.1.228" }, - "lockedAt": "2026-06-08T16:19:08Z", + "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",