Installation
This page covers getting the cfcore plugin into an Unreal project and building it. It documents cfcore-sdk-ue.
The SDK ships as a source-only Unreal plugin. There is no prebuilt binary in the release package, so every project compiles the module locally on first load. That drives the whole sequence: copy source into Plugins/cfcore, answer the rebuild prompt, enable the plugin, then add cfcore as a module dependency in C++ projects. Blueprint-only projects follow the same path, and the rebuild is not optional for them, so a Blueprint-only team still needs a working C++ toolchain on the machine that opens the project first.
Installing the plugin does not initialize the SDK. FCFCoreModule::StartupModule registers the settings page and nothing else. See Initialization and settings for what happens next.
Prerequisites
| Requirement | Where it comes from |
|---|---|
| A CurseForge for Studios account with your game registered | The Developer Portal at console.curseforge.com. See Setting up your game |
Game ID (int64) and game API key (FString) | Issued per game in the Developer Portal. Set as gameId and apiKey on FCFCoreSettings, or on the CFCore page under Project Settings > Plugins |
| A C++ toolchain for your platform | Your own machine. The release ships Source/ with no compiled module |
Write access to your project's Plugins/ directory | Local |
The package contains cfcore.uplugin, Source/, Resources/ (Icon128.png only), docs/, licenses/, LICENSE and README.md. There is no Binaries/ or Intermediate/. If you received a package with Binaries/, it was built against one specific engine version and toolchain: treat source as the distribution format.
Premium mods, subscriptions and authentication providers are enabled per game in the Developer Portal, not in the plugin. For those, contact cfforstudios@overwolf.com.
Step 1: extract into Plugins/cfcore
- Download the release package for the SDK version you intend to ship.
- Extract the contents of the
cfcore-sdk-uefolder, not the folder itself, intoPlugins/cfcorein your game project. - Confirm the result is
Plugins/cfcore/cfcore.uplugin, one level down, notPlugins/cfcore-sdk-ue/cfcore/cfcore.uplugin. - Leave the folder named
cfcore.
Do not rename the plugin folder or the .uplugin file. The plugin resolves its own descriptor with IPluginManager::FindPlugin(UE_PLUGIN_NAME) and calls GetDescriptor() on the result with no null check (Bootstrap::GetPluginVersion in Private/bootstrap.cpp). A descriptor that cannot be found is a null dereference during setup, not a logged warning.
A git submodule at Plugins\cfcore is a supported layout for the same result.
Step 2: answer the rebuild prompt
- Reopen your project after extraction.
- The editor shows a Missing <ProjectName> Modules dialog: "The following modules are missing or built with a different engine version:", listing
cfcore, then "Would you like to rebuild them now?". - Click Yes. Unreal runs UnrealBuildTool, which runs UnrealHeaderTool over the plugin's
UCLASS,USTRUCTandUENUMdeclarations, then compiles the module. - The project opens once the build succeeds.
The same dialog reappears after any engine upgrade, because the wording covers both "missing" and "built with a different engine version". Budget time for the header-tool pass: the plugin's public API is spread over a large number of headers, most of which carry a generated reflection header.
Step 3: enable the plugin
- Open Edit > Plugins.
- Search for
cfcore. The descriptor setsCategorytoOther, so it appears under Project > Other, not under a modding or online category. - Tick Enabled.
- Restart the editor when prompted.
The descriptor does not set EnabledByDefault, so extraction alone does not enable the plugin. A project that skips this step compiles the module and then finds no CFCore Blueprint nodes and no CFCore page in Project Settings.
Step 4: add cfcore to Build.cs (C++ projects)
Blueprint-only projects can stop after step 3. C++ projects must declare the dependency, or every #include of a cfcore header fails to resolve and every symbol fails to link.
- Open your game module's
.Build.cs. - Add
"cfcore"toPublicDependencyModuleNames, or toPrivateDependencyModuleNamesif no other module needs to see cfcore types through your headers. - Run File > Refresh Visual Studio Project (or your IDE's equivalent) so the generated project files pick up the new include paths.
PublicDependencyModuleNames.AddRange(new string[] {
"Core",
"CoreUObject",
"Engine",
"InputCore",
"cfcore"
});
Confirming the module is linked
Two entry points exist once the dependency is in place. Confirming both proves the install before you write integration code.
- Include
cfcore_context.hfor the C++ singleton andcfcore_subsystem.hfor the reflected engine subsystem. - Call
CFCoreContext::GetInstance()for theICFCoreinterface. The singleton is built on first call, so the pointer is usable before initialization, andIsInitialized()reports state. - Fetch
UCFCoreSubsystemthroughGEngine. It derives fromUEngineSubsystem, so the engine owns its lifetime and it is never spawned.
#include <Engine/Engine.h>
#include <cfcore_context.h>
#include <cfcore_subsystem.h>
using namespace cfcore;
void AMyGameMode::ConfirmCFCoreLinked() {
ICFCore* core = CFCoreContext::GetInstance();
UE_LOG(LogTemp, Display, TEXT("cfcore reachable, initialized: %d"),
core->IsInitialized());
UCFCoreSubsystem* subsystem = GEngine->GetEngineSubsystem<UCFCoreSubsystem>();
if (subsystem == nullptr) {
UE_LOG(LogTemp, Error, TEXT("UCFCoreSubsystem unavailable"));
}
}
Blueprint: in any graph, search cfcoresu. The engine's subsystem accessor for CFCore Subsystem appears under Engine Subsystems, with one output pin returning the subsystem object. Every cfcore node (Initialize, Update Settings, Uninitialize and the rest) targets that object. If the accessor is absent, the plugin is not enabled or the module did not build.
What the descriptor declares
Field in cfcore.uplugin | Value |
|---|---|
FileVersion | 3 |
Version | 1 |
VersionName | The release version of the package you downloaded |
FriendlyName | cfcore |
Category | Other |
CreatedBy | Overwolf Ltd. |
SupportURL | https:// |
CanContainContent | false |
IsBetaVersion | false |
Installed | false |
Description, CreatedByURL, DocsURL, MarketplaceURL | empty strings |
One module is declared, and nothing else:
| Module | Type | Loading phase |
|---|---|---|
cfcore | Runtime | Default |
Runtime means the module compiles into packaged builds including Shipping. There is no Editor, UncookedOnly or DeveloperTool module. Default means the module loads after engine initialization, so cfcore is not available in PreDefault or earlier code. The Public/editor/ folder is part of the Runtime module, so UCFCoreBPLibrary and UCFCoreEditorSettings compile into shipping builds; only the settings-page registration in Private/cfcore_module.cpp is guarded by WITH_EDITOR.
The entry point is FCFCoreModule, registered with IMPLEMENT_MODULE(FCFCoreModule, cfcore). StartupModule calls RegisterSettings() only. ShutdownModule calls CFCoreContext::GetInstance()->Uninitialize(...) then UnregisterSettings(), so module teardown triggers SDK teardown whether or not your game called it.
Fields the descriptor does not contain
| Absent field | Consequence |
|---|---|
EngineVersion | The engine never version-gates the plugin. Unreal builds it on any version you open, and an incompatibility surfaces as a compile error rather than a refusal in the Plugins browser |
PlatformAllowList / PlatformDenyList (and the older WhitelistPlatforms / BlacklistPlatforms) | No platform gating. The module is included in every target that enables the plugin. Platform exclusion has to come from your own target or module rules |
SupportedTargetPlatforms | Packaging never filters the plugin out per platform |
EnabledByDefault | The plugin stays off until a human ticks Enabled |
SupportURL is the literal string https:// and is not a usable link. For support use cfforstudios@overwolf.com and the Developer Portal at console.curseforge.com.
Use VersionName, not Version, to identify a release. Version is an integer that has stayed at 1 in both the cfcore and cfcore-sdk-ue-ui descriptors, so it does not distinguish releases. VersionName is the meaningful one, and the two plugins version independently. At startup Bootstrap::GetPluginVersion copies VersionName into FInternalSettings::pluginVersion verbatim and into FInternalSettings::userAgent, sent as the User-Agent header. That is the version CurseForge sees on a support ticket, so quote it when you raise one.
Build.cs dependencies
These are declared in Source/cfcore/cfcore.Build.cs. You do not repeat them in your own Build.cs, but this is the list to check when a platform target fails to link.
| Dependency list | Modules |
|---|---|
PublicDependencyModuleNames | Core, InputCore |
PrivateDependencyModuleNames | CoreUObject, Engine, HTTP, Projects, Json, JsonUtilities, OpenSSL |
| Engine third party (private, static) | zlib, via AddEngineThirdPartyPrivateStaticDependencies |
DynamicallyLoadedModuleNames | none |
PublicIncludePaths / PrivateIncludePaths | none added |
| Build setting | Value | Effect |
|---|---|---|
PCHUsage | ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs | IWYU-style includes are expected |
PublicDefinitions | CFCORE_OBSOLETE_TESTS=0 | Defined, but no shipped file reads it |
bUseRTTI | true only on Win64 in DebugGame, Debug or Development | Test and Shipping, and every non-Win64 platform, compile without RTTI |
Projects provides IPluginManager, which is how the plugin reads its own VersionName. Removing it breaks version reporting.