Overview
The vehicle_spawner_boat_device is a specialized vehicle_spawner_device that spawns a configurable boat (the Motorboat) at its placement point. You reach for it whenever your mode needs water traversal on your terms: a race that hands each team a boat at the starting gate, a pirate-cove escape where the getaway boat only appears once an objective is complete, or an extraction map where leaving the boat triggers a checkpoint.
Because it derives from vehicle_spawner_device, it inherits the full vehicle-spawner surface: methods to Enable/Disable the spawner, RespawnVehicle to drop a fresh boat (destroying the old one first), DestroyVehicle to clear it, and AssignDriver to force a specific player into the driver seat. It also fires events when a boat spawns (SpawnedEvent), is destroyed (DestroyedEvent), and when agents enter or exit it (AgentEntersVehicleEvent / AgentExitsVehicleEvent).
The key thing to remember: a vehicle spawner manages one boat at a time. Calling RespawnVehicle always replaces the current boat rather than stacking new ones.
API Reference
vehicle_spawner_boat_device
Specialized
vehicle_spawner_devicethat allows a boat 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_boat_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
Let's build a dock that comes alive when the round starts. We place a vehicle_spawner_boat_device and a button_device on a pier. When the round begins we disable the spawner so there's no boat sitting idle. When a player presses the button, we enable the spawner and respawn a fresh boat, then assign that player as the driver so they're dropped straight into the seat. We log boat life-cycle moments to the HUD via a message device-free approach (using the events).
using { /Fortnite.com/Devices }
using { /Fortnite.com/Characters }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
# A dock that hands the interacting player a freshly spawned boat.
boat_dock_device := class(creative_device):
# The boat spawner placed on the pier.
@editable
BoatSpawner : vehicle_spawner_boat_device = vehicle_spawner_boat_device{}
# The button a player presses to request a boat.
@editable
RequestButton : button_device = button_device{}
OnBegin<override>()<suspends>:void =
# Start with no boat available — the dock is "closed".
BoatSpawner.Disable()
# React to the button press.
RequestButton.InteractedWithEvent.Subscribe(OnRequestBoat)
# React to the boat life cycle.
BoatSpawner.SpawnedEvent.Subscribe(OnBoatSpawned)
BoatSpawner.DestroyedEvent.Subscribe(OnBoatDestroyed)
BoatSpawner.AgentEntersVehicleEvent.Subscribe(OnDriverEntered)
BoatSpawner.AgentExitsVehicleEvent.Subscribe(OnDriverExited)
# Button handler. button_device.InteractedWithEvent sends an agent.
OnRequestBoat(Agent : agent):void =
# Open the dock and drop a fresh boat (replaces any existing one).
BoatSpawner.Enable()
BoatSpawner.RespawnVehicle()
# Put the requesting player straight into the driver seat.
BoatSpawner.AssignDriver(Agent)
# SpawnedEvent sends the fort_vehicle that was spawned.
OnBoatSpawned(Vehicle : fort_vehicle):void =
Print("A boat has launched at the dock!")
# DestroyedEvent sends an empty tuple.
OnBoatDestroyed():void =
Print("The dock's boat was destroyed.")
OnDriverEntered(Agent : agent):void =
Print("A player boarded the boat.")
OnDriverExited(Agent : agent):void =
Print("A player left the boat.")
Line by line:
BoatSpawner : vehicle_spawner_boat_deviceandRequestButton : button_deviceare@editablefields — that's how you bind the placed devices in the UEFN Details panel. Without the editable field, callingBoatSpawner.Disable()would fail with Unknown identifier.- In
OnBeginwe callBoatSpawner.Disable()so the round starts with the dock closed. - We subscribe handlers to the button and to four spawner events. Subscriptions live in
OnBegin; the handlers are methods at class scope. OnRequestBoatreceives the interactingagentfrom the button. WeEnable()the spawner,RespawnVehicle()to materialize the boat, thenAssignDriver(Agent)to seat the player.OnBoatSpawnedreceives afort_vehicle(the freshly spawned boat) — exactly whatSpawnedEventpromises.OnBoatDestroyedtakes no parameter becauseDestroyedEventis alistenable(tuple()).AgentEntersVehicleEvent/AgentExitsVehicleEventeach hand us the boarding/leavingagent.
Common patterns
Despawn the boat when the round ends
Use a round_settings_device or any signal source, then call DestroyVehicle to clear the boat off the water. Here we wire a trigger to clean up.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
cleanup_dock_device := class(creative_device):
@editable
BoatSpawner : vehicle_spawner_boat_device = vehicle_spawner_boat_device{}
# A trigger that signals "round over".
@editable
EndTrigger : trigger_device = trigger_device{}
OnBegin<override>()<suspends>:void =
EndTrigger.TriggeredEvent.Subscribe(OnRoundOver)
# trigger_device.TriggeredEvent sends ?agent (optional).
OnRoundOver(MaybeAgent : ?agent):void =
# Remove the boat and shut the spawner down.
BoatSpawner.DestroyVehicle()
BoatSpawner.Disable()
Auto-respawn a boat the moment its old one is destroyed
Great for a race where the boat should always be ready. We listen to DestroyedEvent and immediately respawn.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
always_ready_dock_device := class(creative_device):
@editable
BoatSpawner : vehicle_spawner_boat_device = vehicle_spawner_boat_device{}
OnBegin<override>()<suspends>:void =
BoatSpawner.Enable()
BoatSpawner.RespawnVehicle()
# Whenever a boat is destroyed, drop a fresh one.
BoatSpawner.DestroyedEvent.Subscribe(OnBoatGone)
OnBoatGone():void =
BoatSpawner.RespawnVehicle()
Track who is currently aboard with the enter/exit events
This pattern keeps a count of riders so you could, e.g., open a gate only when the boat is empty.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
rider_counter_device := class(creative_device):
@editable
BoatSpawner : vehicle_spawner_boat_device = vehicle_spawner_boat_device{}
var RiderCount : int = 0
OnBegin<override>()<suspends>:void =
BoatSpawner.AgentEntersVehicleEvent.Subscribe(OnEnter)
BoatSpawner.AgentExitsVehicleEvent.Subscribe(OnExit)
OnEnter(Agent : agent):void =
set RiderCount += 1
Print("Riders aboard: {RiderCount}")
OnExit(Agent : agent):void =
set RiderCount -= 1
Print("Riders aboard: {RiderCount}")
Gotchas
SpawnedEventvsVehicleSpawnedEvent. The deprecatedVehicleSpawnedEvent/VehicleDestroyedEventarelistenable(tuple())and carry no data. PreferSpawnedEvent(gives you thefort_vehicle) andDestroyedEvent. Don't mix them up — handler signatures differ: atuple()event handler takes no parameter, whileSpawnedEvent's handler takes(Vehicle : fort_vehicle).- Handler parameter shape must match the event.
AgentEntersVehicleEventislistenable(agent), so its handler isOnEnter(Agent : agent). Alistenable(tuple())event likeDestroyedEventneeds a no-parameter handlerOnBoatDestroyed(). Mismatches fail to compile. - trigger_device sends
?agent, notagent. When you subscribe to a trigger, the handler receives an optional. Unwrap it withif (A := MaybeAgent?):before using the agent. RespawnVehiclereplaces, it does not stack. Each spawner manages a single boat. Call it twice and you still have one boat — the old one is destroyed first. To have multiple boats, place multiple spawners.AssignDriverneeds a boat to exist. CallRespawnVehicle()(or otherwise ensure a boat is present) beforeAssignDriver, or there's no vehicle to seat the player in.- Disable stops spawning but doesn't delete an existing boat. If you want the water cleared, call
DestroyVehicle()—Disable()alone just prevents future respawns.