Skip to content
k-mods.com

Type: sublevel

Block RefinedRDLib or KBFL sublevel assets before they stream into a game world.

Use type: sublevel when another mod declares optional world sublevels through RefinedRDLib or KBFL and a compatibility pack must stop selected sublevels from loading. The document runs in the CDOChanges stage during session initialization. It changes the provider’s data assets in memory; it does not unload a level that has already streamed in. Restart the session after changing it.

This handler is deliberately narrow. It supports these two asset families:

ProviderAsset classBlocking action
RefinedRDLib/Script/RefinedRDLib.RRDLSublevelAssetMakes the asset’s map selector match no normal map
KBFL/Script/KBFL.KBFLSubLevelSpawningClears its sublevel list and disables the asset

Use an ordinary type: cdo document for any other asset class.

block: must be a non-empty sequence. A scalar entry is an exact asset object path. Map entries accept target: as either one path or a sequence of paths:

type: sublevel
block:
- /SomeMod/World/DA_OptionalSublevel.DA_OptionalSublevel
- target:
- /AnotherMod/World/DA_Nodes_A.DA_Nodes_A
- /AnotherMod/World/DA_Nodes_B.DA_Nodes_B

Exact targets use direct object loading, so they still work when the Asset Registry is not fully populated during early startup. A path that does not resolve produces a warning: the owning mod may be absent, or the object path may be wrong.

Use allAssetsOfClass: for a bulk compatibility rule:

type: sublevel
conditions:
hasMod: RefinedRDLib
block:
- allAssetsOfClass: /Script/RefinedRDLib.RRDLSublevelAsset

The scan includes derived asset classes. A map may combine target: and allAssetsOfClass:; all matches accumulate. The provider is an optional dependency: an unresolved bulk class produces an Info diagnostic instead of a hard dependency failure.

To block only some of a provider’s assets, give a map entry an ofClass: scope plus the scope filters (matchName:, matchTag:, where:). ofClass: is required here, sublevel assets have no default scope, and only asset instances are matched, never class defaults:

type: sublevel
conditions:
hasMod: RefinedRDLib
block:
- ofClass: /Script/RefinedRDLib.RRDLSublevelAsset
matchName: DA_Optional_* # by asset name
- ofClass: /Script/KBFL.KBFLSubLevelSpawning
where:
path: mSubLevelArray
isEmpty: false

Filter entries expand against the asset registry when the document applies (same Asset Registry caveat as allAssetsOfClass:); the load report states how many assets a filter matched.

  • sublevel blocks only RefinedRDLib and KBFL descriptor assets. It does not target arbitrary Unreal streaming levels, persistent-map content, world-partition cells, or already loaded levels.
  • Missing or invalid entries do not discard valid entries in the same document. Each target reports its own diagnostic.
  • Changes are in-memory and session-scoped. Removing the YAML restores normal provider behavior on the next session; no save data or source asset is rewritten.
  • Every multiplayer process loads its own sublevels. Install the same pack on server and clients.
  • Nothing was blocked: use the asset object’s path, not the generated class path. Check /kdf report for an unresolved target or an empty Asset Registry scan.
  • Target is rejected as the wrong kind: only RRDLSublevelAsset and KBFLSubLevelSpawning instances are supported. Patch other asset types with type: cdo.
  • Level was already present: KDataForge loads once during GameInstance initialization. Restart instead of expecting an in-session unload.