Aller au contenu principal

Puzzle

Neuf types de puzzles avec plateaux côté client, minuteurs, tentatives, chaînes et faits.

Gratuitesv0.6Quêtes et narration
NécessiteTypeWriter0.9Basic (TypeWriter extension)

Présentation​

Puzzle transforme un lieu de votre monde en énigme à résoudre. Vous choisissez l'une des neuf mécaniques : pousser des blocs dans des trous, répéter une séquence, actionner des leviers dans l'ordre, rediriger des rayons laser, et plus encore. Chaque énigme est une entrée d'audience que vous placez dans le panneau web. Elle communique son résultat au reste de TypeWriter via des triggers (onStart, onComplete, onFail, onTimeout, onLifespanExpire) et un fact facultatif.

L'essentiel du plateau est dessiné côté client : blocs, surbrillances, aperçus et particules de laser sont des paquets envoyés au joueur qui résout l'énigme, de sorte que deux joueurs peuvent travailler sur le même plateau sans voir la progression de l'autre. Quelques mécaniques modifient bien le monde : l'énigme de cadre d'objet fait pivoter un vrai cadre d'objet, et l'énigme de motif place de vrais blocs sauf si ghostBlocks est activé.

Une énigme appartient à l'endroit où vous l'avez construite. Elle ne s'exécute que pour un joueur se trouvant dans le monde de ses positions, à moins de activationRadius blocs de l'une d'elles. Atteindre le plateau démarre une session ; s'en éloigner y met fin et efface le plateau côté client.

Fonctionnalités​

  • Neuf types d'énigmes — poussée de blocs, séquence de mémoire, grille de lasers, ordre de leviers, placement de motif, plaques de pression coopératives, cadre d'objet, serrure à combinaison et offrande sur piédestal.
  • Cycle de vie partagé — limite de temps, nombre maximal de tentatives erronées, cooldown après échec, durée de vie, indices et message de réussite sur chaque énigme.
  • Des triggers partout — le début, la réussite, l'échec, le dépassement de temps et l'expiration de la durée de vie peuvent chacun lancer une entrée TypeWriter.
  • Récompense en fact — un fact est augmenté de amount lorsque l'énigme est résolue.
  • Chaînes d'énigmes — enchaînez plusieurs énigmes dans l'ordre et réagissez à l'ensemble de la chaîne.
  • Restriction spatiale — une vérification du monde et un rayon d'activation empêchent un plateau d'apparaître dans une autre dimension ou trop loin.
  • Statistiques — tentatives, réussites et meilleur temps par joueur, avec une commande de classement.
  • Facts de statut — lisez si une énigme est résolue ou active pour un joueur.
  • Compatible Folia — l'accès au monde s'exécute sur la région qui possède l'énigme.

Installation​

  1. Installez l'extension officielle TypeWriter Basic, qui fournit les types partagés utilisés par les énigmes (sons, objets, variables).
  2. Placez le JAR de Puzzle dans plugins/Typewriter/extensions/ et redémarrez le serveur.
  3. Facultatif : ajoutez une entrée Puzzle Artifact à vos pages si vous voulez que les tentatives, les réussites et les meilleurs temps soient sauvegardés (voir l'avertissement dans Configuration).

Premiers pas​

Construisez une énigme de porte à trois leviers :

  1. Dans le panneau web de TypeWriter, ouvrez une page manifest et ajoutez une entrée Lever Order.
  2. Dans levers, ajoutez trois leviers. Pour chacun, capturez en jeu la position d'un bloc levier et définissez orderIndex sur 0, 1 et 2, l'ordre dans lequel le joueur doit les actionner.
  3. Définissez amount sur 3 pour que l'indice affiche 1/3, 2/3, 3/3. Activez resetOnWrong, et définissez cooldownOnFail sur 5 si vous voulez une pause après une erreur.
  4. Reliez onComplete à une séquence qui ouvre la porte, et fact à un fact cachable qui stocke la récompense. Ce fact est aussi le moyen fiable de mémoriser que l'énigme a été résolue.
  5. Facultativement, placez l'énigme sous un filtre d'audience tel qu'une audience de quête, pour qu'elle ne s'exécute que pour les bons joueurs.
  6. Publiez, redémarrez ou rechargez l'extension, puis approchez-vous des leviers. Les actionner dans le bon ordre résout l'énigme. Actionner le mauvais levier réinitialise l'état des leviers et déclenche onFail.
Nouvelles énigmes

Les entrées d'énigme sont enregistrées au chargement de l'extension. Après avoir ajouté une énigme, rechargez TypeWriter ou redémarrez avant d'utiliser /typewriter puzzle start.

Fonctionnement​

Sessions. Une session démarre lorsque le joueur entre dans le rayon. Elle efface la progression, les tentatives erronées et le cooldown d'échec, lance timeLimit et lifespan, et déclenche onStart. Ainsi, maxAttempts est un budget par session : un joueur qui l'épuise peut s'éloigner puis revenir. Une énigme déjà résolue par un joueur n'est jamais rouverte pour lui.

Un puzzle résolu devient inerte. Une fois qu'un joueur a résolu un Block Push, Combination Lock, Lever Order ou Laser Grid, celui-ci ne dessine plus de plateau pour lui et n'annule plus ses interactions, même s'il revient dans son audience (un filtre qui clignote, une reconnexion). Les leviers et boutons d'un puzzle résolu fonctionnent comme des blocs ordinaires, et un Pedestal résolu n'avale plus la récupération de son objet.

Clics annulés. Le serveur répond à un clic annulé avec l'état réel du bloc cliqué, ce qui effacerait un bloc dessiné côté client. Le plateau est donc redessiné un tick après chaque clic annulé (boutons Memory, grille Pattern, placements refusés, poussées refusées), et quand un joueur frappe un miroir ou un levier dessiné en clic gauche.

La réussite ne se déclenche qu'une fois. L'écriture du fact, le message de réussite, onComplete et la progression de la chaîne proviennent d'un seul résultat accepté ; un clic répété ne peut donc pas les déclencher deux fois.

Progression. Chaque étape correcte augmente la progression d'un point, jusqu'à amount. {progress} et {total} dans hintMessage affichent la progression et amount. Les énigmes ne déduisent pas amount de leur propre taille ; saisissez donc vous-même le nombre réel d'étapes.

Options communes​

Chaque énigme possède ces champs.

ChampSignification
factUn fact cachable augmenté de amount lorsque l'énigme est résolue.
amountProgression maximale, et récompense ajoutée au fact.
timeLimitSecondes avant que l'énigme n'expire. 0 la désactive.
cooldownOnFailSecondes que le joueur doit attendre après un échec.
maxAttemptsTentatives erronées autorisées par session. 0 désactive la limite.
resetOnWrongIndique si une mauvaise étape efface la progression.
showHints, hintMessageUn indice dans le chat après chaque étape, avec {progress} et {total}. Vide, rien n'est envoyé.
completionMessageEnvoyé une fois lorsque l'énigme est résolue. Vide pour le désactiver. La valeur par défaut est <green>Puzzle completed!.
onStart, onComplete, onFail, onTimeout, onLifespanExpireEntrées déclenchées pour le joueur.
lifespanSecondes avant que l'énigme n'expire pour le joueur, quoi qu'il fasse. 0 la désactive.
activationRadiusBlocs autour des positions de l'énigme. 0 supprime la vérification de distance, mais la vérification du monde s'applique toujours. La valeur par défaut est 16.
criteriaConditions qu'un joueur doit remplir pour participer à l'énigme.

Énigmes partagées​

Lorsque isShared est activé et que le fact de l'énigme a un groupe (party, équipe), le groupe joue une seule énigme : chaque étape, erreur et cooldown d'un joueur est copié aux joueurs en ligne de ce groupe. Le premier membre qui la résout la résout pour le groupe : le fact est augmenté de amount une seule fois, et chaque membre reçoit une fois le message de complétion, onComplete et l'étape de chaîne. Un membre absent les reçoit à son retour. Un joueur reçoit la complétion d'une énigme au plus une fois, même s'il change de groupe ; seule une réinitialisation admin qui le concerne lui permet de la recevoir de nouveau.

  • La résolution est conservée par groupe. Mourir ou se reconnecter ne la réinitialise pas et ne récompense rien de nouveau, contrairement à une énigme solo, qui peut être rejouée après une mort ou une déconnexion.
  • Les statistiques et le plateau de chaque joueur restent personnels. Sans groupe sur le fact, ou pour un joueur qui n'appartient à aucun groupe, rien n'est partagé. Coop Pressure ignore isShared : il complète déjà l'énigme pour chaque participant.
  • Pour la rejouer, utilisez /typewriter puzzle admin reset <player> <id>, qui la rouvre pour tout le groupe de ce joueur.
Un Puzzle Artifact est obligatoire

La résolution du groupe est sauvegardée dans le Puzzle Artifact. Sans lui, l'enregistrement n'existe qu'en mémoire : après un redémarrage du serveur, le groupe peut résoudre de nouveau l'énigme et être payé de nouveau. Ajoutez l'artifact avant d'utiliser isShared. Revenir à un ancien build de l'extension fait aussi perdre l'enregistrement partagé, car ce build sauvegarde l'artifact sans lui, et les récompenses sont de nouveau versées. La résolution est écrite à la prochaine sauvegarde (toutes les 30 secondes) : un crash dans cette fenêtre peut la perdre.

Types d'énigmes​

EntréeCe que fait le joueurChamps principaux
Block PushFaire un clic gauche ou droit sur un bloc pour le pousser d'un bloc dans la direction où regarde le joueur, jusqu'à ce que chaque trou cible soit rempli.pushBlocks, targetHoles (avec acceptedMaterial), blockMaterial, holeMaterial. Le nombre de blocs doit être égal au nombre de trous. allowPull n'a aucun effet (le tirage n'est pas encore implémenté).
Memory SequenceRegarder des boutons s'allumer, puis cliquer dessus dans le même ordre. La séquence est aléatoire à chaque session.buttons (au moins 2), sequenceLength, highlightDuration, stepGap, inputDelay (ticks), highlightMaterial.
Laser GridFaire un clic droit sur des miroirs pour les faire pivoter jusqu'à ce que chaque récepteur soit touché par un rayon de sa couleur.emitters (couleur, direction), mirrors (rotatable, initialDirection), receivers (requiredColor), maxReflections, maxBeamLength, beamDensity.
Lever OrderFaire un clic droit sur des leviers dans l'ordre de leur orderIndex. Un mauvais levier les réinitialise tous.levers (position, orderIndex).
Pattern PlacementPlacer des blocs sur une grille pour reproduire un motif.pattern, gridOrigin, columns, previewOffsetY, ghostBlocks, tolerance.
Coop PressurePlusieurs joueurs se tiennent sur des plaques différentes et maintiennent la position quelques secondes.plates, requiredPlayers, holdDuration (secondes).
Item FramePlacer un objet dans un cadre d'objet existant, puis le faire pivoter jusqu'à l'angle cible.frameTargets (correctRotation de 0 à 7, requiredItem), checkItem.
Combination LockCliquer sur des blocs chiffres dans l'ordre d'un code.digits (positions), code (indices des chiffres, comptés depuis 0).
PedestalFaire un clic droit sur le bloc piédestal en tenant un objet, ou lâcher ou ramasser l'objet près de lui.targetPosition, requiredItem, consumeItem, pickupRadius, consumeDroppedItem.

Détails de chaque type :

  • Laser Grid. Un rayon part à un bloc de l'émetteur et va tout droit. Un miroir l'envoie dans la direction vers laquelle il est orienté. Un clic droit sur un miroir définit sa direction à l'opposé de la face cliquée, ou le fait pivoter dans le sens horaire si vous cliquez sur son dessus ou son dessous. Un bloc solide arrête le rayon. L'énigme est résolue lorsque chaque récepteur est touché par un rayon de sa requiredColor. Les rayons sont affichés avec des particules. Un miroir ne disparaît pas au clic droit : le plateau est redessiné après le clic. Les rayons sont dessinés au centre des blocs et tournent exactement sur chaque miroir ; beamDensity est le nombre de particules par bloc. Un rayon mesure au plus maxBeamLength blocs (64 par défaut ; 0 ou moins vaut 64, jamais illimité) et ne charge jamais de chunk : il s'arrête au bord du monde chargé. Un plateau au rayon plus long doit augmenter maxBeamLength.
  • Block Push. Chaque poussée déplace un bloc d'une case dans la direction où regarde le joueur. Un bloc repoussé sur sa case de départ y est toujours accepté, et un trou cible est redessiné une fois qu'un bloc a été poussé dessus puis au-delà. Laissez les cases de départ vides (air) dans le monde. Un vrai bloc y est caché côté client mais reste solide pour le serveur : personne ne pourrait se tenir dessus. Une poussée refusée (un mur, un autre bloc) compte une erreur par bloc et par case cible jusqu'à ce qu'une poussée réussisse : maintenir le clic contre un mur ne consomme donc pas maxAttempts.
  • Lever Order. Un levier repose dans l'état qu'il a dans le monde quand le joueur atteint le plateau, se bascule à partir de là, et y est remis par une réinitialisation ou après un mauvais ordre, même s'il repose allumé. Un clic pendant le délai d'échec n'atteint pas un vrai levier.
  • Combination Lock. La numérotation commence à 0 : la première position listée dans digits est le chiffre 0, la deuxième le chiffre 1, et ainsi de suite. code liste ces indices dans l'ordre des clics. Par exemple, avec quatre boutons dans digits, le code [2, 0, 3] signifie : troisième bouton, premier bouton, quatrième bouton. Une valeur de code hors des chiffres fait ignorer toutes les pressions à la serrure ; le journal du serveur nomme la valeur fautive.
  • Pattern Placement. pattern liste les matériaux ligne par ligne, sur columns colonnes de large, et sa longueur doit être un multiple de columns. La grille repose sur le plan horizontal à la hauteur Y de gridOrigin, avec les colonnes le long de X et les lignes le long de Z. Un aperçu flotte previewOffsetY blocs au-dessus. Avec ghostBlocks activé, une version translucide est dessinée sur la grille elle-même et les blocs corrects sont affichés côté client, en prélevant l'objet chez le joueur. Un mauvais placement est toujours annulé. tolerance est le nombre de mauvais placements autorisés avant que la progression ne soit réinitialisée.
  • Coop Pressure. Une plaque compte lorsque les pieds d'un joueur sont sur ce bloc, ou sur le bloc au-dessus. Un joueur par plaque. Tous les joueurs de l'audience participent ; ajoutez-les donc avec /typewriter puzzle join <entry id>. Lorsque les plaques ont été maintenues pendant holdDuration, chaque participant réussit l'énigme.
  • Item Frame. Le cadre doit déjà exister à la position configurée ; l'énigme n'en fait jamais apparaître. Un cadre vide n'accepte que le requiredItem, pris dans la main du joueur. Chaque clic sur un cadre rempli le fait pivoter d'un cran (45 degrés), et correctRotation est le nombre de crans, de 0 à 7, pour lequel il est correct. Le cadre est une vraie entité, la rotation est donc visible de tous.
  • Pedestal. Le requiredItem peut être donné par clic droit, ou lâché à moins de pickupRadius blocs du piédestal. Un objet lâché qui correspond est retiré lorsque consumeDroppedItem est activé.

Commandes​

Toutes les commandes sont des sous-commandes de /typewriter (alias /tw). <id> est l'identifiant d'entrée d'une énigme. Seules les commandes admin nécessitent une permission.

CommandeDescription
/typewriter puzzleOuvre le menu de chat de la première entrée Puzzle Menu, ou indique qu'il n'en existe aucune.
/typewriter puzzle listListe les énigmes enregistrées et leurs types.
/typewriter puzzle start <id>Vous ajoute à l'audience d'une énigme. Refuse si vous l'avez déjà résolue.
/typewriter puzzle join <id>Rejoint une énigme déjà en cours, par exemple une énigme coopérative.
/typewriter puzzle chain <id>Démarre une chaîne d'énigmes par son identifiant d'entrée ou son nom.
/typewriter puzzle statusAffiche votre état sur chaque énigme : active, terminée, arrêtée ou inactive.
/typewriter puzzle leaderboard <id>Affiche vos statistiques et les dix meilleurs joueurs d'une énigme.
/typewriter puzzle stop [id]Arrête une énigme ou toutes vos énigmes actives, et réinitialise leur progression.
/typewriter puzzle closeFerme votre inventaire ouvert.
/typewriter puzzle admin reset <player> <id>Réinitialise l'état d'un joueur pour une énigme et la relance. Pour une énigme partagée, la rouvre pour tout le groupe du joueur.
/typewriter puzzle admin reloadEfface tous les états d'exécution et toutes les chaînes.

Permissions​

PermissionAutorise
puzzle.adminLes commandes /typewriter puzzle admin.

Configuration​

Persistance. Sans Puzzle Artifact, rien n'est sauvegardé. Avec un artifact, l'extension sauvegarde l'état et les statistiques toutes les 30 secondes et à l'arrêt, et les charge au démarrage. Créez exactement un artifact et conservez son artifactId généré. L'artifact est obligatoire pour les énigmes partagées (voir Énigmes partagées).

Ce qui survit à une déconnexion

Lorsqu'un joueur se déconnecte, l'état de ses énigmes est retiré de la mémoire, et la sauvegarde suivante ne le contient pas. Les statistiques restent. Pour mémoriser durablement une énigme résolue, définissez le fact de l'énigme et lisez ce fact dans vos critères. Puzzle Solved Fact ne reflète que l'état en mémoire. Une énigme partagée fait exception : sa résolution appartient au groupe et est sauvegardée dans l'artifact.

Messages. Aucun texte affiché en jeu n'est figé dans le code. Les textes propres à une énigme sont des champs de son entrée ; les réponses des commandes et les deux messages communs à toutes les énigmes sont des snippets. Voir Textes modifiables.

Textes modifiables​

Les textes sont en MiniMessage : vous pouvez les reformuler, les traduire ou les recolorer. Un {name} dans un texte est remplacé par la valeur indiquée dans les tableaux ci-dessous ; un placeholder qui n'existe pas reste tel quel. Les placeholders PlaceholderAPI (%...%) sont lus pour le joueur qui reçoit le texte. Seul le journal de la console du serveur reste figé, en anglais.

Champs des entrées​

Ces champs se trouvent sur l'entrée, dans le panel web. Chacun est un texte par joueur : il accepte donc des variables, et une valeur vide n'envoie rien. Les pages existantes gardent les textes qu'elles stockent déjà ; les valeurs par défaut ci-dessous s'appliquent aux nouvelles entrées et aux pages qui n'ont jamais stocké le champ.

EntréeChampPar défautPlaceholders
Toutes les énigmeshintMessageL'indice de chaque type d'énigme, par exemple <yellow>Repeat the sequence! {progress}/{total}.{progress}, {total}
Toutes les énigmescompletionMessage<green>Puzzle completed!aucun
Puzzle MenutitleText<gold><bold>Puzzles</bold> <gray>-aucun
Puzzle MenupuzzleLineText<green>{puzzle} <gray>- <aqua>click to start{puzzle}, l'identifiant d'entrée de l'énigme
Puzzle MenufooterText<gray>Use <white>/typewriter puzzle stop<gray> to stop all active puzzles.aucun
Memory SequencememorizeMessage<gold>Memorize the sequence…aucun
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.aucun
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.aucun
Item FrameinsertingMessage<gray>Inserting the item…aucun
Item FramemissingItemMessage<yellow>First place the requested item in the frame.aucun
Item FrameitemPlacedMessage<green>Item placed — rotate the frame.aucun
Item FramerotationMessage<gray>Rotation {current}/{total}{current}, {total}

hintMessage, completionMessage et les champs du menu de chat sont envoyés dans le chat ; les autres champs s'affichent dans l'action bar. Certaines de ces valeurs par défaut étaient en français dans les versions précédentes ; elles sont désormais en anglais, et une page qui a stocké le texte français le garde.

Snippets​

Tout ce qu'affichent les commandes /typewriter puzzle, commandes d'administration comprises, ainsi que les deux messages communs à toutes les énigmes, est un snippet TypeWriter. Ouvrez plugins/Typewriter/snippets.yml, trouvez la clé sous content.puzzle, changez la valeur et lancez /tw reload. L'extension enregistre tous ses snippets avec leur texte par défaut au démarrage : ils apparaissent donc dans le fichier après le premier démarrage.

Snippet (sous content.puzzle.)Par défautPlaceholders
command.no_menu<red>No puzzle menu configured.aucun
command.list.none<red>No puzzles configured.aucun
command.list.header<gold>=== Available Puzzles ===aucun
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.aucun
command.stop.all_stopped<yellow>Stopped <white>{count} <yellow>puzzle(s).{count}
command.status.header<gold>=== Puzzle Status ===aucun
command.status.line<gray>{puzzle}: {status} <dark_gray>progress={progress}{puzzle}, {status}, {progress}
command.status.active<green>ACTIVEaucun
command.status.completed<aqua>COMPLETEDaucun
command.status.stopped<yellow>STOPPEDaucun
command.status.inactive<gray>INACTIVEaucun
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.aucun
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 ---aucun
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.aucun
play.cooldown_wait<red>Puzzle on cooldown — <white>{seconds}s{seconds}
play.max_attempts<red>Too many mistakes — restart the puzzle to try again.aucun

{type} est le nom du type d'énigme (Memory Sequence, Lever Order, ...) et {status} est l'un des quatre snippets command.status.* : les deux gardent donc leurs couleurs. Tout autre placeholder est du texte brut : ce qu'un joueur tape dans une commande ne peut pas ajouter de mise en forme à la réponse.

Entrées​

14 entrées, générées depuis la source de l'extension.

Actions1
Faits2
Audiences9
Artefacts1
Autres entrées1

Dépannage​

Le plateau n'apparaît pas. Vous devez être dans le monde des positions de l'énigme et à moins de activationRadius de l'une d'elles. Les positions laissées à 0, 0, 0 sont ignorées ; une énigme sans position définie n'a donc pas d'ancrage.

Rien ne se passe quand je clique. Vérifiez que vous faites partie de l'audience (les critères doivent correspondre, et un filtre d'audience doit vous inclure) et que l'énigme n'est pas déjà résolue pour vous : utilisez /typewriter puzzle status, et /typewriter puzzle admin reset <player> <id> pour rejouer. Les clics pendant le cooldown d'échec sont ignorés ; l'action bar indique le temps restant.

/typewriter puzzle start indique que l'énigme est introuvable. Les énigmes sont enregistrées au chargement de l'extension, par identifiant d'entrée. Rechargez après avoir ajouté une énigme, et utilisez l'identifiant d'entrée, pas son nom.

L'énigme de mémoire ne démarre jamais. buttons doit contenir au moins 2 éléments, et chacun doit avoir une position.

L'énigme de motif ignore mes blocs. pattern doit avoir une longueur multiple de columns, et vous devez placer les blocs sur la grille à la hauteur Y de gridOrigin. Un mauvais matériau est annulé.

L'énigme de cadre d'objet indique qu'il n'y a pas de cadre. Placez d'abord un cadre d'objet à la position configurée. Le journal affiche aussi un avertissement avec les coordonnées.

La progression est perdue après la reconnexion. Voir l'avertissement dans Configuration : utilisez fact pour conserver le résultat.

Une énigme coopérative ne se termine jamais. Chaque joueur doit faire partie de l'audience (/typewriter puzzle join <id>), se tenir sur une plaque différente et y rester pendant holdDuration. Les objets lâchés sur les plaques ne comptent pas.