Pre-wipe consolidation. After this merges, the worldgen mod set is locked in and the seed pick is unblocked.
bnstoolkit 0.5.0 — village supply/demand
Anti-farm system for spur-paying villager trades. Per-tile (64×64 block) demand pools, lazy refresh, ~150 spurs/hour cap per saturated tile. Kills the 50-librarian-hall exploit; players who want more income must spread halls across distant tiles or diversify professions.
Design details:
World partitioned into 64×64 tiles by integer division of villager position. No POI lookup, no bell dependency.
Each tile has server.persistentData.bnsVillageDemand[dim:tileX:tileZ] storing {item_id: remaining} + lastUpdated.
Per-item caps in VillageDemand.java: paper=20, wheat=25, rotten flesh=15, iron=6, diamond=1, etc.
Refresh: full cap restored over 1 hour real time, computed lazily on each query — no scheduled tick.
When pool is saturated at offer-build time, the trade comes back with uses=maxUses (vanilla "out of stock" UI).
Hook: MerchantOffer.increaseUses() override via subclass. Zero mixins.
Wandering trader: same tracking, uses whatever tile he wandered into.
Perf: microseconds per trade. Idle servers do zero work.
Fits the colonial/mercantile vibe; loot is in line with vanilla bastion/mansion (finite chest pool, naturally balanced by DR and the village supply system).
Verified live
Server restart at 16:26 UTC with bnstoolkit-0.5.0 + Structory + Structory: Towers:
Done (2.984s), port 25565 bound
Both Structory mods loaded
bnstoolkit trade rebalance log (rebalanced trades for profession ...) for every vanilla profession
Zero inner ItemListing ... threw warnings
No ModLoadingException
Test plan tomorrow
Find / spawn a librarian, do 20 paper trades → 21st returns vanilla "out of stock". Wait an hour real time, 21st works again.
Build 2 librarians in same tile, alternate: only ~20 paper trades total before both stocks lock.
Move 64+ blocks away (new tile), build 2 more librarians: each tile has its own 20-trade budget.
Explore and find a Structory ruin or fire watchtower — should feel atmospheric, not loot-piñata
Cross-test: existing /bns sell / /bns bounty / hub UI still work as before
## Summary
Pre-wipe consolidation. After this merges, the worldgen mod set is locked in and the seed pick is unblocked.
### bnstoolkit 0.5.0 — village supply/demand
Anti-farm system for spur-paying villager trades. Per-tile (64×64 block) demand pools, lazy refresh, ~150 spurs/hour cap per saturated tile. Kills the 50-librarian-hall exploit; players who want more income must spread halls across distant tiles or diversify professions.
Design details:
- World partitioned into 64×64 tiles by integer division of villager position. No POI lookup, no bell dependency.
- Each tile has `server.persistentData.bnsVillageDemand[dim:tileX:tileZ]` storing `{item_id: remaining}` + `lastUpdated`.
- Per-item caps in `VillageDemand.java`: paper=20, wheat=25, rotten flesh=15, iron=6, diamond=1, etc.
- Refresh: full cap restored over 1 hour real time, computed lazily on each query — no scheduled tick.
- When pool is saturated at offer-build time, the trade comes back with `uses=maxUses` (vanilla "out of stock" UI).
- Hook: `MerchantOffer.increaseUses()` override via subclass. Zero mixins.
- Wandering trader: same tracking, uses whatever tile he wandered into.
- Perf: microseconds per trade. Idle servers do zero work.
### New worldgen mods (NeoForge 1.21.1)
- **Structory** 1.3.16 — 15 thematic ruins: chapels, graveyards, fire watchtowers, abandoned camps, boats
- **Structory: Towers** 1.0.16 — 21 mid/rare-tier towers: lighthouses, engineer towers, ocean pillars, wizard towers
Fits the colonial/mercantile vibe; loot is in line with vanilla bastion/mansion (finite chest pool, naturally balanced by DR and the village supply system).
### Verified live
Server restart at 16:26 UTC with bnstoolkit-0.5.0 + Structory + Structory: Towers:
- `Done (2.984s)`, port 25565 bound
- Both Structory mods loaded
- bnstoolkit trade rebalance log (rebalanced trades for profession ...) for every vanilla profession
- Zero `inner ItemListing ... threw` warnings
- No `ModLoadingException`
## Test plan tomorrow
- [ ] Find / spawn a librarian, do 20 paper trades → 21st returns vanilla "out of stock". Wait an hour real time, 21st works again.
- [ ] Build 2 librarians in same tile, alternate: only ~20 paper trades total before both stocks lock.
- [ ] Move 64+ blocks away (new tile), build 2 more librarians: each tile has its own 20-trade budget.
- [ ] Explore and find a Structory ruin or fire watchtower — should feel atmospheric, not loot-piñata
- [ ] Cross-test: existing `/bns sell` / `/bns bounty` / hub UI still work as before
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Pre-wipe consolidation. After this, the seed pick is unblocked.
bnstoolkit 0.4.1 → 0.5.0 — village supply/demand throttle
- 64×64 block tiles each have a finite demand pool per cost item
- Spur-paying trades decrement their tile's pool; pool refills over 1
hour real-time (lazy refresh, no scheduled tick, no perf overhead)
- Saturated trades show vanilla "out of stock" in the UI until the
villager restocks AND the tile's demand has refilled
- ~150 spurs/hour cap per tile in a fully-stocked multi-profession hall
- 50-librarian-hall exploit dies; players who want more income must
build halls in distant tiles (overworld logistics) OR diversify
professions (each item type has its own pool)
- Anyone with /bns admin can inspect a tile's state — full picture
lives in server.persistentData.bnsVillageDemand
New worldgen mods (Modrinth — both NeoForge 1.21.1):
- Structory 1.3.16 — 15 small thematic ruins: chapels, graveyards,
fire-watch towers, abandoned camps, boats, outcast huts
- Structory: Towers 1.0.16 — 21 mid/rare-tier towers: lighthouses,
engineer's tower, ocean pillars, wizard towers, end towers
Density assessment (per earlier audit): pack goes from ~52 to ~88
generating structure types. Towers are mostly rare-tier (40-80 chunk
spacing) so they read as discoveries, not clutter. Loot is in line
with vanilla bastion/mansion tier — finite chest pool that the
diminishing-returns sell shop and village supply system already
balance against.
Pack mods: 102 → 104.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Matt
merged commit 8d9c04dc05 into main2026-06-07 16:27:53 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Pre-wipe consolidation. After this merges, the worldgen mod set is locked in and the seed pick is unblocked.
bnstoolkit 0.5.0 — village supply/demand
Anti-farm system for spur-paying villager trades. Per-tile (64×64 block) demand pools, lazy refresh, ~150 spurs/hour cap per saturated tile. Kills the 50-librarian-hall exploit; players who want more income must spread halls across distant tiles or diversify professions.
Design details:
server.persistentData.bnsVillageDemand[dim:tileX:tileZ]storing{item_id: remaining}+lastUpdated.VillageDemand.java: paper=20, wheat=25, rotten flesh=15, iron=6, diamond=1, etc.uses=maxUses(vanilla "out of stock" UI).MerchantOffer.increaseUses()override via subclass. Zero mixins.New worldgen mods (NeoForge 1.21.1)
Fits the colonial/mercantile vibe; loot is in line with vanilla bastion/mansion (finite chest pool, naturally balanced by DR and the village supply system).
Verified live
Server restart at 16:26 UTC with bnstoolkit-0.5.0 + Structory + Structory: Towers:
Done (2.984s), port 25565 boundinner ItemListing ... threwwarningsModLoadingExceptionTest plan tomorrow
/bns sell//bns bounty/ hub UI still work as before🤖 Generated with Claude Code