Upgrading from SML 3.11.x to 3.12.x

SML 3.12 and 1.2 support have not been released yet! The contents of this page will change frequently! Keep your eyes on the #modding-info-feed Discord channel to be notified when updates are made.

SML3.12 brings support for Satisfactory 1.2. As a major update bundled with an Unreal Engine upgrade, most mods are expected to need recompilation with the new engine and game headers.

Please read this entire page before you begin updating your mod. It will save you time later to have an idea going in of what to expect while updating. After you have finished reading this page, follow the directions on the Updating your Mod guide to install the updated engine, starter project, and update your mod.

Versioned Cooked Content

Since Alpakit uses Versioned Cooked Content as of SML 3.10, there is a chance that some blueprint-only mods packaged for SML3.11 will require no changes to function properly in Satisfactory 1.2.

Since it’s not possible for an end user to predict which mods will or won’t work, we are not planning to announce this, except to careful readers of this page - hey, that’s you! It’s up to mod developers and attentive community members to test mods and update their ficsit.app Compatibility Info accordingly.

As a general rule of thumb, your mod will probably NOT have survived if:

  • It includes includes any C‍+‍+ modules

  • It interfaces with systems changed in Satisfactory 1.2, like vehicles

  • It worked with user input, especially for controllers

  • You stepped outside on a rainy day while wearing 1 sock on the wrong foot during the 1.2 experimental (that is to say, there are factors we aren’t aware of yet)

To test whether your mod still works without recompiling:

  1. Install your published SML3.11-dependent mod via Satisfactory Mod Manager or by manually installing it.

  2. Use SMM to install a copy of SML3.12, or use Alpakit to package a version of SML yourself. Note that SMM will replace your self-packaged copy of SML if it detects that changes are required.

  3. Launch your game and test your mod accordingly

  4. If your mod functions without a recompile, update its Compatibility Info on the mod page accordingly. No need to build and upload a new version.

New Features

This section talks about the new features that Satisfactory 1.2 and SML 3.12 bring to the table.

User Config Resetting

Users can now reset Mod Configuration options to their default values directly from the config screen. Package ExampleMod and try it out in game!

As a mod developer, you can exclude certain options from being reset ('Allow User Reset'), check if a setting is at its default value, or trigger a reset yourself via code. If a config section disallows reset, all options within that section are also unable to be reset.

All existing default values and user config choices have been preserved. Although you do not technically need to change anything for your mods to get this feature, it is worth reviewing your configuration to see if there are any values that the user should not be allowed to reset.

For more information, see the PR adding the feature.

ficsit.app Controller Compatibility Tracking

ficsit.app now allows you to communicate if your mod works with controllers, such as Xbox, Playstation, or Steam controllers. This information is presented and stored in a system similar to the existing Stable and Experimental branch compatibility.

The possible options are:

  • Untested - (Leave your mod at this unless you have a good reason to otherwise.) No controller support information has been reported for this mod yet. Try it out and contact us on the Discord so it can be updated!

  • Unsupported - You will need to use a mouse and keyboard to interact with elements introduced by or altered by this mod.

  • Partial - This mod partially supports playing with a controller, but there are still some things missing. You may need to use a mouse and keyboard to interact with some elements introduced by or altered by this mod. Be sure to read the note and see an explanation!

  • Supported (Implicit) - This mod supports playing with a controller. This is because the mod does not introduce or modify any systems that require an explicit effort to support controllers - existing controller support already covers it.

  • Supported - This mod supports playing with a controller. The developer has made a specific effort to ensure that playing with a controller is possible and tested it themselves.

This information is currently only visible on ficsit.app, not inside of SMM.

ficsit.app Disclosures

ficsit.app now offers a consistent location for mods to place their Network Activity Transparency information. Previously, this information was expected to be somewhere inside the mod description text. This new change helps users find the information quickly and ensures developers know they need to provide it. Together with this field is a new one for disclosing generative AI usage.

You can read more about what information must be disclosed in the ficsit.app Content Policy.

Note that uploading additional versions of your mod is blocked until disclosure questions are answered.

This information is currently only visible on ficsit.app, not inside of SMM.

Modding and Linux

Thanks to some hard work on the build system, the binaries we distribute for SML 3.12 and the custom Unreal Engine version are now compiled on Linux machines.

This shouldn’t change anything visible to end users or mod developers, but it makes our automated build systems a lot easier to maintain, and means it’s now easier for individual mod developers to set up their own, if desired.

Coinciding with this, we’ve done a bunch of testing with developing mods from Linux machines, and it’s now stable enough for us to include directions on the docs. As Linux systems are often unique, expect to have to face some undocumented complications and join the Discord to seek setup assistance.

You can find the Linux-specific setup directions on the Linux Setup page.

Advanced Game Settings split to Creative Mode and Game Modes

Satisfactory 1.2 has renamed the concept of Advanced Game Settings to "Creative Mode". These options still disable achievements. There is a new category of settings called "Game Modes" that include the new ore node randomization and cost multiplier settings. "Game Modes" do not disable achievements.

It should be possible to define new Game Mode settings using `FGUserSetting`s, but at the time of writing no one has tried it yet.

Basic Content Tag System in the Base Game

As of 1.2, the base game includes a basic read-only version of the SML Content Tag Registry via the mGameplayTags field on the following classes:

  • FGItemDescriptor

  • FGRecipe

  • FGResearchTree

  • FGSchematic

It also introduces a few new Gameplay Tags used by the base game. A select few interesting ones:

  • Item.CentralStorage.PreserveItemState stores the item in the Dimensional Depot in a different format, preserving the per-item-instance state data used by equipment and some modded items

  • Resource.Advanced and similar are used to identify resources for the node randomization feature

The base game’s system is significantly limited compared to SML’s - see the Content Tag Registry - Vanilla Functionality section for more info.

SML’s registry has been updated to reuse the vanilla gameplay tag container of a class if it already exists.

Not Done Yet

The following features are not quite ready to use yet.

Game Feature Backed Extended Data Layers

The new Game Feature system should allow using the Unreal World Partition Data Layers system, with data layers loaded by Game Features, will be the intended approach for creating additions to the game map, like new ore nodes or terrain elements, replacing the current sublevel spawning approach.

Based on Mircea and SirDigby’s testing, this is not working reliably yet, and the specifics are still being figured out. More info in this Discord message chain.

Required Changes

In addition to any specific-to-your-mod issues you may encounter, the changes described below must be made in order for your mod to be updated.

Dependency Updates

The following project dependencies have updated. Install the updated versions as you follow the Updating your Mod guide.

Engine Update

Satisfactory 1.2 brings the game to Unreal Engine 5.6.1. Download and set up our custom release while following the Updating your Mod guide.

Clang Toolchain Update

This updated engine version also requires an updated clang toolchain. Download and set up the new toolchain while following the Updating your Mod guide.

Wwise Update

CSS has also updated to a newer version of Wwise. The Dependencies page Wwise instructions lists the new Wwise version and guides you through integrating it into your project as you follow the Updating your Mod guide.

Generate Wwise Sound Banks

If you see the "GeneratedSoundBanks folder does not seem to be set. Would you like to open the settings window to set it?" message, use the Wwise editor to manually generate sound banks once, You should not need to do this again unless you create a new Wwise project or use Wwise systems in your mod.

Set Up an Unreal Game Feature Data Asset

Changes in 1.2 allow Satisfactory to take advantage of the Unreal Game Features and Modular Gameplay system. Game Features are a asset detection and registration system similar to SML’s Mod Modules, except built into Unreal.

99% of mods should now include a "Game Feature Data Asset", with the exception being mods that introduce no new content nor assets, just scripting libraries. Future Satisfactory updates are likely to further extend the capabilities of the Game Feature Data Asset system.

In previous versions, a number of asset types were auto-detected by the game without registration. These include icon libraries, input contexts, FGMessages (for ADA), and FGUserSettings. As of 1.2, these content types must now be registered via the Game Features system.

To migrate your mod to use Game Features:

  1. Delete any existing built copies of the mod from your game install directory. The game will get confused and not load things properly if you have both a "standard" and "game features" copy of your mod installed at once. ("A version of the 'ModReferenceHere' plugin has already been enabled" log message produced)

  2. Close the Unreal editor

  3. Transfer the mod’s plugin folder from the <Project>/Mods/ directory to the <Project>/Mods/GameFeatures/ directory.

  4. Regenerate Visual Studio Project Files

  5. Compile for Development Editor

  6. Create a new Data Asset asset of class FGGameFeatureData in the mod’s content root folder. It should be named exactly the mod’s mod reference. Using the name GameFeatureData is also supported but discouraged as it makes editing multiple mods at once confusing.

  7. Create a new dummy mod with the Blueprint Only Alpakit template to view sample "Primary Asset Types to Scan" rules, then assess which your mod needs to register. The following previously auto-detected classes must now be registered via scan rules:

    • FGUserSetting

    • FGMessage

    • FGIconLibrary

    • FGChildInputMappingContext (previously Input Mapping Context using Parent Context registration)

ExampleMod is updated to use the Game Feature system if you’d like to compare against an already migrated mod.

Read more on the Game Feature Data Asset page.

Unreal Pointer Migration

Satisfactory has switched to use Unreal TObjectPtr<>`s instead of raw pointers (for example, `UObject*) in their codebase for the memory and dependency management benefits it offers.

Any C‍+‍+ mods using raw pointers to UObjects/UStructs/UProperties must switch to this format to avoid crashes (It will build somewhat fine like this but not using TObjectPtr might result in GC crashes if/when we enable Incremental GC - Arch). In the next SML update, mods still using raw pointers will be unable to compile. You can force this compile-time check now by adjusting the Unreal Header Tool configuration:

[UnrealHeaderTool]
; ...
; <CSS> FactoryGame has been migrated to use TObjectPtr, disallow native pointers in game code
NonEngineNativePointerMemberBehavior=Disallow

In most cases the swap can be a drop-in replacement, as TObjectPtr can automatically cast to a raw pointer as needed, but it can’t automatically cast to a pointer-by-reference, which may require additional code changes.

Unreal has provided a conversion tool that can update portions of your code automatically. Below is a summary of the steps adapted to a Satisfactory mod’s needs. Unreal’s original usage guide for the tool can be found on their documentation: Unreal Engine 5 Migration Guide: Optional Conversion Tool. Running the tool applies for every loaded mod in the project.

  1. Open your engine install folder to locate C:\Program Files\Unreal Engine - CSS\Engine\Programs\UnrealHeaderTool\Config\DefaultEngine.ini

  2. Change NonEngineNativePointerMemberBehavior from AllowSilently to AllowAndLog

  3. Run a C‍+‍+ build of the starter project so the required UHT log messages are produced. Doesn’t need to be a full rebuild, but if the build output says "Up to date", you’ll have to run a rebuild.

  4. Open the UBT log file located at "%LOCALAPPDATA%\UnrealBuildTool\Log.txt" Remove any lines from the file relating to native pointer usage that mention Wwise (AkAudio), otherwise running the tool will break Wwise and you’ll have to remove the Wwise plugin and re-integrate it.

  5. The engine installer distributed by the modding community already includes a built version of the tool. Open a Powershell terminal in the C:\Program Files\Unreal Engine - CSS\Engine\Binaries\Win64 folder, then run the tool by executing the following command:

    > ./UnrealObjectPtrTool.exe "%LOCALAPPDATA%\UnrealBuildTool\Log.txt"
  6. If the command worked, it’ll output something like: LogUnrealObjectPtrTool: Display: Upgraded successfully. 97 upgrades found; 97 upgrades performed

  7. If the command didn’t work or didn’t output anything, post in the #help-developing-mods channel of the Discord to get help.

Additional Changes

You might not be affected by these changes, but we’d like to draw extra attention to them.

Enhanced Input

A number of fields have been moved between InputMappingContext and InputAction classes this update.

You can find their old values by opening up your backup copy of the project and checking it there. If you don’t have a backup copy, make one next time! You may also be able to recover this info by using FModel or Content Inspector on an existing release of your mod.

Mapping Context Parent Class Change

Input contexts using the Parent Context registration approach need to be migrated to a new purpose-built data asset class.

The mParentContext field has been moved from UFGInputMappingContext to UFGChildInputMappingContext, so the value set on existing assets will be lost.

To migrate an existing input mapping context asset, right click on it and select either of the 2 Convert to a Different DataAsset Type menu options, then select FGChildInputMappingContext.

You will also need to set up your Game Feature Data Asset to scan for FGChildInputMappingContext as covered in that section.

Player Mappable Settings Migration

A number of fields previously present on InputContexts' "Mappings" records have moved to Input Actions:

  • Is Player Mappable

  • Name (for options value saving)

  • Display Name

  • Display Category

These fields were previously configured on the InputContext, unless you were using the Experimental Player Mappable Key Settings option. This update makes that option no longer experimental, but the requirement.

It’s still possible to set these on the input context if you use the Override Settings Setting Behavior, but it’s recommended to configure them on the action instead.

TODO how to properly specify settings for axis bindings? Should axis still have it present on the action? ExampleMod IA_ExampleWidgetMovementAxis seemed to need 4 separate overrides at the Context level to work properly and display properly in the game settings UI

C‍+‍+ Full Include Paths (BuildSettingsVersion V5)

A change in CSS build settings means that all modules must follow BuildSettingsVersion.V5. Previously, targets for mods could have slightly different settings and still work properly.

Although the Alpakit mod templates have been updated to account for this for a few game updates, existing mods using legacy build settings may need to update their mod source to compile under the updated settings.

The most common example of this is needing to use full paths in includes now. For example, code previously using #include "FGHologram.h" must now use #include "Hologram/FGHologram.h".

More context on this Discord message chain.

Asset Dumping with -nullrhi no longer works

Dumping assets with -nullrhi is no longer possible, because Unreal Engine doesn’t load mesh data when using that anymore, as a dedicated servers memory optimization.

-RenderOffscreen can be used instead, which will still use the GPU to render, but without the game window.

ExampleLevel Lighting Update

Archengius has updated Example Level’s lighting to use exactly the same settings as the base game. If you’ve developed a custom map, check out the settings and lighting actors inside ExampleLevel so you can match the base game’s settings.

TODO list of places to look at specifically?

Console Shared Codebase

Note that Satisfactory 1.2 brings the PC and console versions of the game to the same codebase. Although it is still not possible to develop mods for consoles, you may notice additional code and assets for console support code.

Custom Icon Libraries on Servers

1.2 fixes a base-game bug content registration bug, allowing modded Icon Libraries to work properly on dedicated servers. No changes to existing icon libraries are known to be required for the fix to work.

Get Ingredients Needs World Context

With the addition of the recipe cost multiplier system, getting the ingredients of a recipe now requires world context to involve the save’s multiplier settings.

Add Recipe.Part tag to Component Recipes

The base game uses Gameplay Tags to control the behavior of the recipe cost multiplier system. Modded component recipes should tag their components with Recipe.Part to be included in the multiplier. Make sure to leave out the tag on recipes that would break if multiplied, for example, packaging and unpackaging liquids.

-NoFirstLoginPopup Launch Argument

Using the -NoFirstLoginPopup launch argument skips the Experimental branch popup on the main menu.

TODO - In testing, this behaved inconsistently, and may also need to be used with the -nosplash argument. Please try it out and let us know what you find on the Discord.

FVariant FString Conversion

The game now ships with an implementation for FVariant to convert FStrings. This is useful for implementing string-based FGUserSettings. Previously this required a custom conversion implementation.

Linear Color Option Support

The game now ships with a Linear Color FGUserSetting type.

Complete Changelog

The full list containing every changed file and asset can be viewed using GitHub’s Compare Changes feature: https://github.com/satisfactorymodding/SatisfactoryModLoader/compare/v3.11.3…​v3.12.0