
TrialChamberPro
Because Trial Chambers deserve better than being a "one and done" dungeon.
1.7K
20
Список изменений
1.4.1 - 2026-04-29
Fixed
- Auto-discovery now merges adjacent chamber regions instead of double-registering them. The previous flow registered every BFS result as a fresh chamber and only short-circuited if the candidate's center fell inside an existing AABB. Two physically distinct vanilla chambers ~500 blocks apart, or a single physical chamber whose two halves seeded discovery from different chunks, would happily produce two side-by-side
auto_world_*entries (the user-reported case:auto_world_851_747+auto_world_891_765registered in the same millisecond, ~40 blocks apart on the X axis). New behavior: after BFS produces a candidate AABB,ChamberDiscoveryManagerscans cached chambers in the same world for any whose AABB sits withindiscovery.merge-distance-blocks(Chebyshev edge-to-edge, default 250) of the candidate. If found, the existing chamber's bounds are unioned with the candidate via the newChamberManager.updateBounds(...), the chamber is rescanned to absorb the new vaults/spawners, and (ifdiscovery.auto-snapshotis enabled) the snapshot is regenerated. If not found, registration proceeds as before. Newdiscovery.max-merged-volume(default 1,500,000 blocks) caps how far a runaway daisy-chain can grow so a pathological geometry can't swallow large regions into a single logical chamber. Setdiscovery.merge-distance-blocks: -1to disable merging entirely and restore the v1.2.25 behavior. - Discovery registration race closed. Two near-simultaneous BFS results (typical during the startup sweep) could both pass the existing-chamber check before either committed — the merge logic above wouldn't help if both registrations were already in flight. New
kotlinx.coroutines.sync.MutexinChamberDiscoveryManagerserializes the entire registration step (mutex acquisition → cache scan → merge-or-create → mark processed). Throughput cost is zero in practice — registration fires at most a handful of times per session and is gated by the chunk-load / startup-sweep cadence anyway.
Changed — UX & GUI
- Main menu flattened —
SettingsMenuViewremoved. The previous "Settings → Plugin Settings → Global Settings" path had two papercut bugs: clicking "Settings" on the main menu opened a "Plugin Settings" hub whose only meaningful contents (Global Settings, Protection Settings, Performance Info, Reload Configuration) could just as well live one level up; and the back button on Protection Settings landed on Plugin Settings instead of the main menu, leaving the user one step deeper than they started. New main menu is a 6-row layout: Chambers / Loot Tables / Global Settings / Protection Settings on row 1, Help / Performance Info / Statistics on row 2, Reload Configuration centered on row 4 (shift-click to fire so accidental clicks don't reload), Close on row 5.SettingsMenuView.ktdeleted;Screen.SETTINGS_MENUandMenuService.openSettingsMenuremoved; back-button destinations inGlobalSettingsViewandProtectionMenuViewupdated fromgui.common.dest-settings→gui.common.dest-main-menu.gui.settings-menu.*keys deleted frommessages.yml;gui.main-menu.settings-name/lorerenamedglobal-settings-name/lore; newperformance-name/loreandreload-name/lorekeys added undergui.main-menu.CustomMobProviderView's back button still usesdest-settingsbecause it goes back to chamber settings, not the deleted plugin-settings hub. - Loot editor now shows the effective drop rate per item. The Amount/Chance/Rolls model is technically accurate but genuinely confusing: a user looking at "Amount: 2-4" + "Chance: 20%" tends to read that as "20% chance of getting 2-4 of this item per opening", and the separate "Rolls: 1-3" tile multiplies the per-draw probability without making that visually obvious on the items themselves. Each item lore now includes a new
Expected: ≈X per vault openingline computed asavg(draws) × (weight / totalWeight) × avg(amount)for weighted items, andavg(amount)for guaranteed items (which always drop once per opening). Adaptive precision: ≥10 → integer, ≥1 → one decimal, <1 → two decimals (so a 1-in-50 tier item still reads≈0.02rather than rounding to 0). The per-item "Chance: X%" line is now suffixed with " per draw" to make the relationship explicit. The "Rolls Configuration" tile is renamed "Draws per Opening" and its lore opens with three plain-English lines explaining that each opening picks N items from the weighted list, each draw chooses one item using its chance, and more draws = more total loot. Bumping the draws slider visibly recomputes every Expected line in real time so the multiplicative relationship becomes self-evident. Pure presentation change —loot.ymldata model untouched. - Help view rebuilt to mirror
/tcp helpand cover every wired subcommand. Audit foundmobs(v1.3.0) was missing from chat help entirely, and bothmobsandgive(v1.3.1) were missing from the GUI Help view. Two dead chat-help keys (help-procgen,help-teleport— subcommands that don't exist) deleted. Chat help reordered into logical groups (Browse → Create → Manage → Loot/Mobs → Players & rewards → Admin) with a comment inTCPCommand.sendHelpnoting the order mirrors the GUI tile grouping so future edits don't drift. Wording tightened onhelp-generate,help-snapshot,help-loot,help-vault,help-key,help-leaderboard,help-info,help-list, andhelp-reloadto drop jargon ("WE wand", "saved var") and uninformative phrases ("Manage snapshots"). GUI Help view re-laid out to a 4 + 4 + 1 tile grid: row 1 overview (Commands / Permissions / About), row 2 gameplay command groups (Chambers / Loot / Vaults & Keys / Stats), row 3 admin & setup command groups (Snapshots / Generate / Custom Mobs / Spawner Presets), row 4 lone Admin Tools tile, row 5 navigation. Newmobs-cmdandgive-cmdtiles cover the previously absent commands. Every tile lore opens with one plain-English sentence describing the group ("Browse and manage existing chambers." / "View or override per-chamber loot." etc.) before listing the actual commands. Thepermissionstile expanded from 5 entries to ~13 organized into Admin / Player / Bypass / Notifications groups.
Localization
- Every text change in this release routes through
messages.yml. NoComponent.text(...)literals introduced anywhere; all new and changed strings are translatable through the existinggui.<view>.*and flat*key system. New keys:discovery-merged,gui.main-menu.global-settings-name/lore,gui.main-menu.performance-name/lore,gui.main-menu.reload-name/lore,gui.loot-editor.item-expected,gui.help-menu.mobs-cmd-name/lore,gui.help-menu.give-cmd-name/lore,help-mobs. Removed keys: every key undergui.settings-menu.*,help-procgen,help-teleport,gui.main-menu.settings-name/lore(renamed). Changed keys:gui.loot-editor.item-chance,gui.loot-editor.rolls-name,gui.loot-editor.rolls-lore,gui.main-menu.protection-name, everygui.help-menu.*lore. The chat-help block inmessages.ymlwas scattered across two locations (lines 152-166 and 225-228); all entries are now consolidated into a single contiguous block in the ordersendHelpemits them.
Added
- Startup schema check for
messages.yml. NewMessagesSchemaValidator(run fromonEnableimmediately afterConfigValidator) loads the JAR-bundledmessages.ymland the user's deployed copy, walks both for leaf keys (filtering outConfigurationSectioncontainers so a parent path doesn't mask a missing leaf), and logs a warning listing every key the bundle defines that the user's file lacks — up to 25 enumerated, then truncated with... and N more. Output includes a 4-step recovery path (rename → restart → port translations) and notes thedebug.skip-messages-schema-check: trueopt-out. Pure log surface — never modifies the user's file, never blocks startup. Motivated by a v1.4.0 user bug report where<missing: gui.loot-table-list.table-name-normal>reached the GUI because the deployedmessages.ymlwas an older copy that predated thegui.loot-table-list.*block; the check would have surfaced that as a console warning at startup.
Config additions
discovery.merge-distance-blocks(default250) — Chebyshev edge-to-edge distance below which two regions are folded into a single chamber. Set to-1to disable merging.discovery.max-merged-volume(default1500000) — hard cap on the post-merge bounding-box volume in blocks. Above this the merge is rejected and the new region is logged as a skip (region debounce still applies).debug.skip-messages-schema-check(defaultfalse) — set totrueto silence the newmessages.ymlschema check. Not recommended; the check is purely informative and the warning means GUI/chat surfaces are showing literal<missing: ...>placeholders.
Файлы
TrialChamberPro-1.4.1.jar(12.55 MiB)
ОсновнойМетаданные
Канал релиза
Release
Номер версии
1.4.1
Загрузчики
FoliaPaperPurpur
Версии игры
1.21.1–1.21.11
Загрузок
3
Дата публикации
3 дн. назад
