Changelog

Every release, in order.

Conduit follows SemVer with a +mcXX.X.X suffix marking the Minecraft build each release compiled against. While in 0.x, the minor number is the breaking-change signal.

  1. 0.11.0 +mc26.1.2 2026-06

    Flight primitive for custom flying craft — and a steadier abduction beam.

    • Added conduit-mob Flight — a hand-driven flight-stepping primitive for craft that move by direct repositioning instead of pathfinding (UFOs, drones, flying bosses). It caps each step, turns the craft to face its travel, and zeroes velocity to avoid the double-step a LivingEntity's own travel() would otherwise add — pair it with noPhysics + noGravity + per-tick tracking for smooth, client-interpolated flight.
    • Fixed The abduction Ufo beam no longer resizes as the ship departs: once the captive is aboard, the beam locks to a short fixed length and simply follows the ship instead of rescaling from the captive's jittery position.
  2. 0.10.22 +mc26.1.2 2026-06

    UFO actually flies off now — and the captive is lifted smoothly.

    • Fixed The saucer hovered in place and never departed, and the abducted creature stuttered + got stuck partway up. Moving a display via the interpolation handler's interpolateTo didn't reliably advance the entity; movement now uses a direct position set (synced by the entity tracker, smoothed client-side over a short window), updates every tick, lifts the captive straight to the ship, and times the hover out so the whole descend → grab → ascend → depart sequence always completes.
  3. 0.10.21 +mc26.1.2 2026-06

    UFO no longer re-inflates each tick — static parts are posed once.

    • Fixed The saucer body appeared to re-grow from a tiny cube every tick: its static parts had their transform re-applied each update, and re-sending the transform's start-interpolation marker for an unchanged transform makes the client re-interpolate the scale up from the 1×1 default. Static parts are now posed once at spawn and never touched again — only the orbiting lights, whose transform actually changes, re-apply. Smoother, and fewer packets.
  4. 0.10.20 +mc26.1.2 2026-06

    Smooth UFO motion — the saucer now glides instead of hard-teleporting each tick.

    • Fixed The abduction Ufo moved in visible per-tick jumps (the blocks appeared to vanish and reappear as it rose) because display entities don't interpolate position by default. Movement now routes through the 26.x InterpolationHandler so the client smoothly slews the ship, beam, and captive between updates; the rise/descent is a touch faster and the beam particle count is trimmed for lighter clients.
  5. 0.10.19 +mc26.1.2 2026-06

    Animated abduction UFO — a flying saucer that descends, beams, and lifts a target into the sky.

    • Added Ufo (conduit-mob) — a self-contained "custom model + animation" built entirely from vanilla display entities, no model library required. Ufo.abduct(level, ground, target) spawns a saucer rig — disc body, glowing belly, glass dome, four orbiting rim lights — high above a point, then a single scheduler task drives a descend → beam → abduct → ascend → depart state machine: the ship spins (each part bakes its offset/scale/spin into a transform the client smoothly tweens), drops a glowing beam + particle column, lifts the target up into the ship (non-players are taken, players released), climbs away, and cleans every entity up. The first set-piece for the "alien invasion" event.
  6. 0.10.18 +mc26.1.2 2026-06

    Enhanced-mob system runtime-verified end to end; nameplate state accessors.

    • Added The elite/boss mob system is now runtime-verified on a dedicated server: a buffed boss zombie goes 20 → 100 HP at ×1.4 scale and glowing, its MobBadge nameplate is added to the world and follows the mob, the health bar drains live with it (100 → 80 → 60 → 40 → 20), and the nameplate auto-discards the instant the mob dies — buffs, follow, bar, and cleanup all confirmed.
    • Added MobBadge.displayInWorld() and currentText() — introspect a live nameplate (whether its entity is in the world, and its current rendered text).
  7. 0.10.17 +mc26.1.2 2026-06

    Elite & boss mobs — removable stat buffs, a following health bar, and the first entity-attached animation support.

    • Added MobBuff (conduit-mob) — a named, declarative, removable stat-buff bundle (the improved successor to permanent base-value scaling). Stable-id attribute modifiers are applied idempotently — re-applying updates in place instead of stacking — and stripped cleanly on remove. A fluent builder covers health, speed, damage, scale (visible size), armor, knockback resistance, attack knockback and follow range, as percent or flat, plus a glow flag; MobBuff.elite() and MobBuff.boss() presets ship out of the box.
    • Added MobBadge — a floating nameplate that follows the mob (the engine's first entity-follow display — everything before was fixed-position). A vanilla billboard text display, re-positioned each tick, shows the name, a live unicode health bar that shades green → yellow → red as the mob is whittled down, and the buff's ability lines — and it auto-cleans the moment the mob dies.
    • Added MobAnimations — general display-transform animation helpers (scale-in pop, interpolated scale) over vanilla interpolation: the engine's first entity-attached animation support, reusable for any animated rig. Mobs.enhance(mob, buff, name) wires a buff and its nameplate together in one call.
  8. 0.10.16 +mc26.1.2 2026-06

    Mob-feature hardening — bad prefabs degrade gracefully, runaway spawns can't take the server down.

    • Changed Prefab loads now isolate per-element failures — one bad id (a typo'd mob-spawn entity, an unknown block in a block-list or volume) is skipped and logged instead of aborting the whole prefab and leaving a half-built scene behind.
    • Changed Authored mob-spawns are clamped (count ≤ 256, radius ≤ 128) so a typo or runaway count can't freeze the server, and they preserve the authored Y — an elevated-platform spawn point spawns on the platform, not on the terrain far below.
    • Changed MobWave gained an absolute 30-minute lifetime backstop so a wave left fully unbounded can't leak a forever-spawning loop, and conduit-mob drops every active wave on server stop so the registry can't carry stale waves into the next world.
  9. 0.10.15 +mc26.1.2 2026-06

    Mob waves — capped, interval-paced spawning for big scheduled events.

    • Added MobWave (conduit-mob) — the runtime primitive a Blood Moon's "hundreds of mobs" or an alien invasion is built on. A fluent builder spawns batches around a re-evaluated anchor (so it can follow a player), every N ticks, up to a live concurrent cap and an overall total, for a bounded duration — counting only still-alive mobs against the cap, and defaulting to persistent spawns so event mobs don't despawn mid-event. cancel(discardLiving) ends a wave and can sweep its survivors when the event is over.
    • Added A single MobWaves driver advances every active wave from one server-tick listener (CopyOnWriteArrayList-backed, wrapped in TickBudget so a runaway wave shows up in the logs) and drops finished ones — waves don't each register their own hook.
  10. 0.10.14 +mc26.1.2 2026-06

    Mobs become first-class — a runtime spawning + buffing layer, plus authorable spawn points you can place in Conduit Studio.

    • Added conduit-mob module — the runtime layer chaos / event mods build their spawns on, so no mod re-writes the same vanilla boilerplate. MobSpawns.spawnAround(...) scatters entities on the surface in an annulus (heightmap ground-snap, random yaw) and returns what it added; spawnAt(...) places at an exact Y for arena / authored points.
    • Added MobBuffs — "upgraded mob" helpers: scaleHealth (tops up to the new max), scaleSpeed, scaleDamage, empower, and equip(mob, slot, stack) with drop chance pinned to zero. Every attribute scale is null-guarded, so a blanket buff sweeps a mixed wave safely — a creeper, which has no attack-damage attribute, just passes through.
    • Added mob-spawn prefab element — a named, authorable spawn point. Like a zone it is a descriptor, not an action: instantiating the prefab spawns nothing; the engine exposes it via Scene.mobSpawns() and the consuming game (or conduit-mob's executor) fires it on demand, so nothing duplicates on /reload.
    • Added Conduit Studio entity authoring — place, configure, and see mob-spawn points in the editor (marker + scatter-radius ring, entity-id autocomplete, count / radius fields), round-tripped through the same one-funnel edit + validation path as every other element. Closes the editor's geometry-only gap.
  11. 0.10.13 +mc26.1.2 2026-06

    Rewind — a live, full-fidelity time machine for matches: pause, scrub back to any earlier moment, and resume play from there.

    • Added conduit-rewind module — a host arms a recording of a running match, then can pause the game, scrub back to any earlier moment (players, blocks, entities, and scores all snap back), and resume play from there — a real do-over. It restores state, never replays behaviour (Minecraft isn't deterministic), so the recording is only ever read backwards.
    • Added Capture is per-subsystem: per-tick player poses + inventory keyframes; a LevelChunk.setBlockState block-write journal restored by minimal diff; an entity ledger (spawn/remove + spawn NBT + transform samples + state keyframes) over the modern ValueInput/ValueOutput NBT system. Coverage is full up to rewind_memory_cap_mb, with logged eviction beyond it.
    • Added Pause freezes entity ticking and locks players behind a PAUSED overlay, with a boss-bar scrub timeline tracking the preview head. The full command tree — /conduit rewind arm|pause|resume|back|step|to|commit|cancel|mark|status|save|… — is gated by conduit.rewind.control. A SnapshotSlice SPI rewinds custom game state; arena ships MatchRewind.bind so Match scores rewind too.
    • Added At match end the host is prompted to save a durable match record (summary + event-marker timeline) under <world>/conduit_rewind/.
    • Added MatchCompletedEvent (arena) — fired on the bus from Match.finish; the completion signal a tournament / Season runner (and stats / announcers) consume.
    • Added WorldNpc + Hologram (render) — frozen, vanilla-rendered character NPC figures (armor-stand-backed with equipment, glow, slow spin) for hub guards / doll / front-man, and a fluent handle-based floating label over ServerLabelManager. Plus Hud.sidebar (fx), a framed MCC-style scoreboard preset.
    • Fixed Duplicate / static hub pad displays. A mid-session autosave persisted the arc-lobby pad Display entities, so saved copies reloaded as static leftovers beside the freshly-spawned animated set. HubManager.buildArcLobby now force-loads the room chunks and sweeps any pre-existing displays before spawning fresh ones.
  12. 0.10.2 +mc26.1.2 2026-06

    Operator console + leaderboards — see and rank what the server is doing.

    • Added /conduit leaderboard <stat> [count] — prints the top players by any ProfileStore counter (wins, games_played, points_total, …) in chat, with online-name resolution and stat-name suggestions.
    • Added /conduit admin instances (op-gated) — lists every live game instance with its dimension, template, player count, and callback-fault count, so a stuck instance is one command away instead of a log dig.
    • Added /conduit admin metrics (op-gated) — dumps the new Metrics registry, a process-lifetime counter set the engine bumps at known hotspots (player.leaves, phase.stuck, callback.faults).
  13. 0.10.1 +mc26.1.2 2026-06

    Quality & reliability pass — persistent player stats, achievements, stuck-phase recovery, and crash isolation.

    • Added ProfileStore (core) — durable, cross-game player profiles: schema-free counters (wins, games_played, points_total…) + attributes, persisted on the overworld via SavedData. increment / set / counter / setAttr / attr / top. The keystone for leaderboards, achievements, and match history.
    • Added Achievements (core) + AchievementToast (fx) — declarative unlock triggers on profile counters ("First Win!" when wins ≥ 1), persisted as ach.<id> attributes so they never re-fire, with a gold title-card + chime presentation wired through a callback handoff.
    • Added MatchResult + MatchHistorySavedData (arena) — snapshot a finished Match (winner / standings / points); commitTo() folds the outcome into ProfileStore, and a capped 50-entry ring buffer keeps recent results queryable.
    • Added PhaseFlow timeouts + PhaseWatchdog + TimedPhaseFlow (arena) — per-phase deadlines that auto-advance a stuck phase (an AFK host in the lobby, a missed transition) and log/alert on every recovery, so one wedged instance can't hang forever on a live stream.
    • Added GuardedDispatch + FaultPolicy (arena) — an exception-isolation barrier around game-supplied callbacks. One throwing onTick or phase callback can no longer kill the server tick or leave a half-applied phase; Game.faultPolicy() can escalate to a clean teardown.
    • Added Effect choreography (fx) — Particles (burst / ring / elimination / safe macros), FxTimeline (a self-ticking at / after / repeat sequencer), EffectThrottle (per-key cooldown gate), and ScoreBoardBinding + arena MatchScoreboard for a live standings HUD.
    • Added PlayerLifecycle (core) — one engine-wide disconnect fan-out that auto-prunes transient per-player state (game state, inventory stash, sidebar, bossbars, spectator) so long-running servers stop leaking as players churn. SpectatorManager gained a SpectatorListener observer seam.
    • Fixed Thread-safety on the player-state, inventory-stash, sidebar, bossbar, and spectator maps (now ConcurrentHashMap), plus a Sidebar.show sub-list aliasing bug — issues surfaced by a full-engine code survey.
  14. 0.10.0 +mc26.1.2 2026-06

    Vanilla GUI kit grows up — interactive, Minecraft-looking config menus.

    • Added VanillaConfigMenu — declarative config screens: declare a title + ordered list of ConfigEntry and an onChange callback, and the framework compiles a vanilla-themed screen, routes every control click + text submit, applies the standard mutation, fires the callback, and re-renders. Tab strips, automatic pagination, and a per-(player, screen) open registry.
    • Added ConfigEntry sealed types — Toggle / Cycle / Stepper / Slider / Action / Text, each immutable with typed with* helpers the framework calls for you.
    • Added Real Sliders — a recessed track with a raised handle. Click routing goes through the new positional ServerScreenManager.onButtonAt, which carries the click's screen-UV (ButtonClickPayload gained clickU/clickV) so the server resolves the track fraction. Click-to-position (an in-world screen emits a click, not mouse-move), snapped to step.
    • Changed Stateless button chrome is now texturedCycle, the Stepper [−]/[+], Action, Done, Prev/Next render the 9-slice pixel-art vanilla button. Controls whose chrome encodes state stay procedural: the toggle (bevel direction = on/off), tabs (pressed-in = selected), and the slider. The textured border is sized to vanilla's 3px/20px ratio so it reads thin and elegant, not chunky.
    • Changed Pressed / ON buttons darken the whole face uniformly (~18%) on top of the inverted bevel, so an active toggle reads as genuinely pushed into shadow rather than just re-lit.
    • Fixed Button z-fighting on rect-heavy screens (e.g. a scroll list's row backgrounds vs the arrow buttons). Buttons now composite above the per-index rect z band and below the text plane, with their internal layers a tight 0.0005 apart so the black outline no longer parallax-leaks past the fill on an off-axis screen.
  15. 0.9.0 +mc26.1.2 2026-05

    Developer-velocity pass — five reusable primitives so new games stop re-implementing scaffolding.

    • Added SafeTeleport now preloads the destination chunks (to FULL) before the deferred teleport, fixing the land-in-darkness / fall-through-terrain stutter every cross-area teleport hit. New preloadRadius overload + public preloadChunks; default radius 1, NO_PRELOAD to skip.
    • Added GatherRoom (core) — the assemble-everyone-then-send-home lifecycle (meetings, voting rooms, finales): force-loads the room while open, snapshots each player's prior position, stashes inventory, and reverses it all on disperse. Built on SafeTeleport + PlayerInventoryStash.
    • Added ConduitTest (core) — a solo-testing harness: an op-gated test list / test run <scenario> command subtree, a named-scenario registry, and a deterministic fake roster so a whole match can be driven from one client without a lobby.
    • Added Titles (fx) — fullscreen title / subtitle / action-bar cards for one player or a group, with correct packet ordering and tick-based timing.
    • Added Regions (world) — axis-aligned box fills: fill / fillHollow / fillWalls / replace. The geometry every prefab-built arena re-wrote.
  16. 0.8.0 +mc26.1.2 2026-05

    Arena instances go on-demand + handle-based; data-driven dimension specs.

    • Changed conduit-arena's InstanceManager is now on-demand + handle-based, built on RuntimeDimensions — no fixed 8-slot pool. Each acquire spins up a fresh conduit:rt-<n> world; instances are keyed by dimension, not slot.
    • Changed Session routing is String-keyed: SessionRecord.instanceSlot (int) → instanceKey; holdSlotholdInstance, setHoldExpiryHandler now takes the dimension key.
    • Added RuntimeDimensionSpec.fromStem / fromStemJson / fromDatapackStem — define a dimension from a LevelStem, raw JSON, or a datapack-registered stem.
    • Removed ServerLevelSeedMixin + the 8 instance-*.json datapack dimensions — runtime creation sets the seed at construction, so neither is needed.
    • Migration The common consumer path — acquire(server, WorldTemplate.VOID)level()release() — is unchanged. GameInstance.slot()handle() / dimension().
  17. 0.7.0 +mc26.1.2 2026-05

    Persistent runtime worlds — restart recovery.

    • Added A persist=true runtime dimension is recorded to a manifest and recreated on the next server start, loading its existing region data.
    • Changed persist now means restart-survival, not release-survival — release always fully destroys. The boot orphan sweep is manifest-aware (keeps restored worlds).
  18. 0.6.0 +mc26.1.2 2026-05

    On-demand runtime dimensions.

    • Added New conduit-instance module — create a fresh world per match and tear it down when it ends, instead of claiming from a fixed pool.
    • Added RuntimeDimensions.create / release, RuntimeDimensionSpec (voidWorld / copyOf builders, persist flag), RuntimeDimensionHandle.
    • Added Crash-orphan sweep on server start; force-release of all runtime dimensions on shutdown.
  19. 0.5.0 +mc26.1.2 2026-05

    Spectator mode simplified to vanilla SPECTATOR.

    • Changed SpectatorManager now uses vanilla GameType.SPECTATOR instead of the ADVENTURE + flight + invisibility + scoreboard-team model. Vanilla SPECTATOR natively blocks pickup / drop / use / attack and cancels damage.
    • Removed TEAM_NAME constant + the internal ability / team helpers.
    • Migration Consumers that relied on dead players being ADVENTURE must adapt — that policy moved out of the engine and into the mod.
  20. 0.4.0 +mc26.1.2 2026-05

    Modular split + player session manager.

    • Added The monolithic engine became seven separately-published modules + a conduit aggregator BOM.
    • Added Per-module initializers.
    • Added PlayerSessionManager — disconnect snapshots + reconnect routing with a configurable hold window, persisted across restart.
  21. 0.3.0 +mc26.1.2 2026-05

    Initial stable Minecraft 26.1.2 port.

    • Added First stable MC 26.1.2 port of the pre-modular engine.