Quests & Quest Sets
Table of Contents
UPulseQuest– Quest Definition- Quest Flags (
EPulseQuestFlags) UPulseQuestSet– Quest PoolUPulseQuestData– Runtime Quest StateUPulseQuestInstance– Quest Execution (Server Only)EPulseQuestFinishResultFPulseQuestAddParams
UPulseQuest – Quest Definition
UPulseQuest is a const Data Asset that statically describes a quest. One asset per quest; multiple managers can run quests of the same definition.
Properties
| Property | Type | Description |
|---|---|---|
Tag | FGameplayTag | Unique runtime identifier for this quest. Required. |
DisplayName | FText | Human-readable name for UI |
Description | FText | Quest description for UI |
DefaultFlags | int32 (bitmask) | EPulseQuestFlags applied at quest start |
QuestDataClass | TSubclassOf<UPulseQuestData> | Runtime data class (defaults to base class) |
MetaData | UObject* | Optional context object (icons, rewards, …) |
StateTree | FStateTreeReference | StateTree asset (schema: UPulseQuestStateTreeSchema) |
Editor validation
The asset reports errors if:
Tagis not set.StateTreeasset is missing or not compiled.
Quest Flags (EPulseQuestFlags)
Applied as a bitmask from both the Data Asset and FPulseQuestAddParams:
| Flag | Value | Behavior |
|---|---|---|
PQF_NoSave | 1 << 0 | Quest is excluded from save/load |
PQF_NoStartOnLoad | 1 << 1 | Quest is not auto-started when loading a save (without a Director) |
// C++ – add flags before starting
FPulseQuestAddParams Params = FPulseQuestAddParams::FromQuestTag(QuestTag);
Params.AddFlags(EPulseQuestFlags::PQF_NoSave);
UPulseQuestSet – Quest Pool
A Quest Set defines which quests a manager is allowed to start.
Properties
| Property | Type | Description |
|---|---|---|
Quests | TSet<UPulseQuest*> | Direct quest references |
QuestSets | TSet<UPulseQuestSet*> | Nested sets (transitively searched) |
The set builds an internal TMap<FGameplayTag, UPulseQuest*> for O(1) lookup. This map is rebuilt on PostLoad and on PostEditChangeProperty.
Editor validation
Errors are reported for:
- Null entries in
QuestsorQuestSets. - Circular references between nested
QuestSets.
UPulseQuestData – Runtime Quest State
Every running quest has an associated UPulseQuestData instance that:
- Is replicated to the owning client.
- Stores the finish state and objective tracking data.
- Implements
IPulseQuestSaveInterfacefor serialization.
Key read-only properties (Blueprint-accessible)
| Property | Type | Description |
|---|---|---|
Quest | const UPulseQuest* | Back-reference to the definition |
FinishState | EPulseQuestFinishResult | None while running; set on stop |
QuestFlags | int32 | Replicated bitmask |
bLoadedFromSaveGame | bool | True if this quest was restored from a save |
QuestDataViewModel | UMVVMPulseQuest* | Lazy-created MVVM ViewModel |
Blueprint API
GetQuestManager() → TScriptInterface<IPulseQuestManagerInterface>
GetQuestTag() → FGameplayTag
IsStopped() → bool
IsStopped(OutResult) → bool + EPulseQuestFinishResult
IsClientData() → bool (false on server/authority)
IsObjectiveFinished(SaveID) → bool
GetObjectiveFinishStatus(SaveID) → EPulseObjectiveCompletionStatus
GetQuestDataViewModel() → UMVVMPulseQuest*
Events
FPulseQuestDataStoppedEventDynamic OnStopped; // Blueprint assignable
FPulseQuestDataStoppedEvent OnStoppedNative; // C++ multicast
Objective tracking
QuestData tracks which objectives have finished in the current branch:
bool IsObjectiveFinished(const FName& SaveID) const;
EPulseObjectiveCompletionStatus GetObjectiveFinishStatus(const FName& SaveID) const;
// Allow restarting an objective by clearing its finished record:
void RemoveFinishedObjectiveId(const FName& SaveID);
UPulseQuestInstance – Quest Execution (Server Only)
UPulseQuestInstance wraps the StateTree execution context for a single running quest. It exists only on the server (Authority).
Subclasses:
UPulseQuestManagerInstance– used byUPulseQuestManagerUPulseSharedQuestInstance– used byAPulseSharedQuestHost
Key API
bool Init(const FGameplayTag& Tag, const UPulseQuest& Quest);
bool Start();
void Stop(EPulseQuestFinishResult Result);
void Tick(float DeltaTime);
void SendEvent(const FGameplayTag EventTag, const FConstStructView Payload = {}, FName Origin = {});
void SendEvent(const FStateTreeEvent& Event);
FString GetCurrentState() const;
FGameplayTag GetQuestTag() const;
UPulseQuestData* GetQuestData() const;
bool IsFinished() const;
OnFinished event fires (C++ delegate) when the instance reaches a terminal state.
EPulseQuestFinishResult
| Value | Meaning |
|---|---|
None | Quest is still running |
Success | Quest completed successfully |
Failure | Quest failed |
Stopped | Quest was stopped without a result (e.g. manager reset) |
FPulseQuestAddParams
Used to start a quest with optional overrides:
FPulseQuestAddParams Params;
Params.QuestTag = MyQuestTag;
Params.AddFlags(EPulseQuestFlags::PQF_NoSave);
// Optional: callback when added
Params.OnAdded = FPulseQuestAddParams::FQuestAdded::CreateLambda(
[](bool bAdded){ /* … */ });
Helper factory:
FPulseQuestAddParams::FromQuestTag(QuestTag);