Skip to main content

Changelog

Release notes for BTC Studio extensions and plugins.

Each entry lists the extension, its version, the release date, and what changed. Entries are added here as releases are published.

2026-08-12

OmniGUI Extension v0.12

  • Extended menus. extendToPlayerInventory on open_gui turns the player's own 36 slots into four extra menu rows, giving a 10-row canvas. The projection is client-side only: the real inventory is never written to, and it is restored when the menu closes.
  • A root layout whose id ends with _extended enables that projection on its own, so a shared chassis can ship a normal and an extended variant without every menu repeating the flag.
  • DynamicMarkers turns repeated content markers into indexed ones (QUEST_SLOT#0, QUEST_SLOT#1, …) before parsing, so extensions stop each keeping a private copy of those semantics.
  • Slot repetition is bounded and reported: positions outside the grid are dropped and logged with the layout id and the rejected coordinates. The editor warns when count/gap/repeatY are set without a direction, and errors on an unknown one.
  • Documented that gap is a step (1 = adjacent) and that repeatY repeats on the axis perpendicular to direction.
  • Fixed inheritance of mainLayoutId: a blank value on the child used to beat the inherited one, so a page inheriting its whole chassis resolved a non-existent layout and rendered empty — with no button left to receive a click.
  • Slot shadowing has a single owner: when two slots claim one cell, the one that carries behaviour wins, at render and at click, and the collision is logged once.
  • Startup validation now reports only what actually fails. Checks that flagged the absence of optional things were removed — frame.view.unresolved, slot.outOfFrame, layout.unreferenced — because in a template architecture they describe the design, not a defect. What remains names a written intent that failed: a view pointing at a missing layout, a slot leaving the inventory, two slots of the same nature colliding in one layout.

Release v0.12

Shop Extension v1.4

  • Tab mode. baseMenuId makes a shop a tab of a shared menu: its layout pool and views merge underneath the chassis, with views, defaultViewId and a content rectangle (contentX, contentY, contentColumns, contentRows). Left empty, a shop opens exactly as before.
  • Extended chassis support: a shop opened inside an extended shell now gets the 10-row canvas.
  • Added defaultNameFormat and defaultLoreFormat. An item that declares no name or lore inherits the shop's format; an item that declares its own keeps it untouched — the shop format fills gaps, it never overrides an author's wording.
  • Both accept the same tokens: {item}, {buy}, {sell}, {stock}, {stock_max}, {currency}. A lore line asking for an unavailable price is dropped rather than rendered empty.
  • Added ShopTransactionEvent, fired once a purchase or sale completed. It is the seam other extensions plug into — a Discord relay, an audit log — without Shops knowing they exist. Announced, never cancellable.
  • Added notificationWebhookId. Shops does not resolve it and does not know what a webhook is; the id travels on the event. A listener that throws is reported and the transaction stands — nothing undoes a paid purchase.
  • Fixed a layout emptied of its markers being dropped from the pool: a shop screen made entirely of markers, or a still-empty tab, disappeared in silence.

Release v1.4

QuestCodex Extension v2.9

  • The extended-chassis promotion is now carried by inheritance rather than by a literal layout id. A chassis whose root is named anything other than shell_root used to lose its extended chrome, and every control anchored in the bottom band vanished at render — hence unclickable.
  • The extension is built against the GUI engine of the release wave instead of a pinned older jar. It was frozen on v0.11 of the engine, so every addition after that release was invisible to it.

Release v2.9

Discord Extension v0.9 — formerly Community

  • The extension is now Discord, not Community. Directory, package and extension name follow. Entry names are untouched, because pages serialize them.
  • DiscordClientService moved out of the link feature into its own package: chat sync, console and bug reports all use it, so it never belonged to account linking.
  • Webhooks are entries. webhook_definition declares a Discord destination once and references it everywhere. Chat sync, account link and bug reports each used to carry their own copy of the URL, username and avatar — changing channel meant editing every manifest, with nothing guaranteeing they pointed at the same place.
  • WebhookService is a singleton any extension can inject. The HTTP client used to be built by hand in the initializer and handed to each service, so nothing outside could deliver a message.
  • Bug reports lost their second on/off switch: an empty destination is the disabled state.
  • Migration. Pages written before this version are converted on first start: one webhook_definition per distinct destination — manifests configured identically share one entry — and the manifests repointed at it. Every rewritten page is backed up first, under backup/community-webhook-v1/. The conversion is driven by shape, not by a version number, so running it twice changes nothing. A manifest that was switched off keeps its URL on a disabled destination rather than losing it.
  • Shop announcements. shop_notification_manifest describes how a shop transaction reads once it reaches Discord. The destination is deliberately absent from it — it belongs to the shop. One presentation therefore serves every shop while each still posts to its own channel. Requires the Shops extension but does not depend on it.

Release v0.9

Puzzle Extension v0.1 — first release

  • Nine puzzle types, each a Typewriter objective with its own audience, progress and triggers: block pushing, pedestal offerings, memory sequences, lever orders, pattern placement, item frame rotations, combination locks, laser grids and cooperative pressure plates.
  • Everything a puzzle draws is client-side — blocks, ghost previews, highlights and laser beams are sent to the player solving it. Two players can work the same board without seeing each other's progress, and the world is never modified.
  • Shared lifecycle on every puzzle: timeLimit, maxAttempts, cooldownOnFail, resetOnWrong, lifespan, hints, and onStart / onComplete / onFail / onTimeout / onLifespanExpire triggers.
  • isShared switches a puzzle from private progress to one board the whole group advances together.
  • puzzle_chain runs several puzzles in order and fires once the sequence is solved; resetOnFail decides whether a mistake sends the player back to the start.
  • puzzle_artifact persists puzzle state, so a restart mid-attempt does not erase progress.
  • puzzle_solved_fact and puzzle_active_fact expose progress to the rest of your content; puzzle_menu lists puzzles and their state in chat.
  • Folia-safe: every world read and write runs on the region owning the puzzle.

Release v0.1

Corpse Extension v0.1 — first release

  • Corpses are rendered once per viewer, like the engine's own entity displays, so everyone nearby sees them, with model animation and nameplates ticking on the BetterModel, BTC Mob NPC and MythicMobs NPC backends.
  • Runs on Folia: all scheduling goes through a Folia-aware scheduler, and item drops, experience orbs and particles run on the region owning the corpse.
  • The inventory a corpse holds survives a restart, a crash or a reload. Corpses are stored in MySQL when available, otherwise in the plugin folder, and restored on startup.
  • onlyOwnerCanLoot is enforced, and looting is matched against the corpse's own entity id rather than any right-click within four blocks.
  • A corpse definition is picked per death by world and priority, and its lifetime is resolved once, on that corpse.
  • The on_corpse_spawn, on_corpse_loot and on_corpse_expire events go through the engine's trigger pipeline and publish the corpse's owner, loot and position as context.
  • displayName, showDisplayName, dropOnInteract, renderArmor, playDeathAnimation and deathAnimationName are all honoured, and most settings are dynamic values, so they can be driven by placeholders and facts.
  • A client-rendered glow outline with a configurable colour, and corpse sounds sent per nearby player instead of world-wide.
  • has_corpse and corpse_count facts, the corpse_owner_audience audience, corpse_waypoint showing distance and direction to the player's own corpse, corpse_recovery_objective, and corpse_admin_command with list and clear subcommands.
  • A loot protection window, after which a corpse opens to everyone.
  • The loot menu is a GUI Extension menu rather than a bare inventory with its own click listener, so it inherits the engine's click routing, menu history and extended-inventory projection. The GUI Extension is therefore required.

Release v0.1

Custom Biome Extension v0.5

  • Custom biomes exist immediately. A definition is registered into the live registry as soon as it is saved, instead of only after a server restart. The generated datapack is now the persistence layer rather than the only path.
  • Fixed the generated datapack being ignored by the server: its pack format was hardcoded to an old value, and it was written to a folder the server never reads.
  • Fixed baseBiome having no effect other than plains. Biomes are now built from the base biome held by the server and encoded with its own codec, so mob spawns, features and carvers are inherited instead of lost.
  • Fixed biome changes punching holes in the world: refreshing sent chunk unload packets, which the server never followed with a resend. Clients now receive a biome update built from the real chunk data.
  • Fixed leave_biome_event never firing. The enter and leave listeners overwrote each other's state, so the outcome depended on registration order.
  • Fixed painting writing every block of a column instead of one per 4x4x4 cell, and doing it from the calling thread. Writes are now scheduled on the region owning each chunk.
  • A biome that the server would refuse to serialise is now rejected at registration, with the offending value named. Previously it was accepted and then broke every player login.
  • Per-player biome overlays (player_biome_overlay_action): show one player a different biome without touching the world or affecting anyone else.
  • Region painting (paint_biome_region_action) with snapshots, and restore_biome_action to put a region back.
  • biome_transition_cinematic: change the biome a player sees over the course of a cinematic.
  • custom_biome_preset: share colours and visual attributes between biomes, overridden per definition.
  • explore_biome_objective and biome_discovery_fact: quests completed by visiting biomes.
  • Every read entry gained a source option, choosing between what the player is shown and what the world contains.
  • Removed /tw biome setcolor, which created throwaway biomes that were never persisted, and the HASH fact mode, whose value was not stable across restarts.
  • The extension jar dropped from 2.6 MB to 230 KB: it no longer shades libraries the server already provides.

Release v0.5

Enchantment Creator Extension v0.8

  • levelMode on a mechanic compares runOnLevel as an exact level, a minimum (AT_LEAST) or a maximum (AT_MOST). Previously only an exact match was possible.
  • eventPhase runs a mechanic's actions during the current Bukkit event, so cancelling the event or changing the damage actually takes effect. Set it to false for queued Typewriter interactions.
  • clientSideEffects became client-aware, with a client_particle_effect action: the custom BTC artifact uses the PacketEvents-backed renderer when available, the public Paper artifact a player-scoped Bukkit fallback.
  • Registry keys are now derived from id. The previous name is kept as a legacy alias when loading existing pages and items, so nothing has to be re-authored.
  • The public artifact deliberately carries no BTC-CORE or BTC Velocity dependency: it runs on Paper 1.21.x with Java 21, built from JDK 25 targeting Java 21 bytecode.

Release v0.8

Numerical Storage Extension v0.9

  • transactionMode on the transaction config: INTERNAL keeps the PlaceholderAPI plus console command path, VAULT goes through the Vault Economy API directly and ignores amountPlaceholder and the command fields.
  • addCommand and removeCommand were documented backwards. addCommand completes a deposit into storage and is checked before the persistent mutation; removeCommand completes a withdrawal.
  • Persistence is now asynchronous, with per-artifact mutation locks and a short-lived cache, so concurrent deposits can no longer race each other.
  • Storage files move to JSON schema version 2 under a technical artifact path. A legacy file based on the old semantic artifactId is backed up under backups/numericalstorage/ and migrated on first access — back up the Typewriter assets/ directory before upgrading.
  • artifactId is a generated technical identifier: leave it empty and Typewriter fills it in.
  • Placeholders take an explicit definition argument (%typewriter_ns_balance_bank%), which removes the old underscore-splitting ambiguity when a definition ID itself contains underscores.
  • Optional profile-aware keys when the Profiles integration is installed.

Release v0.9

2026-08-07

QuestCodex Extension v2.8

  • Real Minecraft advancements. The new advancement_definition entry writes actual advancements into a datapack the extension owns, so they show up in the vanilla advancement screen with their own tab, tree, frames and toasts. parent references another definition, so the tree is drawn in the node editor.
  • grant_advancement awards an advancement or takes it back, and walks the parent chain so a child is never earned under an unearned parent.
  • autoGrant makes an advancement earned on the player's first tick. On a root, that is what gives its tab an existence before anything has been earned.
  • Quest order fixed: a nested quest reads its order from its own sub-category, quests without an explicit order no longer collapse together, and adding a quest no longer erases the order it already had.
  • Quest markers are paginated, the sort mode is per player, and multi-tracking survives a reconnection in the order the player chose.

Release v2.8

OmniGUI Extension v0.11

  • Item tooltips, with a hideVanillaItemStats switch on the GUI config entry.
  • A paginated layout can carry a page indicator, through the new INDICATOR role.
  • Menus are validated when the server starts: a slot out of bounds, a missing template or an unknown button type is named in the console before a player ever opens the menu.
  • <shift:N> resolves without CraftEngine, through the bundled Magic Digit font.
  • count and repeatY are documented as slot repetition counts, not stack sizes.

Release v0.11

Shop Extension v1.3

  • A shop can no longer take a player below zero. Three independent paths allowed it.
  • An unreadable balance is no longer read as zero, and formatted balances such as 12.5k are parsed.

Release v1.3

2026-08-03

QuestCodex Extension v2.7

  • Added waypoint display modes: WORLD_DIRECTIONAL projects markers onto a sphere around the player's eyes along the true direction of their destination, TARGET_ANCHORED places them on the target, and ADAPTIVE eases between the two. HUD_LOCKED remains the default, so existing pages are unchanged.
  • Added constant apparent sizing and angular decluttering so several markers stay readable when their destinations share a line of sight.
  • Added multi-target rendering to a single waypoint entry, with the new ALL and ONE_PER_QUEST tracked-objective selections and a maxTargets cap.
  • Fixed multi-tracking being ignored by waypoints: objectives of secondary tracked quests were never resolved, so only the primary quest produced a marker.
  • Added quest_codex_locator_bar, rendering the same resolved targets as vanilla locator bar dots on Minecraft 1.21.6+ without spawning any entity.

Release v2.7

2026-08-02

QuestCodex Extension v2.6

  • Added persistent recovery for interrupted Typewriter dialogues and cinematics, including the latest cinematic frame. Recovery now preserves the captured snapshot when Typewriter emits teardown events after a player disconnects.
  • Added persistent multi-quest tracking with a tracked-quests menu, dedicated placeholders, and a public two-quest waypoint fixture.
  • Added text-only client-side waypoints with configurable icon text, centered block displays, centered beacon rotation, level target alignment, smooth interpolation, near-target placement, and a configurable horizontal visibility cone.
  • Removed the legacy item-display and directional-arrow waypoint layers before their first public deployment.

Release v2.6

OmniGUI Extension v0.10

  • Added Flex and Composite layout engines for responsive slot placement and composited menu layers.
  • Added reusable addressable views with inherited layout pools, default views, breadcrumbs, view tags, and optional history integration.
  • Added view-aware schema migration and QuestCodex integration, plus Maven publication metadata.
  • Fixed view switches to rebuild menus without close/reopen flicker and made inventory closing Folia-safe.

Release v0.10

Shop Extension v1.2

  • Rebuilt and validated the public Shop Extension against OmniGUI v0.10.
  • Preserved the existing dynamic shop layouts, navigation history, filler handling, stock and limit rules, and custom shop-button handlers.
  • No migration is required from Shop Extension v1.1.

Release v1.2

MythicMobsNPC Extension v0.4.6

  • Fixed a scale change being ignored on a model that ships without any animation, the same way as the BetterModel extension.
  • Vanilla mob variants (cat, fox, wolf, villager and the like) are reported once in the console rather than silently ignored: those belong to the MythicMobs configuration, which owns the mob's identity and would overwrite them on every respawn.
  • Fixed a single failing data entry cancelling every other entry sent in the same batch, which could leave an NPC with none of its configured data applied.
  • The glowing effect and equipment are now driven on the model, not only on the mob. The mob's body is hidden behind the model, so setting them on the mob alone left nothing visible.
  • Equipment now reports in the console when the model has no item bone, instead of doing nothing silently.
  • Fire is re-asserted every second so it no longer burns out on its own, and it now says when BetterModel is hiding the body the flames are drawn on.
  • Fixed the nameplate stuttering when the NPC walks or follows a road network: the text display now interpolates between updates instead of teleporting in steps.

BetterModel Extension v1.3

  • Fixed the model scale being ignored on models that ship without any animation. BetterModel only recomputes a model's transformation while an animation is running, so a scale change applied at runtime never reached a static model. The extension now forces the recompute itself.
  • The same fix applies to the model offset, which went through the same code path.
  • Entity data entries now actually reach the model instead of being dropped. Supported: glowing effect, potion effect colour (rendered as an item tint), brightness, billboard constraint, interpolation duration, translation, 3D scale, box size, equipment and on fire.
  • Added bettermodel_bone_appearance, a per-bone version of the glow, tint, glint and brightness settings, with the same criteria system as bettermodel_bone_visibility.
  • Equipment maps onto BetterModel's hand and head item bones. Armour slots are reported once in the console rather than silently ignored, because a model's torso and legs carry its own geometry.
  • A 3D scale that is not uniform now warns instead of silently using a single axis: BetterModel only supports a uniform scale.
  • Any data entry that has no meaning on a 3D model (poses, mob variants, breeding state...) is now reported once in the console instead of being discarded in silence.
  • Glow, tint, brightness, billboard, translation and equipment now survive a resource pack reload or a respawn instead of reverting to the model's default look.
  • Equipment now reports in the console when the model has no bone tagged ri, li or ph, instead of doing nothing silently — that is the usual reason an item does not show up.
  • Fire is now drawn on the NPC's interaction entity rather than on the model bones: the client scales the flame to the entity's bounding box, and a display entity has none, so the flames were rendered at zero size.

Nexo Extension v1.0

  • Added facts to check what the player is holding, carrying in their inventory, looking at or standing on.
  • Added variables giving the ID and the properties of the targeted item, block and furniture.
  • Added a give and a remove item action, both working from the Nexo item ID.
  • Added item pickup, drop and consume events.
  • Added interact and damage events for custom blocks and furniture, plus a loot drop event.
  • Events now pass their data (block ID, position, item in hand) to whatever runs next, so a dialogue or an action can use them directly.

CraftEngine Extension v1.0

  • Quest objectives now work. They can be attached to a quest, they save progress, and they can trigger a sequence on completion.
  • Added facts for cooldowns, for held and carried items, and for the block or furniture the player targets.
  • Added variables giving IDs, item properties and the list of loaded content.
  • Added a give and a remove item action, both working from the CraftEngine item ID.
  • Added item pickup, drop and consume events.
  • Added events for placement attempts and for hitting furniture.
  • Events now pass their data to whatever runs next.

ItemsAdder Extension v1.0

  • Block and furniture events now read ItemsAdder directly instead of guessing from vanilla events, which makes them reliable and removes a short delay that could miss or repeat a trigger.
  • Added facts for held and carried items, remaining uses, custom durability, HUD visibility and crop growth.
  • Added variables giving IDs, item properties and font images.
  • Added a give and a remove item action, both working from the ItemsAdder item ID.
  • Added item pickup, drop and consume events.
  • Added interact events, a pre-placement event for furniture, and a custom entity death event.
  • Events now pass their data to whatever runs next.

2026-07-26

QuestCodex Extension v2.5

  • Added persistent multi-quest tracking through the quest_codex_tracking_artifact entry.
  • Added the @tracked category menu mode and TRACKED_QUEST_SLOT dynamic markers.
  • Added /tw codex tracked and the internal codex:tracked GUI command.
  • Added PlaceholderAPI placeholders for tracked quest count, limit, primary quest, indexed tracked quests, statuses, objectives, and priorities.
  • Documented the public page bundle layout: main manifest, static tracking artifact, quest definitions, and GUI settings.

OmniGUI Extension v0.9

  • Added automatic public-page schema migration for inline storage and legacy pagination fields.
  • Documented the compact storagePool / storageId and navigationButtons schema used to reduce Typewriter editor publication freezes.
  • Clarified the recommended referenced-menu pattern for large QuestCodex menus.