Settings & API
UCrimsonOnlineDeveloperSettings
Project Settings -> Crimson -> Crimson Online Subsystem. The class is Config = Game, DefaultConfig, so edits are written to Config/DefaultGame.ini under [/Script/CrimsonOnlineSubsystem.CrimsonOnlineDeveloperSettings]. Read it from C++ with UCrimsonOnlineDeveloperSettings::Get().
| Property | Type | Default | Description |
|---|---|---|---|
| DLCMappingTable | TSoftObjectPtr<UDataTable> | unset | DataTable of FCrimsonDLCMappingRow rows. Read by the entitlement service to resolve an internal DLC ID to a platform ID; DLC checks return false without it |
| DebugPlatformOverride | ECrimsonOnlinePlatform | Unknown | Forces the detected platform, skipping IOnlineSubsystem detection entirely. Unknown lets auto-detection run. Logs a warning whenever it is active |
| bVerboseLogging | bool | false | Reserved. Declared for a global verbose-OSS-logging switch, but no service reads it yet - it changes nothing today |
| bEnableCloudSave | bool | true | Reserved. Intended as a master switch for cloud save, but the cloud save service does not read it - calls are not gated by it. Skip calling the service to disable cloud save |
| bVerboseCloudSaveLogging | bool | false | Live. Logs every cloud file enumerate, upload, download and delete, and their completions |
Two settings are declared but not yet read
bVerboseLogging and bEnableCloudSave appear in Project Settings and save to the ini, but nothing in the plugin reads them. They are recorded here honestly rather than removed, so you do not spend an afternoon wondering why toggling bEnableCloudSave off did not stop an upload. bVerboseCloudSaveLogging is the one logging switch that works.UCrimsonOnlineSubsystemGI - main API
| Member | Description |
|---|---|
| static Get(WorldContextObject) | BlueprintPure, shown in Blueprint as Get Crimson Online Subsystem. Returns the subsystem for the calling world; null if there is no world or no game instance |
| GetActivePlatform() | BlueprintPure. Returns ECrimsonOnlinePlatform - set once in Initialize(), then stable |
| GetActivePlatformName() | BlueprintPure. Returns the platform as a string: Steam, EOS, PlayStation, Xbox, Switch, Null or Unknown |
| IsPlatformReady() | BlueprintPure. True once Initialize() has detected the platform and created every service |
| OnPlatformDetected | Delegate: ECrimsonOnlinePlatform Platform. Broadcast once at the end of Initialize() |
| GetIdentityService(), GetSessionService(), and the other 13 accessors | BlueprintPure. Return the typed service pointer; never null after Initialize() |
OnPlatformDetected fires inside Initialize
The subsystem broadcasts it before most game code exists, so a listener that binds later never hears it. Bind from another subsystem's
Initialize if you must catch the event; otherwise just call IsPlatformReady() and GetActivePlatform() when you need the answer - both are stable for the life of the game instance.UCrimsonOnlineServiceBase - rules
The abstract base every service derives from. It is only relevant when you write your own service subclass; from game code you never touch it.
| Member | Notes |
|---|---|
| InitService(UCrimsonOnlineSubsystemGI* InOwner) | Virtual. Stores the owner. Override for one-time setup: bind OSS delegates, create resources. Always call Super |
| ShutdownService() | Virtual. Override to unbind every OSS delegate handle you bound. Called from the subsystem's Deinitialize() |
| GetOSS() | Protected helper. Returns the active IOnlineSubsystem or nullptr, logging an error. Not part of the public API - subclasses only, and do not override it |
| GetOwnerSubsystem() | Protected. Returns the owning UCrimsonOnlineSubsystemGI |
Never cache the OSS pointer
An
IOnlineSubsystem* can be invalidated - a PIE restart is the everyday case. Every Crimson service calls GetOSS() at the top of each method and checks the result; a subclass of your own must do the same. Storing it in a member is a latent crash.