Skip to main content

Using Different Methods

Subscribe and sync

Players can subscribe to mods using the in-game browser, on the CurseForge website or from another device. The SDK installs those subscriptions automatically the next time the game runs, keeping the player's mod library consistent across devices.

Before using these APIs, subscriptions must be enabled for your game in the CurseForge Developer Portal. Contact the CFS team to configure this.

Key APIs

MethodInterfaceDescription
SubscribeUCFCoreSubsystem (BP) / ICFCoreSubscription (C++)Subscribes to a mod and installs it.
UnsubscribeUCFCoreSubsystem (BP) / ICFCoreSubscription (C++)Unsubscribes and uninstalls the mod.
SyncSubscriptionsICFCoreSubscriptionOne-shot sync of local installs against server-side subscriptions.
GetSyncPlanICFCoreSubscriptionReturns a plan of pending install, update, and uninstall actions without executing them.
ExecuteSyncPlanICFCoreSubscriptionExecutes a plan returned by GetSyncPlan.
EnableAutoManagementICFCoreSubscriptionRuns syncing automatically in the background.

Recommended usage

  1. Call SyncSubscriptions once at startup for a lightweight sync when you do not need to inspect the plan first.
  2. Use GetSyncPlan + ExecuteSyncPlan when you want to show the player a summary of pending changes before applying them.
  3. Enable AutoManagement while the player is in menus or the mod browser to keep the library current. This is configurable via the cfcore project settings.
  4. Do not run auto-management during active gameplay. Installs or uninstalls can interfere with content the game is actively using.

Direct install

To trigger an install programmatically:

InterfaceMethodNotes
BlueprintInstall Mod Extended node via UCFCoreSubsystemPreferred. Accepts FInstallModAdditionalParams. Use Install Mod only if you do not need version targeting, throttling, dynamic content or custom tracking.
C++ICFCoreLibrary::Install with FInstallModAdditionalParamsPass params directly to the install call.

FInstallModAdditionalParams lets you throttle download speed (particularly useful when downloading dynamic content) or attach custom tracking data to the install event.

Progress and completion callbacks

BlueprintC++Fires when
OnProgresson_progressDuring download, with bytes downloaded and total
OnInstalledon_installedWhen the install completes or fails
OnErrorIf the installation fails

User engagement analytics are available for installs triggered through the browser when the analytics category is enabled in CFCore settings.

Auto install/sync on server connection

When a player joins a modded server, the SDK can automatically synchronize their local mod library with the server's required mod list. This is handled by ICFCoreClientServerLibrary, which covers both sides of the connection.

Server side

Call AssureServerModsUpdated before the server starts. This ensures the server has the correct, up-to-date versions of all required mods before accepting connections.

Client side

Call AssureClientModsUpdated with the array of file IDs the server requires. The SDK then downloads any missing or outdated mods and handles platform file matching before the player enters the session.

note

The SDK does not discover the server's required mod list automatically. Your game is responsible for implementing a client-server communication channel to retrieve the required file IDs and pass them to AssureClientModsUpdated.

// Server
ICFCoreClientServerLibrary::AssureServerModsUpdated(RequiredModFileIds, OnComplete);

// Client
ICFCoreClientServerLibrary::AssureClientModsUpdated(RequiredModFileIds, OnProgress, OnComplete);

Both functions expose progress and completion delegates. Use these to drive a download progress screen during the connection flow.

When a server requires premium mods, the SDK performs ownership validation automatically as part of this flow. No additional calls are needed.

Dynamic downloading

Dynamic downloading lets the game silently download mod files in the background without the player explicitly installing them. The primary use case is multiplayer cosmetics: when one player has a skin or visual mod active, the game downloads it for all other players in the session so they can render it correctly.

A dynamically downloaded mod is not a full install for the receiving player. They cannot use it themselves, only see it on the player who owns it. Your game is responsible for handling this distinction. When calling GetInstalledMods, dynamic mods are included in the results with FInstalledMod.dynamicContent = true. Your game must check this flag and treat those mods accordingly, for example by allowing rendering but blocking use or display in the player's own inventory.

If the receiving player later purchases or installs the mod through a normal flow, the SDK transitions it automatically from dynamic to fully installed.

Implementation

Pass dynamicContent = true in FInstallModAdditionalParams when calling Install.

FInstallModAdditionalParams Params;
Params.dynamicContent = true;

ICFCoreLibrary::Install(ModId, FileId, Params);

Premium dynamic content

warning

If your game offers premium cosmetics via dynamic downloading, you must configure dynamicContentCategoryIds in CFCore settings. This tells the SDK which mod categories require ownership validation. Without this, a player could manipulate local metadata to render premium content they have not purchased.

Manual file placement (unmanaged)

The SDK can detect mod files placed in the mods folder outside of the SDK, for example mods a player downloaded manually or through a third-party tool. When enabled, the SDK scans the mod directory at startup and registers any unrecognized content as unmanaged mods.

Enabling unmanaged mod detection

Set FCFCoreSettingsUnmanagedMods.enabled = true in CFCore settings.

CFCoreSettings.UnmanagedMods.enabled = true;

Once enabled, unmanaged mods appear in the Installed Mods tab of the cfcore_ui browser alongside SDK-managed mods. Players can enable or disable them the same way. From the game's perspective, GetInstalledMods includes unmanaged mods in its results. Use the FInstalledMod.isUnmanaged flag to identify them and treat them accordingly in your game logic.

Directory scan behavior

If your mod directory mode is set to CFCore, setting scanOneLevelUp = true also scans one directory level above the designated mods folder. This is useful when studios keep multiple mod directories in a shared parent folder.