Nine ready-made puzzle mechanics, declared as quest objectives and rendered client-side.
VIDEO
The Puzzle Extension turns a location in your world into a solvable puzzle. Each puzzle is a
Typewriter objective: it starts when the player enters its audience, tracks progress per player,
and fires triggers on completion, failure or timeout — so a puzzle plugs into a quest exactly like
any other objective.
Everything a puzzle draws is client-side : blocks, ghost previews, highlights and laser beams are
sent to the player who is solving it. Two players can work on the same lever board without seeing
each other's progress, and the real world is never modified.
Key features
Nine puzzle types — block pushing, pedestal offerings, memory sequences, lever orders,
pattern placement, item frame rotations, combination locks, laser grids and cooperative pressure
plates.
Per-player, or shared — isShared switches a puzzle from private progress to one board the
whole group advances together.
Client-side rendering — no world edits, no rollback to write, no interference between players.
Full objective lifecycle — onStart, onComplete, onFail, onTimeout and
onLifespanExpire triggers, plus time limits, attempt limits and fail cooldowns.
Chaining — puzzle_chain runs several puzzles in order and
fires once the whole sequence is solved.
Survives restarts — puzzle_artifact persists puzzle
state, so a reboot mid-puzzle does not erase progress.
Readable state — puzzle_solved_fact and
puzzle_active_fact expose progress to the rest of your
content.
Folia-safe — every world read and write runs on the region that owns the puzzle.
Fields shared by every puzzle
All nine puzzle objectives inherit the same lifecycle fields. Only the puzzle-specific fields are
listed on each entry page.
Field Type Description idStringIdentifier used by chains, facts and the puzzle menu. factRef<CachableFactEntry>Fact holding the player's progress. amountVar<Int>Number of completions required. timeLimitVar<Int>Seconds allowed before onTimeout fires. 0 = no limit. cooldownOnFailVar<Int>Seconds before the player may try again after a failure. maxAttemptsVar<Int>Attempts allowed before the puzzle fails. 0 = unlimited. resetOnWrongVar<Boolean>Whether a wrong step resets progress. showHintsVar<Boolean>Whether hintMessage is shown while solving. hintMessageVar<String>Hint text. Supports {progress} and {total}. completionMessageVar<String>Message sent when the puzzle is solved. onStartRef<TriggerableEntry>Fired when the puzzle becomes active for the player. onCompleteRef<TriggerableEntry>Fired when the puzzle is solved. onFailRef<TriggerableEntry>Fired when the puzzle fails. onTimeoutRef<TriggerableEntry>Fired when timeLimit elapses. onLifespanExpireRef<TriggerableEntry>Fired when lifespan elapses. lifespanVar<Int>Seconds the puzzle stays active. 0 = forever. isSharedVar<Boolean>true = one shared board; false = per-player progress.criteriaList<Criteria>Conditions a player must meet for the puzzle to apply.
Entries
Objectives
Triggers
Artifacts
Facts