Reference Devices compiles

vehicle_spawner_helicopter_device: Aerial Vehicles Under Verse Control

The `vehicle_spawner_helicopter_device` gives you full programmatic control over a helicopter in your UEFN island — spawn it on demand, assign a specific player as driver, react when someone climbs in or bails out, and destroy or respawn it at will. Whether you're building an extraction mission, a timed aerial challenge, or a boss-fight escape sequence, this device is your cockpit. Every action from takeoff to crash is surfaced as a Verse event or method call.

Updated Examples verified on the live UEFN compiler
Watch the Knotvehicle_spawner_helicopter_device in ~90 seconds.

Overview

The vehicle_spawner_helicopter_device is a specialized subclass of vehicle_spawner_device that manages the full lifecycle of a helicopter in your UEFN island. It solves a concrete game-design problem: you need a vehicle that appears at the right moment, is handed to the right player, and cleans itself up (or respawns) based on game state — all driven by Verse logic rather than manual editor triggers.

When to reach for it:

  • An extraction helicopter that appears only after an objective is completed
  • A timed aerial race where the chopper respawns each round
  • A boss encounter where the villain is auto-assigned as helicopter driver
  • Tracking when players enter or exit the vehicle to award points or change game phase

The device inherits all methods and events from vehicle_spawner_device, so everything described here applies equally to that base class surface.

API Reference

vehicle_spawner_helicopter_device

Specialized vehicle_spawner_device that allows a helicopter to be configured and spawned.

Full public surface, resolved verbatim from the live Epic digest (Fortnite.digest.verse). Inherited members are merged from vehicle_spawner_device.

vehicle_spawner_helicopter_device<public> := class<concrete><final>(vehicle_spawner_device):

Events (subscribe a handler to react):

Event Signature Description
AgentEntersVehicleEvent AgentEntersVehicleEvent<public>:listenable(agent) Signaled when an agent enters the vehicle. Sends the agent that entered the vehicle.
AgentExitsVehicleEvent AgentExitsVehicleEvent<public>:listenable(agent) Signaled when an agent exits the vehicle. Sends the agent that exited the vehicle.
SpawnedEvent SpawnedEvent<public>:listenable(fort_vehicle) Signaled when a vehicle is spawned or respawned by this device. Sends the fort_vehicle who was spawned.
VehicleSpawnedEvent VehicleSpawnedEvent<public>:listenable(tuple()) Signaled when a vehicle is spawned or respawned by this device. Deprecated, use SpawnedEvent instead.
VehicleDestroyedEvent VehicleDestroyedEvent<public>:listenable(tuple()) Signaled when a vehicle is destroyed. Deprecated, use DestroyedEvent instead.
DestroyedEvent DestroyedEvent<public>:listenable(tuple()) Signaled when a vehicle is destroyed.

Methods (call these to make the device act):

Method Signature Description
Enable Enable<public>():void Enables this device.
Disable Disable<public>():void Disables this device.
AssignDriver AssignDriver<public>(Agent:agent):void Sets agent as the vehicle's driver.
DestroyVehicle DestroyVehicle<public>():void Destroys the vehicle if it exists.
RespawnVehicle RespawnVehicle<public>():void Spawns a new vehicle. The previous vehicle will be destroyed before a new vehicle spawns.

vehicle_spawner_device

Base class for various specialized vehicle spawners which allow specific vehicle types to be spawned and configured with specialized options.

Full public surface, resolved verbatim from the live Epic digest (Fortnite.digest.verse).

vehicle_spawner_device<public> := class<abstract><epic_internal>(creative_device_base):

Events (subscribe a handler to react):

Event Signature Description
AgentEntersVehicleEvent AgentEntersVehicleEvent<public>:listenable(agent) Signaled when an agent enters the vehicle. Sends the agent that entered the vehicle.
AgentExitsVehicleEvent AgentExitsVehicleEvent<public>:listenable(agent) Signaled when an agent exits the vehicle. Sends the agent that exited the vehicle.
SpawnedEvent SpawnedEvent<public>:listenable(fort_vehicle) Signaled when a vehicle is spawned or respawned by this device. Sends the fort_vehicle who was spawned.
VehicleSpawnedEvent VehicleSpawnedEvent<public>:listenable(tuple()) Signaled when a vehicle is spawned or respawned by this device. Deprecated, use SpawnedEvent instead.
VehicleDestroyedEvent VehicleDestroyedEvent<public>:listenable(tuple()) Signaled when a vehicle is destroyed. Deprecated, use DestroyedEvent instead.
DestroyedEvent DestroyedEvent<public>:listenable(tuple()) Signaled when a vehicle is destroyed.

Methods (call these to make the device act):

Method Signature Description
Enable Enable<public>():void Enables this device.
Disable Disable<public>():void Disables this device.
AssignDriver AssignDriver<public>(Agent:agent):void Sets agent as the vehicle's driver.
DestroyVehicle DestroyVehicle<public>():void Destroys the vehicle if it exists.
RespawnVehicle RespawnVehicle<public>():void Spawns a new vehicle. The previous vehicle will be destroyed before a new vehicle spawns.

Walkthrough

Scenario: Extraction Helicopter

A helicopter spawner sits on a rooftop. When the round starts the helicopter is disabled. Once a player steps on a trigger plate (the "extraction zone"), the helicopter is enabled, respawned, and that player is auto-assigned as driver. We listen for them to exit the vehicle (they've landed safely) and then destroy the helicopter and print a log via a score device. We also listen for the vehicle being destroyed (shot down) to respawn it.

using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /Fortnite.com/Vehicles }

# Place this Verse device in your level, then wire up the
# @editable fields in the Details panel.
extraction_helicopter_manager := class(creative_device):

    # The helicopter spawner placed on the rooftop
    @editable
    HelicopterSpawner : vehicle_spawner_helicopter_device = vehicle_spawner_helicopter_device{}

    # A trigger_device the player walks into to call the chopper
    @editable
    ExtractionZoneTrigger : trigger_device = trigger_device{}

    # A score manager to reward the player who lands safely
    @editable
    ScoreManager : score_manager_device = score_manager_device{}

    # Called once when the game session begins
    OnBegin<override>()<suspends> : void =
        # Start with the helicopter disabled — it hasn't been called yet
        HelicopterSpawner.Disable()

        # Subscribe to the extraction zone trigger
        ExtractionZoneTrigger.TriggeredEvent.Subscribe(OnExtractionZoneTriggered)

        # React when someone climbs into the helicopter
        HelicopterSpawner.AgentEntersVehicleEvent.Subscribe(OnAgentEntersHelicopter)

        # React when someone exits the helicopter (safe landing)
        HelicopterSpawner.AgentExitsVehicleEvent.Subscribe(OnAgentExitsHelicopter)

        # React when the helicopter is destroyed (shot down mid-flight)
        HelicopterSpawner.DestroyedEvent.Subscribe(OnHelicopterDestroyed)

        # React when the helicopter spawns/respawns
        HelicopterSpawner.SpawnedEvent.Subscribe(OnHelicopterSpawned)

    # Fires when a player walks into the extraction zone
    OnExtractionZoneTriggered(TriggeringAgent : ?agent) : void =
        # Enable the spawner so it can produce a vehicle
        HelicopterSpawner.Enable()
        # Destroy any stale vehicle and spawn a fresh one
        HelicopterSpawner.RespawnVehicle()
        # Assign the triggering player as driver
        if (A := TriggeringAgent?):
            HelicopterSpawner.AssignDriver(A)

    # Fires when an agent boards the helicopter — receives the agent directly
    OnAgentEntersHelicopter(BoardingAgent : agent) : void =
        # Nothing to do here in this scenario, but you could
        # start a countdown timer, lock the zone, etc.
        # The agent is already typed as `agent` — no unwrap needed.
        ScoreManager.Activate(BoardingAgent)

    # Fires when an agent exits the helicopter — extraction complete!
    OnAgentExitsHelicopter(ExitingAgent : agent) : void =
        # Award bonus score for a safe landing
        ScoreManager.Activate(ExitingAgent)
        # Clean up the helicopter
        HelicopterSpawner.DestroyVehicle()
        # Disable the spawner until the next round
        HelicopterSpawner.Disable()

    # Fires when the helicopter is destroyed (e.g. shot down)
    OnHelicopterDestroyed(Payload : tuple()) : void =
        # Respawn the helicopter so the mission can continue
        HelicopterSpawner.RespawnVehicle()

    # Fires when the helicopter finishes spawning — receives the fort_vehicle
    OnHelicopterSpawned(Vehicle : fort_vehicle) : void =
        # You could store Vehicle for later reference if needed
        # fort_vehicle is the live vehicle object
        ScoreManager.Reset()```

**Line-by-line highlights:**

| Line / call | What it does |
|---|---|
| `HelicopterSpawner.Disable()` | Prevents the helicopter from being interacted with at round start |
| `ExtractionZoneTrigger.TriggeredEvent.Subscribe(OnExtractionZoneTriggered)` | Hooks the trigger; note the handler receives `?agent` (optional) |
| `HelicopterSpawner.AgentEntersVehicleEvent.Subscribe(OnAgentEntersHelicopter)` | `AgentEntersVehicleEvent` sends a plain `agent`  no unwrap needed in the handler |
| `HelicopterSpawner.RespawnVehicle()` | Destroys any existing vehicle and spawns a fresh helicopter |
| `HelicopterSpawner.AssignDriver(A)` | Seats the extracted agent as pilot immediately |
| `HelicopterSpawner.DestroyVehicle()` | Removes the helicopter from the world |
| `HelicopterSpawner.DestroyedEvent.Subscribe(OnHelicopterDestroyed)` | `DestroyedEvent` sends `tuple()`  the handler takes `(Payload : tuple())` |
| `HelicopterSpawner.SpawnedEvent.Subscribe(OnHelicopterSpawned)` | `SpawnedEvent` sends a `fort_vehicle`  useful for tracking the live object |

## Common patterns

### Pattern 1 — Disable the helicopter after a time limit

Respawn the helicopter at the start of each round, then destroy it after 60 seconds if it hasn't been claimed.

```verse
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /Verse.org/Native }
using { /Verse.org/Concurrency }

timed_helicopter_round := class(creative_device):

    @editable
    HelicopterSpawner : vehicle_spawner_helicopter_device = vehicle_spawner_helicopter_device{}

    OnBegin<override>()<suspends> : void =
        # Spawn the helicopter for this round
        HelicopterSpawner.Enable()
        HelicopterSpawner.RespawnVehicle()

        # Wait 60 seconds, then destroy it if still around
        Sleep(60.0)
        HelicopterSpawner.DestroyVehicle()
        HelicopterSpawner.Disable()

Pattern 2 — Auto-assign a specific player as driver on spawn

When the helicopter spawns, immediately seat the first player who interacted with a button.

using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /Verse.org/Native }

auto_assign_pilot := class(creative_device):

    @editable
    HelicopterSpawner : vehicle_spawner_helicopter_device = vehicle_spawner_helicopter_device{}

    @editable
    PilotButton : button_device = button_device{}

    # Stores the agent who pressed the button
    var DesignatedPilot : ?agent = false

    OnBegin<override>()<suspends> : void =
        PilotButton.InteractedWithEvent.Subscribe(OnPilotChosen)
        HelicopterSpawner.SpawnedEvent.Subscribe(OnHelicopterSpawned)

    OnPilotChosen(Pilot : agent) : void =
        set DesignatedPilot = option{Pilot}
        # Spawn the helicopter now that we have a pilot
        HelicopterSpawner.RespawnVehicle()

    # SpawnedEvent sends fort_vehicle — we use the stored pilot
    OnHelicopterSpawned(Vehicle : fort_vehicle) : void =
        if (Pilot := DesignatedPilot?):
            HelicopterSpawner.AssignDriver(Pilot)

Pattern 3 — Track enter/exit to toggle a zone device

Activate a "no-go zone" barrier while the helicopter is occupied; deactivate it when the pilot lands.

using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /Verse.org/Native }

helicopter_zone_guard := class(creative_device):

    @editable
    HelicopterSpawner : vehicle_spawner_helicopter_device = vehicle_spawner_helicopter_device{}

    # A mutator zone or barrier device that blocks entry while active
    @editable
    RestrictedZone : mutator_zone_device = mutator_zone_device{}

    OnBegin<override>()<suspends> : void =
        HelicopterSpawner.AgentEntersVehicleEvent.Subscribe(OnPilotBoarded)
        HelicopterSpawner.AgentExitsVehicleEvent.Subscribe(OnPilotExited)
        HelicopterSpawner.DestroyedEvent.Subscribe(OnHelicopterDestroyed)

    # AgentEntersVehicleEvent sends agent directly — no optional unwrap
    OnPilotBoarded(Pilot : agent) : void =
        RestrictedZone.Enable()

    # AgentExitsVehicleEvent sends agent directly
    OnPilotExited(Pilot : agent) : void =
        RestrictedZone.Disable()

    # DestroyedEvent sends tuple() — make sure the zone is cleared
    OnHelicopterDestroyed(Payload : tuple()) : void =
        RestrictedZone.Disable()

Gotchas

1. AgentEntersVehicleEvent / AgentExitsVehicleEvent send agent, not ?agent

Unlike many trigger events (e.g. trigger_device.TriggeredEvent) which send ?agent, these two events send a plain agent. Your handler signature must be (SomeAgent : agent) — no if (A := SomeAgent?): unwrap needed.

# CORRECT
OnAgentEntersHelicopter(BoardingAgent : agent) : void =
    HelicopterSpawner.AssignDriver(BoardingAgent)

# WRONG — will not compile, the event doesn't send ?agent
# OnAgentEntersHelicopter(BoardingAgent : ?agent) : void = ...

2. DestroyedEvent and VehicleDestroyedEvent send tuple(), not an agent

These events carry no payload agent. Your handler must accept (Payload : tuple()). You cannot identify who destroyed the vehicle from this event alone — combine it with damage tracking if you need that.

# CORRECT
OnHelicopterDestroyed(Payload : tuple()) : void =
    HelicopterSpawner.RespawnVehicle()

3. VehicleSpawnedEvent and VehicleDestroyedEvent are deprecated

The API surface lists both as deprecated. Always prefer SpawnedEvent (which also gives you the fort_vehicle object) and DestroyedEvent. Using the deprecated events will still compile today but may be removed in a future digest.

4. RespawnVehicle() destroys the old vehicle first

Calling RespawnVehicle() when a helicopter is already in the world will silently destroy it before spawning the new one. If a player is inside when this happens, they will be ejected. Don't call RespawnVehicle() inside a DestroyedEvent handler without a guard — you can create an infinite respawn loop if the helicopter is immediately destroyed again.

5. The device must be @editable — you cannot construct it in code

vehicle_spawner_helicopter_device is <concrete><final> and must be placed in the UEFN level editor and referenced via an @editable field. Attempting to write vehicle_spawner_helicopter_device{} as a standalone local variable and calling methods on it will compile but the device will have no in-world representation and nothing will happen.

6. AssignDriver requires the vehicle to already exist

Call AssignDriver after the helicopter has spawned — either inside a SpawnedEvent handler or after Sleep-ing long enough for the spawn to complete. Calling it before the vehicle exists has no effect.

Build your own lesson with vehicle_spawner_helicopter_device

Generate a personalized, step-by-step lesson plan built around this object — grounded in this exact reference and our compile-verified knowledge base.

Build a lesson →