Saltar al contenido principal

Registro de cambios

Notas de versión de las extensiones públicas de BTC Studio. Cada versión indica la extensión, su número de versión y lo que ha cambiado para los propietarios de servidores, de la más reciente a la más antigua, con un enlace a la versión y a la documentación de la extensión.

Las extensiones de pago enlazan solo a su documentación; sus descargas permanecen en la tienda. Las extensiones privadas no figuran aquí.

2026-10-16​

Dungeon v1.2​

Todos los cambios figuran en el registro de cambios de Dungeon. Nada cambia para una mazmorra existente hasta que use uno de los campos nuevos.

  • Requiere GUI (OmniGUI) 0.20: la clasificación de Dungeon usa la fuente de clasificación de GUI 0.20 y no se carga con un GUI más antiguo. Actualiza primero GUI.
  • Botín compartido: nueva entrada Dungeon Loot Table, usada por los cofres (lootTableRef) y los mobs (lootTable). Un cofre la tira una vez al abrirse por primera vez, un mob al morir.
  • Más cofres: additionalLocations coloca varios cofres desde una sola entrada Dungeon Loot Chest (se ignora en una mazmorra generada). Loot Chest Trigger recibe particleEffect, con ejes X, Y y Z separados.
  • Oleadas y escalado: Dungeon Mob Spawn recibe waves, maxSimultaneous, el escalado según el número de jugadores (perExtraPlayer, maxCount, playerCountSource), spawnParticle y los disparadores onWaveCleared y onCleared. Nuevo evento On Dungeon Mobs Cleared, para abrir una puerta o hacer aparecer un cofre cuando todos los mobs son derrotados.
  • Restricciones: nueva entrada Dungeon Restrictions (élitros, barco o vagoneta, perla de ender, fruta de chorus, impulso del tridente, comandos bloqueados, mensaje de rechazo, permiso de exención), con gameMode, limitInteractions (interacciones permitidas, entidades protegidas) y messageRepeatDelay. El impulso del tridente y la fruta de chorus se rechazan desde el clic. Solo el permiso de exención exime a un jugador: un operador lo tiene mientras el nodo no esté en false.
  • Estadísticas: 22 estadísticas por jugador, contadas por artifact con un total entre varios artifacts: daño infligido y recibido (solo la vida realmente perdida), bajas, oleadas y salas despejadas, tiempo jugado, muertes, récords... statsMobScope elige los mobs que cuentan. Una muerte que saca al jugador de la partida ya no cuenta como runs_left. Nuevo fact dungeon_stat; placeholders dungeon_stat_<key>[_raw], dungeon_total_<key> y dungeon_inst_<id>_<key>; snippets content.dungeon_stats.duration_format y content.dungeon_stats.missing_value.
  • Clasificación: nueva entrada dungeon_leaderboard_source (LIFETIME o CURRENT_RUN, rankBy, values, durationFormat, decimals) para conectar al campo source de una clasificación de GUI.
  • Reconexión: reconnectGrace (2 minutos por defecto). Un miembro desconectado conserva su sitio y continúa donde estaba (barra lateral, ocultaciones, modo de juego). Pasado el plazo, abandona la partida y vuelve a su punto de entrada en la siguiente conexión.
  • MMOProfiles: el regreso al punto de entrada y el modo de juego de origen se vuelven a aplicar tras elegir el perfil.
  • Menús: los campos de ranura de Dungeon Category unlockedLore y lockedLore pasan a llamarse unlockLore y lockLore. Las páginas antiguas se siguen leyendo; la clave nueva gana si están ambas.
  • Ruptura de API para los addons: DungeonArtifactData, DungeonStats y PlayerDungeonStats pasan al paquete btcrenaud.dungeons.core, y DungeonArtifactEntry.getPlayerStats y update cambian de firma. Un addon compilado contra Dungeon 1.1.x debe recompilarse.

Documentación

GUI v0.20​

  • Devolver el botín: dropOnClose en un layout simple devuelve, al cerrar el menú, lo que el jugador no cogió o lo que dejó allí. closeDelivery elige GIVE_OR_DROP (por defecto: al inventario, el sobrante a los pies) o DROP. Desactivado por defecto.
  • Objetos aleatorios: rollPerSlot sortea un objeto aleatorio para cada ranura repetida en lugar de uno solo para todas, y el nuevo liveItem lo vuelve a sortear en cada actualización.
  • Nombre vacío ignorado: un objeto con el nombre vacío conserva su propio nombre en lugar de mostrarse sin nombre.
  • Filas de clasificación de otra extensión: nuevo campo source en gui_leaderboard. Las filas vienen de una entrada fuente, para todos los jugadores, conectados o no, como la de Dungeon. Los textos de fila aceptan {score}, {score_raw} y {value_<key>}. Los textos de una fuente son texto plano: un nombre que parece una etiqueta MiniMessage, como <red>, ya no cambia el orden.

Versión v0.20 · Documentación

MythicMobs v0.12​

  • Mobs visibles solo para algunos jugadores: spawn_mythicmobs_mob y mythic_spawner tienen un nuevo campo visibilityCriteria. El mob solo es visible, objetivo y herible para los jugadores que cumplen los criteria, reevaluados de forma continua (visibilityRefreshInterval, 1 segundo por defecto). Un visibilityGroup ahora se sigue en directo en vez de quedar fijado al spawn.
  • collidable (spawn_mythicmobs_mob, mythic_spawner, por defecto true): false quita la colisión y los empujones para todo el mundo.
  • Abandono: spawn_mythicmobs_mob tiene nuevos campos abandonRange y abandonDelay. El mob se retira si ningún jugador autorizado permanece al alcance durante la espera (abandonRange 0 = desactivado). El editor web rellena las duraciones nuevas con 1 segundo: revisa abandonDelay.
  • despawn_mythicmobs_mob: nuevo campo scope, ALL (por defecto, como antes) o VISIBLE_TO_PLAYER (solo los mobs que el jugador ve).
  • Protección: todo el daño ligado a un mob restringido (cuerpo a cuerpo, proyectiles, skills de MythicMobs, fuego) se bloquea hacia los jugadores no autorizados, y al revés. Los proyectiles lo atraviesan, y el mob suelta un objetivo no autorizado.
  • Condición de MythicMobs typewritervisible (alias twvisible): añádela a los skills sin daño (poción, lanzamiento...), en el targeter (conditions=[ - twvisible true ]) o como TargetCondition, para que ignoren a los jugadores que no ven al mob. La extensión ejecuta /mm reload una vez al iniciar cuando tus archivos de MythicMobs la usan.
  • Un mob cuya entrada de origen se elimina sigue oculto para todos.
  • Límites: la colisión es todo o nada; los skills sin daño no se filtran sin twvisible; los sonidos y partículas lejos del mob no se ocultan.

Release v0.12 · Documentation

Shops v1.12​

  • Recompilada contra GUI 0.20, que ahora requiere: la versión anterior no abre sus menús con GUI 0.20. No cambia nada más.

Release v1.12 · Documentation

Quest Codex v2.16​

  • Recompilada contra GUI 0.20, que ahora requiere: la versión anterior no abre sus menús con GUI 0.20. No cambia nada más.

Release v2.16 · Documentation

Corpse v0.7​

  • Recompilada contra GUI 0.20, que ahora requiere: la versión anterior no abre sus menús con GUI 0.20. No cambia nada más.

Release v0.7 · Documentation

Numerical Storage v0.15​

  • Recompilada contra GUI 0.20, que ahora requiere: la versión anterior no abre sus menús con GUI 0.20. No cambia nada más.

Release v0.15 · Documentation

2026-10-12​

Dungeon v1.1.1​

  • Paper 26.x, WORLD_PER_RUN: una partida podía fallar con The server did not create world 'dungeon_classic_...'. La copia de la plantilla conservaba el ID de mundo de la plantilla (data/paper/metadata.dat), así que el servidor la rechazaba por duplicada. Ahora la copia recibe su propio ID.

Documentación · Changelog de Dungeon

2026-10-08​

Dungeon v1.1​

Una renovación completa construida en torno a las runs: mundos aislados, mazmorras generadas, NPC por run y mobs vanilla. Lee la nota de migración antes de actualizar desde la 0.10; cada cambio figura en el registro de cambios de Dungeon.

  • Runs: cada run tiene su propio estado y su propio diario. Iniciar una run es todo o nada, y el coste de entrada se reembolsa si falla. /tw reload y Publish recuperan las runs en curso en lugar de terminarlas.
  • Aislamiento: tres modos por mazmorra (SLIME_CLONE, WORLD_PER_RUN, SHARED_WORLD_SLOTS) o AUTO.
  • Mazmorras generadas: plantillas de salas, conectores, pools, generadores y afijos, con un editor en el juego para puertas y marcadores.
  • NPC y mobs: NPC por run a partir de cualquier definición de entidad, visibles solo para los miembros de la run; mobs de combate vanilla generados una vez por run, con un límite de mobs vivos.
  • Textos: cada texto para el jugador es un snippet editable. Solo Paper.
  • Respuestas de comandos: cada respuesta de los comandos /tw dungeon, incluidas las de administración, es un snippet editable (content.dungeon_command.).
  • Estadísticas: se guardan por perfil de MMOProfiles cuando ese plugin está instalado y, si no, por jugador.
  • Mundos de Paper 26.x: los mundos guardados al estilo de Paper 26.x (dimensions/minecraft/<nombre>) se encuentran para SHARED_WORLD_SLOTS y se copian para WORLD_PER_RUN.

Documentación

MythicMobs NPC v5.0​

  • NPC en mazmorras: con ticking desactivado, un NPC colocado por Dungeon 1.0 solo se muestra a los miembros de su run, y un clic da una interacción al jugador correcto.
  • Bone Visibility Data y Attachment Data ahora se aplican al modelo del NPC, con ticking activado o desactivado, y de nuevo tras cada reaparición.
  • Play Animation: force ahora detiene las demás animaciones iniciadas por la acción en ese NPC; una speed de 0 o menos se reproduce a velocidad normal.
  • MythicMob Skill Objective: skillName ahora funciona mediante la mecánica de MythicMobs typewriterSkill{name=..} (alias twskill), añadida a la habilidad y seguida de /mm reload. El progreso se guarda en fact, y el progreso anterior se migra automáticamente. La mecánica sobrevive a una publicación desde el editor web; tras una parada y arranque completos de Typewriter, la consola pide /mm reload.
  • Objetivo de loot: los nombres de objeto y de mob del loot se leen con sus colores (antes eran texto técnico), y la marca de finalización ✔ es la misma que en las demás extensiones de objetivos.

Documentación

MMOItems v2.4​

  • Advanced Tooltip Config: overrideDefaultLore ahora se lee. Si está desactivado, si el sistema está desactivado o si falta la entrada, todo el lore de MMOItems se muestra en una sola página, sin paginación ni comparación.
  • Etiquetas del lore: las etiquetas del formato de lore de MMOItems (<page_break>, <category_image>, <pagination_indicator>, <comparison_indicator>, <requirement_met>, <requirement_not_met>, <total_pages>, <current_page>, <comparison_value>, <comparison_sign>) ahora siempre se sustituyen o se eliminan, así que el jugador ya no las ve como texto sin procesar.
  • Modo creativo: la paginación y el lore avanzado solo se aplican en supervivencia y aventura. En creativo el lore de MMOItems se deja intacto (etiquetas incluidas), porque el cliente creativo devuelve los objetos tal como los muestra y reescribir el lore alteraría el objeto real.
  • Los campos de la entrada empiezan con valores funcionales cuando la entrada se crea en el editor web (isEnabled, overrideDefaultLore y enableComparisonTags activados, paginationKeybind SWAP_OFFHAND, comparisonKeybind SNEAK, statsStartOnPage 2, símbolos e indicadores por defecto).

Documentación

Shops v1.11​

  • perPlayer ahora da a cada jugador su propio stock de cada objeto; un reinicio rellena el de todos. Los límites mantienen su propio ámbito.
  • defaultRefreshTicks y el refreshTicks del objeto redibujan una tienda abierta cuando cambia el stock mostrado (solo stocks finitos; 0 en la tienda significa sin comprobación automática).
  • El guiSlot del objeto fija un objeto en una ranura fija del área de contenido en todas las páginas; un objeto que no se puede colocar se mueve a una celda libre o se notifica en la consola.
  • sellAllEnabled desactivado ahora rechaza la acción de vender todo con cannotSellMessage.
  • Las respuestas de los comandos, los iconos de tendencia, el lore Limited/Unlimited, las líneas de precio, los nombres por defecto, el texto sin precio y el formato de duración ahora son editables; el día del cooldown por defecto se escribe d (antes j).

Versión v1.11 · Documentación

GUI v0.19​

  • audioDefaults de gui_settings ahora se aplica como valor de respaldo: un sonido dejado vacío en una acción Open GUI se toma de ahí, sonido por sonido.
  • Los diseños desplazables reciben flechas por defecto mientras showDefaultButtons esté activado (el valor por defecto): una por dirección sin entrada en buttons, mostrada solo cuando el contenido puede desplazarse en ese sentido, y nunca sobre una celda ocupada. Los menús desplazables existentes ganan flechas; pon showDefaultButtons en false para mantenerlos como estaban.
  • Nuevo campo defaultStep en los diseños desplazables y nueva lista scrollArrows en gui_settings (direction, item, name, x, y) para cambiar las flechas por defecto.
  • Nuevo texts en gui_settings: los botones Confirm y Cancel y la línea de progreso del almacenamiento son editables. «Confirmer» pasa a ser «Confirm». Se corrige el separador de la ruta de navegación, que se mostraba dañado.

Versión v0.19 · Documentación

Quest Codex v2.15​

  • El permiso typewriter.codex.open ahora lo declara la extensión, solo para operadores por defecto, de modo que aparece en plugins de permisos como LuckPerms.
  • Las etiquetas de navegación, las etiquetas de orden, los títulos de menú por defecto y el mensaje de categoría desconocida son editables (navLabels, sortTexts, mainMenuTitle, trackedQuestsTitle, unknownCategoryMessage).

Versión v2.15 · Documentación

Vote System v0.9​

  • Vote Config ahora se lee: cooldownSeconds por encima de 0 permite a un jugador votar de nuevo tras ese número de segundos (los recuentos son acumulativos), y debug registra los votos aceptados y rechazados.
  • Los votos guardados antes de que existiera el enfriamiento se fechan en el primer contacto tras la actualización, por lo que su enfriamiento empieza entonces.
  • Las respuestas de los comandos /tw vote son snippets editables (content.vote.).
  • Colores MiniMessage: el mensaje de cierre, el nuevo blockedMessage y los dos textos de Vote Message ahora se leen como MiniMessage, con los placeholders resueltos (las etiquetas se mostraban tal cual). Las respuestas de comando por defecto tienen color.
  • Un voto rechazado se rechaza de verdad: los triggers y modifiers de Vote Action solo se ejecutan si el voto queda registrado; un rechazo ya no muestra el mensaje de aceptación y nada se dispara dos veces. Un rechazo muestra el closedMessage (tras la fecha de fin) o el nuevo blockedMessage (antes de que termine la espera) y dispara los nuevos refusedTriggers. Cada rechazo se registra en el log cuando debug está activado.
  • Nuevos placeholders vote_has_voted_<id> y vote_closed_<id> (1 o 0), y vote_remaining_<id> (segundos hasta la fecha de fin, 0 sin fecha).

Versión v0.9 · Documentación

Discord v0.13​

  • Los triggers de un Webhook Fact Event ahora se ejecutan tras publicarse un webhook, para el jugador cuyo cambio de fact se publicó.
  • Nuevo triggerCooldownSeconds (por defecto 1) en Webhook Fact Event: una protección contra bucles entre dos disparos de triggers para el mismo jugador; 0 la desactiva.

Versión v0.13 · Documentación

Custom Biome v0.9​

  • Explore Biome Objective ahora funciona: biomes y requireAll se leen cuando un jugador entra en un bioma, y el nuevo campo triggers ejecuta entries cuando el objetivo está completado y activo. El objetivo registra el descubrimiento por sí mismo; no hace falta ningún Enter Biome Event.
  • Las respuestas de los comandos /tw biome y el texto unknown de los placeholders de bioma son snippets editables (content.custombiome.).
  • Paper 26.3: los biomas personalizados se registran de nuevo; en 26.3 no se cargaban (inyección en vivo y alternativa por datapack).

Versión v0.9 · Documentación

Numerical Storage v0.14​

  • optionalButtons del menú y de cada submenú ahora se dibujan: ítems solo de visualización en sus slots que sustituyen lo que el diseño coloque en la misma ranura.
  • profileMode ahora usa MMOProfiles: un saldo por perfil de MMOProfiles. Sin MMOProfiles, es el saldo del jugador. Con MMOProfiles y sin perfil activo (selección de perfil, o tras /mmoprofiles quit), el saldo mostrado es 0 y las escrituras se rechazan: los comandos de administración y las acciones de menú responden con el noActiveProfileMessage editable (en adminMessages) y no escriben nada. El interés de un perfil se liquida al seleccionarlo.
  • Las respuestas de los comandos de administración son editables (adminMessages); los textos de los placeholders y el formato de duración son snippets (numericalstorage.placeholder., numericalstorage.duration.).
  • Los placeholders cargan el almacenamiento al entrar, así que muestran el saldo guardado en lugar de uno vacío mientras la caché está fría.
  • Los placeholders y el botón de mejora de nivel ahora siguen profileMode; /tw ns add/remove responden a una cantidad no válida o a un artefacto ausente con mensajes editables.

Versión v0.14 · Documentación

Puzzle v0.6​

  • isShared ahora comparte el progreso de un grupo (el grupo del fact del puzzle): la primera resolución cuenta para el grupo, el fact se activa una vez, y cada miembro recibe una sola vez el mensaje de finalización, onComplete y el paso de cadena (un miembro ausente los recibe a su regreso).
  • Un jugador recibe la finalización de un puzzle como máximo una vez, incluso al cambiar de grupo, hasta que un reinicio de admin le afecte. /typewriter puzzle admin reset <player> <id> reabre un puzzle compartido para todo el grupo.
  • Ahora se requiere un Puzzle Artifact para los puzzles compartidos: sin él, un reinicio vuelve a pagar la finalización, y volver a una build anterior pierde el registro compartido.
  • Los textos para el jugador y las respuestas de los comandos son editables: los mensajes de cada puzzle y del Puzzle Menu son campos de la entrada, y las respuestas de /tw puzzle son snippets (content.puzzle.). Los textos que estaban en francés por defecto ahora están en inglés; una página que guardó el texto en francés lo conserva.
  • Corregido, bloques del lado del cliente: un bloque dibujado ya no desaparece cuando se cancela su clic. El tablero se vuelve a dibujar un tick después de cada clic cancelado (los espejos de Laser Grid desaparecían al hacer clic derecho en lugar de girar, los bloques de Block Push desaparecían cuando se rechazaba un empuje, y también los clics de Memory, Pattern, Item Frame y Pedestal).
  • Corregido, Block Push: un bloque empujado de vuelta a su casilla de inicio ya no rebota ni desaparece, y un agujero objetivo se vuelve a dibujar cuando un bloque se ha empujado sobre él y más allá. Un empuje rechazado cuenta un intento fallido por bloque y casilla objetivo, ya no uno por clic, así que mantener el clic contra una pared no consume maxAttempts. Deja vacías (aire) las casillas de inicio en el mundo. allowPull sigue sin tener efecto (no implementado).
  • Corregido, Lever Order: las palancas que descansan activadas vuelven a su posición original tras un orden erróneo, y accionarlas se ve. Un clic durante el cooldown de fallo ya no llega a una palanca real.
  • Corregido, puzzles resueltos: un Block Push, Combination Lock, Lever Order o Laser Grid resuelto queda inerte (sin tablero, sin interacción cancelada) y ya no se traga los clics de sus palancas y botones cuando el jugador vuelve a su audiencia. Un Pedestal resuelto ya no se traga la recogida de su objeto.
  • Laser Grid: el rayo se dibuja ahora por el centro de los bloques y gira exactamente sobre cada espejo (antes estaba desplazado). beamDensity es un número de partículas por bloque, y los vértices se dibujan siempre.
  • Laser Grid, maxBeamLength: campo nuevo, 64 bloques por defecto (0 o menos equivale a 64, nunca ilimitado). Un tablero con un rayo más largo debe aumentarlo. El rayo nunca carga un chunk: se detiene en el borde del mundo cargado.
  • Combination Lock: los dígitos se numeran desde 0 (la primera posición listada es el dígito 0); la ayuda lo indica con un ejemplo. Un valor de code fuera de los dígitos ahora registra una advertencia en la consola en lugar de ignorar en silencio todas las pulsaciones.

Versión v0.6 · Documentación

Corpse v0.6​

  • Filtro de mundos: allowedWorlds y excludedWorlds en corpse_settings eligen dónde una muerte deja un cadáver. Una lista de permitidos vacía significa todos los mundos. Se entienden los comodines * y ? (dungeon_*), los nombres de mundo y las claves de dimensión (minecraft:the_nether), y una exclusión siempre gana. Fuera de los mundos permitidos la muerte es vanilla.
  • filteredWorldDeath: en un mundo que el filtro rechaza, VANILLA_DEATH_SCREEN (por defecto) mantiene la muerte normal de Minecraft, cuyo cuerpo y pantalla de muerte dibuja el cliente, e INSTANT_RESPAWN hace reaparecer al jugador en el tick siguiente sin pantalla de muerte. Los objetos y la experiencia caen como en vanilla. Sin efecto cuando ambas listas están vacías.
  • Todos los textos son editables: mensajes, etiquetas y materiales del menú, el formato del waypoint con sus ocho flechas de dirección, las respuestas de /corpses, el nombre por defecto del cadáver y el texto del objetivo de recuperación. El nombre de un jugador se escapa, así que nunca se convierte en una etiqueta en la que se pueda hacer clic.
  • Nuevos ajustes interactionReach (6 bloques; el servidor no comprobaba la distancia de un clic), interactionCooldownMillis y unknownWorldLabel. Una definición también puede elegirse con la clave de dimensión, y el encabezado de /corpses list es editable. /corpses list y clear se aplican a todo el servidor. Nuevo outOfReachMessage opcional (vacío por defecto: sin mensaje).
  • Revisión de pérdida y duplicación de objetos: se revisaron las muertes, el saqueo y el almacenamiento; las correcciones siguientes cierran todas las vías de pérdida o duplicación encontradas.
  • Corregido, muertes: una muerte cancelada por otro plugin (tótem, resurrección) ya no se lleva el equipo del jugador; se respetan keepInventory y keepLevel (sin cadáver con keepInventory), y los objetos que otros plugins conservan para el jugador ya no se duplican en el cadáver. Si no se puede crear el cadáver, los objetos caen con normalidad.
  • Corregido, saqueo: tomar un objeto con el inventario lleno ya no duplica la parte que cupo, y dos clics que compiten por el mismo cadáver ya no pueden entregar su contenido dos veces.
  • Corregido, almacenamiento: un reinicio ya no devuelve objetos ya tomados, y un archivo de almacenamiento ilegible o escrito a medias ya no borra los cadáveres guardados. Los cadáveres restaurados conservan su pose, brillo, nombre y animación (no la skin ni la armadura del dueño).
  • El mensaje de reaparición, el waypoint y el objetivo usan el último cadáver, y el menú de saqueo avisa antes de abrirse en lugar de tras el primer clic.

Versión v0.6 · Documentación

MythicMobs v0.11​

  • mythic_spawner.group ahora se lee: solo los miembros del grupo activan el spawner, criteria se comprueba sobre ese grupo, y cada grupo tiene su propio calentamiento y enfriamiento; el estado de un grupo se descarta cuando no hay ningún miembro conectado.
  • La línea del MythicMob Kill Objective en el rastreador de misiones es editable con los snippets advancedQuest.display y advancedQuest.completed.

Versión v0.11 · Documentación

Enchantment Creator v0.11​

  • Agricultural Harvest ahora lee el evento de rotura de bloque y cosecha los cultivos maduros alrededor del bloque roto (radius limitado a 8) en lugar del bloque que mira el jugador.
  • Agricultural Harvest: nuevos campos particle, particleCount, sound, soundVolume y soundPitch.
  • Lo que un jugador escribe en /enchantcreator give (el nombre del encantamiento) se muestra tal cual en las respuestas, sin interpretarse nunca como formato.

Versión v0.11 · Documentación

TextDisplayDialogue v2.4​

  • Textos editables: los 15 snippets ahora se leen. Los diseños, nombres de interlocutor, líneas de texto, indicaciones, líneas de opciones y prefijos de opciones de los diálogos Spoken, Option y Player option y de los subtítulos de cinemática se editan en plugins/Typewriter/snippets; los valores por defecto reproducen la visualización anterior.
  • Placeholder del temporizador: %typewriter_textdisplaydialogue_timer% ahora está registrado en PlaceholderAPI y funciona fuera de los diálogos (0 cuando no hay ningún temporizador activo).
  • Dos mensajes más editables: textdisplay.inventory.blocked (inventario bloqueado durante un diálogo) y textdisplay.error.init (la visualización no pudo iniciarse); un snippet vacío oculta el mensaje. La causa de un error de inicialización ahora va solo al registro del servidor: no se muestra ningún detalle de la excepción al jugador. El diálogo Player option también lee textdisplay.speaker.format y los snippets textdisplay.option.* (misma visualización por defecto).
  • audioProfile eliminado de textdisplay_spoken: el campo nunca se leía.
  • Solo Paper: Folia no es compatible.

Documentación

Retirado de la documentación​

  • BTC Nameplates: fusionado en UiCore (mismas entries, /nameplates); las páginas antiguas redirigen a UiCore.
  • MMO Profile: abandonado, nunca publicado; sus páginas se han eliminado.

2026-10-02​

MythicMobs NPC v4.9.1​

Correcciones para interacciones, animaciones y cinemáticas en Paper 26.x.

  • Clics: el clic derecho vuelve a funcionar en Paper 26.x, y LEFT_CLICK y ALL también se activan ahora. Un clic activa el diálogo una sola vez, nunca dos, y /tw reload ya no rompe los clics con un NoClassDefFoundError.
  • Play Animation: una acción cuya velocidad se dejaba vacía se reproducía congelada en su primer fotograma; ahora se reproduce a velocidad normal. También funciona en NPC con ticking desactivado, se reproduce por encima de las animaciones de reposo, de caminar y de habilidades de MythicMobs, y espera al modelo cuando aún no está cargado.
  • Cinemáticas en otro mundo: el NPC de una cinemática de entidad se quedaba en el mundo anterior del jugador, por lo que solo aparecía tras varios lanzamientos. Ahora aparece desde el primer lanzamiento, con su animación.
  • Movimiento en cinemáticas: caminar más fluido, sin alternancia entre reposo y caminar, y sin parpadeo de ModelEngine a corta distancia.
  • Limpieza: los portadores de NPC invisibles ya no se acumulan en el mundo tras las cinemáticas.

Documentación

CraftEngine v1.1​

  • Audiencia de la zona de misión: dispose() siempre vacía su estado y restablece el indicador de liberación, de modo que un /tw reload ya no deja filtrado un listener que retiene el classloader anterior de la extensión.

Documentación

2026-09-19​

GUI v0.18​

  • La advertencia de solapamiento de ranuras ahora nombra gap y recuerda que es un paso, no una separación: gap: 1 significa ranuras adyacentes, no una ranura vacía entre cada una. Que una ranura repetida choque con una decoración colocada entre dos de sus copias es la causa más frecuente de esa advertencia.
  • Los menús escritos con la fórmula de Quest Codex anterior a la 0.3.0, en la que el paso aplicado era gap + 1, caen exactamente aquí (consulta Quest Codex v2.14).

Versión v0.18 · Documentación

Quest Codex v2.14​

  • Se documentó un cambio incompatible introducido en Quest Codex 0.3.0 que nunca se anunció. Hasta entonces, los marcadores del codex usaban su propia fórmula de repetición en la que gap era una separación (paso gap + 1). Desde la 0.3.0 usan la fórmula del motor de GUI, en la que gap es un paso: count: 3, direction: right, gap: 1 desde x=2 ahora da x=2, 3, 4 en lugar de 2, 4, 6.
  • Por tanto, un menú escrito antes de la 0.3.0 coloca sus marcadores separados por una ranura y puede chocar con la decoración que hay entre ellos. Para restaurar la separación anterior, duplica el paso: gap: 1 pasa a ser gap: 2. Se mantiene la semántica del paso.
  • Los marcadores indexados ahora restablecen gap junto con count y repeatY, por lo que la validación de menús ya no informa de una repetición huérfana en ellos.
  • Compilada con GUI v0.18.

Versión v2.14 · Documentación

2026-09-14​

GUI v0.17​

  • Un gap de 0 ya no apila todas las copias repetidas en la celda de origen. El editor web serializa un gap sin tocar como 0: un QUEST_SLOT con count: 7 y direction: right producía siete marcadores en la misma posición y una advertencia "Slot overlap" que nunca escribiste. Ahora gap se fuerza a al menos 1, igual que count y repeatY.
  • La corrección está en el código compartido de repetición de ranuras, por lo que Quest Codex y Shops la reciben sin necesidad de recompilar.

Versión v0.17 · Documentación

Shops v1.10​

  • Trueque: precios pagados en objetos. El nuevo priceMode: ITEMS vende un artículo a cambio de uno o varios objetos en lugar de moneda. itemPrice en el objeto enumera el coste (objeto más cantidad por unidad comprada); defaultItemPrice en la tienda cubre todos los artículos ITEMS que no declaran ninguno. La lista del artículo sustituye a la de la tienda; nunca se suma a ella.
  • Un artículo ITEMS sin precio en ningún sitio se rechaza y se registra, nunca se regala. El pago se simula sobre todo el inventario antes de retirar nada, y primero se comprueba el espacio para el objeto comprado, ya que un trueque no tiene reembolso.
  • Nuevo cannotAffordItemsMessage (tokens {missing}, {amount}) y el token de lore {item_price}, una línea por cada objeto solicitado. Las líneas {buy} y {sell} se descartan en un artículo así, y los placeholders buy_price / sell_price muestran un guion.
  • "Comprar máximo" funciona con los artículos de trueque. Un artículo ITEMS no se puede revender por moneda: su precio de venta es cero.
  • Recompilada con GUI v0.17.

Versión v1.10 · Documentación

2026-09-09​

Puzzle v0.5​

  • Corregido: NoClassDefFoundError en PuzzleRenderers tras recargar la extensión. La extensión registraba dos listeners de Bukkit en el plugin del motor y nunca los eliminaba, por lo que las instancias antiguas seguían disparándose contra un classloader cerrado. Ahora ambos se desregistran cuando la extensión se apaga, lo que también evita que se acumule una copia adicional en cada recarga.
  • Una actualización visual ya programada cuando la extensión se apaga ya no puede provocar la carga de una clase en el classloader muerto.

Versión v0.5 · Documentación

2026-09-08​

Shops v1.9​

  • Recompilada con el motor de Typewriter 0.9.0-beta-177.
  • Sin cambios de comportamiento.
  • Compilada con GUI v0.16.

Versión v1.9 · Documentación

Discord v0.12​

  • Recompilada con el motor de Typewriter 0.9.0-beta-177.
  • Sin cambios de comportamiento.

Versión v0.12 · Documentación

Companion v0.10​

  • Recompilada con el motor de Typewriter 0.9.0-beta-177.
  • Sin cambios de comportamiento.

Versión v0.10 · Documentación

Corpse v0.5​

  • Recompilada con el motor de Typewriter 0.9.0-beta-177.
  • Sin cambios de comportamiento.

Versión v0.5 · Documentación

Custom Biome v0.8​

  • Recompilada con el motor de Typewriter 0.9.0-beta-177.
  • Sin cambios de comportamiento.

Versión v0.8 · Documentación

InputTracker v0.5​

  • Recompilada con el motor de Typewriter 0.9.0-beta-177.
  • Sin cambios de comportamiento.

Versión v0.5 · Documentación

Numerical Storage v0.13​

  • Recompilada con el motor de Typewriter 0.9.0-beta-177.
  • Sin cambios de comportamiento.

Versión v0.13 · Documentación

Puzzle v0.4​

  • Recompilada con el motor de Typewriter 0.9.0-beta-177.
  • Sin cambios de comportamiento.

Versión v0.4 · Documentación

Vanilla v1.4​

  • Recompilada con el motor de Typewriter 0.9.0-beta-177.
  • Los textos de progreso de los objetivos (objetivos de recolección, de recuento y de comprobación de hechos) ahora se analizan con el jugador, por lo que los placeholders que contienen se resuelven para ese jugador.

Versión v1.4 · Documentación

Vote System v0.8​

  • Recompilada con el motor de Typewriter 0.9.0-beta-177.
  • Sin cambios de comportamiento.

Versión v0.8 · Documentación

Enchantment Creator v0.10​

  • Recompilada con el motor de Typewriter 0.9.0-beta-177.
  • Las acciones de las mecánicas ahora se programan mediante el despachador síncrono propio de Typewriter en lugar del auxiliar de planificación privado de la extensión.

Versión v0.10 · Documentación

MMO Inventory v0.7​

  • Recompilada con el motor de Typewriter 0.9.0-beta-177.
  • Sin cambios de comportamiento.

Versión v0.7 · Documentación

MythicMobs v0.10​

  • Recompilada con el motor de Typewriter 0.9.0-beta-177.
  • Sin cambios de comportamiento.

Versión v0.10 · Documentación

GUI v0.16​

  • Recompilada con el motor de Typewriter 0.9.0-beta-177.
  • Corregidas las filas de clasificación que describían al espectador: una fila de un jugador clasificado ahora resuelve las Var de su objeto, nombre y lore con respecto a ese jugador y no a quien abrió el menú, de modo que ya no todas las filas muestran los valores del espectador. Las filas de mundo, de grupo y de jugadores desconectados recurren al espectador.

Versión v0.16 · Documentación

Quest Codex v2.13​

  • Recompilada con el motor de Typewriter 0.9.0-beta-177.
  • Sin cambios de comportamiento.
  • Compilada con GUI v0.16.

Versión v2.13 · Documentación

Tracking v0.11​

  • Recompilada con el motor de Typewriter 0.9.0-beta-177.
  • Sin cambios de comportamiento.

Versión v0.11 · Documentación

2026-09-06​

Shops v1.8​

  • Recompilada con el motor de Typewriter 0.9.0-beta-176.
  • Sin cambios de comportamiento.
  • Compilada con GUI v0.15.

Versión v1.8 · Documentación

Discord v0.11​

  • Recompilada con el motor de Typewriter 0.9.0-beta-176.
  • Sin cambios de comportamiento.

Versión v0.11 · Documentación

Companion v0.9​

  • Recompilada con el motor de Typewriter 0.9.0-beta-176.
  • Sin cambios de comportamiento.

Versión v0.9 · Documentación

Corpse v0.4​

  • Recompilada con el motor de Typewriter 0.9.0-beta-176.
  • La placa de nombre del cadáver ahora usa la CustomNameProperty del motor.
  • Compilada con GUI v0.15.

Versión v0.4 · Documentación

Custom Biome v0.7​

  • Recompilada con el motor de Typewriter 0.9.0-beta-176.
  • Sin cambios de comportamiento.

Versión v0.7 · Documentación

InputTracker v0.4​

  • Recompilada con el motor de Typewriter 0.9.0-beta-176.
  • Sin cambios de comportamiento.

Versión v0.4 · Documentación

Numerical Storage v0.12​

  • Recompilada con el motor de Typewriter 0.9.0-beta-176.
  • Sin cambios de comportamiento.

Versión v0.12 · Documentación

Puzzle v0.3​

  • Recompilada con el motor de Typewriter 0.9.0-beta-176.
  • Sin cambios de comportamiento.

Versión v0.3 · Documentación

Vanilla v1.3​

  • Recompilada con el motor de Typewriter 0.9.0-beta-176.
  • Las actividades de entidades (detección de visibilidad, seguir, orbitar, evitar, oído, olfato, patrulla y similares) se han portado al ciclo de vida de actividades del motor 0.9. Los nombres de las entradas no cambian.

Versión v1.3 · Documentación

Vote System v0.7​

  • Recompilada con el motor de Typewriter 0.9.0-beta-176.
  • Cambio incompatible: campo de vote_action renombrado. option se sustituye por optionIndex, un número simple que empieza en 0. Vuelve a seleccionar la opción en cada vote_action existente.
  • Cambio incompatible: campo de vote_message dividido. message se sustituye por notVotedMessage y alreadyVotedMessage; deja el segundo vacío para no enviar ningún mensaje a los jugadores que ya han votado.
  • vote_data ahora usa por defecto vote_storage como artifactId: establece un nombre fijo para conservar las papeletas entre recargas.
  • Las nuevas entradas vote_config (con debug y cooldownSeconds), vote_fact y vote_cast_event aparecen en el editor.

Versión v0.7 · Documentación

Dialog Menu v0.7​

  • Recompilada con el motor de Typewriter 0.9.0-beta-176.
  • Sin cambios de comportamiento.

Versión v0.7 · Documentación

Enchantment Creator v0.9​

  • Recompilada con el motor de Typewriter 0.9.0-beta-176.
  • Sin cambios de comportamiento.

Versión v0.9 · Documentación

MMO Inventory v0.6​

  • Recompilada con el motor de Typewriter 0.9.0-beta-176.
  • Sin cambios de comportamiento.

Versión v0.6 · Documentación

MythicMobs v0.9​

  • Recompilada con el motor de Typewriter 0.9.0-beta-176.
  • Sin cambios de comportamiento.

Versión v0.9 · Documentación

GUI v0.15​

  • Recompilada con el motor de Typewriter 0.9.0-beta-176.
  • Sin cambios de comportamiento.

Versión v0.15 · Documentación

Quest Codex v2.12​

  • Recompilada con el motor de Typewriter 0.9.0-beta-176.
  • Sin cambios de comportamiento.
  • Compilada con GUI v0.15.

Versión v2.12 · Documentación

Protection v1.3​

  • Obsoleta: esta es la última versión de Protection. El sistema de regiones nativo de Typewriter es el sustituto para las nuevas instalaciones.
  • La extensión se mantiene para los servidores existentes y no recibirá nuevas funciones.
  • Recompilada con el motor de Typewriter 0.9.0-beta-176.

Versión v1.3 · Documentación

Tracking v0.10​

  • Recompilada con el motor de Typewriter 0.9.0-beta-176.
  • Sin cambios de comportamiento.

Versión v0.10 · Documentación

2026-08-29​

GUI v0.14​

  • Clasificaciones de hechos. La nueva definición gui_leaderboard clasifica a jugadores, mundos o grupos de Typewriter según uno o más valores de hechos, y se renderiza con el nuevo layout leaderboard en cualquier conjunto de open_gui. Las filas admiten {rank}, {name}, {score}, {group}, {world} y {score_<fact_id>}.
  • El nuevo artefacto gui_leaderboard_population conserva los últimos valores conocidos de los jugadores desconectados, de modo que una clasificación incluye a más jugadores que los conectados.
  • El nuevo dropOnClose en las ranuras de almacenamiento suelta el contenido restante a los pies del jugador al cerrar, al pulsar Escape y al desconectarse.
  • Corregido que las ranuras de almacenamiento temporary nunca se vaciaban, y que Shift + clic derecho con un objeto coincidente en el cursor lo retiraba en lugar de depositarlo.
  • Un viewPermission / clickPermission en blanco ya no se trata como un permiso: las restricciones sin definir que guardaba el editor web ocultaban la ranura o la pestaña a todos los jugadores que no eran operadores.
  • La validación al arrancar ahora conoce el layout leaderboard e informa de un área de posiciones fuera del inventario.

Versión v0.14 · Documentación

Quest Codex v2.11​

  • Recompilada con GUI v0.14.

Versión v2.11 · Documentación

Shops v1.7​

  • Recompilada con GUI v0.14.

Versión v1.7 · Documentación

Corpse v0.3​

  • Recompilada con GUI v0.14.

Versión v0.3 · Documentación

Numerical Storage v0.11​

  • Recompilada con GUI v0.14.

Versión v0.11 · Documentación

2026-08-24​

Shops v1.6​

  • Nuevo árbol de comandos de operador /tw shop admin: listado de tiendas, inspección de definiciones, control de sesiones de jugadores, reinicio en tiempo de ejecución, gestión de existencias de objetos directos e historial de transacciones.
  • Nuevo permiso typewriter.shop.admin (solo OP). typewriter.shop.open sigue disponible para los jugadores por defecto.
  • Un reinicio manual comparte el comportamiento del reinicio automático y recalcula el siguiente reinicio programado.
  • Corregido el registro del permiso del comando público para que los jugadores que no son operadores puedan abrir tiendas.

Versión v1.6 · Documentación

2026-08-16​

Discord v0.10​

  • Webhooks de hechos. El nuevo webhook_fact_event publica un cambio de hecho en cualquier destino webhook_definition, para los ámbitos de jugador, grupo de Typewriter y global, con audiencias opcionales, condiciones de valor, plantillas de mensaje y de embed, hilos de foro y menciones de rol. Los ámbitos de grupo y global eliminan los callbacks duplicados de los jugadores que observan el mismo hecho.
  • El enlace con Discord es totalmente opcional: sin un discord_link_manifest, la extensión ya no inicializa los puentes de Discord ni resuelve clases de JDA.
  • Un JDA desactivado o incompleto lo comunica el cliente en lugar de lanzar un NoClassDefFoundError en el hilo del servidor.
  • La versión pública ahora incluye JDA 6.5.0 y sus dependencias de ejecución.

Versión v0.10 · Documentación

2026-08-21​

GUI v0.13​

  • Objetos de ranura en vivo. itemProvider reconstruye el objeto, el nombre y el lore de una ranura al renderizar. Las ranuras de un layout se analizan una sola vez y se devuelve la misma lista en cada renderizado, de modo que un placeholder o una cuenta atrás en un lore se resolvían una vez y después quedaban congelados: autoRefreshTicks redibujaba para siempre un inventario idéntico.
  • Solo una apertura de ventana en curso a la vez. GuiFactory.open() se completa un tick después, así que hasta entonces el inventario superior sigue siendo la vista anterior y cada renderizado decidía volver a abrir. La segunda apertura cerraba la primera ventana, ese cierre se interpretaba como un cierre real y la sesión se destruía mientras su menú seguía en pantalla: todos los botones quedaban entonces muertos.
  • Una animación con una duración de 0 deja de ser una animación. El panel estampa un bloque de animación por defecto en cada ranura, por lo que los objetos decorativos se dibujaban en el índice 0, y el nuevo renderizado que programaban competía con la apertura pendiente.
  • Un botón etiquetado conserva las interacciones propias del autor. Rellenar buttonType solía descartar toda la lista de interacciones, por lo que un marcador que ningún resolutor reclamaba (prefijo equivocado, mayúsculas equivocadas o la extensión propietaria ausente de esa pantalla) se convertía en un objeto que reaccionaba al clic en silencio, sin nada en la consola.

Versión v0.13 · Documentación

Quest Codex v2.10​

  • Los menús que no se pueden dibujar se informan al arrancar, mientras todavía se está leyendo la consola, en lugar de fallar en silencio en el momento del clic. Cada mensaje indica la solución, no el síntoma.
  • Conversión única de las páginas creadas antes del chasis open_gui. El conjunto de layouts salió de category_menu a una entrada open_gui referenciada, de modo que una página escrita con el esquema anterior conservaba un layout que el motor ya no lee: completamente configurada en el panel, sin renderizar nada.
  • Los títulos de los logros pasan por la conversión real de MiniMessage a JSON, de modo que el formato escrito en el título de una misión sobrevive en el logro que genera.
  • Requiere OmniGUI v0.13.

Versión v2.10 · Documentación

Puzzle v0.2​

  • Nuevo activationRadius en cada puzzle, por defecto 16 bloques. Un puzzle solo se renderiza y se ejecuta para un jugador que esté en el mundo de sus propias posiciones, dentro de ese radio de una de ellas. 0 desactiva solo la comprobación de distancia: la comprobación de mundo se aplica siempre.
  • Corregido: un puzzle se dibujaba en todas las dimensiones. Los bloques y partículas del lado del cliente llevan coordenadas pero no mundo, por lo que una cuadrícula de láseres configurada en el Overworld se pintaba delante del jugador en el Nether, en el End o en cualquier otro mundo que visitara.
  • Corregido: un puzzle empezaba en cuanto el jugador se unía a su audiencia, fuera cual fuera la distancia. Una secuencia de memoria podía reproducir todo su patrón a alguien situado a miles de bloques, o en otro mundo. Ahora la secuencia empieza cuando el jugador llega al tablero.
  • Alejarse borra el tablero en el cliente y cancela las animaciones pendientes. El presupuesto de intentos, el cooldown de fallo, timeLimit y lifespan se activan al llegar y no al unirse a la audiencia.

Versión v0.2 · Documentación

Custom Biome v0.6​

  • Cambio incompatible: se elimina biome_audience. Respondía a "¿está este jugador en ese bioma?" leyendo el bioma propio del mundo, que una superposición en el cliente nunca cambia, así que para cada bioma que pinta esta extensión respondía falso, viera lo que viera el jugador en pantalla. Ninguna configuración conseguía que funcionara.
  • Dos entradas lo sustituyen: biome_overlay_audience (¿lleva este jugador esa superposición?) y biome_region_audience (¿está este jugador dentro de esa región, mundo incluido?). Las páginas que usan biome_audience deben redirigirse a una de ellas.
  • Las audiencias de región comparan también el mundo además de las coordenadas, de modo que una región definida en un mundo ya no coincide con las mismas coordenadas de otro. ignoreY convierte una región en una columna infinita.
  • /tw biome region <entry> rellena las dos esquinas de una entrada a partir de tu selección actual de WorldEdit, en lugar de escribir las coordenadas a mano.
  • Las superposiciones por jugador se rastrean por chunk y por propietario: varias superposiciones pueden cubrir un chunk, una prevalece, y al borrarla se restaura el bioma real de ese chunk y no la última paleta pintada.

Versión v0.6 · Documentación

Shops v1.5​

  • Recompilada con OmniGUI v0.13. GuiSlot ganó un parámetro itemProvider en tiempo de renderizado, lo que cambió el constructor al que enlazan sus llamadores, de modo que el JAR de la v1.4 lanzaba NoSuchMethodError en cuanto se abría una tienda en el motor de GUI actualizado: el inventario nunca aparecía.
  • Sin cambios de comportamiento. Las dos versiones van juntas: la v1.4 no puede ejecutarse en OmniGUI v0.13, y la v1.5 no puede ejecutarse en la v0.12.

Versión v1.5 · Documentación

Numerical Storage v0.10​

  • Recompilada con OmniGUI v0.13, por el mismo cambio de firma de GuiSlot: el JAR de la v0.9 lanzaba NoSuchMethodError al abrir un menú de almacenamiento, y el menú nunca aparecía.
  • Sin cambios de comportamiento y sin segunda migración: el almacenamiento con esquema v2 se lee exactamente como lo escribió la v0.9.

Versión v0.10 · Documentación

Corpse v0.2​

  • Recompilada con OmniGUI v0.13, por el mismo cambio de firma de GuiSlot: el JAR de la v0.1 lanzaba NoSuchMethodError al saquear un cadáver, por lo que el menú de botín nunca se abría y el cadáver se quedaba allí con su inventario inaccesible.
  • Sin cambios de comportamiento. Los cadáveres almacenados, sus inventarios y sus reglas de protección se leen como antes.

Versión v0.2

2026-08-12​

Versión v0.2 · Documentación

GUI v0.12​

  • Menús extendidos. extendToPlayerInventory en open_gui convierte las 36 ranuras del propio inventario del jugador en cuatro filas adicionales del menú, lo que da un lienzo de 10 filas. La proyección es solo del lado del cliente: nunca se escribe en el inventario real, y este se restaura cuando se cierra el menú.
  • Un layout raíz cuyo id termina en _extended activa esa proyección por sí mismo, de modo que un chasis compartido puede incluir una variante normal y otra extendida sin que cada menú repita la opción.
  • DynamicMarkers convierte los marcadores de contenido repetidos en marcadores indexados (QUEST_SLOT#0, QUEST_SLOT#1, …) antes de analizar, para que las extensiones dejen de mantener cada una una copia privada de esa semántica.
  • La repetición de ranuras está acotada e informada: las posiciones fuera de la cuadrícula se descartan y se registran con el id del layout y las coordenadas rechazadas. El editor avisa cuando count/gap/repeatY se definen sin una direction, y da un error si es desconocida.
  • Se documentó que gap es un paso (1 = adyacente) y que repeatY se repite sobre el eje perpendicular a direction.
  • Corregida la herencia de mainLayoutId: un valor en blanco en el hijo solía prevalecer sobre el heredado, de modo que una página que heredaba todo su chasis resolvía un layout inexistente y se renderizaba vacía, sin ningún botón que recibiera un clic.
  • El solapamiento de ranuras tiene un único propietario: cuando dos ranuras reclaman una celda, gana la que tiene comportamiento, tanto al renderizar como al hacer clic, y la colisión se registra una sola vez.
  • La validación al arrancar ahora informa solo de lo que realmente falla. Se eliminaron las comprobaciones que señalaban la ausencia de elementos opcionales (frame.view.unresolved, slot.outOfFrame, layout.unreferenced), porque en una arquitectura de plantillas describen el diseño, no un defecto. Lo que queda nombra una intención escrita que ha fallado: una vista que apunta a un layout inexistente, una ranura que sale del inventario, dos ranuras de la misma naturaleza que colisionan en un layout.

Versión v0.12 · Documentación

Shops v1.4​

  • Modo pestaña. baseMenuId convierte una tienda en una pestaña de un menú compartido: su conjunto de layouts y sus vistas se combinan bajo el chasis, con views, defaultViewId y un rectángulo de contenido (contentX, contentY, contentColumns, contentRows). Si se deja vacío, una tienda se abre exactamente como antes.
  • Compatibilidad con chasis extendidos: una tienda abierta dentro de una base extendida ahora obtiene el lienzo de 10 filas.
  • Añadidos defaultNameFormat y defaultLoreFormat. Un objeto que no declara nombre ni lore hereda el formato de la tienda; un objeto que declara los suyos los conserva intactos: el formato de la tienda rellena huecos, nunca sobrescribe la redacción de un autor.
  • Ambos aceptan los mismos tokens: {item}, {buy}, {sell}, {stock}, {stock_max}, {currency}. Una línea de lore que pide un precio no disponible se descarta en lugar de mostrarse vacía.
  • Añadido ShopTransactionEvent, que se dispara una vez completada una compra o una venta. Es el punto de enganche de otras extensiones (una retransmisión a Discord, un registro de auditoría) sin que Shops sepa que existen. Se anuncia, nunca es cancelable.
  • Añadido notificationWebhookId. Shops no lo resuelve y no sabe qué es un webhook; el id viaja en el evento. Un listener que lanza una excepción se comunica y la transacción se mantiene: nada deshace una compra pagada.
  • Corregido que un layout vaciado de sus marcadores se descartara del conjunto: una pantalla de tienda compuesta íntegramente por marcadores, o una pestaña todavía vacía, desaparecían en silencio.

Versión v1.4 · Documentación

Quest Codex v2.9​

  • La promoción del chasis extendido ahora se transmite por herencia y no mediante un id de layout literal. Un chasis cuya raíz se llamara de cualquier forma distinta de shell_root perdía su decoración extendida, y todos los controles anclados en la banda inferior desaparecían al renderizar, y por tanto no se podía hacer clic en ellos.
  • La extensión se compila con el motor de GUI de la oleada de versiones en lugar de con un JAR antiguo fijado. Estaba congelada en la v0.11 del motor, por lo que todo lo añadido después de esa versión le resultaba invisible.

Versión v2.9 · Documentación

Discord v0.9​

  • La extensión ahora es Discord, no Community. El directorio, el paquete y el nombre de la extensión siguen el cambio. Los nombres de las entradas no se tocan, porque las páginas los serializan.
  • DiscordClientService salió de la función de enlace a su propio paquete: la sincronización del chat, la consola y los informes de errores lo usan todos, por lo que nunca perteneció al enlace de cuentas.
  • Los webhooks son entradas. webhook_definition declara un destino de Discord una sola vez y se referencia en todas partes. La sincronización del chat, el enlace de cuentas y los informes de errores solían llevar cada uno su propia copia de la URL, el nombre de usuario y el avatar: cambiar de canal significaba editar cada manifiesto, sin nada que garantizara que apuntaban al mismo lugar.
  • WebhookService es un singleton que cualquier extensión puede inyectar. El cliente HTTP solía construirse a mano en el inicializador y entregarse a cada servicio, de modo que nada del exterior podía enviar un mensaje.
  • Los informes de errores perdieron su segundo interruptor de activación: un destino vacío es el estado desactivado.
  • Migración. Las páginas escritas antes de esta versión se convierten en el primer arranque: una webhook_definition por destino distinto (los manifiestos configurados de forma idéntica comparten una entrada) y los manifiestos se redirigen a ella. Antes se hace una copia de seguridad de cada página reescrita, en backup/community-webhook-v1/. La conversión se guía por la forma, no por un número de versión, así que ejecutarla dos veces no cambia nada. Un manifiesto que estaba desactivado conserva su URL en un destino desactivado en lugar de perderla.
  • Anuncios de tienda. shop_notification_manifest describe cómo se lee una transacción de tienda cuando llega a Discord. El destino está deliberadamente ausente de él, porque pertenece a la tienda. Así, una sola presentación sirve a todas las tiendas, mientras cada una sigue publicando en su propio canal. Requiere la extensión Shops pero no depende de ella.

Versión v0.9 · Documentación

Puzzle v0.1​

  • Primera versión.
  • Nueve tipos de puzzle, cada uno un objetivo de Typewriter con su propia audiencia, progreso y disparadores: empujar bloques, ofrendas en pedestal, secuencias de memoria, órdenes de palancas, colocación de patrones, giros de marcos de objetos, cerraduras de combinación, cuadrículas de láseres y placas de presión cooperativas.
  • Todo lo que dibuja un puzzle es del lado del cliente: los bloques, las vistas previas fantasma, los resaltados y los rayos láser se envían al jugador que lo resuelve. Dos jugadores pueden trabajar el mismo tablero sin ver el progreso del otro, y el mundo nunca se modifica.
  • Ciclo de vida compartido en cada puzzle: timeLimit, maxAttempts, cooldownOnFail, resetOnWrong, lifespan, pistas y los disparadores onStart / onComplete / onFail / onTimeout / onLifespanExpire.
  • isShared cambia un puzzle de progreso privado a un único tablero en el que avanza todo el grupo a la vez.
  • puzzle_chain ejecuta varios puzzles en orden y se dispara cuando se resuelve la secuencia; resetOnFail decide si un error devuelve al jugador al principio.
  • puzzle_artifact persiste el estado de los puzzles, de modo que un reinicio a mitad de un intento no borra el progreso.
  • puzzle_solved_fact y puzzle_active_fact exponen el progreso al resto de tu contenido; puzzle_menu lista los puzzles y su estado en el chat.
  • Compatible con Folia: cada lectura y escritura del mundo se ejecuta en la región propietaria del puzzle.

Versión v0.1 · Documentación

Corpse v0.1​

  • Primera versión.
  • Los cadáveres se renderizan una vez por espectador, como las visualizaciones de entidades propias del motor, de modo que todos los que están cerca los ven, con animación de modelo y placas de nombre que se actualizan en los motores de BetterModel, BTC Mob NPC y MythicMobs NPC.
  • Funciona en Folia: toda la planificación pasa por un planificador compatible con Folia, y las caídas de objetos, las orbes de experiencia y las partículas se ejecutan en la región propietaria del cadáver.
  • El inventario que contiene un cadáver sobrevive a un reinicio, a un fallo o a una recarga. Los cadáveres se almacenan en MySQL cuando está disponible y, en caso contrario, en la carpeta del plugin, y se restauran al arrancar.
  • Se aplica onlyOwnerCanLoot, y el saqueo se comprueba con el id de entidad propio del cadáver y no con cualquier clic derecho a menos de cuatro bloques.
  • Se elige una definición de cadáver por muerte según el mundo y la prioridad, y su duración se resuelve una sola vez, en ese cadáver.
  • Los eventos on_corpse_spawn, on_corpse_loot y on_corpse_expire pasan por la canalización de disparadores del motor y publican el propietario, el botín y la posición del cadáver como contexto.
  • Se respetan displayName, showDisplayName, dropOnInteract, renderArmor, playDeathAnimation y deathAnimationName, y la mayoría de los ajustes son valores dinámicos, por lo que pueden controlarse con placeholders y hechos.
  • Un contorno brillante renderizado en el cliente con un color configurable, y sonidos de cadáver enviados a cada jugador cercano en lugar de a todo el mundo.
  • Los hechos has_corpse y corpse_count, la audiencia corpse_owner_audience, corpse_waypoint que muestra la distancia y la dirección hacia el propio cadáver del jugador, corpse_recovery_objective, y corpse_admin_command con los subcomandos list y clear.
  • Una ventana de protección del botín, tras la cual el cadáver se abre a todos.
  • El menú de botín es un menú de la extensión GUI en lugar de un inventario simple con su propio listener de clics, por lo que hereda el enrutamiento de clics del motor, el historial de menús y la proyección del inventario extendido. Por tanto, la extensión GUI es obligatoria.

Versión v0.1 · Documentación

Custom Biome v0.5​

  • Los biomas personalizados existen de inmediato. Una definición se registra en el registro en vivo en cuanto se guarda, en lugar de solo tras reiniciar el servidor. El datapack generado es ahora la capa de persistencia y no el único camino.
  • Corregido que el servidor ignorara el datapack generado: su formato de pack estaba fijado a un valor antiguo y se escribía en una carpeta que el servidor nunca lee.
  • Corregido que baseBiome no tuviera ningún efecto salvo con las llanuras. Ahora los biomas se construyen a partir del bioma base que tiene el servidor y se codifican con su propio codec, de modo que las apariciones de mobs, las características y los carvers se heredan en lugar de perderse.
  • Corregido que los cambios de bioma abrieran agujeros en el mundo: la actualización enviaba paquetes de descarga de chunks, a los que el servidor nunca seguía con un reenvío. Ahora los clientes reciben una actualización de bioma construida a partir de los datos reales del chunk.
  • Corregido que leave_biome_event nunca se disparara. Los listeners de entrada y de salida se sobrescribían el estado mutuamente, por lo que el resultado dependía del orden de registro.
  • Corregido que la pintura escribiera todos los bloques de una columna en lugar de uno por celda de 4x4x4, y que lo hiciera desde el hilo que llamaba. Ahora las escrituras se programan en la región propietaria de cada chunk.
  • Un bioma que el servidor se negaría a serializar ahora se rechaza al registrarlo, nombrando el valor que lo causa. Antes se aceptaba y después rompía el inicio de sesión de todos los jugadores.
  • Superposiciones de bioma por jugador (player_biome_overlay_action): muestra a un jugador un bioma distinto sin tocar el mundo ni afectar a nadie más.
  • Pintura de regiones (paint_biome_region_action) con instantáneas, y restore_biome_action para devolver una región a su estado.
  • biome_transition_cinematic: cambia el bioma que ve un jugador a lo largo de una cinemática.
  • custom_biome_preset: comparte colores y atributos visuales entre biomas, con sobrescritura por definición.
  • explore_biome_objective y biome_discovery_fact: misiones que se completan visitando biomas.
  • Cada entrada de lectura ganó una opción source, que permite elegir entre lo que se muestra al jugador y lo que contiene el mundo.
  • Se eliminaron /tw biome setcolor, que creaba biomas desechables que nunca se persistían, y el modo de hecho HASH, cuyo valor no era estable entre reinicios.
  • El JAR de la extensión pasó de 2,6 MB a 230 KB: ya no incluye bibliotecas que el servidor ya proporciona.

Versión v0.5 · Documentación

Enchantment Creator v0.8​

  • levelMode en una mecánica compara runOnLevel como un nivel exacto, un mínimo (AT_LEAST) o un máximo (AT_MOST). Antes solo era posible una coincidencia exacta.
  • eventPhase ejecuta las acciones de una mecánica durante el evento actual de Bukkit, de modo que cancelar el evento o cambiar el daño tenga realmente efecto. Establécelo en false para las interacciones de Typewriter en cola.
  • clientSideEffects pasó a tener en cuenta al cliente, con una acción client_particle_effect: el artefacto personalizado de BTC usa el renderizador basado en PacketEvents cuando está disponible, y el artefacto público de Paper una alternativa de Bukkit limitada al jugador.
  • Las claves de registro ahora se derivan de id. El name anterior se conserva como alias heredado al cargar las páginas y los objetos existentes, de modo que no hay que volver a crear nada.
  • El artefacto público deliberadamente no lleva ninguna dependencia de BTC-CORE ni de BTC Velocity: se ejecuta en Paper 1.21.x con Java 21, compilado desde JDK 25 con bytecode de Java 21 como destino.

Versión v0.8 · Documentación

Numerical Storage v0.9​

  • transactionMode en la configuración de transacciones: INTERNAL mantiene la ruta de PlaceholderAPI más comando de consola, VAULT pasa directamente por la API de economía de Vault e ignora amountPlaceholder y los campos de comando.
  • addCommand y removeCommand estaban documentados al revés. addCommand completa un depósito en el almacenamiento y se comprueba antes de la mutación persistente; removeCommand completa una retirada.
  • La persistencia ahora es asíncrona, con bloqueos de mutación por artefacto y una caché de corta duración, de modo que los depósitos simultáneos ya no pueden competir entre sí.
  • Los archivos de almacenamiento pasan a la versión 2 del esquema JSON bajo una ruta técnica de artefacto. Un archivo heredado basado en el antiguo artifactId semántico se guarda en copia de seguridad en backups/numericalstorage/ y se migra en el primer acceso: haz una copia de seguridad del directorio assets/ de Typewriter antes de actualizar.
  • artifactId es un identificador técnico generado: déjalo vacío y Typewriter lo rellena.
  • Los placeholders reciben un argumento de definición explícito (%typewriter_ns_balance_bank%), lo que elimina la antigua ambigüedad de la división por guiones bajos cuando el ID de una definición contiene guiones bajos.
  • Claves opcionales conscientes del perfil cuando la integración con Profiles está instalada.

Versión v0.9

2026-08-07​

Versión v0.9 · Documentación

Quest Codex v2.8​

  • Logros reales de Minecraft. La nueva entrada advancement_definition escribe logros reales en un datapack que posee la extensión, por lo que aparecen en la pantalla de logros vanilla con su propia pestaña, árbol, marcos y avisos emergentes. parent hace referencia a otra definición, de modo que el árbol se dibuja en el editor de nodos.
  • grant_advancement concede un logro o lo retira, y recorre la cadena de padres para que un hijo nunca se obtenga bajo un padre no obtenido.
  • autoGrant hace que un logro se obtenga en el primer tick del jugador. En una raíz, esto es lo que da existencia a su pestaña antes de haber obtenido nada.
  • Corregido el orden de las misiones: una misión anidada lee su orden de su propia subcategoría, las misiones sin un orden explícito ya no se agrupan todas juntas y añadir una misión ya no borra el orden que ya tenía.
  • Los marcadores de misión están paginados, el modo de ordenación es por jugador y el seguimiento múltiple sobrevive a una reconexión en el orden que eligió el jugador.

Versión v2.8 · Documentación

GUI v0.11​

  • Tooltips de objetos, con un interruptor hideVanillaItemStats en la entrada de configuración de GUI.
  • Un layout paginado puede llevar un indicador de página, mediante el nuevo rol INDICATOR.
  • Los menús se validan cuando arranca el servidor: una ranura fuera de los límites, una plantilla ausente o un tipo de botón desconocido se nombran en la consola antes de que un jugador llegue a abrir el menú.
  • <shift:N> se resuelve sin CraftEngine, mediante la fuente Magic Digit incluida.
  • count y repeatY se documentan como recuentos de repetición de ranuras, no como tamaños de pila.

Versión v0.11 · Documentación

Shops v1.3​

  • Una tienda ya no puede dejar a un jugador por debajo de cero. Tres rutas independientes lo permitían.
  • Un saldo ilegible ya no se lee como cero, y se analizan los saldos con formato como 12.5k.

2026-08-03​

Versión v1.3 · Documentación

Quest Codex v2.7​

  • Añadidos modos de visualización de waypoints: WORLD_DIRECTIONAL proyecta los marcadores sobre una esfera alrededor de los ojos del jugador siguiendo la dirección real de su destino, TARGET_ANCHORED los coloca sobre el objetivo y ADAPTIVE suaviza la transición entre ambos. HUD_LOCKED sigue siendo el valor por defecto, de modo que las páginas existentes no cambian.
  • Añadidos un tamaño aparente constante y un desagrupamiento angular para que varios marcadores sigan siendo legibles cuando sus destinos comparten una línea de visión.
  • Añadido el renderizado de varios objetivos en una sola entrada de waypoint, con las nuevas selecciones de objetivo seguido ALL y ONE_PER_QUEST y un límite maxTargets.
  • Corregido que los waypoints ignoraran el seguimiento múltiple: los objetivos de las misiones seguidas secundarias nunca se resolvían, de modo que solo la misión principal producía un marcador.
  • Añadido quest_codex_locator_bar, que renderiza los mismos objetivos resueltos como puntos de la barra de localización vanilla en Minecraft 1.21.6+ sin generar ninguna entidad.

Versión v2.7

2026-08-02​

Versión v2.7 · Documentación

Quest Codex v2.6​

  • Añadida la recuperación persistente de los diálogos y cinemáticas de Typewriter interrumpidos, incluido el último fotograma de la cinemática. Ahora la recuperación conserva la instantánea capturada cuando Typewriter emite eventos de desmontaje tras la desconexión de un jugador.
  • Añadido el seguimiento múltiple persistente de misiones con un menú de misiones seguidas, placeholders dedicados y un banco de pruebas público de waypoint con dos misiones.
  • Añadidos waypoints solo de texto en el cliente con texto de icono configurable, visualizaciones de bloque centradas, rotación centrada de la baliza, alineación con el nivel del objetivo, interpolación suave, colocación cerca del objetivo y un cono de visibilidad horizontal configurable.
  • Eliminadas las antiguas capas de waypoint de visualización de objeto y de flecha direccional antes de su primer despliegue público.

Versión v2.6 · Documentación

GUI v0.10​

  • Añadidos los motores de layout Flex y Composite para la colocación adaptable de ranuras y capas de menú compuestas.
  • Añadidas vistas direccionables reutilizables con conjuntos de layouts heredados, vistas por defecto, rutas de navegación, etiquetas de vista e integración opcional con el historial.
  • Añadidas la migración de esquema consciente de las vistas y la integración con QuestCodex, además de metadatos de publicación en Maven.
  • Corregido que los cambios de vista reconstruyan los menús sin parpadeo de cierre y reapertura, y se hizo que el cierre del inventario fuera compatible con Folia.

Versión v0.10 · Documentación

Shops v1.2​

  • Recompilada y validada la Shop Extension pública con OmniGUI v0.10.
  • Se conservaron los layouts de tienda dinámicos existentes, el historial de navegación, la gestión del relleno, las reglas de existencias y de límites, y los gestores de botones de tienda personalizados.
  • No se necesita ninguna migración desde la Shop Extension v1.1.

Versión v1.2 · Documentación

MythicMobsNPC Extension v0.4.6​

  • Corregido que se ignorara un cambio de escala en un modelo que se entrega sin ninguna animación, igual que en la extensión BetterModel.
  • Las variantes de mobs vanilla (gato, zorro, lobo, aldeano y similares) se informan una sola vez en la consola en lugar de ignorarse en silencio: pertenecen a la configuración de MythicMobs, que es propietaria de la identidad del mob y las sobrescribiría en cada reaparición.
  • Corregido que una sola entrada de datos que fallaba cancelara todas las demás entradas enviadas en el mismo lote, lo que podía dejar a un NPC sin ninguno de sus datos configurados aplicados.
  • El efecto de brillo y el equipamiento ahora se aplican sobre el modelo, no solo sobre el mob. El cuerpo del mob está oculto tras el modelo, así que aplicarlos solo al mob no dejaba nada visible.
  • Ahora el equipamiento informa en la consola cuando el modelo no tiene hueso de objeto, en lugar de no hacer nada en silencio.
  • El fuego se reafirma cada segundo para que ya no se apague por sí solo, y ahora avisa cuando BetterModel oculta el cuerpo sobre el que se dibujan las llamas.
  • Corregido que la placa de nombre se entrecortara cuando el NPC camina o sigue una red de caminos: la visualización de texto ahora interpola entre actualizaciones en lugar de teletransportarse a saltos.

BetterModel Extension v1.3​

  • Corregido que se ignorara la escala del modelo en los modelos que se entregan sin ninguna animación. BetterModel solo recalcula la transformación de un modelo mientras se está ejecutando una animación, por lo que un cambio de escala aplicado en tiempo de ejecución nunca llegaba a un modelo estático. Ahora la extensión fuerza ella misma el recálculo.
  • La misma corrección se aplica al desfase del modelo, que pasaba por el mismo camino de código.
  • Las entradas de datos de entidad ahora llegan realmente al modelo en lugar de descartarse. Compatibles: efecto de brillo, color del efecto de poción (renderizado como un tinte del objeto), brillo de luz, restricción de billboard, duración de interpolación, traslación, escala 3D, tamaño de caja, equipamiento y en llamas.
  • Añadido bettermodel_bone_appearance, una versión por hueso de los ajustes de brillo, tinte, destello y luminosidad, con el mismo sistema de criterios que bettermodel_bone_visibility.
  • El equipamiento se asigna a los huesos de objeto de mano y de cabeza de BetterModel. Las ranuras de armadura se informan una sola vez en la consola en lugar de ignorarse en silencio, porque el torso y las piernas de un modelo llevan su propia geometría.
  • Una escala 3D que no es uniforme ahora avisa en lugar de usar en silencio un solo eje: BetterModel solo admite una escala uniforme.
  • Toda entrada de datos que no tiene sentido en un modelo 3D (poses, variantes de mobs, estado de cría...) ahora se informa una sola vez en la consola en lugar de descartarse en silencio.
  • El brillo, el tinte, la luminosidad, el billboard, la traslación y el equipamiento ahora sobreviven a una recarga del resource pack o a una reaparición en lugar de volver al aspecto por defecto del modelo.
  • Ahora el equipamiento informa en la consola cuando el modelo no tiene ningún hueso etiquetado ri, li o ph, en lugar de no hacer nada en silencio: ese es el motivo habitual por el que un objeto no aparece.
  • Ahora el fuego se dibuja sobre la entidad de interacción del NPC y no sobre los huesos del modelo: el cliente escala la llama según la caja de colisión de la entidad, y una entidad de visualización no tiene ninguna, por lo que las llamas se renderizaban con tamaño cero.

Nexo Extension v1.0​

  • Añadidos hechos para comprobar qué sostiene el jugador, qué lleva en el inventario, a qué mira o sobre qué está de pie.
  • Añadidas variables que dan el ID y las propiedades del objeto, bloque y mueble apuntados.
  • Añadidas una acción de dar y otra de quitar objetos, ambas basadas en el ID de objeto de Nexo.
  • Añadidos eventos de recoger, soltar y consumir objetos.
  • Añadidos eventos de interacción y de daño para bloques y muebles personalizados, además de un evento de caída de botín.
  • Ahora los eventos pasan sus datos (ID del bloque, posición, objeto en la mano) a lo que se ejecute a continuación, de modo que un diálogo o una acción pueden usarlos directamente.

CraftEngine Extension v1.0​

  • Ahora los objetivos de misión funcionan. Se pueden asociar a una misión, guardan el progreso y pueden activar una secuencia al completarse.
  • Añadidos hechos para los cooldowns, para los objetos sostenidos y transportados, y para el bloque o mueble al que apunta el jugador.
  • Añadidas variables que dan IDs, propiedades de objetos y la lista del contenido cargado.
  • Añadidas una acción de dar y otra de quitar objetos, ambas basadas en el ID de objeto de CraftEngine.
  • Añadidos eventos de recoger, soltar y consumir objetos.
  • Añadidos eventos para los intentos de colocación y para golpear muebles.
  • Ahora los eventos pasan sus datos a lo que se ejecute a continuación.

ItemsAdder Extension v1.0​

  • Ahora los eventos de bloques y muebles leen ItemsAdder directamente en lugar de deducirlos de los eventos vanilla, lo que los hace fiables y elimina un breve retraso que podía perder o repetir un disparador.
  • Añadidos hechos para los objetos sostenidos y transportados, los usos restantes, la durabilidad personalizada, la visibilidad del HUD y el crecimiento de los cultivos.
  • Añadidas variables que dan IDs, propiedades de objetos e imágenes de fuente.
  • Añadidas una acción de dar y otra de quitar objetos, ambas basadas en el ID de objeto de ItemsAdder.
  • Añadidos eventos de recoger, soltar y consumir objetos.
  • Añadidos eventos de interacción, un evento previo a la colocación para muebles y un evento de muerte de entidad personalizada.
  • Ahora los eventos pasan sus datos a lo que se ejecute a continuación.

2026-07-26​

Quest Codex v2.5​

  • Añadido el seguimiento múltiple persistente de misiones mediante la entrada quest_codex_tracking_artifact.
  • Añadidos el modo de menú de categoría @tracked y los marcadores dinámicos TRACKED_QUEST_SLOT.
  • Añadidos /tw codex tracked y el comando interno de GUI codex:tracked.
  • Añadidos placeholders de PlaceholderAPI para el número de misiones seguidas, el límite, la misión principal, las misiones seguidas indexadas, los estados, los objetivos y las prioridades.
  • Se documentó la estructura del paquete de páginas públicas: manifiesto principal, artefacto de seguimiento estático, definiciones de misiones y ajustes de GUI.

Versión v2.5 · Documentación

GUI v0.9​

  • Añadida la migración automática del esquema de las páginas públicas para el almacenamiento en línea y los campos de paginación heredados.
  • Se documentó el esquema compacto storagePool / storageId y navigationButtons usado para reducir los bloqueos de publicación del editor de Typewriter.
  • Se aclaró el patrón recomendado de menús referenciados para los menús grandes de QuestCodex.

Versión v0.9 · Documentación