Data-driven, networked quests: stage graphs with polymorphic objectives, actions and conditions, a per-player fact database, hotfix overlays, and co-op sharing set per quest chain.
Coming Soon · Quests · Unreal Engine 5
Branching, networked quests that plug into any gameplay code.
Author each quest as a graph of stages with objectives, actions and conditional transitions. Your combat, inventory and dialogue code reports what happened through one ReportEvent call; the server tracks progress and replicates it to each owner. Co-op sharing is set per chain.
Why CrimsonQuestSystem
Author quests as data, report gameplay events from anywhere, and let the server keep every player's progress in sync.
Quests as stage graphs
A UCrimsonQuestDefinition is a graph of stages, authored in a dedicated quest graph editor. Each stage holds objectives with a completion rule (all, any, N of M), actions on enter and exit, and transitions whose conditions pick the next stage.
Eight objectives, one report call
Kill, Collect Items, Interact, Reach Location, Talk To NPC, Fact Set, Timer Elapsed and Channel Reported. Gameplay reports on the server through ReportEvent or a typed helper like ReportUnitKilled; active objectives filter the channel and payload and count themselves.
Actions, conditions, rewards
Stages grant items and XP, set facts, start, fail or complete quests, spawn and despawn actors, toggle data layers and play level sequences. Conditions combine with And, Or and Not over facts, quest state and player tags. Write your own actions and conditions in Blueprint.
A per-player fact database
UCrimsonFactDatabase stores typed facts (bool, int, float, name) for each player, replicated to the owner. Conditions branch on them, actions set them, and a Fact Set objective waits for one, so a choice in one quest can shape the next.
Co-op, set per chain
Each quest chain owns its sharing policy. Joiners keep their own state, inherit the party's, or are blocked (hidden or shown as locked). Progress syncs not at all, one way from the chain owner, or two way so any qualifying event credits everyone.
Hotfix quests without recooking
Data sources patch cooked quests with sparse overlays. Point FileOverlayDirectory at a folder of JSON overlays to iterate without a recook, or implement ICrimsonQuestDataSource to serve patches from your own live-ops backend.
A closer look
Report what happened, the quest listens
The plugin never references your combat, inventory or dialogue code. Those systems report events on the server, and each active objective filters the channel and payload and counts itself. Client-side triggers report through a validated server RPC.
- Typed helpers for kills, pickups, interactions, dialogue and locations on
Quest.Channel.*tags ReportEventtakes any gameplay tag plus an instanced struct payload- With CrimsonCore, a message bridge feeds the Crimson message bus into
ReportEventautomatically
React from Blueprint or C++
Bind the subsystem's events to rebuild a quest log or hand out rewards. Grant actions assume no inventory: they raise OnGrantItemRequested and OnGrantXPRequested, and your own systems deliver the item or XP.
- Every subsystem event is a Blueprint delegate with a native twin
- Read quest state, objectives and facts on the owning client
- With CrimsonCore, quest state and grant events are re-broadcast on the Crimson message bus
Multiplayer from the ground up
Progression runs on the server, one component per PlayerState. Active quests replicate owner-only through a fast array, and a world director aggregates party progress and reference-counts the data layers quests show.
- Join behavior per chain: independent, inherit or block
- Runtime sync per chain: none, one way from the owner, or two way co-op
- Facts replicate as a per-player subobject
Save anywhere, debug in PIE
The plugin writes no files. GetSaveData and ApplySaveData move progress in and out of whatever save system you use, and checkpoint stages call OnSaveRequested for you to override. The Quest Dev Tools show objectives advancing live.
- Save mid-quest, reload, and the quest resumes on the same stage
- Quests validate in the graph editor
- Quests found through your scan paths are registered to always cook
Technical details
- Engine
- UE 5.8
- Tested platforms
- Windows
- Blueprint-ready
- Yes
- C++ required
- No
- Network replicated
- Yes
- Dependencies
- GameplayTags, GameplayAbilities, NetCore, UMG, DeveloperSettings, Json, JsonUtilities, SlateIM, GameplayTagsEditor
Frequently asked questions
Can I buy it yet?
Does it depend on other Crimson plugins?
ReportEvent and the typed Report* helpers, and it answers through its own delegates. With CrimsonCore, the free integration layer for the full suite, a message bridge connects the Crimson message bus to ReportEvent in both directions and adds a quest event that counts any bus message on a channel.Do I need C++?
Does it work in multiplayer?
Server_ReportEvent, which the server validates. Each quest chain decides whether joiners keep their own state, inherit the party's, or are blocked, and whether progress syncs none, one way or two way.How do I save quest progress?
GetSaveData returns a save struct on the server and ApplySaveData restores it, resuming each quest on the same stage. Stages marked as checkpoints call OnSaveRequested, which you override in a subclass of the progression component to write the save.Do I need an inventory or leveling system?
OnGrantItemRequested and OnGrantXPRequested for your own systems to fulfil. The Has Item and Player Level conditions ship as stubs that you override in Blueprint to read your inventory and leveling.Quests that fit the game you already have
Add one component to your PlayerState, spawn the world director, and report your first kill. CrimsonQuestSystem is still in development; the Quick Start shows exactly how it wires in.
Completes your setup
Each Crimson plugin runs standalone, so add only what your game needs:
Layout-agnostic, fully replicated inventory with bags and containers.
- Pluggable Topology
- Runtime Constraints
- Scoped Containers
- No RPCs to Write
GAS interaction layer: scanning, granting and conditions.
- Scan Tasks
- Server-Side Granting
- Instant, Hold & Channel
- Interaction Conditions
Fragment-based saving: each system owns its own data.
- Independent Fragments
- No Cross-Plugin Coupling
- Blueprint-Ready