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().

PropertyTypeDefaultDescription
DLCMappingTableTSoftObjectPtr<UDataTable>unsetDataTable of FCrimsonDLCMappingRow rows. Read by the entitlement service to resolve an internal DLC ID to a platform ID; DLC checks return false without it
DebugPlatformOverrideECrimsonOnlinePlatformUnknownForces the detected platform, skipping IOnlineSubsystem detection entirely. Unknown lets auto-detection run. Logs a warning whenever it is active
bVerboseLoggingboolfalseReserved. Declared for a global verbose-OSS-logging switch, but no service reads it yet - it changes nothing today
bEnableCloudSavebooltrueReserved. 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
bVerboseCloudSaveLoggingboolfalseLive. 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

MemberDescription
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
OnPlatformDetectedDelegate: ECrimsonOnlinePlatform Platform. Broadcast once at the end of Initialize()
GetIdentityService(), GetSessionService(), and the other 13 accessorsBlueprintPure. 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.

MemberNotes
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.