### Example Command for Generating VS Project Files Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/BeginnersGuide/project_setup.html A concrete example of the command-line syntax for generating Visual Studio project files. Remember to modify the paths to match your specific installation and project. ```powershell & "C:\Program Files\Unreal Engine - CSS\Engine\Build\BatchFiles\Build.bat" -projectfiles -project="D:\Git\SatisfactoryModLoader\FactoryGame.uproject" -game -rocket -progress ``` -------------------------------- ### Example Upgrade Hologram Implementation Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/Satisfactory/BuildableHolograms.html A basic C++ example demonstrating the implementation of `GetUpgradedActor` and `TryUpgrade` for a custom hologram, including checks for valid upgrade targets and setting the hologram's transform. ```cpp AActor* AMyModHologram::GetUpgradedActor() const { // return the target actor to hide them ingame! return mUpgradedActor; } bool AMyModHologram::TryUpgrade(const FHitResult& hitResult) { if(hitResult.GetActor()) { const TSubclassOf ActorClass = GetActorClass(); // we check here that we don't try to upgrade the same Actor. the class should be different! if(hitResult.GetActor()->GetClass() != ActorClass) { // IMPORTANT we need to set the location from our hologram to the target Actor SetActorTransform(hitResult.GetActor()->GetActorTransform()); // set the UpgradedActor and return true if it is valid (should be only make sure) mUpgradedActor = hitResult.GetActor(); return mUpgradedActor != nullptr; } } // otherwise the UpgradedActor to nullptr mUpgradedActor = nullptr; return Super::TryUpgrade(hitResult); } ``` -------------------------------- ### Install Prerequisites on Fedora Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/Linux/LinuxSetup.html Installs necessary packages for the Satisfactory modding environment on Fedora-based Linux distributions using dnf. ```bash dnf install git msitools tar zstd dos2unix wine ``` -------------------------------- ### Install MSVC using msvc-wine Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/Linux/LinuxSetup.html Clone the msvc-wine repository and use its scripts to download and install the correct MSVC version for the Unreal Engine editor. Ensure you replace `` with your desired installation path. ```bash git clone --branch ue-patches https://github.com/mircearoata/msvc-wine.git cd msvc-wine ./vsdownload.py --accept-license --dest "" --msvc-version "17.8" --sdk-version "10.0.22621" --channel "release.ltsc.17.8" ./install.sh "" ``` -------------------------------- ### Example Blueprint Only Mod .uplugin Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/BeginnersGuide/ReleaseMod.html Use this .uplugin configuration for mods that contain only Blueprint assets and logic. ```json { "FileVersion": 3, "Version": 6, "SemVersion": "6.2.1", "VersionName": "6.2.1", "FriendlyName": "Example Blueprint Only Mod", "Description": "An example of a .uplugin for a mod that contains only Blueprint content", "Category": "Modding", "CreatedBy": "Satisfactory Modding Team", "CreatedByURL": "https://github.com/satisfactorymodding/SatisfactoryModLoader", "DocsURL": "https://docs.ficsit.app", "MarketplaceURL": "", "SupportURL": "", "CanContainContent": true, "IsBetaVersion": false, "IsExperimentalVersion": false, "Installed": false, "LocalizationTargets": [ { "Name": "ExampleMod", "LoadingPolicy": "Always" } ], "Plugins": [ { "Name": "SML", "Enabled": true, "SemVersion": "^3.9.0" } ], "GameVersion": ">=365306" } ``` -------------------------------- ### Register Unreal Engine Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/Linux/LinuxSetup.html Register the installed Unreal Engine with your system. Replace `` with the absolute path to your engine installation directory. This command is necessary for the Unreal Version Selector to recognize the engine. ```bash /Engine/Binaries/Linux/UnrealVersionSelector -register -unattended ``` -------------------------------- ### Find and Load UClass Example Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/Cpp/GettingBpData.html Demonstrates how to find a UClass by its path and name, with a fallback to loading it if FindObject fails. This method is brittle if assets are moved. ```cpp UClass* Class = FindObject(FindPackage(nullptr, TEXT("/Game/")), TEXT("BP_UnlockInfoOnly_C"), false); if (!Class) { Class = LoadObject(nullptr, TEXT("/Game/FactoryGame/Unlocks/BP_UnlockInfoOnly.BP_UnlockInfoOnly_C")); if (!Class) { UE_LOG(LogContentLib, Fatal, TEXT("CL: Couldn't find BP_UnlockInfoOnly_C wanting to Add to %s"), *Schematic->GetName()) } } ``` -------------------------------- ### Navigate to Game Directory Source: https://docs.ficsit.app/satisfactory-modding/latest/CommunityResources/AssetToolkit.html Use the `cd` command in Powershell to navigate to your Satisfactory game installation directory. This is a prerequisite for running the asset dumping command. ```powershell cd C:\EpicGamesGames\SatisfactoryEarlyAccess ``` -------------------------------- ### Open Wwise Authoring Application on Linux Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/Linux/LinuxSetup.html Launches the Wwise Authoring application using Wine. This command assumes Wwise is installed in the default location managed by wwise-cli. ```bash wine ~/.cache/wwise-cli/wwise/2023.1.14.8770/Authoring/x64/Release/bin/Wwise.exe ``` -------------------------------- ### Example Error Message: Failed to load script DLL Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/BeginnersGuide/SimpleMod/gameworldmodule.html This error occurs when the system treats a downloaded file as unsafe. Unblock the DLL file to resolve this issue. ```text UATHelper: Package Mod Task (Windows): Parsing command line: -ScriptsForProject=E:/SatisfactoryModLoader-master/FactoryGame.uproject PackagePlugin -Project=E:/SatisfactoryModLoader-master/FactoryGame.uproject -PluginName=DocMod -GameDir=E:/SatisfactoryEarlyAccess -CopyToGameDir UATHelper: Package Mod Task (Windows): ERROR: Failed to load script DLL: E:\SatisfactoryModLoader-master\Build\Alpakit.Automation\Scripts\Alpakit.Automation.dll: Could not load file or assembly 'Alpakit.Automation, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Operation is not supported. (Exception from HRESULT: 0x8013151 5) ``` -------------------------------- ### Accessor Usage Example Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/ModLoader/AccessTransformers.html Demonstrates how to use the generated accessor methods to retrieve a property's value. ```cpp // Instead of this ... SuitCostToUse = Parent->EquipmentParent->mCostToUse; // ... use this SuitCostToUse = Parent->EquipmentParent.GetmCostToUse(); ``` -------------------------------- ### Run wwiser Interface Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/ExtractGameFiles.html Open the wwiser graphical interface to load and process game banks. Ensure Python is installed and wwiser.pyz and wwnames.db3 are in the same directory. ```bash python .\wwiser.py ``` -------------------------------- ### Core Redirect Configuration Example Source: https://docs.ficsit.app/satisfactory-modding/latest/ForUsers/CoreRedirectMigration.html Use this template to define class redirects in your Engine.ini file. Replace placeholder paths with the actual asset paths for the old and new content. ```ini [CoreRedirects] +ClassRedirects=(OldName="YOUR_OLD_PATH_HERE",NewName="YOUR_NEW_PATH_HERE") ``` -------------------------------- ### Reacting to Build Mode Changes (C++) Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/Satisfactory/BuildableHolograms.html Implements logic that executes when a build mode is changed. This example resets a float variable when a specific build mode is active. ```cpp void AMyModHologram::OnBuildModeChanged() { Super::OnBuildModeChanged(); if(IsCurrentBuildMode(MyBuildMode)) { MyFloat = 0.0f; } } ``` -------------------------------- ### Create Abstract Instance at Runtime Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/Satisfactory/AbstractInstance.html This example demonstrates how to create a new abstract instance at runtime using a provided static mesh and transform. It prepares the InstanceData and calls the static function to set up the instance, storing the handle for later management. ```cpp static void SetInstanceFromDataStatic( AActor* OwnerActor, const FTransform& ActorTransform, const FInstanceData& InstanceData, FInstanceHandle* &OutHandle, bool bInitializeHidden = false ); AMyModActor::CreateInstanceFromMesh(UStaticMesh* Mesh) { // Prepare the InstanceData with a given Mesh at the relative Transform 0. FInstanceData InstanceData; InstanceData.StaticMesh = Mesh; InstanceData.Mobility = EComponentMobility::Static; InstanceData.RelativeTransform = FTransform(); InstanceData.NumCustomDataFloats= 20; FInstanceHandle* Handle; AAbstractInstanceManager::SetInstanceFromDataStatic(this, GetActorTransform(), InstanceData, Handle); // You should add this Handle to the array so we can destroy them if the actor is destroyed (for example, dismantled). mInstanceHandles.Add(Handle); } ``` -------------------------------- ### Get Key Name For Action Simple Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/Satisfactory/EnhancedInputSystem.html Returns a text representation of an input action, given its player-mappable key settings Name. For example, 'PlayerActions_Use' might return 'E'. ```blueprint Get Key Name For Action Simple ``` -------------------------------- ### Download Wwise SDK using wwise-cli Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/Linux/LinuxSetup.html Use this command to download the required version of Wwise SDK and Authoring tools. Ensure wwise-cli is executable. ```bash ./wwise-cli download --sdk-version "2023.1.14.8770" --filter Packages=SDK --filter DeploymentPlatforms=Windows_vc160 --filter DeploymentPlatforms=Windows_vc170 --filter DeploymentPlatforms=Linux --filter DeploymentPlatforms= --filter Packages=Authoring ``` -------------------------------- ### Install Satisfactory Mod Manager via Winget Source: https://docs.ficsit.app/satisfactory-modding/latest/ForUsers/SatisfactoryModManager.html Use this command to install the Satisfactory Mod Manager if you have winget installed. This is a convenient method for Windows users. ```powershell winget install SatisfactoryModding.SatisfactoryModManager ``` -------------------------------- ### Satisfactory Window and Resolution Arguments Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/TestingResources.html Demonstrates how to use Unreal Engine command-line arguments to control window position and resolution for Satisfactory instances. Useful for multi-monitor setups and optimizing screen space. ```powershell $Args1 = "-EpicPortal", "-NoSteamClient", '-Username="'+$Username1+'"', "-WinX=0", "-WinY=32", "ResX=960", "ResY=1040" $Args2 = "-EpicPortal", "-NoSteamClient", '-Username="'+$Username2+'"', "-WinX=960", "-WinY=32", "ResX=960", "ResY=1040" ``` -------------------------------- ### Minimum Launch Arguments for Dedicated Server Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/TestingResources.html These are the minimum suggested launch arguments for running a dedicated server locally. Ensure you have the game's save folder configured correctly. ```bash .\FactoryServer.exe -log -EpicPortal -NoSteamClient ``` -------------------------------- ### Example Message Data Asset Name Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/Satisfactory/AdaMessages.html An example of a correctly named ADA message data asset following the suggested convention. ```text MSG_ExampleMod_Tier1-ExampleMilestone ``` -------------------------------- ### Registering Unreal Engine Install Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/BeginnersGuide/project_setup.html Use this script to add the correct engine version to the Windows registry if it's missing or corrupted. This is typically found in the engine's install folder. ```batch SetupScripts\Register.bat ``` -------------------------------- ### Prepare Launch Arguments Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/TestingResources.html Constructs the base arguments for launching the game, including options for waiting for the debugger, disabling the exception handler, and loading the latest save file for multiplayer or single-player sessions. It validates prerequisites for 'clientAutoJoin'. ```powershell function PrepareArgs([string]$baseArgs, [switch]$applyFirstInstanceOnlyArguments, [System.Collections.Hashtable]$pathInfo) { $buildArgs = "$baseArgs" if ($clientAutoJoin -and (-not $multiplayer -or -not $loadLatestSave)) { Write-Error "clientAutoJoin flag requires multiplayer flag and loadLatestSave flag so there is a running game for the client to join" exit 1 } if ($applyFirstInstanceOnlyArguments) { if ($waitForDebugger) { $buildArgs = "$buildArgs", "-WaitForDebugger" } if ($noExceptionHandler) { $buildArgs = "$buildArgs", "-NoExceptionHandler" } if ($loadLatestSave) { if ($multiplayer) { # Multiplayer GUID consistency consequence: can't see platform save files. Must be in the `common` subfolder $saveFolderUserId = "common" } else { $saveFolderUserId = $gamePathInfo["savegameSubfolderName"] } if (($saveFolderUserId -eq $null) -or ($saveFolderUserId -eq "UNSET")) { Write-Error "Selected game install is missing 'savegameSubfolderName' data in your script config options. It should be the name of the subfolder within your save directory containing the save files you want to use with -loadLatestSave. Your same file directory was entered as: $SaveFolder" exit 1 } $fullSaveFolder = "$SaveFolder\$saveFolderUserId" # https://stackoverflow.com/questions/9675658/powershell-get-childitem-most-recent-file-in-directory # Steam keeps a steam_autocloud.vdf file in here that isn't a savegame $latestSaveFile = (Get-ChildItem $fullSaveFolder -Attributes !Directory -Filter *.sav | sort LastWriteTime | select -last 1) $latestSaveFileName = $latestSaveFile.Basename ``` -------------------------------- ### Get Recipe Info Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/ModLoader/Registry.html Returns the registration information for a given recipe. ```APIDOC ## GetRecipeInfo ### Description Returns the registration info of the given recipe. ### Signature `FGameObjectRegistration GetRecipeInfo(TSubclassOf Recipe)` ``` -------------------------------- ### Integrate Wwise into Unreal Engine Project Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/Linux/LinuxSetup.html Integrates the downloaded Wwise SDK into your Unreal Engine project. Replace `` with your project's path. ```bash ./wwise-cli integrate-ue --integration-version "2023.1.14.3555" --project "/FactoryGame.uproject" ``` -------------------------------- ### Get Registered Recipes Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/ModLoader/Registry.html Returns a list of all currently registered recipes. ```APIDOC ## GetRegisteredRecipes ### Description Returns a list of all currently registered recipes. ### Signature `TArray GetRegisteredRecipes()` ``` -------------------------------- ### Get Registered Schematics Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/ModLoader/Registry.html Returns a list of all currently registered schematics. ```APIDOC ## GetRegisteredSchematics ### Description Returns a list of all currently registered schematics. ### Signature `TArray GetRegisteredSchematics()` ``` -------------------------------- ### GetSMLVersion Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/ModLoader/BlueprintInterface.html Retrieves the version of the currently installed Satisfactory Mod Loader (SML). ```APIDOC ## GetSMLVersion ### Description This function allows you to retrieve the version of the currently installed mod loader. ### Signature `Version GetSMLVersion()` ``` -------------------------------- ### Example C++ and Blueprint Mod .uplugin Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/BeginnersGuide/ReleaseMod.html Configure your .uplugin file for mods that include both C++ modules and Blueprint assets. Ensure your C++ module is listed under the 'Modules' section. ```json { "FileVersion": 3, "Version": 6, "VersionName": "6.2.1", "SemVersion": "6.2.1", "FriendlyName": "Example Hybrid Mod", "Description": "An example of a .uplugin for a mod that contains both Blueprint content and a C++ module", "Category": "Modding", "CreatedBy": "Satisfactory Modding Team", "CreatedByURL": "https://ficsit.app/", "DocsURL": "https://docs.ficsit.app/", "MarketplaceURL": "", "SupportURL": "", "CanContainContent": true, "IsBetaVersion": false, "IsExperimentalVersion": false, "Installed": false, "Modules": [ { "Name": "ExampleHybridMod", "Type": "Runtime", "LoadingPhase": "PostDefault" } ], "Plugins": [ { "Name": "SML", "SemVersion": "^3.9.0", "Enabled": true }, { "Name": "DependencyMod", "SemVersion": "^1.3.0", "Enabled": true } ], "GameVersion": ">=365306" } ``` -------------------------------- ### Multi-Step Hologram Placement Logic Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/Satisfactory/BuildableHolograms.html Implement multi-step placement for holograms by tracking the current step and returning true when placement is complete. This example uses an integer to track steps for brevity. ```cpp AMyModHologram::iMaxStepCount = 5; void AMyModHologram::DoMultiStepPlacement(bool isInputFromARelease) { myPointArray[iCurrentStep] = HitResult.GetLocation(); iCurrentStep++; return iCurrentStep == iMaxStepCount; } ``` -------------------------------- ### Get Schematic Registration Info Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/ModLoader/Registry.html Returns the registration information for a given schematic. ```APIDOC ## GetSchematicRegistrationInfo ### Description Returns the registration info of the given schematic. ### Signature `FGameObjectRegistration GetSchematicRegistrationInfo(TSubclassOf Schematic)` ``` -------------------------------- ### Get Item Descriptor Info Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/ModLoader/Registry.html Returns the registration information for a given item descriptor. ```APIDOC ## GetItemDescriptorInfo ### Description Returns the registration info of the given item descriptor. ### Signature `FGameObjectRegistration GetItemDescriptorInfo(TSubclassOf ItemDescriptor)` ``` -------------------------------- ### Get Registered Research Trees Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/ModLoader/Registry.html Returns a list of all currently registered research trees. ```APIDOC ## GetRegisteredResearchTrees ### Description Returns a list of all currently registered research trees. ### Signature `TArray GetRegisteredResearchTrees()` ``` -------------------------------- ### Resolve Game Path from Parameters Source: https://docs.ficsit.app/satisfactory-modding/latest/Development/TestingResources.html Determines the game installation path and executable name based on provided launcher, side, and branch parameters. It validates configuration options and creates the Steam app ID file if necessary. ```powershell function ResolveGamePathFromParams() { $selectedLauncher = $GameDirs[$launcher] if ($selectedLauncher -eq $null) { Write-Error "Requested launcher '$launcher' was not defined in your script config options" exit 1 } $selectedSide = $selectedLauncher[$side] if ($selectedSide -eq $null) { Write-Error "Requested side '$side' was not defined in launcher '$launcher' in your script config options" exit 1 } $actualBranch = $branch if ($launcher -eq "steam") { Write-Debug "Script does not support multiple branches for steam, ignoring the -branch option of '$branch'" $actualBranch = "steam" } $gamePathInfo = $selectedSide[$actualBranch] if ($gamePathInfo -eq $null) { Write-Error "Requested branch '$actualBranch' for side '$side' was not defined in launcher '$launcher' in your script config options" exit 1 } $gameDir = $gamePathInfo["path"] if (($gameDir -eq $null) -or ($gameDir -eq "UNSET")) { Write-Error "Selected game install '$selectedLauncher > $selectedSide > $actualBranch' is missing 'path' data, it should be the root directory of the install" exit 1 } $gameEXE = $gamePathInfo["exeName"] if ($gameEXE -eq $null) { Write-Error "Selected game install '$selectedLauncher > $selectedSide > $actualBranch' is missing 'exeName' data, it should be the name of the executable file that launches the game" exit 1 } if (-not ($gamePathInfo["appid"] -eq $null)) { CreateSteamAppidFile -filepath $gameDir -appid $gamePathInfo["appid"] } return $gamePathInfo } ```