Reference Devices compiles

nitro_hoop_device: Blazing Boost Gates for Racers and Riders

The `nitro_hoop_device` is a large flaming hoop that blasts players and vehicles with a burst of nitro speed the moment they pass through it. Whether you're building a rocket-racing circuit, a stunt course, or a timed obstacle run, this device gives you Verse-level control over when hoops are active, how long they rest between uses, and how you react to every trigger event. This article covers every method and event on the device so you can wire up dynamic race logic from day one.

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

Overview

The nitro_hoop_device places a dramatic flaming ring in your island that accelerates any player or vehicle that passes through it. Out of the box it works standalone, but connecting it to Verse unlocks a rich set of controls:

  • Enable / Disable hoops on a schedule or in response to game state (e.g., only the next hoop in a sequence is active).
  • Cooldown management — let the hoop rest between uses, shorten or extend that rest period at runtime, or bypass cooldown entirely for an always-hot boost pad.
  • Event hooks — react when a player or vehicle triggers the hoop, when cooldown begins, or when the hoop comes back online.

Reach for nitro_hoop_device whenever you need boost gates that respond to game logic: sequential activation, per-lap cooldowns, team-gated hoops, or score multipliers tied to hoop combos.

API Reference

nitro_hoop_device

Use to create a flaming hoop that accelerates and applies nitro to players and vehicles.

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

nitro_hoop_device<public> := class<concrete><final>(creative_device_base):

Events (subscribe a handler to react):

Event Signature Description
PlayerTriggeredEvent PlayerTriggeredEvent<public>:listenable(agent) Triggers when a player triggers the device. Sends the triggering agent.
VehicleTriggeredEvent VehicleTriggeredEvent<public>:listenable(?agent) Triggers when a vehicle triggers the device. Sends the driver as the triggering agent. If the vehicle has no driver then false is returned.
CooldownStartEvent CooldownStartEvent<public>:listenable(tuple()) Triggers when the device enters the cooldown state, becoming disabled. This is not triggered by manually calling Disable.
EnabledEvent EnabledEvent<public>:listenable(tuple()) Triggers when the device becomes enabled after being disabled, potentially through the cooldown state.

Methods (call these to make the device act):

Method Signature Description
Enable Enable<public>():void Enable the device. If the device is currently in the cooldown state, this also ends the cooldown state.
Disable Disable<public>():void Disable the device. This causes the device to enter the cooldown state until the device is re-enabled by Enable, DisallowCooldown, or Enable on Phase.
AllowCooldown AllowCooldown<public>():void Allow the device to enter the cooldown state after a player or vehicle triggers it.
DisallowCooldown DisallowCooldown<public>():void Prevent the device from entering the cooldown state after use. Until AllowCooldown is called, triggering the device will not begin cooldown. If the device is currently in the cooldown state, this ends the cooldown state and re-enables the
StartCooldown StartCooldown<public>(Seconds:float):void Enter the cooldown state for Seconds seconds. If the device is already in the cooldown state, re-enable it after Seconds seconds. Seconds is clamped to a minimum of 1.0.
IsEnabled IsEnabled<public>()<transacts><decides>:void Succeeds if the device is currently enabled. The device is not enabled if it is in the cooldown state, or has otherwise been manually disabled.
GetDefaultCooldownDuration GetDefaultCooldownDuration<public>():float Return the default duration of the cooldown state in seconds.
SetDefaultCooldownDuration SetDefaultCooldownDuration<public>(Seconds:float):void Set the default duration of the cooldown state to Seconds. * Seconds is clamped between 1.0 and 60.0.
GetCooldownDelay GetCooldownDelay<public>():float Return the duration of the cooldown delay in seconds. This is the delay between triggering a cooldown and entering the cooldown phase.
SetCooldownDelay SetCooldownDelay<public>(Seconds:float):void Set the duration of the cooldown delay to Seconds. This is the delay between triggering a cooldown and entering the cooldown phase. * The cooldown delay does not apply to cooldowns triggered by StartCooldown or Disable. * Seconds is

Walkthrough

Scenario: Sequential Race Gate System

You have three nitro hoops placed along a race circuit. Only the first hoop starts active. When a player flies through it, it disables itself, the next hoop lights up, and a short cooldown is applied to the just-used hoop so it can reactivate for the next lap. We also log vehicle passes and announce when a hoop comes back online.

using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /Fortnite.com/Characters }
using { /Fortnite.com/Game }

# Attach this Verse device in UEFN and wire up three nitro_hoop_device references.
sequential_hoop_manager := class(creative_device):

    # The three hoops placed along the circuit, in order.
    @editable
    Hoop1 : nitro_hoop_device = nitro_hoop_device{}

    @editable
    Hoop2 : nitro_hoop_device = nitro_hoop_device{}

    @editable
    Hoop3 : nitro_hoop_device = nitro_hoop_device{}

    # How long (seconds) a used hoop waits before it can fire again.
    # Clamped by the device to [1.0, 60.0].
    CooldownSeconds : float = 8.0

    # Delay between triggering and entering cooldown phase (seconds).
    DelaySeconds : float = 0.5

    OnBegin<override>()<suspends> : void =
        # Configure cooldown durations at runtime.
        Hoop1.SetDefaultCooldownDuration(CooldownSeconds)
        Hoop2.SetDefaultCooldownDuration(CooldownSeconds)
        Hoop3.SetDefaultCooldownDuration(CooldownSeconds)

        # Small delay before cooldown phase kicks in after a pass-through.
        Hoop1.SetCooldownDelay(DelaySeconds)
        Hoop2.SetCooldownDelay(DelaySeconds)
        Hoop3.SetCooldownDelay(DelaySeconds)

        # Only Hoop1 starts active; the others wait.
        Hoop2.Disable()
        Hoop3.Disable()

        # Subscribe to player triggers for each hoop.
        Hoop1.PlayerTriggeredEvent.Subscribe(OnHoop1Player)
        Hoop2.PlayerTriggeredEvent.Subscribe(OnHoop2Player)
        Hoop3.PlayerTriggeredEvent.Subscribe(OnHoop3Player)

        # Subscribe to vehicle triggers — payload is ?agent (driver, may be false).
        Hoop1.VehicleTriggeredEvent.Subscribe(OnHoop1Vehicle)

        # React when Hoop1 finishes cooldown and comes back online.
        Hoop1.EnabledEvent.Subscribe(OnHoop1Reenabled)

        # React when Hoop1 enters cooldown (not triggered by manual Disable).
        Hoop1.CooldownStartEvent.Subscribe(OnHoop1CooldownStart)

    # --- Hoop 1 handlers ---

    OnHoop1Player(Agent : agent) : void =
        # Advance the sequence: disable this hoop, light up the next.
        Hoop1.Disable()
        Hoop2.Enable()

    OnHoop1Vehicle(Agent : ?agent) : void =
        # Unwrap the optional driver before using them.
        if (Driver := Agent?):
            # A driven vehicle passed through — advance the sequence.
            Hoop1.Disable()
            Hoop2.Enable()
        # If Agent is false, the vehicle was unoccupied; ignore.

    OnHoop1CooldownStart() : void =
        # Hoop1 entered cooldown naturally (AllowCooldown is default).
        # Nothing extra needed here, but you could update a HUD.
        var Duration : float = Hoop1.GetDefaultCooldownDuration()

    OnHoop1Reenabled() : void =
        # Hoop1 is hot again after cooldown — ready for the next lap.
        # Re-disable Hoop2 and Hoop3 to reset the sequence for this hoop.
        Hoop2.Disable()
        Hoop3.Disable()

    # --- Hoop 2 handler ---

    OnHoop2Player(Agent : agent) : void =
        Hoop2.Disable()
        Hoop3.Enable()

    # --- Hoop 3 handler ---

    OnHoop3Player(Agent : agent) : void =
        # Final hoop — start a timed cooldown of 5 seconds, then re-enable.
        Hoop3.StartCooldown(5.0)
        # Optionally re-enable Hoop1 for the next lap pass.
        Hoop1.Enable()

Line-by-line explanation

Lines What's happening
@editable fields Drag your placed nitro_hoop_device actors from the Outliner onto these slots in the device's Details panel. Without @editable, Verse can't reference placed devices.
SetDefaultCooldownDuration Overrides the in-editor cooldown setting at runtime. Clamped to [1.0, 60.0].
SetCooldownDelay Adds a brief grace window between a player passing through and the cooldown phase actually starting — useful so the boost animation finishes before the hoop dims.
Hoop2.Disable() / Hoop3.Disable() Manually disables hoops at startup so only Hoop1 is live.
PlayerTriggeredEvent.Subscribe Registers a class-scope method as the handler. The handler receives the agent directly (not optional).
VehicleTriggeredEvent.Subscribe Handler receives ?agent — the driver, or false if unoccupied. Always unwrap with if (Driver := Agent?):.
CooldownStartEvent.Subscribe Fires when the hoop enters cooldown naturally (after a trigger). Not fired by Disable().
EnabledEvent.Subscribe Fires when the hoop becomes active again after cooldown or after Enable() is called.
StartCooldown(5.0) Forces a 5-second cooldown immediately, bypassing the normal delay.
Hoop1.Enable() Re-enables Hoop1 (and cancels any active cooldown) so the lap sequence can restart.

Common patterns

Pattern 1 — Always-On Boost Pad (DisallowCooldown)

For a power-up lane where the hoop should never go dark, call DisallowCooldown at startup. The hoop fires every time without entering a rest state.

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

always_on_hoop := class(creative_device):

    @editable
    BoostHoop : nitro_hoop_device = nitro_hoop_device{}

    OnBegin<override>()<suspends> : void =
        # Prevent cooldown from ever triggering — hoop stays active indefinitely.
        BoostHoop.DisallowCooldown()

        # Subscribe to confirm it's firing.
        BoostHoop.PlayerTriggeredEvent.Subscribe(OnBoosted)

    OnBoosted(Agent : agent) : void =
        # The hoop is still enabled — verify with IsEnabled (failable).
        if (BoostHoop.IsEnabled[]):
            # Hoop is confirmed active; game logic here.
            var Delay : float = BoostHoop.GetCooldownDelay()

Pattern 2 — Timed Lockout After Vehicle Pass

In a demolition derby mode, lock a hoop for 15 seconds whenever a vehicle drives through it, then re-enable it. Use StartCooldown for precise control.

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

vehicle_lockout_hoop := class(creative_device):

    @editable
    DerbyHoop : nitro_hoop_device = nitro_hoop_device{}

    # Lockout duration in seconds (clamped to minimum 1.0 by the device).
    LockoutDuration : float = 15.0

    OnBegin<override>()<suspends> : void =
        DerbyHoop.VehicleTriggeredEvent.Subscribe(OnVehiclePass)
        DerbyHoop.EnabledEvent.Subscribe(OnHoopBack)

    OnVehiclePass(Agent : ?agent) : void =
        # Start a hard 15-second cooldown regardless of editor settings.
        DerbyHoop.StartCooldown(LockoutDuration)

    OnHoopBack() : void =
        # Hoop is live again — restore default cooldown behaviour.
        DerbyHoop.AllowCooldown()
        DerbyHoop.SetDefaultCooldownDuration(5.0)

Pattern 3 — Phase-Gated Hoop (Enable/Disable on game state)

Only activate the nitro hoop during the "Sprint" phase of a mini-game. Wire a trigger to flip the hoop on and off.

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

phase_gated_hoop := class(creative_device):

    @editable
    SprintHoop : nitro_hoop_device = nitro_hoop_device{}

    # A trigger_device wired to fire when the Sprint phase begins.
    @editable
    SprintStartTrigger : trigger_device = trigger_device{}

    # A trigger_device wired to fire when the Sprint phase ends.
    @editable
    SprintEndTrigger : trigger_device = trigger_device{}

    OnBegin<override>()<suspends> : void =
        # Hoop starts disabled; only active during Sprint phase.
        SprintHoop.Disable()

        SprintStartTrigger.TriggeredEvent.Subscribe(OnSprintStart)
        SprintEndTrigger.TriggeredEvent.Subscribe(OnSprintEnd)

        SprintHoop.CooldownStartEvent.Subscribe(OnCooldownBegan)

    OnSprintStart(Agent : ?agent) : void =
        # Enable the hoop (also cancels any active cooldown).
        SprintHoop.Enable()

    OnSprintEnd(Agent : ?agent) : void =
        # Disable the hoop for the rest phase.
        SprintHoop.Disable()

    OnCooldownBegan() : void =
        # Log the current cooldown duration for debugging.
        var Duration : float = SprintHoop.GetDefaultCooldownDuration()

Gotchas

1. @editable is mandatory — bare identifiers won't compile

You cannot write nitro_hoop_device{}.Enable() inline. Every placed device must be declared as an @editable field inside your class(creative_device). Without it, Verse has no reference to the actor placed in the level.

2. VehicleTriggeredEvent sends ?agent, not agent

The vehicle event's payload is ?agent (an optional). If the vehicle has no driver, the value is false. Always unwrap:

if (Driver := Agent?):
    # safe to use Driver here

Forgetting the unwrap causes a compile error because ?agent is not directly usable where agent is expected.

3. CooldownStartEvent does NOT fire after Disable()

If you call Hoop.Disable() manually, CooldownStartEvent is not signalled. It only fires when the cooldown is triggered naturally by a player or vehicle passing through. If you need to react to manual disables, subscribe to your own game-state variable instead.

4. IsEnabled[] is failable — use it inside if

IsEnabled is marked <decides>, meaning it either succeeds or fails rather than returning a logic value. Call it inside a condition:

if (MyHoop.IsEnabled[]):
    # hoop is active

Calling it outside a failable context is a compile error.

5. StartCooldown ignores the cooldown delay

The cooldown delay set by SetCooldownDelay applies only to natural cooldowns (player/vehicle trigger). When you call StartCooldown(Seconds) or Disable() directly, the device enters cooldown immediately with no delay.

6. Duration clamping

  • SetDefaultCooldownDuration clamps to [1.0, 60.0] — values outside this range are silently clamped.
  • StartCooldown clamps to a minimum of 1.0 — passing 0.0 gives you a 1-second cooldown, not an instant re-enable.
  • SetCooldownDelay also has a minimum of 0.0; consult the editor tooltip for the upper bound.

7. Enable() cancels active cooldown

Calling Enable() while the hoop is in cooldown immediately ends the cooldown and makes the hoop active. This is intentional and useful for phase resets, but can surprise you if you call Enable() accidentally mid-cooldown.

Device Settings & Options

The nitro_hoop_device User Options panel in the UEFN editor — every setting you can tune.

Nitro Hoop Device settings and options panel in the UEFN editor — Base Type, Add Columns, Add Stand, Enable Cooldown, Cooldown Duration
Nitro Hoop Device — User Options in the UEFN editor: Base Type, Add Columns, Add Stand, Enable Cooldown, Cooldown Duration
⚙️ Settings on this device (5)

Setting names read from the panel above — may be partial; the screenshots are the source of truth.

Base Type
Add Columns
Add Stand
Enable Cooldown
Cooldown Duration

Guides & scripts that use nitro_hoop_device

Step-by-step tutorials that put this object to work.

Build your own lesson with nitro_hoop_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 →