Skip to content

Cinematic Starts

Quick Start: Pick your goal.

While a match prepares, JManhunt can fly every viewer through a short camera film over the match cell: a few angles back to back, then the normal teleports.

  • Viewers watch through invisible anchors as spectators; their bodies ride the camera (pinned to every keyframe, hidden from each other, movement locked) while the film runs, and return to the lobby when it ends, with their previous gamemode restored. Bodies stage into the film world first (a cross-world camera never receives updates).
  • The flight runs after every API prepare hook, still inside preparing, so disabling it mid-film (or a planning failure) just starts the match normally.
  • The engine pins the spectatorsGenerateChunks gamerule on for every world on every match phase (internal, never off): fake spectators, cameras, and tracking teleports land in unloaded areas too often for any other setting to be safe.
  • Cinematics need a world-engine match cell: matches without one start without a film. See Cells & Spawns.
  • Each film stages either at the cell center or, about half the time, around a nearby friendly mob (animals, villagers, golems, bats, fish, squid, allays, and drowned) within 50 blocks, so repeat films frame different subjects.
  • Above y 58, moving cameras climb over what lies ahead: a forward raycast within 6 blocks lifts the camera by proximity (front-loaded and speed-scaled), while a hit under 1 jumps clear of the whole stack above the hit block plus two. A ceiling within 4 above vetoes the climb (a higher ceiling caps a jump to one below it). Transparent blocks like leaves and glass never count, still cameras never lift, and the bezier angles fly their planned paths untouched.
settings:
  cinematic:
    enabled: true
    duration-seconds: 15
    angle-count: 3
    stagger:
      enabled: false
      duration-seconds: 1.5
      order: HUNTERS_FIRST
    messages:
      enabled: true
      count: 3
      sound: true
  • duration-seconds (3-60) shares evenly across the angles. angle-count (1-8) picks that many of the twelve angles below, in one order shuffled per match: the first and last are two distinct edge shots, and the middle shuffles from the inner seven. The count also clamps to the whole duration at runtime (with a console warning), since faster cuts would ruin the experience.
  • Every film ends with a titled countdown in the last seconds, reusing the headstart countdown style and the limbo-countdown-titled-seconds timer (default 3), with the standard countdown sounds and no chat line, so the release never lands without warning. It plays whether prestart is on or off, times to the film end, and the last number lingers on its title stay while a stagger finale scatters.

Staggered Spawn-In

With stagger.enabled, the film ends one player at a time instead of teleporting everyone together:

  • Each arrival's body stages at its game spawn while its camera holds the last frame, then unlocks into the normal start sequence (compass, start line, status, role announce, and their ON_START catch-up, like a role-switch catch-up). Nobody routes through the lobby; players still waiting stay frozen on the last camera frame, and spectators unlock at once since they never spawn.
  • The window extends preparing, so raise the prepare timeout for long films plus a long window.
  • stagger.duration-seconds (0.5-30) is the window. stagger.order finalizes the raw shuffle by role: HUNTERS_FIRST (default), RUNNERS_FIRST, or RANDOM for fully random.
  • The pacing curve lives in advanced/animations.yml under stagger: curve maps the 0..1 window progress to the spawned ratio ({t} is linear). Each arrival pops the cinematic.spawn sound from sounds.yml (chicken egg by default), throttled to ten pops per second of window across the roster, so massive lobbies spread their pops instead of stacking them.

Film Narration

  • With messages.enabled (on by default), the film also narrates itself in chat: messages.count lines (default 3) paced evenly across the duration, the first immediately and the last one step before the film ends.
  • The count clamps to the defined pool and to the whole duration in lines, with a console warning.
  • With messages.sound (on by default), each line also plays the cinematic.narration sound from sounds.yml.

Skip Vote

Match participants can double-shift to skip the film:

  • Once the configured share of the participant roster votes (default 70%), the film ends early for everyone and the normal start sequence runs. Spectators watch but never vote and never count toward the total.
  • The actionbar counts live (Double-shift to skip • Votes: (0/6)); voters who already voted see a single held line instead (You have voted to skip: (3/6)).
  • When a viewer leaves mid-vote, their vote drops with them and the requirement rechecks against the smaller roster: votes that now meet the share start the skip sequence at once.
  • Tuning lives in advanced/animations.yml under skip: enabled (default true), threshold (0..1, default 0.7; 0 lets any single vote skip), stay-seconds (default 30) and fadeout-seconds (default 20) for the not-voted line. The voted line holds until the film ends. The six line templates live in the lang file under cinematic-messages (skip-hint, skip-votes, skip-voted, skip-separator, skip-voted-chat, skip-accepted).
  • When the threshold is reached, the film freezes and a 3-2-1 countdown runs (strictly three seconds, not configurable), then the normal start sequence runs. The countdown is single-flight per match: every trigger funnels through one shared countdown instead of restarting each other. Participants see Skip accepted, match starting. in chat once, and each voter gets a You voted to skip: (votes/total). confirmation.
  • Films under five seconds of cine duration (stagger excluded) suppress the vote entirely: voting on a film that short is noise, so the vote lines hide at once and double-shift does nothing.

  • The lines come from the lang file, not the config, under cinematic-messages.messages. Per-lobby replacements live in the overrides block at the bottom of the same file.

  • The first and last pool lines always show first and last; the middle fills evenly spaced. A solo pool shows halfway through.
  • {hunters} and {runners} fill with the role-colored capitalized plurals; {prefix} and {plain-color} work as usual.

Angles

The five edge shots open and close every film (first and last are always two distinct edges):

  • A, scenery. A still vista from above the cell center, framing the nearest visible villager or pillager on a thirds line, else the nearest visible animal, else an open field. Only loaded chunks are searched. When the center is not a valid spawnpoint, the stage moves to a player-algorithm spawn instead. Viewers look around freely during this angle (control-rotation: false); movement stays locked.
  • B, birdseye. A descent from 36 to 18 blocks over the center with a half turn, looking straight down.
  • I, sweep. A 400-degree arc around the center at 6 blocks up, gazing inward and slightly up: gentle at both ends with a fast middle.
  • J, cartographer. A top-down slide 52.5 blocks west from 40 blocks up, staring down the whole way.
  • K, raycast run. A winding flight through open space: six chained waypoints found by raycast fans (8 yaws by 4 pitches), flown as one smooth bezier by arc length with an eased pace, gazing ahead along the path with a slight lag (gaze-response, default 0.1). Only rays hitting within 7 to 26 blocks count (sky and backward rays are discarded); a failed search falls back like any other angle.

The inner seven angles fill the middle of longer films:

  • C, deep within. A still vista from a chest minecart or an enclosed cave pocket. Viewers look around freely during this angle (control-rotation: false); movement stays locked.
  • D, orbit. A slow 120-degree circle around a key object (or the center), shrinking when walls crowd and tracking live mobs.
  • E, skyward dive. A descent from 35 to 8 blocks while the gaze eases from the sky to just past level (26 degrees). The gaze swing completes at 80% of the shot, then holds the end pose while the descent runs on.
  • F, low dolly. A low slide past a key object, gazing up at it.
  • G, crane up. A rise from 3 to 22 blocks while the gaze tilts from the horizon down to reveal the cell.
  • H, close up. A slow push from 12 to 4 blocks toward the nearest key mob, holding its face.
  • L, cave run. The raycast-run flight from a cave subject (a chest minecart or cave pocket) instead of the stage top, with rays up to 35 blocks.

  • A middle angle with nothing to film falls back to unattempted middles first, then to a scenery repeat on a fresh point; no two scenes share a planning point.

  • All searches stay in loaded chunks, and every distance, height, sweep, easing formula, and rotation flag tunes in advanced/animations.yml.

Keyframes

Per-angle distances and easing formulas live in advanced/animations.yml:

birdseye:
  control-rotation: true
  start-height: 26.0
  end-height: 13.0
  yaw-sweep: 180.0
  tilt-jitter: 5.0
  descent: "<easeout:{t}>"
  rotation: "<easeout:{t}>"
  • Formulas are JMHScript over {t}, the 0..1 segment progress: <easeinout:{t}>, {t}**2, or plain {t} for linear. A formula that fails to evaluate warns and falls back to linear.
  • Angles cut instantly between takes while motion inside one angle glides: keyframes land on a fixed tick period with matching client interpolation, and every take plays its full 0..1 progress including its endpoint.
  • Each angle also carries control-rotation: when false, the camera flies the path while viewers look freely. Reloading the config reloads the keyframes; setting enabled: false stops running films at once.