Overview
The overlord_spire_device is a pre-built boss encounter. You drop it in your level, set an Activation Distance, and when players get close it spawns and begins cycling through attacks: a charged beam, homing projectiles, a ground slam (with a recover phase when its appendage weakpoint gets stuck), and a scream.
What makes it powerful for creators is that every phase fires a listenable event. You don't control the Spire's attacks from Verse with methods — instead you react to its built-in behavior to drive the rest of your encounter. Reach for it when you want a dramatic arena fight where the environment itself responds: a damage zone that activates during the scream, a cinematic camera that plays when the slam lands, score awarded for surviving a beam, or a teleporter that yanks players to a safe room when the boss is about to slam.
One important note: this device exposes events only in the surface you'll subscribe to. The interesting work is wiring those events to other devices (timers, cinematics, score managers, damage volumes) that you DO call methods on.
API Reference
overlord_spire_device
A boss-like environmental encounter that will attack players with different abilities
Full public surface, resolved verbatim from the live Epic digest (Fortnite.digest.verse).
overlord_spire_device<public> := class<concrete><final>(creative_device_base, has_spire_functionality):
Events (subscribe a handler to react):
| Event | Signature | Description |
|---|---|---|
SpawnEvent |
SpawnEvent<public>:listenable(tuple()) |
Triggers when the Spire is spawned, either from players entering the Activation Distance or by events. |
BeginBeamEvent |
BeginBeamEvent<public>:listenable(tuple()) |
Triggers when the Spire begins charging up its beam attack |
EndBeamEvent |
EndBeamEvent<public>:listenable(tuple()) |
Triggers when the Spire finishes shooting its beam attack |
BeginHomingProjectileEvent |
BeginHomingProjectileEvent<public>:listenable(tuple()) |
Triggers when the Spire starts spawning homing projectiles to fire |
EndHomingProjectileEvent |
EndHomingProjectileEvent<public>:listenable(tuple()) |
Triggers when the last homing projectile has exploded |
BeginSlamEvent |
BeginSlamEvent<public>:listenable(tuple()) |
Triggers when the Spire begins its slam attack |
EndSlamEvent |
EndSlamEvent<public>:listenable(tuple()) |
Triggers when the Spire has finished recovering from the slam attack |
BeginSlamRecoverEvent |
BeginSlamRecoverEvent<public>:listenable(tuple()) |
Triggers when the Spire begins trying to recover from the slam attack, when the appendage weakpoint is stuck in the ground. |
EndSlamRecoverEvent |
EndSlamRecoverEvent<public>:listenable(tuple()) |
Triggers when the Spire finishes recovering from the slam attack and the appendage weakpoint is no longer stuck in the ground. |
BeginScreamEvent |
BeginScreamEvent<public>:listenable(tuple()) |
Triggers when the Spire begins to perform the scream. |
EndScreamEvent |
EndScreamEvent<public>:listenable(tuple()) |
Triggers when the Spire has finished performing the scream |
Walkthrough
Let's build a complete arena. When the Spire spawns, we start an encounter timer. When it begins a slam, we activate a damage volume on the ground (so players must jump or move). When the slam recover phase begins (the weakpoint is exposed and stuck), we play a cinematic to telegraph the opening. When it screams, we award score to everyone who is still alive in the arena, and when the scream ends we turn the damage volume back off.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/UI }
overlord_arena := class(creative_device):
@editable
Spire : overlord_spire_device = overlord_spire_device{}
@editable
EncounterTimer : timer_device = timer_device{}
@editable
SlamDamageZone : damage_volume_device = damage_volume_device{}
@editable
WeakpointCinematic : cinematic_sequence_device = cinematic_sequence_device{}
@editable
SurvivorScore : score_manager_device = score_manager_device{}
OnBegin<override>()<suspends>:void =
# The damage zone starts disabled — only dangerous during slams.
SlamDamageZone.Disable()
# Wire each phase of the boss to our arena logic.
Spire.SpawnEvent.Subscribe(OnSpireSpawned)
Spire.BeginSlamEvent.Subscribe(OnSlamBegin)
Spire.EndSlamEvent.Subscribe(OnSlamEnd)
Spire.BeginSlamRecoverEvent.Subscribe(OnRecoverBegin)
Spire.BeginScreamEvent.Subscribe(OnScreamBegin)
Spire.EndScreamEvent.Subscribe(OnScreamEnd)
# Spire spawned (players entered Activation Distance) — start the clock.
OnSpireSpawned():void =
EncounterTimer.Start()
SlamDamageZone.SetDamage(50)
# Slam beginning — make the ground dangerous.
OnSlamBegin():void =
SlamDamageZone.Enable()
# Slam fully recovered — ground is safe again.
OnSlamEnd():void =
SlamDamageZone.Disable()
# Weakpoint exposed (appendage stuck) — telegraph the opening with a cinematic.
OnRecoverBegin():void =
WeakpointCinematic.Play()
# Scream beginning — reward everyone still standing in the arena.
OnScreamBegin():void =
Survivors := SlamDamageZone.GetAgentsInVolume()
for (Survivor : Survivors):
SurvivorScore.Activate(Survivor)
# Scream over — safe again.
OnScreamEnd():void =
SlamDamageZone.Disable()
Line by line:
- The
@editablefields are how Verse gets a handle on devices placed in your level. The Spire itself, plus the four helper devices we drive. You assign each in the Details panel after the script compiles. - In
OnBeginwe firstDisable()the damage zone so the floor is safe until a slam happens. - Each
Subscribecall connects one of the Spire's phase events to a handler method. Because every Spire event is alistenable(tuple()), the handler takes no parameters —tuple()is the empty tuple, so there's no agent to unwrap. OnSpireSpawnedstarts the encounter timer and presets the per-tick slam damage withSetDamage(50).OnSlamBeginenables the damage volume;OnSlamEnddisables it again so the danger window matches the attack.OnRecoverBeginplays a cinematic when the weakpoint is exposed — a classic boss tell.OnScreamBegincallsGetAgentsInVolume()to find every agent still inside the arena zone and grants each one points withSurvivorScore.Activate(Survivor).OnScreamEndre-disables the zone as a safety net.
Common patterns
Beam phase → teleport players to a bunker
When the Spire charges its beam, yank everyone in the danger zone to a safe teleporter; bring them back when the beam ends.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
beam_dodge_manager := class(creative_device):
@editable
Spire : overlord_spire_device = overlord_spire_device{}
@editable
DangerZone : damage_volume_device = damage_volume_device{}
@editable
Bunker : teleporter_device = teleporter_device{}
OnBegin<override>()<suspends>:void =
Spire.BeginBeamEvent.Subscribe(OnBeamCharge)
Spire.EndBeamEvent.Subscribe(OnBeamDone)
OnBeamCharge():void =
Caught := DangerZone.GetAgentsInVolume()
for (A : Caught):
Bunker.Teleport(A)
OnBeamDone():void =
# Beam over — nothing to do here, players walk back out.
DangerZone.Enable()
Homing projectiles → drive an urgency timer
Start a tight countdown when projectiles spawn and reset it once the last one detonates.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
homing_phase_manager := class(creative_device):
@editable
Spire : overlord_spire_device = overlord_spire_device{}
@editable
DodgeTimer : timer_device = timer_device{}
OnBegin<override>()<suspends>:void =
Spire.BeginHomingProjectileEvent.Subscribe(OnProjectilesOut)
Spire.EndHomingProjectileEvent.Subscribe(OnProjectilesGone)
OnProjectilesOut():void =
DodgeTimer.Start()
OnProjectilesGone():void =
DodgeTimer.Reset()
Scream phase → play a cinematic stinger
Use the scream's begin/end to bookend a dramatic camera move.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
scream_stinger := class(creative_device):
@editable
Spire : overlord_spire_device = overlord_spire_device{}
@editable
ScreamCam : cinematic_sequence_device = cinematic_sequence_device{}
OnBegin<override>()<suspends>:void =
Spire.BeginScreamEvent.Subscribe(OnScream)
Spire.EndScreamEvent.Subscribe(OnScreamOver)
OnScream():void =
ScreamCam.Play()
OnScreamOver():void =
ScreamCam.Stop()
Gotchas
- Every Spire event is
listenable(tuple()). That means your handler methods take no arguments — do NOT writeOnSlamBegin(Agent:?agent). There is no instigating agent on these events. (TheActivateEventoverload in the broader API does carry?agent, but the spawn/attack phase events in this surface do not.) - The device has no attack methods. You can't
Spire.BeginBeam()— you only react. The attack cadence is controlled by the device's own AI and its Activation Distance setting. To get agents, query a helper device like adamage_volume_devicewithGetAgentsInVolume(). - Subscribe in
OnBegin, not at field-init time. Event subscriptions must happen inside the runningOnBegin<override>()<suspends>body so the device handles exist. SetDamageis clamped 1–500. CallingSlamDamageZone.SetDamage(50)is fine, but values outside that range are silently clamped — don't expectSetDamage(9999)to one-shot players.score_manager_device.Activateneeds an agent overload when Activating Team is restricted. We callSurvivorScore.Activate(Survivor)per-agent so each survivor is credited; if you used the no-argActivate()it scores the device's configured target instead.- Don't forget to assign every
@editablein the Details panel. An unassigned device reference compiles but does nothing at runtime — a common reason 'the Spire script isn't working'.