accolades_device: Rewarding Players with Battle Pass XP
The `accolades_device` is your bridge between player actions and Battle Pass XP — it lets you reward players for completing objectives on your island, from defeating bosses to solving puzzles. Without it, players visit your island but earn nothing toward their Battle Pass progression. Drop one into your scene, wire it to any game event in Verse, and call `Award` to hand out XP the moment a player earns it.
accolades_device in ~90 seconds.Overview
The accolades_device lets UEFN island creators grant Battle Pass XP to players when they accomplish something meaningful on your island. Accolades are the official mechanism Epic provides for rewarding player engagement — they show up in the player's Battle Pass progression and incentivize repeated play.
When should you reach for it?
- A player completes a bounty, puzzle, or obstacle course → call
Award. - You want to temporarily disable XP rewards during a setup or intermission phase → call
Disable/Enable. - You're testing your island and want to verify XP fires correctly before publishing → subscribe to
TestAwardEvent.
The device is placed in the UEFN editor like any other Creative device, then referenced from Verse with @editable. You drive it entirely through code — there are no in-editor triggers to configure beyond the XP amount you set on the device itself.
API Reference
accolades_device
Used to set up islands so players will earn Battle Pass XP when they interact with your island. Accolades are achievements or accomplishments that players can complete to earn XP.
Full public surface, resolved verbatim from the live Epic digest (Fortnite.digest.verse).
accolades_device<public> := class<concrete><final>(creative_device_base):
Events (subscribe a handler to react):
| Event | Signature | Description |
|---|---|---|
TestAwardEvent |
TestAwardEvent<public>:listenable(agent) |
Signaled when testing the accolade to make sure it is awarded as expected. Only signals within unpublished island environments. Sends the agent receiving the achievement. |
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. |
Award |
Award<public>(Agent:agent):void |
Awards the XP to agent. |
Walkthrough
Scenario: A survival island where players must reach a glowing extraction zone (a trigger_device) to earn XP. When the round starts the accolade is enabled; when a player steps on the extraction trigger, they receive their XP reward. A second trigger disables the accolade when the round ends so late arrivals can't farm it.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
# extraction_reward_manager
# Place this Verse device, an accolades_device, a trigger_device for
# the extraction zone, and a trigger_device for round-end in the scene.
extraction_reward_manager := class(creative_device):
# The accolades device configured in UEFN with the desired XP amount.
@editable
ExtractionAccolade : accolades_device = accolades_device{}
# Players step on this trigger to extract and earn XP.
@editable
ExtractionZone : trigger_device = trigger_device{}
# This trigger fires when the round ends (e.g. from a timer device).
@editable
RoundEndTrigger : trigger_device = trigger_device{}
OnBegin<override>()<suspends> : void =
# Make sure the accolade is active at round start.
ExtractionAccolade.Enable()
# Subscribe to the extraction zone — fires when a player steps on it.
ExtractionZone.TriggeredEvent.Subscribe(OnPlayerExtracted)
# Subscribe to the round-end trigger to lock out late XP farming.
RoundEndTrigger.TriggeredEvent.Subscribe(OnRoundEnd)
# Called when a player steps on the extraction zone trigger.
# TriggeredEvent sends ?agent, so we unwrap it before awarding.
OnPlayerExtracted(MaybeAgent : ?agent) : void =
if (Agent := MaybeAgent?):
ExtractionAccolade.Award(Agent)
# Called when the round-end trigger fires.
# Disable the accolade so no more XP can be awarded this round.
OnRoundEnd(MaybeAgent : ?agent) : void =
ExtractionAccolade.Disable()
Line-by-line explanation
| Lines | What's happening |
|---|---|
@editable ExtractionAccolade |
Binds the placed accolades_device to Verse. Without @editable the field is never wired to the scene object. |
ExtractionAccolade.Enable() |
Ensures the device is active when OnBegin runs. Useful if you previously called Disable or want an explicit reset. |
ExtractionZone.TriggeredEvent.Subscribe(OnPlayerExtracted) |
Registers the handler; every time a player steps on the trigger, OnPlayerExtracted is called. |
OnPlayerExtracted(MaybeAgent : ?agent) |
TriggeredEvent delivers a ?agent (optional). We must unwrap it with if (Agent := MaybeAgent?): before passing it to Award. |
ExtractionAccolade.Award(Agent) |
The key call — hands the configured XP to the specific player who extracted. |
ExtractionAccolade.Disable() |
Shuts the accolade off at round end. Any subsequent Award calls on a disabled device are silently ignored. |
Common patterns
Pattern 1 — Enable / Disable for timed XP windows
Only allow XP to be earned during an active event window. A button starts the window; a second button closes it.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
# xp_window_manager
# Wires two button_devices to open and close an XP-earning window.
xp_window_manager := class(creative_device):
@editable
EventAccolade : accolades_device = accolades_device{}
# Press this button to open the XP window (e.g. a game-master button).
@editable
OpenWindowButton : button_device = button_device{}
# Press this button to close the XP window.
@editable
CloseWindowButton : button_device = button_device{}
OnBegin<override>()<suspends> : void =
# Start with accolade disabled — no XP until the event begins.
EventAccolade.Disable()
OpenWindowButton.InteractedWithEvent.Subscribe(OnWindowOpen)
CloseWindowButton.InteractedWithEvent.Subscribe(OnWindowClose)
OnWindowOpen(Agent : agent) : void =
EventAccolade.Enable()
OnWindowClose(Agent : agent) : void =
EventAccolade.Disable()
Note:
button_device.InteractedWithEventdelivers a plainagent(not?agent), so no unwrapping is needed here.
Pattern 2 — TestAwardEvent for pre-publish verification
During development, log which player receives the accolade to confirm your wiring is correct. TestAwardEvent only fires in unpublished island environments, so this code is safe to ship — it simply never triggers in production.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }
# accolade_test_logger
# Attach to any accolades_device to verify awards fire correctly in
# your unpublished test session.
accolade_test_logger := class(creative_device):
@editable
TrackedAccolade : accolades_device = accolades_device{}
# Trigger that manually fires the award for testing.
@editable
TestTrigger : trigger_device = trigger_device{}
OnBegin<override>()<suspends> : void =
# Subscribe to TestAwardEvent — only fires in unpublished sessions.
TrackedAccolade.TestAwardEvent.Subscribe(OnTestAward)
# Wire a trigger so we can manually fire an award during testing.
TestTrigger.TriggeredEvent.Subscribe(OnTestTriggerFired)
# TestAwardEvent delivers a plain `agent` (not optional).
OnTestAward(Agent : agent) : void =
Print("[TEST] Accolade awarded successfully to an agent.")
OnTestTriggerFired(MaybeAgent : ?agent) : void =
if (Agent := MaybeAgent?):
TrackedAccolade.Award(Agent)
Pattern 3 — Award on elimination (multi-accolade combo)
Grant XP for eliminations by subscribing to an elimination_manager_device and awarding two separate accolades — one for the eliminator, one participation accolade for the eliminated player.
using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
# elimination_xp_manager
# Awards XP to the eliminating player via an accolades_device.
elimination_xp_manager := class(creative_device):
# XP reward for getting an elimination.
@editable
EliminationAccolade : accolades_device = accolades_device{}
# XP reward just for participating (awarded to eliminated player).
@editable
ParticipationAccolade : accolades_device = accolades_device{}
@editable
ElimManager : elimination_manager_device = elimination_manager_device{}
OnBegin<override>()<suspends> : void =
EliminationAccolade.Enable()
ParticipationAccolade.Enable()
ElimManager.EliminationEvent.Subscribe(OnElimination)
# EliminationEvent delivers elimination_result which contains
# EliminatingAgent (?agent) and EliminatedAgent (agent).
OnElimination(Result : elimination_result) : void =
# Award the eliminated player participation XP unconditionally.
ParticipationAccolade.Award(Result.EliminatedAgent)
# Award the eliminator only if a real player made the kill.
if (Eliminator := Result.EliminatingAgent?):
EliminationAccolade.Award(Eliminator)
Gotchas
1. @editable is mandatory — bare instantiation does nothing
Declaring MyAccolade : accolades_device = accolades_device{} without @editable creates a default, unconnected instance. Your Award calls will compile and run but will never grant XP because the object isn't wired to the placed device in the scene. Always add @editable and assign the device in the UEFN Details panel.
2. TriggeredEvent delivers ?agent, not agent
trigger_device.TriggeredEvent (and many other device events) sends ?agent — an optional agent. You must unwrap it before passing to Award:
# CORRECT
if (Agent := MaybeAgent?):
MyAccolade.Award(Agent)
# WRONG — won't compile; Award expects agent, not ?agent
MyAccolade.Award(MaybeAgent)
3. TestAwardEvent is test-only
TestAwardEvent fires only in unpublished island sessions. Never build production game logic that depends on it — it will silently never fire once your island is published.
4. Calling Award on a disabled device is a no-op
If you call Award after Disable, no XP is granted and no error is thrown. This is intentional for gating, but it can be a silent bug if you forget to call Enable at round start. A common fix is to call Enable() explicitly in OnBegin.
5. XP amount is configured in the editor, not in Verse
The accolades_device has no Verse API for setting the XP value. The amount is set on the device instance in the UEFN Details panel. If players aren't receiving the expected XP, check the device's XP Amount property in the editor first before debugging your Verse code.
6. One accolade device = one XP tier
If you need to award different XP amounts for different achievements (e.g. 100 XP for a basic task, 500 XP for a hard challenge), place multiple accolades_device instances in the scene, each configured with a different XP value, and reference each with its own @editable field.
Guides & scripts that use accolades_device
- QUESTS API in Fortnite Creative/UEFN! (Experimental Tutorial)This tutorial demonstrates how to build a complete Quest Management system using Fortnite's experimental Verse Quests API. The creator walks through importing assets, defining custom quest classes inheriting from basic_q…
- The "Secret Sauce" of Verse: Reading, Writing, and AllocatingYou’ve seen those islands where a prop changes color when you step on it, or where an enemy regenerates health over time. You might think, "That’s magic." It’s not magic. It’s **Attributes and Effects**.
- The "Boss Music" Trap: Automating Victory Fanfares with VerseYou know that feeling when you finally wipe out a whole squad, or when you solo a boss in a creative mode, and the game just *knows*? The music swells, the lights flash, and the universe celebrates your dominance. Usuall…
- How to Build a "Killstreak" Upgrade System in FortniteEver played a shooter where getting five kills in a row unlocks a nuke, a drone strike, or a giant laser gun? That’s the dopamine hit of a **killstreak**. In Fortnite Creative, you don’t need a PhD in computer science to…
- Level Up! How to Give Players Awesome RewardsImagine you just beat a really hard video game level. You feel proud, right? That feeling is a reward. But games also give shiny items, points, and cool sounds. In this tutorial, we will make a simple game. You will crea…
Build your own lesson with accolades_device
Generate a personalized, compile-checked lesson grounded in this exact reference.
Build a lesson →