Skip to main content

Changelog

Release notes for the public BTC Studio extensions. Each release lists the extension, its version and what changed for server owners, newest first, with a link to the release and to the extension documentation.

Paid extensions link to their documentation only; their downloads stay on the store. Private extensions are not listed here.

2026-10-16​

Dungeon v1.2​

Every change is listed in the Dungeon changelog. Nothing changes for an existing dungeon until it uses one of the new fields.

  • Requires GUI (OmniGUI) 0.20: the dungeon leaderboard uses the leaderboard source of GUI 0.20 and does not load with an older GUI. Update GUI first.
  • Shared loot: new Dungeon Loot Table entry, used by chests (lootTableRef) and mobs (lootTable). A chest rolls it once when first opened, a mob when it dies.
  • More chests: additionalLocations places several chests from one Dungeon Loot Chest entry (ignored in a generated dungeon). Loot Chest Trigger gets particleEffect, with separate X, Y and Z axes.
  • Waves and scaling: Dungeon Mob Spawn gets waves, maxSimultaneous, scaling with the number of players (perExtraPlayer, maxCount, playerCountSource), spawnParticle and the triggers onWaveCleared and onCleared. New event On Dungeon Mobs Cleared, to open a door or make a chest appear once every mob is defeated.
  • Restrictions: new Dungeon Restrictions entry (elytra, boat or minecart, ender pearl, chorus fruit, riptide, blocked commands, refusal message, bypass permission), with gameMode, limitInteractions (allowed interactions, protected entities) and messageRepeatDelay. Riptide and chorus fruit are refused at the click. Only the bypass permission exempts a player: an operator has it unless the node is set to false.
  • Statistics: 22 statistics per player, counted by artifact with a total across artifacts: damage dealt and taken (health really lost only), kills, waves and rooms cleared, time played, deaths, records... statsMobScope chooses which mobs count. A death that takes the player out of the run no longer counts as runs_left. New fact dungeon_stat; placeholders dungeon_stat_<key>[_raw], dungeon_total_<key> and dungeon_inst_<id>_<key>; snippets content.dungeon_stats.duration_format and content.dungeon_stats.missing_value.
  • Leaderboard: new dungeon_leaderboard_source entry (LIFETIME or CURRENT_RUN, rankBy, values, durationFormat, decimals) to plug into the source field of a GUI leaderboard.
  • Reconnection: reconnectGrace (2 minutes by default). A disconnected member keeps their place and resumes where they were (sidebar, hidden slots, game mode). Afterwards they leave the run and return to their entry point at the next join.
  • MMOProfiles: the return to the entry point and the original game mode are applied again after the profile is chosen.
  • Menus: the Dungeon Category slot fields unlockedLore and lockedLore are now unlockLore and lockLore. Old pages still read; the new key wins if both are present.
  • API break for addons: DungeonArtifactData, DungeonStats and PlayerDungeonStats moved to the package btcrenaud.dungeons.core, and DungeonArtifactEntry.getPlayerStats and update changed signature. An addon compiled against Dungeon 1.1.x must be recompiled.

Documentation

GUI v0.20​

  • Give the loot back: dropOnClose on a simple layout hands back what the player did not take, or put there, when the menu closes. closeDelivery chooses GIVE_OR_DROP (default: into the inventory, the surplus at the feet) or DROP. Off by default.
  • Random items: rollPerSlot draws a random item once per repeated slot instead of once for all of them, and the new liveItem draws it again at every refresh.
  • Blank name ignored: an item with a blank name keeps its own name instead of showing none.
  • Leaderboard rows from another extension: new source field on gui_leaderboard. The rows come from a source entry, every player online or not, such as the one of Dungeon. Row texts accept {score}, {score_raw} and {value_<key>}. The texts of a source are plain text: a name that looks like a MiniMessage tag, such as <red>, no longer changes the order.

Release v0.20 · Documentation

MythicMobs v0.12​

  • Mobs visible only to some players: spawn_mythicmobs_mob and mythic_spawner have a new visibilityCriteria field. The mob is visible, targetable and damageable only for the players who meet the criteria, re-checked continuously (visibilityRefreshInterval, 1 second by default). A visibilityGroup is now followed live instead of being frozen at the spawn.
  • collidable (spawn_mythicmobs_mob, mythic_spawner, default true): false removes collision and pushing for everybody.
  • Abandonment: spawn_mythicmobs_mob has new abandonRange and abandonDelay fields. The mob is removed when no allowed player stays within range for the delay (abandonRange 0 = off). The web editor pre-fills new durations with 1 second: check abandonDelay.
  • despawn_mythicmobs_mob: new scope field, ALL (default, as before) or VISIBLE_TO_PLAYER (only the mobs the player sees).
  • Protection: all damage tied to a restricted mob (melee, projectiles, MythicMobs skills, fire) is blocked towards players who are not allowed, and the other way round. Projectiles pass through, and the mob drops a target that is not allowed.
  • MythicMobs condition typewritervisible (alias twvisible): add it to skills that deal no damage (potion, throw...), in the targeter (conditions=[ - twvisible true ]) or as a TargetCondition, so they skip the players who cannot see the mob. The extension runs /mm reload once at startup when your MythicMobs files use it.
  • A mob whose source entry is deleted stays hidden from everyone.
  • Limits: collision is all or nothing; skills without damage are not filtered without twvisible; sounds and particles played far from the mob are not hidden.

Release v0.12 · Documentation

Shops v1.12​

  • Rebuilt against GUI 0.20, which it now requires: the previous version does not open its menus with GUI 0.20. Nothing else changes.

Release v1.12 · Documentation

Quest Codex v2.16​

  • Rebuilt against GUI 0.20, which it now requires: the previous version does not open its menus with GUI 0.20. Nothing else changes.

Release v2.16 · Documentation

Corpse v0.7​

  • Rebuilt against GUI 0.20, which it now requires: the previous version does not open its menus with GUI 0.20. Nothing else changes.

Release v0.7 · Documentation

Numerical Storage v0.15​

  • Rebuilt against GUI 0.20, which it now requires: the previous version does not open its menus with GUI 0.20. Nothing else changes.

Release v0.15 · Documentation

2026-10-12​

Dungeon v1.1.1​

  • Paper 26.x, WORLD_PER_RUN: a run could fail with The server did not create world 'dungeon_classic_...'. The copy of the template kept the template's world ID (data/paper/metadata.dat), so the server refused it as a duplicate. The copy now gets its own ID.

Documentation · Dungeon changelog

2026-10-08​

Dungeon v1.1​

A full rework built around runs: isolated worlds, generated dungeons, per-run NPCs and vanilla mobs. Read the migration note before updating from 0.10; every change is listed in the Dungeon changelog.

  • Runs: each run has its own state and journal. Starting a run is all-or-nothing, and the entry cost is refunded if it fails. /tw reload and Publish take running runs back instead of ending them.
  • Isolation: three modes per dungeon (SLIME_CLONE, WORLD_PER_RUN, SHARED_WORLD_SLOTS) or AUTO.
  • Generated dungeons: room templates, connectors, pools, generators and affixes, with an in-game editor for doors and markers.
  • NPCs and mobs: per-run NPCs from any entity definition, shown only to the run's members; vanilla combat mobs spawned once per run, with an alive cap.
  • Texts: every player text is an editable snippet. Paper only.
  • Command replies: every reply of the /tw dungeon commands, admin ones included, is an editable snippet (content.dungeon_command.).
  • Statistics: stored per MMOProfiles profile when that plugin is installed, per player otherwise.
  • Paper 26.x worlds: worlds stored the Paper 26.x way (dimensions/minecraft/<name>) are found for SHARED_WORLD_SLOTS and copied for WORLD_PER_RUN.

Documentation

MythicMobs NPC v5.0​

  • NPCs in dungeons: with ticking off, an NPC placed by Dungeon 1.0 is shown only to the members of its run, and a click gives one interaction to the right player.
  • Bone Visibility Data and Attachment Data are now applied to the NPC model, with ticking on or off, and again after every respawn.
  • Play Animation: force now stops the other animations started by the action on that NPC; a speed of 0 or less plays at normal speed.
  • MythicMob Skill Objective: skillName now works through the MythicMobs mechanic typewriterSkill{name=..} (alias twskill), added to the skill and followed by /mm reload. Progress is stored in fact, and the previous progress is migrated automatically. The mechanic survives a publish from the web editor; after a full stop and start of Typewriter, the console asks for /mm reload.
  • Loot objective: the item and mob names of the loot are readable with their colors (they were technical text before), and the ✔ completion mark is the same as in the other objective extensions.

Documentation

MMOItems v2.4​

  • Advanced Tooltip Config: overrideDefaultLore is now read. When it is off, when the system is disabled or when the entry is missing, the whole MMOItems lore is shown on one page, with no pagination and no comparison.
  • Lore tags: the tags of the MMOItems lore format (<page_break>, <category_image>, <pagination_indicator>, <comparison_indicator>, <requirement_met>, <requirement_not_met>, <total_pages>, <current_page>, <comparison_value>, <comparison_sign>) are now always replaced or removed, so a player no longer sees them as raw text.
  • Creative mode: pagination and the advanced lore apply only in Survival and Adventure. In Creative the MMOItems lore is left intact (tags included), because the creative client sends items back as it shows them and rewriting the lore would alter the real item.
  • The entry fields start with working values when the entry is created in the web editor (isEnabled and overrideDefaultLore on, paginationKeybind SWAP_OFFHAND, comparisonKeybind SNEAK, statsStartOnPage 2, enableComparisonTags on, default symbols and indicators).

Documentation

Shops v1.11​

  • perPlayer now gives each player their own stock of each item; a reset refills everyone's. Limits keep their own scope.
  • defaultRefreshTicks and the item refreshTicks redraw an open shop when the stock shown changes (finite stocks only; 0 on the shop means no automatic check).
  • The item guiSlot pins an item at a fixed slot of the content area on every page; an item that cannot be placed is moved to a free cell or reported in the console.
  • sellAllEnabled off now refuses the sell-all action with cannotSellMessage.
  • Command replies, trend icons, Limited/Unlimited lore, price lines, default names, the no-price text and the duration format are now editable; the default cooldown day is written d (it was j).

Release v1.11 · Documentation

GUI v0.19​

  • gui_settings audioDefaults now applies as a fallback: a sound left empty on an Open GUI action is taken from it, sound by sound.
  • Scrollable layouts get default arrows while showDefaultButtons is on (the default): one per direction without a buttons entry, shown only when the content can scroll that way, and never on an occupied cell. Existing scrollable menus gain arrows; set showDefaultButtons to false to keep them as they were.
  • New defaultStep field on scrollable layouts and new gui_settings scrollArrows list (direction, item, name, x, y) to change the default arrows.
  • New texts in gui_settings: the Confirm and Cancel buttons and the storage progress line are editable. "Confirmer" becomes "Confirm". The breadcrumb separator, which was displayed corrupted, is fixed.

Release v0.19 · Documentation

Quest Codex v2.15​

  • The typewriter.codex.open permission is now declared by the extension, operators only by default, so it appears in permission plugins such as LuckPerms.
  • The navigation labels, sort labels, default menu titles and the unknown category message are editable (navLabels, sortTexts, mainMenuTitle, trackedQuestsTitle, unknownCategoryMessage).

Release v2.15 · Documentation

Vote System v0.9​

  • Vote Config is now read: cooldownSeconds above 0 lets a player vote again after that many seconds (counts are cumulative), and debug logs accepted and refused votes.
  • Votes saved before the cooldown existed are dated at the first contact after the update, so their cooldown starts then.
  • The replies of the /tw vote commands are editable snippets (content.vote.).
  • MiniMessage colors: the closed message, the new blockedMessage and the two Vote Message texts are now read as MiniMessage with their placeholders resolved (the tags were shown as written). The default command replies are colored.
  • A refused vote is really refused: the triggers and modifiers of Vote Action run only when the vote is recorded, so a refusal no longer shows the accepted message and nothing fires twice. A refusal shows the closedMessage (after the end date) or the new blockedMessage (before the cooldown is over) and fires the new refusedTriggers. Every refusal is logged when debug is on.
  • New placeholders vote_has_voted_<id> and vote_closed_<id> (1 or 0), and vote_remaining_<id> (seconds before the end date, 0 without one).

Release v0.9 · Documentation

Discord v0.13​

  • The triggers of a Webhook Fact Event now run after a webhook is published, for the player whose fact change was published.
  • New triggerCooldownSeconds (default 1) on Webhook Fact Event: a loop guard between two firings of triggers for the same player; 0 disables it.

Release v0.13 · Documentation

Custom Biome v0.9​

  • Explore Biome Objective now works: biomes and requireAll are read when a player enters a biome, and the new triggers field runs entries when the objective is complete and active. The objective records discovery itself; no Enter Biome Event is needed.
  • The replies of the /tw biome commands and the unknown text of the biome placeholders are editable snippets (content.custombiome.).
  • Paper 26.3: custom biomes register again; on 26.3 they failed to load (live injection and datapack fallback).

Release v0.9 · Documentation

Numerical Storage v0.14​

  • optionalButtons of the menu and of each sub-menu are now drawn: display-only items at their slots that replace whatever the layout puts in the same slot.
  • profileMode now uses MMOProfiles: one balance per MMOProfiles profile. Without MMOProfiles, the balance is the player's. With MMOProfiles and no active profile (profile selection, or after /mmoprofiles quit), the balance shown is 0 and writes are refused: the admin commands and the menu actions answer with the editable noActiveProfileMessage (in adminMessages) and write nothing. The interest of a profile is settled when it is selected.
  • The replies of the admin commands are editable (adminMessages); the placeholder texts and the duration format are snippets (numericalstorage.placeholder., numericalstorage.duration.).
  • Placeholders load the storage at join, so they show the stored balance instead of an empty one while the cache is cold.
  • Placeholders and the level upgrade button now follow profileMode; /tw ns add/remove answer an invalid amount or a missing artifact with editable messages.

Release v0.14 · Documentation

Puzzle v0.6​

  • isShared now shares the progression of a group (the group of the puzzle fact): the first solve counts for the group, the fact is raised once, and each member gets the completion message, onComplete and chain step once (a member who was away gets them on return).
  • A player gets the completion of a puzzle at most once, even when changing group, until an admin reset that concerns them. /typewriter puzzle admin reset <player> <id> reopens a shared puzzle for the whole group.
  • A Puzzle Artifact is now required for shared puzzles: without it, a restart pays the completion again, and going back to an older build loses the shared record.
  • Player texts and command replies are editable: the messages of each puzzle and of the Puzzle Menu are entry fields, and the /tw puzzle replies are snippets (content.puzzle.). Texts that were French by default are now English; a page that stored the French text keeps it.
  • Fixed, client-side blocks: a drawn block no longer vanishes when its click is cancelled. The board is redrawn one tick after every cancelled click (Laser Grid mirrors disappeared on right click instead of turning, Block Push blocks vanished when a push was refused, and Memory, Pattern, Item Frame and Pedestal clicks as well).
  • Fixed, Block Push: a block pushed back onto its starting cell no longer bounces and vanishes, and a target hole is drawn again once a block has been pushed over it and away. A refused push counts one wrong attempt per block and target cell, no longer one per click, so holding the click on a wall does not burn maxAttempts. Leave the starting cells empty (air) in the world. allowPull still has no effect (not implemented).
  • Fixed, Lever Order: levers that rest powered now return to their original position after a wrong order, and flipping them shows. A click during the failure cooldown no longer reaches a real lever.
  • Fixed, solved puzzles: a solved Block Push, Combination Lock, Lever Order or Laser Grid is inert (no board, no cancelled interaction), so it no longer swallows the clicks on its levers and buttons when the player is back in its audience. A solved Pedestal no longer swallows the pickup of its item.
  • Laser Grid: the beam is now drawn through the centre of the blocks, and it turns exactly on each mirror (it was offset). beamDensity is a number of particles per block, and the corners are always drawn.
  • Laser Grid, maxBeamLength: new field, 64 blocks by default (0 or less means 64, never unlimited). A board whose beam is longer must raise it. The beam never loads a chunk: it stops at the edge of the loaded world.
  • Combination Lock: digits are numbered from 0 (the first listed position is digit 0); the help says so with an example. A code value outside the digits now logs a warning in the console instead of silently ignoring every press.

Release v0.6 · Documentation

Corpse v0.6​

  • World filter: allowedWorlds and excludedWorlds on corpse_settings choose where a death leaves a corpse. An empty allowed list means every world. * and ? wildcards (dungeon_*), world names and dimension keys (minecraft:the_nether) are understood, and an exclusion always wins. Outside the allowed worlds the death is vanilla.
  • filteredWorldDeath: in a world the filter turns down, VANILLA_DEATH_SCREEN (default) keeps the ordinary Minecraft death, whose body and death screen are drawn by the client, and INSTANT_RESPAWN respawns the player on the next tick without the death screen. Items and experience drop as in vanilla. No effect when both lists are empty.
  • Every text is editable: messages, menu labels and materials, the waypoint format and its eight direction arrows, the /corpses replies, the default corpse name and the recovery objective text. A player's name is escaped, so it never becomes a clickable tag.
  • New settings interactionReach (6 blocks, the server did not check the distance of a click), interactionCooldownMillis and unknownWorldLabel. A definition can also be chosen with the dimension key, and the header of /corpses list is editable. New optional outOfReachMessage (empty by default: no message). /corpses list and clear apply to the whole server.
  • Item loss and duplication check: deaths, looting and storage were reviewed, and the fixes below close every loss or duplication path found.
  • Fixed, deaths: a death cancelled by another plugin (totem, revive) no longer takes the player's gear; keepInventory and keepLevel are respected (no corpse with keepInventory), and items other plugins keep for the player are no longer duplicated into the corpse. If the corpse cannot be created, the items drop normally.
  • Fixed, looting: taking an item with a full inventory no longer duplicates the part that fitted, and two clicks racing for the same corpse can no longer hand its contents out twice.
  • Fixed, storage: a restart no longer brings back items already taken, and an unreadable or half-written storage file no longer wipes the stored corpses. Restored corpses keep their pose, glow, name and animation (not the owner's skin and armour).
  • The respawn message, waypoint and objective use the latest corpse, and the loot menu warns before opening instead of after the first click.

Release v0.6 · Documentation

MythicMobs v0.11​

  • mythic_spawner.group is now read: only members of the group activate the spawner, criteria is checked on that group, and each group has its own warmup and cooldown; a group state is dropped when no member is online.
  • The MythicMob Kill Objective line in the quest tracker is editable with the snippets advancedQuest.display and advancedQuest.completed.

Release v0.11 · Documentation

Enchantment Creator v0.11​

  • Agricultural Harvest now reads the block-break event and harvests mature crops around the broken block (radius capped at 8) instead of the block the player looks at.
  • Agricultural Harvest: new fields particle, particleCount, sound, soundVolume and soundPitch.
  • What a player types in /enchantcreator give (the enchantment name) is shown as typed in the replies, never read as formatting.

Release v0.11 · Documentation

TextDisplayDialogue v2.4​

  • Editable texts: the 15 snippets are now read. The layouts, speaker names, text lines, hints, option lines and option prefixes of the Spoken, Option and Player option dialogues and of the cinematic subtitles are edited in plugins/Typewriter/snippets; the defaults reproduce the previous display.
  • Timer placeholder: %typewriter_textdisplaydialogue_timer% is now registered in PlaceholderAPI and works outside the dialogues (0 when no timer is running).
  • Two more editable messages: textdisplay.inventory.blocked (inventory blocked during a dialogue) and textdisplay.error.init (display could not start); an empty snippet hides the message. The cause of an initialization error now goes only to the server log: no exception detail is shown to the player. The Player option dialogue also reads textdisplay.speaker.format and the textdisplay.option.* snippets (same default display).
  • audioProfile removed from textdisplay_spoken: the field was never read.
  • Paper only: Folia is not supported.

Documentation

Removed from the docs​

  • BTC Nameplates: merged into UiCore (same entries, /nameplates); old pages redirect to UiCore.
  • MMO Profile: abandoned, never released; its pages are removed.

2026-10-02​

MythicMobs NPC v4.9.1​

Fixes for interactions, animations and cinematics on Paper 26.x.

  • Clicks: right-click works again on Paper 26.x, and LEFT_CLICK and ALL now trigger too. One click triggers the dialogue once, never twice, and /tw reload no longer breaks clicks with a NoClassDefFoundError.
  • Play Animation: an action whose speed was left empty played frozen on its first frame; it now plays at normal speed. It also works on NPCs with ticking off, plays above the idle, walk and MythicMobs skill animations, and waits for the model when it is not loaded yet.
  • Cinematics in another world: the NPC of an entity cinematic stayed in the player's previous world, so it only showed after a few launches. It now shows on the first launch, with its animation.
  • Cinematic movement: smoother walking, no more idle/walk flapping, and no more close-range ModelEngine flicker.
  • Cleanup: invisible NPC carriers no longer pile up in the world after cinematics.

Documentation

CraftEngine v1.1​

  • Quest zone audience: dispose() always clears its state and resets the disposing flag, so a /tw reload no longer leaks a listener holding the previous extension classloader.

Documentation

2026-09-19​

GUI v0.18​

  • The slot-overlap warning now names gap and recalls that it is a step, not a spacing: gap: 1 means adjacent slots, not one empty slot between each. A repeated slot colliding with a decoration placed between two of its copies is the most common cause of that warning.
  • Menus written against the pre-0.3.0 Quest Codex formula, where the step applied was gap + 1, land exactly here (see Quest Codex v2.14).

Release v0.18 · Documentation

Quest Codex v2.14​

  • Documented a breaking change made in Quest Codex 0.3.0 that was never announced. Until then, codex markers used their own repetition formula where gap was a spacing (step gap + 1). Since 0.3.0 they use the GUI engine formula where gap is a step: count: 3, direction: right, gap: 1 from x=2 now gives x=2, 3, 4 instead of 2, 4, 6.
  • A menu written before 0.3.0 therefore places its markers one slot apart and can collide with the decoration between them. To restore the former spacing, double the step: gap: 1 becomes gap: 2. The step semantics are kept.
  • Indexed markers now reset gap along with count and repeatY, so menu validation no longer reports an orphan repetition on them.
  • Built against GUI v0.18.

Release v2.14 · Documentation

2026-09-14​

GUI v0.17​

  • A gap of 0 no longer stacks every repeated copy on the origin cell. The web editor serializes an untouched gap as 0: a QUEST_SLOT with count: 7 and direction: right produced seven markers at the same position and a "Slot overlap" warning you never wrote. gap is now coerced to at least 1, like count and repeatY.
  • The fix lives in the shared slot repetition code, so Quest Codex and Shops get it without a rebuild.

Release v0.17 · Documentation

Shops v1.10​

  • Barter: prices paid in items. New priceMode: ITEMS sells an article against one or several items instead of currency. itemPrice on the item lists the cost (item plus quantity per unit bought); defaultItemPrice on the shop covers every ITEMS article that declares none. The article's list replaces the shop's, it is never added to it.
  • An ITEMS article with no price anywhere is refused and logged, never given away. Payment is simulated on the whole inventory before anything is removed, and the space for the bought item is checked first, since a barter has no refund.
  • New cannotAffordItemsMessage (tokens {missing}, {amount}) and the {item_price} lore token, one line per requested item. {buy} and {sell} lines are dropped on such an article, and the buy_price / sell_price placeholders read a dash.
  • "Buy max" works on barter articles. An ITEMS article cannot be sold back for currency: its sell price is zero.
  • Rebuilt against GUI v0.17.

Release v1.10 · Documentation

2026-09-09​

Puzzle v0.5​

  • Fixed: NoClassDefFoundError on PuzzleRenderers after an extension reload. The extension registered two Bukkit listeners on the engine plugin and never removed them, so the old instances kept firing against a closed classloader. Both are now unregistered when the extension shuts down, which also stops one extra copy piling up per reload.
  • A visual refresh already scheduled when the extension goes down can no longer trigger a class load on the dead loader.

Release v0.5 · Documentation

2026-09-08​

Shops v1.9​

  • Rebuilt against Typewriter engine 0.9.0-beta-177.
  • No behaviour change.
  • Built against GUI v0.16.

Release v1.9 · Documentation

Discord v0.12​

  • Rebuilt against Typewriter engine 0.9.0-beta-177.
  • No behaviour change.

Release v0.12 · Documentation

Companion v0.10​

  • Rebuilt against Typewriter engine 0.9.0-beta-177.
  • No behaviour change.

Release v0.10 · Documentation

Corpse v0.5​

  • Rebuilt against Typewriter engine 0.9.0-beta-177.
  • No behaviour change.

Release v0.5 · Documentation

Custom Biome v0.8​

  • Rebuilt against Typewriter engine 0.9.0-beta-177.
  • No behaviour change.

Release v0.8 · Documentation

InputTracker v0.5​

  • Rebuilt against Typewriter engine 0.9.0-beta-177.
  • No behaviour change.

Release v0.5 · Documentation

Numerical Storage v0.13​

  • Rebuilt against Typewriter engine 0.9.0-beta-177.
  • No behaviour change.

Release v0.13 · Documentation

Puzzle v0.4​

  • Rebuilt against Typewriter engine 0.9.0-beta-177.
  • No behaviour change.

Release v0.4 · Documentation

Vanilla v1.4​

  • Rebuilt against Typewriter engine 0.9.0-beta-177.
  • Objective progress texts (gather, count and fact-check objectives) are now parsed with the player, so placeholders in them resolve for that player.

Release v1.4 · Documentation

Vote System v0.8​

  • Rebuilt against Typewriter engine 0.9.0-beta-177.
  • No behaviour change.

Release v0.8 · Documentation

Enchantment Creator v0.10​

  • Rebuilt against Typewriter engine 0.9.0-beta-177.
  • Mechanic actions are now scheduled through Typewriter's own synchronous dispatcher instead of the extension's private scheduler helper.

Release v0.10 · Documentation

MMO Inventory v0.7​

  • Rebuilt against Typewriter engine 0.9.0-beta-177.
  • No behaviour change.

Release v0.7 · Documentation

MythicMobs v0.10​

  • Rebuilt against Typewriter engine 0.9.0-beta-177.
  • No behaviour change.

Release v0.10 · Documentation

GUI v0.16​

  • Rebuilt against Typewriter engine 0.9.0-beta-177.
  • Fixed leaderboard rows describing the viewer: a row for a ranked player now resolves its item, name and lore Vars against that player instead of whoever opened the menu, so every row no longer shows the viewer's values. World, group and offline rows fall back to the viewer.

Release v0.16 · Documentation

Quest Codex v2.13​

  • Rebuilt against Typewriter engine 0.9.0-beta-177.
  • No behaviour change.
  • Built against GUI v0.16.

Release v2.13 · Documentation

Tracking v0.11​

  • Rebuilt against Typewriter engine 0.9.0-beta-177.
  • No behaviour change.

Release v0.11 · Documentation

2026-09-06​

Shops v1.8​

  • Rebuilt against Typewriter engine 0.9.0-beta-176.
  • No behaviour change.
  • Built against GUI v0.15.

Release v1.8 · Documentation

Discord v0.11​

  • Rebuilt against Typewriter engine 0.9.0-beta-176.
  • No behaviour change.

Release v0.11 · Documentation

Companion v0.9​

  • Rebuilt against Typewriter engine 0.9.0-beta-176.
  • No behaviour change.

Release v0.9 · Documentation

Corpse v0.4​

  • Rebuilt against Typewriter engine 0.9.0-beta-176.
  • The corpse nameplate now uses the engine's CustomNameProperty.
  • Built against GUI v0.15.

Release v0.4 · Documentation

Custom Biome v0.7​

  • Rebuilt against Typewriter engine 0.9.0-beta-176.
  • No behaviour change.

Release v0.7 · Documentation

InputTracker v0.4​

  • Rebuilt against Typewriter engine 0.9.0-beta-176.
  • No behaviour change.

Release v0.4 · Documentation

Numerical Storage v0.12​

  • Rebuilt against Typewriter engine 0.9.0-beta-176.
  • No behaviour change.

Release v0.12 · Documentation

Puzzle v0.3​

  • Rebuilt against Typewriter engine 0.9.0-beta-176.
  • No behaviour change.

Release v0.3 · Documentation

Vanilla v1.3​

  • Rebuilt against Typewriter engine 0.9.0-beta-176.
  • Entity activities (visibility detection, follow, orbit, avoid, hearing, smell, patrol and the like) are ported to the activity lifecycle of the 0.9 engine. Entry names are unchanged.

Release v1.3 · Documentation

Vote System v0.7​

  • Rebuilt against Typewriter engine 0.9.0-beta-176.
  • Breaking: vote_action field renamed. option is replaced by optionIndex, a plain 0-based number. Re-select the option on every existing vote_action.
  • Breaking: vote_message field split. message is replaced by notVotedMessage and alreadyVotedMessage; leave the second one empty for no message to players who already voted.
  • vote_data now defaults artifactId to vote_storage: set a fixed name to keep ballots across reloads.
  • New vote_config (with debug and cooldownSeconds), vote_fact and vote_cast_event entries appear in the editor.

Release v0.7 · Documentation

Dialog Menu v0.7​

  • Rebuilt against Typewriter engine 0.9.0-beta-176.
  • No behaviour change.

Release v0.7 · Documentation

Enchantment Creator v0.9​

  • Rebuilt against Typewriter engine 0.9.0-beta-176.
  • No behaviour change.

Release v0.9 · Documentation

MMO Inventory v0.6​

  • Rebuilt against Typewriter engine 0.9.0-beta-176.
  • No behaviour change.

Release v0.6 · Documentation

MythicMobs v0.9​

  • Rebuilt against Typewriter engine 0.9.0-beta-176.
  • No behaviour change.

Release v0.9 · Documentation

GUI v0.15​

  • Rebuilt against Typewriter engine 0.9.0-beta-176.
  • No behaviour change.

Release v0.15 · Documentation

Quest Codex v2.12​

  • Rebuilt against Typewriter engine 0.9.0-beta-176.
  • No behaviour change.
  • Built against GUI v0.15.

Release v2.12 · Documentation

Protection v1.3​

  • Deprecated: this is the final release of Protection. Typewriter's native region system is the replacement for new deployments.
  • The extension is kept for existing servers and will receive no new features.
  • Rebuilt against Typewriter engine 0.9.0-beta-176.

Release v1.3 · Documentation

Tracking v0.10​

  • Rebuilt against Typewriter engine 0.9.0-beta-176.
  • No behaviour change.

Release v0.10 · Documentation

2026-08-29​

GUI v0.14​

  • Fact leaderboards. New gui_leaderboard definition ranks players, worlds or Typewriter groups on one or more fact values, rendered by the new leaderboard layout in any open_gui pool. Rows accept {rank}, {name}, {score}, {group}, {world} and {score_<fact_id>}.
  • New gui_leaderboard_population artifact keeps the last known values of offline players, so a leaderboard ranks more than who is connected.
  • New dropOnClose on storage slots drops the remaining contents at the player's feet on close, Escape and disconnect.
  • Fixed temporary storage slots never being cleared, and shift-right-click on a matching cursor item taking instead of depositing.
  • A blank viewPermission / clickPermission is no longer treated as a permission: unset gates saved by the web editor used to hide the slot or tab from every non-operator.
  • Startup validation now knows the leaderboard layout and reports a rank area outside the inventory.

Release v0.14 · Documentation

Quest Codex v2.11​

  • Rebuilt against GUI v0.14.

Release v2.11 · Documentation

Shops v1.7​

  • Rebuilt against GUI v0.14.

Release v1.7 · Documentation

Corpse v0.3​

  • Rebuilt against GUI v0.14.

Release v0.3 · Documentation

Numerical Storage v0.11​

  • Rebuilt against GUI v0.14.

Release v0.11 · Documentation

2026-08-24​

Shops v1.6​

  • New operator command tree /tw shop admin: shop listing, definition inspection, player session control, runtime reset, direct-item stock management and transaction history.
  • New typewriter.shop.admin permission (OP only). typewriter.shop.open stays available to players by default.
  • A manual reset shares the automatic reset behaviour and recalculates the next scheduled reset.
  • Fixed the public command permission registration so non-operators can open shops.

Release v1.6 · Documentation

2026-08-16​

Discord v0.10​

  • Fact webhooks. New webhook_fact_event publishes a fact change to any webhook_definition destination, for the player, Typewriter group and global scopes, with optional audiences, value conditions, message and embed templates, forum threads and role mentions. Group and global scopes deduplicate callbacks from players observing the same fact.
  • The Discord link is fully optional: without a discord_link_manifest, the extension no longer initializes Discord bridges or resolves JDA classes.
  • A disabled or incomplete JDA is reported by the client instead of throwing a NoClassDefFoundError on the server thread.
  • The public release now bundles JDA 6.5.0 and its runtime dependencies.

Release v0.10 · Documentation

2026-08-21​

GUI v0.13​

  • Live slot items. itemProvider rebuilds a slot's item, name and lore at render time. A layout's slots are parsed once and the same list is handed back on every render, so a placeholder or a countdown in a lore was resolved once and then frozen — autoRefreshTicks redrew an identical inventory forever.
  • One window open in flight at a time. GuiFactory.open() completes a tick later, so until then the top inventory is still the previous view and every render decided to reopen. The second open closed the first window, that close was read as a genuine close, and the session was destroyed while its menu stayed on screen — every button then dead.
  • An animation with a duration of 0 is no longer an animation. The panel stamps a default animation block on every slot, so decorative items were drawn at index 0, and the re-render they scheduled raced the pending open.
  • A tagged button keeps the author's own interactions. Filling buttonType used to discard the whole interaction list, so a marker no resolver claimed — wrong prefix, wrong case, or the owning extension absent from that screen — became an item that clicked in silence, with nothing in the console.

Release v0.13 · Documentation

Quest Codex v2.10​

  • Menus that cannot draw are reported at startup, while the console is still being read, instead of failing silently at click time. Each message states the fix, not the symptom.
  • One-shot conversion of pages authored before the open_gui chassis. The layout pool moved out of category_menu into a referenced open_gui entry, so a page written against the older schema kept a layout the engine no longer reads: fully configured in the panel, rendering nothing.
  • Advancement titles go through the real MiniMessage-to-JSON conversion, so formatting written in a quest title survives into the advancement it generates.
  • Requires OmniGUI v0.13.

Release v2.10 · Documentation

Puzzle v0.2​

  • New activationRadius on every puzzle, default 16 blocks. A puzzle only renders and runs for a player standing in the world of its own positions, within that radius of one of them. 0 disables the distance check only — the world check always applies.
  • Fixed: a puzzle was drawn in every dimension. Client-side blocks and particles carry coordinates but no world, so a laser grid configured in the Overworld was painted in front of the player in the Nether, the End, or any other world they visited.
  • Fixed: a puzzle started as soon as the player joined its audience, whatever the distance. A memory sequence could play its whole pattern to someone thousands of blocks away, or in another world. The sequence now starts when the player reaches the board.
  • Walking away clears the board on the client and cancels pending animations. The attempt budget, the failure cooldown, timeLimit and lifespan are armed on arrival instead of on audience join.

Release v0.2 · Documentation

Custom Biome v0.6​

  • Breaking: biome_audience is removed. It answered "is this player in that biome" by reading the world's own biome, which a client-side overlay never changes — so for every biome this extension paints, it answered false, whatever the player saw on screen. No configuration made it work.
  • Two entries replace it: biome_overlay_audience (does this player carry that overlay) and biome_region_audience (is this player inside that region, world included). Pages using biome_audience must be repointed at one of them.
  • Region audiences match on the world as well as the coordinates, so a region defined in one world no longer matches the same coordinates in another. ignoreY turns a region into an infinite column.
  • /tw biome region <entry> fills an entry's two corners from your current WorldEdit selection, instead of typing coordinates by hand.
  • Per-player overlays are tracked per chunk and per owner: several overlays can cover one chunk, one wins, and clearing it restores the real biome of that chunk rather than the last painted palette.

Release v0.6 · Documentation

Shops v1.5​

  • Rebuilt against OmniGUI v0.13. GuiSlot gained a render-time itemProvider parameter, which changed the constructor its callers link against, so the v1.4 JAR threw NoSuchMethodError the moment a shop was opened on the updated GUI engine — the inventory never appeared.
  • No behaviour change. The two versions travel together: v1.4 cannot run on OmniGUI v0.13, and v1.5 cannot run on v0.12.

Release v1.5 · Documentation

Numerical Storage v0.10​

  • Rebuilt against OmniGUI v0.13, for the same GuiSlot signature change: the v0.9 JAR threw NoSuchMethodError when a storage menu was opened, and the menu never appeared.
  • No behaviour change, and no second migration: schema v2 storage is read back exactly as v0.9 wrote it.

Release v0.10 · Documentation

Corpse v0.2​

  • Rebuilt against OmniGUI v0.13, for the same GuiSlot signature change: the v0.1 JAR threw NoSuchMethodError when a corpse was looted, so the loot menu never opened and the corpse stood there with its inventory unreachable.
  • No behaviour change. Stored corpses, their inventories and their protection rules are read back as before.

Release v0.2

2026-08-12​

Release v0.2 · Documentation

GUI 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 · Documentation

Shops 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 · Documentation

Quest Codex 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 · Documentation

Discord v0.9​

  • 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 · Documentation

Puzzle 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 · Documentation

Corpse 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 · Documentation

Custom Biome 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 · Documentation

Enchantment Creator 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 · Documentation

Numerical Storage 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​

Release v0.9 · Documentation

Quest Codex 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 · Documentation

GUI 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 · Documentation

Shops 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.

2026-08-03​

Release v1.3 · Documentation

Quest Codex 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​

Release v2.7 · Documentation

Quest Codex 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 · Documentation

GUI 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 · Documentation

Shops 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 · Documentation

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​

Quest Codex 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.

Release v2.5 · Documentation

GUI 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.

Release v0.9 · Documentation