Mod Unlock Classes
Every mod FGUnlock subclass, with abstract state, Blueprint path, exact field types, accepted values, nested structs, examples, and caveats.
KDataForge uses mod unlocks in schematic and delivery-task unlocks: lists exactly like base-game
classes. The mechanism is fully generic (resolve class:, NewObject it onto the schematic’s CDO,
apply properties:, append to mUnlocks), so mod-provided classes need no special handling. Known
native paths with Blueprint variants automatically remap; exact Blueprint paths also work. Catalog
reflects mods loaded during Unreal scan.
Use these in a schematic’s instanced unlocks list or in a standalone type: unlock document. For base-game classes see Base-Game Unlock Classes.
Complete class/path matrix
Section titled “Complete class/path matrix”| Native class | Module | Abstract | Blueprint variant / concrete path | Configurable fields and accepted types |
|---|---|---|---|---|
KLGiveItemToAllPlayerUnlock | KLib | no | /KLib/Unlocks/BP_GiveToPlayersUnlock.BP_GiveToPlayersUnlock_C | bCanRepeat: boolmAmounts: TArray<FItemAmount> |
KLNetworkLevelUnlock | KLib | no | /Script/KLib.KLNetworkLevelUnlock | |
KLUnlockExtractorScanner | KLib | no | /Script/KLib.KLUnlockExtractorScanner | inherited mResourcesToAddToScanner: TArray<TSubclassOf<UFGResourceDescriptor>> (legacy)inherited mResourcePairsToAddToScanner: TArray<FScannableResourcePair> |
KLUnlockMaxRepeatPurchases | KLib | no | /KLib/Unlocks/BP_GiveChallangeUnlock.BP_GiveChallangeUnlock_C | inherited bCanRepeat: boolinherited mAmounts: TArray<FItemAmount>mMaxPurchaseCount: int32mCostMultiplierCurve: TObjectPtr<UCurveFloat>mRewardMultiplierCurve: TObjectPtr<UCurveFloat>mRewardItemsByLevel: TArray<FKLRepeatPurchaseRewardLevel> |
UKLUnlockCleanerItem | KLib | no | /KLib/Unlocks/BP_CleanerUnlock.BP_CleanerUnlock_C | mItemDescriptor: TSubclassOf<UFGItemDescriptor> |
KPCLDeliveryTaskInventorySlotUnlock | KPrivateCodeLib | no | /KPrivateCodeLib/Unlocks/BP_DeliverInventorySlotUnlock.BP_DeliverInventorySlotUnlock_C | mNumInventorySlotsToUnlock: int32 (min 1) |
KPCLDeliveryTaskQueueSlotUnlock | KPrivateCodeLib | no | /Script/KPrivateCodeLib.KPCLDeliveryTaskQueueSlotUnlock | mAmount: int32 (min 1) |
KPCLDeliveryTaskSlotUnlockBase | KPrivateCodeLib | yes | base only | |
KPCLDeliveryTaskUnlock | KPrivateCodeLib | no | /KPrivateCodeLib/Unlocks/BP_DeliveryTaskUnlock.BP_DeliveryTaskUnlock_C | |
KPCLFaxitCapacityUnlock | KPrivateCodeLib | no | /KPrivateCodeLib/Unlocks/BP_FaxitCapaUnlock.BP_FaxitCapaUnlock_C | mCapacityType: EKPCLFaxitCapacityTypemAmount: int32 (min 1)bUseCapacityTypeDefaultAmount: bool |
KPCLFaxitFeatureUnlock | KPrivateCodeLib | no | /KPrivateCodeLib/Unlocks/BP_FaxitFeatureUnlock.BP_FaxitFeatureUnlock_C | mFeature: EKPCLFaxitFeature |
KPCLFaxitSpeedUnlock | KPrivateCodeLib | no | /KPrivateCodeLib/Unlocks/BP_FaxitSpeedUnlock.BP_FaxitSpeedUnlock_C | mAmount: int32 (min 1)bIsFluid: bool |
KPCLFaxitUnlockBase | KPrivateCodeLib | yes | base only | |
| AB_FluidExtras | no | /AB_FluidExtras/Exhausts/Func/ABUnlock_UnsafeExhaust.ABUnlock_UnsafeExhaust_C (Blueprint-only; parent FGUnlock) | Blueprint-defined reflected variables; no native field contract |
Use Blueprint generated-class path where listed because it carries mod-configured defaults.
Concrete classes without Blueprint use native /Script/<Module>.<Class> path.
YAML encoding follows base-game types: bool,
int32, and enum values are scalars; TSubclassOf<T> and TObjectPtr<T> use Unreal paths;
TArray<T> uses a sequence; reflected structs use mappings. Inherited fields keep the same type.
KLib fields
Section titled “KLib fields”unlocks: - class: /KLib/Unlocks/BP_GiveToPlayersUnlock.BP_GiveToPlayersUnlock_C properties: - path: mAmounts value: - ItemClass: /KDataForge/Gen/MyPack.Gen_MyPack_MySuperIngot Amount: 10| Class | Fields and accepted types | Purpose |
|---|---|---|
KLGiveItemToAllPlayerUnlock | mAmounts: TArray<FItemAmount>, bCanRepeat: bool | Gives listed items to every player |
KLUnlockMaxRepeatPurchases | mMaxPurchaseCount: int32, mCostMultiplierCurve: TObjectPtr<UCurveFloat>, mRewardMultiplierCurve: TObjectPtr<UCurveFloat>, mRewardItemsByLevel: TArray<FKLRepeatPurchaseRewardLevel>, inherited mAmounts: TArray<FItemAmount> and bCanRepeat: bool | Level-dependent repeat purchases and rewards, deposited once into Trading Post storage (overflow spawns in a crate beside it) |
UKLUnlockCleanerItem | mItemDescriptor: TSubclassOf<UFGItemDescriptor> | Info-only cleaner item entry; extends FGUnlockInfoOnly, so it grants nothing by itself |
KLNetworkLevelUnlock | Deprecated Faxit tier recompute hook | |
KLUnlockExtractorScanner | inherited mResourcesToAddToScanner: TArray<TSubclassOf<UFGResourceDescriptor>> (legacy), mResourcePairsToAddToScanner: TArray<FScannableResourcePair> | Deprecated; use FGUnlockScannableResource |
KLUnlockMaxRepeatPurchases.mMaxPurchaseCount <= 0 means unlimited. Cost/reward curve X is number
of completed purchases, so X=0 controls first purchase and X=1 the second. A null curve property
uses multiplier 1, leaving the configured value unchanged. Full worked pack:
Repeat-Purchase Schematic (KLIB).
Mod struct value shapes
Section titled “Mod struct value shapes”| Struct field | Accepted type | Constraint / meaning |
|---|---|---|
FKLRepeatPurchaseRewardLevel.mPurchaseLevel | int32 | Minimum 1. First purchase is level 1; highest configured level not above current purchase wins. |
FKLRepeatPurchaseRewardLevel.mItemsToGive | TArray<FItemAmount> | Reward items for this level. See base struct shapes. |
FKLRepeatPurchaseRewardLevel.bOverrideCosts | bool | When true, replaces normal costs with mCosts. |
FKLRepeatPurchaseRewardLevel.mCosts | TArray<FItemAmount> | Replacement costs when bOverrideCosts is true. |
FKLRepeatPurchaseRewardLevel.mAdditionalCosts | TArray<FItemAmount> | Costs added only at this exact level. |
mItemsToGive replaces the complete reward list from its level onward. bOverrideCosts: true
replaces the complete raw cost list from that level onward; mAdditionalCosts applies only when
mPurchaseLevel matches the current purchase exactly and does not carry forward. Both cost lists
are raw values, combined before mCostMultiplierCurve is applied.
Runtime-only mCached* and bHasCached* members are transient caches, not KDataForge configuration
fields, so they are intentionally excluded.
Deprecated KLib unlocks
Section titled “Deprecated KLib unlocks”KLNetworkLevelUnlock carries no data of its own and only forces a Faxit tier recompute; use the
KPCLFaxit*Unlock classes below instead. KLUnlockExtractorScanner is superseded by the base-game
FGUnlockScannableResource. Both still exist because shipped schematic assets instance them, so do
not use either in a new pack.
KPrivateCodeLib fields
Section titled “KPrivateCodeLib fields”unlocks: - class: /KPrivateCodeLib/Unlocks/BP_FaxitCapaUnlock.BP_FaxitCapaUnlock_C properties: - path: mCapacityType value: Drive - path: mAmount value: 1 - class: /KPrivateCodeLib/Unlocks/BP_FaxitSpeedUnlock.BP_FaxitSpeedUnlock_C properties: - path: mAmount value: 15000 # fluid units per minute, 1000 units = 1 m³ - path: bIsFluid value: true| Class | Fields and accepted types | Purpose |
|---|---|---|
KPCLDeliveryTaskUnlock | Enables delivery tasks, the research queue, and manual delivery | |
KPCLDeliveryTaskInventorySlotUnlock | mNumInventorySlotsToUnlock: int32 (min 1) | Adds slots to the shared delivery-task manual-input inventory |
KPCLDeliveryTaskQueueSlotUnlock | mAmount: int32 (min 1) | Raises how many delivery tasks queue at once (limit starts at one) |
KPCLFaxitCapacityUnlock | mCapacityType: EKPCLFaxitCapacityType, mAmount: int32 (min 1), bUseCapacityTypeDefaultAmount: bool | Raises machine-network, network, drive, or network-building buffer inventory capacity |
KPCLFaxitFeatureUnlock | mFeature: EKPCLFaxitFeature | Enables RemoteAccess, Sink, or Depot |
KPCLFaxitSpeedUnlock | mAmount: int32 (min 1, default 15), bIsFluid: bool | Raises solid/fluid transfer rate |
KPCLDeliveryTaskSlotUnlockBase | Abstract delivery-slot base; never instance directly | |
KPCLFaxitUnlockBase | Abstract Faxit base; never instance directly |
Slot/capacity amounts clamp to minimum 1. BufferInventory capacity uses an authored default
helper: when bUseCapacityTypeDefaultAmount is true and raw mAmount is 1, the effective amount is
3 buffer slots; writing a custom mAmount disables that default in editor-authored assets. Faxit
speed uses items/min for solids (mAmount: 15 adds 15 items/min) and fluid units/min for fluids
(1000 units = 1 m³, so mAmount: 15000 adds 15 m³/min).
Faxit unlock values accumulate: every purchase recomputes from base values and reapplies each
purchased unlock, so there are no tiers and no curves two capacity unlocks of 1 give the same
result as one unlock of 2.
| Enum type | Accepted YAML values | Meaning |
|---|---|---|
EKPCLFaxitCapacityType | MachineNetwork, Network, Drive, BufferInventory | Machine-network limit, network building limit, drive slots, buffer slots |
EKPCLFaxitFeature | RemoteAccess, Sink, Depot | Faxit feature gate enabled by the unlock |
See Base-Game Unlock Classes for FactoryGame classes and Availability Dependency Classes for gating classes.
