Quick Start

1. Enable the plugin

Open Edit → Plugins, type Crimson in the search box, tick CrimsonOnlineSubsystem's checkbox (and CrimsonCommon, its dependency), and restart the editor when prompted. For a Blueprint project that's the entire install — you never hand-edit the .uproject or any .Build.cs.

Screenshot pendingImages/CrimsonOnlineSubsystem/qs-enable-plugin.png
Edit → Plugins → search 'Crimson' → tick CrimsonOnlineSubsystem's Enabled checkbox → restart the editor.
Blueprint-only project?
Enabling the plugin in Edit → Plugins is the whole installation — there is no .uproject or .Build.cs to edit. The editor writes the plugin entry for you. The C++ step below is needed only when you reference CrimsonOnlineSubsystem types from your own C++ code.

C++ projects: after enabling the plugin above, add its module to your build file so your game code can use its types:

csharp
// YourGame.Build.cs
PublicDependencyModuleNames.Add("CrimsonOnlineSubsystem");

2 — Configure DefaultEngine.ini

ini
[OnlineSubsystem]
DefaultPlatformService=Steam
[OnlineSubsystemSteam]
bEnabled=true
SteamDevAppId=480

3 — Configure Project Settings

Open Project Settings → Crimson → Online Subsystem. Set the DLCMappingTable DataTable asset, toggle bEnableCloudSave, and set DebugPlatformOverride for PIE testing.

4 — Login at game start (C++)

cpp
// In your GameInstance or UGameInstanceSubsystem::Initialize
if (UCrimsonOnlineSubsystemGI* OSS = UCrimsonOnlineSubsystemGI::Get(this))
{
OSS->GetIdentityService()->Login(0, FCrimsonOnlineLoginCompleteDelegate::CreateLambda(
[](int32 LocalPlayerIndex, bool bSuccess, const FString& Error)
{
if (!bSuccess) { /* handle */ }
}));
}

5 — Blueprint async login

Use the Async Login Blueprint node (UCrimsonAsyncAction_Login). Connect On Success and On Failure pins. The node automatically obtains the UCrimsonOnlineSubsystemGI from the World context.

Never cache GetOSS()
Every service exposes GetOSS() for direct OSS access. Never store the returned pointer across frames — PIE restarts invalidate OSS pointers. Always call GetOSS() fresh each use.