/
PreVaultOpenEvent (cancellable, api/events/) — fires immediately before a vault open resolves its loot table, after all gates pass (cooldown, spam-click, key validation). Listeners can cancel the open entirely (no key consumed, no reward marked) or set lootTableOverride to a non-null table id to substitute a different loot table for that specific open. Designed for premium custom-keys / vault-crate workflows where the consumed key dictates the loot tier.ChamberMobSpawnedEvent (api/events/) — fires after a trial-spawner wave mob is spawned and recorded by SpawnerWaveManager. Carries chamber + spawner location + ominous flag + provider id. Fires for both vanilla spawns (providerId = "vanilla") and replacement spawns from custom mob providers. Gives third-party plugins a single hook with full chamber/wave context — what CreatureSpawnEvent doesn't carry. Designed for difficulty-scaling addons, analytics pipelines, and the planned premium "Legendary Trials" module.TCPModule SPI + TCPModuleRegistry (api/) — uniform lifecycle contract for plugins that extend TCP. Implementations register themselves with plugin.moduleRegistry.register(this) during their own onEnable; the registry calls back into onLoad(tcp) once TCP reaches isReady = true (or immediately if TCP was already ready). Modules unregister automatically when their backing plugin is disabled (via PluginDisableEvent observer). Reverse-registration-order shutdown is preserved so modules with cross-dependencies tear down safely. Lifecycle callbacks always dispatch on the primary thread regardless of caller context.jitpack.yml + maven-publish configuration so consumers can declare TCP as a compile-time dependency:
repositories { maven("https://jitpack.io") }
dependencies { compileOnly("com.github.darkstarworks:TrialChamberPro:v1.3.3") }
Compile-time consumers reference classes from the public io.github.darkstarworks.trialChamberPro.api.* package; at runtime the host server has TCP installed as a normal Bukkit plugin so the bundled-deps shadow JAR is inert.TrialChamberPro.onEnable instantiates the module registry synchronously (right after the scheduler), so external plugins can register modules before TCP's async startup completes. loadAllPending() runs at the end of startup to flush queued registrations. onDisable invokes shutdownAll() first so modules can still touch TCP managers and the database during their own teardown.VaultInteractListener.openVault now fires PreVaultOpenEvent after the loot table is resolved but before any side effect. The event's lootTableOverride (when set) takes priority over chamber overrides and vault defaults; the existing override-resolution chain is unchanged when no listener intervenes.SpawnerWaveListener.onCreatureSpawn fires ChamberMobSpawnedEvent once per recorded spawn — once on the provider-replaced path with the actual provider id, once on the vanilla fallback with providerId = "vanilla". Wild spawners deliver the event with chamber = null.
Because Trial Chambers deserve better than being a "one and done" dungeon.