Overview
The vehicle_spawner_armored_battle_bus_device is a specialized vehicle_spawner_device that places an Armored Battle Bus in your level. It solves the classic team-mobility problem: you want a big, tanky vehicle that a squad can pile into, that you can spawn/destroy on demand, and that fires events your game logic can hook into.
Reach for it when you want:
- A central getaway vehicle that respawns after it's destroyed.
- A boss bus that you destroy from script when a round ends.
- Reactive logic — give a player a shield buff the moment they board, or score points when the bus is wrecked.
Because it inherits everything from vehicle_spawner_device, the same Enable/Disable/AssignDriver/DestroyVehicle/RespawnVehicle methods and the AgentEntersVehicleEvent/AgentExitsVehicleEvent/SpawnedEvent/DestroyedEvent events all apply. Everything below works identically for the dirtbike, helicopter, UFO, and tank spawners too.
API Reference
vehicle_spawner_armored_battle_bus_device
Specialized
vehicle_spawner_devicethat allows an armored battle bus 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_armored_battle_bus_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 respawning getaway bus. When the round starts we enable the spawner. When the bus is destroyed we wait a moment and respawn a fresh one. When a player boards we tag them as the driver and grant a small shield (via an item granter); when they leave we just log it. We'll also reward the team with a score whenever the bus is wrecked.
Place an Armored Battle Bus spawner, an item granter, and a score manager in your level, then bind them to the editable fields.
using { /Fortnite.com/Devices }
using { /Fortnite.com/Characters }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
# Getaway-bus controller: spawns, respawns, and reacts to the Armored Battle Bus.
getaway_bus_device := class(creative_device):
# Drag your Armored Battle Bus spawner here in the Details panel.
@editable
BusSpawner : vehicle_spawner_armored_battle_bus_device = vehicle_spawner_armored_battle_bus_device{}
# Item granter that hands the driver a shield item.
@editable
DriverGranter : item_granter_device = item_granter_device{}
# Score awarded to whoever wrecks the bus.
@editable
WreckScore : score_manager_device = score_manager_device{}
OnBegin<override>()<suspends>:void =
# Turn the spawner on so the first bus appears.
BusSpawner.Enable()
# React to players boarding / leaving the bus.
BusSpawner.AgentEntersVehicleEvent.Subscribe(OnEnter)
BusSpawner.AgentExitsVehicleEvent.Subscribe(OnExit)
# React to the bus spawning and being destroyed.
BusSpawner.SpawnedEvent.Subscribe(OnBusSpawned)
BusSpawner.DestroyedEvent.Subscribe(OnBusDestroyed)
# AgentEntersVehicleEvent hands us a plain agent (not an option here).
OnEnter(Agent : agent):void =
# Make this player the official driver.
BusSpawner.AssignDriver(Agent)
# Give them a shield item from the granter.
DriverGranter.GrantItem(Agent)
Print("A player boarded the battle bus and was assigned as driver.")
OnExit(Agent : agent):void =
Print("A player left the battle bus.")
# SpawnedEvent sends the fort_vehicle that was spawned.
OnBusSpawned(Vehicle : fort_vehicle):void =
Print("A fresh armored battle bus is ready.")
# DestroyedEvent sends an empty tuple; we kick off a respawn.
OnBusDestroyed():void =
Print("Battle bus destroyed — respawning shortly.")
spawn { RespawnAfterDelay() }
RespawnAfterDelay()<suspends>:void =
Sleep(5.0)
# RespawnVehicle destroys any existing bus, then spawns a new one.
BusSpawner.RespawnVehicle()
Line by line:
- The three
@editablefields are how Verse reaches placed devices. Without declaringBusSpawneras an editable field of acreative_deviceclass, callingBusSpawner.Enable()would fail with Unknown identifier. OnBeginruns when the game starts. WeEnable()the spawner so a bus appears, thenSubscribeeach handler to its event. Subscriptions belong inOnBegin; the handlers themselves are methods at class scope.OnEnter(Agent : agent)—AgentEntersVehicleEventislistenable(agent), so the handler receives a ready-to-useagent(no?unwrap needed). We callAssignDriver(Agent)to seat them as driver andGrantItem(Agent)to hand a shield.OnBusSpawned(Vehicle : fort_vehicle)—SpawnedEventislistenable(fort_vehicle), so we get the actual vehicle object.OnBusDestroyed()—DestroyedEventislistenable(tuple()), an empty payload, so the handler takes no parameters. Wespawnan async helper because handlers aren't<suspends>and can'tSleepdirectly.RespawnAfterDelaywaits 5 seconds, thenRespawnVehicle()replaces the wreck with a fresh bus — closing the loop.
Common patterns
Pattern 1 — Force-spawn a bus from another event and reward the wrecker
Use RespawnVehicle to manufacture a fresh bus on command (e.g. from a button), and award score on DestroyedEvent.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
bus_button_device := class(creative_device):
@editable
BusSpawner : vehicle_spawner_armored_battle_bus_device = vehicle_spawner_armored_battle_bus_device{}
@editable
SummonButton : button_device = button_device{}
OnBegin<override>()<suspends>:void =
BusSpawner.Enable()
SummonButton.InteractedWithEvent.Subscribe(OnSummon)
BusSpawner.DestroyedEvent.Subscribe(OnWrecked)
OnSummon(Agent : agent):void =
# Replace any existing bus with a brand new one.
BusSpawner.RespawnVehicle()
Print("Battle bus summoned by button.")
OnWrecked():void =
Print("The summoned bus was wrecked.")
Pattern 2 — Disable the spawner and clear the bus at round end
Disable stops the spawner from producing more buses; DestroyVehicle removes the current one immediately.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
round_end_bus_device := class(creative_device):
@editable
BusSpawner : vehicle_spawner_armored_battle_bus_device = vehicle_spawner_armored_battle_bus_device{}
# Trigger that fires when the round ends.
@editable
RoundEndTrigger : trigger_device = trigger_device{}
OnBegin<override>()<suspends>:void =
RoundEndTrigger.TriggeredEvent.Subscribe(OnRoundEnd)
# TriggeredEvent passes ?agent; unwrap it if you need the instigator.
OnRoundEnd(MaybeAgent : ?agent):void =
# No more buses, and clear the current one off the field.
BusSpawner.Disable()
BusSpawner.DestroyVehicle()
if (Agent := MaybeAgent?):
Print("Round ended — bus cleared.")
Pattern 3 — Track who is aboard with enter/exit events
Keep a count of riders using AgentEntersVehicleEvent and AgentExitsVehicleEvent.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
bus_rider_counter_device := class(creative_device):
@editable
BusSpawner : vehicle_spawner_armored_battle_bus_device = vehicle_spawner_armored_battle_bus_device{}
var RiderCount : int = 0
OnBegin<override>()<suspends>:void =
BusSpawner.Enable()
BusSpawner.AgentEntersVehicleEvent.Subscribe(OnBoard)
BusSpawner.AgentExitsVehicleEvent.Subscribe(OnLeave)
OnBoard(Agent : agent):void =
set RiderCount += 1
Print("Riders aboard: {RiderCount}")
OnLeave(Agent : agent):void =
set RiderCount -= 1
Print("Riders aboard: {RiderCount}")
Gotchas
DestroyedEvent/VehicleDestroyedEventcarry no agent. They arelistenable(tuple()), so the handler must take no parameters (OnBusDestroyed():void). WritingOnBusDestroyed(X : agent)will not match and won't compile.- Use
SpawnedEvent, notVehicleSpawnedEvent. Both exist, butVehicleSpawnedEventandVehicleDestroyedEventare deprecatedtuple()events. PreferSpawnedEvent(gives you thefort_vehicle) andDestroyedEvent. - Enter/exit events hand you a plain
agent, not?agent.AgentEntersVehicleEventislistenable(agent), so noif (A := Agent?)unwrap is needed — just useAgent. Contrast this withtrigger_device.TriggeredEvent, which IS?agentand DOES need unwrapping. - Handlers can't
Sleep. Event handlers are ordinary methods, not<suspends>. To wait before respawning,spawna separate<suspends>helper as in the walkthrough. RespawnVehicledestroys the old bus first. It's not additive — calling it repeatedly leaves you with exactly one bus, not many.AssignDriverneeds a valid occupant context. Assigning a driver only makes sense for an agent who is in (or boarding) the vehicle; calling it on a random faraway agent has no useful effect.- Bind every
@editablein the Details panel. An unbound spawner field defaults to an empty device and yourEnable()/RespawnVehicle()calls will silently do nothing.