From bdaa1c6a6637948d5fe4b67fe4dbc3e2ae744b98 Mon Sep 17 00:00:00 2001 From: Rob B Date: Fri, 19 Dec 2025 22:37:33 -0500 Subject: [PATCH 01/13] Hook paramater and return value clarification. Function cancel example --- .../Development/ModLoader/BlueprintHooks.adoc | 72 +++++++++++++------ 1 file changed, 51 insertions(+), 21 deletions(-) diff --git a/modules/ROOT/pages/Development/ModLoader/BlueprintHooks.adoc b/modules/ROOT/pages/Development/ModLoader/BlueprintHooks.adoc index 9d764d1d..8b09fdff 100644 --- a/modules/ROOT/pages/Development/ModLoader/BlueprintHooks.adoc +++ b/modules/ROOT/pages/Development/ModLoader/BlueprintHooks.adoc @@ -55,7 +55,7 @@ The following hook types are available: ** Before ** Replace ** After -* Redirect Hook - Must return the same type +* Redirect Hook .Hover over an entry to display an explanatory tooltip image::Development/ModLoader/BlueprintHooks/CreateHook.png[Create Hook] @@ -97,32 +97,60 @@ All Hooks require a Target Specifier to be connected to them to tell them what p image::Development/ModLoader/BlueprintHooks/TargetSpecifierConnected.png[Target Specifier] -== Hook Functions +// == Understanding Statements + +// TODO explanation of what exactly a statement is. +// Those nodes compile to some bytecode. A statement is a top-level instruction in the bytecode, like x = something() +// In the BP code dump, each line is a statement +// https://discord.com/channels/555424930502541343/562722670974599227/1451596054054309971 + +[id="HookImplementation"] +== Hook Implementation Function The code executed by a hook is defined in functions within the Hook Blueprint. -The "Hook Implementation" option on hook nodes determines what function is invoked a hook node. +The "Hook Implementation" option on hook nodes determines what function is invoked by a hook node. + +[id="HookImplementation_Parameters"] +=== Parameters -=== Hook Function Parameters +The parameters on the hook implementation function are populated by the hooking system +based on the target function's parameters, target class, and type of hook. -Hook functions parameters are populated by the hooking system based on -the target function's parameters, target class, and type of hook. +Parameters can be any variable that is available in the hooked function's context that the hook might want to read/write. +A wider type can be used unless the parameter is set to Pass-by-Reference (By Ref). +For example, a real value float could be converted to a double parameter, +or a real value of a specific object type could be converted to a general "Object" parameter. -The first parameter should be named `Target` and be of the type of Blueprint you are hooking. -Subsequent parameters can be any variable that is available in the hooked function's context that the hook might want to read/write. -If set to be By Ref, the type must exactly match, but otherwise a wider type can be used. +If a parameter is passed By Ref, the type must exactly match, and no automatic type conversion is ever performed. +By Ref parameters can be modified to change the mapped variable's value in the hooked function. -Parameters will be mapped using their name to: +Parameters are mapped to function variables by naming the parameter exactly the same thing as the variable. -* `Target` - special hooking argument that resolves to the object instance the hooked function was running on -* Global Variables - on the object instance +* Global Variables - on the object instance (the `Target`, see below) * Local Variables - function inputs, function locals, and function temps (which you can check for in a BP code dump, either via the link:#ViewingBlueprintFunctionImplementations[`-DumpBlueprintPatchingResults` launch argument] which generates pseudocode, or in xref:Development/ExtractGameFiles.adoc#FModel[FModel] which generates a json very similar to the asset dump) -* `TargetReturnValue` - special hooking argument that resolves to the hooked function's ReturnValue -* `HookTarget` - special hooking argument for insertion hooks. Resolves to the expression the hook was pointing to, if it wasn't pointing to a statement -* `AssignmentTarget` - special hooking argument for insertion hooks on assignment statements. Resolves to the variable on the left side of an assignment statement. -* `OriginalValue` - special hooking argument that resolves to the original value when using redirect hooks (replacing an expression inside a statement, rather than an insert hook which goes before/replace/after a statement). Required when using a redirect hook. + +In addition, the following special hooking arguments are available: + +* `Target` - resolves to the object instance the hooked function was running on. +* `TargetReturnValue` - resolves to the hooked function's ReturnValue. +* `HookTarget` - only for insertion hooks. Resolves to the expression the hook was pointing to, if it wasn't pointing to a statement. +* `AssignmentTarget` - only for insertion hooks on assignment statements. Resolves to the variable on the left side of an assignment statement. +* `OriginalValue` - required for redirect hooks. Resolves to the original value (replacing an expression inside a statement, rather than an insert hook which goes before/replace/after a statement). + +All parameters are optional, except `OriginalValue` for redirect hooks. image::Development/ModLoader/BlueprintHooks/NewFunction.png[New Function] +[id="HookImplementation_Returns"] +=== Return Values + +Insertion hooks can optionally return a boolean named `ReturnValue` +to control whether the hooked function should continue execution (`True`) +or jump to the return statement, effectively canceling the function and skipping any other hooks on the statement (`False`). +If this is not present, execution will continue by default. + +Redirect hooks must return a value of the same type as the statement being replaced. + [id="Register"] == Registering the Hook @@ -146,13 +174,15 @@ You can modify the arguments the hooked function receives by using a Before Hook Add the parameter you want to modify as a By-Ref parameter on your hook function. The initial value can be accessed via the parameter and modified by a Set By Ref node. -// === Cancel Hooked Function Execution +=== Cancel Hooked Function Execution + +Insertion hooks can conditionally cancel further execution of the function they are hooking. +Be careful exactly which statement you are hooking, as you don't want to accidentally run more of the target function's code than you intended. -// TODO, see https://discord.com/channels/555424930502541343/562722670974599227/1451402917624942612 +To cancel execution, the hook implementation function should return a boolean `ReturnValue` of `False`. -// You can (conditionally) cancel the execution of a function using a Replace hook. -// By default, Replace hooks do not execute their original target, . -// When relevant, Replace hooks will still execute their original target if the Hook Implementation returns `True` for a boolean output parameter named `ReturnValue`. +If you intend to cancel execution just based off of input parameters, +use a Before hook on the Function Entry Statement expression. === More! From 17403a43bae2656c0f13aa9a9eda24b015d851cf Mon Sep 17 00:00:00 2001 From: Rob B Date: Sat, 17 Jan 2026 15:50:01 -0500 Subject: [PATCH 02/13] Mention how to import images to the project at the earliest point it's needed --- .../pages/Development/BeginnersGuide/SimpleMod/recipe.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/recipe.adoc b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/recipe.adoc index 5e0f65e2..7521ec32 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/recipe.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/recipe.adoc @@ -184,7 +184,7 @@ Next, let's add our recipe to a schematic to make it available in game. Schematics are what Satisfactory uses to grant recipes and capabilities to the player. Schematics are the milestones you'll see in the HUB, -the Tier 0 tutorial phases, M.A.M researches, alternate recipe researches, and more. +the Tier 0 tutorial phases, M.A.M researches, Hard Drive scan result options, AWESOME Shop purchases, and more. If the player is unlocking an item, building, or any recipe, it's probably be granted by a schematic. Go to the Content Browser in the Unreal editor. @@ -270,6 +270,7 @@ M Schematic Icon:: // Links to GH hosted image because cloudflare serves it as a webp -> can't be imported to Unreal Set both this field and `M Small Schematic Icon` to https://raw.githubusercontent.com/satisfactorymodding/Documentation/master/modules/ROOT/attachments/BeginnersGuide/simpleMod/Icon_SchemDoc.png[this example image]. + You can bring the image into the project by downloading it somewhere, then right clicking in a Content Browser and using `Import to /...`. * {blank} + M Cost:: From 54685a2dec041edd072a00f783b9f140618604ae Mon Sep 17 00:00:00 2001 From: Rob B Date: Sat, 17 Jan 2026 16:06:27 -0500 Subject: [PATCH 03/13] Additional Unreal learning resources. Move old resources from Development index page to new resources page. --- modules/ROOT/pages/Development/Cpp/index.adoc | 21 +++++----- modules/ROOT/pages/Development/Cpp/setup.adoc | 15 +++++++- .../UnrealEngine/UnrealLearningResources.adoc | 38 +++++++++++++++++++ modules/ROOT/pages/Development/index.adoc | 30 ++++----------- 4 files changed, 69 insertions(+), 35 deletions(-) diff --git a/modules/ROOT/pages/Development/Cpp/index.adoc b/modules/ROOT/pages/Development/Cpp/index.adoc index 1aaf4e3d..e44b4d4a 100644 --- a/modules/ROOT/pages/Development/Cpp/index.adoc +++ b/modules/ROOT/pages/Development/Cpp/index.adoc @@ -1,4 +1,4 @@ -= C++ Modding += {cpp} Modding Utilizing {cpp} code in your mod allows access to a much wider variety of game systems and features. Furthermore, {cpp} code is often compiled into far more performance friendly code than its Blueprint equivalent. @@ -7,7 +7,7 @@ However, {cpp} systems have their own shortcomings as well. Writing a mod with {cpp} does not mean replacing all of your Blueprint assets with {cpp} code. The best mods are implemented with a careful combination of both {cpp} and Blueprint code. -== Understanding Blueprint vs C++ +== Understanding Blueprint vs {cpp} Alex Forsythe has an excellent writeup (and corresponding video) that explains the different roles of {cpp} and blueprint in an Unreal project. @@ -15,7 +15,7 @@ Alex's summary of the article: ==== It's not an either/or decision. -Learn what makes C++ and Blueprints different, what they have in common, and how to use them together effectively. +Learn what makes {cpp} and Blueprints different, what they have in common, and how to use them together effectively. ==== You can find the article (and a link to the video) http://awforsythe.com/unreal/blueprints_vs_cpp/[here]. @@ -27,7 +27,10 @@ Reading the article is also highly recommended. Since this is a very advanced topic, we recommend you to learn {cpp} and {cpp} for Unreal Engine first. -We have compiled a list of some helpful learning resources xref:Development/index.adoc#_resources[here], but you will probably want to search out some more on your own. +We have compiled a list of some helpful +xref:Development/UnrealEngine/UnrealLearningResources.adoc[Unreal Learning Resources], +but you will probably want to search out some more on your own. +Let us know which ones you found helpful so we can add them to the list! Here is a list of some concepts you should learn before going further: @@ -87,12 +90,13 @@ More info on the upload process can be found on the xref:UploadToSMR.adoc[Upload We won't go into detail about the general technical stuff aspects of {cpp} in this documentation. If you want to learn more about that, there are plenty of good resources available elsewhere on the Internet. -In order to write {cpp} mods, you will require both general {cpp} knowledge, and knowledge about how {cpp} applies to Unreal Engine systems. -You can find a quick guide to the Unreal portion in the https://docs.unrealengine.com/en-US/Programming/Introduction/index.html[Unreal Documentation]. +In order to effectively write {cpp} mods, you will require both general {cpp} knowledge, and knowledge about how {cpp} applies to Unreal Engine systems. +Unreal's documentation covers this in its +https://dev.epicgames.com/documentation/en-us/unreal-engine/programming-with-cplusplus-in-unreal-engine?application_version=5.3['Programming with C++ in Unreal Engine' section]. == Modding Capabilities -As Satisfactory is packaged as a modular build and the developers distribute the headers and `pdb`s for us, +As Satisfactory is packaged as a modular build and the developers distribute the headers and `.pdb` s for us, and mods are loaded as Unreal plugins, there is very little of the game that {cpp} mods _can't_ modify. It usually just comes down to how much patience you have to figure out how to do it. @@ -102,6 +106,3 @@ you should read the doc comment that has been added to the function. Sometimes the comment will tell you that it doesn't work and suggest you use the workaround written in the comment, or it may contain valuable context about how the function can be used. - -If it still doesn't work, and you are **absolutely sure** that you are using it correctly, -contact the SML developers on the Discord for further advice. diff --git a/modules/ROOT/pages/Development/Cpp/setup.adoc b/modules/ROOT/pages/Development/Cpp/setup.adoc index 62f69919..a4078517 100644 --- a/modules/ROOT/pages/Development/Cpp/setup.adoc +++ b/modules/ROOT/pages/Development/Cpp/setup.adoc @@ -1,8 +1,11 @@ -= C++ Setup += {cpp} Setup -In order to get started with C++ modding, you should first follow the xref:Development/BeginnersGuide/project_setup.adoc[Getting Started guide]. +In order to get started with {cpp} modding, you should first follow the xref:Development/BeginnersGuide/project_setup.adoc[Getting Started guide]. This guide assumes that you have already installed all required dependencies and followed the setup process described there. +You should also have a basic understanding of the concepts +mentioned on the xref:Development/Cpp/index.adoc[{cpp} Modding section index page]. + == Background Information To build {cpp} code, Unreal uses its own written build pipeline called the "Unreal Build Tool" (aka. UBT). @@ -211,6 +214,14 @@ Note that **you should not create new files from Visual Studio directly** - it is not knowledgeable about the project structure and will create files in a temporary directory where they won't be detected by the UBT. +[NOTE] +==== +Make sure you are aware of the naming conventions for classes, files, and fields in Unreal Engine. +They are covered in the +https://dev.epicgames.com/documentation/en-us/unreal-engine/epic-cplusplus-coding-standard-for-unreal-engine?application_version=5.3#namingconventions[Coding Standard for Unreal Engine] documentation page. +For example, if you create an UObject whose class name does not start with `U`, the code will not compile. +==== + [id="AddClass_Editor"] === Using the Unreal Editor Add Class Wizard diff --git a/modules/ROOT/pages/Development/UnrealEngine/UnrealLearningResources.adoc b/modules/ROOT/pages/Development/UnrealEngine/UnrealLearningResources.adoc index 5735e7c1..0618b4cf 100644 --- a/modules/ROOT/pages/Development/UnrealEngine/UnrealLearningResources.adoc +++ b/modules/ROOT/pages/Development/UnrealEngine/UnrealLearningResources.adoc @@ -69,9 +69,33 @@ include::./../_includes/editor-familiarize-list.adoc[] * β­πŸ“–πŸ“½ https://www.youtube.com/watch?v=VMZftEVDuCE[Blueprints vs. C++: How They Fit Together and Why You Should Use Both]- Excellent overview of how a project using both Blueprints and {cpp} can best leverage the strengths of both. + +* πŸ“– https://dev.epicgames.com/documentation/en-us/unreal-engine/programming-with-cplusplus-in-unreal-engine?application_version=5.3['Programming with C++ in Unreal Engine' section] - + Epic's primary {cpp} documentation hub containing many other articles. + + ** β­πŸ“– https://dev.epicgames.com/documentation/en-us/unreal-engine/unreal-engine-cpp-quick-start?application_version=5.3[Unreal Engine {cpp} Quick Start] - + Epic's introductory tutorial for creating an actor in exclusively {cpp}. It's a cube that bobs up and down in the game level. + + ** β­πŸ“– https://dev.epicgames.com/documentation/en-us/unreal-engine/epic-cplusplus-coding-standard-for-unreal-engine?application_version=5.3[Coding Standard for Unreal Engine] - + Important details and conventions to be aware of when reading and writing {cpp} code for Unreal Engine. + Notable points include an explanation of the T/U/A/F/I/E prefixes for names. + + ** πŸ“– https://dev.epicgames.com/documentation/en-us/unreal-engine/reflection-system-in-unreal-engine?application_version=5.3['Unreal Engine Reflection System' section] - + Details many Unreal core constructs and macros (UObject, UProperty, etc.) backed by the reflection system that enable Unreal's editor and memory management features. + + ** πŸ“– https://dev.epicgames.com/documentation/en-us/unreal-engine/quick-start-guide-to-variables-timers-and-events-in-unreal-engine-cpp?application_version=5.3[Variables, Timers, and Events] - + Working with timers and latent actions is generally easier in blueprint, but is possible in {cpp} as well. + * πŸ“½ https://www.youtube.com/watch?v=IaU2Hue-ApI[The Unreal Engine Game Framework: From int main() to BeginPlay] - A high-level tour of what Unreal is doing under the hood when you run a game. +* β­πŸ“– https://unreal-garden.com/[Unreal Garden (previously ben🌱ui)] - + Community-ran documentation site with information on various topics, notable of which is extensive information on Unreal Metadata Specifiers. + + ** πŸ“– https://unreal-garden.com/docs/uclass/[All UCLASS Specifiers] + ** πŸ“– https://unreal-garden.com/docs/ufunction/[All UFUNCTION Specifiers] + ** πŸ“– https://unreal-garden.com/docs/uproperty/[All UPROPERTY Specifiers] + [id="General"] == General @@ -81,3 +105,17 @@ include::./../_includes/editor-familiarize-list.adoc[] Note that this tutorial will cover a lot of concepts and systems that Satisfactory already does for you. * πŸ“–πŸ“½ https://dev.epicgames.com/community/unreal-engine/learning[Learn Unreal Engine Portal] - Collection of learning resources created by Epic Games and the Unreal developer community. + +* πŸ“½ https://www.youtube.com/c/AlexForsythe[Alex Forsythe] - + YouTube channel that explains Unreal Engine systems and concepts (both Blueprint and {cpp}) in an approachable way, + including replication. + +* πŸ“½ https://www.youtube.com/channel/UCOVfF7PfLbRdVEm0hONTrNQ[Mathew Wadstein] - + YouTube channel with short, focused videos on specific Unreal Engine concepts. + +* πŸ“½https://www.youtube.com/channel/UCz-eYJAUgSE-mqzKtit7m9g[Tinkr Academy/Virtus Learning Hub] + YouTube channel with beginner-focused general Unreal tutorials and walkthroughs. + +// This appears to be paid only now +// * http://academy.unrealengine.com/[Unreal Engine Academy] +// A neat learning platform made by Epic Games for learning Unreal Engine. diff --git a/modules/ROOT/pages/Development/index.adoc b/modules/ROOT/pages/Development/index.adoc index 2f416ec6..ddd51a7a 100644 --- a/modules/ROOT/pages/Development/index.adoc +++ b/modules/ROOT/pages/Development/index.adoc @@ -2,29 +2,13 @@ If you'd like to make your own mod, this section of the docs is for you! -Here you can find information regarding making mods and getting your development environment up and running. -Check out the subcategories on the left to get started. - If you're just looking to play Satisfactory with mods, check out how to install mods xref:index.adoc#_for_users[here] instead. -== Resources - -Below is a list of some good resources about making mods for Satisfactory, Unreal Engine, {cpp} and 3D Modeling. Please contact us if you know of other resources that should be added to this list. - -- https://www.youtube.com/channel/UCOVfF7PfLbRdVEm0hONTrNQ[Mathew Wadstein] -+ -A good YouTube Channel showing a more in-depth look at features of Unreal Engine (BP only). -- https://www.youtube.com/c/AlexForsythe[Alex Forsythe] -+ -A YouTube Channel that covers Unreal concepts (both BP and {cpp}) in detail, including replication. -- https://www.youtube.com/channel/UCz-eYJAUgSE-mqzKtit7m9g[Virtus Learning Hub] -+ -A "general" tutorial series channel for UE game development (also covers some {cpp}) -- http://academy.unrealengine.com/[Unreal Engine Academy] -+ -A neat learning platform made by Epic Games for learning Unreal Engine. - -=== {cpp}-specific +Here you can find information regarding making mods and getting your development environment up and running. +Check out the subcategories on the left to get started. -- link:https://dev.epicgames.com/documentation/en-us/unreal-engine/programming-with-cplusplus-in-unreal-engine?application_version=5.3[Unreal Engine Documentation: Programming with {cpp}] -- link:https://dev.epicgames.com/documentation/en-us/unreal-engine/epic-cplusplus-coding-standard-for-unreal-engine?application_version=5.3[Unreal Engine Documentation: Coding Standard] +==== +If you're interested in learning more than what these docs have to offer, +be sure to check out the +xref:Development/UnrealEngine/UnrealLearningResources.adoc[Unreal Learning Resources] page. +==== From ec0fca66cbf0f4ab389dd5a03349ab17ed553bdb Mon Sep 17 00:00:00 2001 From: Rob B Date: Sat, 17 Jan 2026 16:07:15 -0500 Subject: [PATCH 04/13] Directions on how to get VS2022 instead of 2026 --- cspell.json | 1 + .../BeginnersGuide/dependencies.adoc | 49 ++++++++++++++++--- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/cspell.json b/cspell.json index 772841cb..2afad085 100644 --- a/cspell.json +++ b/cspell.json @@ -10,6 +10,7 @@ "adoc", "afgitemdescriptor", "alpak", + "Alpaking", "Alpakit", "Anthor", "antora", diff --git a/modules/ROOT/pages/Development/BeginnersGuide/dependencies.adoc b/modules/ROOT/pages/Development/BeginnersGuide/dependencies.adoc index 91078b45..aaf76818 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/dependencies.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/dependencies.adoc @@ -38,12 +38,32 @@ Launch the game at least once to ensure all files get set up correctly. == Visual Studio -Visit the https://visualstudio.microsoft.com/downloads/[Microsoft Visual Studio downloads page] -and select the button for Visual Studio 2022 Community, which is free of charge. +// Visit the https://visualstudio.microsoft.com/downloads/[Microsoft Visual Studio downloads page] +// and select the button for Visual Studio 2022 Community, which is free of charge. + +Unreal Engine's build tools use MSVC (Microsoft Visual {cpp}) +and have good integration with the Visual Studio, +a free of charge integrated development environment (IDE). If you already have Visual Studio installed, you'll need to run installer again and follow the steps below to modify your existing installation. +[IMPORTANT] +==== +This version of Satisfactory works best with Visual Studio _2022_, +not the latest release version 2026. + +If you were to proceed with Visual Studio 2026 installed, +you would have to select different Components than the ones we listed here, +and certain editor functionalities like the Create {cpp} Class wizard will not work. + +To download 2022, either click +link:https://aka.ms/vs/17/release/vs_community.exe[here to directly download the Visual Studio 2022 Community installer from Microsoft], +or visit the +link:https://learn.microsoft.com/en-us/visualstudio/releases/2022/release-history#evergreen-bootstrappers[Release and Build History page heading "Evergreen Bootstrappers"] +to download the "Community" channel bootstrapper for Version 17.14 (which is the exact same link we provided above). +==== + After the installer has downloaded, run it and agree to any authorization prompts you receive along the way. Once you are prompted to install Visual Studio 2022 you have two options for selecting the relevant components. @@ -51,13 +71,23 @@ you have two options for selecting the relevant components. [id="ImportConfiguration"] === Option 1: Import an Installer Configuration -If the installer took you directly to the Workflow or Component selection screen -you'll have to use the smaller X button in the top right to close out of that prompt first. +// If the installer took you directly to the Workflow or Component selection screen +// you'll have to use the smaller X button in the top right to close out of that prompt first. -Instead of clicking "Install" next to Visual Studio 2022, -click the 'More' dropdown and select `Import Configuration`. -If the option does not appear, make sure that your existing installation is not "pending" -by allowing it to finish installing. +Because the Visual Studio installer really wants you to install 2026 instead of 2022, +this approach requires you to do a small workaround. + +When the installer first opens, use its default settings to install Visual Studio 2022. +If you were to close out of this prompt, only the option to install 2026 will be provided, +and you'd have to close and reopen the installer to get it again. + +After the installer completes, open it again and use the "More" dropdown on Visual Studio 2022's entry +to select `Import Configuration`. + +// Instead of clicking "Install" next to Visual Studio 2022, +// click the 'More' dropdown and select `Import Configuration`. +// If the option does not appear, make sure that your existing installation is not "pending" +// by allowing it to finish installing. // cspell:ignore vsconfig Download link:{attachmentsdir}/BeginnersGuide/dependencies/SML.vsconfig[this configuration file] @@ -81,6 +111,9 @@ search for and select: - `.NET 6.0 Runtime (Out of support)` - `.NET Framework 4.8.1 SDK` +Note that even though some of these components are marked as "Out of Support", +they are the versions that Satisfactory and Unreal use, so you must use them. + === While Visual Studio Installs Downloading and installing Visual Studio can take a while. From 0a1233629ff36797b69f851e85c8d5108d23aaec Mon Sep 17 00:00:00 2001 From: Rob B Date: Sat, 17 Jan 2026 16:12:34 -0500 Subject: [PATCH 05/13] Mention the importance of when a CDO edit is performed --- .../BeginnersGuide/overwriting.adoc | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/modules/ROOT/pages/Development/BeginnersGuide/overwriting.adoc b/modules/ROOT/pages/Development/BeginnersGuide/overwriting.adoc index 3d0795ca..cf462dbe 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/overwriting.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/overwriting.adoc @@ -46,17 +46,6 @@ To perform a CDO edit, first obtain the class default object of the class you're trying to override then use setter functions or directly modify values of the relevant properties. -Keep in mind that when modifying properties on a CDO, -you're not changing anything on _existing_ object instances - -you're only changing the template. -Depending on what kind of content you are modifying and when your code performs the edit, -some instances may have already been created using the old CDO values. -For example, buildings already placed in the save file load in earlier than some mod code executes. - -Your code may also need to fetch all existing instances of the class -and modify their values too to ensure they match your new desired value. -Performing your CDO modifications earlier in the mod loading process can sometimes remove the need for this extra step. - When performing CDO manipulation, you must keep a reference to the CDO in memory to ensure that Unreal does not garbage collect your patched object (and its descendants) and later load it unmodified from disk, undoing your change. To do this, you need to reference the CDO in a property. @@ -68,6 +57,29 @@ Be mindful when modifying class default objects as you can break other mod and v For safety and troubleshooting reasons, SML's helper function logs a warning when you access a class not owned by your mod. ==== +[id="Cdo_Timing"] +==== Timing + +CDO edits must be performed at the correct time during the game lifecycle +depending on what data they need and what content they are trying to modify. +A CDO edit performed at an inopportune time can appear to work but result in unusual edge case behavior. + +Keep in mind that when modifying properties on a CDO, +you're not changing anything on _existing_ object instances - +you're only changing the template. +Depending on what kind of content you are modifying and when in the game lifecycle your code performs the edit, +some instances may have already been created using the old CDO values. +For example, buildings already placed in the save file load in earlier than some mod code executes. + +Your code may also need to fetch all existing instances of the class +and modify their values too to ensure they match your new desired value. +Performing your CDO modifications earlier in the mod loading process can sometimes remove the need for this extra step. + +For example, if you want control over if a CDO is performed via a xref:Development/ModLoader/SessionSettings.adoc[Session Setting], +you must perform the edit after that data is available, such as in a xref:Development/ModLoader/ModModules.adoc[Game World Module]. +But that's after buildings that exist in the save file have already been created, +so you may need to fetch and modify those instances too. + [id="CdoLimitations"] === Understanding the Limits of CDO Edits @@ -98,7 +110,7 @@ Set the property's value to be the CDO before manipulating the object. + If you are modifying multiple CDOs, you can make the property an array of objects instead, and add each CDO to the array. ==== -Check out ExampleMod's `SubGameWorld_ExampleMod_SchematicCdoEdit` for a code example. +Check out ExampleMod's `SubInstance_ExampleMod_SchematicCdoEdit` for a code example. ==== [id="CDO_Cpp"] From 56518fac209e0062683d5de7702cb673b97d6cc4 Mon Sep 17 00:00:00 2001 From: Rob B Date: Sat, 17 Jan 2026 16:12:40 -0500 Subject: [PATCH 06/13] Formatting --- .../BeginnersGuide/SimpleMod/item.adoc | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/item.adoc b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/item.adoc index 34d8fb52..4730838f 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/item.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/item.adoc @@ -6,7 +6,7 @@ It will look like a flatscreen television. == Creating a Folder for our Item -Items (and fluids) in Satisfactory are described by +Items (and fluids) in Satisfactory are defined by xref:/Development/Satisfactory/Inventory.adoc#_item_descriptor_ufgitemdescriptor[FGItemDescriptor]s, which contain information on their appearance and properties. They often also come with textures (to define their icons), meshes, and materials (to define their in-world appearance). @@ -42,13 +42,13 @@ You can hover over the left side of a field to get a tooltip describing its purp M Display Name:: The item's name in game, which appears in its tooltip and what it is called in the Codex. {blank} + - We'll set this to "Doc Item". + We'll set this to `Doc Item`. * {blank} + M Description:: A description of the item, which appears in its tooltip and the Codex. {blank} + - In our case, we can use the text "This is the starter item of the Doc mod." + In our case, we can use the text `This is the starter item of the Doc mod.` * {blank} + M Abbreviated Display Name:: @@ -58,7 +58,7 @@ M Abbreviated Display Name:: In the base game, this is usually only set for items that are difficult to distinguish, for example, raw ores and ingots. {blank} + - We can leave this blank, or use "DocI". + We can leave this blank, or use `DocI`. * {blank} + M Stack Size:: @@ -88,7 +88,7 @@ M Energy Value:: You can find the fuel values of vanilla items on the https://satisfactory.wiki.gg/wiki/Category:Fuels[wiki]. Note that if you want your item to qualify as a biofuel for the Biomass Burner, you should subclass `FGItemDescriptorBiomass` instead. {blank} + - Our Doc Item won't be a fuel item, so it shouldn't be able to get burned in any generators, so we'll use 0.0 for that value. + Our Doc Item won't be a fuel item, so it shouldn't be able to get burned in any generators, so we'll use `0.0` for that value. * {blank} + M Radioactive Decay:: @@ -96,13 +96,13 @@ M Radioactive Decay:: The editor tooltip for this field is incorrect - values can seemingly be any value greater than 0. For example, Plutonium Waste (most intense in Vanilla) uses a value of 200, and Encased Uranium Cell (least intense) uses 0.5. {blank} + - We'll leave this at 0 for safety while testing our mod. + We'll leave this at `0` for safety while testing our mod. * {blank} + M Form:: Defines the type of this item: Invalid, Solid, Liquid, Gas, or Heat {blank} + - Our new item should be a Solid for ease of testing. + Our new item should be a `Solid` for ease of testing. [WARNING] ==== @@ -150,7 +150,7 @@ M Small Icon:: // Links to GH hosted image because cloudflare serves it as a webp -> can't be imported to Unreal We have an image ready for use link:https://raw.githubusercontent.com/satisfactorymodding/Documentation/master/modules/ROOT/attachments/BeginnersGuide/simpleMod/Icon_DocItem.png[here]. - You can import it in the Content Browser pane via `Add/Import > Import to...`. + You can import it via the Content Browser right click menu, or via the `Import` button in the Content Browser header. * {blank} + M Big Icon:: @@ -209,7 +209,7 @@ The process of importing meshes and textures has a couple extra details that we === Importing the Mesh -First, import the mesh (.fbx file) to your DocItem folder via `Add/Import > Import to...`. +First, import the mesh (`.fbx` file) to your DocItem folder via one of the Content Browser's Import features described earlier. Select just the Mesh, and pay attention on the dialog that pops up. Most of the default settings are fine, but scroll down to the Material section and ensure that: @@ -220,11 +220,11 @@ and ensure that: To finish this dialog, select the `Import` option in the prompt. -You should rename the asset to `SM_DocItem` to follow Coffee Stain's naming scheme. -SM stands for Static Mesh. - image:BeginnersGuide/simpleMod/NoMaterialImport.png[image] +Next, rename the created asset to `SM_DocItem` to follow Coffee Stain's naming scheme. +SM stands for Static Mesh. + === Creating the Material Instance We chose to not import any textures with the model because we want to leverage the Unreal @@ -295,7 +295,8 @@ In the "Global Static Switch Parameter Values" section, check the `bUseLegacyPai In the bottom right corner of the preview viewport, click on the flat panel icon to preview the material on a plane instead of a sphere. If you've done everything correctly, it should look like the below image. -Note that no warnings appear in the top left of the viewport. +Note that no warnings appear in the top left of the viewport, +just some statistics about the material. Afterwards, save the asset. image:BeginnersGuide/simpleMod/MaterialInstanceSettings.png[image] From f7176f7fb7b21b1a0eab93c805d6a7c135224805 Mon Sep 17 00:00:00 2001 From: Rob B Date: Sat, 17 Jan 2026 16:16:46 -0500 Subject: [PATCH 07/13] Fix formatting --- .../pages/Development/UnrealEngine/UnrealLearningResources.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ROOT/pages/Development/UnrealEngine/UnrealLearningResources.adoc b/modules/ROOT/pages/Development/UnrealEngine/UnrealLearningResources.adoc index 0618b4cf..391202f3 100644 --- a/modules/ROOT/pages/Development/UnrealEngine/UnrealLearningResources.adoc +++ b/modules/ROOT/pages/Development/UnrealEngine/UnrealLearningResources.adoc @@ -113,7 +113,7 @@ include::./../_includes/editor-familiarize-list.adoc[] * πŸ“½ https://www.youtube.com/channel/UCOVfF7PfLbRdVEm0hONTrNQ[Mathew Wadstein] - YouTube channel with short, focused videos on specific Unreal Engine concepts. -* πŸ“½https://www.youtube.com/channel/UCz-eYJAUgSE-mqzKtit7m9g[Tinkr Academy/Virtus Learning Hub] +* πŸ“½ https://www.youtube.com/channel/UCz-eYJAUgSE-mqzKtit7m9g[Tinkr Academy/Virtus Learning Hub] YouTube channel with beginner-focused general Unreal tutorials and walkthroughs. // This appears to be paid only now From 0c94d4983a750594d49b0d913f2ab79a72fe11b8 Mon Sep 17 00:00:00 2001 From: Rob B Date: Sat, 17 Jan 2026 18:14:53 -0500 Subject: [PATCH 08/13] Clean up outdated suggestions to use the SCS Hook system, instead use Actor Mixins --- modules/ROOT/pages/CommunityResources/AcronymVault.adoc | 4 ++-- modules/ROOT/pages/Development/ModLoader/ActorMixins.adoc | 4 +++- .../pages/Development/Satisfactory/EnhancedInputSystem.adoc | 4 ++-- modules/ROOT/pages/Development/Satisfactory/Savegame.adoc | 3 ++- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/modules/ROOT/pages/CommunityResources/AcronymVault.adoc b/modules/ROOT/pages/CommunityResources/AcronymVault.adoc index cf2a2ee8..8164406e 100644 --- a/modules/ROOT/pages/CommunityResources/AcronymVault.adoc +++ b/modules/ROOT/pages/CommunityResources/AcronymVault.adoc @@ -103,9 +103,9 @@ https://github.com/satisfactorymodding/SMEI[here]. Simple Construction Script is Unreal Engine's solution for building actor component trees. You can find it in the top left corner of the blueprint editor, looking like a tree of the components. -SML provides hooks for adding modded components to the Simple Construction Scripts of the base game blueprints. +SML provides hooks for adding modded components to the construction scripts of the base game blueprints. Documentation on the hooking system can be found -xref:Development/ModLoader/SimpleConstructionScript.adoc[here]. +xref:Development/ModLoader/ActorMixins.adoc[on the Actor Mixins page]. === Frequently Asked Questions (FAQ) diff --git a/modules/ROOT/pages/Development/ModLoader/ActorMixins.adoc b/modules/ROOT/pages/Development/ModLoader/ActorMixins.adoc index c719a35a..8ffb8b0c 100644 --- a/modules/ROOT/pages/Development/ModLoader/ActorMixins.adoc +++ b/modules/ROOT/pages/Development/ModLoader/ActorMixins.adoc @@ -1,11 +1,13 @@ = Actor Mixins Actor Mixins are an extension of the xref:Development/ModLoader/BlueprintHooks.adoc[Blueprint Hook System] -designed to allow adding extra functionality to Unreal Actors. +designed to allow adding extra functionality or components to existing Unreal Actors your mod doesn't own. After selecting an actor class to base the Mixin off of, you are presented with a blueprint that looks as if it was the actor itself. From there you can add actor components or set up Blueprint Hooks to call functions you define. +Actor Mixins replaced the previous xref:Development/ModLoader/SimpleConstructionScript.adoc[SCS Hooks] system in SML 3.11. + == Creating an Actor Mixin Creating a Mixin is similar to creating a Blueprint Hook. diff --git a/modules/ROOT/pages/Development/Satisfactory/EnhancedInputSystem.adoc b/modules/ROOT/pages/Development/Satisfactory/EnhancedInputSystem.adoc index 33b71d00..ad4170fe 100644 --- a/modules/ROOT/pages/Development/Satisfactory/EnhancedInputSystem.adoc +++ b/modules/ROOT/pages/Development/Satisfactory/EnhancedInputSystem.adoc @@ -136,8 +136,8 @@ If you want the context to be available: It is suggested that your code respond to input actions in either an actor (such as a xref:Development/ModLoader/Subsystems.adoc[Subsystems]), a widget, -or a custom actor component on the player character or controller attached -via xref:Development/ModLoader/SimpleConstructionScript.adoc[Simple Construction Script (SCS) Hooks]. +or a custom actor component on the player character or controller attached via +xref:Development/ModLoader/ActorMixins.adoc[Actor Mixins]. On some actors, such as Subsystems, you may need to call Player Controller instance > EnableInput for them to process user input. diff --git a/modules/ROOT/pages/Development/Satisfactory/Savegame.adoc b/modules/ROOT/pages/Development/Satisfactory/Savegame.adoc index b37f80e9..0daba2d5 100644 --- a/modules/ROOT/pages/Development/Satisfactory/Savegame.adoc +++ b/modules/ROOT/pages/Development/Satisfactory/Savegame.adoc @@ -109,7 +109,8 @@ when the save state gets stored or loaded. You may encounter a situation where you want to save data per-player in a multiplayer game without it being tied to any tangible game object like a building or equipment item. The best way to implement this is with -xref:Development/ModLoader/SimpleConstructionScript.adoc[Simple Construction Script (SCS) Hooks]. +xref:Development/ModLoader/ActorMixins.adoc[Actor Mixins] to attach a component to the player's PlayerState. +Check out the Example Mod's `ExampleModPlayerDataComponent` for an example of how to do this. == Where Modded Save Content Ends Up From 25be3313d6191a359edc90637b6f47576b4ed197 Mon Sep 17 00:00:00 2001 From: Rob B Date: Sat, 17 Jan 2026 18:49:35 -0500 Subject: [PATCH 09/13] Add learning resource on the Blueprint Editor Graph --- .../SimpleMod/machines/SimpleMachine.adoc | 29 +++++++++++++++---- .../UnrealEngine/UnrealLearningResources.adoc | 11 ++++--- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/machines/SimpleMachine.adoc b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/machines/SimpleMachine.adoc index 6b5d0b3f..683a4760 100644 --- a/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/machines/SimpleMachine.adoc +++ b/modules/ROOT/pages/Development/BeginnersGuide/SimpleMod/machines/SimpleMachine.adoc @@ -54,22 +54,39 @@ Second, add a xref:Development/Satisfactory/PowerNetwork.adoc[FGPowerInfo] compo If we had used one of the other types of base machine classes, these may have existed automatically, but since we chose FGBuildable, we need to add them ourselves. -== Init logic +[id="Code_BeginPlay"] +== Initialization Logic in Begin Play -The init logic happens in the `BeginPlay` event and initializes the base state of the machine (also based on the save information). -There is not that much we need to do here. -The only thing we need to do is to set the PowerInfo on the PowerConnection and configure the target consumption of the `FGPowerInfo` to something like 1.0. -This controls how much power in MW the building will use to operate. +The BeginPlay event is fired when the building spawns into the world, be it placed for the first time or loaded from the save file. + +For our counter building, it needs to: + +- Set what PowerInfo component the PowerConnection component should use +- Set how much power, in MW, the building should consume to operate. + This is done by using Set Target Consumption on the FGPowerInfo to some positive number. + +We don't need to adjust anything else here +because the building's default values will already have been set from the blueprint class's Class Defaults. .Logic in the Event Graph image::BeginnersGuide/simpleMod/machines/SimpleMachine_Init.jpg[image] +[NOTE] +===== +Make sure to check out the +xref:Development/UnrealEngine/UnrealLearningResources.adoc#UnrealBlueprint[Unreal Learning Resources section: "Blueprint Scripting"] +for more information on how to write blueprint code. + +Of particular note is the "Blueprint Editor: Graph Editor" document linked from there. +===== + +[id="Code_Grab"] == Grab Logic [WARNING] ==== It is generally unwise to implement conveyor grab logic in Unreal Blueprint code as the tutorial does here. -If you plan for your buildings to be used in any substantive quantity, +If you plan for your buildings to be used in any substantial quantity, you should implement this logic in C++ to avoid the performance overhead of Blueprint. This tutorial will eventuallyβ„’ be replaced with another one following better practices. ==== diff --git a/modules/ROOT/pages/Development/UnrealEngine/UnrealLearningResources.adoc b/modules/ROOT/pages/Development/UnrealEngine/UnrealLearningResources.adoc index 391202f3..7e04a248 100644 --- a/modules/ROOT/pages/Development/UnrealEngine/UnrealLearningResources.adoc +++ b/modules/ROOT/pages/Development/UnrealEngine/UnrealLearningResources.adoc @@ -48,11 +48,14 @@ include::./../_includes/editor-familiarize-list.adoc[] A high-level overview of what Blueprints are and what they can do. Links to other pages with more information about specific features. - ** πŸ“– https://dev.epicgames.com/documentation/en-us/unreal-engine/basic-scripting-with-blueprints-in-unreal-engine?application_version=5.3[Basic Scripting with Blueprints] - - Brief introduction to blueprint variables and event graphs + ** πŸ“– https://dev.epicgames.com/documentation/en-us/unreal-engine/basic-scripting-with-blueprints-in-unreal-engine?application_version=5.3[Basic Scripting with Blueprints] - + Brief introduction to blueprint variables and event graphs - ** πŸ“– https://dev.epicgames.com/documentation/en-us/unreal-engine/overview-of-blueprints-visual-scripting-in-unreal-engine?application_version=5.3[Blueprints Visual Scripting Overview] - - Breaks down the anatomy of a Blueprint and the different types of Blueprints available. + ** πŸ“– https://dev.epicgames.com/documentation/en-us/unreal-engine/overview-of-blueprints-visual-scripting-in-unreal-engine?application_version=5.3[Blueprints Visual Scripting Overview] - + Breaks down the anatomy of a Blueprint and the different types of Blueprints available. + + ** β­πŸ“– https://dev.epicgames.com/documentation/en-us/unreal-engine/graph-editor-for-the-blueprints-visual-scripting-editor-in-unreal-engine?application_version=5.3[Blueprint Editor: Graph Editor] - + Information on the Blueprint graph editor interface and the available interactions/keybinds. * β­πŸ“– https://dev.epicgames.com/documentation/en-us/unreal-engine/blueprint-tutorials-in-unreal-engine?application_version=5.3[Blueprint Tutorials] - Links to walkthroughs of accomplishing various tasks in the Blueprint scripting editor. From 34c35e2b697fdf3430b286a86c45e5f201cd23cf Mon Sep 17 00:00:00 2001 From: Rob B Date: Sat, 17 Jan 2026 18:50:40 -0500 Subject: [PATCH 10/13] Link to UE input listener docs --- .../Satisfactory/EnhancedInputSystem.adoc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/modules/ROOT/pages/Development/Satisfactory/EnhancedInputSystem.adoc b/modules/ROOT/pages/Development/Satisfactory/EnhancedInputSystem.adoc index ad4170fe..fcbf3ebd 100644 --- a/modules/ROOT/pages/Development/Satisfactory/EnhancedInputSystem.adoc +++ b/modules/ROOT/pages/Development/Satisfactory/EnhancedInputSystem.adoc @@ -140,20 +140,27 @@ or a custom actor component on the player character or controller attached via xref:Development/ModLoader/ActorMixins.adoc[Actor Mixins]. On some actors, such as Subsystems, -you may need to call Player Controller instance > EnableInput for them to process user input. +you may need to add them to the input processing stack by calling (Player Controller instance) > `EnableInput` +for them to actually receive user input events. [id="RespondInputActionsBlueprint"] === Blueprint +An example of this can be found in `ExampleSubsystem` in the ExampleMod. + In order to create the Blueprint event node for responding to an input action, you may have to turn off "Context Sensitive" in the blueprint action selector for it to appear in the search results. -Type the name of the input action to create the Event node for responding to it. +Type the name of the input action asset to create an Event node for responding to it. +For example, if your input action asset is named `IA_TriggerExampleMessage_Play`, +then the node's name in the search will be (Event Node icon) `IA_TriggerExampleMessage_Play`, +and the created node will have the header text `EnhancedInputAction IA_TriggerExampleMessage_Play` [id="RespondInputActionsCpp"] === {cpp} -The Unreal documentation explains how to handle responding to Input Actions in {cpp}, +The https://dev.epicgames.com/documentation/en-us/unreal-engine/enhanced-input-in-unreal-engine?application_version=5.3#addinginputlisteners[Unreal documentation] +explains how to handle responding to Input Actions in {cpp}, except it assumes we have control over the player controller, which modders do not. Thankfully Coffee Stain has created a delegate `AFGCharacterPlayer::OnPlayerInputInitialized` which mods can bind to. From fe95c77f0a2aabbf3a83d6e0dcb9345a1e05c4e8 Mon Sep 17 00:00:00 2001 From: Rob B Date: Sun, 25 Jan 2026 16:51:02 -0500 Subject: [PATCH 11/13] Add instructions on marking the AppImage as executable on linux --- antora.yml | 2 ++ modules/ROOT/pages/ForUsers/SatisfactoryModManager.adoc | 8 +++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/antora.yml b/antora.yml index 233b1ff3..98ef38fd 100644 --- a/antora.yml +++ b/antora.yml @@ -10,6 +10,8 @@ asciidoc: attributes: # Increase max table of content nesting levels from 2 to 3 https://docs.antora.org/antora/latest/page/page-attributes/#access-attributes-from-ui-template page-toclevels: 3@ + # Non-breaking space to avoid being split across lines + non-breaking-space: Β  # Zero-width joiner (U+200D) to avoid being split across lines zero-width-join: ‍ # Uses zero-width joiner (U+200D) to avoid being split across lines diff --git a/modules/ROOT/pages/ForUsers/SatisfactoryModManager.adoc b/modules/ROOT/pages/ForUsers/SatisfactoryModManager.adoc index d8d33bc4..c123d492 100644 --- a/modules/ROOT/pages/ForUsers/SatisfactoryModManager.adoc +++ b/modules/ROOT/pages/ForUsers/SatisfactoryModManager.adoc @@ -81,8 +81,9 @@ for the rest of the steps. Linux builds of the mod manager can be found on the https://github.com/satisfactorymodding/SatisfactoryModManager/releases[GitHub releases page]. -The GitHub page also offers a standalone version -but you must have `+webkit2gtk-4.1+` installed to use it. +* If you download the AppImage version, you may need to mark it as executable (via a GUI or `chmod{non-breaking-space}+x{non-breaking-space}filename`) before running it. + +* If you use the standalone version, note that you must have already installed any required packages mentioned on the GitHub releases page. [id="Install_Winget"] === With Winget @@ -100,7 +101,8 @@ Satisfactory does not officially support Mac, but you can use various technologies outside the scope of this guide, such as CrossOver, to get it running. -Satisfactory Mod Manager itself can run natively on Macs without any additional software. +Satisfactory Mod Manager itself can run natively on Macs without any additional software +by downloading the MacOS build from the https://github.com/satisfactorymodding/SatisfactoryModManager/releases[GitHub releases page]. == Managing Game Installations From 846e01e15d2047ccb3661e21130133b52380ae3e Mon Sep 17 00:00:00 2001 From: Rob B Date: Sun, 25 Jan 2026 19:34:13 -0500 Subject: [PATCH 12/13] Reword "load a save without mods" FAQ entry, mention rare save corruption --- modules/ROOT/pages/faq.adoc | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/modules/ROOT/pages/faq.adoc b/modules/ROOT/pages/faq.adoc index 589d2e47..5e511f86 100644 --- a/modules/ROOT/pages/faq.adoc +++ b/modules/ROOT/pages/faq.adoc @@ -234,7 +234,7 @@ Note that the base game's https://satisfactory.wiki.gg/wiki/Advanced_Game_Settin The program's window somehow got offscreen. We're still not sure what causes this. To fix it you need to edit the `%appdata%\SatisfactoryModManager\settings.json` file -and within the `windowLocation` property, set the `x` and `y` to 0 to bring the window back on the screen. +and within the `windowPosition` property, set the `x` and `y` to 0 to bring the window back on the screen. Restart SMM after you do that. @@ -248,15 +248,22 @@ or ask nicely in the `#help-using-mods` discord channel. == What happens if I open up a save without mods installed? If you were to load up a save file without mods, -all of the content from those mods will simply vanish from the save, -and the game should load just fine with no modded content. - -Keep in mind that after saving the game after loading it with no mods, -the modded content would be permanently gone from that point on. -So, if you want to keep modded content, don't play in that save without your mods installed! - -If you ever load a save without mods by accident, -just quit the game without saving and launch the game with your mods, your content should still be there. +all of the content added by those mods will simply vanish from the save. +The loading process can slow down because the game produces log messages about any missing content it encounters as it skips it. +After that **_your save file will load and be playable as normal in the base game_**, +obviously missing any modded content. + +Note that if you create another save after loading without mods, +the modded content will be lost from that point on. +So, if you want to keep the modded content, don't play in that save without your mods installed! +Simply quit the game without saving, launch the game with your mods, then load the previous save file - modded content will still be there. + +Some mods allow placing, connecting, or configuring base-game content in ways not normally possible, +for example, constructing or repositioning the base-game's buildings. +These effects can persist after the mod is uninstalled. +In exceedingly rare cases, a broken mod of this type could create a damaged save file that causes problems even when loaded in the base game. +We are aware of this happening only twice in all of Satisfactory modding history. +You can repair these rare cases by using a save editor tool linked on link:https://ficsit.app/tools[] to delete any corrupted buildings. == How do I make my own mod? From 76ef65572b9adf443699d65d54e6c1e90d5e4cac Mon Sep 17 00:00:00 2001 From: Rob B Date: Mon, 26 Jan 2026 21:24:28 -0500 Subject: [PATCH 13/13] Add audiokinetic to link checker skip list because it's 403'ing on valid stuff :( --- lychee.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/lychee.toml b/lychee.toml index 13c05c98..eed3c6bb 100644 --- a/lychee.toml +++ b/lychee.toml @@ -38,6 +38,7 @@ exclude = [ "https://dev.epicgames.com/", "^https://www.unrealengine.com/en-US/blog/.*", "^https://www.epicgames.com/help/.*", + "https://www.audiokinetic.com/en/", # Times out despite being valid "https://www.adobe.com/learn/substance-3d-designer/web/the-pbr-guide-part-1", # Pages often time out and Shouldn'tβ„’ ever get deleted anyways