Upgrading from SML 3.8.0 to 3.9.x
SML3.9 fixes some bugs, adds developer utilities, and helps end users avoid installing mods improperly in multiplayer. Mods compiled for SML3.8 should work with SML3.9, but any mods using Blueprint Hook Helper may need to update their code. Even the mods that need to update their code should™ work because the old functions are inline or template.
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.
New Features
This section talks about the new features that SML 3.9 brings to the table.
Clients Check Server Mods when Joining
In previous SML versions, servers were able to reject client connections if the client was missing required mods installed on the server.
SML 3.9 now implements this check for clients.
Clients will refuse to join servers that are missing mods present on the client side.
The existing RequiredOnRemote
and RemoteVersionRange
uplugin fields control this behavior.
Read more about them in the uplugin Special Fields section.
Wwise Support
SML 3.9.1 enables mods to make use of some of the game’s Wwise sound system. See the Audio page for more information.
Quick Launch Script Supports Multiplayer
The Quick Launch Script
is once again capable of launching local multiplayer games to test with.
Additionally, the -loadLatestSave
and -multiplayer
options are now compatible,
and the -clientAutoJoin
option has been added to make the client automatically connect to the host.
Blueprint Hook Helper
The Blueprint Hook Helper has been extended to enable easier access to FProperties,
FMapProperties, and FStructProperties.
See BlueprintHookHelper.h
for more details.
Example Mod Improvements
ExampleMod has been enhanced with additional examples:
-
Significant enhancements to Example Level and the tools for creating custom levels
-
Schematic CDO edit example
-
ExampleItem now has a custom inventory description widget
Mass Asset Reparenter
This editor utility allows you to easily change the parent class of multiple assets at once.
Read more on the SML Editor Utilities page.
ADA Message Extractor
This utility loads all FGMessage assets in the project and compiles data about them into one string. It can be useful for viewing what speaking patterns ADA and the Aliens use when speaking without having to hunt through lots of separate message assets.
Read more on the SML Editor Utilities page.
Alpakit Release: Open Folder
The Alpakit Release window now has a button to open the output directory that contains packaged mod files for upload.
Launch Argument: ExecCmds
SML now reimplements the Unreal Engine ExecCmds
launch argument (normally excluded from shipping builds).
It enables automatically executing Unreal Console Commands
after the game loads.
You can read more about it in the Unreal documentation
The Quick Launch Script
uses this argument to implement the -clientAutoJoin
flag.
Relevant Base Game Changes for Modding
This section highlights some changes Coffee Stain has made to the base-game specifically for modders to utilize.
-
Fixed FFGDynamicStruct missing a NetSerializer
-
Added API for working with the new Lightweight Buildable Subsystem for modders
-
New launch arguments (covered in more detail below)
Launch Argument: CustomConfig
Added in CL382498, the -CustomConfig=
allows you to override an additional layer of configs compiled into the game.
Using exactly -CustomConfig=
(specifying an empty string as the value)
enables local multiplayer testing by giving the host a consistent GUID/playername
and clients random GUIDs that persist as long as their game client stays open (game instance).
Launch Argument: ini Overrides
Added in CL382498, the -ini:Config:[Section]:Value=
argument allows overriding ini config values via launch arguments.
This behavior was previously possible using the -EngineINI=
argument,
but that approach requires creating an ini file to pass in
and the engine would fill it with unrelated values on launch.
For example, the Quick Launch Script
now uses this instead of the EngineINI
argument:
-ini:Engine:[/Script/EngineSettings.GameMapsSettings]:GameDefaultMap=/Game/FactoryGame/Map/GameLevel01/Persistent_Level.Persistent_Level,[/Script/EngineSettings.GameMapsSettings]:LocalMapOptions=?skipOnboarding?loadgame=saveGameFilename
Another example - this argument can be used to raise the multiplayer max player count:
-ini:Engine:[SystemSettings]:net.MaxPlayersOverride=10
Notable Fixes
Reliable Buffer Overflow
Mircea has created a standalone mod to address one of the causes of the Reliable Buffer Overflow issue. See its mod page for more information.
Content Registry Issue with Mod Schematics Depending on Vanilla Schematics
Mods can now alter vanilla content to unlock-depend on modded content without breaking its registration. See this github issue for more info.
Buildables with Empty Cost Now Finish their Build Animation
This base-game bug has been fixed. Source.
Not Done Yet
The following features are not quite ready to use yet.
Advanced Game Settings values not saved
The Session Settings page explains how you can create your own Advanced Game Settings. However, their values are not currently saved with the save file. Session Settings still function correctly - their values are saved.
Content Bundle Cooking
The optimal way to add modded content to the game world (like ore nodes, deposits, etc.) is to use the Content Bundle system, but Unreal currently refuses to cook content bundles unless the world is also cooked. This is a known bug and will be fixed in a future SML release.
The next best way is to use sublevel spawning. Here is an example from Kyrium of how to do that:
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.
-
There are no required changes for this SML update!
Additional Changes
You might not be affected by these changes, but we’d like to draw extra attention to them.
Blueprint Hook Helper
In addition to the new blueprint hooking features, the handling of blueprint hook properties has been unified, resulting in some old methods being changed.
Consider this example from the Faster Manual Crafting Redux mod:
SML 3.8 version:
int32* numSparksToAdd = helper.GetLocalVarPtr<FIntProperty>(TEXT("NumberOfSparks"));
SML 3.9 version:
int32* numSparksToAdd = helper.GetLocalVariableHelper()->GetVariablePtr<FIntProperty>(TEXT("NumberOfSparks"));
Consider this example from SML’s item description widget hook:
SML 3.8 version:
UUserWidget* TooltipWidget = Cast<UUserWidget>(*HookHelper.GetOutVariablePtr<FObjectProperty>());
SML 3.9 version:
UUserWidget* TooltipWidget = Cast<UUserWidget>(*HookHelper.GetOutVariableHelper()->GetVariablePtr<FObjectProperty>(TEXT("ReturnValue")));