Saltar al contenido principal

Puzzle

Nueve tipos de puzles con tableros en el cliente, temporizadores, intentos, cadenas y hechos.

Gratuitasv0.6Misiones y narrativa
RequiereTypeWriter0.9Basic (TypeWriter extension)

Descripción general​

Puzzle convierte un lugar de tu mundo en un puzzle que se puede resolver. Eliges una de nueve mecánicas: empujar bloques hasta unos agujeros, repetir una secuencia, accionar palancas en orden, redirigir rayos láser y más. Cada puzzle es una entrada de audiencia que colocas en el panel web. Comunica su resultado al resto de TypeWriter mediante disparadores (onStart, onComplete, onFail, onTimeout, onLifespanExpire) y un hecho opcional.

La mayor parte del tablero se dibuja en el cliente: los bloques, los resaltados, las vistas previas y las partículas láser son paquetes enviados al jugador que resuelve el puzzle, de modo que dos jugadores pueden trabajar en el mismo tablero sin ver el progreso del otro. Algunas mecánicas sí tocan el mundo: el puzzle de marcos de objetos gira un marco real, y el puzzle de patrones coloca bloques reales salvo que ghostBlocks esté activado.

Un puzzle pertenece al lugar donde lo construiste. Solo se ejecuta para un jugador que esté en el mundo de sus posiciones, a un máximo de activationRadius bloques de una de ellas. Al llegar al tablero empieza una sesión; al alejarse termina y se borra el tablero del cliente.

Características​

  • Nueve tipos de puzzle: empujar bloques, secuencia de memoria, cuadrícula de láseres, orden de palancas, colocación de patrones, placas de presión cooperativas, marco de objetos, cerradura de combinación y ofrenda en pedestal.
  • Ciclo de vida compartido: límite de tiempo, máximo de intentos fallidos, cooldown tras un fallo, duración de vida, pistas y un mensaje de finalización en cada puzzle.
  • Disparadores en todas partes: el inicio, la finalización, el fallo, el agotamiento del tiempo y la caducidad pueden activar cada uno una entrada de TypeWriter.
  • Recompensa en hecho: un hecho aumenta en amount cuando se resuelve el puzzle.
  • Cadenas de puzzles: ejecuta varios puzzles en orden y reacciona a la cadena completa.
  • Restricción espacial: una comprobación de mundo y un radio de activación impiden que un tablero aparezca en otra dimensión o lejos del lugar.
  • Estadísticas: intentos, resoluciones y mejor tiempo por jugador, con un comando de clasificación.
  • Hechos de estado: consulta si un puzzle está resuelto o activo para un jugador.
  • Compatible con Folia: el acceso al mundo se ejecuta en la región propietaria del puzzle.

Instalación​

  1. Instala la extensión Basic oficial de TypeWriter, que proporciona los tipos compartidos que usan los puzzles (sonidos, objetos, variables).
  2. Coloca el JAR de Puzzle en plugins/Typewriter/extensions/ y reinicia el servidor.
  3. Opcional: añade una entrada Puzzle Artifact a tus páginas si quieres que se guarden los intentos, las resoluciones y los mejores tiempos (consulta la advertencia en Configuración).

Primeros pasos​

Construye un puzzle de puerta con tres palancas:

  1. En el panel web de TypeWriter, abre una página de manifiesto y añade una entrada Lever Order.
  2. En levers, añade tres palancas. Para cada una, captura en el juego la position de un bloque de palanca y establece orderIndex en 0, 1 y 2, el orden en que el jugador debe accionarlas.
  3. Establece amount en 3 para que la pista muestre 1/3, 2/3, 3/3. Activa resetOnWrong y establece cooldownOnFail en 5 si quieres una pausa tras un error.
  4. Enlaza onComplete con una secuencia que abra la puerta y fact con un hecho almacenable en caché que guarde la recompensa. Este hecho es también la forma fiable de recordar que el puzzle se resolvió.
  5. Opcionalmente, coloca el puzzle bajo un filtro de audiencia, como una audiencia de misión, para que solo se ejecute para los jugadores adecuados.
  6. Publica, reinicia o recarga la extensión y acércate a las palancas. Accionarlas en el orden correcto resuelve el puzzle. Accionar la palanca equivocada restablece el estado de las palancas y dispara onFail.
Puzzles nuevos

Las entradas de puzzle se registran cuando se carga la extensión. Tras añadir un puzzle, recarga TypeWriter o reinicia antes de usar /typewriter puzzle start.

Cómo funciona​

Sesiones. Una sesión empieza cuando el jugador entra en el radio. Borra el progreso, los intentos fallidos y el cooldown de fallo, inicia timeLimit y lifespan, y dispara onStart. Así, maxAttempts es un presupuesto por sesión: un jugador que se queda sin intentos puede alejarse y volver. Un puzzle que un jugador ya ha resuelto no se vuelve a abrir para él.

Un puzzle resuelto queda inerte. Cuando un jugador ha resuelto un Block Push, Combination Lock, Lever Order o Laser Grid, este ya no dibuja tablero para él ni cancela sus interacciones, aunque vuelva a su audiencia (un filtro que parpadea, una reconexión). Las palancas y botones de un puzzle resuelto funcionan como bloques normales, y un Pedestal resuelto ya no se traga la recogida de su objeto.

Clics cancelados. El servidor responde a un clic cancelado con el estado real del bloque pulsado, lo que borraría un bloque dibujado en el cliente. Por eso el tablero se vuelve a dibujar un tick después de cada clic cancelado (botones de Memory, cuadrícula de Pattern, colocaciones rechazadas, empujes rechazados) y cuando un jugador golpea con clic izquierdo un espejo o una palanca dibujados.

La finalización se dispara una sola vez. La escritura del hecho, el mensaje de finalización, onComplete y el avance de la cadena proceden de un único resultado aceptado, por lo que un clic repetido no puede activarlos dos veces.

Progreso. Cada paso correcto aumenta el progreso en uno, hasta amount. {progress} y {total} en hintMessage muestran el progreso y amount. Los puzzles no establecen amount a partir de su propio tamaño, así que introduce tú mismo el número real de pasos.

Opciones compartidas​

Todos los puzzles tienen estos campos.

CampoSignificado
factUn hecho almacenable en caché que aumenta en amount cuando se resuelve el puzzle.
amountProgreso máximo y recompensa que se suma al hecho.
timeLimitSegundos antes de que el puzzle agote el tiempo. 0 lo desactiva.
cooldownOnFailSegundos que el jugador debe esperar tras un fallo.
maxAttemptsIntentos fallidos permitidos por sesión. 0 desactiva el límite.
resetOnWrongSi un paso incorrecto borra el progreso.
showHints, hintMessageUna pista en el chat tras cada paso, con {progress} y {total}. En blanco no envía nada.
completionMessageSe envía una vez al resolverse. En blanco lo desactiva. El valor por defecto es <green>Puzzle completed!.
onStart, onComplete, onFail, onTimeout, onLifespanExpireEntradas activadas para el jugador.
lifespanSegundos antes de que el puzzle caduque para el jugador, haga lo que haga. 0 lo desactiva.
activationRadiusBloques alrededor de las posiciones del puzzle. 0 elimina la comprobación de distancia, pero la comprobación de mundo se aplica siempre. El valor por defecto es 16.
criteriaCondiciones que debe cumplir un jugador para formar parte del puzzle.

Puzzles compartidos​

Cuando isShared está activado y el fact del puzzle tiene un grupo (party, equipo), el grupo juega un solo puzzle: cada paso, error y enfriamiento de un jugador se copia a los jugadores conectados de ese grupo. El primer miembro que lo resuelve lo resuelve para el grupo: el fact aumenta en amount una sola vez, y cada miembro recibe una vez el mensaje de finalización, onComplete y el paso de la cadena. Un miembro ausente los recibe cuando vuelve. Un jugador recibe la finalización de un puzzle como máximo una vez, aunque cambie de grupo; solo un reinicio de administrador que le afecte le permite recibirla de nuevo.

  • La resolución se guarda por grupo. Morir o reconectarse no la reinicia y no recompensa nada de nuevo, a diferencia de un puzzle en solitario, que se puede repetir tras una muerte o una desconexión.
  • Las estadísticas y el tablero de cada jugador siguen siendo personales. Sin grupo en el fact, o para un jugador que no pertenece a ningún grupo, no se comparte nada. Coop Pressure ignora isShared: ya completa el puzzle para cada participante.
  • Para volver a jugarlo, usa /typewriter puzzle admin reset <player> <id>, que lo reabre para todo el grupo de ese jugador.
Se requiere un Puzzle Artifact

La resolución del grupo se guarda en el Puzzle Artifact. Sin él, el registro solo existe en memoria: tras reiniciar el servidor, el grupo puede resolver el puzzle de nuevo y cobrar de nuevo. Añade el artifact antes de usar isShared. Volver a una versión anterior de la extensión también pierde el registro compartido, porque esa versión guarda el artifact sin él, y las recompensas se pagan de nuevo. La resolución se escribe en el siguiente guardado (cada 30 segundos): un fallo del servidor en esa ventana puede perderla.

Tipos de puzzle​

EntradaQué hace el jugadorCampos principales
Block PushHace clic izquierdo o derecho en un bloque para empujarlo un bloque en la dirección hacia la que mira, hasta llenar cada agujero objetivo.pushBlocks, targetHoles (con acceptedMaterial), blockMaterial, holeMaterial. El número de bloques debe ser igual al número de agujeros. allowPull no tiene efecto (tirar aún no está implementado).
Memory SequenceObserva cómo se iluminan los botones y luego hace clic en ellos en el mismo orden. La secuencia es aleatoria en cada sesión.buttons (al menos 2), sequenceLength, highlightDuration, stepGap, inputDelay (ticks), highlightMaterial.
Laser GridHace clic derecho en los espejos para girarlos hasta que cada receptor reciba un rayo de su color.emitters (color, dirección), mirrors (rotatable, initialDirection), receivers (requiredColor), maxReflections, maxBeamLength, beamDensity.
Lever OrderHace clic derecho en las palancas en el orden de su orderIndex. Una palanca equivocada las restablece todas.levers (position, orderIndex).
Pattern PlacementColoca bloques en una cuadrícula para reproducir un patrón.pattern, gridOrigin, columns, previewOffsetY, ghostBlocks, tolerance.
Coop PressureVarios jugadores se colocan sobre placas distintas y las mantienen durante unos segundos.plates, requiredPlayers, holdDuration (segundos).
Item FrameColoca un objeto en un marco de objetos existente y luego lo gira hasta el ángulo objetivo.frameTargets (correctRotation de 0 a 7, requiredItem), checkItem.
Combination LockHace clic en bloques de dígitos siguiendo el orden de un código.digits (posiciones), code (índices de dígitos, contados desde 0).
PedestalHace clic derecho en el bloque del pedestal con un objeto en la mano, o suelta o recoge el objeto cerca de él.targetPosition, requiredItem, consumeItem, pickupRadius, consumeDroppedItem.

Detalles de cada tipo:

  • Laser Grid. Un rayo empieza a un bloque del emisor y avanza en línea recta. Un espejo lo envía en la dirección hacia la que mira el espejo. Al hacer clic derecho en un espejo, su dirección pasa a ser la opuesta a la cara en la que hiciste clic, o gira en sentido horario si haces clic en su parte superior o inferior. Un bloque sólido detiene el rayo. El puzzle se resuelve cuando cada receptor recibe un rayo de su requiredColor. Los rayos se muestran con partículas. Un espejo no desaparece al hacer clic derecho: el tablero se vuelve a dibujar tras el clic. Los rayos se dibujan por el centro de los bloques y giran exactamente sobre cada espejo; beamDensity es el número de partículas por bloque. Un rayo mide como máximo maxBeamLength bloques (64 por defecto; 0 o menos equivale a 64, nunca ilimitado) y nunca carga un chunk: se detiene en el borde del mundo cargado. Un tablero con un rayo más largo debe aumentar maxBeamLength.
  • Block Push. Cada empuje mueve un bloque una casilla en la dirección a la que mira el jugador. Un bloque empujado de vuelta a su casilla de inicio siempre se acepta allí, y un agujero objetivo se vuelve a dibujar cuando un bloque se ha empujado sobre él y más allá. Deja vacías (aire) las casillas de inicio en el mundo. Un bloque real allí está oculto en el cliente pero sigue siendo sólido para el servidor, así que nadie podría ponerse encima. Un empuje rechazado (una pared, otro bloque) cuenta un intento fallido por bloque y casilla objetivo hasta que un empuje tiene éxito, por lo que mantener el clic contra una pared no consume maxAttempts.
  • Lever Order. Una palanca descansa en el estado que tiene en el mundo cuando el jugador llega al tablero, se acciona desde ahí y un reinicio, o un orden erróneo, la devuelve a ese estado, incluso si descansa activada. Un clic durante el cooldown de fallo no llega a una palanca real.
  • Combination Lock. La numeración empieza en 0: la primera posición listada en digits es el dígito 0, la segunda el dígito 1, y así sucesivamente. code lista esos índices en el orden de los clics. Por ejemplo, con cuatro botones en digits, el código [2, 0, 3] significa: tercer botón, primer botón, cuarto botón. Un valor de code fuera de los dígitos hace que la cerradura ignore todas las pulsaciones; el registro del servidor nombra el valor erróneo.
  • Pattern Placement. pattern enumera los materiales fila por fila, con columns de ancho, y su longitud debe ser múltiplo de columns. La cuadrícula está en el plano horizontal a la Y de gridOrigin, con las columnas a lo largo de X y las filas a lo largo de Z. Una vista previa flota previewOffsetY bloques por encima. Con ghostBlocks activado, se dibuja una versión translúcida sobre la propia cuadrícula y los bloques correctos se muestran en el cliente, quitando el objeto al jugador. Una colocación incorrecta siempre se cancela. tolerance es el número de colocaciones incorrectas permitidas antes de que se restablezca el progreso.
  • Coop Pressure. Una placa cuenta cuando los pies de un jugador están sobre ese bloque o sobre el bloque situado encima. Un jugador por placa. Todos los jugadores de la audiencia participan, así que añádelos con /typewriter puzzle join <entry id>. Cuando las placas se han mantenido durante holdDuration, todos los participantes completan el puzzle.
  • Item Frame. El marco debe existir ya en la posición configurada; el puzzle nunca genera uno. Un marco vacío solo acepta el requiredItem, tomado de la mano del jugador. Cada clic en un marco lleno lo gira un paso (45 grados), y correctRotation es el número de pasos, de 0 a 7, en el que es correcto. El marco es una entidad real, por lo que el giro es visible para todos.
  • Pedestal. El requiredItem se puede entregar con clic derecho, o soltar a una distancia de pickupRadius bloques del pedestal. Un objeto soltado que coincida se elimina cuando consumeDroppedItem está activado.

Comandos​

Todos los comandos son subcomandos de /typewriter (alias /tw). <id> es el id de entrada de un puzzle. Solo los comandos admin necesitan un permiso.

ComandoDescripción
/typewriter puzzleAbre el menú de chat de la primera entrada Puzzle Menu, o avisa de que no existe ninguna.
/typewriter puzzle listLista los puzzles registrados y sus tipos.
/typewriter puzzle start <id>Te añade a la audiencia de un puzzle. Lo rechaza si ya lo has resuelto.
/typewriter puzzle join <id>Te une a un puzzle que ya está en marcha, por ejemplo un puzzle cooperativo.
/typewriter puzzle chain <id>Inicia una cadena de puzzles por su id de entrada o su nombre.
/typewriter puzzle statusMuestra tu estado en cada puzzle: activo, completado, detenido o inactivo.
/typewriter puzzle leaderboard <id>Muestra tus estadísticas y los diez mejores jugadores de un puzzle.
/typewriter puzzle stop [id]Detiene un puzzle o todos tus puzzles activos y restablece su progreso.
/typewriter puzzle closeCierra tu inventario abierto.
/typewriter puzzle admin reset <player> <id>Restablece el estado de un jugador en un puzzle y lo reinicia. En un puzzle compartido, lo reabre para todo el grupo del jugador.
/typewriter puzzle admin reloadBorra todos los estados y cadenas en ejecución.

Permisos​

PermisoConcede
puzzle.adminLos comandos /typewriter puzzle admin.

Configuración​

Persistencia. Sin un Puzzle Artifact, no se guarda nada. Con uno, la extensión guarda el estado y las estadísticas cada 30 segundos y al apagarse, y los carga al iniciar. Crea exactamente un artefacto y conserva su artifactId generado. El artifact es obligatorio para los puzzles compartidos (consulta Puzzles compartidos).

Qué sobrevive a una desconexión

Cuando un jugador se desconecta, su estado de puzzle se elimina de la memoria y el siguiente guardado no lo contiene. Las estadísticas se conservan. Para recordar de forma permanente un puzzle resuelto, establece el fact del puzzle y lee ese hecho en tus criterios. Puzzle Solved Fact solo refleja el estado en memoria. Un puzzle compartido es la excepción: su resolución pertenece al grupo y se guarda en el artifact.

Mensajes. Ningún texto que se muestra en el juego está fijado en el código. Los textos que pertenecen a un puzzle son campos de su entrada, y las respuestas de los comandos y los dos mensajes que comparten todos los puzzles son snippets. Consulta Textos editables.

Textos editables​

Los textos son MiniMessage, así que puedes reformularlos, traducirlos o cambiarles el color. Un {name} en un texto se sustituye por el valor indicado en las tablas de abajo; un placeholder que no existe se queda tal cual. Los placeholders de PlaceholderAPI (%...%) se leen para el jugador que recibe el texto. Solo el registro de la consola del servidor permanece fijo, en inglés.

Campos de las entradas​

Estos campos están en la entrada, en el panel web. Cada uno es un texto por jugador, así que acepta variables, y un valor en blanco no envía nada. Las páginas existentes conservan los textos que ya guardan; los valores por defecto de abajo se aplican a las entradas nuevas y a las páginas que nunca guardaron el campo.

EntradaCampoPor defectoPlaceholders
Todos los puzzleshintMessageLa pista de cada tipo de puzzle, por ejemplo <yellow>Repeat the sequence! {progress}/{total}.{progress}, {total}
Todos los puzzlescompletionMessage<green>Puzzle completed!ninguno
Puzzle MenutitleText<gold><bold>Puzzles</bold> <gray>-ninguno
Puzzle MenupuzzleLineText<green>{puzzle} <gray>- <aqua>click to start{puzzle}, el id de la entrada del puzzle
Puzzle MenufooterText<gray>Use <white>/typewriter puzzle stop<gray> to stop all active puzzles.ninguno
Memory SequencememorizeMessage<gold>Memorize the sequence…ninguno
Memory SequenceyourTurnMessage<green>Your turn! <white>{progress}/{total}{progress}, {total}
Memory SequencestepCorrectMessage<green>Well done! <white>{progress}/{total}{progress}, {total}
Lever OrderwrongOrderMessage<red>Wrong order — the levers have been reset.ninguno
Pattern PlacementprogressMessage<green>Pattern <white>{progress}/{total}{progress}, {total}
Item FramemissingFrameMessage<red>No item frame at <white>{x} {y} {z}{x}, {y}, {z}
Item FramewrongItemMessage<red>That is not the right item in the frame.ninguno
Item FrameinsertingMessage<gray>Inserting the item…ninguno
Item FramemissingItemMessage<yellow>First place the requested item in the frame.ninguno
Item FrameitemPlacedMessage<green>Item placed — rotate the frame.ninguno
Item FramerotationMessage<gray>Rotation {current}/{total}{current}, {total}

hintMessage, completionMessage y los campos del menú de chat se envían en el chat; los demás campos se muestran en la action bar. Algunos de estos valores por defecto estaban en francés en versiones anteriores; ahora están en inglés, y una página que guardó el texto en francés lo conserva.

Snippets​

Todo lo que imprimen los comandos /typewriter puzzle, incluidos los de administración, y los dos mensajes compartidos por todos los puzzles, es un snippet de TypeWriter. Abre plugins/Typewriter/snippets.yml, busca la clave bajo content.puzzle, cambia el valor y ejecuta /tw reload. La extensión registra todos sus snippets con su texto por defecto al iniciarse, así que aparecen en el archivo tras el primer arranque.

Snippet (bajo content.puzzle.)Por defectoPlaceholders
command.no_menu<red>No puzzle menu configured.ninguno
command.list.none<red>No puzzles configured.ninguno
command.list.header<gold>=== Available Puzzles ===ninguno
command.list.line<green>{puzzle} <gray>- {type}{puzzle}, {type}
command.puzzle_not_found<red>Puzzle not found: <white>{puzzle}{puzzle}
command.start.already_completed<yellow>Puzzle already completed. Use <white>/typewriter puzzle admin reset {player} {puzzle}<yellow> to replay it.{player}, {puzzle}
command.start.started<green>Starting puzzle: <white>{type}{type}
command.join.already_completed<yellow>Puzzle already completed for you: <white>{puzzle}{puzzle}
command.join.joined<green>Joined puzzle: <white>{type}{type}
command.stop.not_active<gray>Puzzle is not active: <white>{puzzle}{puzzle}
command.stop.stopped<yellow>Stopped puzzle: <white>{puzzle}{puzzle}
command.stop.all_none<gray>No active puzzle.ninguno
command.stop.all_stopped<yellow>Stopped <white>{count} <yellow>puzzle(s).{count}
command.status.header<gold>=== Puzzle Status ===ninguno
command.status.line<gray>{puzzle}: {status} <dark_gray>progress={progress}{puzzle}, {status}, {progress}
command.status.active<green>ACTIVEninguno
command.status.completed<aqua>COMPLETEDninguno
command.status.stopped<yellow>STOPPEDninguno
command.status.inactive<gray>INACTIVEninguno
command.chain.not_found<red>Chain not found: <white>{chain}{chain}
command.chain.invalid<red>Chain is invalid or contains unresolved puzzles: <white>{chain}{chain}
command.chain.empty<red>Chain has no resolvable puzzle entries.ninguno
command.chain.started<green>Starting puzzle chain: <white>{chain}{chain}
command.leaderboard.header<gold>=== Puzzle Stats: <white>{puzzle} <gold>==={puzzle}
command.leaderboard.attempts<gray>Attempts: <white>{attempts}{attempts}
command.leaderboard.solves<gray>Solves: <white>{solves}{solves}
command.leaderboard.best_time<gray>Best time: <white>{seconds}s{seconds}
command.leaderboard.rows_header<gold>--- Leaderboard ---ninguno
command.leaderboard.row<gray>#{rank} <white>{player} <gray>- <white>{solves} solves{rank}, {player}, {solves}
command.leaderboard.row_timed<gray>#{rank} <white>{player} <gray>- <white>{solves} solves <gray>{seconds}s{rank}, {player}, {solves}, {seconds}
command.admin.reset.player_not_found<red>Player not found: <white>{player}{player}
command.admin.reset.done<green>Reset puzzle <white>{puzzle} <green>for <white>{player}{puzzle}, {player}
command.admin.reset.done_group<green>Reset puzzle <white>{puzzle} <green>for <white>{player} <green>and its group (<white>{count}<green> online){puzzle}, {player}, {count}
command.admin.reload.done<green>Puzzle runtime states cleared.ninguno
play.cooldown_wait<red>Puzzle on cooldown — <white>{seconds}s{seconds}
play.max_attempts<red>Too many mistakes — restart the puzzle to try again.ninguno

{type} es el nombre del tipo de puzzle (Memory Sequence, Lever Order, ...) y {status} es uno de los cuatro snippets command.status.*, así que ambos conservan sus colores. Cualquier otro placeholder es texto sin formato: lo que un jugador escribe en un comando no puede añadir formato a la respuesta.

Entradas​

14 entradas, generadas a partir del código fuente de la extensión.

Acciones1
Hechos2
Audiencias9
Artefactos1
Otras entradas1

Resolución de problemas​

El tablero no aparece. Debes estar en el mundo de las posiciones del puzzle y a un máximo de activationRadius de una de ellas. Las posiciones que se dejan en 0, 0, 0 se ignoran, por lo que un puzzle sin posiciones definidas no tiene punto de anclaje.

No pasa nada cuando hago clic. Comprueba que estás en la audiencia (los criterios deben coincidir y un filtro de audiencia debe incluirte) y que el puzzle no está ya resuelto para ti: usa /typewriter puzzle status y /typewriter puzzle admin reset <player> <id> para volver a jugar. Los clics durante el cooldown de fallo se ignoran; la barra de acción muestra el tiempo restante.

/typewriter puzzle start dice que no se encuentra el puzzle. Los puzzles se registran cuando se carga la extensión, por id de entrada. Recarga tras añadir un puzzle y usa el id de la entrada, no su nombre.

El puzzle de memoria nunca empieza. buttons necesita al menos 2 elementos, y cada uno necesita una posición.

El puzzle de patrones ignora mis bloques. pattern debe tener una longitud múltiplo de columns, y debes colocar los bloques en la cuadrícula a la Y de gridOrigin. Un material incorrecto se cancela.

El puzzle de marcos de objetos dice que no hay marco. Coloca primero un marco de objetos en la posición configurada. El registro también imprime una advertencia con las coordenadas.

Se pierde el progreso tras reconectar. Consulta la advertencia en Configuración: usa fact para conservar el resultado.

Un puzzle cooperativo nunca se completa. Todos los jugadores deben estar en la audiencia (/typewriter puzzle join <id>), situarse en una placa distinta y permanecer en ella durante holdDuration. Los objetos soltados sobre las placas no cuentan.