{"id":40286,"date":"2026-06-02T00:37:16","date_gmt":"2026-06-01T21:37:16","guid":{"rendered":"https:\/\/vpesports.com\/minecraft\/mods\/cinematic-camera\/"},"modified":"2026-06-02T00:37:16","modified_gmt":"2026-06-01T21:37:16","slug":"cinematic-camera","status":"publish","type":"mod","link":"https:\/\/vpesports.com\/minecraft\/mods\/cinematic-camera\/","title":{"rendered":"Cinematic Camera"},"content":{"rendered":"<p># \ud83c\udfac CinematicCamera Plugin \u2014 Full README<\/p>\n<p>> A Minecraft (Paper\/Spigot) plugin for creating smooth, cinematic camera paths with rotation, speed zones, keyframe effects, and more.<\/p>\n<p>&#8212;<\/p>\n<p>## Table of Contents<\/p>\n<p>1. [Quick Start](#quick-start)<br \/>\n2. [How It Works \u2014 Core Architecture](#how-it-works&#8211;core-architecture)<br \/>\n3. [Commands Reference](#commands-reference)<br \/>\n4. [Removing a Keyframe (removekeyframe)](#removing-a-keyframe)<br \/>\n5. [Keyframe Types \u2014 Full Reference](#keyframe-types&#8211;full-reference)<br \/>\n6. [Speed Zones](#speed-zones)<br \/>\n7. [Auto-Play Trigger](#auto-play-trigger)<br \/>\n8. [Playback System \u2014 How It Works in Code](#playback-system&#8211;how-it-works-in-code)<br \/>\n9. [Path Interpolation \u2014 Catmull-Rom Splines](#path-interpolation&#8211;catmull-rom-splines)<br \/>\n10. [Camera Rotation Interpolation](#camera-rotation-interpolation)<br \/>\n11. [State Management Maps](#state-management-maps)<br \/>\n12. [Full Workflow Example](#full-workflow-example)<br \/>\n13. [Tab Completion](#tab-completion)<br \/>\n14. showcase<\/p>\n<p>&#8212;<\/p>\n<p>## Quick Start<\/p>\n<p>1. Run `\/cinematicwand` to get the wand item (a Blaze Rod).<br \/>\n2. Walk to a position and **Left Click** to add a waypoint. Your camera&#8217;s yaw (horizontal rotation) and pitch (vertical rotation) are saved with each waypoint.<br \/>\n3. Add at least 2+ waypoints along your desired path.<br \/>\n4. Run `\/cinematic save mypath normal` to save it.<br \/>\n5. Run `\/cinematic play mypath` to watch it.<\/p>\n<p>&#8212;<\/p>\n<p>## How It Works \u2014 Core Architecture<\/p>\n<p>The plugin is a single class `CinematicCamera` that extends `JavaPlugin` and implements `Listener`. All state is stored in in-memory `HashMap`\/`HashSet` fields (no persistence to disk between restarts).<\/p>\n<p>### Core State Maps<\/p>\n<p>| Field | Type | Purpose |<br \/>\n|&#8212;&#8212;-|&#8212;&#8212;|&#8212;&#8212;&#8212;|<br \/>\n| `paths` | `Map<String, CinematicPath>` | All saved cinematic paths, keyed by name |<br \/>\n| `editors` | `Map<UUID, PathEditor>` | Active wand sessions per player \u2014 holds their unsaved waypoints |<br \/>\n| `playingCinematic` | `Set<UUID>` | Players currently watching a cinematic |<br \/>\n| `originalGameModes` | `Map<UUID, GameMode>` | Stores each player&#8217;s gamemode before the cinematic starts so it can be restored |<br \/>\n| `activeAnimations` | `Map<UUID, BukkitTask>` | The running `BukkitRunnable` task for each player \u2014 used to cancel on stop |<br \/>\n| `savedLocations` | `Map<UUID, Location>` | Player&#8217;s location before cinematic \u2014 teleported back on end |<br \/>\n| `savedFlying` | `Map<UUID, Boolean>` | Whether the player was flying before \u2014 restored on end |<br \/>\n| `awaitingClick` | `Set<UUID>` | Players currently paused on a `PAUSE_CLICK` keyframe, waiting for any click |<\/p>\n<p>&#8212;<\/p>\n<p>## Commands Reference<\/p>\n<p>### `\/cinematicwand`<br \/>\nGives you the Blaze Rod wand item.<br \/>\n&#8211; **Left Click** (air or block): Adds your current position + rotation as a waypoint<br \/>\n&#8211; **Right Click**: Shows current waypoint count and how to save<br \/>\n&#8211; **Shift + Right Click**: Clears all your current unsaved waypoints<\/p>\n<p>### `\/cinematic save <name> <speed>`<br \/>\nSaves your current waypoints as a named path.<\/p>\n<p>**Speed values:**<br \/>\n| Input | Multiplier |<br \/>\n|&#8212;&#8212;-|&#8212;&#8212;&#8212;&#8211;|<br \/>\n| `slow` or `cinematic` | 0.3x |<br \/>\n| `normal` or `medium` | 1.0x |<br \/>\n| `fast` | 2.0x |<br \/>\n| `veryfast` or `rapid` | 3.5x |<br \/>\n| `0.1` \u2013 `5.0` | Custom |<\/p>\n<p>### `\/cinematic play <name>`<br \/>\nStarts the cinematic for you. Puts you in SPECTATOR mode, applies invisibility, teleports you to waypoint 0, and begins the animation loop.<\/p>\n<p>### `\/cinematic stop`<br \/>\nImmediately stops the cinematic, cancels the task, removes effects, and teleports you back to your saved location.<\/p>\n<p>### `\/cinematic list`<br \/>\nLists all saved paths with their waypoint count, speed, keyframe count, speed zone count, and auto-play status.<\/p>\n<p>### `\/cinematic delete <name>`<br \/>\nRemoves a saved path entirely.<\/p>\n<p>### `\/cinematic setspeed <name> <speed>`<br \/>\nChanges the base speed multiplier of an existing path.<\/p>\n<p>### `\/cinematic toggle <name>`<br \/>\nToggles the auto-play trigger on or off for a path. When on, walking within 1.5 blocks of the first waypoint auto-starts the cinematic.<\/p>\n<p>### `\/cinematic clear`<br \/>\nClears your current unsaved wand waypoints (same as Shift+Right Click).<\/p>\n<p>### `\/cinematic settitle <name> <title> [| subtitle]`<br \/>\nSets the title shown at the beginning of a cinematic.<br \/>\n&#8211; Use `|` to separate title and subtitle: `\/cinematic settitle mypath Welcome | Enjoy the view`<\/p>\n<p>### `\/cinematic addkeyframe <name> <waypointIndex> <type> [args&#8230;]`<br \/>\nAdds an effect keyframe that triggers when the camera reaches the given waypoint.<\/p>\n<p>### `\/cinematic listkeyframes <name>`<br \/>\nLists all keyframes on a path with their index, waypoint, type, and text preview.<\/p>\n<p>### `\/cinematic removekeyframe <name> <index>`<br \/>\nRemoves a keyframe by its list index (shown in `\/cinematic listkeyframes`).<\/p>\n<p>### `\/cinematic addzone <name> <startWP> <endWP> <speed>`<br \/>\nAdds a speed zone between two waypoint indices. Overrides the base speed for that segment.<\/p>\n<p>### `\/cinematic listzones <name>`<br \/>\nLists all speed zones on a path.<\/p>\n<p>### `\/cinematic removezone <name> <index>`<br \/>\nRemoves a speed zone by its list index.<\/p>\n<p>&#8212;<\/p>\n<p>## Removing a Keyframe<\/p>\n<p>This is a 2-step process:<\/p>\n<p>**Step 1** \u2014 Find the keyframe index:<br \/>\n&#8220;`<br \/>\n\/cinematic listkeyframes spawn<br \/>\n&#8220;`<br \/>\nThis shows output like:<br \/>\n&#8220;`<br \/>\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501<br \/>\n  [0] wp#2 text_title \u2192 Welcome<br \/>\n  [1] wp#4 fade_black<br \/>\n  [2] wp#6 sound \u2192 ENTITY_WITHER&#8230;<br \/>\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501<br \/>\n&#8220;`<\/p>\n<p>**Step 2** \u2014 Remove by that index number:<br \/>\n&#8220;`<br \/>\n\/cinematic removekeyframe spawn 1<br \/>\n&#8220;`<br \/>\nThis removes the `fadeblack` at index `[1]`.<\/p>\n<p>> \u26a0\ufe0f Indexes are **positional** (0, 1, 2&#8230;) and shift after a removal. Always re-run `listkeyframes` after removing one if you plan to remove more.<\/p>\n<p>&#8212;<\/p>\n<p>## Keyframe Types \u2014 Full Reference<\/p>\n<p>Add any of these with `\/cinematic addkeyframe <path> <waypointIndex> <type> [args]`<\/p>\n<p>&#8212;<\/p>\n<p>### `title`<br \/>\nShows a title on screen.<br \/>\n&#8220;`<br \/>\n\/cinematic addkeyframe mypath 0 title 10 60 20 Welcome to the Tour | Enjoy the view<br \/>\n&#8220;`<br \/>\nArgs: `<fadeIn ticks> <stay ticks> <fadeOut ticks> <title text> [| subtitle]`<\/p>\n<p>**How it works in code:** Calls `player.showTitle()` using the Adventure API `Title.title()` with `Title.Times`, constructing bold white title text and gray subtitle text.<\/p>\n<p>&#8212;<\/p>\n<p>### `actionbar`<br \/>\nShows text in the action bar (above the hotbar).<br \/>\n&#8220;`<br \/>\n\/cinematic addkeyframe mypath 2 actionbar Look to your left!<br \/>\n&#8220;`<\/p>\n<p>**How it works:** Calls `player.sendActionBar()` with yellow-tinted text.<\/p>\n<p>&#8212;<\/p>\n<p>### `chat`<br \/>\nSends a \u2726 prefixed message to the player&#8217;s chat.<br \/>\n&#8220;`<br \/>\n\/cinematic addkeyframe mypath 3 chat This is where the story began.<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>### `pause`<br \/>\nPauses the camera movement for a set number of seconds.<br \/>\n&#8220;`<br \/>\n\/cinematic addkeyframe mypath 4 pause 3<br \/>\n&#8220;`<br \/>\nArgs: `<seconds>`<\/p>\n<p>**How it works:** Sets `paused = true` and `pauseTicksLeft = seconds * 20`. The `BukkitRunnable` returns early every tick until the counter hits 0.<\/p>\n<p>&#8212;<\/p>\n<p>### `click`<br \/>\nPauses the camera indefinitely until the player clicks (any mouse button).<br \/>\n&#8220;`<br \/>\n\/cinematic addkeyframe mypath 5 click<br \/>\n&#8220;`<\/p>\n<p>**How it works:** Adds the player to `awaitingClick` set and shows an action bar prompt. The `PlayerInteractEvent` handler removes them from the set on any click. The animation loop checks `awaitingClick.contains(uuid)` and returns early until cleared.<\/p>\n<p>&#8212;<\/p>\n<p>### `sound`<br \/>\nPlays a sound at the player&#8217;s location.<br \/>\n&#8220;`<br \/>\n\/cinematic addkeyframe mypath 6 sound ENTITY_WITHER_SPAWN 1.0 0.8<br \/>\n&#8220;`<br \/>\nArgs: `<SOUND_NAME> [volume] [pitch]`<\/p>\n<p>**How it works:** Uses `player.playSound()`. Sound name is looked up via `Registry.SOUNDS.get(NamespacedKey.minecraft(&#8230;))`. Falls back to `BLOCK_NOTE_BLOCK_PLING` if invalid.<\/p>\n<p>&#8212;<\/p>\n<p>### `particle`<br \/>\nSpawns a burst of firework particles around the camera.<br \/>\n&#8220;`<br \/>\n\/cinematic addkeyframe mypath 7 particle<br \/>\n&#8220;`<\/p>\n<p>**How it works:** Calls `world.spawnParticle(Particle.FIREWORK, location, 40, 1, 1, 1, 0.05)`.<\/p>\n<p>&#8212;<\/p>\n<p>### `shake`<br \/>\nShakes the camera by rapidly teleporting it in tiny random offsets.<br \/>\n&#8220;`<br \/>\n\/cinematic addkeyframe mypath 8 shake<br \/>\n&#8220;`<\/p>\n<p>**How it works:** Schedules 10 `runTaskLater` calls (1 tick apart) that each add a small random offset (`-0.1` to `+0.1` on each axis) to the player&#8217;s location and teleport them there.<\/p>\n<p>&#8212;<\/p>\n<p>### `fadeblack`<br \/>\nApplies Blindness effect to fade the screen to black.<br \/>\n&#8220;`<br \/>\n\/cinematic addkeyframe mypath 9 fadeblack 2<br \/>\n&#8220;`<br \/>\nArgs: `<duration seconds>` (default: 2)<\/p>\n<p>**How it works:** Applies `PotionEffectType.BLINDNESS` for `duration * 20` ticks.<\/p>\n<p>&#8212;<\/p>\n<p>### `fadewhite`<br \/>\nApplies Glowing effect to create a white flash\/fade.<br \/>\n&#8220;`<br \/>\n\/cinematic addkeyframe mypath 10 fadewhite 2<br \/>\n&#8220;`<br \/>\nArgs: `<duration seconds>` (default: 2)<\/p>\n<p>**How it works:** Applies `PotionEffectType.GLOWING` for `duration * 20` ticks.<\/p>\n<p>&#8212;<\/p>\n<p>### `lightning`<br \/>\nStrikes a visual-only lightning bolt at the camera position.<br \/>\n&#8220;`<br \/>\n\/cinematic addkeyframe mypath 11 lightning<br \/>\n&#8220;`<\/p>\n<p>**How it works:** Calls `world.strikeLightningEffect(location)` \u2014 this is the visual-only version (no fire, no damage).<\/p>\n<p>&#8212;<\/p>\n<p>### `explosion`<br \/>\nCreates a visual explosion effect at the camera position.<br \/>\n&#8220;`<br \/>\n\/cinematic addkeyframe mypath 12 explosion<br \/>\n&#8220;`<\/p>\n<p>**How it works:** Calls `world.createExplosion(location, 0, false, false)` \u2014 power 0 means no block damage, no fire.<\/p>\n<p>&#8212;<\/p>\n<p>### `time`<br \/>\nSets the world time instantly.<br \/>\n&#8220;`<br \/>\n\/cinematic addkeyframe mypath 3 time 6000<br \/>\n&#8220;`<br \/>\nArgs: `<0\u201324000>` (0 = sunrise, 6000 = noon, 12000 = sunset, 18000 = midnight)<\/p>\n<p>**How it works:** Calls `world.setTime((long) kf.duration)`.<\/p>\n<p>&#8212;<\/p>\n<p>### `weather`<br \/>\nChanges the world&#8217;s weather.<br \/>\n&#8220;`<br \/>\n\/cinematic addkeyframe mypath 5 weather rain<br \/>\n\/cinematic addkeyframe mypath 8 weather clear<br \/>\n\/cinematic addkeyframe mypath 10 weather thunder<br \/>\n&#8220;`<br \/>\nArgs: `clear | rain | thunder`<\/p>\n<p>**How it works:**<br \/>\n&#8211; `clear` \u2192 `world.setStorm(false)`<br \/>\n&#8211; `rain` \u2192 `world.setStorm(true)`<br \/>\n&#8211; `thunder` \u2192 `world.setStorm(true)` + `world.setThundering(true)`<\/p>\n<p>&#8212;<\/p>\n<p>## Speed Zones<\/p>\n<p>Speed zones override the base path speed for a specific range of waypoints, letting you slow down for dramatic moments or fast-forward through boring stretches.<\/p>\n<p>&#8220;`<br \/>\n\/cinematic addzone mypath 0 3 0.3<br \/>\n&#8220;`<br \/>\nThis makes waypoints 0\u20133 play at 0.3x speed (very slow\/cinematic).<\/p>\n<p>&#8220;`<br \/>\n\/cinematic addzone mypath 5 9 3.0<br \/>\n&#8220;`<br \/>\nThis makes waypoints 5\u20139 play at 3x speed.<\/p>\n<p>**How it works in code:** During `generateSmoothPath()`, each segment `i` checks `speedZones` to see if `i >= zone.startWaypoint &#038;&#038; i < zone.endWaypoint`. If a match is found, `pointsInSegment = basePoints \/ segmentSpeed`. A higher speed multiplier means fewer interpolated points between waypoints, so they're traversed faster. Each `CameraFrame` also stores `speedMultiplier` which the animation loop uses to skip frames (`index += (1 + skip)` where `skip = speedMultiplier - 1`).\n\n---\n\n## Auto-Play Trigger\n\nWhen auto-play is enabled on a path (it's on by default when you save), any player who walks within **1.5 blocks** of the path's first waypoint will automatically start the cinematic.\n\n- Toggle it: `\/cinematic toggle mypath`\n- Checked in `PlayerMoveEvent` \u2014 only triggers if the player is not already in a cinematic\n\n---\n\n## Playback System \u2014 How It Works in Code\n\nWhen `playCinematic(player, path)` is called:\n\n1. The player is added to `playingCinematic`, their gamemode\/location\/flying state are saved.\n2. They're set to `SPECTATOR` mode with infinite `INVISIBILITY`.\n3. They're teleported to `waypoints.get(0)`.\n4. `path.generateSmoothPath()` runs and produces a `List<CameraFrame>`.<br \/>\n5. A `Map<Integer, Keyframe>` is built that maps each keyframe to its smooth-path index (`waypointIndex * basePointsPerSegment`).<br \/>\n6. A `BukkitRunnable` is scheduled to run **every tick** (1\/20th of a second).<\/p>\n<p>### Inside the animation loop (per tick):<\/p>\n<p>&#8220;`<br \/>\ntick fires<br \/>\n  \u2192 if player offline: endCinematic, cancel<br \/>\n  \u2192 if timed pause active: decrement counter, return<br \/>\n  \u2192 if awaiting click: return<br \/>\n  \u2192 if index >= smoothPath.size(): endCinematic, send message, cancel<br \/>\n  \u2192 check kfMap for keyframe at current index, apply it<br \/>\n     \u2192 if PAUSE_TIMED: set paused=true, set counter, increment index, return<br \/>\n     \u2192 if PAUSE_CLICK: add to awaitingClick, increment index, return<br \/>\n  \u2192 teleport player to smoothPath.get(index).location (position + yaw\/pitch)<br \/>\n  \u2192 spawn ambient END_ROD particle every 10 ticks<br \/>\n  \u2192 advance index (by 1, or more if speed zone skip > 1)<br \/>\n&#8220;`<\/p>\n<p>The `endCinematic` method:<br \/>\n&#8211; Removes player from all state maps<br \/>\n&#8211; Cancels the BukkitTask<br \/>\n&#8211; Removes potion effects (Invisibility, Blindness, Glowing)<br \/>\n&#8211; Clears title<br \/>\n&#8211; Restores original GameMode<br \/>\n&#8211; Teleports player back to their saved location<br \/>\n&#8211; Restores flying state<\/p>\n<p>&#8212;<\/p>\n<p>## Path Interpolation \u2014 Catmull-Rom Splines<\/p>\n<p>Raw waypoints are spaced far apart. To get smooth camera movement, the plugin interpolates between them using **Catmull-Rom splines** \u2014 a curve that passes *through* each control point (unlike Bezier curves which are pulled toward them).<\/p>\n<p>For each segment from waypoint `i` to `i+1`, 4 control points are used:<br \/>\n&#8211; `p0` = previous waypoint (or `p1` if at start)<br \/>\n&#8211; `p1` = current waypoint<br \/>\n&#8211; `p2` = next waypoint<br \/>\n&#8211; `p3` = waypoint after next (or `p2` if at end)<\/p>\n<p>The formula applied per axis (x, y, z):<br \/>\n&#8220;`<br \/>\nx(t) = 0.5 * (<br \/>\n    2*p1  +<br \/>\n    (-p0 + p2) * t  +<br \/>\n    (2*p0 &#8211; 5*p1 + 4*p2 &#8211; p3) * t\u00b2  +<br \/>\n    (-p0 + 3*p1 &#8211; 3*p2 + p3) * t\u00b3<br \/>\n)<br \/>\n&#8220;`<\/p>\n<p>Where `t` goes from 0.0 to 1.0 across the segment. The number of points per segment is:<br \/>\n&#8220;`<br \/>\nbasePointsPerSegment = max(10, 60 \/ speed)<br \/>\n&#8220;`<br \/>\nSo at `normal` speed (1.0x): 60 points per segment = 60 ticks = 3 seconds per waypoint-to-waypoint. At `fast` (2.0x): 30 points = 1.5 seconds.<\/p>\n<p>&#8212;<\/p>\n<p>## Camera Rotation Interpolation<\/p>\n<p>Each waypoint stores the player&#8217;s **yaw** (horizontal, 0\u00b0\u2013360\u00b0) and **pitch** (vertical, -90\u00b0 to +90\u00b0) at the time it was placed.<\/p>\n<p>When the wand records a waypoint:<br \/>\n&#8220;`java<br \/>\nLocation loc = player.getLocation().clone(); \/\/ includes yaw and pitch<br \/>\neditor.addWaypoint(loc);<br \/>\n&#8220;`<\/p>\n<p>During smooth path generation, rotation is linearly interpolated between adjacent waypoints:<\/p>\n<p>**Pitch** uses standard linear interpolation:<br \/>\n&#8220;`java<br \/>\nfloat pitch = (float) lerp(p1.getPitch(), p2.getPitch(), t);<br \/>\n\/\/ lerp(a, b, t) = a + (b &#8211; a) * t<br \/>\n&#8220;`<\/p>\n<p>**Yaw** uses angle-aware lerp to prevent spinning the wrong way around (e.g., 350\u00b0 \u2192 10\u00b0 goes forward, not backward 340\u00b0):<br \/>\n&#8220;`java<br \/>\ndouble lerpAngle(double a, double b, double t) {<br \/>\n    double diff = ((b &#8211; a + 180) % 360) &#8211; 180;<br \/>\n    return a + diff * t;<br \/>\n}<br \/>\n&#8220;`<br \/>\nThis normalizes the difference to the range `-180` to `+180`, ensuring the rotation always takes the shortest path.<\/p>\n<p>&#8212;<\/p>\n<p>## State Management Maps<\/p>\n<p>### Why SPECTATOR mode?<br \/>\nPlayers in SPECTATOR can be freely teleported each tick without physics interference. `PlayerMoveEvent` blocks X\/Y\/Z movement (while allowing head rotation) so the player can&#8217;t fight the cinematic.<\/p>\n<p>### Why save\/restore gamemode and location?<br \/>\nWhen the cinematic ends (normally or via `\/cinematic stop`), the player needs to return to exactly where they were with exactly the gamemode they had. These are stored in `originalGameModes` and `savedLocations` at start and retrieved in `endCinematic`.<\/p>\n<p>### Why the `awaitingClick` set?<br \/>\nThe animation loop runs every tick independently of player input. The `PAUSE_CLICK` keyframe needs to pause across ticks until a click happens. The set acts as a shared flag: the animation loop checks it, and `PlayerInteractEvent` clears it.<\/p>\n<p>&#8212;<\/p>\n<p>## Full Workflow Example<\/p>\n<p>Here&#8217;s a complete example building a dramatic cinematic flythrough:<\/p>\n<p>&#8220;`<br \/>\n# 1. Get wand<br \/>\n\/cinematicwand<\/p>\n<p># 2. Walk to starting position, look where you want the camera to face, Left Click<br \/>\n# Add 5+ more waypoints around your scene<\/p>\n<p># 3. Save at slow speed<br \/>\n\/cinematic save myflythrough slow<\/p>\n<p># 4. Add an intro title at waypoint 0<br \/>\n\/cinematic addkeyframe myflythrough 0 title 10 80 20 Welcome | The story begins here<\/p>\n<p># 5. Play a dramatic sound at waypoint 2<br \/>\n\/cinematic addkeyframe myflythrough 2 sound ENTITY_WITHER_SPAWN 1.0 0.6<\/p>\n<p># 6. Fade to black at waypoint 4<br \/>\n\/cinematic addkeyframe myflythrough 4 fadeblack 3<\/p>\n<p># 7. Set time to sunset at waypoint 5<br \/>\n\/cinematic addkeyframe myflythrough 5 time 12000<\/p>\n<p># 8. Pause the camera at waypoint 3 for 2 seconds<br \/>\n\/cinematic addkeyframe myflythrough 3 pause 2<\/p>\n<p># 9. Make waypoints 1-2 slower (dramatic pan)<br \/>\n\/cinematic addzone myflythrough 1 2 0.2<\/p>\n<p># 10. Make waypoints 5-7 faster (fast flythrough)<br \/>\n\/cinematic addzone myflythrough 5 7 3.0<\/p>\n<p># 11. Set intro title for the path<br \/>\n\/cinematic settitle myflythrough The Great Journey | Act I<\/p>\n<p># 12. Review everything<br \/>\n\/cinematic listkeyframes myflythrough<br \/>\n\/cinematic listzones myflythrough<\/p>\n<p># 13. Play it<br \/>\n\/cinematic play myflythrough<\/p>\n<p># 14. If you need to remove keyframe [1] (fadeblack):<br \/>\n\/cinematic listkeyframes myflythrough<br \/>\n# \u2192 finds index, e.g. [1]<br \/>\n\/cinematic removekeyframe myflythrough 1<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>## Tab Completion<\/p>\n<p>The plugin provides tab completion on `\/cinematic`:<br \/>\n&#8211; Arg 1: all subcommand names<br \/>\n&#8211; Arg 2 (for path commands): all saved path names<br \/>\n&#8211; Arg 3 (for `save`\/`setspeed`\/`addzone`): speed presets (`slow`, `normal`, `fast`, `veryfast`, `0.5`, `1.0`, etc.)<br \/>\n&#8211; Arg 3 (for `addkeyframe`): waypoint index suggestions (`0`\u2013`5`)<br \/>\n&#8211; Arg 4 (for `addkeyframe`): all keyframe types<br \/>\n&#8211; Arg 5 (for `addkeyframe weather`): `clear`, `rain`, `thunder`<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This paper plugin allows you to create movie level cinematic cameras and make a player follow your path using these<\/p>\n","protected":false},"featured_media":40287,"template":"","meta":{"_minecraft_slug":"cinematic-camera","_minecraft_project_id":"3VR11Oq8","_minecraft_author":"frqmelikescheese","_minecraft_license":"LicenseRef-Cinematic-Cameras-License","_minecraft_downloads":46,"_minecraft_follows":0,"_minecraft_client_side":"unsupported","_minecraft_server_side":"required","_minecraft_storage_type":"zip","_minecraft_archive_name":"cinematic-camera.zip","_minecraft_size_bytes":68754,"_minecraft_version_count":3,"_minecraft_updated_at":"2026-05-15T21:18:36.050868Z","_minecraft_date_created":"2026-04-11T21:22:06.674774Z","_minecraft_date_modified":"2026-04-07T19:12:35.790488Z","_minecraft_project_url":"https:\/\/modrinth.com\/mod\/cinematic-camera","_minecraft_icon_attachment_id":40287,"_minecraft_imported_at":"2026-06-01T21:37:17+00:00","_minecraft_import_hash":"b351c1fb3b80e7254c43e3e0ca3f27da","_minecraft_versions":"","_minecraft_links":"","_minecraft_gallery":"","_minecraft_api_metadata":""},"mod_category":[89,126,127,92],"mod_loader":[132],"minecraft_version":[62,37,40,41,73,74,38,78,79,80,81,82],"class_list":["post-40286","mod","type-mod","status-publish","has-post-thumbnail","hentry","mod_category-game-mechanics","mod_category-management","mod_category-paper","mod_category-utility","mod_loader-paper","minecraft_version-1-21","minecraft_version-1-21-1","minecraft_version-1-21-10","minecraft_version-1-21-11","minecraft_version-1-21-2","minecraft_version-1-21-3","minecraft_version-1-21-4","minecraft_version-1-21-5","minecraft_version-1-21-6","minecraft_version-1-21-7","minecraft_version-1-21-8","minecraft_version-1-21-9"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Cinematic Camera - Minecraft<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vpesports.com\/minecraft\/mods\/cinematic-camera\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cinematic Camera - Minecraft\" \/>\n<meta property=\"og:description\" content=\"This paper plugin allows you to create movie level cinematic cameras and make a player follow your path using these\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vpesports.com\/minecraft\/mods\/cinematic-camera\/\" \/>\n<meta property=\"og:site_name\" content=\"Minecraft\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/cinematic-camera\\\/\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/cinematic-camera\\\/\",\"name\":\"Cinematic Camera - Minecraft\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/cinematic-camera\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/cinematic-camera\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/cinematic-camera-icon-3a888405c55b86090ca7cd1cc0fafd73681e87b5_96.webp\",\"datePublished\":\"2026-06-01T21:37:16+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/cinematic-camera\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/cinematic-camera\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/cinematic-camera\\\/#primaryimage\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/cinematic-camera-icon-3a888405c55b86090ca7cd1cc0fafd73681e87b5_96.webp\",\"contentUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/cinematic-camera-icon-3a888405c55b86090ca7cd1cc0fafd73681e87b5_96.webp\",\"width\":96,\"height\":96},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/cinematic-camera\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mods\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Cinematic Camera\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\",\"name\":\"Minecraft\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Cinematic Camera - Minecraft","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vpesports.com\/minecraft\/mods\/cinematic-camera\/","og_locale":"en_US","og_type":"article","og_title":"Cinematic Camera - Minecraft","og_description":"This paper plugin allows you to create movie level cinematic cameras and make a player follow your path using these","og_url":"https:\/\/vpesports.com\/minecraft\/mods\/cinematic-camera\/","og_site_name":"Minecraft","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/vpesports.com\/minecraft\/mods\/cinematic-camera\/","url":"https:\/\/vpesports.com\/minecraft\/mods\/cinematic-camera\/","name":"Cinematic Camera - Minecraft","isPartOf":{"@id":"https:\/\/vpesports.com\/minecraft\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/cinematic-camera\/#primaryimage"},"image":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/cinematic-camera\/#primaryimage"},"thumbnailUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/cinematic-camera-icon-3a888405c55b86090ca7cd1cc0fafd73681e87b5_96.webp","datePublished":"2026-06-01T21:37:16+00:00","breadcrumb":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/cinematic-camera\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vpesports.com\/minecraft\/mods\/cinematic-camera\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/vpesports.com\/minecraft\/mods\/cinematic-camera\/#primaryimage","url":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/cinematic-camera-icon-3a888405c55b86090ca7cd1cc0fafd73681e87b5_96.webp","contentUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/cinematic-camera-icon-3a888405c55b86090ca7cd1cc0fafd73681e87b5_96.webp","width":96,"height":96},{"@type":"BreadcrumbList","@id":"https:\/\/vpesports.com\/minecraft\/mods\/cinematic-camera\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vpesports.com\/minecraft\/"},{"@type":"ListItem","position":2,"name":"Mods","item":"https:\/\/vpesports.com\/minecraft\/mods\/"},{"@type":"ListItem","position":3,"name":"Cinematic Camera"}]},{"@type":"WebSite","@id":"https:\/\/vpesports.com\/minecraft\/#website","url":"https:\/\/vpesports.com\/minecraft\/","name":"Minecraft","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vpesports.com\/minecraft\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod\/40286","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod"}],"about":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/types\/mod"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media\/40287"}],"wp:attachment":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media?parent=40286"}],"wp:term":[{"taxonomy":"mod_category","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_category?post=40286"},{"taxonomy":"mod_loader","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_loader?post=40286"},{"taxonomy":"minecraft_version","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/minecraft_version?post=40286"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}