Compare commits

..

11 Commits

Author SHA1 Message Date
Matt ea2d6ad342 docs: add quest tracking + cancel UX to economy design
Plain command surface for V1 (Phase 3): /quests, /quests info,
/quests cancel. Cheap to ship, works on mobile via the bridge.

Quest Log book item in V2 (Phase 3.5) -- nicer surface, same backend.

Sidebar HUD as V3 later, optional.

Adds a 3-quest active slot cap so cancellation is meaningful:
prevents accept-all/RNG-shop-cancel exploit, makes the cancel
button a real choice. Quest moves to READY frees the slot.

State storage schema documented (per-player JSON with active +
completed/cooldown tracking).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-06 20:50:01 +00:00
Matt 5bd1ace6aa Merge pull request 'docs: economy & quest system design (v0.1)' (#60) from docs/economy-system-design into main 2026-06-06 20:48:13 +00:00
Matt 1af2b9a86f docs: economy & quest system design (v0.1 draft)
Full design for the unified spawn economy:

- Seven themed guild buildings (Adventurer's, Merchant's, Civic,
  Library, Tavern, Foundry, Mint)
- Universal accept → complete → return quest pattern
- Villagers moved fully to spurs with rebalance principles +
  initial price guidance
- Money flow architecture (bounded inflows, scaling sinks)
- Phasing plan (8 phases, each independently shippable)
- Mod stack confirmed (we have everything we need for V1)
- Risk register + open decisions to make before implementation

Status: design, not yet implemented. Phase 0 (spawn skeleton)
is the next concrete deliverable.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-06 20:48:12 +00:00
Matt 678e63497c Merge pull request 'pack: v0.31.2 — proper JEI hide via c:hidden_from_recipe_viewers tag' (#59) from fix/v0.31.2-hidden-from-recipe-viewers-tag into main 2026-06-01 19:48:37 +00:00
Matt 2710dce479 pack: v0.31.2 — proper item hiding via c:hidden_from_recipe_viewers tag
Stop hacking around the problem -- use the standard cross-recipe-
viewer hide convention that both NeoForge and JEI define.

Source-level confirmation:

  mezz/JustEnoughItems @ 1.21.1
    CommonApi/.../api/constants/Tags.java
      HIDDEN_FROM_RECIPE_VIEWERS = c:hidden_from_recipe_viewers

    Library/.../ingredients/IngredientVisibility.java
      isIngredientVisible() calls
      ingredientHelper.isHiddenFromRecipeViewersByTags(typedIngredient)
      -> any item carrying this tag is hidden from JEI.

  neoforged/NeoForge @ 1.21.x
    common/Tags.java
      Tags.Items.HIDDEN_FROM_RECIPE_VIEWERS = c:hidden_from_recipe_viewers
      -> same tag, NeoForge agrees with JEI.

  EMI / REI also respect this tag (common convention).

So the proper modpack-shippable fix is a single datapack file:

  pack/overrides/world/datapacks/bns-fuel/data/c/tags/item/
    hidden_from_recipe_viewers.json
  {
    "replace": false,
    "values": [
      "alexsmobs:shattered_dimensional_carver",
      "alexsmobs:transmutation_table"
    ]
  }

No mod, no KubeJS, no CraftTweaker, no Item Obliterator JEI integration
(which doesn't exist for 1.21.1 NeoForge anyway). Just the tag the
recipe-viewer ecosystem agreed on years ago.

Item Obliterator + Necronomicon stay in the pack for what they actually
deliver on 1.21.1: inventory-pickup block + villager-trade removal +
right-click cancellation. The Capsid recipe override stays too as the
creation block.

The full disable stack now:
  - Tag (this commit)         -> Hidden from JEI / REI / EMI
  - Datapack capsid recipe    -> Can't be created in-world
  - Item Obliterator          -> Can't be picked up / right-clicked
                                 if obtained via /give or creative

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 19:48:36 +00:00
Matt 99aa11c94d Merge pull request 'pack: v0.31.1 — restore Capsid recipe override (Shattered Carver UX fix)' (#58) from fix/v0.31.1-restore-capsid-override into main 2026-06-01 19:34:34 +00:00
Matt 0cd43c8f2d pack: v0.31.1 — restore Capsid recipe override (Shattered Carver)
I removed this datapack override in v0.31.0 on the (incorrect)
assumption that Item Obliterator would also handle Alex's Mobs'
custom capsid_recipes recipe type. It doesn't -- Item Obliterator
intercepts vanilla and some common modded recipes, but the Capsid
uses its own SimpleJsonResourceReloadListener bound to the
"capsid_recipes" folder, and that listener still loaded the
default shipped recipe.

The visible bug: a player could put a regular Dimensional Carver
into a Capsid -- the recipe matched, the Dimensional Carver was
consumed, and the Capsid spat out a Shattered Dimensional Carver.
Item Obliterator then refused the pickup. Net result:
  - Player loses their hard-earned regular Carver
  - Player can never pick up the Shattered one
  - World has an unrecoverable floating item entity

Restore the override at:
  pack/overrides/world/datapacks/bns-fuel/data/alexsmobs/
    capsid_recipes/shattered_dimensional_carver.json

This swaps the recipe's input from `alexsmobs:dimensional_carver` to
`minecraft:barrier`, which is unobtainable in survival. The recipe
loads cleanly but can never match. The Capsid transformation for
the Shattered Carver effectively no longer exists.

Item Obliterator still handles the JEI / creative tab / inventory /
trade removal -- both layers complement each other.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 19:34:33 +00:00
Matt 7acd3f4da8 Merge pull request 'pack: v0.31.0 — Item Obliterator replaces v0.30.x hacks' (#57) from feature/v0.31.0-item-obliterator into main 2026-06-01 19:21:41 +00:00
Matt 1b9e35efea pack: v0.31.0 — replace hacks with Item Obliterator
Replace the v0.30.x ad-hoc disable mechanisms (KubeJS server script,
datapack recipe override, KubeJS client-side JEI hide -- which was
broken on this KubeJS build) with a single proper tool:

  - **Item Obliterator 2.3.0** + dep **Necronomicon API 1.6.0**
    Declarative JSON config to remove items from inventories,
    creative tabs, all recipes (including modded custom recipe
    types), villager trades, and JEI. Exactly the missing capability.

Config: pack/overrides/defaultconfigs/item_obliterator.json5
  Blacklists:
    alexsmobs:transmutation_table
    alexsmobs:shattered_dimensional_carver

Removed (no longer needed):
  - pack/overrides/kubejs/server_scripts/disable_alexsmobs_features.js
    (Item Obliterator handles transmutation_table recipe removal
    and right-click cancel automatically)
  - pack/overrides/world/datapacks/bns-fuel/data/alexsmobs/
      capsid_recipes/shattered_dimensional_carver.json
    (Item Obliterator handles modded recipe removal too)

Both items now correctly:
  - Don't appear in JEI search / item list
  - Don't appear in creative tabs
  - Have no working recipe path
  - Can't be right-clicked / used
  - Get scrubbed from inventories on join

The Void Worm boss + regular Dimensional Carver still work --
nothing else in Alex's Mobs is affected.

Verified live: both mods discovered, Necronomicon read our config
file successfully ("File exists, reading config"), Item Obliterator
loaded with the blacklist.

Note: config schema is v2; v1 configs get overwritten by the mod's
default. Always write configVersion: 2.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 19:21:41 +00:00
Matt f88f6eaaca Merge pull request 'pack: v0.30.4 — drop broken JEI-hide client script' (#56) from fix/v0.30.4-drop-broken-jei-hide into main 2026-06-01 19:15:19 +00:00
Matt 3912ec541d pack: v0.30.4 — drop the broken JEI-hide client script
The hide_disabled_items.js client script I added in v0.30.3 used
`JEIEvents.hideItems(...)` -- a namespace that does NOT exist in
KubeJS 2101.7.2 on NeoForge 1.21.1. There is no kubejs-jei bridge
mod for 1.21.1 NeoForge published on Modrinth at this time.

Client launchers were showing:
  KubeJS client script errors
  hide_disabled_items.js#8
  ReferenceError: \"JEIEvents\" is not defined.

Removing the script entirely. The Shattered Dimensional Carver
still:
  - Cannot be produced (Capsid recipe override with barrier input)
  - Does nothing on use (server-side right-click cancel)

Tradeoff: the item will still appear as a recipe-less entry in JEI
search if players type its name. Cosmetic only; no gameplay path
to obtain or use it.

If a JEI-hide approach becomes available in a future KubeJS update
or via a new bridge mod, we can revisit.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-01 19:15:19 +00:00
6 changed files with 382 additions and 45 deletions
+320
View File
@@ -0,0 +1,320 @@
# Brass and Sigil — Economy & Quest System Design
> Status: design draft (v0.1). Not yet implemented.
> Owner: matt
> Last updated: 2026-06-06
---
## 1. Goals
- **One unified currency** — spurs (Numismatics).
- **Multiple ways to earn, each one bounded.** No infinite money printer.
- **Multiple sinks that scale with progression.** Money disappears as you advance, so wealth never dwarfs the cost of new ambitions.
- **Spatial design that gives spawn personality.** Themed guild buildings, each with a clear purpose, each tied to the same wallet.
- **Forward-compat with a proper quest line** via FTB Quests, while supporting daily/repeatable activities at spawn.
- **Anti-automation by design**, not by patches.
---
## 2. Core architecture
```
┌────── MONEY IN (bounded) ──────┐
│ │
Adventurer's Guild — Daily bounties (cooldowns, scaling)
Merchant's Bazaar — Sell shop (fixed + DR), dynamic exchange
Mint — Capped emerald → spur conversion *
First-time milestones — One-shot per player
FTB Quests — Progression milestone payouts
┌───────────────────┐
│ Player wallet │ ← Numismatics
│ (spurs) │
└───────────────────┘
┌────── MONEY OUT (scaling) ──────┐
│ │
Civic Office — Plot claim costs (FTB Chunks override)
Civic Office — Tier upgrades (FTB Ranks integration)
Merchant's Bazaar — Player-to-player job board (no minting)
Villagers — Re-priced trades, net sink
Custom services — Warps, sethomes, premium cosmetics
```
\* Only if we keep emeralds; see §5 — we're moving villagers to spurs, which probably retires the Mint as a currency-conversion station and repurposes it as a wallet/info hub.
---
## 3. Spawn — themed guild buildings
Each guild is a destination. The guild's NPC is both the **entry point** (accept work) and **exit point** (return to claim reward). This pattern applies universally — see §4.
| Building | Purpose | Primary mechanics inside |
|---|---|---|
| **Adventurer's Guild** | Combat & exploration | Bounty board (daily mob hunts), boss-kill quests, dungeon-delve quests (future) |
| **Merchant's Bazaar** | Trade & raw-mat economy | Numismatics sell shop, dynamic exchange counter, player-driven job board |
| **Civic Office** | Land & status | Plot claim office, tier upgrades, sethome/warp services |
| **Library / Academy** | Knowledge & magic | FTB Quests anchor NPC, Ars Nouveau themed quests, lore terminals |
| **Tavern** | Social & onboarding | First-time newbie quests, casual NPCs, food/buff vendor |
| **Foundry / Workshop** | Crafting & commissions | Create-themed contracts, crafting orders, raw-material market |
| **Mint** | Currency information | Wallet info, currency tutorial, possibly emerald exchange |
### Forward-compat with a full quest line
The architecture is naturally dual-track:
- **FTB Quests** = the *progression* backbone — chapter-by-chapter pack content, one-time rewards, story arcs. The campaign.
- **Spawn-building NPCs** (Easy NPC + KubeJS) = the *daily/repeatable* layer — bounties, sell shops, services. The live activities.
Both pay into the same wallet. Players run the campaign at their pace and the daily content for income/replay value. They reinforce each other rather than compete.
---
## 4. Quest & bounty flow (universal pattern)
**Core principle:** for any guild, the player **accepts** work from an NPC, **completes** it in the world, then **returns** to that NPC to **turn it in** and claim the reward. No instant payouts. This:
- Anchors guilds as destinations
- Creates risk/reward tension (die on the return, lose the reward)
- Encourages waypoint use and travel
- Lets the server centrally control payouts and detect cheating
### State machine
Each quest, per player, lives in one of these states:
```
AVAILABLE ─[player accepts]─► ACTIVE ─[objective met]─► READY ─[turned in]─► COMPLETED
▲ │
└──────────────────────[cooldown elapses]───────────────────────────────────────────┘
```
- **AVAILABLE** — NPC offers the quest in dialog. Player has no current copy of it.
- **ACTIVE** — Player accepted. KubeJS tracks objective progress via relevant events (`EntityEvents.death` for kills, `ItemEvents.firstRightClicked` for explorations, etc.).
- **READY** — Objective met. Reward is *promised but not yet paid.* NPC dialog now offers a turn-in option.
- **COMPLETED** — Reward paid out. Quest goes on cooldown for this player.
- **AVAILABLE** (again) — after the cooldown, the NPC will offer it again.
### Worked example — daily bounty
1. **Adventurer's Guild NPC** has 5 randomized daily quests (e.g. "Slay 10 Plunderers — 50 spurs").
2. Player right-clicks NPC → Easy NPC dialog → "Accept: Slay 10 Plunderers."
3. KubeJS writes `quest:plunderer_10` to the player's quest state with `count: 0`.
4. Player kills Plunderers in the world. `EntityEvents.death` for `supplementaries:plunderer` increments the count.
5. At count=10, KubeJS flips state to **READY** and notifies the player ("Return to the Adventurer's Guild to claim your reward.").
6. Player returns. Right-click NPC. Easy NPC dialog detects READY state and offers "Turn in: Slay 10 Plunderers."
7. KubeJS pays 50 spurs into the player's Numismatics wallet, flips state to **COMPLETED**, sets cooldown to 24h.
### Universal applicability
The same accept → complete → return pattern works for every guild:
| Guild | Accept | Complete | Return |
|---|---|---|---|
| **Adventurer's** | "Hunt 10 plunderers" | kill them | NPC pays bounty |
| **Merchant's** | "Procure 32 diamonds for our buyer" | gather them | NPC pays inflated price + completes |
| **Civic** | "Survey 5 unclaimed chunks" | walk through them | NPC pays survey fee |
| **Library** | "Recover this lost tome" | find the book in a structure | NPC pays + grants reputation |
| **Foundry** | "Craft 10 Andesite Casings" | craft them | NPC pays commission |
### Player-facing tracking & cancellation
A quest engine that players can't inspect is worthless. The design ships with three layers of visibility:
#### V1 — command-driven (Phase 3, with the engine)
| Command | Effect |
|---|---|
| `/quests` | Lists all of your ACTIVE and READY quests with progress, source guild, and reward |
| `/quests info <id>` | Detail view for one quest — description, objective, progress, reward |
| `/quests cancel <id>` | Drops an active quest, freeing your slot. The quest goes on cooldown as if completed (prevents accept-cancel-accept RNG farming) |
Cheap to ship. Works on mobile via the Telegram bridge. Doesn't require any extra mods.
#### V2 — Quest Log book item (Phase 3.5)
Every new player joins with a **Quest Log** book in their inventory (KubeJS `PlayerEvents.loggedIn` grants it once). Right-click to open. Dynamic Patchouli-style pages list active/ready quests, with a "Cancel" button per quest. Same backend as the `/quests` commands — just a nicer surface.
#### V3 — Sidebar HUD (later)
Optional scoreboard sidebar showing 2-3 most recent quests + progress, always-on. Implemented via vanilla scoreboard objectives driven by KubeJS. Players can toggle on/off via `/quests sidebar`.
### Quest slot limit
Players have a **maximum of 3 active quests at a time.** This is the friction that makes cancel meaningful:
- Forces players to pick which quests they actually want — no "accept all 5, see what's easiest, cancel the rest" RNG-shopping.
- Keeps the state files small.
- Makes ready-to-turn-in queues meaningful (you can hold 3 unrewarded quests in your back pocket).
A quest moving to READY frees the slot for accepting a new one even before turn-in.
### KubeJS implementation sketch
- **State storage:** per-player JSON in `world/data/bns_quests/<uuid>.json`, written via KubeJS persistent-data hooks. Schema:
```json
{
"active": [
{
"id": "advg_plunderer_10",
"acceptedAt": 1717684800,
"progress": 7,
"target": 10,
"rewardSpurs": 50,
"source": "adventurers_guild"
}
],
"completed": {
"advg_plunderer_10": { "cooldownUntil": 1717771200, "completions": 3 }
}
}
```
- **Event tracking:** standard KubeJS event handlers (`EntityEvents.death`, `ItemEvents.pickedUp`, `BlockEvents.broken`) read the player's active quests and increment.
- **Dialog branching:** Easy NPC dialog with conditions that call KubeJS to check quest state and route the dialog appropriately.
- **Reward delivery:** call Numismatics' wallet API to deposit spurs.
- **Commands:** registered via `ServerEvents.commandRegistry` in KubeJS, scoped to the player who runs them.
---
## 5. Villager rebalance
**Decision:** move all villagers to **spurs** (not emeralds). Thematic consistency over preserving vanilla mental model.
**Decision principles:**
- Villagers are **net money sinks** — players spend more on villagers than they earn from them.
- **Useful trades stay** — enchanted books, tools, food, decorative blocks. Reasonable spur prices.
- **Trash trades get deleted** — no one ever wanted to sell rotten flesh or buy paper.
- **Sell-to-villager trades exist but are bad** — `64 wheat → 1 spur`, `16 leather → 1 spur`. Farms still possible, but ~10× slower than any other income source.
### Price guidance (initial calibration — tune via playtesting)
#### Buy-from-villager (player pays spurs)
| Item | Tier-1 | Tier-3 | Tier-5 |
|---|---|---|---|
| Standard enchanted book (random) | 50 spurs | 120 spurs | 250 spurs |
| Mending book | — | — | 800 spurs |
| Diamond tool (unenchanted) | — | 80 spurs | — |
| Diamond tool (enchanted) | — | — | 350 spurs |
| Bookshelf | 15 spurs | — | — |
#### Sell-to-villager (player gets spurs)
| Item | Spurs per unit |
|---|---|
| Wheat | 1 per 64 |
| Paper | 1 per 32 |
| Leather | 1 per 16 |
| Iron ingot | 2 per 1 |
| Diamond | 8 per 1 *(matches sell-shop fixed price — players use whichever is closer)* |
### Scope
~60 trades × 5 profession tiers = ~300 trade entries to redesign. One-time data-design pass, implemented via `ServerEvents.villagerTrades` in KubeJS.
---
## 6. Money inflow sources (detailed)
| Source | Cap / DR mechanism | Rough rate |
|---|---|---|
| **Daily bounties** | Per-player per-quest cooldown (24h) | ~200-500 spurs/day for an active player |
| **Sell shop (fixed price + DR)** | Lifetime sales tracker per player, 10% price drop per 64 sold | ~50-200 spurs/hr while diamond stockpile lasts |
| **Dynamic exchange** | Global supply pool — price drops with sales | Self-balancing |
| **First-time milestones** | One-shot per player (`hasFlag`) | 5-50 spurs per milestone, ~10 milestones total |
| **FTB Quest progression** | One-time per quest | Varies; cluster rewards at chapter completion |
| **Villager sell trades** | Inherently slow + bad prices | ~50 spurs/hr from a serious villager farm |
---
## 7. Money outflow sinks (detailed)
| Sink | Cost curve | Why this scales right |
|---|---|---|
| **Plot claims** | Free up to 9 chunks. 50 spurs/chunk to 25. 200 spurs/chunk beyond. | New players claim free starter areas; ambitious players pay real money |
| **Tier upgrades** | Cumulative cost: 500 → 2k → 8k → 30k spurs | Endgame sink, status display |
| **Buy-from-villager** | See §5 | Constant outflow as you build up |
| **Premium cosmetics** | 100-2k spurs each | Optional sink for cash-flush players |
| **Services** | Sethome: 50 spurs, warp: 25 spurs, /back: 10 spurs | Convenience taxes |
---
## 8. Mod stack (we have what we need)
| Need | Mod | Status |
|---|---|---|
| Currency + wallets + shop blocks | Numismatics | ✅ In pack |
| NPC quest-givers + dialog | Easy NPC | ✅ In pack |
| Quest engine (progression) | FTB Quests | ⏳ Planned, not added |
| Plot claims | FTB Chunks | ✅ In pack |
| Tier system | FTB Ranks | ❓ Not in pack — add when we get to tiers |
| Glue & quest state | KubeJS | ✅ In pack |
**Not adding:** CustomNPCs (Easy NPC covers it), Citizens (Bukkit-only), PMMO (out of scope), generic "quest giver" mods (FTB Quests + KubeJS do it).
---
## 9. Phasing
Each phase is independently shippable. Earlier phases unlock value without depending on later ones.
| Phase | Deliverable | Why this order |
|---|---|---|
| **0** | Spawn skeleton built — 7 guild buildings placed (rough). | Locations have to exist before NPCs can stand in them. |
| **1** | **Merchant's Bazaar V1:** Numismatics sell shop (fixed prices, no DR yet) for diamonds & netherite. | Cheapest to ship, immediate economy unlock. |
| **2** | **Civic Office V1:** Plot claim cost via KubeJS `/ftbchunks claim` override. | Real money sink. Tests FTB Chunks integration depth. |
| **3** | **Adventurer's Guild V1:** Bounty board engine. 5 daily quests, accept→complete→return flow, `/quests` commands, 3-slot cap. | The biggest gameplay feature. Validates the universal quest pattern. |
| **3.5** | Quest Log book item (V2 of tracking surface). | Nicer UX surface on top of the same engine — non-blocking. |
| **4** | **Villager rebalance:** strip vanilla, ship the spur-priced trade table. | Closes the exploit. Big JSON pass. |
| **5** | **Library / Academy:** FTB Quests anchor + first chapter of progression quests. | Long-form content begins. |
| **6** | **Civic Office V2:** FTB Ranks integration + tier upgrades. | Endgame money sink. |
| **7** | **Dynamic exchange rates** (Bazaar V2). | Most engineering, biggest anti-farm payoff, ship last. |
| **8+** | Foundry, Tavern, deeper Library quests, dungeons-with-Lootr. | Beyond V1. |
---
## 10. Risk register
| Risk | Likelihood | Mitigation |
|---|---|---|
| Bounty engine bugs out, players lose progress | Medium | Atomic state writes; logs of every state transition |
| Villager farms still profitable after rebalance | Medium | Track player sell volumes; tune prices in patches |
| KubeJS-EasyNPC dialog branching has limits | Low-Med | Verify hooks in a test world before Phase 3; fall back to command-driven NPCs if needed |
| FTB Chunks `/claim` command override gotchas | Low | Test in dev world; FTB Chunks API is stable |
| Plot cost feels punishing | Med | First 9 chunks free is the safety valve; tune from playtest |
| Players bypass the system via creative / `/give` | Op-only | Document op responsibility; consider audit logs for op spur grants |
---
## 11. Open decisions
These need an actual call before implementation:
1. **Keep emeralds as a secondary collectible?** Or fully retire them now that villagers don't use them?
2. **Sethomes / warps as paid services?** Or free baseline?
3. **PvP bounties** (players posting bounties on other players)? Probably no for V1, revisit later.
4. **Lootr** — add for shared dungeon loot, or skip until structured dungeons exist?
5. **Daily quest count** — start with 5? 8? Refresh window — true daily (00:00 UTC) or per-player 24h?
---
## 12. Implementation notes
- Document each phase's KubeJS scripts under `pack/overrides/kubejs/server_scripts/economy/<phase>.js`
- State data under `world/data/bns_economy/` — readable JSON, easy to debug
- All NPC dialog trees authored in Easy NPC's editor, exported as preset JSONs into `pack/overrides/world/datapacks/bns-fuel/data/easy_npc/`
- Trade table for villager rebalance lives in a single `villager_trades.js` so one file is the source of truth
---
## See also
- `MEMORY.md` entries:
- `project-mc-player-economy.md` — earlier higher-level notes on Numismatics + plot system
- `feedback-kubejs-rhino-gotchas.md` — KubeJS scripting constraints
- `feedback-bns-pack-version-sync.md` — pack version + sync workflow
- Existing tasks #20-#26 — to be reshuffled to mirror the phase plan above
@@ -0,0 +1,31 @@
{
// -----------------------------------------------------------
// Item Obliterator -- Brass and Sigil config
// -----------------------------------------------------------
// Hides + disables specific Alex's Mobs items that we don't
// want in this modpack:
//
// alexsmobs:transmutation_table -- competes with Ars
// and undermines the
// Numismatics economy
//
// alexsmobs:shattered_dimensional_carver -- teleports the
// player 1,000,000
// blocks in a random
// direction, breaks
// world-bounds
//
// Both are removed from inventories, creative tabs, recipes
// (including the Capsid transformation), trades, and JEI.
// -----------------------------------------------------------
"configVersion": 2,
"blacklisted_items": [
"alexsmobs:transmutation_table",
"alexsmobs:shattered_dimensional_carver"
],
"blacklisted_nbt": [],
"only_disable_interactions": [],
"only_disable_attacks": [],
"only_disable_recipes": [],
"use_hashmap_optimizations": false
}
@@ -1,11 +0,0 @@
// Brass and Sigil -- client-side: hide items disabled server-side from JEI
//
// The Shattered Dimensional Carver is disabled on the server (the
// Capsid recipe is overridden to require barriers, and the right-click
// is cancelled). Hiding it from JEI completes the illusion -- players
// don't see a recipe-less ghost item cluttering search.
JEIEvents.hideItems(event => {
event.hide('alexsmobs:shattered_dimensional_carver');
console.info('[bns/hide_disabled_items] hid alexsmobs:shattered_dimensional_carver from JEI');
});
@@ -1,32 +0,0 @@
// Brass and Sigil -- disable specific Alex's Mobs features
//
// 1. Transmutation Table
// Competes with Ars Nouveau's crafting depth and bypasses the
// Numismatics-based player economy by offering free item-to-item
// conversion. Remove the crafting recipe so no one can make one.
// Existing tables (none yet) are left as-is.
//
// 2. Shattered Dimensional Carver
// Teleports the player 1,000,000 blocks in a random direction on
// use. Breaks any server-side world-boundary or chunk-loading
// assumptions, drops the player into an unloaded chunk far from
// anyone else. Cancel right-click on the item so it does nothing.
//
// We can't easily prevent the Capsid-shatters-Carver interaction
// (it is a block contact reaction, not a recipe), so the player
// can still produce the item -- it just won't fire.
ServerEvents.recipes(event => {
event.remove({ output: 'alexsmobs:transmutation_table' });
console.info('[bns/disable_alexsmobs_features] removed transmutation_table crafting recipe');
});
ItemEvents.firstRightClicked('alexsmobs:shattered_dimensional_carver', event => {
event.cancel();
const player = event.player;
if (player && !event.level.isClientSide()) {
player.tell('The Shattered Dimensional Carver is disabled on this server.');
}
});
console.info('[bns/disable_alexsmobs_features] loaded');
@@ -0,0 +1,7 @@
{
"replace": false,
"values": [
"alexsmobs:shattered_dimensional_carver",
"alexsmobs:transmutation_table"
]
}
+24 -2
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", "$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.30.3", "version": "0.31.2",
"minecraft": "1.21.1", "minecraft": "1.21.1",
"loader": { "loader": {
"type": "neoforge", "type": "neoforge",
"version": "21.1.228" "version": "21.1.228"
}, },
"lockedAt": "2026-05-30T21:15:04Z", "lockedAt": "2026-06-01T19:47:31Z",
"mods": [ "mods": [
{ {
"source": "modrinth", "source": "modrinth",
@@ -1075,6 +1075,28 @@
"sha1": "5070e8070f60650d773bfd9f1d031496f8f50259", "sha1": "5070e8070f60650d773bfd9f1d031496f8f50259",
"size": 26620546, "size": 26620546,
"side": "both" "side": "both"
},
{
"source": "modrinth",
"slug": "item-obliterator",
"versionId": "jy3ApWAm",
"version": "2.3.0",
"path": "mods/Item-Obliterator-NeoForge-MC1.21.1-2.3.0.jar",
"url": "https://cdn.modrinth.com/data/3ESR84kR/versions/jy3ApWAm/Item-Obliterator-NeoForge-MC1.21.1-2.3.0.jar",
"sha1": "0cb46a873376d7ded387e175bf30181fcc079c15",
"size": 24037,
"side": "both"
},
{
"source": "modrinth",
"slug": "necronomicon",
"versionId": "4iO8Tbfj",
"version": "1.6.0+1.21",
"path": "mods/Necronomicon-NeoForge-1.6.0+1.21.jar",
"url": "https://cdn.modrinth.com/data/P1Kv5EAO/versions/4iO8Tbfj/Necronomicon-NeoForge-1.6.0%2B1.21.jar",
"sha1": "4d81055810e07a94b68d16ab20ec298ad0d597a0",
"size": 29865,
"side": "both"
} }
], ],
"defaultServer": { "defaultServer": {